diff --git a/core/modules/content_translation/content_translation.admin.inc b/core/modules/content_translation/content_translation.admin.inc index 557f06e..878124f 100644 --- a/core/modules/content_translation/content_translation.admin.inc +++ b/core/modules/content_translation/content_translation.admin.inc @@ -17,6 +17,8 @@ * * @param \Drupal\Core\Field\FieldDefinitionInterface $field * A field definition object. + * @param FieldInstanceConfigInterface $instance + * Instance config object. * * @return array * A form element to configure field synchronization. @@ -24,23 +26,35 @@ function content_translation_field_sync_widget(FieldDefinitionInterface $field) { $element = array(); + $translation_sync = $field->getSetting('translation_sync'); + $definition = \Drupal::service('plugin.manager.field.field_type')->getDefinition($field->getType()); $column_groups = $definition['column_groups']; + if (!empty($column_groups) && count($column_groups) > 1) { $options = array(); $default = array(); foreach ($column_groups as $group => $info) { - $options[$group] = $info['label']; + if (!empty($field->settings[$group . '_field']) || (!empty($translation_sync) && array_key_exists($group, $translation_sync))) { + $options[$group] = $info['label']; + } $default[$group] = !empty($info['translatable']) ? $group : FALSE; } - $settings = array('dependent_selectors' => array('instance[settings][translation_sync]' => array('file'))); + $settings = array( + 'dependent_selectors' => array( + 'instance[settings][translation_sync]' => array('file'), + ), + 'translation_sync_options' => array( + 'instance[settings][translation_sync]' => array_keys($options), + ), + ); - $translation_sync = $field->getSetting('translation_sync'); $element = array( '#type' => 'checkboxes', '#title' => t('Translatable elements'), + '#description' => t('Disabled fields are not shown. Please first enable the fields you need to make translatable.'), '#options' => $options, '#default_value' => !empty($translation_sync) ? $translation_sync : $default, '#attached' => array( @@ -51,6 +65,7 @@ function content_translation_field_sync_widget(FieldDefinitionInterface $field) array('data' => array('contentTranslationDependentOptions' => $settings), 'type' => 'setting'), ), ), + '#weight' => 15, ); } diff --git a/core/modules/content_translation/content_translation.admin.js b/core/modules/content_translation/content_translation.admin.js index 13a752f..1f00aa8 100644 --- a/core/modules/content_translation/content_translation.admin.js +++ b/core/modules/content_translation/content_translation.admin.js @@ -9,7 +9,7 @@ attach: function (context) { var $context = $(context); var options = drupalSettings.contentTranslationDependentOptions; - var $fields, dependent_columns; + var $fields, $translatable_field, column, dependent_columns, translation_sync_options; function fieldsChangeHandler($fields, dependent_columns) { return function (e) { @@ -17,6 +17,12 @@ }; } + function translationHideDisabled($translatable_fields, column) { + return function (e) { + Drupal.behaviors.contentTranslation.check($translatable_fields, column, $(e.target)); + }; + } + // We're given a generic name to look for so we find all inputs containing // that name and copy over the input values that require all columns to be // translatable. @@ -31,6 +37,27 @@ } } } + + // Hides/Show translation checkboxes for disabled field values. + if (options.translation_sync_options) { + for (var field in options.translation_sync_options) { + if (options.translation_sync_options.hasOwnProperty(field)) { + translation_sync_options = options.translation_sync_options[field]; + + for (var index in translation_sync_options) { + if (translation_sync_options.hasOwnProperty(index)) { + column = translation_sync_options[index]; + $translatable_field = $context.find('input[name^="' + field + '[' + column + ']"]'); + + $fields = $context.find('input[name^="instance[settings][' + column + '_field]"]'); + + $fields.on('change', translationHideDisabled($translatable_field, column)); + Drupal.behaviors.contentTranslation.check($translatable_field, column); + } + } + } + } + } }, check: function ($fields, dependent_columns, $changed) { var $element = $changed; @@ -109,6 +136,19 @@ $columnSettings.hide(); } }); + }, + check: function ($translatable_field, column, $changed) { + var $element = $changed; + var column; + + var $target = $('input[name^="instance[settings][' + column + '_field]"]'); + + if ($target.is(':checked')) { + $translatable_field.prop('checked', true).closest('.form-item').show(); + } + else { + $translatable_field.prop('checked', false).closest('.form-item').hide(); + } } }; diff --git a/core/modules/content_translation/content_translation.module b/core/modules/content_translation/content_translation.module index 8739c84..4d4729e 100644 --- a/core/modules/content_translation/content_translation.module +++ b/core/modules/content_translation/content_translation.module @@ -684,7 +684,7 @@ function content_translation_form_field_ui_field_edit_form_submit($form, array & function content_translation_form_field_ui_field_instance_edit_form_alter(array &$form, array &$form_state, $form_id) { if ($form['#field']->isTranslatable()) { module_load_include('inc', 'content_translation', 'content_translation.admin'); - $element = content_translation_field_sync_widget($form['#field']); + $element = content_translation_field_sync_widget($form_state['instance']); if ($element) { $form['instance']['settings']['translation_sync'] = $element; }