pam-grid 1.0.5 → 1.0.7

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.
package/dist/index.mjs CHANGED
@@ -1,61 +1,8 @@
1
1
  // src/components/PamGrid.tsx
2
- import React2, { useEffect as useEffect5, useRef as useRef3, useState as useState6 } from "react";
3
-
4
- // src/components/PamHeaderOption.tsx
5
- import { useState as useState4, useRef, useEffect as useEffect3 } from "react";
6
- import { createPortal } from "react-dom";
7
-
8
- // src/core/useDropdownPosition.ts
9
- import { useState, useLayoutEffect } from "react";
10
- var useDropdownPosition = (triggerRef, menuRef, isOpen, level = 0) => {
11
- const [style, setStyle] = useState({
12
- position: "fixed",
13
- visibility: "hidden"
14
- });
15
- useLayoutEffect(() => {
16
- if (!isOpen || !triggerRef.current || !menuRef.current) return;
17
- const updatePosition = () => {
18
- if (!triggerRef.current || !menuRef.current) return null;
19
- const btn = triggerRef.current.getBoundingClientRect();
20
- const menu = menuRef.current;
21
- const menuHeight = menu.offsetHeight;
22
- const menuWidth = menu.offsetWidth;
23
- const vh = window.innerHeight;
24
- const vw = window.innerWidth;
25
- const spaceBelow = vh - btn.bottom;
26
- const spaceAbove = btn.top;
27
- const openUp = menuHeight > spaceBelow && spaceAbove > spaceBelow;
28
- let top = openUp ? btn.top - menuHeight : btn.bottom;
29
- if (top < 8) top = 8;
30
- if (top + menuHeight > vh - 8) top = vh - menuHeight - 8;
31
- let left = btn.left;
32
- if (level === 0) {
33
- if (left + menuWidth > vw - 8) left = vw - menuWidth - 8;
34
- } else {
35
- left = btn.right;
36
- if (left + menuWidth > vw - 8) {
37
- left = btn.left - menuWidth;
38
- }
39
- }
40
- setStyle({
41
- position: "fixed",
42
- top,
43
- left,
44
- zIndex: 99999,
45
- maxHeight: vh - 16,
46
- overflowY: "auto"
47
- });
48
- };
49
- requestAnimationFrame(updatePosition);
50
- setTimeout(updatePosition, 50);
51
- window.addEventListener("resize", updatePosition);
52
- return () => window.removeEventListener("resize", updatePosition);
53
- }, [isOpen, level]);
54
- return style;
55
- };
2
+ import React2, { useEffect as useEffect4, useRef as useRef2, useState as useState4 } from "react";
56
3
 
57
4
  // src/components/AdvanceFilter.tsx
58
- import { useState as useState2, useEffect } from "react";
5
+ import { useState, useEffect } from "react";
59
6
  import { jsx, jsxs } from "react/jsx-runtime";
60
7
  var OPERATORS = {
61
8
  number: [
@@ -85,9 +32,9 @@ function AdvanceFilter({
85
32
  onApply,
86
33
  onClear
87
34
  }) {
88
- const [operation, setOperation] = useState2("");
89
- const [v1, setV1] = useState2("");
90
- const [v2, setV2] = useState2("");
35
+ const [operation, setOperation] = useState("");
36
+ const [v1, setV1] = useState("");
37
+ const [v2, setV2] = useState("");
91
38
  useEffect(() => {
92
39
  if (!value) {
93
40
  setOperation("");
@@ -163,7 +110,7 @@ function AdvanceFilter({
163
110
  }
164
111
 
165
112
  // src/core/utils.ts
166
- import { useEffect as useEffect2, useState as useState3 } from "react";
113
+ import { useEffect as useEffect2, useState as useState2 } from "react";
167
114
  function getAdvancedFilterType(column) {
168
115
  const f = column.enableAdvancedFilter;
169
116
  if (!f) return null;
@@ -202,7 +149,7 @@ function useLocalStorageState(key, initialValue) {
202
149
  return initialValue;
203
150
  }
204
151
  };
205
- const [value, setValue] = useState3(getValue);
152
+ const [value, setValue] = useState2(getValue);
206
153
  const updateValue = (newValue) => {
207
154
  setValue(newValue);
208
155
  localStorage.setItem(key, JSON.stringify(newValue));
@@ -233,195 +180,86 @@ function useLocalStorageState(key, initialValue) {
233
180
  }
234
181
 
235
182
  // src/components/PamHeaderOption.tsx
236
- import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
237
- var PmsHeaderOption = ({
238
- column,
239
- pinned,
240
- onPinLeft,
241
- onPinRight,
242
- onUnpin,
243
- // from useGridCore
244
- advanceFilters,
245
- setColumnAdvanceFilter
183
+ import { Fragment, jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
184
+ var PamHeaderOptions = ({
185
+ currentColumn,
186
+ gridFetaures,
187
+ grid
246
188
  }) => {
247
- const { key: columnKey, enableAdvancedFilter } = column;
248
- const rootRef = useRef(null);
249
- const btnRef = useRef(null);
250
- const menuRef = useRef(null);
251
- const filterBtnRef = useRef(null);
252
- const filterMenuRef = useRef(null);
253
- const pinBtnRef = useRef(null);
254
- const pinMenuRef = useRef(null);
255
- const [open, setOpen] = useState4(false);
256
- const [openMenu, setOpenMenu] = useState4(null);
257
- const mainStyle = useDropdownPosition(btnRef, menuRef, open, 0);
258
- const filterStyle = useDropdownPosition(
259
- filterBtnRef,
260
- filterMenuRef,
261
- openMenu === "filter",
262
- 1
263
- );
264
- const pinStyle = useDropdownPosition(
265
- pinBtnRef,
266
- pinMenuRef,
267
- openMenu === "pin",
268
- 1
269
- );
270
- const toggleMenu = (name, e) => {
271
- e.stopPropagation();
272
- setOpenMenu((prev) => prev === name ? null : name);
189
+ const items = [];
190
+ const { advanceFilters, setColumnAdvanceFilter, colState, updateColumn } = grid;
191
+ const { key: columnKey } = currentColumn;
192
+ const pinColumn = (key, side) => {
193
+ const col = colState.find((c) => c.key === key);
194
+ if (!col) return;
195
+ const newPinned = col.pinned === side ? null : side;
196
+ updateColumn(key, { pinned: newPinned });
273
197
  };
274
- useEffect3(() => {
275
- if (!open) return;
276
- const handleClickOutside = (e) => {
277
- const target = e.target;
278
- if (rootRef.current?.contains(target) || menuRef.current?.contains(target) || filterMenuRef.current?.contains(target) || pinMenuRef.current?.contains(target)) {
279
- return;
280
- }
281
- setOpen(false);
282
- setOpenMenu(null);
283
- };
284
- document.addEventListener("mousedown", handleClickOutside);
285
- return () => document.removeEventListener("mousedown", handleClickOutside);
286
- }, [open, openMenu]);
287
- return /* @__PURE__ */ jsxs2("div", { ref: rootRef, style: { position: "relative" }, children: [
288
- /* @__PURE__ */ jsxs2(
289
- "span",
290
- {
291
- ref: btnRef,
292
- className: "cursor-pointer",
293
- onClick: (e) => {
294
- e.stopPropagation();
295
- setOpen((p) => !p);
198
+ const unpinColumn = (key) => {
199
+ updateColumn(key, { pinned: null });
200
+ };
201
+ if (gridFetaures.pinning) {
202
+ items.push({
203
+ key: `pined-col-${String(currentColumn.key)}`,
204
+ label: "Pinned",
205
+ icon: "bx bx-pin",
206
+ keepOpenOnClick: true,
207
+ children: [
208
+ {
209
+ key: `pined-col-${String(currentColumn.key)}-noPinned`,
210
+ label: "No Pinned",
211
+ icon: !currentColumn.pinned ? "bx bx-check text-primary" : "",
212
+ onClick: () => unpinColumn(currentColumn.key)
296
213
  },
297
- children: [
298
- /* @__PURE__ */ jsx2("i", { className: "bx bx-dots-vertical-rounded bx-sm" }),
299
- advanceFilters[String(columnKey)] && /* @__PURE__ */ jsx2("span", { className: "badge rounded-pill bg-info badge-dot badge-notifications" })
300
- ]
301
- }
302
- ),
303
- open && createPortal(
304
- /* @__PURE__ */ jsxs2(
305
- "ul",
306
214
  {
307
- ref: menuRef,
308
- className: "dropdown-menu shadow rounded-3 py-2 show",
309
- style: {
310
- ...mainStyle,
311
- position: "fixed",
312
- zIndex: 1e4
313
- },
314
- children: [
315
- enableAdvancedFilter && /* @__PURE__ */ jsxs2("li", { className: "dropdown-submenu dropstart", children: [
316
- /* @__PURE__ */ jsxs2(
317
- "button",
318
- {
319
- ref: filterBtnRef,
320
- className: "dropdown-item d-flex justify-content-between",
321
- onClick: (e) => toggleMenu("filter", e),
322
- children: [
323
- /* @__PURE__ */ jsxs2("span", { children: [
324
- /* @__PURE__ */ jsx2("i", { className: "bx bx-filter-alt me-2" }),
325
- " Filter"
326
- ] }),
327
- /* @__PURE__ */ jsx2("i", { className: "bx bx-chevron-right" })
328
- ]
329
- }
330
- ),
331
- openMenu === "filter" && /* @__PURE__ */ jsx2(
332
- "ul",
333
- {
334
- ref: filterMenuRef,
335
- className: "dropdown-menu shadow rounded-3 p-2 show",
336
- style: {
337
- ...filterStyle,
338
- position: "fixed",
339
- zIndex: 10001
340
- },
341
- children: /* @__PURE__ */ jsx2(
342
- AdvanceFilter,
343
- {
344
- type: getAdvancedFilterType(column),
345
- value: advanceFilters[String(columnKey)],
346
- onApply: (f) => setColumnAdvanceFilter(String(columnKey), f),
347
- onClear: () => setColumnAdvanceFilter(String(columnKey), null)
348
- }
349
- )
350
- }
351
- )
352
- ] }),
353
- /* @__PURE__ */ jsxs2("li", { className: "dropdown-submenu dropstart", children: [
354
- /* @__PURE__ */ jsxs2(
355
- "button",
356
- {
357
- ref: pinBtnRef,
358
- className: "dropdown-item d-flex justify-content-between",
359
- onClick: (e) => toggleMenu("pin", e),
360
- children: [
361
- /* @__PURE__ */ jsxs2("span", { children: [
362
- /* @__PURE__ */ jsx2("i", { className: "bx bx-pin me-2" }),
363
- " Pin Column"
364
- ] }),
365
- /* @__PURE__ */ jsx2("i", { className: "bx bx-chevron-right" })
366
- ]
367
- }
368
- ),
369
- openMenu === "pin" && /* @__PURE__ */ jsxs2(
370
- "ul",
371
- {
372
- ref: pinMenuRef,
373
- className: "dropdown-menu shadow rounded-3 py-2 show",
374
- style: {
375
- ...pinStyle,
376
- position: "fixed",
377
- zIndex: 10001
378
- },
379
- children: [
380
- /* @__PURE__ */ jsxs2(
381
- "div",
382
- {
383
- className: "dropdown-item d-flex gap-2 cursor-pointer",
384
- onClick: onUnpin,
385
- children: [
386
- !pinned && /* @__PURE__ */ jsx2("i", { className: "bx bx-check text-primary" }),
387
- /* @__PURE__ */ jsx2("span", { children: "No Pin" })
388
- ]
389
- }
390
- ),
391
- /* @__PURE__ */ jsxs2(
392
- "div",
393
- {
394
- className: "dropdown-item d-flex gap-2 cursor-pointer",
395
- onClick: onPinLeft,
396
- children: [
397
- pinned === "left" && /* @__PURE__ */ jsx2("i", { className: "bx bx-check text-primary" }),
398
- /* @__PURE__ */ jsx2("span", { children: "Pin Left" })
399
- ]
400
- }
401
- ),
402
- /* @__PURE__ */ jsxs2(
403
- "div",
404
- {
405
- className: "dropdown-item d-flex gap-2 cursor-pointer",
406
- onClick: onPinRight,
407
- children: [
408
- pinned === "right" && /* @__PURE__ */ jsx2("i", { className: "bx bx-check text-primary" }),
409
- /* @__PURE__ */ jsx2("span", { children: "Pin Right" })
410
- ]
411
- }
412
- )
413
- ]
414
- }
415
- )
416
- ] })
417
- ]
215
+ key: `pined-col-${String(currentColumn.key)}-leftPinned`,
216
+ label: "Left Pinned",
217
+ icon: currentColumn.pinned === "left" ? "bx bx-check text-primary" : "",
218
+ onClick: () => pinColumn(currentColumn.key, "left")
219
+ },
220
+ {
221
+ key: `pined-col-${String(currentColumn.key)}-rightPinned`,
222
+ label: "Right Pinned",
223
+ icon: currentColumn.pinned === "right" ? "bx bx-check text-primary" : "",
224
+ onClick: () => pinColumn(currentColumn.key, "right")
418
225
  }
419
- ),
420
- document.body
421
- )
422
- ] });
226
+ ]
227
+ });
228
+ }
229
+ if (currentColumn.enableAdvancedFilter) {
230
+ items.push({
231
+ key: `advance-filter-${String(currentColumn.key)}`,
232
+ label: "Filte By Column",
233
+ icon: "bx bx-sm bx-filter",
234
+ children: [
235
+ {
236
+ key: `advance-filter-${String(currentColumn.key)}-apply`,
237
+ keepOpenOnClick: true,
238
+ label: /* @__PURE__ */ jsx2(
239
+ AdvanceFilter,
240
+ {
241
+ type: getAdvancedFilterType(currentColumn),
242
+ value: advanceFilters[String(columnKey)],
243
+ onApply: (f) => setColumnAdvanceFilter(String(columnKey), f),
244
+ onClear: () => setColumnAdvanceFilter(String(columnKey), null)
245
+ }
246
+ )
247
+ }
248
+ ]
249
+ });
250
+ }
251
+ return /* @__PURE__ */ jsx2(
252
+ PamDropdown,
253
+ {
254
+ trigger: /* @__PURE__ */ jsxs2(Fragment, { children: [
255
+ /* @__PURE__ */ jsx2("i", { className: "bx bx-sm bx-dots-vertical-rounded cursor-pointer" }),
256
+ advanceFilters[String(columnKey)] && /* @__PURE__ */ jsx2("span", { className: "badge rounded-pill bg-info badge-dot badge-notifications" })
257
+ ] }),
258
+ items
259
+ }
260
+ );
423
261
  };
424
- var PamHeaderOption_default = PmsHeaderOption;
262
+ var PamHeaderOption_default = PamHeaderOptions;
425
263
 
426
264
  // src/components/FilterApplied.tsx
427
265
  import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
@@ -429,8 +267,10 @@ var FilterApplied = ({
429
267
  groupBy,
430
268
  removeGroupby,
431
269
  advance,
432
- removeFilter
270
+ removeFilter,
271
+ grid
433
272
  }) => {
273
+ const { switchFiltersConfig, switchQuery, toggleSwitchFilter } = grid;
434
274
  const OPERATION = [
435
275
  { key: "eq", label: " == " },
436
276
  { key: "neq", label: " \u2260 " },
@@ -463,7 +303,7 @@ var FilterApplied = ({
463
303
  return /* @__PURE__ */ jsxs3("div", { className: "d-flex flex-row gap-1 py-1 px-3 ", children: [
464
304
  groupBy && /* @__PURE__ */ jsxs3("span", { className: "badge bg-label-primary text-capitalize", children: [
465
305
  "GroupBy : ",
466
- groupBy,
306
+ groupBy.label,
467
307
  " ",
468
308
  /* @__PURE__ */ jsx3(
469
309
  "i",
@@ -489,7 +329,31 @@ var FilterApplied = ({
489
329
  ]
490
330
  },
491
331
  item.column
492
- ))
332
+ )),
333
+ switchFiltersConfig !== void 0 && switchFiltersConfig?.length > 0 && switchFiltersConfig.map((swicth) => {
334
+ return Object.entries(switchQuery).map(([key, value]) => {
335
+ if (swicth.queryParam === key && swicth.defaultValue !== value) {
336
+ return /* @__PURE__ */ jsxs3(
337
+ "span",
338
+ {
339
+ className: "badge bg-label-warning text-capitalize",
340
+ children: [
341
+ swicth.label,
342
+ /* @__PURE__ */ jsx3(
343
+ "i",
344
+ {
345
+ className: "bx bx-x bx-xs cursor-pointer",
346
+ onClick: () => toggleSwitchFilter?.(swicth.key)
347
+ }
348
+ )
349
+ ]
350
+ },
351
+ key
352
+ );
353
+ }
354
+ return null;
355
+ });
356
+ })
493
357
  ] });
494
358
  };
495
359
  var FilterApplied_default = FilterApplied;
@@ -553,7 +417,7 @@ var Compress = ({ onClick }) => {
553
417
  var Compress_default = Compress;
554
418
 
555
419
  // src/assets/icons/Box.svg
556
- var Box_default = "./Box-QGC2UZ43.svg";
420
+ var Box_default = 'data:image/svg+xml,<svg width="250" height="200" viewBox="0 0 250 200" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">%0D%0A<rect width="250" height="200" fill="url(%23pattern0_249_513)"/>%0D%0A<defs>%0D%0A<pattern id="pattern0_249_513" patternContentUnits="objectBoundingBox" width="1" height="1">%0D%0A<use xlink:href="%23image0_249_513" transform="scale(0.004 0.005)"/>%0D%0A</pattern>%0D%0A<image id="image0_249_513" width="250" height="200" preserveAspectRatio="none" xlink:href="data:image/png;base64,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"/>%0D%0A</defs>%0D%0A</svg>%0D%0A';
557
421
 
558
422
  // src/components/EmptyState.tsx
559
423
  import { jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
@@ -571,7 +435,7 @@ var EmptyState = ({
571
435
  var EmptyState_default = EmptyState;
572
436
 
573
437
  // src/assets/icons/NoSearchResult.svg
574
- var NoSearchResult_default = "./NoSearchResult-R4W2UYSR.svg";
438
+ var NoSearchResult_default = 'data:image/svg+xml,<svg width="250" height="200" viewBox="0 0 250 200" fill="none" xmlns="http://www.w3.org/2000/svg">%0D%0A<rect width="250" height="200" fill="white"/>%0D%0A<path fill-rule="evenodd" clip-rule="evenodd" d="M207 65C210.866 65 214 68.134 214 72C214 75.866 210.866 79 207 79H167C170.866 79 174 82.134 174 86C174 89.866 170.866 93 167 93H189C192.866 93 196 96.134 196 100C196 103.866 192.866 107 189 107H178.826C173.952 107 170 110.134 170 114C170 116.577 172 118.911 176 121C179.866 121 183 124.134 183 128C183 131.866 179.866 135 176 135H93C89.134 135 86 131.866 86 128C86 124.134 89.134 121 93 121H54C50.134 121 47 117.866 47 114C47 110.134 50.134 107 54 107H94C97.866 107 101 103.866 101 100C101 96.134 97.866 93 94 93H69C65.134 93 62 89.866 62 86C62 82.134 65.134 79 69 79H109C105.134 79 102 75.866 102 72C102 68.134 105.134 65 109 65H207ZM207 93C210.866 93 214 96.134 214 100C214 103.866 210.866 107 207 107C203.134 107 200 103.866 200 100C200 96.134 203.134 93 207 93Z" fill="%23F3F7FF"/>%0D%0A<path d="M120.5 133C139.002 133 154 118.002 154 99.5C154 80.9985 139.002 66 120.5 66C101.998 66 87 80.9985 87 99.5C87 118.002 101.998 133 120.5 133Z" fill="%23F3F7FF" stroke="%231F64E7" stroke-width="2.5"/>%0D%0A<path fill-rule="evenodd" clip-rule="evenodd" d="M115.132 125.494C116.891 125.819 118.68 125.987 120.5 126C135.136 126 147 114.136 147 99.5C147 84.8645 135.136 73 120.5 73C116.74 73 113.164 73.7829 109.924 75.1946C104.294 77.6479 99.6816 81.9999 96.896 87.4419C95.0445 91.0589 94 95.1575 94 99.5C94 103.44 94.8599 107.179 96.4021 110.54C97.5032 112.94 98.9521 115.146 100.684 117.096" fill="white"/>%0D%0A<path d="M115.132 125.494C116.891 125.819 118.68 125.987 120.5 126C135.136 126 147 114.136 147 99.5C147 84.8645 135.136 73 120.5 73C116.74 73 113.164 73.7829 109.924 75.1946C104.294 77.6479 99.6816 81.9999 96.896 87.4419C95.0445 91.0589 94 95.1575 94 99.5C94 103.44 94.8599 107.179 96.4021 110.54C97.5032 112.94 98.9521 115.146 100.684 117.096" stroke="%231F64E7" stroke-width="2.5" stroke-linecap="round"/>%0D%0A<path d="M103.797 120.075C105.945 121.821 108.372 123.237 111.001 124.247" stroke="%231F64E7" stroke-width="2.5" stroke-linecap="round"/>%0D%0A<path d="M148 126L154 132" stroke="%231F64E7" stroke-width="2.5"/>%0D%0A<path fill-rule="evenodd" clip-rule="evenodd" d="M153.03 131.03C151.138 132.923 151.138 135.992 153.03 137.884L164.116 148.97C166.008 150.862 169.077 150.862 170.97 148.97C172.863 147.077 172.863 144.008 170.97 142.116L159.885 131.03C157.992 129.138 154.923 129.138 153.03 131.03Z" fill="%23E8F0FE" stroke="%231F64E7" stroke-width="2.5"/>%0D%0A<path d="M158 133L169 144" stroke="white" stroke-width="2.5" stroke-linecap="round"/>%0D%0A<path fill-rule="evenodd" clip-rule="evenodd" d="M114 88C114 99.598 123.402 109 135 109C137.278 109 139.472 108.637 141.526 107.966C138.173 116.287 130.023 122.161 120.5 122.161C107.985 122.161 97.8394 112.015 97.8394 99.5C97.8394 88.1596 106.17 78.7648 117.045 77.1011C115.113 80.2793 114 84.0097 114 88Z" fill="%23E8F0FE"/>%0D%0A<path d="M121 81C119.727 81 118.482 81.1253 117.279 81.3642M113.645 82.4761C106.804 85.3508 102 92.1144 102 100" stroke="%2375A4FE" stroke-width="2.5" stroke-linecap="round"/>%0D%0A<path d="M174.176 99.7773H166M180.5 92H163.324H180.5ZM187.5 92H185.279H187.5Z" stroke="%2375A4FE" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>%0D%0A<path d="M84.1758 121.777H76M79.5 113H62.3242H79.5ZM56.5 113H52.2788H56.5Z" stroke="%2375A4FE" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>%0D%0A</svg>%0D%0A';
575
439
 
576
440
  // src/components/icons/ArrowFromBottonToRight.tsx
577
441
  import { jsx as jsx7 } from "react/jsx-runtime";
@@ -749,14 +613,14 @@ var Paginantion_default = Pagination;
749
613
 
750
614
  // src/components/dropdown/PamDropdown.tsx
751
615
  import {
752
- useEffect as useEffect4,
753
- useLayoutEffect as useLayoutEffect2,
616
+ useEffect as useEffect3,
617
+ useLayoutEffect,
754
618
  useMemo,
755
- useRef as useRef2,
756
- useState as useState5
619
+ useRef,
620
+ useState as useState3
757
621
  } from "react";
758
- import { createPortal as createPortal2 } from "react-dom";
759
- import { Fragment, jsx as jsx10, jsxs as jsxs7 } from "react/jsx-runtime";
622
+ import { createPortal } from "react-dom";
623
+ import { Fragment as Fragment2, jsx as jsx10, jsxs as jsxs7 } from "react/jsx-runtime";
760
624
  function PamDropdown({
761
625
  trigger,
762
626
  items,
@@ -766,11 +630,11 @@ function PamDropdown({
766
630
  closeOnItemClick = true,
767
631
  className = ""
768
632
  }) {
769
- const triggerRef = useRef2(null);
770
- const menuRef = useRef2(null);
771
- const [open, setOpen] = useState5(false);
772
- const [pos, setPos] = useState5({ top: 0, left: 0 });
773
- const [openSubKeys, setOpenSubKeys] = useState5({});
633
+ const triggerRef = useRef(null);
634
+ const menuRef = useRef(null);
635
+ const [open, setOpen] = useState3(false);
636
+ const [pos, setPos] = useState3({ top: 0, left: 0 });
637
+ const [openSubKeys, setOpenSubKeys] = useState3({});
774
638
  const portalRoot = useMemo(() => {
775
639
  const el = document.getElementById("pam-portal-root");
776
640
  if (el) return el;
@@ -823,11 +687,11 @@ function PamDropdown({
823
687
  if (!t || !m) return;
824
688
  setPos(getDropdownPosition(t, m));
825
689
  }
826
- useLayoutEffect2(() => {
690
+ useLayoutEffect(() => {
827
691
  if (!open) return;
828
692
  updatePosition();
829
693
  }, [open, placement]);
830
- useEffect4(() => {
694
+ useEffect3(() => {
831
695
  if (!open) return;
832
696
  const onDown = (e) => {
833
697
  const t = triggerRef.current;
@@ -848,7 +712,7 @@ function PamDropdown({
848
712
  document.removeEventListener("keydown", onKey);
849
713
  };
850
714
  }, [open]);
851
- useEffect4(() => {
715
+ useEffect3(() => {
852
716
  if (!open) return;
853
717
  const handler = () => updatePosition();
854
718
  window.addEventListener("scroll", handler, true);
@@ -858,9 +722,9 @@ function PamDropdown({
858
722
  window.removeEventListener("resize", handler);
859
723
  };
860
724
  }, [open]);
861
- return /* @__PURE__ */ jsxs7(Fragment, { children: [
725
+ return /* @__PURE__ */ jsxs7(Fragment2, { children: [
862
726
  /* @__PURE__ */ jsx10("span", { ref: triggerRef, className: `pam-dropdown-trigger ${className}`, children: /* @__PURE__ */ jsx10("span", { onClick: toggle, style: { display: "inline-flex" }, children: trigger }) }),
863
- open && createPortal2(
727
+ open && createPortal(
864
728
  /* @__PURE__ */ jsx10(
865
729
  "div",
866
730
  {
@@ -918,12 +782,12 @@ function PamDropdownNode({
918
782
  level,
919
783
  index
920
784
  }) {
921
- const liRef = useRef2(null);
922
- const submenuRef = useRef2(null);
785
+ const liRef = useRef(null);
786
+ const submenuRef = useRef(null);
923
787
  const hasChildren = !!item.children?.length;
924
788
  const nodeKey = item.key ?? `${level}-${index}`;
925
789
  const submenuOpen = !!openSubKeys[nodeKey];
926
- useLayoutEffect2(() => {
790
+ useLayoutEffect(() => {
927
791
  if (!submenuOpen) return;
928
792
  const li = liRef.current;
929
793
  const menu = submenuRef.current;
@@ -1010,23 +874,29 @@ function PamDropdownNode({
1010
874
  ].join(" "),
1011
875
  onClick: handleClick,
1012
876
  children: [
1013
- /* @__PURE__ */ jsxs7("div", { className: "pam-dropdown-item-inner", children: [
1014
- /* @__PURE__ */ jsxs7("div", { className: "pam-left", children: [
1015
- item.icon && /* @__PURE__ */ jsx10("i", { className: `${item.icon} pam-icon` }),
1016
- /* @__PURE__ */ jsx10("span", { className: "pam-label", children: item.label })
1017
- ] }),
1018
- /* @__PURE__ */ jsxs7("div", { className: "pam-right", children: [
1019
- item.rightSlot && /* @__PURE__ */ jsx10(
1020
- "span",
1021
- {
1022
- className: "pam-rightslot",
1023
- onClick: (e) => e.stopPropagation(),
1024
- children: item.rightSlot
1025
- }
1026
- ),
1027
- hasChildren && /* @__PURE__ */ jsx10("i", { className: "bx bx-chevron-right pam-arrow" })
1028
- ] })
1029
- ] }),
877
+ /* @__PURE__ */ jsxs7(
878
+ "div",
879
+ {
880
+ className: `${item.rightSlot ? "pam-dropdown-item-inner-rightSlot" : "pam-dropdown-item-inner"} `,
881
+ children: [
882
+ /* @__PURE__ */ jsxs7("div", { className: "pam-left", children: [
883
+ item.icon && /* @__PURE__ */ jsx10("i", { className: `${item.icon} pam-icon` }),
884
+ /* @__PURE__ */ jsx10("span", { className: "pam-label", children: item.label })
885
+ ] }),
886
+ /* @__PURE__ */ jsxs7("div", { className: "pam-right", children: [
887
+ item.rightSlot && /* @__PURE__ */ jsx10(
888
+ "span",
889
+ {
890
+ className: "pam-rightslot",
891
+ onClick: (e) => e.stopPropagation(),
892
+ children: item.rightSlot
893
+ }
894
+ ),
895
+ hasChildren && /* @__PURE__ */ jsx10("i", { className: "bx bx-chevron-right pam-arrow" })
896
+ ] })
897
+ ]
898
+ }
899
+ ),
1030
900
  hasChildren && submenuOpen && /* @__PURE__ */ jsx10("div", { ref: submenuRef, className: "pam-submenu", children: /* @__PURE__ */ jsx10(
1031
901
  PamDropdownList,
1032
902
  {
@@ -1044,12 +914,20 @@ function PamDropdownNode({
1044
914
  }
1045
915
 
1046
916
  // src/components/MainFilter.tsx
1047
- import { Fragment as Fragment2, jsx as jsx11, jsxs as jsxs8 } from "react/jsx-runtime";
917
+ import { Fragment as Fragment3, jsx as jsx11, jsxs as jsxs8 } from "react/jsx-runtime";
1048
918
  var MainFilter = ({
1049
919
  gridFetaures,
1050
920
  grid
1051
921
  }) => {
1052
- const { setGroupBy, visibleColumns, colState, updateColumn } = grid;
922
+ const {
923
+ setGroupBy,
924
+ visibleColumns,
925
+ colState,
926
+ updateColumn,
927
+ switchFiltersConfig,
928
+ switchFilters,
929
+ toggleSwitchFilter
930
+ } = grid;
1053
931
  const [isBulkData, setBulkData] = useLocalStorageState(
1054
932
  "bulk-data-toggle",
1055
933
  false
@@ -1085,15 +963,15 @@ var MainFilter = ({
1085
963
  children: visibleColumns.length > 0 ? visibleColumns.filter((c) => c.groupable).map((c) => ({
1086
964
  key: `group-${String(c.key)}`,
1087
965
  label: c.title,
1088
- onClick: () => setGroupBy(String(c.key))
966
+ onClick: () => setGroupBy({ key: String(c.key), label: c.title })
1089
967
  })) : []
1090
968
  });
1091
969
  }
1092
- if (gridFetaures?.bulkAction && gridFetaures.bulkAction.length > 0) {
970
+ if (gridFetaures?.bulkActionsConfig && gridFetaures.bulkActionsConfig.length > 0) {
1093
971
  items.push({
1094
972
  key: "bulk-data",
1095
973
  keepOpenOnClick: true,
1096
- label: /* @__PURE__ */ jsxs8(Fragment2, { children: [
974
+ label: /* @__PURE__ */ jsxs8(Fragment3, { children: [
1097
975
  /* @__PURE__ */ jsxs8(
1098
976
  "label",
1099
977
  {
@@ -1120,12 +998,43 @@ var MainFilter = ({
1120
998
  ] })
1121
999
  });
1122
1000
  }
1001
+ if (switchFiltersConfig !== void 0 && switchFiltersConfig?.length > 0) {
1002
+ switchFiltersConfig.forEach((filter) => {
1003
+ items.push({
1004
+ key: `switch-${filter.key}`,
1005
+ keepOpenOnClick: true,
1006
+ label: filter.label,
1007
+ rightSlot: /* @__PURE__ */ jsxs8(
1008
+ "label",
1009
+ {
1010
+ className: "switch switch-square switch-sm",
1011
+ onClick: (e) => e.stopPropagation(),
1012
+ children: [
1013
+ /* @__PURE__ */ jsx11(
1014
+ "input",
1015
+ {
1016
+ type: "checkbox",
1017
+ className: "switch-input",
1018
+ checked: !!switchFilters?.[filter.key],
1019
+ onChange: () => toggleSwitchFilter(filter.key)
1020
+ }
1021
+ ),
1022
+ /* @__PURE__ */ jsxs8("span", { className: "switch-toggle-slider", children: [
1023
+ /* @__PURE__ */ jsx11("span", { className: "switch-on", children: /* @__PURE__ */ jsx11("i", { className: "icon-base bx bx-check" }) }),
1024
+ /* @__PURE__ */ jsx11("span", { className: "switch-off", children: /* @__PURE__ */ jsx11("i", { className: "icon-base bx bx-x" }) })
1025
+ ] })
1026
+ ]
1027
+ }
1028
+ )
1029
+ });
1030
+ });
1031
+ }
1123
1032
  return /* @__PURE__ */ jsx11(
1124
1033
  PamDropdown,
1125
1034
  {
1126
1035
  trigger: /* @__PURE__ */ jsxs8("button", { type: "button", className: "btn btn-sm btn-label-secondary me-2", children: [
1127
- /* @__PURE__ */ jsx11("span", { className: "icon-base bx bx-filter-alt me-1" }),
1128
- "Filter"
1036
+ /* @__PURE__ */ jsx11("span", { className: "icon-base bx bx-filter-alt" }),
1037
+ /* @__PURE__ */ jsx11("span", { className: "d-none d-sm-inline ms-1", children: "Filter" })
1129
1038
  ] }),
1130
1039
  items
1131
1040
  }
@@ -1136,7 +1045,18 @@ var TableAction = ({
1136
1045
  gridFetaures,
1137
1046
  row
1138
1047
  }) => {
1139
- const items = Array.isArray(gridFetaures.actions) ? gridFetaures.actions.filter((act) => act.isVisible).map((a, i) => ({
1048
+ const items = Array.isArray(gridFetaures.actions) ? gridFetaures.actions.filter((act) => {
1049
+ if (typeof act.isVisible === "function") {
1050
+ if (row) {
1051
+ return act.isVisible(row);
1052
+ }
1053
+ return false;
1054
+ }
1055
+ if (typeof act.isVisible === "boolean") {
1056
+ return act.isVisible;
1057
+ }
1058
+ return true;
1059
+ }).map((a, i) => ({
1140
1060
  key: `action-${String(a.label)}-${i}`,
1141
1061
  label: a.label,
1142
1062
  icon: a.icon,
@@ -1175,14 +1095,15 @@ var PamGrid = ({
1175
1095
  addNew,
1176
1096
  renderExpanded
1177
1097
  }) => {
1178
- const [isFullScreen, setFullScreen] = useState6(false);
1179
- const [activeCell, setActiveCell] = useState6(null);
1098
+ const [isFullScreen, setFullScreen] = useState4(false);
1099
+ const [draggingCol, setDraggingCol] = useState4(null);
1100
+ const [activeCell, setActiveCell] = useState4(null);
1180
1101
  const [isBulkAction, setBulkAction] = useLocalStorageState(
1181
1102
  "bulk-data-toggle",
1182
1103
  false
1183
1104
  );
1184
- const wrapperRef = useRef3(null);
1185
- const dragState = useRef3({ from: null });
1105
+ const wrapperRef = useRef2(null);
1106
+ const dragState = useRef2({ from: null });
1186
1107
  const {
1187
1108
  rows,
1188
1109
  page,
@@ -1208,20 +1129,10 @@ var PamGrid = ({
1208
1129
  toggleExpand,
1209
1130
  setColState,
1210
1131
  emptyState,
1211
- // onAdvanceFilters,
1212
- // setAdanceFilter,
1132
+ addNewRecord,
1213
1133
  advanceFilters,
1214
1134
  setColumnAdvanceFilter
1215
1135
  } = grid;
1216
- const pinColumn = (key, side) => {
1217
- const col = colState.find((c) => c.key === key);
1218
- if (!col) return;
1219
- const newPinned = col.pinned === side ? null : side;
1220
- updateColumn(key, { pinned: newPinned });
1221
- };
1222
- const unpinColumn = (key) => {
1223
- updateColumn(key, { pinned: null });
1224
- };
1225
1136
  const onResizeMouseDown = (e, key) => {
1226
1137
  e.preventDefault();
1227
1138
  const startX = e.clientX;
@@ -1264,10 +1175,10 @@ var PamGrid = ({
1264
1175
  };
1265
1176
  const groupedRows = React2.useMemo(() => {
1266
1177
  if (!groupBy) return null;
1267
- const column = visibleColumns.find((col) => col.key === groupBy);
1178
+ const column = visibleColumns.find((col) => col.key === groupBy.key);
1268
1179
  const map = {};
1269
1180
  rows.forEach((r) => {
1270
- const rawValue = column?.groupByValue ? column.groupByValue(r) : column?.nestedPath ? getNestedValue(r, column.nestedPath) : r[groupBy];
1181
+ const rawValue = column?.groupByValue ? column.groupByValue(r) : column?.nestedPath ? getNestedValue(r, column.nestedPath) : r[groupBy.key];
1271
1182
  const groupKey = rawValue === null || rawValue === void 0 ? "unknown" : typeof rawValue === "object" ? String(rawValue?.id ?? JSON.stringify(rawValue)) : String(rawValue);
1272
1183
  if (!map[groupKey]) {
1273
1184
  map[groupKey] = { rawValue, items: [] };
@@ -1295,7 +1206,7 @@ var PamGrid = ({
1295
1206
  }, [rows, groupBy, visibleColumns]);
1296
1207
  const currentRows = rows;
1297
1208
  const gridHeight = isFullScreen ? "calc(100vh - 120px)" : "calc(100vh - 320px)";
1298
- useEffect5(() => {
1209
+ useEffect4(() => {
1299
1210
  document.body.style.overflow = isFullScreen ? "hidden" : "";
1300
1211
  }, [isFullScreen]);
1301
1212
  return /* @__PURE__ */ jsxs9(
@@ -1303,9 +1214,9 @@ var PamGrid = ({
1303
1214
  {
1304
1215
  className: `pms-grid ${isFullScreen ? "card card-action card-fullscreen p-4" : ""}`,
1305
1216
  children: [
1306
- /* @__PURE__ */ jsxs9("div", { className: "row ", children: [
1307
- /* @__PURE__ */ jsx12("div", { className: "col-8", children: /* @__PURE__ */ jsxs9("div", { className: "d-flex flex-row gap-2 gap-2 ", children: [
1308
- /* @__PURE__ */ jsx12("div", { children: features.search && /* @__PURE__ */ jsx12(
1217
+ /* @__PURE__ */ jsxs9("div", { className: "row align-items-center g-2", children: [
1218
+ /* @__PURE__ */ jsx12("div", { className: "col-12 col-md-8 col-lg-9", children: /* @__PURE__ */ jsxs9("div", { className: "row", children: [
1219
+ features.search && /* @__PURE__ */ jsx12("div", { className: "col-8 col-md-4", children: /* @__PURE__ */ jsx12(
1309
1220
  "input",
1310
1221
  {
1311
1222
  type: "search",
@@ -1315,33 +1226,42 @@ var PamGrid = ({
1315
1226
  onChange: (e) => setSearch(e.target.value)
1316
1227
  }
1317
1228
  ) }),
1318
- /* @__PURE__ */ jsx12(MainFilter_default, { gridFetaures: features, grid })
1229
+ /* @__PURE__ */ jsx12("div", { className: "col-4 col-md-4", children: /* @__PURE__ */ jsx12(MainFilter_default, { gridFetaures: features, grid }) })
1319
1230
  ] }) }),
1320
- /* @__PURE__ */ jsx12("div", { className: "col-4 ", children: /* @__PURE__ */ jsxs9("div", { className: "d-flex justify-content-end align-items-center gap-2", children: [
1321
- /* @__PURE__ */ jsx12(
1231
+ /* @__PURE__ */ jsx12("div", { className: "col-12 col-md-4 col-lg-3", children: /* @__PURE__ */ jsxs9("div", { className: "d-flex justify-content-md-end justify-content-between align-items-center gap-2 mt-2 mt-md-0", children: [
1232
+ addNewRecord && /* @__PURE__ */ jsxs9(
1322
1233
  "button",
1323
1234
  {
1324
1235
  type: "button",
1325
- className: "btn btn-sm btn-icon me-2 btn-label-secondary",
1326
- onMouseEnter: (e) => showTooltip("Add New", e.clientX, e.clientY),
1327
- onMouseMove: (e) => showTooltip("Add New", e.clientX, e.clientY),
1236
+ className: `${addNewRecord?.class || "btn btn-sm btn-label-secondary"} d-flex align-items-center gap-1`,
1237
+ onClick: addNewRecord.onClick,
1238
+ onMouseEnter: (e) => showTooltip(addNewRecord?.label, e.clientX, e.clientY),
1239
+ onMouseMove: (e) => showTooltip(addNewRecord?.label, e.clientX, e.clientY),
1328
1240
  onMouseLeave: hideTooltip,
1329
- onClick: addNew,
1330
- children: /* @__PURE__ */ jsx12("i", { className: "bx bx-plus-circle" })
1241
+ children: [
1242
+ /* @__PURE__ */ jsx12(
1243
+ "span",
1244
+ {
1245
+ className: `icon-base ${addNewRecord?.icon || "bx bx-plus-circle"}`
1246
+ }
1247
+ ),
1248
+ addNewRecord?.name && /* @__PURE__ */ jsx12("span", { className: "d-none d-sm-inline", children: addNewRecord?.name })
1249
+ ]
1331
1250
  }
1332
1251
  ),
1333
- isFullScreen ? /* @__PURE__ */ jsx12(Minimize_default, { onClick: () => setFullScreen(!isFullScreen) }) : /* @__PURE__ */ jsx12(Compress_default, { onClick: () => setFullScreen(!isFullScreen) })
1252
+ /* @__PURE__ */ jsx12("div", { className: "flex-shrink-0", children: isFullScreen ? /* @__PURE__ */ jsx12(Minimize_default, { onClick: () => setFullScreen(!isFullScreen) }) : /* @__PURE__ */ jsx12(Compress_default, { onClick: () => setFullScreen(!isFullScreen) }) })
1334
1253
  ] }) })
1335
1254
  ] }),
1336
1255
  /* @__PURE__ */ jsxs9("div", { className: "d-flex flex-row gap-1", children: [
1337
- selected.size > 0 && features.bulkAction && /* @__PURE__ */ jsx12(BulkAction_default, { records: selected, actions: features.bulkAction }),
1256
+ selected.size > 0 && features.bulkActionsConfig && /* @__PURE__ */ jsx12(BulkAction_default, { records: selected, actions: features.bulkActionsConfig }),
1338
1257
  /* @__PURE__ */ jsx12(
1339
1258
  FilterApplied_default,
1340
1259
  {
1341
1260
  groupBy,
1342
1261
  removeGroupby: () => setGroupBy(null),
1343
1262
  advance: advanceFilters,
1344
- removeFilter: (columnKey) => setColumnAdvanceFilter(String(columnKey), null)
1263
+ removeFilter: (columnKey) => setColumnAdvanceFilter(String(columnKey), null),
1264
+ grid
1345
1265
  }
1346
1266
  )
1347
1267
  ] }),
@@ -1400,10 +1320,18 @@ var PamGrid = ({
1400
1320
  "th",
1401
1321
  {
1402
1322
  draggable: features.reorder,
1403
- onDragStart: (e) => onDragStart(e, String(col.key)),
1323
+ onDragStart: (e) => {
1324
+ setDraggingCol(String(col.key));
1325
+ onDragStart(e, String(col.key));
1326
+ },
1327
+ onDragEnd: () => setDraggingCol(null),
1404
1328
  onDragOver: (e) => e.preventDefault(),
1405
1329
  onDrop: (e) => onDrop(e, col.key),
1406
- className: `pms-col-header vs-th ${col.pinned ? `pinned pinned-${col.pinned}` : ""}`,
1330
+ className: `pms-col-header vs-th
1331
+ ${features.reorder ? "cursor-grab" : ""}
1332
+ ${draggingCol === col.key ? "cursor-grabbing" : ""}
1333
+ ${col.pinned ? `pinned pinned-${col.pinned}` : ""}
1334
+ `,
1407
1335
  style,
1408
1336
  children: /* @__PURE__ */ jsxs9(
1409
1337
  "div",
@@ -1414,16 +1342,16 @@ var PamGrid = ({
1414
1342
  "div",
1415
1343
  {
1416
1344
  onClick: () => col.sortable && changeSort(String(col.key)),
1417
- style: { cursor: col.sortable ? "pointer" : "default" },
1345
+ className: col.sortable ? "cursor-pointer" : "",
1418
1346
  children: [
1419
1347
  /* @__PURE__ */ jsx12("small", { children: col.title }),
1420
1348
  sortBy.key === col.key && /* @__PURE__ */ jsx12(
1421
1349
  "i",
1422
1350
  {
1423
- className: `bx bx-sm ${sortBy.dir === "asc" ? "bxs-chevron-up" : "bxs-chevron-down"}`
1351
+ className: `bx bx-sm ${sortBy.dir === "asc" ? "bxs-chevron-up" : "bxs-chevron-down"} cursor-pointer`
1424
1352
  }
1425
1353
  ),
1426
- col.pinned === col.key && /* @__PURE__ */ jsx12("i", { className: "bx bx-x" })
1354
+ col.pinned === col.key && /* @__PURE__ */ jsx12("i", { className: "bx bx-x cursor-pointer" })
1427
1355
  ]
1428
1356
  }
1429
1357
  ),
@@ -1431,19 +1359,15 @@ var PamGrid = ({
1431
1359
  features.pinning && /* @__PURE__ */ jsx12(
1432
1360
  PamHeaderOption_default,
1433
1361
  {
1434
- column: col,
1435
- pinned: col.pinned,
1436
- onPinLeft: () => pinColumn(col.key, "left"),
1437
- onPinRight: () => pinColumn(col.key, "right"),
1438
- onUnpin: () => unpinColumn(col.key),
1439
- advanceFilters,
1440
- setColumnAdvanceFilter
1362
+ currentColumn: col,
1363
+ gridFetaures: features,
1364
+ grid
1441
1365
  }
1442
1366
  ),
1443
- features.resizing && /* @__PURE__ */ jsx12(
1367
+ /* @__PURE__ */ jsx12(
1444
1368
  "i",
1445
1369
  {
1446
- className: "resize-handle bx bx-move-horizontal",
1370
+ className: "bx bx-move-horizontal text-white cursor-resize",
1447
1371
  onMouseDown: (e) => onResizeMouseDown(e, col.key)
1448
1372
  }
1449
1373
  )
@@ -1475,7 +1399,7 @@ var PamGrid = ({
1475
1399
  EmptyState_default,
1476
1400
  {
1477
1401
  title: emptyState.title,
1478
- description: `${emptyState.description} "${search}"`,
1402
+ description: `No results found for "${search}"`,
1479
1403
  imgSrc: NoSearchResult_default
1480
1404
  }
1481
1405
  ) : /* @__PURE__ */ jsx12(
@@ -1520,7 +1444,7 @@ var PamGrid = ({
1520
1444
  style: { width: "80px" },
1521
1445
  value: pageSize,
1522
1446
  onChange: (e) => setPageSize(Number(e.target.value)),
1523
- children: [25, 50, 100].map((n) => /* @__PURE__ */ jsx12("option", { value: n, children: n }, n))
1447
+ children: [20, 50, 100].map((n) => /* @__PURE__ */ jsx12("option", { value: n, children: n }, n))
1524
1448
  }
1525
1449
  ),
1526
1450
  " ",
@@ -1650,7 +1574,7 @@ var PamGrid = ({
1650
1574
  }
1651
1575
  )
1652
1576
  ] }),
1653
- isExpanded && renderExpanded && /* @__PURE__ */ jsx12("tr", { className: "table-active", children: /* @__PURE__ */ jsx12(
1577
+ isExpanded && renderExpanded && /* @__PURE__ */ jsx12("tr", { className: "expanded-row", children: /* @__PURE__ */ jsx12(
1654
1578
  "td",
1655
1579
  {
1656
1580
  colSpan: visibleColumns.length + (features.selection ? 1 : 0) + (features.expand ? 1 : 0) + (features.actions ? 1 : 0),
@@ -1733,35 +1657,46 @@ var ColumnVisibilityPanel = ({
1733
1657
  var ColumnVisibilityPanel_default = ColumnVisibilityPanel;
1734
1658
 
1735
1659
  // src/core/useGridCore.ts
1736
- import { useState as useState7, useMemo as useMemo2, useCallback, useEffect as useEffect6 } from "react";
1660
+ import { useState as useState5, useMemo as useMemo2, useCallback, useEffect as useEffect5 } from "react";
1737
1661
  function useGridCore({
1738
1662
  data = [],
1739
1663
  columns = [],
1740
1664
  serverMode = false,
1741
1665
  rowKey = "id",
1742
- initialPageSize = 20
1666
+ initialPageSize = 20,
1667
+ addNewRecord,
1668
+ switchFiltersConfig
1743
1669
  }) {
1744
- const [page, setPage] = useState7(1);
1745
- const [pageSize, setPageSize] = useState7(initialPageSize);
1746
- const [search, setSearch] = useState7("");
1747
- const [debouncedSearch, setDebouncedSearch] = useState7("");
1748
- const [groupBy, setGroupBy] = useState7(null);
1749
- const [emptyState, setEmptyState] = useState7({});
1750
- const [advanceFilters, setAdvanceFilters] = useState7({});
1751
- const [sortBy, setSortBy] = useState7({ key: null, dir: "asc" });
1752
- const [selected, setSelected] = useState7(/* @__PURE__ */ new Set());
1753
- const [expanded, setExpanded] = useState7(/* @__PURE__ */ new Set());
1754
- const [serverRows, setServerRows] = useState7([]);
1755
- const [serverTotal, setServerTotal] = useState7(0);
1756
- const [serverTotalPages, setServerTotalPages] = useState7(1);
1757
- const [colState, setColState] = useState7(
1670
+ const [page, setPage] = useState5(1);
1671
+ const [pageSize, setPageSize] = useState5(initialPageSize);
1672
+ const [search, setSearch] = useState5("");
1673
+ const [debouncedSearch, setDebouncedSearch] = useState5("");
1674
+ const [groupBy, setGroupBy] = useState5(null);
1675
+ const [emptyState, setEmptyState] = useState5({});
1676
+ const [advanceFilters, setAdvanceFilters] = useState5({});
1677
+ const [sortBy, setSortBy] = useState5({ key: null, dir: "asc" });
1678
+ const [selected, setSelected] = useState5(/* @__PURE__ */ new Set());
1679
+ const [expanded, setExpanded] = useState5(/* @__PURE__ */ new Set());
1680
+ const [switchFilters, setSwitchFilters] = useState5(
1681
+ () => {
1682
+ const initial = {};
1683
+ switchFiltersConfig?.forEach((f) => {
1684
+ initial[f.key] = f.defaultValue ?? false;
1685
+ });
1686
+ return initial;
1687
+ }
1688
+ );
1689
+ const [serverRows, setServerRows] = useState5([]);
1690
+ const [serverTotal, setServerTotal] = useState5(0);
1691
+ const [serverTotalPages, setServerTotalPages] = useState5(1);
1692
+ const [colState, setColState] = useState5(
1758
1693
  () => columns.map((c, i) => ({
1759
1694
  ...c,
1760
1695
  visible: c.visible !== false,
1761
1696
  order: i
1762
1697
  }))
1763
1698
  );
1764
- useEffect6(() => {
1699
+ useEffect5(() => {
1765
1700
  const t = setTimeout(() => {
1766
1701
  setDebouncedSearch(search);
1767
1702
  setPage(1);
@@ -1847,6 +1782,22 @@ function useGridCore({
1847
1782
  },
1848
1783
  []
1849
1784
  );
1785
+ const toggleSwitchFilter = useCallback((key) => {
1786
+ setSwitchFilters((prev) => ({
1787
+ ...prev,
1788
+ [key]: !prev[key]
1789
+ }));
1790
+ setPage(1);
1791
+ }, []);
1792
+ const switchQuery = useMemo2(() => {
1793
+ if (!switchFiltersConfig) return {};
1794
+ const query = {};
1795
+ switchFiltersConfig.forEach((filter) => {
1796
+ const state = switchFilters[filter.key];
1797
+ query[filter.queryParam] = state ? filter.trueValue ?? true : filter.falseValue ?? false;
1798
+ });
1799
+ return query;
1800
+ }, [switchFilters, switchFiltersConfig]);
1850
1801
  const visibleColumns = useMemo2(
1851
1802
  () => colState.filter((c) => c.visible).sort((a, b) => a.order - b.order),
1852
1803
  [colState]
@@ -1895,6 +1846,8 @@ function useGridCore({
1895
1846
  // expand
1896
1847
  expanded,
1897
1848
  toggleExpand,
1849
+ // New Record Button
1850
+ addNewRecord,
1898
1851
  // columns
1899
1852
  colState,
1900
1853
  visibleColumns,
@@ -1912,7 +1865,13 @@ function useGridCore({
1912
1865
  rowKey,
1913
1866
  // empty state
1914
1867
  emptyState,
1915
- setEmptyState
1868
+ setEmptyState,
1869
+ // switch filters
1870
+ switchFilters,
1871
+ toggleSwitchFilter,
1872
+ setSwitchFilters,
1873
+ switchQuery,
1874
+ switchFiltersConfig
1916
1875
  };
1917
1876
  }
1918
1877
  export {