@onewelcome/react-lib-components 1.3.0 → 1.5.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 (118) hide show
  1. package/README.md +7 -0
  2. package/dist/Breadcrumbs/Breadcrumbs.d.ts +1 -1
  3. package/dist/Button/IconButton.d.ts +2 -1
  4. package/dist/ContextMenu/ContextMenu.d.ts +4 -1
  5. package/dist/DataGrid/DataGrid.d.ts +1 -0
  6. package/dist/DataGrid/DataGridActions/DataGridActions.d.ts +2 -1
  7. package/dist/DataGrid/DataGridActions/DataGridColumnsToggle.d.ts +1 -1
  8. package/dist/DataGrid/datagrid.interfaces.d.ts +4 -4
  9. package/dist/Form/Form.d.ts +3 -3
  10. package/dist/Form/FormControl/FormControl.d.ts +1 -1
  11. package/dist/Form/Input/Input.d.ts +1 -1
  12. package/dist/Form/Select/Select.d.ts +1 -1
  13. package/dist/Form/Select/Select.interfaces.d.ts +1 -1
  14. package/dist/Icon/Icon.d.ts +1 -1
  15. package/dist/Link/Link.d.ts +1 -1
  16. package/dist/Notifications/SlideInModal/SlideInModal.d.ts +1 -1
  17. package/dist/Notifications/Snackbar/interfaces.d.ts +2 -2
  18. package/dist/Pagination/Pagination.d.ts +3 -3
  19. package/dist/Popover/Popover.d.ts +3 -1
  20. package/dist/Tabs/Tab.d.ts +5 -9
  21. package/dist/Tabs/TabButton.d.ts +3 -6
  22. package/dist/Tabs/Tabs.d.ts +1 -2
  23. package/dist/Typography/Typography.d.ts +2 -2
  24. package/dist/Wizard/Wizard.d.ts +1 -1
  25. package/dist/Wizard/wizardStateReducer.d.ts +2 -2
  26. package/dist/_BaseStyling_/BaseStyling.d.ts +2 -0
  27. package/dist/hooks/usePosition.d.ts +6 -5
  28. package/dist/hooks/useSpacing.d.ts +3 -3
  29. package/dist/interfaces.d.ts +1 -1
  30. package/dist/react-lib-components.cjs.development.js +507 -440
  31. package/dist/react-lib-components.cjs.development.js.map +1 -1
  32. package/dist/react-lib-components.cjs.production.min.js +1 -1
  33. package/dist/react-lib-components.cjs.production.min.js.map +1 -1
  34. package/dist/react-lib-components.esm.js +508 -441
  35. package/dist/react-lib-components.esm.js.map +1 -1
  36. package/dist/util/helper.d.ts +1 -1
  37. package/package.json +36 -35
  38. package/src/Breadcrumbs/Breadcrumbs.tsx +46 -38
  39. package/src/Button/BaseButton.tsx +23 -20
  40. package/src/Button/Button.tsx +40 -40
  41. package/src/Button/IconButton.tsx +28 -28
  42. package/src/ContextMenu/ContextMenu.tsx +180 -168
  43. package/src/ContextMenu/ContextMenuItem.tsx +55 -49
  44. package/src/DataGrid/DataGrid.tsx +1 -0
  45. package/src/DataGrid/DataGridActions/DataGridActions.module.scss +1 -1
  46. package/src/DataGrid/DataGridActions/DataGridActions.test.tsx +4 -2
  47. package/src/DataGrid/DataGridActions/DataGridActions.tsx +95 -87
  48. package/src/DataGrid/DataGridActions/DataGridColumnsToggle.tsx +64 -64
  49. package/src/DataGrid/DataGridBody/DataGridCell.tsx +42 -44
  50. package/src/DataGrid/DataGridBody/DataGridRow.tsx +29 -29
  51. package/src/DataGrid/DataGridHeader/DataGridHeader.tsx +78 -78
  52. package/src/DataGrid/DataGridHeader/DataGridHeaderCell.tsx +48 -48
  53. package/src/Form/Checkbox/Checkbox.tsx +134 -130
  54. package/src/Form/Fieldset/Fieldset.tsx +81 -78
  55. package/src/Form/Form.tsx +9 -4
  56. package/src/Form/FormControl/FormControl.module.scss +1 -20
  57. package/src/Form/FormControl/FormControl.tsx +36 -35
  58. package/src/Form/FormGroup/FormGroup.tsx +62 -62
  59. package/src/Form/FormHelperText/FormHelperText.tsx +19 -18
  60. package/src/Form/FormSelectorWrapper/FormSelectorWrapper.tsx +58 -53
  61. package/src/Form/Input/Input.test.tsx +12 -0
  62. package/src/Form/Input/Input.tsx +91 -87
  63. package/src/Form/Label/Label.tsx +17 -16
  64. package/src/Form/Radio/Radio.tsx +91 -91
  65. package/src/Form/Select/Option.tsx +66 -60
  66. package/src/Form/Select/Select.tsx +207 -209
  67. package/src/Form/Textarea/Textarea.tsx +51 -53
  68. package/src/Form/Toggle/Toggle.tsx +26 -23
  69. package/src/Form/Wrapper/CheckboxWrapper/CheckboxWrapper.tsx +51 -43
  70. package/src/Form/Wrapper/InputWrapper/InputWrapper.tsx +112 -106
  71. package/src/Form/Wrapper/RadioWrapper/RadioWrapper.tsx +67 -62
  72. package/src/Form/Wrapper/SelectWrapper/SelectWrapper.tsx +42 -37
  73. package/src/Form/Wrapper/TextareaWrapper/TextareaWrapper.tsx +94 -94
  74. package/src/Form/Wrapper/Wrapper/Wrapper.tsx +73 -73
  75. package/src/Icon/Icon.tsx +19 -16
  76. package/src/Link/Link.tsx +68 -63
  77. package/src/Notifications/BaseModal/BaseModal.tsx +68 -68
  78. package/src/Notifications/BaseModal/BaseModalActions/BaseModalActions.tsx +13 -10
  79. package/src/Notifications/BaseModal/BaseModalContent/BaseModalContent.tsx +33 -25
  80. package/src/Notifications/BaseModal/BaseModalHeader/BaseModalHeader.tsx +20 -17
  81. package/src/Notifications/Dialog/Dialog.tsx +83 -83
  82. package/src/Notifications/Dialog/DialogActions/DialogActions.tsx +17 -14
  83. package/src/Notifications/Dialog/DialogTitle/DialogTitle.tsx +15 -12
  84. package/src/Notifications/DiscardChangesModal/DiscardChangesDialog/DiscardChangesDialog.tsx +40 -40
  85. package/src/Notifications/SlideInModal/SlideInModal.module.scss +5 -5
  86. package/src/Notifications/SlideInModal/SlideInModal.test.tsx +7 -2
  87. package/src/Notifications/SlideInModal/SlideInModal.tsx +47 -27
  88. package/src/Pagination/Pagination.tsx +169 -169
  89. package/src/Popover/Popover.module.scss +1 -0
  90. package/src/Popover/Popover.test.tsx +4 -1
  91. package/src/Popover/Popover.tsx +74 -32
  92. package/src/ProgressBar/ProgressBar.tsx +17 -14
  93. package/src/Skeleton/Skeleton.tsx +23 -20
  94. package/src/StatusIndicator/StatusIndicator.tsx +18 -15
  95. package/src/Tabs/{TabPanel.module.scss → Tab.module.scss} +1 -1
  96. package/src/Tabs/Tab.test.tsx +1 -39
  97. package/src/Tabs/Tab.tsx +16 -10
  98. package/src/Tabs/TabButton.module.scss +0 -4
  99. package/src/Tabs/TabButton.test.tsx +3 -31
  100. package/src/Tabs/TabButton.tsx +35 -49
  101. package/src/Tabs/Tabs.test.tsx +40 -33
  102. package/src/Tabs/Tabs.tsx +107 -101
  103. package/src/TextEllipsis/TextEllipsis.tsx +50 -41
  104. package/src/Tiles/Tile.tsx +58 -56
  105. package/src/Tiles/Tiles.tsx +44 -41
  106. package/src/Tooltip/Tooltip.test.tsx +5 -5
  107. package/src/Tooltip/Tooltip.tsx +101 -100
  108. package/src/Typography/Typography.tsx +47 -44
  109. package/src/Wizard/BaseWizardSteps/BaseWizardSteps.tsx +55 -52
  110. package/src/Wizard/WizardSteps/WizardSteps.tsx +25 -22
  111. package/src/_BaseStyling_/BaseStyling.tsx +4 -0
  112. package/src/hooks/usePosition.test.tsx +85 -85
  113. package/src/hooks/usePosition.ts +6 -3
  114. package/src/mixins.module.scss +7 -7
  115. package/src/util/helper.test.tsx +0 -28
  116. package/dist/Tabs/TabPanel.d.ts +0 -8
  117. package/src/Tabs/TabPanel.test.tsx +0 -92
  118. package/src/Tabs/TabPanel.tsx +0 -43
@@ -16,15 +16,17 @@
16
16
 
17
17
  import React, {
18
18
  ComponentPropsWithRef,
19
+ ForwardRefRenderFunction,
19
20
  ReactElement,
20
21
  ReactNode,
22
+ useCallback,
21
23
  useEffect,
22
24
  useRef,
23
25
  useState
24
26
  } from "react";
25
27
  import { Props as ButtonProps } from "../Button/Button";
26
28
  import { Props as IconButtonProps } from "../Button/IconButton";
27
- import { Popover } from "../Popover/Popover";
29
+ import { Popover, Props as PopoverProps } from "../Popover/Popover";
28
30
  import { Placement, Offset } from "../hooks/usePosition";
29
31
  import classes from "./ContextMenu.module.scss";
30
32
  import { useBodyClick } from "../hooks/useBodyClick";
@@ -37,185 +39,195 @@ export interface Props extends ComponentPropsWithRef<"div"> {
37
39
  placement?: Placement;
38
40
  transformOrigin?: Placement;
39
41
  offset?: Offset;
42
+ debounceAmount?: number;
40
43
  id: string;
41
44
  show?: boolean;
42
45
  domRoot?: HTMLElement;
43
46
  onShow?: () => void;
44
47
  onClose?: () => void;
48
+ popoverProps?: PopoverProps;
45
49
  }
46
50
 
47
- export const ContextMenu = React.forwardRef<HTMLDivElement, Props>(
48
- (
49
- {
50
- trigger,
51
- children,
52
- decorativeElement,
53
- id,
54
- show = false,
55
- onShow,
56
- onClose,
57
- placement = { horizontal: "right", vertical: "top" },
58
- offset = { top: 0, bottom: 0, left: 0, right: 0 },
59
- transformOrigin = { horizontal: "left", vertical: "top" },
60
- domRoot = document.body,
61
- ...rest
62
- }: Props,
63
- ref
64
- ) => {
65
- const anchorEl = useRef<HTMLButtonElement>(null);
66
- const [showContextMenu, setShowContextMenu] = useState(show);
67
- const [hasBeenClosed, setHasBeenClosed] = useState(false);
68
- const [selectedContextMenuItem, setSelectedContextMenuItem] = useState(-1);
69
- const [focusedContextMenuItem, setFocusedContextMenuItem] = useState(-1);
70
- const [shouldClick, setShouldClick] =
71
- useState(
72
- false
73
- ); /** We need this, because whenever we use the arrow keys to select the contextmenu item, and we focus the currently selected item it fires the "click" listener in ContextMenuItem component. Instead, we only want this to fire if we press "enter" or "spacebar" so we set this to true whenever that is the case, and back to false when it has been executed. */
74
- const [childrenCount] = useState(React.Children.count(children));
75
-
76
- if (!id) {
77
- throw new Error("You need to provide an ID to the context menu");
51
+ const ContextMenuComponent: ForwardRefRenderFunction<HTMLDivElement, Props> = (
52
+ {
53
+ trigger,
54
+ children,
55
+ decorativeElement,
56
+ id,
57
+ show = false,
58
+ onShow,
59
+ onClose,
60
+ placement = { horizontal: "right", vertical: "top" },
61
+ offset = { top: 0, bottom: 0, left: 0, right: 0 },
62
+ transformOrigin = { horizontal: "left", vertical: "top" },
63
+ debounceAmount,
64
+ domRoot = document.body,
65
+ popoverProps,
66
+ ...rest
67
+ }: Props,
68
+ ref
69
+ ) => {
70
+ const anchorEl = useRef<HTMLButtonElement>(null);
71
+ const [showContextMenu, setShowContextMenu] = useState(show);
72
+ const [hasBeenClosed, setHasBeenClosed] = useState(false);
73
+ const [selectedContextMenuItem, setSelectedContextMenuItem] = useState(-1);
74
+ const [focusedContextMenuItem, setFocusedContextMenuItem] = useState(-1);
75
+ const [shouldClick, setShouldClick] =
76
+ useState(
77
+ false
78
+ ); /** We need this, because whenever we use the arrow keys to select the contextmenu item, and we focus the currently selected item it fires the "click" listener in ContextMenuItem component. Instead, we only want this to fire if we press "enter" or "spacebar" so we set this to true whenever that is the case, and back to false when it has been executed. */
79
+ const [childrenCount] = useState(React.Children.count(children));
80
+
81
+ if (!id) {
82
+ throw new Error("You need to provide an ID to the context menu");
83
+ }
84
+
85
+ const onArrowNavigation = (event: React.KeyboardEvent) => {
86
+ if (focusedContextMenuItem === -1 && selectedContextMenuItem !== -1) {
87
+ setFocusedContextMenuItem(selectedContextMenuItem);
78
88
  }
79
89
 
80
- const onArrowNavigation = (event: React.KeyboardEvent) => {
81
- if (focusedContextMenuItem === -1 && selectedContextMenuItem !== -1) {
82
- setFocusedContextMenuItem(selectedContextMenuItem);
83
- }
84
-
85
- const codesToPrevenDefault = [
86
- "ArrowDown",
87
- "ArrowUp",
88
- "ArrowLeft",
89
- "ArrowRight",
90
- "Enter",
91
- "Space",
92
- "Escape",
93
- "End",
94
- "Home"
95
- ];
96
-
97
- if (codesToPrevenDefault.includes(event.code)) {
98
- event.preventDefault();
99
- }
100
-
101
- switch (event.code) {
102
- case "ArrowDown":
103
- if (!showContextMenu) {
104
- setShowContextMenu(true);
105
- return;
106
- }
107
- setFocusedContextMenuItem(prevState => {
108
- return prevState + 1 > childrenCount - 1 ? 0 : prevState + 1;
109
- });
110
- return;
111
- case "ArrowUp":
112
- setFocusedContextMenuItem(prevState => {
113
- return prevState - 1 < 0 ? childrenCount - 1 : prevState - 1;
114
- });
115
- return;
116
- case "Enter":
117
- case "Space":
118
- if (!showContextMenu) {
119
- setShowContextMenu(true);
120
- return;
121
- }
122
-
123
- setShouldClick(true);
124
- setSelectedContextMenuItem(focusedContextMenuItem);
125
- setShowContextMenu(false);
126
- return;
127
- case "Tab":
128
- case "Escape":
129
- setShowContextMenu(false);
130
- return;
131
- case "End":
132
- setFocusedContextMenuItem(childrenCount - 1);
90
+ const codesToPrevenDefault = [
91
+ "ArrowDown",
92
+ "ArrowUp",
93
+ "ArrowLeft",
94
+ "ArrowRight",
95
+ "Enter",
96
+ "Space",
97
+ "Escape",
98
+ "End",
99
+ "Home"
100
+ ];
101
+
102
+ if (codesToPrevenDefault.includes(event.code)) {
103
+ event.preventDefault();
104
+ }
105
+
106
+ switch (event.code) {
107
+ case "ArrowDown":
108
+ if (!showContextMenu) {
109
+ setShowContextMenu(true);
133
110
  return;
134
- case "Home":
135
- setFocusedContextMenuItem(0);
111
+ }
112
+ setFocusedContextMenuItem(prevState => {
113
+ return prevState + 1 > childrenCount - 1 ? 0 : prevState + 1;
114
+ });
115
+ return;
116
+ case "ArrowUp":
117
+ setFocusedContextMenuItem(prevState => {
118
+ return prevState - 1 < 0 ? childrenCount - 1 : prevState - 1;
119
+ });
120
+ return;
121
+ case "Enter":
122
+ case "Space":
123
+ if (!showContextMenu) {
124
+ setShowContextMenu(true);
136
125
  return;
137
- }
138
- };
139
-
140
- useBodyClick(
141
- event => {
142
- return (
143
- showContextMenu &&
144
- anchorEl.current !== event.target &&
145
- anchorEl.current !== (event.target as HTMLElement).parentElement
146
- );
147
- },
148
- () => {
126
+ }
127
+
128
+ setShouldClick(true);
129
+ setSelectedContextMenuItem(focusedContextMenuItem);
149
130
  setShowContextMenu(false);
150
- },
151
- showContextMenu
131
+ return;
132
+ case "Tab":
133
+ case "Escape":
134
+ setShowContextMenu(false);
135
+ return;
136
+ case "End":
137
+ setFocusedContextMenuItem(childrenCount - 1);
138
+ return;
139
+ case "Home":
140
+ setFocusedContextMenuItem(0);
141
+ return;
142
+ }
143
+ };
144
+
145
+ useBodyClick(
146
+ event => {
147
+ return (
148
+ showContextMenu &&
149
+ anchorEl.current !== event.target &&
150
+ anchorEl.current !== (event.target as HTMLElement).parentElement
151
+ );
152
+ },
153
+ () => {
154
+ setShowContextMenu(false);
155
+ },
156
+ showContextMenu
157
+ );
158
+
159
+ useEffect(() => {
160
+ if (showContextMenu === true) {
161
+ onShow && onShow();
162
+ } else {
163
+ onClose && onClose();
164
+ !hasBeenClosed && setHasBeenClosed(true);
165
+ setFocusedContextMenuItem(-1);
166
+ hasBeenClosed && anchorEl.current && anchorEl.current.focus();
167
+ }
168
+ }, [showContextMenu]);
169
+
170
+ const renderTrigger = () =>
171
+ React.cloneElement(trigger, {
172
+ id: id,
173
+ "aria-haspopup": "true",
174
+ "aria-controls": `${id}-menu`,
175
+ "aria-expanded": showContextMenu,
176
+ onClick: () => setShowContextMenu(!showContextMenu),
177
+ tabIndex: 0,
178
+ ref: anchorEl
179
+ });
180
+
181
+ const renderChildren = () =>
182
+ React.Children.map(children, (child, index) =>
183
+ React.cloneElement(child as ReactElement, {
184
+ onFocusChange: (childIndex: number) => setFocusedContextMenuItem(childIndex),
185
+ onSelectedChange: (childIndex: number) => {
186
+ setSelectedContextMenuItem(childIndex);
187
+ setShouldClick(false);
188
+ },
189
+ childIndex: index,
190
+ hasFocus: focusedContextMenuItem === index,
191
+ isSelected: selectedContextMenuItem === index,
192
+ contextMenuOpened: showContextMenu,
193
+ shouldClick: shouldClick
194
+ })
152
195
  );
153
196
 
154
- useEffect(() => {
155
- if (showContextMenu === true) {
156
- onShow && onShow();
157
- } else {
158
- onClose && onClose();
159
- !hasBeenClosed && setHasBeenClosed(true);
160
- setFocusedContextMenuItem(-1);
161
- hasBeenClosed && anchorEl.current && anchorEl.current.focus();
162
- }
163
- }, [showContextMenu]);
164
-
165
- const renderTrigger = () =>
166
- React.cloneElement(trigger, {
167
- id: id,
168
- "aria-haspopup": "true",
169
- "aria-controls": `${id}-menu`,
170
- "aria-expanded": showContextMenu,
171
- onClick: () => setShowContextMenu(!showContextMenu),
172
- tabIndex: 0,
173
- ref: anchorEl
174
- });
175
-
176
- const renderChildren = () => {
177
- return React.Children.map(children, (child, index) => {
178
- return React.cloneElement(child as ReactElement, {
179
- onFocusChange: (childIndex: number) => setFocusedContextMenuItem(childIndex),
180
- onSelectedChange: (childIndex: number) => {
181
- setSelectedContextMenuItem(childIndex);
182
- setShouldClick(false);
183
- },
184
- childIndex: index,
185
- hasFocus: focusedContextMenuItem === index,
186
- isSelected: selectedContextMenuItem === index,
187
- contextMenuOpened: showContextMenu,
188
- shouldClick: shouldClick
189
- });
190
- });
191
- };
192
-
193
- return (
194
- <div {...rest} ref={ref} onKeyDown={onArrowNavigation} className={classes["context-menu"]}>
195
- {renderTrigger()}
196
- {createPortal(
197
- <Popover
198
- placement={placement}
199
- transformOrigin={transformOrigin}
200
- offset={offset}
201
- anchorEl={anchorEl}
202
- show={showContextMenu}
197
+ const onOutOfViewHandler = useCallback(() => {
198
+ setShowContextMenu(false);
199
+ }, []);
200
+
201
+ return (
202
+ <div {...rest} ref={ref} onKeyDown={onArrowNavigation} className={classes["context-menu"]}>
203
+ {renderTrigger()}
204
+ {createPortal(
205
+ <Popover
206
+ {...popoverProps}
207
+ placement={placement}
208
+ transformOrigin={transformOrigin}
209
+ offset={offset}
210
+ anchorEl={anchorEl}
211
+ debounceAmount={debounceAmount}
212
+ show={showContextMenu}
213
+ onAnchorOutOfView={onOutOfViewHandler}
214
+ >
215
+ {decorativeElement && (
216
+ <div className={classes["decorative-element"]}>{decorativeElement}</div>
217
+ )}
218
+ <ul
219
+ className={`${classes["menu"]} ${decorativeElement ? classes["no-margin-top"] : ""}`}
220
+ id={`${id}-menu`}
221
+ aria-describedby={id}
222
+ role="menu"
203
223
  >
204
- {decorativeElement && (
205
- <div className={classes["decorative-element"]}>{decorativeElement}</div>
206
- )}
207
- <ul
208
- className={`${classes["menu"]} ${decorativeElement ? classes["no-margin-top"] : ""}`}
209
- id={`${id}-menu`}
210
- aria-describedby={id}
211
- role="menu"
212
- >
213
- {renderChildren()}
214
- </ul>
215
- </Popover>,
216
- domRoot
217
- )}
218
- </div>
219
- );
220
- }
221
- );
224
+ {renderChildren()}
225
+ </ul>
226
+ </Popover>,
227
+ domRoot
228
+ )}
229
+ </div>
230
+ );
231
+ };
232
+
233
+ export const ContextMenu = React.forwardRef(ContextMenuComponent);
@@ -14,7 +14,13 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import React, { ComponentPropsWithRef, createRef, RefObject, useEffect } from "react";
17
+ import React, {
18
+ ComponentPropsWithRef,
19
+ createRef,
20
+ ForwardRefRenderFunction,
21
+ RefObject,
22
+ useEffect
23
+ } from "react";
18
24
  import classes from "./ContextMenuItem.module.scss";
19
25
 
20
26
  export interface Props extends Omit<ComponentPropsWithRef<"button">, "onClick"> {
@@ -29,54 +35,54 @@ export interface Props extends Omit<ComponentPropsWithRef<"button">, "onClick">
29
35
  onSelectedChange?: (childIndex: number) => void;
30
36
  }
31
37
 
32
- export const ContextMenuItem = React.forwardRef<HTMLButtonElement, Props>(
33
- (
34
- {
35
- children,
36
- onClick,
37
- onFocusChange,
38
- onSelectedChange,
39
- hasFocus,
40
- isSelected,
41
- childIndex,
42
- contextMenuOpened,
43
- shouldClick,
44
- className,
45
- ...rest
46
- }: Props,
47
- ref
48
- ) => {
49
- let innerButtonRef = (ref as RefObject<HTMLButtonElement>) || createRef<HTMLButtonElement>();
38
+ const ContextMenuItemComponent: ForwardRefRenderFunction<HTMLButtonElement, Props> = (
39
+ {
40
+ children,
41
+ onClick,
42
+ onFocusChange,
43
+ onSelectedChange,
44
+ hasFocus,
45
+ isSelected,
46
+ childIndex,
47
+ contextMenuOpened,
48
+ shouldClick,
49
+ className,
50
+ ...rest
51
+ }: Props,
52
+ ref
53
+ ) => {
54
+ let innerButtonRef = (ref as RefObject<HTMLButtonElement>) || createRef<HTMLButtonElement>();
50
55
 
51
- useEffect(() => {
52
- if (isSelected && innerButtonRef.current && shouldClick) {
53
- innerButtonRef.current.click();
54
- }
55
- }, [isSelected, shouldClick]);
56
+ useEffect(() => {
57
+ if (isSelected && innerButtonRef.current && shouldClick) {
58
+ innerButtonRef.current.click();
59
+ }
60
+ }, [isSelected, shouldClick]);
56
61
 
57
- useEffect(() => {
58
- if (innerButtonRef.current && hasFocus && contextMenuOpened) {
59
- onFocusChange && childIndex && onFocusChange(childIndex);
60
- innerButtonRef.current.focus();
61
- }
62
- }, [hasFocus, innerButtonRef, contextMenuOpened]);
62
+ useEffect(() => {
63
+ if (innerButtonRef.current && hasFocus && contextMenuOpened) {
64
+ onFocusChange && childIndex && onFocusChange(childIndex);
65
+ innerButtonRef.current.focus();
66
+ }
67
+ }, [hasFocus, innerButtonRef, contextMenuOpened]);
63
68
 
64
- return (
65
- <li role="none" className={`${classes["context-menu-item"]} ${className ?? ""}`}>
66
- <button
67
- role="menuitem"
68
- {...rest}
69
- ref={innerButtonRef}
70
- data-focus={hasFocus}
71
- tabIndex={-1}
72
- onClick={event => {
73
- onClick && onClick(event);
74
- onSelectedChange && childIndex && onSelectedChange(childIndex);
75
- }}
76
- >
77
- {children}
78
- </button>
79
- </li>
80
- );
81
- }
82
- );
69
+ return (
70
+ <li role="none" className={`${classes["context-menu-item"]} ${className ?? ""}`}>
71
+ <button
72
+ role="menuitem"
73
+ {...rest}
74
+ ref={innerButtonRef}
75
+ data-focus={hasFocus}
76
+ tabIndex={-1}
77
+ onClick={event => {
78
+ onClick && onClick(event);
79
+ onSelectedChange && childIndex && onSelectedChange(childIndex);
80
+ }}
81
+ >
82
+ {children}
83
+ </button>
84
+ </li>
85
+ );
86
+ };
87
+
88
+ export const ContextMenuItem = React.forwardRef(ContextMenuItemComponent);
@@ -37,6 +37,7 @@ export interface Props<T> extends Omit<ComponentPropsWithRef<"div">, "children">
37
37
  addBtnProps?: ButtonProps;
38
38
  columnsBtnProps?: ButtonProps;
39
39
  searchBtnProps?: ButtonProps;
40
+ searchIconBtnProps?: ButtonProps;
40
41
  };
41
42
  emptyLabel?: string;
42
43
  paginationProps?: PaginationProps;
@@ -42,7 +42,7 @@
42
42
 
43
43
  @media only screen and (min-width: 30em) {
44
44
  .desktop {
45
- display: block;
45
+ display: flex;
46
46
  }
47
47
 
48
48
  .mobile {
@@ -105,6 +105,7 @@ describe("DataGridActions should render", () => {
105
105
  const addBtnProps = { children: "button1", title: "title1" };
106
106
  const columnsBtnProps = { children: "button2", title: "title2" };
107
107
  const searchBtnProps = { children: "button3", title: "title3" };
108
+ const searchIconBtnProps = { title: "title4" };
108
109
  const { dataGridActions, getAllByRole } = createDataGridActions(params => ({
109
110
  ...params,
110
111
  enableAddBtn: true,
@@ -112,7 +113,8 @@ describe("DataGridActions should render", () => {
112
113
  enableSearchBtn: true,
113
114
  addBtnProps,
114
115
  columnsBtnProps,
115
- searchBtnProps
116
+ searchBtnProps,
117
+ searchIconBtnProps
116
118
  }));
117
119
 
118
120
  expect(dataGridActions).toBeDefined();
@@ -125,7 +127,7 @@ describe("DataGridActions should render", () => {
125
127
  expect(mobileColumnsBtn).toHaveTextContent(columnsBtnProps.title);
126
128
  expect(desktopSearchBtn).toHaveTextContent(searchBtnProps.children);
127
129
  expect(desktopSearchBtn).toHaveAttribute("title", searchBtnProps.title);
128
- expect(mobileSearchBtn).toHaveTextContent(searchBtnProps.title);
130
+ expect(mobileSearchBtn).toHaveTextContent(searchIconBtnProps.title);
129
131
  });
130
132
  });
131
133