[META] Maintainable client-side data model + internal HTTP API
>>> [!note] Migrated issue <!-- Drupal.org comment --> <!-- Migrated from issue #3521002. --> Reported by: [wim leers](https://www.drupal.org/user/99777) >>> <h3 id="overview">Overview</h3> <p>XB was originally developed in parallel:</p> <ul> <li>one pure client-side PoC</li> <li>one pure server-side PoC</li> </ul> <p>Then we got the two talking to each other. XB was originally developed with support SDCs, <em>exclusively</em>, and this is still visible in the metadata about components (the <code>/xb/api/config/component</code> route's response): they're highly SDC-specific.</p> <p>Then in December 2024, we overhauled it significantly in <span class="drupalorg-gitlab-issue-link project-issue-status-info project-issue-status-7"><a href="https://www.drupal.org/project/experience_builder/issues/3491013" title="Status: Closed (fixed)">#3491013: Rework layout API to separate components and slots</a></span> and introduced multiple "node types" in the JSON tree structure the client expects.</p> <p>But <em>virtually everything</em> here has been demo-driven development. There's lots of loose ends, duplication, imprecise OpenAPI specs, etc.</p> <h2 id="beta">Beta blockers (July 2025)</h2> <p>Beta blockers (tag: <code>beta blocker</code>) MUST happen before <span class="drupalorg-gitlab-issue-link drupalorg-gitlab-link-wrapper"><a href="https://git.drupalcode.org/project/canvas/-/work_items/3515932" class="drupalorg-gitlab-link">https://git.drupalcode.org/project/canvas/-/work_items/3515932</a></span>.</p> <p><em>(Numbered lists must happen one after the other, bulleted lists can happen in parallel.)</em></p> <ul> <li><strong>Permissions: <span class="drupalorg-gitlab-issue-link project-issue-status-info project-issue-status-7"><a href="https://www.drupal.org/project/experience_builder/issues/3452581" title="Status: Closed (fixed)">#3452581: [META] XB Permissions</a></span></strong></li> <li><strong>Layout + model</strong> bugs and reliability: <ul> <li>&#9989; <span class="drupalorg-gitlab-issue-link project-issue-status-info project-issue-status-7"><a href="https://www.drupal.org/project/experience_builder/issues/3520662" title="Status: Closed (fixed)">#3520662: Empty slot not visible &mdash; client expects "slot node" for every *possible* slot, not for every *populated* slot</a></span> </li><li>&#9989; Missing "node type" in <code>docs/data-model.md</code>'s <code>3.4 UI Data Model: communicating a `component tree` to the front end</code>: a node type for exposed <code>ContentTemplate</code> slots: <span class="drupalorg-gitlab-issue-link project-issue-status-info project-issue-status-7"><a href="https://www.drupal.org/project/experience_builder/issues/3519352" title="Status: Closed (fixed)">#3519352: Content templates, part 3b: store exposed slot subtrees on individual entities</a></span> </li></ul> </li> <li><strong>XB config entities</strong> bugs and reliability: <ul> <li>&#9989; <span class="drupalorg-gitlab-issue-link project-issue-status-info project-issue-status-7"><a href="https://www.drupal.org/project/experience_builder/issues/3518808" title="Status: Closed (fixed)">#3518808: XbConfigEntityHttpApiTest::testJavaScriptComponent test comments are incorrect regarding status updating</a></span> </li><li>&#9989; <span class="drupalorg-gitlab-issue-link project-issue-status-info project-issue-status-7"><a href="https://www.drupal.org/project/experience_builder/issues/3519634" title="Status: Closed (fixed)">#3519634: Modifying a XB config entity's `status` or `label` should update the auto-save entry too, rather than delete it</a></span> </li></ul> </li> <li><strong>High-impact bugs</strong> <ul> <li>&#9989; <span class="drupalorg-gitlab-issue-link project-issue-status-info project-issue-status-7"><a href="https://www.drupal.org/project/experience_builder/issues/3525130" title="Status: Closed (fixed)">#3525130: Never show any messages in XB's previews</a></span> </li></ul> </li> </ul> <h2 id="stable">Stable blockers (October 2025)</h2> <p>Stable blockers (tag: <code>stable blocker</code>) do not block <span class="drupalorg-gitlab-issue-link drupalorg-gitlab-link-wrapper"><a href="https://git.drupalcode.org/project/canvas/-/work_items/3515932" class="drupalorg-gitlab-link">https://git.drupalcode.org/project/canvas/-/work_items/3515932</a></span>, but would be <em>nice-to-have</em> at that point in time. They MUST happen before <span class="drupalorg-gitlab-issue-link drupalorg-gitlab-link-wrapper"><a href="https://git.drupalcode.org/project/canvas/-/work_items/3517885" class="drupalorg-gitlab-link">https://git.drupalcode.org/project/canvas/-/work_items/3517885</a></span>.</p> <p><em>(Numbered lists must happen one after the other, bulleted lists can happen in parallel.)</em></p> <ul> <li><strong>XB-eligible content entities</strong> functionality: <ul> <li><span class="drupalorg-gitlab-issue-link project-issue-status-info project-issue-status-7"><a href="https://www.drupal.org/project/experience_builder/issues/3518292" title="Status: Closed (fixed)">#3518292: Allow searching for content in the navigator, via `/xb/api/v0/content/{entity_type}`</a></span> </li></ul> </li> <li>Finalize and de-SDC-ify <strong>component metadata</strong> (<code>/xb/api/config/component</code>): <ul> <li>&#9989; <span class="drupalorg-gitlab-issue-link project-issue-status-info project-issue-status-7"><a href="https://www.drupal.org/project/experience_builder/issues/3504421" title="Status: Closed (fixed)">#3504421: Rename `PropSourceComponent.field_data` to `.propSources`</a></span> </li><li>&#9989; <span class="drupalorg-gitlab-issue-link project-issue-status-info project-issue-status-7"><a href="https://www.drupal.org/project/experience_builder/issues/3515629" title="Status: Closed (fixed)">#3515629: FieldWidget's XB transforms must be bubbled by the Field Widget rendering to inform the client</a></span> </li><li>&#9989; <span class="drupalorg-gitlab-issue-link project-issue-status-info project-issue-status-7"><a href="https://www.drupal.org/project/experience_builder/issues/3516705" title="Status: Closed (fixed)">#3516705: Auto-saved changes to code components are not visible in preview-on-hover-component-list until published</a></span> </li><li><span class="drupalorg-gitlab-issue-link project-issue-status-info project-issue-status-7"><a href="https://www.drupal.org/project/experience_builder/issues/3510896" title="Status: Closed (fixed)">#3510896: Add a new internal HTTP API for candidate `DynamicPropSource`s to enable a `ContentTemplate` UI</a></span> </li><li><span class="drupalorg-gitlab-issue-link project-issue-status-info project-issue-status-1"><a href="https://www.drupal.org/project/canvas/issues/3521041" title="Status: Active">#3521041: [META] Refactor the organically grown Component metadata mess in PHP (`::getClientSideInfo()`) and JS (`BaseComponent`, `DynamicComponent`, `PropSourceComponent` etc.)</a></span> </li></ul> </li> <li><strong>Layout + model</strong> maintainability/completeness: <ul> <li><span class="drupalorg-gitlab-issue-link drupalorg-gitlab-link-wrapper"><a href="https://git.drupalcode.org/project/canvas/-/work_items/3499632" class="drupalorg-gitlab-link">https://git.drupalcode.org/project/canvas/-/work_items/3499632</a></span> </li><li><span class="drupalorg-gitlab-issue-link drupalorg-gitlab-link-wrapper"><a href="https://git.drupalcode.org/project/canvas/-/work_items/3491701" class="drupalorg-gitlab-link">https://git.drupalcode.org/project/canvas/-/work_items/3491701</a></span> </li><li><span class="drupalorg-gitlab-issue-link project-issue-status-info project-issue-status-18"><a href="https://www.drupal.org/project/experience_builder/issues/3510892" title="Status: Closed (cannot reproduce)">#3510892: Allow XB to be gradually adopted: make XB's viewing (formatter) and editing (`ApiLayoutController::get()`) work with an empty XB field</a></span> </li><li><del>Missing "node type" in <code>docs/data-model.md</code>'s <code>3.4 UI Data Model: communicating a `component tree` to the front end</code>: a node type for overrides/personalization variants</del> <del>Probably actually additional metadata on the existing <code>nodeType: slot</code> would be sufficient, for example <code>mutuallyExclusive: true|false</code> to indicate only one variant can be visible at a time, and perhaps some extra metadata for additional UI affordances</del> Introduce <code>nodeType: switch</code> &rarr; PoC'd by @penyaskito at <span class="drupalorg-gitlab-issue-link project-issue-status-info project-issue-status-17"><a href="https://www.drupal.org/project/experience_builder/issues/3525565" title="Status: Closed (outdated)">#3525565: Personalization ComponentSource PoC</a></span> </li></ul> </li> <li><strong>Back-end changes to improve front-end performance</strong> <ul> <li><span class="drupalorg-gitlab-issue-link drupalorg-gitlab-link-wrapper"><a href="https://git.drupalcode.org/project/canvas/-/work_items/3505018" class="drupalorg-gitlab-link">https://git.drupalcode.org/project/canvas/-/work_items/3505018</a></span> </li><li><span class="drupalorg-gitlab-issue-link project-issue-status-info project-issue-status-13"><a href="https://www.drupal.org/project/canvas/issues/3528847" title="Status: Needs work">#3528847: Implement `lookup_keys` in Component for optimized queries</a></span> </li></ul> </li> <li><strong>OpenAPI/DX</strong> <ul> <li>&#9989; <span class="drupalorg-gitlab-issue-link project-issue-status-info project-issue-status-7"><a href="https://www.drupal.org/project/experience_builder/issues/3471884" title="Status: Closed (fixed)">#3471884: Rename all XB internal HTTP API routes from `/xb/api/&hellip;` to `/xb/api/v0/&hellip;`</a></span> </li><li><span class="drupalorg-gitlab-issue-link drupalorg-gitlab-link-wrapper"><a href="https://git.drupalcode.org/project/canvas/-/work_items/3472617" class="drupalorg-gitlab-link">https://git.drupalcode.org/project/canvas/-/work_items/3472617</a></span> </li><li><span class="drupalorg-gitlab-issue-link drupalorg-gitlab-link-wrapper"><a href="https://git.drupalcode.org/project/canvas/-/work_items/3499809" class="drupalorg-gitlab-link">https://git.drupalcode.org/project/canvas/-/work_items/3499809</a></span> </li><li><span class="drupalorg-gitlab-issue-link drupalorg-gitlab-link-wrapper"><a href="https://git.drupalcode.org/project/canvas/-/work_items/3507427" class="drupalorg-gitlab-link">https://git.drupalcode.org/project/canvas/-/work_items/3507427</a></span> </li><li><span class="drupalorg-gitlab-issue-link project-issue-status-info project-issue-status-7"><a href="https://www.drupal.org/project/experience_builder/issues/3541131" title="Status: Closed (fixed)">#3541131: DX: Rename `ComponentInputsForm` to `ComponentInstanceForm`</a></span> </li></ul> </li> <h2 id="post-stable-priorities">Post-stable priorities (<em>after</em> October 2025)</h2> <p>Post-stable priorities (tag: <code>post-stable priority</code>) do not block any release, and are things we'd like to see happen, but are intentionally NOT happening any time soon. We're highly confident that these will be net additions without the need for backwards compatibility breaks.</p> <p><em>None yet.</em></p> </ul> > Related issue: [Issue #3517941](https://www.drupal.org/node/3517941) > Related issue: [Issue #3520449](https://www.drupal.org/node/3520449) > Related issue: [Issue #3520484](https://www.drupal.org/node/3520484)
issue