@patternfly/react-core 4.276.1 → 4.276.2

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 (106) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/components/ExpandableSection/ExpandableSection.d.ts +7 -0
  3. package/components/ExpandableSection/ExpandableSection.d.ts.map +1 -1
  4. package/components/ExpandableSection/ExpandableSection.js +39 -4
  5. package/components/ExpandableSection/ExpandableSection.js.map +1 -1
  6. package/components/Menu/Menu.d.ts +3 -0
  7. package/components/Menu/Menu.d.ts.map +1 -1
  8. package/components/Menu/Menu.js +6 -4
  9. package/components/Menu/Menu.js.map +1 -1
  10. package/components/Menu/MenuContext.d.ts +1 -0
  11. package/components/Menu/MenuContext.d.ts.map +1 -1
  12. package/components/Menu/MenuContext.js +2 -1
  13. package/components/Menu/MenuContext.js.map +1 -1
  14. package/components/Menu/MenuItem.d.ts.map +1 -1
  15. package/components/Menu/MenuItem.js +3 -2
  16. package/components/Menu/MenuItem.js.map +1 -1
  17. package/components/Menu/MenuList.d.ts +4 -0
  18. package/components/Menu/MenuList.d.ts.map +1 -1
  19. package/components/Menu/MenuList.js +4 -2
  20. package/components/Menu/MenuList.js.map +1 -1
  21. package/dist/esm/components/ExpandableSection/ExpandableSection.d.ts +7 -0
  22. package/dist/esm/components/ExpandableSection/ExpandableSection.d.ts.map +1 -1
  23. package/dist/esm/components/ExpandableSection/ExpandableSection.js +39 -4
  24. package/dist/esm/components/ExpandableSection/ExpandableSection.js.map +1 -1
  25. package/dist/esm/components/Menu/Menu.d.ts +3 -0
  26. package/dist/esm/components/Menu/Menu.d.ts.map +1 -1
  27. package/dist/esm/components/Menu/Menu.js +6 -4
  28. package/dist/esm/components/Menu/Menu.js.map +1 -1
  29. package/dist/esm/components/Menu/MenuContext.d.ts +1 -0
  30. package/dist/esm/components/Menu/MenuContext.d.ts.map +1 -1
  31. package/dist/esm/components/Menu/MenuContext.js +2 -1
  32. package/dist/esm/components/Menu/MenuContext.js.map +1 -1
  33. package/dist/esm/components/Menu/MenuItem.d.ts.map +1 -1
  34. package/dist/esm/components/Menu/MenuItem.js +3 -2
  35. package/dist/esm/components/Menu/MenuItem.js.map +1 -1
  36. package/dist/esm/components/Menu/MenuList.d.ts +4 -0
  37. package/dist/esm/components/Menu/MenuList.d.ts.map +1 -1
  38. package/dist/esm/components/Menu/MenuList.js +4 -2
  39. package/dist/esm/components/Menu/MenuList.js.map +1 -1
  40. package/dist/esm/next/components/Dropdown/Dropdown.d.ts.map +1 -1
  41. package/dist/esm/next/components/Dropdown/Dropdown.js +19 -20
  42. package/dist/esm/next/components/Dropdown/Dropdown.js.map +1 -1
  43. package/dist/esm/next/components/Select/Select.d.ts +2 -0
  44. package/dist/esm/next/components/Select/Select.d.ts.map +1 -1
  45. package/dist/esm/next/components/Select/Select.js +21 -23
  46. package/dist/esm/next/components/Select/Select.js.map +1 -1
  47. package/dist/esm/next/components/Select/SelectList.d.ts +4 -0
  48. package/dist/esm/next/components/Select/SelectList.d.ts.map +1 -1
  49. package/dist/esm/next/components/Select/SelectList.js +2 -2
  50. package/dist/esm/next/components/Select/SelectList.js.map +1 -1
  51. package/dist/js/components/ExpandableSection/ExpandableSection.d.ts +7 -0
  52. package/dist/js/components/ExpandableSection/ExpandableSection.d.ts.map +1 -1
  53. package/dist/js/components/ExpandableSection/ExpandableSection.js +39 -4
  54. package/dist/js/components/ExpandableSection/ExpandableSection.js.map +1 -1
  55. package/dist/js/components/Menu/Menu.d.ts +3 -0
  56. package/dist/js/components/Menu/Menu.d.ts.map +1 -1
  57. package/dist/js/components/Menu/Menu.js +6 -4
  58. package/dist/js/components/Menu/Menu.js.map +1 -1
  59. package/dist/js/components/Menu/MenuContext.d.ts +1 -0
  60. package/dist/js/components/Menu/MenuContext.d.ts.map +1 -1
  61. package/dist/js/components/Menu/MenuContext.js +2 -1
  62. package/dist/js/components/Menu/MenuContext.js.map +1 -1
  63. package/dist/js/components/Menu/MenuItem.d.ts.map +1 -1
  64. package/dist/js/components/Menu/MenuItem.js +3 -2
  65. package/dist/js/components/Menu/MenuItem.js.map +1 -1
  66. package/dist/js/components/Menu/MenuList.d.ts +4 -0
  67. package/dist/js/components/Menu/MenuList.d.ts.map +1 -1
  68. package/dist/js/components/Menu/MenuList.js +4 -2
  69. package/dist/js/components/Menu/MenuList.js.map +1 -1
  70. package/dist/js/next/components/Dropdown/Dropdown.d.ts.map +1 -1
  71. package/dist/js/next/components/Dropdown/Dropdown.js +19 -20
  72. package/dist/js/next/components/Dropdown/Dropdown.js.map +1 -1
  73. package/dist/js/next/components/Select/Select.d.ts +2 -0
  74. package/dist/js/next/components/Select/Select.d.ts.map +1 -1
  75. package/dist/js/next/components/Select/Select.js +21 -23
  76. package/dist/js/next/components/Select/Select.js.map +1 -1
  77. package/dist/js/next/components/Select/SelectList.d.ts +4 -0
  78. package/dist/js/next/components/Select/SelectList.d.ts.map +1 -1
  79. package/dist/js/next/components/Select/SelectList.js +2 -2
  80. package/dist/js/next/components/Select/SelectList.js.map +1 -1
  81. package/dist/umd/react-core.min.js +2 -2
  82. package/next/components/Dropdown/Dropdown.d.ts.map +1 -1
  83. package/next/components/Dropdown/Dropdown.js +19 -20
  84. package/next/components/Dropdown/Dropdown.js.map +1 -1
  85. package/next/components/Select/Select.d.ts +2 -0
  86. package/next/components/Select/Select.d.ts.map +1 -1
  87. package/next/components/Select/Select.js +21 -23
  88. package/next/components/Select/Select.js.map +1 -1
  89. package/next/components/Select/SelectList.d.ts +4 -0
  90. package/next/components/Select/SelectList.d.ts.map +1 -1
  91. package/next/components/Select/SelectList.js +2 -2
  92. package/next/components/Select/SelectList.js.map +1 -1
  93. package/package.json +2 -2
  94. package/src/components/ExpandableSection/ExpandableSection.tsx +48 -4
  95. package/src/components/Menu/Menu.tsx +8 -2
  96. package/src/components/Menu/MenuContext.ts +3 -1
  97. package/src/components/Menu/MenuItem.tsx +5 -2
  98. package/src/components/Menu/MenuList.tsx +20 -5
  99. package/src/components/Menu/examples/Menu.md +17 -13
  100. package/src/components/Menu/examples/MenuOptionMultiSelect.tsx +2 -2
  101. package/src/components/Menu/examples/MenuOptionSingleSelect.tsx +2 -2
  102. package/src/next/components/Dropdown/Dropdown.tsx +12 -13
  103. package/src/next/components/Select/Select.tsx +16 -13
  104. package/src/next/components/Select/SelectList.tsx +6 -1
  105. package/src/next/components/Select/examples/SelectCheckbox.tsx +1 -0
  106. package/src/next/components/Select/examples/SelectMultiTypeahead.tsx +1 -1
@@ -58,28 +58,27 @@ const DropdownBase: React.FunctionComponent<DropdownProps> = ({
58
58
  const menuRef = (innerRef as React.RefObject<HTMLDivElement>) || localMenuRef;
59
59
  React.useEffect(() => {
60
60
  const handleMenuKeys = (event: KeyboardEvent) => {
61
- if (!isOpen && toggleRef.current?.contains(event.target as Node)) {
62
- // toggle was clicked open, focus on first menu item
63
- if (event.key === 'Enter') {
64
- setTimeout(() => {
65
- const firstElement = menuRef.current.querySelector('li > button:not(:disabled)');
66
- firstElement && (firstElement as HTMLElement).focus();
67
- }, 0);
68
- }
69
- }
70
61
  // Close the menu on tab or escape if onOpenChange is provided
71
62
  if (
72
63
  (isOpen && onOpenChange && menuRef.current?.contains(event.target as Node)) ||
73
64
  toggleRef.current?.contains(event.target as Node)
74
65
  ) {
75
66
  if (event.key === 'Escape' || event.key === 'Tab') {
76
- onOpenChange(!isOpen);
67
+ onOpenChange(false);
77
68
  toggleRef.current?.focus();
78
69
  }
79
70
  }
80
71
  };
81
72
 
82
- const handleClickOutside = (event: MouseEvent) => {
73
+ const handleClick = (event: MouseEvent) => {
74
+ // toggle was clicked open via keyboard, focus on first menu item
75
+ if (isOpen && toggleRef.current?.contains(event.target as Node) && event.detail === 0) {
76
+ setTimeout(() => {
77
+ const firstElement = menuRef?.current?.querySelector('li button:not(:disabled),li input:not(:disabled)');
78
+ firstElement && (firstElement as HTMLElement).focus();
79
+ }, 0);
80
+ }
81
+
83
82
  // If the event is not on the toggle and onOpenChange callback is provided, close the menu
84
83
  if (isOpen && onOpenChange && !toggleRef?.current?.contains(event.target as Node)) {
85
84
  if (isOpen && !menuRef.current?.contains(event.target as Node)) {
@@ -89,11 +88,11 @@ const DropdownBase: React.FunctionComponent<DropdownProps> = ({
89
88
  };
90
89
 
91
90
  window.addEventListener('keydown', handleMenuKeys);
92
- window.addEventListener('click', handleClickOutside);
91
+ window.addEventListener('click', handleClick);
93
92
 
94
93
  return () => {
95
94
  window.removeEventListener('keydown', handleMenuKeys);
96
- window.removeEventListener('click', handleClickOutside);
95
+ window.removeEventListener('click', handleClick);
97
96
  };
98
97
  }, [isOpen, menuRef, onOpenChange]);
99
98
 
@@ -28,6 +28,8 @@ export interface SelectProps extends MenuProps, OUIAProps {
28
28
  innerRef?: React.Ref<HTMLDivElement>;
29
29
  /** z-index of the select menu */
30
30
  zIndex?: number;
31
+ /** @beta Determines the accessible role of the select. For a checkbox select pass in "menu". */
32
+ role?: string;
31
33
  }
32
34
 
33
35
  const SelectBase: React.FunctionComponent<SelectProps & OUIAProps> = ({
@@ -42,6 +44,7 @@ const SelectBase: React.FunctionComponent<SelectProps & OUIAProps> = ({
42
44
  minWidth,
43
45
  innerRef,
44
46
  zIndex = 9999,
47
+ role = 'listbox',
45
48
  ...props
46
49
  }: SelectProps & OUIAProps) => {
47
50
  const localMenuRef = React.useRef<HTMLDivElement>();
@@ -51,28 +54,27 @@ const SelectBase: React.FunctionComponent<SelectProps & OUIAProps> = ({
51
54
  const menuRef = (innerRef as React.RefObject<HTMLDivElement>) || localMenuRef;
52
55
  React.useEffect(() => {
53
56
  const handleMenuKeys = (event: KeyboardEvent) => {
54
- if (!isOpen && toggleRef.current?.contains(event.target as Node)) {
55
- // toggle was clicked open, focus on first menu item
56
- if (event.key === 'Enter' || event.key === 'Space') {
57
- setTimeout(() => {
58
- const firstElement = menuRef?.current?.querySelector('li button:not(:disabled),li input:not(:disabled)');
59
- firstElement && (firstElement as HTMLElement).focus();
60
- }, 0);
61
- }
62
- }
63
57
  // Close the menu on tab or escape if onOpenChange is provided
64
58
  if (
65
59
  (isOpen && onOpenChange && menuRef.current?.contains(event.target as Node)) ||
66
60
  toggleRef.current?.contains(event.target as Node)
67
61
  ) {
68
62
  if (event.key === 'Escape' || event.key === 'Tab') {
69
- onOpenChange(!isOpen);
63
+ onOpenChange(false);
70
64
  toggleRef.current?.focus();
71
65
  }
72
66
  }
73
67
  };
74
68
 
75
- const handleClickOutside = (event: MouseEvent) => {
69
+ const handleClick = (event: MouseEvent) => {
70
+ // toggle was clicked open via keyboard, focus on first menu item
71
+ if (isOpen && toggleRef.current?.contains(event.target as Node) && event.detail === 0) {
72
+ setTimeout(() => {
73
+ const firstElement = menuRef?.current?.querySelector('li button:not(:disabled),li input:not(:disabled)');
74
+ firstElement && (firstElement as HTMLElement).focus();
75
+ }, 0);
76
+ }
77
+
76
78
  // If the event is not on the toggle and onOpenChange callback is provided, close the menu
77
79
  if (isOpen && onOpenChange && !toggleRef?.current?.contains(event.target as Node)) {
78
80
  if (isOpen && !menuRef.current?.contains(event.target as Node)) {
@@ -82,16 +84,17 @@ const SelectBase: React.FunctionComponent<SelectProps & OUIAProps> = ({
82
84
  };
83
85
 
84
86
  window.addEventListener('keydown', handleMenuKeys);
85
- window.addEventListener('click', handleClickOutside);
87
+ window.addEventListener('click', handleClick);
86
88
 
87
89
  return () => {
88
90
  window.removeEventListener('keydown', handleMenuKeys);
89
- window.removeEventListener('click', handleClickOutside);
91
+ window.removeEventListener('click', handleClick);
90
92
  };
91
93
  }, [isOpen, menuRef, onOpenChange]);
92
94
 
93
95
  const menu = (
94
96
  <Menu
97
+ role={role}
95
98
  className={css(className)}
96
99
  ref={menuRef}
97
100
  onSelect={(event, itemId) => onSelect(event, itemId)}
@@ -7,14 +7,19 @@ export interface SelectListProps extends MenuListProps {
7
7
  children: React.ReactNode;
8
8
  /** Classes applied to root element of select list */
9
9
  className?: string;
10
+ /** @beta Indicates to assistive technologies whether more than one item can be selected
11
+ * for a non-checkbox select.
12
+ */
13
+ isAriaMultiselectable?: boolean;
10
14
  }
11
15
 
12
16
  export const SelectList: React.FunctionComponent<MenuListProps> = ({
13
17
  children,
14
18
  className,
19
+ isAriaMultiselectable = false,
15
20
  ...props
16
21
  }: SelectListProps) => (
17
- <MenuList className={css(className)} {...props}>
22
+ <MenuList isAriaMultiselectable={isAriaMultiselectable} className={css(className)} {...props}>
18
23
  {children}
19
24
  </MenuList>
20
25
  );
@@ -40,6 +40,7 @@ export const SelectCheckbox: React.FunctionComponent = () => {
40
40
 
41
41
  return (
42
42
  <Select
43
+ role="menu"
43
44
  id="checkbox-select"
44
45
  ref={menuRef}
45
46
  isOpen={isOpen}
@@ -179,7 +179,7 @@ export const SelectMultiTypeahead: React.FunctionComponent = () => {
179
179
  onOpenChange={() => setIsOpen(false)}
180
180
  toggle={toggle}
181
181
  >
182
- <SelectList>
182
+ <SelectList isAriaMultiselectable>
183
183
  {selectOptions.map((option, index) => (
184
184
  <SelectOption
185
185
  key={option.itemId || option.children}