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

BoxControl: Convert to TypeScript #47622

Merged
merged 29 commits into from
Feb 2, 2023
Merged

BoxControl: Convert to TypeScript #47622

merged 29 commits into from
Feb 2, 2023

Conversation

mirka
Copy link
Member

@mirka mirka commented Jan 31, 2023

Part of #35744

What?

Converts the BoxControl component to TypeScript, including tests.

📌 To cut down on scope, Storybook stories were not converted in this PR.

How?

See inline comments for details.

Testing Instructions

npm run storybook:dev and see the Docs view for BoxControl.

@mirka mirka added the [Package] Components /packages/components label Jan 31, 2023
@mirka mirka self-assigned this Jan 31, 2023
@github-actions
Copy link

github-actions bot commented Jan 31, 2023

Size Change: +2.15 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 192 kB +130 B (0%)
build/block-library/blocks/avatar/style-rtl.css 91 B +7 B (+8%) 🔍
build/block-library/blocks/avatar/style.css 91 B +7 B (+8%) 🔍
build/block-library/blocks/post-excerpt/style-rtl.css 134 B +65 B (+94%) 🆘
build/block-library/blocks/post-excerpt/style.css 134 B +65 B (+94%) 🆘
build/block-library/index.min.js 199 kB +424 B (0%)
build/block-library/style-rtl.css 12.5 kB +41 B (0%)
build/block-library/style.css 12.5 kB +41 B (0%)
build/components/index.min.js 203 kB +2 B (0%)
build/compose/index.min.js 12.3 kB +2 B (0%)
build/customize-widgets/index.min.js 11.8 kB +27 B (0%)
build/edit-post/index.min.js 34.5 kB -26 B (0%)
build/edit-site/index.min.js 64.2 kB +1.14 kB (+2%)
build/edit-site/style-rtl.css 9.65 kB +213 B (+2%)
build/edit-site/style.css 9.65 kB +206 B (+2%)
build/edit-widgets/index.min.js 16.9 kB -1 B (0%)
build/editor/index.min.js 45.5 kB -31 B (0%)
build/editor/style-rtl.css 3.57 kB -105 B (-3%)
build/editor/style.css 3.57 kB -100 B (-3%)
ℹ️ 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-editor/style-rtl.css 14.3 kB
build/block-editor/style.css 14.3 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/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-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/common-rtl.css 1.05 kB
build/block-library/common.css 1.05 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.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/blocks/index.min.js 50.4 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/style-rtl.css 7.46 kB
build/edit-post/style.css 7.45 kB
build/edit-widgets/style-rtl.css 4.49 kB
build/edit-widgets/style.css 4.49 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/keycodes/index.min.js 1.88 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

Comment on lines 51 to 55
Props for the internal [UnitControl](../unit-control) components.

- Type: `Object`
- Required: No
- Default: `{ min: 0 }`
Copy link
Member Author

Choose a reason for hiding this comment

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

These props are actually passed through to UnitControl, not InputControl. Why does it matter? InputControlProps[ 'max' ] is string but UnitControlProps[ 'max' ] is number ☠️

Copy link
Contributor

Choose a reason for hiding this comment

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

😵‍💫 Hopefully this will be progressively addressed as we work our way up from NumberControl

const allValue = getAllValue( values, selectedUnits, sides );
const hasValues = isValuesDefined( values );
const isMixed = hasValues && isValuesMixed( values, selectedUnits, sides );
const allPlaceholder = isMixed ? LABELS.mixed : null;
const allPlaceholder = isMixed ? LABELS.mixed : undefined;
Copy link
Member Author

Choose a reason for hiding this comment

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

The placeholder prop on inputs do not accept null.

const handleOnChange = ( next ) => {
const isNumeric = ! isNaN( parseFloat( next ) );
const handleOnChange: UnitControlProps[ 'onChange' ] = ( next ) => {
const isNumeric = next !== undefined && ! isNaN( parseFloat( next ) );
Copy link
Member Author

Choose a reason for hiding this comment

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

Just making the undefined case explicit. Should not change runtime behavior.

@@ -132,7 +166,7 @@ export default function BoxControl( {
<FlexItem>
<Button
className="component-box-control__reset-button"
isSecondary
variant="secondary"
Copy link
Member Author

Choose a reason for hiding this comment

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

Updated a deprecated prop.

export function isValuesMixed( values = {}, selectedUnits, sides = ALL_SIDES ) {
export function isValuesMixed(
values: BoxControlValue = {},
selectedUnits?: BoxControlValue,
Copy link
Member Author

Choose a reason for hiding this comment

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

I marked some of these as optional to match how the functions were actually being used in the code. For example:

! hasInitialValue || ! isValuesMixed( inputValues ) || hasOneSide

@mirka mirka marked this pull request as ready for review January 31, 2023 20:25
@mirka mirka requested a review from ajitbohra as a code owner January 31, 2023 20:25
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 to see the BoxControl getting the TypeScript treatment. Nice work @mirka 👍

This is testing pretty well for me.

✅ No typing errors
✅ Unit tests pass
✅ BoxControl functions well in the Storybook
✅ No issues were spotted while smoke testing in the editors

I just have a couple of minor nitpick comments and questions.

❓ There are a few linting issues now in the utils.ts file.
❓ Should we have a description for the id property in the BoxControlProps for completeness
❓ Some of the prop descriptions differ between the types and the readme e.g. label, values

What's our preferred approach to our component readmes? Should they only outline the props for that component specifically or also all the ones that are passed through to an inner component, e.g. UnitControl?

Previously, I was also advised we are trying to update the formatting of our readmes when we convert components to TypeScript. Do we need to update the readme props to the following format?

### `propName`: `type`

Prop description.

-   Required: No
-   Default: `value`
Example diff to fix linting errors
diff --git a/packages/components/src/box-control/types.ts b/packages/components/src/box-control/types.ts
index 541d1f3a5d..022334d948 100644
--- a/packages/components/src/box-control/types.ts
+++ b/packages/components/src/box-control/types.ts
@@ -73,7 +73,7 @@ export type BoxControlInputControlProps = UnitControlPassthroughProps & {
 	onChange?: ( nextValues: BoxControlValue ) => void;
 	onFocus?: (
 		_event: React.FocusEvent< HTMLInputElement >,
-		{ side: nextSide }: { side: keyof typeof LABELS }
+		{ side }: { side: keyof typeof LABELS }
 	) => void;
 	onHoverOff?: (
 		sides: Partial< Record< keyof BoxControlValue, boolean > >
diff --git a/packages/components/src/box-control/utils.ts b/packages/components/src/box-control/utils.ts
index e4d2b23a1a..d28cc85f36 100644
--- a/packages/components/src/box-control/utils.ts
+++ b/packages/components/src/box-control/utils.ts
@@ -33,7 +33,7 @@ export const ALL_SIDES = [ 'top', 'right', 'bottom', 'left' ] as const;
  * Gets an items with the most occurrence within an array
  * https://stackoverflow.com/a/20762713
  *
- * @param  arr Array of items to check.
+ * @param arr Array of items to check.
  * @return The item with the most occurrences.
  */
 function mode< T >( arr: T[] ) {
@@ -49,9 +49,9 @@ function mode< T >( arr: T[] ) {
 /**
  * Gets the 'all' input value and unit from values data.
  *
- * @param  values         Box values.
- * @param  selectedUnits  Box units.
- * @param  availableSides Available box sides to evaluate.
+ * @param values         Box values.
+ * @param selectedUnits  Box units.
+ * @param availableSides Available box sides to evaluate.
  *
  * @return A value + unit for the 'all' input.
  */
@@ -102,8 +102,8 @@ export function getAllValue(
 /**
  * Determine the most common unit selection to use as a fallback option.
  *
- * @param  selectedUnits Current unit selections for individual sides.
- * @return  Most common unit selection.
+ * @param selectedUnits Current unit selections for individual sides.
+ * @return Most common unit selection.
  */
 export function getAllUnitFallback( selectedUnits?: BoxControlValue ) {
 	if ( ! selectedUnits || typeof selectedUnits !== 'object' ) {
@@ -118,9 +118,9 @@ export function getAllUnitFallback( selectedUnits?: BoxControlValue ) {
 /**
  * Checks to determine if values are mixed.
  *
- * @param  values        Box values.
- * @param  selectedUnits Box units.
- * @param  sides         Available box sides to evaluate.
+ * @param values        Box values.
+ * @param selectedUnits Box units.
+ * @param sides         Available box sides to evaluate.
  *
  * @return Whether values are mixed.
  */
@@ -138,9 +138,9 @@ export function isValuesMixed(
 /**
  * Checks to determine if values are defined.
  *
- * @param  values Box values.
+ * @param values Box values.
  *
- * @return  Whether values are mixed.
+ * @return Whether values are mixed.
  */
 export function isValuesDefined( values?: BoxControlValue ) {
 	return (
@@ -158,8 +158,8 @@ export function isValuesDefined( values?: BoxControlValue ) {
  * Get initial selected side, factoring in whether the sides are linked,
  * and whether the vertical / horizontal directions are grouped via splitOnAxis.
  *
- * @param  isLinked    Whether the box control's fields are linked.
- * @param  splitOnAxis Whether splitting by horizontal or vertical axis.
+ * @param isLinked    Whether the box control's fields are linked.
+ * @param splitOnAxis Whether splitting by horizontal or vertical axis.
  * @return The initial side.
  */
 export function getInitialSide( isLinked: boolean, splitOnAxis: boolean ) {
@@ -178,7 +178,7 @@ export function getInitialSide( isLinked: boolean, splitOnAxis: boolean ) {
  * to their appropriate sides to facilitate correctly determining value for
  * all input control.
  *
- * @param  sides Available sides for box control.
+ * @param sides Available sides for box control.
  * @return Normalized sides configuration.
  */
 export function normalizeSides( sides: BoxControlProps[ 'sides' ] ) {
@@ -204,9 +204,9 @@ export function normalizeSides( sides: BoxControlProps[ 'sides' ] ) {
  * Applies a value to an object representing top, right, bottom and left sides
  * while taking into account any custom side configuration.
  *
- * @param  currentValues The current values for each side.
- * @param  newValue      The value to apply to the sides object.
- * @param  sides         Array defining valid sides.
+ * @param currentValues The current values for each side.
+ * @param newValue      The value to apply to the sides object.
+ * @param sides         Array defining valid sides.
  *
  * @return Object containing the updated values for each side.
  */

packages/components/src/box-control/types.ts Outdated Show resolved Hide resolved
@mirka
Copy link
Member Author

mirka commented Feb 1, 2023

Thanks for the review! All feedback has been addresssed 👍

❓ There are a few linting issues now in the utils.ts file.

Interesting, seems like my local linting rules were outdated and were enforcing a slightly different alignment. An npm install made the newer warnings show up. ✅

❓ Should we have a description for the id property in the BoxControlProps for completeness
❓ Some of the prop descriptions differ between the types and the readme e.g. label, values

Addressed ✅
Sometimes the differences come from the fact that we reuse TS type descriptions from other components. I tend to keep the TS type descriptions more "generalized" for this reason (e.g. don't mention the specific component name).

What's our preferred approach to our component readmes? Should they only outline the props for that component specifically or also all the ones that are passed through to an inner component, e.g. UnitControl?

At this point I'm more invested in improving the TS as the source of truth, so we can eventually autogenerate the README props table from the TS data like we do in Storybook. With that in mind, I don't think it's particularly worthwhile to add more things to the READMEs, aside from things that are clearly necessary or fixing blatant inaccuracies.

Previously, I was also advised we are trying to update the formatting of our readmes when we convert components to TypeScript. Do we need to update the readme props to the following format?

Done ✅

@github-actions
Copy link

github-actions bot commented Feb 1, 2023

Flaky tests detected in 1b1d1e5.
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/4075613185
📝 Reported issues:

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.

Thanks for the quick turnaround and explanations on this one @mirka 🚀

LGTM! 🚢

✅ No typing errors or linting issues
✅ Unit tests pass
✅ BoxControl functions well in the Storybook
✅ No issues were spotted while smoke testing in the editors
✅ Readme and types are consistent

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.

Great job! Left a few more (minor) comments, but overall changes look great!

Comment on lines 58 to 60
// @ts-expect-error - event.altKey is only present when the change event was
// triggered by a keyboard event.
if ( event.altKey ) {
Copy link
Contributor

Choose a reason for hiding this comment

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

Not sure it's a better solution, but we could avoid the @ts-expect-error by adding a typecast (and a runtime check for good measure?)

Suggested change
// @ts-expect-error - event.altKey is only present when the change event was
// triggered by a keyboard event.
if ( event.altKey ) {
if (
event.nativeEvent instanceof KeyboardEvent &&
( event as React.KeyboardEvent ).altKey
) {

haven't tested it at runtime, though

Copy link
Member Author

Choose a reason for hiding this comment

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

I'll add a TODO comment here because I think it should be addressed in a different layer, for example in how the upstream change handler passes events. c64c2a6


if ( ! sides?.length ) {
return ALL_SIDES;
}

if ( sides.includes( 'vertical' ) ) {
filteredSides.push( ...[ 'top', 'bottom' ] );
filteredSides.push( ...( [ 'top', 'bottom' ] as const ) );
Copy link
Contributor

Choose a reason for hiding this comment

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

cc @chad1008 this is an example of how as const can be used to tell the TypeScript compiler to narrow types as much as possible.

Without as const, TypeScript would assume string[] — which wouldn't be compatible with the type of filteredSides


/**
* Gets an items with the most occurrence within an array
* https://stackoverflow.com/a/20762713
*
* @param {Array<any>} arr Array of items to check.
* @return {any} The item with the most occurrences.
* @param arr Array of items to check.
Copy link
Contributor

Choose a reason for hiding this comment

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

Eslint auto-corrected the spacing in this file's JSDocs 🤷 eslint(jsdoc/check-line-alignment)

Not sure if my linter config is too strict?
diff --git a/packages/components/src/box-control/utils.ts b/packages/components/src/box-control/utils.ts
index 02bb728abd..e4d2b23a1a 100644
--- a/packages/components/src/box-control/utils.ts
+++ b/packages/components/src/box-control/utils.ts
@@ -33,7 +33,7 @@ export const ALL_SIDES = [ 'top', 'right', 'bottom', 'left' ] as const;
  * Gets an items with the most occurrence within an array
  * https://stackoverflow.com/a/20762713
  *
- * @param arr Array of items to check.
+ * @param  arr Array of items to check.
  * @return The item with the most occurrences.
  */
 function mode< T >( arr: T[] ) {
@@ -49,9 +49,9 @@ function mode< T >( arr: T[] ) {
 /**
  * Gets the 'all' input value and unit from values data.
  *
- * @param values         Box values.
- * @param selectedUnits  Box units.
- * @param availableSides Available box sides to evaluate.
+ * @param  values         Box values.
+ * @param  selectedUnits  Box units.
+ * @param  availableSides Available box sides to evaluate.
  *
  * @return A value + unit for the 'all' input.
  */
@@ -102,7 +102,7 @@ export function getAllValue(
 /**
  * Determine the most common unit selection to use as a fallback option.
  *
- * @param selectedUnits Current unit selections for individual sides.
+ * @param  selectedUnits Current unit selections for individual sides.
  * @return  Most common unit selection.
  */
 export function getAllUnitFallback( selectedUnits?: BoxControlValue ) {
@@ -118,9 +118,9 @@ export function getAllUnitFallback( selectedUnits?: BoxControlValue ) {
 /**
  * Checks to determine if values are mixed.
  *
- * @param values        Box values.
- * @param selectedUnits Box units.
- * @param sides         Available box sides to evaluate.
+ * @param  values        Box values.
+ * @param  selectedUnits Box units.
+ * @param  sides         Available box sides to evaluate.
  *
  * @return Whether values are mixed.
  */
@@ -138,7 +138,7 @@ export function isValuesMixed(
 /**
  * Checks to determine if values are defined.
  *
- * @param values Box values.
+ * @param  values Box values.
  *
  * @return  Whether values are mixed.
  */
@@ -158,8 +158,8 @@ export function isValuesDefined( values?: BoxControlValue ) {
  * Get initial selected side, factoring in whether the sides are linked,
  * and whether the vertical / horizontal directions are grouped via splitOnAxis.
  *
- * @param isLinked    Whether the box control's fields are linked.
- * @param splitOnAxis Whether splitting by horizontal or vertical axis.
+ * @param  isLinked    Whether the box control's fields are linked.
+ * @param  splitOnAxis Whether splitting by horizontal or vertical axis.
  * @return The initial side.
  */
 export function getInitialSide( isLinked: boolean, splitOnAxis: boolean ) {
@@ -178,7 +178,7 @@ export function getInitialSide( isLinked: boolean, splitOnAxis: boolean ) {
  * to their appropriate sides to facilitate correctly determining value for
  * all input control.
  *
- * @param sides Available sides for box control.
+ * @param  sides Available sides for box control.
  * @return Normalized sides configuration.
  */
 export function normalizeSides( sides: BoxControlProps[ 'sides' ] ) {
@@ -204,9 +204,9 @@ export function normalizeSides( sides: BoxControlProps[ 'sides' ] ) {
  * Applies a value to an object representing top, right, bottom and left sides
  * while taking into account any custom side configuration.
  *
- * @param currentValues The current values for each side.
- * @param newValue      The value to apply to the sides object.
- * @param sides         Array defining valid sides.
+ * @param  currentValues The current values for each side.
+ * @param  newValue      The value to apply to the sides object.
+ * @param  sides         Array defining valid sides.
  *
  * @return Object containing the updated values for each side.
  */

Copy link
Contributor

@ciampo ciampo Feb 2, 2023

Choose a reason for hiding this comment

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

Reading this previous answer, I made sure to npm ci from latest trunk to make sure that the linter rules are up to date, and I still got the same diff as in my previous message.

Maybe @aaronrobertshaw 's local lint rules were slightly out of date?

I guess the "final" check could be to rebase this PR on top of latest trunk, re-run npm ci and see what the linter on @mirka 's machine outputs?

Copy link
Member Author

Choose a reason for hiding this comment

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

Mmm, still the same after an npm ci with trunk and npm run lint:js -- packages/components/src/box-control/utils.ts 🤔 No box-control/ warnings on CI either. In any case there are a lot of existing alignment warnings, and since they are only warnings, I expect they will continue to flip-flop for a while 😅

packages/components/src/box-control/utils.ts Outdated Show resolved Hide resolved
packages/components/src/box-control/types.ts Show resolved Hide resolved
packages/components/src/box-control/types.ts Outdated Show resolved Hide resolved
packages/components/src/box-control/types.ts Show resolved Hide resolved
packages/components/src/box-control/types.ts Show resolved Hide resolved
packages/components/src/box-control/README.md Outdated Show resolved Hide resolved
@mirka mirka enabled auto-merge (squash) February 2, 2023 17:42
@mirka mirka merged commit 0636e97 into trunk Feb 2, 2023
@mirka mirka deleted the ts-box-control branch February 2, 2023 18:09
@github-actions github-actions bot added this to the Gutenberg 15.2 milestone Feb 2, 2023
@DaisyOlsen DaisyOlsen added the [Type] Code Quality Issues or PRs that relate to code quality label Feb 14, 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.

4 participants