@patternfly/react-core 4.236.7 → 4.236.10

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 (181) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/esm/components/ApplicationLauncher/ApplicationLauncher.d.ts +2 -0
  3. package/dist/esm/components/ApplicationLauncher/ApplicationLauncher.d.ts.map +1 -1
  4. package/dist/esm/components/ApplicationLauncher/ApplicationLauncher.js +4 -3
  5. package/dist/esm/components/ApplicationLauncher/ApplicationLauncher.js.map +1 -1
  6. package/dist/esm/components/BackToTop/BackToTop.d.ts +1 -1
  7. package/dist/esm/components/ContextSelector/ContextSelector.d.ts +2 -0
  8. package/dist/esm/components/ContextSelector/ContextSelector.d.ts.map +1 -1
  9. package/dist/esm/components/ContextSelector/ContextSelector.js +4 -3
  10. package/dist/esm/components/ContextSelector/ContextSelector.js.map +1 -1
  11. package/dist/esm/components/Dropdown/Dropdown.d.ts +2 -0
  12. package/dist/esm/components/Dropdown/Dropdown.d.ts.map +1 -1
  13. package/dist/esm/components/Dropdown/Dropdown.js +2 -2
  14. package/dist/esm/components/Dropdown/Dropdown.js.map +1 -1
  15. package/dist/esm/components/Dropdown/DropdownWithContext.d.ts.map +1 -1
  16. package/dist/esm/components/Dropdown/DropdownWithContext.js +2 -2
  17. package/dist/esm/components/Dropdown/DropdownWithContext.js.map +1 -1
  18. package/dist/esm/components/DualListSelector/DualListSelectorControl.d.ts +1 -1
  19. package/dist/esm/components/DualListSelector/DualListSelectorControlsWrapper.d.ts +1 -1
  20. package/dist/esm/components/DualListSelector/DualListSelectorListItem.d.ts +1 -1
  21. package/dist/esm/components/DualListSelector/DualListSelectorListWrapper.d.ts +1 -1
  22. package/dist/esm/components/Menu/MenuContent.d.ts +1 -1
  23. package/dist/esm/components/Menu/MenuGroup.d.ts +1 -1
  24. package/dist/esm/components/Menu/MenuInput.d.ts +1 -1
  25. package/dist/esm/components/Menu/MenuItem.d.ts +1 -1
  26. package/dist/esm/components/Nav/NavItem.d.ts +2 -0
  27. package/dist/esm/components/Nav/NavItem.d.ts.map +1 -1
  28. package/dist/esm/components/Nav/NavItem.js +2 -2
  29. package/dist/esm/components/Nav/NavItem.js.map +1 -1
  30. package/dist/esm/components/NotificationDrawer/NotificationDrawer.d.ts +1 -1
  31. package/dist/esm/components/OptionsMenu/OptionsMenu.d.ts +2 -0
  32. package/dist/esm/components/OptionsMenu/OptionsMenu.d.ts.map +1 -1
  33. package/dist/esm/components/OptionsMenu/OptionsMenu.js +2 -2
  34. package/dist/esm/components/OptionsMenu/OptionsMenu.js.map +1 -1
  35. package/dist/esm/components/Panel/Panel.d.ts +1 -1
  36. package/dist/esm/components/Popover/Popover.d.ts +2 -0
  37. package/dist/esm/components/Popover/Popover.d.ts.map +1 -1
  38. package/dist/esm/components/Popover/Popover.js +2 -2
  39. package/dist/esm/components/Popover/Popover.js.map +1 -1
  40. package/dist/esm/components/Popover/PopoverCloseButton.d.ts.map +1 -1
  41. package/dist/esm/components/Popover/PopoverCloseButton.js +2 -11
  42. package/dist/esm/components/Popover/PopoverCloseButton.js.map +1 -1
  43. package/dist/esm/components/SearchInput/SearchInput.d.ts +2 -0
  44. package/dist/esm/components/SearchInput/SearchInput.d.ts.map +1 -1
  45. package/dist/esm/components/SearchInput/SearchInput.js +2 -2
  46. package/dist/esm/components/SearchInput/SearchInput.js.map +1 -1
  47. package/dist/esm/components/Select/Select.d.ts +2 -0
  48. package/dist/esm/components/Select/Select.d.ts.map +1 -1
  49. package/dist/esm/components/Select/Select.js +4 -3
  50. package/dist/esm/components/Select/Select.js.map +1 -1
  51. package/dist/esm/components/Tabs/OverflowTab.d.ts +2 -0
  52. package/dist/esm/components/Tabs/OverflowTab.d.ts.map +1 -1
  53. package/dist/esm/components/Tabs/OverflowTab.js +2 -2
  54. package/dist/esm/components/Tabs/OverflowTab.js.map +1 -1
  55. package/dist/esm/components/Tabs/Tab.d.ts +1 -1
  56. package/dist/esm/components/TimePicker/TimePicker.d.ts +3 -0
  57. package/dist/esm/components/TimePicker/TimePicker.d.ts.map +1 -1
  58. package/dist/esm/components/TimePicker/TimePicker.js +5 -4
  59. package/dist/esm/components/TimePicker/TimePicker.js.map +1 -1
  60. package/dist/esm/components/Tooltip/Tooltip.d.ts +2 -0
  61. package/dist/esm/components/Tooltip/Tooltip.d.ts.map +1 -1
  62. package/dist/esm/components/Tooltip/Tooltip.js +2 -2
  63. package/dist/esm/components/Tooltip/Tooltip.js.map +1 -1
  64. package/dist/esm/helpers/FocusTrap/FocusTrap.d.ts +5 -19
  65. package/dist/esm/helpers/FocusTrap/FocusTrap.d.ts.map +1 -1
  66. package/dist/esm/helpers/FocusTrap/FocusTrap.js +10 -6
  67. package/dist/esm/helpers/FocusTrap/FocusTrap.js.map +1 -1
  68. package/dist/esm/helpers/Popper/Popper.d.ts +5 -0
  69. package/dist/esm/helpers/Popper/Popper.d.ts.map +1 -1
  70. package/dist/esm/helpers/Popper/Popper.js +42 -7
  71. package/dist/esm/helpers/Popper/Popper.js.map +1 -1
  72. package/dist/js/components/ApplicationLauncher/ApplicationLauncher.d.ts +2 -0
  73. package/dist/js/components/ApplicationLauncher/ApplicationLauncher.d.ts.map +1 -1
  74. package/dist/js/components/ApplicationLauncher/ApplicationLauncher.js +4 -3
  75. package/dist/js/components/ApplicationLauncher/ApplicationLauncher.js.map +1 -1
  76. package/dist/js/components/BackToTop/BackToTop.d.ts +1 -1
  77. package/dist/js/components/ContextSelector/ContextSelector.d.ts +2 -0
  78. package/dist/js/components/ContextSelector/ContextSelector.d.ts.map +1 -1
  79. package/dist/js/components/ContextSelector/ContextSelector.js +4 -3
  80. package/dist/js/components/ContextSelector/ContextSelector.js.map +1 -1
  81. package/dist/js/components/Dropdown/Dropdown.d.ts +2 -0
  82. package/dist/js/components/Dropdown/Dropdown.d.ts.map +1 -1
  83. package/dist/js/components/Dropdown/Dropdown.js +2 -2
  84. package/dist/js/components/Dropdown/Dropdown.js.map +1 -1
  85. package/dist/js/components/Dropdown/DropdownWithContext.d.ts.map +1 -1
  86. package/dist/js/components/Dropdown/DropdownWithContext.js +2 -2
  87. package/dist/js/components/Dropdown/DropdownWithContext.js.map +1 -1
  88. package/dist/js/components/DualListSelector/DualListSelectorControl.d.ts +1 -1
  89. package/dist/js/components/DualListSelector/DualListSelectorControlsWrapper.d.ts +1 -1
  90. package/dist/js/components/DualListSelector/DualListSelectorListItem.d.ts +1 -1
  91. package/dist/js/components/DualListSelector/DualListSelectorListWrapper.d.ts +1 -1
  92. package/dist/js/components/Menu/MenuContent.d.ts +1 -1
  93. package/dist/js/components/Menu/MenuGroup.d.ts +1 -1
  94. package/dist/js/components/Menu/MenuInput.d.ts +1 -1
  95. package/dist/js/components/Menu/MenuItem.d.ts +1 -1
  96. package/dist/js/components/Nav/NavItem.d.ts +2 -0
  97. package/dist/js/components/Nav/NavItem.d.ts.map +1 -1
  98. package/dist/js/components/Nav/NavItem.js +2 -2
  99. package/dist/js/components/Nav/NavItem.js.map +1 -1
  100. package/dist/js/components/NotificationDrawer/NotificationDrawer.d.ts +1 -1
  101. package/dist/js/components/OptionsMenu/OptionsMenu.d.ts +2 -0
  102. package/dist/js/components/OptionsMenu/OptionsMenu.d.ts.map +1 -1
  103. package/dist/js/components/OptionsMenu/OptionsMenu.js +2 -2
  104. package/dist/js/components/OptionsMenu/OptionsMenu.js.map +1 -1
  105. package/dist/js/components/Panel/Panel.d.ts +1 -1
  106. package/dist/js/components/Popover/Popover.d.ts +2 -0
  107. package/dist/js/components/Popover/Popover.d.ts.map +1 -1
  108. package/dist/js/components/Popover/Popover.js +2 -2
  109. package/dist/js/components/Popover/Popover.js.map +1 -1
  110. package/dist/js/components/Popover/PopoverCloseButton.d.ts.map +1 -1
  111. package/dist/js/components/Popover/PopoverCloseButton.js +2 -11
  112. package/dist/js/components/Popover/PopoverCloseButton.js.map +1 -1
  113. package/dist/js/components/SearchInput/SearchInput.d.ts +2 -0
  114. package/dist/js/components/SearchInput/SearchInput.d.ts.map +1 -1
  115. package/dist/js/components/SearchInput/SearchInput.js +2 -2
  116. package/dist/js/components/SearchInput/SearchInput.js.map +1 -1
  117. package/dist/js/components/Select/Select.d.ts +2 -0
  118. package/dist/js/components/Select/Select.d.ts.map +1 -1
  119. package/dist/js/components/Select/Select.js +4 -3
  120. package/dist/js/components/Select/Select.js.map +1 -1
  121. package/dist/js/components/Tabs/OverflowTab.d.ts +2 -0
  122. package/dist/js/components/Tabs/OverflowTab.d.ts.map +1 -1
  123. package/dist/js/components/Tabs/OverflowTab.js +2 -2
  124. package/dist/js/components/Tabs/OverflowTab.js.map +1 -1
  125. package/dist/js/components/Tabs/Tab.d.ts +1 -1
  126. package/dist/js/components/TimePicker/TimePicker.d.ts +3 -0
  127. package/dist/js/components/TimePicker/TimePicker.d.ts.map +1 -1
  128. package/dist/js/components/TimePicker/TimePicker.js +5 -4
  129. package/dist/js/components/TimePicker/TimePicker.js.map +1 -1
  130. package/dist/js/components/Tooltip/Tooltip.d.ts +2 -0
  131. package/dist/js/components/Tooltip/Tooltip.d.ts.map +1 -1
  132. package/dist/js/components/Tooltip/Tooltip.js +2 -2
  133. package/dist/js/components/Tooltip/Tooltip.js.map +1 -1
  134. package/dist/js/helpers/FocusTrap/FocusTrap.d.ts +5 -19
  135. package/dist/js/helpers/FocusTrap/FocusTrap.d.ts.map +1 -1
  136. package/dist/js/helpers/FocusTrap/FocusTrap.js +10 -7
  137. package/dist/js/helpers/FocusTrap/FocusTrap.js.map +1 -1
  138. package/dist/js/helpers/Popper/Popper.d.ts +5 -0
  139. package/dist/js/helpers/Popper/Popper.d.ts.map +1 -1
  140. package/dist/js/helpers/Popper/Popper.js +42 -7
  141. package/dist/js/helpers/Popper/Popper.js.map +1 -1
  142. package/dist/umd/react-core.min.css +1072 -1072
  143. package/dist/umd/react-core.min.js +5 -5
  144. package/package.json +5 -5
  145. package/src/components/AlertGroup/examples/AlertGroup.md +52 -15
  146. package/src/components/ApplicationLauncher/ApplicationLauncher.tsx +6 -1
  147. package/src/components/ApplicationLauncher/__tests__/ApplicationLauncher.test.tsx +10 -1
  148. package/src/components/ApplicationLauncher/__tests__/__snapshots__/ApplicationLauncher.test.tsx.snap +153 -7
  149. package/src/components/ContextSelector/ContextSelector.tsx +6 -1
  150. package/src/components/ContextSelector/__tests__/ContextSelector.test.tsx +18 -1
  151. package/src/components/ContextSelector/__tests__/__snapshots__/ContextSelector.test.tsx.snap +144 -0
  152. package/src/components/Dropdown/Dropdown.tsx +9 -1
  153. package/src/components/Dropdown/DropdownWithContext.tsx +2 -0
  154. package/src/components/Dropdown/__tests__/Dropdown.test.tsx +16 -0
  155. package/src/components/Dropdown/__tests__/__snapshots__/Dropdown.test.tsx.snap +131 -7
  156. package/src/components/Nav/NavItem.tsx +4 -0
  157. package/src/components/Nav/__tests__/Nav.test.tsx +19 -0
  158. package/src/components/Nav/__tests__/__snapshots__/Nav.test.tsx.snap +111 -42
  159. package/src/components/OptionsMenu/OptionsMenu.tsx +4 -0
  160. package/src/components/OptionsMenu/__tests__/OptionsMenu.test.tsx +17 -0
  161. package/src/components/OptionsMenu/__tests__/__snapshots__/OptionsMenu.test.tsx.snap +216 -20
  162. package/src/components/Popover/Popover.tsx +4 -0
  163. package/src/components/Popover/PopoverCloseButton.tsx +6 -17
  164. package/src/components/Popover/__tests__/Popover.test.tsx +25 -0
  165. package/src/components/Popover/__tests__/__snapshots__/Popover.test.tsx.snap +10 -0
  166. package/src/components/SearchInput/SearchInput.tsx +4 -0
  167. package/src/components/SearchInput/__tests__/SearchInput.test.tsx +27 -1
  168. package/src/components/SearchInput/__tests__/__snapshots__/SearchInput.test.tsx.snap +130 -6
  169. package/src/components/Select/Select.tsx +6 -1
  170. package/src/components/Select/__tests__/Select.test.tsx +23 -7
  171. package/src/components/Select/__tests__/__snapshots__/Select.test.tsx.snap +152 -46
  172. package/src/components/Tabs/OverflowTab.tsx +4 -0
  173. package/src/components/Tabs/__tests__/OverflowTab.test.tsx +31 -7
  174. package/src/components/Tabs/__tests__/__snapshots__/OverflowTab.test.tsx.snap +89 -0
  175. package/src/components/TimePicker/TimePicker.tsx +6 -1
  176. package/src/components/TimePicker/__tests__/TimePicker.test.tsx +16 -1
  177. package/src/components/Tooltip/Tooltip.tsx +4 -0
  178. package/src/components/Tooltip/__tests__/Tooltip.test.tsx +21 -0
  179. package/src/components/Tooltip/__tests__/__snapshots__/Tooltip.test.tsx.snap +10 -0
  180. package/src/helpers/FocusTrap/FocusTrap.tsx +21 -5
  181. package/src/helpers/Popper/Popper.tsx +54 -12
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@patternfly/react-core",
3
- "version": "4.236.7",
3
+ "version": "4.236.10",
4
4
  "description": "This library provides a set of common React components for use with the PatternFly reference implementation.",
5
5
  "main": "dist/js/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -44,9 +44,9 @@
44
44
  "generate": "node scripts/copyStyles.js"
45
45
  },
46
46
  "dependencies": {
47
- "@patternfly/react-icons": "^4.87.7",
48
- "@patternfly/react-styles": "^4.86.7",
49
- "@patternfly/react-tokens": "^4.88.7",
47
+ "@patternfly/react-icons": "^4.87.10",
48
+ "@patternfly/react-styles": "^4.86.10",
49
+ "@patternfly/react-tokens": "^4.88.10",
50
50
  "focus-trap": "6.9.2",
51
51
  "react-dropzone": "9.0.0",
52
52
  "tippy.js": "5.1.2",
@@ -70,5 +70,5 @@
70
70
  "react": "^16.8.0 || ^17.0.0",
71
71
  "react-dom": "^16.8.0 || ^17.0.0"
72
72
  },
73
- "gitHead": "9146bf58545f6e745af4b8ba31a22e1da35b077e"
73
+ "gitHead": "fb205f92e45be059fa7d0d3fa636e101a66a46aa"
74
74
  }
@@ -6,37 +6,74 @@ propComponents: ['Alert', 'AlertGroup', 'AlertActionCloseButton', 'AlertActionLi
6
6
  ---
7
7
 
8
8
  ## Examples
9
- ### Static alert group
10
- These alerts appear on page load and are discoverable from within the normal page content flow, and will not be announced individually/explicitly to assistive technology.
9
+
10
+ ### Variants
11
+
12
+ Alert groups can be one of the following variants:
13
+
14
+ | Variant | Description |
15
+ | --- | --- |
16
+ | Static inline | Static inline alert groups contain alerts that appear when the page loads, and are seen within the normal page content flow. These groups should not contain alerts that will dynamically appear or update. |
17
+ | Toast | Toast alert groups contain alerts that typically appear in response to an asynchronous event or user action. These groups are positioned on top of other content at the top right of the page.|
18
+ | Dynamic | Dynamic alert groups contain alerts that typically appear in response to a user action, and are seen within the normal page content flow.|
19
+
20
+ Dynamic alerts that are generated after the page initially loads must be appended to either a toast or dynamic `AlertGroup`, both of which must use the `isLiveRegion` property. New alerts appended to a toast or dynamic group will be announced by assistive technologies the moment the change happens. For information about customizing this announcement, read the [aria-atomic and aria-relevant](/components/alert-group/accessibility#aria-atomic-and-aria-relevant) section of the alert group accessibility documentation.
21
+
22
+ ### Static inline alert group
23
+
24
+ All alert group variants may combine multiple [alert variants](/components/alert) For example, the following static inline alert group includes one "success" alert and one "info" alert.
25
+
11
26
  ```ts file="./AlertGroupStatic.tsx"
12
27
  ```
13
28
 
14
29
  ### Toast alert group
15
- Alerts asynchronously appended into dynamic AlertGroups with `isLiveRegion` will be announced to assistive technology at the moment the change happens, following the strategy used for aria-atomic, which defaults to false. This means only changes of type "addition" will be announced.
30
+
31
+ Toast alert groups are created by passing in the `isToast` and `isLiveRegion` properties.
32
+
33
+ Click the buttons in the example below to add alerts to a toast group.
34
+
16
35
  ```ts file="./AlertGroupToast.tsx"
17
36
  ```
18
37
 
19
38
  ### Toast alert group with overflow capture
20
- After a specified number of alerts displayed is reached, we will see an overflow message instead of new alerts. Alerts asynchronously appended into dynamic AlertGroups with `isLiveRegion` will be announced to assistive technology at the moment the change happens. When the overflow message appears or is updated in AlertGroups with `isLiveRegion`, the `View 1 more alert` text will be read, but the alert message will not be read. screen reader user or keyboard user will need a way to navigate to and reveal the hidden alerts before they disappear. Alternatively, there should be a place that notifications or alerts are collected to be viewed or read later. In this example we are showing a max of 4 alerts.
39
+
40
+ Users will see an overflow message once a predefined number of alerts are displayed. They will not see any alerts beyond the display limit, which must be explicitly set.
41
+
42
+ In the following example, an overflow message will appear when more than 4 alerts would be shown. When a 5th alert would appear, an overflow message is shown instead.
43
+
44
+ When an overflow message appears in an `AlertGroup` using the `isLiveRegion` property, the "view 1 more alert" text label will be announced, but the alert message will not.
45
+
46
+ Users navigating via keyboard or another assistive technology will need a way to navigate to and reveal hidden alerts before they disappear. Alternatively, there should be a place where notifications or alerts are collected to be viewed or read later.
47
+
21
48
  ```ts file="AlertGroupToastOverflowCapture.tsx" isBeta
22
49
  ```
23
50
 
24
- ### Singular dynamic alert group
25
- This alert will appear in the page, most likely in response to a user action.
51
+ ### Asynchronous alert groups
52
+
53
+ The following example shows how alerts can be triggered by an asynchronous event in the application. You can customize how an alert will be announced to assistive technology by adjusting the value of the `aria-live` property. Click the "start async" alert button below and then click the buttons in the above toast examples to demonstrate how asynchronous events add alerts to a group. Click the "stop async alerts" button to halt this behavior.
54
+
55
+ See the [alert group accessibility tab](/components/alert-group/accessibility) for more information on customizing this behavior.
56
+
57
+ ```ts file="./AlertGroupAsync.tsx"
58
+ ```
59
+
60
+ ### Dynamic alert groups
61
+
62
+ Click the buttons in the example below to add dynamic alerts to a group.
63
+
26
64
  ```ts file="./AlertGroupSingularDynamic.tsx"
27
65
  ```
28
66
 
29
- ### Singular dynamic alert group with overflow message
30
- This alert will appear in the page, most likely in response to a user action. In this example we are showing a max of 4 alerts.
67
+ ### Dynamic alert group with overflow message
68
+
69
+ In the following example, there can be a maximum of 4 alerts shown at once.
70
+
31
71
  ```ts file="AlertGroupSingularDynamicOverflow.tsx" isBeta
32
72
  ```
33
73
 
34
- ### Multiple dynamic alert group
35
- These alerts will appear in the page, most likely in response to a user action.
36
- ```ts file="./AlertGroupMultipleDynamic.tsx"
37
- ```
74
+ ### Multiple dynamic alert groups
38
75
 
39
- ### Async alert group
40
- This shows how an alert could be triggered by an asynchronous event in the application. Note how you can customize how the alert will be announced to assistive technology. See the alert group accessibility tab for more information.
41
- ```ts file="./AlertGroupAsync.tsx"
76
+ You may add multiple alerts to an alert group at once. Click the "add alert collection" button in the example below to add a batch of 3 toast alerts to a group.
77
+
78
+ ```ts file="./AlertGroupMultipleDynamic.tsx"
42
79
  ```
@@ -61,6 +61,8 @@ export interface ApplicationLauncherProps
61
61
  favoritesLabel?: string;
62
62
  /** ID of toggle */
63
63
  toggleId?: string;
64
+ /** @beta Opt-in for updated popper that does not use findDOMNode. */
65
+ removeFindDomNode?: boolean;
64
66
  }
65
67
 
66
68
  export class ApplicationLauncher extends React.Component<ApplicationLauncherProps> {
@@ -83,7 +85,8 @@ export class ApplicationLauncher extends React.Component<ApplicationLauncherProp
83
85
  searchPlaceholderText: 'Filter by name...',
84
86
  searchNoResultsText: 'No results found',
85
87
  favoritesLabel: 'Favorites',
86
- menuAppendTo: 'inline'
88
+ menuAppendTo: 'inline',
89
+ removeFindDomNode: false
87
90
  };
88
91
 
89
92
  createSearchBox = () => {
@@ -129,6 +132,7 @@ export class ApplicationLauncher extends React.Component<ApplicationLauncherProp
129
132
  favoritesLabel,
130
133
  searchNoResultsText,
131
134
  menuAppendTo,
135
+ removeFindDomNode,
132
136
  ...props
133
137
  } = this.props;
134
138
  let renderableItems: React.ReactNode[] = [];
@@ -189,6 +193,7 @@ export class ApplicationLauncher extends React.Component<ApplicationLauncherProp
189
193
  className={className}
190
194
  aria-label={ariaLabel}
191
195
  menuAppendTo={menuAppendTo}
196
+ removeFindDomNode={removeFindDomNode}
192
197
  toggle={
193
198
  <DropdownToggle
194
199
  id={toggleId}
@@ -55,8 +55,17 @@ describe('ApplicationLauncher', () => {
55
55
 
56
56
  test('custom icon', () => {
57
57
  const { asFragment } = render(
58
- <ApplicationLauncher items={dropdownItems} isOpen toggleIcon={<HelpIcon id="test-icon" />} />
58
+ <React.StrictMode>
59
+ <ApplicationLauncher items={dropdownItems} isOpen toggleIcon={<HelpIcon id="test-icon" />} />
60
+ </React.StrictMode>
59
61
  );
60
62
  expect(asFragment()).toMatchSnapshot();
61
63
  });
64
+
65
+ test('Renders in strict mode', () => {
66
+ const consoleError = jest.spyOn(console, 'error');
67
+ const { asFragment } = render(<ApplicationLauncher removeFindDomNode isOpen items={dropdownItems} />);
68
+ expect(consoleError).not.toHaveBeenCalled();
69
+ expect(asFragment()).toMatchSnapshot();
70
+ });
62
71
  });
@@ -1,5 +1,151 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
+ exports[`ApplicationLauncher Renders in strict mode 1`] = `
4
+ <DocumentFragment>
5
+ <nav
6
+ aria-label="Application launcher"
7
+ class="pf-c-app-launcher pf-m-expanded"
8
+ data-ouia-component-type="PF4/ApplicationLauncher"
9
+ data-ouia-safe="true"
10
+ >
11
+ <button
12
+ aria-expanded="true"
13
+ aria-haspopup="true"
14
+ aria-label="Application launcher"
15
+ class="pf-c-app-launcher__toggle"
16
+ data-ouia-component-id="OUIA-Generated-DropdownToggle-8"
17
+ data-ouia-component-type="PF4/DropdownToggle"
18
+ data-ouia-safe="true"
19
+ id="pf-dropdown-toggle-id-7"
20
+ type="button"
21
+ >
22
+ <span>
23
+ <svg
24
+ aria-hidden="true"
25
+ fill="currentColor"
26
+ height="1em"
27
+ role="img"
28
+ style="vertical-align: -0.125em;"
29
+ viewBox="0 0 512 512"
30
+ width="1em"
31
+ >
32
+ <path
33
+ d="M149.333 56v80c0 13.255-10.745 24-24 24H24c-13.255 0-24-10.745-24-24V56c0-13.255 10.745-24 24-24h101.333c13.255 0 24 10.745 24 24zm181.334 240v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.256 0 24.001-10.745 24.001-24zm32-240v80c0 13.255 10.745 24 24 24H488c13.255 0 24-10.745 24-24V56c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24zm-32 80V56c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.256 0 24.001-10.745 24.001-24zm-205.334 56H24c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24zM0 376v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H24c-13.255 0-24 10.745-24 24zm386.667-56H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24zm0 160H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H386.667c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24zM181.333 376v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24z"
34
+ />
35
+ </svg>
36
+ </span>
37
+ </button>
38
+ <ul
39
+ aria-labelledby="pf-dropdown-toggle-id-7"
40
+ class="pf-c-app-launcher__menu"
41
+ role="menu"
42
+ >
43
+ <li
44
+ role="none"
45
+ >
46
+ <a
47
+ aria-disabled="false"
48
+ class="pf-c-app-launcher__menu-item"
49
+ data-ouia-component-id="OUIA-Generated-DropdownItem-19"
50
+ data-ouia-component-type="PF4/DropdownItem"
51
+ data-ouia-safe="true"
52
+ role="menuitem"
53
+ tabindex="-1"
54
+ >
55
+ Link
56
+ </a>
57
+ </li>
58
+ <li
59
+ role="none"
60
+ >
61
+ <button
62
+ aria-disabled="false"
63
+ class="pf-c-app-launcher__menu-item"
64
+ data-ouia-component-id="OUIA-Generated-DropdownItem-20"
65
+ data-ouia-component-type="PF4/DropdownItem"
66
+ data-ouia-safe="true"
67
+ role="menuitem"
68
+ tabindex="-1"
69
+ type="button"
70
+ >
71
+ Action
72
+ </button>
73
+ </li>
74
+ <li
75
+ role="none"
76
+ >
77
+ <a
78
+ aria-disabled="true"
79
+ class="pf-m-disabled pf-c-app-launcher__menu-item"
80
+ data-ouia-component-id="OUIA-Generated-DropdownItem-21"
81
+ data-ouia-component-type="PF4/DropdownItem"
82
+ data-ouia-safe="true"
83
+ role="menuitem"
84
+ tabindex="-1"
85
+ >
86
+ Disabled Link
87
+ </a>
88
+ </li>
89
+ <li
90
+ role="none"
91
+ >
92
+ <button
93
+ aria-disabled="true"
94
+ class="pf-m-disabled pf-c-app-launcher__menu-item"
95
+ data-ouia-component-id="OUIA-Generated-DropdownItem-22"
96
+ data-ouia-component-type="PF4/DropdownItem"
97
+ data-ouia-safe="true"
98
+ role="menuitem"
99
+ tabindex="-1"
100
+ type="button"
101
+ >
102
+ Disabled Action
103
+ </button>
104
+ </li>
105
+ <li
106
+ role="none"
107
+ >
108
+ <div
109
+ class="pf-c-divider"
110
+ role="separator"
111
+ />
112
+ </li>
113
+ <li
114
+ role="none"
115
+ >
116
+ <a
117
+ aria-disabled="false"
118
+ class="pf-c-app-launcher__menu-item"
119
+ data-ouia-component-id="OUIA-Generated-DropdownItem-23"
120
+ data-ouia-component-type="PF4/DropdownItem"
121
+ data-ouia-safe="true"
122
+ role="menuitem"
123
+ tabindex="-1"
124
+ >
125
+ Separated Link
126
+ </a>
127
+ </li>
128
+ <li
129
+ role="none"
130
+ >
131
+ <button
132
+ aria-disabled="false"
133
+ class="pf-c-app-launcher__menu-item"
134
+ data-ouia-component-id="OUIA-Generated-DropdownItem-24"
135
+ data-ouia-component-type="PF4/DropdownItem"
136
+ data-ouia-safe="true"
137
+ role="menuitem"
138
+ tabindex="-1"
139
+ type="button"
140
+ >
141
+ Separated Action
142
+ </button>
143
+ </li>
144
+ </ul>
145
+ </nav>
146
+ </DocumentFragment>
147
+ `;
148
+
3
149
  exports[`ApplicationLauncher custom icon 1`] = `
4
150
  <DocumentFragment>
5
151
  <nav
@@ -13,7 +159,7 @@ exports[`ApplicationLauncher custom icon 1`] = `
13
159
  aria-haspopup="true"
14
160
  aria-label="Application launcher"
15
161
  class="pf-c-app-launcher__toggle"
16
- data-ouia-component-id="OUIA-Generated-DropdownToggle-6"
162
+ data-ouia-component-id="OUIA-Generated-DropdownToggle-7"
17
163
  data-ouia-component-type="PF4/DropdownToggle"
18
164
  data-ouia-safe="true"
19
165
  id="pf-dropdown-toggle-id-5"
@@ -47,7 +193,7 @@ exports[`ApplicationLauncher custom icon 1`] = `
47
193
  <a
48
194
  aria-disabled="false"
49
195
  class="pf-c-app-launcher__menu-item"
50
- data-ouia-component-id="OUIA-Generated-DropdownItem-7"
196
+ data-ouia-component-id="OUIA-Generated-DropdownItem-8"
51
197
  data-ouia-component-type="PF4/DropdownItem"
52
198
  data-ouia-safe="true"
53
199
  role="menuitem"
@@ -62,7 +208,7 @@ exports[`ApplicationLauncher custom icon 1`] = `
62
208
  <button
63
209
  aria-disabled="false"
64
210
  class="pf-c-app-launcher__menu-item"
65
- data-ouia-component-id="OUIA-Generated-DropdownItem-8"
211
+ data-ouia-component-id="OUIA-Generated-DropdownItem-10"
66
212
  data-ouia-component-type="PF4/DropdownItem"
67
213
  data-ouia-safe="true"
68
214
  role="menuitem"
@@ -78,7 +224,7 @@ exports[`ApplicationLauncher custom icon 1`] = `
78
224
  <a
79
225
  aria-disabled="true"
80
226
  class="pf-m-disabled pf-c-app-launcher__menu-item"
81
- data-ouia-component-id="OUIA-Generated-DropdownItem-9"
227
+ data-ouia-component-id="OUIA-Generated-DropdownItem-12"
82
228
  data-ouia-component-type="PF4/DropdownItem"
83
229
  data-ouia-safe="true"
84
230
  role="menuitem"
@@ -93,7 +239,7 @@ exports[`ApplicationLauncher custom icon 1`] = `
93
239
  <button
94
240
  aria-disabled="true"
95
241
  class="pf-m-disabled pf-c-app-launcher__menu-item"
96
- data-ouia-component-id="OUIA-Generated-DropdownItem-10"
242
+ data-ouia-component-id="OUIA-Generated-DropdownItem-14"
97
243
  data-ouia-component-type="PF4/DropdownItem"
98
244
  data-ouia-safe="true"
99
245
  role="menuitem"
@@ -117,7 +263,7 @@ exports[`ApplicationLauncher custom icon 1`] = `
117
263
  <a
118
264
  aria-disabled="false"
119
265
  class="pf-c-app-launcher__menu-item"
120
- data-ouia-component-id="OUIA-Generated-DropdownItem-11"
266
+ data-ouia-component-id="OUIA-Generated-DropdownItem-16"
121
267
  data-ouia-component-type="PF4/DropdownItem"
122
268
  data-ouia-safe="true"
123
269
  role="menuitem"
@@ -132,7 +278,7 @@ exports[`ApplicationLauncher custom icon 1`] = `
132
278
  <button
133
279
  aria-disabled="false"
134
280
  class="pf-c-app-launcher__menu-item"
135
- data-ouia-component-id="OUIA-Generated-DropdownItem-12"
281
+ data-ouia-component-id="OUIA-Generated-DropdownItem-18"
136
282
  data-ouia-component-type="PF4/DropdownItem"
137
283
  data-ouia-safe="true"
138
284
  role="menuitem"
@@ -66,6 +66,8 @@ export interface ContextSelectorProps extends Omit<ToggleMenuBaseProps, 'menuApp
66
66
  isFlipEnabled?: boolean;
67
67
  /** Id of the context selector */
68
68
  id?: string;
69
+ /** @beta Opt-in for updated popper that does not use findDOMNode. */
70
+ removeFindDomNode?: boolean;
69
71
  }
70
72
 
71
73
  export class ContextSelector extends React.Component<ContextSelectorProps, { ouiaStateId: string }> {
@@ -89,7 +91,8 @@ export class ContextSelector extends React.Component<ContextSelectorProps, { oui
89
91
  footer: null as React.ReactNode,
90
92
  isPlain: false,
91
93
  isText: false,
92
- isFlipEnabled: false
94
+ isFlipEnabled: false,
95
+ removeFindDomNode: false
93
96
  };
94
97
  constructor(props: ContextSelectorProps) {
95
98
  super(props);
@@ -131,6 +134,7 @@ export class ContextSelector extends React.Component<ContextSelectorProps, { oui
131
134
  disableFocusTrap,
132
135
  isFlipEnabled,
133
136
  id,
137
+ removeFindDomNode,
134
138
  ...props
135
139
  } = this.props;
136
140
 
@@ -231,6 +235,7 @@ export class ContextSelector extends React.Component<ContextSelectorProps, { oui
231
235
  popper={popperContainer}
232
236
  appendTo={menuAppendTo === 'parent' ? getParentElement() : menuAppendTo}
233
237
  isVisible={isOpen}
238
+ removeFindDomNode={removeFindDomNode}
234
239
  />
235
240
  );
236
241
  }
@@ -21,7 +21,24 @@ describe('ContextSelector', () => {
21
21
  });
22
22
 
23
23
  test('Renders ContextSelector open', () => {
24
- const { asFragment } = render(<ContextSelector isOpen id="render-open">{items}</ContextSelector>);
24
+ const { asFragment } = render(
25
+ <ContextSelector isOpen id="render-open">
26
+ {items}
27
+ </ContextSelector>
28
+ );
29
+ expect(asFragment()).toMatchSnapshot();
30
+ });
31
+
32
+ test('Renders in strict mode', () => {
33
+ const consoleError = jest.spyOn(console, 'error');
34
+ const { asFragment } = render(
35
+ <React.StrictMode>
36
+ <ContextSelector removeFindDomNode isOpen id="render">
37
+ {items}
38
+ </ContextSelector>
39
+ </React.StrictMode>
40
+ );
41
+ expect(consoleError).not.toHaveBeenCalled();
25
42
  expect(asFragment()).toMatchSnapshot();
26
43
  });
27
44
 
@@ -183,3 +183,147 @@ exports[`ContextSelector Renders ContextSelector open 1`] = `
183
183
  </div>
184
184
  </DocumentFragment>
185
185
  `;
186
+
187
+ exports[`ContextSelector Renders in strict mode 1`] = `
188
+ <DocumentFragment>
189
+ <div
190
+ class="pf-c-context-selector pf-m-expanded"
191
+ data-ouia-component-id="OUIA-Generated-ContextSelector-4"
192
+ data-ouia-component-type="PF4/ContextSelector"
193
+ data-ouia-safe="true"
194
+ >
195
+ <button
196
+ aria-expanded="true"
197
+ aria-labelledby="pf-context-selector-label-id-render pf-context-selector-toggle-id-render"
198
+ class="pf-c-context-selector__toggle"
199
+ id="pf-context-selector-toggle-id-render"
200
+ type="button"
201
+ >
202
+ <span
203
+ class="pf-c-context-selector__toggle-text"
204
+ />
205
+ <span
206
+ class="pf-c-context-selector__toggle-icon"
207
+ >
208
+ <svg
209
+ aria-hidden="true"
210
+ fill="currentColor"
211
+ height="1em"
212
+ role="img"
213
+ style="vertical-align: -0.125em;"
214
+ viewBox="0 0 320 512"
215
+ width="1em"
216
+ >
217
+ <path
218
+ d="M31.3 192h257.3c17.8 0 26.7 21.5 14.1 34.1L174.1 354.8c-7.8 7.8-20.5 7.8-28.3 0L17.2 226.1C4.6 213.5 13.5 192 31.3 192z"
219
+ />
220
+ </svg>
221
+ </span>
222
+ </button>
223
+ <div
224
+ class="pf-c-context-selector__menu"
225
+ id="render"
226
+ >
227
+ <div>
228
+ <div
229
+ class="pf-c-context-selector__menu-search"
230
+ >
231
+ <div
232
+ class="pf-c-input-group"
233
+ >
234
+ <input
235
+ aria-invalid="false"
236
+ aria-label="Search menu items"
237
+ class="pf-c-form-control"
238
+ data-ouia-component-id="OUIA-Generated-TextInputBase-3"
239
+ data-ouia-component-type="PF4/TextInput"
240
+ data-ouia-safe="true"
241
+ placeholder="Search"
242
+ type="search"
243
+ value=""
244
+ />
245
+ <button
246
+ aria-disabled="false"
247
+ aria-label="Search menu items"
248
+ class="pf-c-button pf-m-control"
249
+ data-ouia-component-id="OUIA-Generated-Button-control-3"
250
+ data-ouia-component-type="PF4/Button"
251
+ data-ouia-safe="true"
252
+ type="button"
253
+ >
254
+ <svg
255
+ aria-hidden="true"
256
+ fill="currentColor"
257
+ height="1em"
258
+ role="img"
259
+ style="vertical-align: -0.125em;"
260
+ viewBox="0 0 512 512"
261
+ width="1em"
262
+ >
263
+ <path
264
+ d="M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"
265
+ />
266
+ </svg>
267
+ </button>
268
+ </div>
269
+ </div>
270
+ <ul
271
+ class="pf-c-context-selector__menu-list"
272
+ role="menu"
273
+ >
274
+ <li
275
+ role="none"
276
+ >
277
+ <button
278
+ class="pf-c-context-selector__menu-list-item"
279
+ role="menuitem"
280
+ >
281
+ My Project
282
+ </button>
283
+ </li>
284
+ <li
285
+ role="none"
286
+ >
287
+ <button
288
+ class="pf-c-context-selector__menu-list-item"
289
+ role="menuitem"
290
+ >
291
+ OpenShift Cluster
292
+ </button>
293
+ </li>
294
+ <li
295
+ role="none"
296
+ >
297
+ <button
298
+ class="pf-c-context-selector__menu-list-item"
299
+ role="menuitem"
300
+ >
301
+ Production Ansible
302
+ </button>
303
+ </li>
304
+ <li
305
+ role="none"
306
+ >
307
+ <button
308
+ class="pf-c-context-selector__menu-list-item"
309
+ role="menuitem"
310
+ >
311
+ AWS
312
+ </button>
313
+ </li>
314
+ <li
315
+ role="none"
316
+ >
317
+ <button
318
+ class="pf-c-context-selector__menu-list-item"
319
+ role="menuitem"
320
+ >
321
+ Azure
322
+ </button>
323
+ </li>
324
+ </ul>
325
+ </div>
326
+ </div>
327
+ </div>
328
+ </DocumentFragment>
329
+ `;
@@ -60,6 +60,8 @@ export interface DropdownProps
60
60
  * appended inline, e.g. `menuAppendTo="parent"`
61
61
  */
62
62
  isFlipEnabled?: boolean;
63
+ /** @beta Opt-in for updated popper that does not use findDOMNode. */
64
+ removeFindDomNode?: boolean;
63
65
  }
64
66
 
65
67
  export const Dropdown: React.FunctionComponent<DropdownProps> = ({
@@ -72,6 +74,7 @@ export const Dropdown: React.FunctionComponent<DropdownProps> = ({
72
74
  contextProps,
73
75
  menuAppendTo = 'inline',
74
76
  isFlipEnabled = false,
77
+ removeFindDomNode = false,
75
78
  ...props
76
79
  }: DropdownProps) => (
77
80
  <DropdownContext.Provider
@@ -97,7 +100,12 @@ export const Dropdown: React.FunctionComponent<DropdownProps> = ({
97
100
  ...contextProps
98
101
  }}
99
102
  >
100
- <DropdownWithContext menuAppendTo={menuAppendTo} isFlipEnabled={isFlipEnabled} {...props} />
103
+ <DropdownWithContext
104
+ menuAppendTo={menuAppendTo}
105
+ isFlipEnabled={isFlipEnabled}
106
+ removeFindDomNode={removeFindDomNode}
107
+ {...props}
108
+ />
101
109
  </DropdownContext.Provider>
102
110
  );
103
111
  Dropdown.displayName = 'Dropdown';
@@ -77,6 +77,7 @@ export class DropdownWithContext extends React.Component<DropdownProps & OUIAPro
77
77
  autoFocus,
78
78
  menuAppendTo,
79
79
  isFlipEnabled,
80
+ removeFindDomNode,
80
81
  ...props
81
82
  } = this.props;
82
83
  const id = toggle.props.id || `pf-dropdown-toggle-id-${DropdownWithContext.currentId++}`;
@@ -174,6 +175,7 @@ export class DropdownWithContext extends React.Component<DropdownProps & OUIAPro
174
175
  position={position}
175
176
  appendTo={menuAppendTo === 'parent' ? getParentElement() : menuAppendTo}
176
177
  isVisible={isOpen}
178
+ removeFindDomNode={removeFindDomNode}
177
179
  />
178
180
  );
179
181
  }}
@@ -123,6 +123,22 @@ describe('Dropdown', () => {
123
123
  );
124
124
  expect(asFragment()).toMatchSnapshot();
125
125
  });
126
+
127
+ test('Renders in strict mode', () => {
128
+ const consoleError = jest.spyOn(console, 'error');
129
+ const { asFragment } = render(
130
+ <React.StrictMode>
131
+ <Dropdown
132
+ isOpen
133
+ dropdownItems={dropdownItems}
134
+ toggle={<DropdownToggle id="Dropdown Toggle">Dropdown</DropdownToggle>}
135
+ removeFindDomNode
136
+ />
137
+ </React.StrictMode>
138
+ );
139
+ expect(consoleError).not.toHaveBeenCalled();
140
+ expect(asFragment()).toMatchSnapshot();
141
+ });
126
142
  });
127
143
 
128
144
  describe('KebabToggle', () => {