@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.
Files changed (79) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/components/package.json +8 -1
  3. package/dist/dynamic/components/Dropdown/package.json +8 -1
  4. package/dist/dynamic/components/Select/package.json +8 -1
  5. package/dist/dynamic-modules.json +10 -10
  6. package/dist/esm/components/Dropdown/{DropdownSimple.d.ts → SimpleDropdown.d.ts} +11 -6
  7. package/dist/esm/components/Dropdown/SimpleDropdown.d.ts.map +1 -0
  8. package/dist/esm/components/Dropdown/{DropdownSimple.js → SimpleDropdown.js} +13 -7
  9. package/dist/esm/components/Dropdown/SimpleDropdown.js.map +1 -0
  10. package/dist/esm/components/Dropdown/index.d.ts +1 -1
  11. package/dist/esm/components/Dropdown/index.js +1 -1
  12. package/dist/esm/components/Select/CheckboxSelect.d.ts +7 -3
  13. package/dist/esm/components/Select/CheckboxSelect.d.ts.map +1 -1
  14. package/dist/esm/components/Select/CheckboxSelect.js +9 -6
  15. package/dist/esm/components/Select/CheckboxSelect.js.map +1 -1
  16. package/dist/{js/components/Select/SelectSimple.d.ts → esm/components/Select/SimpleSelect.d.ts} +10 -7
  17. package/dist/esm/components/Select/SimpleSelect.d.ts.map +1 -0
  18. package/dist/esm/components/Select/{SelectSimple.js → SimpleSelect.js} +13 -9
  19. package/dist/esm/components/Select/SimpleSelect.js.map +1 -0
  20. package/dist/esm/components/Select/{SelectTypeahead.d.ts → TypeaheadSelect.d.ts} +11 -7
  21. package/dist/esm/components/Select/TypeaheadSelect.d.ts.map +1 -0
  22. package/dist/esm/components/Select/{SelectTypeahead.js → TypeaheadSelect.js} +16 -14
  23. package/dist/esm/components/Select/TypeaheadSelect.js.map +1 -0
  24. package/dist/esm/components/Select/index.d.ts +2 -2
  25. package/dist/esm/components/Select/index.js +2 -2
  26. package/dist/js/components/Dropdown/{DropdownSimple.d.ts → SimpleDropdown.d.ts} +11 -6
  27. package/dist/js/components/Dropdown/SimpleDropdown.d.ts.map +1 -0
  28. package/dist/js/components/Dropdown/{DropdownSimple.js → SimpleDropdown.js} +14 -8
  29. package/dist/js/components/Dropdown/SimpleDropdown.js.map +1 -0
  30. package/dist/js/components/Dropdown/index.d.ts +1 -1
  31. package/dist/js/components/Dropdown/index.js +1 -1
  32. package/dist/js/components/Select/CheckboxSelect.d.ts +7 -3
  33. package/dist/js/components/Select/CheckboxSelect.d.ts.map +1 -1
  34. package/dist/js/components/Select/CheckboxSelect.js +9 -6
  35. package/dist/js/components/Select/CheckboxSelect.js.map +1 -1
  36. package/dist/{esm/components/Select/SelectSimple.d.ts → js/components/Select/SimpleSelect.d.ts} +10 -7
  37. package/dist/js/components/Select/SimpleSelect.d.ts.map +1 -0
  38. package/dist/js/components/Select/{SelectSimple.js → SimpleSelect.js} +14 -10
  39. package/dist/js/components/Select/SimpleSelect.js.map +1 -0
  40. package/dist/js/components/Select/{SelectTypeahead.d.ts → TypeaheadSelect.d.ts} +11 -7
  41. package/dist/js/components/Select/TypeaheadSelect.d.ts.map +1 -0
  42. package/dist/js/components/Select/{SelectTypeahead.js → TypeaheadSelect.js} +18 -16
  43. package/dist/js/components/Select/TypeaheadSelect.js.map +1 -0
  44. package/dist/js/components/Select/index.d.ts +2 -2
  45. package/dist/js/components/Select/index.js +2 -2
  46. package/dist/umd/assets/{output-BrdjX-Jk.css → output-CP_aQiOP.css} +2794 -2794
  47. package/dist/umd/react-templates.min.js +1 -1
  48. package/package.json +7 -7
  49. package/src/components/Dropdown/{DropdownSimple.tsx → SimpleDropdown.tsx} +28 -11
  50. package/src/components/Dropdown/__tests__/{DropdownSimple.test.tsx → SimpleDropdown.test.tsx} +35 -23
  51. package/src/components/Dropdown/__tests__/__snapshots__/{DropdownSimple.test.tsx.snap → SimpleDropdown.test.tsx.snap} +6 -0
  52. package/src/components/Dropdown/examples/DropdownTemplates.md +4 -16
  53. package/src/components/Dropdown/examples/{DropdownSimpleExample.tsx → SimpleDropdownExample.tsx} +7 -7
  54. package/src/components/Dropdown/index.ts +1 -1
  55. package/src/components/Select/CheckboxSelect.tsx +18 -7
  56. package/src/components/Select/{SelectSimple.tsx → SimpleSelect.tsx} +27 -14
  57. package/src/components/Select/{SelectTypeahead.tsx → TypeaheadSelect.tsx} +32 -27
  58. package/src/components/Select/{CheckboxSelect.test.tsx → __tests__/CheckboxSelect.test.tsx} +29 -1
  59. package/src/components/Select/{CheckboxSelectSnapshots.test.tsx → __tests__/CheckboxSelectSnapshots.test.tsx} +1 -1
  60. package/src/components/Select/__tests__/SimpleSelect.test.tsx +243 -0
  61. package/src/components/Select/{__snapshots__ → __tests__/__snapshots__}/CheckboxSelectSnapshots.test.tsx.snap +6 -1
  62. package/src/components/Select/__tests__/__snapshots__/SimpleSelect.test.tsx.snap +170 -0
  63. package/src/components/Select/examples/CheckboxSelectDemo.tsx +1 -1
  64. package/src/components/Select/examples/SelectTemplates.md +5 -5
  65. package/src/components/Select/examples/{SelectSimpleDemo.tsx → SimpleSelectDemo.tsx} +6 -6
  66. package/src/components/Select/examples/{SelectTypeaheadDemo.tsx → TypeaheadSelectDemo.tsx} +3 -3
  67. package/src/components/Select/index.ts +2 -2
  68. package/dist/esm/components/Dropdown/DropdownSimple.d.ts.map +0 -1
  69. package/dist/esm/components/Dropdown/DropdownSimple.js.map +0 -1
  70. package/dist/esm/components/Select/SelectSimple.d.ts.map +0 -1
  71. package/dist/esm/components/Select/SelectSimple.js.map +0 -1
  72. package/dist/esm/components/Select/SelectTypeahead.d.ts.map +0 -1
  73. package/dist/esm/components/Select/SelectTypeahead.js.map +0 -1
  74. package/dist/js/components/Dropdown/DropdownSimple.d.ts.map +0 -1
  75. package/dist/js/components/Dropdown/DropdownSimple.js.map +0 -1
  76. package/dist/js/components/Select/SelectSimple.d.ts.map +0 -1
  77. package/dist/js/components/Select/SelectSimple.js.map +0 -1
  78. package/dist/js/components/Select/SelectTypeahead.d.ts.map +0 -1
  79. package/dist/js/components/Select/SelectTypeahead.js.map +0 -1
@@ -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 { DropdownSimple } from '../DropdownSimple';
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(<DropdownSimple toggleContent="Dropdown" />);
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(<DropdownSimple toggleContent="Dropdown" isDisabled />);
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(<DropdownSimple toggleContent="Dropdown" toggleVariant="plain" />);
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(<DropdownSimple toggleContent="Dropdown" toggleAriaLabel="Aria label content" />);
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(<DropdownSimple onToggle={onToggle} toggleContent="Dropdown" />);
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
- <DropdownSimple initialItems={items} onToggle={onToggle} toggleContent="Dropdown" />
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(<DropdownSimple initialItems={items} toggleContent="Dropdown" onSelect={onSelect} />);
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(<DropdownSimple initialItems={items} toggleContent="Dropdown" onSelect={onSelect} />);
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(<DropdownSimple toggleContent="Dropdown" />);
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(<DropdownSimple isToggleFullWidth toggleContent="Dropdown" />);
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(<DropdownSimple initialItems={items} toggleContent="Dropdown" />);
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(<DropdownSimple shouldFocusToggleOnSelect initialItems={items} toggleContent="Dropdown" />);
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(<DropdownSimple toggleContent="Dropdown" />);
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(<DropdownSimple initialItems={items} toggleContent="Dropdown" />);
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(<DropdownSimple initialItems={items} toggleContent="Dropdown" />);
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(<DropdownSimple initialItems={items} toggleContent="Dropdown" />);
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(<DropdownSimple initialItems={items} toggleContent="Dropdown" />);
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(<DropdownSimple initialItems={items} toggleContent="Dropdown" />);
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(<DropdownSimple initialItems={items} toggleContent="Dropdown" />);
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(<DropdownSimple initialItems={items} toggleContent="Dropdown" />);
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(<DropdownSimple initialItems={items} toggleContent="Dropdown" />);
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(<DropdownSimple ouiaId={4} initialItems={items} toggleContent="Dropdown" />);
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: ['DropdownSimple', 'DropdownSimpleItem']
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
- 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';
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="./DropdownSimpleExample.tsx"
22
+ ```ts file="./SimpleDropdownExample.tsx"
35
23
 
36
24
  ```
@@ -1,12 +1,12 @@
1
1
  import React from 'react';
2
2
  import { Checkbox, Flex, FlexItem } from '@patternfly/react-core';
3
- import { DropdownSimple, DropdownSimpleItem } from '@patternfly/react-templates';
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 DropdownSimpleExample: React.FunctionComponent = () => {
6
+ export const SimpleDropdownExample: React.FunctionComponent = () => {
7
7
  const [isDisabled, setIsDisabled] = React.useState(false);
8
8
 
9
- const items: DropdownSimpleItem[] = [
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 simple toggles"
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
- <DropdownSimple initialItems={items} isDisabled={isDisabled} toggleContent="Dropdown" />
31
+ <SimpleDropdown initialItems={items} isDisabled={isDisabled} toggleContent="Dropdown" />
32
32
  </FlexItem>
33
33
  <FlexItem>
34
- <DropdownSimple
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
- <DropdownSimple
42
+ <SimpleDropdown
43
43
  toggleVariant="plain"
44
44
  initialItems={items}
45
45
  isDisabled={isDisabled}
@@ -1 +1 @@
1
- export * from './DropdownSimple';
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 the selected option. */
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 {...props} value={value} key={value} hasCheckbox isSelected={isSelected}>
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: '200px'
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) => setIsOpen(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 { Select, SelectList, SelectOption, SelectOptionProps } from '@patternfly/react-core/dist/esm/components/Select';
3
- import { MenuToggle, MenuToggleElement } from '@patternfly/react-core/dist/esm/components/MenuToggle';
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 SelectSimpleOption extends Omit<SelectOptionProps, 'content'> {
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 SelectSimpleProps {
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?: SelectSimpleOption[];
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 SelectSimpleBase: React.FunctionComponent<SelectSimpleProps> = ({
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
- }: SelectSimpleProps) => {
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 {...props} value={value} key={value} isSelected={isSelected}>
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) => setIsOpen(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 SelectSimple = React.forwardRef((props: SelectSimpleProps, ref: React.Ref<any>) => (
97
- <SelectSimpleBase {...props} innerRef={ref} />
109
+ export const SimpleSelect = React.forwardRef((props: SimpleSelectProps, ref: React.Ref<any>) => (
110
+ <SimpleSelectBase {...props} innerRef={ref} />
98
111
  ));
99
112
 
100
- SelectSimple.displayName = 'SelectSimple';
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 SelectTypeaheadOption extends Omit<SelectOptionProps, 'content'> {
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 SelectTypeaheadProps {
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: SelectTypeaheadOption[];
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 SelectTypeaheadBase: React.FunctionComponent<SelectTypeaheadProps> = ({
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
- }: SelectTypeaheadProps) => {
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<SelectTypeaheadOption[]>(initialOptions);
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: SelectTypeaheadOption[] = initialOptions;
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(createItemId(focusedItem.value));
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: SelectTypeaheadOption
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 id="select-typeahead-listbox">
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
- SelectTypeaheadBase.displayName = 'SelectTypeaheadBase';
320
+ TypeaheadSelectBase.displayName = 'TypeaheadSelectBase';
316
321
 
317
- export const SelectTypeahead = React.forwardRef((props: SelectTypeaheadProps, ref: React.Ref<any>) => (
318
- <SelectTypeaheadBase {...props} innerRef={ref} />
322
+ export const TypeaheadSelect = React.forwardRef((props: TypeaheadSelectProps, ref: React.Ref<any>) => (
323
+ <TypeaheadSelectBase {...props} innerRef={ref} />
319
324
  ));
320
325
 
321
- SelectTypeahead.displayName = 'SelectTypeahead';
326
+ TypeaheadSelect.displayName = 'TypeaheadSelect';