/** * 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 FormFieldToggle from './FormFieldToggle'; const {$} = window; export default class ImportPage { constructor() { new FormFieldToggle(); $('.js-from-files-history-btn').on('click', () => this.showFilesHistoryHandler(), ); $('.js-close-files-history-block-btn').on('click', () => this.closeFilesHistoryHandler(), ); $('#fileHistoryTable').on( 'click', '.js-use-file-btn', (event: JQueryEventObject) => this.useFileFromFilesHistory(event), ); $('.js-change-import-file-btn').on('click', () => this.changeImportFileHandler(), ); $('.js-import-file').on('change', () => this.uploadFile()); this.toggleSelectedFile(); this.handleSubmit(); } /** * Handle submit and add confirm box in case the toggle button about * deleting all entities before import is checked */ handleSubmit(): void { $('.js-import-form').on('submit', function () { const $this = $(this); if ($this.find('input[name="truncate"]:checked').val() === '1') { /* eslint-disable-next-line max-len */ return window.confirm( `${$this.data('delete-confirm-message')} ${$.trim( $('#entity > option:selected') .text() .toLowerCase(), )}?`, ); } return true; }); } /** * Check if selected file names exists and if so, then display it */ toggleSelectedFile(): void { const selectFilename: string = $('#csv').val(); if (selectFilename && selectFilename.length > 0) { this.showImportFileAlert(selectFilename); this.hideFileUploadBlock(); } } changeImportFileHandler(): void { this.hideImportFileAlert(); this.showFileUploadBlock(); } /** * Show files history event handler */ showFilesHistoryHandler(): void { this.showFilesHistory(); this.hideFileUploadBlock(); } /** * Close files history event handler */ closeFilesHistoryHandler(): void { this.closeFilesHistory(); this.showFileUploadBlock(); } /** * Show files history block */ showFilesHistory(): void { $('.js-files-history-block').removeClass('d-none'); } /** * Hide files history block */ closeFilesHistory(): void { $('.js-files-history-block').addClass('d-none'); } /** * Prefill hidden file input with selected file name from history */ useFileFromFilesHistory(event: JQueryEventObject): void { const filename = $(event.target) .closest('.btn-group') .data('file'); $('.js-import-file-input').val(filename); this.showImportFileAlert(filename); this.closeFilesHistory(); } /** * Show alert with imported file name */ showImportFileAlert(filename: string): void { $('.js-import-file-alert').removeClass('d-none'); $('.js-import-file').text(filename); } /** * Hides selected import file alert */ hideImportFileAlert(): void { $('.js-import-file-alert').addClass('d-none'); } /** * Hides import file upload block */ hideFileUploadBlock(): void { $('.js-file-upload-form-group').addClass('d-none'); } /** * Hides import file upload block */ showFileUploadBlock(): void { $('.js-file-upload-form-group').removeClass('d-none'); } /** * Make file history button clickable */ enableFilesHistoryBtn(): void { $('.js-from-files-history-btn').removeAttr('disabled'); } /** * Show error message if file uploading failed * * @param {string} fileName * @param {integer} fileSize * @param {string} message */ showImportFileError( fileName: string, fileSize: number, message: string, ): void { const $alert = $('.js-import-file-error'); const fileData = `${fileName} (${this.humanizeSize(fileSize)})`; $alert.find('.js-file-data').text(fileData); $alert.find('.js-error-message').text(message); $alert.removeClass('d-none'); } /** * Hide file uploading error */ hideImportFileError(): void { const $alert = $('.js-import-file-error'); $alert.addClass('d-none'); } /** * Show file size in human readable format * * @param {int} bytes * * @returns {string} */ humanizeSize(bytes: number): string { if (typeof bytes !== 'number') { return ''; } if (bytes >= 1000000000) { return `${(bytes / 1000000000).toFixed(2)} GB`; } if (bytes >= 1000000) { return `${(bytes / 1000000).toFixed(2)} MB`; } return `${(bytes / 1000).toFixed(2)} KB`; } /** * Upload selected import file */ uploadFile(): void { this.hideImportFileError(); const $input = $('#file'); const uploadedFile = $input.prop('files')[0]; const maxUploadSize = $input.data('max-file-upload-size'); if (maxUploadSize < uploadedFile.size) { this.showImportFileError( uploadedFile.name, uploadedFile.size, 'File is too large', ); return; } const data = new FormData(); data.append('file', uploadedFile); $.ajax({ type: 'POST', url: $('.js-import-form').data('file-upload-url'), data, cache: false, contentType: false, processData: false, }).then((response) => { if (response.error) { this.showImportFileError( uploadedFile.name, uploadedFile.size, response.error, ); return; } const filename = response.file.name; $('.js-import-file-input').val(filename); this.showImportFileAlert(filename); this.hideFileUploadBlock(); this.addFileToHistoryTable(filename); this.enableFilesHistoryBtn(); }); } /** * Renders new row in files history table * * @param {string} filename */ addFileToHistoryTable(filename: string): void { const $table = $('#fileHistoryTable'); const baseDeleteUrl = $table.data('delete-file-url'); const deleteUrl = `${baseDeleteUrl}&filename=${encodeURIComponent( filename, )}`; const baseDownloadUrl = $table.data('download-file-url'); const downloadUrl = `${baseDownloadUrl}&filename=${encodeURIComponent( filename, )}`; const $template = $table.find('tr:first').clone(); $template.removeClass('d-none'); $template.find('td:first').text(filename); $template.find('.btn-group').attr('data-file', filename); $template.find('.js-delete-file-btn').attr('href', deleteUrl); $template.find('.js-download-file-btn').attr('href', downloadUrl); $table.find('tbody').append($template); const filesNumber = $table.find('tr').length - 1; $('.js-files-history-number').text(filesNumber); } }