@patternfly/react-core 4.211.1 → 4.211.4

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 (95) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/dist/esm/components/Menu/Menu.js +1 -1
  3. package/dist/esm/components/Menu/Menu.js.map +1 -1
  4. package/dist/esm/components/Modal/Modal.d.ts +4 -0
  5. package/dist/esm/components/Modal/Modal.d.ts.map +1 -1
  6. package/dist/esm/components/Modal/Modal.js +2 -2
  7. package/dist/esm/components/Modal/Modal.js.map +1 -1
  8. package/dist/esm/components/Modal/ModalContent.d.ts +4 -0
  9. package/dist/esm/components/Modal/ModalContent.d.ts.map +1 -1
  10. package/dist/esm/components/Modal/ModalContent.js +3 -2
  11. package/dist/esm/components/Modal/ModalContent.js.map +1 -1
  12. package/dist/esm/components/Page/PageBreadcrumb.d.ts.map +1 -1
  13. package/dist/esm/components/Page/PageBreadcrumb.js +1 -1
  14. package/dist/esm/components/Page/PageBreadcrumb.js.map +1 -1
  15. package/dist/esm/components/Page/PageGroup.d.ts.map +1 -1
  16. package/dist/esm/components/Page/PageGroup.js +1 -1
  17. package/dist/esm/components/Page/PageGroup.js.map +1 -1
  18. package/dist/esm/components/Page/PageNavigation.d.ts.map +1 -1
  19. package/dist/esm/components/Page/PageNavigation.js +1 -1
  20. package/dist/esm/components/Page/PageNavigation.js.map +1 -1
  21. package/dist/esm/components/Page/PageSection.d.ts.map +1 -1
  22. package/dist/esm/components/Page/PageSection.js +1 -1
  23. package/dist/esm/components/Page/PageSection.js.map +1 -1
  24. package/dist/esm/components/Panel/Panel.d.ts +3 -1
  25. package/dist/esm/components/Panel/Panel.d.ts.map +1 -1
  26. package/dist/esm/components/Panel/Panel.js +4 -3
  27. package/dist/esm/components/Panel/Panel.js.map +1 -1
  28. package/dist/esm/components/Tooltip/Tooltip.d.ts +6 -0
  29. package/dist/esm/components/Tooltip/Tooltip.d.ts.map +1 -1
  30. package/dist/esm/components/Tooltip/Tooltip.js +2 -2
  31. package/dist/esm/components/Tooltip/Tooltip.js.map +1 -1
  32. package/dist/esm/helpers/KeyboardHandler.d.ts +2 -0
  33. package/dist/esm/helpers/KeyboardHandler.d.ts.map +1 -1
  34. package/dist/esm/helpers/KeyboardHandler.js +3 -2
  35. package/dist/esm/helpers/KeyboardHandler.js.map +1 -1
  36. package/dist/js/components/Menu/Menu.js +1 -1
  37. package/dist/js/components/Menu/Menu.js.map +1 -1
  38. package/dist/js/components/Modal/Modal.d.ts +4 -0
  39. package/dist/js/components/Modal/Modal.d.ts.map +1 -1
  40. package/dist/js/components/Modal/Modal.js +2 -2
  41. package/dist/js/components/Modal/Modal.js.map +1 -1
  42. package/dist/js/components/Modal/ModalContent.d.ts +4 -0
  43. package/dist/js/components/Modal/ModalContent.d.ts.map +1 -1
  44. package/dist/js/components/Modal/ModalContent.js +3 -2
  45. package/dist/js/components/Modal/ModalContent.js.map +1 -1
  46. package/dist/js/components/Page/PageBreadcrumb.d.ts.map +1 -1
  47. package/dist/js/components/Page/PageBreadcrumb.js +1 -1
  48. package/dist/js/components/Page/PageBreadcrumb.js.map +1 -1
  49. package/dist/js/components/Page/PageGroup.d.ts.map +1 -1
  50. package/dist/js/components/Page/PageGroup.js +1 -1
  51. package/dist/js/components/Page/PageGroup.js.map +1 -1
  52. package/dist/js/components/Page/PageNavigation.d.ts.map +1 -1
  53. package/dist/js/components/Page/PageNavigation.js +1 -1
  54. package/dist/js/components/Page/PageNavigation.js.map +1 -1
  55. package/dist/js/components/Page/PageSection.d.ts.map +1 -1
  56. package/dist/js/components/Page/PageSection.js +1 -1
  57. package/dist/js/components/Page/PageSection.js.map +1 -1
  58. package/dist/js/components/Panel/Panel.d.ts +3 -1
  59. package/dist/js/components/Panel/Panel.d.ts.map +1 -1
  60. package/dist/js/components/Panel/Panel.js +4 -4
  61. package/dist/js/components/Panel/Panel.js.map +1 -1
  62. package/dist/js/components/Tooltip/Tooltip.d.ts +6 -0
  63. package/dist/js/components/Tooltip/Tooltip.d.ts.map +1 -1
  64. package/dist/js/components/Tooltip/Tooltip.js +2 -2
  65. package/dist/js/components/Tooltip/Tooltip.js.map +1 -1
  66. package/dist/js/helpers/KeyboardHandler.d.ts +2 -0
  67. package/dist/js/helpers/KeyboardHandler.d.ts.map +1 -1
  68. package/dist/js/helpers/KeyboardHandler.js +3 -2
  69. package/dist/js/helpers/KeyboardHandler.js.map +1 -1
  70. package/dist/umd/react-core.css +5 -0
  71. package/dist/umd/react-core.js +19 -16
  72. package/dist/umd/react-core.min.css +5 -0
  73. package/dist/umd/react-core.min.js +4 -4
  74. package/package.json +6 -6
  75. package/src/components/Menu/Menu.tsx +1 -1
  76. package/src/components/Modal/Modal.tsx +8 -0
  77. package/src/components/Modal/ModalContent.tsx +14 -1
  78. package/src/components/Modal/__tests__/Modal.test.tsx +56 -0
  79. package/src/components/Modal/examples/Modal.md +7 -0
  80. package/src/components/Modal/examples/ModalWithOverflowingContent.tsx +71 -0
  81. package/src/components/Page/PageBreadcrumb.tsx +1 -0
  82. package/src/components/Page/PageGroup.tsx +1 -0
  83. package/src/components/Page/PageNavigation.tsx +1 -0
  84. package/src/components/Page/PageSection.tsx +1 -0
  85. package/src/components/Page/__tests__/__snapshots__/PageBreadcrumb.test.tsx.snap +1 -0
  86. package/src/components/Page/__tests__/__snapshots__/PageGroup.test.tsx.snap +1 -0
  87. package/src/components/Page/__tests__/__snapshots__/PageNavigation.test.tsx.snap +1 -0
  88. package/src/components/Page/__tests__/__snapshots__/PageSection.test.tsx.snap +1 -0
  89. package/src/components/Panel/Panel.tsx +8 -1
  90. package/src/components/Tabs/examples/Tabs.md +144 -25
  91. package/src/components/Tooltip/Tooltip.tsx +8 -0
  92. package/src/components/Tooltip/examples/Tooltip.md +86 -41
  93. package/src/demos/ComposableMenu/ComposableMenu.md +2 -0
  94. package/src/demos/ComposableMenu/examples/ComposableTreeViewMenu.tsx +62 -28
  95. package/src/helpers/KeyboardHandler.tsx +7 -2
@@ -1,10 +1,10 @@
1
1
  import React from 'react';
2
2
  import {
3
3
  MenuToggle,
4
- Menu,
5
- MenuContent,
6
- MenuGroup,
7
- MenuList,
4
+ Panel,
5
+ PanelMain,
6
+ PanelMainBody,
7
+ Title,
8
8
  Popper,
9
9
  TreeView,
10
10
  TreeViewDataItem
@@ -14,6 +14,7 @@ export const ComposableTreeViewMenu: React.FunctionComponent = () => {
14
14
  const [isOpen, setIsOpen] = React.useState<boolean>(false);
15
15
  const [checkedItems, setCheckedItems] = React.useState<TreeViewDataItem[]>([]);
16
16
  const toggleRef = React.useRef<HTMLButtonElement>();
17
+ const containerRef = React.useRef<HTMLDivElement>();
17
18
  const menuRef = React.useRef<HTMLDivElement>();
18
19
 
19
20
  const statusOptions: TreeViewDataItem[] = [
@@ -85,7 +86,7 @@ export const ComposableTreeViewMenu: React.FunctionComponent = () => {
85
86
  customBadgeContent: 0
86
87
  }
87
88
  ];
88
- // Helper functions
89
+ // Helper functions for tree
89
90
  const isChecked = (dataItem: TreeViewDataItem) => checkedItems.some(item => item.id === dataItem.id);
90
91
  const areAllDescendantsChecked = (dataItem: TreeViewDataItem) =>
91
92
  dataItem.children ? dataItem.children.every(child => areAllDescendantsChecked(child)) : isChecked(dataItem);
@@ -163,18 +164,32 @@ export const ComposableTreeViewMenu: React.FunctionComponent = () => {
163
164
  );
164
165
  };
165
166
 
167
+ // Controls keys that should open/close the menu
166
168
  const handleMenuKeys = (event: KeyboardEvent) => {
167
169
  if (!isOpen) {
168
170
  return;
169
171
  }
170
172
  if (menuRef.current.contains(event.target as Node) || toggleRef.current.contains(event.target as Node)) {
171
- if (event.key === 'Escape' || event.key === 'Tab') {
173
+ // The escape key when pressed while inside the menu should close the menu and refocus the toggle
174
+ if (event.key === 'Escape') {
172
175
  setIsOpen(!isOpen);
173
176
  toggleRef.current.focus();
174
177
  }
178
+
179
+ // The tab key when pressed while inside the menu and on the contained last tree view should close the menu and refocus the toggle
180
+ // Shift tab should keep the default behavior to return to a previous tree view
181
+ if (event.key === 'Tab' && !event.shiftKey) {
182
+ const treeList = menuRef.current.querySelectorAll('.pf-c-tree-view');
183
+ if (treeList[treeList.length - 1].contains(event.target as Node)) {
184
+ event.preventDefault();
185
+ setIsOpen(!isOpen);
186
+ toggleRef.current.focus();
187
+ }
188
+ }
175
189
  }
176
190
  };
177
191
 
192
+ // Controls that a click outside the menu while the menu is open should close the menu
178
193
  const handleClickOutside = (event: MouseEvent) => {
179
194
  if (isOpen && !menuRef.current.contains(event.target as Node)) {
180
195
  setIsOpen(false);
@@ -194,7 +209,7 @@ export const ComposableTreeViewMenu: React.FunctionComponent = () => {
194
209
  ev.stopPropagation(); // Stop handleClickOutside from handling
195
210
  setTimeout(() => {
196
211
  if (menuRef.current) {
197
- const firstElement = menuRef.current.querySelector('li > button:not(:disabled)');
212
+ const firstElement = menuRef.current.querySelector('li button:not(:disabled)');
198
213
  firstElement && (firstElement as HTMLElement).focus();
199
214
  }
200
215
  }, 0);
@@ -202,39 +217,58 @@ export const ComposableTreeViewMenu: React.FunctionComponent = () => {
202
217
  };
203
218
 
204
219
  const toggle = (
205
- <MenuToggle ref={toggleRef} onClick={onToggleClick} isExpanded={isOpen}>
206
- {isOpen ? 'Expanded' : 'Collapsed'}
207
- </MenuToggle>
220
+ <div ref={containerRef}>
221
+ <MenuToggle ref={toggleRef} onClick={onToggleClick} isExpanded={isOpen}>
222
+ {isOpen ? 'Expanded' : 'Collapsed'}
223
+ </MenuToggle>
224
+ </div>
208
225
  );
209
226
  const statusMapped = statusOptions.map(mapTree);
210
227
  const roleMapped = roleOptions.map(mapTree);
211
228
  const menu = (
212
- <Menu
229
+ <Panel
213
230
  ref={menuRef}
214
- // eslint-disable-next-line no-console
215
- onSelect={(_ev, itemId) => console.log('selected', itemId)}
216
- style={
217
- {
218
- '--pf-c-menu--Width': '300px'
219
- } as React.CSSProperties
220
- }
231
+ variant="raised"
232
+ style={{
233
+ width: '300px'
234
+ }}
221
235
  >
222
- <MenuContent>
223
- <MenuList>
224
- <MenuGroup label="Status">
236
+ <PanelMain>
237
+ <section>
238
+ <PanelMainBody style={{ paddingBottom: 0 }}>
239
+ <Title headingLevel="h1" size={'md'}>
240
+ Status
241
+ </Title>
242
+ </PanelMainBody>
243
+ <PanelMainBody style={{ padding: 0 }}>
225
244
  <TreeView
226
245
  data={statusMapped}
227
246
  hasBadges
228
247
  hasChecks
229
248
  onCheck={(event, item) => onCheck(event, item, 'status')}
230
249
  />
231
- </MenuGroup>
232
- <MenuGroup label="Role">
250
+ </PanelMainBody>
251
+ </section>
252
+ <section>
253
+ <PanelMainBody style={{ paddingBottom: 0, paddingTop: 0 }}>
254
+ <Title headingLevel="h1" size={'md'}>
255
+ Roles
256
+ </Title>
257
+ </PanelMainBody>
258
+ <PanelMainBody style={{ padding: 0 }}>
233
259
  <TreeView data={roleMapped} hasBadges hasChecks onCheck={(event, item) => onCheck(event, item, 'role')} />
234
- </MenuGroup>
235
- </MenuList>
236
- </MenuContent>
237
- </Menu>
260
+ </PanelMainBody>
261
+ </section>
262
+ </PanelMain>
263
+ </Panel>
264
+ );
265
+ return (
266
+ <Popper
267
+ trigger={toggle}
268
+ popper={menu}
269
+ isVisible={isOpen}
270
+ appendTo={containerRef.current}
271
+ popperMatchesTriggerWidth={false}
272
+ />
238
273
  );
239
- return <Popper trigger={toggle} popper={menu} isVisible={isOpen} popperMatchesTriggerWidth={false} />;
240
274
  };
@@ -18,6 +18,8 @@ export interface KeyboardHandlerProps {
18
18
  validSiblingTags?: string[];
19
19
  /** Flag indicating that the tabIndex of the currently focused element and next focused element should be updated, in the case of using a roving tabIndex */
20
20
  updateTabIndex?: boolean;
21
+ /** Flag indicating that next focusable element of a horizontal movement will be this element's sibling */
22
+ onlyTraverseSiblings?: boolean;
21
23
  /** Flag indicating that the included vertical arrow key handling should be ignored */
22
24
  noVerticalArrowHandling?: boolean;
23
25
  /** Flag indicating that the included horizontal arrow key handling should be ignored */
@@ -176,6 +178,7 @@ export class KeyboardHandler extends React.Component<KeyboardHandlerProps> {
176
178
  isActiveElement: (navigableElement: Element) => document.activeElement === navigableElement,
177
179
  getFocusableElement: (navigableElement: Element) => navigableElement,
178
180
  validSiblingTags: ['BUTTON', 'A'],
181
+ onlyTraverseSiblings: true,
179
182
  updateTabIndex: true,
180
183
  noHorizontalArrowHandling: false,
181
184
  noVerticalArrowHandling: false,
@@ -212,7 +215,8 @@ export class KeyboardHandler extends React.Component<KeyboardHandlerProps> {
212
215
  updateTabIndex,
213
216
  validSiblingTags,
214
217
  additionalKeyHandler,
215
- createNavigableElements
218
+ createNavigableElements,
219
+ onlyTraverseSiblings
216
220
  } = this.props;
217
221
 
218
222
  // Pass the event off to be handled by any custom handler
@@ -256,7 +260,8 @@ export class KeyboardHandler extends React.Component<KeyboardHandlerProps> {
256
260
  validSiblingTags,
257
261
  noVerticalArrowHandling,
258
262
  noHorizontalArrowHandling,
259
- updateTabIndex
263
+ updateTabIndex,
264
+ onlyTraverseSiblings
260
265
  );
261
266
  };
262
267