'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 * @copyright Since 2007 PrestaShop SA and Contributors * @license https://opensource.org/licenses/AFL-3.0 Academic Free License version 3.0 */ var mbo = {}; (function() { var pageMapDefault = { toolbarButtonsContainer: '#toolbar-nav', toolbarButtons: '#toolbar-nav > li > a.toolbar_btn', toolbarHelpButton: '#toolbar-nav li:last-of-type > a.btn-help', toolbarLastElement: '#toolbar-nav li:last-of-type', recommendedModulesButton: '#recommended-modules-button', fancybox: '.fancybox-quick-view', contentContainer: '#content', modulesListModal: '#modules_list_container', modulesListModalContainer: '#content', modulesListModalContent: '#modules_list_container_tab_modal', }; var pageMapNewTheme = { toolbarButtonsContainer: '.toolbar-icons .wrapper', toolbarHelpButton: '.toolbar-icons a.btn-help', toolbarLastElement: '.toolbar-icons a:last-of-type', recommendedModulesButton: '#recommended-modules-button', oldButton: '#page-header-desc-configuration-modules-list', contentContainer: '#main-div .content-div', modulesListModal: '#modules_list_container', modulesListModalContainer: '#main-div .content-div', modulesListModalContent: '#modules_list_container_tab_modal', }; /** * Handles page interactions * * @param {object} pageMap * @constructor */ var Page = function(pageMap) { /** * Indicates if the help button is the last one in the toolbar * @return {boolean} */ var lastElementIsHelpButton = function() { return $(pageMap.toolbarHelpButton).length > 0; }; /** * Inserts the button before the help one * @param {RecommendedModulesButton} button */ var insertItBeforeHelpButton = function(button) { $(pageMap.toolbarLastElement).before(button.getMarkup()); }; /** * Inserts the button as the last item in the toolbar * @param {RecommendedModulesButton} button */ var insertItLastInToolbar = function(button) { $(pageMap.toolbarButtonsContainer).append(button.getMarkup()); }; /** * Remove core-generated "recommended module" button in PS < 1.7.6.0 * @return this */ this.removeOldButton = function() { if (pageMap.toolbarButtons) { // default theme $(pageMap.toolbarButtons).filter( function() { var buttonIdPattern = /^page-header-desc-[a-z-_]+-modules-list$/; return String($(this).attr('id')) .match(buttonIdPattern); } ).parent().remove(); } if (pageMap.oldButton) { // new theme $(pageMap.oldButton).remove(); } return this; }; /** * Inserts the provided button in the toolbar * * @param {RecommendedModulesButton} button * @return this */ this.insertToolbarButton = function(button) { if (lastElementIsHelpButton()) { insertItBeforeHelpButton(button); } else { insertItLastInToolbar(button); } return this; }; /** * Inserts the recommended modules in the DOM * * @param {object} config * @param {array} config.translations * @param {string} config.recommendedModulesUrl * @param {boolean} config.shouldAttachRecommendedModulesAfterContent * @param {boolean} config.shouldAttachRecommendedModulesButton * @param {boolean} config.shouldUseLegacyTheme * @param {object} pageMap * @param {string} pageMap.contentContainer * * @return this */ this.insertRecommendedModules = function(config, pageMap) { if (pageMap.contentContainer) { var recommendedModulesRequest = $.ajax({ type: 'GET', dataType: 'json', url: config.recommendedModulesUrl, }); recommendedModulesRequest.done(function(data) { $(pageMap.contentContainer).append(data.content); }); recommendedModulesRequest.fail(function(jqXHR, textStatus, errorThrown) { var recommendedModulesAlertMessage = new RecommendedModulesAlertMessage(config, 'danger', errorThrown); var content = recommendedModulesAlertMessage.getMarkup().get(0).outerHTML; if (undefined !== jqXHR.responseJSON && undefined !== jqXHR.responseJSON.content) { content += jqXHR.responseJSON.content; } var recommendedModulesContainer = new RecommendedModulesContainer(config, content); $(pageMap.contentContainer).append(recommendedModulesContainer.getMarkup().get(0).outerHTML); }); } return this; }; }; /** * Handles markup for the Recommended modules button * * @param {object} config * @param {array} config.translations * @param {string} config.recommendedModulesUrl * @param {boolean} config.shouldAttachRecommendedModulesAfterContent * @param {boolean} config.shouldAttachRecommendedModulesButton * @param {boolean} config.shouldUseLegacyTheme * * @constructor */ var RecommendedModulesButton = function(config) { var label = config.translations['Recommended Modules and Services']; var buttonId = 'recommended-modules-button'; var $markup; if (config.shouldUseLegacyTheme) { $markup = $( '' ); } else { $markup = $( '\n' + 'extension\n' + label + '' ); } /** * Returns the button's markup * @return {jQuery|HTMLElement} */ this.getMarkup = function() { return $markup; } }; /** * Handles markup for the Recommended modules container * * @param {object} config * @param {array} config.translations * @param {string} config.recommendedModulesUrl * @param {boolean} config.shouldAttachRecommendedModulesAfterContent * @param {boolean} config.shouldAttachRecommendedModulesButton * @param {boolean} config.shouldUseLegacyTheme * @param {jQuery|HTMLElement} content * @constructor */ var RecommendedModulesContainer = function(config, content) { var containerTitle = config.translations['Recommended Modules and Services']; var containerId = 'recommended-modules-container'; var $markup; if (config.shouldUseLegacyTheme) { $markup = $( '
\n' + '

\n' + ' \n' + ' ' + containerTitle + '\n' + '

\n' + '
\n' + ' ' + content +'\n' + '
\n' + '
' ); } else { $markup = $( '
\n' + '
\n' + '
\n' + '

\n' + ' extension\n' + ' ' + containerTitle + '\n' + '

\n' + '
\n' + ' ' + content +'\n' + '
\n' + '
\n' + '
\n' + '
' ); } /** * Returns the button's markup * @return {jQuery|HTMLElement} */ this.getMarkup = function() { return $markup; } }; /** * Handles markup for the Recommended modules container * * @param {object} config * @param {array} config.translations * @param {string} config.recommendedModulesUrl * @param {boolean} config.shouldAttachRecommendedModulesAfterContent * @param {boolean} config.shouldAttachRecommendedModulesButton * @param {boolean} config.shouldUseLegacyTheme * @param {string} type * @param {string} text * @constructor */ var RecommendedModulesAlertMessage = function(config, type, text) { var $markup = $( '' ); /** * Returns the button's markup * @return {jQuery|HTMLElement} */ this.getMarkup = function() { return $markup; } }; /** * Handles markup for the Recommended modules container * * @param {object} pageMap * @param {object} config * @param {array} config.translations * @param {string} config.recommendedModulesUrl * @param {boolean} config.shouldAttachRecommendedModulesAfterContent * @param {boolean} config.shouldAttachRecommendedModulesButton * @param {boolean} config.shouldUseLegacyTheme * @constructor */ var RecommendedModulesModal = function(pageMap, config) { let $markup = $( '' ); /** * Returns the button's markup * @return {jQuery|HTMLElement} */ this.getMarkup = function() { return $markup; } }; /** * @param {object} pageMap * @param {object} config * @param {array} config.translations * @param {string} config.recommendedModulesUrl * @param {boolean} config.shouldAttachRecommendedModulesAfterContent * @param {boolean} config.shouldAttachRecommendedModulesButton * @param {boolean} config.shouldUseLegacyTheme * @constructor */ var RecommendedModulesPopinHandler = function(pageMap, config) { var initPopin = function() { if ($(pageMap.modulesListModal).length === 0) { var modal = new RecommendedModulesModal(pageMap, config); $(pageMap.modulesListModalContainer).append(modal.getMarkup().get(0).outerHTML); } }; var openModulesList = function() { var cdcContainer = $('#cdc-container') if(cdcContainer.length > 0 && cdcContainer.html().length > 0) { cdcContainer.html('') } var recommendedModulesRequest = $.ajax({ type: 'GET', dataType: 'json', url: config.recommendedModulesUrl, }); $(pageMap.modulesListModal).modal('show'); recommendedModulesRequest.done(function (data) { $(pageMap.modulesListModalContent).html(data.content).show(); }); recommendedModulesRequest.fail(function(jqXHR, textStatus, errorThrown) { var recommendedModulesAlertMessage = new RecommendedModulesAlertMessage(config, 'danger', errorThrown); var content = recommendedModulesAlertMessage.getMarkup().get(0).outerHTML; if (undefined !== jqXHR.responseJSON && undefined !== jqXHR.responseJSON.content) { content += jqXHR.responseJSON.content; } $(pageMap.modulesListModalContent).html(content).show(); }); }; var bindButtonEvents = function() { // wait for dom ready $(document).on('click', pageMap.recommendedModulesButton, function(event) { event.preventDefault(); openModulesList(); }); }; this.initialize = function() { // wait for dom ready $(function() { initPopin(); bindButtonEvents(); }); }; }; /** * Inserts the recommended modules button in the toolbar * * @param {object} config * @param {array} config.translations * @param {string} config.recommendedModulesUrl * @param {boolean} config.shouldAttachRecommendedModulesAfterContent * @param {boolean} config.shouldAttachRecommendedModulesButton * @param {boolean} config.shouldUseLegacyTheme */ mbo.initialize = function(config) { var pageMap = config.shouldUseLegacyTheme ? pageMapDefault : pageMapNewTheme; var page = new Page(pageMap); page.removeOldButton(); if (config.shouldAttachRecommendedModulesButton) { var button = new RecommendedModulesButton(config); var recommendedModulesPopinHandler = new RecommendedModulesPopinHandler(pageMap, config); page.insertToolbarButton(button); recommendedModulesPopinHandler.initialize(); } if (config.shouldAttachRecommendedModulesAfterContent) { page.insertRecommendedModules(config, pageMap); } }; })();