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

Reset focus after route navigation in Site Editor #37314

Closed
wants to merge 7 commits into from

Conversation

kevin940726
Copy link
Member

Description

Part of #36597. Alternative to #37265.

Continue from #36488, this PR refactors a large part of the original PR to optimize the render times needed when switching to another route.

This PR will reset the focus to the navigation toggle button on route change. In order to prevent it from focusing on the button on initial page load, we create a flag isInitialPageLoadRef and set it to false after the first render.

const isInitialPageLoadRef = useRef( true );
useEffect( () => {
// Don't focus for initial page load.
if ( isInitialPageLoadRef.current ) {
isInitialPageLoadRef.current = false;
return;
}

However, the button will remount whenever we switch from list page to the editor or the other way around. It causes isInitialPageLoadRef to be reset to true after remount, thus skipping the focus.

We could do some weird hack to make it work with minimal efforts, but a more robust fix will be to prevent the button from remounting in the first place. The button only remounts because we change the "parent" of it after switching to a different route. For instance, switching
from <List><NavigationToggle /></List> to <Editor><NavigationToggle /></Editor>.

It's called "Reparenting" in React, changing the parent of an element will inevitably remount itself. There are only a few options we could do to bypass that. The basic ideas are the same though, don't re-parent the element.

The approach this PR takes is to use a renderLayout function to render the route layout rather than using yet another component. The advantage of render function here is that it doesn't count as a parent, since there's no component being rendered. The disadvantage is that we can't use hooks inside the render function, so we'll have to pass the state from its parent.

First, we define the renderLayout function on the Route entry component:

List.renderLayout = function renderListLayout( {
postType,
activeTemplateType,
} ) {
// `postType` could load in asynchronously. Only provide the detailed region labels if
// the postType has loaded, otherwise `InterfaceSkeleton` will fallback to the defaults.
const itemsListLabel = postType?.labels?.items_list;
const detailedRegionLabels = postType
? {
header: sprintf(
// translators: %s - the name of the page, 'Header' as in the header area of that page.
__( '%s - Header' ),
itemsListLabel
),
body: sprintf(
// translators: %s - the name of the page, 'Content' as in the content area of that page.
__( '%s - Content' ),
itemsListLabel
),
}
: undefined;
return (
<Layout
isNavigationDefaultOpen
activeTemplateType={ activeTemplateType }
className="edit-site-list"
labels={ {
drawer: __( 'Navigation Sidebar' ),
...detailedRegionLabels,
} }
header={ <Header /> }
content={ <List /> }
/>
);
};

Then, we just have to call the render function with all the required states in the parent (<App>):

? List.renderLayout( {
postType,
activeTemplateType: params.postType,
} )

Since that <Layout> will never re-parent, neither will <InterfaceSkeleton> and <NavigationToggle> underneath it, they will not remount on route change anymore. The fix for focus reset then become trivial and predictable.

Note that this refactor doesn't just benefit this focus fix, but also improves the overall performance of the editor, since that it doesn't have to do unnecessary remounts anymore.

This is a big change though, so if we can't get enough testing, I agree to postpone it after 5.9. We can fix focus management in another smaller PR (like #37265).

How has this been tested?

  1. Activate tt1-blocks theme or any other block-based theme
  2. Visit Appearance -> Editor
  3. On initial page load, the focus shouldn't focus on the navigation toggle button (should it?)
  4. Toggle the navigation button to open the sidebar
  5. Visit the "Templates" or "Template Parts" link
  6. After the navigation, the focus should reset to the navigation toggle button
  7. Select any item in the list page to go to the editor
  8. After the navigation, the focus should reset to the navigation toggle button

Types of changes

Bug fix

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).

@kevin940726 kevin940726 added [Type] Bug An existing feature does not function as intended [Focus] Accessibility (a11y) Changes that impact accessibility and need corresponding review (e.g. markup changes). [Feature] Full Site Editing labels Dec 13, 2021
@github-actions
Copy link

github-actions bot commented Dec 13, 2021

Size Change: +216 B (0%)

Total Size: 1.15 MB

Filename Size Change
build/edit-site/index.min.js 42.3 kB +217 B (+1%)
build/edit-site/style-rtl.css 7.23 kB -1 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 993 B
build/admin-manifest/index.min.js 1.24 kB
build/annotations/index.min.js 2.77 kB
build/api-fetch/index.min.js 2.27 kB
build/autop/index.min.js 2.15 kB
build/blob/index.min.js 487 B
build/block-directory/index.min.js 6.49 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-editor/index.min.js 143 kB
build/block-editor/style-rtl.css 14.8 kB
build/block-editor/style.css 14.8 kB
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 150 B
build/block-library/blocks/audio/editor.css 150 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 445 B
build/block-library/blocks/button/editor.css 445 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 292 B
build/block-library/blocks/buttons/editor.css 292 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 103 B
build/block-library/blocks/code/style.css 103 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 406 B
build/block-library/blocks/columns/style.css 406 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-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/comments-query-loop/editor-rtl.css 95 B
build/block-library/blocks/comments-query-loop/editor.css 95 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.56 kB
build/block-library/blocks/cover/style.css 1.56 kB
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 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 353 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 965 B
build/block-library/blocks/gallery/editor.css 967 B
build/block-library/blocks/gallery/style-rtl.css 1.61 kB
build/block-library/blocks/gallery/style.css 1.61 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 518 B
build/block-library/blocks/image/style.css 523 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 199 B
build/block-library/blocks/latest-posts/editor.css 198 B
build/block-library/blocks/latest-posts/style-rtl.css 447 B
build/block-library/blocks/latest-posts/style.css 446 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 375 B
build/block-library/blocks/navigation/editor-rtl.css 2.01 kB
build/block-library/blocks/navigation/editor.css 2.02 kB
build/block-library/blocks/navigation/style-rtl.css 1.89 kB
build/block-library/blocks/navigation/style.css 1.88 kB
build/block-library/blocks/navigation/view.min.js 2.85 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 363 B
build/block-library/blocks/page-list/editor.css 363 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 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 446 B
build/block-library/blocks/post-comments-form/style.css 446 B
build/block-library/blocks/post-comments/style-rtl.css 521 B
build/block-library/blocks/post-comments/style.css 521 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 323 B
build/block-library/blocks/post-template/style.css 323 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 389 B
build/block-library/blocks/pullquote/style.css 388 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 234 B
build/block-library/blocks/query-pagination/style.css 231 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 201 B
build/block-library/blocks/quote/style.css 201 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 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 233 B
build/block-library/blocks/separator/style.css 233 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 744 B
build/block-library/blocks/site-logo/editor.css 744 B
build/block-library/blocks/site-logo/style-rtl.css 181 B
build/block-library/blocks/site-logo/style.css 181 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 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.37 kB
build/block-library/blocks/social-links/style.css 1.36 kB
build/block-library/blocks/spacer/editor-rtl.css 332 B
build/block-library/blocks/spacer/editor.css 332 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 226 B
build/block-library/blocks/tag-cloud/style.css 227 B
build/block-library/blocks/template-part/editor-rtl.css 235 B
build/block-library/blocks/template-part/editor.css 235 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 571 B
build/block-library/blocks/video/editor.css 572 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 934 B
build/block-library/common.css 932 B
build/block-library/editor-rtl.css 9.89 kB
build/block-library/editor.css 9.9 kB
build/block-library/index.min.js 167 kB
build/block-library/reset-rtl.css 474 B
build/block-library/reset.css 474 B
build/block-library/style-rtl.css 11.4 kB
build/block-library/style.css 11.4 kB
build/block-library/theme-rtl.css 665 B
build/block-library/theme.css 670 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 46.4 kB
build/components/index.min.js 215 kB
build/components/style-rtl.css 15.5 kB
build/components/style.css 15.5 kB
build/compose/index.min.js 11.2 kB
build/core-data/index.min.js 13.9 kB
build/customize-widgets/index.min.js 11.2 kB
build/customize-widgets/style-rtl.css 1.39 kB
build/customize-widgets/style.css 1.39 kB
build/data-controls/index.min.js 663 B
build/data/index.min.js 7.65 kB
build/date/index.min.js 31.9 kB
build/deprecated/index.min.js 518 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.53 kB
build/edit-navigation/index.min.js 16.2 kB
build/edit-navigation/style-rtl.css 3.76 kB
build/edit-navigation/style.css 3.76 kB
build/edit-post/classic-rtl.css 546 B
build/edit-post/classic.css 547 B
build/edit-post/index.min.js 29.9 kB
build/edit-post/style-rtl.css 7.19 kB
build/edit-post/style.css 7.18 kB
build/edit-site/style.css 7.22 kB
build/edit-widgets/index.min.js 16.5 kB
build/edit-widgets/style-rtl.css 4.12 kB
build/edit-widgets/style.css 4.13 kB
build/editor/index.min.js 38.5 kB
build/editor/style-rtl.css 3.71 kB
build/editor/style.css 3.71 kB
build/element/index.min.js 3.32 kB
build/escape-html/index.min.js 548 B
build/format-library/index.min.js 6.62 kB
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 B
build/hooks/index.min.js 1.66 kB
build/html-entities/index.min.js 454 B
build/i18n/index.min.js 3.79 kB
build/is-shallow-equal/index.min.js 535 B
build/keyboard-shortcuts/index.min.js 1.83 kB
build/keycodes/index.min.js 1.41 kB
build/list-reusable-blocks/index.min.js 1.75 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.94 kB
build/notices/index.min.js 957 B
build/nux/index.min.js 2.12 kB
build/nux/style-rtl.css 747 B
build/nux/style.css 743 B
build/plugins/index.min.js 1.98 kB
build/preferences/index.min.js 1.2 kB
build/primitives/index.min.js 949 B
build/priority-queue/index.min.js 611 B
build/react-i18n/index.min.js 704 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.69 kB
build/reusable-blocks/index.min.js 2.24 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 11.1 kB
build/server-side-render/index.min.js 1.61 kB
build/shortcode/index.min.js 1.52 kB
build/token-list/index.min.js 668 B
build/url/index.min.js 1.94 kB
build/viewport/index.min.js 1.08 kB
build/warning/index.min.js 280 B
build/widgets/index.min.js 7.18 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.07 kB

compressed-size-action

*/
import { store as editSiteStore } from '../../store';

export default function EditorActions() {
Copy link
Member Author

Choose a reason for hiding this comment

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

This component is extracted from the original <Editor> component inside <InterfaceSkeleton actions={...}>.

useTitle( isReady && __( 'Editor (beta)' ) );

useURLQueryController();
Copy link
Member Author

Choose a reason for hiding this comment

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

<URLQueryController> doesn't return anything and it should always run, we can just re-write it into a hook so that we don't have to worry about where to put it.

import NavigationSidebar from '../navigation-sidebar';
import { store as editSiteStore } from '../../store';

function Layout( {
Copy link
Member Author

Choose a reason for hiding this comment

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

This component extracts the common parts of two screens (especially <InterfaceSkeleton> and <NavigationSidebar>) so that they can both share the same parents.

@@ -74,22 +40,18 @@ export default function List() {
: undefined;

return (
<InterfaceSkeleton
className={ classnames( 'edit-site-list', {
'is-navigation-open': isNavigationOpen,
Copy link
Member Author

Choose a reason for hiding this comment

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

I just found out that we can use body.is-navigation-sidebar-open for this.

Comment on lines +29 to +36
// Don't focus for the initial page redirection.
// TODO: This can be removed once #36873 is resolved.
if ( expectRedirectionRef.current ) {
expectRedirectionRef.current = false;
if ( history.action === Action.Replace ) {
return;
}
}
Copy link
Member Author

Choose a reason for hiding this comment

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

Hopefully we can remove all these once #36873 is resolved and make this hook easier to understand.

import getIsListPage from '../../utils/get-is-list-page';

export default function EditSiteApp( { reboot } ) {
return (
<SlotFillProvider>
<UnsavedChangesWarning />
Copy link
Member Author

Choose a reason for hiding this comment

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

<UnsavedChangesWarning> is moved to <Layout>.

@alexstine
Copy link
Contributor

@kevin940726 This isn't going to work in it's current state.

  1. Activate a FSE theme.
  2. Open Editor (Beta).
  3. Select Toggle navigation button.
  4. Select Template Parts.
  5. Focus is moved back to Toggle navigation.

This isn't good UX to move focus at this point because the menu is open and users are interacting with the menu. useEffect firing on every URL change is a major drawback but to be completely honest, I wouldn't know how else to do this. In my PR, I only switch focus back when the menu is closed but as you pointed out, this has it's own drawbacks.

This is super difficult to figure out because if the menu triggered some dialog on close, focus may not be placed in the dialog and instead on the menu trigger. However, your solution makes focus happen too often on every page URL update. Even if the user is interacting with the menu, focus is still placed on the trigger.

Would be cool if we could somehow combine our solutions that way useEffect only fires if the menu is closed and URL change occurs.

Thoughts? Please let me know if this doesn't make sense. Happy to try explaining another way.

Thanks.

@alexstine
Copy link
Contributor

@kevin940726 I think I may have come up with a suitable solution. I don't have write access to wordpress/gutenberg, but I attached a diff to my comment.

The only bug I found with this approach is it tries to focus the canvas/frame first. It looks like there's already focus management happening somewhere and it is based off which code runs first. Would be nice to be able to track that down.

Please let me know if I need to explain further.

Thanks.

file.txt

@alexstine
Copy link
Contributor

Small fix, but still trying to track down where the focus is happening after template/template part item is selected.

file.txt

@kevin940726
Copy link
Member Author

@alexstine Thanks for the test! I was also wondering about this, but I tested some websites out there and they try to refocus even if clicking on the nav link (For instance, Reach UI and Gatsby). (I just found out Reakit is doing what you suggested though).

Fortunately, I don't think the fix is that complicated, I just pushed it to d60ce2a. Hopefully it's more robust and match the semantics of what you mean here. Let me know if there's any gotchas! 🙇‍♂️

@alexstine
Copy link
Contributor

@kevin940726 Just gave it a test and yes, it is much simpler than my code. I was trying to pass the state from the store and you simply used native JS functions.

It seems to be working well but that weird focus bug is still happening. After I select a template or template part, it focuses the canvas editor and then focuses the Toggle navigation button. It must be because useEffect is slower than another focus event or something. Any ideas on how to track down this other focus event?

Other than that, this is good from A11Y point of view.

Thanks.

@kevin940726
Copy link
Member Author

It seems to be working well but that weird focus bug is still happening. After I select a template or template part, it focuses the canvas editor and then focuses the Toggle navigation button. It must be because useEffect is slower than another focus event or something. Any ideas on how to track down this other focus event?

Hmm 🤔 , I didn't experience that. I'll take a look!

@alexstine
Copy link
Contributor

@kevin940726 You want to get back to working on this? I know my solution was a bit of a hack so anyway I can help move this forward might be a good thing for the future.

@kevin940726
Copy link
Member Author

@alexstine Yeah sure! I have some other things I'm doing right now, but I'd like to come back to this maybe next week. I'll rebase the PR and ask for another round of reviews. I'll also ask around to see if this is still relevant too (if there's a design revamp planned ahead for instance).

@kevin940726
Copy link
Member Author

@alexstine I just rebased this, I think this is ready for another round of reviews.

@kevin940726 kevin940726 force-pushed the fix/edit-site-focus-management branch from d9fffa4 to 2157324 Compare March 1, 2022 02:34
@alexstine
Copy link
Contributor

@kevin940726 The focus is certainly working now as I would expect it to. Nice job. The only thing I still don't like is the page title seems to never update anymore. Why is it that when I select a template part, it doesn't change the page title? It remains as Editor (beta). I would expect it to read "Editing template part: Header (Dark, large)" just like the first heading on the page says.

Is that out of scope for this PR or can you work on it? Seems like it was working at one time but stopped.

Thanks.

@kevin940726
Copy link
Member Author

The only thing I still don't like is the page title seems to never update anymore.

This seems like a bug! Not sure if it's related to this PR, I'll take a look! Thanks for spotting it!

@alexstine
Copy link
Contributor

@kevin940726 Is there anything from my side blocking this PR? The issue I started discussing above can likely be split out and fixed in another PR.

@kevin940726
Copy link
Member Author

@kevin940726 Is there anything from my side blocking this PR? The issue I started discussing above can likely be split out and fixed in another PR.

Sorry, the issue was bigger than I thought and I didn't have time to look deeper into it at the time. I think this is worth a revisit but I don't have much capacity for it recently. If anyone wants to take it over or start a new one with a different approach, feel free to go for it!

@alexstine
Copy link
Contributor

I think this one can be closed out now. Would likely be a lot of work to bring it back to life.

@kevin940726 kevin940726 deleted the fix/edit-site-focus-management branch June 26, 2023 06:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Focus] Accessibility (a11y) Changes that impact accessibility and need corresponding review (e.g. markup changes). [Type] Bug An existing feature does not function as intended
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants