@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.
- package/_internal/types.d.ts +16 -5
- package/index.d.ts +45 -4
- package/index.js +632 -423
- package/index.js.map +1 -1
- package/package.json +3 -3
- package/src/components/alert-dialog/AlertDialog.stories.tsx +96 -165
- package/src/components/alert-dialog/AlertDialog.test.tsx +15 -23
- package/src/components/avatar/Avatar.stories.tsx +91 -62
- package/src/components/avatar/Avatar.test.tsx +9 -24
- package/src/components/badge/Badge.stories.tsx +63 -38
- package/src/components/button/Button.stories.tsx +147 -139
- package/src/components/button/IconButton.stories.tsx +45 -0
- package/src/components/checkbox/Checkbox.stories.tsx +37 -30
- package/src/components/chip/Chip.stories.tsx +77 -15
- package/src/components/comment-block/CommentBlock.stories.tsx +90 -25
- package/src/components/comment-block/CommentBlock.test.tsx +12 -17
- package/src/components/date-picker/DatePickerField.stories.tsx +52 -83
- package/src/components/dialog/Dialog.stories.tsx +131 -293
- package/src/components/dialog/Dialog.test.tsx +0 -32
- package/src/components/dropdown/Dropdown.stories.tsx +1 -186
- package/src/components/flag/Flag.stories.tsx +33 -18
- package/src/components/flag/Flag.test.tsx +1 -8
- package/src/components/flex-box/FlexBox.stories.tsx +151 -238
- package/src/components/flex-box/FlexBox.test.tsx +9 -49
- package/src/components/generic-block/GenericBlock.stories.jsx +1 -1
- package/src/components/grid-column/GridColumn.stories.tsx +46 -0
- package/src/components/heading/Heading.stories.tsx +57 -95
- package/src/components/icon/Icon.stories.tsx +67 -70
- package/src/components/image-block/ImageBlock.stories.tsx +103 -47
- package/src/components/image-block/ImageBlock.test.tsx +12 -17
- package/src/components/inline-list/InlineList.stories.tsx +45 -29
- package/src/components/input-helper/InputHelper.stories.tsx +31 -25
- package/src/components/input-label/InputLabel.stories.tsx +33 -10
- package/src/components/lightbox/Lightbox.stories.tsx +39 -77
- package/src/components/lightbox/Lightbox.test.tsx +12 -17
- package/src/components/link/Link.stories.tsx +98 -128
- package/src/components/link-preview/LinkPreview.stories.tsx +48 -75
- package/src/components/list/List.stories.tsx +59 -84
- package/src/components/list/List.test.tsx +8 -17
- package/src/components/list/ListDivider.stories.tsx +9 -4
- package/src/components/list/ListDivider.test.tsx +12 -17
- package/src/components/list/ListItem.stories.tsx +97 -59
- package/src/components/list/ListItem.test.tsx +12 -17
- package/src/components/list/ListSubheader.stories.tsx +8 -5
- package/src/components/list/ListSubheader.test.tsx +12 -18
- package/src/components/message/Message.stories.tsx +51 -22
- package/src/components/mosaic/Mosaic.stories.tsx +78 -74
- package/src/components/mosaic/Mosaic.test.tsx +0 -31
- package/src/components/navigation/Navigation.stories.tsx +67 -0
- package/src/components/navigation/Navigation.test.tsx +58 -0
- package/src/components/navigation/Navigation.tsx +62 -0
- package/src/components/navigation/NavigationItem.test.tsx +37 -0
- package/src/components/navigation/NavigationItem.tsx +89 -0
- package/src/components/navigation/NavigationSection.test.tsx +126 -0
- package/src/components/navigation/NavigationSection.tsx +109 -0
- package/src/components/navigation/context.tsx +6 -0
- package/src/components/navigation/index.ts +1 -0
- package/src/components/notification/Notifications.stories.tsx +52 -47
- package/src/components/popover/Popover.stories.tsx +68 -201
- package/src/components/popover/Popover.tsx +7 -9
- package/src/components/popover-dialog/PopoverDialog.stories.tsx +26 -65
- package/src/components/post-block/PostBlock.test.tsx +12 -17
- package/src/components/progress/ProgressCircular.stories.tsx +24 -12
- package/src/components/progress/ProgressLinear.stories.tsx +6 -2
- package/src/components/radio-button/RadioButton.stories.tsx +35 -24
- package/src/components/select/Select.stories.tsx +19 -23
- package/src/components/select/SelectMultiple.stories.tsx +105 -2
- package/src/components/select/WithSelectContext.tsx +10 -4
- package/src/components/skeleton/SkeletonCircle.stories.tsx +37 -21
- package/src/components/skeleton/SkeletonCircle.test.tsx +12 -17
- package/src/components/skeleton/SkeletonRectangle.stories.tsx +74 -99
- package/src/components/skeleton/SkeletonRectangle.test.tsx +12 -17
- package/src/components/skeleton/SkeletonTypography.test.tsx +12 -17
- package/src/components/slider/Slider.stories.tsx +41 -25
- package/src/components/slider/Slider.test.tsx +12 -18
- package/src/components/slideshow/Slideshow.stories.tsx +31 -61
- package/src/components/slideshow/Slideshow.test.tsx +15 -23
- package/src/components/slideshow/SlideshowControls.stories.tsx +4 -6
- package/src/components/switch/Switch.stories.tsx +35 -32
- package/src/components/table/Table.test.tsx +12 -17
- package/src/components/tabs/Tabs.stories.tsx +4 -3
- package/src/components/text/Text.stories.tsx +130 -0
- package/src/components/text-field/TextField.stories.tsx +114 -148
- package/src/components/thumbnail/Thumbnail.stories.tsx +106 -255
- package/src/components/thumbnail/Thumbnail.test.tsx +12 -35
- package/src/components/tooltip/Tooltip.stories.tsx +51 -136
- package/src/components/user-block/UserBlock.stories.tsx +67 -56
- package/src/components/user-block/UserBlock.test.tsx +1 -5
- package/src/hooks/useFocusTrap.ts +2 -2
- package/src/index.ts +1 -0
- package/src/stories/controls/color.ts +6 -0
- package/src/stories/controls/element.ts +6 -0
- package/src/stories/controls/focusPoint.ts +1 -0
- package/src/stories/controls/icons.ts +6 -0
- package/src/stories/{knobs → controls}/image.ts +6 -16
- package/src/stories/controls/selectArgType.ts +4 -0
- package/src/stories/controls/theme.ts +3 -0
- package/src/stories/controls/typography.ts +5 -0
- package/src/stories/controls/withUndefined.ts +1 -0
- package/src/stories/decorators/withChromaticForceScreenSize.tsx +8 -0
- package/src/stories/decorators/withCombinations.tsx +99 -0
- package/src/stories/decorators/withNestedProps.tsx +23 -0
- package/src/stories/{withResizableBox.tsx → decorators/withResizableBox.tsx} +6 -10
- package/src/stories/decorators/withValueOnChange.tsx +18 -0
- package/src/stories/decorators/withWrapper.tsx +19 -0
- package/src/stories/utils/CustomLink.tsx +8 -2
- package/src/stories/{knobs → utils}/lorem.ts +9 -9
- package/src/testing/utils/commonTestsSuiteRTL.ts +2 -3
- package/src/testing/utils/index.ts +0 -2
- package/src/untypped-modules.d.ts +0 -2
- package/src/utils/MaterialThemeSwitcher/MaterialThemeSwitcher.tsx +1 -1
- package/src/utils/ThemeContext.ts +4 -0
- package/src/utils/forwardRefPolymorphic.ts +9 -0
- package/src/utils/type.ts +28 -4
- package/src/components/alert-dialog/__snapshots__/AlertDialog.test.tsx.snap +0 -558
- package/src/components/avatar/__snapshots__/Avatar.test.tsx.snap +0 -681
- package/src/components/comment-block/__snapshots__/CommentBlock.test.tsx.snap +0 -92
- package/src/components/dialog/__snapshots__/Dialog.test.tsx.snap +0 -1133
- package/src/components/expansion-panel/ExpansionPanel.stories.tsx +0 -65
- package/src/components/flag/__snapshots__/Flag.test.tsx.snap +0 -133
- package/src/components/flex-box/__snapshots__/FlexBox.test.tsx.snap +0 -492
- package/src/components/grid-column/GridColumn.stories.jsx +0 -56
- package/src/components/image-block/__snapshots__/ImageBlock.test.tsx.snap +0 -64
- package/src/components/lightbox/__snapshots__/Lightbox.test.tsx.snap +0 -194
- package/src/components/list/__snapshots__/List.test.tsx.snap +0 -360
- package/src/components/list/__snapshots__/ListDivider.test.tsx.snap +0 -7
- package/src/components/list/__snapshots__/ListItem.test.tsx.snap +0 -160
- package/src/components/list/__snapshots__/ListSubheader.test.tsx.snap +0 -9
- package/src/components/mosaic/__snapshots__/Mosaic.test.tsx.snap +0 -357
- package/src/components/post-block/__snapshots__/PostBlock.test.tsx.snap +0 -139
- package/src/components/skeleton/__snapshots__/SkeletonCircle.test.tsx.snap +0 -54
- package/src/components/skeleton/__snapshots__/SkeletonRectangle.test.tsx.snap +0 -177
- package/src/components/skeleton/__snapshots__/SkeletonTypography.test.tsx.snap +0 -174
- package/src/components/slider/__snapshots__/Slider.test.tsx.snap +0 -122
- package/src/components/slideshow/__snapshots__/Slideshow.test.tsx.snap +0 -157
- package/src/components/table/__snapshots__/Table.test.tsx.snap +0 -263
- package/src/components/text/Text.stories.jsx +0 -75
- package/src/components/thumbnail/__snapshots__/Thumbnail.test.tsx.snap +0 -130
- package/src/components/user-block/__snapshots__/UserBlock.test.tsx.snap +0 -362
- package/src/stories/chromaticForceScreenSize.tsx +0 -7
- package/src/stories/knobs/buttonKnob.ts +0 -9
- package/src/stories/knobs/emphasisKnob.ts +0 -8
- package/src/stories/knobs/enumKnob.ts +0 -14
- package/src/stories/knobs/focusKnob.ts +0 -3
- package/src/stories/knobs/sizeKnob.ts +0 -5
- package/src/stories/knobs/thumbnailsKnob.ts +0 -9
- 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 {
|
|
23
|
-
import {
|
|
24
|
-
|
|
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
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
)
|
|
56
|
-
|
|
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
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
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
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
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
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
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
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
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
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
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
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
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
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
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
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
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
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
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
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
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
|
-
{
|
|
298
|
-
|
|
299
|
-
|
|
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
|
-
|
|
306
|
-
|
|
307
|
-
|
|
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
|
-
{
|
|
322
|
-
</
|
|
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
|
-
/**
|
|
342
|
-
|
|
343
|
-
|
|
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
|
-
{
|
|
366
|
-
|
|
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
|
});
|