@patternfly/react-templates 1.1.0-prerelease.9 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/CHANGELOG.md +154 -0
  2. package/components/package.json +1 -1
  3. package/dist/dynamic/components/Dropdown/package.json +1 -1
  4. package/dist/dynamic/components/Select/package.json +1 -1
  5. package/dist/dynamic-modules.json +14 -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 +14 -6
  15. package/dist/esm/components/Select/CheckboxSelect.js.map +1 -1
  16. package/dist/esm/components/Select/MultiTypeaheadSelect.d.ts +33 -0
  17. package/dist/esm/components/Select/MultiTypeaheadSelect.d.ts.map +1 -0
  18. package/dist/esm/components/Select/{SelectTypeahead.js → MultiTypeaheadSelect.js} +52 -45
  19. package/dist/esm/components/Select/MultiTypeaheadSelect.js.map +1 -0
  20. package/dist/{js/components/Select/SelectSimple.d.ts → esm/components/Select/SimpleSelect.d.ts} +12 -7
  21. package/dist/esm/components/Select/SimpleSelect.d.ts.map +1 -0
  22. package/dist/esm/components/Select/SimpleSelect.js +39 -0
  23. package/dist/esm/components/Select/SimpleSelect.js.map +1 -0
  24. package/dist/esm/components/Select/TypeaheadSelect.d.ts +47 -0
  25. package/dist/esm/components/Select/TypeaheadSelect.d.ts.map +1 -0
  26. package/dist/esm/components/Select/TypeaheadSelect.js +228 -0
  27. package/dist/esm/components/Select/TypeaheadSelect.js.map +1 -0
  28. package/dist/esm/components/Select/index.d.ts +3 -2
  29. package/dist/esm/components/Select/index.d.ts.map +1 -1
  30. package/dist/esm/components/Select/index.js +3 -2
  31. package/dist/esm/components/Select/index.js.map +1 -1
  32. package/dist/js/components/Dropdown/{DropdownSimple.d.ts → SimpleDropdown.d.ts} +11 -6
  33. package/dist/js/components/Dropdown/SimpleDropdown.d.ts.map +1 -0
  34. package/dist/js/components/Dropdown/{DropdownSimple.js → SimpleDropdown.js} +14 -9
  35. package/dist/js/components/Dropdown/SimpleDropdown.js.map +1 -0
  36. package/dist/js/components/Dropdown/index.d.ts +1 -1
  37. package/dist/js/components/Dropdown/index.js +1 -1
  38. package/dist/js/components/Select/CheckboxSelect.d.ts +7 -3
  39. package/dist/js/components/Select/CheckboxSelect.d.ts.map +1 -1
  40. package/dist/js/components/Select/CheckboxSelect.js +14 -6
  41. package/dist/js/components/Select/CheckboxSelect.js.map +1 -1
  42. package/dist/js/components/Select/MultiTypeaheadSelect.d.ts +33 -0
  43. package/dist/js/components/Select/MultiTypeaheadSelect.d.ts.map +1 -0
  44. package/dist/js/components/Select/{SelectTypeahead.js → MultiTypeaheadSelect.js} +53 -46
  45. package/dist/js/components/Select/MultiTypeaheadSelect.js.map +1 -0
  46. package/dist/{esm/components/Select/SelectSimple.d.ts → js/components/Select/SimpleSelect.d.ts} +12 -7
  47. package/dist/js/components/Select/SimpleSelect.d.ts.map +1 -0
  48. package/dist/js/components/Select/SimpleSelect.js +42 -0
  49. package/dist/js/components/Select/SimpleSelect.js.map +1 -0
  50. package/dist/js/components/Select/TypeaheadSelect.d.ts +47 -0
  51. package/dist/js/components/Select/TypeaheadSelect.d.ts.map +1 -0
  52. package/dist/js/components/Select/TypeaheadSelect.js +232 -0
  53. package/dist/js/components/Select/TypeaheadSelect.js.map +1 -0
  54. package/dist/js/components/Select/index.d.ts +3 -2
  55. package/dist/js/components/Select/index.d.ts.map +1 -1
  56. package/dist/js/components/Select/index.js +3 -2
  57. package/dist/js/components/Select/index.js.map +1 -1
  58. package/dist/umd/assets/output-1Oo11Ujj.css +26066 -0
  59. package/dist/umd/react-templates.min.js +1 -1
  60. package/package.json +7 -10
  61. package/rollup.config.mjs +8 -0
  62. package/src/components/Dropdown/{DropdownSimple.tsx → SimpleDropdown.tsx} +28 -11
  63. package/src/components/Dropdown/__tests__/{DropdownSimple.test.tsx → SimpleDropdown.test.tsx} +35 -23
  64. package/src/components/Dropdown/__tests__/__snapshots__/{DropdownSimple.test.tsx.snap → SimpleDropdown.test.tsx.snap} +6 -0
  65. package/src/components/Dropdown/examples/DropdownTemplates.md +4 -16
  66. package/src/components/Dropdown/examples/{DropdownSimpleExample.tsx → SimpleDropdownExample.tsx} +7 -7
  67. package/src/components/Dropdown/index.ts +1 -1
  68. package/src/components/Select/CheckboxSelect.tsx +23 -7
  69. package/src/components/Select/{SelectTypeahead.tsx → MultiTypeaheadSelect.tsx} +91 -64
  70. package/src/components/Select/{SelectSimple.tsx → SimpleSelect.tsx} +39 -18
  71. package/src/components/Select/TypeaheadSelect.tsx +393 -0
  72. package/src/components/Select/{CheckboxSelect.test.tsx → __tests__/CheckboxSelect.test.tsx} +32 -3
  73. package/src/components/Select/{CheckboxSelectSnapshots.test.tsx → __tests__/CheckboxSelectSnapshots.test.tsx} +1 -1
  74. package/src/components/Select/__tests__/MultiTypeaheadSelect.test.tsx +412 -0
  75. package/src/components/Select/__tests__/SimpleSelect.test.tsx +242 -0
  76. package/src/components/Select/__tests__/TypeaheadSelect.test.tsx +372 -0
  77. package/src/components/Select/{__snapshots__ → __tests__/__snapshots__}/CheckboxSelectSnapshots.test.tsx.snap +7 -2
  78. package/src/components/Select/__tests__/__snapshots__/MultiTypeaheadSelect.test.tsx.snap +180 -0
  79. package/src/components/Select/__tests__/__snapshots__/SimpleSelect.test.tsx.snap +170 -0
  80. package/src/components/Select/__tests__/__snapshots__/TypeaheadSelect.test.tsx.snap +180 -0
  81. package/src/components/Select/examples/CheckboxSelectDemo.tsx +25 -8
  82. package/src/components/Select/examples/MultiTypeaheadSelectDemo.tsx +35 -0
  83. package/src/components/Select/examples/SelectTemplates.md +14 -5
  84. package/src/components/Select/examples/SimpleSelectDemo.tsx +36 -0
  85. package/src/components/Select/examples/TypeaheadSelectDemo.tsx +67 -0
  86. package/src/components/Select/index.ts +3 -2
  87. package/dist/esm/components/Dropdown/DropdownSimple.d.ts.map +0 -1
  88. package/dist/esm/components/Dropdown/DropdownSimple.js.map +0 -1
  89. package/dist/esm/components/Select/SelectSimple.d.ts.map +0 -1
  90. package/dist/esm/components/Select/SelectSimple.js +0 -31
  91. package/dist/esm/components/Select/SelectSimple.js.map +0 -1
  92. package/dist/esm/components/Select/SelectTypeahead.d.ts +0 -29
  93. package/dist/esm/components/Select/SelectTypeahead.d.ts.map +0 -1
  94. package/dist/esm/components/Select/SelectTypeahead.js.map +0 -1
  95. package/dist/js/components/Dropdown/DropdownSimple.d.ts.map +0 -1
  96. package/dist/js/components/Dropdown/DropdownSimple.js.map +0 -1
  97. package/dist/js/components/Select/SelectSimple.d.ts.map +0 -1
  98. package/dist/js/components/Select/SelectSimple.js +0 -34
  99. package/dist/js/components/Select/SelectSimple.js.map +0 -1
  100. package/dist/js/components/Select/SelectTypeahead.d.ts +0 -29
  101. package/dist/js/components/Select/SelectTypeahead.d.ts.map +0 -1
  102. package/dist/js/components/Select/SelectTypeahead.js.map +0 -1
  103. package/rollup.config.js +0 -7
  104. package/src/components/Select/examples/SelectSimpleDemo.tsx +0 -26
  105. package/src/components/Select/examples/SelectTypeaheadDemo.tsx +0 -21
@@ -3,13 +3,14 @@ import {
3
3
  Dropdown,
4
4
  DropdownItem,
5
5
  DropdownList,
6
- DropdownItemProps
6
+ DropdownItemProps,
7
+ DropdownProps
7
8
  } from '@patternfly/react-core/dist/esm/components/Dropdown';
8
- import { MenuToggle, MenuToggleElement } from '@patternfly/react-core/dist/esm/components/MenuToggle';
9
+ import { MenuToggle, MenuToggleElement, MenuToggleProps } from '@patternfly/react-core/dist/esm/components/MenuToggle';
9
10
  import { Divider } from '@patternfly/react-core/dist/esm/components/Divider';
10
11
  import { OUIAProps } from '@patternfly/react-core/dist/esm/helpers';
11
12
 
12
- export interface DropdownSimpleItem extends Omit<DropdownItemProps, 'content'> {
13
+ export interface SimpleDropdownItem extends Omit<DropdownItemProps, 'content'> {
13
14
  /** Content of the dropdown item. If the isDivider prop is true, this prop will be ignored. */
14
15
  content?: React.ReactNode;
15
16
  /** Unique identifier for the dropdown item, which is used in the dropdown onSelect callback */
@@ -24,9 +25,9 @@ export interface DropdownSimpleItem extends Omit<DropdownItemProps, 'content'> {
24
25
  isDivider?: boolean;
25
26
  }
26
27
 
27
- export interface DropdownSimpleProps extends OUIAProps {
28
+ export interface SimpleDropdownProps extends Omit<DropdownProps, 'toggle'>, OUIAProps {
28
29
  /** Initial items of the dropdown. */
29
- initialItems?: DropdownSimpleItem[];
30
+ initialItems?: SimpleDropdownItem[];
30
31
  /** @hide Forwarded ref */
31
32
  innerRef?: React.Ref<any>;
32
33
  /** Flag indicating the dropdown should be disabled. */
@@ -47,9 +48,13 @@ export interface DropdownSimpleProps extends OUIAProps {
47
48
  toggleContent: React.ReactNode;
48
49
  /** Variant style of the dropdown toggle. */
49
50
  toggleVariant?: 'default' | 'plain' | 'plainText';
51
+ /** Width of the toggle. */
52
+ toggleWidth?: string;
53
+ /** Additional props passed to the toggle. */
54
+ toggleProps?: MenuToggleProps;
50
55
  }
51
56
 
52
- const DropdownSimpleBase: React.FunctionComponent<DropdownSimpleProps> = ({
57
+ const SimpleDropdownBase: React.FunctionComponent<SimpleDropdownProps> = ({
53
58
  innerRef,
54
59
  initialItems,
55
60
  onSelect: onSelectProp,
@@ -59,13 +64,16 @@ const DropdownSimpleBase: React.FunctionComponent<DropdownSimpleProps> = ({
59
64
  toggleContent,
60
65
  isToggleFullWidth,
61
66
  toggleVariant = 'default',
67
+ toggleWidth,
68
+ toggleProps,
62
69
  shouldFocusToggleOnSelect,
63
70
  ...props
64
- }: DropdownSimpleProps) => {
71
+ }: SimpleDropdownProps) => {
65
72
  const [isOpen, setIsOpen] = React.useState(false);
66
73
 
67
74
  const onSelect = (event: React.MouseEvent<Element, MouseEvent>, value: string | number) => {
68
75
  onSelectProp && onSelectProp(event, value);
76
+ onToggleProp && onToggleProp(false);
69
77
  setIsOpen(false);
70
78
  };
71
79
 
@@ -83,6 +91,12 @@ const DropdownSimpleBase: React.FunctionComponent<DropdownSimpleProps> = ({
83
91
  variant={toggleVariant}
84
92
  aria-label={toggleAriaLabel}
85
93
  isFullWidth={isToggleFullWidth}
94
+ style={
95
+ {
96
+ width: toggleWidth
97
+ } as React.CSSProperties
98
+ }
99
+ {...toggleProps}
86
100
  >
87
101
  {toggleContent}
88
102
  </MenuToggle>
@@ -106,7 +120,10 @@ const DropdownSimpleBase: React.FunctionComponent<DropdownSimpleProps> = ({
106
120
  isOpen={isOpen}
107
121
  onSelect={onSelect}
108
122
  shouldFocusToggleOnSelect={shouldFocusToggleOnSelect}
109
- onOpenChange={(isOpen) => setIsOpen(isOpen)}
123
+ onOpenChange={(isOpen) => {
124
+ onToggleProp && onToggleProp(isOpen);
125
+ setIsOpen(isOpen);
126
+ }}
110
127
  ref={innerRef}
111
128
  {...props}
112
129
  >
@@ -115,8 +132,8 @@ const DropdownSimpleBase: React.FunctionComponent<DropdownSimpleProps> = ({
115
132
  );
116
133
  };
117
134
 
118
- export const DropdownSimple = React.forwardRef((props: DropdownSimpleProps, ref: React.Ref<any>) => (
119
- <DropdownSimpleBase {...props} innerRef={ref} />
135
+ export const SimpleDropdown = React.forwardRef((props: SimpleDropdownProps, ref: React.Ref<any>) => (
136
+ <SimpleDropdownBase {...props} innerRef={ref} />
120
137
  ));
121
138
 
122
- DropdownSimple.displayName = 'DropdownSimple';
139
+ SimpleDropdown.displayName = 'SimpleDropdown';
@@ -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-v5-c-menu-toggle pf-m-expanded"
8
+ data-ouia-component-id="OUIA-Generated-MenuToggle-default-23"
9
+ data-ouia-component-type="PF5/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-v5-c-menu-toggle"
120
+ data-ouia-component-id="OUIA-Generated-MenuToggle-default-14"
121
+ data-ouia-component-type="PF5/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,16 +44,23 @@ 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);
44
52
  const [selected, setSelected] = React.useState<string[]>([]);
45
53
 
54
+ React.useEffect(() => {
55
+ const selectedOptions = initialOptions?.filter((option) => option.selected);
56
+ setSelected(selectedOptions?.map((selectedOption) => String(selectedOption.value)) ?? []);
57
+ }, [initialOptions]);
58
+
46
59
  const checkboxSelectOptions = initialOptions?.map((option) => {
47
60
  const { content, value, ...props } = option;
48
61
  const isSelected = selected.includes(`${value}`);
49
62
  return (
50
- <SelectOption {...props} value={value} key={value} hasCheckbox isSelected={isSelected}>
63
+ <SelectOption value={value} key={value} hasCheckbox isSelected={isSelected} {...props}>
51
64
  {content}
52
65
  </SelectOption>
53
66
  );
@@ -83,9 +96,10 @@ const CheckboxSelectBase: React.FunctionComponent<CheckboxSelectProps> = ({
83
96
  isDisabled={isDisabled}
84
97
  style={
85
98
  {
86
- width: '200px'
99
+ width: toggleWidth
87
100
  } as React.CSSProperties
88
101
  }
102
+ {...toggleProps}
89
103
  >
90
104
  {toggleContent || defaultToggleContent}
91
105
  </MenuToggle>
@@ -93,11 +107,13 @@ const CheckboxSelectBase: React.FunctionComponent<CheckboxSelectProps> = ({
93
107
 
94
108
  return (
95
109
  <Select
96
- id="checkbox-select"
97
110
  isOpen={isOpen}
98
111
  selected={selected}
99
112
  onSelect={onSelect}
100
- onOpenChange={(isOpen) => setIsOpen(isOpen)}
113
+ onOpenChange={(isOpen) => {
114
+ onToggle && onToggle(isOpen);
115
+ setIsOpen(isOpen);
116
+ }}
101
117
  toggle={toggle}
102
118
  ref={innerRef}
103
119
  role="menu"