From d5642f04445e4ab55382d29c3fc24526457c3415 Mon Sep 17 00:00:00 2001
From: AKHIL BABU <akhilbabui1998@gmail.com>
Date: Fri, 7 Feb 2025 12:06:45 +0530
Subject: [PATCH 1/3] Issues/3501847: Send entity keys to the editor from the
 mount controller.

---
 src/Controller/ExperienceBuilderController.php      |  3 ++-
 .../Controller/ExperienceBuilderControllerTest.php  |  4 ++--
 .../Entity/Routing/XbHtmlRouteProviderTest.php      |  4 ++--
 tests/src/Kernel/Traits/XbUiAssertionsTrait.php     | 13 +++++++++----
 ui/global.d.ts                                      |  2 +-
 ui/src/main.tsx                                     |  2 +-
 6 files changed, 17 insertions(+), 11 deletions(-)

diff --git a/src/Controller/ExperienceBuilderController.php b/src/Controller/ExperienceBuilderController.php
index d090d95da8..2c84b8a938 100644
--- a/src/Controller/ExperienceBuilderController.php
+++ b/src/Controller/ExperienceBuilderController.php
@@ -112,8 +112,9 @@ HTML;
       'drupalSettings' => [
         'xb' => [
           'base' => \sprintf('xb/%s/%s', $entity_type, $entity?->id()),
-          'entityType' => $entity_type,
+          'entity_type' => $entity_type,
           'entity' => $entity?->id(),
+          'entity_type_keys' => $entity?->getEntityType()->getKeys(),
           'demo_mode' => $demo_mode,
           // Allow for perfect component previews, by letting the client side
           // know what global assets to load in component preview <iframe>s.
diff --git a/tests/src/Kernel/Controller/ExperienceBuilderControllerTest.php b/tests/src/Kernel/Controller/ExperienceBuilderControllerTest.php
index d811afc3f3..33211b2ca2 100644
--- a/tests/src/Kernel/Controller/ExperienceBuilderControllerTest.php
+++ b/tests/src/Kernel/Controller/ExperienceBuilderControllerTest.php
@@ -64,7 +64,7 @@ final class ExperienceBuilderControllerTest extends KernelTestBase {
     ])->toString();
     self::assertEquals("/xb/$entity_type", $add_url);
     $this->request(Request::create($add_url));
-    $this->assertExperienceBuilderMount($entity_type, '');
+    $this->assertExperienceBuilderMount($entity_type);
 
     $storage = $this->container->get('entity_type.manager')->getStorage($entity_type);
     $sut = $storage->create($values);
@@ -77,7 +77,7 @@ final class ExperienceBuilderControllerTest extends KernelTestBase {
     self::assertEquals("/xb/$entity_type/{$sut->id()}", $edit_url);
     $this->request(Request::create($edit_url));
 
-    $this->assertExperienceBuilderMount($entity_type, $sut->id());
+    $this->assertExperienceBuilderMount($entity_type, $sut);
   }
 
   public static function entityData(): array {
diff --git a/tests/src/Kernel/Entity/Routing/XbHtmlRouteProviderTest.php b/tests/src/Kernel/Entity/Routing/XbHtmlRouteProviderTest.php
index 66955ed13b..dec419d979 100644
--- a/tests/src/Kernel/Entity/Routing/XbHtmlRouteProviderTest.php
+++ b/tests/src/Kernel/Entity/Routing/XbHtmlRouteProviderTest.php
@@ -44,7 +44,7 @@ final class XbHtmlRouteProviderTest extends KernelTestBase {
     $this->setUpCurrentUser([], ['administer xb_page']);
     $url = Url::fromRoute('entity.xb_page.add_form')->toString();
     $this->request(Request::create($url));
-    $this->assertExperienceBuilderMount('xb_page', '');
+    $this->assertExperienceBuilderMount('xb_page');
   }
 
   public function testEditFormRoute(): void {
@@ -53,7 +53,7 @@ final class XbHtmlRouteProviderTest extends KernelTestBase {
     $page->save();
     $url = $page->toUrl('edit-form')->toString();
     $this->request(Request::create($url));
-    $this->assertExperienceBuilderMount('xb_page', $page->id());
+    $this->assertExperienceBuilderMount('xb_page', $page);
   }
 
 }
diff --git a/tests/src/Kernel/Traits/XbUiAssertionsTrait.php b/tests/src/Kernel/Traits/XbUiAssertionsTrait.php
index ee032439a1..941e78c4ea 100644
--- a/tests/src/Kernel/Traits/XbUiAssertionsTrait.php
+++ b/tests/src/Kernel/Traits/XbUiAssertionsTrait.php
@@ -4,6 +4,8 @@ declare(strict_types=1);
 
 namespace Drupal\Tests\experience_builder\Kernel\Traits;
 
+use Drupal\Core\Entity\EntityInterface;
+
 trait XbUiAssertionsTrait {
 
   /**
@@ -11,16 +13,19 @@ trait XbUiAssertionsTrait {
    *
    * @param string $entity_type
    *   The entity type.
-   * @param string|int|null $entity_id
-   *   The entity ID.
+   * @param \Drupal\Core\Entity\EntityInterface $entity
+   *   (optional) The entity.
    */
-  protected function assertExperienceBuilderMount(string $entity_type, string|int|null $entity_id): void {
+  protected function assertExperienceBuilderMount(string $entity_type, ?EntityInterface $entity = NULL): void {
+    $entity_id = $entity ? $entity->id() : NULL;
+    $entity_type_keys = $entity ? $entity->getEntityType()->getKeys() : NULL;
     $this->assertTitle('Drupal Experience Builder');
     self::assertCount(1, $this->cssSelect('#experience-builder'));
     self::assertArrayHasKey('xb', $this->drupalSettings);
     self::assertEquals("xb/$entity_type/$entity_id", $this->drupalSettings['xb']['base']);
-    self::assertEquals($entity_type, $this->drupalSettings['xb']['entityType']);
+    self::assertEquals($entity_type, $this->drupalSettings['xb']['entity_type']);
     self::assertEquals($entity_id, $this->drupalSettings['xb']['entity']);
+    self::assertEquals($entity_type_keys, $this->drupalSettings['xb']['entity_type_keys']);
   }
 
 }
diff --git a/ui/global.d.ts b/ui/global.d.ts
index 1c8a3b9506..720bc7ecb2 100644
--- a/ui/global.d.ts
+++ b/ui/global.d.ts
@@ -3,7 +3,7 @@ import type { PropsValues } from '@/types/Form';
 interface DrupalSettings {
   xb: {
     base: string;
-    entityType: string;
+    entity_type: string;
     entity: string;
     global_assets: {
       css: string;
diff --git a/ui/src/main.tsx b/ui/src/main.tsx
index 9dbe573afb..4802707d44 100644
--- a/ui/src/main.tsx
+++ b/ui/src/main.tsx
@@ -48,7 +48,7 @@ const container = document.getElementById('experience-builder');
 
 const appConfiguration: AppConfiguration = {
   baseUrl: drupalSettings?.path?.baseUrl || import.meta.env.BASE_URL,
-  entityType: drupalSettings?.xb?.entityType || 'node',
+  entityType: drupalSettings?.xb?.entity_type || 'node',
   entity: drupalSettings?.xb?.entity || '1',
 };
 
-- 
GitLab


From aa7f8bcb36a0c4f9a73bce842a33c92387918da8 Mon Sep 17 00:00:00 2001
From: AKHIL BABU <akhilbabui1998@gmail.com>
Date: Tue, 11 Feb 2025 12:47:15 +0530
Subject: [PATCH 2/3] Use camel casing.

---
 src/Controller/ExperienceBuilderController.php  | 12 ++++++------
 tests/src/Kernel/Traits/XbUiAssertionsTrait.php |  4 ++--
 ui/global.d.ts                                  | 11 ++++++-----
 ui/src/components/ComponentPreview.tsx          |  6 +++---
 4 files changed, 17 insertions(+), 16 deletions(-)

diff --git a/src/Controller/ExperienceBuilderController.php b/src/Controller/ExperienceBuilderController.php
index 2c84b8a938..f951c0509d 100644
--- a/src/Controller/ExperienceBuilderController.php
+++ b/src/Controller/ExperienceBuilderController.php
@@ -112,17 +112,17 @@ HTML;
       'drupalSettings' => [
         'xb' => [
           'base' => \sprintf('xb/%s/%s', $entity_type, $entity?->id()),
-          'entity_type' => $entity_type,
+          'entityType' => $entity_type,
           'entity' => $entity?->id(),
-          'entity_type_keys' => $entity?->getEntityType()->getKeys(),
-          'demo_mode' => $demo_mode,
+          'entityTypeKeys' => $entity?->getEntityType()->getKeys(),
+          'demoMode' => $demo_mode,
           // Allow for perfect component previews, by letting the client side
           // know what global assets to load in component preview <iframe>s.
           // @see ui/src/components/ComponentPreview.tsx
-          'global_assets' => [
+          'globalAssets' => [
             'css' => $this->assetRenderer->renderCssAssets($preview_assets),
-            'js_header' => $this->assetRenderer->renderJsHeaderAssets($preview_assets),
-            'js_footer' => $this->assetRenderer->renderJsFooterAssets($preview_assets),
+            'jsHeader' => $this->assetRenderer->renderJsHeaderAssets($preview_assets),
+            'jsFooter' => $this->assetRenderer->renderJsFooterAssets($preview_assets),
           ],
           'xbModulePath' => $xb_module_path,
         ],
diff --git a/tests/src/Kernel/Traits/XbUiAssertionsTrait.php b/tests/src/Kernel/Traits/XbUiAssertionsTrait.php
index 941e78c4ea..437d821d25 100644
--- a/tests/src/Kernel/Traits/XbUiAssertionsTrait.php
+++ b/tests/src/Kernel/Traits/XbUiAssertionsTrait.php
@@ -23,9 +23,9 @@ trait XbUiAssertionsTrait {
     self::assertCount(1, $this->cssSelect('#experience-builder'));
     self::assertArrayHasKey('xb', $this->drupalSettings);
     self::assertEquals("xb/$entity_type/$entity_id", $this->drupalSettings['xb']['base']);
-    self::assertEquals($entity_type, $this->drupalSettings['xb']['entity_type']);
+    self::assertEquals($entity_type, $this->drupalSettings['xb']['entityType']);
     self::assertEquals($entity_id, $this->drupalSettings['xb']['entity']);
-    self::assertEquals($entity_type_keys, $this->drupalSettings['xb']['entity_type_keys']);
+    self::assertEquals($entity_type_keys, $this->drupalSettings['xb']['entityTypeKeys']);
   }
 
 }
diff --git a/ui/global.d.ts b/ui/global.d.ts
index 720bc7ecb2..ae1fa57f1b 100644
--- a/ui/global.d.ts
+++ b/ui/global.d.ts
@@ -3,17 +3,18 @@ import type { PropsValues } from '@/types/Form';
 interface DrupalSettings {
   xb: {
     base: string;
-    entity_type: string;
+    entityType: string;
     entity: string;
-    global_assets: {
+    globalAssets: {
       css: string;
-      js_header: string;
-      js_footer: string;
+      jsHeader: string;
+      jsFooter: string;
     };
     layoutUtils: PropsValues;
     navUtils: PropsValues;
-    demo_mode: boolean;
     xbModulePath: string;
+    selectedComponent: string;
+    demoMode: boolean;
   };
   path: {
     baseUrl: string;
diff --git a/ui/src/components/ComponentPreview.tsx b/ui/src/components/ComponentPreview.tsx
index 7dc29c9cf6..22def01b08 100644
--- a/ui/src/components/ComponentPreview.tsx
+++ b/ui/src/components/ComponentPreview.tsx
@@ -23,11 +23,11 @@ const ComponentPreview: React.FC<ComponentPreviewProps> = ({
   const defaultPreviewWidth = 300;
   const defaultPreviewHeight = 200;
 
-  const css = drupalSettings?.xb.global_assets.css + component.css;
+  const css = drupalSettings?.xb.globalAssets.css + component.css;
   const js_footer =
-    drupalSettings?.xb.global_assets.js_footer + component.js_footer;
+    drupalSettings?.xb.globalAssets.jsFooter + component.js_footer;
   const js_header =
-    drupalSettings?.xb.global_assets.js_header + component.js_header;
+    drupalSettings?.xb.globalAssets.jsHeader + component.js_header;
 
   const markup = component.default_markup;
   const base_url = window.location.origin + drupalSettings?.path.baseUrl;
-- 
GitLab


From de4c8a0a329c8e1b9f6c5f5ff833099a2a239606 Mon Sep 17 00:00:00 2001
From: AKHIL BABU <akhilbabui1998@gmail.com>
Date: Tue, 11 Feb 2025 14:03:52 +0530
Subject: [PATCH 3/3] Fix test fail.

---
 ui/src/main.tsx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/ui/src/main.tsx b/ui/src/main.tsx
index 4802707d44..9dbe573afb 100644
--- a/ui/src/main.tsx
+++ b/ui/src/main.tsx
@@ -48,7 +48,7 @@ const container = document.getElementById('experience-builder');
 
 const appConfiguration: AppConfiguration = {
   baseUrl: drupalSettings?.path?.baseUrl || import.meta.env.BASE_URL,
-  entityType: drupalSettings?.xb?.entity_type || 'node',
+  entityType: drupalSettings?.xb?.entityType || 'node',
   entity: drupalSettings?.xb?.entity || '1',
 };
 
-- 
GitLab