@patternfly/react-core 6.3.0-prerelease.30 → 6.3.0-prerelease.32

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 (157) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/components/package.json +1 -1
  3. package/deprecated/package.json +1 -1
  4. package/dist/dynamic/components/AboutModal/package.json +1 -1
  5. package/dist/dynamic/components/Accordion/package.json +1 -1
  6. package/dist/dynamic/components/ActionList/package.json +1 -1
  7. package/dist/dynamic/components/Alert/package.json +1 -1
  8. package/dist/dynamic/components/Avatar/package.json +1 -1
  9. package/dist/dynamic/components/BackToTop/package.json +1 -1
  10. package/dist/dynamic/components/Backdrop/package.json +1 -1
  11. package/dist/dynamic/components/BackgroundImage/package.json +1 -1
  12. package/dist/dynamic/components/Badge/package.json +1 -1
  13. package/dist/dynamic/components/Banner/package.json +1 -1
  14. package/dist/dynamic/components/Brand/package.json +1 -1
  15. package/dist/dynamic/components/Breadcrumb/package.json +1 -1
  16. package/dist/dynamic/components/Button/package.json +1 -1
  17. package/dist/dynamic/components/CalendarMonth/package.json +1 -1
  18. package/dist/dynamic/components/Card/package.json +1 -1
  19. package/dist/dynamic/components/Checkbox/package.json +1 -1
  20. package/dist/dynamic/components/ClipboardCopy/package.json +1 -1
  21. package/dist/dynamic/components/CodeBlock/package.json +1 -1
  22. package/dist/dynamic/components/Content/package.json +1 -1
  23. package/dist/dynamic/components/DataList/package.json +1 -1
  24. package/dist/dynamic/components/DatePicker/package.json +1 -1
  25. package/dist/dynamic/components/DescriptionList/package.json +1 -1
  26. package/dist/dynamic/components/Divider/package.json +1 -1
  27. package/dist/dynamic/components/Drawer/package.json +1 -1
  28. package/dist/dynamic/components/Dropdown/package.json +1 -1
  29. package/dist/dynamic/components/DualListSelector/package.json +1 -1
  30. package/dist/dynamic/components/EmptyState/package.json +1 -1
  31. package/dist/dynamic/components/ExpandableSection/package.json +1 -1
  32. package/dist/dynamic/components/FileUpload/package.json +1 -1
  33. package/dist/dynamic/components/Form/package.json +1 -1
  34. package/dist/dynamic/components/FormSelect/package.json +1 -1
  35. package/dist/dynamic/components/HelperText/package.json +1 -1
  36. package/dist/dynamic/components/Hint/package.json +1 -1
  37. package/dist/dynamic/components/Icon/package.json +1 -1
  38. package/dist/dynamic/components/InputGroup/package.json +1 -1
  39. package/dist/dynamic/components/JumpLinks/package.json +1 -1
  40. package/dist/dynamic/components/Label/package.json +1 -1
  41. package/dist/dynamic/components/List/package.json +1 -1
  42. package/dist/dynamic/components/LoginPage/package.json +1 -1
  43. package/dist/dynamic/components/Masthead/package.json +1 -1
  44. package/dist/dynamic/components/Menu/package.json +1 -1
  45. package/dist/dynamic/components/MenuToggle/package.json +1 -1
  46. package/dist/dynamic/components/Modal/package.json +1 -1
  47. package/dist/dynamic/components/MultipleFileUpload/package.json +1 -1
  48. package/dist/dynamic/components/Nav/package.json +1 -1
  49. package/dist/dynamic/components/NotificationBadge/package.json +1 -1
  50. package/dist/dynamic/components/NotificationDrawer/package.json +1 -1
  51. package/dist/dynamic/components/NumberInput/package.json +1 -1
  52. package/dist/dynamic/components/OverflowMenu/package.json +1 -1
  53. package/dist/dynamic/components/Page/package.json +1 -1
  54. package/dist/dynamic/components/Pagination/package.json +1 -1
  55. package/dist/dynamic/components/Panel/package.json +1 -1
  56. package/dist/dynamic/components/Popover/package.json +1 -1
  57. package/dist/dynamic/components/Progress/package.json +1 -1
  58. package/dist/dynamic/components/ProgressStepper/package.json +1 -1
  59. package/dist/dynamic/components/Radio/package.json +1 -1
  60. package/dist/dynamic/components/SearchInput/package.json +1 -1
  61. package/dist/dynamic/components/Select/package.json +1 -1
  62. package/dist/dynamic/components/Sidebar/package.json +1 -1
  63. package/dist/dynamic/components/SimpleList/package.json +1 -1
  64. package/dist/dynamic/components/Skeleton/package.json +1 -1
  65. package/dist/dynamic/components/SkipToContent/package.json +1 -1
  66. package/dist/dynamic/components/Slider/package.json +1 -1
  67. package/dist/dynamic/components/Spinner/package.json +1 -1
  68. package/dist/dynamic/components/Switch/package.json +1 -1
  69. package/dist/dynamic/components/Tabs/package.json +1 -1
  70. package/dist/dynamic/components/TextArea/package.json +1 -1
  71. package/dist/dynamic/components/TextInput/package.json +1 -1
  72. package/dist/dynamic/components/TextInputGroup/package.json +1 -1
  73. package/dist/dynamic/components/TimePicker/package.json +1 -1
  74. package/dist/dynamic/components/Timestamp/package.json +1 -1
  75. package/dist/dynamic/components/Title/package.json +1 -1
  76. package/dist/dynamic/components/ToggleGroup/package.json +1 -1
  77. package/dist/dynamic/components/Toolbar/package.json +1 -1
  78. package/dist/dynamic/components/Tooltip/package.json +1 -1
  79. package/dist/dynamic/components/TreeView/package.json +1 -1
  80. package/dist/dynamic/components/Truncate/package.json +1 -1
  81. package/dist/dynamic/components/Wizard/hooks/package.json +1 -1
  82. package/dist/dynamic/components/Wizard/package.json +1 -1
  83. package/dist/dynamic/deprecated/components/Chip/package.json +1 -1
  84. package/dist/dynamic/deprecated/components/DragDrop/package.json +1 -1
  85. package/dist/dynamic/deprecated/components/DualListSelector/package.json +1 -1
  86. package/dist/dynamic/deprecated/components/Modal/package.json +1 -1
  87. package/dist/dynamic/deprecated/components/Tile/package.json +1 -1
  88. package/dist/dynamic/deprecated/components/Wizard/package.json +1 -1
  89. package/dist/dynamic/deprecated/components/package.json +1 -1
  90. package/dist/dynamic/helpers/FocusTrap/FocusTrap/package.json +1 -1
  91. package/dist/dynamic/helpers/GenerateId/GenerateId/package.json +1 -1
  92. package/dist/dynamic/helpers/KeyboardHandler/package.json +1 -1
  93. package/dist/dynamic/helpers/OUIA/ouia/package.json +1 -1
  94. package/dist/dynamic/helpers/Popper/Popper/package.json +1 -1
  95. package/dist/dynamic/helpers/constants/package.json +1 -1
  96. package/dist/dynamic/helpers/datetimeUtils/package.json +1 -1
  97. package/dist/dynamic/helpers/fileUtils/package.json +1 -1
  98. package/dist/dynamic/helpers/htmlConstants/package.json +1 -1
  99. package/dist/dynamic/helpers/package.json +1 -1
  100. package/dist/dynamic/helpers/resizeObserver/package.json +1 -1
  101. package/dist/dynamic/helpers/typeUtils/package.json +1 -1
  102. package/dist/dynamic/helpers/useInterval/package.json +1 -1
  103. package/dist/dynamic/helpers/useIsomorphicLayout/package.json +1 -1
  104. package/dist/dynamic/helpers/useUnmountEffect/package.json +1 -1
  105. package/dist/dynamic/helpers/util/package.json +1 -1
  106. package/dist/dynamic/layouts/Bullseye/package.json +1 -1
  107. package/dist/dynamic/layouts/Flex/package.json +1 -1
  108. package/dist/dynamic/layouts/Gallery/package.json +1 -1
  109. package/dist/dynamic/layouts/Grid/package.json +1 -1
  110. package/dist/dynamic/layouts/Level/package.json +1 -1
  111. package/dist/dynamic/layouts/Split/package.json +1 -1
  112. package/dist/dynamic/layouts/Stack/package.json +1 -1
  113. package/dist/dynamic/styles/package.json +1 -1
  114. package/dist/esm/components/Alert/AlertGroupInline.d.ts.map +1 -1
  115. package/dist/esm/components/Alert/AlertGroupInline.js +7 -1
  116. package/dist/esm/components/Alert/AlertGroupInline.js.map +1 -1
  117. package/dist/esm/components/Label/Label.js +57 -57
  118. package/dist/esm/components/Label/Label.js.map +1 -1
  119. package/dist/esm/components/Menu/Menu.js +3 -3
  120. package/dist/esm/components/Menu/Menu.js.map +1 -1
  121. package/dist/esm/components/Popover/Popover.d.ts.map +1 -1
  122. package/dist/esm/components/Popover/Popover.js +11 -1
  123. package/dist/esm/components/Popover/Popover.js.map +1 -1
  124. package/dist/esm/components/SearchInput/AdvancedSearchMenu.d.ts.map +1 -1
  125. package/dist/esm/components/SearchInput/AdvancedSearchMenu.js +13 -19
  126. package/dist/esm/components/SearchInput/AdvancedSearchMenu.js.map +1 -1
  127. package/dist/esm/components/Tabs/Tabs.d.ts.map +1 -1
  128. package/dist/esm/components/Tabs/Tabs.js +4 -2
  129. package/dist/esm/components/Tabs/Tabs.js.map +1 -1
  130. package/dist/js/components/Alert/AlertGroupInline.d.ts.map +1 -1
  131. package/dist/js/components/Alert/AlertGroupInline.js +6 -0
  132. package/dist/js/components/Alert/AlertGroupInline.js.map +1 -1
  133. package/dist/js/components/Label/Label.js +57 -57
  134. package/dist/js/components/Label/Label.js.map +1 -1
  135. package/dist/js/components/Menu/Menu.js +3 -3
  136. package/dist/js/components/Menu/Menu.js.map +1 -1
  137. package/dist/js/components/Popover/Popover.d.ts.map +1 -1
  138. package/dist/js/components/Popover/Popover.js +11 -1
  139. package/dist/js/components/Popover/Popover.js.map +1 -1
  140. package/dist/js/components/SearchInput/AdvancedSearchMenu.d.ts.map +1 -1
  141. package/dist/js/components/SearchInput/AdvancedSearchMenu.js +12 -18
  142. package/dist/js/components/SearchInput/AdvancedSearchMenu.js.map +1 -1
  143. package/dist/js/components/Tabs/Tabs.d.ts.map +1 -1
  144. package/dist/js/components/Tabs/Tabs.js +4 -2
  145. package/dist/js/components/Tabs/Tabs.js.map +1 -1
  146. package/dist/umd/assets/{output-DQDnNONp.css → output-BId7oWCX.css} +16168 -16168
  147. package/dist/umd/react-core.min.js +2 -2
  148. package/helpers/package.json +1 -1
  149. package/layouts/package.json +1 -1
  150. package/next/package.json +1 -1
  151. package/package.json +6 -6
  152. package/src/components/Alert/AlertGroupInline.tsx +13 -2
  153. package/src/components/Label/Label.tsx +63 -63
  154. package/src/components/Menu/Menu.tsx +3 -3
  155. package/src/components/Popover/Popover.tsx +13 -1
  156. package/src/components/SearchInput/AdvancedSearchMenu.tsx +15 -23
  157. package/src/components/Tabs/Tabs.tsx +2 -0
@@ -1 +1 @@
1
- {"name":"@patternfly/react-core-helpers","main":"../dist/js/helpers/index.js","module":"../dist/esm/helpers/index.js","typings":"../dist/esm/helpers/index.d.ts","version":"6.3.0-prerelease.29","private":true}
1
+ {"name":"@patternfly/react-core-helpers","main":"../dist/js/helpers/index.js","module":"../dist/esm/helpers/index.js","typings":"../dist/esm/helpers/index.d.ts","version":"6.3.0-prerelease.31","private":true}
@@ -1 +1 @@
1
- {"name":"@patternfly/react-core-layouts","main":"../dist/js/layouts/index.js","module":"../dist/esm/layouts/index.js","typings":"../dist/esm/layouts/index.d.ts","version":"6.3.0-prerelease.29","private":true}
1
+ {"name":"@patternfly/react-core-layouts","main":"../dist/js/layouts/index.js","module":"../dist/esm/layouts/index.js","typings":"../dist/esm/layouts/index.d.ts","version":"6.3.0-prerelease.31","private":true}
package/next/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@patternfly/react-core-next","main":"../dist/js/next/index.js","module":"../dist/esm/next/index.js","typings":"../dist/esm/next/index.d.ts","version":"6.3.0-prerelease.29","private":true}
1
+ {"name":"@patternfly/react-core-next","main":"../dist/js/next/index.js","module":"../dist/esm/next/index.js","typings":"../dist/esm/next/index.d.ts","version":"6.3.0-prerelease.31","private":true}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@patternfly/react-core",
3
- "version": "6.3.0-prerelease.30",
3
+ "version": "6.3.0-prerelease.32",
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",
@@ -46,15 +46,15 @@
46
46
  "subpaths": "node ../../scripts/exportSubpaths.mjs --config subpaths.config.json"
47
47
  },
48
48
  "dependencies": {
49
- "@patternfly/react-icons": "^6.3.0-prerelease.12",
50
- "@patternfly/react-styles": "^6.3.0-prerelease.11",
51
- "@patternfly/react-tokens": "^6.3.0-prerelease.11",
49
+ "@patternfly/react-icons": "^6.3.0-prerelease.13",
50
+ "@patternfly/react-styles": "^6.3.0-prerelease.12",
51
+ "@patternfly/react-tokens": "^6.3.0-prerelease.12",
52
52
  "focus-trap": "7.6.4",
53
53
  "react-dropzone": "^14.3.5",
54
54
  "tslib": "^2.8.1"
55
55
  },
56
56
  "devDependencies": {
57
- "@patternfly/patternfly": "6.3.0-prerelease.38",
57
+ "@patternfly/patternfly": "6.3.0-prerelease.40",
58
58
  "case-anything": "^3.1.2",
59
59
  "css": "^3.0.0",
60
60
  "fs-extra": "^11.3.0"
@@ -63,5 +63,5 @@
63
63
  "react": "^17 || ^18 || ^19",
64
64
  "react-dom": "^17 || ^18 || ^19"
65
65
  },
66
- "gitHead": "031fba5b63c67c6cb8ca4ead17830ddd1dafec8e"
66
+ "gitHead": "e08195c635540c7f3cef9707f26407062e295b85"
67
67
  }
@@ -1,4 +1,4 @@
1
- import { Children, useState } from 'react';
1
+ import { Children, useState, useEffect } from 'react';
2
2
  import { css } from '@patternfly/react-styles';
3
3
  import styles from '@patternfly/react-styles/css/components/Alert/alert-group';
4
4
  import { AlertGroupProps } from './AlertGroup';
@@ -15,11 +15,20 @@ export const AlertGroupInline: React.FunctionComponent<AlertGroupProps> = ({
15
15
  overflowMessage,
16
16
  ...props
17
17
  }: AlertGroupProps) => {
18
- const [handleTransitionEnd, setHandleTransitionEnd] = useState(() => () => {});
18
+ const [handleTransitionEnd, setHandleTransitionEnd] = useState<() => void>(() => () => {});
19
+
19
20
  const updateTransitionEnd = (onTransitionEnd: () => void) => {
20
21
  setHandleTransitionEnd(() => onTransitionEnd);
21
22
  };
22
23
 
24
+ // Clear transition callback on unmount to prevent memory leaks
25
+ useEffect(
26
+ () => () => {
27
+ setHandleTransitionEnd(() => () => {});
28
+ },
29
+ []
30
+ );
31
+
23
32
  const onTransitionEnd = (event: React.TransitionEvent<HTMLLIElement>) => {
24
33
  if (!hasAnimations) {
25
34
  return;
@@ -34,6 +43,8 @@ export const AlertGroupInline: React.FunctionComponent<AlertGroupProps> = ({
34
43
  (event.target as HTMLElement).className.includes(styles.modifiers.offstageRight)
35
44
  ) {
36
45
  handleTransitionEnd();
46
+ // Clear the callback after execution to prevent memory retention
47
+ setHandleTransitionEnd(() => () => {});
37
48
  }
38
49
  };
39
50
 
@@ -145,13 +145,75 @@ export const Label: React.FunctionComponent<LabelProps> = ({
145
145
  }
146
146
 
147
147
  useEffect(() => {
148
+ const onDocMouseDown = (event: MouseEvent) => {
149
+ if (
150
+ isEditableActive &&
151
+ editableInputRef &&
152
+ editableInputRef.current &&
153
+ !editableInputRef.current.contains(event.target as Node)
154
+ ) {
155
+ if (editableInputRef.current.value) {
156
+ onEditComplete && onEditComplete(event, editableInputRef.current.value);
157
+ }
158
+ setIsEditableActive(false);
159
+ }
160
+ };
161
+
162
+ const onKeyDown = (event: KeyboardEvent) => {
163
+ const key = event.key;
164
+ if (
165
+ (!isEditableActive &&
166
+ (!editableButtonRef ||
167
+ !editableButtonRef.current ||
168
+ !editableButtonRef.current.contains(event.target as Node))) ||
169
+ (isEditableActive &&
170
+ (!editableInputRef || !editableInputRef.current || !editableInputRef.current.contains(event.target as Node)))
171
+ ) {
172
+ return;
173
+ }
174
+ if (isEditableActive && (key === 'Enter' || key === 'Tab')) {
175
+ event.preventDefault();
176
+ event.stopImmediatePropagation();
177
+ if (editableInputRef.current.value) {
178
+ onEditComplete && onEditComplete(event, editableInputRef.current.value);
179
+ }
180
+ setIsEditableActive(false);
181
+ editableButtonRef?.current?.focus();
182
+ }
183
+ if (isEditableActive && key === 'Escape') {
184
+ event.preventDefault();
185
+ event.stopImmediatePropagation();
186
+ // Reset div text to initial children prop - pre-edit
187
+ if (editableInputRef.current.value) {
188
+ editableInputRef.current.value = children as string;
189
+ onEditCancel && onEditCancel(event, children as string);
190
+ }
191
+ setIsEditableActive(false);
192
+ editableButtonRef?.current?.focus();
193
+ }
194
+ if (!isEditableActive && key === 'Enter') {
195
+ event.preventDefault();
196
+ event.stopImmediatePropagation();
197
+ setIsEditableActive(true);
198
+
199
+ // Set cursor position to end of text
200
+ const el = event.target as HTMLElement;
201
+ const range = document.createRange();
202
+ const sel = window.getSelection();
203
+ range.selectNodeContents(el);
204
+ range.collapse(false);
205
+ sel.removeAllRanges();
206
+ sel.addRange(range);
207
+ }
208
+ };
209
+
148
210
  document.addEventListener('mousedown', onDocMouseDown);
149
211
  document.addEventListener('keydown', onKeyDown);
150
212
  return () => {
151
213
  document.removeEventListener('mousedown', onDocMouseDown);
152
214
  document.removeEventListener('keydown', onKeyDown);
153
215
  };
154
- });
216
+ }, [isEditableActive, editableInputRef, editableButtonRef, onEditComplete, onEditCancel, children]);
155
217
 
156
218
  useEffect(() => {
157
219
  if (onLabelClick && href) {
@@ -167,68 +229,6 @@ export const Label: React.FunctionComponent<LabelProps> = ({
167
229
  }
168
230
  }, [onLabelClick, href, isEditable]);
169
231
 
170
- const onDocMouseDown = (event: MouseEvent) => {
171
- if (
172
- isEditableActive &&
173
- editableInputRef &&
174
- editableInputRef.current &&
175
- !editableInputRef.current.contains(event.target as Node)
176
- ) {
177
- if (editableInputRef.current.value) {
178
- onEditComplete && onEditComplete(event, editableInputRef.current.value);
179
- }
180
- setIsEditableActive(false);
181
- }
182
- };
183
-
184
- const onKeyDown = (event: KeyboardEvent) => {
185
- const key = event.key;
186
- if (
187
- (!isEditableActive &&
188
- (!editableButtonRef ||
189
- !editableButtonRef.current ||
190
- !editableButtonRef.current.contains(event.target as Node))) ||
191
- (isEditableActive &&
192
- (!editableInputRef || !editableInputRef.current || !editableInputRef.current.contains(event.target as Node)))
193
- ) {
194
- return;
195
- }
196
- if (isEditableActive && (key === 'Enter' || key === 'Tab')) {
197
- event.preventDefault();
198
- event.stopImmediatePropagation();
199
- if (editableInputRef.current.value) {
200
- onEditComplete && onEditComplete(event, editableInputRef.current.value);
201
- }
202
- setIsEditableActive(false);
203
- editableButtonRef?.current?.focus();
204
- }
205
- if (isEditableActive && key === 'Escape') {
206
- event.preventDefault();
207
- event.stopImmediatePropagation();
208
- // Reset div text to initial children prop - pre-edit
209
- if (editableInputRef.current.value) {
210
- editableInputRef.current.value = children as string;
211
- onEditCancel && onEditCancel(event, children as string);
212
- }
213
- setIsEditableActive(false);
214
- editableButtonRef?.current?.focus();
215
- }
216
- if (!isEditableActive && key === 'Enter') {
217
- event.preventDefault();
218
- event.stopImmediatePropagation();
219
- setIsEditableActive(true);
220
-
221
- // Set cursor position to end of text
222
- const el = event.target as HTMLElement;
223
- const range = document.createRange();
224
- const sel = window.getSelection();
225
- range.selectNodeContents(el);
226
- range.collapse(false);
227
- sel.removeAllRanges();
228
- sel.addRange(range);
229
- }
230
- };
231
-
232
232
  const isClickableDisabled = (href || onLabelClick) && isDisabled;
233
233
 
234
234
  const defaultCloseButton = (
@@ -119,15 +119,15 @@ class MenuBase extends Component<MenuProps, MenuState> {
119
119
  if (this.context) {
120
120
  this.setState({ disableHover: this.context.disableHover });
121
121
  }
122
- if (canUseDOM && this.props.containsDrilldown) {
123
- window.addEventListener('transitionend', this.props.isRootMenu ? this.handleDrilldownTransition : null);
122
+ if (canUseDOM && this.props.containsDrilldown && this.props.isRootMenu) {
123
+ window.addEventListener('transitionend', this.handleDrilldownTransition);
124
124
  }
125
125
 
126
126
  this.allowTabFirstItem();
127
127
  }
128
128
 
129
129
  componentWillUnmount() {
130
- if (canUseDOM && this.props.containsDrilldown) {
130
+ if (canUseDOM && this.props.containsDrilldown && this.props.isRootMenu) {
131
131
  window.removeEventListener('transitionend', this.handleDrilldownTransition);
132
132
  }
133
133
  }
@@ -422,10 +422,22 @@ export const Popover: React.FunctionComponent<PopoverProps> = ({
422
422
  new Promise((resolve) => {
423
423
  const interval = setInterval(() => {
424
424
  if (containers.every((container) => getComputedStyle(container).visibility !== 'hidden')) {
425
- resolve();
426
425
  clearInterval(interval);
426
+ resolve();
427
427
  }
428
428
  }, 10);
429
+
430
+ // Clear interval if promise is never resolved (component unmount)
431
+ const timeout = setTimeout(() => {
432
+ clearInterval(interval);
433
+ resolve(); // Resolve to prevent hanging promise
434
+ }, 5000); // 5 second timeout as safety net
435
+
436
+ // Store cleanup function for potential external cleanup
437
+ (resolve as any)._cleanup = () => {
438
+ clearInterval(interval);
439
+ clearTimeout(timeout);
440
+ };
429
441
  }),
430
442
  tabbableOptions: { displayCheck: 'none' },
431
443
 
@@ -2,7 +2,7 @@ import { useEffect, useRef, useState } from 'react';
2
2
  import { Button } from '../Button';
3
3
  import { ActionGroup, Form, FormGroup } from '../Form';
4
4
  import { TextInput } from '../TextInput';
5
- import { GenerateId, KeyTypes } from '../../helpers';
5
+ import { GenerateId } from '../../helpers';
6
6
  import { SearchInputSearchAttribute } from './SearchInput';
7
7
  import { Panel, PanelMain, PanelMainBody } from '../Panel';
8
8
  import { css } from '@patternfly/react-styles';
@@ -89,6 +89,19 @@ export const AdvancedSearchMenu: React.FunctionComponent<AdvancedSearchMenuProps
89
89
  }, [isSearchMenuOpen]);
90
90
 
91
91
  useEffect(() => {
92
+ const onDocClick = (event: Event) => {
93
+ const clickedWithinSearchInput = parentRef && parentRef.current.contains(event.target as Node);
94
+ if (isSearchMenuOpen && !clickedWithinSearchInput) {
95
+ onToggleAdvancedMenu(event as any);
96
+ }
97
+ };
98
+
99
+ const onEscPress = (event: KeyboardEvent) => {
100
+ if (event.key === 'Escape' && isSearchMenuOpen) {
101
+ onToggleAdvancedMenu(event as any);
102
+ }
103
+ };
104
+
92
105
  document.addEventListener('mousedown', onDocClick);
93
106
  document.addEventListener('touchstart', onDocClick);
94
107
  document.addEventListener('keydown', onEscPress);
@@ -98,28 +111,7 @@ export const AdvancedSearchMenu: React.FunctionComponent<AdvancedSearchMenuProps
98
111
  document.removeEventListener('touchstart', onDocClick);
99
112
  document.removeEventListener('keydown', onEscPress);
100
113
  };
101
- });
102
-
103
- const onDocClick = (event: Event) => {
104
- const clickedWithinSearchInput = parentRef && parentRef.current.contains(event.target as Node);
105
- if (isSearchMenuOpen && !clickedWithinSearchInput) {
106
- onToggleAdvancedMenu(event as any);
107
- }
108
- };
109
-
110
- const onEscPress = (event: KeyboardEvent) => {
111
- if (
112
- isSearchMenuOpen &&
113
- event.key === KeyTypes.Escape &&
114
- parentRef &&
115
- parentRef.current.contains(event.target as Node)
116
- ) {
117
- onToggleAdvancedMenu(event as any);
118
- if (parentInputRef) {
119
- parentInputRef.current.focus();
120
- }
121
- }
122
- };
114
+ }, [isSearchMenuOpen, parentRef, onToggleAdvancedMenu]);
123
115
 
124
116
  const onSearchHandler = (event: React.SyntheticEvent<HTMLButtonElement>) => {
125
117
  event.preventDefault();
@@ -430,6 +430,8 @@ class Tabs extends Component<TabsProps, TabsState> {
430
430
  if (!prevState.enableScrollButtons && enableScrollButtons) {
431
431
  this.setState({ renderScrollButtons: true });
432
432
  setTimeout(() => {
433
+ // Remove any existing listener before adding a new one to prevent accumulation
434
+ this.leftScrollButtonRef.current?.removeEventListener('transitionend', this.hideScrollButtons);
433
435
  this.leftScrollButtonRef.current?.addEventListener('transitionend', this.hideScrollButtons);
434
436
  this.setState({ showScrollButtons: true });
435
437
  }, 100);