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

Navigation Editor: Fix saving locations using the "Manage Locations" popup #34714

Merged

Conversation

anton-vlasenko
Copy link
Contributor

@anton-vlasenko anton-vlasenko commented Sep 9, 2021

Description

This PR aims to give users the ability to assign all available menus to an arbitrary location inside the Manage Locations popup.
Currently it's only possible to assign a location to a menu that is being edited.
Fixes #33815.
This PR doesn't fix the issue with the main "Save" button because we have another issue for that.

How has this been tested?

  1. This has been tested using the Twenty Twenty-One WordPress theme.

  2. Go to the experimental Navigation screen.

  3. Create two menus.

  4. Switch to the first menu using the Switch Menu link at the top of the page.

  5. Open the Manage Locations popup.
    Screenshot 2021-09-10 at 10 47 40

  6. Assign the first location to the first menu.

  7. Assign the second location to the second menu.

  8. Click the Update button.
    Screenshot 2021-09-10 at 10 48 21

  9. You should see Menu locations have been updated message at the bottom of the page.
    Screenshot 2021-09-10 at 10 48 18

  10. Refresh the page.

  11. Make sure that the first menu is assigned to the first location.

  12. Switch to the second menu using the Switch Menu link at the top of the page.

  13. Make sure that the second menu is assigned to the second location.

Types of changes

Bug fix ( but this also can be considered as a new feature).

Checklist:

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

@github-actions
Copy link

github-actions bot commented Sep 9, 2021

Size Change: +253 B (0%)

Total Size: 1.05 MB

Filename Size Change
build/edit-navigation/index.min.js 15.1 kB +229 B (+2%)
build/edit-navigation/style-rtl.css 3.38 kB +12 B (0%)
build/edit-navigation/style.css 3.38 kB +12 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.2 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 120 kB
build/block-editor/style-rtl.css 13.8 kB
build/block-editor/style.css 13.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 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 600 B
build/block-library/blocks/button/style.css 600 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 206 B
build/block-library/blocks/columns/editor.css 205 B
build/block-library/blocks/columns/style-rtl.css 497 B
build/block-library/blocks/columns/style.css 496 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 417 B
build/block-library/blocks/embed/style.css 417 B
build/block-library/blocks/embed/theme-rtl.css 124 B
build/block-library/blocks/embed/theme.css 124 B
build/block-library/blocks/file/editor-rtl.css 300 B
build/block-library/blocks/file/editor.css 300 B
build/block-library/blocks/file/style-rtl.css 255 B
build/block-library/blocks/file/style.css 255 B
build/block-library/blocks/file/view.min.js 322 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB
build/block-library/blocks/freeform/editor.css 2.44 kB
build/block-library/blocks/gallery/editor-rtl.css 983 B
build/block-library/blocks/gallery/editor.css 988 B
build/block-library/blocks/gallery/style-rtl.css 1.6 kB
build/block-library/blocks/gallery/style.css 1.59 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 70 B
build/block-library/blocks/group/theme.css 70 B
build/block-library/blocks/heading/style-rtl.css 114 B
build/block-library/blocks/heading/style.css 114 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 332 B
build/block-library/blocks/html/editor.css 333 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 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 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 489 B
build/block-library/blocks/navigation-link/editor.css 488 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.72 kB
build/block-library/blocks/navigation/editor.css 1.72 kB
build/block-library/blocks/navigation/style-rtl.css 1.42 kB
build/block-library/blocks/navigation/style.css 1.41 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 241 B
build/block-library/blocks/page-list/style.css 241 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 261 B
build/block-library/blocks/paragraph/style.css 261 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/editor-rtl.css 398 B
build/block-library/blocks/post-featured-image/editor.css 398 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 378 B
build/block-library/blocks/pullquote/style.css 378 B
build/block-library/blocks/pullquote/theme-rtl.css 167 B
build/block-library/blocks/pullquote/theme.css 167 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 301 B
build/block-library/blocks/query-pagination/editor.css 292 B
build/block-library/blocks/query-pagination/style-rtl.css 259 B
build/block-library/blocks/query-pagination/style.css 257 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 187 B
build/block-library/blocks/quote/style.css 187 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.3 kB
build/block-library/blocks/social-links/style.css 1.3 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 853 B
build/block-library/common.css 849 B
build/block-library/editor-rtl.css 9.59 kB
build/block-library/editor.css 9.58 kB
build/block-library/index.min.js 152 kB
build/block-library/reset-rtl.css 527 B
build/block-library/reset.css 527 B
build/block-library/style-rtl.css 10.2 kB
build/block-library/style.css 10.2 kB
build/block-library/theme-rtl.css 658 B
build/block-library/theme.css 663 B
build/block-serialization-default-parser/index.min.js 1.09 kB
build/block-serialization-spec-parser/index.min.js 2.79 kB
build/blocks/index.min.js 46.9 kB
build/components/index.min.js 209 kB
build/components/style-rtl.css 15.8 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 11.1 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.1 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-post/classic-rtl.css 492 B
build/edit-post/classic.css 494 B
build/edit-post/index.min.js 29 kB
build/edit-post/style-rtl.css 7.2 kB
build/edit-post/style.css 7.2 kB
build/edit-site/index.min.js 26.6 kB
build/edit-site/style-rtl.css 5.07 kB
build/edit-site/style.css 5.07 kB
build/edit-widgets/index.min.js 16.1 kB
build/edit-widgets/style-rtl.css 4.06 kB
build/edit-widgets/style.css 4.06 kB
build/editor/index.min.js 37.7 kB
build/editor/style-rtl.css 3.74 kB
build/editor/style.css 3.73 kB
build/element/index.min.js 3.17 kB
build/escape-html/index.min.js 517 B
build/format-library/index.min.js 5.34 kB
build/format-library/style-rtl.css 668 B
build/format-library/style.css 670 B
build/hooks/index.min.js 1.55 kB
build/html-entities/index.min.js 424 B
build/i18n/index.min.js 3.6 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.74 kB
build/viewport/index.min.js 1.02 kB
build/warning/index.min.js 248 B
build/widgets/index.min.js 7.27 kB
build/widgets/style-rtl.css 1.17 kB
build/widgets/style.css 1.18 kB
build/wordcount/index.min.js 1.04 kB

compressed-size-action

@anton-vlasenko anton-vlasenko force-pushed the fix/manage-locations-doesnt-work-on-the-navigations-screen branch from 919cf75 to 46c8182 Compare September 9, 2021 20:38
@anton-vlasenko anton-vlasenko changed the title [WIP] Fix/manage locations doesnt work on the navigations screen Fix/manage locations doesnt work on the navigations screen Sep 10, 2021
@anton-vlasenko anton-vlasenko changed the title Fix/manage locations doesnt work on the navigations screen It's impossible to edit menu location using the "Manage Locations" popup Sep 10, 2021
@anton-vlasenko anton-vlasenko changed the title It's impossible to edit menu location using the "Manage Locations" popup It's impossible to edit menu locations using the "Manage Locations" popup Sep 10, 2021
@anton-vlasenko anton-vlasenko changed the title It's impossible to edit menu locations using the "Manage Locations" popup [WIP] It's impossible to edit menu locations using the "Manage Locations" popup Sep 10, 2021
* @see WP_REST_Controller
*/
class WP_REST_Menus_Controller_Test extends WP_REST_Menus_Controller {
public function test_it_allows_batch_requests_when_updating_menus() {
Copy link
Member

Choose a reason for hiding this comment

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

Move this method to class-rest-nav-menus-controller-test.php and delete this class.

Copy link
Contributor Author

@anton-vlasenko anton-vlasenko Sep 10, 2021

Choose a reason for hiding this comment

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

Thank you for the review.
I thought the test class must be named according to the class it is testing.
/__experimental/menus/(?P<id>[\d]+) endpoint is defined inside the WP_REST_Menus_Controller class.
Shouldn't we name the test class WP_REST_Menus_Controller_Test then?

Copy link
Contributor

@adamziel adamziel Sep 10, 2021

Choose a reason for hiding this comment

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

@anton-vlasenko ideally that would be the case. In reality, we don't follow this structure in tests at the moment. All the tests for that /__experimental/menus endpoint are in the file @spacedmonkey mentioned so it makes sense to keep adding new tests there.

As for why we have such a naming structure, I am not sure. Perhaps it's to avoid name conflicts when these classes are later migrated to WP core? @gziolo might have more context here.

Copy link
Member

Choose a reason for hiding this comment

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

When me and Tim migrate this to core, I will make sure to name the test class correctly

Copy link
Contributor Author

@anton-vlasenko anton-vlasenko Sep 10, 2021

Choose a reason for hiding this comment

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

Thank you for the explanation, @adamziel .
I was just curious why we don't follow that structure.

Fixed in 67ea4e4e06d8efbb6df6036800c336d4856ae249

@spacedmonkey
Copy link
Member

Some small tweaks to PHP, but the JS looks and works well!

@anton-vlasenko
Copy link
Contributor Author

anton-vlasenko commented Sep 10, 2021

@kevin940726 @getdave @adamziel
I would need some help from experienced React developers, as I'm still learning React.
I'm not sure if that's the best way to export createBatch function.
I need to use createBatch because it parses batch responses correctly and I just don't want to duplicate that functionality elsewhere.
Does this export statement seem correct to you?
Is there a better way to export it?
Yet another question, do I need to update core-data's README.md file because we export createBatch function now?

Comment on lines 42 to 86
const batch = createBatch();
menus.forEach( ( { id } ) => {
const locations = menuLocations
.filter( ( menuLocation ) => menuLocation.menu === id )
.map( ( menuLocation ) => menuLocation.name );

batch.add( {
path: `/__experimental/menus/${ id }`,
data: {
locations,
},
method: 'POST',
} );
} );

const isSuccess = await batch.run();
if ( isSuccess ) {
createSuccessNotice( __( 'Menu locations have been updated.' ), {
type: 'snackbar',
} );
closeModal();
return;
}
Copy link
Contributor

@adamziel adamziel Sep 10, 2021

Choose a reason for hiding this comment

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

@anton-vlasenko The bad news is that createBatch is an experimental API and we don't want to export it from core-data – this would make it a public API that developers may start relying on.

The good news is that you don't need to do that. You could add something along these lines to actions.js:

export const updateMenuLocations = ( menus, menuLocations ) => async ({ registry }) => {
	const tasks = menus.map( ( { id } ) => {
		const locations = menuLocations
			.filter( ( menuLocation ) => menuLocation.menu === id )
			.map( ( menuLocation ) => menuLocation.name );

		return ({ saveEntityRecord }) => saveEntityRecord( 'root', 'menu', {
			locations
		} );
	} );

	return await registry
		.dispatch( 'core' )
		.__experimentalBatch( tasks );
}

And then do something like this to your component:

const { updateMenuLocations } = useDispatch( navigationStore );
const handleUpdate = async () => {
	try {
		await updateMenuLocations( menus, menuLocations );

		createSuccessNotice( __( 'Menu locations have been updated.' ), {
			type: 'snackbar',
		} );
		closeModal();
	} catch( e ) {
		createErrorNotice( __( 'There was an error.' ), {
			type: 'snackbar',
		} );
	}
}

You will also need to add __experimentalUseThunks: true to store definition.

There are a few caveats here. For once, handling errors is pretty tricky. You will need to check for getLastEntitySaveError for each saved menu:

	registry
		.select( 'core' )
		.getLastEntitySaveError( kind, entityType, change.id )

Ideally the batch would just throw an exception when things fail, but unfortunately this isn't a case now. We may rework batching soon, but it is what it is for now.

Copy link
Contributor

@adamziel adamziel Sep 10, 2021

Choose a reason for hiding this comment

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

We don't have much documentation on __experimentalBatch, but we use it in the edit-widgets package: https://github.com/WordPress/gutenberg/blob/trunk/packages/edit-widgets/src/store/actions.js#L95

(It's all based in generators so you'll see a lot of yield statements, that's an old way. New code can all rely on async/await)

Copy link
Contributor

Choose a reason for hiding this comment

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

@adamziel how come it does not have an experimental name?

Copy link
Contributor

@adamziel adamziel Sep 10, 2021

Choose a reason for hiding this comment

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

@draganescu I think the purpose of __experimental is to warn others. It makes sense for exported things, but createBatch() is not exported anywhere. @noisysocks who implemented it may have more context

Copy link
Contributor Author

@anton-vlasenko anton-vlasenko Sep 10, 2021

Choose a reason for hiding this comment

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

Thank you for such a great comment, @adamziel ! I owe you. I've learned a lot from it.
I've refactored my code and now it doesn't depend on the createBatch function.
I have a question.

  1. Is your suggestion to add a new method to the actions.js something that is nice to have? Or we must do it? I'm asking because I'm not sure how much time I'm allowed to spend on this task. I'm not so familiar with the core-data package.
  2. We've agreed that we will use experimental/menus/${menuId} endpoint to send requests to update menus' locations. Do you know if your suggestion uses that endpoint to update menus under the hood?

Copy link
Contributor

@adamziel adamziel Sep 10, 2021

Choose a reason for hiding this comment

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

@anton-vlasenko

  1. we can't export createBatch() from core-data so this one is a blocker
  2. I haven't actually tested that but I think so, refer to entities.js in core-data whenever in doubt. I'll only be able to confirm on Tuesday so might be faster for you to check than wait for me

Copy link
Contributor Author

@anton-vlasenko anton-vlasenko Sep 10, 2021

Choose a reason for hiding this comment

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

@adamziel I would leave it as is because I've refactored my PR and it doesn't depend on createBatch() now.
If you insist that we need to add a new method to the actions.js file and use core-data package, so be it. Please let me know and I'll go that route.
I'd like to leave this PR as is mainly because of the amount of time I've already spent on it. Time is my main concern here.
Thank you again for all the input.

@anton-vlasenko anton-vlasenko changed the title [WIP] It's impossible to edit menu locations using the "Manage Locations" popup It's impossible to edit menu locations using the "Manage Locations" popup Sep 10, 2021
It's needed to save menu locations.
It's better to put all "save" related logic into the manage-locations component.
…need to use batch API to save menus' locations in the Manage Locations popup.
anton-vlasenko and others added 18 commits September 10, 2021 19:05
…ches to the batch REST API endpoint.

The previous method doesn't properly parse error responses.
…ethods, so I'm just moving it above them.

2. Update test fail message.
…rivate methods, so I'm just moving it above them."

This reverts commit 400236d305ca4cb18da40f568c1bb09bd0231a38.
This reverts commit 72440411ad261191987c856de041a7be19962783.
…lly."

This reverts commit b7fc4a12a2bd4353c131b994eff8fdc1d202cf5b.
We can't use createBatch function from wordpress/core-data.
@anton-vlasenko anton-vlasenko force-pushed the fix/manage-locations-doesnt-work-on-the-navigations-screen branch from bc6555e to 8f5b433 Compare September 10, 2021 17:06
@anton-vlasenko anton-vlasenko added [Feature] Navigation Screen [Feature] Saving Related to saving functionality [Type] Bug An existing feature does not function as intended labels Sep 10, 2021
Copy link
Member

@spacedmonkey spacedmonkey left a comment

Choose a reason for hiding this comment

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

Worked in my testing.

@talldan
Copy link
Contributor

talldan commented Sep 13, 2021

Thanks @anton-vlasenko!

@talldan talldan changed the title It's impossible to edit menu locations using the "Manage Locations" popup Navigation Editor: Fix saving locations using the "Manage Locations" popup Sep 13, 2021
@talldan talldan merged commit b686c45 into trunk Sep 13, 2021
@talldan talldan deleted the fix/manage-locations-doesnt-work-on-the-navigations-screen branch September 13, 2021 04:06
@github-actions github-actions bot added this to the Gutenberg 11.6 milestone Sep 13, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Saving Related to saving functionality [Type] Bug An existing feature does not function as intended
Projects
None yet
Development

Successfully merging this pull request may close these issues.

"Manage Locations" doesn't work on the Navigation screen
5 participants