/** * 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 {EventEmitter} from './event-emitter'; const {$} = window; /** * This class is used to automatically toggle translated fields (displayed with tabs * using the TranslateType Symfony form type). * Also compatible with TranslatableInput changes. */ class TranslatableField { constructor(options) { const opts = options || {}; this.localeButtonSelector = opts.localeButtonSelector || '.translationsLocales.nav .nav-item a[data-toggle="tab"]'; this.localeNavigationSelector = opts.localeNavigationSelector || '.translationsLocales.nav'; this.translationFieldSelector = opts.translationFieldSelector || '.translation-field'; this.selectedLocale = $('.nav-item a.active', $(this.localeNavigationSelector)).data('locale'); $('body').on('shown.bs.tab', this.localeButtonSelector, this.toggleLanguage.bind(this)); EventEmitter.on('languageSelected', this.toggleFields.bind(this)); return { localeButtonSelector: this.localeButtonSelector, localeNavigationSelector: this.localeNavigationSelector, translationFieldSelector: this.translationFieldSelector, /** * @param {jQuery} form */ refreshFormInputs: (form) => { this.refreshInputs(form); }, /** * @returns {string|undefined} */ getSelectedLocale: () => this.selectedLocale, }; } /** * @param form * * @private */ refreshInputs(form) { EventEmitter.emit('languageSelected', { selectedLocale: this.selectedLocale, form, }); } /** * Dispatch event on language selection to update inputs and other components which depend on the locale. * * @param event * * @private */ toggleLanguage(event) { const localeLink = $(event.target); const form = localeLink.closest('form'); this.selectedLocale = localeLink.data('locale'); this.refreshInputs(form); } /** * Toggle all transtation fields to the selected locale * * @param event * * @private */ toggleFields(event) { this.selectedLocale = event.selectedLocale; $(this.localeNavigationSelector).each((index, navigation) => { const selectedLink = $('.nav-item a.active', navigation); const selectedLocale = selectedLink.data('locale'); if (this.selectedLocale !== selectedLocale) { $(`.nav-item a[data-locale="${this.selectedLocale}"]`, navigation).tab('show'); } }); } } export default TranslatableField;