@nypl/design-system-react-components 0.25.9 → 0.25.10
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/CHANGELOG.md +45 -0
- package/dist/components/DatePicker/DatePicker.d.ts +1 -1
- package/dist/components/Fieldset/Fieldset.d.ts +1 -3
- package/dist/components/Form/Form.d.ts +13 -12
- package/dist/components/Form/FormTypes.d.ts +2 -2
- package/dist/components/HorizontalRule/HorizontalRule.d.ts +1 -1
- package/dist/components/RadioGroup/RadioGroup.d.ts +3 -3
- package/dist/components/SearchBar/SearchBar.d.ts +5 -5
- package/dist/components/Table/Table.d.ts +9 -3
- package/dist/components/Template/Template.d.ts +23 -4
- package/dist/design-system-react-components.cjs.development.js +197 -89
- package/dist/design-system-react-components.cjs.development.js.map +1 -1
- package/dist/design-system-react-components.cjs.production.min.js +1 -1
- package/dist/design-system-react-components.cjs.production.min.js.map +1 -1
- package/dist/design-system-react-components.esm.js +186 -91
- package/dist/design-system-react-components.esm.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/resources.scss +0 -2
- package/dist/theme/components/breadcrumb.d.ts +1 -1
- package/dist/theme/components/customTable.d.ts +12 -3
- package/package.json +40 -36
- package/src/components/Accordion/Accordion.stories.mdx +1 -1
- package/src/components/Accordion/Accordion.test.tsx +45 -1
- package/src/components/Accordion/Accordion.tsx +20 -8
- package/src/components/Accordion/__snapshots__/Accordion.test.tsx.snap +243 -0
- package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +13 -2
- package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +15 -0
- package/src/components/Breadcrumbs/Breadcrumbs.tsx +9 -3
- package/src/components/Breadcrumbs/__snapshots__/Breadcrumbs.test.tsx.snap +5 -5
- package/src/components/Card/Card.stories.mdx +1 -1
- package/src/components/Card/Card.tsx +4 -1
- package/src/components/Chakra/Flex.stories.mdx +113 -0
- package/src/components/DatePicker/DatePicker.stories.mdx +1 -1
- package/src/components/DatePicker/DatePicker.test.tsx +6 -6
- package/src/components/DatePicker/DatePicker.tsx +3 -4
- package/src/components/Fieldset/Fieldset.stories.mdx +1 -1
- package/src/components/Fieldset/Fieldset.tsx +2 -4
- package/src/components/Form/Form.stories.mdx +34 -16
- package/src/components/Form/Form.test.tsx +92 -3
- package/src/components/Form/Form.tsx +25 -21
- package/src/components/Form/FormTypes.tsx +2 -2
- package/src/components/Form/__snapshots__/Form.test.tsx.snap +0 -1
- package/src/components/Hero/Hero.stories.mdx +1 -1
- package/src/components/HorizontalRule/HorizontalRule.stories.mdx +3 -2
- package/src/components/HorizontalRule/HorizontalRule.tsx +2 -2
- package/src/components/HorizontalRule/__snapshots__/HorizontalRule.test.tsx.snap +4 -4
- package/src/components/List/List.stories.mdx +1 -1
- package/src/components/List/List.tsx +1 -1
- package/src/components/Pagination/Pagination.stories.mdx +1 -1
- package/src/components/Pagination/Pagination.tsx +2 -2
- package/src/components/Radio/__snapshots__/Radio.test.tsx.snap +5 -5
- package/src/components/RadioGroup/RadioGroup.stories.mdx +1 -1
- package/src/components/RadioGroup/RadioGroup.test.tsx +13 -11
- package/src/components/RadioGroup/RadioGroup.tsx +88 -89
- package/src/components/RadioGroup/__snapshots__/RadioGroup.test.tsx.snap +18 -18
- package/src/components/SearchBar/SearchBar.Test.tsx +106 -28
- package/src/components/SearchBar/SearchBar.stories.mdx +7 -4
- package/src/components/SearchBar/SearchBar.tsx +19 -20
- package/src/components/Select/Select.test.tsx +89 -0
- package/src/components/Select/Select.tsx +7 -1
- package/src/components/Select/__snapshots__/Select.test.tsx.snap +545 -0
- package/src/components/Slider/__snapshots__/Slider.test.tsx.snap +7 -0
- package/src/components/Table/Table.stories.mdx +118 -19
- package/src/components/Table/Table.test.tsx +80 -3
- package/src/components/Table/Table.tsx +26 -16
- package/src/components/Table/__snapshots__/Table.test.tsx.snap +1179 -0
- package/src/components/Tabs/Tabs.stories.mdx +1 -1
- package/src/components/Tabs/Tabs.test.tsx +21 -5
- package/src/components/Tabs/Tabs.tsx +33 -18
- package/src/components/Tabs/__snapshots__/Tabs.test.tsx.snap +195 -0
- package/src/components/Template/Template.stories.mdx +79 -4
- package/src/components/Template/Template.test.tsx +65 -3
- package/src/components/Template/Template.tsx +58 -8
- package/src/components/Template/__snapshots__/Template.test.tsx.snap +93 -0
- package/src/index.ts +8 -2
- package/src/theme/components/breadcrumb.ts +1 -1
- package/src/theme/components/customTable.ts +16 -3
- package/src/utils/componentCategories.ts +1 -0
|
@@ -4,7 +4,7 @@ import { axe } from "jest-axe";
|
|
|
4
4
|
import userEvent from "@testing-library/user-event";
|
|
5
5
|
import renderer from "react-test-renderer";
|
|
6
6
|
|
|
7
|
-
import SearchBar from "./SearchBar";
|
|
7
|
+
import SearchBar, { SelectProps, TextInputProps } from "./SearchBar";
|
|
8
8
|
|
|
9
9
|
const optionsGroup = [
|
|
10
10
|
"Art",
|
|
@@ -18,16 +18,17 @@ const optionsGroup = [
|
|
|
18
18
|
"Tools",
|
|
19
19
|
"Villagers",
|
|
20
20
|
];
|
|
21
|
-
const selectProps = {
|
|
21
|
+
const selectProps: SelectProps = {
|
|
22
22
|
name: "selectName",
|
|
23
23
|
labelText: "Select a category",
|
|
24
24
|
optionsData: optionsGroup,
|
|
25
25
|
};
|
|
26
|
-
const textInputProps = {
|
|
26
|
+
const textInputProps: TextInputProps = {
|
|
27
27
|
labelText: "Item Search",
|
|
28
28
|
name: "textInputName",
|
|
29
29
|
placeholder: "Item Search",
|
|
30
30
|
};
|
|
31
|
+
const labelText = "SearchBar label";
|
|
31
32
|
const helperText = "Search for items in Animal Crossing New Horizons";
|
|
32
33
|
const invalidText = "Could not find the item :(";
|
|
33
34
|
|
|
@@ -38,7 +39,21 @@ describe("SearchBar Accessibility", () => {
|
|
|
38
39
|
helperText={helperText}
|
|
39
40
|
id="id"
|
|
40
41
|
invalidText={invalidText}
|
|
41
|
-
labelText=
|
|
42
|
+
labelText={labelText}
|
|
43
|
+
onSubmit={jest.fn()}
|
|
44
|
+
textInputProps={textInputProps}
|
|
45
|
+
/>
|
|
46
|
+
);
|
|
47
|
+
expect(await axe(container)).toHaveNoViolations();
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it("passes axe accessibility test with a Select component", async () => {
|
|
51
|
+
const { container } = render(
|
|
52
|
+
<SearchBar
|
|
53
|
+
helperText={helperText}
|
|
54
|
+
id="id"
|
|
55
|
+
invalidText={invalidText}
|
|
56
|
+
labelText={labelText}
|
|
42
57
|
onSubmit={jest.fn()}
|
|
43
58
|
selectProps={selectProps}
|
|
44
59
|
textInputProps={textInputProps}
|
|
@@ -52,12 +67,16 @@ describe("SearchBar", () => {
|
|
|
52
67
|
const searchBarSubmit = jest.fn();
|
|
53
68
|
const buttonCallback = jest.fn();
|
|
54
69
|
|
|
70
|
+
beforeEach(() => {
|
|
71
|
+
jest.clearAllMocks();
|
|
72
|
+
});
|
|
73
|
+
|
|
55
74
|
it("renders the basic form", () => {
|
|
56
75
|
render(
|
|
57
76
|
<SearchBar
|
|
58
77
|
helperText={helperText}
|
|
59
78
|
id="id"
|
|
60
|
-
labelText=
|
|
79
|
+
labelText={labelText}
|
|
61
80
|
onSubmit={searchBarSubmit}
|
|
62
81
|
textInputProps={textInputProps}
|
|
63
82
|
/>
|
|
@@ -65,7 +84,7 @@ describe("SearchBar", () => {
|
|
|
65
84
|
expect(screen.getByRole("search")).toBeInTheDocument();
|
|
66
85
|
expect(screen.getByRole("search")).toHaveAttribute(
|
|
67
86
|
"aria-label",
|
|
68
|
-
|
|
87
|
+
`${labelText} - ${helperText}`
|
|
69
88
|
);
|
|
70
89
|
expect(screen.getByPlaceholderText("Item Search")).toBeInTheDocument();
|
|
71
90
|
expect(screen.getByRole("button")).toBeInTheDocument();
|
|
@@ -76,7 +95,7 @@ describe("SearchBar", () => {
|
|
|
76
95
|
<SearchBar
|
|
77
96
|
helperText={helperText}
|
|
78
97
|
id="id"
|
|
79
|
-
labelText=
|
|
98
|
+
labelText={labelText}
|
|
80
99
|
onSubmit={searchBarSubmit}
|
|
81
100
|
selectProps={selectProps}
|
|
82
101
|
textInputProps={textInputProps}
|
|
@@ -93,7 +112,7 @@ describe("SearchBar", () => {
|
|
|
93
112
|
id="id"
|
|
94
113
|
invalidText={invalidText}
|
|
95
114
|
isInvalid
|
|
96
|
-
labelText=
|
|
115
|
+
labelText={labelText}
|
|
97
116
|
onSubmit={searchBarSubmit}
|
|
98
117
|
selectProps={selectProps}
|
|
99
118
|
textInputProps={textInputProps}
|
|
@@ -110,7 +129,7 @@ describe("SearchBar", () => {
|
|
|
110
129
|
id="id"
|
|
111
130
|
invalidText={invalidText}
|
|
112
131
|
isInvalid
|
|
113
|
-
labelText=
|
|
132
|
+
labelText={labelText}
|
|
114
133
|
onSubmit={searchBarSubmit}
|
|
115
134
|
selectProps={selectProps}
|
|
116
135
|
textInputProps={textInputProps}
|
|
@@ -121,38 +140,96 @@ describe("SearchBar", () => {
|
|
|
121
140
|
).not.toBeInTheDocument();
|
|
122
141
|
});
|
|
123
142
|
|
|
143
|
+
it("calls the TextInput onChange callback function", () => {
|
|
144
|
+
textInputProps.onChange = jest.fn();
|
|
145
|
+
|
|
146
|
+
render(
|
|
147
|
+
<SearchBar
|
|
148
|
+
helperText={helperText}
|
|
149
|
+
id="id"
|
|
150
|
+
labelText={labelText}
|
|
151
|
+
onSubmit={searchBarSubmit}
|
|
152
|
+
textInputProps={textInputProps}
|
|
153
|
+
/>
|
|
154
|
+
);
|
|
155
|
+
const input = screen.getByLabelText(textInputProps.labelText);
|
|
156
|
+
expect(textInputProps.onChange).toHaveBeenCalledTimes(0);
|
|
157
|
+
|
|
158
|
+
userEvent.type(input, "search!");
|
|
159
|
+
|
|
160
|
+
// Seven times for every letter in the search string
|
|
161
|
+
expect(textInputProps.onChange).toHaveBeenCalledTimes(7);
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
it("calls the Select onChange callback function", () => {
|
|
165
|
+
selectProps.onChange = jest.fn();
|
|
166
|
+
|
|
167
|
+
render(
|
|
168
|
+
<SearchBar
|
|
169
|
+
helperText={helperText}
|
|
170
|
+
id="id"
|
|
171
|
+
labelText={labelText}
|
|
172
|
+
onSubmit={searchBarSubmit}
|
|
173
|
+
selectProps={selectProps}
|
|
174
|
+
textInputProps={textInputProps}
|
|
175
|
+
/>
|
|
176
|
+
);
|
|
177
|
+
const select = screen.getByLabelText(selectProps.labelText);
|
|
178
|
+
expect(selectProps.onChange).toHaveBeenCalledTimes(0);
|
|
179
|
+
|
|
180
|
+
userEvent.selectOptions(select, "Flowers");
|
|
181
|
+
expect(selectProps.onChange).toHaveBeenCalledTimes(1);
|
|
182
|
+
|
|
183
|
+
userEvent.selectOptions(select, "Furniture");
|
|
184
|
+
expect(selectProps.onChange).toHaveBeenCalledTimes(2);
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
it("calls the callback function for the Button component ", () => {
|
|
188
|
+
render(
|
|
189
|
+
<SearchBar
|
|
190
|
+
buttonOnClick={buttonCallback}
|
|
191
|
+
helperText={helperText}
|
|
192
|
+
id="id"
|
|
193
|
+
labelText={labelText}
|
|
194
|
+
onSubmit={searchBarSubmit}
|
|
195
|
+
selectProps={selectProps}
|
|
196
|
+
textInputProps={textInputProps}
|
|
197
|
+
/>
|
|
198
|
+
);
|
|
199
|
+
expect(buttonCallback).toHaveBeenCalledTimes(0);
|
|
200
|
+
userEvent.click(screen.getByRole("button"));
|
|
201
|
+
expect(buttonCallback).toHaveBeenCalledTimes(1);
|
|
202
|
+
});
|
|
203
|
+
|
|
124
204
|
it("calls the callback function on submit ", () => {
|
|
125
205
|
render(
|
|
126
206
|
<SearchBar
|
|
127
207
|
helperText={helperText}
|
|
128
208
|
id="id"
|
|
129
|
-
labelText=
|
|
209
|
+
labelText={labelText}
|
|
130
210
|
onSubmit={searchBarSubmit}
|
|
131
211
|
selectProps={selectProps}
|
|
132
212
|
textInputProps={textInputProps}
|
|
133
213
|
/>
|
|
134
214
|
);
|
|
135
215
|
expect(searchBarSubmit).toHaveBeenCalledTimes(0);
|
|
136
|
-
expect(buttonCallback).toHaveBeenCalledTimes(0);
|
|
137
216
|
userEvent.click(screen.getByRole("button"));
|
|
138
217
|
expect(searchBarSubmit).toHaveBeenCalledTimes(1);
|
|
139
|
-
expect(buttonCallback).toHaveBeenCalledTimes(1);
|
|
140
218
|
});
|
|
141
219
|
|
|
142
|
-
it("
|
|
220
|
+
it("renders 'required' in the placeholder text", () => {
|
|
143
221
|
const { rerender } = render(
|
|
144
222
|
<SearchBar
|
|
145
223
|
id="requiredState"
|
|
146
224
|
isDisabled
|
|
147
|
-
|
|
148
|
-
labelText="searchbar"
|
|
225
|
+
labelText={labelText}
|
|
149
226
|
onSubmit={jest.fn()}
|
|
150
227
|
textInputProps={textInputProps}
|
|
151
228
|
/>
|
|
152
229
|
);
|
|
153
230
|
|
|
154
231
|
expect(
|
|
155
|
-
screen.
|
|
232
|
+
screen.queryByPlaceholderText("Item Search (Required)")
|
|
156
233
|
).not.toBeInTheDocument();
|
|
157
234
|
|
|
158
235
|
rerender(
|
|
@@ -160,7 +237,7 @@ describe("SearchBar", () => {
|
|
|
160
237
|
id="requiredState"
|
|
161
238
|
isDisabled
|
|
162
239
|
isRequired
|
|
163
|
-
labelText=
|
|
240
|
+
labelText={labelText}
|
|
164
241
|
onSubmit={jest.fn()}
|
|
165
242
|
textInputProps={textInputProps}
|
|
166
243
|
/>
|
|
@@ -170,13 +247,14 @@ describe("SearchBar", () => {
|
|
|
170
247
|
).toBeInTheDocument();
|
|
171
248
|
});
|
|
172
249
|
|
|
173
|
-
|
|
250
|
+
// TODO: Fix the `Select` component before enabling this test
|
|
251
|
+
it.skip("renders the UI snapshot correctly", () => {
|
|
174
252
|
const basic = renderer
|
|
175
253
|
.create(
|
|
176
254
|
<SearchBar
|
|
177
255
|
helperText={helperText}
|
|
178
256
|
id="basic"
|
|
179
|
-
labelText=
|
|
257
|
+
labelText={labelText}
|
|
180
258
|
onSubmit={jest.fn()}
|
|
181
259
|
textInputProps={textInputProps}
|
|
182
260
|
/>
|
|
@@ -187,7 +265,7 @@ describe("SearchBar", () => {
|
|
|
187
265
|
<SearchBar
|
|
188
266
|
helperText={helperText}
|
|
189
267
|
id="withSelect"
|
|
190
|
-
labelText=
|
|
268
|
+
labelText={labelText}
|
|
191
269
|
onSubmit={jest.fn()}
|
|
192
270
|
selectProps={selectProps}
|
|
193
271
|
textInputProps={textInputProps}
|
|
@@ -198,7 +276,7 @@ describe("SearchBar", () => {
|
|
|
198
276
|
.create(
|
|
199
277
|
<SearchBar
|
|
200
278
|
id="withoutHelperText"
|
|
201
|
-
labelText=
|
|
279
|
+
labelText={labelText}
|
|
202
280
|
onSubmit={jest.fn()}
|
|
203
281
|
textInputProps={textInputProps}
|
|
204
282
|
/>
|
|
@@ -209,7 +287,7 @@ describe("SearchBar", () => {
|
|
|
209
287
|
<SearchBar
|
|
210
288
|
id="invalidState"
|
|
211
289
|
isInvalid
|
|
212
|
-
labelText=
|
|
290
|
+
labelText={labelText}
|
|
213
291
|
onSubmit={jest.fn()}
|
|
214
292
|
textInputProps={textInputProps}
|
|
215
293
|
/>
|
|
@@ -220,7 +298,7 @@ describe("SearchBar", () => {
|
|
|
220
298
|
<SearchBar
|
|
221
299
|
id="disabledState"
|
|
222
300
|
isDisabled
|
|
223
|
-
labelText=
|
|
301
|
+
labelText={labelText}
|
|
224
302
|
onSubmit={jest.fn()}
|
|
225
303
|
textInputProps={textInputProps}
|
|
226
304
|
/>
|
|
@@ -232,7 +310,7 @@ describe("SearchBar", () => {
|
|
|
232
310
|
id="requiredState"
|
|
233
311
|
isDisabled
|
|
234
312
|
isRequired
|
|
235
|
-
labelText=
|
|
313
|
+
labelText={labelText}
|
|
236
314
|
onSubmit={jest.fn()}
|
|
237
315
|
textInputProps={textInputProps}
|
|
238
316
|
/>
|
|
@@ -244,7 +322,7 @@ describe("SearchBar", () => {
|
|
|
244
322
|
id="noBrandButtonType"
|
|
245
323
|
isDisabled
|
|
246
324
|
isRequired
|
|
247
|
-
labelText=
|
|
325
|
+
labelText={labelText}
|
|
248
326
|
noBrandButtonType={true}
|
|
249
327
|
onSubmit={jest.fn()}
|
|
250
328
|
textInputProps={textInputProps}
|
|
@@ -255,7 +333,7 @@ describe("SearchBar", () => {
|
|
|
255
333
|
.create(
|
|
256
334
|
<SearchBar
|
|
257
335
|
id="withHeading"
|
|
258
|
-
labelText=
|
|
336
|
+
labelText={labelText}
|
|
259
337
|
onSubmit={jest.fn()}
|
|
260
338
|
headingText="A Heading"
|
|
261
339
|
/>
|
|
@@ -265,7 +343,7 @@ describe("SearchBar", () => {
|
|
|
265
343
|
.create(
|
|
266
344
|
<SearchBar
|
|
267
345
|
id="withDescription"
|
|
268
|
-
labelText=
|
|
346
|
+
labelText={labelText}
|
|
269
347
|
onSubmit={jest.fn()}
|
|
270
348
|
descriptionText="A description"
|
|
271
349
|
/>
|
|
@@ -275,7 +353,7 @@ describe("SearchBar", () => {
|
|
|
275
353
|
.create(
|
|
276
354
|
<SearchBar
|
|
277
355
|
id="withHeadingAndDescription"
|
|
278
|
-
labelText=
|
|
356
|
+
labelText={labelText}
|
|
279
357
|
onSubmit={jest.fn()}
|
|
280
358
|
headingText="A Heading"
|
|
281
359
|
descriptionText="A description"
|
|
@@ -60,7 +60,7 @@ import DSProvider from "../../theme/provider";
|
|
|
60
60
|
| Component Version | DS Version |
|
|
61
61
|
| ----------------- | ---------- |
|
|
62
62
|
| Added | `0.0.4` |
|
|
63
|
-
| Latest | `0.25.
|
|
63
|
+
| Latest | `0.25.10` |
|
|
64
64
|
|
|
65
65
|
<Description of={SearchBar} />
|
|
66
66
|
|
|
@@ -142,14 +142,17 @@ export const optionsGroup = [
|
|
|
142
142
|
|
|
143
143
|
To render an optional `Select` component, an object must be passed to the
|
|
144
144
|
`selectProps` prop. It _must_ include `name`, `labelText`, and `optionsData`
|
|
145
|
-
properties. The `labelText` value won't be
|
|
146
|
-
`aria-label` attribute.
|
|
145
|
+
properties. The `onChange` property is optional. The `labelText` value won't be
|
|
146
|
+
rendered but will be used for its `aria-label` attribute.
|
|
147
147
|
|
|
148
148
|
```
|
|
149
149
|
const selectProps = {
|
|
150
150
|
name: "select-form-name",
|
|
151
151
|
labelText: "Select a category",
|
|
152
152
|
optionsData: optionsGroup,
|
|
153
|
+
onChange: (event) => {
|
|
154
|
+
console.log(event.target.value);
|
|
155
|
+
},
|
|
153
156
|
};
|
|
154
157
|
|
|
155
158
|
// ...
|
|
@@ -165,7 +168,7 @@ const selectProps = {
|
|
|
165
168
|
To render the `TextInput` component, an object must be passed to the
|
|
166
169
|
`textInputProps` prop. It _must_ include `labelText`, `name`, and `placeholder`
|
|
167
170
|
properties. The `labelText` value won't be rendered but will be used for its
|
|
168
|
-
`aria-label` attribute. Optional
|
|
171
|
+
`aria-label` attribute. Optional properties to pass include `onChange` and `value`.
|
|
169
172
|
|
|
170
173
|
```
|
|
171
174
|
const textInputProps = {
|
|
@@ -13,13 +13,7 @@ import TextInput from "../TextInput/TextInput";
|
|
|
13
13
|
import { TextInputTypes, TextInputVariants } from "../TextInput/TextInputTypes";
|
|
14
14
|
import generateUUID from "../../helpers/generateUUID";
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
interface SelectProps {
|
|
18
|
-
labelText: string;
|
|
19
|
-
name: string;
|
|
20
|
-
optionsData: string[];
|
|
21
|
-
}
|
|
22
|
-
interface TextInputProps {
|
|
16
|
+
interface BaseProps {
|
|
23
17
|
labelText: string;
|
|
24
18
|
name: string;
|
|
25
19
|
onChange?: (
|
|
@@ -27,6 +21,12 @@ interface TextInputProps {
|
|
|
27
21
|
| React.ChangeEvent<HTMLInputElement>
|
|
28
22
|
| React.ChangeEvent<HTMLTextAreaElement>
|
|
29
23
|
) => void;
|
|
24
|
+
}
|
|
25
|
+
// Internal interfaces that are used only for `SearchBar` props.
|
|
26
|
+
export interface SelectProps extends BaseProps {
|
|
27
|
+
optionsData: string[];
|
|
28
|
+
}
|
|
29
|
+
export interface TextInputProps extends BaseProps {
|
|
30
30
|
placeholder: string;
|
|
31
31
|
value?: string;
|
|
32
32
|
}
|
|
@@ -106,8 +106,6 @@ export default function SearchBar(props: SearchBarProps) {
|
|
|
106
106
|
showHelperInvalidText: false,
|
|
107
107
|
showLabel: false,
|
|
108
108
|
};
|
|
109
|
-
const helperErrorTextID = generateUUID();
|
|
110
|
-
const ariaDescribedby = helperErrorTextID;
|
|
111
109
|
const footnote = isInvalid ? invalidText : helperText;
|
|
112
110
|
const finalAriaLabel = footnote ? `${labelText} - ${footnote}` : labelText;
|
|
113
111
|
const textInputPlaceholder = `${textInputProps?.placeholder} ${
|
|
@@ -125,9 +123,10 @@ export default function SearchBar(props: SearchBarProps) {
|
|
|
125
123
|
// Render the `Select` component.
|
|
126
124
|
const selectElem = selectProps && (
|
|
127
125
|
<Select
|
|
128
|
-
id={
|
|
129
|
-
name={selectProps?.name}
|
|
126
|
+
id={`searchbar-select-${id}`}
|
|
130
127
|
labelText={selectProps?.labelText}
|
|
128
|
+
name={selectProps?.name}
|
|
129
|
+
onChange={selectProps?.onChange}
|
|
131
130
|
type={SelectTypes.SearchBar}
|
|
132
131
|
{...stateProps}
|
|
133
132
|
>
|
|
@@ -141,11 +140,11 @@ export default function SearchBar(props: SearchBarProps) {
|
|
|
141
140
|
// Render the `TextInput` component.
|
|
142
141
|
const textInputNative = textInputProps && (
|
|
143
142
|
<TextInput
|
|
144
|
-
id={
|
|
143
|
+
id={`searchbar-textinput-${id}`}
|
|
145
144
|
labelText={textInputProps?.labelText}
|
|
146
|
-
placeholder={textInputPlaceholder}
|
|
147
|
-
onChange={textInputProps?.onChange}
|
|
148
145
|
name={textInputProps?.name}
|
|
146
|
+
onChange={textInputProps?.onChange}
|
|
147
|
+
placeholder={textInputPlaceholder}
|
|
149
148
|
type={TextInputTypes.text}
|
|
150
149
|
variantType={
|
|
151
150
|
selectElem
|
|
@@ -161,21 +160,22 @@ export default function SearchBar(props: SearchBarProps) {
|
|
|
161
160
|
<Button
|
|
162
161
|
additionalStyles={searchBarButtonStyles}
|
|
163
162
|
buttonType={buttonType}
|
|
164
|
-
id={
|
|
163
|
+
id={`searchbar-button-${id}`}
|
|
165
164
|
isDisabled={isDisabled}
|
|
166
165
|
onClick={buttonOnClick}
|
|
167
166
|
type="submit"
|
|
168
167
|
>
|
|
169
168
|
<Icon
|
|
169
|
+
align={IconAlign.Left}
|
|
170
|
+
id={`searchbar-icon-${id}`}
|
|
170
171
|
name={IconNames.Search}
|
|
171
172
|
size={IconSizes.Small}
|
|
172
|
-
align={IconAlign.Left}
|
|
173
173
|
/>
|
|
174
174
|
Search
|
|
175
175
|
</Button>
|
|
176
176
|
);
|
|
177
|
-
// If a custom input element was passed, use that
|
|
178
|
-
// `TextInput` component.
|
|
177
|
+
// If a custom input element was passed, use that element
|
|
178
|
+
// instead of the DS `TextInput` component.
|
|
179
179
|
const textInputElem = textInputElement || textInputNative;
|
|
180
180
|
|
|
181
181
|
return (
|
|
@@ -189,11 +189,10 @@ export default function SearchBar(props: SearchBarProps) {
|
|
|
189
189
|
>
|
|
190
190
|
<Box
|
|
191
191
|
as="form"
|
|
192
|
-
id={
|
|
192
|
+
id={`searchbar-form-${id}`}
|
|
193
193
|
className={className}
|
|
194
194
|
role="search"
|
|
195
195
|
aria-label={finalAriaLabel}
|
|
196
|
-
aria-describedby={ariaDescribedby}
|
|
197
196
|
onSubmit={onSubmit}
|
|
198
197
|
method={method}
|
|
199
198
|
action={action}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import { render, screen, fireEvent } from "@testing-library/react";
|
|
3
3
|
import { axe } from "jest-axe";
|
|
4
|
+
import renderer from "react-test-renderer";
|
|
4
5
|
|
|
5
6
|
import Select from "./Select";
|
|
6
7
|
|
|
@@ -255,4 +256,92 @@ describe("Select", () => {
|
|
|
255
256
|
"NYPL DS recommends that <select> fields have no more than 10 options; an auto-complete text input is a good alternative for 11 or more options."
|
|
256
257
|
);
|
|
257
258
|
});
|
|
259
|
+
|
|
260
|
+
it("Renders the UI snapshot correctly", () => {
|
|
261
|
+
const siblings = ["Kendall", "Shiv", "Connor", "Roman", "Tom"];
|
|
262
|
+
|
|
263
|
+
const options = siblings.map((sibling) => (
|
|
264
|
+
<option key={sibling}>{sibling}</option>
|
|
265
|
+
));
|
|
266
|
+
|
|
267
|
+
const primary = renderer
|
|
268
|
+
.create(
|
|
269
|
+
<Select
|
|
270
|
+
id="select"
|
|
271
|
+
labelText="Which Succession sibling are you?"
|
|
272
|
+
name="succession-sibling"
|
|
273
|
+
>
|
|
274
|
+
{options}
|
|
275
|
+
</Select>
|
|
276
|
+
)
|
|
277
|
+
.toJSON();
|
|
278
|
+
const disabled = renderer
|
|
279
|
+
.create(
|
|
280
|
+
<Select
|
|
281
|
+
id="select"
|
|
282
|
+
isDisabled
|
|
283
|
+
labelText="Which Succession sibling are you?"
|
|
284
|
+
name="succession-sibling"
|
|
285
|
+
>
|
|
286
|
+
{options}
|
|
287
|
+
</Select>
|
|
288
|
+
)
|
|
289
|
+
.toJSON();
|
|
290
|
+
const withInvalidText = renderer
|
|
291
|
+
.create(
|
|
292
|
+
<Select
|
|
293
|
+
id="select"
|
|
294
|
+
invalidText="Tom doesn't count as a sibling :(."
|
|
295
|
+
isInvalid
|
|
296
|
+
labelText="Which Succession sibling are you?"
|
|
297
|
+
name="succession-sibling"
|
|
298
|
+
>
|
|
299
|
+
{options}
|
|
300
|
+
</Select>
|
|
301
|
+
)
|
|
302
|
+
.toJSON();
|
|
303
|
+
const withHelperText = renderer
|
|
304
|
+
.create(
|
|
305
|
+
<Select
|
|
306
|
+
helperText="Remember, Logan will judge you no matter who you pick."
|
|
307
|
+
id="select"
|
|
308
|
+
labelText="Which Succession sibling are you?"
|
|
309
|
+
name="succession-sibling"
|
|
310
|
+
>
|
|
311
|
+
{options}
|
|
312
|
+
</Select>
|
|
313
|
+
)
|
|
314
|
+
.toJSON();
|
|
315
|
+
const required = renderer
|
|
316
|
+
.create(
|
|
317
|
+
<Select
|
|
318
|
+
id="select"
|
|
319
|
+
isRequired
|
|
320
|
+
labelText="Which Succession sibling are you?"
|
|
321
|
+
name="succession-sibling"
|
|
322
|
+
>
|
|
323
|
+
{options}
|
|
324
|
+
</Select>
|
|
325
|
+
)
|
|
326
|
+
.toJSON();
|
|
327
|
+
const hasOnChange = renderer
|
|
328
|
+
.create(
|
|
329
|
+
<Select
|
|
330
|
+
id="select"
|
|
331
|
+
labelText="Which Succession sibling are you?"
|
|
332
|
+
name="succession-sibling"
|
|
333
|
+
onChange={jest.fn()}
|
|
334
|
+
>
|
|
335
|
+
{options}
|
|
336
|
+
</Select>
|
|
337
|
+
)
|
|
338
|
+
.toJSON();
|
|
339
|
+
|
|
340
|
+
expect(primary).toMatchSnapshot();
|
|
341
|
+
expect(disabled).toMatchSnapshot();
|
|
342
|
+
expect(withInvalidText).toMatchSnapshot();
|
|
343
|
+
expect(withHelperText).toMatchSnapshot();
|
|
344
|
+
expect(required).toMatchSnapshot();
|
|
345
|
+
expect(hasOnChange).toMatchSnapshot();
|
|
346
|
+
});
|
|
258
347
|
});
|
|
@@ -137,7 +137,13 @@ const Select = React.forwardRef<
|
|
|
137
137
|
ref={ref}
|
|
138
138
|
{...controlledProps}
|
|
139
139
|
{...ariaAttributes}
|
|
140
|
-
icon={
|
|
140
|
+
icon={
|
|
141
|
+
<Icon
|
|
142
|
+
id={`${id}-icon`}
|
|
143
|
+
name={IconNames.Arrow}
|
|
144
|
+
size={IconSizes.Medium}
|
|
145
|
+
/>
|
|
146
|
+
}
|
|
141
147
|
__css={styles.select}
|
|
142
148
|
>
|
|
143
149
|
{children}
|