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

ToolsPanel: refactor Storybook examples to TypeScript, fix types inconsistencies #47944

Merged
merged 21 commits into from
Feb 13, 2023

Conversation

ciampo
Copy link
Contributor

@ciampo ciampo commented Feb 9, 2023

What?

Refactor ToolsPanel Storybook examples to TypeScript, and iron out some type inconsistencies in the process.

Why?

Part of #35744

How?

Here's a detailed list of type inconsistencies / fixes:

  • Allowed null as a possible value for panelId on both ToolsPanel and ToolsPanelItem (as already explained in the ToolsPanel README on trunk) (800a5e5)
  • Marked the hasInnerWrapper and shouldRenderPlaceholderItems props on ToolsPanel as optional (with a default value of false). Until now they were marked as required, but they were not passed in many examples (including Storybook) (ebe5493)
  • assigned a default value of noop to resetAllFilter, since TypeScript would otherwise error about it potentially being undefined when used in a useCallback hook (378ee00)
  • Marked the isShownByDefault prop on ToolsPanelItem as optional with a default value of false. Until now it was marked as required, but it was not passed in many examples (including Storybook) 284c5ae)

And this is a high-level overview of Storybook changes:

  • Renamed files, fixed imports
  • Added meta object, including controls settings
  • Switched to latest story format using templates and args (also refactored the extra isFirstToolsPanelItemShownByDefault prop from args to internal state)
  • Added types to all components and hooks that needed them
  • Left inline comments where things still need adjusting

TODO before merging:

  • Update JSDoc example snippets if/where necessary
  • Check usages of the component around the project, and make sure that they reflect the prop types (value types, requires/optional)

Testing Instructions

The only runtime changes are the assignment of some default values for the props that have been marked as optional.

  • Review code changes
  • Make sure that the Storybook examples still work as on trunk

@github-actions
Copy link

github-actions bot commented Feb 9, 2023

Size Change: +14 B (0%)

Total Size: 1.33 MB

Filename Size Change
build/components/index.min.js 206 kB +14 B (0%)
ℹ️ 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/index.min.js 7.2 kB
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-editor/index.min.js 194 kB
build/block-editor/style-rtl.css 14.4 kB
build/block-editor/style.css 14.4 kB
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 90 B
build/block-library/blocks/archives/style.css 90 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 122 B
build/block-library/blocks/audio/style.css 122 B
build/block-library/blocks/audio/theme-rtl.css 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 587 B
build/block-library/blocks/button/editor.css 587 B
build/block-library/blocks/button/style-rtl.css 628 B
build/block-library/blocks/button/style.css 627 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 265 B
build/block-library/blocks/file/style.css 265 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 830 B
build/block-library/blocks/image/editor.css 829 B
build/block-library/blocks/image/style-rtl.css 652 B
build/block-library/blocks/image/style.css 652 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 179 B
build/block-library/classic.css 179 B
build/block-library/common-rtl.css 1.11 kB
build/block-library/common.css 1.11 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/editor-rtl.css 11.6 kB
build/block-library/editor.css 11.6 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/index.min.js 200 kB
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/style-rtl.css 12.6 kB
build/block-library/style.css 12.6 kB
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/blocks/index.min.js 51 kB
build/components/style-rtl.css 11.6 kB
build/components/style.css 11.6 kB
build/compose/index.min.js 12.3 kB
build/core-data/index.min.js 15.9 kB
build/customize-widgets/index.min.js 11.8 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.57 kB
build/date/index.min.js 40.4 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-post/style-rtl.css 7.5 kB
build/edit-post/style.css 7.5 kB
build/edit-site/index.min.js 64.6 kB
build/edit-site/style-rtl.css 10 kB
build/edit-site/style.css 10 kB
build/edit-widgets/index.min.js 16.9 kB
build/edit-widgets/style-rtl.css 4.52 kB
build/edit-widgets/style.css 4.52 kB
build/editor/index.min.js 45.5 kB
build/editor/style-rtl.css 3.54 kB
build/editor/style.css 3.53 kB
build/element/index.min.js 4.93 kB
build/escape-html/index.min.js 548 B
build/format-library/index.min.js 7.27 kB
build/format-library/style-rtl.css 557 B
build/format-library/style.css 556 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/keycodes/index.min.js 1.92 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/private-apis/index.min.js 940 B
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

@ciampo ciampo added [Type] Code Quality Issues or PRs that relate to code quality [Package] Components /packages/components labels Feb 9, 2023
@github-actions
Copy link

github-actions bot commented Feb 9, 2023

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

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

label="Tools Panel (default example)"
resetAll={ resetAll }
>
<ToolsPanel { ...props } resetAll={ resetAll }>
Copy link
Contributor Author

Choose a reason for hiding this comment

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

  • Making sure that all props are passed to ToolsPanel. The label prop has been moved to the Story.args object, instead of being hardcoded in the render function.
  • The resetAll prop is also passed (see a few lines above in the local resetAll function), so that Storybook can correctly fire an action (in the actions tab) when the callback is invoked.

These changes have been applied to all stories.

Comment on lines +222 to +223
// `key` property here is used as a hack to force `ToolsPanel` to re-render
// See https://github.com/WordPress/gutenberg/pull/38262/files#r793422991
Copy link
Contributor Author

Choose a reason for hiding this comment

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

This is hacky, but not really in the scope of this PR to change. I just added a comment to add more context around it


export const WithOptionalItemsPlusIcon = ( { isShownByDefault } ) => {
Copy link
Contributor Author

@ciampo ciampo Feb 9, 2023

Choose a reason for hiding this comment

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

Since isShownByDefault is not a prop of ToolsPanel, in order to adhere to how controls are supposed to work I decided to move it inside the render function as internal state (isFirstToolsPanelItemShownByDefault). Its value can still be changed interactively, thanks to a button that I added to the story

};

const { Fill: ToolsPanelItems, Slot } = createSlotFill( 'ToolsPanelSlot' );
const panelId = 'unique-tools-panel-id';
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Moved to be part of each story's args object

Comment on lines 317 to 319
// TODO: the `ResetFilter` type doesn't specify any attributes
// and doesn't return any objects
// @ts-ignore
Copy link
Contributor Author

Choose a reason for hiding this comment

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

This is something that I wasn't able to fix on my own. According to the type defs, ResetAllFilter is of type () => void;, and therefore is not supposed to accept arguments.

We have two alternatives here:

  • either change the ResetAllFilter type to accept arguments
  • or change the next line to ...resetFilter()

This same issue happens a few times across the file

Copy link
Contributor

Choose a reason for hiding this comment

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

Thanks for catching this one 👍

In terms of which option, I believe the type is incorrect as prior uses of the resetAllFilter are to pass through the current data so each filter in turn was aware of the latest changes and wouldn't override updates from previous filters.

If I recall correctly, the color supports panel uses a different batch approach that might allow the second option you presented.

Given there might already be external use of the ToolsPanel, I think I'd still lean towards fixing the type to match existing uses. Also, the ToolsPanel wasn't typed initially and was converted to TypeScript after the fact, which might further point to the types being incorrect.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I think I'd still lean towards fixing the type to match existing uses

Ok! I tried to find a good way to describe the ResetAllFIlter type , but the fact that it could literally receive any data as an argument A(or undefined), and return any data (or void) made me lean towards using ( attributes?: any ) => any (364fb87)

(@mirka or @tyxla , do you have any suggestions on how to type this callback more strictly ?)

I've also updated the README in both ToolsPanel and ToolsPanelItem to reflect those changes (08e55bc)

@aaronrobertshaw , what do you think? If this looks good, I'll let you decide what pattern we should advocate for in example snippets (and potentially change usages in the repo to follow that style too).

Copy link
Contributor

Choose a reason for hiding this comment

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

what do you think?

I think this is still an improvement over the incorrect type not matching the callback's intended use.

Unfortunately, I'm short on ideas for typing it more strictly. I'd suggest the general expectation by consumers would be that the same type would be maintained as the data gets passed through each resetAllFilter. I don't know how we'd achieve that, though.

I'll let you decide what pattern we should advocate for in example snippets (and potentially change usages in the repo to follow that style too).

We have two use cases around resetting values, and only one needs the reset all filters.

  1. When the ToolsPanel is created, it has a fixed set of child ToolsPanelItems, which aren't rendered via slot fills into the panel. This means the ToolsPanel can know what needs to be reset or executed for the resetAll function and can avoid individual items needing to define resetAllFilter. The best examples here are the Global Styles panels in the site editor e.g. Dimensions Panel.
  2. The ToolsPanel renders a slot that may contain an unknown number of child ToolsPanelItems. In this case, the consumer of the ToolsPanel needs to rely on each ToolsPanelItem specifying how to effect its reset via the resetAllFilter callback. The primary examples of this are the block support panels in the block editor.

Outside of our editors and their block support panels, I believe the first use case above would be the most common. We'd probably be best served to lean towards demonstrating it in our JSDoc example snippets. The Storybook is there to demonstrate the more edge case use of SlotFills with the ToolsPanel.

I'll push a commit shortly that might form the basis for our example snippet.

Copy link
Contributor

Choose a reason for hiding this comment

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

It might also be worth noting that the passing of the attributes arg to the resetAllFilter only came about due to needing to reset only specific properties within nested objects, e.g. only radius, and not color, width, and style, within a style.border attribute.

Keeping any example use of the ToolsPanel simple sounds like a win. If a consumer's use case is more complicated the extra Storybook examples provide direction.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Agreed, let's showcase the simple usage (ie. without resetAllFilter) in our example snippets

Comment on lines 98 to 101
hasInnerWrapper={ true }
shouldRenderPlaceholderItems={ true }
__experimentalFirstVisibleItemClass="first"
__experimentalLastVisibleItemClass="last"
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Moved these from being hardcoded values, to being parameters (passed via ToolsPanelWithItemGroupSlot.args).

I then had to add prop types for ToolsPanelItems.Slot, although this is still quite messy due to the mixing of ToolsPanel-specific props with other generic (any) props that get forwarded to Slot

@@ -112,23 +135,27 @@ export const _default = () => {
</PanelWrapperView>
);
};
Default.args = {
label: 'Tools Panel (default example)',
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Ideally we should pass children to ToolsPanel via the children prop in the args object. But given how intertwined ToolsPanel and ToolsPanelItem components are in these stories, for now I've decided to keep them as they were

@ciampo
Copy link
Contributor Author

ciampo commented Feb 9, 2023

Hey @aaronrobertshaw , could you take a good look at this PR and let me know if these changes make sense, in the context of ToolsPanel ?

I left a detailed list of what's in this PR in the description above. I've also left inline comments — some of them go in details about the changes that I've applied, but others are pointing at parts of the PR that are still incomplete.

If you want to push changes to this branch, feel free to take over the PR and do so!

Thank you 🙏

@ciampo ciampo marked this pull request as ready for review February 9, 2023 21:35
@ciampo ciampo requested a review from ajitbohra as a code owner February 9, 2023 21:35
Copy link
Contributor

@aaronrobertshaw aaronrobertshaw left a comment

Choose a reason for hiding this comment

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

Great work here @ciampo

This is looking really good so far. It's great to see the ToolsPanel's kinks being ironed out and the component brought up to scratch.

In general, it tests well for me. The only issues I spotted were a couple of minor copy-and-paste errors in the storybook examples resetAll functions.

I've also left a couple of replies to inline comments and questions that might allow us to fix the incorrect resetAllFilter type and cull a very edge case story.

✅ Unit tests pass & no typing errors
✅ No issues found while smoke testing in editors
❓ Only minor reset all issue in storybook examples. Once fixed locally, I couldn't spot any other issues with them.

packages/components/src/tools-panel/stories/index.tsx Outdated Show resolved Hide resolved
packages/components/src/tools-panel/stories/index.tsx Outdated Show resolved Hide resolved
@ciampo
Copy link
Contributor Author

ciampo commented Feb 10, 2023

Hey @aaronrobertshaw , thank you for the review and the extra context!

I went ahead and addressed all feedback — all type errors should be gone!

The only "pending" item is the ResetAllFilter type (see convo here).

Apart from that, it would be great if as part of your final review you could:

  • double check that code, types.ts and READMEs are all in sync
  • double check that code snippets in JDDocs and READMEs reflect a correct usage of the components, especially after the tweaks included in this PR
  • double check that usages in the rest of the repo also follow the current types correctly

Thank you for your patience 🙇

Copy link
Contributor

@aaronrobertshaw aaronrobertshaw left a comment

Choose a reason for hiding this comment

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

This is testing well for me on all fronts now; nice work 👍

✅ Unit tests pass & no typing errors
✅ No issues found while smoke testing in editors
✅ Storybook examples function as expected

Apart from that, it would be great if as part of your final review you could:

  • double check that code, types.ts and READMEs are all in sync

✅ I didn't spot anything amiss between the code, types.ts, and READMEs

double check that code snippets in JDDocs and READMEs reflect a correct usage of the components, especially after the tweaks included in this PR

✅ JSDoc and README examples appear correct to me. It was more the types that were fixed to match existing usage.

double check that usages in the rest of the repo also follow the current types correctly

✅ Manually went through ToolsPanel uses in Gutenberg and didn't spot any misuse of components or incorrect types.


Before giving my final review, I tweaked the export of the ToolsPanel and ToolsPanelItem components from their respective component.tsx files so that their JSDoc descriptions were included in the Storybook docs. (c0c86d0)

I also added a JSDoc example for the ToolsPanel. That might be worth double checking before merging. (b4ec301)

From my end though, this looks good to go 🚢

@ciampo
Copy link
Contributor Author

ciampo commented Feb 13, 2023

Before giving my final review, I tweaked the export of the ToolsPanel and ToolsPanelItem components from their respective component.tsx files so that their JSDoc descriptions were included in the Storybook docs. (c0c86d0)

I missed that, thank you for pushing that change!

I also added a JSDoc example for the ToolsPanel. That might be worth double checking before merging. (b4ec301)

Looks good too!

This is testing well for me on all fronts now; nice work 👍
From my end though, this looks good to go 🚢

Awesome, thank you! I'll plan on opening a PR to refactor unit tests too soon, so that the whole component gets refactored to TypeScript.

@ciampo ciampo enabled auto-merge (squash) February 13, 2023 08:08
@ciampo ciampo force-pushed the refactor/tools-panel-storybook-typescript branch from b4ec301 to c6ecc6b Compare February 13, 2023 08:10
@ciampo ciampo merged commit a0ef113 into trunk Feb 13, 2023
@ciampo ciampo deleted the refactor/tools-panel-storybook-typescript branch February 13, 2023 08:34
@github-actions github-actions bot added this to the Gutenberg 15.2 milestone Feb 13, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Package] Components /packages/components [Type] Code Quality Issues or PRs that relate to code quality
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants