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

Page List: add ability to convert to navigation links #30390

Merged
merged 8 commits into from
Apr 8, 2021
Merged

Conversation

gwwar
Copy link
Contributor

@gwwar gwwar commented Mar 30, 2021

Fixes #29437.

This PR allows the Page List block to be converted to single menu items, so those can be reordered, deleted or tweaked at will.

example.mp4

Implementation Notes of Interest

This is the straightforward approach specific to the page list. Folks have also expressed a desire to remove the usage of <ServerSideRender /> but let's leave that for a follow up.

Problems reserved for follow up PRs:

  • Navigation Links has severe performance issues when testing with not that many links, for example 200ish links or so will be very noticeable on a fast laptop. I think it'd be ideal to profile this in an immediate follow up for some wins likely in innerblocks.
  • I can't get REST API queries to match get_pages( array( 'sort_column' => 'menu_order' ) ) when using orderby: menu_order. This is noticeable when results are > 100 (meaning we have multiple fetches). I suspect this might be a more general issue. Let me know if folks spot the right combination.
  • This duplicates some of the page fetching/sorting logic. Which by its nature allows for drift between the PHP callback and client implementation. (This is probably okay?)

Testing Instructions

On a site with < 100 pages:

  • Visit the post or site editor
  • Add a navigation block
  • Click on "Add all Pages"
  • Clicking on the page list "Edit" is visible
  • The dialog appears
  • Clicking on "Convert to links" transforms the menu to using Navigation Links

On a site with > 100 pages:

  • Visit the post or site editor
  • Add a navigation block
  • Click on "Add all Pages"
  • Clicking on the page list "Edit" is not visible

Add a page list directly into the page

  • Clicking on the page list "Edit" is not visible

The Problem

When you create a navigation menu and press "Add all pages", you get the Page List preinserted. This block stays in sync with pages you create or delete on your website, and is likely a good default experience for most people.

Every once in a while, you need a more curated experience:

  • You want to delete a page
  • Edit the label of a page link
  • Change the order of pages

@gwwar gwwar self-assigned this Mar 30, 2021
@gwwar
Copy link
Contributor Author

gwwar commented Mar 30, 2021

@jasmussen feel free to hop onto the branch directly if you see any styling updates to apply.

I noticed the mock had a dialog without a title. I ended up using a modal (since this was the closest thing I spotted in storybook). Unfortunately I don't think I can turn off the title as an option in the component params / and I can't add a custom class to the modal instance.

mock modal
109508530-3ce61600-7aa0-11eb-8e77-c585080a0997 Screen Shot 2021-03-30 at 1 39 31 PM

@github-actions
Copy link

github-actions bot commented Mar 30, 2021

Size Change: +4.68 kB (0%)

Total Size: 1.42 MB

Filename Size Change
build/annotations/index.js 3.79 kB +3 B (0%)
build/api-fetch/index.js 3.41 kB -5 B (0%)
build/autop/index.js 2.81 kB -5 B (0%)
build/block-directory/index.js 8.63 kB -4 B (0%)
build/block-editor/index.js 127 kB -34 B (0%)
build/block-editor/style-rtl.css 12.4 kB -19 B (0%)
build/block-editor/style.css 12.4 kB -17 B (0%)
build/block-library/blocks/button/style-rtl.css 503 B -48 B (-9%)
build/block-library/blocks/button/style.css 503 B -48 B (-9%)
build/block-library/blocks/buttons/style-rtl.css 364 B -6 B (-2%)
build/block-library/blocks/buttons/style.css 363 B -7 B (-2%)
build/block-library/blocks/navigation-link/editor-rtl.css 597 B -54 B (-8%)
build/block-library/blocks/navigation-link/editor.css 597 B -54 B (-8%)
build/block-library/blocks/navigation-link/style-rtl.css 1.07 kB +117 B (+12%) ⚠️
build/block-library/blocks/navigation-link/style.css 1.07 kB +118 B (+12%) ⚠️
build/block-library/blocks/navigation/editor-rtl.css 1.24 kB +110 B (+10%) ⚠️
build/block-library/blocks/navigation/editor.css 1.24 kB +108 B (+10%) ⚠️
build/block-library/blocks/page-list/editor-rtl.css 239 B +69 B (+41%) 🚨
build/block-library/blocks/page-list/editor.css 240 B +70 B (+41%) 🚨
build/block-library/blocks/search/editor-rtl.css 189 B +24 B (+15%) ⚠️
build/block-library/blocks/search/editor.css 189 B +24 B (+15%) ⚠️
build/block-library/blocks/search/style-rtl.css 359 B +17 B (+5%) 🔍
build/block-library/blocks/search/style.css 362 B +18 B (+5%) 🔍
build/block-library/blocks/site-logo/editor-rtl.css 438 B +237 B (+118%) 🆘
build/block-library/blocks/site-logo/editor.css 438 B +237 B (+118%) 🆘
build/block-library/blocks/site-logo/style-rtl.css 150 B +35 B (+30%) 🚨
build/block-library/blocks/site-logo/style.css 150 B +35 B (+30%) 🚨
build/block-library/blocks/spacer/editor-rtl.css 308 B -9 B (-3%)
build/block-library/blocks/spacer/editor.css 308 B -9 B (-3%)
build/block-library/common-rtl.css 1.31 kB +212 B (+19%) ⚠️
build/block-library/common.css 1.31 kB +211 B (+19%) ⚠️
build/block-library/editor-rtl.css 9.77 kB +208 B (+2%)
build/block-library/editor.css 9.76 kB +204 B (+2%)
build/block-library/index.js 153 kB +1.26 kB (+1%)
build/block-library/reset-rtl.css 502 B +127 B (+34%) 🚨
build/block-library/reset.css 503 B +127 B (+34%) 🚨
build/block-library/style-rtl.css 9.4 kB +296 B (+3%)
build/block-library/style.css 9.41 kB +296 B (+3%)
build/block-serialization-default-parser/index.js 1.87 kB +1 B (0%)
build/blocks/index.js 48.4 kB +87 B (0%)
build/components/index.js 284 kB -6 B (0%)
build/components/style-rtl.css 16.3 kB +80 B (0%)
build/components/style.css 16.3 kB +81 B (0%)
build/core-data/index.js 17.1 kB +559 B (+3%)
build/customize-widgets/index.js 7.09 kB -240 B (-3%)
build/customize-widgets/style-rtl.css 630 B -46 B (-7%)
build/customize-widgets/style.css 631 B -46 B (-7%)
build/data-controls/index.js 836 B -2 B (0%)
build/data/index.js 8.88 kB -5 B (0%)
build/date/index.js 31.9 kB +3 B (0%)
build/dom-ready/index.js 577 B +1 B (0%)
build/dom/index.js 5.17 kB +87 B (+2%)
build/edit-navigation/index.js 17 kB -435 B (-2%)
build/edit-post/index.js 307 kB +594 B (0%)
build/edit-post/style-rtl.css 6.95 kB -102 B (-1%)
build/edit-post/style.css 6.94 kB -103 B (-1%)
build/edit-site/index.js 28 kB +493 B (+2%)
build/edit-site/style-rtl.css 4.61 kB +104 B (+2%)
build/edit-site/style.css 4.61 kB +104 B (+2%)
build/edit-widgets/index.js 15.7 kB -80 B (-1%)
build/editor/index.js 42.4 kB -270 B (-1%)
build/editor/style-rtl.css 3.93 kB -31 B (-1%)
build/editor/style.css 3.92 kB -32 B (-1%)
build/format-library/index.js 6.76 kB -1 B (0%)
build/hooks/index.js 2.28 kB +2 B (0%)
build/keyboard-shortcuts/index.js 2.53 kB -1 B (0%)
build/keycodes/index.js 1.96 kB +1 B (0%)
build/list-reusable-blocks/index.js 3.19 kB -1 B (0%)
build/media-utils/index.js 5.38 kB -2 B (0%)
build/notices/index.js 1.86 kB +1 B (0%)
build/nux/index.js 3.42 kB -4 B (0%)
build/primitives/index.js 1.42 kB +1 B (0%)
build/react-i18n/index.js 1.46 kB -1 B (0%)
build/reusable-blocks/index.js 3.79 kB -1 B (0%)
build/rich-text/index.js 13.5 kB +38 B (0%)
build/server-side-render/index.js 2.6 kB +10 B (0%)
build/warning/index.js 1.14 kB +1 B (0%)
build/wordcount/index.js 1.22 kB +1 B (0%)
ℹ️ View Unchanged
Filename Size Change
build/a11y/index.js 1.14 kB 0 B
build/blob/index.js 664 B 0 B
build/block-directory/style-rtl.css 1 kB 0 B
build/block-directory/style.css 1.01 kB 0 B
build/block-library/blocks/archives/editor-rtl.css 61 B 0 B
build/block-library/blocks/archives/editor.css 60 B 0 B
build/block-library/blocks/audio/editor-rtl.css 58 B 0 B
build/block-library/blocks/audio/editor.css 58 B 0 B
build/block-library/blocks/audio/style-rtl.css 112 B 0 B
build/block-library/blocks/audio/style.css 112 B 0 B
build/block-library/blocks/block/editor-rtl.css 161 B 0 B
build/block-library/blocks/block/editor.css 161 B 0 B
build/block-library/blocks/button/editor-rtl.css 475 B 0 B
build/block-library/blocks/button/editor.css 474 B 0 B
build/block-library/blocks/buttons/editor-rtl.css 315 B 0 B
build/block-library/blocks/buttons/editor.css 315 B 0 B
build/block-library/blocks/calendar/style-rtl.css 208 B 0 B
build/block-library/blocks/calendar/style.css 208 B 0 B
build/block-library/blocks/categories/editor-rtl.css 84 B 0 B
build/block-library/blocks/categories/editor.css 83 B 0 B
build/block-library/blocks/categories/style-rtl.css 79 B 0 B
build/block-library/blocks/categories/style.css 79 B 0 B
build/block-library/blocks/code/style-rtl.css 90 B 0 B
build/block-library/blocks/code/style.css 90 B 0 B
build/block-library/blocks/columns/editor-rtl.css 190 B 0 B
build/block-library/blocks/columns/editor.css 190 B 0 B
build/block-library/blocks/columns/style-rtl.css 436 B 0 B
build/block-library/blocks/columns/style.css 435 B 0 B
build/block-library/blocks/cover/editor-rtl.css 605 B 0 B
build/block-library/blocks/cover/editor.css 605 B 0 B
build/block-library/blocks/cover/style-rtl.css 1.24 kB 0 B
build/block-library/blocks/cover/style.css 1.24 kB 0 B
build/block-library/blocks/embed/editor-rtl.css 486 B 0 B
build/block-library/blocks/embed/editor.css 486 B 0 B
build/block-library/blocks/embed/style-rtl.css 401 B 0 B
build/block-library/blocks/embed/style.css 400 B 0 B
build/block-library/blocks/file/editor-rtl.css 175 B 0 B
build/block-library/blocks/file/editor.css 174 B 0 B
build/block-library/blocks/file/style-rtl.css 248 B 0 B
build/block-library/blocks/file/style.css 248 B 0 B
build/block-library/blocks/freeform/editor-rtl.css 2.45 kB 0 B
build/block-library/blocks/freeform/editor.css 2.45 kB 0 B
build/block-library/blocks/gallery/editor-rtl.css 704 B 0 B
build/block-library/blocks/gallery/editor.css 705 B 0 B
build/block-library/blocks/gallery/style-rtl.css 1.11 kB 0 B
build/block-library/blocks/gallery/style.css 1.1 kB 0 B
build/block-library/blocks/group/editor-rtl.css 160 B 0 B
build/block-library/blocks/group/editor.css 160 B 0 B
build/block-library/blocks/group/style-rtl.css 57 B 0 B
build/block-library/blocks/group/style.css 57 B 0 B
build/block-library/blocks/heading/editor-rtl.css 129 B 0 B
build/block-library/blocks/heading/editor.css 129 B 0 B
build/block-library/blocks/heading/style-rtl.css 76 B 0 B
build/block-library/blocks/heading/style.css 76 B 0 B
build/block-library/blocks/html/editor-rtl.css 281 B 0 B
build/block-library/blocks/html/editor.css 281 B 0 B
build/block-library/blocks/image/editor-rtl.css 717 B 0 B
build/block-library/blocks/image/editor.css 716 B 0 B
build/block-library/blocks/image/style-rtl.css 476 B 0 B
build/block-library/blocks/image/style.css 478 B 0 B
build/block-library/blocks/latest-comments/style-rtl.css 281 B 0 B
build/block-library/blocks/latest-comments/style.css 282 B 0 B
build/block-library/blocks/latest-posts/editor-rtl.css 137 B 0 B
build/block-library/blocks/latest-posts/editor.css 137 B 0 B
build/block-library/blocks/latest-posts/style-rtl.css 523 B 0 B
build/block-library/blocks/latest-posts/style.css 522 B 0 B
build/block-library/blocks/legacy-widget/editor-rtl.css 398 B 0 B
build/block-library/blocks/legacy-widget/editor.css 399 B 0 B
build/block-library/blocks/list/style-rtl.css 63 B 0 B
build/block-library/blocks/list/style.css 63 B 0 B
build/block-library/blocks/media-text/editor-rtl.css 191 B 0 B
build/block-library/blocks/media-text/editor.css 191 B 0 B
build/block-library/blocks/media-text/style-rtl.css 535 B 0 B
build/block-library/blocks/media-text/style.css 532 B 0 B
build/block-library/blocks/more/editor-rtl.css 434 B 0 B
build/block-library/blocks/more/editor.css 434 B 0 B
build/block-library/blocks/navigation/style-rtl.css 204 B 0 B
build/block-library/blocks/navigation/style.css 205 B 0 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B 0 B
build/block-library/blocks/nextpage/editor.css 395 B 0 B
build/block-library/blocks/page-list/style-rtl.css 167 B 0 B
build/block-library/blocks/page-list/style.css 167 B 0 B
build/block-library/blocks/paragraph/editor-rtl.css 157 B 0 B
build/block-library/blocks/paragraph/editor.css 157 B 0 B
build/block-library/blocks/paragraph/style-rtl.css 247 B 0 B
build/block-library/blocks/paragraph/style.css 248 B 0 B
build/block-library/blocks/post-author/editor-rtl.css 209 B 0 B
build/block-library/blocks/post-author/editor.css 209 B 0 B
build/block-library/blocks/post-author/style-rtl.css 183 B 0 B
build/block-library/blocks/post-author/style.css 184 B 0 B
build/block-library/blocks/post-comments-form/style-rtl.css 250 B 0 B
build/block-library/blocks/post-comments-form/style.css 250 B 0 B
build/block-library/blocks/post-content/editor-rtl.css 139 B 0 B
build/block-library/blocks/post-content/editor.css 139 B 0 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B 0 B
build/block-library/blocks/post-excerpt/editor.css 73 B 0 B
build/block-library/blocks/post-excerpt/style-rtl.css 69 B 0 B
build/block-library/blocks/post-excerpt/style.css 69 B 0 B
build/block-library/blocks/post-featured-image/editor-rtl.css 338 B 0 B
build/block-library/blocks/post-featured-image/editor.css 338 B 0 B
build/block-library/blocks/post-featured-image/style-rtl.css 100 B 0 B
build/block-library/blocks/post-featured-image/style.css 100 B 0 B
build/block-library/blocks/preformatted/style-rtl.css 103 B 0 B
build/block-library/blocks/preformatted/style.css 103 B 0 B
build/block-library/blocks/pullquote/editor-rtl.css 183 B 0 B
build/block-library/blocks/pullquote/editor.css 183 B 0 B
build/block-library/blocks/pullquote/style-rtl.css 318 B 0 B
build/block-library/blocks/pullquote/style.css 318 B 0 B
build/block-library/blocks/query-loop/editor-rtl.css 83 B 0 B
build/block-library/blocks/query-loop/editor.css 82 B 0 B
build/block-library/blocks/query-loop/style-rtl.css 315 B 0 B
build/block-library/blocks/query-loop/style.css 317 B 0 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B 0 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B 0 B
build/block-library/blocks/query-pagination/editor-rtl.css 270 B 0 B
build/block-library/blocks/query-pagination/editor.css 262 B 0 B
build/block-library/blocks/query-pagination/style-rtl.css 168 B 0 B
build/block-library/blocks/query-pagination/style.css 168 B 0 B
build/block-library/blocks/query-title/editor-rtl.css 86 B 0 B
build/block-library/blocks/query-title/editor.css 86 B 0 B
build/block-library/blocks/query/editor-rtl.css 795 B 0 B
build/block-library/blocks/query/editor.css 794 B 0 B
build/block-library/blocks/quote/style-rtl.css 169 B 0 B
build/block-library/blocks/quote/style.css 169 B 0 B
build/block-library/blocks/rss/editor-rtl.css 201 B 0 B
build/block-library/blocks/rss/editor.css 202 B 0 B
build/block-library/blocks/rss/style-rtl.css 290 B 0 B
build/block-library/blocks/rss/style.css 290 B 0 B
build/block-library/blocks/separator/editor-rtl.css 99 B 0 B
build/block-library/blocks/separator/editor.css 99 B 0 B
build/block-library/blocks/separator/style-rtl.css 251 B 0 B
build/block-library/blocks/separator/style.css 251 B 0 B
build/block-library/blocks/shortcode/editor-rtl.css 512 B 0 B
build/block-library/blocks/shortcode/editor.css 512 B 0 B
build/block-library/blocks/social-link/editor-rtl.css 164 B 0 B
build/block-library/blocks/social-link/editor.css 165 B 0 B
build/block-library/blocks/social-links/editor-rtl.css 776 B 0 B
build/block-library/blocks/social-links/editor.css 776 B 0 B
build/block-library/blocks/social-links/style-rtl.css 1.32 kB 0 B
build/block-library/blocks/social-links/style.css 1.33 kB 0 B
build/block-library/blocks/spacer/style-rtl.css 48 B 0 B
build/block-library/blocks/spacer/style.css 48 B 0 B
build/block-library/blocks/table/editor-rtl.css 478 B 0 B
build/block-library/blocks/table/editor.css 478 B 0 B
build/block-library/blocks/table/style-rtl.css 402 B 0 B
build/block-library/blocks/table/style.css 402 B 0 B
build/block-library/blocks/tag-cloud/editor-rtl.css 118 B 0 B
build/block-library/blocks/tag-cloud/editor.css 118 B 0 B
build/block-library/blocks/tag-cloud/style-rtl.css 94 B 0 B
build/block-library/blocks/tag-cloud/style.css 94 B 0 B
build/block-library/blocks/template-part/editor-rtl.css 552 B 0 B
build/block-library/blocks/template-part/editor.css 551 B 0 B
build/block-library/blocks/term-description/editor-rtl.css 90 B 0 B
build/block-library/blocks/term-description/editor.css 90 B 0 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B 0 B
build/block-library/blocks/text-columns/editor.css 95 B 0 B
build/block-library/blocks/text-columns/style-rtl.css 166 B 0 B
build/block-library/blocks/text-columns/style.css 166 B 0 B
build/block-library/blocks/verse/editor-rtl.css 50 B 0 B
build/block-library/blocks/verse/editor.css 50 B 0 B
build/block-library/blocks/verse/style-rtl.css 87 B 0 B
build/block-library/blocks/verse/style.css 87 B 0 B
build/block-library/blocks/video/editor-rtl.css 504 B 0 B
build/block-library/blocks/video/editor.css 503 B 0 B
build/block-library/blocks/video/style-rtl.css 187 B 0 B
build/block-library/blocks/video/style.css 187 B 0 B
build/block-library/theme-rtl.css 692 B 0 B
build/block-library/theme.css 693 B 0 B
build/block-serialization-spec-parser/index.js 3.06 kB 0 B
build/compose/index.js 11.2 kB 0 B
build/deprecated/index.js 787 B 0 B
build/edit-navigation/style-rtl.css 2.86 kB 0 B
build/edit-navigation/style.css 2.86 kB 0 B
build/edit-post/classic-rtl.css 454 B 0 B
build/edit-post/classic.css 454 B 0 B
build/edit-widgets/style-rtl.css 2.98 kB 0 B
build/edit-widgets/style.css 2.98 kB 0 B
build/element/index.js 4.62 kB 0 B
build/escape-html/index.js 735 B 0 B
build/format-library/style-rtl.css 637 B 0 B
build/format-library/style.css 639 B 0 B
build/html-entities/index.js 622 B 0 B
build/i18n/index.js 4.02 kB 0 B
build/is-shallow-equal/index.js 699 B 0 B
build/list-reusable-blocks/style-rtl.css 629 B 0 B
build/list-reusable-blocks/style.css 628 B 0 B
build/nux/style-rtl.css 731 B 0 B
build/nux/style.css 727 B 0 B
build/plugins/index.js 2.95 kB 0 B
build/priority-queue/index.js 791 B 0 B
build/redux-routine/index.js 2.84 kB 0 B
build/reusable-blocks/style-rtl.css 225 B 0 B
build/reusable-blocks/style.css 225 B 0 B
build/shortcode/index.js 1.7 kB 0 B
build/token-list/index.js 1.27 kB 0 B
build/url/index.js 3.02 kB 0 B
build/viewport/index.js 1.86 kB 0 B

compressed-size-action

@gwwar gwwar force-pushed the add/edit-page-list branch from 8c2e917 to 4dbea0c Compare March 30, 2021 22:08
@jasmussen
Copy link
Contributor

This is amazing!

I'm AFK for the rest of the week, but if this can wait until Monday, I'll push some polish to it, okay? Thank you!

@gwwar
Copy link
Contributor Author

gwwar commented Mar 31, 2021

@jasmussen Sounds good! No rush on this one, I still have a few areas to polish on the PR.

@gwwar
Copy link
Contributor Author

gwwar commented Apr 2, 2021

General Design Question for Page List (that don't need to necessarily be addressed in this PR):

Should we add limits to how many pages we display in page list or navigation?

Certain sites can have thousands of pages, especially if they're being used like a wiki. Here's a small example of me generating only 250 pages then starting a navigation menu:

It already feels pretty silly. I just wanted to verify here since it's not a great user experience when there are lots of pages, and having unbounded values that we fetch/process make it very difficult to make this performant. Similarly I think pages can be nested to any depth, but we have work in progress to limit to 5.

Screen Shot 2021-04-02 at 10 48 36 AM

@gwwar
Copy link
Contributor Author

gwwar commented Apr 2, 2021

🙈 Not related to changes here, but adding ~250 navigation-links on the editor slows it down tremendously.

lag.mp4

@gwwar
Copy link
Contributor Author

gwwar commented Apr 2, 2021

Due to existing perf issues, I think we'll want to make edit unavailable if pages are > X. Where the limit is probably under 100 or so.

Note that conversion isn't producing the correct results when working across page request boundaries eg > 100 pages. I'll make sure to fix that, even if we decide to add some bounds here.

Edit: hmm I can't get REST API queries to match, I'll circle back to this, but I do wonder if this affects other areas like random ordering for assigning a parent page.

eg wp.data.select('core').getPages( {per_page:-1, _fields: [ 'title', 'id', 'parent', 'link', 'type' ], orderby: 'menu_order' } ) doesn't match get_pages( array( 'sort_column' => 'menu_order' ) )

@jasmussen
Copy link
Contributor

Beautiful work! I pushed some polish:

Screenshot 2021-04-05 at 08 38 22

I removed the "ButtonBroup" container, as currently it's used for a different style of buttons:

Screenshot 2021-04-05 at 08 39 22

@gwwar
Copy link
Contributor Author

gwwar commented Apr 5, 2021

Thanks @jasmussen for the styling updates 💖

…t button until pages are available. Drop entities change.
@gwwar gwwar requested a review from tellthemachines April 6, 2021 18:36
@gwwar gwwar marked this pull request as ready for review April 6, 2021 18:36
@gwwar gwwar requested a review from ajitbohra as a code owner April 6, 2021 18:36
@gwwar gwwar requested review from talldan and jasmussen April 6, 2021 18:37
'core/navigation-link',
{
id,
label: title.rendered, //TODO: raw or rendered?
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Not sure what the difference is here between raw or rendered 🤔

Copy link
Contributor

Choose a reason for hiding this comment

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

The only difference I've found is if a page has no title, raw will be an empty string while rendered will be "Untitled". The latter is probably preferable here as an empty nav link would be confusing. The Page list block itself uses the raw title because that's what's returned from get_pages.

Copy link
Contributor

@jasmussen jasmussen 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 what I see:

conversion

Based on the experience and how well this works, you've got a total green light here.

I'd encourage a sanity check of the code. But from what I can tell, this is solid. Thanks so much!

@gwwar
Copy link
Contributor Author

gwwar commented Apr 7, 2021

Thanks for the review @jasmussen ! It looks like I have a little bit more work here, which I plan on addressing:

  • The dialog needs an aria-describedby attr for screenreader context
  • It's a bit easier than I expected to get a different page order from the PHP call vs API. I'll poke around a bit to see if there's an existing set of query params I can call, or if I might need a wordpress-develop PR

@gwwar
Copy link
Contributor Author

gwwar commented Apr 7, 2021

Added a basic description for screenreaders:

Screen Shot 2021-04-07 at 9 51 08 AM

As an aside, the modal component could use some 🤔 for making this a bit easier out of the box. Labels are added pretty much automatically, but then the describedby label is more hidden with an API for passing in a single aria object.

<ModalFrame
onRequestClose={ onRequestClose }
aria={ {
labelledby: headingId,
describedby: aria.describedby,

@gwwar
Copy link
Contributor Author

gwwar commented Apr 7, 2021

So in the REST API we're powering the DB query using WP_Query. This generates a more complicated query than get_pages. I'll experiment with having the PHP render_callback match what the API is generating using WP_Query

@gwwar
Copy link
Contributor Author

gwwar commented Apr 7, 2021

🤔 With a number of results that are less than the page limit (for example 11 published), we're seeing different ordering results when posts_per_page is -1 vs 100.

	$page_query_args = array(
		'order' => 'desc',
		'orderby' => 'menu_order',
		'post_status' => array( 'publish' ),
		'post_type' => 'page',
		'ignore_sticky_posts' => true,
		'posts_per_page' => -1
	);
	$page_query = new WP_Query();
	$all_pages = $page_query->query( $page_query_args );
posts_per_page = -1
Screen Shot 2021-04-07 at 1 47 02 PM
posts_per_page = 100
Screen Shot 2021-04-07 at 1 46 24 PM
query.mp4

Any recommendations here on getting a stable sort order from the API + this block render_callback? Maybe @talldan @TimothyBJacobs

@gwwar
Copy link
Contributor Author

gwwar commented Apr 7, 2021

For completeness, here's the query from the original get_pages call:

get_pages( array( 'sort_column' => 'menu_order' ) )
Screen Shot 2021-04-07 at 1 53 28 PM

@gwwar
Copy link
Contributor Author

gwwar commented Apr 7, 2021

Oh fun, I'm seeing the sorting flip when we limit at 499 vs 500. I wonder if I'm hitting an internal implementation detail:

499.mp4

Copy link
Contributor

@tellthemachines tellthemachines left a comment

Choose a reason for hiding this comment

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

I left a few minor comments/questions, but overall the code looks good!

Folks have also expressed a desire to remove the usage of but let's leave that for a follow up.

Fwiw, I implemented it that way initially because performance in the editor with >100 or so pages was pretty horrific 😬

'core/navigation-link',
{
id,
label: title.rendered, //TODO: raw or rendered?
Copy link
Contributor

Choose a reason for hiding this comment

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

The only difference I've found is if a page has no title, raw will be an empty string while rendered will be "Untitled". The latter is probably preferable here as an empty nav link would be confusing. The Page list block itself uses the raw title because that's what's returned from get_pages.

</p>
<p>
{ __(
"Note: if you add new pages to your site, you'll need to add them to your navigation menu."
Copy link
Contributor

Choose a reason for hiding this comment

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

This paragraph won't be read out as part of the description, is that ok?

Copy link
Contributor

Choose a reason for hiding this comment

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

Can you clarify this? I'm seeing it in VoiceOver:

Screenshot 2021-04-08 at 07 04 45

Copy link
Contributor

Choose a reason for hiding this comment

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

Oh, it's read out if you're manually arrowing through the whole content of the modal, but not when you first land on it. So, if you press "Edit", the modal opens and "Convert to links" is read out, followed by the first paragraph of the content. If user just presses tab after that, they'll skip through the buttons and never reach the rest of the text.

I guess that might be ok though, as the note just relays complementary info and isn't essential to understand what the "convert" action does.

>
<p id={ 'wp-block-page-list-modal__description' }>
{ __(
'To edit this navigation menu, convert it to single page links. This allows you to add re-order, remove items, or edit their labels.'
Copy link
Contributor

Choose a reason for hiding this comment

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

A comma between "add" and "re-order" would help the spoken description sound more clear.

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 eye!

{
per_page: MAX_PAGE_COUNT,
_fields: PAGE_FIELDS,
orderby: 'menu_order',
Copy link
Contributor

Choose a reason for hiding this comment

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

Funny that this seems to return the pages in more or less oldest to most recent order, whereas the same parameter passed to get_pages returns a completely different order 😕

Copy link
Contributor Author

@gwwar gwwar Apr 8, 2021

Choose a reason for hiding this comment

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

This is because get_pages has a default order of asc and WP_Query (used by the REST API) has a default order of desc, I'll double check which one we need to respect for menu_order.

It looks like we can't expect a stable sort from using menu_order, when items are equal to each other (eg menu_order of 0), so I'll need another dimension to sort on in addition to menu_order. Do folks prefer title alphabetizing or something like post date?

Copy link
Contributor

Choose a reason for hiding this comment

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

For what it's worth, I don't think it's crucial to get this 100% right in this one PR. It's can be a nice enhancement in the future, but the value being able to convert the page list outweighs the downside that sorting might not be perfect, especially paired with the fact that you get immediate access to mover controls right after the conversion.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Looks like it won't be possible to provide a consistent ordering until we can implement https://core.trac.wordpress.org/ticket/39037.

Fwiw, I implemented it that way initially because performance in the editor with >100 or so pages was pretty horrific

Good to know @tellthemachines! I'll look into adding multiple orderby support in the REST API next, then start on some general performance profiling for Navigation Links.

I've incorporated feedback and added a few explanations in e35f132

@gwwar
Copy link
Contributor Author

gwwar commented Apr 8, 2021

Thanks for the reviews @jasmussen @tellthemachines !

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Navigation / Page List: Allow converting to individual menu items
3 participants