Overview
Story map key:
Backend - dark blue
Frontend - blue
Lower priority/need scope clarity - light blue

🎾 = top priority 😄
✨= nice to have
Remaining Backend:
#3548854: Add test coverage ensuring consistency on previews markup and live markup when using a content template
Remaining Frontend:
#3558719: Linking then unlinking a field renders a wrong Field Widget: corrupt `StaticPropSource` is sent by client, server should detect this
#3546760: Add e2e test for `ContentTemplates` feature
#3579477: Disallow creating a pattern from component tree with linked props (on ContentTemplates) — currently throws error
Completed Backend:
✅ #3510896: Add a new internal HTTP API for candidate `DynamicPropSource`s to enable a `ContentTemplate` UI
✅ #3529836: Enable starting with an empty XB UI (so without first having to create an entity with a component tree)
✅ #3543188: `ContentTemplate`'s `status` should determine if it is active
✅ #3541021: Refactor `ApiLayoutController` to support `ContentTemplate`s
✅ #3541006: Create HTTP Endpoint for Content Template Preview Entities
✅ #3541015: Create HTTP Endpoint for View modes/content templates
✅ #3544865: `CanvasUiAccessCheck` should grant access if the user has access to content templates or code components
✅ #3543834: Refactor (or attempt to) all or most `ApiLayoutController*Test` classes to also test `ContentTemplate` entities
✅ #3513590: `ComponentSourceInterface::inputToClientModel()` needs to support passing a host entity
✅ #3546260: `ApiLayoutController::getLabel()` should return preview entity label for content templates
✅ #3503038: Enable candidate `DynamicPropSource` suggestions for code components: refactor `GeneratedFieldExplicitInputUxComponentSourceBase` and `FieldForComponentSuggester` to need only SDC's ComponentMetadata, not SDC plugin instances
✅ #3541057: Render `DynamicPropSource`s in `ApiLayoutController` for `ContentTemplate`s using the provided preview entity (which is blocked by #3513590: `ComponentSourceInterface::inputToClientModel()` needs to support passing a host entity)
✅ #3520487: Refuse editing an individual node's component tree (and bring back after 1.0 once exposed slots are allowed)
✅ #3548165: Components in `ContentTemplate`s and `PageRegion`s are not always rendered in correct order
✅ #3546996: Component instances populated by linked `DynamicPropSource`s, but inaccessible entity/field: fall back to `NULL` for these values, triggering fallback rendering
✅ #3547598: Refine API response with DynamicPropSource suggestions to provide better UX
✅ #3545859: Add a `host-entity-url` prop source for linking to the host entity
🚫 #3541054: Require `ContentTemplate`s to have at least one `dynamic` or `host-entity-url` prop source
Completed Frontend:
✅ #3502887: Prepare for avoiding full page reloads: move entity type and ID from base path and into routing parameters
✅ #3541027: Create new Templates menu
✅ #3541031: Render template and support component operations in preview canvas
✅ #3541033: Add ability to switch content used by template using top navigation
✅#3541034: Render component instance form for `ContentTemplate` and support updating static props
✅#3541037: Allow linking `ContentTemplate` SDC/code component instance props to fields (aka finally use `DynamicPropSource`s!) (⚠️be aware: FE and BE need to be able support dynamic values for generating the component props form for template after a field gets set to a prop)
✅#3541035: Make UI to publish a `ContentTemplate` match designs
✅#3545855: Followup for #3541027: UX and styling improvements for Templates menu and sidebar components
✅#3546319: Hide the page data form when a content template is open
✅#3546737: Empty/New view of Content Template editor to match design.
✅#3547085: Open template upon creation, only show <ContentPreviewSelector/> for templates, update editor frame preview when switching content
✅#3547262: Redirect to Content Template after creating first node of bundle
✅#3547294: Handle when suggestedEntityId node or template is deleted in `ContentTemplate`
✅#3548395: Linker does not appear for certain field widgets
✅#3548664: Some Linker choices have no effect
✅#3547513: UI polish for `ContentTemplates` feature
✅#3548320: Contextual panel flickers when linking prop to field
✅#3548186: Resolve 500 error caused when editorFrameContext was lost during navigation
✅#3548761: Can't link (pick a DynamicPropSource) to populate an optional explicit input if that DynamicPropSource evaluates to `NULL` (typically: field is empty)
✅#3548322: Improve how list of field suggestions is displayed in the UI for `ContentTemplates` and remove `ContentTemplates` from feature flag
✅#3555068: Linking a `HostEntityUrlPropSource` to populate a `type: string, format: uri|uri-reference` in a `ContentTemplate` has no effect
✅#3551665: SDC with "image" + string prop: static image lost upon linking the string prop to a `DynamicPropSource`
Completed Shape matching
✅ #3548292: Find required field instance matches for image (`json-schema-definitions://canvas.module/image`) and video prop shapes
✅ #3548295: `type: string` shape matching: find `Node`'s `uid` ("Author") field instance `type: string`
✅ #3548686: Allow mapping "List (integer)" field type to `type: integer` and "List (float)" to `type: float`
✅ #3549034: Shape matching fails on `file` field instances targeting multiple MIME media types (multiple "MIME wildcards")
✅ #3551339: Suggest only relevant DynamicPropSources
✅ #3541361: Find optional field instance matches for `type: object` props (images + videos), including for optional fields on bundleless entity types (e.g. `User`'s `user_picture`)
✅ #3557612: `::matchEntityPropsForObject()` is too naïve: nonsensical `type: object` shape matches and useless labels
✅ #3551455: HostEntityUrlPropSource should be able to support absolute or relative URLs, URL options
Lower priority/need scope clarity Confirmed with product these are out of scope for 1.0
#3541038: Render template data form Assigned to: lauriii
#3541039: Allow creating/deleting view mode from UI
#3541054: Require `ContentTemplate`s to have at least one `dynamic` or `host-entity-url` prop source
#3551343: Add type-appropriate icons for LinkedFieldBox.tsx in `ContentTemplates`
Non-hard-blocking bugs identified along the way — likely needs product manager decisions and triage
✅✨#3546119: Templates menu must be visible for users with the `administer content templates` permission
✅ #3548298: Support linking field types marked SUPPORTED from #3512433 to props in a `ContentTemplate` → everything claimed to be supported has been proven to be working, now provides a handy overview of findings for @lauriii to prioritize in the future: #3548298-22: Support linking field types marked SUPPORTED from #3512433 to props in a `ContentTemplate`
#3522718: [later phase] [needs design] UX for associating mismatched cardinality field instance (too little or too much) with a higher cardinality SDC prop (e.g. `type: array, maxItems: 5`) or lower cardinality (e.g. `type: string`)
✅ #3548749: Allow mapping "List (string)" field type to `type: string`, with a twist: don't map the stored value, but its key/name/label
#3548859: Warn "Display author and date information" has no effect when using Canvas Assigned to: lauriii
✅ #3533675: Avoid suggesting UNIX timestamp integers for `type: integer` props
✅ #3563380: Allow linking integer timestamps to `type: string, format: date`: allow `DynamicPropSource` to optionally use a single-input adapter plugin
| Comment | File | Size | Author |
|---|---|---|---|
| #10 | Screenshot 2025-08-12 at 5.33.11 PM.png | 119.51 KB | hooroomoo |
Comments
Comment #2
hooroomooComment #3
hooroomooComment #7
hooroomootransferring credits from #3518248: [PP-1] Content templates, part 4 (boss battle): create a UI for editing templates
Comment #8
hooroomooComment #9
hooroomooComment #10
hooroomooComment #11
hooroomooComment #12
hooroomooComment #13
hooroomooI am not sure what the difference between the backend items in the map:
HTTP endpoint: dynamic props sourcesandHandle dynamic propsis...I wonder if its the same thing but we just didn't realize when we created this map together. I see only 4 backend tickets got created instead of 5 so maybe it is a duplicate? But I'm not certain.
Comment #15
hooroomooComment #16
tedbowThis how issue is about enabling the UI. There has already been a lot of work to make the content template on the back-end. Although there are backend issues they are in support of the UI
Comment #17
tedbowComment #18
tedbowComment #19
tedbowComment #20
tedbowWanted to make a clarification here based on call between myself, @balintbrews, @hooroomoo and fmazeikis.
Current ContentTemplates require at least 1 dynamic prop. This makes sense but this requirement would force use to do issues in certain order and require larger issues. Since all of this work is on 1.x which does not have a release we deemed to ok if in the first few issues Content Templates don't actually require dynamic props and don't have a way to set them.
The requirement will be removed in #3541021: Refactor `ApiLayoutController` to support `ContentTemplate`s which is the first major back-end issue. It will be added back near the end in #3541054: Require `ContentTemplate`s to have at least one `dynamic` or `host-entity-url` prop source the actually requirement is 1 schema file change a little test coverage. Details in the related issues
Comment #21
balintbrewsComment #22
hooroomoo-
Comment #23
wim leers#3510896: Add a new internal HTTP API for candidate `DynamicPropSource`s to enable a `ContentTemplate` UI is in 🥳 The test coverage for that revealed one bug in shape matching, which isn't a hard blocker, but needs to be fixed at some point. So created a new section.
#3502887: Prepare for avoiding full page reloads: move entity type and ID from base path and into routing parameters is unblocked because #3529836: Enable starting with an empty XB UI (so without first having to create an entity with a component tree) landed! (Which means that one was missing, so added it 😇)
Comment #24
wim leersI doubt that we'd be okay with only supporting populating SDC-sourced component instances with structured data — we of course also want to be able to do that for code components. Which means that we have to do #3503038. See #3503038-16: Enable candidate `DynamicPropSource` suggestions for code components: refactor `GeneratedFieldExplicitInputUxComponentSourceBase` and `FieldForComponentSuggester` to need only SDC's ComponentMetadata, not SDC plugin instances for details.
Comment #25
wim leersWe've got kind of a meta sprawl going on here 😅🙈 i.e.: what is the difference in intent/scope between:
So together with @f.mazeikis and @thoward216, clarifying the scope of this meta! 🎉
ContentTemplates scope for 1.0 is limited to onlyNodeentities — since https://git.drupalcode.org/project/experience_builder/-/commit/843e7b0b1..., because #3498525: [later phase] [META] Allow XB to be used on any content entity type (bundle), as long as it has certain entity type characteristics will happen after 1.0.Comment #26
wim leersPer @hooroomoo 😊
Comment #27
hooroomooMoving the
Allow linking a component prop of a template to a dynamic fieldto be higher in the FE list for visibility and higher priority because this could be big one due to it also has to make sure that the component props form can be correctly generated after a dynamic field is set to a prop.https://git.drupalcode.org/project/experience_builder/-/merge_requests/1...
Comment #28
hooroomooComment #29
tedbowAdded #3543188: `ContentTemplate`'s `status` should determine if it is active to the list, this will allow adding new Content Templates through the UI and have them not take effect until they are published. It is can be worked on now
Comment #30
effulgentsia commentedPer #3517885: Milestone 1.0.0: Production Sites this is a requirement for an XB 1.0.0 stable release, so tagging it as such.
Comment #31
tedbowAdded #3543834: Refactor (or attempt to) all or most `ApiLayoutController*Test` classes to also test `ContentTemplate` entities
Comment #32
wim leers#3543188: `ContentTemplate`'s `status` should determine if it is active landed.
Comment #33
hooroomooConfirmed with product these are out of scope for 1.0 so updating the issue summary
#3541038: Render template data form Assigned to: lauriii
#3541039: Allow creating/deleting view mode from UI
Comment #34
wim leers#3541021: Refactor `ApiLayoutController` to support `ContentTemplate`s is in.
Comment #35
wim leers#3541006: Create HTTP Endpoint for Content Template Preview Entities is in.
Comment #36
penyaskitoAdded #3544865: `CanvasUiAccessCheck` should grant access if the user has access to content templates or code components to the IS.
Comment #37
wim leers#3541015: Create HTTP Endpoint for View modes/content templates is in.
Comment #38
wim leersComment #39
wim leersAnd #3541006: Create HTTP Endpoint for Content Template Preview Entities no longer needs a follow-up! 🥳 Yay more green.
Comment #40
effulgentsia commentedNot every stable blocker needs to block an RC, but this one does.
Comment #41
wim leers#3544865: `CanvasUiAccessCheck` should grant access if the user has access to content templates or code components landed.
Comment #42
wim leers#3543834: Refactor (or attempt to) all or most `ApiLayoutController*Test` classes to also test `ContentTemplate` entities landed.
Comment #43
wim leers#3502887: Prepare for avoiding full page reloads: move entity type and ID from base path and into routing parameters landed.
#3541027: Create new Templates menu landed, but #3545855: Followup for #3541027: UX and styling improvements for Templates menu and sidebar components was descoped from it, so adding that to the list.
Comment #44
wim leers#3513590: `ComponentSourceInterface::inputToClientModel()` needs to support passing a host entity is in, unblocking #3541057: Render `DynamicPropSource`s in `ApiLayoutController` for `ContentTemplate`s using the provided preview entity 👍
See my comment at #3541034-4: Render component instance form for `ContentTemplate` and support updating static props — I think that will need back-end work too, so this plan is AFAICT incomplete.
Comment #45
wim leersMoved #3541054: Require `ContentTemplate`s to have at least one `dynamic` or `host-entity-url` prop source to the bottom, because it's blocked on pretty much everything else happening.
Comment #46
hooroomooComment #47
hooroomooComment #48
hooroomooComment #49
hooroomooAdding a small frontend followup here: #3546319: Hide the page data form when a content template is open
Comment #50
hooroomooComment #51
wim leersAdded #3546260: `ApiLayoutController::getLabel()` should return preview entity label for content templates for the BE.
Comment #52
wim leersAdded #3546119: Templates menu must be visible for users with the `administer content templates` permission for the FE.
Comment #53
hooroomooComment #54
jessebaker commentedComment #55
hooroomooComment #56
hooroomooAdded FE #3546760: Add e2e test for `ContentTemplates` feature to IS
Comment #57
hooroomoo✨ = nice to have
Comment #58
wim leers#3546260: `ApiLayoutController::getLabel()` should return preview entity label for content templates is in.
Comment #59
hooroomooComment #60
hooroomooComment #61
wim leersAdded #3546996: Component instances populated by linked `DynamicPropSource`s, but inaccessible entity/field: fall back to `NULL` for these values, triggering fallback rendering to BE issues — kudos @tedbow for thinking of this! 🙏
Comment #62
hooroomooComment #63
hooroomooAdded small FE bug
#3547085: Open template upon creation, only show <ContentPreviewSelector/> for templates, update editor frame preview when switching content
Comment #64
hooroomooComment #65
wim leers#3503038: Enable candidate `DynamicPropSource` suggestions for code components: refactor `GeneratedFieldExplicitInputUxComponentSourceBase` and `FieldForComponentSuggester` to need only SDC's ComponentMetadata, not SDC plugin instances landed.
Comment #66
hooroomooAdded FE merged #3547262: Redirect to Content Template after creating first node of bundle and todo: #3547294: Handle when suggestedEntityId node or template is deleted in `ContentTemplate`
Comment #67
hooroomooComment #68
hooroomooAdded FE #3547513: UI polish for `ContentTemplates` feature
Comment #69
hooroomoochungus #3541037: Allow linking `ContentTemplate` SDC/code component instance props to fields (aka finally use `DynamicPropSource`s!) is in! 🚨🔥
Added 2 FE follow-ups for that issue:
#3548320: Contextual panel flickers when linking prop to field
#3548322: Improve how list of field suggestions is displayed in the UI for `ContentTemplates` and remove `ContentTemplates` from feature flag
Comment #70
hooroomooAdded these issues relating to mapping props to field types to their own category, feel free to rename category or move them to a different one, just want to capture them in the META.
#3548292: Find required field instance matches for image (`json-schema-definitions://canvas.module/image`) and video prop shapes
#3548295: `type: string` shape matching: find `Node`'s `uid` ("Author") field instance `type: string`
#3548298: Support linking field types marked SUPPORTED from #3512433 to props in a `ContentTemplate`
Comment #71
hooroomooComment #72
wim leersNew:
Fixed:
Comment #73
wim leers#3548395: Linker does not appear for certain field widgets landed, but led to the discovery of a new bug: #3548664: Some Linker choices have no effect.
#3548295: `type: string` shape matching: find `Node`'s `uid` ("Author") field instance `type: string` also landed.
Comment #74
wim leersAdded and fixed #3548686: Allow mapping "List (integer)" field type to `type: integer` and "List (float)" to `type: float`.
Comment #75
hooroomooComment #76
wim leersBE: #3541057: Render `DynamicPropSource`s in `ApiLayoutController` for `ContentTemplate`s using the provided preview entity is fixed. But a seemingly related, but actually pre-existing BE bug surfaced: #3548165: Components in `ContentTemplate`s and `PageRegion`s are not always rendered in correct order.
Comment #77
wim leers#3548664 was fixed, but surfaced #3548761: Can't link (pick a DynamicPropSource) to populate an optional explicit input if that DynamicPropSource evaluates to `NULL` (typically: field is empty) was (re)discovered at #3548664-7: Some Linker choices have no effect.
Comment #78
wim leersNewly discovered by @hooroomoo: #3549034: Shape matching fails on `file` field instances targeting multiple MIME media types (multiple "MIME wildcards").
@lauri confirmed in a call just now we shouldn't try to do all of #3548298: Support linking field types marked SUPPORTED from #3512433 to props in a `ContentTemplate`, and that it's okay to initially ship Content Templates without #3541361: Find optional field instance matches for `type: object` props (images + videos), including for optional fields on bundleless entity types (e.g. `User`'s `user_picture`). So moving both to .
Comment #79
wim leersOne more thing for @lauriii to triage/prioritize later: #3522718: [later phase] [needs design] UX for associating mismatched cardinality field instance (too little or too much) with a higher cardinality SDC prop (e.g. `type: array, maxItems: 5`) or lower cardinality (e.g. `type: string`).
Comment #80
nagwani commentedComment #81
wim leersAdded #3548749: Allow mapping "List (string)" field type to `type: string`, with a twist: don't map the stored value, but its key/name/label, which I extracted from #3548686: Allow mapping "List (integer)" field type to `type: integer` and "List (float)" to `type: float`, which itself came from #3548298: Support linking field types marked SUPPORTED from #3512433 to props in a `ContentTemplate`.
Comment #82
wim leers#3547294: Handle when suggestedEntityId node or template is deleted in `ContentTemplate` landed.
Comment #83
wim leers#3548165: Components in `ContentTemplate`s and `PageRegion`s are not always rendered in correct order landed.
Comment #84
wim leers#3520487: Refuse editing an individual node's component tree (and bring back after 1.0 once exposed slots are allowed) landed and should've been added here. It caused us to discover 2 more issues: #3548854: Add test coverage ensuring consistency on previews markup and live markup when using a content template (added to BE) and #3548859: Warn "Display author and date information" has no effect when using Canvas (for future triaging by @lauriii).
Comment #85
wim leers#3546996: Component instances populated by linked `DynamicPropSource`s, but inaccessible entity/field: fall back to `NULL` for these values, triggering fallback rendering landed.
Comment #86
effulgentsia commentedFor easier scanning, moved remaining "must have" issues for 1.0 to the top.
Comment #87
effulgentsia commented#3547598: Refine API response with DynamicPropSource suggestions to provide better UX was missing from the issue summary. Adding it because #3548322: Improve how list of field suggestions is displayed in the UI for `ContentTemplates` and remove `ContentTemplates` from feature flag depends on it.
Comment #88
effulgentsia commented#3548186: Resolve 500 error caused when editorFrameContext was lost during navigation was missing from the issue summary. Adding it.
Comment #89
effulgentsia commentedComment #90
wim leers#3549034: Shape matching fails on `file` field instances targeting multiple MIME media types (multiple "MIME wildcards") landed.
Comment #91
hooroomooComment #92
hooroomooMoved FE #3547513: UI polish for `ContentTemplates` feature and #3548320: Contextual panel flickers when linking prop to field to completed
Comment #93
hooroomooComment #94
wim leersJust landed #3547598: Refine API response with DynamicPropSource suggestions to provide better UX, which means #3548322: Improve how list of field suggestions is displayed in the UI for `ContentTemplates` and remove `ContentTemplates` from feature flag is now unblocked!
Also, @jessebaker landed #3548186: Resolve 500 error caused when editorFrameContext was lost during navigation yesterday. 👍
Furthermore, in the non-hard-blocking bugs bucket:
Comment #95
wim leers#3548761: Can't link (pick a DynamicPropSource) to populate an optional explicit input if that DynamicPropSource evaluates to `NULL` (typically: field is empty) landed just now!
And IMO #3541054: Require `ContentTemplate`s to have at least one `dynamic` or `host-entity-url` prop source was descoped incorrectly, see #3541054-12: Require `ContentTemplate`s to have at least one `dynamic` or `host-entity-url` prop source for why. 😇
Comment #96
effulgentsia commented#3548322: Improve how list of field suggestions is displayed in the UI for `ContentTemplates` and remove `ContentTemplates` from feature flag landed, which was the last issue needed to take Content Templates out from requiring
canvas_dev_modeto be enabled to just being an enabled feature out of the box, so in a way, the 1.0 scope of this meta issue is done!!!!Still keeping this meta issue open for the 2 test coverage issues that are still remaining and to settle on #3541054: Require `ContentTemplate`s to have at least one `dynamic` or `host-entity-url` prop source which @Wim Leers and I are still debating on that issue whether to do it or not.
Comment #97
hooroomooI opened 2 new issues:
#3551343: Add type-appropriate icons for LinkedFieldBox.tsx in `ContentTemplates`
#3551339: Suggest only relevant DynamicPropSources
I am adding them to the
Lower priority/need scope clarity Confirmed with product these are out of scope for 1.0section for now... If anyone disagrees please feel free to move it. But adding them to the META so they can be tracked for now in case we open a new META for content templates.Comment #98
wim leersThanks, @hooroomoo in #97!
#3541054: Require `ContentTemplate`s to have at least one `dynamic` or `host-entity-url` prop source landed!
Comment #99
wim leers@lauriii uncovered what seems to be a UI bug that slipped through the cracks for several weeks: #3551665: SDC with "image" + string prop: static image lost upon linking the string prop to a `DynamicPropSource`.
Comment #100
wim leersDue to #3545859: Add a `host-entity-url` prop source for linking to the host entity landing at the last minute before RC1 (and it just having gained the missing shape matching + test coverage), there now is a new back-end issue to tackle (#3551455: HostEntityUrlPropSource should be able to support absolute or relative URLs, URL options) and a front-end issue (#3555068: Linking a `HostEntityUrlPropSource` to populate a `type: string, format: uri|uri-reference` in a `ContentTemplate` has no effect).
Comment #101
wim leers#3551339: Suggest only relevant DynamicPropSources and #3541361: Find optional field instance matches for `type: object` props (images + videos), including for optional fields on bundleless entity types (e.g. `User`'s `user_picture`) landed. This issue summary is sorely in need of an update from a product owner or product manager.
(I've been told via Acquia channels that both of those issues are crucial to fix before 1.0, but this meta doesn't reflect that. That's very confusing. 🫤)
Newly identified: #3557612: `::matchEntityPropsForObject()` is too naïve: nonsensical `type: object` shape matches and useless labels.
Comment #102
wim leers#3557612: `::matchEntityPropsForObject()` is too naïve: nonsensical `type: object` shape matches and useless labels and #3551455: HostEntityUrlPropSource should be able to support absolute or relative URLs, URL options landed yesterday.
#3555068: Linking a `HostEntityUrlPropSource` to populate a `type: string, format: uri|uri-reference` in a `ContentTemplate` has no effect landed just now.
And #3541054: Require `ContentTemplate`s to have at least one `dynamic` or `host-entity-url` prop source was "won't-fixed" on October 14.
Comment #103
effulgentsia commented#3551665: SDC with "image" + string prop: static image lost upon linking the string prop to a `DynamicPropSource` landed a while ago, so moved it to the Completed list.
#3558719: Linking then unlinking a field renders a wrong Field Widget: corrupt `StaticPropSource` is sent by client, server should detect this is newly discovered. Adding it to the Remaining front-end section though I don't know at this time if it's a front-end or back-end bug.
Comment #104
wim leersComment #105
wim leers#3563380: Allow linking integer timestamps to `type: string, format: date`: allow `DynamicPropSource` to optionally use a single-input adapter plugin landed last week!
Comment #106
wim leers#3548749: Allow mapping "List (string)" field type to `type: string`, with a twist: don't map the stored value, but its key/name/label landed thanks to @penyaskito!
Comment #107
wim leersMissed requirement: #3579477: Disallow creating a pattern from component tree with linked props (on ContentTemplates) — currently throws error.