@patternfly/react-core 4.198.12 → 4.198.15

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 (129) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/dist/esm/components/Form/FormFieldGroup.d.ts +1 -1
  3. package/dist/esm/components/Form/FormFieldGroupExpandable.d.ts +2 -2
  4. package/dist/esm/components/Form/FormFieldGroupHeader.d.ts +3 -1
  5. package/dist/esm/components/Form/FormFieldGroupHeader.d.ts.map +1 -1
  6. package/dist/esm/components/Form/FormFieldGroupHeader.js.map +1 -1
  7. package/dist/esm/components/Form/InternalFormFieldGroup.d.ts +2 -2
  8. package/dist/esm/components/Label/Label.d.ts.map +1 -1
  9. package/dist/esm/components/Label/Label.js +5 -2
  10. package/dist/esm/components/Label/Label.js.map +1 -1
  11. package/dist/esm/components/Menu/MenuItem.d.ts +3 -1
  12. package/dist/esm/components/Menu/MenuItem.d.ts.map +1 -1
  13. package/dist/esm/components/Menu/MenuItem.js +4 -3
  14. package/dist/esm/components/Menu/MenuItem.js.map +1 -1
  15. package/dist/esm/components/Nav/NavGroup.d.ts +1 -1
  16. package/dist/esm/components/Nav/NavGroup.d.ts.map +1 -1
  17. package/dist/esm/components/Nav/NavGroup.js +7 -2
  18. package/dist/esm/components/Nav/NavGroup.js.map +1 -1
  19. package/dist/esm/components/NotificationDrawer/NotificationDrawer.d.ts +3 -1
  20. package/dist/esm/components/NotificationDrawer/NotificationDrawer.d.ts.map +1 -1
  21. package/dist/esm/components/NotificationDrawer/NotificationDrawer.js +4 -3
  22. package/dist/esm/components/NotificationDrawer/NotificationDrawer.js.map +1 -1
  23. package/dist/esm/components/Tabs/Tab.d.ts +3 -1
  24. package/dist/esm/components/Tabs/Tab.d.ts.map +1 -1
  25. package/dist/esm/components/Tabs/Tab.js +4 -3
  26. package/dist/esm/components/Tabs/Tab.js.map +1 -1
  27. package/dist/esm/components/Tabs/TabButton.d.ts +2 -0
  28. package/dist/esm/components/Tabs/TabButton.d.ts.map +1 -1
  29. package/dist/esm/components/Tabs/TabButton.js +2 -2
  30. package/dist/esm/components/Tabs/TabButton.js.map +1 -1
  31. package/dist/esm/components/Tile/Tile.d.ts.map +1 -1
  32. package/dist/esm/components/Tile/Tile.js +1 -1
  33. package/dist/esm/components/Tile/Tile.js.map +1 -1
  34. package/dist/esm/components/Toolbar/Toolbar.d.ts +3 -1
  35. package/dist/esm/components/Toolbar/Toolbar.d.ts.map +1 -1
  36. package/dist/esm/components/Toolbar/Toolbar.js +4 -3
  37. package/dist/esm/components/Toolbar/Toolbar.js.map +1 -1
  38. package/dist/esm/components/Toolbar/ToolbarChipGroupContent.d.ts +2 -0
  39. package/dist/esm/components/Toolbar/ToolbarChipGroupContent.d.ts.map +1 -1
  40. package/dist/esm/components/Toolbar/ToolbarChipGroupContent.js +4 -3
  41. package/dist/esm/components/Toolbar/ToolbarChipGroupContent.js.map +1 -1
  42. package/dist/esm/components/Toolbar/ToolbarExpandableContent.d.ts.map +1 -1
  43. package/dist/esm/components/Toolbar/ToolbarExpandableContent.js +4 -3
  44. package/dist/esm/components/Toolbar/ToolbarExpandableContent.js.map +1 -1
  45. package/dist/esm/components/Toolbar/ToolbarUtils.d.ts +1 -0
  46. package/dist/esm/components/Toolbar/ToolbarUtils.d.ts.map +1 -1
  47. package/dist/esm/components/Toolbar/ToolbarUtils.js.map +1 -1
  48. package/dist/js/components/Form/FormFieldGroup.d.ts +1 -1
  49. package/dist/js/components/Form/FormFieldGroupExpandable.d.ts +2 -2
  50. package/dist/js/components/Form/FormFieldGroupHeader.d.ts +3 -1
  51. package/dist/js/components/Form/FormFieldGroupHeader.d.ts.map +1 -1
  52. package/dist/js/components/Form/FormFieldGroupHeader.js.map +1 -1
  53. package/dist/js/components/Form/InternalFormFieldGroup.d.ts +2 -2
  54. package/dist/js/components/Label/Label.d.ts.map +1 -1
  55. package/dist/js/components/Label/Label.js +5 -2
  56. package/dist/js/components/Label/Label.js.map +1 -1
  57. package/dist/js/components/Menu/MenuItem.d.ts +3 -1
  58. package/dist/js/components/Menu/MenuItem.d.ts.map +1 -1
  59. package/dist/js/components/Menu/MenuItem.js +4 -4
  60. package/dist/js/components/Menu/MenuItem.js.map +1 -1
  61. package/dist/js/components/Nav/NavGroup.d.ts +1 -1
  62. package/dist/js/components/Nav/NavGroup.d.ts.map +1 -1
  63. package/dist/js/components/Nav/NavGroup.js +7 -2
  64. package/dist/js/components/Nav/NavGroup.js.map +1 -1
  65. package/dist/js/components/NotificationDrawer/NotificationDrawer.d.ts +3 -1
  66. package/dist/js/components/NotificationDrawer/NotificationDrawer.d.ts.map +1 -1
  67. package/dist/js/components/NotificationDrawer/NotificationDrawer.js +4 -4
  68. package/dist/js/components/NotificationDrawer/NotificationDrawer.js.map +1 -1
  69. package/dist/js/components/Tabs/Tab.d.ts +3 -1
  70. package/dist/js/components/Tabs/Tab.d.ts.map +1 -1
  71. package/dist/js/components/Tabs/Tab.js +4 -3
  72. package/dist/js/components/Tabs/Tab.js.map +1 -1
  73. package/dist/js/components/Tabs/TabButton.d.ts +2 -0
  74. package/dist/js/components/Tabs/TabButton.d.ts.map +1 -1
  75. package/dist/js/components/Tabs/TabButton.js +2 -2
  76. package/dist/js/components/Tabs/TabButton.js.map +1 -1
  77. package/dist/js/components/Tile/Tile.d.ts.map +1 -1
  78. package/dist/js/components/Tile/Tile.js +1 -1
  79. package/dist/js/components/Tile/Tile.js.map +1 -1
  80. package/dist/js/components/Toolbar/Toolbar.d.ts +3 -1
  81. package/dist/js/components/Toolbar/Toolbar.d.ts.map +1 -1
  82. package/dist/js/components/Toolbar/Toolbar.js +4 -3
  83. package/dist/js/components/Toolbar/Toolbar.js.map +1 -1
  84. package/dist/js/components/Toolbar/ToolbarChipGroupContent.d.ts +2 -0
  85. package/dist/js/components/Toolbar/ToolbarChipGroupContent.d.ts.map +1 -1
  86. package/dist/js/components/Toolbar/ToolbarChipGroupContent.js +4 -3
  87. package/dist/js/components/Toolbar/ToolbarChipGroupContent.js.map +1 -1
  88. package/dist/js/components/Toolbar/ToolbarExpandableContent.d.ts.map +1 -1
  89. package/dist/js/components/Toolbar/ToolbarExpandableContent.js +4 -3
  90. package/dist/js/components/Toolbar/ToolbarExpandableContent.js.map +1 -1
  91. package/dist/js/components/Toolbar/ToolbarUtils.d.ts +1 -0
  92. package/dist/js/components/Toolbar/ToolbarUtils.d.ts.map +1 -1
  93. package/dist/js/components/Toolbar/ToolbarUtils.js.map +1 -1
  94. package/dist/umd/react-core.js +38 -25
  95. package/dist/umd/react-core.min.js +1 -1
  96. package/package.json +5 -5
  97. package/src/components/Form/FormFieldGroup.tsx +1 -1
  98. package/src/components/Form/FormFieldGroupExpandable.tsx +2 -2
  99. package/src/components/Form/FormFieldGroupHeader.tsx +5 -1
  100. package/src/components/Form/InternalFormFieldGroup.tsx +2 -2
  101. package/src/components/Form/__tests__/FormFieldGroup.test.tsx +1 -1
  102. package/src/components/Form/__tests__/__snapshots__/FormFieldGroup.test.tsx.snap +1 -1
  103. package/src/components/Form/examples/Form.md +1 -1
  104. package/src/components/Label/Label.tsx +5 -2
  105. package/src/components/Menu/MenuItem.tsx +9 -1
  106. package/src/components/Menu/examples/Menu.md +57 -32
  107. package/src/components/Nav/NavGroup.tsx +20 -9
  108. package/src/components/Nav/examples/Nav.md +2 -0
  109. package/src/components/NotificationDrawer/NotificationDrawer.tsx +8 -2
  110. package/src/components/NotificationDrawer/__tests__/__snapshots__/NotificationDrawer.test.tsx.snap +1 -1
  111. package/src/components/Tabs/Tab.tsx +31 -24
  112. package/src/components/Tabs/TabButton.tsx +5 -1
  113. package/src/components/Tabs/examples/Tabs.md +527 -256
  114. package/src/components/Tile/Tile.tsx +3 -0
  115. package/src/components/Tile/__tests__/__snapshots__/Tile.test.tsx.snap +9 -0
  116. package/src/components/Tile/examples/Tile.md +41 -39
  117. package/src/components/Toolbar/Toolbar.tsx +7 -2
  118. package/src/components/Toolbar/ToolbarChipGroupContent.tsx +5 -1
  119. package/src/components/Toolbar/ToolbarExpandableContent.tsx +3 -2
  120. package/src/components/Toolbar/ToolbarUtils.tsx +1 -0
  121. package/src/components/Toolbar/__tests__/ToolbarToggleGroup.test.tsx +71 -1
  122. package/src/components/Toolbar/__tests__/__snapshots__/ToolbarToggleGroup.test.tsx.snap +394 -0
  123. package/src/components/Toolbar/examples/Toolbar.md +8 -1
  124. package/src/components/Toolbar/examples/ToolbarCustomChipGroupContent.tsx +166 -0
  125. package/src/demos/Nav.md +7 -3
  126. package/src/demos/NotificationDrawer/NotificationDrawer.md +31 -4
  127. package/src/demos/Page/Page.md +7 -3
  128. package/src/demos/TileDemo.md +17 -35
  129. package/src/demos/examples/DashboardHeader.js +2 -1
@@ -33,6 +33,9 @@ export const Tile: React.FunctionComponent<TileProps> = ({
33
33
  ...props
34
34
  }: TileProps) => (
35
35
  <div
36
+ role="option"
37
+ aria-selected={isSelected}
38
+ {...(isDisabled && { 'aria-disabled': isDisabled })}
36
39
  className={css(
37
40
  styles.tile,
38
41
  isSelected && styles.modifiers.selected,
@@ -4,6 +4,7 @@ exports[`Tile basic 1`] = `
4
4
  <div>
5
5
  <div
6
6
  class="pf-c-tile"
7
+ role="option"
7
8
  tabindex="0"
8
9
  >
9
10
  <div
@@ -22,7 +23,9 @@ exports[`Tile basic 1`] = `
22
23
  exports[`Tile renders disabled 1`] = `
23
24
  <div>
24
25
  <div
26
+ aria-disabled="true"
25
27
  class="pf-c-tile pf-m-disabled"
28
+ role="option"
26
29
  tabindex="0"
27
30
  >
28
31
  <div
@@ -41,7 +44,9 @@ exports[`Tile renders disabled 1`] = `
41
44
  exports[`Tile renders selected 1`] = `
42
45
  <div>
43
46
  <div
47
+ aria-selected="true"
44
48
  class="pf-c-tile pf-m-selected"
49
+ role="option"
45
50
  tabindex="0"
46
51
  >
47
52
  <div
@@ -61,6 +66,7 @@ exports[`Tile renders with icon 1`] = `
61
66
  <div>
62
67
  <div
63
68
  class="pf-c-tile"
69
+ role="option"
64
70
  tabindex="0"
65
71
  >
66
72
  <div
@@ -97,6 +103,7 @@ exports[`Tile renders with stacked icon 1`] = `
97
103
  <div>
98
104
  <div
99
105
  class="pf-c-tile"
106
+ role="option"
100
107
  tabindex="0"
101
108
  >
102
109
  <div
@@ -133,6 +140,7 @@ exports[`Tile renders with stacked large icon 1`] = `
133
140
  <div>
134
141
  <div
135
142
  class="pf-c-tile pf-m-display-lg"
143
+ role="option"
136
144
  tabindex="0"
137
145
  >
138
146
  <div
@@ -169,6 +177,7 @@ exports[`Tile renders with subtext 1`] = `
169
177
  <div>
170
178
  <div
171
179
  class="pf-c-tile"
180
+ role="option"
172
181
  tabindex="0"
173
182
  >
174
183
  <div
@@ -9,7 +9,6 @@ beta: true
9
9
  import PlusIcon from '@patternfly/react-icons/dist/esm/icons/plus-icon';
10
10
  import BellIcon from '@patternfly/react-icons/dist/esm/icons/bell-icon';
11
11
 
12
-
13
12
  ## Examples
14
13
 
15
14
  Keyboard interaction patterns and a11y is implemented in the Tile demos, located in the [Demo section](/documentation/react/demos/tiledemo).
@@ -20,29 +19,30 @@ Keyboard interaction patterns and a11y is implemented in the Tile demos, located
20
19
  import React from 'react';
21
20
  import { Tile } from '@patternfly/react-core';
22
21
 
23
- <React.Fragment>
24
- <Tile title="Default" />
22
+ <div role="listbox" aria-label="Basic tiles">
23
+ <Tile title="Default" isSelected={false} />
25
24
  <Tile title="Selected" isSelected />
26
- <Tile title="Disabled" isDisabled />
27
- </React.Fragment>
25
+ <Tile title="Disabled" isDisabled isSelected={false} />
26
+ </div>;
28
27
  ```
29
28
 
30
-
31
29
  ### With subtext
32
30
 
33
31
  ```js
34
32
  import React from 'react';
35
33
  import { Tile } from '@patternfly/react-core';
36
34
 
37
- <React.Fragment>
38
- <Tile title="Default">Subtext goes here</Tile>{' '}
35
+ <div role="listbox" aria-label="Tiles with subtext">
36
+ <Tile title="Default" isSelected={false}>
37
+ Subtext goes here
38
+ </Tile>{' '}
39
39
  <Tile title="Selected" isSelected>
40
40
  Subtext goes here
41
41
  </Tile>{' '}
42
- <Tile title="Disabled" isDisabled>
42
+ <Tile title="Disabled" isDisabled isSelected={false}>
43
43
  Subtext goes here
44
44
  </Tile>
45
- </React.Fragment>
45
+ </div>;
46
46
  ```
47
47
 
48
48
  ### With icon
@@ -52,17 +52,17 @@ import React from 'react';
52
52
  import { Tile } from '@patternfly/react-core';
53
53
  import PlusIcon from '@patternfly/react-icons/dist/esm/icons/plus-icon';
54
54
 
55
- <React.Fragment>
56
- <Tile title="Default" icon={<PlusIcon />}>
55
+ <div role="listbox" aria-label="Tiles with icon">
56
+ <Tile title="Default" icon={<PlusIcon />} isSelected={false}>
57
57
  Subtext goes here
58
58
  </Tile>{' '}
59
59
  <Tile title="Selected" icon={<PlusIcon />} isSelected>
60
60
  Subtext goes here
61
61
  </Tile>{' '}
62
- <Tile title="Disabled" icon={<PlusIcon />} isDisabled>
62
+ <Tile title="Disabled" icon={<PlusIcon />} isDisabled isSelected={false}>
63
63
  Subtext goes here
64
64
  </Tile>
65
- </React.Fragment>
65
+ </div>;
66
66
  ```
67
67
 
68
68
  ### Stacked
@@ -72,17 +72,17 @@ import React from 'react';
72
72
  import { Tile } from '@patternfly/react-core';
73
73
  import BellIcon from '@patternfly/react-icons/dist/esm/icons/bell-icon';
74
74
 
75
- <React.Fragment>
76
- <Tile title="Default" icon={<BellIcon />} isStacked>
75
+ <div role="listbox" aria-label="Stacked tiles">
76
+ <Tile title="Default" icon={<BellIcon />} isStacked isSelected={false}>
77
77
  Subtext goes here
78
78
  </Tile>{' '}
79
79
  <Tile title="Selected" icon={<BellIcon />} isStacked isSelected>
80
80
  Subtext goes here
81
81
  </Tile>{' '}
82
- <Tile title="Disabled" icon={<BellIcon />} isStacked isDisabled>
82
+ <Tile title="Disabled" icon={<BellIcon />} isStacked isDisabled isSelected={false}>
83
83
  Subtext goes here
84
84
  </Tile>
85
- </React.Fragment>
85
+ </div>;
86
86
  ```
87
87
 
88
88
  ### Stacked with large icons
@@ -92,17 +92,17 @@ import React from 'react';
92
92
  import { Tile } from '@patternfly/react-core';
93
93
  import BellIcon from '@patternfly/react-icons/dist/esm/icons/bell-icon';
94
94
 
95
- <React.Fragment>
96
- <Tile title="Default" icon={<BellIcon />} isStacked isDisplayLarge>
95
+ <div role="listbox" aria-label="Stacked tiles with large icons">
96
+ <Tile title="Default" icon={<BellIcon />} isStacked isDisplayLarge isSelected={false}>
97
97
  Subtext goes here
98
98
  </Tile>{' '}
99
99
  <Tile title="Selected" icon={<BellIcon />} isStacked isDisplayLarge isSelected>
100
100
  Subtext goes here
101
101
  </Tile>{' '}
102
- <Tile title="Disabled" icon={<BellIcon />} isStacked isDisplayLarge isDisabled>
102
+ <Tile title="Disabled" icon={<BellIcon />} isStacked isDisplayLarge isDisabled isSelected={false}>
103
103
  Subtext goes here
104
104
  </Tile>
105
- </React.Fragment>
105
+ </div>;
106
106
  ```
107
107
 
108
108
  ### With extra content
@@ -112,22 +112,24 @@ import React from 'react';
112
112
  import { Tile, Flex } from '@patternfly/react-core';
113
113
  import BellIcon from '@patternfly/react-icons/dist/esm/icons/bell-icon';
114
114
 
115
- <Flex>
116
- <Flex flex={{ default: 'flex_1' }}>
117
- <Tile title="Default" icon={<BellIcon />} isStacked>
118
- This is really really long subtext that goes on for so long that it has to wrap to the next line. This is really
119
- really long subtext that goes on for so long that it has to wrap to the next line.
120
- </Tile>
121
- </Flex>
122
- <Flex flex={{ default: 'flex_1' }}>
123
- <Tile title="Selected" icon={<BellIcon />} isStacked>
124
- This is really really long subtext that goes on for so long that it has to wrap to the next line.
125
- </Tile>
126
- </Flex>
127
- <Flex flex={{ default: 'flex_1' }}>
128
- <Tile title="Disabled" icon={<BellIcon />} isStacked>
129
- Subtext goes here
130
- </Tile>
115
+ <div role="listbox" aria-label="Tiles with extra content">
116
+ <Flex>
117
+ <Flex flex={{ default: 'flex_1' }}>
118
+ <Tile title="Default" icon={<BellIcon />} isStacked isSelected={false}>
119
+ This is really really long subtext that goes on for so long that it has to wrap to the next line. This is really
120
+ really long subtext that goes on for so long that it has to wrap to the next line.
121
+ </Tile>
122
+ </Flex>
123
+ <Flex flex={{ default: 'flex_1' }}>
124
+ <Tile title="Selected" icon={<BellIcon />} isStacked isSelected>
125
+ This is really really long subtext that goes on for so long that it has to wrap to the next line.
126
+ </Tile>
127
+ </Flex>
128
+ <Flex flex={{ default: 'flex_1' }}>
129
+ <Tile title="Disabled" icon={<BellIcon />} isStacked isDisabled isSelected={false}>
130
+ Subtext goes here
131
+ </Tile>
132
+ </Flex>
131
133
  </Flex>
132
- </Flex>
134
+ </div>;
133
135
  ```
@@ -13,7 +13,9 @@ export interface ToolbarProps extends React.HTMLProps<HTMLDivElement>, OUIAProps
13
13
  clearAllFilters?: () => void;
14
14
  /** Text to display in the clear all filters button */
15
15
  clearFiltersButtonText?: string;
16
- /** The breakpoint at which the listed fitlers in chip groups are collapsed down to a summary */
16
+ /** Custom content appended to the filter generated chip group. To maintain spacing and styling, each node should be wrapped in a ToolbarItem or ToolbarGroup. This property will remove the default "Clear all filters" button. */
17
+ customChipGroupContent?: React.ReactNode;
18
+ /** The breakpoint at which the listed filters in chip groups are collapsed down to a summary */
17
19
  collapseListedFiltersBreakpoint?: 'all' | 'md' | 'lg' | 'xl' | '2xl';
18
20
  /** Flag indicating if a data toolbar toggle group's expandable content is expanded */
19
21
  isExpanded?: boolean;
@@ -129,6 +131,7 @@ export class Toolbar extends React.Component<ToolbarProps, ToolbarState> {
129
131
  isSticky,
130
132
  ouiaId,
131
133
  numberOfFiltersText,
134
+ customChipGroupContent,
132
135
  ...props
133
136
  } = this.props;
134
137
 
@@ -166,7 +169,8 @@ export class Toolbar extends React.Component<ToolbarProps, ToolbarState> {
166
169
  clearAllFilters,
167
170
  clearFiltersButtonText,
168
171
  showClearFiltersButton,
169
- toolbarId: randomId
172
+ toolbarId: randomId,
173
+ customChipGroupContent
170
174
  }}
171
175
  >
172
176
  {children}
@@ -179,6 +183,7 @@ export class Toolbar extends React.Component<ToolbarProps, ToolbarState> {
179
183
  numberOfFilters={numberOfFilters}
180
184
  numberOfFiltersText={numberOfFiltersText}
181
185
  collapseListedFiltersBreakpoint={collapseListedFiltersBreakpoint}
186
+ customChipGroupContent={customChipGroupContent}
182
187
  />
183
188
  </ToolbarContext.Provider>
184
189
  </div>
@@ -29,6 +29,8 @@ export interface ToolbarChipGroupContentProps extends React.HTMLProps<HTMLDivEle
29
29
  numberOfFiltersText?: (numberOfFilters: number) => string;
30
30
  /** The breakpoint at which the listed filters in chip groups are collapsed down to a summary */
31
31
  collapseListedFiltersBreakpoint?: 'all' | 'md' | 'lg' | 'xl' | '2xl';
32
+ /** Custom additional content appended to the generated chips. To maintain spacing and styling, each node should be a ToolbarItem or ToolbarGroup. This property will remove the built in "Clear all filters" button. */
33
+ customChipGroupContent?: React.ReactNode;
32
34
  }
33
35
 
34
36
  export class ToolbarChipGroupContent extends React.Component<ToolbarChipGroupContentProps> {
@@ -50,6 +52,7 @@ export class ToolbarChipGroupContent extends React.Component<ToolbarChipGroupCon
50
52
  collapseListedFiltersBreakpoint,
51
53
  numberOfFilters,
52
54
  numberOfFiltersText,
55
+ customChipGroupContent,
53
56
  ...props
54
57
  } = this.props;
55
58
 
@@ -86,13 +89,14 @@ export class ToolbarChipGroupContent extends React.Component<ToolbarChipGroupCon
86
89
  <ToolbarItem>{numberOfFiltersText(numberOfFilters)}</ToolbarItem>
87
90
  </ToolbarGroup>
88
91
  )}
89
- {showClearFiltersButton && !isExpanded && (
92
+ {showClearFiltersButton && !isExpanded && !customChipGroupContent && (
90
93
  <ToolbarItem>
91
94
  <Button variant="link" onClick={clearChipGroups} isInline>
92
95
  {clearFiltersButtonText}
93
96
  </Button>
94
97
  </ToolbarItem>
95
98
  )}
99
+ {customChipGroupContent && customChipGroupContent}
96
100
  </div>
97
101
  );
98
102
  }
@@ -46,7 +46,7 @@ export class ToolbarExpandableContent extends React.Component<ToolbarExpandableC
46
46
  showClearFiltersButton,
47
47
  ...props
48
48
  } = this.props;
49
- const { numberOfFilters } = this.context;
49
+ const { numberOfFilters, customChipGroupContent } = this.context;
50
50
 
51
51
  const clearChipGroups = () => {
52
52
  clearAllFilters();
@@ -58,13 +58,14 @@ export class ToolbarExpandableContent extends React.Component<ToolbarExpandableC
58
58
  {numberOfFilters > 0 && (
59
59
  <ToolbarGroup className={styles.modifiers.chipContainer}>
60
60
  <ToolbarGroup ref={chipContainerRef} />
61
- {showClearFiltersButton && (
61
+ {showClearFiltersButton && !customChipGroupContent && (
62
62
  <ToolbarItem>
63
63
  <Button variant="link" onClick={clearChipGroups} isInline>
64
64
  {clearFiltersButtonText}
65
65
  </Button>
66
66
  </ToolbarItem>
67
67
  )}
68
+ {customChipGroupContent && customChipGroupContent}
68
69
  </ToolbarGroup>
69
70
  )}
70
71
  </div>
@@ -15,6 +15,7 @@ interface ToolbarContextProps {
15
15
  clearFiltersButtonText?: string;
16
16
  showClearFiltersButton?: boolean;
17
17
  toolbarId?: string;
18
+ customChipGroupContent?: React.ReactNode;
18
19
  }
19
20
 
20
21
  export const ToolbarContext = React.createContext<ToolbarContextProps>({
@@ -1,10 +1,14 @@
1
1
  import * as React from 'react';
2
- import { render } from '@testing-library/react';
2
+ import { render, screen } from '@testing-library/react';
3
3
  import { shallow } from 'enzyme';
4
4
  import { ToolbarToggleGroup } from '../ToolbarToggleGroup';
5
5
  import { Toolbar } from '../Toolbar';
6
6
  import { ToolbarItem } from '../ToolbarItem';
7
7
  import { ToolbarContent } from '../ToolbarContent';
8
+ import { ToolbarFilter } from '../ToolbarFilter';
9
+ import { ToolbarGroup } from '../ToolbarGroup';
10
+ import { Select, SelectVariant, SelectOption } from '../../Select';
11
+ import { Button } from '../../Button';
8
12
 
9
13
  describe('ToolbarToggleGroup', () => {
10
14
  it('should warn on bad props', () => {
@@ -59,6 +63,72 @@ describe('Toolbar', () => {
59
63
  );
60
64
  expect(view.container).toMatchSnapshot();
61
65
  });
66
+
67
+ it('should render with custom chip content', () => {
68
+ const statusMenuItems = [
69
+ <SelectOption key="statusNew" value="New" />,
70
+ <SelectOption key="statusPending" value="Pending" />,
71
+ <SelectOption key="statusRunning" value="Running" />,
72
+ <SelectOption key="statusCancelled" value="Cancelled" />
73
+ ];
74
+
75
+ const items = (
76
+ <React.Fragment>
77
+ <ToolbarToggleGroup toggleIcon={<React.Fragment />} breakpoint="xl">
78
+ <ToolbarGroup variant="filter-group">
79
+ <ToolbarFilter
80
+ chips={['New', 'Pending']}
81
+ deleteChip={(category, chip) => {}}
82
+ deleteChipGroup={category => {}}
83
+ categoryName="Status"
84
+ >
85
+ <Select
86
+ variant={SelectVariant.checkbox}
87
+ aria-label="Status"
88
+ onToggle={(isExpanded: boolean) => {}}
89
+ onSelect={(event, selection) => {}}
90
+ selections={['New', 'Pending']}
91
+ isOpen={true}
92
+ placeholderText="Status"
93
+ >
94
+ {statusMenuItems}
95
+ </Select>
96
+ </ToolbarFilter>
97
+ </ToolbarGroup>
98
+ </ToolbarToggleGroup>
99
+ </React.Fragment>
100
+ );
101
+
102
+ const customChipGroupContent = (
103
+ <React.Fragment>
104
+ <ToolbarItem>
105
+ <Button variant="link" onClick={() => {}} isInline>
106
+ Save filters
107
+ </Button>
108
+ </ToolbarItem>
109
+ <ToolbarItem>
110
+ <Button variant="link" onClick={() => {}} isInline>
111
+ Clear all filters
112
+ </Button>
113
+ </ToolbarItem>
114
+ </React.Fragment>
115
+ );
116
+
117
+ const view = render(
118
+ <Toolbar
119
+ id="toolbar-with-filter"
120
+ className="pf-m-toggle-group-container"
121
+ collapseListedFiltersBreakpoint="xl"
122
+ customChipGroupContent={customChipGroupContent}
123
+ >
124
+ <ToolbarContent>{items}</ToolbarContent>
125
+ </Toolbar>
126
+ );
127
+ // Expecting 2 matches for text because the buttons also exist in hidden expandable content for mobile view
128
+ expect(screen.getAllByRole('button', { name: 'Save filters' }).length).toBe(2);
129
+ expect(screen.getAllByRole('button', { name: 'Clear all filters' }).length).toBe(2);
130
+ expect(view.container).toMatchSnapshot();
131
+ });
62
132
  });
63
133
 
64
134
  describe('ToolbarItem', () => {