From d3a1923f6d39501fd67bdc718b0c55ab0f143c17 Mon Sep 17 00:00:00 2001
From: bnjmnm <benm@umich.edu>
Date: Wed, 21 Jun 2023 14:23:53 -0400
Subject: [PATCH] Issue #3366676 by lauriii, smustgrave, narendraR: Display
 config translation forms in a modal dialog

---
 .../ConfigTranslationController.php           | 23 +++++++++++++
 .../ConfigTranslationUiTest.php               | 32 +++++++++++++++++++
 2 files changed, 55 insertions(+)

diff --git a/core/modules/config_translation/src/Controller/ConfigTranslationController.php b/core/modules/config_translation/src/Controller/ConfigTranslationController.php
index 8c9dc480e883..da17189c6daa 100644
--- a/core/modules/config_translation/src/Controller/ConfigTranslationController.php
+++ b/core/modules/config_translation/src/Controller/ConfigTranslationController.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\config_translation\Controller;
 
+use Drupal\Component\Serialization\Json;
 use Drupal\config_translation\ConfigMapperManagerInterface;
 use Drupal\config_translation\Exception\ConfigMapperLanguageException;
 use Drupal\Core\Access\AccessManagerInterface;
@@ -222,6 +223,13 @@ public function itemPage(Request $request, RouteMatchInterface $route_match, $pl
           $operations['add'] = [
             'title' => $this->t('Add'),
             'url' => Url::fromRoute($mapper->getAddRouteName(), $mapper->getAddRouteParameters()),
+            'attributes' => [
+              'class' => ['use-ajax'],
+              'data-dialog-type' => 'modal',
+              'data-dialog-options' => Json::encode([
+                'width' => 880,
+              ]),
+            ],
           ];
         }
         else {
@@ -229,11 +237,25 @@ public function itemPage(Request $request, RouteMatchInterface $route_match, $pl
           $operations['edit'] = [
             'title' => $this->t('Edit'),
             'url' => Url::fromRoute($mapper->getEditRouteName(), $mapper->getEditRouteParameters()),
+            'attributes' => [
+              'class' => ['use-ajax'],
+              'data-dialog-type' => 'modal',
+              'data-dialog-options' => Json::encode([
+                'width' => 880,
+              ]),
+            ],
           ];
 
           $operations['delete'] = [
             'title' => $this->t('Delete'),
             'url' => Url::fromRoute($mapper->getDeleteRouteName(), $mapper->getDeleteRouteParameters()),
+            'attributes' => [
+              'class' => ['use-ajax'],
+              'data-dialog-type' => 'modal',
+              'data-dialog-options' => Json::encode([
+                'width' => 880,
+              ]),
+            ],
           ];
         }
       }
@@ -248,6 +270,7 @@ public function itemPage(Request $request, RouteMatchInterface $route_match, $pl
         // Even if the mapper contains multiple language codes, the source
         // configuration can still be edited.
         '#access' => ($langcode == $original_langcode) || $operations_access,
+        '#attached' => ['library' => ['core/drupal.dialog.ajax']],
       ];
     }
     return $page;
diff --git a/core/modules/config_translation/tests/src/FunctionalJavascript/ConfigTranslationUiTest.php b/core/modules/config_translation/tests/src/FunctionalJavascript/ConfigTranslationUiTest.php
index b8e66757ab0e..2f9c43a69f92 100644
--- a/core/modules/config_translation/tests/src/FunctionalJavascript/ConfigTranslationUiTest.php
+++ b/core/modules/config_translation/tests/src/FunctionalJavascript/ConfigTranslationUiTest.php
@@ -3,6 +3,7 @@
 namespace Drupal\Tests\config_translation\FunctionalJavascript;
 
 use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
+use Drupal\language\Entity\ConfigurableLanguage;
 
 /**
  * Translate settings and entities to various languages.
@@ -43,4 +44,35 @@ public function testViewContextualLink() {
     $this->assertNotNull($link, 'Translate view contextual link added.');
   }
 
+  /**
+   * Tests that the add, edit and delete operations open in a modal.
+   */
+  public function testConfigTranslationDialog() {
+    $page = $this->getSession()->getPage();
+    ConfigurableLanguage::createFromLangcode('fi')->save();
+
+    $user = $this->drupalCreateUser([
+      'translate configuration',
+    ]);
+    $this->drupalLogin($user);
+
+    $this->drupalGet('admin/structure/views/view/content/translate');
+    $this->clickLink('Add');
+    $this->assertEquals('Add Finnish translation for Content view', $this->assertSession()->waitForElement('css', '.ui-dialog-title')->getText());
+    $this->assertSession()->fieldExists('translation[config_names][views.view.content][label]')->setValue('Content FI');
+    $page->find('css', '.ui-dialog-buttonset')->pressButton('Save translation');
+    $this->assertSession()->pageTextContains('Successfully saved Finnish translation.');
+
+    $this->clickLink('Edit');
+    $this->assertEquals('Edit Finnish translation for Content view', $this->assertSession()->waitForElement('css', '.ui-dialog-title')->getText());
+    $this->getSession()->getPage()->find('css', '.ui-dialog-buttonset')->pressButton('Save translation');
+    $this->assertSession()->pageTextContains('Successfully updated Finnish translation.');
+
+    $page->find('css', '.dropbutton-toggle button')->click();
+    $this->clickLink('Delete');
+    $this->assertEquals('Are you sure you want to delete the Finnish translation of Content view?', $this->assertSession()->waitForElement('css', '.ui-dialog-title')->getText());
+    $page->find('css', '.ui-dialog-buttonset')->pressButton('Delete');
+    $this->assertSession()->pageTextContains('Finnish translation of Content view was deleted');
+  }
+
 }
-- 
GitLab