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

Add Paragraph prompt to Post Content when empty #50623

Merged
merged 5 commits into from
May 26, 2023

Conversation

tellthemachines
Copy link
Contributor

What?

Fixes #49086.

Adds an empty paragraph as template to inner blocks if the Post Content block doesn't already have content in it.

Testing Instructions

  1. Create and publish a new page, but leave its content empty.
  2. In the site editor, navigate to Pages -> the page you just created.
  3. Check that an empty Paragraph block with a placeholder prompt now displays inside the Post Content block.

Testing Instructions for Keyboard

Screenshots or screencast

Screenshot 2023-05-15 at 1 21 31 pm Screenshot 2023-05-15 at 1 21 55 pm

@tellthemachines tellthemachines self-assigned this May 15, 2023
@tellthemachines tellthemachines added [Block] Post Content Affects the Post Content Block [Feature] Site Editor Related to the overarching Site Editor (formerly "full site editing") labels May 15, 2023
@github-actions
Copy link

github-actions bot commented May 15, 2023

Size Change: +1.01 kB (0%)

Total Size: 1.4 MB

Filename Size Change
build/block-editor/content-rtl.css 4.23 kB +111 B (+3%)
build/block-editor/content.css 4.23 kB +111 B (+3%)
build/block-editor/index.min.js 199 kB +416 B (0%)
build/block-editor/style-rtl.css 15.1 kB -47 B (0%)
build/block-editor/style.css 15.1 kB -46 B (0%)
build/block-library/blocks/post-comments-form/style-rtl.css 508 B +7 B (+1%)
build/block-library/blocks/post-comments-form/style.css 508 B +7 B (+1%)
build/block-library/index.min.js 205 kB +153 B (0%)
build/block-library/style-rtl.css 12.9 kB +125 B (+1%)
build/block-library/style.css 12.9 kB +126 B (+1%)
build/components/index.min.js 232 kB -5 B (0%)
build/data/index.min.js 8.68 kB -5 B (0%)
build/edit-site/index.min.js 63.9 kB -4 B (0%)
build/edit-site/style-rtl.css 10.5 kB +32 B (0%)
build/edit-site/style.css 10.5 kB +32 B (0%)
build/editor/index.min.js 45.8 kB +1 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 982 B
build/annotations/index.min.js 2.76 kB
build/api-fetch/index.min.js 2.33 kB
build/autop/index.min.js 2.14 kB
build/blob/index.min.js 472 B
build/block-directory/index.min.js 7.18 kB
build/block-directory/style-rtl.css 1.02 kB
build/block-directory/style.css 1.02 kB
build/block-editor/default-editor-styles-rtl.css 381 B
build/block-editor/default-editor-styles.css 381 B
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 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 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 122 B
build/block-library/blocks/audio/style.css 122 B
build/block-library/blocks/audio/theme-rtl.css 126 B
build/block-library/blocks/audio/theme.css 126 B
build/block-library/blocks/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 91 B
build/block-library/blocks/avatar/style.css 91 B
build/block-library/blocks/block/editor-rtl.css 305 B
build/block-library/blocks/block/editor.css 305 B
build/block-library/blocks/button/editor-rtl.css 584 B
build/block-library/blocks/button/editor.css 582 B
build/block-library/blocks/button/style-rtl.css 624 B
build/block-library/blocks/button/style.css 623 B
build/block-library/blocks/buttons/editor-rtl.css 337 B
build/block-library/blocks/buttons/editor.css 337 B
build/block-library/blocks/buttons/style-rtl.css 332 B
build/block-library/blocks/buttons/style.css 332 B
build/block-library/blocks/calendar/style-rtl.css 239 B
build/block-library/blocks/calendar/style.css 239 B
build/block-library/blocks/categories/editor-rtl.css 113 B
build/block-library/blocks/categories/editor.css 112 B
build/block-library/blocks/categories/style-rtl.css 124 B
build/block-library/blocks/categories/style.css 124 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 121 B
build/block-library/blocks/code/style.css 121 B
build/block-library/blocks/code/theme-rtl.css 124 B
build/block-library/blocks/code/theme.css 124 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 409 B
build/block-library/blocks/columns/style.css 409 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-content/style-rtl.css 92 B
build/block-library/blocks/comment-content/style.css 92 B
build/block-library/blocks/comment-template/style-rtl.css 199 B
build/block-library/blocks/comment-template/style.css 198 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 B
build/block-library/blocks/comments-pagination/style.css 231 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 840 B
build/block-library/blocks/comments/editor.css 839 B
build/block-library/blocks/comments/style-rtl.css 637 B
build/block-library/blocks/comments/style.css 636 B
build/block-library/blocks/cover/editor-rtl.css 647 B
build/block-library/blocks/cover/editor.css 650 B
build/block-library/blocks/cover/style-rtl.css 1.61 kB
build/block-library/blocks/cover/style.css 1.6 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 159 B
build/block-library/blocks/details/style.css 159 B
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 410 B
build/block-library/blocks/embed/style.css 410 B
build/block-library/blocks/embed/theme-rtl.css 126 B
build/block-library/blocks/embed/theme.css 126 B
build/block-library/blocks/file/editor-rtl.css 316 B
build/block-library/blocks/file/editor.css 316 B
build/block-library/blocks/file/interactivity.min.js 395 B
build/block-library/blocks/file/style-rtl.css 269 B
build/block-library/blocks/file/style.css 270 B
build/block-library/blocks/file/view.min.js 375 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB
build/block-library/blocks/freeform/editor.css 2.44 kB
build/block-library/blocks/freeform/style-rtl.css 246 B
build/block-library/blocks/freeform/style.css 246 B
build/block-library/blocks/gallery/editor-rtl.css 947 B
build/block-library/blocks/gallery/editor.css 952 B
build/block-library/blocks/gallery/style-rtl.css 1.53 kB
build/block-library/blocks/gallery/style.css 1.53 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 654 B
build/block-library/blocks/group/editor.css 654 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 76 B
build/block-library/blocks/heading/style.css 76 B
build/block-library/blocks/html/editor-rtl.css 336 B
build/block-library/blocks/html/editor.css 337 B
build/block-library/blocks/image/editor-rtl.css 834 B
build/block-library/blocks/image/editor.css 833 B
build/block-library/blocks/image/style-rtl.css 652 B
build/block-library/blocks/image/style.css 652 B
build/block-library/blocks/image/theme-rtl.css 126 B
build/block-library/blocks/image/theme.css 126 B
build/block-library/blocks/latest-comments/style-rtl.css 357 B
build/block-library/blocks/latest-comments/style.css 357 B
build/block-library/blocks/latest-posts/editor-rtl.css 213 B
build/block-library/blocks/latest-posts/editor.css 212 B
build/block-library/blocks/latest-posts/style-rtl.css 478 B
build/block-library/blocks/latest-posts/style.css 478 B
build/block-library/blocks/list/style-rtl.css 88 B
build/block-library/blocks/list/style.css 88 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 507 B
build/block-library/blocks/media-text/style.css 505 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 712 B
build/block-library/blocks/navigation-link/editor.css 711 B
build/block-library/blocks/navigation-link/style-rtl.css 115 B
build/block-library/blocks/navigation-link/style.css 115 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 296 B
build/block-library/blocks/navigation-submenu/editor.css 295 B
build/block-library/blocks/navigation/editor-rtl.css 2.33 kB
build/block-library/blocks/navigation/editor.css 2.33 kB
build/block-library/blocks/navigation/interactivity.min.js 865 B
build/block-library/blocks/navigation/style-rtl.css 2.21 kB
build/block-library/blocks/navigation/style.css 2.2 kB
build/block-library/blocks/navigation/view-modal.min.js 2.81 kB
build/block-library/blocks/navigation/view.min.js 443 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 401 B
build/block-library/blocks/page-list/editor.css 401 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 174 B
build/block-library/blocks/paragraph/editor.css 174 B
build/block-library/blocks/paragraph/style-rtl.css 279 B
build/block-library/blocks/paragraph/style.css 281 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 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-date/style-rtl.css 61 B
build/block-library/blocks/post-date/style.css 61 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 141 B
build/block-library/blocks/post-excerpt/style.css 141 B
build/block-library/blocks/post-featured-image/editor-rtl.css 588 B
build/block-library/blocks/post-featured-image/editor.css 586 B
build/block-library/blocks/post-featured-image/style-rtl.css 319 B
build/block-library/blocks/post-featured-image/style.css 319 B
build/block-library/blocks/post-navigation-link/style-rtl.css 153 B
build/block-library/blocks/post-navigation-link/style.css 153 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 281 B
build/block-library/blocks/post-template/style.css 281 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 69 B
build/block-library/blocks/post-time-to-read/style.css 69 B
build/block-library/blocks/post-title/style-rtl.css 100 B
build/block-library/blocks/post-title/style.css 100 B
build/block-library/blocks/preformatted/style-rtl.css 103 B
build/block-library/blocks/preformatted/style.css 103 B
build/block-library/blocks/pullquote/editor-rtl.css 135 B
build/block-library/blocks/pullquote/editor.css 135 B
build/block-library/blocks/pullquote/style-rtl.css 335 B
build/block-library/blocks/pullquote/style.css 335 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 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 288 B
build/block-library/blocks/query-pagination/style.css 284 B
build/block-library/blocks/query-title/style-rtl.css 63 B
build/block-library/blocks/query-title/style.css 63 B
build/block-library/blocks/query/editor-rtl.css 450 B
build/block-library/blocks/query/editor.css 449 B
build/block-library/blocks/quote/style-rtl.css 222 B
build/block-library/blocks/quote/style.css 222 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/read-more/style-rtl.css 132 B
build/block-library/blocks/read-more/style.css 132 B
build/block-library/blocks/rss/editor-rtl.css 149 B
build/block-library/blocks/rss/editor.css 149 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 178 B
build/block-library/blocks/search/editor.css 178 B
build/block-library/blocks/search/style-rtl.css 434 B
build/block-library/blocks/search/style.css 432 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 B
build/block-library/blocks/separator/editor-rtl.css 146 B
build/block-library/blocks/separator/editor.css 146 B
build/block-library/blocks/separator/style-rtl.css 234 B
build/block-library/blocks/separator/style.css 234 B
build/block-library/blocks/separator/theme-rtl.css 194 B
build/block-library/blocks/separator/theme.css 194 B
build/block-library/blocks/shortcode/editor-rtl.css 323 B
build/block-library/blocks/shortcode/editor.css 323 B
build/block-library/blocks/site-logo/editor-rtl.css 754 B
build/block-library/blocks/site-logo/editor.css 754 B
build/block-library/blocks/site-logo/style-rtl.css 203 B
build/block-library/blocks/site-logo/style.css 203 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 116 B
build/block-library/blocks/site-title/editor.css 116 B
build/block-library/blocks/site-title/style-rtl.css 57 B
build/block-library/blocks/site-title/style.css 57 B
build/block-library/blocks/social-link/editor-rtl.css 184 B
build/block-library/blocks/social-link/editor.css 184 B
build/block-library/blocks/social-links/editor-rtl.css 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.4 kB
build/block-library/blocks/social-links/style.css 1.39 kB
build/block-library/blocks/spacer/editor-rtl.css 348 B
build/block-library/blocks/spacer/editor.css 348 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/editor-rtl.css 433 B
build/block-library/blocks/table/editor.css 433 B
build/block-library/blocks/table/style-rtl.css 645 B
build/block-library/blocks/table/style.css 644 B
build/block-library/blocks/table/theme-rtl.css 146 B
build/block-library/blocks/table/theme.css 146 B
build/block-library/blocks/tag-cloud/style-rtl.css 251 B
build/block-library/blocks/tag-cloud/style.css 253 B
build/block-library/blocks/template-part/editor-rtl.css 403 B
build/block-library/blocks/template-part/editor.css 403 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 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 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 99 B
build/block-library/blocks/verse/style.css 99 B
build/block-library/blocks/video/editor-rtl.css 552 B
build/block-library/blocks/video/editor.css 555 B
build/block-library/blocks/video/style-rtl.css 174 B
build/block-library/blocks/video/style.css 174 B
build/block-library/blocks/video/theme-rtl.css 126 B
build/block-library/blocks/video/theme.css 126 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.1 kB
build/block-library/common.css 1.1 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/editor-rtl.css 12 kB
build/block-library/editor.css 12 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/interactivity/runtime.min.js 2.23 kB
build/block-library/interactivity/vendors.min.js 8.15 kB
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/theme-rtl.css 686 B
build/block-library/theme.css 691 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/blocks/index.min.js 50.9 kB
build/commands/index.min.js 15 kB
build/commands/style-rtl.css 827 B
build/commands/style.css 827 B
build/components/style-rtl.css 11.7 kB
build/components/style.css 11.7 kB
build/compose/index.min.js 12.4 kB
build/core-commands/index.min.js 1.8 kB
build/core-data/index.min.js 16.5 kB
build/customize-widgets/index.min.js 12.2 kB
build/customize-widgets/style-rtl.css 1.38 kB
build/customize-widgets/style.css 1.38 kB
build/data-controls/index.min.js 708 B
build/date/index.min.js 40.5 kB
build/deprecated/index.min.js 507 B
build/dom-ready/index.min.js 324 B
build/dom/index.min.js 4.72 kB
build/edit-post/classic-rtl.css 544 B
build/edit-post/classic.css 545 B
build/edit-post/index.min.js 35.2 kB
build/edit-post/style-rtl.css 7.76 kB
build/edit-post/style.css 7.75 kB
build/edit-widgets/index.min.js 17.3 kB
build/edit-widgets/style-rtl.css 4.53 kB
build/edit-widgets/style.css 4.53 kB
build/editor/style-rtl.css 3.54 kB
build/editor/style.css 3.53 kB
build/element/index.min.js 4.89 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 7.77 kB
build/format-library/style-rtl.css 554 B
build/format-library/style.css 553 B
build/hooks/index.min.js 1.64 kB
build/html-entities/index.min.js 448 B
build/i18n/index.min.js 3.73 kB
build/is-shallow-equal/index.min.js 527 B
build/keyboard-shortcuts/index.min.js 1.78 kB
build/keycodes/index.min.js 1.91 kB
build/list-reusable-blocks/index.min.js 2.14 kB
build/list-reusable-blocks/style-rtl.css 836 B
build/list-reusable-blocks/style.css 836 B
build/media-utils/index.min.js 2.97 kB
build/notices/index.min.js 963 B
build/plugins/index.min.js 1.85 kB
build/preferences-persistence/index.min.js 2.22 kB
build/preferences/index.min.js 1.33 kB
build/primitives/index.min.js 944 B
build/priority-queue/index.min.js 1.52 kB
build/private-apis/index.min.js 939 B
build/react-i18n/index.min.js 696 B
build/react-refresh-entry/index.min.js 8.44 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.74 kB
build/reusable-blocks/index.min.js 2.25 kB
build/reusable-blocks/style-rtl.css 243 B
build/reusable-blocks/style.css 243 B
build/rich-text/index.min.js 11 kB
build/router/index.min.js 1.78 kB
build/server-side-render/index.min.js 2.08 kB
build/shortcode/index.min.js 1.42 kB
build/style-engine/index.min.js 1.52 kB
build/token-list/index.min.js 644 B
build/url/index.min.js 3.65 kB
build/vendors/inert-polyfill.min.js 2.48 kB
build/vendors/react-dom.min.js 41.8 kB
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 1.08 kB
build/warning/index.min.js 268 B
build/widgets/index.min.js 7.28 kB
build/widgets/style-rtl.css 1.15 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.06 kB

compressed-size-action

Copy link
Contributor

@andrewserong andrewserong left a comment

Choose a reason for hiding this comment

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

This is testing nicely for me!

✅ Placeholder text displays when it should, and the Post Content block is visually non-empty in the editor
✅ When editing a page template, the longer-form preview state of the Post Content block is used

Just left a question about optional chaining and whether the wording needs to be more generic for other post types, but other than those two things, this LGTM! ✨

[
'core/paragraph',
{
placeholder: __( 'Type / to add blocks to your page' ),
Copy link
Contributor

Choose a reason for hiding this comment

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

The post content block might not always be in a page. E.g. if we one day have a Posts screen in browse mode. Would it be worth making this more generic?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Good point, might be best to remove this placeholder so the default one appears.

@@ -45,12 +46,29 @@ function EditableContent( { context = {} } ) {
{ id: postId }
);

const hasInnerBlocks = useSelect(
( select ) =>
select( blockEditorStore ).getBlock( clientId ).innerBlocks.length >
Copy link
Contributor

Choose a reason for hiding this comment

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

getBlock can technically return null. Would it be worth adding optional chaining? This might be a bit of a theoretical issue, and I'm possibly overly cautious when it comes to what these selectors 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.

Always best be cautious!

@jasmussen
Copy link
Contributor

This feels like a good step forward. I know it's close to the hearts of @SaxonF and @jameskoster.

GIF:

empty page

One issue here is the blue border around the focused paragraph. I know there's a separate effort to clean all that up, but i this case it's extra problematic because it hides the blinking caret, so it's impossible to know you can type.

In the post editor we have the concept of "is-writing", where all UI fades away. Do we have something similar here? Essentially if I can type and have a blinking caret, there shouldn't be that selection style.

Another option is to just do something like this:

.rich-text.is-selected::after {
	content: none;
}

☝️ Very hacky, best to avoid. But it should work for testing. What do you think?

@jameskoster
Copy link
Contributor

Iirc is-writing only hides the UI after/during keypresses, so I don't think that would solve the issue, as the border is only problematic when the paragraph is empty.

A unique treatment that removes the border on paragraphs when they are:

  1. The only child of Post Content
  2. Empty
  3. Selected

Seems okay to me?

@tellthemachines
Copy link
Contributor Author

One issue here is the blue border around the focused paragraph. I know there's a separate effort to clean all that up, but i this case it's extra problematic because it hides the blinking caret, so it's impossible to know you can type.

This happens with all text-based blocks in the site editor: Paragraph, Heading, List, Verse, Quote... in all of these cases the caret is hidden. It might be best to address the problem for these blocks as a whole.

@github-actions
Copy link

github-actions bot commented May 16, 2023

Flaky tests detected in 13fc935.
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/5052140938
📝 Reported issues:

@tellthemachines
Copy link
Contributor Author

Perf test failure seems legit, looking into it

@tellthemachines
Copy link
Contributor Author

So the failing perf test caught an actual bug: Post Content inner blocks show up as empty if the post is in draft mode. I just changed the logic a bit to detect the presence of content via the entity record instead of the block editor store, and it seems to be working correctly now.

[ postType, postId ]
);

const hasInnerBlocks = !! entityRecord?.content?.raw;
Copy link
Contributor

Choose a reason for hiding this comment

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

Just looking above at the blocks value returned by useEntityBlockEditor — would it work to check if blocks.length is greater than 0?

Here's where blocks is determined:

blocks: editedRecord.blocks,

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Aaaah yes that should work! Well spotted.

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 so it seems that blocks are also empty on first load, so for a draft post the content is getting replaced with the empty paragraph template we're passing useInnerBlocksProps 🤔 I think we'll have to stick with the entity record after all.

Copy link
Contributor

Choose a reason for hiding this comment

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

Ah, gotcha! And it sounds like using .raw is probably safe because prior to accessing this, there's already a check to see whether or not the current user is allowed to edit the current entity (here) 👍

One last question, what would the difference here between using getEntityRecord and getEditedEntityRecord? Would the latter be preferable for any reason?

Something I'm finding odd in testing, is that if I access the empty page first, then the placeholder text is visible. However, if in Browse mode I first access a page with content, and then go to select the page without content, for some reason the placeholder text isn't visible until I click on the Post Content block. Here's a quick screengrab of going from a non-empty page to an empty page:

2023-05-17 15 32 41

Copy link
Contributor Author

Choose a reason for hiding this comment

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

what would the difference here between using getEntityRecord and getEditedEntityRecord? Would the latter be preferable for any reason?

I don't think so because here we're only interested in the initial state of the post as we open the editor, before any edits have happened. I guess getEditedEntityRecord would be relevant if we wanted to do something at some point after the post content had already been edited.

Copy link
Contributor

Choose a reason for hiding this comment

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

Oh, I keep forgetting about my weird height value. I think that should be unrelated, but in my theme.json I have minimum height set to 70vh in my test environment:

			"core/post-content": {
				"dimensions": {
					"minHeight": "70vh"
				},

Copy link
Contributor

Choose a reason for hiding this comment

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

I've re-tested with the minHeight styles removed, and it's still occurring for me. In the below screengrab I'm reloading on the Pages screen, then select a published page that contains a single Cover block. Then I click on the empty page, which is a published page:

2023-05-17.16.11.20.mp4

If I first go to the published empty page, then it displays the placeholder as expected 🤔

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Hmmm no, still can't reproduce it. Do you have any browser or CPU throttling going on or something? I can see the paragraph placeholder takes half a second to load, but it always appears regardless of where I'm navigating from.

Copy link
Contributor

Choose a reason for hiding this comment

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

Hrm, no throttling that I'm aware of. It's very strange! It feels like for whatever reason the block isn't being triggered to re-render, or something in this context, I can't quite figure it out 🤔

When I log out the following values everything seems correct in the console:

	console.log( 'entityRecord', entityRecord );
	console.log( 'hasInnerBlocks', hasInnerBlocks );

And code-wise the change in this PR otherwise looks good to me.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Oooooh got it: I can repro by setting the front page to blog. It doesn't happen if front page is set to a static page. Now to try and figure out why 😅

const props = useInnerBlocksProps(
useBlockProps( { className: 'entry-content' } ),
{
value: blocks,
value: hasInnerBlocks ? blocks : undefined,
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 for some reason, useEntityBlockEditor returns an empty array for blocks when the empty page is loaded after a non-empty page, but returns a single block if the empty page is loaded initially. I haven't dug much further - I'm guessing there's some bug in getEditedEntityRecord from which this originates.

The problem with blocks being an empty array is that innerBlocksProps.value evaluates to true here, which causes the whole thing to render as ControlledInnerBlocks, which returns empty because there are, in fact, no blocks 😅

So this change fixes that immediate issue, anyway. I think any further exploration is out of scope for this PR.

Copy link
Contributor Author

@tellthemachines tellthemachines May 18, 2023

Choose a reason for hiding this comment

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

(I guess an alternative/complementary fix would be to change the check in useInnerBlocksProps to innerBlocksProps.value?.length && innerBlocksProps.onChange but better not do that without more extensive testing 😅 )

Copy link
Contributor

@andrewserong andrewserong left a comment

Choose a reason for hiding this comment

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

Good find digging into useInnerBlocksProps! I think there might still be an issue between the syncing state of passing in a value and the use of the template. When editing an empty page (using the post editor), if I go to the template view and start editing content directly in the post content block, with this PR applied, those changes don't appear to take effect. However in trunk they appear to 🤔

This PR:

2023-05-19.14.32.36.mp4

Trunk:

2023-05-19.14.37.52.mp4

I'm wondering if it's to do with the template approach attempting to use inner blocks directly instead of syncing to the entity record?

Just an idea, but for this block, I wonder if it'd be possible to use value instead of template — that is, if blocks is empty, could we pass the initialInnerBlocks to value instead of template? Not sure if that would create other issues, since it isn't really the synced content from the record 🤔

@tellthemachines tellthemachines force-pushed the add/paragraph-in-post-content branch from 9e2dc3c to 13fc935 Compare May 23, 2023 01:32
@ramonjd
Copy link
Member

ramonjd commented May 24, 2023

Just an idea, but for this block, I wonder if it'd be possible to use value instead of template — that is, if blocks is empty, could we pass the initialInnerBlocks to value instead of template?

Just for fun I tried this out, and it seems to address the issue @andrewserong reported:

	const initialInnerBlocks = [ createBlock( 'core/paragraph' ) ];

	const props = useInnerBlocksProps(
		useBlockProps( { className: 'entry-content' } ),
		{
			value: hasInnerBlocks ? blocks : initialInnerBlocks,
			onInput,
			onChange,
		}
	);

I'm not clued into how omitting template will affect things, but it seems to work in the site editor too.

Sorry if it confuses the issue more!

@tellthemachines
Copy link
Contributor Author

I'm not clued into how omitting template will affect things, but it seems to work in the site editor too.

@ramonjd did you try adding inner blocks to Post Content in the site editor or the template editor after this change? When I tried this locally it didn't allow any edits. The problem seems to be that, while the block is being edited, hasInnerBlocks is still false, so value never updates.

I've reverted my previous change for now, as it seems messing with value will always have unexpected consequences.

This brings us back to the bug Andy initially reported here, which is only reproducible if homepage is set to display latest posts.
I can't work out why the difference in these two settings, but as far as I can tell what happens is the following:

For the template paragraph to display inside Post Content, we need editEntityRecord to run, otherwise the value of blocks here will never update.

When Post Content has actual content, editEntityRecord runs in an effect inside the useEntityBlockEditor.
But if Post Content has no content, editEntityRecord can still run in useBlockSync here. For it to be triggered, there has to be a discrepancy between the value of current and new blocks. When homepage is set to latest posts, this discrepancy only exists when the first page is loaded in the site editor, and not for subsequent pages.

It would be great to get some eyes on this from someone who knows more about how useBlockSync works. Cc @youknowriad who has touched this file recently.

@ramonjd
Copy link
Member

ramonjd commented May 24, 2023

did you try adding inner blocks to Post Content in the site editor or the template editor after this change

Ah, good question 😄 I only tried adding text (no inner blocks) to the empty paragraph, so please ignore everything I said

@tellthemachines
Copy link
Contributor Author

Since this PR has had several rounds of testing and the only remaining bug is the one mentioned above, which needs further investigation to determine both the cause and best approach to fix it, I'm going to go ahead and merge this PR, and open an issue detailing the bug in question so we can follow up separately.

@tellthemachines tellthemachines merged commit fbc67a1 into trunk May 26, 2023
@tellthemachines tellthemachines deleted the add/paragraph-in-post-content branch May 26, 2023 01:29
@github-actions github-actions bot added this to the Gutenberg 16.0 milestone May 26, 2023
@andrewserong
Copy link
Contributor

I'm going to go ahead and merge this PR, and open an issue detailing the bug in question so we can follow up separately.

Sounds good, and this PR is an easy revert if it winds up causing any issues 👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Block] Post Content Affects the Post Content Block [Feature] Site Editor Related to the overarching Site Editor (formerly "full site editing") Needs User Documentation Needs new user documentation [Type] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Blank state for post content block
7 participants