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

Disallow drag from Nav list view into block canvas #47615

Conversation

getdave
Copy link
Contributor

@getdave getdave commented Jan 31, 2023

What?

Disables dragging a block from the Navigation block list view into the editor canvas (or any other context).

Closes #46994

Why?

As shown in #46994 it's possible to drag any block in the Nav block list view into the editor canvas and it will be removed from the Nav block and end up in the editor.

This behaviour is unexpected in this context and should be disallowed.

Note: it has been confirmed that this behaviour is expected in the main List View 🤷

How?

Allows Draggables to define a list of DropZone targets with which they are compatible.

Allows Dropzones to define a name/identifier for themselves.

When an event occurs over a given Dropzone, it will check the given Draggable for targets. If they exist then it will check for its own name within the Draggables targets. Only if found will it accept the Draggable. Otherwise the drop will be rejected.

Note that it has been necessary to introduce new state to track the drag targets. Why? Because the browser's drag event's dataTransfer is read only during the dragover. Apparently this is by design. As a result we need to store informartion about the dragOrigin in state in order that we can read it during the dragover event and avoid showing UI affordances indicating a drop is possible (when it isn't).

⚠️ Known issues

Currently the drag "chip" (the black icon that follows your cursor as you drag) has a "positive" icon as you drag. It would be ideal if we were able to make that a "X" during the drag if the dropzone is not compatible. However as it's defined on the draggable there's not currently an easy way to do that without adding more state. Therefore this can be tackled in a follow up.

Testing Instructions

The key here is ensuring:

  1. You cannot successfully complete drag and drop out of the Nav block list view into the editor canvas.
  2. All existing drag and drop functionality is preserved.
  • First try doing some normal drag and drop within canvas.
  • Try dragging within and outside of of main (not Nav block!) List View.
  • Now try the same but for the Nav block's list view. You should still be able to drag and drop within it but not be able to successfully complete a drag outside.

Testing Instructions for Keyboard

Screenshots or screencast

Screen.Capture.on.2023-02-02.at.11-01-24.mp4

@getdave getdave self-assigned this Jan 31, 2023
@getdave getdave added [Type] Bug An existing feature does not function as intended [Feature] Drag and Drop Drag and drop functionality when working with blocks [Block] Navigation Affects the Navigation Block labels Jan 31, 2023
@github-actions
Copy link

github-actions bot commented Jan 31, 2023

Size Change: +1.99 kB (0%)

Total Size: 1.31 MB

Filename Size Change
build/block-directory/index.min.js 7.2 kB +41 B (+1%)
build/block-editor/index.min.js 193 kB +592 B (0%)
build/block-editor/style-rtl.css 14.4 kB +60 B (0%)
build/block-editor/style.css 14.4 kB +58 B (0%)
build/block-library/common-rtl.css 1.11 kB +61 B (+6%) 🔍
build/block-library/common.css 1.11 kB +62 B (+6%) 🔍
build/block-library/index.min.js 199 kB +66 B (0%)
build/block-library/style-rtl.css 12.5 kB +58 B (0%)
build/block-library/style.css 12.5 kB +58 B (0%)
build/blocks/index.min.js 51 kB +608 B (+1%)
build/components/index.min.js 203 kB +88 B (0%)
build/compose/index.min.js 12.3 kB +6 B (0%)
build/customize-widgets/index.min.js 11.8 kB +16 B (0%)
build/edit-post/style-rtl.css 7.5 kB +44 B (+1%)
build/edit-post/style.css 7.5 kB +43 B (+1%)
build/edit-site/index.min.js 64.1 kB -16 B (0%)
build/edit-site/style-rtl.css 9.68 kB +122 B (+1%)
build/edit-site/style.css 9.67 kB +119 B (+1%)
build/edit-widgets/style-rtl.css 4.52 kB +31 B (+1%)
build/edit-widgets/style.css 4.52 kB +30 B (+1%)
build/editor/style-rtl.css 3.58 kB -102 B (-3%)
build/editor/style.css 3.57 kB -98 B (-3%)
build/keycodes/index.min.js 1.92 kB +41 B (+2%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 993 B
build/annotations/index.min.js 2.78 kB
build/api-fetch/index.min.js 2.27 kB
build/autop/index.min.js 2.15 kB
build/blob/index.min.js 483 B
build/block-directory/style-rtl.css 1.04 kB
build/block-directory/style.css 1.04 kB
build/block-editor/content-rtl.css 4.11 kB
build/block-editor/content.css 4.1 kB
build/block-editor/default-editor-styles-rtl.css 403 B
build/block-editor/default-editor-styles.css 403 B
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 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 138 B
build/block-library/blocks/audio/theme.css 138 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 91 B
build/block-library/blocks/avatar/style.css 91 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 485 B
build/block-library/blocks/button/editor.css 485 B
build/block-library/blocks/button/style-rtl.css 532 B
build/block-library/blocks/button/style.css 532 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 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 100 B
build/block-library/blocks/categories/style.css 100 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 406 B
build/block-library/blocks/columns/style.css 406 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-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 612 B
build/block-library/blocks/cover/editor.css 613 B
build/block-library/blocks/cover/style-rtl.css 1.57 kB
build/block-library/blocks/cover/style.css 1.56 kB
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 410 B
build/block-library/blocks/embed/style.css 410 B
build/block-library/blocks/embed/theme-rtl.css 138 B
build/block-library/blocks/embed/theme.css 138 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 253 B
build/block-library/blocks/file/style.css 254 B
build/block-library/blocks/file/view.min.js 353 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB
build/block-library/blocks/freeform/editor.css 2.44 kB
build/block-library/blocks/gallery/editor-rtl.css 984 B
build/block-library/blocks/gallery/editor.css 988 B
build/block-library/blocks/gallery/style-rtl.css 1.55 kB
build/block-library/blocks/gallery/style.css 1.55 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 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 332 B
build/block-library/blocks/html/editor.css 333 B
build/block-library/blocks/image/editor-rtl.css 829 B
build/block-library/blocks/image/editor.css 828 B
build/block-library/blocks/image/style-rtl.css 627 B
build/block-library/blocks/image/style.css 630 B
build/block-library/blocks/image/theme-rtl.css 137 B
build/block-library/blocks/image/theme.css 137 B
build/block-library/blocks/latest-comments/style-rtl.css 298 B
build/block-library/blocks/latest-comments/style.css 298 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 507 B
build/block-library/blocks/media-text/style.css 505 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 716 B
build/block-library/blocks/navigation-link/editor.css 715 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 299 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation/editor-rtl.css 2.13 kB
build/block-library/blocks/navigation/editor.css 2.14 kB
build/block-library/blocks/navigation/style-rtl.css 2.22 kB
build/block-library/blocks/navigation/style.css 2.2 kB
build/block-library/blocks/navigation/view-modal.min.js 2.81 kB
build/block-library/blocks/navigation/view.min.js 447 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 376 B
build/block-library/blocks/page-list/editor.css 376 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 501 B
build/block-library/blocks/post-comments-form/style.css 501 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 73 B
build/block-library/blocks/post-excerpt/editor.css 73 B
build/block-library/blocks/post-excerpt/style-rtl.css 134 B
build/block-library/blocks/post-excerpt/style.css 134 B
build/block-library/blocks/post-featured-image/editor-rtl.css 586 B
build/block-library/blocks/post-featured-image/editor.css 584 B
build/block-library/blocks/post-featured-image/style-rtl.css 318 B
build/block-library/blocks/post-featured-image/style.css 318 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 282 B
build/block-library/blocks/post-template/style.css 282 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-title/style-rtl.css 100 B
build/block-library/blocks/post-title/style.css 100 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 135 B
build/block-library/blocks/pullquote/editor.css 135 B
build/block-library/blocks/pullquote/style-rtl.css 326 B
build/block-library/blocks/pullquote/style.css 325 B
build/block-library/blocks/pullquote/theme-rtl.css 167 B
build/block-library/blocks/pullquote/theme.css 167 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 288 B
build/block-library/blocks/query-pagination/style.css 284 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 458 B
build/block-library/blocks/query/editor.css 457 B
build/block-library/blocks/quote/style-rtl.css 213 B
build/block-library/blocks/quote/style.css 213 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 165 B
build/block-library/blocks/search/editor.css 165 B
build/block-library/blocks/search/style-rtl.css 409 B
build/block-library/blocks/search/style.css 406 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 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 474 B
build/block-library/blocks/shortcode/editor.css 474 B
build/block-library/blocks/site-logo/editor-rtl.css 490 B
build/block-library/blocks/site-logo/editor.css 490 B
build/block-library/blocks/site-logo/style-rtl.css 203 B
build/block-library/blocks/site-logo/style.css 203 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 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.4 kB
build/block-library/blocks/social-links/style.css 1.39 kB
build/block-library/blocks/spacer/editor-rtl.css 332 B
build/block-library/blocks/spacer/editor.css 332 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 433 B
build/block-library/blocks/table/editor.css 433 B
build/block-library/blocks/table/style-rtl.css 651 B
build/block-library/blocks/table/style.css 650 B
build/block-library/blocks/table/theme-rtl.css 157 B
build/block-library/blocks/table/theme.css 157 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 404 B
build/block-library/blocks/template-part/editor.css 404 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 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 179 B
build/block-library/blocks/video/style.css 179 B
build/block-library/blocks/video/theme-rtl.css 139 B
build/block-library/blocks/video/theme.css 139 B
build/block-library/classic-rtl.css 162 B
build/block-library/classic.css 162 B
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/editor-rtl.css 11.5 kB
build/block-library/editor.css 11.5 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/theme-rtl.css 698 B
build/block-library/theme.css 703 B
build/block-serialization-default-parser/index.min.js 1.13 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/components/style-rtl.css 11.6 kB
build/components/style.css 11.7 kB
build/core-data/index.min.js 15.9 kB
build/customize-widgets/style-rtl.css 1.41 kB
build/customize-widgets/style.css 1.41 kB
build/data-controls/index.min.js 663 B
build/data/index.min.js 8.06 kB
build/date/index.min.js 32.1 kB
build/deprecated/index.min.js 518 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.71 kB
build/edit-post/classic-rtl.css 571 B
build/edit-post/classic.css 571 B
build/edit-post/index.min.js 34.5 kB
build/edit-widgets/index.min.js 16.9 kB
build/editor/index.min.js 45.5 kB
build/element/index.min.js 4.93 kB
build/escape-html/index.min.js 548 B
build/experiments/index.min.js 905 B
build/format-library/index.min.js 7.23 kB
build/format-library/style-rtl.css 598 B
build/format-library/style.css 597 B
build/hooks/index.min.js 1.66 kB
build/html-entities/index.min.js 454 B
build/i18n/index.min.js 3.79 kB
build/is-shallow-equal/index.min.js 535 B
build/keyboard-shortcuts/index.min.js 1.79 kB
build/list-reusable-blocks/index.min.js 2.14 kB
build/list-reusable-blocks/style-rtl.css 865 B
build/list-reusable-blocks/style.css 865 B
build/media-utils/index.min.js 2.99 kB
build/notices/index.min.js 977 B
build/plugins/index.min.js 1.95 kB
build/preferences-persistence/index.min.js 2.23 kB
build/preferences/index.min.js 1.35 kB
build/primitives/index.min.js 960 B
build/priority-queue/index.min.js 1.52 kB
build/react-i18n/index.min.js 702 B
build/react-refresh-entry/index.min.js 8.44 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.75 kB
build/reusable-blocks/index.min.js 2.26 kB
build/reusable-blocks/style-rtl.css 265 B
build/reusable-blocks/style.css 265 B
build/rich-text/index.min.js 10.8 kB
build/server-side-render/index.min.js 2.09 kB
build/shortcode/index.min.js 1.52 kB
build/style-engine/index.min.js 1.53 kB
build/token-list/index.min.js 650 B
build/url/index.min.js 3.69 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 1.09 kB
build/warning/index.min.js 280 B
build/widgets/index.min.js 7.31 kB
build/widgets/style-rtl.css 1.18 kB
build/widgets/style.css 1.18 kB
build/wordcount/index.min.js 1.06 kB

compressed-size-action

@getdave
Copy link
Contributor Author

getdave commented Jan 31, 2023

If this is a 👍 direction wise, my next step will be unit tests and resulting fixes.

draganescu

This comment was marked as outdated.

@github-actions

This comment was marked as outdated.

@getdave getdave added the [Package] Block editor /packages/block-editor label Feb 2, 2023
@getdave getdave marked this pull request as ready for review February 2, 2023 11:19
@getdave getdave force-pushed the fix/disallow-drag-drop-into-editor-canvas-from-nav-offcanvas branch from 74848af to eee42f2 Compare February 2, 2023 11:20
@getdave
Copy link
Contributor Author

getdave commented Feb 3, 2023

I've been thinking about this PR. Instead of defining 1:1 compatbility between drag origin and drop zone should we instead have some kind of whitelist on the draggable to say which dropzones it is compatible with?

Imagine you wanted to be able to define Draggable X thus:

  • can be dragged into the editor canvas
  • cannot be dragged into the global list view

With the current implementation that is not possible.

Currently all you can do is tell a given Draggable that it is only allow to drag within itself. That doesn't seem very flexible.

Options:

  • allow Dropzones to define which Draggable origin's they will accept
  • allow Draggables to define which Dropzones they can be dragged into

I took a look at some Drag and Drop libraries and they seem to favour the first approach:

@talldan
Copy link
Contributor

talldan commented Feb 3, 2023

Instead of defining 1:1 compatbility between drag origin and drop zone should we instead have some kind of whitelist on the draggable to say which dropzones it is compatible with?

I like the idea. Maybe no list means compatible with everything?

The browser drag and drop API is pretty limited so you may have to figure out if its possible.

@getdave
Copy link
Contributor Author

getdave commented Feb 3, 2023

I like the idea

Good to know - thank you.

Maybe no list means compatible with everything?

💯 I agree. That's basically how it has to work to avoid backwards compatibility problems.

@getdave
Copy link
Contributor Author

getdave commented Feb 3, 2023

allow Draggables to define which Dropzones they can be dragged into

@talldan I went with this approach in the end.

The new API is:

  • Dropzones can optionally choose to name themselves - e.g. list-view, inner-blocks, block-list, offcanvas.
  • Draggables (optionally) define a list of valid targets - this is an array of dropzone names.
  • When events occur on a Dropzone it will check whether the given Draggable has targets. If it does then it checks the targets against its own name to determine whether it should accept the draggable.

Why?

Because with our use case to retain existing editor behaviour, allowing dropzones to define which draggables they accept would require adding a types whitelist to all existing dropzones.

So for example, say I wanted to stop Draggables being moved from the offcanvas (Nav block list view) into the any Dropzone (other than itself) then I'd have to tell every drop

  • give every existing Draggable an origin prop
  • give every existing DropZone a prop to accept all the existing Dragganle types except the offcanvas.

As a result, I've gone for allowing Draggables to define which dropzones they are compatible with. This means I can simply:

  • name the Nav block list view dropzone as offcanvas
  • include offcanvas in a list of targets for the Draggables in Nav block list view.

This results in the Nav block list view nodes being droppable within the Nav block list view only. All existing functionality for other drag and drop is retained "as is".

I did consider going for a deny list on the dropzones but I wasn't sure about that one. Let me know if you think that could be a better option.

@getdave getdave added the Backport to WP 6.7 Beta/RC Pull request that needs to be backported to the WordPress major release that's currently in beta label Feb 3, 2023
@@ -92,7 +92,8 @@ function OffCanvasEditor(

const [ expandedState, setExpandedState ] = useReducer( expanded, {} );

const { ref: dropZoneRef, target: blockDropTarget } = useListViewDropZone();
const { ref: dropZoneRef, target: blockDropTarget } =
Copy link
Contributor

Choose a reason for hiding this comment

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

Can we make offcanvas a prop that we pass to the component, so that when we combine this with the List View we already have the tools we need?

@scruffian
Copy link
Contributor

This is looking good to me. Should we add/update some documentation? I'm thinking that in the future people might not understand why their drag/drop operations aren't working so it might be good to explain how the system works.

@getdave
Copy link
Contributor Author

getdave commented Feb 3, 2023

Should we add/update some documentation?

Yes 💯 . Which documentation did you have in mind?

@scruffian
Copy link
Contributor

Which documentation did you have in mind?

Maybe this?
https://github.com/WordPress/gutenberg/tree/a8c4fb9dfe2ce30dad4ba746c6084c9c7aed78b7/packages/components/src/drop-zone

@getdave
Copy link
Contributor Author

getdave commented Feb 6, 2023

I'm not fully confident in this implementation. Pinging @youknowriad for his opinion on:

  • whether allowing draggables to define target dropzones is the right inversion of control.
  • whether using the store to track details of the dragged block is suitable.
  • how futureproof this approach is...what alternatives might there be?

@getdave
Copy link
Contributor Author

getdave commented Feb 6, 2023

One thing I just thought is we need to check this hasn't broken file/image drag and drop behaviour.

@youknowriad
Copy link
Contributor

I think we have a "drag type" in draggables/droppables for this kind of use-cases no? Can we use a dedicated drag type for the list view?

@talldan
Copy link
Contributor

talldan commented Feb 6, 2023

I think we have a "drag type" in draggables/droppables for this kind of use-cases no? Can we use a dedicated drag type for the list view?

From what I understand, it uses dataTransfer, so you still have the browser limitation that it can only be read on the drop event, and not when dragging over a drop zone (it makes it impossible to hide the drop indicators.)

whether using the store to track details of the dragged block is suitable.

There might not be many other ways. Using a data-attribute on the draggable is the only other idea I have, but I don't how feasible that is.

@draganescu
Copy link
Contributor

I like this "targets" implementation. I think @talldan has a point that if we highlight the dropzones but then the drop does not work it looks like a bug not like a feature.


const draggedBlockClientIds = getDraggedBlockClientIds();
const throttled = useThrottle(
useCallback(
( event, currentTarget ) => {
const draggedBlocksTargets = getDraggedBlocksTargets();

if (
Copy link
Contributor

Choose a reason for hiding this comment

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

shouldn't this check be in useDropZone so it applies to all drop zones?

const {
getBlockRootClientId,
getBlockIndex,
getBlockCount,
getDraggedBlockClientIds,
canInsertBlocks,
} = useSelect( blockEditorStore );
getDraggedBlocksTargets,
} = unlock( useSelect( blockEditorStore ) );
const [ target, setTarget ] = useState();
const { rootClientId: targetRootClientId, blockIndex: targetBlockIndex } =
Copy link
Contributor

Choose a reason for hiding this comment

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

it's a bit confusing the difference between the target variable this hook returns and the target finding done later.

@getdave
Copy link
Contributor Author

getdave commented Feb 20, 2023

This will not be merged in time for 6.2. There are too many changes to how the D&D works under the hood to be safe at this point.

@scruffian
Copy link
Contributor

It's not currently clear how to proceed here. My suggestion is that we focus on unifying the OffCanvasEditor with the ListView, and then reconsider when we can see how these components work together.

@scruffian scruffian added the [Status] Blocked Used to indicate that a current effort isn't able to move forward label Mar 8, 2023
@Mamaduka Mamaduka removed the Backport to WP 6.7 Beta/RC Pull request that needs to be backported to the WordPress major release that's currently in beta label Mar 8, 2023
@getdave
Copy link
Contributor Author

getdave commented Jul 3, 2023

I know @andrewserong has been working on D&D so I'll close this one out now.

@getdave getdave closed this Jul 3, 2023
@youknowriad youknowriad deleted the fix/disallow-drag-drop-into-editor-canvas-from-nav-offcanvas branch July 3, 2023 13:41
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] Drag and Drop Drag and drop functionality when working with blocks [Package] Block editor /packages/block-editor [Status] Blocked Used to indicate that a current effort isn't able to move forward [Type] Bug An existing feature does not function as intended
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Navigation block: prevent drag & drop out of the editable list view sidebar
7 participants