diff --git a/src/Plugin/Field/FieldWidget/ParagraphsWidget.php b/src/Plugin/Field/FieldWidget/ParagraphsWidget.php index 66e8db0..731dcda 100644 --- a/src/Plugin/Field/FieldWidget/ParagraphsWidget.php +++ b/src/Plugin/Field/FieldWidget/ParagraphsWidget.php @@ -464,6 +464,38 @@ class ParagraphsWidget extends WidgetBase { } } + // If untranslatable fields are hidden while translating, we are + // translating the parent and the Paragraph is open, then close the + // Paragraph if it does not have translatable fields. + $translating_force_close = FALSE; + if (\Drupal::moduleHandler()->moduleExists('content_translation')) { + $manager = \Drupal::service('content_translation.manager'); + $settings = $manager->getBundleTranslationSettings('paragraph', $paragraphs_entity->getParagraphType()->id()); + if (!empty($settings['untranslatable_fields_hide']) && $this->isTranslating) { + $translating_force_close = TRUE; + $display = EntityFormDisplay::collectRenderDisplay($paragraphs_entity, $this->getSetting('form_display_mode')); + // Check if the paragraph has translatable fields. + foreach (array_keys($display->get('content')) as $field) { + if ($paragraphs_entity->hasField($field)) { + $field_definition = $paragraphs_entity->get($field)->getFieldDefinition(); + if ($field_definition->getType() == 'entity_reference_revisions') { + // Check if we are referencing paragraphs. + if ($field_definition->getSetting('target_type') == 'paragraph') { + $translating_force_close = FALSE; + } + } + if ($field_definition->isTranslatable()) { + $translating_force_close = FALSE; + } + } + } + + if ($translating_force_close) { + $item_mode = 'closed'; + } + } + } + $element_parents = $parents; $element_parents[] = $field_name; $element_parents[] = $delta; @@ -600,7 +632,7 @@ class ParagraphsWidget extends WidgetBase { 'callback' => [get_class($this), 'itemAjax'], 'wrapper' => $widget_state['ajax_wrapper_id'], ], - '#access' => $paragraphs_entity->access('update'), + '#access' => $paragraphs_entity->access('update') && !$translating_force_close, '#paragraphs_mode' => 'closed', '#paragraphs_show_warning' => TRUE, '#attributes' => [ @@ -625,7 +657,7 @@ class ParagraphsWidget extends WidgetBase { 'callback' => [get_class($this), 'itemAjax'], 'wrapper' => $widget_state['ajax_wrapper_id'], ], - '#access' => $paragraphs_entity->access('update'), + '#access' => $paragraphs_entity->access('update') && !$translating_force_close, '#paragraphs_mode' => 'edit', '#attributes' => [ 'class' => ['paragraphs-icon-button', 'paragraphs-icon-button-edit'], diff --git a/tests/src/Functional/ParagraphsExperimentalTranslationsTest.php b/tests/src/Functional/ParagraphsExperimentalTranslationsTest.php new file mode 100644 index 0000000..b5c0005 --- /dev/null +++ b/tests/src/Functional/ParagraphsExperimentalTranslationsTest.php @@ -0,0 +1,168 @@ +drupalPlaceBlock('system_breadcrumb_block'); + $this->drupalPlaceBlock('local_tasks_block'); + $this->drupalPlaceBlock('local_actions_block'); + $this->drupalPlaceBlock('page_title_block'); + + $this->addParagraphedContentType('paragraphed_test', 'field_paragraphs', 'paragraphs'); + + ConfigurableLanguage::createFromLangcode('de')->save(); + $this->loginAsAdmin([ + 'access administration pages', + 'view all revisions', + 'revert all revisions', + 'administer nodes', + 'bypass node access', + 'administer content translation', + 'translate any entity', + 'create content translations', + 'administer languages', + 'administer content types', + 'administer node form display', + 'edit any paragraphed_test content', + 'create paragraphed_test content', + 'edit behavior plugin settings', + ]); + + $this->visitorUser = $this->drupalCreateUser([ + 'access content', + 'view all revisions', + ]); + + // Add a Paragraph type. + $this->addParagraphsType('text_translatable'); + $this->addParagraphsType('text_untranslatable'); + $this->addParagraphsType('text_untranslatable_hide'); + $this->addParagraphsType('container'); + $this->addFieldtoParagraphType('text_translatable', 'field_text_translatable', 'text'); + $this->addFieldtoParagraphType('text_untranslatable', 'field_text_untranslatable', 'text'); + $this->addFieldtoParagraphType('text_untranslatable_hide', 'field_text_untranslatable_hide', 'text'); + $this->addParagraphsField('container', 'field_paragraphs', 'paragraph'); + + $this->drupalGet('admin/config/regional/content-language'); + $this->assertSession()->pageTextContains('Paragraph types that are used in moderated content requires non-translatable fields to be edited in the original language form and this must be checked.'); + $edit = [ + 'entity_types[paragraph]' => TRUE, + 'entity_types[node]' => TRUE, + 'settings[node][paragraphed_test][translatable]' => TRUE, + 'settings[node][paragraphed_test][fields][field_paragraphs]' => FALSE, + 'settings[node][paragraphed_test][settings][language][language_alterable]' => TRUE, + 'settings[paragraph][text_translatable][translatable]' => TRUE, + 'settings[paragraph][text_untranslatable][translatable]' => TRUE, + 'settings[paragraph][text_untranslatable_hide][translatable]' => TRUE, + 'settings[paragraph][container][translatable]' => TRUE, + 'settings[paragraph][text_translatable][settings][content_translation][untranslatable_fields_hide]' => TRUE, + 'settings[paragraph][text_untranslatable][settings][content_translation][untranslatable_fields_hide]' => FALSE, + 'settings[paragraph][text_untranslatable_hide][settings][content_translation][untranslatable_fields_hide]' => TRUE, + 'settings[paragraph][container][settings][content_translation][untranslatable_fields_hide]' => TRUE, + 'settings[paragraph][text_translatable][fields][field_text_translatable]' => TRUE, + 'settings[paragraph][text_untranslatable][fields][field_text_untranslatable]' => FALSE, + 'settings[paragraph][text_untranslatable_hide][fields][field_text_untranslatable_hide]' => FALSE, + 'settings[paragraph][container][fields][field_paragraphs]' => FALSE, + ]; + $this->drupalPostForm(NULL, $edit, t('Save configuration')); + } + + /** + * Tests auto collapse when paragraphs do not have translatable fields. + */ + public function testUntranslatableAutoCollapse() { + $session = $this->getSession(); + $page = $session->getPage(); + $assert_session = $this->assertSession(); + + $this->drupalGet('node/add/paragraphed_test'); + // Create a text paragraphs, a container paragraph with a text inside. + $page->fillField('title[0][value]', 'Page 1 EN'); + $page->pressButton('Add text_translatable'); + $page->pressButton('Add text_untranslatable'); + $page->pressButton('Add text_untranslatable_hide'); + $page->pressButton('Add container'); + $page->fillField('field_paragraphs[0][subform][field_text_translatable][0][value]', 'Translate me EN'); + $page->fillField('field_paragraphs[1][subform][field_text_untranslatable][0][value]', 'Do not translate me EN'); + $page->fillField('field_paragraphs[2][subform][field_text_untranslatable_hide][0][value]', 'Do not translate me CLOSED EN'); + $page->pressButton('Save'); + + $assert_session->pageTextContains('paragraphed_test Page 1 EN has been created.'); + + $host_node = $this->getLastEntityOfType('node', TRUE); + $host_node_id = $host_node->id(); + + // Assert that the paragraph with no translatable fields is closed. + $this->drupalGet("/de/node/{$host_node_id}/translations/add/en/de"); + $assert_session->fieldExists('field_paragraphs[0][subform][field_text_translatable][0][value]'); + $assert_session->buttonExists('field_paragraphs_0_collapse'); + // Check that the Paragraph with no translatable fields and with setting for + // hiding the fields is showing the summary and it cannot be opened or + // closed. + $assert_session->fieldNotExists('field_paragraphs[2][subform][field_text_untranslatable_hide][0][value]'); + $assert_session->buttonNotExists('field_paragraphs_2_collapse'); + $assert_session->buttonNotExists('field_paragraphs_2_edit'); + $assert_session->responseContains('
Do not translate me CLOSED EN'); + + $assert_session->buttonExists('field_paragraphs_1_collapse'); + $assert_session->fieldExists('field_paragraphs[1][subform][field_text_untranslatable][0][value]'); + $page->pressButton('field_paragraphs_1_collapse'); + $assert_session->fieldNotExists('field_paragraphs[1][subform][field_text_untranslatable][0][value]'); + $assert_session->responseContains('
Do not translate me EN'); + $assert_session->buttonExists('field_paragraphs_1_edit'); + + $assert_session->buttonExists('field_paragraphs_3_collapse'); + $page->pressButton('field_paragraphs_3_collapse'); + $assert_session->buttonExists('field_paragraphs_3_edit'); + } + +}