@patternfly/react-templates 6.0.0-alpha.2 → 6.0.0-alpha.21
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 +80 -0
- package/README.md +4 -17
- package/components/package.json +1 -1
- package/dist/dynamic/components/Dropdown/package.json +1 -0
- package/dist/dynamic/components/Select/package.json +1 -1
- package/dist/dynamic-modules.json +15 -0
- package/dist/esm/components/Dropdown/DropdownSimple.d.ts +43 -0
- package/dist/esm/components/Dropdown/DropdownSimple.d.ts.map +1 -0
- package/dist/esm/components/Dropdown/DropdownSimple.js +27 -0
- package/dist/esm/components/Dropdown/DropdownSimple.js.map +1 -0
- package/dist/esm/components/Dropdown/index.d.ts +2 -0
- package/dist/esm/components/Dropdown/index.d.ts.map +1 -0
- package/dist/esm/components/Dropdown/index.js +2 -0
- package/dist/esm/components/Dropdown/index.js.map +1 -0
- package/dist/esm/components/Select/CheckboxSelect.js.map +1 -1
- package/dist/esm/components/Select/SelectTypeahead.d.ts +29 -0
- package/dist/esm/components/Select/SelectTypeahead.d.ts.map +1 -0
- package/dist/esm/components/Select/SelectTypeahead.js +179 -0
- package/dist/esm/components/Select/SelectTypeahead.js.map +1 -0
- package/dist/esm/components/Select/index.d.ts +1 -0
- package/dist/esm/components/Select/index.d.ts.map +1 -1
- package/dist/esm/components/Select/index.js +1 -0
- package/dist/esm/components/Select/index.js.map +1 -1
- package/dist/esm/components/index.d.ts +1 -0
- package/dist/esm/components/index.d.ts.map +1 -1
- package/dist/esm/components/index.js +1 -0
- package/dist/esm/components/index.js.map +1 -1
- package/dist/js/components/Dropdown/DropdownSimple.d.ts +43 -0
- package/dist/js/components/Dropdown/DropdownSimple.d.ts.map +1 -0
- package/dist/js/components/Dropdown/DropdownSimple.js +30 -0
- package/dist/js/components/Dropdown/DropdownSimple.js.map +1 -0
- package/dist/js/components/Dropdown/index.d.ts +2 -0
- package/dist/js/components/Dropdown/index.d.ts.map +1 -0
- package/dist/js/components/Dropdown/index.js +5 -0
- package/dist/js/components/Dropdown/index.js.map +1 -0
- package/dist/js/components/Select/CheckboxSelect.js.map +1 -1
- package/dist/js/components/Select/SelectSimple.js.map +1 -1
- package/dist/js/components/Select/SelectTypeahead.d.ts +29 -0
- package/dist/js/components/Select/SelectTypeahead.d.ts.map +1 -0
- package/dist/js/components/Select/SelectTypeahead.js +183 -0
- package/dist/js/components/Select/SelectTypeahead.js.map +1 -0
- package/dist/js/components/Select/index.d.ts +1 -0
- package/dist/js/components/Select/index.d.ts.map +1 -1
- package/dist/js/components/Select/index.js +1 -0
- package/dist/js/components/Select/index.js.map +1 -1
- package/dist/js/components/index.d.ts +1 -0
- package/dist/js/components/index.d.ts.map +1 -1
- package/dist/js/components/index.js +1 -0
- package/dist/js/components/index.js.map +1 -1
- package/dist/umd/assets/output-BQEbKtD2.css +24359 -0
- package/dist/umd/react-templates.min.js +1 -1
- package/package.json +7 -11
- package/rollup.config.mjs +8 -0
- package/src/components/Dropdown/DropdownSimple.tsx +122 -0
- package/src/components/Dropdown/__tests__/DropdownSimple.test.tsx +254 -0
- package/src/components/Dropdown/__tests__/__snapshots__/DropdownSimple.test.tsx.snap +147 -0
- package/src/components/Dropdown/examples/DropdownSimpleExample.tsx +53 -0
- package/src/components/Dropdown/examples/DropdownTemplates.md +36 -0
- package/src/components/Dropdown/index.ts +1 -0
- package/src/components/Select/SelectTypeahead.tsx +321 -0
- package/src/components/Select/__snapshots__/CheckboxSelectSnapshots.test.tsx.snap +4 -4
- package/src/components/Select/examples/SelectTemplates.md +9 -2
- package/src/components/Select/examples/SelectTypeaheadDemo.tsx +21 -0
- package/src/components/Select/index.ts +1 -0
- package/src/components/index.ts +1 -0
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { render, screen } from '@testing-library/react';
|
|
3
|
+
import userEvent from '@testing-library/user-event';
|
|
4
|
+
import { DropdownSimple } from '../DropdownSimple';
|
|
5
|
+
import styles from '@patternfly/react-styles/css/components/MenuToggle/menu-toggle';
|
|
6
|
+
|
|
7
|
+
describe('Dropdown toggle', () => {
|
|
8
|
+
test('Renders dropdown toggle as not disabled when isDisabled is not true', () => {
|
|
9
|
+
render(<DropdownSimple toggleContent="Dropdown" />);
|
|
10
|
+
|
|
11
|
+
expect(screen.getByRole('button', { name: 'Dropdown' })).not.toBeDisabled();
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
test('Renders dropdown toggle as disabled when isDisabled is true', () => {
|
|
15
|
+
render(<DropdownSimple toggleContent="Dropdown" isDisabled />);
|
|
16
|
+
|
|
17
|
+
expect(screen.getByRole('button', { name: 'Dropdown' })).toBeDisabled();
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
test('Passes toggleVariant', () => {
|
|
21
|
+
render(<DropdownSimple toggleContent="Dropdown" toggleVariant="plain" />);
|
|
22
|
+
|
|
23
|
+
expect(screen.getByRole('button', { name: 'Dropdown' })).toHaveClass(styles.modifiers.plain);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
test('Passes toggleAriaLabel', () => {
|
|
27
|
+
render(<DropdownSimple toggleContent="Dropdown" toggleAriaLabel="Aria label content" />);
|
|
28
|
+
|
|
29
|
+
expect(screen.getByRole('button')).toHaveAccessibleName('Aria label content');
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
test('Calls onToggle with next isOpen state when dropdown toggle is clicked', async () => {
|
|
33
|
+
const onToggle = jest.fn();
|
|
34
|
+
const user = userEvent.setup();
|
|
35
|
+
render(<DropdownSimple onToggle={onToggle} toggleContent="Dropdown" />);
|
|
36
|
+
|
|
37
|
+
const toggle = screen.getByRole('button', { name: 'Dropdown' });
|
|
38
|
+
await user.click(toggle);
|
|
39
|
+
expect(onToggle).toHaveBeenCalledWith(true);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
test('Does not call onToggle when dropdown toggle is not clicked', async () => {
|
|
43
|
+
const onToggle = jest.fn();
|
|
44
|
+
const items = [{ content: 'Action', value: 1 }];
|
|
45
|
+
const user = userEvent.setup();
|
|
46
|
+
render(
|
|
47
|
+
<div>
|
|
48
|
+
<button>Actual</button>
|
|
49
|
+
<DropdownSimple initialItems={items} onToggle={onToggle} toggleContent="Dropdown" />
|
|
50
|
+
</div>
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
const btn = screen.getByRole('button', { name: 'Actual' });
|
|
54
|
+
await user.click(btn);
|
|
55
|
+
expect(onToggle).not.toHaveBeenCalled();
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
test('Calls toggle onSelect when item is clicked', async () => {
|
|
59
|
+
const onSelect = jest.fn();
|
|
60
|
+
const items = [{ content: 'Action', value: 1 }];
|
|
61
|
+
const user = userEvent.setup();
|
|
62
|
+
render(<DropdownSimple initialItems={items} toggleContent="Dropdown" onSelect={onSelect} />);
|
|
63
|
+
|
|
64
|
+
const toggle = screen.getByRole('button', { name: 'Dropdown' });
|
|
65
|
+
await user.click(toggle);
|
|
66
|
+
|
|
67
|
+
const actionItem = screen.getByRole('menuitem', { name: 'Action' });
|
|
68
|
+
await user.click(actionItem);
|
|
69
|
+
expect(onSelect).toHaveBeenCalledTimes(1);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
test('Does not call toggle onSelect when item is not clicked', async () => {
|
|
73
|
+
const onSelect = jest.fn();
|
|
74
|
+
const items = [{ content: 'Action', value: 1 }];
|
|
75
|
+
const user = userEvent.setup();
|
|
76
|
+
render(<DropdownSimple initialItems={items} toggleContent="Dropdown" onSelect={onSelect} />);
|
|
77
|
+
|
|
78
|
+
const toggle = screen.getByRole('button', { name: 'Dropdown' });
|
|
79
|
+
await user.click(toggle);
|
|
80
|
+
await user.click(toggle);
|
|
81
|
+
expect(onSelect).not.toHaveBeenCalled();
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
test('Does not pass isToggleFullWidth to menu toggle by default', () => {
|
|
85
|
+
render(<DropdownSimple toggleContent="Dropdown" />);
|
|
86
|
+
|
|
87
|
+
expect(screen.getByRole('button', { name: 'Dropdown' })).not.toHaveClass(styles.modifiers.fullWidth);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
test('Passes isToggleFullWidth to menu toggle when passed in', () => {
|
|
91
|
+
render(<DropdownSimple isToggleFullWidth toggleContent="Dropdown" />);
|
|
92
|
+
|
|
93
|
+
expect(screen.getByRole('button', { name: 'Dropdown' })).toHaveClass(styles.modifiers.fullWidth);
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
test('Does not focus toggle on item select by default', async () => {
|
|
97
|
+
const items = [{ content: 'Action', value: 1 }];
|
|
98
|
+
const user = userEvent.setup();
|
|
99
|
+
render(<DropdownSimple initialItems={items} toggleContent="Dropdown" />);
|
|
100
|
+
|
|
101
|
+
const toggle = screen.getByRole('button', { name: 'Dropdown' });
|
|
102
|
+
await user.click(toggle);
|
|
103
|
+
const actionItem = screen.getByRole('menuitem', { name: 'Action' });
|
|
104
|
+
await user.click(actionItem);
|
|
105
|
+
|
|
106
|
+
expect(toggle).not.toHaveFocus();
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
test('Focuses toggle on item select when shouldFocusToggleOnSelect is true', async () => {
|
|
110
|
+
const items = [{ content: 'Action', value: 1 }];
|
|
111
|
+
const user = userEvent.setup();
|
|
112
|
+
render(<DropdownSimple shouldFocusToggleOnSelect initialItems={items} toggleContent="Dropdown" />);
|
|
113
|
+
|
|
114
|
+
const toggle = screen.getByRole('button', { name: 'Dropdown' });
|
|
115
|
+
await user.click(toggle);
|
|
116
|
+
const actionItem = screen.getByRole('menuitem', { name: 'Action' });
|
|
117
|
+
await user.click(actionItem);
|
|
118
|
+
|
|
119
|
+
expect(toggle).toHaveFocus();
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
test('Matches snapshot', () => {
|
|
123
|
+
const { asFragment } = render(<DropdownSimple toggleContent="Dropdown" />);
|
|
124
|
+
|
|
125
|
+
expect(asFragment()).toMatchSnapshot();
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
describe('Dropdown items', () => {
|
|
130
|
+
test('Renders with items', async () => {
|
|
131
|
+
const items = [
|
|
132
|
+
{ content: 'Action', value: 1 },
|
|
133
|
+
{ value: 'separator', isDivider: true }
|
|
134
|
+
];
|
|
135
|
+
const user = userEvent.setup();
|
|
136
|
+
render(<DropdownSimple initialItems={items} toggleContent="Dropdown" />);
|
|
137
|
+
|
|
138
|
+
const toggle = screen.getByRole('button', { name: 'Dropdown' });
|
|
139
|
+
await user.click(toggle);
|
|
140
|
+
|
|
141
|
+
const actionItem = screen.getByRole('menuitem', { name: 'Action' });
|
|
142
|
+
const dividerItem = screen.getByRole('separator');
|
|
143
|
+
expect(actionItem).toBeInTheDocument();
|
|
144
|
+
expect(dividerItem).toBeInTheDocument();
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
test('Renders with a link item', async () => {
|
|
148
|
+
const items = [{ content: 'Link', value: 1, to: '#' }];
|
|
149
|
+
const user = userEvent.setup();
|
|
150
|
+
render(<DropdownSimple initialItems={items} toggleContent="Dropdown" />);
|
|
151
|
+
|
|
152
|
+
const toggle = screen.getByRole('button', { name: 'Dropdown' });
|
|
153
|
+
await user.click(toggle);
|
|
154
|
+
|
|
155
|
+
const linkItem = screen.getByRole('menuitem', { name: 'Link' });
|
|
156
|
+
expect(linkItem.getAttribute('href')).toBe('#');
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
test('Renders with items not disabled by default', async () => {
|
|
160
|
+
const items = [{ content: 'Action', value: 1 }];
|
|
161
|
+
const user = userEvent.setup();
|
|
162
|
+
render(<DropdownSimple initialItems={items} toggleContent="Dropdown" />);
|
|
163
|
+
|
|
164
|
+
const toggle = screen.getByRole('button', { name: 'Dropdown' });
|
|
165
|
+
await user.click(toggle);
|
|
166
|
+
|
|
167
|
+
const actionItem = screen.getByRole('menuitem', { name: 'Action' });
|
|
168
|
+
expect(actionItem).not.toBeDisabled();
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
test('Renders with a disabled item', async () => {
|
|
172
|
+
const items = [{ content: 'Action', value: 1, isDisabled: true }];
|
|
173
|
+
const user = userEvent.setup();
|
|
174
|
+
render(<DropdownSimple initialItems={items} toggleContent="Dropdown" />);
|
|
175
|
+
|
|
176
|
+
const toggle = screen.getByRole('button', { name: 'Dropdown' });
|
|
177
|
+
await user.click(toggle);
|
|
178
|
+
|
|
179
|
+
const actionItem = screen.getByRole('menuitem', { name: 'Action' });
|
|
180
|
+
expect(actionItem).toBeDisabled();
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
test('Spreads props on item', async () => {
|
|
184
|
+
const items = [{ content: 'Action', value: 1, id: 'Test' }];
|
|
185
|
+
const user = userEvent.setup();
|
|
186
|
+
render(<DropdownSimple initialItems={items} toggleContent="Dropdown" />);
|
|
187
|
+
|
|
188
|
+
const toggle = screen.getByRole('button', { name: 'Dropdown' });
|
|
189
|
+
await user.click(toggle);
|
|
190
|
+
|
|
191
|
+
const actionItem = screen.getByRole('menuitem', { name: 'Action' });
|
|
192
|
+
expect(actionItem.getAttribute('id')).toBe('Test');
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
test('Calls item onClick when clicked', async () => {
|
|
196
|
+
const onClick = jest.fn();
|
|
197
|
+
const items = [{ content: 'Action', value: 1, onClick }];
|
|
198
|
+
const user = userEvent.setup();
|
|
199
|
+
render(<DropdownSimple initialItems={items} toggleContent="Dropdown" />);
|
|
200
|
+
|
|
201
|
+
const toggle = screen.getByRole('button', { name: 'Dropdown' });
|
|
202
|
+
await user.click(toggle);
|
|
203
|
+
|
|
204
|
+
const actionItem = screen.getByRole('menuitem', { name: 'Action' });
|
|
205
|
+
await user.click(actionItem);
|
|
206
|
+
expect(onClick).toHaveBeenCalledTimes(1);
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
test('Does not call item onClick when not clicked', async () => {
|
|
210
|
+
const onClick = jest.fn();
|
|
211
|
+
const items = [
|
|
212
|
+
{ content: 'Action', value: 1, onClick },
|
|
213
|
+
{ content: 'Action 2', value: 2 }
|
|
214
|
+
];
|
|
215
|
+
const user = userEvent.setup();
|
|
216
|
+
render(<DropdownSimple initialItems={items} toggleContent="Dropdown" />);
|
|
217
|
+
|
|
218
|
+
const toggle = screen.getByRole('button', { name: 'Dropdown' });
|
|
219
|
+
await user.click(toggle);
|
|
220
|
+
|
|
221
|
+
const actionItem = screen.getByRole('menuitem', { name: 'Action 2' });
|
|
222
|
+
await user.click(actionItem);
|
|
223
|
+
expect(onClick).not.toHaveBeenCalled();
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
test('Does not call item onClick when clicked and item is disabled', async () => {
|
|
227
|
+
const onClick = jest.fn();
|
|
228
|
+
const items = [{ content: 'Action', value: 1, onClick, isDisabled: true }];
|
|
229
|
+
const user = userEvent.setup();
|
|
230
|
+
render(<DropdownSimple initialItems={items} toggleContent="Dropdown" />);
|
|
231
|
+
|
|
232
|
+
const toggle = screen.getByRole('button', { name: 'Dropdown' });
|
|
233
|
+
await user.click(toggle);
|
|
234
|
+
|
|
235
|
+
const actionItem = screen.getByRole('menuitem', { name: 'Action' });
|
|
236
|
+
await user.click(actionItem);
|
|
237
|
+
expect(onClick).not.toHaveBeenCalled();
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
test('Matches snapshot', async () => {
|
|
241
|
+
const items = [
|
|
242
|
+
{ content: 'Action', value: 1, ouiaId: '1' },
|
|
243
|
+
{ value: 'separator', isDivider: true, ouiaId: '2' },
|
|
244
|
+
{ content: 'Link', value: 'separator', to: '#', ouiaId: '3' }
|
|
245
|
+
];
|
|
246
|
+
const user = userEvent.setup();
|
|
247
|
+
const { asFragment } = render(<DropdownSimple ouiaId={4} initialItems={items} toggleContent="Dropdown" />);
|
|
248
|
+
|
|
249
|
+
const toggle = screen.getByRole('button', { name: 'Dropdown' });
|
|
250
|
+
await user.click(toggle);
|
|
251
|
+
|
|
252
|
+
expect(asFragment()).toMatchSnapshot();
|
|
253
|
+
});
|
|
254
|
+
});
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
|
+
|
|
3
|
+
exports[`Dropdown items Matches snapshot 1`] = `
|
|
4
|
+
<DocumentFragment>
|
|
5
|
+
<button
|
|
6
|
+
aria-expanded="true"
|
|
7
|
+
class="pf-v6-c-menu-toggle pf-m-expanded"
|
|
8
|
+
type="button"
|
|
9
|
+
>
|
|
10
|
+
<span
|
|
11
|
+
class="pf-v6-c-menu-toggle__text"
|
|
12
|
+
>
|
|
13
|
+
Dropdown
|
|
14
|
+
</span>
|
|
15
|
+
<span
|
|
16
|
+
class="pf-v6-c-menu-toggle__controls"
|
|
17
|
+
>
|
|
18
|
+
<span
|
|
19
|
+
class="pf-v6-c-menu-toggle__toggle-icon"
|
|
20
|
+
>
|
|
21
|
+
<svg
|
|
22
|
+
aria-hidden="true"
|
|
23
|
+
class="pf-v6-svg"
|
|
24
|
+
fill="currentColor"
|
|
25
|
+
height="1em"
|
|
26
|
+
role="img"
|
|
27
|
+
viewBox="0 0 320 512"
|
|
28
|
+
width="1em"
|
|
29
|
+
>
|
|
30
|
+
<path
|
|
31
|
+
d="M31.3 192h257.3c17.8 0 26.7 21.5 14.1 34.1L174.1 354.8c-7.8 7.8-20.5 7.8-28.3 0L17.2 226.1C4.6 213.5 13.5 192 31.3 192z"
|
|
32
|
+
/>
|
|
33
|
+
</svg>
|
|
34
|
+
</span>
|
|
35
|
+
</span>
|
|
36
|
+
</button>
|
|
37
|
+
<div
|
|
38
|
+
class="pf-v6-c-menu"
|
|
39
|
+
data-ouia-component-id="4"
|
|
40
|
+
data-ouia-component-type="PF6/Dropdown"
|
|
41
|
+
data-ouia-safe="true"
|
|
42
|
+
data-popper-escaped="true"
|
|
43
|
+
data-popper-placement="bottom-start"
|
|
44
|
+
data-popper-reference-hidden="true"
|
|
45
|
+
style="position: absolute; left: 0px; top: 0px; z-index: 9999; opacity: 1; transition: opacity 0ms cubic-bezier(.54, 1.5, .38, 1.11); min-width: 0px; transform: translate(0px, 0px);"
|
|
46
|
+
>
|
|
47
|
+
<div
|
|
48
|
+
class="pf-v6-c-menu__content"
|
|
49
|
+
>
|
|
50
|
+
<ul
|
|
51
|
+
class="pf-v6-c-menu__list"
|
|
52
|
+
role="menu"
|
|
53
|
+
>
|
|
54
|
+
<li
|
|
55
|
+
class="pf-v6-c-menu__list-item"
|
|
56
|
+
data-ouia-component-id="1"
|
|
57
|
+
data-ouia-component-type="PF6/DropdownItem"
|
|
58
|
+
data-ouia-safe="true"
|
|
59
|
+
role="none"
|
|
60
|
+
>
|
|
61
|
+
<button
|
|
62
|
+
class="pf-v6-c-menu__item"
|
|
63
|
+
role="menuitem"
|
|
64
|
+
tabindex="0"
|
|
65
|
+
type="button"
|
|
66
|
+
>
|
|
67
|
+
<span
|
|
68
|
+
class="pf-v6-c-menu__item-main"
|
|
69
|
+
>
|
|
70
|
+
<span
|
|
71
|
+
class="pf-v6-c-menu__item-text"
|
|
72
|
+
>
|
|
73
|
+
Action
|
|
74
|
+
</span>
|
|
75
|
+
</span>
|
|
76
|
+
</button>
|
|
77
|
+
</li>
|
|
78
|
+
<li
|
|
79
|
+
class="pf-v6-c-divider"
|
|
80
|
+
role="separator"
|
|
81
|
+
/>
|
|
82
|
+
<li
|
|
83
|
+
class="pf-v6-c-menu__list-item"
|
|
84
|
+
data-ouia-component-id="3"
|
|
85
|
+
data-ouia-component-type="PF6/DropdownItem"
|
|
86
|
+
data-ouia-safe="true"
|
|
87
|
+
role="none"
|
|
88
|
+
>
|
|
89
|
+
<a
|
|
90
|
+
class="pf-v6-c-menu__item"
|
|
91
|
+
href="#"
|
|
92
|
+
role="menuitem"
|
|
93
|
+
tabindex="-1"
|
|
94
|
+
>
|
|
95
|
+
<span
|
|
96
|
+
class="pf-v6-c-menu__item-main"
|
|
97
|
+
>
|
|
98
|
+
<span
|
|
99
|
+
class="pf-v6-c-menu__item-text"
|
|
100
|
+
>
|
|
101
|
+
Link
|
|
102
|
+
</span>
|
|
103
|
+
</span>
|
|
104
|
+
</a>
|
|
105
|
+
</li>
|
|
106
|
+
</ul>
|
|
107
|
+
</div>
|
|
108
|
+
</div>
|
|
109
|
+
</DocumentFragment>
|
|
110
|
+
`;
|
|
111
|
+
|
|
112
|
+
exports[`Dropdown toggle Matches snapshot 1`] = `
|
|
113
|
+
<DocumentFragment>
|
|
114
|
+
<button
|
|
115
|
+
aria-expanded="false"
|
|
116
|
+
class="pf-v6-c-menu-toggle"
|
|
117
|
+
type="button"
|
|
118
|
+
>
|
|
119
|
+
<span
|
|
120
|
+
class="pf-v6-c-menu-toggle__text"
|
|
121
|
+
>
|
|
122
|
+
Dropdown
|
|
123
|
+
</span>
|
|
124
|
+
<span
|
|
125
|
+
class="pf-v6-c-menu-toggle__controls"
|
|
126
|
+
>
|
|
127
|
+
<span
|
|
128
|
+
class="pf-v6-c-menu-toggle__toggle-icon"
|
|
129
|
+
>
|
|
130
|
+
<svg
|
|
131
|
+
aria-hidden="true"
|
|
132
|
+
class="pf-v6-svg"
|
|
133
|
+
fill="currentColor"
|
|
134
|
+
height="1em"
|
|
135
|
+
role="img"
|
|
136
|
+
viewBox="0 0 320 512"
|
|
137
|
+
width="1em"
|
|
138
|
+
>
|
|
139
|
+
<path
|
|
140
|
+
d="M31.3 192h257.3c17.8 0 26.7 21.5 14.1 34.1L174.1 354.8c-7.8 7.8-20.5 7.8-28.3 0L17.2 226.1C4.6 213.5 13.5 192 31.3 192z"
|
|
141
|
+
/>
|
|
142
|
+
</svg>
|
|
143
|
+
</span>
|
|
144
|
+
</span>
|
|
145
|
+
</button>
|
|
146
|
+
</DocumentFragment>
|
|
147
|
+
`;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Checkbox, Flex, FlexItem } from '@patternfly/react-core';
|
|
3
|
+
import { DropdownSimple, DropdownSimpleItem } from '@patternfly/react-templates';
|
|
4
|
+
import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon';
|
|
5
|
+
|
|
6
|
+
export const DropdownSimpleExample: React.FunctionComponent = () => {
|
|
7
|
+
const [isDisabled, setIsDisabled] = React.useState(false);
|
|
8
|
+
|
|
9
|
+
const items: DropdownSimpleItem[] = [
|
|
10
|
+
// eslint-disable-next-line no-console
|
|
11
|
+
{ content: 'Action', value: 1, onClick: () => console.log('Action clicked') },
|
|
12
|
+
// Prevent default click behavior on link for example purposes
|
|
13
|
+
{ content: 'Link', value: 2, to: '#', onClick: (event: any) => event.preventDefault() },
|
|
14
|
+
{ content: 'Disabled Action', value: 3, isDisabled: true },
|
|
15
|
+
{ value: 'separator', isDivider: true },
|
|
16
|
+
// eslint-disable-next-line no-console
|
|
17
|
+
{ content: 'Second action', value: 4, onClick: () => console.log('Second action clicked') }
|
|
18
|
+
];
|
|
19
|
+
|
|
20
|
+
return (
|
|
21
|
+
<React.Fragment>
|
|
22
|
+
<Checkbox
|
|
23
|
+
id="simple-example-disabled-toggle"
|
|
24
|
+
label="Disable dropdown simple toggles"
|
|
25
|
+
isChecked={isDisabled}
|
|
26
|
+
onChange={(_event: React.FormEvent<HTMLInputElement>, checked: boolean) => setIsDisabled(checked)}
|
|
27
|
+
style={{ marginBottom: 20 }}
|
|
28
|
+
/>
|
|
29
|
+
<Flex gap={{ default: 'gapLg' }}>
|
|
30
|
+
<FlexItem>
|
|
31
|
+
<DropdownSimple initialItems={items} isDisabled={isDisabled} toggleContent="Dropdown" />
|
|
32
|
+
</FlexItem>
|
|
33
|
+
<FlexItem>
|
|
34
|
+
<DropdownSimple
|
|
35
|
+
toggleVariant="plainText"
|
|
36
|
+
initialItems={items}
|
|
37
|
+
isDisabled={isDisabled}
|
|
38
|
+
toggleContent="Dropdown with plainText styling"
|
|
39
|
+
/>
|
|
40
|
+
</FlexItem>
|
|
41
|
+
<FlexItem>
|
|
42
|
+
<DropdownSimple
|
|
43
|
+
toggleVariant="plain"
|
|
44
|
+
initialItems={items}
|
|
45
|
+
isDisabled={isDisabled}
|
|
46
|
+
toggleContent={<EllipsisVIcon aria-hidden="true" />}
|
|
47
|
+
toggleAriaLabel="Plain dropdown toggle"
|
|
48
|
+
/>
|
|
49
|
+
</FlexItem>
|
|
50
|
+
</Flex>
|
|
51
|
+
</React.Fragment>
|
|
52
|
+
);
|
|
53
|
+
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: Dropdown
|
|
3
|
+
section: components
|
|
4
|
+
subsection: menus
|
|
5
|
+
template: true
|
|
6
|
+
beta: true
|
|
7
|
+
propComponents: ['DropdownSimple', 'DropdownSimpleItem']
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
Note: Templates live in their own package at [@patternfly/react-templates](https://www.npmjs.com/package/@patternfly/react-templates)!
|
|
11
|
+
|
|
12
|
+
For custom use cases, please see the dropdown component suite from [@patternfly/react-core](https://www.npmjs.com/package/@patternfly/react-core).
|
|
13
|
+
|
|
14
|
+
import {
|
|
15
|
+
Checkbox,
|
|
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';
|
|
28
|
+
import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon';
|
|
29
|
+
|
|
30
|
+
## Examples
|
|
31
|
+
|
|
32
|
+
### Simple
|
|
33
|
+
|
|
34
|
+
```ts file="./DropdownSimpleExample.tsx"
|
|
35
|
+
|
|
36
|
+
```
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './DropdownSimple';
|