@dmsi/wedgekit-react 0.0.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 (263) hide show
  1. package/README.md +35 -0
  2. package/dist/chunk-27KIIUAR.js +59 -0
  3. package/dist/chunk-2G2E2JMA.js +123 -0
  4. package/dist/chunk-4C66DLIJ.js +51 -0
  5. package/dist/chunk-4RD5ZF2V.js +55 -0
  6. package/dist/chunk-4RJKB7LC.js +14 -0
  7. package/dist/chunk-4T7F5BZZ.js +26 -0
  8. package/dist/chunk-5GOBP2JS.js +53 -0
  9. package/dist/chunk-6ZY524ID.js +42 -0
  10. package/dist/chunk-AWQSSKCK.js +32 -0
  11. package/dist/chunk-BNHSAFMP.js +93 -0
  12. package/dist/chunk-BWRHL2AG.js +439 -0
  13. package/dist/chunk-DKKYR6DS.js +132 -0
  14. package/dist/chunk-E5ALT5W7.js +182 -0
  15. package/dist/chunk-FY7PTP6E.js +322 -0
  16. package/dist/chunk-GTCSRHPF.js +119 -0
  17. package/dist/chunk-I2UVVKQI.js +12 -0
  18. package/dist/chunk-IGQVA7SC.js +41 -0
  19. package/dist/chunk-K3IKUSZW.js +59 -0
  20. package/dist/chunk-KENSVWOY.js +151 -0
  21. package/dist/chunk-KX3O6GJ6.js +138 -0
  22. package/dist/chunk-L4UM372R.js +253 -0
  23. package/dist/chunk-ORMEWXMH.js +37 -0
  24. package/dist/chunk-Q3FKEKIN.js +23 -0
  25. package/dist/chunk-SEKKGFM6.js +28 -0
  26. package/dist/chunk-SY3HT54E.js +91 -0
  27. package/dist/chunk-TAW5ZZ4Z.js +346 -0
  28. package/dist/chunk-TRUPPHBQ.js +109 -0
  29. package/dist/chunk-TU55CHXU.js +30 -0
  30. package/dist/chunk-TWZZB4WO.js +114 -0
  31. package/dist/chunk-TYI74BSP.js +62 -0
  32. package/dist/chunk-U42SKNR6.js +104 -0
  33. package/dist/chunk-UU3FA6LV.js +72 -0
  34. package/dist/chunk-WVUIIBRR.js +51 -0
  35. package/dist/chunk-XUIPGYP5.js +39 -0
  36. package/dist/chunk-Z4UCFUF7.js +299 -0
  37. package/dist/components/Breadcrumbs.cjs +376 -0
  38. package/dist/components/Breadcrumbs.js +90 -0
  39. package/dist/components/Button.cjs +319 -0
  40. package/dist/components/Button.js +8 -0
  41. package/dist/components/CalendarRange.cjs +520 -0
  42. package/dist/components/CalendarRange.js +13 -0
  43. package/dist/components/Caption.cjs +283 -0
  44. package/dist/components/Caption.js +80 -0
  45. package/dist/components/Checkbox.cjs +378 -0
  46. package/dist/components/Checkbox.js +11 -0
  47. package/dist/components/ContentTab.cjs +382 -0
  48. package/dist/components/ContentTab.js +10 -0
  49. package/dist/components/ContentTabs.cjs +472 -0
  50. package/dist/components/ContentTabs.js +98 -0
  51. package/dist/components/DMSiLogo.cjs +79 -0
  52. package/dist/components/DMSiLogo.js +56 -0
  53. package/dist/components/DataGrid.cjs +3113 -0
  54. package/dist/components/DataGrid.js +758 -0
  55. package/dist/components/DataGridCell.cjs +1907 -0
  56. package/dist/components/DataGridCell.js +24 -0
  57. package/dist/components/DataTable.cjs +791 -0
  58. package/dist/components/DataTable.js +720 -0
  59. package/dist/components/DateInput.cjs +1130 -0
  60. package/dist/components/DateInput.js +170 -0
  61. package/dist/components/DateRangeInput.cjs +1131 -0
  62. package/dist/components/DateRangeInput.js +171 -0
  63. package/dist/components/DebugJson.cjs +50 -0
  64. package/dist/components/DebugJson.js +27 -0
  65. package/dist/components/Display.cjs +234 -0
  66. package/dist/components/Display.js +12 -0
  67. package/dist/components/EditingContext.cjs +73 -0
  68. package/dist/components/EditingContext.js +35 -0
  69. package/dist/components/FilterGroup.cjs +1431 -0
  70. package/dist/components/FilterGroup.js +231 -0
  71. package/dist/components/FullViewportBox.cjs +35 -0
  72. package/dist/components/FullViewportBox.js +12 -0
  73. package/dist/components/Grid.cjs +69 -0
  74. package/dist/components/Grid.js +36 -0
  75. package/dist/components/GridContainer.cjs +125 -0
  76. package/dist/components/GridContainer.js +92 -0
  77. package/dist/components/Heading.cjs +238 -0
  78. package/dist/components/Heading.js +14 -0
  79. package/dist/components/HorizontalDivider.cjs +33 -0
  80. package/dist/components/HorizontalDivider.js +10 -0
  81. package/dist/components/Icon.cjs +98 -0
  82. package/dist/components/Icon.js +7 -0
  83. package/dist/components/Input.cjs +672 -0
  84. package/dist/components/Input.js +21 -0
  85. package/dist/components/InputGroup.cjs +270 -0
  86. package/dist/components/InputGroup.js +60 -0
  87. package/dist/components/Label.cjs +223 -0
  88. package/dist/components/Label.js +8 -0
  89. package/dist/components/Link.cjs +262 -0
  90. package/dist/components/Link.js +8 -0
  91. package/dist/components/List.cjs +37 -0
  92. package/dist/components/List.js +14 -0
  93. package/dist/components/LiveChatComponent.cjs +63 -0
  94. package/dist/components/LiveChatComponent.js +40 -0
  95. package/dist/components/LogoAgilityTopBar.cjs +115 -0
  96. package/dist/components/LogoAgilityTopBar.js +92 -0
  97. package/dist/components/LogoDMSiTopBar.cjs +79 -0
  98. package/dist/components/LogoDMSiTopBar.js +7 -0
  99. package/dist/components/LogoMillworkTopBar.cjs +221 -0
  100. package/dist/components/LogoMillworkTopBar.js +198 -0
  101. package/dist/components/MainBar.cjs +211 -0
  102. package/dist/components/MainBar.js +65 -0
  103. package/dist/components/Menu.cjs +437 -0
  104. package/dist/components/Menu.js +11 -0
  105. package/dist/components/MenuOption.cjs +483 -0
  106. package/dist/components/MenuOption.js +13 -0
  107. package/dist/components/MobileDataGrid.cjs +658 -0
  108. package/dist/components/MobileDataGrid.js +125 -0
  109. package/dist/components/Modal.cjs +783 -0
  110. package/dist/components/Modal.js +245 -0
  111. package/dist/components/ModalButtons.cjs +385 -0
  112. package/dist/components/ModalButtons.js +10 -0
  113. package/dist/components/ModalContent.cjs +57 -0
  114. package/dist/components/ModalContent.js +7 -0
  115. package/dist/components/ModalHeader.cjs +426 -0
  116. package/dist/components/ModalHeader.js +11 -0
  117. package/dist/components/ModalScrim.cjs +64 -0
  118. package/dist/components/ModalScrim.js +7 -0
  119. package/dist/components/NavigationTab.cjs +431 -0
  120. package/dist/components/NavigationTab.js +10 -0
  121. package/dist/components/NavigationTabs.cjs +477 -0
  122. package/dist/components/NavigationTabs.js +56 -0
  123. package/dist/components/Notification.cjs +640 -0
  124. package/dist/components/Notification.js +117 -0
  125. package/dist/components/OptionPill.cjs +478 -0
  126. package/dist/components/OptionPill.js +11 -0
  127. package/dist/components/Paragraph.cjs +231 -0
  128. package/dist/components/Paragraph.js +8 -0
  129. package/dist/components/Password.cjs +700 -0
  130. package/dist/components/Password.js +53 -0
  131. package/dist/components/ProjectBar.cjs +242 -0
  132. package/dist/components/ProjectBar.js +63 -0
  133. package/dist/components/Radio.cjs +349 -0
  134. package/dist/components/Radio.js +131 -0
  135. package/dist/components/Search.cjs +767 -0
  136. package/dist/components/Search.js +12 -0
  137. package/dist/components/Select.cjs +758 -0
  138. package/dist/components/Select.js +12 -0
  139. package/dist/components/SideMenu.cjs +54 -0
  140. package/dist/components/SideMenu.js +21 -0
  141. package/dist/components/SideMenuGroup.cjs +422 -0
  142. package/dist/components/SideMenuGroup.js +83 -0
  143. package/dist/components/SideMenuItem.cjs +388 -0
  144. package/dist/components/SideMenuItem.js +70 -0
  145. package/dist/components/Stack.cjs +138 -0
  146. package/dist/components/Stack.js +7 -0
  147. package/dist/components/StatusPill.cjs +265 -0
  148. package/dist/components/StatusPill.js +52 -0
  149. package/dist/components/Stepper.cjs +885 -0
  150. package/dist/components/Stepper.js +105 -0
  151. package/dist/components/Subheader.cjs +226 -0
  152. package/dist/components/Subheader.js +8 -0
  153. package/dist/components/Surface.cjs +98 -0
  154. package/dist/components/Surface.js +40 -0
  155. package/dist/components/Swatch.cjs +1728 -0
  156. package/dist/components/Swatch.js +1319 -0
  157. package/dist/components/Textarea.cjs +269 -0
  158. package/dist/components/Textarea.js +96 -0
  159. package/dist/components/Theme.cjs +36 -0
  160. package/dist/components/Theme.js +7 -0
  161. package/dist/components/Time.cjs +1118 -0
  162. package/dist/components/Time.js +353 -0
  163. package/dist/components/Toast.cjs +644 -0
  164. package/dist/components/Toast.js +218 -0
  165. package/dist/components/Tooltip.cjs +273 -0
  166. package/dist/components/Tooltip.js +9 -0
  167. package/dist/components/TopBar.cjs +352 -0
  168. package/dist/components/TopBar.js +132 -0
  169. package/dist/components/useInfiniteScroll.cjs +57 -0
  170. package/dist/components/useInfiniteScroll.js +8 -0
  171. package/dist/components/useMatchesMedia.cjs +53 -0
  172. package/dist/components/useMatchesMedia.js +9 -0
  173. package/dist/components/useMenuSystem.cjs +358 -0
  174. package/dist/components/useMenuSystem.js +11 -0
  175. package/dist/components/useMounted.cjs +39 -0
  176. package/dist/components/useMounted.js +8 -0
  177. package/dist/fonts.css +21 -0
  178. package/dist/icons-light[FILL]-PPZXOLWS.woff2 +0 -0
  179. package/dist/icons-normal[FILL]-PPZXOLWS.woff2 +0 -0
  180. package/dist/index.css +4401 -0
  181. package/dist/open-sans-55T6A4JE.woff2 +0 -0
  182. package/dist/types.cjs +18 -0
  183. package/dist/types.js +0 -0
  184. package/package.json +66 -0
  185. package/src/brand.css +125 -0
  186. package/src/classNames.ts +144 -0
  187. package/src/components/Breadcrumbs.tsx +116 -0
  188. package/src/components/Button.tsx +210 -0
  189. package/src/components/CalendarRange.tsx +429 -0
  190. package/src/components/Caption.tsx +101 -0
  191. package/src/components/Checkbox.tsx +196 -0
  192. package/src/components/ContentTab.tsx +66 -0
  193. package/src/components/ContentTabs.tsx +103 -0
  194. package/src/components/DMSiLogo.tsx +32 -0
  195. package/src/components/DataGrid.tsx +948 -0
  196. package/src/components/DataGridCell.tsx +384 -0
  197. package/src/components/DataTable.tsx +835 -0
  198. package/src/components/DateInput.tsx +188 -0
  199. package/src/components/DateRangeInput.tsx +179 -0
  200. package/src/components/DebugJson.tsx +24 -0
  201. package/src/components/Display.tsx +60 -0
  202. package/src/components/EditingContext.tsx +40 -0
  203. package/src/components/FilterGroup.tsx +234 -0
  204. package/src/components/FullViewportBox.tsx +11 -0
  205. package/src/components/Grid.tsx +75 -0
  206. package/src/components/GridContainer.tsx +124 -0
  207. package/src/components/Heading.tsx +66 -0
  208. package/src/components/HorizontalDivider.tsx +3 -0
  209. package/src/components/Icon.tsx +36 -0
  210. package/src/components/Input.tsx +511 -0
  211. package/src/components/InputGroup.tsx +51 -0
  212. package/src/components/Label.tsx +40 -0
  213. package/src/components/Link.tsx +106 -0
  214. package/src/components/List.tsx +10 -0
  215. package/src/components/LiveChatComponent.tsx +56 -0
  216. package/src/components/LogoAgilityTopBar.tsx +53 -0
  217. package/src/components/LogoDMSiTopBar.tsx +32 -0
  218. package/src/components/LogoMillworkTopBar.tsx +118 -0
  219. package/src/components/MainBar.tsx +83 -0
  220. package/src/components/Menu.tsx +286 -0
  221. package/src/components/MenuOption.tsx +275 -0
  222. package/src/components/MobileDataGrid.tsx +135 -0
  223. package/src/components/Modal.tsx +271 -0
  224. package/src/components/ModalButtons.tsx +44 -0
  225. package/src/components/ModalContent.tsx +23 -0
  226. package/src/components/ModalHeader.tsx +41 -0
  227. package/src/components/ModalScrim.tsx +35 -0
  228. package/src/components/NavigationTab.tsx +89 -0
  229. package/src/components/NavigationTabs.tsx +63 -0
  230. package/src/components/Notification.tsx +120 -0
  231. package/src/components/OptionPill.tsx +114 -0
  232. package/src/components/Paragraph.tsx +49 -0
  233. package/src/components/Password.tsx +46 -0
  234. package/src/components/ProjectBar.tsx +76 -0
  235. package/src/components/Radio.tsx +140 -0
  236. package/src/components/Search.tsx +129 -0
  237. package/src/components/Select.tsx +104 -0
  238. package/src/components/SideMenu.tsx +21 -0
  239. package/src/components/SideMenuGroup.tsx +81 -0
  240. package/src/components/SideMenuItem.tsx +90 -0
  241. package/src/components/Stack.tsx +179 -0
  242. package/src/components/StatusPill.tsx +51 -0
  243. package/src/components/Stepper.tsx +91 -0
  244. package/src/components/Subheader.tsx +44 -0
  245. package/src/components/Surface.tsx +34 -0
  246. package/src/components/Swatch.tsx +1066 -0
  247. package/src/components/Textarea.tsx +101 -0
  248. package/src/components/Theme.tsx +13 -0
  249. package/src/components/Time.tsx +438 -0
  250. package/src/components/Toast.tsx +244 -0
  251. package/src/components/Tooltip.tsx +137 -0
  252. package/src/components/TopBar.tsx +124 -0
  253. package/src/components/useInfiniteScroll.tsx +40 -0
  254. package/src/components/useMatchesMedia.tsx +28 -0
  255. package/src/components/useMenuSystem.tsx +367 -0
  256. package/src/components/useMounted.tsx +14 -0
  257. package/src/darkmode.css +140 -0
  258. package/src/fonts.css +23 -0
  259. package/src/index.css +509 -0
  260. package/src/index.tsx +2 -0
  261. package/src/types.ts +149 -0
  262. package/src/utils/formatting.tsx +81 -0
  263. package/src/utils.ts +23 -0
@@ -0,0 +1,384 @@
1
+ "use client";
2
+
3
+ import { useSortable } from "@dnd-kit/sortable";
4
+ import { CSS } from "@dnd-kit/utilities";
5
+ import {
6
+ // BuiltInFilterFn,
7
+ Cell,
8
+ // FilterFn,
9
+ FilterFnOption,
10
+ Header,
11
+ RowData,
12
+ } from "@tanstack/react-table";
13
+ import clsx from "clsx";
14
+ import {
15
+ ComponentProps,
16
+ CSSProperties,
17
+ memo,
18
+ PropsWithChildren,
19
+ useEffect,
20
+ useRef,
21
+ useState,
22
+ } from "react";
23
+ import { paddingUsingComponentGap } from "../classNames";
24
+ import { AsProps } from "../types";
25
+ import { Icon } from "./Icon";
26
+ import { Search } from "./Search";
27
+ import { Menu } from "./Menu";
28
+ import { MenuOption } from "./MenuOption";
29
+ import { useSubMenuSystem } from "./useMenuSystem";
30
+
31
+ type Tags = "td" | "th";
32
+
33
+ type DataGridCellProps = PropsWithChildren<{
34
+ type?: "default" | "header" | "summary";
35
+ component?: "header" | "checkbox" | "icon" | "button" | "static" | "input";
36
+ locked?: boolean;
37
+ noPadding?: boolean;
38
+ paddedLeft?: boolean;
39
+ onRightClick?: () => void;
40
+ error?: boolean;
41
+ warning?: boolean;
42
+ center?: boolean;
43
+ width?: string;
44
+ }>;
45
+
46
+ export const DataGridCell = memo(
47
+ ({
48
+ type = "default",
49
+ component = "static",
50
+ children,
51
+ className,
52
+ locked = false,
53
+ noPadding = false,
54
+ paddedLeft = false,
55
+ style,
56
+ onClick,
57
+ onRightClick,
58
+ error,
59
+ warning,
60
+ center,
61
+ width,
62
+ ...props
63
+ }: AsProps<Tags> & DataGridCellProps) => {
64
+ const Element = type === "header" ? "th" : "td";
65
+ const timerRef = useRef<number | null>(null);
66
+ const [isGrabbing, setIsGrabbing] = useState(false);
67
+ const [isPointerPressed, setIsPointerPressed] = useState(false);
68
+
69
+ useEffect(() => {
70
+ return () => {
71
+ if (timerRef.current) {
72
+ clearTimeout(timerRef.current);
73
+ timerRef.current = null;
74
+ }
75
+ };
76
+ }, []);
77
+
78
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
79
+ const handlePointerDown = (_event: React.MouseEvent | React.TouchEvent) => {
80
+ setIsPointerPressed(true);
81
+
82
+ timerRef.current = window.setTimeout(() => {
83
+ setIsGrabbing(true);
84
+ }, 500);
85
+ };
86
+
87
+ const handlePointerUp = (event: React.MouseEvent | React.TouchEvent) => {
88
+ if (timerRef.current) {
89
+ clearTimeout(timerRef.current);
90
+ timerRef.current = null;
91
+ }
92
+
93
+ const rightClick =
94
+ event.nativeEvent instanceof MouseEvent &&
95
+ event.nativeEvent.button === 2;
96
+
97
+ if (!isGrabbing && onClick && !rightClick && isPointerPressed) {
98
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
99
+ onClick(event as any);
100
+ }
101
+
102
+ if (rightClick && onRightClick) {
103
+ onRightClick();
104
+ }
105
+
106
+ setIsGrabbing(false);
107
+ setIsPointerPressed(false);
108
+ };
109
+
110
+ const handlePointerLeave = () => {
111
+ if (timerRef.current) {
112
+ clearTimeout(timerRef.current);
113
+ timerRef.current = null;
114
+ }
115
+ };
116
+
117
+ const headerBgStyles =
118
+ type === "header" &&
119
+ !locked &&
120
+ !["button"].includes(component) &&
121
+ "bg-brand-400 border-brand-200";
122
+ const lockedHeaderBgStyles =
123
+ locked &&
124
+ !["button"].includes(component) &&
125
+ "bg-neutral-400 border-neutral-300";
126
+
127
+ const headerTypeStyles =
128
+ type === "header" &&
129
+ component !== "button" &&
130
+ component !== "icon" &&
131
+ clsx("border-r");
132
+
133
+ const buttonComponentStyles =
134
+ component === "button" &&
135
+ clsx("border-r border-b border-border-primary-normal");
136
+
137
+ const iconComponentStyles = component === "icon" && clsx("border-l");
138
+
139
+ const cellClasses = clsx(
140
+ headerTypeStyles,
141
+ buttonComponentStyles,
142
+ headerBgStyles,
143
+ lockedHeaderBgStyles,
144
+ iconComponentStyles,
145
+ className,
146
+ "flex flex-1 items-center gap-1 whitespace-nowrap min-w-full max-h-10 relative text-text-primary-normal",
147
+ "focus-within:!z-10",
148
+ component === "input" && "border",
149
+ component === "input" &&
150
+ !error &&
151
+ !warning &&
152
+ "border-border-primary-normal",
153
+ component === "input" && error && "border-border-primary-error",
154
+ component === "input" && warning && "border-background-warning-normal",
155
+ !["button", "icon"].includes(component) && !noPadding && "p-2",
156
+ paddedLeft && "pl-2",
157
+ component === "icon" && "border-l",
158
+ isGrabbing && "!cursor-grabbing",
159
+ component === "checkbox" || (center && "justify-center"),
160
+ );
161
+
162
+ return (
163
+ <Element
164
+ className={clsx("flex", !width && "flex-1")}
165
+ style={{ width }}
166
+ {...props}
167
+ >
168
+ <div
169
+ className={cellClasses}
170
+ style={{
171
+ ...style,
172
+ }}
173
+ onMouseDown={handlePointerDown}
174
+ onMouseUp={handlePointerUp}
175
+ onMouseLeave={handlePointerLeave}
176
+ onTouchStart={handlePointerDown}
177
+ onTouchEnd={handlePointerUp}
178
+ onTouchCancel={handlePointerLeave}
179
+ onContextMenu={(e) => e.preventDefault()}
180
+ >
181
+ {children}
182
+ </div>
183
+ </Element>
184
+ );
185
+ },
186
+ );
187
+
188
+ DataGridCell.displayName = "DataGridCell";
189
+
190
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
191
+ export function DraggableCellHeader<T extends Record<string, any>>({
192
+ header,
193
+ children,
194
+ locked = false,
195
+ ...props
196
+ }: {
197
+ header: Header<T, unknown>;
198
+ children: React.ReactNode;
199
+ locked?: boolean;
200
+ width?: string;
201
+ } & DataGridCellProps &
202
+ ComponentProps<"th">) {
203
+ const { attributes, isDragging, listeners, setNodeRef, transform, node } =
204
+ useSortable({
205
+ id: header.column.id,
206
+ });
207
+
208
+ const [showMenu, setShowMenu] = useState(false);
209
+ const [filter, setFilter] = useState(
210
+ (header.column.getFilterValue() as string) ?? "",
211
+ );
212
+
213
+ const {
214
+ menuRootRef,
215
+ isMenuActive,
216
+ registerSubMenu,
217
+ listeners: subMenuListeners,
218
+ mobileHide
219
+ } = useSubMenuSystem(node);
220
+
221
+ useEffect(() => {
222
+ const handler = setTimeout(() => {
223
+ header.column.setFilterValue(filter);
224
+ }, 500);
225
+
226
+ return () => {
227
+ clearTimeout(handler);
228
+ };
229
+ }, [filter]);
230
+
231
+ const style: CSSProperties = {
232
+ opacity: isDragging ? 0.8 : 1,
233
+ position: "relative",
234
+ transform: CSS.Translate.toString(transform),
235
+ transition: "width transform 0.2s ease-in-out",
236
+ whiteSpace: "nowrap",
237
+ width: header.column.getSize(),
238
+ zIndex: isDragging ? 1 : 0,
239
+ "--color-text-primary-normal": "var(--color-neutral-000)",
240
+ };
241
+
242
+ return (
243
+ <DataGridCell
244
+ locked={locked}
245
+ type="header"
246
+ component="header"
247
+ ref={setNodeRef}
248
+ colSpan={header.colSpan}
249
+ style={style}
250
+ {...props}
251
+ onClick={header.column.getToggleSortingHandler()}
252
+ onRightClick={() => setShowMenu(!showMenu)}
253
+ {...(locked ? {} : attributes)}
254
+ {...(locked ? {} : listeners)}
255
+ >
256
+ {children}
257
+
258
+ {header.column.getCanFilter() && (
259
+ <Menu
260
+ ref={menuRootRef}
261
+ positionTo={node}
262
+ show={showMenu}
263
+ setShow={setShowMenu}
264
+ mobileHide={mobileHide}
265
+ >
266
+ <MenuOption
267
+ {...subMenuListeners}
268
+ subMenu={({ menuId, subMenuLevel, ...props }) => (
269
+ <Menu
270
+ {...props}
271
+ show={isMenuActive(menuId, subMenuLevel)}
272
+ ref={(el) => {
273
+ registerSubMenu(menuId, el);
274
+ }}
275
+ >
276
+ <div className={clsx(paddingUsingComponentGap)}>
277
+ <Search
278
+ onChange={(event) => {
279
+ setFilter(event.target.value);
280
+ }}
281
+ onKeyDown={(event) => {
282
+ if ([" ", "Space"].includes(event.key)) {
283
+ event.stopPropagation();
284
+ }
285
+ }}
286
+ value={(filter ?? "") as string}
287
+ />
288
+ </div>
289
+
290
+ <MenuOption
291
+ onClick={handleFilterFnChange}
292
+ before={menuOptionIcon("includesString")}
293
+ >
294
+ Contains
295
+ </MenuOption>
296
+
297
+ <MenuOption
298
+ onClick={handleFilterFnChange}
299
+ before={menuOptionIcon("startsWith")}
300
+ >
301
+ Starts with
302
+ </MenuOption>
303
+
304
+ <MenuOption
305
+ onClick={handleFilterFnChange}
306
+ before={menuOptionIcon("endsWith")}
307
+ >
308
+ Ends with
309
+ </MenuOption>
310
+ </Menu>
311
+ )}
312
+ >
313
+ Filter
314
+ </MenuOption>
315
+ </Menu>
316
+ )}
317
+ </DataGridCell>
318
+ );
319
+
320
+ function menuOptionIcon(value: string) {
321
+ return (
322
+ <Icon
323
+ name="check"
324
+ className={clsx(
325
+ header.column.columnDef.filterFn !== value && "text-transparent",
326
+ )}
327
+ />
328
+ );
329
+ }
330
+
331
+ function handleFilterFnChange<TData>(_id: string, value: string | undefined) {
332
+ let filterFn: FilterFnOption<TData> = "includesString";
333
+ const currentFilterFn = header.column.columnDef.filterFn as string;
334
+
335
+ if (value?.toLowerCase() === "starts with") {
336
+ filterFn = currentFilterFn === "startsWith" ? "auto" : "startsWith";
337
+ }
338
+
339
+ if (value?.toLowerCase() === "ends with") {
340
+ filterFn = currentFilterFn === "endsWith" ? "auto" : "endsWith";
341
+ }
342
+
343
+ if (value?.toLowerCase() === "contains") {
344
+ filterFn =
345
+ currentFilterFn === "includesString" ? "auto" : "includesString";
346
+ }
347
+
348
+ header.column.columnDef.filterFn = filterFn;
349
+ header.column.setFilterValue(header.column.getFilterValue() ?? "");
350
+ }
351
+ }
352
+
353
+ DraggableCellHeader.displayName = "DraggableCellHeader";
354
+
355
+ export function DragAlongCell<T extends RowData, TValue>({
356
+ cell,
357
+ children,
358
+ ...props
359
+ }: {
360
+ cell: Header<T, TValue> | Cell<T, TValue>;
361
+ children?: React.ReactNode;
362
+ } & DataGridCellProps) {
363
+ const { isDragging, setNodeRef, transform } = useSortable({
364
+ id: cell.column.id,
365
+ });
366
+
367
+ const style: CSSProperties = {
368
+ opacity: isDragging ? 0.8 : 1,
369
+ position: "relative",
370
+ transform: CSS.Translate.toString(transform),
371
+ transition: "width transform 0.2s ease-in-out",
372
+ zIndex: isDragging ? 1 : 0,
373
+ width: cell.column.getSize(),
374
+ minWidth: "min-content",
375
+ };
376
+
377
+ return (
378
+ <DataGridCell style={style} ref={setNodeRef} {...props}>
379
+ {children}
380
+ </DataGridCell>
381
+ );
382
+ }
383
+
384
+ DragAlongCell.displayName = "DragAlongCell";