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 client side routing for Site Editor #36488

Merged
merged 15 commits into from Dec 9, 2021
Merged

Add client side routing for Site Editor #36488

merged 15 commits into from Dec 9, 2021

Conversation

@kevin940726
Copy link
Member

@kevin940726 kevin940726 commented Nov 15, 2021

Description

Close #37075. Based on #36379. Part of #36597.

Add client side routing for the site editor to improve navigation performance.

This is not based on a traditional routing rule though, the path is determined by query params, which is how WP works currently.

This PR also changes how #34732 works by leveraging the router we have now to control the back button.

We obviously still need to pay extra attention to accessibility to ensure that it's still accessible.

How has this been tested?

  1. Activate a FSE theme like tt1-blocks
  2. Go to Appearance -> Editor
  3. Navigate around within the editor

Screenshots

Kapture.2021-12-03.at.11.36.36.mp4

Types of changes

New feature

Checklist:

  • My code is tested.
  • My code follows the WordPress code style.
  • My code follows the accessibility standards.
  • I've tested my changes with keyboard and screen readers.
  • My code has proper inline documentation.
  • I've included developer documentation if appropriate.
  • I've updated all React Native files affected by any refactorings/renamings in this PR (please manually search all *.native.js files for terms that need renaming or removal).
@github-actions
Copy link

@github-actions github-actions bot commented Nov 15, 2021

Size Change: +1.63 kB (0%)

Total Size: 1.11 MB

Filename Size Change
build/block-editor/index.min.js 139 kB -4 B (0%)
build/block-editor/style-rtl.css 14.4 kB -8 B (0%)
build/block-editor/style.css 14.4 kB -13 B (0%)
build/block-library/blocks/navigation/editor-rtl.css 1.91 kB +19 B (+1%)
build/block-library/blocks/navigation/editor.css 1.91 kB +19 B (+1%)
build/block-library/blocks/navigation/view.min.js 2.79 kB +2 B (0%)
build/block-library/editor-rtl.css 9.93 kB +18 B (0%)
build/block-library/editor.css 9.93 kB +18 B (0%)
build/block-library/index.min.js 162 kB +240 B (0%)
build/block-library/style-rtl.css 10.7 kB +12 B (0%)
build/block-library/style.css 10.7 kB +17 B (0%)
build/components/index.min.js 215 kB +45 B (0%)
build/components/style-rtl.css 15.5 kB +20 B (0%)
build/components/style.css 15.5 kB +22 B (0%)
build/compose/index.min.js 10.9 kB -20 B (0%)
build/data/index.min.js 7.49 kB +24 B (0%)
build/edit-site/index.min.js 35.4 kB +1.24 kB (+4%)
build/edit-site/style-rtl.css 6.57 kB -6 B (0%)
build/edit-site/style.css 6.57 kB -7 B (0%)
build/editor/index.min.js 37.8 kB -18 B (0%)
build/format-library/index.min.js 6.58 kB +14 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 960 B
build/admin-manifest/index.min.js 1.1 kB
build/annotations/index.min.js 2.75 kB
build/api-fetch/index.min.js 2.21 kB
build/autop/index.min.js 2.12 kB
build/blob/index.min.js 459 B
build/block-directory/index.min.js 6.28 kB
build/block-directory/style-rtl.css 1.01 kB
build/block-directory/style.css 1.01 kB
build/block-editor/default-editor-styles-rtl.css 378 B
build/block-editor/default-editor-styles.css 378 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 65 B
build/block-library/blocks/archives/style.css 65 B
build/block-library/blocks/audio/editor-rtl.css 58 B
build/block-library/blocks/audio/editor.css 58 B
build/block-library/blocks/audio/style-rtl.css 111 B
build/block-library/blocks/audio/style.css 111 B
build/block-library/blocks/audio/theme-rtl.css 125 B
build/block-library/blocks/audio/theme.css 125 B
build/block-library/blocks/block/editor-rtl.css 161 B
build/block-library/blocks/block/editor.css 161 B
build/block-library/blocks/button/editor-rtl.css 470 B
build/block-library/blocks/button/editor.css 470 B
build/block-library/blocks/button/style-rtl.css 560 B
build/block-library/blocks/button/style.css 560 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 275 B
build/block-library/blocks/buttons/style.css 275 B
build/block-library/blocks/calendar/style-rtl.css 207 B
build/block-library/blocks/calendar/style.css 207 B
build/block-library/blocks/categories/editor-rtl.css 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 79 B
build/block-library/blocks/categories/style.css 79 B
build/block-library/blocks/code/style-rtl.css 90 B
build/block-library/blocks/code/style.css 90 B
build/block-library/blocks/code/theme-rtl.css 134 B
build/block-library/blocks/code/theme.css 134 B
build/block-library/blocks/columns/editor-rtl.css 210 B
build/block-library/blocks/columns/editor.css 208 B
build/block-library/blocks/columns/style-rtl.css 503 B
build/block-library/blocks/columns/style.css 502 B
build/block-library/blocks/comment-template/style-rtl.css 127 B
build/block-library/blocks/comment-template/style.css 127 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/cover/editor-rtl.css 546 B
build/block-library/blocks/cover/editor.css 547 B
build/block-library/blocks/cover/style-rtl.css 1.22 kB
build/block-library/blocks/cover/style.css 1.22 kB
build/block-library/blocks/embed/editor-rtl.css 488 B
build/block-library/blocks/embed/editor.css 488 B
build/block-library/blocks/embed/style-rtl.css 417 B
build/block-library/blocks/embed/style.css 417 B
build/block-library/blocks/embed/theme-rtl.css 124 B
build/block-library/blocks/embed/theme.css 124 B
build/block-library/blocks/file/editor-rtl.css 300 B
build/block-library/blocks/file/editor.css 300 B
build/block-library/blocks/file/style-rtl.css 255 B
build/block-library/blocks/file/style.css 255 B
build/block-library/blocks/file/view.min.js 322 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/gallery/editor-rtl.css 966 B
build/block-library/blocks/gallery/editor.css 970 B
build/block-library/blocks/gallery/style-rtl.css 1.63 kB
build/block-library/blocks/gallery/style.css 1.62 kB
build/block-library/blocks/gallery/theme-rtl.css 122 B
build/block-library/blocks/gallery/theme.css 122 B
build/block-library/blocks/group/editor-rtl.css 159 B
build/block-library/blocks/group/editor.css 159 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 114 B
build/block-library/blocks/heading/style.css 114 B
build/block-library/blocks/html/editor-rtl.css 332 B
build/block-library/blocks/html/editor.css 333 B
build/block-library/blocks/image/editor-rtl.css 731 B
build/block-library/blocks/image/editor.css 730 B
build/block-library/blocks/image/style-rtl.css 507 B
build/block-library/blocks/image/style.css 511 B
build/block-library/blocks/image/theme-rtl.css 124 B
build/block-library/blocks/image/theme.css 124 B
build/block-library/blocks/latest-comments/style-rtl.css 284 B
build/block-library/blocks/latest-comments/style.css 284 B
build/block-library/blocks/latest-posts/editor-rtl.css 137 B
build/block-library/blocks/latest-posts/editor.css 137 B
build/block-library/blocks/latest-posts/style-rtl.css 528 B
build/block-library/blocks/latest-posts/style.css 527 B
build/block-library/blocks/list/style-rtl.css 94 B
build/block-library/blocks/list/style.css 94 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 493 B
build/block-library/blocks/media-text/style.css 490 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 649 B
build/block-library/blocks/navigation-link/editor.css 650 B
build/block-library/blocks/navigation-link/style-rtl.css 94 B
build/block-library/blocks/navigation-link/style.css 94 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 299 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation-submenu/view.min.js 343 B
build/block-library/blocks/navigation/style-rtl.css 1.68 kB
build/block-library/blocks/navigation/style.css 1.67 kB
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 377 B
build/block-library/blocks/page-list/editor.css 377 B
build/block-library/blocks/page-list/style-rtl.css 172 B
build/block-library/blocks/page-list/style.css 172 B
build/block-library/blocks/paragraph/editor-rtl.css 157 B
build/block-library/blocks/paragraph/editor.css 157 B
build/block-library/blocks/paragraph/style-rtl.css 273 B
build/block-library/blocks/paragraph/style.css 273 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/style-rtl.css 444 B
build/block-library/blocks/post-comments-form/style.css 444 B
build/block-library/blocks/post-comments/style-rtl.css 492 B
build/block-library/blocks/post-comments/style.css 493 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B
build/block-library/blocks/post-excerpt/editor.css 73 B
build/block-library/blocks/post-excerpt/style-rtl.css 69 B
build/block-library/blocks/post-excerpt/style.css 69 B
build/block-library/blocks/post-featured-image/editor-rtl.css 721 B
build/block-library/blocks/post-featured-image/editor.css 721 B
build/block-library/blocks/post-featured-image/style-rtl.css 153 B
build/block-library/blocks/post-featured-image/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 391 B
build/block-library/blocks/post-template/style.css 392 B
build/block-library/blocks/post-terms/style-rtl.css 73 B
build/block-library/blocks/post-terms/style.css 73 B
build/block-library/blocks/post-title/style-rtl.css 80 B
build/block-library/blocks/post-title/style.css 80 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 198 B
build/block-library/blocks/pullquote/editor.css 198 B
build/block-library/blocks/pullquote/style-rtl.css 378 B
build/block-library/blocks/pullquote/style.css 378 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 273 B
build/block-library/blocks/query-pagination/style.css 269 B
build/block-library/blocks/query/editor-rtl.css 131 B
build/block-library/blocks/query/editor.css 132 B
build/block-library/blocks/quote/style-rtl.css 187 B
build/block-library/blocks/quote/style.css 187 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/rss/editor-rtl.css 202 B
build/block-library/blocks/rss/editor.css 204 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 165 B
build/block-library/blocks/search/editor.css 165 B
build/block-library/blocks/search/style-rtl.css 397 B
build/block-library/blocks/search/style.css 398 B
build/block-library/blocks/search/theme-rtl.css 64 B
build/block-library/blocks/search/theme.css 64 B
build/block-library/blocks/separator/editor-rtl.css 99 B
build/block-library/blocks/separator/editor.css 99 B
build/block-library/blocks/separator/style-rtl.css 245 B
build/block-library/blocks/separator/style.css 245 B
build/block-library/blocks/separator/theme-rtl.css 172 B
build/block-library/blocks/separator/theme.css 172 B
build/block-library/blocks/shortcode/editor-rtl.css 474 B
build/block-library/blocks/shortcode/editor.css 474 B
build/block-library/blocks/site-logo/editor-rtl.css 772 B
build/block-library/blocks/site-logo/editor.css 772 B
build/block-library/blocks/site-logo/style-rtl.css 165 B
build/block-library/blocks/site-logo/style.css 165 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 84 B
build/block-library/blocks/site-title/editor.css 84 B
build/block-library/blocks/social-link/editor-rtl.css 177 B
build/block-library/blocks/social-link/editor.css 177 B
build/block-library/blocks/social-links/editor-rtl.css 670 B
build/block-library/blocks/social-links/editor.css 669 B
build/block-library/blocks/social-links/style-rtl.css 1.32 kB
build/block-library/blocks/social-links/style.css 1.32 kB
build/block-library/blocks/spacer/editor-rtl.css 307 B
build/block-library/blocks/spacer/editor.css 307 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 471 B
build/block-library/blocks/table/editor.css 472 B
build/block-library/blocks/table/style-rtl.css 481 B
build/block-library/blocks/table/style.css 481 B
build/block-library/blocks/table/theme-rtl.css 188 B
build/block-library/blocks/table/theme.css 188 B
build/block-library/blocks/tag-cloud/style-rtl.css 146 B
build/block-library/blocks/tag-cloud/style.css 146 B
build/block-library/blocks/template-part/editor-rtl.css 560 B
build/block-library/blocks/template-part/editor.css 559 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 87 B
build/block-library/blocks/verse/style.css 87 B
build/block-library/blocks/video/editor-rtl.css 569 B
build/block-library/blocks/video/editor.css 570 B
build/block-library/blocks/video/style-rtl.css 173 B
build/block-library/blocks/video/style.css 173 B
build/block-library/blocks/video/theme-rtl.css 124 B
build/block-library/blocks/video/theme.css 124 B
build/block-library/common-rtl.css 857 B
build/block-library/common.css 856 B
build/block-library/reset-rtl.css 474 B
build/block-library/reset.css 474 B
build/block-library/theme-rtl.css 672 B
build/block-library/theme.css 677 B
build/block-serialization-default-parser/index.min.js 1.09 kB
build/block-serialization-spec-parser/index.min.js 2.79 kB
build/blocks/index.min.js 46.3 kB
build/core-data/index.min.js 13.2 kB
build/customize-widgets/index.min.js 11.4 kB
build/customize-widgets/style-rtl.css 1.5 kB
build/customize-widgets/style.css 1.49 kB
build/data-controls/index.min.js 631 B
build/date/index.min.js 31.5 kB
build/deprecated/index.min.js 485 B
build/dom-ready/index.min.js 304 B
build/dom/index.min.js 4.5 kB
build/edit-navigation/index.min.js 16 kB
build/edit-navigation/style-rtl.css 3.76 kB
build/edit-navigation/style.css 3.76 kB
build/edit-post/classic-rtl.css 492 B
build/edit-post/classic.css 494 B
build/edit-post/index.min.js 29.6 kB
build/edit-post/style-rtl.css 7.1 kB
build/edit-post/style.css 7.09 kB
build/edit-widgets/index.min.js 16.5 kB
build/edit-widgets/style-rtl.css 4.18 kB
build/edit-widgets/style.css 4.18 kB
build/editor/style-rtl.css 3.78 kB
build/editor/style.css 3.77 kB
build/element/index.min.js 3.29 kB
build/escape-html/index.min.js 517 B
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 B
build/hooks/index.min.js 1.63 kB
build/html-entities/index.min.js 424 B
build/i18n/index.min.js 3.71 kB
build/is-shallow-equal/index.min.js 501 B
build/keyboard-shortcuts/index.min.js 1.8 kB
build/keycodes/index.min.js 1.39 kB
build/list-reusable-blocks/index.min.js 1.72 kB
build/list-reusable-blocks/style-rtl.css 838 B
build/list-reusable-blocks/style.css 838 B
build/media-utils/index.min.js 2.92 kB
build/notices/index.min.js 925 B
build/nux/index.min.js 2.08 kB
build/nux/style-rtl.css 747 B
build/nux/style.css 743 B
build/plugins/index.min.js 1.84 kB
build/primitives/index.min.js 924 B
build/priority-queue/index.min.js 582 B
build/react-i18n/index.min.js 671 B
build/redux-routine/index.min.js 2.65 kB
build/reusable-blocks/index.min.js 2.22 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 11 kB
build/server-side-render/index.min.js 1.57 kB
build/shortcode/index.min.js 1.49 kB
build/token-list/index.min.js 639 B
build/url/index.min.js 1.9 kB
build/viewport/index.min.js 1.05 kB
build/warning/index.min.js 248 B
build/widgets/index.min.js 7.15 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.04 kB

compressed-size-action

Loading

lib/full-site-editing/edit-site-page.php Outdated Show resolved Hide resolved
Loading
@noisysocks
Copy link
Member

@noisysocks noisysocks commented Dec 3, 2021

Thanks for exploring this @kevin940726. I've not yet reviewed the code closely, but it looks simpler than I thought. I like that we're using history instead of a custom approach. I like that history adds +923 B which isn't so bad. I like that everything is compartmentalised to edit-site so that we can iterate on the APIs here without impacting too many bits of Gutenberg.

I gave it for a spin and it works very well. Here's a video. I throttled network requests down to WiFi speeds for a more realistic example.

Kapture.2021-12-03.at.15.51.06.mp4

My only suggestion is that I think we should automatically collapse the black navigation menu on the left when you open a template or template part.

Loading

@kevin940726
Copy link
Member Author

@kevin940726 kevin940726 commented Dec 3, 2021

My only suggestion is that I think we should automatically collapse the black navigation menu on the left when you open a template or template part.

Yeah, I think this is a bug. Everything becomes more complicated in SPA 😅 .

Loading

@talldan
Copy link
Contributor

@talldan talldan commented Dec 3, 2021

We obviously still need to pay extra attention to accessibility to ensure that it's still accessible.

I did a little bit of testing in Voiceover, and when selecting a link nothing is announced and that might lead a screenreader user to believe that nothing happened.

It looks like the page title isn't being updated when navigating, and that might be one of the causes, though I'm not sure if it would fix it.

Loading

@talldan
Copy link
Contributor

@talldan talldan commented Dec 3, 2021

I think we also need to handle the 'You have unsaved changes' warnings in the editor in a client side routing model. Usually that's tied into the page unload, but that doesn't happen now.

Steps to repro:

  1. Make some changes to a template using the editor
  2. Switch to the 'Templates' page in the sidebar
  3. Go to the dashboard

Expected: At some point (probably during step 2), a warning should show about unsaved changes, asking the user to confirm or cancel before navigating.
Actual: No warning is shown.

Loading

*/
import { addQueryArgs } from '@wordpress/url';

const history = createBrowserHistory();
Copy link
Member Author

@kevin940726 kevin940726 Dec 3, 2021

Choose a reason for hiding this comment

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

I believe, in theory, this PR should work even inside iframes. If for some reasons url transitions are completely off the table, we can still switch this to createMemoryHistory and get the similar effect.

Loading

@kevin940726 kevin940726 force-pushed the add/edit-site-routes branch from bed34dc to 5a14c53 Dec 3, 2021
@mattwiebe
Copy link
Contributor

@mattwiebe mattwiebe commented Dec 3, 2021

Just leaving a note to say: 1) thank you! This will be a much better UX than full page refreshes when navigating between the Editor and template list views

And 2) this fixes the issues we've found on WP.com around iframing the Site Editor.

Loading

@kevin940726
Copy link
Member Author

@kevin940726 kevin940726 commented Dec 8, 2021

I did face one JS error that broke the whole editor when switching to the 404 template but I wasn't able to reproduce consistently, maybe that screenshot can help pin point the issue somehow.

That seems unrelated. There are some code smell regarding not properly cancelling requests when a component unmounts. These could be more visible when the user can now navigate to another page and unmount everything on previous page, while in the past they can only reload the page and nuke everything (including the warnings and errors). Fixing them could be a larger issue though.

Potentially we could just use the navigator components and if we really need to keep the "URL" routing, we add a layer (component or hook) of synchronization between the history and the navigator.

I haven't really thought through this, but I have a hunch that the source of truth should always be the url in CSR. Synchronizing could be really complicated, and history just handles it so well for us and battle-tested in popular routing libraries. I'm not against of this idea, but perhaps we might have to re-think the best practices in navigator components if we ever want to migrate to using it.

If we do this for template parts, shouldn't we also do it for the templates themselves? 🤔

Yep, that's the plan :).

Another small issue I noticed is that the "Site" link in the W menu seems to be active regardless of what I'm editing...

Yep, this is a known bug tracked in #36821. I don't think this PR changes any of that?

It would be great if the switch announcement could be something like "Now displaying: template/template_part."

@alexstine Interesting! I'm not seeing popular frameworks doing this though. Is there some references or articles about this? I want to learn more about the best practices :).

For now, how easy is it to simply put focus on the navigation button? It's the first element on the page, so should be a compromise without needing Skip to Content.

Probably not too difficult, probably just some edge cases needed to be handled. I'll try!

Loading

@youknowriad
Copy link
Contributor

@youknowriad youknowriad commented Dec 8, 2021

We're not really discussing whether the old or new behavior is better. The issue is that there's currently no warning when exiting via the template list page. So a user would lose unsaved changes.

Oh got it, isn't this just a matter of adding the unsaved changes component to the list view (or moving it un in the react tree)?

Loading

@youknowriad
Copy link
Contributor

@youknowriad youknowriad commented Dec 8, 2021

I haven't really thought through this, but I have a hunch that the source of truth should always be the url in CSR.

In my opinion, the applications that rely on the router and URL for the source of truth leak too much information about routing to the UI components. I personally see routing as a side effect and I don't like splitting the source of truth between different places.

Loading

@talldan
Copy link
Contributor

@talldan talldan commented Dec 8, 2021

Oh got it, isn't this just a matter of adding the unsaved changes component to the list view (or moving it un in the react tree)?

Yeah, I think that would be the simplest fix and easiest thing to do right now. It seems like the alternatives require a lot of changes.

Loading

@alexstine
Copy link
Contributor

@alexstine alexstine commented Dec 8, 2021

@kevin940726

@alexstine Interesting! I'm not seeing popular frameworks doing this though. Is there some references or articles about this? I want to learn more about the best practices :).

I am sure you can find plenty of examples, but this really just comes down to common sense. If you were a blind user that selected the Header template and you heard "Editor", what would that mean to you? Wouldn't it make more sense to hear "Now editing Header template."? I already know I'm in the Site Editor, I don't need to hear that every time a template/template part is selected.

Thanks.

Loading

Copy link
Contributor

@talldan talldan left a comment

It looks good so far. It'd be good to get a summary of what's remaining.

Shall we try the simplest possible fix for the unsaved changes issue like Riad suggested (using the UnsavedChangesWarning in the list screen)? All the other options seem to be really complicated!

Loading

showHomepage().then( () => {
if ( ! isMounted ) {
return;
}

window.history.replaceState( {}, '', newUrl );
}, [ pageContext ] );
const page = getPage();
const editedPostId = getEditedPostId();
const editedPostType = getEditedPostType();

return null;
}

function useCurrentPageContext() {
return useSelect( ( select ) => {
const { getEditedPostType, getEditedPostId, getPage } = select(
editSiteStore
);

const page = getPage();
let _postId = getEditedPostId(),
_postType = getEditedPostType();
// This doesn't seem right to me,
// we shouldn't be using the "page" and the "template" in the same way.
// This need to be investigated.
if ( page?.context?.postId && page?.context?.postType ) {
_postId = page.context.postId;
_postType = page.context.postType;
if ( page?.context?.postId && page?.context?.postType ) {
history.replace( {
postId: page.context.postId,
postType: page.context.postType,
} );
} else if ( editedPostId && editedPostType ) {
history.replace( {
postId: editedPostId,
postType: editedPostType,
} );
}
} );
Copy link
Contributor

@talldan talldan Dec 9, 2021

Choose a reason for hiding this comment

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

So this is where there's a client side redirection? (#36873). I understand this is due to be replaced, is that going to be in 5.9?

I think this is a bit of tech debt because of how in all other cases the store state is reactive, but here it gets set first and the call to history.replace happens after. As long as it works right now, it's ok to leave it as is in this PR.

If we can't solve #36873, there might be a few things that can be done to tidy it up. I was wondering if it could be a selector like getHomepage, and then we handle routing based on what that returns. The state could then update as a result of that routing. Also feels like it could be done before the React App mounts to avoid any other effects triggering.

As a side note, the request to /wp/v2/settings that happens from showHomepage is possibly not using the preloaded data. I'm still seeing a network request in my dev tools. It probably wasn't an issue introduced here though, so let's follow up on that.

Loading

Copy link
Member Author

@kevin940726 kevin940726 Dec 9, 2021

Choose a reason for hiding this comment

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

I understand this is due to be replaced, is that going to be in 5.9?

I don't think so, unless someone is willing to work on that.

I was wondering if it could be a selector like getHomepage, and then we handle routing based on what that returns. The state could then update as a result of that routing. Also feels like it could be done before the React App mounts to avoid any other effects triggering.

Sounds interesting! Would you mind try implementing this? Either push directly to this PR or to a different PR.

Loading

Copy link
Contributor

@talldan talldan Dec 9, 2021

Choose a reason for hiding this comment

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

I'm not sure of all the permutations, but I'll give it a go 😄

Loading

@kevin940726
Copy link
Member Author

@kevin940726 kevin940726 commented Dec 9, 2021

@alexstine

I am sure you can find plenty of examples, but this really just comes down to common sense. If you were a blind user that selected the Header template and you heard "Editor", what would that mean to you? Wouldn't it make more sense to hear "Now editing Header template."? I already know I'm in the Site Editor, I don't need to hear that every time a template/template part is selected.

I understand and I agree! I'm just wondering when will it differ from the traditional multi-page navigation? As far as I understand, it won't announce "Now displaying" when navigating to a different page by default either. I understand the experience in the Site Editor is a bit different though (and probably that's the reason), I'm just curious and want to learn more about this topic 😅 .

Loading

@kevin940726
Copy link
Member Author

@kevin940726 kevin940726 commented Dec 9, 2021

@talldan I just added <UnsavedChangesWarning> to the list page! It now warns if we have unsaved changes when trying to leave the list page, but doesn't prevent us from leaving the editor.

Loading

Copy link
Member

@noisysocks noisysocks left a comment

I think that we can merge this and keep working on the focus management issue as a follow-up. That way you're not juggling such a big PR and these changes can get a bit more testing from developers working out of Gutenberg trunk.

Loading

@kevin940726
Copy link
Member Author

@kevin940726 kevin940726 commented Dec 9, 2021

For now, how easy is it to simply put focus on the navigation button? It's the first element on the page, so should be a compromise without needing Skip to Content.

Turns out this is not that easy as I thought, might requires some refactoring. I'll probably do this as a follow-up PR, and add this to #36597 for tracking and visibility.

Loading

@talldan
Copy link
Contributor

@talldan talldan commented Dec 9, 2021

On this issue with the Dashboard button, it does seem to happen only in this PR from what I can tell:
Screen Shot 2021-12-09 at 12 30 10 pm

It's related to these styles:
Screen Shot 2021-12-09 at 12 33 08 pm

Here, .components-button.is-tertiary overrides the MenuBackButtonUI.is-tertiary rule. In trunk it's the other way around.

Loading

@alexstine
Copy link
Contributor

@alexstine alexstine commented Dec 9, 2021

@kevin940726 The biggest reason this needs to happen is because people with sight can simply check the page and see that you changed to new content. Without specifically providing this update to screen reader users, they may wonder why nothing happened. Take Google Calendar for example. If I want to view my events for January, 2022, I simply click on the Next Month button. Then it tells me that it is displaying events for January, 2022. Why? Because of lack of page reload. Screen reader users would have no idea the content has changed unless they went out of their way to check the content of the page.

This doesn't really apply to our situation fully, but it's better than nothing.

https://www.w3.org/TR/UNDERSTANDING-WCAG20/consistent-behavior-no-extreme-changes-context.html

I am thinking WCAG 3.0 will come up with better rules for dynamic content. Remember, accessibility is generally always dreadfully behind the times, screen readers and dynamic content are no exception to the rule.

Here is another great resource for the why factor.

https://accessibility.huit.harvard.edu/provide-notification-dynamic-changes-content

Also, the note about focus. Usually, changing focus isn't a great idea but dynamic web apps are changing this. In my opinion, it is much better to always plop users in a central location after an action such as a template/template part selection. In this case, the main navigation trigger would be a great global point.

I understand these should be addressed in another PR as this one is getting large, but I also want to make very clear that these should be considered blockers for the 5.9 inclusion. I really like the simplicity of not having the page reload, but we've got to make sure screen reader users don't get disoriented when the page dynamically updates from their selection.

PS: apologies for a gruff sounding reply earlier. I should not be replying on these before I've had coffee. 👎 for me.

Thanks.

Loading

@kevin940726
Copy link
Member Author

@kevin940726 kevin940726 commented Dec 9, 2021

@alexstine Thank you! These are really helpful! 💯

I just pushed a commit to add "Now displaying" to the page navigation announcement in 6b38d67. Hope that I'm not misunderstanding it.

I understand these should be addressed in another PR as this one is getting large, but I also want to make very clear that these should be considered blockers for the 5.9 inclusion. I really like the simplicity of not having the page reload, but we've got to make sure screen reader users don't get disoriented when the page dynamically updates from their selection.

100% agree! I added the focus management task to the tracking issue as well (under "Accessibility").

Let's move further discussions there to better track them and create new issues if needed.

PS: apologies for a gruff sounding reply earlier. I should not be replying on these before I've had coffee. 👎 for me.

No worries! I'm always grateful to have your inputs on accessibility feedbacks. I'll try to learn more to keep our collaboration smoother ♥️ !

Loading

@kevin940726 kevin940726 merged commit 3053989 into trunk Dec 9, 2021
21 checks passed
Loading
@kevin940726 kevin940726 deleted the add/edit-site-routes branch Dec 9, 2021
@github-actions github-actions bot added this to the Gutenberg 12.2 milestone Dec 9, 2021
@alexstine
Copy link
Contributor

@alexstine alexstine commented Dec 9, 2021

@kevin940726 Looks good. Thanks! 👍 💯

Loading

@noisysocks
Copy link
Member

@noisysocks noisysocks commented Dec 10, 2021

Thanks @kevin940726! Really nice collaborative effort here everyone 👏

Loading

noisysocks added a commit that referenced this issue Dec 13, 2021
* Add client side router

* Use saveEntityRecord to update the store

* Fix updating state in unmounted components

* Update titles when page navigates

* Use slot/fill for NavigationSidebar

* Announce title change

* Inline all api requests

* Fix php lint errors

* Make title announcement assertive

* Fix infinite loop in page navigation

* Fix duplicate main roles

* Fix not announcing same titles

* Try to fix url query controller

* Add UnsavedWarning to list page too

* Add now displaying to use-title's speak
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment