@lumx/react 3.1.5 → 3.2.1-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/_internal/types.d.ts +16 -5
  2. package/index.d.ts +45 -4
  3. package/index.js +632 -423
  4. package/index.js.map +1 -1
  5. package/package.json +3 -3
  6. package/src/components/alert-dialog/AlertDialog.stories.tsx +96 -165
  7. package/src/components/alert-dialog/AlertDialog.test.tsx +15 -23
  8. package/src/components/avatar/Avatar.stories.tsx +91 -62
  9. package/src/components/avatar/Avatar.test.tsx +9 -24
  10. package/src/components/badge/Badge.stories.tsx +63 -38
  11. package/src/components/button/Button.stories.tsx +147 -139
  12. package/src/components/button/IconButton.stories.tsx +45 -0
  13. package/src/components/checkbox/Checkbox.stories.tsx +37 -30
  14. package/src/components/chip/Chip.stories.tsx +77 -15
  15. package/src/components/comment-block/CommentBlock.stories.tsx +90 -25
  16. package/src/components/comment-block/CommentBlock.test.tsx +12 -17
  17. package/src/components/date-picker/DatePickerField.stories.tsx +52 -83
  18. package/src/components/dialog/Dialog.stories.tsx +131 -293
  19. package/src/components/dialog/Dialog.test.tsx +0 -32
  20. package/src/components/dropdown/Dropdown.stories.tsx +1 -186
  21. package/src/components/flag/Flag.stories.tsx +33 -18
  22. package/src/components/flag/Flag.test.tsx +1 -8
  23. package/src/components/flex-box/FlexBox.stories.tsx +151 -238
  24. package/src/components/flex-box/FlexBox.test.tsx +9 -49
  25. package/src/components/generic-block/GenericBlock.stories.jsx +1 -1
  26. package/src/components/grid-column/GridColumn.stories.tsx +46 -0
  27. package/src/components/heading/Heading.stories.tsx +57 -95
  28. package/src/components/icon/Icon.stories.tsx +67 -70
  29. package/src/components/image-block/ImageBlock.stories.tsx +103 -47
  30. package/src/components/image-block/ImageBlock.test.tsx +12 -17
  31. package/src/components/inline-list/InlineList.stories.tsx +45 -29
  32. package/src/components/input-helper/InputHelper.stories.tsx +31 -25
  33. package/src/components/input-label/InputLabel.stories.tsx +33 -10
  34. package/src/components/lightbox/Lightbox.stories.tsx +39 -77
  35. package/src/components/lightbox/Lightbox.test.tsx +12 -17
  36. package/src/components/link/Link.stories.tsx +98 -128
  37. package/src/components/link-preview/LinkPreview.stories.tsx +48 -75
  38. package/src/components/list/List.stories.tsx +59 -84
  39. package/src/components/list/List.test.tsx +8 -17
  40. package/src/components/list/ListDivider.stories.tsx +9 -4
  41. package/src/components/list/ListDivider.test.tsx +12 -17
  42. package/src/components/list/ListItem.stories.tsx +97 -59
  43. package/src/components/list/ListItem.test.tsx +12 -17
  44. package/src/components/list/ListSubheader.stories.tsx +8 -5
  45. package/src/components/list/ListSubheader.test.tsx +12 -18
  46. package/src/components/message/Message.stories.tsx +51 -22
  47. package/src/components/mosaic/Mosaic.stories.tsx +78 -74
  48. package/src/components/mosaic/Mosaic.test.tsx +0 -31
  49. package/src/components/navigation/Navigation.stories.tsx +67 -0
  50. package/src/components/navigation/Navigation.test.tsx +58 -0
  51. package/src/components/navigation/Navigation.tsx +62 -0
  52. package/src/components/navigation/NavigationItem.test.tsx +37 -0
  53. package/src/components/navigation/NavigationItem.tsx +89 -0
  54. package/src/components/navigation/NavigationSection.test.tsx +126 -0
  55. package/src/components/navigation/NavigationSection.tsx +109 -0
  56. package/src/components/navigation/context.tsx +6 -0
  57. package/src/components/navigation/index.ts +1 -0
  58. package/src/components/notification/Notifications.stories.tsx +52 -47
  59. package/src/components/popover/Popover.stories.tsx +68 -201
  60. package/src/components/popover/Popover.tsx +7 -9
  61. package/src/components/popover-dialog/PopoverDialog.stories.tsx +26 -65
  62. package/src/components/post-block/PostBlock.test.tsx +12 -17
  63. package/src/components/progress/ProgressCircular.stories.tsx +24 -12
  64. package/src/components/progress/ProgressLinear.stories.tsx +6 -2
  65. package/src/components/radio-button/RadioButton.stories.tsx +35 -24
  66. package/src/components/select/Select.stories.tsx +19 -23
  67. package/src/components/select/SelectMultiple.stories.tsx +105 -2
  68. package/src/components/select/WithSelectContext.tsx +10 -4
  69. package/src/components/skeleton/SkeletonCircle.stories.tsx +37 -21
  70. package/src/components/skeleton/SkeletonCircle.test.tsx +12 -17
  71. package/src/components/skeleton/SkeletonRectangle.stories.tsx +74 -99
  72. package/src/components/skeleton/SkeletonRectangle.test.tsx +12 -17
  73. package/src/components/skeleton/SkeletonTypography.test.tsx +12 -17
  74. package/src/components/slider/Slider.stories.tsx +41 -25
  75. package/src/components/slider/Slider.test.tsx +12 -18
  76. package/src/components/slideshow/Slideshow.stories.tsx +31 -61
  77. package/src/components/slideshow/Slideshow.test.tsx +15 -23
  78. package/src/components/slideshow/SlideshowControls.stories.tsx +4 -6
  79. package/src/components/switch/Switch.stories.tsx +35 -32
  80. package/src/components/table/Table.test.tsx +12 -17
  81. package/src/components/tabs/Tabs.stories.tsx +4 -3
  82. package/src/components/text/Text.stories.tsx +130 -0
  83. package/src/components/text-field/TextField.stories.tsx +114 -148
  84. package/src/components/thumbnail/Thumbnail.stories.tsx +106 -255
  85. package/src/components/thumbnail/Thumbnail.test.tsx +12 -35
  86. package/src/components/tooltip/Tooltip.stories.tsx +51 -136
  87. package/src/components/user-block/UserBlock.stories.tsx +67 -56
  88. package/src/components/user-block/UserBlock.test.tsx +1 -5
  89. package/src/hooks/useFocusTrap.ts +2 -2
  90. package/src/index.ts +1 -0
  91. package/src/stories/controls/color.ts +6 -0
  92. package/src/stories/controls/element.ts +6 -0
  93. package/src/stories/controls/focusPoint.ts +1 -0
  94. package/src/stories/controls/icons.ts +6 -0
  95. package/src/stories/{knobs → controls}/image.ts +6 -16
  96. package/src/stories/controls/selectArgType.ts +4 -0
  97. package/src/stories/controls/theme.ts +3 -0
  98. package/src/stories/controls/typography.ts +5 -0
  99. package/src/stories/controls/withUndefined.ts +1 -0
  100. package/src/stories/decorators/withChromaticForceScreenSize.tsx +8 -0
  101. package/src/stories/decorators/withCombinations.tsx +99 -0
  102. package/src/stories/decorators/withNestedProps.tsx +23 -0
  103. package/src/stories/{withResizableBox.tsx → decorators/withResizableBox.tsx} +6 -10
  104. package/src/stories/decorators/withValueOnChange.tsx +18 -0
  105. package/src/stories/decorators/withWrapper.tsx +19 -0
  106. package/src/stories/utils/CustomLink.tsx +8 -2
  107. package/src/stories/{knobs → utils}/lorem.ts +9 -9
  108. package/src/testing/utils/commonTestsSuiteRTL.ts +2 -3
  109. package/src/testing/utils/index.ts +0 -2
  110. package/src/untypped-modules.d.ts +0 -2
  111. package/src/utils/MaterialThemeSwitcher/MaterialThemeSwitcher.tsx +1 -1
  112. package/src/utils/ThemeContext.ts +4 -0
  113. package/src/utils/forwardRefPolymorphic.ts +9 -0
  114. package/src/utils/type.ts +28 -4
  115. package/src/components/alert-dialog/__snapshots__/AlertDialog.test.tsx.snap +0 -558
  116. package/src/components/avatar/__snapshots__/Avatar.test.tsx.snap +0 -681
  117. package/src/components/comment-block/__snapshots__/CommentBlock.test.tsx.snap +0 -92
  118. package/src/components/dialog/__snapshots__/Dialog.test.tsx.snap +0 -1133
  119. package/src/components/expansion-panel/ExpansionPanel.stories.tsx +0 -65
  120. package/src/components/flag/__snapshots__/Flag.test.tsx.snap +0 -133
  121. package/src/components/flex-box/__snapshots__/FlexBox.test.tsx.snap +0 -492
  122. package/src/components/grid-column/GridColumn.stories.jsx +0 -56
  123. package/src/components/image-block/__snapshots__/ImageBlock.test.tsx.snap +0 -64
  124. package/src/components/lightbox/__snapshots__/Lightbox.test.tsx.snap +0 -194
  125. package/src/components/list/__snapshots__/List.test.tsx.snap +0 -360
  126. package/src/components/list/__snapshots__/ListDivider.test.tsx.snap +0 -7
  127. package/src/components/list/__snapshots__/ListItem.test.tsx.snap +0 -160
  128. package/src/components/list/__snapshots__/ListSubheader.test.tsx.snap +0 -9
  129. package/src/components/mosaic/__snapshots__/Mosaic.test.tsx.snap +0 -357
  130. package/src/components/post-block/__snapshots__/PostBlock.test.tsx.snap +0 -139
  131. package/src/components/skeleton/__snapshots__/SkeletonCircle.test.tsx.snap +0 -54
  132. package/src/components/skeleton/__snapshots__/SkeletonRectangle.test.tsx.snap +0 -177
  133. package/src/components/skeleton/__snapshots__/SkeletonTypography.test.tsx.snap +0 -174
  134. package/src/components/slider/__snapshots__/Slider.test.tsx.snap +0 -122
  135. package/src/components/slideshow/__snapshots__/Slideshow.test.tsx.snap +0 -157
  136. package/src/components/table/__snapshots__/Table.test.tsx.snap +0 -263
  137. package/src/components/text/Text.stories.jsx +0 -75
  138. package/src/components/thumbnail/__snapshots__/Thumbnail.test.tsx.snap +0 -130
  139. package/src/components/user-block/__snapshots__/UserBlock.test.tsx.snap +0 -362
  140. package/src/stories/chromaticForceScreenSize.tsx +0 -7
  141. package/src/stories/knobs/buttonKnob.ts +0 -9
  142. package/src/stories/knobs/emphasisKnob.ts +0 -8
  143. package/src/stories/knobs/enumKnob.ts +0 -14
  144. package/src/stories/knobs/focusKnob.ts +0 -3
  145. package/src/stories/knobs/sizeKnob.ts +0 -5
  146. package/src/stories/knobs/thumbnailsKnob.ts +0 -9
  147. package/src/testing/utils/itShouldRenderStories.tsx +0 -103
@@ -1,3 +1,7 @@
1
+ /* eslint-disable react-hooks/rules-of-hooks,react/jsx-key */
2
+ import React, { useRef, useState } from 'react';
3
+
4
+ import over from 'lodash/over';
1
5
  import { mdiClose } from '@lumx/icons';
2
6
  import {
3
7
  AlertDialog,
@@ -6,25 +10,28 @@ import {
6
10
  DatePickerField,
7
11
  Emphasis,
8
12
  FlexBox,
13
+ Heading,
9
14
  IconButton,
10
15
  List,
11
16
  ListItem,
12
17
  Select,
13
18
  Size,
14
19
  TextField,
15
- Theme,
16
20
  Toolbar,
17
21
  } from '@lumx/react';
18
22
  import { DIALOG_TRANSITION_DURATION } from '@lumx/core/js/constants';
19
- import { select } from '@storybook/addon-knobs';
20
- import React, { RefObject, useCallback, useRef, useState } from 'react';
21
23
  import { useBooleanState } from '@lumx/react/hooks/useBooleanState';
22
- import { Dialog, DialogSizes } from './Dialog';
23
- import { loremIpsum } from '../../stories/knobs/lorem';
24
- import { chromaticForceScreenSize } from '../../stories/chromaticForceScreenSize';
24
+ import { getSelectArgType } from '@lumx/react/stories/controls/selectArgType';
25
+ import { withChromaticForceScreenSize } from '@lumx/react/stories/decorators/withChromaticForceScreenSize';
26
+
27
+ import { Dialog } from './Dialog';
28
+ import { loremIpsum } from '../../stories/utils/lorem';
29
+
30
+ const dialogSizes = [Size.tiny, Size.regular, Size.big, Size.huge];
25
31
 
26
32
  export default {
27
33
  title: 'LumX components/dialog/Dialog',
34
+ component: Dialog,
28
35
  parameters: {
29
36
  // Delay Chromatic snapshot to wait for dialog to open.
30
37
  chromatic: {
@@ -32,315 +39,148 @@ export default {
32
39
  delay: DIALOG_TRANSITION_DURATION,
33
40
  },
34
41
  },
35
- // Force minimum chromatic screen size to make sure the dialog appears in view.
36
- decorators: [chromaticForceScreenSize],
37
- };
38
-
39
- const header = <header className="lumx-spacing-padding lumx-typography-title">Dialog header</header>;
40
- const content = <div className="lumx-spacing-padding">{loremIpsum('short')}</div>;
41
- const longContent = <div className="lumx-spacing-padding">{loremIpsum('long')}</div>;
42
- const footer = <footer className="lumx-spacing-padding">Dialog footer</footer>;
43
-
44
- function useOpenButton(theme: Theme, defaultState = true) {
45
- const buttonRef = useRef() as RefObject<HTMLButtonElement>;
46
- const [isOpen, setOpen] = useState(defaultState);
47
- const openDialog = useCallback(() => setOpen(true), []);
48
- const closeDialog = useCallback(() => setOpen(false), []);
49
-
50
- return {
51
- button: (
52
- <Button ref={buttonRef} onClick={openDialog} theme={theme}>
53
- Open dialog
54
- </Button>
55
- ),
56
- buttonRef,
57
- openDialog,
58
- closeDialog,
59
- isOpen,
60
- };
61
- }
62
-
63
- export const SimpleDialog = ({ theme }: any) => {
64
- const { button, buttonRef, closeDialog, isOpen } = useOpenButton(theme);
65
- return (
66
- <>
67
- {button}
68
- <Dialog isOpen={isOpen} onClose={closeDialog} parentElement={buttonRef}>
69
- {content}
70
- </Dialog>
71
- </>
72
- );
73
- };
74
-
75
- export const WithBodyScroll = ({ theme }: any) => {
76
- const { button, buttonRef, closeDialog, isOpen } = useOpenButton(theme);
77
- return (
78
- <>
79
- {button}
80
- <Dialog isOpen={isOpen} onClose={closeDialog} parentElement={buttonRef} disableBodyScroll={false}>
81
- {content}
82
- </Dialog>
83
- </>
84
- );
42
+ decorators: [
43
+ // Force minimum chromatic screen size to make sure the dialog appears in view.
44
+ withChromaticForceScreenSize(),
45
+ ],
46
+ args: Dialog.defaultProps,
47
+ argTypes: {
48
+ size: getSelectArgType(dialogSizes),
49
+ onVisibilityChange: { action: true },
50
+ children: { control: false },
51
+ },
52
+ render(props: any) {
53
+ const buttonRef = useRef<HTMLButtonElement>(null);
54
+ const [isOpen, close, open] = useBooleanState(true);
55
+ return (
56
+ <>
57
+ <Button ref={buttonRef} onClick={open}>
58
+ Open dialog
59
+ </Button>
60
+ <Dialog {...props} isOpen={isOpen} onClose={close} parentElement={buttonRef} />
61
+ </>
62
+ );
63
+ },
85
64
  };
86
65
 
87
- export const PreventDialogAutoClose = ({ theme }: any) => {
88
- const { button, buttonRef, closeDialog, isOpen } = useOpenButton(theme);
89
- return (
90
- <>
91
- {button}
92
- <Dialog preventAutoClose isOpen={isOpen} onClose={closeDialog} parentElement={buttonRef}>
93
- {content}
94
- <footer>
95
- <Toolbar
96
- after={
97
- <Button onClick={closeDialog} emphasis={Emphasis.low}>
98
- Close
99
- </Button>
100
- }
101
- />
102
- </footer>
103
- </Dialog>
104
- </>
105
- );
66
+ /**
67
+ * Default dialog
68
+ */
69
+ export const Default = {
70
+ args: { children: loremIpsum('short') },
106
71
  };
107
72
 
108
- export const PreventDialogCloseOnEscape = ({ theme }: any) => {
109
- const { button, buttonRef, closeDialog, isOpen } = useOpenButton(theme);
110
- return (
111
- <>
112
- {button}
113
- <Dialog preventCloseOnEscape isOpen={isOpen} onClose={closeDialog} parentElement={buttonRef}>
114
- {content}
115
- <footer>
116
- <Toolbar
117
- after={
118
- <Button onClick={closeDialog} emphasis={Emphasis.low}>
119
- Close
120
- </Button>
121
- }
122
- />
123
- </footer>
124
- </Dialog>
125
- </>
126
- );
73
+ /**
74
+ * Loading state
75
+ */
76
+ export const Loading = {
77
+ args: { ...Default.args, isLoading: true },
127
78
  };
128
79
 
129
- export const PreventDialogCloseOnClick = ({ theme }: any) => {
130
- const { button, buttonRef, closeDialog, isOpen } = useOpenButton(theme);
131
- return (
132
- <>
133
- {button}
134
- <Dialog preventCloseOnClick isOpen={isOpen} onClose={closeDialog} parentElement={buttonRef}>
135
- {content}
136
- <footer>
137
- <Toolbar
138
- after={
139
- <Button onClick={closeDialog} emphasis={Emphasis.low}>
140
- Close
141
- </Button>
142
- }
143
- />
144
- </footer>
145
- </Dialog>
146
- </>
147
- );
80
+ /**
81
+ * Basic header/footer props
82
+ */
83
+ export const WithHeaderFooter = {
84
+ args: { ...Default.args, header: 'Dialog header', footer: 'Dialog footer' },
148
85
  };
149
86
 
150
- export const DialogWithAlertDialog = ({ theme }: any) => {
151
- const { button, buttonRef, closeDialog, isOpen } = useOpenButton(theme);
152
- const { openDialog: openAlertDialog, closeDialog: closeAlertDialog, isOpen: isAlertDialogOpen } = useOpenButton(
153
- theme,
154
- false,
155
- );
156
-
157
- const handleSubmitDialog = () => {
158
- closeDialog();
159
- openAlertDialog();
160
- };
161
-
162
- return (
163
- <>
164
- {button}
165
- <Dialog isOpen={isOpen} onClose={closeDialog} parentElement={buttonRef}>
166
- {content}
167
- <footer>
168
- <Toolbar
169
- after={
170
- <Button onClick={handleSubmitDialog} emphasis={Emphasis.low}>
171
- Close
172
- </Button>
173
- }
174
- />
175
- </footer>
176
- </Dialog>
177
- <AlertDialog
178
- isOpen={isAlertDialogOpen}
179
- onClose={closeDialog}
180
- parentElement={buttonRef}
181
- title="Default (info)"
182
- confirmProps={{ onClick: closeAlertDialog, label: 'Confirm' }}
183
- >
184
- Consequat deserunt officia aute laborum tempor anim sint est.
185
- </AlertDialog>
186
- </>
187
- );
87
+ /**
88
+ * More complex header/footer in children
89
+ */
90
+ export const WithHeaderFooterChildren = {
91
+ args: {
92
+ children: [
93
+ <header>
94
+ <Toolbar
95
+ label={<Heading typography="title">Dialog heading</Heading>}
96
+ after={<IconButton label="Close" emphasis="low" icon={mdiClose} />}
97
+ />
98
+ </header>,
99
+ <div className="lumx-spacing-padding-huge">{loremIpsum('short')}</div>,
100
+ <footer>
101
+ <Toolbar after={<Button>Close</Button>} />
102
+ </footer>,
103
+ ],
104
+ },
188
105
  };
189
106
 
190
- export const Sizes = ({ theme }: any) => {
191
- const { button, buttonRef, closeDialog, isOpen } = useOpenButton(theme);
192
- const sizes: DialogSizes[] = [Size.tiny, Size.regular, Size.big, Size.huge];
193
- return (
194
- <>
195
- {button}
196
- Use the knobs to change the dialog size!
197
- <Dialog
198
- isOpen={isOpen}
199
- onClose={closeDialog}
200
- size={select('Dialog size', sizes, Size.tiny)}
201
- parentElement={buttonRef}
202
- >
203
- {longContent}
204
- </Dialog>
205
- </>
206
- );
107
+ /**
108
+ * Forcing header/footer dividers
109
+ */
110
+ export const ForceDivider = {
111
+ args: { ...WithHeaderFooter.args, forceFooterDivider: true, forceHeaderDivider: true },
207
112
  };
208
113
 
209
- export const LoadingDialog = ({ theme }: any) => {
210
- const { button, buttonRef, closeDialog, isOpen } = useOpenButton(theme);
211
- return (
212
- <>
213
- {button}
214
- <Dialog isOpen={isOpen} onClose={closeDialog} isLoading parentElement={buttonRef}>
215
- {content}
216
- </Dialog>
217
- </>
218
- );
114
+ /**
115
+ * Long scrollable content
116
+ */
117
+ export const LongContent = {
118
+ args: { ...WithHeaderFooter.args, children: loremIpsum('long') },
219
119
  };
220
120
 
221
- export const DialogWithHeaderFooterProps = ({ theme }: any) => {
222
- const { button, buttonRef, closeDialog, isOpen } = useOpenButton(theme);
223
- return (
224
- <>
225
- {button}
226
- <Dialog
227
- isOpen={isOpen}
228
- onClose={closeDialog}
229
- header="Header prop"
230
- footer="Footer prop"
231
- parentElement={buttonRef}
232
- >
233
- {content}
234
- </Dialog>
235
- </>
236
- );
121
+ /**
122
+ * Prevent auto close (click outside & close on escape)
123
+ */
124
+ export const PreventAutoClose = {
125
+ args: { ...Default.args, preventAutoClose: true },
237
126
  };
238
127
 
239
- export const DialogWithHeaderFooterChildren = ({ theme }: any) => {
240
- const { button, buttonRef, closeDialog, isOpen } = useOpenButton(theme);
241
- return (
242
- <>
243
- {button}
244
- <Dialog isOpen={isOpen} onClose={closeDialog} parentElement={buttonRef}>
245
- {header}
246
- {content}
247
- {footer}
248
- </Dialog>
249
- </>
250
- );
128
+ /**
129
+ * Prevent close on escape
130
+ */
131
+ export const PreventCloseOnEscape = {
132
+ args: { ...Default.args, preventCloseOnEscape: true },
251
133
  };
252
134
 
253
- export const DialogWithHeaderFooterPropsAndChildren = ({ theme }: any) => {
254
- const { button, buttonRef, closeDialog, isOpen } = useOpenButton(theme);
255
- return (
256
- <>
257
- {button}
258
- <Dialog
259
- isOpen={isOpen}
260
- onClose={closeDialog}
261
- header=" Header prop"
262
- footer=" Footer prop"
263
- parentElement={buttonRef}
264
- >
265
- {header}
266
- {content}
267
- {footer}
268
- </Dialog>
269
- </>
270
- );
135
+ /**
136
+ * Prevent close on click outside
137
+ */
138
+ export const PreventCloseOnClick = {
139
+ args: { ...Default.args, preventCloseOnClick: true },
271
140
  };
272
141
 
273
- export const DialogWithHeaderFooterAndDivider = ({ theme }: any) => {
274
- const { button, buttonRef, closeDialog, isOpen } = useOpenButton(theme);
275
- return (
276
- <>
277
- {button}
278
- <Dialog
279
- isOpen={isOpen}
280
- onClose={closeDialog}
281
- forceFooterDivider
282
- forceHeaderDivider
283
- parentElement={buttonRef}
284
- >
285
- {header}
286
- {content}
287
- {footer}
288
- </Dialog>
289
- </>
290
- );
291
- };
142
+ /**
143
+ * Dialog needing a confirmation before close using an AlertDialog
144
+ */
145
+ export const WithConfirmClose = () => {
146
+ const buttonRef = useRef<HTMLButtonElement>(null);
147
+ const closeButtonRef = useRef<HTMLButtonElement>(null);
148
+ const [isOpen, close, open] = useBooleanState(true);
149
+ const [isAlertDialogOpen, closeAlertDialog, openAlertDialog] = useBooleanState(false);
292
150
 
293
- export const ScrollableDialog = ({ theme }: any) => {
294
- const { button, buttonRef, closeDialog, isOpen } = useOpenButton(theme);
295
151
  return (
296
152
  <>
297
- {button}
298
- <Dialog isOpen={isOpen} onClose={closeDialog} size={Size.regular} parentElement={buttonRef}>
299
- {longContent}
153
+ <Button ref={buttonRef} onClick={open}>
154
+ Open dialog
155
+ </Button>
156
+ <Dialog isOpen={isOpen} onClose={openAlertDialog} parentElement={buttonRef}>
157
+ <FlexBox orientation="vertical" vAlign="center" className="lumx-spacing-padding-huge">
158
+ {loremIpsum('tiny')}
159
+ <Button ref={closeButtonRef} onClick={openAlertDialog}>
160
+ Close
161
+ </Button>
162
+ </FlexBox>
300
163
  </Dialog>
301
- </>
302
- );
303
- };
304
-
305
- export const WithAnimationCallbacks = ({ theme }: any) => {
306
- const { button, buttonRef, closeDialog, isOpen } = useOpenButton(theme);
307
- const handleVisibiltyCallback = (isVisible: boolean) => {
308
- alert(isVisible ? 'OPEN' : 'CLOSE');
309
- };
310
-
311
- return (
312
- <>
313
- {button}
314
- <Dialog
315
- isOpen={isOpen}
316
- onClose={closeDialog}
317
- size={Size.regular}
318
- parentElement={buttonRef}
319
- onVisibilityChange={handleVisibiltyCallback}
164
+ <AlertDialog
165
+ isOpen={isAlertDialogOpen}
166
+ onClose={closeAlertDialog}
167
+ parentElement={closeButtonRef}
168
+ title="Confirm close"
169
+ confirmProps={{ onClick: over([close, closeAlertDialog]), label: 'Confirm' }}
170
+ cancelProps={{ onClick: closeAlertDialog, label: 'Cancel' }}
320
171
  >
321
- {content}
322
- </Dialog>
323
- </>
324
- );
325
- };
326
-
327
- export const ScrollableDialogWithHeaderAndFooter = ({ theme }: any) => {
328
- const { button, buttonRef, closeDialog, isOpen } = useOpenButton(theme);
329
- return (
330
- <>
331
- {button}
332
- <Dialog isOpen={isOpen} onClose={closeDialog} parentElement={buttonRef}>
333
- {header}
334
- {longContent}
335
- {footer}
336
- </Dialog>
172
+ {loremIpsum('tiny')}
173
+ </AlertDialog>
337
174
  </>
338
175
  );
339
176
  };
340
177
 
341
- /** Test dialog focus trap (focus is contained inside the dialog) with all kinds of focusable and non-focusable items */
342
- export const DialogFocusTrap = ({ theme }: any) => {
343
- const { button, buttonRef, closeDialog, isOpen } = useOpenButton(theme);
178
+ /**
179
+ * Test dialog focus trap (focus is contained inside the dialog) with all kinds of focusable and non-focusable items
180
+ */
181
+ export const FocusTrap = () => {
182
+ const buttonRef = useRef<HTMLButtonElement>(null);
183
+ const [isOpen, close, open] = useBooleanState(true);
344
184
  const [textValue, setTextValue] = useState('value');
345
185
  const [checkboxValue, setCheckboxValue] = useState(false);
346
186
  const inputRef = useRef(null);
@@ -362,14 +202,14 @@ export const DialogFocusTrap = ({ theme }: any) => {
362
202
 
363
203
  return (
364
204
  <>
365
- {button}
366
- <Dialog isOpen={isOpen} onClose={closeDialog} parentElement={buttonRef} focusElement={inputRef}>
205
+ <Button ref={buttonRef} onClick={open}>
206
+ Open dialog
207
+ </Button>
208
+ <Dialog isOpen={isOpen} onClose={close} parentElement={buttonRef} focusElement={inputRef}>
367
209
  <header>
368
210
  <Toolbar
369
211
  label={<span className="lumx-typography-title">Dialog header</span>}
370
- after={
371
- <IconButton label="Close" icon={mdiClose} onClick={closeDialog} emphasis={Emphasis.low} />
372
- }
212
+ after={<IconButton label="Close" icon={mdiClose} onClick={close} emphasis={Emphasis.low} />}
373
213
  />
374
214
  </header>
375
215
  <div className="lumx-spacing-padding-horizontal-huge lumx-spacing-padding-bottom-huge">
@@ -424,7 +264,6 @@ export const DialogFocusTrap = ({ theme }: any) => {
424
264
  locale="fr"
425
265
  label="Start date"
426
266
  placeholder="Pick a date"
427
- theme={theme}
428
267
  onChange={setDate}
429
268
  value={date}
430
269
  nextButtonProps={{ label: 'Next month' }}
@@ -434,7 +273,6 @@ export const DialogFocusTrap = ({ theme }: any) => {
434
273
  locale="fr"
435
274
  label="Start date"
436
275
  placeholder="Pick a date"
437
- theme={theme}
438
276
  onChange={setDate2}
439
277
  value={date2}
440
278
  nextButtonProps={{ label: 'Next month' }}
@@ -5,8 +5,6 @@ import { mount, shallow } from 'enzyme';
5
5
  import 'jest-enzyme';
6
6
  import React, { ReactElement } from 'react';
7
7
 
8
- import * as stories from './Dialog.stories';
9
-
10
8
  const CLASSNAME = Dialog.className as string;
11
9
 
12
10
  // Mock out the useIntersectionObserver hook since it can't work with Jest/Enzyme.
@@ -29,26 +27,6 @@ const setup = (propsOverride: SetupProps = {}, shallowRendering = true) => {
29
27
  };
30
28
 
31
29
  describe(`<${Dialog.displayName}>`, () => {
32
- // 1. Test render via snapshot.
33
- describe('Snapshots and structure', () => {
34
- // Do snapshot render test on every stories.
35
- for (const [storyName, Story] of Object.entries(stories)) {
36
- if (typeof Story !== 'function') {
37
- continue;
38
- }
39
-
40
- it(`should render story ${storyName}`, () => {
41
- const wrapper = shallow(<Story />);
42
- expect(wrapper).toMatchSnapshot();
43
- });
44
- }
45
- });
46
-
47
- // 2. Test defaultProps value and important props custom values.
48
- describe('Props', () => {
49
- // Nothing to do here.
50
- });
51
-
52
30
  // 3. Test events.
53
31
  describe('Events', () => {
54
32
  const keyDown = (key: string) => new KeyboardEvent('keydown', { key } as any);
@@ -86,16 +64,6 @@ describe(`<${Dialog.displayName}>`, () => {
86
64
  });
87
65
  });
88
66
 
89
- // 4. Test conditions (i.e. things that display or not in the UI based on props).
90
- describe('Conditions', () => {
91
- // Nothing to do here.
92
- });
93
-
94
- // 5. Test state.
95
- describe('State', () => {
96
- // Nothing to do here.
97
- });
98
-
99
67
  // Common tests suite.
100
68
  commonTestsSuite(setup, { className: 'dialog', prop: 'dialog' }, { className: CLASSNAME });
101
69
  });