@popsure/dirty-swan 0.65.1 → 0.66.1
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/dist/cjs/index.d.ts +2 -2
- package/dist/cjs/index.js +361 -209
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/lib/components/searchableDropdown/index.d.ts +22 -0
- package/dist/cjs/lib/components/searchableDropdown/index.stories.d.ts +108 -0
- package/dist/cjs/lib/components/searchableDropdown/index.test.d.ts +1 -0
- package/dist/cjs/lib/hooks/useDropdownAlignment.d.ts +5 -0
- package/dist/cjs/lib/index.d.ts +3 -2
- package/dist/esm/{Calendar-C7I0F5Gv.js → Calendar-8rhyapMz.js} +3 -19
- package/dist/esm/Calendar-8rhyapMz.js.map +1 -0
- package/dist/esm/components/dateSelector/components/Calendar.js +2 -1
- package/dist/esm/components/dateSelector/components/Calendar.js.map +1 -1
- package/dist/esm/components/dateSelector/index.js +2 -1
- package/dist/esm/components/dateSelector/index.js.map +1 -1
- package/dist/esm/components/dateSelector/index.stories.js +2 -1
- package/dist/esm/components/dateSelector/index.stories.js.map +1 -1
- package/dist/esm/components/dateSelector/index.test.js +2 -1
- package/dist/esm/components/dateSelector/index.test.js.map +1 -1
- package/dist/esm/components/searchableDropdown/index.js +13 -0
- package/dist/esm/components/searchableDropdown/index.js.map +1 -0
- package/dist/esm/components/searchableDropdown/index.stories.js +201 -0
- package/dist/esm/components/searchableDropdown/index.stories.js.map +1 -0
- package/dist/esm/components/searchableDropdown/index.test.js +607 -0
- package/dist/esm/components/searchableDropdown/index.test.js.map +1 -0
- package/dist/esm/components/toast/index.js +1 -1
- package/dist/esm/components/toast/index.stories.js +1 -1
- package/dist/esm/components/toast/index.test.js +1 -1
- package/dist/esm/{index-C4IAMlRE.js → index-CT0_LjIR.js} +2 -2
- package/dist/esm/{index-C4IAMlRE.js.map → index-CT0_LjIR.js.map} +1 -1
- package/dist/esm/index-QeP_xz9v.js +175 -0
- package/dist/esm/index-QeP_xz9v.js.map +1 -0
- package/dist/esm/index.d.ts +2 -2
- package/dist/esm/index.js +7 -17
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/components/searchableDropdown/index.d.ts +22 -0
- package/dist/esm/lib/components/searchableDropdown/index.stories.d.ts +108 -0
- package/dist/esm/lib/components/searchableDropdown/index.test.d.ts +1 -0
- package/dist/esm/lib/hooks/useDropdownAlignment.d.ts +5 -0
- package/dist/esm/lib/index.d.ts +3 -2
- package/dist/esm/useOnClickOutside-B5hujnpp.js +21 -0
- package/dist/esm/useOnClickOutside-B5hujnpp.js.map +1 -0
- package/dist/esm/util/images/index.stories.js +2 -1
- package/dist/esm/util/images/index.stories.js.map +1 -1
- package/package.json +1 -1
- package/src/index.tsx +3 -0
- package/src/lib/components/searchableDropdown/index.stories.tsx +286 -0
- package/src/lib/components/searchableDropdown/index.test.tsx +355 -0
- package/src/lib/components/searchableDropdown/index.tsx +267 -0
- package/src/lib/components/searchableDropdown/style.module.scss +137 -0
- package/src/lib/hooks/useDropdownAlignment.test.ts +210 -0
- package/src/lib/hooks/useDropdownAlignment.ts +34 -0
- package/src/lib/index.tsx +8 -0
- package/dist/esm/Calendar-C7I0F5Gv.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.stories.js","sources":["../../../../../src/lib/components/searchableDropdown/index.stories.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { SearchableDropdown, SearchableDropdownProps } from '.';\n\nconst story = {\n title: 'JSX/SearchableDropdown',\n component: SearchableDropdown,\n argTypes: {\n options: {\n description: 'Array of options to display',\n table: {\n type: {\n summary: '{ id: string; label: string; icon?: ReactNode }[]',\n },\n },\n },\n value: {\n description: 'The currently selected option id',\n },\n onChange: {\n action: true,\n table: {\n category: 'Callbacks',\n },\n },\n searchable: {\n description: 'Whether the dropdown includes a search input',\n control: 'boolean',\n },\n placeholder: {\n description: 'Placeholder text for the search input',\n control: 'text',\n },\n triggerPlaceholder: {\n description: 'Placeholder text shown on the trigger when no value is selected',\n control: 'text',\n },\n noResultsText: {\n description: 'Text shown when no options match the search',\n control: 'text',\n },\n groupName: {\n description: 'Name attribute for the radio group',\n control: 'text',\n },\n dropUp: {\n description: 'Whether the dropdown opens upward',\n control: 'boolean',\n },\n condensed: {\n description: 'Whether to use a compact trigger (icon only)',\n control: 'boolean',\n },\n bordered: {\n description: 'Whether to show a border on the trigger',\n control: 'boolean',\n },\n showChevron: {\n description: 'Whether to show a chevron icon on the trigger',\n control: 'boolean',\n },\n },\n args: {\n options: [\n { id: 'de', label: 'Germany' },\n { id: 'fr', label: 'France' },\n { id: 'es', label: 'Spain' },\n { id: 'it', label: 'Italy' },\n { id: 'pt', label: 'Portugal' },\n ],\n value: 'de',\n searchable: false,\n placeholder: 'Search',\n triggerPlaceholder: 'Select a country',\n noResultsText: 'No results found',\n groupName: 'country',\n dropUp: false,\n condensed: false,\n bordered: false,\n showChevron: false,\n },\n parameters: {\n componentSubtitle:\n 'A dropdown component that supports searchable options with keyboard navigation.',\n },\n};\n\nexport const Default = {\n render: (args: SearchableDropdownProps) => {\n const [selected, setSelected] = useState(args.value);\n\n return (\n <div style={{ width: 300 }}>\n <SearchableDropdown\n {...args}\n value={selected}\n onChange={(val) => {\n args.onChange(val);\n setSelected(val);\n }}\n />\n </div>\n );\n },\n\n name: 'Default',\n};\n\nexport const Searchable = {\n render: (args: SearchableDropdownProps) => {\n const [selected, setSelected] = useState(args.value);\n\n const options = [\n { id: 'de', label: 'Germany' },\n { id: 'fr', label: 'France' },\n { id: 'es', label: 'Spain' },\n { id: 'it', label: 'Italy' },\n { id: 'pt', label: 'Portugal' },\n { id: 'nl', label: 'Netherlands' },\n { id: 'be', label: 'Belgium' },\n { id: 'at', label: 'Austria' },\n { id: 'ch', label: 'Switzerland' },\n { id: 'pl', label: 'Poland' },\n ];\n\n return (\n <div style={{ width: 300 }}>\n <SearchableDropdown\n {...args}\n options={options}\n searchable\n value={selected}\n onChange={(val) => {\n args.onChange(val);\n setSelected(val);\n }}\n />\n </div>\n );\n },\n\n name: 'Searchable',\n};\n\nexport const WithIcons = {\n render: (args: SearchableDropdownProps) => {\n const [selected, setSelected] = useState('de');\n\n const options = [\n { id: 'de', label: 'Germany', icon: <span>🇩🇪</span> },\n { id: 'fr', label: 'France', icon: <span>🇫🇷</span> },\n { id: 'es', label: 'Spain', icon: <span>🇪🇸</span> },\n { id: 'it', label: 'Italy', icon: <span>🇮🇹</span> },\n { id: 'pt', label: 'Portugal', icon: <span>🇵🇹</span> },\n ];\n\n return (\n <div style={{ width: 300 }}>\n <SearchableDropdown\n {...args}\n options={options}\n value={selected}\n onChange={(val) => {\n args.onChange(val);\n setSelected(val);\n }}\n />\n </div>\n );\n },\n\n name: 'With Icons',\n};\n\nexport const Condensed = {\n render: (args: SearchableDropdownProps) => {\n const [selected, setSelected] = useState('de');\n\n const options = [\n { id: 'de', label: 'Germany', icon: <span>🇩🇪</span> },\n { id: 'fr', label: 'France', icon: <span>🇫🇷</span> },\n { id: 'es', label: 'Spain', icon: <span>🇪🇸</span> },\n ];\n\n return (\n <SearchableDropdown\n {...args}\n options={options}\n condensed\n bordered\n value={selected}\n onChange={(val) => {\n args.onChange(val);\n setSelected(val);\n }}\n />\n );\n },\n\n name: 'Condensed',\n};\n\nexport const WithChevron = {\n render: (args: SearchableDropdownProps) => {\n const [selected, setSelected] = useState('de');\n\n const options = [\n { id: 'de', label: 'Germany' },\n { id: 'fr', label: 'France' },\n { id: 'es', label: 'Spain' },\n ];\n\n return (\n <div style={{ width: 300 }}>\n <SearchableDropdown\n {...args}\n options={options}\n showChevron\n bordered\n value={selected}\n onChange={(val) => {\n args.onChange(val);\n setSelected(val);\n }}\n />\n </div>\n );\n },\n\n name: 'With Chevron',\n};\n\nexport const Disabled = {\n render: (args: SearchableDropdownProps) => {\n return (\n <div style={{ width: 300 }}>\n <SearchableDropdown\n {...args}\n options={[\n { id: 'de', label: 'Germany' },\n { id: 'fr', label: 'France' },\n { id: 'es', label: 'Spain' },\n ]}\n disabled\n bordered\n showChevron\n value=\"de\"\n onChange={args.onChange}\n />\n </div>\n );\n },\n\n name: 'Disabled',\n};\n\nexport const DropUp = {\n render: (args: SearchableDropdownProps) => {\n const [selected, setSelected] = useState('de');\n\n const options = [\n { id: 'de', label: 'Germany' },\n { id: 'fr', label: 'France' },\n { id: 'es', label: 'Spain' },\n ];\n\n return (\n <div style={{ width: 300, marginTop: 300 }}>\n <SearchableDropdown\n {...args}\n options={options}\n dropUp\n searchable\n value={selected}\n onChange={(val) => {\n args.onChange(val);\n setSelected(val);\n }}\n />\n </div>\n );\n },\n\n name: 'Drop Up',\n};\n\nexport default story;\n"],"names":["_jsx"],"mappings":"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"}
|
|
@@ -0,0 +1,607 @@
|
|
|
1
|
+
import { _ as __awaiter, a as __generator, b as __assign } from '../../tslib.es6-CVlKGIvp.js';
|
|
2
|
+
import { jsx } from 'react/jsx-runtime';
|
|
3
|
+
import { s as screen, c as customRender } from '../../customRender-DzdqZxUd.js';
|
|
4
|
+
import { S as SearchableDropdown } from '../../index-QeP_xz9v.js';
|
|
5
|
+
import '../../_commonjsHelpers-BFTU3MAI.js';
|
|
6
|
+
import 'react';
|
|
7
|
+
import 'react-dom';
|
|
8
|
+
import 'util';
|
|
9
|
+
import 'react-dom/test-utils';
|
|
10
|
+
import '../../index-DLQEsiym.js';
|
|
11
|
+
import '../input/index.js';
|
|
12
|
+
import '../../index-CNcEE5dn.js';
|
|
13
|
+
import '../../style-inject.es-tgCJW-Cu.js';
|
|
14
|
+
import '../icon/icons/ChevronDown.js';
|
|
15
|
+
import '../icon/IconWrapper/IconWrapper.js';
|
|
16
|
+
import '../../useOnClickOutside-B5hujnpp.js';
|
|
17
|
+
|
|
18
|
+
var options = [
|
|
19
|
+
{ id: 'de', label: 'Germany' },
|
|
20
|
+
{ id: 'fr', label: 'France' },
|
|
21
|
+
{ id: 'es', label: 'Spain' },
|
|
22
|
+
{ id: 'it', label: 'Italy' },
|
|
23
|
+
{ id: 'pt', label: 'Portugal' },
|
|
24
|
+
];
|
|
25
|
+
var defaultProps = {
|
|
26
|
+
options: options,
|
|
27
|
+
value: 'de',
|
|
28
|
+
onChange: jest.fn(),
|
|
29
|
+
groupName: 'country',
|
|
30
|
+
};
|
|
31
|
+
var setup = function (props) {
|
|
32
|
+
if (props === void 0) { props = {}; }
|
|
33
|
+
var onChange = jest.fn();
|
|
34
|
+
var utils = customRender(jsx(SearchableDropdown, __assign({}, defaultProps, { onChange: onChange }, props)));
|
|
35
|
+
return __assign(__assign({}, utils), { onChange: onChange });
|
|
36
|
+
};
|
|
37
|
+
describe('SearchableDropdown', function () {
|
|
38
|
+
describe('rendering', function () {
|
|
39
|
+
it('should render the selected option label in the trigger', function () {
|
|
40
|
+
setup();
|
|
41
|
+
expect(screen.getByRole('button')).toHaveTextContent('Germany');
|
|
42
|
+
});
|
|
43
|
+
it('should render triggerPlaceholder when value is null', function () {
|
|
44
|
+
setup({ value: null, triggerPlaceholder: 'Select a country' });
|
|
45
|
+
expect(screen.getByRole('button')).toHaveTextContent('Select a country');
|
|
46
|
+
});
|
|
47
|
+
it('should not render the dropdown when closed', function () {
|
|
48
|
+
setup();
|
|
49
|
+
expect(screen.queryByRole('radiogroup')).not.toBeInTheDocument();
|
|
50
|
+
});
|
|
51
|
+
it('should render all options when opened', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
52
|
+
var user;
|
|
53
|
+
return __generator(this, function (_a) {
|
|
54
|
+
switch (_a.label) {
|
|
55
|
+
case 0:
|
|
56
|
+
user = setup().user;
|
|
57
|
+
return [4 /*yield*/, user.click(screen.getByRole('button'))];
|
|
58
|
+
case 1:
|
|
59
|
+
_a.sent();
|
|
60
|
+
options.forEach(function (option) {
|
|
61
|
+
expect(screen.getByLabelText(option.label)).toBeInTheDocument();
|
|
62
|
+
});
|
|
63
|
+
return [2 /*return*/];
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
}); });
|
|
67
|
+
it('should render icons in options', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
68
|
+
var user;
|
|
69
|
+
return __generator(this, function (_a) {
|
|
70
|
+
switch (_a.label) {
|
|
71
|
+
case 0:
|
|
72
|
+
user = setup({
|
|
73
|
+
options: [
|
|
74
|
+
{ id: 'de', label: 'Germany', icon: jsx("span", { "data-testid": "icon-de", children: "flag" }) },
|
|
75
|
+
],
|
|
76
|
+
}).user;
|
|
77
|
+
return [4 /*yield*/, user.click(screen.getByRole('button'))];
|
|
78
|
+
case 1:
|
|
79
|
+
_a.sent();
|
|
80
|
+
expect(screen.getAllByTestId('icon-de')).toHaveLength(2); // trigger + option
|
|
81
|
+
return [2 /*return*/];
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}); });
|
|
85
|
+
it('should render the selected option icon in the trigger', function () {
|
|
86
|
+
setup({
|
|
87
|
+
options: [
|
|
88
|
+
{ id: 'de', label: 'Germany', icon: jsx("span", { "data-testid": "trigger-icon", children: "flag" }) },
|
|
89
|
+
],
|
|
90
|
+
value: 'de',
|
|
91
|
+
});
|
|
92
|
+
expect(screen.getByTestId('trigger-icon')).toBeInTheDocument();
|
|
93
|
+
});
|
|
94
|
+
it('should show no results text when search has no matches', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
95
|
+
var user;
|
|
96
|
+
return __generator(this, function (_a) {
|
|
97
|
+
switch (_a.label) {
|
|
98
|
+
case 0:
|
|
99
|
+
user = setup({ searchable: true, noResultsText: 'Nothing here' }).user;
|
|
100
|
+
return [4 /*yield*/, user.click(screen.getByRole('button'))];
|
|
101
|
+
case 1:
|
|
102
|
+
_a.sent();
|
|
103
|
+
return [4 /*yield*/, user.type(screen.getByPlaceholderText('Search'), 'zzzzz')];
|
|
104
|
+
case 2:
|
|
105
|
+
_a.sent();
|
|
106
|
+
expect(screen.getByText('Nothing here')).toBeInTheDocument();
|
|
107
|
+
return [2 /*return*/];
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
}); });
|
|
111
|
+
});
|
|
112
|
+
describe('open / close', function () {
|
|
113
|
+
it('should open the dropdown on trigger click', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
114
|
+
var user;
|
|
115
|
+
return __generator(this, function (_a) {
|
|
116
|
+
switch (_a.label) {
|
|
117
|
+
case 0:
|
|
118
|
+
user = setup().user;
|
|
119
|
+
return [4 /*yield*/, user.click(screen.getByRole('button'))];
|
|
120
|
+
case 1:
|
|
121
|
+
_a.sent();
|
|
122
|
+
expect(screen.getByRole('radiogroup')).toBeInTheDocument();
|
|
123
|
+
return [2 /*return*/];
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
}); });
|
|
127
|
+
it('should close the dropdown on second trigger click', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
128
|
+
var user, trigger;
|
|
129
|
+
return __generator(this, function (_a) {
|
|
130
|
+
switch (_a.label) {
|
|
131
|
+
case 0:
|
|
132
|
+
user = setup().user;
|
|
133
|
+
trigger = screen.getByRole('button');
|
|
134
|
+
return [4 /*yield*/, user.click(trigger)];
|
|
135
|
+
case 1:
|
|
136
|
+
_a.sent();
|
|
137
|
+
return [4 /*yield*/, user.click(trigger)];
|
|
138
|
+
case 2:
|
|
139
|
+
_a.sent();
|
|
140
|
+
expect(screen.queryByRole('radiogroup')).not.toBeInTheDocument();
|
|
141
|
+
return [2 /*return*/];
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
}); });
|
|
145
|
+
it('should close the dropdown on Escape', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
146
|
+
var user;
|
|
147
|
+
return __generator(this, function (_a) {
|
|
148
|
+
switch (_a.label) {
|
|
149
|
+
case 0:
|
|
150
|
+
user = setup().user;
|
|
151
|
+
return [4 /*yield*/, user.click(screen.getByRole('button'))];
|
|
152
|
+
case 1:
|
|
153
|
+
_a.sent();
|
|
154
|
+
expect(screen.getByRole('radiogroup')).toBeInTheDocument();
|
|
155
|
+
return [4 /*yield*/, user.keyboard('{Escape}')];
|
|
156
|
+
case 2:
|
|
157
|
+
_a.sent();
|
|
158
|
+
expect(screen.queryByRole('radiogroup')).not.toBeInTheDocument();
|
|
159
|
+
return [2 /*return*/];
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
}); });
|
|
163
|
+
it('should close the dropdown when clicking outside', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
164
|
+
var user;
|
|
165
|
+
return __generator(this, function (_a) {
|
|
166
|
+
switch (_a.label) {
|
|
167
|
+
case 0:
|
|
168
|
+
user = setup().user;
|
|
169
|
+
return [4 /*yield*/, user.click(screen.getByRole('button'))];
|
|
170
|
+
case 1:
|
|
171
|
+
_a.sent();
|
|
172
|
+
expect(screen.getByRole('radiogroup')).toBeInTheDocument();
|
|
173
|
+
return [4 /*yield*/, user.click(document.body)];
|
|
174
|
+
case 2:
|
|
175
|
+
_a.sent();
|
|
176
|
+
expect(screen.queryByRole('radiogroup')).not.toBeInTheDocument();
|
|
177
|
+
return [2 /*return*/];
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
}); });
|
|
181
|
+
});
|
|
182
|
+
describe('selection', function () {
|
|
183
|
+
it('should call onChange when an option is clicked', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
184
|
+
var _a, user, onChange;
|
|
185
|
+
return __generator(this, function (_b) {
|
|
186
|
+
switch (_b.label) {
|
|
187
|
+
case 0:
|
|
188
|
+
_a = setup(), user = _a.user, onChange = _a.onChange;
|
|
189
|
+
return [4 /*yield*/, user.click(screen.getByRole('button'))];
|
|
190
|
+
case 1:
|
|
191
|
+
_b.sent();
|
|
192
|
+
return [4 /*yield*/, user.click(screen.getByLabelText('France'))];
|
|
193
|
+
case 2:
|
|
194
|
+
_b.sent();
|
|
195
|
+
expect(onChange).toHaveBeenCalledWith('fr');
|
|
196
|
+
return [2 /*return*/];
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
}); });
|
|
200
|
+
it('should close the dropdown after selecting an option', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
201
|
+
var user;
|
|
202
|
+
return __generator(this, function (_a) {
|
|
203
|
+
switch (_a.label) {
|
|
204
|
+
case 0:
|
|
205
|
+
user = setup().user;
|
|
206
|
+
return [4 /*yield*/, user.click(screen.getByRole('button'))];
|
|
207
|
+
case 1:
|
|
208
|
+
_a.sent();
|
|
209
|
+
return [4 /*yield*/, user.click(screen.getByLabelText('France'))];
|
|
210
|
+
case 2:
|
|
211
|
+
_a.sent();
|
|
212
|
+
expect(screen.queryByRole('radiogroup')).not.toBeInTheDocument();
|
|
213
|
+
return [2 /*return*/];
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
}); });
|
|
217
|
+
it('should mark the current value as checked', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
218
|
+
var user;
|
|
219
|
+
return __generator(this, function (_a) {
|
|
220
|
+
switch (_a.label) {
|
|
221
|
+
case 0:
|
|
222
|
+
user = setup({ value: 'fr' }).user;
|
|
223
|
+
return [4 /*yield*/, user.click(screen.getByRole('button'))];
|
|
224
|
+
case 1:
|
|
225
|
+
_a.sent();
|
|
226
|
+
expect(screen.getByRole('radio', { name: 'France' })).toBeChecked();
|
|
227
|
+
return [2 /*return*/];
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
}); });
|
|
231
|
+
});
|
|
232
|
+
describe('search', function () {
|
|
233
|
+
it('should filter options based on search term', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
234
|
+
var user;
|
|
235
|
+
return __generator(this, function (_a) {
|
|
236
|
+
switch (_a.label) {
|
|
237
|
+
case 0:
|
|
238
|
+
user = setup({ searchable: true }).user;
|
|
239
|
+
return [4 /*yield*/, user.click(screen.getByRole('button'))];
|
|
240
|
+
case 1:
|
|
241
|
+
_a.sent();
|
|
242
|
+
return [4 /*yield*/, user.type(screen.getByPlaceholderText('Search'), 'ger')];
|
|
243
|
+
case 2:
|
|
244
|
+
_a.sent();
|
|
245
|
+
expect(screen.getByLabelText('Germany')).toBeInTheDocument();
|
|
246
|
+
expect(screen.queryByLabelText('France')).not.toBeInTheDocument();
|
|
247
|
+
return [2 /*return*/];
|
|
248
|
+
}
|
|
249
|
+
});
|
|
250
|
+
}); });
|
|
251
|
+
it('should prioritize options that start with the search term', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
252
|
+
var user, radios;
|
|
253
|
+
return __generator(this, function (_a) {
|
|
254
|
+
switch (_a.label) {
|
|
255
|
+
case 0:
|
|
256
|
+
user = setup({
|
|
257
|
+
searchable: true,
|
|
258
|
+
options: [
|
|
259
|
+
{ id: 'al', label: 'Algeria' },
|
|
260
|
+
{ id: 'po', label: 'Portugal' },
|
|
261
|
+
{ id: 'pl', label: 'Poland' },
|
|
262
|
+
],
|
|
263
|
+
}).user;
|
|
264
|
+
return [4 /*yield*/, user.click(screen.getByRole('button'))];
|
|
265
|
+
case 1:
|
|
266
|
+
_a.sent();
|
|
267
|
+
return [4 /*yield*/, user.type(screen.getByPlaceholderText('Search'), 'po')];
|
|
268
|
+
case 2:
|
|
269
|
+
_a.sent();
|
|
270
|
+
radios = screen.getAllByRole('radio');
|
|
271
|
+
expect(radios[0]).toHaveAttribute('value', 'po');
|
|
272
|
+
expect(radios[1]).toHaveAttribute('value', 'pl');
|
|
273
|
+
return [2 /*return*/];
|
|
274
|
+
}
|
|
275
|
+
});
|
|
276
|
+
}); });
|
|
277
|
+
it('should clear the search term when dropdown closes', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
278
|
+
var user;
|
|
279
|
+
return __generator(this, function (_a) {
|
|
280
|
+
switch (_a.label) {
|
|
281
|
+
case 0:
|
|
282
|
+
user = setup({ searchable: true }).user;
|
|
283
|
+
return [4 /*yield*/, user.click(screen.getByRole('button'))];
|
|
284
|
+
case 1:
|
|
285
|
+
_a.sent();
|
|
286
|
+
return [4 /*yield*/, user.type(screen.getByPlaceholderText('Search'), 'ger')];
|
|
287
|
+
case 2:
|
|
288
|
+
_a.sent();
|
|
289
|
+
return [4 /*yield*/, user.keyboard('{Escape}')];
|
|
290
|
+
case 3:
|
|
291
|
+
_a.sent();
|
|
292
|
+
return [4 /*yield*/, user.click(screen.getByRole('button'))];
|
|
293
|
+
case 4:
|
|
294
|
+
_a.sent();
|
|
295
|
+
expect(screen.getByPlaceholderText('Search')).toHaveValue('');
|
|
296
|
+
expect(screen.getAllByRole('radio')).toHaveLength(options.length);
|
|
297
|
+
return [2 /*return*/];
|
|
298
|
+
}
|
|
299
|
+
});
|
|
300
|
+
}); });
|
|
301
|
+
it('should select the first filtered option on Enter in search input', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
302
|
+
var _a, user, onChange;
|
|
303
|
+
return __generator(this, function (_b) {
|
|
304
|
+
switch (_b.label) {
|
|
305
|
+
case 0:
|
|
306
|
+
_a = setup({ searchable: true }), user = _a.user, onChange = _a.onChange;
|
|
307
|
+
return [4 /*yield*/, user.click(screen.getByRole('button'))];
|
|
308
|
+
case 1:
|
|
309
|
+
_b.sent();
|
|
310
|
+
return [4 /*yield*/, user.type(screen.getByPlaceholderText('Search'), 'fra')];
|
|
311
|
+
case 2:
|
|
312
|
+
_b.sent();
|
|
313
|
+
return [4 /*yield*/, user.keyboard('{Enter}')];
|
|
314
|
+
case 3:
|
|
315
|
+
_b.sent();
|
|
316
|
+
expect(onChange).toHaveBeenCalledWith('fr');
|
|
317
|
+
return [2 /*return*/];
|
|
318
|
+
}
|
|
319
|
+
});
|
|
320
|
+
}); });
|
|
321
|
+
it('should use custom placeholder text', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
322
|
+
var user;
|
|
323
|
+
return __generator(this, function (_a) {
|
|
324
|
+
switch (_a.label) {
|
|
325
|
+
case 0:
|
|
326
|
+
user = setup({ searchable: true, placeholder: 'Find a country' }).user;
|
|
327
|
+
return [4 /*yield*/, user.click(screen.getByRole('button'))];
|
|
328
|
+
case 1:
|
|
329
|
+
_a.sent();
|
|
330
|
+
expect(screen.getByPlaceholderText('Find a country')).toBeInTheDocument();
|
|
331
|
+
return [2 /*return*/];
|
|
332
|
+
}
|
|
333
|
+
});
|
|
334
|
+
}); });
|
|
335
|
+
});
|
|
336
|
+
describe('keyboard navigation', function () {
|
|
337
|
+
it('should move focus to the first option on ArrowDown from search input', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
338
|
+
var user;
|
|
339
|
+
return __generator(this, function (_a) {
|
|
340
|
+
switch (_a.label) {
|
|
341
|
+
case 0:
|
|
342
|
+
user = setup({ searchable: true }).user;
|
|
343
|
+
return [4 /*yield*/, user.click(screen.getByRole('button'))];
|
|
344
|
+
case 1:
|
|
345
|
+
_a.sent();
|
|
346
|
+
return [4 /*yield*/, user.keyboard('{ArrowDown}')];
|
|
347
|
+
case 2:
|
|
348
|
+
_a.sent();
|
|
349
|
+
expect(screen.getByRole('radio', { name: 'Germany' })).toHaveFocus();
|
|
350
|
+
return [2 /*return*/];
|
|
351
|
+
}
|
|
352
|
+
});
|
|
353
|
+
}); });
|
|
354
|
+
it('should move focus to the last option on ArrowUp from search input', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
355
|
+
var user;
|
|
356
|
+
return __generator(this, function (_a) {
|
|
357
|
+
switch (_a.label) {
|
|
358
|
+
case 0:
|
|
359
|
+
user = setup({ searchable: true }).user;
|
|
360
|
+
return [4 /*yield*/, user.click(screen.getByRole('button'))];
|
|
361
|
+
case 1:
|
|
362
|
+
_a.sent();
|
|
363
|
+
return [4 /*yield*/, user.keyboard('{ArrowUp}')];
|
|
364
|
+
case 2:
|
|
365
|
+
_a.sent();
|
|
366
|
+
expect(screen.getByRole('radio', { name: 'Portugal' })).toHaveFocus();
|
|
367
|
+
return [2 /*return*/];
|
|
368
|
+
}
|
|
369
|
+
});
|
|
370
|
+
}); });
|
|
371
|
+
it('should navigate between options with ArrowDown and ArrowUp', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
372
|
+
var user;
|
|
373
|
+
return __generator(this, function (_a) {
|
|
374
|
+
switch (_a.label) {
|
|
375
|
+
case 0:
|
|
376
|
+
user = setup({ searchable: true }).user;
|
|
377
|
+
return [4 /*yield*/, user.click(screen.getByRole('button'))];
|
|
378
|
+
case 1:
|
|
379
|
+
_a.sent();
|
|
380
|
+
return [4 /*yield*/, user.keyboard('{ArrowDown}')];
|
|
381
|
+
case 2:
|
|
382
|
+
_a.sent();
|
|
383
|
+
expect(screen.getByRole('radio', { name: 'Germany' })).toHaveFocus();
|
|
384
|
+
return [4 /*yield*/, user.keyboard('{ArrowDown}')];
|
|
385
|
+
case 3:
|
|
386
|
+
_a.sent();
|
|
387
|
+
expect(screen.getByRole('radio', { name: 'France' })).toHaveFocus();
|
|
388
|
+
return [4 /*yield*/, user.keyboard('{ArrowUp}')];
|
|
389
|
+
case 4:
|
|
390
|
+
_a.sent();
|
|
391
|
+
expect(screen.getByRole('radio', { name: 'Germany' })).toHaveFocus();
|
|
392
|
+
return [2 /*return*/];
|
|
393
|
+
}
|
|
394
|
+
});
|
|
395
|
+
}); });
|
|
396
|
+
it('should not go past the last option on ArrowDown', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
397
|
+
var user;
|
|
398
|
+
return __generator(this, function (_a) {
|
|
399
|
+
switch (_a.label) {
|
|
400
|
+
case 0:
|
|
401
|
+
user = setup({
|
|
402
|
+
searchable: true,
|
|
403
|
+
options: [
|
|
404
|
+
{ id: 'a', label: 'Alpha' },
|
|
405
|
+
{ id: 'b', label: 'Beta' },
|
|
406
|
+
],
|
|
407
|
+
}).user;
|
|
408
|
+
return [4 /*yield*/, user.click(screen.getByRole('button'))];
|
|
409
|
+
case 1:
|
|
410
|
+
_a.sent();
|
|
411
|
+
return [4 /*yield*/, user.keyboard('{ArrowDown}{ArrowDown}{ArrowDown}')];
|
|
412
|
+
case 2:
|
|
413
|
+
_a.sent();
|
|
414
|
+
expect(screen.getByRole('radio', { name: 'Beta' })).toHaveFocus();
|
|
415
|
+
return [2 /*return*/];
|
|
416
|
+
}
|
|
417
|
+
});
|
|
418
|
+
}); });
|
|
419
|
+
it('should not go past the first option on ArrowUp', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
420
|
+
var user;
|
|
421
|
+
return __generator(this, function (_a) {
|
|
422
|
+
switch (_a.label) {
|
|
423
|
+
case 0:
|
|
424
|
+
user = setup({
|
|
425
|
+
searchable: true,
|
|
426
|
+
options: [
|
|
427
|
+
{ id: 'a', label: 'Alpha' },
|
|
428
|
+
{ id: 'b', label: 'Beta' },
|
|
429
|
+
],
|
|
430
|
+
}).user;
|
|
431
|
+
return [4 /*yield*/, user.click(screen.getByRole('button'))];
|
|
432
|
+
case 1:
|
|
433
|
+
_a.sent();
|
|
434
|
+
return [4 /*yield*/, user.keyboard('{ArrowDown}{ArrowUp}{ArrowUp}')];
|
|
435
|
+
case 2:
|
|
436
|
+
_a.sent();
|
|
437
|
+
expect(screen.getByRole('radio', { name: 'Alpha' })).toHaveFocus();
|
|
438
|
+
return [2 /*return*/];
|
|
439
|
+
}
|
|
440
|
+
});
|
|
441
|
+
}); });
|
|
442
|
+
it('should select option and close on Enter key', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
443
|
+
var _a, user, onChange;
|
|
444
|
+
return __generator(this, function (_b) {
|
|
445
|
+
switch (_b.label) {
|
|
446
|
+
case 0:
|
|
447
|
+
_a = setup({ searchable: true }), user = _a.user, onChange = _a.onChange;
|
|
448
|
+
return [4 /*yield*/, user.click(screen.getByRole('button'))];
|
|
449
|
+
case 1:
|
|
450
|
+
_b.sent();
|
|
451
|
+
return [4 /*yield*/, user.keyboard('{ArrowDown}{ArrowDown}{Enter}')];
|
|
452
|
+
case 2:
|
|
453
|
+
_b.sent();
|
|
454
|
+
expect(onChange).toHaveBeenCalledWith('fr');
|
|
455
|
+
expect(screen.queryByRole('radiogroup')).not.toBeInTheDocument();
|
|
456
|
+
return [2 /*return*/];
|
|
457
|
+
}
|
|
458
|
+
});
|
|
459
|
+
}); });
|
|
460
|
+
it('should select option and close on Space key', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
461
|
+
var _a, user, onChange;
|
|
462
|
+
return __generator(this, function (_b) {
|
|
463
|
+
switch (_b.label) {
|
|
464
|
+
case 0:
|
|
465
|
+
_a = setup({ searchable: true }), user = _a.user, onChange = _a.onChange;
|
|
466
|
+
return [4 /*yield*/, user.click(screen.getByRole('button'))];
|
|
467
|
+
case 1:
|
|
468
|
+
_b.sent();
|
|
469
|
+
return [4 /*yield*/, user.keyboard('{ArrowDown}{ArrowDown} ')];
|
|
470
|
+
case 2:
|
|
471
|
+
_b.sent();
|
|
472
|
+
expect(onChange).toHaveBeenCalledWith('fr');
|
|
473
|
+
expect(screen.queryByRole('radiogroup')).not.toBeInTheDocument();
|
|
474
|
+
return [2 /*return*/];
|
|
475
|
+
}
|
|
476
|
+
});
|
|
477
|
+
}); });
|
|
478
|
+
});
|
|
479
|
+
describe('disabled', function () {
|
|
480
|
+
it('should not open the dropdown when disabled', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
481
|
+
var user;
|
|
482
|
+
return __generator(this, function (_a) {
|
|
483
|
+
switch (_a.label) {
|
|
484
|
+
case 0:
|
|
485
|
+
user = setup({ disabled: true }).user;
|
|
486
|
+
return [4 /*yield*/, user.click(screen.getByRole('button'))];
|
|
487
|
+
case 1:
|
|
488
|
+
_a.sent();
|
|
489
|
+
expect(screen.queryByRole('radiogroup')).not.toBeInTheDocument();
|
|
490
|
+
return [2 /*return*/];
|
|
491
|
+
}
|
|
492
|
+
});
|
|
493
|
+
}); });
|
|
494
|
+
it('should have the disabled attribute on the trigger', function () {
|
|
495
|
+
setup({ disabled: true });
|
|
496
|
+
expect(screen.getByRole('button')).toBeDisabled();
|
|
497
|
+
});
|
|
498
|
+
});
|
|
499
|
+
describe('accessibility', function () {
|
|
500
|
+
it('should have aria-expanded false when closed', function () {
|
|
501
|
+
setup();
|
|
502
|
+
expect(screen.getByRole('button')).toHaveAttribute('aria-expanded', 'false');
|
|
503
|
+
});
|
|
504
|
+
it('should have aria-expanded true when open', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
505
|
+
var user;
|
|
506
|
+
return __generator(this, function (_a) {
|
|
507
|
+
switch (_a.label) {
|
|
508
|
+
case 0:
|
|
509
|
+
user = setup().user;
|
|
510
|
+
return [4 /*yield*/, user.click(screen.getByRole('button'))];
|
|
511
|
+
case 1:
|
|
512
|
+
_a.sent();
|
|
513
|
+
expect(screen.getByRole('button')).toHaveAttribute('aria-expanded', 'true');
|
|
514
|
+
return [2 /*return*/];
|
|
515
|
+
}
|
|
516
|
+
});
|
|
517
|
+
}); });
|
|
518
|
+
it('should have aria-haspopup on the trigger', function () {
|
|
519
|
+
setup();
|
|
520
|
+
expect(screen.getByRole('button')).toHaveAttribute('aria-haspopup', 'listbox');
|
|
521
|
+
});
|
|
522
|
+
it('should have aria-controls linking to the dropdown when open', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
523
|
+
var user, trigger, controlsId;
|
|
524
|
+
return __generator(this, function (_a) {
|
|
525
|
+
switch (_a.label) {
|
|
526
|
+
case 0:
|
|
527
|
+
user = setup().user;
|
|
528
|
+
return [4 /*yield*/, user.click(screen.getByRole('button'))];
|
|
529
|
+
case 1:
|
|
530
|
+
_a.sent();
|
|
531
|
+
trigger = screen.getByRole('button');
|
|
532
|
+
controlsId = trigger.getAttribute('aria-controls');
|
|
533
|
+
expect(controlsId).toBeTruthy();
|
|
534
|
+
expect(document.getElementById(controlsId)).toBeInTheDocument();
|
|
535
|
+
return [2 /*return*/];
|
|
536
|
+
}
|
|
537
|
+
});
|
|
538
|
+
}); });
|
|
539
|
+
it('should have a radiogroup with aria-label', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
540
|
+
var user;
|
|
541
|
+
return __generator(this, function (_a) {
|
|
542
|
+
switch (_a.label) {
|
|
543
|
+
case 0:
|
|
544
|
+
user = setup({ groupName: 'test-group' }).user;
|
|
545
|
+
return [4 /*yield*/, user.click(screen.getByRole('button'))];
|
|
546
|
+
case 1:
|
|
547
|
+
_a.sent();
|
|
548
|
+
expect(screen.getByRole('radiogroup')).toHaveAttribute('aria-label', 'test-group');
|
|
549
|
+
return [2 /*return*/];
|
|
550
|
+
}
|
|
551
|
+
});
|
|
552
|
+
}); });
|
|
553
|
+
it('should return focus to the trigger after selection', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
554
|
+
var user;
|
|
555
|
+
return __generator(this, function (_a) {
|
|
556
|
+
switch (_a.label) {
|
|
557
|
+
case 0:
|
|
558
|
+
user = setup().user;
|
|
559
|
+
return [4 /*yield*/, user.click(screen.getByRole('button'))];
|
|
560
|
+
case 1:
|
|
561
|
+
_a.sent();
|
|
562
|
+
return [4 /*yield*/, user.click(screen.getByLabelText('France'))];
|
|
563
|
+
case 2:
|
|
564
|
+
_a.sent();
|
|
565
|
+
expect(screen.getByRole('button')).toHaveFocus();
|
|
566
|
+
return [2 /*return*/];
|
|
567
|
+
}
|
|
568
|
+
});
|
|
569
|
+
}); });
|
|
570
|
+
it('should return focus to the trigger after pressing Escape', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
571
|
+
var user;
|
|
572
|
+
return __generator(this, function (_a) {
|
|
573
|
+
switch (_a.label) {
|
|
574
|
+
case 0:
|
|
575
|
+
user = setup().user;
|
|
576
|
+
return [4 /*yield*/, user.click(screen.getByRole('button'))];
|
|
577
|
+
case 1:
|
|
578
|
+
_a.sent();
|
|
579
|
+
return [4 /*yield*/, user.keyboard('{Escape}')];
|
|
580
|
+
case 2:
|
|
581
|
+
_a.sent();
|
|
582
|
+
expect(screen.getByRole('button')).toHaveFocus();
|
|
583
|
+
return [2 /*return*/];
|
|
584
|
+
}
|
|
585
|
+
});
|
|
586
|
+
}); });
|
|
587
|
+
});
|
|
588
|
+
describe('groupName', function () {
|
|
589
|
+
it('should auto-generate a groupName when not provided', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
590
|
+
var user, radios;
|
|
591
|
+
return __generator(this, function (_a) {
|
|
592
|
+
switch (_a.label) {
|
|
593
|
+
case 0:
|
|
594
|
+
user = setup({ groupName: undefined }).user;
|
|
595
|
+
return [4 /*yield*/, user.click(screen.getByRole('button'))];
|
|
596
|
+
case 1:
|
|
597
|
+
_a.sent();
|
|
598
|
+
expect(screen.getByRole('radiogroup')).toHaveAttribute('aria-label');
|
|
599
|
+
radios = screen.getAllByRole('radio');
|
|
600
|
+
expect(radios[0]).toHaveAttribute('name');
|
|
601
|
+
return [2 /*return*/];
|
|
602
|
+
}
|
|
603
|
+
});
|
|
604
|
+
}); });
|
|
605
|
+
});
|
|
606
|
+
});
|
|
607
|
+
//# sourceMappingURL=index.test.js.map
|