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 component: refactor to typescript #34028

Merged
merged 22 commits into from
Sep 23, 2021

Conversation

glendaviesnz
Copy link
Contributor

@glendaviesnz glendaviesnz commented Aug 12, 2021

Description

Converts the ToolsPanel component to typescript. Also adds type annotations to the Menu components that it uses.

How has this been tested?

  • Check that linting and typescript compile checks all complete successfully
  • Add margin support to the Group block and add a group block and make sure the dimensions panel all works as expected.

@glendaviesnz glendaviesnz added the [Status] In Progress Tracking issues with work in progress label Aug 12, 2021
@glendaviesnz glendaviesnz self-assigned this Aug 12, 2021
@github-actions
Copy link

github-actions bot commented Aug 12, 2021

Size Change: +79 B (0%)

Total Size: 1.06 MB

Filename Size Change
build/components/index.min.js 209 kB +79 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 134 kB
build/block-editor/style-rtl.css 13.9 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 78 B
build/block-library/blocks/group/theme.css 78 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 568 B
build/block-library/blocks/navigation-link/editor.css 570 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-submenu/editor-rtl.css 300 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation-submenu/style-rtl.css 195 B
build/block-library/blocks/navigation-submenu/style.css 195 B
build/block-library/blocks/navigation-submenu/view.min.js 343 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.48 kB
build/block-library/blocks/navigation/style.css 1.47 kB
build/block-library/blocks/navigation/view.min.js 2.74 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 377 B
build/block-library/blocks/page-list/editor.css 377 B
build/block-library/blocks/page-list/style-rtl.css 198 B
build/block-library/blocks/page-list/style.css 198 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 273 B
build/block-library/blocks/paragraph/style.css 273 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 262 B
build/block-library/blocks/query-pagination/editor.css 255 B
build/block-library/blocks/query-pagination/style-rtl.css 234 B
build/block-library/blocks/query-pagination/style.css 231 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.76 kB
build/block-library/editor.css 9.75 kB
build/block-library/index.min.js 147 kB
build/block-library/reset-rtl.css 527 B
build/block-library/reset.css 527 B
build/block-library/style-rtl.css 10.3 kB
build/block-library/style.css 10.3 kB
build/block-library/theme-rtl.css 665 B
build/block-library/theme.css 669 B
build/block-serialization-default-parser/index.min.js 1.09 kB
build/block-serialization-spec-parser/index.min.js 2.79 kB
build/blocks/index.min.js 47 kB
build/components/style-rtl.css 15.9 kB
build/components/style.css 15.9 kB
build/compose/index.min.js 10.3 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.45 kB
build/edit-navigation/index.min.js 15.5 kB
build/edit-navigation/style-rtl.css 3.69 kB
build/edit-navigation/style.css 3.69 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.18 kB
build/edit-post/style.css 7.17 kB
build/edit-site/index.min.js 27.4 kB
build/edit-site/style-rtl.css 5.21 kB
build/edit-site/style.css 5.21 kB
build/edit-widgets/index.min.js 16.1 kB
build/edit-widgets/style-rtl.css 4.09 kB
build/edit-widgets/style.css 4.09 kB
build/editor/index.min.js 37.4 kB
build/editor/style-rtl.css 3.76 kB
build/editor/style.css 3.75 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.72 kB
build/keycodes/index.min.js 1.3 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.5 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.11 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.04 kB

compressed-size-action

@ciampo ciampo added [Feature] Component System WordPress component system [Package] Components /packages/components [Type] Code Quality Issues or PRs that relate to code quality labels Aug 23, 2021
@ciampo
Copy link
Contributor

ciampo commented Sep 2, 2021

Just an FYI that the PolymorphicComponent* types have all been renamed to WordPressComponent* in #34330

A rebase + refactor of all types beginning with PolymorphicComponent* should do it!

@ciampo ciampo mentioned this pull request Sep 2, 2021
62 tasks
@glendaviesnz
Copy link
Contributor Author

A rebase + refactor of all types beginning with PolymorphicComponent* should do it!

Thanks for letting me know @ciampo

@glendaviesnz glendaviesnz force-pushed the refactor/tools-panel-to-typescript branch from 16f6def to 9f13cfa Compare September 2, 2021 22:04
@ciampo
Copy link
Contributor

ciampo commented Sep 6, 2021

Hey @glendaviesnz , for the sake of coordinating/tracking work related to components and global styles sidebar, do you have an estimate of when this PR is going to be ready for review?

@glendaviesnz
Copy link
Contributor Author

glendaviesnz commented Sep 6, 2021

do you have an estimate of when this PR is going to be ready for review?

@ciampo, this was waiting on some refactors of this component that @aaronrobertshaw has on the go - we were planning to take the hit on the conflicts on this PR, rather than complicate those other PRs by merging this first. Aaron, do you have any thoughts on timelines for the other ToolsPanel work that is underway?

@ciampo
Copy link
Contributor

ciampo commented Sep 7, 2021

@ciampo, this was waiting on some refactors of this component that @aaronrobertshaw has on the go - we were planning to take the hit on the conflicts on this PR, rather than complicate those other PRs by merging this first. Aaron, do you have any thoughts on timelines for the other ToolsPanel work that is underway?

Thank you for the explanation! I guess you're referring to #34530 ?

I understand that you'd rather handle conflicts in this PR than slowing down other open PRs — I'd just like to make sure that this PR doesn't get too de-prioritised, since it looks like the ToolsPanel component may keep receiving tweaks in the short term as we iterate on its UX. Converting the component to TypeScript can actually be of help to speed up future refactors and catch early small bugs!

@aaronrobertshaw
Copy link
Contributor

Aaron, do you have any thoughts on timelines for the other ToolsPanel work that is underway?

I believe the primary PR is #34157 with #34530 secondary to that.

It looks like we might be able to merge #34157 and handle passing the tools panel context through the slot's fillProps in a separate PR. Either way, that should be very close.

It's less clear how long #34530 might take. This one is less critical so if needed it could be redone after the TypeScript conversion.

I'd just like to make sure that this PR doesn't get too de-prioritised

The TypeScript conversion is definitely a priority and the need to make that happen has been discussed a few times in recent days. At this point, the path of least resistance still appears to be as @glendaviesnz suggested, handling the conflicts in this PR and completing the conversion prior to any further tweaks.

For some additional background, the reason for #34157 being done before the conversion was to attempt to resolve an issue with duplicate "Dimensions" panels for the Cover block in the last release.

@ciampo
Copy link
Contributor

ciampo commented Sep 7, 2021

Thank you for the explanation, @aaronrobertshaw! I'll keep my eyes open for future progress on this PR once #34157 (and follow-ups) get merged!

@glendaviesnz glendaviesnz force-pushed the refactor/tools-panel-to-typescript branch from 9f13cfa to 2052c1b Compare September 15, 2021 04:53
Copy link
Contributor

@andrewserong andrewserong left a comment

Choose a reason for hiding this comment

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

Nice work here @glendaviesnz! I just left a couple of comments about the DropDownMenu props types — I know this is is a WIP, and my TypeScript skills a pretty rusty, so apologies if the comments aren't relevant or if you were in the middle of working on it 🙂

packages/components/src/dropdown-menu/types.ts Outdated Show resolved Hide resolved
packages/components/src/dropdown-menu/types.ts Outdated Show resolved Hide resolved
@glendaviesnz glendaviesnz changed the title [WIP] ToolsPanel component: refactor to typescript ToolsPanel component: refactor to typescript Sep 16, 2021
@glendaviesnz glendaviesnz removed the [Status] In Progress Tracking issues with work in progress label Sep 16, 2021
@glendaviesnz
Copy link
Contributor Author

@ciampo this is ready for some review now. This is the first bit of typescript I have done in quite some time, so very open to feedback on this.

Copy link
Contributor

@ciampo ciampo left a comment

Choose a reason for hiding this comment

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

Hey @glendaviesnz , thank you for working on this PR!

I've noticed that this PR includes changes to four components: DropdownMenu, MenuGroup, MenuItem and ToolsPanel. I believe we should have a separate PR for each of these components, which will the review process a lot easier and more focused:

  • I propose we keep this PR focused on ToolsPanel — if you get any TypeScript error when importing dependencies into the ToolsPanel's TypeScript files, you can add // @ts-nocheck at the start of the imported file to temporarily suppress those warning (see an example of this for the Popover component)
  • We can open follow-up PRs to take care of typing MenuGroup and MenuItem. Typing the DropdownMenu extensively can be complicated, given how many of its props reference other components' props (popoverProps, toggleProps, menuProps) and how the arguments of the children prop depend on the Dropdown's renderContent prop — we should skip this for now

Apart from that, I noticed that some of the files in the tools-panel folder are still with the .js extension — ideally, we'd want to convert all JS files to .ts(x) (with the only exception of stories/index.js).

@aaronrobertshaw
Copy link
Contributor

I believe we should have a separate PR for each of these components, which will the review process a lot easier and more focused:

The DropdownMenu, MenuGroup and MenuItem doc block type annotations have been removed from this PR so they can be handled separately as suggested.

Apart from that, I noticed that some of the files in the tools-panel folder are still with the .js extension — ideally, we'd want to convert all JS files to .ts(x) (with the only exception of stories/index.js).

I've switched the remaining ToolsPanel files from js to ts (all except stories/index.js and test/index.js).


After making these changes:

  • Unit tests are still passing
  • ToolsPanel functions correctly still in storybook and editor
  • Prior to adding ts-nocheck to the ToolsPanelHeader file, the only lint errors were those relating to DropdownMenu, MenuGroup and MenuItem as expected after rolling back those changes.
  • After adding ts-nocheck there are no remaining linting errors.

@ciampo Would it be best to create new PRs for MenuGroup/MenuItem etc using the doc block annotations removed from this PR as their basis? So that those can be merged quickly, or should the new PRs aim to complete a full conversion to TypeScript for those components?

Copy link
Contributor

@ciampo ciampo left a comment

Choose a reason for hiding this comment

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

I've switched the remaining ToolsPanel files from js to ts

Thank you!

the only lint errors were those relating to DropdownMenu, MenuGroup and MenuItem as expected after rolling back those changes.
After adding ts-nocheck there are no remaining linting errors.

My bad, I haven't explained myself clearly enough. The // @ts-nockeck comment shouldn't be added to ToolsPanel — it should be added, instead, to all of the dependencies that ToolsPanel pulls in (DropdownMenu, MenuGroup, MenuItem, and recursively all of their local dependencies).

These are the steps that I would follow:

  1. Remove the // @ts-nocheck comment from ToolsPanelHeader
  2. Add the src/tools-panel/**/* folder to tsconfig.json. This step is actually necessary to add the component to the TypeScript project, and thus enable TypeScript checks (so far they were not! My bad for not noticing this until now)
  3. Run npm run dev and find all the errors that refer to files outside of the src/tools-panel/ folder. We should add // @ts-nocheck at the start of each of those files, and add their folders to tsconfig.json (similarly to what done in step 2). In our case, the folders should be src/dropdown/**/*, src/dropdown-menu/**/*, src/menu-item/**/*, src/menu-group/**/* and src/navigable-container/**/*.
  4. At this point, the MenuGroup, MenuItem and DropdownMenu components are still showing errors inside ToolsPanelHeader. To solve them, we need to slightly refactor these components and move the props destructuring away from the function signature — this is to prevent TypeScript from inferring the types of these props. For the same reason, we will also need to temporarily delete the JSDoc types of MenuItem (but we will add those back soon enough when converting it to TypeScript). (thank you @sarayourfriend for helping with this step!)

To speed things up, I've prepared a diff with all the changes that would result from the above steps

Click to expand
diff --git a/packages/components/src/dropdown-menu/index.js b/packages/components/src/dropdown-menu/index.js
index f2ae27cd91..e347007923 100644
--- a/packages/components/src/dropdown-menu/index.js
+++ b/packages/components/src/dropdown-menu/index.js
@@ -34,22 +34,24 @@ function mergeProps( defaultProps = {}, props = {} ) {
 	return mergedProps;
 }
 
-function DropdownMenu( {
-	children,
-	className,
-	controls,
-	icon = menu,
-	label,
-	popoverProps,
-	toggleProps,
-	menuProps,
-	disableOpenOnArrowDown = false,
-	text,
-	// The following props exist for backward compatibility.
-	menuLabel,
-	position,
-	noIcons,
-} ) {
+function DropdownMenu( props ) {
+	const {
+		children,
+		className,
+		controls,
+		icon = menu,
+		label,
+		popoverProps,
+		toggleProps,
+		menuProps,
+		disableOpenOnArrowDown = false,
+		text,
+		// The following props exist for backward compatibility.
+		menuLabel,
+		position,
+		noIcons,
+	} = props;
+
 	if ( menuLabel ) {
 		deprecated( '`menuLabel` prop in `DropdownComponent`', {
 			since: '5.3',
diff --git a/packages/components/src/dropdown/index.js b/packages/components/src/dropdown/index.js
index ebee9c2b5a..09477a87e0 100644
--- a/packages/components/src/dropdown/index.js
+++ b/packages/components/src/dropdown/index.js
@@ -1,3 +1,4 @@
+// @ts-nocheck
 /**
  * External dependencies
  */
diff --git a/packages/components/src/menu-group/index.js b/packages/components/src/menu-group/index.js
index 19e182ddc7..6054bfcb3e 100644
--- a/packages/components/src/menu-group/index.js
+++ b/packages/components/src/menu-group/index.js
@@ -1,3 +1,4 @@
+// @ts-nocheck
 /**
  * External dependencies
  */
@@ -9,12 +10,8 @@ import classnames from 'classnames';
 import { Children } from '@wordpress/element';
 import { useInstanceId } from '@wordpress/compose';
 
-export function MenuGroup( {
-	children,
-	className = '',
-	label,
-	hideSeparator,
-} ) {
+export function MenuGroup( props ) {
+	const { children, className = '', label, hideSeparator } = props;
 	const instanceId = useInstanceId( MenuGroup );
 
 	if ( ! Children.count( children ) ) {
diff --git a/packages/components/src/menu-item/index.js b/packages/components/src/menu-item/index.js
index 8bed60d84d..f8a97b801b 100644
--- a/packages/components/src/menu-item/index.js
+++ b/packages/components/src/menu-item/index.js
@@ -1,3 +1,4 @@
+// @ts-nocheck
 /**
  * External dependencies
  */
@@ -16,23 +17,8 @@ import Shortcut from '../shortcut';
 import Button from '../button';
 import Icon from '../icon';
 
-/**
- * Renders a generic menu item for use inside the more menu.
- *
- * @param {Object}        props                   Component props.
- * @param {WPElement}     props.children          Element to render as child of button.
- * @param {string}        props.info              Text to use as description for button text.
- * @param {string}        props.className         Class to set on the container.
- * @param {WPIcon}        props.icon              Button's `icon` prop.
- * @param {string|Object} props.shortcut          Shortcut's `shortcut` prop.
- * @param {boolean}       props.isSelected        Whether or not the menu item is currently selected.
- * @param {string}        [props.role="menuitem"] ARIA role of the menu item.
- * @param {Object}        ref                     React Element ref.
- *
- * @return {WPComponent} The component to be rendered.
- */
-export function MenuItem(
-	{
+export function MenuItem( props, ref ) {
+	let {
 		children,
 		info,
 		className,
@@ -40,10 +26,9 @@ export function MenuItem(
 		shortcut,
 		isSelected,
 		role = 'menuitem',
-		...props
-	},
-	ref
-) {
+		...buttonProps
+	} = props;
+
 	className = classnames( 'components-menu-item__button', className );
 
 	if ( info ) {
@@ -72,7 +57,7 @@ export function MenuItem(
 			}
 			role={ role }
 			className={ className }
-			{ ...props }
+			{ ...buttonProps }
 		>
 			<span className="components-menu-item__item">{ children }</span>
 			<Shortcut
diff --git a/packages/components/src/navigable-container/container.js b/packages/components/src/navigable-container/container.js
index 68734f89be..360bcb21b9 100644
--- a/packages/components/src/navigable-container/container.js
+++ b/packages/components/src/navigable-container/container.js
@@ -1,3 +1,4 @@
+// @ts-nocheck
 /**
  * External dependencies
  */
diff --git a/packages/components/src/navigable-container/index.js b/packages/components/src/navigable-container/index.js
index e98f1b1236..b47667fd39 100644
--- a/packages/components/src/navigable-container/index.js
+++ b/packages/components/src/navigable-container/index.js
@@ -1,3 +1,4 @@
+// @ts-nocheck
 /**
  * Internal Dependencies
  */
diff --git a/packages/components/src/navigable-container/menu.js b/packages/components/src/navigable-container/menu.js
index 6e0dc794d0..df238853df 100644
--- a/packages/components/src/navigable-container/menu.js
+++ b/packages/components/src/navigable-container/menu.js
@@ -1,3 +1,4 @@
+// @ts-nocheck
 /**
  * External dependencies
  */
diff --git a/packages/components/src/navigable-container/tabbable.js b/packages/components/src/navigable-container/tabbable.js
index bc572522e9..00ba8117b8 100644
--- a/packages/components/src/navigable-container/tabbable.js
+++ b/packages/components/src/navigable-container/tabbable.js
@@ -1,3 +1,4 @@
+// @ts-nocheck
 /**
  * WordPress dependencies
  */
diff --git a/packages/components/src/tools-panel/tools-panel-header/component.tsx b/packages/components/src/tools-panel/tools-panel-header/component.tsx
index 2ef7ab290c..50f6b1564a 100644
--- a/packages/components/src/tools-panel/tools-panel-header/component.tsx
+++ b/packages/components/src/tools-panel/tools-panel-header/component.tsx
@@ -1,7 +1,3 @@
-// This can be removed once typing has been completed for DropdownMenu,
-// MenuGroup & MenuItem.
-// @ts-nocheck
-
 /**
  * External dependencies
  */
diff --git a/packages/components/tsconfig.json b/packages/components/tsconfig.json
index a0a0e879a3..cd26b356e6 100644
--- a/packages/components/tsconfig.json
+++ b/packages/components/tsconfig.json
@@ -31,6 +31,8 @@
 		"src/disabled/**/*",
 		"src/divider/**/*",
 		"src/draggable/**/*",
+		"src/dropdown/**/*",
+		"src/dropdown-menu/**/*",
 		"src/elevation/**/*",
 		"src/flex/**/*",
 		"src/flyout/**/*",
@@ -41,6 +43,9 @@
 		"src/item-group/**/*",
 		"src/input-control/**/*",
 		"src/icon/**/*",
+		"src/menu-item/**/*",
+		"src/menu-group/**/*",
+		"src/navigable-container/**/*",
 		"src/number-control/**/*",
 		"src/popover/**/*",
 		"src/range-control/**/*",
@@ -55,6 +60,7 @@
 		"src/text/**/*",
 		"src/tip/**/*",
 		"src/toggle-group-control/**/*",
+		"src/tools-panel/**/*",
 		"src/tooltip/**/*",
 		"src/truncate/**/*",
 		"src/ui/**/*",

Now that the issues related to dependencies should be solved, and since we've added the src/tools-panel/**/* folder to tsconfig.json, TypeScript should flag all of the remaining errors on the ToolsPanel set of components that still need addressing.

Would it be best to create new PRs for MenuGroup/MenuItem etc using the doc block annotations removed from this PR as their basis? So that those can be merged quickly, or should the new PRs aim to complete a full conversion to TypeScript for those components?

I would prefer if we could achieve a full conversion of both MenuGroup and MenuItem to TypeScript in two separate PRs — both components are quite small and the conversion shouldn't be too complicated. You can definitely use the annotations that were part of this PR as a starting point! I would also recommend focusing on this PR first and opening those 2 PRs as follow-ups.

@aaronrobertshaw
Copy link
Contributor

Thanks for the detailed feedback, explanation and diff @ciampo! It helped me a lot.

I've applied the diff and had a go (with the assistance of @glendaviesnz) at resolving all the typing errors that were exposed. I expect that there will probably be better approaches in some cases than what I've taken. Let me know what needs improving and I'll make it happen 🙂

As it stands now, after these updates, the ToolsPanel is functioning correctly for me in the storybook, editor and unit tests.

Glen Davies and others added 22 commits September 23, 2021 10:29
The typing for DropdownMenu, MenuGroup and MenuItem will be handled separately and may entail a full TypeScript conversion rather than only doc block annotations.
Removes redundant typing, improves naming and adds JSDocs etc
In order to prevent excessive renders and guard against consumers not memoizing the hasValue and resetAllFilter functions, these changes include useCallback calls to handle this before adding them to the hook dependencies.
@aaronrobertshaw aaronrobertshaw force-pushed the refactor/tools-panel-to-typescript branch from 1be2e7b to 1f833ab Compare September 23, 2021 00:36
@aaronrobertshaw aaronrobertshaw merged commit 1620d51 into trunk Sep 23, 2021
@aaronrobertshaw aaronrobertshaw deleted the refactor/tools-panel-to-typescript branch September 23, 2021 01:23
@github-actions github-actions bot added this to the Gutenberg 11.7 milestone Sep 23, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] Component System WordPress component system [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.

6 participants