@patternfly/react-core 4.227.7 → 4.228.0

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 (99) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/esm/components/Menu/MenuItem.d.ts +3 -1
  3. package/dist/esm/components/Menu/MenuItem.d.ts.map +1 -1
  4. package/dist/esm/components/Menu/MenuItem.js +2 -2
  5. package/dist/esm/components/Menu/MenuItem.js.map +1 -1
  6. package/dist/esm/components/MenuToggle/MenuToggle.d.ts +6 -12
  7. package/dist/esm/components/MenuToggle/MenuToggle.d.ts.map +1 -1
  8. package/dist/esm/components/MenuToggle/MenuToggle.js +12 -8
  9. package/dist/esm/components/MenuToggle/MenuToggle.js.map +1 -1
  10. package/dist/esm/components/Tabs/OverflowTab.d.ts +16 -0
  11. package/dist/esm/components/Tabs/OverflowTab.d.ts.map +1 -0
  12. package/dist/esm/components/Tabs/OverflowTab.js +74 -0
  13. package/dist/esm/components/Tabs/OverflowTab.js.map +1 -0
  14. package/dist/esm/components/Tabs/Tabs.d.ts +12 -0
  15. package/dist/esm/components/Tabs/Tabs.d.ts.map +1 -1
  16. package/dist/esm/components/Tabs/Tabs.js +36 -13
  17. package/dist/esm/components/Tabs/Tabs.js.map +1 -1
  18. package/dist/esm/components/TextInputGroup/TextInputGroup.d.ts +2 -0
  19. package/dist/esm/components/TextInputGroup/TextInputGroup.d.ts.map +1 -1
  20. package/dist/esm/components/TextInputGroup/TextInputGroup.js +2 -2
  21. package/dist/esm/components/TextInputGroup/TextInputGroup.js.map +1 -1
  22. package/dist/esm/components/TextInputGroup/TextInputGroupMain.d.ts +1 -1
  23. package/dist/esm/components/TextInputGroup/TextInputGroupMain.d.ts.map +1 -1
  24. package/dist/esm/components/TreeView/TreeView.d.ts +2 -0
  25. package/dist/esm/components/TreeView/TreeView.d.ts.map +1 -1
  26. package/dist/esm/components/TreeView/TreeView.js +3 -3
  27. package/dist/esm/components/TreeView/TreeView.js.map +1 -1
  28. package/dist/esm/components/TreeView/TreeViewListItem.d.ts +2 -0
  29. package/dist/esm/components/TreeView/TreeViewListItem.d.ts.map +1 -1
  30. package/dist/esm/components/TreeView/TreeViewListItem.js +23 -14
  31. package/dist/esm/components/TreeView/TreeViewListItem.js.map +1 -1
  32. package/dist/js/components/Menu/MenuItem.d.ts +3 -1
  33. package/dist/js/components/Menu/MenuItem.d.ts.map +1 -1
  34. package/dist/js/components/Menu/MenuItem.js +2 -2
  35. package/dist/js/components/Menu/MenuItem.js.map +1 -1
  36. package/dist/js/components/MenuToggle/MenuToggle.d.ts +6 -12
  37. package/dist/js/components/MenuToggle/MenuToggle.d.ts.map +1 -1
  38. package/dist/js/components/MenuToggle/MenuToggle.js +12 -8
  39. package/dist/js/components/MenuToggle/MenuToggle.js.map +1 -1
  40. package/dist/js/components/Tabs/OverflowTab.d.ts +16 -0
  41. package/dist/js/components/Tabs/OverflowTab.d.ts.map +1 -0
  42. package/dist/js/components/Tabs/OverflowTab.js +78 -0
  43. package/dist/js/components/Tabs/OverflowTab.js.map +1 -0
  44. package/dist/js/components/Tabs/Tabs.d.ts +12 -0
  45. package/dist/js/components/Tabs/Tabs.d.ts.map +1 -1
  46. package/dist/js/components/Tabs/Tabs.js +36 -13
  47. package/dist/js/components/Tabs/Tabs.js.map +1 -1
  48. package/dist/js/components/TextInputGroup/TextInputGroup.d.ts +2 -0
  49. package/dist/js/components/TextInputGroup/TextInputGroup.d.ts.map +1 -1
  50. package/dist/js/components/TextInputGroup/TextInputGroup.js +2 -2
  51. package/dist/js/components/TextInputGroup/TextInputGroup.js.map +1 -1
  52. package/dist/js/components/TextInputGroup/TextInputGroupMain.d.ts +1 -1
  53. package/dist/js/components/TextInputGroup/TextInputGroupMain.d.ts.map +1 -1
  54. package/dist/js/components/TreeView/TreeView.d.ts +2 -0
  55. package/dist/js/components/TreeView/TreeView.d.ts.map +1 -1
  56. package/dist/js/components/TreeView/TreeView.js +3 -3
  57. package/dist/js/components/TreeView/TreeView.js.map +1 -1
  58. package/dist/js/components/TreeView/TreeViewListItem.d.ts +2 -0
  59. package/dist/js/components/TreeView/TreeViewListItem.d.ts.map +1 -1
  60. package/dist/js/components/TreeView/TreeViewListItem.js +23 -14
  61. package/dist/js/components/TreeView/TreeViewListItem.js.map +1 -1
  62. package/dist/styles/base-no-reset.css +9 -0
  63. package/dist/styles/base.css +9 -0
  64. package/dist/umd/react-core.css +21 -31
  65. package/dist/umd/react-core.js +149 -48
  66. package/dist/umd/react-core.min.css +21 -31
  67. package/dist/umd/react-core.min.js +5 -5
  68. package/package.json +6 -6
  69. package/src/components/Menu/MenuItem.tsx +4 -0
  70. package/src/components/MenuToggle/MenuToggle.tsx +63 -25
  71. package/src/components/Page/examples/Page.md +10 -615
  72. package/src/components/Page/examples/PageCenteredSection.tsx +76 -0
  73. package/src/components/Page/examples/PageGroupSection.tsx +106 -0
  74. package/src/components/Page/examples/PageHorizontalNav.tsx +43 -0
  75. package/src/components/Page/examples/PageMainSectionPadding.tsx +72 -0
  76. package/src/components/Page/examples/PageTertiaryNav.tsx +42 -0
  77. package/src/components/Page/examples/PageUncontrolledNav.tsx +53 -0
  78. package/src/components/Page/examples/PageVerticalNav.tsx +65 -0
  79. package/src/components/Page/examples/PageVerticalNavUsingPageHeaderComponent.tsx +44 -0
  80. package/src/components/Page/examples/PageWithOrWithoutFill.tsx +67 -0
  81. package/src/components/Switch/examples/Switch.md +6 -153
  82. package/src/components/Switch/examples/SwitchBasic.tsx +20 -0
  83. package/src/components/Switch/examples/SwitchCheckedWithLabel.tsx +22 -0
  84. package/src/components/Switch/examples/SwitchDisabled.tsx +28 -0
  85. package/src/components/Switch/examples/SwitchReversed.tsx +21 -0
  86. package/src/components/Switch/examples/SwitchUncontrolled.tsx +14 -0
  87. package/src/components/Switch/examples/SwitchWithoutLabel.tsx +12 -0
  88. package/src/components/Tabs/OverflowTab.tsx +141 -0
  89. package/src/components/Tabs/Tabs.tsx +72 -25
  90. package/src/components/Tabs/examples/Tabs.md +6 -1
  91. package/src/components/Tabs/examples/TabsHorizontalOverflow.tsx +67 -0
  92. package/src/components/TextInputGroup/TextInputGroup.tsx +9 -1
  93. package/src/components/TextInputGroup/TextInputGroupMain.tsx +1 -1
  94. package/src/components/TreeView/TreeView.tsx +5 -0
  95. package/src/components/TreeView/TreeViewListItem.tsx +31 -17
  96. package/src/components/TreeView/__tests__/__snapshots__/TreeView.test.tsx.snap +299 -299
  97. package/src/components/TreeView/examples/TreeView.md +125 -7
  98. package/src/demos/ComposableMenu/ComposableMenu.md +8 -0
  99. package/src/demos/ComposableMenu/examples/ComposableTypeaheadSelect.tsx +196 -0
@@ -0,0 +1,67 @@
1
+ import React from 'react';
2
+ import { Tabs, Tab, TabTitleText, Checkbox } from '@patternfly/react-core';
3
+
4
+ export const TabsHorizontalOverflow: React.FunctionComponent = () => {
5
+ const [activeTabKey, setActiveTabKey] = React.useState<string | number>(0);
6
+ const [showTabCount, setShowTabCount] = React.useState(false);
7
+
8
+ const handleTabClick = (_event: any, tabIndex: string | number) => {
9
+ setActiveTabKey(tabIndex);
10
+ };
11
+
12
+ return (
13
+ <div>
14
+ <Tabs
15
+ activeKey={activeTabKey}
16
+ onSelect={handleTabClick}
17
+ aria-label="Tabs in the horizontal overflow example"
18
+ role="region"
19
+ isOverflowHorizontal={{ showTabCount }}
20
+ >
21
+ <Tab eventKey={0} title={<TabTitleText>Users</TabTitleText>} aria-label="Horizontal overflow content users">
22
+ Users
23
+ </Tab>
24
+ <Tab eventKey={1} title={<TabTitleText>Containers</TabTitleText>}>
25
+ Containers
26
+ </Tab>
27
+ <Tab eventKey={2} title={<TabTitleText>Database</TabTitleText>}>
28
+ Database
29
+ </Tab>
30
+ <Tab eventKey={3} title={<TabTitleText>Server</TabTitleText>}>
31
+ Server
32
+ </Tab>
33
+ <Tab eventKey={4} title={<TabTitleText>System</TabTitleText>}>
34
+ System
35
+ </Tab>
36
+ <Tab eventKey={6} title={<TabTitleText>Network</TabTitleText>}>
37
+ Network
38
+ </Tab>
39
+ <Tab eventKey={7} title={<TabTitleText>Tab item 7</TabTitleText>}>
40
+ Tab 7 section
41
+ </Tab>
42
+ <Tab eventKey={8} title={<TabTitleText>Tab item 8</TabTitleText>}>
43
+ Tab 8 section
44
+ </Tab>
45
+ <Tab eventKey={9} title={<TabTitleText>Tab item 9</TabTitleText>}>
46
+ Tab 9 section
47
+ </Tab>
48
+ <Tab eventKey={10} title={<TabTitleText>Tab item 10</TabTitleText>}>
49
+ Tab 10 section
50
+ </Tab>
51
+ <Tab eventKey={11} title={<TabTitleText>Tab item 11</TabTitleText>}>
52
+ Tab 11 section
53
+ </Tab>
54
+ </Tabs>
55
+ <div style={{ marginTop: '20px' }}>
56
+ <Checkbox
57
+ label="Show overflowing tab count"
58
+ isChecked={showTabCount}
59
+ onChange={() => setShowTabCount(!showTabCount)}
60
+ aria-label="show overflow tab count variation checkbox"
61
+ id="toggle-show-count-overflow"
62
+ name="toggle-show-count-overflow"
63
+ />
64
+ </div>
65
+ </div>
66
+ );
67
+ };
@@ -9,6 +9,8 @@ export interface TextInputGroupProps extends React.HTMLProps<HTMLDivElement> {
9
9
  className?: string;
10
10
  /** Adds disabled styling and a disabled context value which text input group main hooks into for the input itself */
11
11
  isDisabled?: boolean;
12
+ /** Flag to indicate the toggle has no border or background */
13
+ isPlain?: boolean;
12
14
  /** @hide A reference object to attach to the input box */
13
15
  innerRef?: React.RefObject<any>;
14
16
  }
@@ -21,6 +23,7 @@ export const TextInputGroup: React.FunctionComponent<TextInputGroupProps> = ({
21
23
  children,
22
24
  className,
23
25
  isDisabled,
26
+ isPlain,
24
27
  innerRef,
25
28
  ...props
26
29
  }: TextInputGroupProps) => {
@@ -30,7 +33,12 @@ export const TextInputGroup: React.FunctionComponent<TextInputGroupProps> = ({
30
33
  <TextInputGroupContext.Provider value={{ isDisabled }}>
31
34
  <div
32
35
  ref={textInputGroupRef}
33
- className={css(styles.textInputGroup, isDisabled && styles.modifiers.disabled, className)}
36
+ className={css(
37
+ styles.textInputGroup,
38
+ isDisabled && styles.modifiers.disabled,
39
+ isPlain && styles.modifiers.plain,
40
+ className
41
+ )}
34
42
  {...props}
35
43
  >
36
44
  {children}
@@ -37,7 +37,7 @@ export interface TextInputGroupMainProps extends Omit<React.HTMLProps<HTMLDivEle
37
37
  value?: string | number;
38
38
  /** Placeholder value for the input */
39
39
  placeholder?: string;
40
- /** @hide A reference object to attach to the input box */
40
+ /** A reference object to attach to the input box */
41
41
  innerRef?: React.RefObject<any>;
42
42
  }
43
43
 
@@ -45,6 +45,8 @@ export interface TreeViewProps {
45
45
  hasBadges?: boolean;
46
46
  /** Flag indicating if tree view has guide lines. */
47
47
  hasGuides?: boolean;
48
+ /** Flag indicating that tree nodes should be independently selectable, even when having children */
49
+ hasSelectableNodes?: boolean;
48
50
  /** Variant presentation styles for the tree view. */
49
51
  variant?: 'default' | 'compact' | 'compactNoBackground';
50
52
  /** Icon for all leaf or unexpanded node items */
@@ -79,6 +81,7 @@ export const TreeView: React.FunctionComponent<TreeViewProps> = ({
79
81
  hasChecks = false,
80
82
  hasBadges = false,
81
83
  hasGuides = false,
84
+ hasSelectableNodes = false,
82
85
  variant = 'default',
83
86
  defaultAllExpanded = false,
84
87
  allExpanded,
@@ -103,6 +106,7 @@ export const TreeView: React.FunctionComponent<TreeViewProps> = ({
103
106
  title={item.title}
104
107
  id={item.id}
105
108
  isExpanded={allExpanded}
109
+ isSelectable={hasSelectableNodes}
106
110
  defaultExpanded={item.defaultExpanded !== undefined ? item.defaultExpanded : defaultAllExpanded}
107
111
  onSelect={onSelect}
108
112
  onCheck={onCheck}
@@ -129,6 +133,7 @@ export const TreeView: React.FunctionComponent<TreeViewProps> = ({
129
133
  hasChecks={hasChecks}
130
134
  hasBadges={hasBadges}
131
135
  hasGuides={hasGuides}
136
+ hasSelectableNodes={hasSelectableNodes}
132
137
  variant={variant}
133
138
  allExpanded={allExpanded}
134
139
  defaultAllExpanded={defaultAllExpanded}
@@ -33,6 +33,8 @@ export interface TreeViewListItemProps {
33
33
  checkProps?: TreeViewCheckProps;
34
34
  /** Flag indicating if a tree view item has a badge */
35
35
  hasBadge?: boolean;
36
+ /** Flag indicating that tree nodes should be independently selectable, even when having children */
37
+ isSelectable?: boolean;
36
38
  /** Optional prop for custom badge */
37
39
  customBadgeContent?: React.ReactNode;
38
40
  /** Additional properties of the tree view item badge */
@@ -73,6 +75,7 @@ const TreeViewListItemBase: React.FunctionComponent<TreeViewListItemProps> = ({
73
75
  hasBadge = false,
74
76
  customBadgeContent,
75
77
  badgeProps = { isRead: true },
78
+ isSelectable = false,
76
79
  isCompact,
77
80
  activeItems = [],
78
81
  itemData,
@@ -93,17 +96,27 @@ const TreeViewListItemBase: React.FunctionComponent<TreeViewListItemProps> = ({
93
96
  }
94
97
  }, [isExpanded, defaultExpanded]);
95
98
 
96
- const Component = hasCheck ? 'div' : 'button';
97
- const ToggleComponent = hasCheck ? 'button' : 'div';
99
+ let Component: 'label' | 'div' | 'button' = 'button';
100
+ if (hasCheck) {
101
+ Component = 'label';
102
+ } else if (isSelectable) {
103
+ Component = 'div';
104
+ }
105
+
106
+ const ToggleComponent = hasCheck || isSelectable ? 'button' : 'span';
107
+
98
108
  const renderToggle = (randomId: string) => (
99
109
  <ToggleComponent
100
110
  className={css(styles.treeViewNodeToggle)}
101
- onClick={() => {
102
- if (hasCheck) {
111
+ onClick={(evt: React.MouseEvent) => {
112
+ if (isSelectable || hasCheck) {
103
113
  setIsExpanded(!internalIsExpanded);
104
114
  }
115
+ if (isSelectable) {
116
+ evt.stopPropagation();
117
+ }
105
118
  }}
106
- {...(hasCheck && { 'aria-labelledby': `label-${randomId}` })}
119
+ {...((hasCheck || isSelectable) && { 'aria-labelledby': `label-${randomId}` })}
107
120
  tabIndex={-1}
108
121
  >
109
122
  <span className={css(styles.treeViewNodeToggleIcon)}>
@@ -131,20 +144,18 @@ const TreeViewListItemBase: React.FunctionComponent<TreeViewListItemProps> = ({
131
144
  {internalIsExpanded && (expandedIcon || icon)}
132
145
  </span>
133
146
  );
134
- const renderNodeContent = (randomId: string) => {
147
+ const renderNodeContent = () => {
135
148
  const content = (
136
149
  <>
137
150
  {isCompact && title && <span className={css(styles.treeViewNodeTitle)}>{title}</span>}
138
151
  {hasCheck ? (
139
- <label className={css(styles.treeViewNodeText)} htmlFor={randomId} id={`label-${randomId}`}>
140
- {name}
141
- </label>
152
+ <span className={css(styles.treeViewNodeText)}>{name}</span>
142
153
  ) : (
143
154
  <span className={css(styles.treeViewNodeText)}>{name}</span>
144
155
  )}
145
156
  </>
146
157
  );
147
- return isCompact ? <div className={css(styles.treeViewNodeContent)}>{content}</div> : content;
158
+ return isCompact ? <span className={css(styles.treeViewNodeContent)}>{content}</span> : content;
148
159
  };
149
160
  const badgeRendered = (
150
161
  <>
@@ -171,12 +182,13 @@ const TreeViewListItemBase: React.FunctionComponent<TreeViewListItemProps> = ({
171
182
  tabIndex={-1}
172
183
  >
173
184
  <div className={css(styles.treeViewContent)}>
174
- <GenerateId prefix="checkbox-id">
185
+ <GenerateId prefix={isSelectable ? 'selectable-id' : 'checkbox-id'}>
175
186
  {randomId => (
176
187
  <Component
177
188
  className={css(
178
189
  styles.treeViewNode,
179
- !children &&
190
+ children && (isSelectable || hasCheck) && styles.modifiers.selectable,
191
+ (!children || isSelectable) &&
180
192
  activeItems &&
181
193
  activeItems.length > 0 &&
182
194
  activeItems.some(item => compareItems && item && compareItems(item, itemData))
@@ -186,20 +198,22 @@ const TreeViewListItemBase: React.FunctionComponent<TreeViewListItemProps> = ({
186
198
  onClick={(evt: React.MouseEvent) => {
187
199
  if (!hasCheck) {
188
200
  onSelect && onSelect(evt, itemData, parentItem);
189
- if (children && evt.isDefaultPrevented() !== true) {
201
+ if (!isSelectable && children && evt.isDefaultPrevented() !== true) {
190
202
  setIsExpanded(!internalIsExpanded);
191
203
  }
192
204
  }
193
205
  }}
194
- tabIndex={-1}
206
+ tabIndex={isSelectable ? 0 : -1}
207
+ {...(hasCheck && { htmlFor: randomId })}
208
+ {...((hasCheck || (isSelectable && children)) && { id: `label-${randomId}` })}
195
209
  >
196
- <div className={css(styles.treeViewNodeContainer)}>
210
+ <span className={css(styles.treeViewNodeContainer)}>
197
211
  {children && renderToggle(randomId)}
198
212
  {hasCheck && renderCheck(randomId)}
199
213
  {icon && iconRendered}
200
- {renderNodeContent(randomId)}
214
+ {renderNodeContent()}
201
215
  {badgeRendered}
202
- </div>
216
+ </span>
203
217
  </Component>
204
218
  )}
205
219
  </GenerateId>