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

Components: migrate ConfirmDialog component's Stories from knobs to controls #40164

Merged
merged 24 commits into from
Apr 29, 2022

Conversation

chad1008
Copy link
Contributor

@chad1008 chad1008 commented Apr 7, 2022

What?

Migrate the Stories for the ConfirmDialog component from knobs to the more modern controls API. The one exception is the Controlled story, which benefits more from the current format's code snippet, so doesn't have any active Controls.

Why?

See #35665 for more details, but due to knobs being deprecated, all components will eventually need to be migrated.

Testing Instructions

  1. npm run storybook:dev
  2. Confirm that Knobs are no longer available, and Controls have taken their place
  3. Confirm the DocsPage looks correct with no errors. The data will be somewhat incomplete, but this should be addressed in a future PR when the stories are migrated to TypeScript.

@chad1008 chad1008 requested a review from ajitbohra as a code owner April 7, 2022 15:41
@chad1008 chad1008 requested review from mirka and ciampo April 7, 2022 15:42
@github-actions
Copy link

github-actions bot commented Apr 7, 2022

Size Change: 0 B

Total Size: 1.23 MB

ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 993 B
build/annotations/index.min.js 2.77 kB
build/api-fetch/index.min.js 2.27 kB
build/autop/index.min.js 2.15 kB
build/blob/index.min.js 487 B
build/block-directory/index.min.js 6.51 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 151 kB
build/block-editor/style-rtl.css 15 kB
build/block-editor/style.css 15 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 150 B
build/block-library/blocks/audio/editor.css 150 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/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 59 B
build/block-library/blocks/avatar/style.css 59 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 445 B
build/block-library/blocks/button/editor.css 445 B
build/block-library/blocks/button/style-rtl.css 560 B
build/block-library/blocks/button/style.css 560 B
build/block-library/blocks/buttons/editor-rtl.css 292 B
build/block-library/blocks/buttons/editor.css 292 B
build/block-library/blocks/buttons/style-rtl.css 275 B
build/block-library/blocks/buttons/style.css 275 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 103 B
build/block-library/blocks/code/style.css 103 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 127 B
build/block-library/blocks/comment-template/style.css 127 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-query-loop/editor-rtl.css 95 B
build/block-library/blocks/comments-query-loop/editor.css 95 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/cover/editor-rtl.css 546 B
build/block-library/blocks/cover/editor.css 547 B
build/block-library/blocks/cover/style-rtl.css 1.53 kB
build/block-library/blocks/cover/style.css 1.53 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 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 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 961 B
build/block-library/blocks/gallery/editor.css 964 B
build/block-library/blocks/gallery/style-rtl.css 1.51 kB
build/block-library/blocks/gallery/style.css 1.51 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 333 B
build/block-library/blocks/group/editor.css 333 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 731 B
build/block-library/blocks/image/editor.css 730 B
build/block-library/blocks/image/style-rtl.css 529 B
build/block-library/blocks/image/style.css 535 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 199 B
build/block-library/blocks/latest-posts/editor.css 198 B
build/block-library/blocks/latest-posts/style-rtl.css 463 B
build/block-library/blocks/latest-posts/style.css 462 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 493 B
build/block-library/blocks/media-text/style.css 490 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 708 B
build/block-library/blocks/navigation-link/editor.css 706 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-submenu/view.min.js 375 B
build/block-library/blocks/navigation/editor-rtl.css 2.03 kB
build/block-library/blocks/navigation/editor.css 2.04 kB
build/block-library/blocks/navigation/style-rtl.css 1.93 kB
build/block-library/blocks/navigation/style.css 1.92 kB
build/block-library/blocks/navigation/view-modal.min.js 2.65 kB
build/block-library/blocks/navigation/view.min.js 395 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 363 B
build/block-library/blocks/page-list/editor.css 363 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 157 B
build/block-library/blocks/paragraph/editor.css 157 B
build/block-library/blocks/paragraph/style-rtl.css 260 B
build/block-library/blocks/paragraph/style.css 260 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 69 B
build/block-library/blocks/post-comments-form/editor.css 69 B
build/block-library/blocks/post-comments-form/style-rtl.css 521 B
build/block-library/blocks/post-comments-form/style.css 521 B
build/block-library/blocks/post-comments/editor-rtl.css 77 B
build/block-library/blocks/post-comments/editor.css 77 B
build/block-library/blocks/post-comments/style-rtl.css 511 B
build/block-library/blocks/post-comments/style.css 511 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 721 B
build/block-library/blocks/post-featured-image/editor.css 721 B
build/block-library/blocks/post-featured-image/style-rtl.css 153 B
build/block-library/blocks/post-featured-image/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 323 B
build/block-library/blocks/post-template/style.css 323 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 80 B
build/block-library/blocks/post-title/style.css 80 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 370 B
build/block-library/blocks/pullquote/style.css 370 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 234 B
build/block-library/blocks/query-pagination/style.css 231 B
build/block-library/blocks/query/editor-rtl.css 369 B
build/block-library/blocks/query/editor.css 369 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 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 397 B
build/block-library/blocks/search/style.css 398 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 140 B
build/block-library/blocks/separator/editor.css 140 B
build/block-library/blocks/separator/style-rtl.css 233 B
build/block-library/blocks/separator/style.css 233 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 759 B
build/block-library/blocks/site-logo/editor.css 759 B
build/block-library/blocks/site-logo/style-rtl.css 181 B
build/block-library/blocks/site-logo/style.css 181 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 177 B
build/block-library/blocks/social-link/editor.css 177 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.37 kB
build/block-library/blocks/social-links/style.css 1.36 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 504 B
build/block-library/blocks/table/editor.css 504 B
build/block-library/blocks/table/style-rtl.css 625 B
build/block-library/blocks/table/style.css 625 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 226 B
build/block-library/blocks/tag-cloud/style.css 227 B
build/block-library/blocks/template-part/editor-rtl.css 149 B
build/block-library/blocks/template-part/editor.css 149 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 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 993 B
build/block-library/common.css 990 B
build/block-library/editor-rtl.css 10.3 kB
build/block-library/editor.css 10.3 kB
build/block-library/index.min.js 177 kB
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/style-rtl.css 11.5 kB
build/block-library/style.css 11.5 kB
build/block-library/theme-rtl.css 689 B
build/block-library/theme.css 694 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/blocks/index.min.js 47 kB
build/components/index.min.js 222 kB
build/components/style-rtl.css 15 kB
build/components/style.css 15 kB
build/compose/index.min.js 11.3 kB
build/core-data/index.min.js 14.6 kB
build/customize-widgets/index.min.js 11 kB
build/customize-widgets/style-rtl.css 1.39 kB
build/customize-widgets/style.css 1.39 kB
build/data-controls/index.min.js 663 B
build/data/index.min.js 7.66 kB
build/date/index.min.js 32 kB
build/deprecated/index.min.js 518 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.58 kB
build/edit-navigation/index.min.js 15.8 kB
build/edit-navigation/style-rtl.css 4.05 kB
build/edit-navigation/style.css 4.05 kB
build/edit-post/classic-rtl.css 546 B
build/edit-post/classic.css 547 B
build/edit-post/index.min.js 30.1 kB
build/edit-post/style-rtl.css 7.02 kB
build/edit-post/style.css 7.02 kB
build/edit-site/index.min.js 47.4 kB
build/edit-site/style-rtl.css 7.95 kB
build/edit-site/style.css 7.93 kB
build/edit-widgets/index.min.js 16.3 kB
build/edit-widgets/style-rtl.css 4.41 kB
build/edit-widgets/style.css 4.4 kB
build/editor/index.min.js 38.4 kB
build/editor/style-rtl.css 3.67 kB
build/editor/style.css 3.67 kB
build/element/index.min.js 4.3 kB
build/escape-html/index.min.js 548 B
build/format-library/index.min.js 6.62 kB
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 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.83 kB
build/keycodes/index.min.js 1.41 kB
build/list-reusable-blocks/index.min.js 1.75 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.94 kB
build/notices/index.min.js 957 B
build/nux/index.min.js 2.1 kB
build/nux/style-rtl.css 751 B
build/nux/style.css 749 B
build/plugins/index.min.js 1.98 kB
build/preferences-persistence/index.min.js 2.16 kB
build/preferences/index.min.js 1.32 kB
build/primitives/index.min.js 949 B
build/priority-queue/index.min.js 628 B
build/react-i18n/index.min.js 704 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.69 kB
build/reusable-blocks/index.min.js 2.24 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 11.2 kB
build/server-side-render/index.min.js 1.61 kB
build/shortcode/index.min.js 1.52 kB
build/token-list/index.min.js 668 B
build/url/index.min.js 1.99 kB
build/vendors/react-dom.min.js 38.5 kB
build/vendors/react.min.js 4.34 kB
build/viewport/index.min.js 1.08 kB
build/warning/index.min.js 280 B
build/widgets/index.min.js 7.21 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.07 kB

compressed-size-action

Copy link
Member

@mirka mirka left a comment

Choose a reason for hiding this comment

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

Nice, thanks for working on this!

The main thing I think we should address is that we can't have uncontrolled modals popping up in Docs view. Unless we suspect that most usages will be uncontrolled, the straightforward way to address this would be to make them all controlled examples by default, like on this doc page for the Reakit modal. Another tool we have is the inline stories option which isolates each story in an iframe.

Sidenote (cc @ciampo): I played around with type extraction on this one, and (perhaps understandably) the docgen has a problem with these conditional props. I guess there are a couple of ways around it, but I wonder if this is another reason why we should avoid complicating props conditionals as a matter of API design, like you've been noting recently. (Not saying that this one is particularly complicated, or that API design should be dictated by docgen constraints, but just a thought! Interesting how TypeScript can easily enforce complicated conditions, but how quickly it gets messy when trying to explain the rules in a human-readable format.)

@chad1008
Copy link
Contributor Author

Unless we suspect that most usages will be uncontrolled, the straightforward way to address this would be to make them all controlled examples by default, like on this doc page for the Reakit modal. Another tool we have is the inline stories option which isolates each story in an iframe.

I do think most uses will be Uncontrolled, but looking at the two options, I still think making the examples controlled by default makes the most sense. Getting the positioning of the iframes right feels like more trouble than it's worth (part of why Storybook recommends against that method). Also, due to how the docs pull in the code snippets, the examples remain pretty clean... the extra handler functions we'd add to the template don't even show up, so it works great!

I also removed the initial "Hasn't confirmed yet" text. I think it looks cleaner to start with no text and have Confirmed!/Cancelled appear when the button is clicked.

One final change: because we've now made the default template Controlled, we can actually use that for the Controlled story. That story now uses the main template with a separate code snippet so we have a nice clean example on the DocsPage of that mode.

@ciampo ciampo added [Type] Code Quality Issues or PRs that relate to code quality [Package] Components /packages/components [Feature] Component System WordPress component system Storybook Storybook and its stories for components labels Apr 13, 2022
@ciampo
Copy link
Contributor

ciampo commented Apr 18, 2022

Thank you @chad1008 for working on this!

Unless we suspect that most usages will be uncontrolled, the straightforward way to address this would be to make them all controlled examples by default

Agree with @mirka on this one

One final change: because we've now made the default template Controlled, we can actually use that for the Controlled story. That story now uses the main template with a separate code snippet so we have a nice clean example on the DocsPage of that mode.

If I understand correctly, since currently all examples are using the controlled version of the component, I don't think we need a "Controlled" Story anymore?

At most, we'd need a way to flag that the component can also be used in uncontrolled mode — correct?

I wonder if this is another reason why we should avoid complicating props conditionals as a matter of API design

You raise a good point — I've never been a fan of conditional APIs, and I don't really like the solution that we adopted on ConfirmDialog (which I think I suggested in the first place!) — I wonder if we should just export two separate components instead?

(Coincidentally, the same pattern is being discussed in the BoxModelOverlay PR)


Finally, I have a couple of questions / observations:

  • since the rest of the component is written in TypeScript, should we write these stories in TypeScript too ? (it's also ok if we want to do that in a follow-up PR!)
  • We should probably add JSDoc comments to the props defined in types.ts, so that they would displayed in the Storybook auto-generated docs

@chad1008
Copy link
Contributor Author

If I understand correctly, since currently all examples are using the controlled version of the component, I don't think we need a "Controlled" Story anymore?
At most, we'd need a way to flag that the component can also be used in uncontrolled mode — correct?

You make a good point. I've reworked it a bit so that the default example now includes the full Controlled snippet, with the state management callbacks shown. I've then replaced the separate Controlled story with a simple Uncontrolled story instead, to demo a basic application without needing to declare isOpen and onCancel.

since the rest of the component is written in TypeScript, should we write these stories in TypeScript too ? (it's also ok if we want to do that in a follow-up PR!)

Absolutely, I definitely plan on addressing this in a follow-up!

We should probably add JSDoc comments to the props defined in types.ts, so that they would displayed in the Storybook auto-generated docs

I had the same thought, but found that the JSDoc comments I added there didn't get added to the the the auto-generated docs. I initially wondered if this was because the stories weren't in TypeScript yet, but I'm no wondering if it's a side effect of those conditional props? Are they possibly preventing Storybook from parsing them the way the would on static props?

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 had the same thought, but found that the JSDoc comments I added there didn't get added to the the the auto-generated docs. I initially wondered if this was because the stories weren't in TypeScript yet, but I'm no wondering if it's a side effect of those conditional props? Are they possibly preventing Storybook from parsing them the way the would on static props?

I believe that the main reason why types are not coming through is because the stories are not written in TypeScript yet — apologies if I didn't explain that more clearly in my previous message.

Absolutely, I definitely plan on addressing this in a follow-up!

That would be great, thank you!

Comment on lines 133 to 158
const uncontrolledSnippet = `<>
<ConfirmDialog
onConfirm={ handleConfirm }
>
Would you like to privately publish the post now?
</ConfirmDialog>

<Heading level={ 1 } />
</>
`;

export const Uncontrolled = Template.bind( {} );
Uncontrolled.args = {};
Uncontrolled.parameters = {
docs: {
description: {
story:
'To render in Uncontrolled Mode, omit passing a boolean to the `isOpen` prop. This will allow the component to close itself without the need for an explicit callback. In Uncontrolled mode, `onCancel` is optional.',
},
source: {
code: uncontrolledSnippet,
language: 'jsx',
type: 'auto',
},
},
};
Copy link
Contributor

@ciampo ciampo Apr 27, 2022

Choose a reason for hiding this comment

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

Looking at this, I'm not actually sure if we should have an uncontrolled example:

  • this uncontrolled example wouldn't really add any value to the would be probably misleading (it uses the "controlled" version of the component to showcase the uncontrolled?)
  • the snippet, in its current status, is somewhat incomplete (handleConfirm is not defined anywhere, the Heading component doesn't have text and is not relevant to the example)

I still think that we should somehow document the uncontrolled mode, though. Currently, we do mention it in the README, but we should consider how we can do that effectively in Storybook if we eventually want to move all of our docs.

@mirka what do you think?

Copy link
Member

Choose a reason for hiding this comment

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

Given that the conditional props will prevent us from getting a clean props table anyway, it might be worth considering splitting it into separate components (e.g. ConfirmDialog and ConfirmDialog.Uncontrolled?), or maybe even removing the uncontrolled version.

Copy link
Contributor

Choose a reason for hiding this comment

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

That's an interesting point.

For the sake of this PR, I guess we could remove the uncontrolled example completely from this PR, and tackle the conditional props and the uncontrolled component in a separate PR

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've just looked over the four current implementations of ConfirmDialog in Gutenberg, and currently they're all Controlled, which lends more weight to the idea of doing away with Uncontrolled altogether.

I agree with removing the Uncontrolled story for now at the very least, and we can perhaps update the component to only have the single Controlled mode in a followup - which would also eliminate the conditional props at the same time which would be a double-win.

packages/components/src/confirm-dialog/stories/index.js Outdated Show resolved Hide resolved
packages/components/src/confirm-dialog/stories/index.js Outdated Show resolved Hide resolved
@mirka
Copy link
Member

mirka commented Apr 27, 2022

I had the same thought, but found that the JSDoc comments I added there didn't get added to the the the auto-generated docs. I initially wondered if this was because the stories weren't in TypeScript yet, but I'm no wondering if it's a side effect of those conditional props?

Yes, those conditional props are the main blocker at the moment, which I don't mind punting to a separate PR. There's also another prerequisite for the type extraction to work, which is to add a named export like so. But in any case the docgen part won't work unless we do something about the conditional props.

@ciampo
Copy link
Contributor

ciampo commented Apr 28, 2022

I had the same thought, but found that the JSDoc comments I added there didn't get added to the the the auto-generated docs. I initially wondered if this was because the stories weren't in TypeScript yet, but I'm no wondering if it's a side effect of those conditional props?

Yes, those conditional props are the main blocker at the moment, which I don't mind punting to a separate PR. There's also another prerequisite for the type extraction to work, which is to add a named export like so. But in any case the docgen part won't work unless we do something about the conditional props.

Let's do that in a separate PR, so that in the meantime we can wrap up the refactor to controls.

Next follow-ups will be:

  • figure out what to do with the uncontrolled version of the component (and therefore simplify the conditional props)
  • after that, we'll be able to convert the Storybook examples to TypeScript and finally be able to generate docs

WDTY ?

@chad1008
Copy link
Contributor Author

I've just pushed a couple more updates cleaning up the args in the template as @ciampo suggested and removing the Uncontrolled story for the time being.

Knowing that all existing uses of the component are currently Controlled, I'm leaning more and more in favor of removing Uncontrolled as an option completely in a followup PR.

Once we do that, the TypeScript conversion of these stories (another followup) should be the main thing needed to wrap this up completely!

Copy link
Member

@mirka mirka left a comment

Choose a reason for hiding this comment

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

Knowing that all existing uses of the component are currently Controlled, I'm leaning more and more in favor of removing Uncontrolled as an option completely in a followup PR.

Once we do that, the TypeScript conversion of these stories (another followup) should be the main thing needed to wrap this up completely!

Sounds good! Thanks for all your work on this 🚀

@chad1008 chad1008 force-pushed the enhance/confirmdialog-knobs-to-controls branch from 4fad564 to 168674a Compare April 29, 2022 12:02
@chad1008 chad1008 merged commit 6fab3c4 into trunk Apr 29, 2022
@chad1008 chad1008 deleted the enhance/confirmdialog-knobs-to-controls branch April 29, 2022 19:16
@github-actions github-actions bot added this to the Gutenberg 13.2 milestone Apr 29, 2022
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 Storybook Storybook and its stories for 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.

3 participants