Chris@0: /** Chris@0: * @file Chris@0: * Content Translation admin behaviors. Chris@0: */ Chris@0: Chris@17: (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: Chris@14: function fieldsChangeHandler($fields, dependentColumns) { Chris@17: return function(e) { Chris@17: Drupal.behaviors.contentTranslationDependentOptions.check( Chris@17: $fields, Chris@17: dependentColumns, Chris@17: $(e.target), Chris@17: ); 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@17: Object.keys(options.dependent_selectors).forEach(field => { Chris@14: $fields = $context.find(`input[name^="${field}"]`); Chris@14: const dependentColumns = options.dependent_selectors[field]; Chris@0: Chris@14: $fields.on('change', fieldsChangeHandler($fields, dependentColumns)); Chris@17: Drupal.behaviors.contentTranslationDependentOptions.check( Chris@17: $fields, Chris@17: dependentColumns, Chris@17: ); Chris@14: }); Chris@0: } Chris@0: }, Chris@14: check($fields, dependentColumns, $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@17: Object.keys(dependentColumns || {}).forEach(index => { Chris@14: column = dependentColumns[index]; Chris@0: Chris@14: if (!$changed) { Chris@14: $element = $fields.filter(filterFieldsList); Chris@14: } Chris@0: Chris@14: if ($element.is(`input[value="${column}"]:checked`)) { Chris@17: $fields Chris@17: .prop('checked', true) Chris@17: .not($element) Chris@17: .prop('disabled', true); Chris@17: } else { Chris@14: $fields.prop('disabled', false); Chris@14: } Chris@14: }); 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@17: $(context) Chris@17: .find('table .bundle-settings .translatable :input') Chris@17: .once('translation-entity-admin-hide') Chris@17: .each(function() { Chris@17: const $input = $(this); Chris@17: const $bundleSettings = $input.closest('.bundle-settings'); Chris@17: if (!$input.is(':checked')) { Chris@17: $bundleSettings.nextUntil('.bundle-settings').hide(); Chris@17: } else { Chris@17: $bundleSettings Chris@17: .nextUntil('.bundle-settings', '.field-settings') Chris@17: .find('.translatable :input:not(:checked)') Chris@17: .closest('.field-settings') Chris@17: .nextUntil(':not(.column-settings)') Chris@17: .hide(); Chris@17: } Chris@17: }); 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@17: $('body') Chris@17: .once('translation-entity-admin-bind') Chris@17: .on('click', 'table .bundle-settings .translatable :input', e => { Chris@17: const $target = $(e.target); Chris@17: const $bundleSettings = $target.closest('.bundle-settings'); Chris@17: const $settings = $bundleSettings.nextUntil('.bundle-settings'); Chris@17: const $fieldSettings = $settings.filter('.field-settings'); Chris@17: if ($target.is(':checked')) { Chris@17: $bundleSettings Chris@17: .find('.operations :input[name$="[language_alterable]"]') Chris@17: .prop('checked', true); Chris@17: $fieldSettings.find('.translatable :input').prop('checked', true); Chris@17: $settings.show(); Chris@17: } else { Chris@17: $settings.hide(); Chris@17: } Chris@17: }) Chris@17: .on('click', 'table .field-settings .translatable :input', e => { Chris@0: const $target = $(e.target); Chris@0: const $fieldSettings = $target.closest('.field-settings'); Chris@17: const $columnSettings = $fieldSettings.nextUntil( Chris@17: '.field-settings, .bundle-settings', Chris@17: ); Chris@0: if ($target.is(':checked')) { Chris@0: $columnSettings.show(); Chris@17: } else { Chris@0: $columnSettings.hide(); Chris@0: } Chris@0: }); Chris@0: }, Chris@0: }; Chris@17: })(jQuery, Drupal, drupalSettings);