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