Current File : //var/www/vinorea/modules/ps_checkout/views/js/adminOrderView.js
'use strict';
/**
 * 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 Academic Free License version 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/AFL-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.
 *
 * @author    PrestaShop SA and Contributors <contact@prestashop.com>
 * @copyright Since 2007 PrestaShop SA and Contributors
 * @license   https://opensource.org/licenses/AFL-3.0 Academic Free License version 3.0
 */

let ps_checkout = {};
let {$} = window;

(function() {
  /**
   * @param {object} config
   * @param {boolean} config.legacy - Use legacy style
   * @param {int} config.orderPrestaShopId - PrestaShop Order identifier
   * @param {string} config.orderPayPalBaseUrl - Base url used for request
   * @param {string} config.orderPayPalContainer - HTML element identifier
   * @param {string} config.orderPayPalLoaderContainer - HTML element identifier
   * @param {string} config.orderPayPalNotificationsContainer - HTML element identifier
   * @param {string} config.orderPayPalRefundButton - HTML element identifier
   * @param {string} config.orderPayPalModalContainerPrefix - HTML element identifier
   * @param {string} config.orderPayPalModalContainer - HTML element identifier
   * @param {string} config.orderPayPalModalNotificationsContainer - HTML element identifier
   * @param {string} config.orderPayPalModalContentContainer - HTML element identifier
   * @param {string} config.orderPayPalModalLoaderContainer - HTML element identifier
   * @param {string} config.orderPayPalModalRefundForm - HTML element identifier
   * @constructor
   */
  let PayPalOrderFetcher = function(config) {
    this.execute = function() {
      let payPalOrderNotification = new PayPalOrderNotification(config);
      let payPalOrderRequest = $.ajax({
        type: 'POST',
        headers: {"cache-control": "no-cache"},
        cache: false,
        dataType: 'json',
        url: `${config.orderPayPalBaseUrl}&rand=${new Date().getTime()}`,
        data: {
          ajax: 1,
          legacy: config.legacy,
          action: 'FetchOrder',
          id_order : config.orderPrestaShopId
        },
      });

      payPalOrderRequest.done(function(data) {
        if (undefined !== data.content) {
          $(config.orderPayPalContainer).append(data.content);
        }

        if (undefined !== data.errors) {
          for (const error of data.errors) {
            $(config.orderPayPalContainer).append(payPalOrderNotification.createErrorHTMLElement({
              text: error,
              class: 'danger',
            }));
          }
        }

        $(config.orderPayPalLoaderContainer).hide();
      });

      payPalOrderRequest.fail(function(jqXHR, textStatus, errorThrown) {
        if (undefined !== errorThrown && errorThrown) {
          $(config.orderPayPalNotificationsContainer).append(payPalOrderNotification.createErrorHTMLElement({
            text: errorThrown,
            class: 'danger',
          }));
        }

        if (undefined !== jqXHR.responseJSON && undefined !== jqXHR.responseJSON.content) {
          $(config.orderPayPalNotificationsContainer).append(payPalOrderNotification.createErrorHTMLElement({
            text: jqXHR.responseJSON.content,
            class: 'danger',
          }));
        }

        if (undefined !== jqXHR.responseJSON && undefined !== jqXHR.responseJSON.errors) {
          for (const error of jqXHR.responseJSON.errors) {
            $(config.orderPayPalContainer).append(payPalOrderNotification.createErrorHTMLElement({
              text: error,
              class: 'danger',
            }));
          }
        }

        $(config.orderPayPalLoaderContainer).hide();
      });
    };
  };

  /**
   * @param {object} config
   * @param {boolean} config.legacy - Use legacy style
   * @param {int} config.orderPrestaShopId - PrestaShop Order identifier
   * @param {string} config.orderPayPalBaseUrl - Base url used for request
   * @param {string} config.orderPayPalContainer - HTML element identifier
   * @param {string} config.orderPayPalLoaderContainer - HTML element identifier
   * @param {string} config.orderPayPalNotificationsContainer - HTML element identifier
   * @param {string} config.orderPayPalRefundButton - HTML element identifier
   * @param {string} config.orderPayPalModalContainerPrefix - HTML element identifier
   * @param {string} config.orderPayPalModalContainer - HTML element identifier
   * @param {string} config.orderPayPalModalNotificationsContainer - HTML element identifier
   * @param {string} config.orderPayPalModalContentContainer - HTML element identifier
   * @param {string} config.orderPayPalModalLoaderContainer - HTML element identifier
   * @param {string} config.orderPayPalModalRefundForm - HTML element identifier
   * @constructor
   */
  let PayPalOrderRefund = function(config) {
    this.initialize = function() {
      // wait for dom ready
      $(function() {
        $(document).on('click', config.orderPayPalRefundButton, function () {
          const refundModal = $(config.orderPayPalModalContainerPrefix + $(this).attr('data-transaction-id'));
          $(config.orderPayPalNotificationsContainer).empty();
          refundModal.find(config.orderPayPalModalNotificationsContainer).empty();
          refundModal.find(config.orderPayPalModalLoaderContainer).hide();
          refundModal.modal('show');
        });

        $(document).on('change keyup', 'input[name="orderPayPalRefundAmount"]', function () {
          const refundModal = $(this).parents(config.orderPayPalModalContainer);
          const transactionCurrency = refundModal.find(config.orderPayPalRefundButtonValue).data('transaction-currency');
          const refundValue = $(this).val();

          refundModal.find(config.orderPayPalModalNotificationsContainer).empty();

          if (refundValue > 0) {
            refundModal.find(config.orderPayPalRefundSubmitButton).attr('disabled', false);
            refundModal.find(config.orderPayPalRefundButtonValue).text( `${refundValue} ${transactionCurrency}`);
          } else {
            refundModal.find(config.orderPayPalRefundSubmitButton).attr('disabled', true);
            refundModal.find(config.orderPayPalRefundButtonValue).text('');
          }
        });

        $(document).on('click', config.orderPayPalRefundSubmitButton, function () {
          const refundModal = $(this).parents(config.orderPayPalModalContainer);
          $('input[name="orderPayPalRefundAmount"]').attr('disabled', true);
          refundModal.find(config.orderPayPalRefundSubmitButton).attr('hidden', 'hidden');
          refundModal.find(config.orderPayPalRefundConfirmButton).attr('hidden', false);
        });

        $(document).on('click', '.modal.ps-checkout-refund [data-dismiss="modal"]', function () {
          const refundModal = $(this).parents(config.orderPayPalModalContainer);
          const refundAmountInput = $('input[name="orderPayPalRefundAmount"]');
          refundAmountInput.attr('disabled', false);
          refundAmountInput.val('');
          refundModal.find(config.orderPayPalRefundConfirmButton).attr('hidden', 'hidden');
          refundModal.find(config.orderPayPalRefundSubmitButton).attr('hidden', false);
          refundModal.find(config.orderPayPalRefundSubmitButton).attr('disabled', true);
          refundModal.find(config.orderPayPalRefundButtonValue).text('');
        });

        $(document).on('submit', config.orderPayPalModalRefundForm, function (event) {
          event.preventDefault();
          const refundModal = $(this).parents(config.orderPayPalModalContainer);
          const refundModalNotificationContainer = refundModal.find(config.orderPayPalModalNotificationsContainer);
          const refundModalLoaderContainer = refundModal.find(config.orderPayPalModalLoaderContainer);
          const refundModalSubmitButton = $(this).find('button[type="submit"]');
          const payPalOrderNotification = new PayPalOrderNotification(config);
          const refundAmountInput = $('input[name="orderPayPalRefundAmount"]');
          // Disabled input are excluded from formData
          refundAmountInput.attr('disabled', false);
          const formData = $(this).serialize();
          refundAmountInput.attr('disabled', true);

          $(refundModalNotificationContainer).empty();
          $(refundModalLoaderContainer).show();
          refundModalSubmitButton.prop('disabled', true);

          let payPalRefundRequest = $.ajax({
            type: 'POST',
            headers: {"cache-control": "no-cache"},
            cache: false,
            dataType: 'json',
            url: `${config.orderPayPalBaseUrl}&rand=${new Date().getTime()}`,
            data: formData,
          });

          payPalRefundRequest.done(function(data) {
            if (undefined !== data.content) {
              let payPalOrderFetcher = new PayPalOrderFetcher(config);

              refundModal.on('hidden.bs.modal', function () {
                $(config.orderPayPalNotificationsContainer).append(payPalOrderNotification.createErrorHTMLElement({
                  text: data.content,
                  class: 'success',
                }));

                $(config.orderPayPalContainer).empty();
                $(config.orderPayPalLoaderContainer).show();

                payPalOrderFetcher.execute();
              });

              refundModal.modal('hide');
            }

            if (undefined !== data.errors) {
              for (const error of data.errors) {
                $(refundModalNotificationContainer).append(payPalOrderNotification.createErrorHTMLElement({
                  text: error,
                  class: 'danger',
                }));

                refundModalSubmitButton.prop('disabled', false);
              }
            }

            $(refundModalLoaderContainer).hide();
          });

          payPalRefundRequest.fail(function(jqXHR, textStatus, errorThrown) {
            if (undefined !== errorThrown && errorThrown) {
              $(refundModalNotificationContainer).append(payPalOrderNotification.createErrorHTMLElement({
                text: errorThrown,
                class: 'danger',
              }));
            }

            if (undefined !== jqXHR.responseJSON && undefined !== jqXHR.responseJSON.errors) {
              jqXHR.responseJSON.errors.forEach(function (error) {
                $(refundModalNotificationContainer).append(payPalOrderNotification.createErrorHTMLElement({
                  text: error,
                  class: 'danger',
                }));
              });
            }

            if (undefined !== jqXHR.responseJSON && undefined !== jqXHR.responseJSON.content) {
              $(refundModalNotificationContainer).append(payPalOrderNotification.createErrorHTMLElement({
                text: jqXHR.responseJSON.content,
                class: 'danger',
              }));
            }

            if (undefined !== jqXHR.responseJSON && undefined !== jqXHR.responseJSON.errors) {
              for (const error of jqXHR.responseJSON.errors) {
                $(refundModalNotificationContainer).append(payPalOrderNotification.createErrorHTMLElement({
                  text: error,
                  class: 'danger',
                }));
              }
            }

            $(refundModalLoaderContainer).hide();
            refundModalSubmitButton.prop('disabled', false);
          });
        });
      });
    };
  };

  /**
   * @param {object} config
   * @param {string} config.orderPayPalNotificationsContainer - HTML element identifier
   * @constructor
   */
  let PayPalOrderNotification = function(config) {
    /**
     *
     * @param {object} params
     * @param {string} params.text - Error text
     * @param {string} params.class - Error class
     *
     * @returns {HTMLElement}
     */
    this.createErrorHTMLElement = function (params) {
      let errorContentContainer = document.createElement('div');
      errorContentContainer.className = 'alert-text';
      let errorContent = document.createTextNode(params.text);
      errorContentContainer.appendChild(errorContent);
      let errorContainer = document.createElement('div');
      errorContainer.className = 'd-print-none hidden-print alert alert-' + params.class;
      errorContainer.appendChild(errorContentContainer);

      return errorContainer;
    }
  };

  let PayPalTransactions = function()
  {
    this.initialize = function() {
      $(document).on('click', '#ps_checkout button[role="tab"]', function () {
        let tabIdentifier = $(this).attr('aria-controls');
        switchDisplayedTab(tabIdentifier);
        switchSelectDropdown(tabIdentifier);
      });

      $(document).on('change', '#ps_checkout select#select-transaction', function() {
        let tabIdentifier = $(this).val();
        switchDisplayedTab(tabIdentifier)
      })

      function switchDisplayedTab(tabIdentifier)
      {
        $(`#ps_checkout button[role="tab"][aria-controls="${tabIdentifier}"]`).attr('aria-selected', true);
        $('#ps_checkout button[role="tab"]').not(`[aria-controls="${tabIdentifier}"]`).attr('aria-selected', false);
        $('#ps_checkout div[role="tabpanel"]').not(`#${tabIdentifier}`).attr('hidden', 'hidden');
        $(`#ps_checkout #${tabIdentifier}[role="tabpanel"]`).attr('hidden', false);
      }

      function switchSelectDropdown(tabIdentifier)
      {
        $('#ps_checkout select#select-transaction').val(tabIdentifier);
      }
    }
  }

  /**
   * Initialize ps_checkout
   *
   * @param {object} config
   * @param {boolean} config.legacy - Use legacy style
   * @param {int} config.orderPrestaShopId - PrestaShop Order identifier
   * @param {string} config.orderPayPalBaseUrl - Base url used for request
   * @param {string} config.orderPayPalContainer - HTML element identifier
   * @param {string} config.orderPayPalLoaderContainer - HTML element identifier
   * @param {string} config.orderPayPalNotificationsContainer - HTML element identifier
   * @param {string} config.orderPayPalRefundButton - HTML element identifier
   * @param {string} config.orderPayPalModalContainerPrefix - HTML element identifier
   * @param {string} config.orderPayPalModalContainer - HTML element identifier
   * @param {string} config.orderPayPalModalNotificationsContainer - HTML element identifier
   * @param {string} config.orderPayPalModalContentContainer - HTML element identifier
   * @param {string} config.orderPayPalModalLoaderContainer - HTML element identifier
   * @param {string} config.orderPayPalModalRefundForm - HTML element identifier
   */
  ps_checkout.initialize = function(config) {
    let payPalOrderFetcher = new PayPalOrderFetcher(config);
    payPalOrderFetcher.execute();

    let payPalOrderRefund = new PayPalOrderRefund(config);
    payPalOrderRefund.initialize();

    let payPalTransactions = new PayPalTransactions();
    payPalTransactions.initialize();
  };
})();