@patternfly/react-templates 6.0.0-alpha.20 → 6.0.0-alpha.22
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 +8 -0
- package/components/package.json +8 -1
- package/dist/dynamic/components/Dropdown/package.json +8 -1
- package/dist/dynamic/components/Select/package.json +8 -1
- package/dist/dynamic-modules.json +10 -10
- package/dist/esm/components/Dropdown/{DropdownSimple.d.ts → SimpleDropdown.d.ts} +11 -6
- package/dist/esm/components/Dropdown/SimpleDropdown.d.ts.map +1 -0
- package/dist/esm/components/Dropdown/{DropdownSimple.js → SimpleDropdown.js} +13 -7
- package/dist/esm/components/Dropdown/SimpleDropdown.js.map +1 -0
- package/dist/esm/components/Dropdown/index.d.ts +1 -1
- package/dist/esm/components/Dropdown/index.js +1 -1
- package/dist/esm/components/Select/CheckboxSelect.d.ts +7 -3
- package/dist/esm/components/Select/CheckboxSelect.d.ts.map +1 -1
- package/dist/esm/components/Select/CheckboxSelect.js +9 -6
- package/dist/esm/components/Select/CheckboxSelect.js.map +1 -1
- package/dist/{js/components/Select/SelectSimple.d.ts → esm/components/Select/SimpleSelect.d.ts} +10 -7
- package/dist/esm/components/Select/SimpleSelect.d.ts.map +1 -0
- package/dist/esm/components/Select/{SelectSimple.js → SimpleSelect.js} +13 -9
- package/dist/esm/components/Select/SimpleSelect.js.map +1 -0
- package/dist/esm/components/Select/{SelectTypeahead.d.ts → TypeaheadSelect.d.ts} +11 -7
- package/dist/esm/components/Select/TypeaheadSelect.d.ts.map +1 -0
- package/dist/esm/components/Select/{SelectTypeahead.js → TypeaheadSelect.js} +16 -14
- package/dist/esm/components/Select/TypeaheadSelect.js.map +1 -0
- package/dist/esm/components/Select/index.d.ts +2 -2
- package/dist/esm/components/Select/index.js +2 -2
- package/dist/js/components/Dropdown/{DropdownSimple.d.ts → SimpleDropdown.d.ts} +11 -6
- package/dist/js/components/Dropdown/SimpleDropdown.d.ts.map +1 -0
- package/dist/js/components/Dropdown/{DropdownSimple.js → SimpleDropdown.js} +14 -8
- package/dist/js/components/Dropdown/SimpleDropdown.js.map +1 -0
- package/dist/js/components/Dropdown/index.d.ts +1 -1
- package/dist/js/components/Dropdown/index.js +1 -1
- package/dist/js/components/Select/CheckboxSelect.d.ts +7 -3
- package/dist/js/components/Select/CheckboxSelect.d.ts.map +1 -1
- package/dist/js/components/Select/CheckboxSelect.js +9 -6
- package/dist/js/components/Select/CheckboxSelect.js.map +1 -1
- package/dist/{esm/components/Select/SelectSimple.d.ts → js/components/Select/SimpleSelect.d.ts} +10 -7
- package/dist/js/components/Select/SimpleSelect.d.ts.map +1 -0
- package/dist/js/components/Select/{SelectSimple.js → SimpleSelect.js} +14 -10
- package/dist/js/components/Select/SimpleSelect.js.map +1 -0
- package/dist/js/components/Select/{SelectTypeahead.d.ts → TypeaheadSelect.d.ts} +11 -7
- package/dist/js/components/Select/TypeaheadSelect.d.ts.map +1 -0
- package/dist/js/components/Select/{SelectTypeahead.js → TypeaheadSelect.js} +18 -16
- package/dist/js/components/Select/TypeaheadSelect.js.map +1 -0
- package/dist/js/components/Select/index.d.ts +2 -2
- package/dist/js/components/Select/index.js +2 -2
- package/dist/umd/assets/{output-BrdjX-Jk.css → output-CP_aQiOP.css} +2794 -2794
- package/dist/umd/react-templates.min.js +1 -1
- package/package.json +7 -7
- package/src/components/Dropdown/{DropdownSimple.tsx → SimpleDropdown.tsx} +28 -11
- package/src/components/Dropdown/__tests__/{DropdownSimple.test.tsx → SimpleDropdown.test.tsx} +35 -23
- package/src/components/Dropdown/__tests__/__snapshots__/{DropdownSimple.test.tsx.snap → SimpleDropdown.test.tsx.snap} +6 -0
- package/src/components/Dropdown/examples/DropdownTemplates.md +4 -16
- package/src/components/Dropdown/examples/{DropdownSimpleExample.tsx → SimpleDropdownExample.tsx} +7 -7
- package/src/components/Dropdown/index.ts +1 -1
- package/src/components/Select/CheckboxSelect.tsx +18 -7
- package/src/components/Select/{SelectSimple.tsx → SimpleSelect.tsx} +27 -14
- package/src/components/Select/{SelectTypeahead.tsx → TypeaheadSelect.tsx} +32 -27
- package/src/components/Select/{CheckboxSelect.test.tsx → __tests__/CheckboxSelect.test.tsx} +29 -1
- package/src/components/Select/{CheckboxSelectSnapshots.test.tsx → __tests__/CheckboxSelectSnapshots.test.tsx} +1 -1
- package/src/components/Select/__tests__/SimpleSelect.test.tsx +243 -0
- package/src/components/Select/{__snapshots__ → __tests__/__snapshots__}/CheckboxSelectSnapshots.test.tsx.snap +6 -1
- package/src/components/Select/__tests__/__snapshots__/SimpleSelect.test.tsx.snap +170 -0
- package/src/components/Select/examples/CheckboxSelectDemo.tsx +1 -1
- package/src/components/Select/examples/SelectTemplates.md +5 -5
- package/src/components/Select/examples/{SelectSimpleDemo.tsx → SimpleSelectDemo.tsx} +6 -6
- package/src/components/Select/examples/{SelectTypeaheadDemo.tsx → TypeaheadSelectDemo.tsx} +3 -3
- package/src/components/Select/index.ts +2 -2
- package/dist/esm/components/Dropdown/DropdownSimple.d.ts.map +0 -1
- package/dist/esm/components/Dropdown/DropdownSimple.js.map +0 -1
- package/dist/esm/components/Select/SelectSimple.d.ts.map +0 -1
- package/dist/esm/components/Select/SelectSimple.js.map +0 -1
- package/dist/esm/components/Select/SelectTypeahead.d.ts.map +0 -1
- package/dist/esm/components/Select/SelectTypeahead.js.map +0 -1
- package/dist/js/components/Dropdown/DropdownSimple.d.ts.map +0 -1
- package/dist/js/components/Dropdown/DropdownSimple.js.map +0 -1
- package/dist/js/components/Select/SelectSimple.d.ts.map +0 -1
- package/dist/js/components/Select/SelectSimple.js.map +0 -1
- package/dist/js/components/Select/SelectTypeahead.d.ts.map +0 -1
- package/dist/js/components/Select/SelectTypeahead.js.map +0 -1
package/src/components/Dropdown/__tests__/{DropdownSimple.test.tsx → SimpleDropdown.test.tsx}
RENAMED
|
@@ -1,30 +1,42 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { render, screen } from '@testing-library/react';
|
|
3
3
|
import userEvent from '@testing-library/user-event';
|
|
4
|
-
import {
|
|
4
|
+
import { SimpleDropdown } from '../SimpleDropdown';
|
|
5
5
|
import styles from '@patternfly/react-styles/css/components/MenuToggle/menu-toggle';
|
|
6
6
|
|
|
7
7
|
describe('Dropdown toggle', () => {
|
|
8
8
|
test('Renders dropdown toggle as not disabled when isDisabled is not true', () => {
|
|
9
|
-
render(<
|
|
9
|
+
render(<SimpleDropdown toggleContent="Dropdown" />);
|
|
10
10
|
|
|
11
11
|
expect(screen.getByRole('button', { name: 'Dropdown' })).not.toBeDisabled();
|
|
12
12
|
});
|
|
13
13
|
|
|
14
14
|
test('Renders dropdown toggle as disabled when isDisabled is true', () => {
|
|
15
|
-
render(<
|
|
15
|
+
render(<SimpleDropdown toggleContent="Dropdown" isDisabled />);
|
|
16
16
|
|
|
17
17
|
expect(screen.getByRole('button', { name: 'Dropdown' })).toBeDisabled();
|
|
18
18
|
});
|
|
19
19
|
|
|
20
20
|
test('Passes toggleVariant', () => {
|
|
21
|
-
render(<
|
|
21
|
+
render(<SimpleDropdown toggleContent="Dropdown" toggleVariant="plain" />);
|
|
22
22
|
|
|
23
23
|
expect(screen.getByRole('button', { name: 'Dropdown' })).toHaveClass(styles.modifiers.plain);
|
|
24
24
|
});
|
|
25
25
|
|
|
26
|
+
test('Passes toggleWidth', () => {
|
|
27
|
+
render(<SimpleDropdown toggleContent="Dropdown" toggleWidth="500px" />);
|
|
28
|
+
|
|
29
|
+
expect(screen.getByRole('button', { name: 'Dropdown' })).toHaveAttribute('style', 'width: 500px;');
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
test('Passes additional toggleProps', () => {
|
|
33
|
+
render(<SimpleDropdown toggleContent="Dropdown" toggleProps={{ id: 'toggle' }} />);
|
|
34
|
+
|
|
35
|
+
expect(screen.getByRole('button', { name: 'Dropdown' })).toHaveAttribute('id', 'toggle');
|
|
36
|
+
});
|
|
37
|
+
|
|
26
38
|
test('Passes toggleAriaLabel', () => {
|
|
27
|
-
render(<
|
|
39
|
+
render(<SimpleDropdown toggleContent="Dropdown" toggleAriaLabel="Aria label content" />);
|
|
28
40
|
|
|
29
41
|
expect(screen.getByRole('button')).toHaveAccessibleName('Aria label content');
|
|
30
42
|
});
|
|
@@ -32,7 +44,7 @@ describe('Dropdown toggle', () => {
|
|
|
32
44
|
test('Calls onToggle with next isOpen state when dropdown toggle is clicked', async () => {
|
|
33
45
|
const onToggle = jest.fn();
|
|
34
46
|
const user = userEvent.setup();
|
|
35
|
-
render(<
|
|
47
|
+
render(<SimpleDropdown onToggle={onToggle} toggleContent="Dropdown" />);
|
|
36
48
|
|
|
37
49
|
const toggle = screen.getByRole('button', { name: 'Dropdown' });
|
|
38
50
|
await user.click(toggle);
|
|
@@ -46,7 +58,7 @@ describe('Dropdown toggle', () => {
|
|
|
46
58
|
render(
|
|
47
59
|
<div>
|
|
48
60
|
<button>Actual</button>
|
|
49
|
-
<
|
|
61
|
+
<SimpleDropdown initialItems={items} onToggle={onToggle} toggleContent="Dropdown" />
|
|
50
62
|
</div>
|
|
51
63
|
);
|
|
52
64
|
|
|
@@ -59,7 +71,7 @@ describe('Dropdown toggle', () => {
|
|
|
59
71
|
const onSelect = jest.fn();
|
|
60
72
|
const items = [{ content: 'Action', value: 1 }];
|
|
61
73
|
const user = userEvent.setup();
|
|
62
|
-
render(<
|
|
74
|
+
render(<SimpleDropdown initialItems={items} toggleContent="Dropdown" onSelect={onSelect} />);
|
|
63
75
|
|
|
64
76
|
const toggle = screen.getByRole('button', { name: 'Dropdown' });
|
|
65
77
|
await user.click(toggle);
|
|
@@ -73,7 +85,7 @@ describe('Dropdown toggle', () => {
|
|
|
73
85
|
const onSelect = jest.fn();
|
|
74
86
|
const items = [{ content: 'Action', value: 1 }];
|
|
75
87
|
const user = userEvent.setup();
|
|
76
|
-
render(<
|
|
88
|
+
render(<SimpleDropdown initialItems={items} toggleContent="Dropdown" onSelect={onSelect} />);
|
|
77
89
|
|
|
78
90
|
const toggle = screen.getByRole('button', { name: 'Dropdown' });
|
|
79
91
|
await user.click(toggle);
|
|
@@ -82,13 +94,13 @@ describe('Dropdown toggle', () => {
|
|
|
82
94
|
});
|
|
83
95
|
|
|
84
96
|
test('Does not pass isToggleFullWidth to menu toggle by default', () => {
|
|
85
|
-
render(<
|
|
97
|
+
render(<SimpleDropdown toggleContent="Dropdown" />);
|
|
86
98
|
|
|
87
99
|
expect(screen.getByRole('button', { name: 'Dropdown' })).not.toHaveClass(styles.modifiers.fullWidth);
|
|
88
100
|
});
|
|
89
101
|
|
|
90
102
|
test('Passes isToggleFullWidth to menu toggle when passed in', () => {
|
|
91
|
-
render(<
|
|
103
|
+
render(<SimpleDropdown isToggleFullWidth toggleContent="Dropdown" />);
|
|
92
104
|
|
|
93
105
|
expect(screen.getByRole('button', { name: 'Dropdown' })).toHaveClass(styles.modifiers.fullWidth);
|
|
94
106
|
});
|
|
@@ -96,7 +108,7 @@ describe('Dropdown toggle', () => {
|
|
|
96
108
|
test('Does not focus toggle on item select by default', async () => {
|
|
97
109
|
const items = [{ content: 'Action', value: 1 }];
|
|
98
110
|
const user = userEvent.setup();
|
|
99
|
-
render(<
|
|
111
|
+
render(<SimpleDropdown initialItems={items} toggleContent="Dropdown" />);
|
|
100
112
|
|
|
101
113
|
const toggle = screen.getByRole('button', { name: 'Dropdown' });
|
|
102
114
|
await user.click(toggle);
|
|
@@ -109,7 +121,7 @@ describe('Dropdown toggle', () => {
|
|
|
109
121
|
test('Focuses toggle on item select when shouldFocusToggleOnSelect is true', async () => {
|
|
110
122
|
const items = [{ content: 'Action', value: 1 }];
|
|
111
123
|
const user = userEvent.setup();
|
|
112
|
-
render(<
|
|
124
|
+
render(<SimpleDropdown shouldFocusToggleOnSelect initialItems={items} toggleContent="Dropdown" />);
|
|
113
125
|
|
|
114
126
|
const toggle = screen.getByRole('button', { name: 'Dropdown' });
|
|
115
127
|
await user.click(toggle);
|
|
@@ -120,7 +132,7 @@ describe('Dropdown toggle', () => {
|
|
|
120
132
|
});
|
|
121
133
|
|
|
122
134
|
test('Matches snapshot', () => {
|
|
123
|
-
const { asFragment } = render(<
|
|
135
|
+
const { asFragment } = render(<SimpleDropdown toggleContent="Dropdown" />);
|
|
124
136
|
|
|
125
137
|
expect(asFragment()).toMatchSnapshot();
|
|
126
138
|
});
|
|
@@ -133,7 +145,7 @@ describe('Dropdown items', () => {
|
|
|
133
145
|
{ value: 'separator', isDivider: true }
|
|
134
146
|
];
|
|
135
147
|
const user = userEvent.setup();
|
|
136
|
-
render(<
|
|
148
|
+
render(<SimpleDropdown initialItems={items} toggleContent="Dropdown" />);
|
|
137
149
|
|
|
138
150
|
const toggle = screen.getByRole('button', { name: 'Dropdown' });
|
|
139
151
|
await user.click(toggle);
|
|
@@ -147,7 +159,7 @@ describe('Dropdown items', () => {
|
|
|
147
159
|
test('Renders with a link item', async () => {
|
|
148
160
|
const items = [{ content: 'Link', value: 1, to: '#' }];
|
|
149
161
|
const user = userEvent.setup();
|
|
150
|
-
render(<
|
|
162
|
+
render(<SimpleDropdown initialItems={items} toggleContent="Dropdown" />);
|
|
151
163
|
|
|
152
164
|
const toggle = screen.getByRole('button', { name: 'Dropdown' });
|
|
153
165
|
await user.click(toggle);
|
|
@@ -159,7 +171,7 @@ describe('Dropdown items', () => {
|
|
|
159
171
|
test('Renders with items not disabled by default', async () => {
|
|
160
172
|
const items = [{ content: 'Action', value: 1 }];
|
|
161
173
|
const user = userEvent.setup();
|
|
162
|
-
render(<
|
|
174
|
+
render(<SimpleDropdown initialItems={items} toggleContent="Dropdown" />);
|
|
163
175
|
|
|
164
176
|
const toggle = screen.getByRole('button', { name: 'Dropdown' });
|
|
165
177
|
await user.click(toggle);
|
|
@@ -171,7 +183,7 @@ describe('Dropdown items', () => {
|
|
|
171
183
|
test('Renders with a disabled item', async () => {
|
|
172
184
|
const items = [{ content: 'Action', value: 1, isDisabled: true }];
|
|
173
185
|
const user = userEvent.setup();
|
|
174
|
-
render(<
|
|
186
|
+
render(<SimpleDropdown initialItems={items} toggleContent="Dropdown" />);
|
|
175
187
|
|
|
176
188
|
const toggle = screen.getByRole('button', { name: 'Dropdown' });
|
|
177
189
|
await user.click(toggle);
|
|
@@ -183,7 +195,7 @@ describe('Dropdown items', () => {
|
|
|
183
195
|
test('Spreads props on item', async () => {
|
|
184
196
|
const items = [{ content: 'Action', value: 1, id: 'Test' }];
|
|
185
197
|
const user = userEvent.setup();
|
|
186
|
-
render(<
|
|
198
|
+
render(<SimpleDropdown initialItems={items} toggleContent="Dropdown" />);
|
|
187
199
|
|
|
188
200
|
const toggle = screen.getByRole('button', { name: 'Dropdown' });
|
|
189
201
|
await user.click(toggle);
|
|
@@ -196,7 +208,7 @@ describe('Dropdown items', () => {
|
|
|
196
208
|
const onClick = jest.fn();
|
|
197
209
|
const items = [{ content: 'Action', value: 1, onClick }];
|
|
198
210
|
const user = userEvent.setup();
|
|
199
|
-
render(<
|
|
211
|
+
render(<SimpleDropdown initialItems={items} toggleContent="Dropdown" />);
|
|
200
212
|
|
|
201
213
|
const toggle = screen.getByRole('button', { name: 'Dropdown' });
|
|
202
214
|
await user.click(toggle);
|
|
@@ -213,7 +225,7 @@ describe('Dropdown items', () => {
|
|
|
213
225
|
{ content: 'Action 2', value: 2 }
|
|
214
226
|
];
|
|
215
227
|
const user = userEvent.setup();
|
|
216
|
-
render(<
|
|
228
|
+
render(<SimpleDropdown initialItems={items} toggleContent="Dropdown" />);
|
|
217
229
|
|
|
218
230
|
const toggle = screen.getByRole('button', { name: 'Dropdown' });
|
|
219
231
|
await user.click(toggle);
|
|
@@ -227,7 +239,7 @@ describe('Dropdown items', () => {
|
|
|
227
239
|
const onClick = jest.fn();
|
|
228
240
|
const items = [{ content: 'Action', value: 1, onClick, isDisabled: true }];
|
|
229
241
|
const user = userEvent.setup();
|
|
230
|
-
render(<
|
|
242
|
+
render(<SimpleDropdown initialItems={items} toggleContent="Dropdown" />);
|
|
231
243
|
|
|
232
244
|
const toggle = screen.getByRole('button', { name: 'Dropdown' });
|
|
233
245
|
await user.click(toggle);
|
|
@@ -244,7 +256,7 @@ describe('Dropdown items', () => {
|
|
|
244
256
|
{ content: 'Link', value: 'separator', to: '#', ouiaId: '3' }
|
|
245
257
|
];
|
|
246
258
|
const user = userEvent.setup();
|
|
247
|
-
const { asFragment } = render(<
|
|
259
|
+
const { asFragment } = render(<SimpleDropdown ouiaId={4} initialItems={items} toggleContent="Dropdown" />);
|
|
248
260
|
|
|
249
261
|
const toggle = screen.getByRole('button', { name: 'Dropdown' });
|
|
250
262
|
await user.click(toggle);
|
|
@@ -5,6 +5,9 @@ exports[`Dropdown items Matches snapshot 1`] = `
|
|
|
5
5
|
<button
|
|
6
6
|
aria-expanded="true"
|
|
7
7
|
class="pf-v6-c-menu-toggle pf-m-expanded"
|
|
8
|
+
data-ouia-component-id="OUIA-Generated-MenuToggle-default-23"
|
|
9
|
+
data-ouia-component-type="PF6/MenuToggle"
|
|
10
|
+
data-ouia-safe="true"
|
|
8
11
|
type="button"
|
|
9
12
|
>
|
|
10
13
|
<span
|
|
@@ -114,6 +117,9 @@ exports[`Dropdown toggle Matches snapshot 1`] = `
|
|
|
114
117
|
<button
|
|
115
118
|
aria-expanded="false"
|
|
116
119
|
class="pf-v6-c-menu-toggle"
|
|
120
|
+
data-ouia-component-id="OUIA-Generated-MenuToggle-default-14"
|
|
121
|
+
data-ouia-component-type="PF6/MenuToggle"
|
|
122
|
+
data-ouia-safe="true"
|
|
117
123
|
type="button"
|
|
118
124
|
>
|
|
119
125
|
<span
|
|
@@ -4,33 +4,21 @@ section: components
|
|
|
4
4
|
subsection: menus
|
|
5
5
|
template: true
|
|
6
6
|
beta: true
|
|
7
|
-
propComponents: ['
|
|
7
|
+
propComponents: ['SimpleDropdown', 'SimpleDropdownItem']
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
Note: Templates live in their own package at [@patternfly/react-templates](https://www.npmjs.com/package/@patternfly/react-templates)!
|
|
11
11
|
|
|
12
12
|
For custom use cases, please see the dropdown component suite from [@patternfly/react-core](https://www.npmjs.com/package/@patternfly/react-core).
|
|
13
13
|
|
|
14
|
-
import {
|
|
15
|
-
|
|
16
|
-
Divider,
|
|
17
|
-
Dropdown,
|
|
18
|
-
DropdownItem,
|
|
19
|
-
DropdownList,
|
|
20
|
-
DropdownItemProps,
|
|
21
|
-
Flex,
|
|
22
|
-
FlexItem,
|
|
23
|
-
MenuToggle,
|
|
24
|
-
MenuToggleElement,
|
|
25
|
-
OUIAProps
|
|
26
|
-
} from '@patternfly/react-core';
|
|
27
|
-
import { DropdownSimple, DropdownSimpleItem } from '@patternfly/react-templates';
|
|
14
|
+
import { Checkbox, Flex, FlexItem } from '@patternfly/react-core';
|
|
15
|
+
import { SimpleDropdown } from '@patternfly/react-templates';
|
|
28
16
|
import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon';
|
|
29
17
|
|
|
30
18
|
## Examples
|
|
31
19
|
|
|
32
20
|
### Simple
|
|
33
21
|
|
|
34
|
-
```ts file="./
|
|
22
|
+
```ts file="./SimpleDropdownExample.tsx"
|
|
35
23
|
|
|
36
24
|
```
|
package/src/components/Dropdown/examples/{DropdownSimpleExample.tsx → SimpleDropdownExample.tsx}
RENAMED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { Checkbox, Flex, FlexItem } from '@patternfly/react-core';
|
|
3
|
-
import {
|
|
3
|
+
import { SimpleDropdown, SimpleDropdownItem } from '@patternfly/react-templates';
|
|
4
4
|
import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon';
|
|
5
5
|
|
|
6
|
-
export const
|
|
6
|
+
export const SimpleDropdownExample: React.FunctionComponent = () => {
|
|
7
7
|
const [isDisabled, setIsDisabled] = React.useState(false);
|
|
8
8
|
|
|
9
|
-
const items:
|
|
9
|
+
const items: SimpleDropdownItem[] = [
|
|
10
10
|
// eslint-disable-next-line no-console
|
|
11
11
|
{ content: 'Action', value: 1, onClick: () => console.log('Action clicked') },
|
|
12
12
|
// Prevent default click behavior on link for example purposes
|
|
@@ -21,17 +21,17 @@ export const DropdownSimpleExample: React.FunctionComponent = () => {
|
|
|
21
21
|
<React.Fragment>
|
|
22
22
|
<Checkbox
|
|
23
23
|
id="simple-example-disabled-toggle"
|
|
24
|
-
label="Disable dropdown
|
|
24
|
+
label="Disable simple dropdown toggles"
|
|
25
25
|
isChecked={isDisabled}
|
|
26
26
|
onChange={(_event: React.FormEvent<HTMLInputElement>, checked: boolean) => setIsDisabled(checked)}
|
|
27
27
|
style={{ marginBottom: 20 }}
|
|
28
28
|
/>
|
|
29
29
|
<Flex gap={{ default: 'gapLg' }}>
|
|
30
30
|
<FlexItem>
|
|
31
|
-
<
|
|
31
|
+
<SimpleDropdown initialItems={items} isDisabled={isDisabled} toggleContent="Dropdown" />
|
|
32
32
|
</FlexItem>
|
|
33
33
|
<FlexItem>
|
|
34
|
-
<
|
|
34
|
+
<SimpleDropdown
|
|
35
35
|
toggleVariant="plainText"
|
|
36
36
|
initialItems={items}
|
|
37
37
|
isDisabled={isDisabled}
|
|
@@ -39,7 +39,7 @@ export const DropdownSimpleExample: React.FunctionComponent = () => {
|
|
|
39
39
|
/>
|
|
40
40
|
</FlexItem>
|
|
41
41
|
<FlexItem>
|
|
42
|
-
<
|
|
42
|
+
<SimpleDropdown
|
|
43
43
|
toggleVariant="plain"
|
|
44
44
|
initialItems={items}
|
|
45
45
|
isDisabled={isDisabled}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from './
|
|
1
|
+
export * from './SimpleDropdown';
|
|
@@ -3,10 +3,12 @@ import {
|
|
|
3
3
|
Badge,
|
|
4
4
|
MenuToggle,
|
|
5
5
|
MenuToggleElement,
|
|
6
|
+
MenuToggleProps,
|
|
6
7
|
Select,
|
|
7
8
|
SelectList,
|
|
8
9
|
SelectOption,
|
|
9
|
-
SelectOptionProps
|
|
10
|
+
SelectOptionProps,
|
|
11
|
+
SelectProps
|
|
10
12
|
} from '@patternfly/react-core';
|
|
11
13
|
|
|
12
14
|
export interface CheckboxSelectOption extends Omit<SelectOptionProps, 'content'> {
|
|
@@ -16,7 +18,7 @@ export interface CheckboxSelectOption extends Omit<SelectOptionProps, 'content'>
|
|
|
16
18
|
value: string | number;
|
|
17
19
|
}
|
|
18
20
|
|
|
19
|
-
export interface CheckboxSelectProps {
|
|
21
|
+
export interface CheckboxSelectProps extends Omit<SelectProps, 'toggle'> {
|
|
20
22
|
/** @hide Forwarded ref */
|
|
21
23
|
innerRef?: React.Ref<any>;
|
|
22
24
|
/** Initial options of the select. */
|
|
@@ -27,8 +29,12 @@ export interface CheckboxSelectProps {
|
|
|
27
29
|
onToggle?: (nextIsOpen: boolean) => void;
|
|
28
30
|
/** Flag indicating the select should be disabled. */
|
|
29
31
|
isDisabled?: boolean;
|
|
30
|
-
/** Content of the toggle. Defaults to
|
|
32
|
+
/** Content of the toggle. Defaults to a string with badge count of selected options. */
|
|
31
33
|
toggleContent?: React.ReactNode;
|
|
34
|
+
/** Width of the toggle. */
|
|
35
|
+
toggleWidth?: string;
|
|
36
|
+
/** Additional props passed to the toggle. */
|
|
37
|
+
toggleProps?: MenuToggleProps;
|
|
32
38
|
}
|
|
33
39
|
|
|
34
40
|
const CheckboxSelectBase: React.FunctionComponent<CheckboxSelectProps> = ({
|
|
@@ -38,6 +44,8 @@ const CheckboxSelectBase: React.FunctionComponent<CheckboxSelectProps> = ({
|
|
|
38
44
|
onSelect: passedOnSelect,
|
|
39
45
|
onToggle,
|
|
40
46
|
toggleContent,
|
|
47
|
+
toggleWidth = '200px',
|
|
48
|
+
toggleProps,
|
|
41
49
|
...props
|
|
42
50
|
}: CheckboxSelectProps) => {
|
|
43
51
|
const [isOpen, setIsOpen] = React.useState(false);
|
|
@@ -47,7 +55,7 @@ const CheckboxSelectBase: React.FunctionComponent<CheckboxSelectProps> = ({
|
|
|
47
55
|
const { content, value, ...props } = option;
|
|
48
56
|
const isSelected = selected.includes(`${value}`);
|
|
49
57
|
return (
|
|
50
|
-
<SelectOption
|
|
58
|
+
<SelectOption value={value} key={value} hasCheckbox isSelected={isSelected} {...props}>
|
|
51
59
|
{content}
|
|
52
60
|
</SelectOption>
|
|
53
61
|
);
|
|
@@ -83,9 +91,10 @@ const CheckboxSelectBase: React.FunctionComponent<CheckboxSelectProps> = ({
|
|
|
83
91
|
isDisabled={isDisabled}
|
|
84
92
|
style={
|
|
85
93
|
{
|
|
86
|
-
width:
|
|
94
|
+
width: toggleWidth
|
|
87
95
|
} as React.CSSProperties
|
|
88
96
|
}
|
|
97
|
+
{...toggleProps}
|
|
89
98
|
>
|
|
90
99
|
{toggleContent || defaultToggleContent}
|
|
91
100
|
</MenuToggle>
|
|
@@ -93,11 +102,13 @@ const CheckboxSelectBase: React.FunctionComponent<CheckboxSelectProps> = ({
|
|
|
93
102
|
|
|
94
103
|
return (
|
|
95
104
|
<Select
|
|
96
|
-
id="checkbox-select"
|
|
97
105
|
isOpen={isOpen}
|
|
98
106
|
selected={selected}
|
|
99
107
|
onSelect={onSelect}
|
|
100
|
-
onOpenChange={(isOpen) =>
|
|
108
|
+
onOpenChange={(isOpen) => {
|
|
109
|
+
onToggle && onToggle(isOpen);
|
|
110
|
+
setIsOpen(isOpen);
|
|
111
|
+
}}
|
|
101
112
|
toggle={toggle}
|
|
102
113
|
ref={innerRef}
|
|
103
114
|
role="menu"
|
|
@@ -1,19 +1,25 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import {
|
|
3
|
-
|
|
2
|
+
import {
|
|
3
|
+
Select,
|
|
4
|
+
SelectList,
|
|
5
|
+
SelectOption,
|
|
6
|
+
SelectOptionProps,
|
|
7
|
+
SelectProps
|
|
8
|
+
} from '@patternfly/react-core/dist/esm/components/Select';
|
|
9
|
+
import { MenuToggle, MenuToggleElement, MenuToggleProps } from '@patternfly/react-core/dist/esm/components/MenuToggle';
|
|
4
10
|
|
|
5
|
-
export interface
|
|
11
|
+
export interface SimpleSelectOption extends Omit<SelectOptionProps, 'content'> {
|
|
6
12
|
/** Content of the select option. */
|
|
7
13
|
content: React.ReactNode;
|
|
8
14
|
/** Value of the select option. */
|
|
9
15
|
value: string | number;
|
|
10
16
|
}
|
|
11
17
|
|
|
12
|
-
export interface
|
|
18
|
+
export interface SimpleSelectProps extends Omit<SelectProps, 'toggle'> {
|
|
13
19
|
/** @hide Forwarded ref */
|
|
14
20
|
innerRef?: React.Ref<any>;
|
|
15
21
|
/** Initial options of the select. */
|
|
16
|
-
initialOptions?:
|
|
22
|
+
initialOptions?: SimpleSelectOption[];
|
|
17
23
|
/** Callback triggered on selection. */
|
|
18
24
|
onSelect?: (_event: React.MouseEvent<Element, MouseEvent>, selection: string | number) => void;
|
|
19
25
|
/** Callback triggered when the select opens or closes. */
|
|
@@ -22,11 +28,13 @@ export interface SelectSimpleProps {
|
|
|
22
28
|
isDisabled?: boolean;
|
|
23
29
|
/** Content of the toggle. Defaults to the selected option. */
|
|
24
30
|
toggleContent?: React.ReactNode;
|
|
25
|
-
/** Width of the toggle */
|
|
31
|
+
/** Width of the toggle. */
|
|
26
32
|
toggleWidth?: string;
|
|
33
|
+
/** Additional props passed to the toggle. */
|
|
34
|
+
toggleProps?: MenuToggleProps;
|
|
27
35
|
}
|
|
28
36
|
|
|
29
|
-
const
|
|
37
|
+
const SimpleSelectBase: React.FunctionComponent<SimpleSelectProps> = ({
|
|
30
38
|
innerRef,
|
|
31
39
|
initialOptions,
|
|
32
40
|
isDisabled,
|
|
@@ -34,8 +42,9 @@ const SelectSimpleBase: React.FunctionComponent<SelectSimpleProps> = ({
|
|
|
34
42
|
onToggle,
|
|
35
43
|
toggleContent,
|
|
36
44
|
toggleWidth = '200px',
|
|
45
|
+
toggleProps,
|
|
37
46
|
...props
|
|
38
|
-
}:
|
|
47
|
+
}: SimpleSelectProps) => {
|
|
39
48
|
const [isOpen, setIsOpen] = React.useState(false);
|
|
40
49
|
const [selected, setSelected] = React.useState<string>('Select a value');
|
|
41
50
|
|
|
@@ -43,7 +52,7 @@ const SelectSimpleBase: React.FunctionComponent<SelectSimpleProps> = ({
|
|
|
43
52
|
const { content, value, ...props } = option;
|
|
44
53
|
const isSelected = selected.includes(`${value}`);
|
|
45
54
|
return (
|
|
46
|
-
<SelectOption
|
|
55
|
+
<SelectOption value={value} key={value} isSelected={isSelected} {...props}>
|
|
47
56
|
{content}
|
|
48
57
|
</SelectOption>
|
|
49
58
|
);
|
|
@@ -57,6 +66,7 @@ const SelectSimpleBase: React.FunctionComponent<SelectSimpleProps> = ({
|
|
|
57
66
|
const _onSelect = (_event: React.MouseEvent<Element, MouseEvent> | undefined, value: string | number | undefined) => {
|
|
58
67
|
onSelect && onSelect(_event, value);
|
|
59
68
|
setSelected(value as string);
|
|
69
|
+
onToggle && onToggle(!false);
|
|
60
70
|
setIsOpen(false);
|
|
61
71
|
};
|
|
62
72
|
|
|
@@ -71,6 +81,7 @@ const SelectSimpleBase: React.FunctionComponent<SelectSimpleProps> = ({
|
|
|
71
81
|
width: toggleWidth
|
|
72
82
|
} as React.CSSProperties
|
|
73
83
|
}
|
|
84
|
+
{...toggleProps}
|
|
74
85
|
>
|
|
75
86
|
{toggleContent ? toggleContent : selected}
|
|
76
87
|
</MenuToggle>
|
|
@@ -78,11 +89,13 @@ const SelectSimpleBase: React.FunctionComponent<SelectSimpleProps> = ({
|
|
|
78
89
|
|
|
79
90
|
return (
|
|
80
91
|
<Select
|
|
81
|
-
id="single-select"
|
|
82
92
|
isOpen={isOpen}
|
|
83
93
|
selected={selected}
|
|
84
94
|
onSelect={_onSelect}
|
|
85
|
-
onOpenChange={(isOpen) =>
|
|
95
|
+
onOpenChange={(isOpen) => {
|
|
96
|
+
onToggle && onToggle(isOpen);
|
|
97
|
+
setIsOpen(isOpen);
|
|
98
|
+
}}
|
|
86
99
|
toggle={toggle}
|
|
87
100
|
shouldFocusToggleOnSelect
|
|
88
101
|
ref={innerRef}
|
|
@@ -93,8 +106,8 @@ const SelectSimpleBase: React.FunctionComponent<SelectSimpleProps> = ({
|
|
|
93
106
|
);
|
|
94
107
|
};
|
|
95
108
|
|
|
96
|
-
export const
|
|
97
|
-
<
|
|
109
|
+
export const SimpleSelect = React.forwardRef((props: SimpleSelectProps, ref: React.Ref<any>) => (
|
|
110
|
+
<SimpleSelectBase {...props} innerRef={ref} />
|
|
98
111
|
));
|
|
99
112
|
|
|
100
|
-
|
|
113
|
+
SimpleSelect.displayName = 'SimpleSelect';
|
|
@@ -9,22 +9,24 @@ import {
|
|
|
9
9
|
TextInputGroup,
|
|
10
10
|
TextInputGroupMain,
|
|
11
11
|
TextInputGroupUtilities,
|
|
12
|
-
Button
|
|
12
|
+
Button,
|
|
13
|
+
MenuToggleProps,
|
|
14
|
+
SelectProps
|
|
13
15
|
} from '@patternfly/react-core';
|
|
14
16
|
import TimesIcon from '@patternfly/react-icons/dist/esm/icons/times-icon';
|
|
15
17
|
|
|
16
|
-
export interface
|
|
18
|
+
export interface TypeaheadSelectOption extends Omit<SelectOptionProps, 'content'> {
|
|
17
19
|
/** Content of the select option. */
|
|
18
20
|
content: string | number;
|
|
19
21
|
/** Value of the select option. */
|
|
20
22
|
value: string | number;
|
|
21
23
|
}
|
|
22
24
|
|
|
23
|
-
export interface
|
|
25
|
+
export interface TypeaheadSelectProps extends Omit<SelectProps, 'toggle'> {
|
|
24
26
|
/** @hide Forwarded ref */
|
|
25
27
|
innerRef?: React.Ref<any>;
|
|
26
28
|
/** Initial options of the select. */
|
|
27
|
-
initialOptions:
|
|
29
|
+
initialOptions: TypeaheadSelectOption[];
|
|
28
30
|
/** Callback triggered on selection. */
|
|
29
31
|
onSelect?: (
|
|
30
32
|
_event: React.MouseEvent<Element, MouseEvent> | React.KeyboardEvent<HTMLInputElement>,
|
|
@@ -40,9 +42,13 @@ export interface SelectTypeaheadProps {
|
|
|
40
42
|
noOptionsFoundMessage?: string | ((filter: string) => string);
|
|
41
43
|
/** Flag indicating the select should be disabled. */
|
|
42
44
|
isDisabled?: boolean;
|
|
45
|
+
/** Width of the toggle. */
|
|
46
|
+
toggleWidth?: string;
|
|
47
|
+
/** Additional props passed to the toggle. */
|
|
48
|
+
toggleProps?: MenuToggleProps;
|
|
43
49
|
}
|
|
44
50
|
|
|
45
|
-
export const
|
|
51
|
+
export const TypeaheadSelectBase: React.FunctionComponent<TypeaheadSelectProps> = ({
|
|
46
52
|
innerRef,
|
|
47
53
|
initialOptions,
|
|
48
54
|
onSelect,
|
|
@@ -51,13 +57,15 @@ export const SelectTypeaheadBase: React.FunctionComponent<SelectTypeaheadProps>
|
|
|
51
57
|
placeholder = 'Select an option',
|
|
52
58
|
noOptionsFoundMessage = (filter) => `No results found for "${filter}"`,
|
|
53
59
|
isDisabled,
|
|
60
|
+
toggleWidth,
|
|
61
|
+
toggleProps,
|
|
54
62
|
...props
|
|
55
|
-
}:
|
|
63
|
+
}: TypeaheadSelectProps) => {
|
|
56
64
|
const [isOpen, setIsOpen] = React.useState(false);
|
|
57
65
|
const [selected, setSelected] = React.useState<string>('');
|
|
58
66
|
const [inputValue, setInputValue] = React.useState<string>('');
|
|
59
67
|
const [filterValue, setFilterValue] = React.useState<string>('');
|
|
60
|
-
const [selectOptions, setSelectOptions] = React.useState<
|
|
68
|
+
const [selectOptions, setSelectOptions] = React.useState<TypeaheadSelectOption[]>(initialOptions);
|
|
61
69
|
const [focusedItemIndex, setFocusedItemIndex] = React.useState<number | null>(null);
|
|
62
70
|
const [activeItemId, setActiveItemId] = React.useState<string | null>(null);
|
|
63
71
|
const textInputRef = React.useRef<HTMLInputElement>();
|
|
@@ -65,7 +73,7 @@ export const SelectTypeaheadBase: React.FunctionComponent<SelectTypeaheadProps>
|
|
|
65
73
|
const NO_RESULTS = 'no results';
|
|
66
74
|
|
|
67
75
|
React.useEffect(() => {
|
|
68
|
-
let newSelectOptions:
|
|
76
|
+
let newSelectOptions: TypeaheadSelectOption[] = initialOptions;
|
|
69
77
|
|
|
70
78
|
// Filter menu items based on the text input value when one exists
|
|
71
79
|
if (filterValue) {
|
|
@@ -92,14 +100,12 @@ export const SelectTypeaheadBase: React.FunctionComponent<SelectTypeaheadProps>
|
|
|
92
100
|
}
|
|
93
101
|
|
|
94
102
|
setSelectOptions(newSelectOptions);
|
|
95
|
-
}, [filterValue]);
|
|
96
|
-
|
|
97
|
-
const createItemId = (value: string | number) => `select-typeahead-${String(value).replace(' ', '-')}`;
|
|
103
|
+
}, [filterValue, initialOptions]);
|
|
98
104
|
|
|
99
105
|
const setActiveAndFocusedItem = (itemIndex: number) => {
|
|
100
106
|
setFocusedItemIndex(itemIndex);
|
|
101
107
|
const focusedItem = selectOptions[itemIndex];
|
|
102
|
-
setActiveItemId(
|
|
108
|
+
setActiveItemId(focusedItem.value as string);
|
|
103
109
|
};
|
|
104
110
|
|
|
105
111
|
const resetActiveAndFocusedItem = () => {
|
|
@@ -128,7 +134,7 @@ export const SelectTypeaheadBase: React.FunctionComponent<SelectTypeaheadProps>
|
|
|
128
134
|
|
|
129
135
|
const selectOption = (
|
|
130
136
|
_event: React.MouseEvent<Element, MouseEvent> | React.KeyboardEvent<HTMLInputElement> | undefined,
|
|
131
|
-
option:
|
|
137
|
+
option: TypeaheadSelectOption
|
|
132
138
|
) => {
|
|
133
139
|
onSelect && onSelect(_event, option.value);
|
|
134
140
|
|
|
@@ -216,6 +222,7 @@ export const SelectTypeaheadBase: React.FunctionComponent<SelectTypeaheadProps>
|
|
|
216
222
|
}
|
|
217
223
|
|
|
218
224
|
if (!isOpen) {
|
|
225
|
+
onToggle && onToggle(true);
|
|
219
226
|
setIsOpen(true);
|
|
220
227
|
}
|
|
221
228
|
|
|
@@ -252,6 +259,12 @@ export const SelectTypeaheadBase: React.FunctionComponent<SelectTypeaheadProps>
|
|
|
252
259
|
isExpanded={isOpen}
|
|
253
260
|
isDisabled={isDisabled}
|
|
254
261
|
isFullWidth
|
|
262
|
+
style={
|
|
263
|
+
{
|
|
264
|
+
width: toggleWidth
|
|
265
|
+
} as React.CSSProperties
|
|
266
|
+
}
|
|
267
|
+
{...toggleProps}
|
|
255
268
|
>
|
|
256
269
|
<TextInputGroup isPlain>
|
|
257
270
|
<TextInputGroupMain
|
|
@@ -259,7 +272,6 @@ export const SelectTypeaheadBase: React.FunctionComponent<SelectTypeaheadProps>
|
|
|
259
272
|
onClick={onInputClick}
|
|
260
273
|
onChange={onTextInputChange}
|
|
261
274
|
onKeyDown={onInputKeyDown}
|
|
262
|
-
id="typeahead-select-input"
|
|
263
275
|
autoComplete="off"
|
|
264
276
|
innerRef={textInputRef}
|
|
265
277
|
placeholder={placeholder}
|
|
@@ -280,7 +292,6 @@ export const SelectTypeaheadBase: React.FunctionComponent<SelectTypeaheadProps>
|
|
|
280
292
|
|
|
281
293
|
return (
|
|
282
294
|
<Select
|
|
283
|
-
id="typeahead-select"
|
|
284
295
|
isOpen={isOpen}
|
|
285
296
|
selected={selected}
|
|
286
297
|
onSelect={_onSelect}
|
|
@@ -292,18 +303,12 @@ export const SelectTypeaheadBase: React.FunctionComponent<SelectTypeaheadProps>
|
|
|
292
303
|
ref={innerRef}
|
|
293
304
|
{...props}
|
|
294
305
|
>
|
|
295
|
-
<SelectList
|
|
306
|
+
<SelectList>
|
|
296
307
|
{selectOptions.map((option, index) => {
|
|
297
308
|
const { content, value, ...props } = option;
|
|
298
309
|
|
|
299
310
|
return (
|
|
300
|
-
<SelectOption
|
|
301
|
-
{...props}
|
|
302
|
-
key={value}
|
|
303
|
-
value={value}
|
|
304
|
-
isFocused={focusedItemIndex === index}
|
|
305
|
-
id={createItemId(value)}
|
|
306
|
-
>
|
|
311
|
+
<SelectOption key={value} value={value} isFocused={focusedItemIndex === index} {...props}>
|
|
307
312
|
{content}
|
|
308
313
|
</SelectOption>
|
|
309
314
|
);
|
|
@@ -312,10 +317,10 @@ export const SelectTypeaheadBase: React.FunctionComponent<SelectTypeaheadProps>
|
|
|
312
317
|
</Select>
|
|
313
318
|
);
|
|
314
319
|
};
|
|
315
|
-
|
|
320
|
+
TypeaheadSelectBase.displayName = 'TypeaheadSelectBase';
|
|
316
321
|
|
|
317
|
-
export const
|
|
318
|
-
<
|
|
322
|
+
export const TypeaheadSelect = React.forwardRef((props: TypeaheadSelectProps, ref: React.Ref<any>) => (
|
|
323
|
+
<TypeaheadSelectBase {...props} innerRef={ref} />
|
|
319
324
|
));
|
|
320
325
|
|
|
321
|
-
|
|
326
|
+
TypeaheadSelect.displayName = 'TypeaheadSelect';
|