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

Inserter: Prevent non-deterministic order of inserter items #34078

Merged
merged 4 commits into from
Aug 17, 2021

Conversation

fluiddot
Copy link
Contributor

@fluiddot fluiddot commented Aug 13, 2021

This PR takes the changes created by @ttahmouch from PR #34062, thanks for the help on this ❤️!

Description

We've noticed that using the function Array.prototype.sort can produce different results on the native version, actually on Android due to the use of Hermes, it's generating a different list than iOS (which uses javascriptcore). Per the documentation of the function, it looks like the function itself is not stable until ES2019 so it would be nice to figure out a replacement to prevent non-deterministic results.

Specifically, we've identified this issue in the getInserterItems selector (reference), so a solution has been applied for this purpose by replacing the use of sort with the calculation of the core and non-core block lists using reduce. This directly affects the logic related to prioritizing core blocks' display in the inserter menu.

How has this been tested?

Unit test

Block variations case has been added to the unit test "getInserterItems with core blocks prioritization" to assure the proper order of blocks in the inserter menu.

Web version

Verify that inserter items order match the production version

For this purpose, we can compare the current order of a WP.com site with a local instance of Gutenberg using the changes from this PR.

  1. Run Gutenberg locally using the changes from this PR.
  2. Open a post/page.
  3. Open the inserter menu by clicking on ➕ button located in the top toolbar.

Screenshot 2021-08-16 at 19 35 19

  1. In a different tab, navigate to a WP.com site.
  2. Open a post/page.
  3. Open the inserter menu by clicking on ➕ button located in the top toolbar.
  4. Compare both inserter menus (local instance and WP.com site) and verify that are displaying the inserter items in the same order.

NOTE: In a WP.com site the inserter menu shows more items than a local instance, however, the extra items should always be displayed at the end of the list.

Additionally, we should verify that the inserter menu displayed within the blocks matches the same order as the blocks are registered.

  1. Run Gutenberg locally using the changes from this PR.
  2. Open a post/page on incognito mode (NOTE: Incognito mode is required to prevent displaying suggested items).
  3. Select a block and open the inserter menu by clicking on ➕ button.

Screenshot 2021-08-16 at 19 35 14

  1. Verify that the inserter items are sorted in the same order as the blocks are registered.
    // Common blocks are grouped at the top to prioritize their display
    // in various contexts — like the inserter and auto-complete components.
    paragraph,
    image,
    heading,
    gallery,
    list,
    quote,
    // Register all remaining core blocks.
    shortcode,
    archives,
    audio,
    button,
    buttons,
    calendar,
    categories,
    code,
    columns,
    column,
    cover,
    embed,
    file,
    group,
    window.wp && window.wp.oldEditor ? classic : null, // Only add the classic block in WP Context
    html,
    mediaText,
    latestComments,
    latestPosts,
    missing,
    more,
    nextpage,
    pageList,
    preformatted,
    pullquote,
    rss,
    search,
    separator,
    reusableBlock,
    socialLinks,
    socialLink,
    spacer,
    table,
    // tableOfContents,
    tagCloud,
    textColumns,
    verse,
    video,
    // Theme blocks
    siteLogo,
    siteTagline,
    siteTitle,
    query,
    postTemplate,
    queryTitle,
    queryPagination,
    queryPaginationNext,
    queryPaginationNumbers,
    queryPaginationPrevious,
    postTitle,
    postContent,
    postDate,
    postExcerpt,
    postFeaturedImage,
    postTerms,
    logInOut,

Native version

Similar to the web version, we have to verify that the inserter items order remains the same as in the production version, in this case, we would need to use the iOS version because the Android one is not displaying the correct order. Additionally, we need to verify that both iOS and Android versions display the same order.

Verify that inserter items order match the production version

  1. Download and install the last version of the WordPress app from the Appstore on an iOS device.
  2. Open a post/page.
  3. Open the inserter menu by tapping on ➕ button.
  4. (On a different iOS device) Open the app and use the changes from this PR by connecting it to a local Metro server.
  5. Open a post/page.
  6. Open the inserter menu by tapping on ➕ button.
  7. Compare both inserter menus (iOS production version and iOS local version) and verify that are displaying the inserter items in the same order.

Verify IOS and Android match the inserter items order

  1. Open the app on iOS.
  2. Open a post/page.
  3. Open the inserter menu by tapping on ➕ button.
  4. (On an Android device) Open the app.
  5. Open a post/page.
  6. Open the inserter menu by tapping on ➕ button.
  7. Compare both inserter menus (iOS and Android) and verify that are displaying the inserter items in the same order.
  8. Verify that the inserter items are sorted in the same order as the blocks are registered.
    paragraph,
    heading,
    devOnly( code ),
    missing,
    more,
    image,
    video,
    nextpage,
    separator,
    list,
    quote,
    mediaText,
    preformatted,
    gallery,
    columns,
    column,
    group,
    classic,
    button,
    spacer,
    shortcode,
    buttons,
    latestPosts,
    verse,
    cover,
    socialLink,
    socialLinks,
    pullquote,
    file,
    audio,
    reusableBlock,
    search,
    embed,

NOTE: The following blocks are not displayed in the inserter menu:

  • missing
  • column
  • classic
  • button
  • socialLink
  • reusableBlock

The block core/search is displayed at the bottom because it's being included as a core variant.

const variations = [
{
name: 'default',
isDefault: true,
attributes: { buttonText: __( 'Search' ), label: __( 'Search' ) },
},
];

Screenshots

iOS Android

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

@github-actions
Copy link

github-actions bot commented Aug 13, 2021

Size Change: +111 B (0%)

Total Size: 1.03 MB

Filename Size Change
build/block-editor/index.min.js 118 kB +59 B (0%)
build/block-editor/style-rtl.css 13.8 kB -28 B (0%)
build/block-editor/style.css 13.8 kB -24 B (0%)
build/block-library/blocks/post-featured-image/editor-rtl.css 398 B -14 B (-3%)
build/block-library/blocks/post-featured-image/editor.css 398 B -14 B (-3%)
build/block-library/editor-rtl.css 9.39 kB +7 B (0%)
build/block-library/editor.css 9.37 kB +7 B (0%)
build/block-library/index.min.js 147 kB +4 B (0%)
build/components/index.min.js 209 kB +114 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 931 B
build/admin-manifest/index.min.js 1.09 kB
build/annotations/index.min.js 2.7 kB
build/api-fetch/index.min.js 2.19 kB
build/autop/index.min.js 2.08 kB
build/blob/index.min.js 459 B
build/block-directory/index.min.js 6.21 kB
build/block-directory/style-rtl.css 1.01 kB
build/block-directory/style.css 1.01 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 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 474 B
build/block-library/blocks/button/editor.css 474 B
build/block-library/blocks/button/style-rtl.css 605 B
build/block-library/blocks/button/style.css 604 B
build/block-library/blocks/buttons/editor-rtl.css 315 B
build/block-library/blocks/buttons/editor.css 315 B
build/block-library/blocks/buttons/style-rtl.css 370 B
build/block-library/blocks/buttons/style.css 370 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 131 B
build/block-library/blocks/code/theme.css 131 B
build/block-library/blocks/columns/editor-rtl.css 194 B
build/block-library/blocks/columns/editor.css 193 B
build/block-library/blocks/columns/style-rtl.css 474 B
build/block-library/blocks/columns/style.css 475 B
build/block-library/blocks/cover/editor-rtl.css 666 B
build/block-library/blocks/cover/editor.css 670 B
build/block-library/blocks/cover/style-rtl.css 1.23 kB
build/block-library/blocks/cover/style.css 1.23 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 400 B
build/block-library/blocks/embed/style.css 400 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 707 B
build/block-library/blocks/gallery/editor.css 706 B
build/block-library/blocks/gallery/style-rtl.css 1.05 kB
build/block-library/blocks/gallery/style.css 1.05 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 93 B
build/block-library/blocks/group/theme.css 93 B
build/block-library/blocks/heading/editor-rtl.css 152 B
build/block-library/blocks/heading/editor.css 152 B
build/block-library/blocks/heading/style-rtl.css 76 B
build/block-library/blocks/heading/style.css 76 B
build/block-library/blocks/home-link/style-rtl.css 247 B
build/block-library/blocks/home-link/style.css 247 B
build/block-library/blocks/html/editor-rtl.css 283 B
build/block-library/blocks/html/editor.css 284 B
build/block-library/blocks/image/editor-rtl.css 728 B
build/block-library/blocks/image/editor.css 728 B
build/block-library/blocks/image/style-rtl.css 482 B
build/block-library/blocks/image/style.css 487 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 63 B
build/block-library/blocks/list/style.css 63 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 488 B
build/block-library/blocks/media-text/style.css 485 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 474 B
build/block-library/blocks/navigation-link/editor.css 474 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/editor-rtl.css 1.69 kB
build/block-library/blocks/navigation/editor.css 1.69 kB
build/block-library/blocks/navigation/style-rtl.css 1.65 kB
build/block-library/blocks/navigation/style.css 1.64 kB
build/block-library/blocks/navigation/view.min.js 2.52 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 310 B
build/block-library/blocks/page-list/editor.css 310 B
build/block-library/blocks/page-list/style-rtl.css 242 B
build/block-library/blocks/page-list/style.css 242 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 248 B
build/block-library/blocks/paragraph/style.css 248 B
build/block-library/blocks/post-author/editor-rtl.css 210 B
build/block-library/blocks/post-author/editor.css 210 B
build/block-library/blocks/post-author/style-rtl.css 182 B
build/block-library/blocks/post-author/style.css 181 B
build/block-library/blocks/post-comments-form/style-rtl.css 140 B
build/block-library/blocks/post-comments-form/style.css 140 B
build/block-library/blocks/post-comments/style-rtl.css 360 B
build/block-library/blocks/post-comments/style.css 359 B
build/block-library/blocks/post-content/editor-rtl.css 138 B
build/block-library/blocks/post-content/editor.css 138 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/style-rtl.css 143 B
build/block-library/blocks/post-featured-image/style.css 143 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 378 B
build/block-library/blocks/post-template/style.css 379 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 60 B
build/block-library/blocks/post-title/style.css 60 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 361 B
build/block-library/blocks/pullquote/style.css 360 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 270 B
build/block-library/blocks/query-pagination/editor.css 262 B
build/block-library/blocks/query-pagination/style-rtl.css 168 B
build/block-library/blocks/query-pagination/style.css 168 B
build/block-library/blocks/query-title/editor-rtl.css 85 B
build/block-library/blocks/query-title/editor.css 85 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 169 B
build/block-library/blocks/quote/style.css 169 B
build/block-library/blocks/quote/theme-rtl.css 220 B
build/block-library/blocks/quote/theme.css 222 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 374 B
build/block-library/blocks/search/style.css 375 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 250 B
build/block-library/blocks/separator/style.css 250 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 462 B
build/block-library/blocks/site-logo/editor.css 464 B
build/block-library/blocks/site-logo/style-rtl.css 153 B
build/block-library/blocks/site-logo/style.css 153 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 165 B
build/block-library/blocks/social-link/editor.css 165 B
build/block-library/blocks/social-links/editor-rtl.css 812 B
build/block-library/blocks/social-links/editor.css 811 B
build/block-library/blocks/social-links/style-rtl.css 1.33 kB
build/block-library/blocks/social-links/style.css 1.33 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 636 B
build/block-library/blocks/template-part/editor.css 635 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/editor-rtl.css 90 B
build/block-library/blocks/term-description/editor.css 90 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 832 B
build/block-library/common.css 830 B
build/block-library/reset-rtl.css 527 B
build/block-library/reset.css 527 B
build/block-library/style-rtl.css 9.78 kB
build/block-library/style.css 9.79 kB
build/block-library/theme-rtl.css 688 B
build/block-library/theme.css 692 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 47 kB
build/components/style-rtl.css 15.7 kB
build/components/style.css 15.8 kB
build/compose/index.min.js 10.2 kB
build/core-data/index.min.js 12.3 kB
build/customize-widgets/index.min.js 10.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 614 B
build/data/index.min.js 7.03 kB
build/date/index.min.js 31.5 kB
build/deprecated/index.min.js 428 B
build/dom-ready/index.min.js 304 B
build/dom/index.min.js 4.53 kB
build/edit-navigation/index.min.js 13.4 kB
build/edit-navigation/style-rtl.css 3.1 kB
build/edit-navigation/style.css 3.1 kB
build/edit-post/classic-rtl.css 492 B
build/edit-post/classic.css 494 B
build/edit-post/index.min.js 28.4 kB
build/edit-post/style-rtl.css 7.18 kB
build/edit-post/style.css 7.17 kB
build/edit-site/index.min.js 25.9 kB
build/edit-site/style-rtl.css 5.01 kB
build/edit-site/style.css 5.01 kB
build/edit-widgets/index.min.js 15.9 kB
build/edit-widgets/style-rtl.css 4.01 kB
build/edit-widgets/style.css 4.02 kB
build/editor/index.min.js 37.5 kB
build/editor/style-rtl.css 3.92 kB
build/editor/style.css 3.91 kB
build/element/index.min.js 3.16 kB
build/escape-html/index.min.js 517 B
build/format-library/index.min.js 5.36 kB
build/format-library/style-rtl.css 668 B
build/format-library/style.css 669 B
build/hooks/index.min.js 1.55 kB
build/html-entities/index.min.js 424 B
build/i18n/index.min.js 3.59 kB
build/is-shallow-equal/index.min.js 501 B
build/keyboard-shortcuts/index.min.js 1.49 kB
build/keycodes/index.min.js 1.25 kB
build/list-reusable-blocks/index.min.js 1.85 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.88 kB
build/notices/index.min.js 845 B
build/nux/index.min.js 2.03 kB
build/nux/style-rtl.css 747 B
build/nux/style.css 743 B
build/plugins/index.min.js 1.83 kB
build/primitives/index.min.js 921 B
build/priority-queue/index.min.js 582 B
build/react-i18n/index.min.js 671 B
build/redux-routine/index.min.js 2.63 kB
build/reusable-blocks/index.min.js 2.28 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 10.6 kB
build/server-side-render/index.min.js 1.32 kB
build/shortcode/index.min.js 1.48 kB
build/token-list/index.min.js 562 B
build/url/index.min.js 1.72 kB
build/viewport/index.min.js 1.02 kB
build/warning/index.min.js 248 B
build/widgets/index.min.js 6.27 kB
build/widgets/style-rtl.css 1.04 kB
build/widgets/style.css 1.04 kB
build/wordcount/index.min.js 1.04 kB

compressed-size-action

@ttahmouch
Copy link
Contributor

The test seems reasonable to me, @fluiddot .

@fluiddot fluiddot added [Type] Bug An existing feature does not function as intended and removed [Type] Enhancement A suggestion for improvement. labels Aug 16, 2021
@fluiddot fluiddot marked this pull request as ready for review August 16, 2021 08:50
@fluiddot fluiddot requested a review from ellatrix as a code owner August 16, 2021 08:50
Copy link
Member

@dcalhoun dcalhoun left a comment

Choose a reason for hiding this comment

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

Well done! This is a creative yet straightforward solution to this odd problem. Thank you. This looks good to me.

I verified each of the test cases outlined in the PR description. I left one comment regarding naming, but it is not a blocker from my perspective.

I would imagine we should wait for a web team member's input before merging, so I will yield approval to them.

packages/block-editor/src/store/selectors.js Outdated Show resolved Hide resolved
@twstokes
Copy link
Contributor

LGTM @fluiddot!

Tested:

  • Web
  • iOS
  • Android (with and without Hermes in debug mode)

@mchowning
Copy link
Contributor

Thanks for this fix @fluiddot and @ttahmouch ! 🙇

I wonder if there's room for us to improve the default block order (in a different PR). This jumped out at me because the "more" block didn't seem to make sense in the third position (ahead of, for example, image, video, and list). Any thoughts on this @iamthomasbishop ? I know that we're planning to revamp the inserter soon, but if the order can be improved it would be a pretty easy fix.

Related previous discussion: wordpress-mobile/gutenberg-mobile#1105

@ttahmouch
Copy link
Contributor

Thanks for this fix @fluiddot and @ttahmouch ! 🙇

I wonder if there's room for us to improve the default block order (in a different PR). This jumped out at me because the "more" block didn't seem to make sense in the third position (ahead of, for example, image, video, and list). Any thoughts on this @iamthomasbishop ? I know that we're planning to revamp the inserter soon, but if the order can be improved it would be a pretty easy fix.

Related previous discussion: wordpress-mobile/gutenberg-mobile#1105

I think I agree with the sentiment behind this. I suppose I assumed the order would be self-correcting based on the frecency. However, it never quite made sense to me when attempting the dis/allow list implementation why the default order of the block types differed between web and native, and why the entry point module for registering the block types in native exported a default list of the block types but didn't acknowledge them when actually attempting to register them.

@gziolo
Copy link
Member

gziolo commented Aug 17, 2021

I wonder if there's room for us to improve the default block order (in a different PR). This jumped out at me because the "more" block didn't seem to make sense in the third position (ahead of, for example, image, video, and list). Any thoughts on this @iamthomasbishop ? I know that we're planning to revamp the inserter soon, but if the order can be improved it would be a pretty easy fix.

The order is different for the list of most common blocks between web and mobile, so it seems correct how those blocks are presented in the inserter. However, I agree with the sentiment that they should be presented in the same order on both platforms.

@gziolo gziolo requested a review from a team August 17, 2021 07:52
@gziolo gziolo added the [Feature] Inserter The main way to insert blocks using the + button in the editing interface label Aug 17, 2021
Copy link
Member

@gziolo gziolo left a comment

Choose a reason for hiding this comment

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

All tests pass so we should be good 😄

];
expect( items.map( ( { name } ) => name ) ).toEqual( expectedResult );
expect( items.map( ( { id } ) => id ) ).toEqual( expectedResult );
Copy link
Member

Choose a reason for hiding this comment

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

Good catch with id, here 👍🏻

@gziolo gziolo added the [Package] Block editor /packages/block-editor label Aug 17, 2021
@gziolo gziolo changed the title Prevent non-deterministic order of inserter items Inserter: Prevent non-deterministic order of inserter items Aug 17, 2021
@fluiddot
Copy link
Contributor Author

Thanks for this fix @fluiddot and @ttahmouch ! 🙇

I wonder if there's room for us to improve the default block order (in a different PR). This jumped out at me because the "more" block didn't seem to make sense in the third position (ahead of, for example, image, video, and list). Any thoughts on this @iamthomasbishop ? I know that we're planning to revamp the inserter soon, but if the order can be improved it would be a pretty easy fix.

Related previous discussion: wordpress-mobile/gutenberg-mobile#1105

The default block order in the native version is driven by the block registration order defined here:

[
paragraph,
heading,
devOnly( code ),
missing,
more,
image,
video,
nextpage,
separator,
list,
quote,
mediaText,
preformatted,
gallery,
columns,
column,
group,
classic,
button,
spacer,
shortcode,
buttons,
latestPosts,
verse,
cover,
socialLink,
socialLinks,
pullquote,
file,
audio,
reusableBlock,
search,
embed,
].forEach( registerBlock );

And on the web version is here:

// Common blocks are grouped at the top to prioritize their display
// in various contexts — like the inserter and auto-complete components.
paragraph,
image,
heading,
gallery,
list,
quote,
// Register all remaining core blocks.
shortcode,
archives,
audio,
button,
buttons,
calendar,
categories,
code,
columns,
column,
cover,
embed,
file,
group,
window.wp && window.wp.oldEditor ? classic : null, // Only add the classic block in WP Context
html,
mediaText,
latestComments,
latestPosts,
missing,
more,
nextpage,
pageList,
preformatted,
pullquote,
rss,
search,
separator,
reusableBlock,
socialLinks,
socialLink,
spacer,
table,
// tableOfContents,
tagCloud,
textColumns,
verse,
video,
// Theme blocks
siteLogo,
siteTagline,
siteTitle,
query,
postTemplate,
queryTitle,
queryPagination,
queryPaginationNext,
queryPaginationNumbers,
queryPaginationPrevious,
postTitle,
postContent,
postDate,
postExcerpt,
postFeaturedImage,
postTerms,
logInOut,
];

I'm wondering if we could unify them 🤔 , in the meantime and as a quick fix, we could update the list on the native version to match the same order as in the web.

@fluiddot
Copy link
Contributor Author

This PR has approvals for both versions native (approval #1 and approval #2) and web (approval #3), so it's ready to be merged.

@fluiddot fluiddot merged commit 8c12930 into trunk Aug 17, 2021
@fluiddot fluiddot deleted the update/sort-inserter-items branch August 17, 2021 08:22
@github-actions github-actions bot added this to the Gutenberg 11.4 milestone Aug 17, 2021
@gziolo
Copy link
Member

gziolo commented Aug 17, 2021

@fluiddot, it looks like the code for registering core blocks could be unified between the native mobile and web now that most of the blocks work on both platforms. A good example would be to extract common blocks (the group in the web version) to a new file and import them in both versions of index.js. This way any further changes will be reflected everywhere.

@fluiddot
Copy link
Contributor Author

@fluiddot, it looks like the code for registering core blocks could be unified between the native mobile and web now that most of the blocks work on both platforms. A good example would be to extract common blocks (the group in the web version) to a new file and import them in both versions of index.js. This way any further changes will be reflected everywhere.

That's a great idea, in the native version we would still require to filter out the unsupported blocks but I agree that extracting the common blocks will make the order consistent between web and native 🎊 .

@gziolo
Copy link
Member

gziolo commented Aug 17, 2021

You can also keep some of the imported blocks behind the Platform.is( 'web' ) check if that helps.

@fluiddot
Copy link
Contributor Author

You can also keep some of the imported blocks behind the Platform.is( 'web' ) check if that helps.

Yep, that would help for sure. Let's try this option and see how it looks like.

fluiddot added a commit that referenced this pull request Aug 17, 2021
* Prevent non-deterministic order of inserter items

* Add block variations to getInserterItems unit test

* Display core block variations before non-core blocks

* Rename toTyped to groupByType
fluiddot added a commit that referenced this pull request Aug 18, 2021
* Release script: Update react-native-editor version to 1.59.0

* Release script: Update with changes from 'npm run core preios'

* Update release notes

* Release script: Update react-native-editor version to 1.59.1

* Release script: Update with changes from 'npm run core preios'

* Mobile - Global styles - Add color to the list of styles to include in the filter (#34000)

* Rich text - toTree - Add optional chaining in replacements before accessing its type (#34020)

* Update 1.59.1 changelog

* Reinstate Unreleased section of changelog

* Release script: Update react-native-editor version to 1.59.2

* Release script: Update with changes from 'npm run core preios'

* Inserter: Prevent non-deterministic order of inserter items (#34078)

* Prevent non-deterministic order of inserter items

* Add block variations to getInserterItems unit test

* Display core block variations before non-core blocks

* Rename toTyped to groupByType

* Update react-native-editor CHANGELOG

* [RNMobile] Fix missing block title of core/latest-posts block (#34116)

* Update react-native-editor CHANGELOG

* [TEST] Use npm install in RN E2E Tests (iOS) workflow

* Revert "[TEST] Use npm install in RN E2E Tests (iOS) workflow"

This reverts commit 2b7e0e6.

Co-authored-by: jhnstn <jason@readysetandco.com>
Co-authored-by: David Calhoun <438664+dcalhoun@users.noreply.github.com>
Co-authored-by: Gerardo Pacheco <gerardo.pacheco@automattic.com>
@youknowriad
Copy link
Contributor

Looking at the performance graph for the "inserter hover" metric, it seems it started to be a bit less performant around this commit https://codehealth.vercel.app

While it's not certain 100%, it sounds like this commit is the most likely in that range of commits to impact it. The increase is not big enough to be very concerning but might be a good indicator to at least try to debug/check.

@fluiddot
Copy link
Contributor Author

Looking at the performance graph for the "inserter hover" metric, it seems it started to be a bit less performant around this commit https://codehealth.vercel.app

While it's not certain 100%, it sounds like this commit is the most likely in that range of commits to impact it. The increase is not big enough to be very concerning but might be a good indicator to at least try to debug/check.

That's interesting, after checking the graph (see attached screenshot), I see that the commit that introduced this change 8c12930 is indeed in that range. It would be nice to run some checks with a different approach in case it helps towards the performance.

Screenshot 2021-08-19 at 12 45 24

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Inserter The main way to insert blocks using the + button in the editing interface [Package] Block editor /packages/block-editor [Type] Bug An existing feature does not function as intended
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants