Files
drmaterac.pl/iadmin/themes/new-theme/js/pages/order/create/customer-renderer.js
2025-03-21 20:24:43 +01:00

342 lines
10 KiB
JavaScript

/**
* 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 <contact@prestashop.com>
* @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();
}
}