@charcoal-ui/react 4.0.0-beta.3 → 4.0.0-beta.5

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 (176) hide show
  1. package/dist/_lib/useClassNames.d.ts +2 -2
  2. package/dist/_lib/useClassNames.d.ts.map +1 -1
  3. package/dist/components/Checkbox/CheckboxInput/index.d.ts +11 -0
  4. package/dist/components/Checkbox/CheckboxInput/index.d.ts.map +1 -0
  5. package/dist/components/Checkbox/CheckboxWithLabel.d.ts +9 -0
  6. package/dist/components/Checkbox/CheckboxWithLabel.d.ts.map +1 -0
  7. package/dist/components/Checkbox/index.d.ts +12 -21
  8. package/dist/components/Checkbox/index.d.ts.map +1 -1
  9. package/dist/components/Clickable/index.d.ts +10 -13
  10. package/dist/components/Clickable/index.d.ts.map +1 -1
  11. package/dist/components/DropdownSelector/Popover/index.d.ts +1 -2
  12. package/dist/components/DropdownSelector/Popover/index.d.ts.map +1 -1
  13. package/dist/components/DropdownSelector/index.d.ts.map +1 -1
  14. package/dist/components/FieldLabel/index.d.ts +1 -0
  15. package/dist/components/FieldLabel/index.d.ts.map +1 -1
  16. package/dist/components/IconButton/index.d.ts +7 -5
  17. package/dist/components/IconButton/index.d.ts.map +1 -1
  18. package/dist/components/LoadingSpinner/index.d.ts +1 -0
  19. package/dist/components/LoadingSpinner/index.d.ts.map +1 -1
  20. package/dist/components/Modal/Dialog/index.d.ts +6 -24
  21. package/dist/components/Modal/Dialog/index.d.ts.map +1 -1
  22. package/dist/components/Modal/ModalPlumbing.d.ts +10 -3
  23. package/dist/components/Modal/ModalPlumbing.d.ts.map +1 -1
  24. package/dist/components/Modal/index.d.ts +2 -2
  25. package/dist/components/Modal/index.d.ts.map +1 -1
  26. package/dist/components/Modal/useCustomModalOverlay.d.ts.map +1 -1
  27. package/dist/components/Radio/index.d.ts +6 -8
  28. package/dist/components/Radio/index.d.ts.map +1 -1
  29. package/dist/components/SegmentedControl/index.d.ts +1 -0
  30. package/dist/components/SegmentedControl/index.d.ts.map +1 -1
  31. package/dist/components/Switch/SwitchInput/index.d.ts +9 -0
  32. package/dist/components/Switch/SwitchInput/index.d.ts.map +1 -0
  33. package/dist/components/Switch/SwitchWithLabel.d.ts +9 -0
  34. package/dist/components/Switch/SwitchWithLabel.d.ts.map +1 -0
  35. package/dist/components/Switch/index.d.ts +4 -15
  36. package/dist/components/Switch/index.d.ts.map +1 -1
  37. package/dist/components/TagItem/index.d.ts +14 -15
  38. package/dist/components/TagItem/index.d.ts.map +1 -1
  39. package/dist/components/TextArea/index.d.ts +28 -18
  40. package/dist/components/TextArea/index.d.ts.map +1 -1
  41. package/dist/components/TextField/index.d.ts +32 -19
  42. package/dist/components/TextField/index.d.ts.map +1 -1
  43. package/dist/core/CharcoalProvider.d.ts +1 -1
  44. package/dist/core/CharcoalProvider.d.ts.map +1 -1
  45. package/dist/index.cjs.js +456 -1079
  46. package/dist/index.cjs.js.map +1 -1
  47. package/dist/index.css +790 -0
  48. package/dist/index.css.map +1 -1
  49. package/dist/index.d.ts +1 -2
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.esm.js +454 -1075
  52. package/dist/index.esm.js.map +1 -1
  53. package/dist/styled.d.ts +4 -4
  54. package/package.json +17 -19
  55. package/src/_lib/useClassNames.ts +3 -9
  56. package/src/components/Checkbox/CheckboxInput/__snapshots__/index.story.storyshot +77 -0
  57. package/src/components/Checkbox/CheckboxInput/index.css +111 -0
  58. package/src/components/Checkbox/CheckboxInput/index.story.tsx +51 -0
  59. package/src/components/Checkbox/CheckboxInput/index.tsx +47 -0
  60. package/src/components/Checkbox/CheckboxWithLabel.tsx +24 -0
  61. package/src/components/Checkbox/__snapshots__/index.story.storyshot +103 -538
  62. package/src/components/Checkbox/index.css +21 -0
  63. package/src/components/Checkbox/index.story.tsx +48 -78
  64. package/src/components/Checkbox/index.tsx +32 -162
  65. package/src/components/Clickable/__snapshots__/index.story.storyshot +2 -78
  66. package/src/components/Clickable/index.css +41 -0
  67. package/src/components/Clickable/index.story.tsx +1 -1
  68. package/src/components/Clickable/index.tsx +25 -85
  69. package/src/components/DropdownSelector/ListItem/__snapshots__/index.story.storyshot +10 -135
  70. package/src/components/DropdownSelector/Popover/index.tsx +1 -2
  71. package/src/components/DropdownSelector/__snapshots__/index.story.storyshot +308 -1014
  72. package/src/components/DropdownSelector/index.tsx +9 -38
  73. package/src/components/FieldLabel/index.css +35 -0
  74. package/src/components/FieldLabel/index.tsx +15 -105
  75. package/src/components/IconButton/__snapshots__/index.story.storyshot +18 -296
  76. package/src/components/IconButton/index.css +118 -0
  77. package/src/components/IconButton/index.story.tsx +16 -39
  78. package/src/components/IconButton/index.tsx +41 -118
  79. package/src/components/LoadingSpinner/__snapshots__/LoadingSpinnerIcon.story.storyshot +2 -17
  80. package/src/components/LoadingSpinner/__snapshots__/index.story.storyshot +79 -29
  81. package/src/components/LoadingSpinner/index.css +42 -0
  82. package/src/components/LoadingSpinner/index.story.tsx +18 -7
  83. package/src/components/LoadingSpinner/index.tsx +26 -52
  84. package/src/components/Modal/Dialog/index.css +44 -0
  85. package/src/components/Modal/Dialog/index.tsx +13 -57
  86. package/src/components/Modal/ModalPlumbing.css +40 -0
  87. package/src/components/Modal/ModalPlumbing.tsx +22 -61
  88. package/src/components/Modal/__snapshots__/index.story.storyshot +459 -1881
  89. package/src/components/Modal/index.css +36 -0
  90. package/src/components/Modal/index.tsx +27 -74
  91. package/src/components/Modal/useCustomModalOverlay.tsx +5 -4
  92. package/src/components/Radio/__snapshots__/index.story.storyshot +51 -776
  93. package/src/components/Radio/index.css +97 -0
  94. package/src/components/Radio/index.story.tsx +20 -30
  95. package/src/components/Radio/index.test.tsx +0 -1
  96. package/src/components/Radio/index.tsx +60 -170
  97. package/src/components/SegmentedControl/__snapshots__/index.story.storyshot +30 -260
  98. package/src/components/SegmentedControl/index.css +50 -0
  99. package/src/components/SegmentedControl/index.tsx +20 -89
  100. package/src/components/Switch/SwitchInput/index.css +82 -0
  101. package/src/components/Switch/SwitchInput/index.tsx +40 -0
  102. package/src/components/Switch/SwitchWithLabel.tsx +24 -0
  103. package/src/components/Switch/__snapshots__/index.story.storyshot +34 -538
  104. package/src/components/Switch/index.css +23 -0
  105. package/src/components/Switch/index.story.tsx +15 -18
  106. package/src/components/Switch/index.tsx +43 -140
  107. package/src/components/TagItem/__snapshots__/index.story.storyshot +212 -1063
  108. package/src/components/TagItem/index.css +140 -0
  109. package/src/components/TagItem/index.story.tsx +44 -161
  110. package/src/components/TagItem/index.tsx +76 -220
  111. package/src/components/TextArea/TextArea.story.tsx +62 -24
  112. package/src/components/TextArea/__snapshots__/TextArea.story.storyshot +1024 -792
  113. package/src/components/TextArea/index.tsx +68 -89
  114. package/src/components/TextField/TextField.story.tsx +77 -67
  115. package/src/components/TextField/__snapshots__/TextField.story.storyshot +1152 -1274
  116. package/src/components/TextField/index.tsx +77 -103
  117. package/src/components/a11y.test.tsx +1 -1
  118. package/src/core/CharcoalProvider.tsx +1 -1
  119. package/src/index.ts +0 -7
  120. package/src/type.d.ts +6 -0
  121. package/dist/components/Button/index.story.d.ts +0 -22
  122. package/dist/components/Button/index.story.d.ts.map +0 -1
  123. package/dist/components/Button/index.test.d.ts +0 -2
  124. package/dist/components/Button/index.test.d.ts.map +0 -1
  125. package/dist/components/Checkbox/index.story.d.ts +0 -8
  126. package/dist/components/Checkbox/index.story.d.ts.map +0 -1
  127. package/dist/components/Clickable/index.story.d.ts +0 -6
  128. package/dist/components/Clickable/index.story.d.ts.map +0 -1
  129. package/dist/components/DropdownSelector/ListItem/index.story.d.ts +0 -9
  130. package/dist/components/DropdownSelector/ListItem/index.story.d.ts.map +0 -1
  131. package/dist/components/DropdownSelector/MenuList/index.story.d.ts +0 -8
  132. package/dist/components/DropdownSelector/MenuList/index.story.d.ts.map +0 -1
  133. package/dist/components/DropdownSelector/Popover/index.story.d.ts +0 -5
  134. package/dist/components/DropdownSelector/Popover/index.story.d.ts.map +0 -1
  135. package/dist/components/DropdownSelector/index.story.d.ts +0 -19
  136. package/dist/components/DropdownSelector/index.story.d.ts.map +0 -1
  137. package/dist/components/Icon/index.story.d.ts +0 -6
  138. package/dist/components/Icon/index.story.d.ts.map +0 -1
  139. package/dist/components/IconButton/index.story.d.ts +0 -9
  140. package/dist/components/IconButton/index.story.d.ts.map +0 -1
  141. package/dist/components/LoadingSpinner/LoadingSpinnerIcon.story.d.ts +0 -8
  142. package/dist/components/LoadingSpinner/LoadingSpinnerIcon.story.d.ts.map +0 -1
  143. package/dist/components/LoadingSpinner/index.story.d.ts +0 -6
  144. package/dist/components/LoadingSpinner/index.story.d.ts.map +0 -1
  145. package/dist/components/Modal/index.story.d.ts +0 -21
  146. package/dist/components/Modal/index.story.d.ts.map +0 -1
  147. package/dist/components/MultiSelect/context.d.ts +0 -14
  148. package/dist/components/MultiSelect/context.d.ts.map +0 -1
  149. package/dist/components/MultiSelect/index.d.ts +0 -36
  150. package/dist/components/MultiSelect/index.d.ts.map +0 -1
  151. package/dist/components/MultiSelect/index.story.d.ts +0 -82
  152. package/dist/components/MultiSelect/index.story.d.ts.map +0 -1
  153. package/dist/components/MultiSelect/index.test.d.ts +0 -2
  154. package/dist/components/MultiSelect/index.test.d.ts.map +0 -1
  155. package/dist/components/Radio/index.story.d.ts +0 -26
  156. package/dist/components/Radio/index.story.d.ts.map +0 -1
  157. package/dist/components/Radio/index.test.d.ts +0 -2
  158. package/dist/components/Radio/index.test.d.ts.map +0 -1
  159. package/dist/components/SegmentedControl/index.story.d.ts +0 -7
  160. package/dist/components/SegmentedControl/index.story.d.ts.map +0 -1
  161. package/dist/components/Switch/index.story.d.ts +0 -9
  162. package/dist/components/Switch/index.story.d.ts.map +0 -1
  163. package/dist/components/TagItem/index.story.d.ts +0 -16
  164. package/dist/components/TagItem/index.story.d.ts.map +0 -1
  165. package/dist/components/TextArea/TextArea.story.d.ts +0 -9
  166. package/dist/components/TextArea/TextArea.story.d.ts.map +0 -1
  167. package/dist/components/TextField/TextField.story.d.ts +0 -22
  168. package/dist/components/TextField/TextField.story.d.ts.map +0 -1
  169. package/dist/components/a11y.test.d.ts +0 -2
  170. package/dist/components/a11y.test.d.ts.map +0 -1
  171. package/src/components/LoadingSpinner/LoadingSpinnerIcon.story.tsx +0 -13
  172. package/src/components/MultiSelect/__snapshots__/index.story.storyshot +0 -1066
  173. package/src/components/MultiSelect/context.ts +0 -23
  174. package/src/components/MultiSelect/index.story.tsx +0 -216
  175. package/src/components/MultiSelect/index.test.tsx +0 -263
  176. package/src/components/MultiSelect/index.tsx +0 -281
@@ -1,23 +0,0 @@
1
- import { createContext } from 'react'
2
-
3
- type MultiSelectGroupContext = {
4
- name: string
5
- selected: string[]
6
- disabled: boolean
7
- readonly: boolean
8
- invalid: boolean
9
- onChange: ({ value, selected }: { value: string; selected: boolean }) => void
10
- }
11
-
12
- export const MultiSelectGroupContext = createContext<MultiSelectGroupContext>({
13
- name: undefined as never,
14
- selected: [],
15
- disabled: false,
16
- readonly: false,
17
- invalid: false,
18
- onChange() {
19
- throw new Error(
20
- 'Cannot find `onChange()` handler. Perhaps you forgot to wrap it with `<MultiSelectGroup />` ?'
21
- )
22
- },
23
- })
@@ -1,216 +0,0 @@
1
- import { useState } from 'react'
2
- import { Story } from '../../_lib/compat'
3
- import styled from 'styled-components'
4
- import { MultiSelectGroup, default as MultiSelect } from '.'
5
-
6
- export default {
7
- title: 'MultiSelect',
8
- component: MultiSelect,
9
- argTypes: {
10
- name: {
11
- control: {
12
- type: 'text',
13
- },
14
- },
15
- label: {
16
- control: {
17
- type: 'text',
18
- },
19
- },
20
- selected: {
21
- control: {
22
- type: 'boolean',
23
- },
24
- },
25
- disabled: {
26
- control: {
27
- type: 'boolean',
28
- },
29
- },
30
- readonly: {
31
- control: {
32
- type: 'boolean',
33
- },
34
- },
35
- invalid: {
36
- control: {
37
- type: 'boolean',
38
- },
39
- },
40
- variant: {
41
- control: {
42
- type: 'inline-radio',
43
- options: ['default', 'overlay'],
44
- },
45
- },
46
- },
47
- }
48
-
49
- type Props = {
50
- name: string
51
- label: string
52
- selected: boolean
53
- onChange: (selected: string[]) => void
54
- disabled?: boolean
55
- readonly?: boolean
56
- invalid?: boolean
57
- variant?: 'default' | 'overlay'
58
- className?: string
59
- }
60
-
61
- const StyledMultiSelectGroup = styled(MultiSelectGroup)`
62
- display: grid;
63
- grid-template-columns: 1fr;
64
- gap: 8px;
65
- `
66
-
67
- const Template: Story<Props> = ({
68
- name,
69
- label,
70
- selected,
71
- onChange,
72
- disabled,
73
- readonly,
74
- invalid,
75
- variant,
76
- className,
77
- }) => {
78
- return (
79
- <StyledMultiSelectGroup
80
- {...{
81
- name,
82
- label,
83
- onChange,
84
- disabled,
85
- readonly,
86
- invalid,
87
- }}
88
- selected={selected ? ['選択肢1', '選択肢3'] : []}
89
- >
90
- {[1, 2, 3, 4].map((idx) => (
91
- <MultiSelect
92
- value={`選択肢${idx}`}
93
- variant={variant}
94
- key={idx}
95
- className={className}
96
- >
97
- 選択肢{idx}
98
- </MultiSelect>
99
- ))}
100
- </StyledMultiSelectGroup>
101
- )
102
- }
103
-
104
- export const Default = Template.bind({})
105
- Default.args = {
106
- name: '',
107
- label: '',
108
- selected: true,
109
- disabled: false,
110
- readonly: false,
111
- invalid: false,
112
- variant: 'default',
113
- // eslint-disable-next-line no-console
114
- onChange: (selected) => console.log(selected),
115
- }
116
-
117
- type PlaygroundProps = {
118
- name: string
119
- label: string
120
- disabled?: boolean
121
- readonly?: boolean
122
- invalid?: boolean
123
- className?: string
124
- variant?: 'default' | 'overlay'
125
- }
126
-
127
- export const Playground: Story<PlaygroundProps> = ({ className, ...props }) => {
128
- const [selected, setSelected] = useState<string[]>([])
129
-
130
- return (
131
- <StyledMultiSelectGroup
132
- {...props}
133
- selected={selected}
134
- onChange={setSelected}
135
- >
136
- {[1, 2, 3, 4].map((idx) => (
137
- <MultiSelect
138
- value={`選択肢${idx}`}
139
- variant={props.variant}
140
- key={idx}
141
- className={className}
142
- >
143
- 選択肢{idx}
144
- </MultiSelect>
145
- ))}
146
- </StyledMultiSelectGroup>
147
- )
148
- }
149
- Playground.args = {
150
- name: 'defaultName',
151
- label: '',
152
- disabled: false,
153
- readonly: false,
154
- invalid: false,
155
- variant: 'default',
156
- }
157
-
158
- export const Invalid: Story<PlaygroundProps> = ({ className, ...props }) => {
159
- const [selected, setSelected] = useState<string[]>([])
160
-
161
- return (
162
- <StyledMultiSelectGroup
163
- {...props}
164
- selected={selected}
165
- onChange={setSelected}
166
- invalid
167
- >
168
- {[1, 2, 3, 4].map((idx) => (
169
- <MultiSelect
170
- value={`選択肢${idx}`}
171
- variant={props.variant}
172
- key={idx}
173
- className={className}
174
- >
175
- 選択肢{idx}
176
- </MultiSelect>
177
- ))}
178
- </StyledMultiSelectGroup>
179
- )
180
- }
181
- Invalid.args = {
182
- name: 'defaultName',
183
- label: '',
184
- disabled: false,
185
- readonly: false,
186
- variant: 'default',
187
- }
188
-
189
- export const Overlay: Story<PlaygroundProps> = ({ className, ...props }) => {
190
- const [selected, setSelected] = useState<string[]>([])
191
-
192
- return (
193
- <StyledMultiSelectGroup
194
- {...props}
195
- selected={selected}
196
- onChange={setSelected}
197
- >
198
- {[1, 2, 3, 4].map((idx) => (
199
- <MultiSelect
200
- value={`選択肢${idx}`}
201
- variant="overlay"
202
- key={idx}
203
- className={className}
204
- >
205
- 選択肢{idx}
206
- </MultiSelect>
207
- ))}
208
- </StyledMultiSelectGroup>
209
- )
210
- }
211
- Overlay.args = {
212
- name: 'defaultName',
213
- label: '',
214
- disabled: false,
215
- readonly: false,
216
- }
@@ -1,263 +0,0 @@
1
- import { fireEvent, render, screen } from '@testing-library/react'
2
- import { ThemeProvider } from 'styled-components'
3
- import { default as MultiSelect, MultiSelectGroup } from '.'
4
- import { light } from '@charcoal-ui/theme'
5
-
6
- describe('MultiSelect', () => {
7
- describe('in development mode', () => {
8
- beforeEach(() => {
9
- process.env.NODE_ENV = 'development'
10
- })
11
-
12
- describe('when `<MultiSelect />` is used without `<MultiSelectGroup />`', () => {
13
- beforeEach(() => {
14
- // eslint-disable-next-line no-console
15
- console.error = jest.fn()
16
-
17
- render(
18
- <ThemeProvider theme={light}>
19
- <MultiSelect value="a" />
20
- </ThemeProvider>
21
- )
22
- })
23
-
24
- it('emits error message', () => {
25
- // eslint-disable-next-line no-console
26
- expect(console.error).toHaveBeenCalledWith(
27
- expect.stringMatching(
28
- /Perhaps you forgot to wrap with <MultiSelectGroup>/u
29
- )
30
- )
31
- })
32
- })
33
- })
34
-
35
- describe('none of the options selected', () => {
36
- let option1: HTMLInputElement
37
- let option2: HTMLInputElement
38
- let option3: HTMLInputElement
39
- let allOptions: HTMLInputElement[]
40
- let parent: HTMLDivElement
41
- const childOnChange = jest.fn()
42
- const parentOnChange = jest.fn()
43
-
44
- beforeEach(() => {
45
- render(
46
- <TestComponent
47
- selected={[]}
48
- childOnChange={childOnChange}
49
- parentOnChange={parentOnChange}
50
- />
51
- )
52
-
53
- option1 = screen.getByDisplayValue('option1')
54
- option2 = screen.getByDisplayValue('option2')
55
- option3 = screen.getByDisplayValue('option3')
56
- allOptions = [option1, option2, option3]
57
- parent = screen.getByTestId('SelectGroup')
58
- })
59
-
60
- it('options have correct name', () => {
61
- allOptions.forEach((element) => expect(element.name).toBe('defaultName'))
62
- })
63
-
64
- it('parent have correct aria-label', () => {
65
- expect(parent.getAttribute('aria-label')).toBe('defaultAriaLabel')
66
- })
67
-
68
- it('none of the options are selected', () => {
69
- allOptions.forEach((element) => expect(element.checked).toBeFalsy())
70
- })
71
-
72
- describe('selecting option1', () => {
73
- it('childOnChange is called', () => {
74
- fireEvent.click(option1)
75
- expect(childOnChange).toHaveBeenCalledWith({
76
- value: 'option1',
77
- selected: true,
78
- })
79
- })
80
-
81
- it('parentOnChange is called', () => {
82
- fireEvent.click(option1)
83
- expect(parentOnChange).toHaveBeenCalledWith(['option1'])
84
- })
85
- })
86
- })
87
-
88
- describe('option2 is selected', () => {
89
- let option1: HTMLInputElement
90
- let option2: HTMLInputElement
91
- let option3: HTMLInputElement
92
- const childOnChange = jest.fn()
93
- const parentOnChange = jest.fn()
94
-
95
- beforeEach(() => {
96
- render(
97
- <TestComponent
98
- selected={['option2']}
99
- childOnChange={childOnChange}
100
- parentOnChange={parentOnChange}
101
- />
102
- )
103
-
104
- option1 = screen.getByDisplayValue('option1')
105
- option2 = screen.getByDisplayValue('option2')
106
- option3 = screen.getByDisplayValue('option3')
107
- })
108
-
109
- it('only option2 is selected', () => {
110
- expect(option2.checked).toBeTruthy()
111
- ;[option1, option3].forEach((element) =>
112
- expect(element.checked).toBeFalsy()
113
- )
114
- })
115
-
116
- describe('selecting option1', () => {
117
- it('parentOnChange is called', () => {
118
- fireEvent.click(option1)
119
- expect(parentOnChange).toHaveBeenCalledWith(['option2', 'option1'])
120
- })
121
- })
122
-
123
- describe('de-selecting option2', () => {
124
- it('childOnChange is called', () => {
125
- fireEvent.click(option2)
126
- expect(childOnChange).toHaveBeenCalledWith({
127
- value: 'option2',
128
- selected: false,
129
- })
130
- })
131
-
132
- it('parentOnChange is called', () => {
133
- fireEvent.click(option2)
134
- expect(parentOnChange).toHaveBeenCalledWith([])
135
- })
136
- })
137
- })
138
-
139
- describe('the group is disabled', () => {
140
- let option1: HTMLInputElement
141
- let option2: HTMLInputElement
142
- let option3: HTMLInputElement
143
- let allOptions: HTMLInputElement[]
144
-
145
- beforeEach(() => {
146
- render(<TestComponent selected={['option1']} parentDisabled={true} />)
147
-
148
- option1 = screen.getByDisplayValue('option1')
149
- option2 = screen.getByDisplayValue('option2')
150
- option3 = screen.getByDisplayValue('option3')
151
- allOptions = [option1, option2, option3]
152
- })
153
-
154
- it('all the options are disabled', () => {
155
- allOptions.forEach((element) => expect(element.disabled).toBeTruthy())
156
- })
157
- })
158
-
159
- describe('the group is readonly', () => {
160
- let option1: HTMLInputElement
161
- let option2: HTMLInputElement
162
- let option3: HTMLInputElement
163
- let allOptions: HTMLInputElement[]
164
-
165
- beforeEach(() => {
166
- render(<TestComponent selected={['option1']} readonly={true} />)
167
-
168
- option1 = screen.getByDisplayValue('option1')
169
- option2 = screen.getByDisplayValue('option2')
170
- option3 = screen.getByDisplayValue('option3')
171
- allOptions = [option1, option2, option3]
172
- })
173
-
174
- it('all the options are disabled', () => {
175
- allOptions.forEach((element) => expect(element.disabled).toBeTruthy())
176
- })
177
- })
178
-
179
- describe('the group has error', () => {
180
- let option1: HTMLInputElement
181
- let option2: HTMLInputElement
182
- let option3: HTMLInputElement
183
- let allOptions: HTMLInputElement[]
184
-
185
- beforeEach(() => {
186
- render(<TestComponent selected={['option1']} invalid={true} />)
187
-
188
- option1 = screen.getByDisplayValue('option1')
189
- option2 = screen.getByDisplayValue('option2')
190
- option3 = screen.getByDisplayValue('option3')
191
- allOptions = [option1, option2, option3]
192
- })
193
-
194
- it('all the options have `aria-invalid="true"`', () => {
195
- allOptions.forEach((element) =>
196
- expect(element.getAttribute('aria-invalid')).toBeTruthy()
197
- )
198
- })
199
- })
200
-
201
- describe('option1 is disabled', () => {
202
- let option1: HTMLInputElement
203
- let option2: HTMLInputElement
204
-
205
- beforeEach(() => {
206
- render(<TestComponent selected={[]} firstOptionDisabled={true} />)
207
-
208
- option1 = screen.getByDisplayValue('option1')
209
- option2 = screen.getByDisplayValue('option2')
210
- })
211
-
212
- it('only option1 is disabled', () => {
213
- expect(option1.disabled).toBeTruthy()
214
- expect(option2.disabled).toBeFalsy()
215
- })
216
- })
217
- })
218
-
219
- const TestComponent = ({
220
- selected,
221
- parentOnChange = () => {
222
- return
223
- },
224
- childOnChange,
225
- parentDisabled = false,
226
- readonly = false,
227
- invalid = false,
228
- firstOptionDisabled = false,
229
- }: {
230
- selected: string[]
231
- parentOnChange?: (selected: string[]) => void
232
- childOnChange?: (payload: { value: string; selected: boolean }) => void
233
- parentDisabled?: boolean
234
- readonly?: boolean
235
- invalid?: boolean
236
- firstOptionDisabled?: boolean
237
- }) => {
238
- return (
239
- <ThemeProvider theme={light}>
240
- <MultiSelectGroup
241
- name="defaultName"
242
- label="defaultAriaLabel"
243
- disabled={parentDisabled}
244
- onChange={parentOnChange}
245
- {...{ selected, readonly, invalid }}
246
- >
247
- <MultiSelect
248
- value="option1"
249
- disabled={firstOptionDisabled}
250
- onChange={childOnChange}
251
- >
252
- Option 1
253
- </MultiSelect>
254
- <MultiSelect value="option2" onChange={childOnChange}>
255
- Option 2
256
- </MultiSelect>
257
- <MultiSelect value="option3" onChange={childOnChange}>
258
- Option 3
259
- </MultiSelect>
260
- </MultiSelectGroup>
261
- </ThemeProvider>
262
- )
263
- }