Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow template part editing in write mode #67372

Open
wants to merge 16 commits into
base: trunk
Choose a base branch
from

Conversation

talldan
Copy link
Contributor

@talldan talldan commented Nov 28, 2024

What?

Fixes #66463

Allows editing template parts in Write Mode. Also makes blocks like Site Title and Site Logo editable.

Background

Before I describe changes in the PR, I'll describe how the whole things works in trunk.

The block editor has the concept of blockEditingModes (described more deeply in #67856). Blocks can be set into one of three editing modes:

  • default - the block behaves normally, it can be selected and edited as it usually can with all block controls available (in the inspector and toolbar)
  • disabled - the block can't be selected or edited. All child blocks are also disabled (unless they have one of the other two block editing modes set), and they can't be removed, inserted or reordered.
  • contentOnly - makes the block only partially editable and selectable. The block's inspector controls and some other controls are hidden. The user should be able to update content of the block, but not the design. The block can still itself be moved, and any inner blocks are also free to be moved, deleted or new blocks inserted.

Features like Synced Patterns, Zoom Out, Write Mode, and the 'Show Template' option when editing a post are heavily dependent on this. When you use those features you may notice some blocks are disabled and some are contentOnly, others might just be normally editable.

Here's a brief description of each one:

  • Synced Patterns - When an instance of a synced pattern is inserted, the design is locked and the user has to select the 'Edit original' button on the toolbar to edit the design. The locking of the instance is achieved by making all the child blocks disabled. When changing the design, particular blocks in the pattern can be enabled as pattern overrides or given bindings. If you insert a pattern instance that contains any of those kinds of blocks, the blocks are made contentOnly and allow content changes.
  • Zoom Out - Uses a concept called 'sections'. A block that's an inner block of the 'section root' is considered a section. In Zoom Out, the section root is usually the group assigned the <main> tag. So any direct children of <main> are sections. The main element and the sections are in contentOnly mode, but all other blocks are disabled (including Synced Patterns).
  • Write Mode (also known as navigationMode in the codebase) - Write mode has the same kind of section editing as Zoom Out. Additionally child blocks of sections that are considered 'content' blocks are in contentOnly mode so that their content can be updated. That's determined currently by whether the block has at least one attribute with role: content. Synced patterns have some special treatment to ensure users can't change the design of a pattern in write mode, they work very similarly regardless of whether write mode is active or not.

The coordination of the block editing modes for those three features is managed in the codebase within the withDerivedBlockEditingModes reducer in the block editor package (more specifically, getDerivedBlockEditingModesForTree contains the code that determines the mode for an individual clientId). It updates two properties in the block editor store whenever particular actions are dispatched that require changes to the block editing modes (e.g. enabling zoom out, inserting a new section or synced pattern):

  • derivedBlockEditingModes - The block editing modes for outside of write mode
  • derivedNavModeBlockEditingModes- The block editing modes for write mode

There are two separate properties because the block editor store can't determine whether it's in write mode as that data isn't within the block editor store (it's a preference).

They're called 'derived' block editing modes because they haven't been explicitly set, they're calculated based on things like which block are sections, which blocks are synced patterns, and which have the content role, bindings, or pattern overrides.

There's one additional piece, which is that some block types are conferred 'section' status by the isSectionBlock selector. The main thing this does is show a 'Content' panel in the block's Inspector Controls.

The the 'Show Template' option was also mentioned. This is when a user is viewing a post and the 'Show Template' option is active. In this mode, the template is shown but the majority of blocks in the template are disabled and only page content is editable (title, featured image, any blocks within the Post Content). From the template, Post Title and Featured Image are contentOnly and the inner blocks of Post Content are set to default. Template Parts are also selectable, but can't be updated.

This 'Show Template' feature works a little differently. The block editor package doesn't know whether a page/post/pattern or something else entirely is being shown so it can't coordinate this. It's handled by the Editor package in the DisableNonPageContentBlocks component. That component calls the setBlockEditingMode.

When setBlockEditingMode is called it updates a different property within the block editor store called blockEditingModes (these are sometimes referred to as 'explicit' block editing modes because they've been explicitly set). This is kept separate to derivedBlockEditingModes so that if the user switches to zoom out and back, the blockEditingModes aren't removed.

The derivedNavModeBlockEditingModes, derivedBlockEditingModes and the blockEditingModes are returned by the same selector getBlockEditingModes. In trunk if the block has one of the derived modes it takes precedence over the explicit blockEditingMode.

How?

  • A range of blocks that typically appear in template parts have had role: content added to their attributes so that in Write Mode they'll be set to contentOnly.
  • isSectionBlock has been updated to consider the template part block a section. It shows the 'Content' panel in the block inspector.
  • getDerivedBlockEditingModesForTree has been updated to set the correct block editing modes for template parts in Write Mode.

The main challenge was the 'Show Template' option since it uses the explicit block editing modes, not the derived ones. The changes I described above alone made template parts editable when editing a page in Write Mode with 'Show Template' on. To solve this, I've made the explicit block editing modes take priority over the derived ones and added some code to DisableNonPageContentBlocks to not enable template parts when write mode is active.

There were also some performance issues caused by DisableNonPageContentBlocks, which I've partially solved by splitting it up into multiple useEffect calls.

Problems to solve

I think the PR is almost there, but in my own testing:

  • The template parts don't display the "Content" panel in the sidebar and Inspector Controls for the inner blocks of template parts are displayed.
  • Drag and drop is a bit broken. Sections can be dragged into the Header / Footer TPs and it all goes a bit weird. I think somehow the Template Parts should now allow any block dropping (but still allow actions like dragging an image onto the Site Logo).
  • Template parts are now editable when editing a Page in Write Mode.
  • Lots of the blocks that I changed have their link controls in the Inspector, which makes them unreachable in contentOnly mode. I imagine these should be moved to the toolbar. (seems like a follow-up issue)
  • There might be a few blocks (like Site Tagline) that still need to be updated to work in contentOnly mode. This block is a tricky one because it doesn't have any suitable attributes for "role":"content". (another follow-up issue)
  • Consider removing 'Edit' / 'Edit original' from template part and synced pattern toolbars (or do so in a follow-up PR)

Testing Instructions

(I find it's best to use Twenty Twenty Four for testing, as that theme has lots of sections out of the box)

Template editing

  1. Open the site editor and edit a template like Blog Homepage
  2. Switch to Write mode using the option in the topbar
  3. Try editing the header and footer and blocks within the header and footer
  4. Observe that most work, with the exception of Site Tagline (still needs a solution, but it'll need to be a follow-up)

Page editing

  1. Still using the site editor open a page
  2. Make sure the Show Template option is on in the document settings (it usually is by default in the site editor)
  3. Switch to Write Mode (it might still be active)
  4. Template parts now shouldn't be selectable or editable in this mode.
  5. Unlike in trunk, blocks like Title and Featured Image are now editable in Write Mode, along with the Post Content as before.

Screenshots or screencast

Kapture.2024-11-29.at.12.38.36.mp4

@talldan talldan added [Type] Enhancement A suggestion for improvement. [Feature] Write mode labels Nov 28, 2024
@talldan talldan self-assigned this Nov 28, 2024
Copy link

github-actions bot commented Nov 28, 2024

Size Change: +279 B (+0.02%)

Total Size: 1.83 MB

Filename Size Change
build/block-editor/index.min.js 259 kB +189 B (+0.07%)
build/block-library/index.min.js 222 kB +33 B (+0.01%)
build/blocks/index.min.js 53 kB +4 B (+0.01%)
build/editor/index.min.js 115 kB +53 B (+0.05%)
ℹ️ View Unchanged
Filename Size
build-module/a11y/index.min.js 482 B
build-module/block-library/file/view.min.js 447 B
build-module/block-library/form/view.min.js 533 B
build-module/block-library/image/view.min.js 1.77 kB
build-module/block-library/navigation/view.min.js 1.16 kB
build-module/block-library/query/view.min.js 742 B
build-module/block-library/search/view.min.js 616 B
build-module/interactivity-router/index.min.js 3.04 kB
build-module/interactivity/debug.min.js 17.2 kB
build-module/interactivity/index.min.js 13.6 kB
build/a11y/index.min.js 952 B
build/annotations/index.min.js 2.26 kB
build/api-fetch/index.min.js 2.32 kB
build/autop/index.min.js 2.12 kB
build/blob/index.min.js 579 B
build/block-directory/index.min.js 7.26 kB
build/block-directory/style-rtl.css 1 kB
build/block-directory/style.css 1 kB
build/block-editor/content-rtl.css 4.47 kB
build/block-editor/content.css 4.46 kB
build/block-editor/default-editor-styles-rtl.css 394 B
build/block-editor/default-editor-styles.css 394 B
build/block-editor/style-rtl.css 15.7 kB
build/block-editor/style.css 15.7 kB
build/block-library/blocks/archives/editor-rtl.css 84 B
build/block-library/blocks/archives/editor.css 83 B
build/block-library/blocks/archives/style-rtl.css 90 B
build/block-library/blocks/archives/style.css 90 B
build/block-library/blocks/audio/editor-rtl.css 149 B
build/block-library/blocks/audio/editor.css 151 B
build/block-library/blocks/audio/style-rtl.css 132 B
build/block-library/blocks/audio/style.css 132 B
build/block-library/blocks/audio/theme-rtl.css 134 B
build/block-library/blocks/audio/theme.css 134 B
build/block-library/blocks/avatar/editor-rtl.css 115 B
build/block-library/blocks/avatar/editor.css 115 B
build/block-library/blocks/avatar/style-rtl.css 104 B
build/block-library/blocks/avatar/style.css 104 B
build/block-library/blocks/button/editor-rtl.css 265 B
build/block-library/blocks/button/editor.css 265 B
build/block-library/blocks/button/style-rtl.css 555 B
build/block-library/blocks/button/style.css 555 B
build/block-library/blocks/buttons/editor-rtl.css 291 B
build/block-library/blocks/buttons/editor.css 291 B
build/block-library/blocks/buttons/style-rtl.css 345 B
build/block-library/blocks/buttons/style.css 345 B
build/block-library/blocks/calendar/style-rtl.css 240 B
build/block-library/blocks/calendar/style.css 240 B
build/block-library/blocks/categories/editor-rtl.css 132 B
build/block-library/blocks/categories/editor.css 131 B
build/block-library/blocks/categories/style-rtl.css 152 B
build/block-library/blocks/categories/style.css 152 B
build/block-library/blocks/code/editor-rtl.css 53 B
build/block-library/blocks/code/editor.css 53 B
build/block-library/blocks/code/style-rtl.css 139 B
build/block-library/blocks/code/style.css 139 B
build/block-library/blocks/code/theme-rtl.css 122 B
build/block-library/blocks/code/theme.css 122 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 420 B
build/block-library/blocks/columns/style.css 420 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 124 B
build/block-library/blocks/comment-author-avatar/editor.css 124 B
build/block-library/blocks/comment-author-name/style-rtl.css 72 B
build/block-library/blocks/comment-author-name/style.css 72 B
build/block-library/blocks/comment-content/style-rtl.css 120 B
build/block-library/blocks/comment-content/style.css 120 B
build/block-library/blocks/comment-date/style-rtl.css 65 B
build/block-library/blocks/comment-date/style.css 65 B
build/block-library/blocks/comment-edit-link/style-rtl.css 70 B
build/block-library/blocks/comment-edit-link/style.css 70 B
build/block-library/blocks/comment-reply-link/style-rtl.css 71 B
build/block-library/blocks/comment-reply-link/style.css 71 B
build/block-library/blocks/comment-template/style-rtl.css 200 B
build/block-library/blocks/comment-template/style.css 199 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 238 B
build/block-library/blocks/comments-pagination/editor.css 231 B
build/block-library/blocks/comments-pagination/style-rtl.css 245 B
build/block-library/blocks/comments-pagination/style.css 241 B
build/block-library/blocks/comments-title/editor-rtl.css 75 B
build/block-library/blocks/comments-title/editor.css 75 B
build/block-library/blocks/comments/editor-rtl.css 842 B
build/block-library/blocks/comments/editor.css 842 B
build/block-library/blocks/comments/style-rtl.css 637 B
build/block-library/blocks/comments/style.css 637 B
build/block-library/blocks/cover/editor-rtl.css 631 B
build/block-library/blocks/cover/editor.css 631 B
build/block-library/blocks/cover/style-rtl.css 1.7 kB
build/block-library/blocks/cover/style.css 1.69 kB
build/block-library/blocks/details/editor-rtl.css 65 B
build/block-library/blocks/details/editor.css 65 B
build/block-library/blocks/details/style-rtl.css 86 B
build/block-library/blocks/details/style.css 86 B
build/block-library/blocks/embed/editor-rtl.css 331 B
build/block-library/blocks/embed/editor.css 331 B
build/block-library/blocks/embed/style-rtl.css 419 B
build/block-library/blocks/embed/style.css 419 B
build/block-library/blocks/embed/theme-rtl.css 133 B
build/block-library/blocks/embed/theme.css 133 B
build/block-library/blocks/file/editor-rtl.css 326 B
build/block-library/blocks/file/editor.css 326 B
build/block-library/blocks/file/style-rtl.css 278 B
build/block-library/blocks/file/style.css 279 B
build/block-library/blocks/footnotes/style-rtl.css 198 B
build/block-library/blocks/footnotes/style.css 197 B
build/block-library/blocks/form-input/editor-rtl.css 229 B
build/block-library/blocks/form-input/editor.css 229 B
build/block-library/blocks/form-input/style-rtl.css 357 B
build/block-library/blocks/form-input/style.css 357 B
build/block-library/blocks/form-submission-notification/editor-rtl.css 344 B
build/block-library/blocks/form-submission-notification/editor.css 341 B
build/block-library/blocks/form-submit-button/style-rtl.css 69 B
build/block-library/blocks/form-submit-button/style.css 69 B
build/block-library/blocks/freeform/editor-rtl.css 2.6 kB
build/block-library/blocks/freeform/editor.css 2.6 kB
build/block-library/blocks/gallery/editor-rtl.css 946 B
build/block-library/blocks/gallery/editor.css 951 B
build/block-library/blocks/gallery/style-rtl.css 1.83 kB
build/block-library/blocks/gallery/style.css 1.82 kB
build/block-library/blocks/gallery/theme-rtl.css 108 B
build/block-library/blocks/gallery/theme.css 108 B
build/block-library/blocks/group/editor-rtl.css 334 B
build/block-library/blocks/group/editor.css 334 B
build/block-library/blocks/group/style-rtl.css 103 B
build/block-library/blocks/group/style.css 103 B
build/block-library/blocks/group/theme-rtl.css 79 B
build/block-library/blocks/group/theme.css 79 B
build/block-library/blocks/heading/style-rtl.css 188 B
build/block-library/blocks/heading/style.css 188 B
build/block-library/blocks/html/editor-rtl.css 346 B
build/block-library/blocks/html/editor.css 347 B
build/block-library/blocks/image/editor-rtl.css 799 B
build/block-library/blocks/image/editor.css 799 B
build/block-library/blocks/image/style-rtl.css 1.6 kB
build/block-library/blocks/image/style.css 1.59 kB
build/block-library/blocks/image/theme-rtl.css 137 B
build/block-library/blocks/image/theme.css 137 B
build/block-library/blocks/latest-comments/style-rtl.css 355 B
build/block-library/blocks/latest-comments/style.css 354 B
build/block-library/blocks/latest-posts/editor-rtl.css 139 B
build/block-library/blocks/latest-posts/editor.css 138 B
build/block-library/blocks/latest-posts/style-rtl.css 520 B
build/block-library/blocks/latest-posts/style.css 520 B
build/block-library/blocks/list/style-rtl.css 107 B
build/block-library/blocks/list/style.css 107 B
build/block-library/blocks/loginout/style-rtl.css 61 B
build/block-library/blocks/loginout/style.css 61 B
build/block-library/blocks/media-text/editor-rtl.css 321 B
build/block-library/blocks/media-text/editor.css 320 B
build/block-library/blocks/media-text/style-rtl.css 552 B
build/block-library/blocks/media-text/style.css 550 B
build/block-library/blocks/more/editor-rtl.css 427 B
build/block-library/blocks/more/editor.css 427 B
build/block-library/blocks/navigation-link/editor-rtl.css 644 B
build/block-library/blocks/navigation-link/editor.css 645 B
build/block-library/blocks/navigation-link/style-rtl.css 192 B
build/block-library/blocks/navigation-link/style.css 191 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 295 B
build/block-library/blocks/navigation-submenu/editor.css 294 B
build/block-library/blocks/navigation/editor-rtl.css 2.2 kB
build/block-library/blocks/navigation/editor.css 2.2 kB
build/block-library/blocks/navigation/style-rtl.css 2.24 kB
build/block-library/blocks/navigation/style.css 2.23 kB
build/block-library/blocks/nextpage/editor-rtl.css 392 B
build/block-library/blocks/nextpage/editor.css 392 B
build/block-library/blocks/page-list/editor-rtl.css 378 B
build/block-library/blocks/page-list/editor.css 378 B
build/block-library/blocks/page-list/style-rtl.css 192 B
build/block-library/blocks/page-list/style.css 192 B
build/block-library/blocks/paragraph/editor-rtl.css 236 B
build/block-library/blocks/paragraph/editor.css 236 B
build/block-library/blocks/paragraph/style-rtl.css 341 B
build/block-library/blocks/paragraph/style.css 340 B
build/block-library/blocks/post-author-biography/style-rtl.css 74 B
build/block-library/blocks/post-author-biography/style.css 74 B
build/block-library/blocks/post-author-name/style-rtl.css 69 B
build/block-library/blocks/post-author-name/style.css 69 B
build/block-library/blocks/post-author/editor-rtl.css 107 B
build/block-library/blocks/post-author/editor.css 107 B
build/block-library/blocks/post-author/style-rtl.css 188 B
build/block-library/blocks/post-author/style.css 189 B
build/block-library/blocks/post-comments-form/editor-rtl.css 96 B
build/block-library/blocks/post-comments-form/editor.css 96 B
build/block-library/blocks/post-comments-form/style-rtl.css 527 B
build/block-library/blocks/post-comments-form/style.css 528 B
build/block-library/blocks/post-content/style-rtl.css 61 B
build/block-library/blocks/post-content/style.css 61 B
build/block-library/blocks/post-date/style-rtl.css 62 B
build/block-library/blocks/post-date/style.css 62 B
build/block-library/blocks/post-excerpt/editor-rtl.css 71 B
build/block-library/blocks/post-excerpt/editor.css 71 B
build/block-library/blocks/post-excerpt/style-rtl.css 155 B
build/block-library/blocks/post-excerpt/style.css 155 B
build/block-library/blocks/post-featured-image/editor-rtl.css 729 B
build/block-library/blocks/post-featured-image/editor.css 726 B
build/block-library/blocks/post-featured-image/style-rtl.css 347 B
build/block-library/blocks/post-featured-image/style.css 347 B
build/block-library/blocks/post-navigation-link/style-rtl.css 215 B
build/block-library/blocks/post-navigation-link/style.css 214 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 399 B
build/block-library/blocks/post-template/style.css 398 B
build/block-library/blocks/post-terms/style-rtl.css 96 B
build/block-library/blocks/post-terms/style.css 96 B
build/block-library/blocks/post-time-to-read/style-rtl.css 70 B
build/block-library/blocks/post-time-to-read/style.css 70 B
build/block-library/blocks/post-title/style-rtl.css 162 B
build/block-library/blocks/post-title/style.css 162 B
build/block-library/blocks/preformatted/style-rtl.css 125 B
build/block-library/blocks/preformatted/style.css 125 B
build/block-library/blocks/pullquote/editor-rtl.css 134 B
build/block-library/blocks/pullquote/editor.css 134 B
build/block-library/blocks/pullquote/style-rtl.css 351 B
build/block-library/blocks/pullquote/style.css 350 B
build/block-library/blocks/pullquote/theme-rtl.css 167 B
build/block-library/blocks/pullquote/theme.css 167 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 121 B
build/block-library/blocks/query-pagination-numbers/editor.css 118 B
build/block-library/blocks/query-pagination/editor-rtl.css 154 B
build/block-library/blocks/query-pagination/editor.css 154 B
build/block-library/blocks/query-pagination/style-rtl.css 237 B
build/block-library/blocks/query-pagination/style.css 237 B
build/block-library/blocks/query-title/style-rtl.css 64 B
build/block-library/blocks/query-title/style.css 64 B
build/block-library/blocks/query/editor-rtl.css 527 B
build/block-library/blocks/query/editor.css 527 B
build/block-library/blocks/quote/style-rtl.css 238 B
build/block-library/blocks/quote/style.css 238 B
build/block-library/blocks/quote/theme-rtl.css 233 B
build/block-library/blocks/quote/theme.css 236 B
build/block-library/blocks/read-more/style-rtl.css 138 B
build/block-library/blocks/read-more/style.css 138 B
build/block-library/blocks/rss/editor-rtl.css 101 B
build/block-library/blocks/rss/editor.css 101 B
build/block-library/blocks/rss/style-rtl.css 288 B
build/block-library/blocks/rss/style.css 287 B
build/block-library/blocks/search/editor-rtl.css 199 B
build/block-library/blocks/search/editor.css 199 B
build/block-library/blocks/search/style-rtl.css 660 B
build/block-library/blocks/search/style.css 658 B
build/block-library/blocks/search/theme-rtl.css 113 B
build/block-library/blocks/search/theme.css 113 B
build/block-library/blocks/separator/editor-rtl.css 100 B
build/block-library/blocks/separator/editor.css 100 B
build/block-library/blocks/separator/style-rtl.css 248 B
build/block-library/blocks/separator/style.css 248 B
build/block-library/blocks/separator/theme-rtl.css 195 B
build/block-library/blocks/separator/theme.css 195 B
build/block-library/blocks/shortcode/editor-rtl.css 286 B
build/block-library/blocks/shortcode/editor.css 286 B
build/block-library/blocks/site-logo/editor-rtl.css 806 B
build/block-library/blocks/site-logo/editor.css 803 B
build/block-library/blocks/site-logo/style-rtl.css 218 B
build/block-library/blocks/site-logo/style.css 218 B
build/block-library/blocks/site-tagline/editor-rtl.css 87 B
build/block-library/blocks/site-tagline/editor.css 87 B
build/block-library/blocks/site-tagline/style-rtl.css 65 B
build/block-library/blocks/site-tagline/style.css 65 B
build/block-library/blocks/site-title/editor-rtl.css 85 B
build/block-library/blocks/site-title/editor.css 85 B
build/block-library/blocks/site-title/style-rtl.css 143 B
build/block-library/blocks/site-title/style.css 143 B
build/block-library/blocks/social-link/editor-rtl.css 309 B
build/block-library/blocks/social-link/editor.css 309 B
build/block-library/blocks/social-links/editor-rtl.css 727 B
build/block-library/blocks/social-links/editor.css 724 B
build/block-library/blocks/social-links/style-rtl.css 1.51 kB
build/block-library/blocks/social-links/style.css 1.51 kB
build/block-library/blocks/spacer/editor-rtl.css 346 B
build/block-library/blocks/spacer/editor.css 346 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table-of-contents/style-rtl.css 83 B
build/block-library/blocks/table-of-contents/style.css 83 B
build/block-library/blocks/table/editor-rtl.css 394 B
build/block-library/blocks/table/editor.css 394 B
build/block-library/blocks/table/style-rtl.css 640 B
build/block-library/blocks/table/style.css 639 B
build/block-library/blocks/table/theme-rtl.css 152 B
build/block-library/blocks/table/theme.css 152 B
build/block-library/blocks/tag-cloud/editor-rtl.css 144 B
build/block-library/blocks/tag-cloud/editor.css 144 B
build/block-library/blocks/tag-cloud/style-rtl.css 266 B
build/block-library/blocks/tag-cloud/style.css 265 B
build/block-library/blocks/template-part/editor-rtl.css 368 B
build/block-library/blocks/template-part/editor.css 368 B
build/block-library/blocks/template-part/theme-rtl.css 113 B
build/block-library/blocks/template-part/theme.css 113 B
build/block-library/blocks/term-description/style-rtl.css 126 B
build/block-library/blocks/term-description/style.css 126 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 165 B
build/block-library/blocks/text-columns/style.css 165 B
build/block-library/blocks/verse/style-rtl.css 98 B
build/block-library/blocks/verse/style.css 98 B
build/block-library/blocks/video/editor-rtl.css 441 B
build/block-library/blocks/video/editor.css 442 B
build/block-library/blocks/video/style-rtl.css 192 B
build/block-library/blocks/video/style.css 192 B
build/block-library/blocks/video/theme-rtl.css 134 B
build/block-library/blocks/video/theme.css 134 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.08 kB
build/block-library/common.css 1.08 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/editor-rtl.css 11.8 kB
build/block-library/editor.css 11.8 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/reset-rtl.css 472 B
build/block-library/reset.css 472 B
build/block-library/style-rtl.css 15 kB
build/block-library/style.css 15 kB
build/block-library/theme-rtl.css 708 B
build/block-library/theme.css 712 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.87 kB
build/commands/index.min.js 16.1 kB
build/commands/style-rtl.css 955 B
build/commands/style.css 952 B
build/components/index.min.js 228 kB
build/components/style-rtl.css 12.4 kB
build/components/style.css 12.4 kB
build/compose/index.min.js 12.7 kB
build/core-commands/index.min.js 3.09 kB
build/core-data/index.min.js 74.3 kB
build/customize-widgets/index.min.js 11 kB
build/customize-widgets/style-rtl.css 1.35 kB
build/customize-widgets/style.css 1.35 kB
build/data-controls/index.min.js 641 B
build/data/index.min.js 8.69 kB
build/date/index.min.js 18 kB
build/deprecated/index.min.js 458 B
build/dom-ready/index.min.js 325 B
build/dom/index.min.js 4.66 kB
build/edit-post/classic-rtl.css 578 B
build/edit-post/classic.css 580 B
build/edit-post/index.min.js 13.4 kB
build/edit-post/style-rtl.css 2.75 kB
build/edit-post/style.css 2.75 kB
build/edit-site/index.min.js 221 kB
build/edit-site/posts-rtl.css 7.43 kB
build/edit-site/posts.css 7.43 kB
build/edit-site/style-rtl.css 13.6 kB
build/edit-site/style.css 13.6 kB
build/edit-widgets/index.min.js 17.7 kB
build/edit-widgets/style-rtl.css 4.09 kB
build/edit-widgets/style.css 4.09 kB
build/editor/style-rtl.css 9.32 kB
build/editor/style.css 9.32 kB
build/element/index.min.js 4.82 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 8.05 kB
build/format-library/style-rtl.css 476 B
build/format-library/style.css 476 B
build/hooks/index.min.js 1.65 kB
build/html-entities/index.min.js 445 B
build/i18n/index.min.js 3.58 kB
build/is-shallow-equal/index.min.js 526 B
build/keyboard-shortcuts/index.min.js 1.31 kB
build/keycodes/index.min.js 1.46 kB
build/list-reusable-blocks/index.min.js 2.13 kB
build/list-reusable-blocks/style-rtl.css 852 B
build/list-reusable-blocks/style.css 852 B
build/media-utils/index.min.js 3.58 kB
build/notices/index.min.js 946 B
build/nux/index.min.js 1.62 kB
build/nux/style-rtl.css 749 B
build/nux/style.css 745 B
build/patterns/index.min.js 7.37 kB
build/patterns/style-rtl.css 687 B
build/patterns/style.css 685 B
build/plugins/index.min.js 1.86 kB
build/preferences-persistence/index.min.js 2.06 kB
build/preferences/index.min.js 2.9 kB
build/preferences/style-rtl.css 554 B
build/preferences/style.css 554 B
build/primitives/index.min.js 829 B
build/priority-queue/index.min.js 1.54 kB
build/private-apis/index.min.js 972 B
build/react-i18n/index.min.js 630 B
build/react-refresh-entry/index.min.js 9.47 kB
build/react-refresh-runtime/index.min.js 6.76 kB
build/redux-routine/index.min.js 2.7 kB
build/reusable-blocks/index.min.js 2.55 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 10.3 kB
build/router/index.min.js 5.42 kB
build/server-side-render/index.min.js 1.94 kB
build/shortcode/index.min.js 1.4 kB
build/style-engine/index.min.js 2.04 kB
build/token-list/index.min.js 581 B
build/url/index.min.js 3.9 kB
build/vendors/react-dom.min.js 41.7 kB
build/vendors/react-jsx-runtime.min.js 556 B
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 965 B
build/vips/index.min.js 36.2 kB
build/warning/index.min.js 250 B
build/widgets/index.min.js 7.16 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.03 kB

compressed-size-action

Copy link

github-actions bot commented Nov 28, 2024

Flaky tests detected in 00bc8ae.
Some tests passed with failed attempts. The failures may not be related to this commit but are still reported for visibility. See the documentation for more information.

🔍 Workflow run URL: https://github.com/WordPress/gutenberg/actions/runs/12270164427
📝 Reported issues:

}

// Allow selection of template parts outside of sections.
if ( blockName === 'core/template-part' ) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm curious - are we "allowed" to reference core blocks like this in the block editor package?

If not how can we pass in references to these blocks and express the custom logic here that relates to "template parts"?

I was thinking of a private block editor setting, but then I'm not sure how we'd handle the custom logic that seems to relate specifically to template parts.

I'm also thinking about how we could extend this to the Navigation block in the future.

Copy link
Contributor Author

@talldan talldan Dec 4, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think not ideal to have loads of this, but it's ok for testing new concepts. I don't think it's harmful to any non-WP consumers of the block editor package as these bits of code will have no effect if they don't have these block types. It's just a bit of a code quality issue to have lots of hard to follow conditions, and it's better in the long run to try unifying some concepts behind an API or similar, but sometimes the right one takes a while to emerge.

Hopefully someday in the future template parts will be deprecated and there will only be synced patterns, and they'll work the same way.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We do have a fair bit of this already in the block editor package 😅

Could we use a similar logic to get/set groupingBlockName for the template part block? Is it likely that third parties will provide other types of template part-like blocks that we might want this code to work with?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

core/block is a special block (We could even relocate it within block-editor). Template part should be just core/block ultimately. I think we should try to avoid any other block type (maybe other than these two)

Copy link
Contributor

@draganescu draganescu left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wonder how come we didn'tt just enable role content on these blocks before?

@annezazu
Copy link
Contributor

Thank you so much for all your work here! Some quick feedback after going through it today with some folks:

  • Remove “Edit” for the block tool bar for template parts. It's a pattern we don't show elsewhere (it also weirdly broke when testing this PR in playground?) and we want to keep the experience contained to this canvas rather than moving someone into an isolated view.
  • Ensure there’s a “Content” section in right sidebar for template parts, showing Site Title, Site Logo, etc like we see with the query loop. I see you already have this noted as a problem to solve :D so consider this a +1 (I should have read the PR description before testing).

@richtabor
Copy link
Member

richtabor commented Nov 30, 2024

Remove “Edit” for the block tool bar for template parts. It's a pattern we don't show elsewhere

We actually do. When a template is rendered when in “Design” mode, you can select the header and see “Edit”. But in this scenario I’m referring to, the “Edit” button opens the template part in an isolated view.

I propose we do the same here, treating them the same.

@talldan
Copy link
Contributor Author

talldan commented Dec 2, 2024

it also weirdly broke when testing this PR in playground?

That might be from this bug in trunk: #67443

I propose we do the same here, treating them the same.

So retain the 'Edit' button?

Synced patterns are also another case, 'Edit original' still shows in Write Mode when they're used as sections.

Either way, the change is small enough that it could be considered for a follow-up that adjusts how this works across a wider range of blocks.

@annezazu
Copy link
Contributor

annezazu commented Dec 2, 2024

So retain the 'Edit' button? Synced patterns are also another case, 'Edit original' still shows in Write Mode when they're used as sections.

I'm not sure what @richtabor means here but I can relay the feedback I've heard in chatting with a few folks last week that the "edit" button didn't make sense here in write mode in the block toolbar for template parts. I think as part of simplifying the site editing experience, we should remove the "edit" option when in Write mode in order to keep someone on the main canvas. It's an odd option to have listed when so few options are available and too prominent as is.

@talldan
Copy link
Contributor Author

talldan commented Dec 3, 2024

I wonder how come we didn't just enable role content on these blocks before?

It was pretty easy to git blame this, but I still didn't find a clear answer. The role: content property was originally added to support two features:

I'd forgotten the first one exists. I don't think I've seen a use case for it.

In terms of answering your question, my hunch is:

  • Those features mainly considered paragraphs and other simple content for their use cases.
  • Site editing blocks might not have been as developed as they are today back then, some of the attributes that role: content is being added to now might not have existed.

@talldan talldan force-pushed the add/write-mode-section-editing-to-template-parts branch from 1fd035e to b15f5e3 Compare December 4, 2024 06:13
@talldan
Copy link
Contributor Author

talldan commented Dec 4, 2024

I think there's one more blocker issue for this, which is that when editing a Page in the Site Editor (in Template Locked rendering mode), template parts are now editable (including the inner blocks).

Steps to Repro
  1. Open the Site Editor
  2. Click Pages
  3. Choose a page
  4. Enter Write Mode

In this PR: Template parts and their inner blocks can be edited
In trunk: Template parts can't be edited.

I'll be meditating on how to solve this!

It's challenging because the Zoom Out / Write mode block editing modes currently take priority over the Template Locked block editing modes.

Zoom Out and Write Mode are also implemented in the block editor package, where there's no knowledge that Template Locked rendering mode exists, as that's a WordPress concept, so there's no easy option for coordinating between the two.

I'm wondering if the block editing mode priorities should change so that it's still possible to call setBlockEditingMode to disable blocks in Zoom Out / Write Mode. Maybe there needs to be some special protection against the section root or section blocks. 🤔

@talldan talldan force-pushed the add/write-mode-section-editing-to-template-parts branch 2 times, most recently from 46a9999 to cfbf48a Compare December 6, 2024 08:33
@talldan talldan force-pushed the add/write-mode-section-editing-to-template-parts branch from cfbf48a to 631ac3a Compare December 9, 2024 07:50
@talldan
Copy link
Contributor Author

talldan commented Dec 10, 2024

I think I've got this working as is expected now, but I'm not so happy with the implementation and the performance tests don't seem happy, so I'll need to revise a few things.

In terms of the implementation, I don't like how blockEditingModes are very complicated. They already were complex (and expensive), but I don't think it has improved after the recent refactoring.

// Otherwise, check if there's an ancestor that is contentOnly
const parentMode = getBlockEditingMode( state, rootClientId );
return parentMode === 'contentOnly' ? 'default' : parentMode;
return 'default';
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I personally found this code really confusingly written (and the comment made me more confused). It'd be easier to understand if it were written like this:

const parentMode = getBlockEditingMode( state, rootClientId );
// Child blocks inherit a 'disabled' state from their parents.
if ( parentMode === 'disabled' ) {
    return 'disabled';
}

// Other modes are not inherited, return the 'default' value.
return 'default';

That would make it clear that the part I've refactored is the if ( parentMode === 'disabled' ) block. It has now moved to the withDerivedBlockEditingModes reducer.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm having a hard time connecting your comment with the existing code and why the change? (Agreed it's confusing)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The handling of the inherited disabled states has been moved to withDerivedBlockEditingModes, this is the new code that replaces the recursive call in the selector:

if ( hasDisabledBlocks ) {
// Look through parents to find one with an explicit block editing mode.
let ancestorBlockEditingMode;
let parent = state.blocks.parents.get( clientId );
while ( parent !== undefined ) {
// There's a chance we only just calculated this for the parent,
// if so we can return that value for a faster lookup.
if ( derivedBlockEditingModes.has( parent ) ) {
ancestorBlockEditingMode =
derivedBlockEditingModes.get( parent );
} else if ( state.blockEditingModes.has( parent ) ) {
// Checking the explicit block editing mode will be slower,
// as the block editing mode is more likely to be set on a
// distant ancestor.
ancestorBlockEditingMode =
state.blockEditingModes.get( parent );
}
if ( ancestorBlockEditingMode ) {
break;
}
parent = state.blocks.parents.get( parent );
}
// If the ancestor block editing mode is disabled, it's inherited by the child.
if ( ancestorBlockEditingMode === 'disabled' ) {
derivedBlockEditingModes.set( clientId, 'disabled' );
return;
}
}

As for the why - it's related to what I mentioned comment about letting the explicit block editing modes override the derived ones. It would've been difficult to do that for the inherited disabled states because the code for determining that was in the selector.

Comment on lines 2313 to 2322
if ( hasDisabledBlocks ) {
const ancestorBlockEditingMode = getAncestorBlockEditingMode(
state,
clientId
);
if ( ancestorBlockEditingMode === 'disabled' ) {
derivedBlockEditingModes.set( clientId, 'disabled' );
return;
}
}
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is the part I've refactored from the getBlockEditingModes selector.

After this change, if a parent (ancestor) block has a blockEditingMode of 'disabled', the children will have a disabled derivedBlockEditingMode to reflect the way the mode is inherited by children.

The selector already has code to check derivedBlockEditingModes and return the value from it.

Comment on lines +2304 to +2308
// If the block already has an explicit block editing mode set,
// don't override it.
if ( state.blockEditingModes.has( clientId ) ) {
return;
}
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this change might need some discussion. Previously, if a block had a blockEditingMode explicitly set to something (say 'disabled' or 'contentOnly'), but you then switched to zoom out, write mode, or if the block is in a synced pattern, then those experiences would be able to override the blockEditingMode (they would set modes within the derivedBlockEditingModes state and that had precedence over blockEditingModes).

This change makes it the other way around, the explicit blockEditingModes now has precedence.

It's perhaps questionable because it allows plugins to change how those features work by calling setBlockEditingMode.

On the other hand, it's what allows Page Editing to work correctly in Write Mode, the editor package calls setBlockEditingMode in its DisableNonPageContentBlocks component to control certain aspects of the experience. The editor is really an extensibility layer over the block editor package, I haven't been able to think of a way to give it special privileges over the block editing modes without also opening up the access to plugins (other than introducing another private API).

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This change makes it the other way around, the explicit blockEditingModes now has precedence.

I think this makes more sense, that said, I think we should work to remove/deprecate the explicit blockEditingModes entirely (not specifically here) because that is just creating confusion and moving us away from decorativeness.

Comment on lines +181 to +188
derivedBlockEditingModes: new Map( [
[ '6cf70164-9097-4460-bcbf-200560546988', 'disabled' ],
[ 'ef45d5fd-5234-4fd5-ac4f-c3736c7f9337', 'disabled' ],
[ 'b26fc763-417d-4f01-b81c-2ec61e14a972', 'disabled' ],
[ '9b9c5c3f-2e46-4f02-9e14-9fe9515b958f', 'disabled' ],
[ 'b3247f75-fd94-4fef-97f9-5bfd162cc416', 'disabled' ],
[ 'e178812d-ce5e-48c7-a945-8ae4ffcbbb7c', 'disabled' ],
] ),
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Now we have to list out all the blocks that inherit the disabled mode from the parent so that's mostly what the test changes are.

@@ -433,7 +473,7 @@ describe( 'private selectors', () => {
],
[
'e178812d-ce5e-48c7-a945-8ae4ffcbbb7c',
'9b9c5c3f-2e46-4f02-9e14-9fe9515b958f',
'ef45d5fd-5234-4fd5-ac4f-c3736c7f9337',
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This test had some mistakes in it. We can see from order that the parent of 'e178812d-ce5e-48c7-a945-8ae4ffcbbb7c' is 'ef45d5fd-5234-4fd5-ac4f-c3736c7f9337'.

It meant changing a bunch of stuff about the test.

@@ -12,11 +12,13 @@
},
"isLink": {
"type": "boolean",
"default": false
"default": false,
"role": "content"
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think I might move these changes to the post blocks to another PR, as they're really not relevant to the topic of the PR.

Comment on lines 48 to 51
if ( ! isNavigationMode ) {
for ( const clientId of templateParts ) {
setBlockEditingMode( clientId, 'contentOnly' );
}
Copy link
Contributor Author

@talldan talldan Dec 11, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When editing a page (with 'Show template' on) in write mode, template parts are now 'disabled' (because they're not set to 'contentOnly').

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, I was just wondering about this, and what navigationMode even means in this context.

So in this third useEffect, it sets template part blocks to content-only mode if not in navigation mode (which seems to be another term for write mode)?

Comment on lines +2646 to +2647
const updatedBlock = getBlockTreeBlock(
nextState,
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The change here is because SET_BLOCK_EDITING_MODE is often called on the root block (with a client id of ''). When you do nextState.blocks.tree.get( '' ), it returns an object that doesn't have a clientId property and that causes some of the later code to fail. getBlockTreeBlock works around that by patching the returned object to have a clientId.

It might be better to make sure the root in the tree does have a clientId property. 😄

@talldan
Copy link
Contributor Author

talldan commented Dec 11, 2024

the performance tests don't seem happy

To expand on this, for the site editor the 'first block' test is showing a drop of around 30-40%. This is a test that edits a page in the site editor, so the changes to how disabled blocks work in this PR is going to be the problem.

I'd expect this if there are lots of actions being triggered on editor load that cause the derived block editing modes to be recalculated, which there are.

DisableNonPageContentBlocks seems particularly badly optimized, it calls SET_BLOCK_EDITING_MODE and UNSET_BLOCK_EDITING_MODE a lot when the editor is loading. It even does this multiple times for the same clientIds, setting and unsetting them. That has knock-on effect now that the derived block editing modes for disabled blocks are calculated on dispatch of those actions, so that'd be a good place to improve.

Also, the way that component finds template part client ids involves looking through every single block, and it'll recalculate whenever blocks are inserted/removed. A hack for this could be to find template parts from the list of controlled blocks which is shorter and less likely to change.

Block syncing for template parts also seems to trigger a lot of this. It replaces inner blocks for template parts multiple times, giving them new clientIds in the process.

Some of that might be down to the way react triggers effects multiple times in dev mode.

@talldan
Copy link
Contributor Author

talldan commented Dec 11, 2024

Think I've solved the performance issues now, it mostly seems to have come down to some small changes to DisableNonPageContentBlocks.

@talldan talldan marked this pull request as ready for review December 11, 2024 09:48
Copy link

github-actions bot commented Dec 11, 2024

The following accounts have interacted with this PR and/or linked issues. I will continue to update these lists as activity occurs. You can also manually ask me to refresh this list by adding the props-bot label.

Unlinked Accounts

The following contributors have not linked their GitHub and WordPress.org accounts: @xavier-lc.

Contributors, please read how to link your accounts to ensure your work is properly credited in WordPress releases.

If you're merging code through a pull request on GitHub, copy and paste the following into the bottom of the merge commit message.

Unlinked contributors: xavier-lc.

Co-authored-by: talldan <[email protected]>
Co-authored-by: getdave <[email protected]>
Co-authored-by: draganescu <[email protected]>
Co-authored-by: tellthemachines <[email protected]>
Co-authored-by: youknowriad <[email protected]>
Co-authored-by: ramonjd <[email protected]>
Co-authored-by: annezazu <[email protected]>
Co-authored-by: richtabor <[email protected]>
Co-authored-by: ntsekouras <[email protected]>

To understand the WordPress project's expectations around crediting contributors, please review the Contributor Attribution page in the Core Handbook.

@getdave
Copy link
Contributor

getdave commented Dec 11, 2024

DisableNonPageContentBlocks seems particularly badly optimized, it calls SET_BLOCK_EDITING_MODE and UNSET_BLOCK_EDITING_MODE a lot when the editor is loading. It even does this multiple times for the same clientIds, setting and unsetting them. That has knock-on effect now that the derived block editing modes for disabled blocks are calculated on dispatch of those actions, so that'd be a good place to improve.

I've noticed this testing on related work. It's really quite bad and we should consider revising it asap.


// Template parts become sections in navigation mode.
const _isNavigationMode = isNavigationMode( state );
if ( _isNavigationMode && blockName === 'core/template-part' ) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do template parts and pattern have different behaviors? Should they be "sections" always?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, I'd love to align this more. It mostly comes down to the way synced patterns and blocks with contentOnly template lock are locked from being edited all the time.

Template Parts are still fully editable when editing a template, so they only act as these contentOnly sections in write mode.

This could be aligned more, but I think there's also a UX part to this.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Speaking only about template parts, the behaviour in this PR seems intuitive to me in that it makes template parts consistent with current "sections" on trunk: content blocks are editable in write mode but nothing else. On trunk the entire template part is inert.

As for synced patterns, which behaviour should they share?

I'm still catching up, so is it proposed that the content blocks of synced patterns in write mode should be editable?

I see how the two are related, but I see synced patterns as more discrete objects that require deliberate editing.

When editing a template, template parts at least in my brain "belong" to the template and so it's logical that their content parts should be editable.

Of course, I could not be making sense at all. 😇

for ( const clientId of disabledIds ) {
unsetBlockEditingMode( clientId );
}
} );
};
}, [ templateParts, contentOnlyIds, disabledIds, registry ] );
}, [ disabledIds, registry ] );

return null;
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What would it take to move away from this component entirely? The code here is so confusing.

What happens if we passed a list of block types as settings to the block editor: editableBlockTypes: [ 'core/post-content', 'core/post-title' ] or something like that, would that be a valid solution?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, it is confusing! There's already a list like this - https://github.com/WordPress/gutenberg/blob/trunk/packages/editor/src/components/provider/use-post-content-blocks.js

I think your idea works for most of the blocks, apart from the template part where the block itself is enabled but inner blocks are disabled. This is buggy anyway, as disabling the inner blocks like that doesn't prevent insertions, so at the moment you can still drag things into the template part block when editing a page. 😓

I personally think it'd be best to remove the way template parts are selectable in this mode. There's a parallel discussion on it here - #67621 (comment).

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Another thing is that in the long run, I think it'd be interesting to determine these blocks via their bindings.

E.g. if the user is editing a page with the id 12, then any blocks with bindings to that entity become editable.

That's a bit far away, but it makes me thing that rather than editableBlockTypes we should instead pass editableClientIds as the editor setting.

Blocks with a post meta binding could already be made to work like this if they're in the template.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think all these exceptions we're introducing to please some specific UX affordance are really not helping. We keep constructing and deconstructing. I'm not sure how to solve it personally but I think we should consider scaling back UX wise maybe and trying to systemize these changes.

It's really not clear to me why we're treating template parts differently than reusable blocks. We should (at least in our minds) consider these two things the same.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, I'll look into the template part / synced pattern disparity in a separate PR so design folk can be brought into a more focused conversation. My feeling is it might also take some improvements to both blocks to land in a happy place, but we'll see.

I'm happy to discuss possibilities around DisableNonPageContentBlocks, but that doesn't really seem like a blocker to this PR, as it's barely any different to trunk. Maybe there's someone else who'd also be interested in looking into this, I seem to be getting ten new things to do with each single PR I work on 😄

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, I'll look into the template part / synced pattern disparity in a separate PR

#68042 is the PR.

Actually it does highlight something. Giving Site Title/Logo the role: content attribute isn't enough. In a pattern a paragraph would have this role, but it still isn't editable unless it is marked as a pattern override.

We likely need some additional mechanic to make this work.

@annezazu
Copy link
Contributor

Noting that with write mode, we often have to click to highlight which blocks to edit and double clicking then leads to the isolated editing mode. More than a few times, I landed there by accident! I think in Write mode, we need to turn off isolated editing in general, both with the "edit" option in the toolbar and the double click to edit.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Write mode [Type] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Template part selecting and editing unavailable in “Write” mode
8 participants