/** * Copyright since 2007 PrestaShop SA and Contributors * PrestaShop is an International Registered Trademark & Property of PrestaShop SA * * NOTICE OF LICENSE * * This source file is subject to the Open Software License (OSL 3.0) * that is bundled with this package in the file LICENSE.md. * It is also available through the world-wide-web at this URL: * https://opensource.org/licenses/OSL-3.0 * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@prestashop.com so we can send you a copy immediately. * * DISCLAIMER * * Do not edit or add to this file if you wish to upgrade PrestaShop to newer * versions in the future. If you wish to customize PrestaShop for your * needs please refer to https://devdocs.prestashop.com/ for more information. * * @author PrestaShop SA and Contributors * @copyright Since 2007 PrestaShop SA and Contributors * @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0) */ import createOrderMap from '@pages/order/create/create-order-map'; import Router from '@components/router'; import eventMap from '@pages/order/create/event-map'; import {EventEmitter} from '@components/event-emitter'; const {$} = window; /** * Responsible for customer information rendering */ export default class CustomerRenderer { constructor() { this.$container = $(createOrderMap.customerSearchBlock); this.$customerSearchResultBlock = $(createOrderMap.customerSearchResultsBlock); this.router = new Router(); } /** * Renders customer search results * * @param foundCustomers */ renderSearchResults(foundCustomers) { if (foundCustomers.length === 0) { EventEmitter.emit(eventMap.customersNotFound); return; } Object.entries(foundCustomers).forEach(([customerId, customerResult]) => { const customer = { id: customerId, firstName: customerResult.firstname, lastName: customerResult.lastname, email: customerResult.email, birthday: customerResult.birthday !== '0000-00-00' ? customerResult.birthday : ' ', }; this.renderFoundCustomer(customer); }); // Show customer details in fancy box $(createOrderMap.customerDetailsBtn).fancybox({ type: 'iframe', width: '90%', height: '90%', }); } /** * Responsible for displaying customer block after customer select * * @param $targetedBtn */ displaySelectedCustomerBlock($targetedBtn) { this.showCheckoutHistoryBlock(); $targetedBtn.addClass('d-none'); const $customerCard = $targetedBtn.closest('.card'); $customerCard.addClass('border-success'); $customerCard.find(createOrderMap.changeCustomerBtn).removeClass('d-none'); this.$container.find(createOrderMap.customerSearchRow).addClass('d-none'); this.$container.find(createOrderMap.notSelectedCustomerSearchResults) .closest(createOrderMap.customerSearchResultColumn) .remove(); // Initial display of the customer, the cart is gonna be created then customer's carts // and orders are going to be fetched, but we can display the loading messages right now this.showLoadingCarts(); this.showLoadingOrders(); } /** * Shows customer search block */ showCustomerSearch() { this.$container.find(createOrderMap.customerSearchRow).removeClass('d-none'); } /** * Empty the cart list and display a loading message. */ showLoadingCarts() { const $cartsTable = $(createOrderMap.customerCartsTable); $cartsTable.find('tbody').empty(); this.renderLoading($cartsTable); } /** * Renders customer carts list * * @param {Array} carts * @param {Int} currentCartId */ renderCarts(carts, currentCartId) { const $cartsTable = $(createOrderMap.customerCartsTable); const $cartsTableRowTemplate = $($(createOrderMap.customerCartsTableRowTemplate).html()); $cartsTable.find('tbody').empty(); this.showCheckoutHistoryBlock(); this.removeEmptyListRowFromTable($cartsTable); Object.values(carts).forEach((cart) => { // do not render current cart if (cart.cartId === currentCartId) { // render 'No records found' warn if carts only contain current cart if (carts.length === 1) { this.renderEmptyList($cartsTable); } return; } const $cartsTableRow = $cartsTableRowTemplate.clone(); $cartsTableRow.find(createOrderMap.cartIdField).text(cart.cartId); $cartsTableRow.find(createOrderMap.cartDateField).text(cart.creationDate); $cartsTableRow.find(createOrderMap.cartTotalField).text(cart.totalPrice); $cartsTableRow.find(createOrderMap.cartDetailsBtn).prop( 'href', this.router.generate('admin_carts_view', { cartId: cart.cartId, liteDisplaying: 1, }), ); $cartsTableRow.find(createOrderMap.useCartBtn).data('cart-id', cart.cartId); $cartsTable.find('thead').removeClass('d-none'); $cartsTable.find('tbody').append($cartsTableRow); }); // Show cart details in fancy box $(createOrderMap.cartDetailsBtn).fancybox({ type: 'iframe', width: '90%', height: '90%', }); } /** * Empty the order list and display a loading message. */ showLoadingOrders() { const $ordersTable = $(createOrderMap.customerOrdersTable); $ordersTable.find('tbody').empty(); this.renderLoading($ordersTable); } /** * Renders customer orders list * * @param {Array} orders */ renderOrders(orders) { const $ordersTable = $(createOrderMap.customerOrdersTable); const $rowTemplate = $($(createOrderMap.customerOrdersTableRowTemplate).html()); $ordersTable.find('tbody').empty(); this.showCheckoutHistoryBlock(); this.removeEmptyListRowFromTable($ordersTable); // render 'No records found' when list is empty if (orders.length === 0) { this.renderEmptyList($ordersTable); return; } Object.values(orders).forEach((order) => { const $template = $rowTemplate.clone(); $template.find(createOrderMap.orderIdField).text(order.orderId); $template.find(createOrderMap.orderDateField).text(order.orderPlacedDate); $template.find(createOrderMap.orderProductsField).text(order.orderProductsCount); $template.find(createOrderMap.orderTotalField).text(order.totalPaid); $template.find(createOrderMap.orderPaymentMethod).text(order.paymentMethodName); $template.find(createOrderMap.orderStatusField).text(order.orderStatus); $template.find(createOrderMap.orderDetailsBtn).prop( 'href', this.router.generate('admin_orders_view', { orderId: order.orderId, liteDisplaying: 1, }), ); $template.find(createOrderMap.useOrderBtn).data('order-id', order.orderId); $ordersTable.find('thead').removeClass('d-none'); $ordersTable.find('tbody').append($template); }); // Show order details in fancy box $(createOrderMap.orderDetailsBtn).fancybox({ type: 'iframe', width: '90%', height: '90%', }); } /** * Shows empty result when customer is not found */ showNotFoundCustomers() { $(createOrderMap.customerSearchEmptyResultWarning).removeClass('d-none'); } /** * Hides not found customers warning */ hideNotFoundCustomers() { $(createOrderMap.customerSearchEmptyResultWarning).addClass('d-none'); } /** * Hides checkout history block where carts and orders are rendered */ hideCheckoutHistoryBlock() { $(createOrderMap.customerCheckoutHistory).addClass('d-none'); } /** * Shows searching customers notice during request */ showSearchingCustomers() { $(createOrderMap.customerSearchLoadingNotice).removeClass('d-none'); } /** * Hide searching notice */ hideSearchingCustomers() { $(createOrderMap.customerSearchLoadingNotice).addClass('d-none'); } /** * Renders 'No records' warning in list * * @param $table * * @private */ renderEmptyList($table) { const $emptyTableRow = $($(createOrderMap.emptyListRowTemplate).html()).clone(); $table.find('tbody').append($emptyTableRow); } /** * Renders 'Loading' message in list * * @param $table * * @private */ renderLoading($table) { const $emptyTableRow = $($(createOrderMap.loadingListRowTemplate).html()).clone(); $table.find('tbody').append($emptyTableRow); } /** * Removes empty list row in case it was rendered */ removeEmptyListRowFromTable($table) { $table.find(createOrderMap.emptyListRow).remove(); } /** * Renders customer information after search action * * @param {Object} customer * * @return {jQuery} * * @private */ renderFoundCustomer(customer) { this.hideNotFoundCustomers(); const $customerSearchResultTemplate = $($(createOrderMap.customerSearchResultTemplate).html()); const $template = $customerSearchResultTemplate.clone(); $template.find(createOrderMap.customerSearchResultName).text(`${customer.firstName} ${customer.lastName}`); $template.find(createOrderMap.customerSearchResultEmail).text(customer.email); $template.find(createOrderMap.customerSearchResultId).text(customer.id); $template.find(createOrderMap.customerSearchResultBirthday).text(customer.birthday); $template.find(createOrderMap.chooseCustomerBtn).data('customer-id', customer.id); $template.find(createOrderMap.customerDetailsBtn).prop( 'href', this.router.generate('admin_customers_view', { customerId: customer.id, liteDisplaying: 1, }), ); return this.$customerSearchResultBlock.append($template); } /** * Shows checkout history block where carts and orders are rendered * * @private */ showCheckoutHistoryBlock() { $(createOrderMap.customerCheckoutHistory).removeClass('d-none'); } /** * Clears shown customers */ clearShownCustomers() { this.$customerSearchResultBlock.empty(); } }