Chris@0: /** Chris@0: * @file Chris@0: * Content Translation admin behaviors. Chris@0: */ Chris@0: Chris@0: (function ($, Drupal, drupalSettings) { Chris@0: /** Chris@0: * Forces applicable options to be checked as translatable. Chris@0: * Chris@0: * @type {Drupal~behavior} Chris@0: * Chris@0: * @prop {Drupal~behaviorAttach} attach Chris@0: * Attaches content translation dependent options to the UI. Chris@0: */ Chris@0: Drupal.behaviors.contentTranslationDependentOptions = { Chris@0: attach(context) { Chris@0: const $context = $(context); Chris@0: const options = drupalSettings.contentTranslationDependentOptions; Chris@0: let $fields; Chris@0: let dependent_columns; Chris@0: Chris@0: function fieldsChangeHandler($fields, dependent_columns) { Chris@0: return function (e) { Chris@0: Drupal.behaviors.contentTranslationDependentOptions.check($fields, dependent_columns, $(e.target)); Chris@0: }; Chris@0: } Chris@0: Chris@0: // We're given a generic name to look for so we find all inputs containing Chris@0: // that name and copy over the input values that require all columns to be Chris@0: // translatable. Chris@0: if (options && options.dependent_selectors) { Chris@0: for (const field in options.dependent_selectors) { Chris@0: if (options.dependent_selectors.hasOwnProperty(field)) { Chris@0: $fields = $context.find(`input[name^="${field}"]`); Chris@0: dependent_columns = options.dependent_selectors[field]; Chris@0: Chris@0: $fields.on('change', fieldsChangeHandler($fields, dependent_columns)); Chris@0: Drupal.behaviors.contentTranslationDependentOptions.check($fields, dependent_columns); Chris@0: } Chris@0: } Chris@0: } Chris@0: }, Chris@0: check($fields, dependent_columns, $changed) { Chris@0: let $element = $changed; Chris@0: let column; Chris@0: Chris@0: function filterFieldsList(index, field) { Chris@0: return $(field).val() === column; Chris@0: } Chris@0: Chris@0: // A field that has many different translatable parts can also define one Chris@0: // or more columns that require all columns to be translatable. Chris@0: for (const index in dependent_columns) { Chris@0: if (dependent_columns.hasOwnProperty(index)) { Chris@0: column = dependent_columns[index]; Chris@0: Chris@0: if (!$changed) { Chris@0: $element = $fields.filter(filterFieldsList); Chris@0: } Chris@0: Chris@0: if ($element.is(`input[value="${column}"]:checked`)) { Chris@0: $fields.prop('checked', true) Chris@0: .not($element).prop('disabled', true); Chris@0: } Chris@0: else { Chris@0: $fields.prop('disabled', false); Chris@0: } Chris@0: } Chris@0: } Chris@0: }, Chris@0: }; Chris@0: Chris@0: /** Chris@0: * Makes field translatability inherit bundle translatability. Chris@0: * Chris@0: * @type {Drupal~behavior} Chris@0: * Chris@0: * @prop {Drupal~behaviorAttach} attach Chris@0: * Attaches content translation behavior. Chris@0: */ Chris@0: Drupal.behaviors.contentTranslation = { Chris@0: attach(context) { Chris@0: // Initially hide all field rows for non translatable bundles and all Chris@0: // column rows for non translatable fields. Chris@0: $(context).find('table .bundle-settings .translatable :input').once('translation-entity-admin-hide').each(function () { Chris@0: const $input = $(this); Chris@0: const $bundleSettings = $input.closest('.bundle-settings'); Chris@0: if (!$input.is(':checked')) { Chris@0: $bundleSettings.nextUntil('.bundle-settings').hide(); Chris@0: } Chris@0: else { Chris@0: $bundleSettings.nextUntil('.bundle-settings', '.field-settings').find('.translatable :input:not(:checked)').closest('.field-settings').nextUntil(':not(.column-settings)').hide(); Chris@0: } Chris@0: }); Chris@0: Chris@0: // When a bundle is made translatable all of its fields should inherit Chris@0: // this setting. Instead when it is made non translatable its fields are Chris@0: // hidden, since their translatability no longer matters. Chris@0: $('body').once('translation-entity-admin-bind').on('click', 'table .bundle-settings .translatable :input', (e) => { Chris@0: const $target = $(e.target); Chris@0: const $bundleSettings = $target.closest('.bundle-settings'); Chris@0: const $settings = $bundleSettings.nextUntil('.bundle-settings'); Chris@0: const $fieldSettings = $settings.filter('.field-settings'); Chris@0: if ($target.is(':checked')) { Chris@0: $bundleSettings.find('.operations :input[name$="[language_alterable]"]').prop('checked', true); Chris@0: $fieldSettings.find('.translatable :input').prop('checked', true); Chris@0: $settings.show(); Chris@0: } Chris@0: else { Chris@0: $settings.hide(); Chris@0: } Chris@0: }) Chris@0: .on('click', 'table .field-settings .translatable :input', (e) => { Chris@0: const $target = $(e.target); Chris@0: const $fieldSettings = $target.closest('.field-settings'); Chris@0: const $columnSettings = $fieldSettings.nextUntil('.field-settings, .bundle-settings'); Chris@0: if ($target.is(':checked')) { Chris@0: $columnSettings.show(); Chris@0: } Chris@0: else { Chris@0: $columnSettings.hide(); Chris@0: } Chris@0: }); Chris@0: }, Chris@0: }; Chris@0: }(jQuery, Drupal, drupalSettings));