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.js CHANGED
@@ -43,63 +43,10 @@ __export(index_exports, {
43
43
  module.exports = __toCommonJS(index_exports);
44
44
 
45
45
  // src/components/PamGrid.tsx
46
- var import_react6 = __toESM(require("react"));
47
-
48
- // src/components/PamHeaderOption.tsx
49
- var import_react4 = require("react");
50
- var import_react_dom = require("react-dom");
51
-
52
- // src/core/useDropdownPosition.ts
53
- var import_react = require("react");
54
- var useDropdownPosition = (triggerRef, menuRef, isOpen, level = 0) => {
55
- const [style, setStyle] = (0, import_react.useState)({
56
- position: "fixed",
57
- visibility: "hidden"
58
- });
59
- (0, import_react.useLayoutEffect)(() => {
60
- if (!isOpen || !triggerRef.current || !menuRef.current) return;
61
- const updatePosition = () => {
62
- if (!triggerRef.current || !menuRef.current) return null;
63
- const btn = triggerRef.current.getBoundingClientRect();
64
- const menu = menuRef.current;
65
- const menuHeight = menu.offsetHeight;
66
- const menuWidth = menu.offsetWidth;
67
- const vh = window.innerHeight;
68
- const vw = window.innerWidth;
69
- const spaceBelow = vh - btn.bottom;
70
- const spaceAbove = btn.top;
71
- const openUp = menuHeight > spaceBelow && spaceAbove > spaceBelow;
72
- let top = openUp ? btn.top - menuHeight : btn.bottom;
73
- if (top < 8) top = 8;
74
- if (top + menuHeight > vh - 8) top = vh - menuHeight - 8;
75
- let left = btn.left;
76
- if (level === 0) {
77
- if (left + menuWidth > vw - 8) left = vw - menuWidth - 8;
78
- } else {
79
- left = btn.right;
80
- if (left + menuWidth > vw - 8) {
81
- left = btn.left - menuWidth;
82
- }
83
- }
84
- setStyle({
85
- position: "fixed",
86
- top,
87
- left,
88
- zIndex: 99999,
89
- maxHeight: vh - 16,
90
- overflowY: "auto"
91
- });
92
- };
93
- requestAnimationFrame(updatePosition);
94
- setTimeout(updatePosition, 50);
95
- window.addEventListener("resize", updatePosition);
96
- return () => window.removeEventListener("resize", updatePosition);
97
- }, [isOpen, level]);
98
- return style;
99
- };
46
+ var import_react4 = __toESM(require("react"));
100
47
 
101
48
  // src/components/AdvanceFilter.tsx
102
- var import_react2 = require("react");
49
+ var import_react = require("react");
103
50
  var import_jsx_runtime = require("react/jsx-runtime");
104
51
  var OPERATORS = {
105
52
  number: [
@@ -129,10 +76,10 @@ function AdvanceFilter({
129
76
  onApply,
130
77
  onClear
131
78
  }) {
132
- const [operation, setOperation] = (0, import_react2.useState)("");
133
- const [v1, setV1] = (0, import_react2.useState)("");
134
- const [v2, setV2] = (0, import_react2.useState)("");
135
- (0, import_react2.useEffect)(() => {
79
+ const [operation, setOperation] = (0, import_react.useState)("");
80
+ const [v1, setV1] = (0, import_react.useState)("");
81
+ const [v2, setV2] = (0, import_react.useState)("");
82
+ (0, import_react.useEffect)(() => {
136
83
  if (!value) {
137
84
  setOperation("");
138
85
  setV1("");
@@ -207,7 +154,7 @@ function AdvanceFilter({
207
154
  }
208
155
 
209
156
  // src/core/utils.ts
210
- var import_react3 = require("react");
157
+ var import_react2 = require("react");
211
158
  function getAdvancedFilterType(column) {
212
159
  const f = column.enableAdvancedFilter;
213
160
  if (!f) return null;
@@ -246,7 +193,7 @@ function useLocalStorageState(key, initialValue) {
246
193
  return initialValue;
247
194
  }
248
195
  };
249
- const [value, setValue] = (0, import_react3.useState)(getValue);
196
+ const [value, setValue] = (0, import_react2.useState)(getValue);
250
197
  const updateValue = (newValue) => {
251
198
  setValue(newValue);
252
199
  localStorage.setItem(key, JSON.stringify(newValue));
@@ -256,7 +203,7 @@ function useLocalStorageState(key, initialValue) {
256
203
  })
257
204
  );
258
205
  };
259
- (0, import_react3.useEffect)(() => {
206
+ (0, import_react2.useEffect)(() => {
260
207
  const sync = (e) => {
261
208
  if (e?.detail?.key === key) {
262
209
  setValue(e.detail.value);
@@ -278,194 +225,85 @@ function useLocalStorageState(key, initialValue) {
278
225
 
279
226
  // src/components/PamHeaderOption.tsx
280
227
  var import_jsx_runtime2 = require("react/jsx-runtime");
281
- var PmsHeaderOption = ({
282
- column,
283
- pinned,
284
- onPinLeft,
285
- onPinRight,
286
- onUnpin,
287
- // from useGridCore
288
- advanceFilters,
289
- setColumnAdvanceFilter
228
+ var PamHeaderOptions = ({
229
+ currentColumn,
230
+ gridFetaures,
231
+ grid
290
232
  }) => {
291
- const { key: columnKey, enableAdvancedFilter } = column;
292
- const rootRef = (0, import_react4.useRef)(null);
293
- const btnRef = (0, import_react4.useRef)(null);
294
- const menuRef = (0, import_react4.useRef)(null);
295
- const filterBtnRef = (0, import_react4.useRef)(null);
296
- const filterMenuRef = (0, import_react4.useRef)(null);
297
- const pinBtnRef = (0, import_react4.useRef)(null);
298
- const pinMenuRef = (0, import_react4.useRef)(null);
299
- const [open, setOpen] = (0, import_react4.useState)(false);
300
- const [openMenu, setOpenMenu] = (0, import_react4.useState)(null);
301
- const mainStyle = useDropdownPosition(btnRef, menuRef, open, 0);
302
- const filterStyle = useDropdownPosition(
303
- filterBtnRef,
304
- filterMenuRef,
305
- openMenu === "filter",
306
- 1
307
- );
308
- const pinStyle = useDropdownPosition(
309
- pinBtnRef,
310
- pinMenuRef,
311
- openMenu === "pin",
312
- 1
313
- );
314
- const toggleMenu = (name, e) => {
315
- e.stopPropagation();
316
- setOpenMenu((prev) => prev === name ? null : name);
233
+ const items = [];
234
+ const { advanceFilters, setColumnAdvanceFilter, colState, updateColumn } = grid;
235
+ const { key: columnKey } = currentColumn;
236
+ const pinColumn = (key, side) => {
237
+ const col = colState.find((c) => c.key === key);
238
+ if (!col) return;
239
+ const newPinned = col.pinned === side ? null : side;
240
+ updateColumn(key, { pinned: newPinned });
317
241
  };
318
- (0, import_react4.useEffect)(() => {
319
- if (!open) return;
320
- const handleClickOutside = (e) => {
321
- const target = e.target;
322
- if (rootRef.current?.contains(target) || menuRef.current?.contains(target) || filterMenuRef.current?.contains(target) || pinMenuRef.current?.contains(target)) {
323
- return;
324
- }
325
- setOpen(false);
326
- setOpenMenu(null);
327
- };
328
- document.addEventListener("mousedown", handleClickOutside);
329
- return () => document.removeEventListener("mousedown", handleClickOutside);
330
- }, [open, openMenu]);
331
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { ref: rootRef, style: { position: "relative" }, children: [
332
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
333
- "span",
334
- {
335
- ref: btnRef,
336
- className: "cursor-pointer",
337
- onClick: (e) => {
338
- e.stopPropagation();
339
- setOpen((p) => !p);
242
+ const unpinColumn = (key) => {
243
+ updateColumn(key, { pinned: null });
244
+ };
245
+ if (gridFetaures.pinning) {
246
+ items.push({
247
+ key: `pined-col-${String(currentColumn.key)}`,
248
+ label: "Pinned",
249
+ icon: "bx bx-pin",
250
+ keepOpenOnClick: true,
251
+ children: [
252
+ {
253
+ key: `pined-col-${String(currentColumn.key)}-noPinned`,
254
+ label: "No Pinned",
255
+ icon: !currentColumn.pinned ? "bx bx-check text-primary" : "",
256
+ onClick: () => unpinColumn(currentColumn.key)
340
257
  },
341
- children: [
342
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("i", { className: "bx bx-dots-vertical-rounded bx-sm" }),
343
- advanceFilters[String(columnKey)] && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "badge rounded-pill bg-info badge-dot badge-notifications" })
344
- ]
345
- }
346
- ),
347
- open && (0, import_react_dom.createPortal)(
348
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
349
- "ul",
350
258
  {
351
- ref: menuRef,
352
- className: "dropdown-menu shadow rounded-3 py-2 show",
353
- style: {
354
- ...mainStyle,
355
- position: "fixed",
356
- zIndex: 1e4
357
- },
358
- children: [
359
- enableAdvancedFilter && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("li", { className: "dropdown-submenu dropstart", children: [
360
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
361
- "button",
362
- {
363
- ref: filterBtnRef,
364
- className: "dropdown-item d-flex justify-content-between",
365
- onClick: (e) => toggleMenu("filter", e),
366
- children: [
367
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
368
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("i", { className: "bx bx-filter-alt me-2" }),
369
- " Filter"
370
- ] }),
371
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("i", { className: "bx bx-chevron-right" })
372
- ]
373
- }
374
- ),
375
- openMenu === "filter" && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
376
- "ul",
377
- {
378
- ref: filterMenuRef,
379
- className: "dropdown-menu shadow rounded-3 p-2 show",
380
- style: {
381
- ...filterStyle,
382
- position: "fixed",
383
- zIndex: 10001
384
- },
385
- children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
386
- AdvanceFilter,
387
- {
388
- type: getAdvancedFilterType(column),
389
- value: advanceFilters[String(columnKey)],
390
- onApply: (f) => setColumnAdvanceFilter(String(columnKey), f),
391
- onClear: () => setColumnAdvanceFilter(String(columnKey), null)
392
- }
393
- )
394
- }
395
- )
396
- ] }),
397
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("li", { className: "dropdown-submenu dropstart", children: [
398
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
399
- "button",
400
- {
401
- ref: pinBtnRef,
402
- className: "dropdown-item d-flex justify-content-between",
403
- onClick: (e) => toggleMenu("pin", e),
404
- children: [
405
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { children: [
406
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("i", { className: "bx bx-pin me-2" }),
407
- " Pin Column"
408
- ] }),
409
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("i", { className: "bx bx-chevron-right" })
410
- ]
411
- }
412
- ),
413
- openMenu === "pin" && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
414
- "ul",
415
- {
416
- ref: pinMenuRef,
417
- className: "dropdown-menu shadow rounded-3 py-2 show",
418
- style: {
419
- ...pinStyle,
420
- position: "fixed",
421
- zIndex: 10001
422
- },
423
- children: [
424
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
425
- "div",
426
- {
427
- className: "dropdown-item d-flex gap-2 cursor-pointer",
428
- onClick: onUnpin,
429
- children: [
430
- !pinned && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("i", { className: "bx bx-check text-primary" }),
431
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: "No Pin" })
432
- ]
433
- }
434
- ),
435
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
436
- "div",
437
- {
438
- className: "dropdown-item d-flex gap-2 cursor-pointer",
439
- onClick: onPinLeft,
440
- children: [
441
- pinned === "left" && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("i", { className: "bx bx-check text-primary" }),
442
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: "Pin Left" })
443
- ]
444
- }
445
- ),
446
- /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
447
- "div",
448
- {
449
- className: "dropdown-item d-flex gap-2 cursor-pointer",
450
- onClick: onPinRight,
451
- children: [
452
- pinned === "right" && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("i", { className: "bx bx-check text-primary" }),
453
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { children: "Pin Right" })
454
- ]
455
- }
456
- )
457
- ]
458
- }
459
- )
460
- ] })
461
- ]
259
+ key: `pined-col-${String(currentColumn.key)}-leftPinned`,
260
+ label: "Left Pinned",
261
+ icon: currentColumn.pinned === "left" ? "bx bx-check text-primary" : "",
262
+ onClick: () => pinColumn(currentColumn.key, "left")
263
+ },
264
+ {
265
+ key: `pined-col-${String(currentColumn.key)}-rightPinned`,
266
+ label: "Right Pinned",
267
+ icon: currentColumn.pinned === "right" ? "bx bx-check text-primary" : "",
268
+ onClick: () => pinColumn(currentColumn.key, "right")
462
269
  }
463
- ),
464
- document.body
465
- )
466
- ] });
270
+ ]
271
+ });
272
+ }
273
+ if (currentColumn.enableAdvancedFilter) {
274
+ items.push({
275
+ key: `advance-filter-${String(currentColumn.key)}`,
276
+ label: "Filte By Column",
277
+ icon: "bx bx-sm bx-filter",
278
+ children: [
279
+ {
280
+ key: `advance-filter-${String(currentColumn.key)}-apply`,
281
+ keepOpenOnClick: true,
282
+ label: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
283
+ AdvanceFilter,
284
+ {
285
+ type: getAdvancedFilterType(currentColumn),
286
+ value: advanceFilters[String(columnKey)],
287
+ onApply: (f) => setColumnAdvanceFilter(String(columnKey), f),
288
+ onClear: () => setColumnAdvanceFilter(String(columnKey), null)
289
+ }
290
+ )
291
+ }
292
+ ]
293
+ });
294
+ }
295
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
296
+ PamDropdown,
297
+ {
298
+ trigger: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
299
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("i", { className: "bx bx-sm bx-dots-vertical-rounded cursor-pointer" }),
300
+ advanceFilters[String(columnKey)] && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "badge rounded-pill bg-info badge-dot badge-notifications" })
301
+ ] }),
302
+ items
303
+ }
304
+ );
467
305
  };
468
- var PamHeaderOption_default = PmsHeaderOption;
306
+ var PamHeaderOption_default = PamHeaderOptions;
469
307
 
470
308
  // src/components/FilterApplied.tsx
471
309
  var import_jsx_runtime3 = require("react/jsx-runtime");
@@ -473,8 +311,10 @@ var FilterApplied = ({
473
311
  groupBy,
474
312
  removeGroupby,
475
313
  advance,
476
- removeFilter
314
+ removeFilter,
315
+ grid
477
316
  }) => {
317
+ const { switchFiltersConfig, switchQuery, toggleSwitchFilter } = grid;
478
318
  const OPERATION = [
479
319
  { key: "eq", label: " == " },
480
320
  { key: "neq", label: " \u2260 " },
@@ -507,7 +347,7 @@ var FilterApplied = ({
507
347
  return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "d-flex flex-row gap-1 py-1 px-3 ", children: [
508
348
  groupBy && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("span", { className: "badge bg-label-primary text-capitalize", children: [
509
349
  "GroupBy : ",
510
- groupBy,
350
+ groupBy.label,
511
351
  " ",
512
352
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
513
353
  "i",
@@ -533,7 +373,31 @@ var FilterApplied = ({
533
373
  ]
534
374
  },
535
375
  item.column
536
- ))
376
+ )),
377
+ switchFiltersConfig !== void 0 && switchFiltersConfig?.length > 0 && switchFiltersConfig.map((swicth) => {
378
+ return Object.entries(switchQuery).map(([key, value]) => {
379
+ if (swicth.queryParam === key && swicth.defaultValue !== value) {
380
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
381
+ "span",
382
+ {
383
+ className: "badge bg-label-warning text-capitalize",
384
+ children: [
385
+ swicth.label,
386
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
387
+ "i",
388
+ {
389
+ className: "bx bx-x bx-xs cursor-pointer",
390
+ onClick: () => toggleSwitchFilter?.(swicth.key)
391
+ }
392
+ )
393
+ ]
394
+ },
395
+ key
396
+ );
397
+ }
398
+ return null;
399
+ });
400
+ })
537
401
  ] });
538
402
  };
539
403
  var FilterApplied_default = FilterApplied;
@@ -597,7 +461,7 @@ var Compress = ({ onClick }) => {
597
461
  var Compress_default = Compress;
598
462
 
599
463
  // src/assets/icons/Box.svg
600
- var Box_default = "./Box-QGC2UZ43.svg";
464
+ 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';
601
465
 
602
466
  // src/components/EmptyState.tsx
603
467
  var import_jsx_runtime6 = require("react/jsx-runtime");
@@ -615,7 +479,7 @@ var EmptyState = ({
615
479
  var EmptyState_default = EmptyState;
616
480
 
617
481
  // src/assets/icons/NoSearchResult.svg
618
- var NoSearchResult_default = "./NoSearchResult-R4W2UYSR.svg";
482
+ 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';
619
483
 
620
484
  // src/components/icons/ArrowFromBottonToRight.tsx
621
485
  var import_jsx_runtime7 = require("react/jsx-runtime");
@@ -792,8 +656,8 @@ var Pagination = ({
792
656
  var Paginantion_default = Pagination;
793
657
 
794
658
  // src/components/dropdown/PamDropdown.tsx
795
- var import_react5 = require("react");
796
- var import_react_dom2 = require("react-dom");
659
+ var import_react3 = require("react");
660
+ var import_react_dom = require("react-dom");
797
661
  var import_jsx_runtime10 = require("react/jsx-runtime");
798
662
  function PamDropdown({
799
663
  trigger,
@@ -804,12 +668,12 @@ function PamDropdown({
804
668
  closeOnItemClick = true,
805
669
  className = ""
806
670
  }) {
807
- const triggerRef = (0, import_react5.useRef)(null);
808
- const menuRef = (0, import_react5.useRef)(null);
809
- const [open, setOpen] = (0, import_react5.useState)(false);
810
- const [pos, setPos] = (0, import_react5.useState)({ top: 0, left: 0 });
811
- const [openSubKeys, setOpenSubKeys] = (0, import_react5.useState)({});
812
- const portalRoot = (0, import_react5.useMemo)(() => {
671
+ const triggerRef = (0, import_react3.useRef)(null);
672
+ const menuRef = (0, import_react3.useRef)(null);
673
+ const [open, setOpen] = (0, import_react3.useState)(false);
674
+ const [pos, setPos] = (0, import_react3.useState)({ top: 0, left: 0 });
675
+ const [openSubKeys, setOpenSubKeys] = (0, import_react3.useState)({});
676
+ const portalRoot = (0, import_react3.useMemo)(() => {
813
677
  const el = document.getElementById("pam-portal-root");
814
678
  if (el) return el;
815
679
  const created = document.createElement("div");
@@ -861,11 +725,11 @@ function PamDropdown({
861
725
  if (!t || !m) return;
862
726
  setPos(getDropdownPosition(t, m));
863
727
  }
864
- (0, import_react5.useLayoutEffect)(() => {
728
+ (0, import_react3.useLayoutEffect)(() => {
865
729
  if (!open) return;
866
730
  updatePosition();
867
731
  }, [open, placement]);
868
- (0, import_react5.useEffect)(() => {
732
+ (0, import_react3.useEffect)(() => {
869
733
  if (!open) return;
870
734
  const onDown = (e) => {
871
735
  const t = triggerRef.current;
@@ -886,7 +750,7 @@ function PamDropdown({
886
750
  document.removeEventListener("keydown", onKey);
887
751
  };
888
752
  }, [open]);
889
- (0, import_react5.useEffect)(() => {
753
+ (0, import_react3.useEffect)(() => {
890
754
  if (!open) return;
891
755
  const handler = () => updatePosition();
892
756
  window.addEventListener("scroll", handler, true);
@@ -898,7 +762,7 @@ function PamDropdown({
898
762
  }, [open]);
899
763
  return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
900
764
  /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { ref: triggerRef, className: `pam-dropdown-trigger ${className}`, children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { onClick: toggle, style: { display: "inline-flex" }, children: trigger }) }),
901
- open && (0, import_react_dom2.createPortal)(
765
+ open && (0, import_react_dom.createPortal)(
902
766
  /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
903
767
  "div",
904
768
  {
@@ -956,12 +820,12 @@ function PamDropdownNode({
956
820
  level,
957
821
  index
958
822
  }) {
959
- const liRef = (0, import_react5.useRef)(null);
960
- const submenuRef = (0, import_react5.useRef)(null);
823
+ const liRef = (0, import_react3.useRef)(null);
824
+ const submenuRef = (0, import_react3.useRef)(null);
961
825
  const hasChildren = !!item.children?.length;
962
826
  const nodeKey = item.key ?? `${level}-${index}`;
963
827
  const submenuOpen = !!openSubKeys[nodeKey];
964
- (0, import_react5.useLayoutEffect)(() => {
828
+ (0, import_react3.useLayoutEffect)(() => {
965
829
  if (!submenuOpen) return;
966
830
  const li = liRef.current;
967
831
  const menu = submenuRef.current;
@@ -1048,23 +912,29 @@ function PamDropdownNode({
1048
912
  ].join(" "),
1049
913
  onClick: handleClick,
1050
914
  children: [
1051
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "pam-dropdown-item-inner", children: [
1052
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "pam-left", children: [
1053
- item.icon && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("i", { className: `${item.icon} pam-icon` }),
1054
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "pam-label", children: item.label })
1055
- ] }),
1056
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "pam-right", children: [
1057
- item.rightSlot && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1058
- "span",
1059
- {
1060
- className: "pam-rightslot",
1061
- onClick: (e) => e.stopPropagation(),
1062
- children: item.rightSlot
1063
- }
1064
- ),
1065
- hasChildren && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("i", { className: "bx bx-chevron-right pam-arrow" })
1066
- ] })
1067
- ] }),
915
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
916
+ "div",
917
+ {
918
+ className: `${item.rightSlot ? "pam-dropdown-item-inner-rightSlot" : "pam-dropdown-item-inner"} `,
919
+ children: [
920
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "pam-left", children: [
921
+ item.icon && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("i", { className: `${item.icon} pam-icon` }),
922
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "pam-label", children: item.label })
923
+ ] }),
924
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "pam-right", children: [
925
+ item.rightSlot && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
926
+ "span",
927
+ {
928
+ className: "pam-rightslot",
929
+ onClick: (e) => e.stopPropagation(),
930
+ children: item.rightSlot
931
+ }
932
+ ),
933
+ hasChildren && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("i", { className: "bx bx-chevron-right pam-arrow" })
934
+ ] })
935
+ ]
936
+ }
937
+ ),
1068
938
  hasChildren && submenuOpen && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { ref: submenuRef, className: "pam-submenu", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1069
939
  PamDropdownList,
1070
940
  {
@@ -1087,7 +957,15 @@ var MainFilter = ({
1087
957
  gridFetaures,
1088
958
  grid
1089
959
  }) => {
1090
- const { setGroupBy, visibleColumns, colState, updateColumn } = grid;
960
+ const {
961
+ setGroupBy,
962
+ visibleColumns,
963
+ colState,
964
+ updateColumn,
965
+ switchFiltersConfig,
966
+ switchFilters,
967
+ toggleSwitchFilter
968
+ } = grid;
1091
969
  const [isBulkData, setBulkData] = useLocalStorageState(
1092
970
  "bulk-data-toggle",
1093
971
  false
@@ -1123,11 +1001,11 @@ var MainFilter = ({
1123
1001
  children: visibleColumns.length > 0 ? visibleColumns.filter((c) => c.groupable).map((c) => ({
1124
1002
  key: `group-${String(c.key)}`,
1125
1003
  label: c.title,
1126
- onClick: () => setGroupBy(String(c.key))
1004
+ onClick: () => setGroupBy({ key: String(c.key), label: c.title })
1127
1005
  })) : []
1128
1006
  });
1129
1007
  }
1130
- if (gridFetaures?.bulkAction && gridFetaures.bulkAction.length > 0) {
1008
+ if (gridFetaures?.bulkActionsConfig && gridFetaures.bulkActionsConfig.length > 0) {
1131
1009
  items.push({
1132
1010
  key: "bulk-data",
1133
1011
  keepOpenOnClick: true,
@@ -1158,12 +1036,43 @@ var MainFilter = ({
1158
1036
  ] })
1159
1037
  });
1160
1038
  }
1039
+ if (switchFiltersConfig !== void 0 && switchFiltersConfig?.length > 0) {
1040
+ switchFiltersConfig.forEach((filter) => {
1041
+ items.push({
1042
+ key: `switch-${filter.key}`,
1043
+ keepOpenOnClick: true,
1044
+ label: filter.label,
1045
+ rightSlot: /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
1046
+ "label",
1047
+ {
1048
+ className: "switch switch-square switch-sm",
1049
+ onClick: (e) => e.stopPropagation(),
1050
+ children: [
1051
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1052
+ "input",
1053
+ {
1054
+ type: "checkbox",
1055
+ className: "switch-input",
1056
+ checked: !!switchFilters?.[filter.key],
1057
+ onChange: () => toggleSwitchFilter(filter.key)
1058
+ }
1059
+ ),
1060
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("span", { className: "switch-toggle-slider", children: [
1061
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "switch-on", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("i", { className: "icon-base bx bx-check" }) }),
1062
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "switch-off", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("i", { className: "icon-base bx bx-x" }) })
1063
+ ] })
1064
+ ]
1065
+ }
1066
+ )
1067
+ });
1068
+ });
1069
+ }
1161
1070
  return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1162
1071
  PamDropdown,
1163
1072
  {
1164
1073
  trigger: /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("button", { type: "button", className: "btn btn-sm btn-label-secondary me-2", children: [
1165
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "icon-base bx bx-filter-alt me-1" }),
1166
- "Filter"
1074
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "icon-base bx bx-filter-alt" }),
1075
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "d-none d-sm-inline ms-1", children: "Filter" })
1167
1076
  ] }),
1168
1077
  items
1169
1078
  }
@@ -1174,7 +1083,18 @@ var TableAction = ({
1174
1083
  gridFetaures,
1175
1084
  row
1176
1085
  }) => {
1177
- const items = Array.isArray(gridFetaures.actions) ? gridFetaures.actions.filter((act) => act.isVisible).map((a, i) => ({
1086
+ const items = Array.isArray(gridFetaures.actions) ? gridFetaures.actions.filter((act) => {
1087
+ if (typeof act.isVisible === "function") {
1088
+ if (row) {
1089
+ return act.isVisible(row);
1090
+ }
1091
+ return false;
1092
+ }
1093
+ if (typeof act.isVisible === "boolean") {
1094
+ return act.isVisible;
1095
+ }
1096
+ return true;
1097
+ }).map((a, i) => ({
1178
1098
  key: `action-${String(a.label)}-${i}`,
1179
1099
  label: a.label,
1180
1100
  icon: a.icon,
@@ -1213,14 +1133,15 @@ var PamGrid = ({
1213
1133
  addNew,
1214
1134
  renderExpanded
1215
1135
  }) => {
1216
- const [isFullScreen, setFullScreen] = (0, import_react6.useState)(false);
1217
- const [activeCell, setActiveCell] = (0, import_react6.useState)(null);
1136
+ const [isFullScreen, setFullScreen] = (0, import_react4.useState)(false);
1137
+ const [draggingCol, setDraggingCol] = (0, import_react4.useState)(null);
1138
+ const [activeCell, setActiveCell] = (0, import_react4.useState)(null);
1218
1139
  const [isBulkAction, setBulkAction] = useLocalStorageState(
1219
1140
  "bulk-data-toggle",
1220
1141
  false
1221
1142
  );
1222
- const wrapperRef = (0, import_react6.useRef)(null);
1223
- const dragState = (0, import_react6.useRef)({ from: null });
1143
+ const wrapperRef = (0, import_react4.useRef)(null);
1144
+ const dragState = (0, import_react4.useRef)({ from: null });
1224
1145
  const {
1225
1146
  rows,
1226
1147
  page,
@@ -1246,20 +1167,10 @@ var PamGrid = ({
1246
1167
  toggleExpand,
1247
1168
  setColState,
1248
1169
  emptyState,
1249
- // onAdvanceFilters,
1250
- // setAdanceFilter,
1170
+ addNewRecord,
1251
1171
  advanceFilters,
1252
1172
  setColumnAdvanceFilter
1253
1173
  } = grid;
1254
- const pinColumn = (key, side) => {
1255
- const col = colState.find((c) => c.key === key);
1256
- if (!col) return;
1257
- const newPinned = col.pinned === side ? null : side;
1258
- updateColumn(key, { pinned: newPinned });
1259
- };
1260
- const unpinColumn = (key) => {
1261
- updateColumn(key, { pinned: null });
1262
- };
1263
1174
  const onResizeMouseDown = (e, key) => {
1264
1175
  e.preventDefault();
1265
1176
  const startX = e.clientX;
@@ -1300,12 +1211,12 @@ var PamGrid = ({
1300
1211
  return next.sort((a, b) => a.order - b.order);
1301
1212
  });
1302
1213
  };
1303
- const groupedRows = import_react6.default.useMemo(() => {
1214
+ const groupedRows = import_react4.default.useMemo(() => {
1304
1215
  if (!groupBy) return null;
1305
- const column = visibleColumns.find((col) => col.key === groupBy);
1216
+ const column = visibleColumns.find((col) => col.key === groupBy.key);
1306
1217
  const map = {};
1307
1218
  rows.forEach((r) => {
1308
- const rawValue = column?.groupByValue ? column.groupByValue(r) : column?.nestedPath ? getNestedValue(r, column.nestedPath) : r[groupBy];
1219
+ const rawValue = column?.groupByValue ? column.groupByValue(r) : column?.nestedPath ? getNestedValue(r, column.nestedPath) : r[groupBy.key];
1309
1220
  const groupKey = rawValue === null || rawValue === void 0 ? "unknown" : typeof rawValue === "object" ? String(rawValue?.id ?? JSON.stringify(rawValue)) : String(rawValue);
1310
1221
  if (!map[groupKey]) {
1311
1222
  map[groupKey] = { rawValue, items: [] };
@@ -1333,7 +1244,7 @@ var PamGrid = ({
1333
1244
  }, [rows, groupBy, visibleColumns]);
1334
1245
  const currentRows = rows;
1335
1246
  const gridHeight = isFullScreen ? "calc(100vh - 120px)" : "calc(100vh - 320px)";
1336
- (0, import_react6.useEffect)(() => {
1247
+ (0, import_react4.useEffect)(() => {
1337
1248
  document.body.style.overflow = isFullScreen ? "hidden" : "";
1338
1249
  }, [isFullScreen]);
1339
1250
  return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
@@ -1341,9 +1252,9 @@ var PamGrid = ({
1341
1252
  {
1342
1253
  className: `pms-grid ${isFullScreen ? "card card-action card-fullscreen p-4" : ""}`,
1343
1254
  children: [
1344
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "row ", children: [
1345
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "col-8", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "d-flex flex-row gap-2 gap-2 ", children: [
1346
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { children: features.search && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1255
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "row align-items-center g-2", children: [
1256
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "col-12 col-md-8 col-lg-9", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "row", children: [
1257
+ features.search && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "col-8 col-md-4", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1347
1258
  "input",
1348
1259
  {
1349
1260
  type: "search",
@@ -1353,33 +1264,42 @@ var PamGrid = ({
1353
1264
  onChange: (e) => setSearch(e.target.value)
1354
1265
  }
1355
1266
  ) }),
1356
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(MainFilter_default, { gridFetaures: features, grid })
1267
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "col-4 col-md-4", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(MainFilter_default, { gridFetaures: features, grid }) })
1357
1268
  ] }) }),
1358
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "col-4 ", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "d-flex justify-content-end align-items-center gap-2", children: [
1359
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1269
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "col-12 col-md-4 col-lg-3", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "d-flex justify-content-md-end justify-content-between align-items-center gap-2 mt-2 mt-md-0", children: [
1270
+ addNewRecord && /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
1360
1271
  "button",
1361
1272
  {
1362
1273
  type: "button",
1363
- className: "btn btn-sm btn-icon me-2 btn-label-secondary",
1364
- onMouseEnter: (e) => showTooltip("Add New", e.clientX, e.clientY),
1365
- onMouseMove: (e) => showTooltip("Add New", e.clientX, e.clientY),
1274
+ className: `${addNewRecord?.class || "btn btn-sm btn-label-secondary"} d-flex align-items-center gap-1`,
1275
+ onClick: addNewRecord.onClick,
1276
+ onMouseEnter: (e) => showTooltip(addNewRecord?.label, e.clientX, e.clientY),
1277
+ onMouseMove: (e) => showTooltip(addNewRecord?.label, e.clientX, e.clientY),
1366
1278
  onMouseLeave: hideTooltip,
1367
- onClick: addNew,
1368
- children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("i", { className: "bx bx-plus-circle" })
1279
+ children: [
1280
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1281
+ "span",
1282
+ {
1283
+ className: `icon-base ${addNewRecord?.icon || "bx bx-plus-circle"}`
1284
+ }
1285
+ ),
1286
+ addNewRecord?.name && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { className: "d-none d-sm-inline", children: addNewRecord?.name })
1287
+ ]
1369
1288
  }
1370
1289
  ),
1371
- isFullScreen ? /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(Minimize_default, { onClick: () => setFullScreen(!isFullScreen) }) : /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(Compress_default, { onClick: () => setFullScreen(!isFullScreen) })
1290
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "flex-shrink-0", children: isFullScreen ? /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(Minimize_default, { onClick: () => setFullScreen(!isFullScreen) }) : /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(Compress_default, { onClick: () => setFullScreen(!isFullScreen) }) })
1372
1291
  ] }) })
1373
1292
  ] }),
1374
1293
  /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "d-flex flex-row gap-1", children: [
1375
- selected.size > 0 && features.bulkAction && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(BulkAction_default, { records: selected, actions: features.bulkAction }),
1294
+ selected.size > 0 && features.bulkActionsConfig && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(BulkAction_default, { records: selected, actions: features.bulkActionsConfig }),
1376
1295
  /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1377
1296
  FilterApplied_default,
1378
1297
  {
1379
1298
  groupBy,
1380
1299
  removeGroupby: () => setGroupBy(null),
1381
1300
  advance: advanceFilters,
1382
- removeFilter: (columnKey) => setColumnAdvanceFilter(String(columnKey), null)
1301
+ removeFilter: (columnKey) => setColumnAdvanceFilter(String(columnKey), null),
1302
+ grid
1383
1303
  }
1384
1304
  )
1385
1305
  ] }),
@@ -1438,10 +1358,18 @@ var PamGrid = ({
1438
1358
  "th",
1439
1359
  {
1440
1360
  draggable: features.reorder,
1441
- onDragStart: (e) => onDragStart(e, String(col.key)),
1361
+ onDragStart: (e) => {
1362
+ setDraggingCol(String(col.key));
1363
+ onDragStart(e, String(col.key));
1364
+ },
1365
+ onDragEnd: () => setDraggingCol(null),
1442
1366
  onDragOver: (e) => e.preventDefault(),
1443
1367
  onDrop: (e) => onDrop(e, col.key),
1444
- className: `pms-col-header vs-th ${col.pinned ? `pinned pinned-${col.pinned}` : ""}`,
1368
+ className: `pms-col-header vs-th
1369
+ ${features.reorder ? "cursor-grab" : ""}
1370
+ ${draggingCol === col.key ? "cursor-grabbing" : ""}
1371
+ ${col.pinned ? `pinned pinned-${col.pinned}` : ""}
1372
+ `,
1445
1373
  style,
1446
1374
  children: /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
1447
1375
  "div",
@@ -1452,16 +1380,16 @@ var PamGrid = ({
1452
1380
  "div",
1453
1381
  {
1454
1382
  onClick: () => col.sortable && changeSort(String(col.key)),
1455
- style: { cursor: col.sortable ? "pointer" : "default" },
1383
+ className: col.sortable ? "cursor-pointer" : "",
1456
1384
  children: [
1457
1385
  /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("small", { children: col.title }),
1458
1386
  sortBy.key === col.key && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1459
1387
  "i",
1460
1388
  {
1461
- className: `bx bx-sm ${sortBy.dir === "asc" ? "bxs-chevron-up" : "bxs-chevron-down"}`
1389
+ className: `bx bx-sm ${sortBy.dir === "asc" ? "bxs-chevron-up" : "bxs-chevron-down"} cursor-pointer`
1462
1390
  }
1463
1391
  ),
1464
- col.pinned === col.key && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("i", { className: "bx bx-x" })
1392
+ col.pinned === col.key && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("i", { className: "bx bx-x cursor-pointer" })
1465
1393
  ]
1466
1394
  }
1467
1395
  ),
@@ -1469,19 +1397,15 @@ var PamGrid = ({
1469
1397
  features.pinning && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1470
1398
  PamHeaderOption_default,
1471
1399
  {
1472
- column: col,
1473
- pinned: col.pinned,
1474
- onPinLeft: () => pinColumn(col.key, "left"),
1475
- onPinRight: () => pinColumn(col.key, "right"),
1476
- onUnpin: () => unpinColumn(col.key),
1477
- advanceFilters,
1478
- setColumnAdvanceFilter
1400
+ currentColumn: col,
1401
+ gridFetaures: features,
1402
+ grid
1479
1403
  }
1480
1404
  ),
1481
- features.resizing && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1405
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1482
1406
  "i",
1483
1407
  {
1484
- className: "resize-handle bx bx-move-horizontal",
1408
+ className: "bx bx-move-horizontal text-white cursor-resize",
1485
1409
  onMouseDown: (e) => onResizeMouseDown(e, col.key)
1486
1410
  }
1487
1411
  )
@@ -1513,7 +1437,7 @@ var PamGrid = ({
1513
1437
  EmptyState_default,
1514
1438
  {
1515
1439
  title: emptyState.title,
1516
- description: `${emptyState.description} "${search}"`,
1440
+ description: `No results found for "${search}"`,
1517
1441
  imgSrc: NoSearchResult_default
1518
1442
  }
1519
1443
  ) : /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
@@ -1526,7 +1450,7 @@ var PamGrid = ({
1526
1450
  ) }) })
1527
1451
  },
1528
1452
  index
1529
- ) }, `row-${index}`)) : !loading && groupBy && groupedRows && groupedRows.length > 0 ? groupedRows.map((g, indG) => /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_react6.default.Fragment, { children: [
1453
+ ) }, `row-${index}`)) : !loading && groupBy && groupedRows && groupedRows.length > 0 ? groupedRows.map((g, indG) => /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_react4.default.Fragment, { children: [
1530
1454
  /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("tr", { className: "pam-bg-light-primary", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
1531
1455
  "td",
1532
1456
  {
@@ -1558,7 +1482,7 @@ var PamGrid = ({
1558
1482
  style: { width: "80px" },
1559
1483
  value: pageSize,
1560
1484
  onChange: (e) => setPageSize(Number(e.target.value)),
1561
- children: [25, 50, 100].map((n) => /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("option", { value: n, children: n }, n))
1485
+ children: [20, 50, 100].map((n) => /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("option", { value: n, children: n }, n))
1562
1486
  }
1563
1487
  ),
1564
1488
  " ",
@@ -1582,7 +1506,7 @@ var PamGrid = ({
1582
1506
  function renderRow(row, ind) {
1583
1507
  const isSelected = selected.has(String(row[rowKey]));
1584
1508
  const isExpanded = expanded.has(String(row[rowKey]));
1585
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_react6.default.Fragment, { children: [
1509
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_react4.default.Fragment, { children: [
1586
1510
  /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("tr", { children: [
1587
1511
  features.IsNumbering && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("td", { className: "text-center align-middle p-2", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("small", { className: "text-secondry", children: ind + 1 }) }),
1588
1512
  features.expand && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("td", { className: "text-center align-middle ", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
@@ -1688,7 +1612,7 @@ var PamGrid = ({
1688
1612
  }
1689
1613
  )
1690
1614
  ] }),
1691
- isExpanded && renderExpanded && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("tr", { className: "table-active", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1615
+ isExpanded && renderExpanded && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("tr", { className: "expanded-row", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1692
1616
  "td",
1693
1617
  {
1694
1618
  colSpan: visibleColumns.length + (features.selection ? 1 : 0) + (features.expand ? 1 : 0) + (features.actions ? 1 : 0),
@@ -1771,42 +1695,53 @@ var ColumnVisibilityPanel = ({
1771
1695
  var ColumnVisibilityPanel_default = ColumnVisibilityPanel;
1772
1696
 
1773
1697
  // src/core/useGridCore.ts
1774
- var import_react7 = require("react");
1698
+ var import_react5 = require("react");
1775
1699
  function useGridCore({
1776
1700
  data = [],
1777
1701
  columns = [],
1778
1702
  serverMode = false,
1779
1703
  rowKey = "id",
1780
- initialPageSize = 20
1704
+ initialPageSize = 20,
1705
+ addNewRecord,
1706
+ switchFiltersConfig
1781
1707
  }) {
1782
- const [page, setPage] = (0, import_react7.useState)(1);
1783
- const [pageSize, setPageSize] = (0, import_react7.useState)(initialPageSize);
1784
- const [search, setSearch] = (0, import_react7.useState)("");
1785
- const [debouncedSearch, setDebouncedSearch] = (0, import_react7.useState)("");
1786
- const [groupBy, setGroupBy] = (0, import_react7.useState)(null);
1787
- const [emptyState, setEmptyState] = (0, import_react7.useState)({});
1788
- const [advanceFilters, setAdvanceFilters] = (0, import_react7.useState)({});
1789
- const [sortBy, setSortBy] = (0, import_react7.useState)({ key: null, dir: "asc" });
1790
- const [selected, setSelected] = (0, import_react7.useState)(/* @__PURE__ */ new Set());
1791
- const [expanded, setExpanded] = (0, import_react7.useState)(/* @__PURE__ */ new Set());
1792
- const [serverRows, setServerRows] = (0, import_react7.useState)([]);
1793
- const [serverTotal, setServerTotal] = (0, import_react7.useState)(0);
1794
- const [serverTotalPages, setServerTotalPages] = (0, import_react7.useState)(1);
1795
- const [colState, setColState] = (0, import_react7.useState)(
1708
+ const [page, setPage] = (0, import_react5.useState)(1);
1709
+ const [pageSize, setPageSize] = (0, import_react5.useState)(initialPageSize);
1710
+ const [search, setSearch] = (0, import_react5.useState)("");
1711
+ const [debouncedSearch, setDebouncedSearch] = (0, import_react5.useState)("");
1712
+ const [groupBy, setGroupBy] = (0, import_react5.useState)(null);
1713
+ const [emptyState, setEmptyState] = (0, import_react5.useState)({});
1714
+ const [advanceFilters, setAdvanceFilters] = (0, import_react5.useState)({});
1715
+ const [sortBy, setSortBy] = (0, import_react5.useState)({ key: null, dir: "asc" });
1716
+ const [selected, setSelected] = (0, import_react5.useState)(/* @__PURE__ */ new Set());
1717
+ const [expanded, setExpanded] = (0, import_react5.useState)(/* @__PURE__ */ new Set());
1718
+ const [switchFilters, setSwitchFilters] = (0, import_react5.useState)(
1719
+ () => {
1720
+ const initial = {};
1721
+ switchFiltersConfig?.forEach((f) => {
1722
+ initial[f.key] = f.defaultValue ?? false;
1723
+ });
1724
+ return initial;
1725
+ }
1726
+ );
1727
+ const [serverRows, setServerRows] = (0, import_react5.useState)([]);
1728
+ const [serverTotal, setServerTotal] = (0, import_react5.useState)(0);
1729
+ const [serverTotalPages, setServerTotalPages] = (0, import_react5.useState)(1);
1730
+ const [colState, setColState] = (0, import_react5.useState)(
1796
1731
  () => columns.map((c, i) => ({
1797
1732
  ...c,
1798
1733
  visible: c.visible !== false,
1799
1734
  order: i
1800
1735
  }))
1801
1736
  );
1802
- (0, import_react7.useEffect)(() => {
1737
+ (0, import_react5.useEffect)(() => {
1803
1738
  const t = setTimeout(() => {
1804
1739
  setDebouncedSearch(search);
1805
1740
  setPage(1);
1806
1741
  }, 400);
1807
1742
  return () => clearTimeout(t);
1808
1743
  }, [search]);
1809
- const filteredData = (0, import_react7.useMemo)(() => {
1744
+ const filteredData = (0, import_react5.useMemo)(() => {
1810
1745
  if (serverMode) return [];
1811
1746
  let filtered = [...data];
1812
1747
  if (debouncedSearch) {
@@ -1829,7 +1764,7 @@ function useGridCore({
1829
1764
  }
1830
1765
  return filtered;
1831
1766
  }, [data, debouncedSearch, sortBy, serverMode]);
1832
- const pagedClientRows = (0, import_react7.useMemo)(() => {
1767
+ const pagedClientRows = (0, import_react5.useMemo)(() => {
1833
1768
  if (serverMode) return [];
1834
1769
  const start = (page - 1) * pageSize;
1835
1770
  return filteredData.slice(start, start + pageSize);
@@ -1837,7 +1772,7 @@ function useGridCore({
1837
1772
  const rows = serverMode ? serverRows : pagedClientRows;
1838
1773
  const totalRows = serverMode ? serverTotal : filteredData.length;
1839
1774
  const totalPages = serverMode ? serverTotalPages : Math.max(1, Math.ceil(totalRows / pageSize));
1840
- const toggleSelect = (0, import_react7.useCallback)((id) => {
1775
+ const toggleSelect = (0, import_react5.useCallback)((id) => {
1841
1776
  const key = String(id);
1842
1777
  setSelected((prev) => {
1843
1778
  const s = new Set(prev);
@@ -1845,7 +1780,7 @@ function useGridCore({
1845
1780
  return s;
1846
1781
  });
1847
1782
  }, []);
1848
- const selectAllOnPage = (0, import_react7.useCallback)(
1783
+ const selectAllOnPage = (0, import_react5.useCallback)(
1849
1784
  (rows2) => {
1850
1785
  setSelected((prev) => {
1851
1786
  const s = new Set(prev);
@@ -1855,7 +1790,7 @@ function useGridCore({
1855
1790
  },
1856
1791
  [rowKey]
1857
1792
  );
1858
- const deselectAllOnPage = (0, import_react7.useCallback)(
1793
+ const deselectAllOnPage = (0, import_react5.useCallback)(
1859
1794
  (rows2) => {
1860
1795
  setSelected((prev) => {
1861
1796
  const s = new Set(prev);
@@ -1865,13 +1800,13 @@ function useGridCore({
1865
1800
  },
1866
1801
  [rowKey]
1867
1802
  );
1868
- const changeSort = (0, import_react7.useCallback)((key) => {
1803
+ const changeSort = (0, import_react5.useCallback)((key) => {
1869
1804
  setSortBy(
1870
1805
  (p) => p.key !== key ? { key, dir: "asc" } : p.dir === "asc" ? { key, dir: "desc" } : { key: null, dir: "asc" }
1871
1806
  );
1872
1807
  setPage(1);
1873
1808
  }, []);
1874
- const setColumnAdvanceFilter = (0, import_react7.useCallback)(
1809
+ const setColumnAdvanceFilter = (0, import_react5.useCallback)(
1875
1810
  (column, filter) => {
1876
1811
  setAdvanceFilters((prev) => {
1877
1812
  if (!filter) {
@@ -1885,11 +1820,27 @@ function useGridCore({
1885
1820
  },
1886
1821
  []
1887
1822
  );
1888
- const visibleColumns = (0, import_react7.useMemo)(
1823
+ const toggleSwitchFilter = (0, import_react5.useCallback)((key) => {
1824
+ setSwitchFilters((prev) => ({
1825
+ ...prev,
1826
+ [key]: !prev[key]
1827
+ }));
1828
+ setPage(1);
1829
+ }, []);
1830
+ const switchQuery = (0, import_react5.useMemo)(() => {
1831
+ if (!switchFiltersConfig) return {};
1832
+ const query = {};
1833
+ switchFiltersConfig.forEach((filter) => {
1834
+ const state = switchFilters[filter.key];
1835
+ query[filter.queryParam] = state ? filter.trueValue ?? true : filter.falseValue ?? false;
1836
+ });
1837
+ return query;
1838
+ }, [switchFilters, switchFiltersConfig]);
1839
+ const visibleColumns = (0, import_react5.useMemo)(
1889
1840
  () => colState.filter((c) => c.visible).sort((a, b) => a.order - b.order),
1890
1841
  [colState]
1891
1842
  );
1892
- const updateColumn = (0, import_react7.useCallback)(
1843
+ const updateColumn = (0, import_react5.useCallback)(
1893
1844
  (key, patch) => {
1894
1845
  setColState(
1895
1846
  (prev) => prev.map((c) => c.key === key ? { ...c, ...patch } : c)
@@ -1897,7 +1848,7 @@ function useGridCore({
1897
1848
  },
1898
1849
  []
1899
1850
  );
1900
- const toggleExpand = (0, import_react7.useCallback)((id) => {
1851
+ const toggleExpand = (0, import_react5.useCallback)((id) => {
1901
1852
  setExpanded((prev) => {
1902
1853
  const s = new Set(prev);
1903
1854
  s.has(id) ? s.delete(id) : s.add(id);
@@ -1933,6 +1884,8 @@ function useGridCore({
1933
1884
  // expand
1934
1885
  expanded,
1935
1886
  toggleExpand,
1887
+ // New Record Button
1888
+ addNewRecord,
1936
1889
  // columns
1937
1890
  colState,
1938
1891
  visibleColumns,
@@ -1950,7 +1903,13 @@ function useGridCore({
1950
1903
  rowKey,
1951
1904
  // empty state
1952
1905
  emptyState,
1953
- setEmptyState
1906
+ setEmptyState,
1907
+ // switch filters
1908
+ switchFilters,
1909
+ toggleSwitchFilter,
1910
+ setSwitchFilters,
1911
+ switchQuery,
1912
+ switchFiltersConfig
1954
1913
  };
1955
1914
  }
1956
1915
  // Annotate the CommonJS export names for ESM import in node: