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

[WIP] dynamic titles and URLs for Nav block items #46891

Draft
wants to merge 3 commits into
base: trunk
Choose a base branch
from

Conversation

getdave
Copy link
Contributor

@getdave getdave commented Jan 4, 2023

What?

Currently a WIP

Closes #18345

Why?

Menus in classic themes will automatically sync entity (post/pages...etc) based links with the underlying entity.

For example if I create a link to the Page "Dave's Page" then no URL is stored an the information about the Page is dynamically populated.

If I then go to the "Pages" area in WP Admin, update "Dave's Page" to "Bobs Page", and then return to the Menus page, my menu item will have updated to reflect that change. That is its Label and URL will now be the same as the updated page.

Currently the Nav block does not exhibit this behaviour.

How?

Testing Instructions

Testing Instructions for Keyboard

Screenshots or screencast

Screen.Capture.on.2023-01-04.at.20-58-32.mp4

@getdave getdave added the [Block] Navigation Affects the Navigation Block label Jan 4, 2023
@getdave getdave self-assigned this Jan 4, 2023
@github-actions
Copy link

github-actions bot commented Jan 4, 2023

Size Change: +74 B (0%)

Total Size: 1.51 MB

Filename Size Change
build/block-editor/index.min.js 213 kB +21 B (0%)
build/block-library/index.min.js 203 kB +53 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 955 B
build/annotations/index.min.js 2.69 kB
build/api-fetch/index.min.js 2.28 kB
build/autop/index.min.js 2.1 kB
build/blob/index.min.js 451 B
build/block-directory/index.min.js 7.01 kB
build/block-directory/style-rtl.css 1.02 kB
build/block-directory/style.css 1.02 kB
build/block-editor/content-rtl.css 4.27 kB
build/block-editor/content.css 4.26 kB
build/block-editor/default-editor-styles-rtl.css 381 B
build/block-editor/default-editor-styles.css 381 B
build/block-editor/style-rtl.css 15 kB
build/block-editor/style.css 15 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 90 B
build/block-library/blocks/archives/style.css 90 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 122 B
build/block-library/blocks/audio/style.css 122 B
build/block-library/blocks/audio/theme-rtl.css 126 B
build/block-library/blocks/audio/theme.css 126 B
build/block-library/blocks/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 104 B
build/block-library/blocks/avatar/style.css 104 B
build/block-library/blocks/block/editor-rtl.css 305 B
build/block-library/blocks/block/editor.css 305 B
build/block-library/blocks/button/editor-rtl.css 584 B
build/block-library/blocks/button/editor.css 582 B
build/block-library/blocks/button/style-rtl.css 629 B
build/block-library/blocks/button/style.css 628 B
build/block-library/blocks/buttons/editor-rtl.css 337 B
build/block-library/blocks/buttons/editor.css 337 B
build/block-library/blocks/buttons/style-rtl.css 332 B
build/block-library/blocks/buttons/style.css 332 B
build/block-library/blocks/calendar/style-rtl.css 239 B
build/block-library/blocks/calendar/style.css 239 B
build/block-library/blocks/categories/editor-rtl.css 113 B
build/block-library/blocks/categories/editor.css 112 B
build/block-library/blocks/categories/style-rtl.css 124 B
build/block-library/blocks/categories/style.css 124 B
build/block-library/blocks/code/editor-rtl.css 53 B
build/block-library/blocks/code/editor.css 53 B
build/block-library/blocks/code/style-rtl.css 121 B
build/block-library/blocks/code/style.css 121 B
build/block-library/blocks/code/theme-rtl.css 124 B
build/block-library/blocks/code/theme.css 124 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 421 B
build/block-library/blocks/columns/style.css 421 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-content/style-rtl.css 92 B
build/block-library/blocks/comment-content/style.css 92 B
build/block-library/blocks/comment-template/style-rtl.css 199 B
build/block-library/blocks/comment-template/style.css 198 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/comments-title/editor-rtl.css 75 B
build/block-library/blocks/comments-title/editor.css 75 B
build/block-library/blocks/comments/editor-rtl.css 840 B
build/block-library/blocks/comments/editor.css 839 B
build/block-library/blocks/comments/style-rtl.css 637 B
build/block-library/blocks/comments/style.css 636 B
build/block-library/blocks/cover/editor-rtl.css 647 B
build/block-library/blocks/cover/editor.css 650 B
build/block-library/blocks/cover/style-rtl.css 1.63 kB
build/block-library/blocks/cover/style.css 1.62 kB
build/block-library/blocks/details/editor-rtl.css 65 B
build/block-library/blocks/details/editor.css 65 B
build/block-library/blocks/details/style-rtl.css 98 B
build/block-library/blocks/details/style.css 98 B
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 410 B
build/block-library/blocks/embed/style.css 410 B
build/block-library/blocks/embed/theme-rtl.css 126 B
build/block-library/blocks/embed/theme.css 126 B
build/block-library/blocks/file/editor-rtl.css 316 B
build/block-library/blocks/file/editor.css 316 B
build/block-library/blocks/file/style-rtl.css 280 B
build/block-library/blocks/file/style.css 281 B
build/block-library/blocks/file/view-interactivity.min.js 317 B
build/block-library/blocks/file/view.min.js 375 B
build/block-library/blocks/footnotes/style-rtl.css 201 B
build/block-library/blocks/footnotes/style.css 199 B
build/block-library/blocks/freeform/editor-rtl.css 2.61 kB
build/block-library/blocks/freeform/editor.css 2.61 kB
build/block-library/blocks/gallery/editor-rtl.css 947 B
build/block-library/blocks/gallery/editor.css 952 B
build/block-library/blocks/gallery/style-rtl.css 1.53 kB
build/block-library/blocks/gallery/style.css 1.53 kB
build/block-library/blocks/gallery/theme-rtl.css 108 B
build/block-library/blocks/gallery/theme.css 108 B
build/block-library/blocks/group/editor-rtl.css 654 B
build/block-library/blocks/group/editor.css 654 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 76 B
build/block-library/blocks/heading/style.css 76 B
build/block-library/blocks/html/editor-rtl.css 336 B
build/block-library/blocks/html/editor.css 337 B
build/block-library/blocks/image/editor-rtl.css 834 B
build/block-library/blocks/image/editor.css 833 B
build/block-library/blocks/image/style-rtl.css 1.42 kB
build/block-library/blocks/image/style.css 1.41 kB
build/block-library/blocks/image/theme-rtl.css 126 B
build/block-library/blocks/image/theme.css 126 B
build/block-library/blocks/image/view-interactivity.min.js 1.83 kB
build/block-library/blocks/latest-comments/style-rtl.css 357 B
build/block-library/blocks/latest-comments/style.css 357 B
build/block-library/blocks/latest-posts/editor-rtl.css 213 B
build/block-library/blocks/latest-posts/editor.css 212 B
build/block-library/blocks/latest-posts/style-rtl.css 478 B
build/block-library/blocks/latest-posts/style.css 478 B
build/block-library/blocks/list/style-rtl.css 88 B
build/block-library/blocks/list/style.css 88 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 505 B
build/block-library/blocks/media-text/style.css 503 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 712 B
build/block-library/blocks/navigation-link/editor.css 711 B
build/block-library/blocks/navigation-link/style-rtl.css 115 B
build/block-library/blocks/navigation-link/style.css 115 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 296 B
build/block-library/blocks/navigation-submenu/editor.css 295 B
build/block-library/blocks/navigation/editor-rtl.css 2.26 kB
build/block-library/blocks/navigation/editor.css 2.26 kB
build/block-library/blocks/navigation/style-rtl.css 2.23 kB
build/block-library/blocks/navigation/style.css 2.22 kB
build/block-library/blocks/navigation/view-interactivity.min.js 988 B
build/block-library/blocks/navigation/view-modal.min.js 2.85 kB
build/block-library/blocks/navigation/view.min.js 469 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 401 B
build/block-library/blocks/page-list/editor.css 401 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 174 B
build/block-library/blocks/paragraph/editor.css 174 B
build/block-library/blocks/paragraph/style-rtl.css 279 B
build/block-library/blocks/paragraph/style.css 281 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 B
build/block-library/blocks/post-comments-form/editor-rtl.css 96 B
build/block-library/blocks/post-comments-form/editor.css 96 B
build/block-library/blocks/post-comments-form/style-rtl.css 508 B
build/block-library/blocks/post-comments-form/style.css 508 B
build/block-library/blocks/post-date/style-rtl.css 61 B
build/block-library/blocks/post-date/style.css 61 B
build/block-library/blocks/post-excerpt/editor-rtl.css 71 B
build/block-library/blocks/post-excerpt/editor.css 71 B
build/block-library/blocks/post-excerpt/style-rtl.css 141 B
build/block-library/blocks/post-excerpt/style.css 141 B
build/block-library/blocks/post-featured-image/editor-rtl.css 588 B
build/block-library/blocks/post-featured-image/editor.css 586 B
build/block-library/blocks/post-featured-image/style-rtl.css 319 B
build/block-library/blocks/post-featured-image/style.css 319 B
build/block-library/blocks/post-navigation-link/style-rtl.css 153 B
build/block-library/blocks/post-navigation-link/style.css 153 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 314 B
build/block-library/blocks/post-template/style.css 314 B
build/block-library/blocks/post-terms/style-rtl.css 96 B
build/block-library/blocks/post-terms/style.css 96 B
build/block-library/blocks/post-time-to-read/style-rtl.css 69 B
build/block-library/blocks/post-time-to-read/style.css 69 B
build/block-library/blocks/post-title/style-rtl.css 100 B
build/block-library/blocks/post-title/style.css 100 B
build/block-library/blocks/preformatted/style-rtl.css 125 B
build/block-library/blocks/preformatted/style.css 125 B
build/block-library/blocks/pullquote/editor-rtl.css 135 B
build/block-library/blocks/pullquote/editor.css 135 B
build/block-library/blocks/pullquote/style-rtl.css 335 B
build/block-library/blocks/pullquote/style.css 335 B
build/block-library/blocks/pullquote/theme-rtl.css 168 B
build/block-library/blocks/pullquote/theme.css 168 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 302 B
build/block-library/blocks/query-pagination/style.css 299 B
build/block-library/blocks/query-title/style-rtl.css 63 B
build/block-library/blocks/query-title/style.css 63 B
build/block-library/blocks/query/editor-rtl.css 450 B
build/block-library/blocks/query/editor.css 449 B
build/block-library/blocks/quote/style-rtl.css 222 B
build/block-library/blocks/quote/style.css 222 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/read-more/style-rtl.css 132 B
build/block-library/blocks/read-more/style.css 132 B
build/block-library/blocks/rss/editor-rtl.css 149 B
build/block-library/blocks/rss/editor.css 149 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 178 B
build/block-library/blocks/search/editor.css 178 B
build/block-library/blocks/search/style-rtl.css 607 B
build/block-library/blocks/search/style.css 607 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 B
build/block-library/blocks/search/view.min.js 631 B
build/block-library/blocks/separator/editor-rtl.css 146 B
build/block-library/blocks/separator/editor.css 146 B
build/block-library/blocks/separator/style-rtl.css 234 B
build/block-library/blocks/separator/style.css 234 B
build/block-library/blocks/separator/theme-rtl.css 194 B
build/block-library/blocks/separator/theme.css 194 B
build/block-library/blocks/shortcode/editor-rtl.css 323 B
build/block-library/blocks/shortcode/editor.css 323 B
build/block-library/blocks/site-logo/editor-rtl.css 754 B
build/block-library/blocks/site-logo/editor.css 754 B
build/block-library/blocks/site-logo/style-rtl.css 204 B
build/block-library/blocks/site-logo/style.css 204 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 116 B
build/block-library/blocks/site-title/editor.css 116 B
build/block-library/blocks/site-title/style-rtl.css 57 B
build/block-library/blocks/site-title/style.css 57 B
build/block-library/blocks/social-link/editor-rtl.css 184 B
build/block-library/blocks/social-link/editor.css 184 B
build/block-library/blocks/social-links/editor-rtl.css 682 B
build/block-library/blocks/social-links/editor.css 681 B
build/block-library/blocks/social-links/style-rtl.css 1.44 kB
build/block-library/blocks/social-links/style.css 1.43 kB
build/block-library/blocks/spacer/editor-rtl.css 348 B
build/block-library/blocks/spacer/editor.css 348 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 432 B
build/block-library/blocks/table/editor.css 432 B
build/block-library/blocks/table/style-rtl.css 639 B
build/block-library/blocks/table/style.css 639 B
build/block-library/blocks/table/theme-rtl.css 146 B
build/block-library/blocks/table/theme.css 146 B
build/block-library/blocks/tag-cloud/style-rtl.css 251 B
build/block-library/blocks/tag-cloud/style.css 253 B
build/block-library/blocks/template-part/editor-rtl.css 403 B
build/block-library/blocks/template-part/editor.css 403 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/term-description/style-rtl.css 111 B
build/block-library/blocks/term-description/style.css 111 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 99 B
build/block-library/blocks/verse/style.css 99 B
build/block-library/blocks/video/editor-rtl.css 552 B
build/block-library/blocks/video/editor.css 555 B
build/block-library/blocks/video/style-rtl.css 185 B
build/block-library/blocks/video/style.css 185 B
build/block-library/blocks/video/theme-rtl.css 126 B
build/block-library/blocks/video/theme.css 126 B
build/block-library/classic-rtl.css 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.1 kB
build/block-library/common.css 1.1 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/editor-rtl.css 12.1 kB
build/block-library/editor.css 12.1 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/style-rtl.css 13.8 kB
build/block-library/style.css 13.8 kB
build/block-library/theme-rtl.css 688 B
build/block-library/theme.css 693 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.87 kB
build/blocks/index.min.js 51.2 kB
build/commands/index.min.js 15.5 kB
build/commands/style-rtl.css 932 B
build/commands/style.css 929 B
build/components/index.min.js 245 kB
build/components/style-rtl.css 11.8 kB
build/components/style.css 11.8 kB
build/compose/index.min.js 12.1 kB
build/core-commands/index.min.js 2.72 kB
build/core-data/index.min.js 16.8 kB
build/customize-widgets/index.min.js 12 kB
build/customize-widgets/style-rtl.css 1.46 kB
build/customize-widgets/style.css 1.45 kB
build/data-controls/index.min.js 640 B
build/data/index.min.js 8.38 kB
build/date/index.min.js 17.8 kB
build/deprecated/index.min.js 451 B
build/dom-ready/index.min.js 324 B
build/dom/index.min.js 4.64 kB
build/edit-post/classic-rtl.css 544 B
build/edit-post/classic.css 545 B
build/edit-post/index.min.js 35.4 kB
build/edit-post/style-rtl.css 7.62 kB
build/edit-post/style.css 7.62 kB
build/edit-site/index.min.js 91.1 kB
build/edit-site/style-rtl.css 13.2 kB
build/edit-site/style.css 13.2 kB
build/edit-widgets/index.min.js 16.9 kB
build/edit-widgets/style-rtl.css 4.52 kB
build/edit-widgets/style.css 4.52 kB
build/editor/index.min.js 45.5 kB
build/editor/style-rtl.css 3.53 kB
build/editor/style.css 3.52 kB
build/element/index.min.js 4.82 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 7.59 kB
build/format-library/style-rtl.css 554 B
build/format-library/style.css 553 B
build/hooks/index.min.js 1.55 kB
build/html-entities/index.min.js 448 B
build/i18n/index.min.js 3.58 kB
build/interactivity/index.min.js 10.4 kB
build/is-shallow-equal/index.min.js 527 B
build/keyboard-shortcuts/index.min.js 1.64 kB
build/keycodes/index.min.js 1.87 kB
build/list-reusable-blocks/index.min.js 2.2 kB
build/list-reusable-blocks/style-rtl.css 836 B
build/list-reusable-blocks/style.css 836 B
build/media-utils/index.min.js 2.9 kB
build/notices/index.min.js 948 B
build/nux/index.min.js 1.99 kB
build/nux/style-rtl.css 735 B
build/nux/style.css 732 B
build/patterns/index.min.js 2.71 kB
build/patterns/style-rtl.css 240 B
build/patterns/style.css 240 B
build/plugins/index.min.js 1.79 kB
build/preferences-persistence/index.min.js 1.84 kB
build/preferences/index.min.js 1.24 kB
build/primitives/index.min.js 943 B
build/priority-queue/index.min.js 1.52 kB
build/private-apis/index.min.js 958 B
build/react-i18n/index.min.js 615 B
build/react-refresh-entry/index.min.js 9.47 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.7 kB
build/reusable-blocks/index.min.js 2.7 kB
build/reusable-blocks/style-rtl.css 243 B
build/reusable-blocks/style.css 243 B
build/rich-text/index.min.js 11 kB
build/router/index.min.js 1.78 kB
build/server-side-render/index.min.js 1.94 kB
build/shortcode/index.min.js 1.39 kB
build/style-engine/index.min.js 1.85 kB
build/sync/index.min.js 53.8 kB
build/token-list/index.min.js 582 B
build/url/index.min.js 3.73 kB
build/vendors/inert-polyfill.min.js 2.48 kB
build/vendors/react-dom.min.js 41.8 kB
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 958 B
build/warning/index.min.js 249 B
build/widgets/index.min.js 7.16 kB
build/widgets/style-rtl.css 1.15 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.02 kB

compressed-size-action

@getdave
Copy link
Contributor Author

getdave commented Jan 4, 2023

The problem here is now that if you enter custom label text for your link it will be overwritten again by the data returned from the API.

We need to

  • respect the label if the user has provided it directly
  • still update the label if it is the default one originally set on the link and needs to be updated to match the changes to the referenced post entity

To do this we probably never actually want to set either label or url as an attribute for the block when initially creating the Link using the Link Control. Rather we should always retrieve these dynamically from the post entity.

Then if there is an existing label attribute we can assume this has been set manually by the user and thus should be considered canonical and should not be overwritten with updates from the entity.

@getdave
Copy link
Contributor Author

getdave commented Jan 4, 2023

We should probably also disallowed custom editing of the Link if the link is dynamically generated from the ID. Rather we should simply force LinkControl to show the value of the link but not allow you to edit it.

This would be consistent because it will be very confusing to be able to edit a link which references an entity whilst also having that link dynamically kept in sync with the underlying entity.

@getdave
Copy link
Contributor Author

getdave commented Jan 4, 2023

We will also have to make the same dynamic look up for other types of referenced entities such as terms and media (basically anything supported by LinkControl).

// If the new link value has an ID then it's an internal link so do not set the URL.
// This will be dynamically generated from the ID.
// Passed `url` may already be encoded. To prevent double encoding, decodeURI is executed to revert to the original string.
const updatedUrl =
Copy link
Contributor Author

Choose a reason for hiding this comment

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

This causes the LinkControl to display the Link to empty message when you first pick a link and the post hasn't yet resolved.

@scruffian
Copy link
Contributor

The experience I get with this is that when I edit the link name and then save, the nav is refreshed and my changes are lost:

Screen.Recording.2023-01-06.at.17.00.03.mov

@scruffian
Copy link
Contributor

The way I would expect this to work is that the editing experience would be the same as the creation experience.

When I create a new link I see this:
Screenshot 2023-01-06 at 17 02 23

But then when I edit I am given an interface like this:
Screenshot 2023-01-06 at 17 02 34

While it is useful to be able to edit these details, I think it should be a secondary action - the primary action should be to return me to the same view as when I created the link, with a search box and a list of pages to select from...

@scruffian
Copy link
Contributor

Here's an idea to get the ball rolling:
Screenshot 2023-01-06 at 18 50 17

@scruffian
Copy link
Contributor

Pinging @jasmussen @jameskoster and @SaxonF for some input!

@getdave
Copy link
Contributor Author

getdave commented Jan 9, 2023

Just a note to say I think the design problem that needs consideration is how the Link Control interface can display the state of a selected "entity". For example, if you search and then select a Page from the list of results then how does the edit interface look for that? Should it differ from the example where you have manually entered a URL (e.g. www.google.com)?

The objective is that if a link is to an internal WP entity (e.g. a Post) then that URL of that link should be dynamically retrieved and displayed. Currently the code and UX of the Link UI relies on a URL and will fail if one isn't provided. Therefore whilst we look up the URL the Link Control interface looks broken.

We need a means of communicating "this link is to an entity" vs "this link is a manually entered URL".

I advise testing this PR as it will showcase some of the issues which can be difficult to describe in text form.

@getdave getdave added Needs Design Feedback Needs general design feedback. Needs Design Needs design efforts. labels Jan 9, 2023
@jameskoster
Copy link
Contributor

For example, if you search and then select a Page from the list of results then how does the edit interface look for that? Should it differ from the example where you have manually entered a URL (e.g. www.google.com)?

My instinct is yes, they should be different. Internal content should probably have a more token-like apperance and not be editable at all (except to swap entries). Whereas a custom link should just be inputs. At the moment both are mixed which I agree feels a bit flaky.

@jasmussen
Copy link
Contributor

It seems like the issue at hand would be improved by this design:

URL dialogs i3

That is, each item is more of a "token" you link to, rather than just a loose association between title and URL. I think I shared this design also on a link dialog issue, but I forgot which one. In case one of you remember, I'd appreciate it 🙏

@jasmussen jasmussen removed Needs Design Feedback Needs general design feedback. Needs Design Needs design efforts. labels Jan 13, 2023
@getdave
Copy link
Contributor Author

getdave commented Jan 17, 2023

That is, each item is more of a "token" you link to, rather than just a loose association between title and URL.

I agree with this 👍

The designs are a good step. They focus on the link creation UI.

However, from an implementation perspective what I'd really find useful to see are the states for when

  • a "token" has been selected.
  • a "token" is being edited (having already created it)

🙇

@SaxonF
Copy link
Contributor

SaxonF commented Jan 17, 2023

However, from an implementation perspective what I'd really find useful to see are the states for when

I can look at this. @jasmussen any chance you can find the Figma for the above?

@SaxonF
Copy link
Contributor

SaxonF commented Jan 17, 2023

Quick pass at the edit link UI. This just adjusts so url field value acts more like a token rather than input, and after clicking edit we use the existing UI for entering page/url value. OnBlur reverts back to current page.

edit-link-demo.mp4

@getdave getdave force-pushed the try/syncing-nav-block-url-and-title branch from 397d7a9 to 51fbbaf Compare January 17, 2023 08:11
@jasmussen
Copy link
Contributor

I can look at this. @jasmussen any chance you can find the Figma for the above?

Yes, this is the Figma file I worked in, but feel free to extract it somewhere more ergonomic.

@jasmussen
Copy link
Contributor

Your quick pass looks good!

It reminds me we could benefit from a new edit icon that works a bit better in these utilitarian contexts. I made this one for a separate conversation, but I'm not sure it still threads the needle:

edit-small

Something to look at separately.

Do we need to show the URL in the "resting" state? If there's an affordance to edit it, perhaps just Page icon plus "Home" label would make it feel more like a token as discussed? Can always show the URL as a tooltip if need be.

We probably shouldn't change the popover appearance (border, shadow, radius) as part of this effort, can discuss that separately if need be. Nice work!

@jameskoster
Copy link
Contributor

Here's an updated concept considering some of the other items listed in #35073:

Link Control

  • I’ve removed the “Create new page” flow because I think that’s better served elsewhere, but it’s easy to add back if there are strong feelings.
  • Apply / Cancel buttons provide better understanding of how to confirm or discard changes, and address some a11y issues.
  • Settings section provides a home for the options we want to add, and for third parties to extend.
  • Added a "Target" dropdown rather than having separate switches for "Open in a new tab" and "Nofollow", but separate switches could work as an interim.

How do we feel about this? Does the cog work for the settings toggle button, or should we use the Settings icon? In terms of size, I used 36px to match the Apply/Cancel buttons, but I think there's a movement towards 32px or 40px for these controls... what do you think @jasmussen?

@getdave
Copy link
Contributor Author

getdave commented Jan 20, 2023

I now centralised all design discussion in #47310

@jasmussen

This comment was marked as off-topic.

@getdave
Copy link
Contributor Author

getdave commented Aug 25, 2023

Coming back to this. Here are the requirements to allow for these dynamic updates.

The UI needs to reflect the fact that if you select a link to a Post entity (e.g. Page, Post...etc) you have linked to something which is a reference to that post. Therefore in this state, this means the URL field should become read-only and no editing should be allowed. Moreover, the UI should communicate that you have linked to a Post object and not just a manually entered URL (such as www.google.com).

This UX would mean that if the URL of the referenced post changes then it's simple for us to dynamically update the URL that's shown in the interface.

Now if the user opts to edit the URL field then that could be allowed but it would cause the link to the Post to be severed and from that point it would be a non-dynamic link.

@getdave getdave force-pushed the try/syncing-nav-block-url-and-title branch from 51fbbaf to f8a1cfb Compare August 25, 2023 14:15
@github-actions
Copy link

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

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

@getdave
Copy link
Contributor Author

getdave commented Aug 25, 2023

@SaxonF Are you still happy with the design route from #46891 (comment)?

cc @richtabor

@cbirdsong
Copy link

Would it be possible to add an anchor to a link while keeping it dynamic?

@SaxonF
Copy link
Contributor

SaxonF commented Aug 28, 2023

@getdave Im not completely up to date with the Link UI but #49091 (comment) is the more recent interpretation of that concept. ie input becomes a dynamic token where appropriate.

@richtabor is probably the better person to make a decision on whether that approach still makes sense or not. (sorry Rich :D )

@getdave
Copy link
Contributor Author

getdave commented Aug 29, 2023

Would it be possible to add an anchor to a link while keeping it dynamic?

This is a very good point and one which would require careful consideration. Thank you.

@getdave getdave requested a review from richtabor August 29, 2023 10:32
@getdave getdave added [Type] Feature New feature to highlight in changelogs. [Feature] Link Editing Link components (LinkControl, URLInput) and integrations (RichText link formatting) labels Aug 29, 2023
@getdave
Copy link
Contributor Author

getdave commented Aug 29, 2023

The UX infrastructure we put in place in this PR will also allow this to be rolled out to the rich text implementation of links.

@warudin
Copy link

warudin commented Aug 29, 2023

The current solution is mainly focused on the core/navigation block.

Therefore I am wondering about two things:

  • Will this approach also fix the same problems in other places that use the LinkControl element? Like post content and core/button?
  • Will the solution be "backwards compatible" for links that are already added to the content?
    • Will the available data be sufficient to find the correct post?
    • Do we even want the already added links to be backwards compatible (I'd think so but maybe there are arguments against this)

@getdave
Copy link
Contributor Author

getdave commented Sep 25, 2023

Next steps here are to continue to enhance the Link UI with support for links which represent an entity. In such circumstances the URL field should be disabled.

The main blocker is how to allow authors to add a internal anchor link to a link of this type without severing the connection to the entity.

We also need to consider how this might apply to other scenarios outside of Navigation such as inline links in Rich Text which also save an id attribute representing the underlying post object.

@getdave
Copy link
Contributor Author

getdave commented Nov 21, 2023

Noting that an alternative approach might be to take advantage of the proposed attribute sources in the Blocks API to connect the various block attributes with the equivalent Post fields

#54536

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Block] Navigation Affects the Navigation Block [Feature] Link Editing Link components (LinkControl, URLInput) and integrations (RichText link formatting) [Type] Feature New feature to highlight in changelogs.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

NavigationLink: make the URL dynamic for links to Posts
7 participants