@dappworks/kit 0.4.164 → 0.4.166

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.
@@ -4,8 +4,8 @@ import { _ } from './chunk-K7LFG5BA.mjs';
4
4
  import { cn } from './chunk-WYGQ3Y4R.mjs';
5
5
  import { __objRest, __spreadValues, __spreadProps } from './chunk-6F7H4PAA.mjs';
6
6
  import * as React2 from 'react';
7
- import React2__default, { useState, useMemo, useEffect, useRef } from 'react';
8
- import { Card, Divider, Pagination, Spinner } from '@nextui-org/react';
7
+ import React2__default, { useRef, useEffect, useState, useMemo } from 'react';
8
+ import { Pagination, Spinner, Card, Divider } from '@nextui-org/react';
9
9
  import { ChevronRight, Check, Circle, ChevronDown, ChevronUp, ChevronsUpDown, ChevronLeft } from 'lucide-react';
10
10
  import { observer } from 'mobx-react-lite';
11
11
  import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
@@ -133,31 +133,22 @@ var DropdownMenuSeparator = React2.forwardRef((_a, ref) => {
133
133
  );
134
134
  });
135
135
  DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;
136
- var JSONTable = observer((props) => {
136
+ var JSONTable = (props) => {
137
137
  const {
138
138
  className,
139
- classNames = {},
139
+ classNames,
140
140
  dataSource = [],
141
141
  columnOptions,
142
142
  headerKeys,
143
143
  isServerPaging,
144
- pagination = new PaginationState({
145
- page: 1,
146
- limit: 8
147
- }),
148
- nextuiPaginationProps = {},
144
+ pagination,
145
+ nextuiPaginationProps,
149
146
  showPagination = true,
150
147
  rowKey,
151
148
  onRowClick,
152
149
  rowCss,
153
150
  asCard = false,
154
- cardOptions = {
155
- boxClassName: "",
156
- cardClassName: "",
157
- itemClassName: "",
158
- showDivider: true,
159
- dividerClassName: ""
160
- },
151
+ cardOptions,
161
152
  autoScrollToTop = false,
162
153
  emptyContent,
163
154
  isLoading = false,
@@ -182,7 +173,7 @@ var JSONTable = observer((props) => {
182
173
  }
183
174
  const sortableColumnsDefaultValue2 = {};
184
175
  let columns2 = keys.map((key) => {
185
- var _a, _b, _c;
176
+ var _a, _b, _c, _d;
186
177
  const sortable = (_a = columnOptions == null ? void 0 : columnOptions[key]) == null ? void 0 : _a.sortable;
187
178
  if (sortable) {
188
179
  sortableColumnsDefaultValue2[key] = "none";
@@ -190,7 +181,8 @@ var JSONTable = observer((props) => {
190
181
  return {
191
182
  key,
192
183
  label: ((_b = columnOptions == null ? void 0 : columnOptions[key]) == null ? void 0 : _b.label) || (key === "$actions" ? "" : key),
193
- render: (_c = columnOptions == null ? void 0 : columnOptions[key]) == null ? void 0 : _c.render
184
+ width: ((_c = columnOptions == null ? void 0 : columnOptions[key]) == null ? void 0 : _c.width) || 160,
185
+ render: (_d = columnOptions == null ? void 0 : columnOptions[key]) == null ? void 0 : _d.render
194
186
  };
195
187
  });
196
188
  if (!headerKeys && columnOptions) {
@@ -222,6 +214,7 @@ var JSONTable = observer((props) => {
222
214
  return {
223
215
  key: k,
224
216
  label: (option == null ? void 0 : option.label) || k,
217
+ width: (option == null ? void 0 : option.width) || 160,
225
218
  render: option == null ? void 0 : option.render
226
219
  };
227
220
  })
@@ -234,10 +227,18 @@ var JSONTable = observer((props) => {
234
227
  if (collapsedHandlerPosition === "right") {
235
228
  columns2.push({
236
229
  key: "$collapsedHandler",
237
- label: ""
230
+ label: "",
231
+ width: 50
238
232
  });
239
233
  } else {
240
- columns2 = [{ key: "$collapsedHandler", label: "" }, ...columns2];
234
+ columns2 = [
235
+ {
236
+ key: "$collapsedHandler",
237
+ label: "",
238
+ width: 50
239
+ },
240
+ ...columns2
241
+ ];
241
242
  }
242
243
  }
243
244
  return {
@@ -252,20 +253,14 @@ var JSONTable = observer((props) => {
252
253
  }, [sortableColumnsDefaultValue]);
253
254
  useEffect(() => {
254
255
  setSortedData(dataSource);
255
- if (!isServerPaging) {
256
- pagination.setData({
257
- total: dataSource.length
258
- });
259
- }
260
256
  }, [dataSource]);
261
- const data = isServerPaging || !showPagination || (virtualizedOptions == null ? void 0 : virtualizedOptions.isVirtualized) || asCard ? sortedData : sortedData.slice(pagination.offset, pagination.offset + pagination.limit);
262
257
  if (asCard) {
263
258
  return /* @__PURE__ */ React2__default.createElement(
264
259
  CardUI,
265
260
  {
266
261
  className,
267
262
  rowKey,
268
- data,
263
+ sortedData,
269
264
  columns,
270
265
  cardOptions,
271
266
  onRowClick,
@@ -284,7 +279,7 @@ var JSONTable = observer((props) => {
284
279
  {
285
280
  className,
286
281
  rowKey,
287
- data,
282
+ sortedData,
288
283
  dataSource,
289
284
  columns,
290
285
  columnOptions,
@@ -307,14 +302,14 @@ var JSONTable = observer((props) => {
307
302
  className,
308
303
  classNames,
309
304
  isHeaderSticky,
305
+ sortedData,
306
+ dataSource,
310
307
  columns,
311
308
  columnOptions,
312
309
  sortableColumnsMap,
313
310
  sortingUIOptions,
314
311
  setSortableColumnsMap,
315
312
  setSortedData,
316
- data,
317
- dataSource,
318
313
  isLoading,
319
314
  loadingContent,
320
315
  loadingOptions,
@@ -325,13 +320,14 @@ var JSONTable = observer((props) => {
325
320
  collapsedTableConfig,
326
321
  collapsedTables,
327
322
  rowKey,
323
+ isServerPaging,
328
324
  showPagination,
329
325
  pagination,
330
326
  nextuiPaginationProps,
331
327
  autoScrollToTop
332
328
  }
333
329
  );
334
- });
330
+ };
335
331
  function renderFieldValue(v) {
336
332
  if (typeof v == "string" || typeof v == "number") {
337
333
  return v;
@@ -476,7 +472,7 @@ function SortingComponent({
476
472
  }
477
473
  function CardUI({
478
474
  className,
479
- data,
475
+ sortedData,
480
476
  columns,
481
477
  rowKey,
482
478
  cardOptions,
@@ -489,7 +485,7 @@ function CardUI({
489
485
  }) {
490
486
  const fetchedCountRef = useRef(-1);
491
487
  const elements = useMemo(
492
- () => data.map((item, index) => {
488
+ () => sortedData.map((item, index) => {
493
489
  return /* @__PURE__ */ React2__default.createElement(
494
490
  Card,
495
491
  {
@@ -505,14 +501,14 @@ function CardUI({
505
501
  })
506
502
  );
507
503
  }),
508
- [data]
504
+ [sortedData]
509
505
  );
510
- return /* @__PURE__ */ React2__default.createElement("div", { className }, data.length > 0 ? /* @__PURE__ */ React2__default.createElement(
506
+ return /* @__PURE__ */ React2__default.createElement("div", { className }, sortedData.length > 0 ? /* @__PURE__ */ React2__default.createElement(
511
507
  VList,
512
508
  {
513
509
  style: { height: (virtualizedOptions == null ? void 0 : virtualizedOptions.vListHeight) || 400 },
514
510
  onRangeChange: async (_2, endIndex) => {
515
- const count = data.length;
511
+ const count = sortedData.length;
516
512
  if (endIndex + 1 >= count && fetchedCountRef.current < count) {
517
513
  fetchedCountRef.current = count;
518
514
  if (virtualizedOptions == null ? void 0 : virtualizedOptions.fetchData) {
@@ -527,7 +523,7 @@ function CardUI({
527
523
  }
528
524
  function VirtualizedListUI({
529
525
  className,
530
- data,
526
+ sortedData,
531
527
  dataSource,
532
528
  columns,
533
529
  columnOptions,
@@ -547,7 +543,7 @@ function VirtualizedListUI({
547
543
  var _a;
548
544
  const fetchedCountRef = useRef(-1);
549
545
  const elements = useMemo(
550
- () => data.map((item, index) => {
546
+ () => sortedData.map((item, index) => {
551
547
  var _a2;
552
548
  return /* @__PURE__ */ React2__default.createElement(
553
549
  "div",
@@ -564,44 +560,57 @@ function VirtualizedListUI({
564
560
  "div",
565
561
  {
566
562
  key: column.key,
567
- className: cn("w-full py-2 px-3 text-xs", (_a3 = virtualizedOptions == null ? void 0 : virtualizedOptions.classNames) == null ? void 0 : _a3.rowItem)
563
+ className: cn("flex-grow py-2 px-4 text-xs whitespace-nowrap overflow-auto", (_a3 = virtualizedOptions == null ? void 0 : virtualizedOptions.classNames) == null ? void 0 : _a3.rowCell),
564
+ style: {
565
+ minWidth: column.width
566
+ }
568
567
  },
569
568
  column.render ? column.render(item) : renderFieldValue(item[column.key])
570
569
  );
571
570
  })
572
571
  );
573
572
  }),
574
- [data]
573
+ [sortedData]
575
574
  );
576
- return /* @__PURE__ */ React2__default.createElement("div", { className }, /* @__PURE__ */ React2__default.createElement("div", { className: cn("w-full flex items-center rounded-lg bg-default-100", (_a = virtualizedOptions == null ? void 0 : virtualizedOptions.classNames) == null ? void 0 : _a.header) }, columns.map((column) => {
575
+ return /* @__PURE__ */ React2__default.createElement("div", { className: cn("w-full overflow-auto", className) }, /* @__PURE__ */ React2__default.createElement("div", { className: "inline-block" }, /* @__PURE__ */ React2__default.createElement("div", { className: cn("flex items-center rounded-lg bg-default-100 mb-2", (_a = virtualizedOptions == null ? void 0 : virtualizedOptions.classNames) == null ? void 0 : _a.header) }, columns.map((column) => {
577
576
  var _a2;
578
- return /* @__PURE__ */ React2__default.createElement("div", { key: column.key, className: cn("w-full h-10 px-3 flex items-center text-xs font-semibold whitespace-nowrap", (_a2 = virtualizedOptions == null ? void 0 : virtualizedOptions.classNames) == null ? void 0 : _a2.column) }, /* @__PURE__ */ React2__default.createElement("span", null, column.label), !!sortableColumnsMap[column.key] && /* @__PURE__ */ React2__default.createElement(
579
- SortingComponent,
577
+ return /* @__PURE__ */ React2__default.createElement(
578
+ "div",
580
579
  {
581
- sortingUIOptions,
582
- columnOptions,
583
- sortableColumnsMap,
584
- item: column,
585
- onSort: ({ type, key, sortKey }) => {
586
- const { sortableColumns, sortedData } = sortData({
587
- type,
588
- key,
589
- sortKey,
590
- sortableColumnsMap,
591
- dataSource
592
- });
593
- setSortableColumnsMap(sortableColumns);
594
- setSortedData(sortedData);
580
+ key: column.key,
581
+ className: cn("flex-grow py-2 px-4 flex items-center text-xs font-semibold whitespace-nowrap", (_a2 = virtualizedOptions == null ? void 0 : virtualizedOptions.classNames) == null ? void 0 : _a2.headerCell),
582
+ style: {
583
+ minWidth: column.width
595
584
  }
596
- }
597
- ));
598
- })), data.length > 0 ? /* @__PURE__ */ React2__default.createElement(
585
+ },
586
+ /* @__PURE__ */ React2__default.createElement("span", null, column.label),
587
+ !!sortableColumnsMap[column.key] && /* @__PURE__ */ React2__default.createElement(
588
+ SortingComponent,
589
+ {
590
+ sortingUIOptions,
591
+ columnOptions,
592
+ sortableColumnsMap,
593
+ item: column,
594
+ onSort: ({ type, key, sortKey }) => {
595
+ const { sortableColumns, sortedData: sortedData2 } = sortData({
596
+ type,
597
+ key,
598
+ sortKey,
599
+ sortableColumnsMap,
600
+ dataSource
601
+ });
602
+ setSortableColumnsMap(sortableColumns);
603
+ setSortedData(sortedData2);
604
+ }
605
+ }
606
+ )
607
+ );
608
+ })), sortedData.length > 0 ? /* @__PURE__ */ React2__default.createElement(
599
609
  VList,
600
610
  {
601
- className: "mt-2 w-full",
602
611
  style: { height: (virtualizedOptions == null ? void 0 : virtualizedOptions.vListHeight) || 200 },
603
612
  onRangeChange: async (_2, endIndex) => {
604
- const count = data.length;
613
+ const count = sortedData.length;
605
614
  if (endIndex + 1 >= count && fetchedCountRef.current < count) {
606
615
  fetchedCountRef.current = count;
607
616
  if (virtualizedOptions == null ? void 0 : virtualizedOptions.fetchData) {
@@ -612,20 +621,20 @@ function VirtualizedListUI({
612
621
  },
613
622
  elements,
614
623
  isLoading ? loadingContent || DefaultLoading({ loadingOptions }) : null
615
- ) : emptyContent != null ? emptyContent : /* @__PURE__ */ React2__default.createElement(DefaultEmptyContent, null));
624
+ ) : emptyContent != null ? emptyContent : /* @__PURE__ */ React2__default.createElement(DefaultEmptyContent, null)));
616
625
  }
617
- function TableUI({
626
+ var TableUI = observer(({
618
627
  className,
619
- classNames,
628
+ classNames = {},
620
629
  isHeaderSticky,
630
+ sortedData,
631
+ dataSource,
621
632
  columns,
622
633
  columnOptions,
623
634
  sortableColumnsMap,
624
635
  sortingUIOptions,
625
636
  setSortableColumnsMap,
626
637
  setSortedData,
627
- data,
628
- dataSource,
629
638
  isLoading,
630
639
  loadingContent,
631
640
  loadingOptions,
@@ -636,17 +645,32 @@ function TableUI({
636
645
  collapsedTableConfig,
637
646
  collapsedTables,
638
647
  rowKey,
648
+ isServerPaging,
639
649
  showPagination,
640
- pagination,
641
- nextuiPaginationProps,
650
+ pagination = new PaginationState({
651
+ page: 1,
652
+ limit: 10
653
+ }),
654
+ nextuiPaginationProps = {},
642
655
  autoScrollToTop
643
- }) {
656
+ }) => {
644
657
  const tableBoxRef = useRef(null);
658
+ useEffect(() => {
659
+ if (!isServerPaging) {
660
+ pagination.setData({
661
+ total: dataSource.length
662
+ });
663
+ }
664
+ }, [dataSource]);
665
+ const data = isServerPaging || !showPagination ? sortedData : sortedData.slice(pagination.offset, pagination.offset + pagination.limit);
645
666
  return /* @__PURE__ */ React2__default.createElement(React2__default.Fragment, null, /* @__PURE__ */ React2__default.createElement("div", { className: cn("relative w-full", className), ref: tableBoxRef }, /* @__PURE__ */ React2__default.createElement("table", { className: cn("w-full h-auto table-auto", classNames.table) }, /* @__PURE__ */ React2__default.createElement("thead", { className: cn(classNames.thead, { "sticky top-0 z-30 [&>tr]:first:shadow-small [&>tr]:first:rounded-lg": isHeaderSticky }) }, /* @__PURE__ */ React2__default.createElement("tr", { className: classNames.tr }, columns.map((item) => /* @__PURE__ */ React2__default.createElement(
646
667
  "th",
647
668
  {
648
669
  key: item.key,
649
- className: cn("px-3 h-10 text-xs font-semibold whitespace-nowrap bg-default-100 first:rounded-l-lg last:rounded-r-lg outline-none", classNames.th)
670
+ className: cn("px-3 h-10 text-xs font-semibold whitespace-nowrap bg-default-100 first:rounded-l-lg last:rounded-r-lg outline-none", classNames.th),
671
+ style: {
672
+ minWidth: item.width
673
+ }
650
674
  },
651
675
  /* @__PURE__ */ React2__default.createElement("div", { className: "flex items-center" }, /* @__PURE__ */ React2__default.createElement("span", null, item.label), !!sortableColumnsMap[item.key] && /* @__PURE__ */ React2__default.createElement(
652
676
  SortingComponent,
@@ -656,7 +680,7 @@ function TableUI({
656
680
  sortableColumnsMap,
657
681
  item,
658
682
  onSort: ({ type, key, sortKey }) => {
659
- const { sortableColumns, sortedData } = sortData({
683
+ const { sortableColumns, sortedData: sortedData2 } = sortData({
660
684
  type,
661
685
  key,
662
686
  sortKey,
@@ -664,7 +688,7 @@ function TableUI({
664
688
  dataSource
665
689
  });
666
690
  setSortableColumnsMap(sortableColumns);
667
- setSortedData(sortedData);
691
+ setSortedData(sortedData2);
668
692
  }
669
693
  }
670
694
  ))
@@ -703,7 +727,10 @@ function TableUI({
703
727
  "td",
704
728
  {
705
729
  key: column.key,
706
- className: cn("py-2 px-3 text-xs", classNames.td)
730
+ className: cn("py-2 px-3 text-xs", classNames.td),
731
+ style: {
732
+ minWidth: column.width
733
+ }
707
734
  },
708
735
  column.render ? column.render(item) : renderFieldValue(item[column.key])
709
736
  );
@@ -738,7 +765,7 @@ function TableUI({
738
765
  }
739
766
  }, nextuiPaginationProps)
740
767
  )));
741
- }
768
+ });
742
769
  function DefaultLoading({ loadingOptions }) {
743
770
  const type = (loadingOptions == null ? void 0 : loadingOptions.type) || "skeleton";
744
771
  const skeletonOptions = loadingOptions == null ? void 0 : loadingOptions.skeleton;
@@ -790,19 +817,38 @@ function CollapseBodyRow({
790
817
  },
791
818
  columns.map((column) => {
792
819
  if (column.key === "$collapsedHandler") {
793
- return /* @__PURE__ */ React2__default.createElement("td", { className: classNames == null ? void 0 : classNames.td }, /* @__PURE__ */ React2__default.createElement(
794
- "div",
820
+ return /* @__PURE__ */ React2__default.createElement(
821
+ "td",
795
822
  {
796
- className: cn("w-6 h-6 flex items-center justify-center rounded-sm hover:bg-[#f3f3f4] dark:hover:bg-[#1e1e1e]", collapsedTableConfig == null ? void 0 : collapsedTableConfig.collapsedHandlerBoxCss),
797
- onClick: (e) => {
798
- e.stopPropagation();
799
- setIsOpen((v) => !v);
823
+ className: classNames == null ? void 0 : classNames.td,
824
+ style: {
825
+ minWidth: column.width
800
826
  }
801
827
  },
802
- isOpen ? OpenedIcon : ClosedIcon
803
- ));
828
+ /* @__PURE__ */ React2__default.createElement(
829
+ "div",
830
+ {
831
+ className: cn("w-6 h-6 flex items-center justify-center rounded-sm hover:bg-[#f3f3f4] dark:hover:bg-[#1e1e1e]", collapsedTableConfig == null ? void 0 : collapsedTableConfig.collapsedHandlerBoxCss),
832
+ onClick: (e) => {
833
+ e.stopPropagation();
834
+ setIsOpen((v) => !v);
835
+ }
836
+ },
837
+ isOpen ? OpenedIcon : ClosedIcon
838
+ )
839
+ );
804
840
  }
805
- return /* @__PURE__ */ React2__default.createElement("td", { key: column.key, className: cn("py-2 px-3 text-xs", classNames == null ? void 0 : classNames.td) }, column.render ? column.render(item) : renderFieldValue(item[column.key]));
841
+ return /* @__PURE__ */ React2__default.createElement(
842
+ "td",
843
+ {
844
+ key: column.key,
845
+ className: cn("py-2 px-3 text-xs", classNames == null ? void 0 : classNames.td),
846
+ style: {
847
+ minWidth: column.width
848
+ }
849
+ },
850
+ column.render ? column.render(item) : renderFieldValue(item[column.key])
851
+ );
806
852
  })
807
853
  ), /* @__PURE__ */ React2__default.createElement("tr", { className: cn(classNames == null ? void 0 : classNames.tr, isOpen ? "table-row" : "hidden") }, /* @__PURE__ */ React2__default.createElement("td", { colSpan: columns.length, className: cn("py-2 px-3 text-xs", classNames == null ? void 0 : classNames.td) }, collapsedTables.map((ex) => {
808
854
  var _a, _b, _c, _d, _e, _f, _g, _h;
@@ -814,7 +860,10 @@ function CollapseBodyRow({
814
860
  "th",
815
861
  {
816
862
  key: exC.key,
817
- className: cn("px-3 h-10 text-xs text-left font-semibold bg-default-100 first:rounded-l-lg last:rounded-r-lg outline-none", (_a2 = collapsedTableConfig == null ? void 0 : collapsedTableConfig.classNames) == null ? void 0 : _a2.th)
863
+ className: cn("px-3 h-10 text-xs text-left font-semibold bg-default-100 first:rounded-l-lg last:rounded-r-lg outline-none", (_a2 = collapsedTableConfig == null ? void 0 : collapsedTableConfig.classNames) == null ? void 0 : _a2.th),
864
+ style: {
865
+ minWidth: exC.width
866
+ }
818
867
  },
819
868
  exC.label
820
869
  );
@@ -844,7 +893,10 @@ function CollapseBodyRow({
844
893
  "td",
845
894
  {
846
895
  key: exC.key,
847
- className: cn("py-2 px-3 text-xs", (_a3 = collapsedTableConfig == null ? void 0 : collapsedTableConfig.classNames) == null ? void 0 : _a3.td)
896
+ className: cn("py-2 px-3 text-xs", (_a3 = collapsedTableConfig == null ? void 0 : collapsedTableConfig.classNames) == null ? void 0 : _a3.td),
897
+ style: {
898
+ minWidth: exC.width
899
+ }
848
900
  },
849
901
  exC.render ? exC.render(__spreadProps(__spreadValues({}, exItem), {
850
902
  $parent: item
@@ -865,4 +917,4 @@ function CollapseBodyRow({
865
917
 
866
918
  export { JSONTable };
867
919
  //# sourceMappingURL=out.js.map
868
- //# sourceMappingURL=chunk-XSHLTPP2.mjs.map
920
+ //# sourceMappingURL=chunk-ZQ5GQE2S.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../components/JSONTable/index.tsx","../components/ui/dropdown-menu.tsx"],"names":["React","ChevronRight","sortableColumnsDefaultValue","columns","collapsedTables","keys","showCollapsedTables","_a","_","sortedData"],"mappings":"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","sourcesContent":["import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport {\n Card,\n Divider,\n Pagination as NextuiPagination,\n PaginationProps,\n Spinner,\n SpinnerProps,\n} from '@nextui-org/react';\nimport { ChevronDown, ChevronLeft, ChevronRight, ChevronUp, ChevronsUpDown } from \"lucide-react\";\nimport { observer } from \"mobx-react-lite\";\nimport { PaginationState } from \"../../store/standard/PaginationState\";\nimport { SkeletonBox } from \"../Common/SkeletonBox\";\nimport { _ } from \"../../lib/lodash\";\nimport { cn } from \"../../lib/utils\";\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '../ui/dropdown-menu';\nimport { VList } from 'virtua';\n\nexport type TableClassNames = {\n table?: string;\n thead?: string;\n tr?: string;\n th?: string;\n tbody?: string;\n td?: string;\n}\n\nexport type HeaderKeys<T extends Record<string, any>> = Array<keyof T | '$actions'>;\n\nexport type ColumnConfig<T> = {\n label?: React.ReactNode;\n width?: number;\n hidden?: boolean;\n sortable?: boolean;\n sortKey?: string;\n order?: number;\n render?: (item: T) => any;\n}\n\nexport type ColumnOptions<T> = {\n [key in keyof T]?: ColumnConfig<T>;\n} & {\n $actions?: ColumnConfig<T>;\n};\n\ntype Column<T> = {\n key: string;\n label: React.ReactNode;\n width: number;\n render?: (item: T) => any;\n};\n\ntype CollapsedTable<U> = {\n key: string;\n columns: Column<U>[];\n};\n\nexport type CardOptions = {\n cardClassName?: string;\n itemClassName?: string;\n labelClassName?: string;\n valueClassName?: string;\n showDivider?: boolean;\n dividerClassName?: string;\n};\n\nexport type LoadingOptions = {\n type?: 'skeleton' | 'spinner';\n skeleton?: {\n boxClassName?: string;\n skeletonClassName?: string;\n line?: number;\n };\n spinner?: {\n boxClassName?: string;\n spinnerProps?: SpinnerProps;\n text?: string;\n textClassName?: string;\n };\n};\n\nexport type SortingUIOptions = {\n showDropdown?: boolean;\n dropdownTriggerBtnClassName?: string;\n dropdownContentClassName?: string;\n dropdownItemClassName?: string;\n titles?: {\n asc?: string;\n desc?: string;\n none?: string;\n };\n};\n\nexport type CollapsedTableConfig<T> = {\n classNames?: TableClassNames;\n options: {\n key: keyof T;\n headerKeys: string[];\n columnOptions: ColumnOptions<any>;\n }[];\n collapsedHandlerPosition?: 'left' | 'right';\n collapsedHandlerBoxCss?: string;\n openedIcon?: React.ReactNode;\n closedIcon?: React.ReactNode;\n onRowClick?: (item: any) => void;\n rowCss?: string | ((item: any) => string | undefined);\n emptyContent?: React.ReactNode;\n}\n\nexport type VirtualizedOptions = {\n isVirtualized?: boolean;\n vListHeight?: number;\n classNames?: {\n header?: string;\n headerCell?: string;\n row?: string;\n rowCell?: string;\n },\n fetchData?: () => Promise<void>;\n}\n\nexport interface JSONTableProps<T extends Record<string, any>> {\n className?: string;\n classNames?: TableClassNames;\n rowKey?: string;\n dataSource: T[];\n headerKeys?: HeaderKeys<T>;\n columnOptions?: ColumnOptions<T>;\n isServerPaging?: boolean;\n pagination?: PaginationState;\n nextuiPaginationProps?: Partial<PaginationProps>;\n showPagination?: boolean;\n onRowClick?: (item: T) => void;\n rowCss?: string | ((item: T) => string | undefined);\n asCard?: boolean;\n cardOptions?: CardOptions;\n autoScrollToTop?: boolean;\n emptyContent?: React.ReactNode;\n isLoading?: boolean;\n loadingOptions?: LoadingOptions;\n loadingContent?: React.ReactNode;\n isHeaderSticky?: boolean;\n sortingUIOptions?: SortingUIOptions;\n collapsedTableConfig?: CollapsedTableConfig<T>;\n virtualizedOptions?: VirtualizedOptions;\n}\n\nexport const JSONTable = (<T extends Record<string, any>>(props: JSONTableProps<T>) => {\n const {\n className,\n classNames,\n dataSource = [],\n columnOptions,\n headerKeys,\n isServerPaging,\n pagination,\n nextuiPaginationProps,\n showPagination = true,\n rowKey,\n onRowClick,\n rowCss,\n asCard = false,\n cardOptions,\n autoScrollToTop = false,\n emptyContent,\n isLoading = false,\n loadingOptions,\n loadingContent,\n isHeaderSticky = false,\n sortingUIOptions,\n collapsedTableConfig,\n virtualizedOptions\n } = props;\n const [sortableColumnsMap, setSortableColumnsMap] = useState<{ [k: string]: 'asc' | 'desc' | 'none' }>({});\n const [sortedData, setSortedData] = useState<T[]>(dataSource);\n\n const { columns, sortableColumnsDefaultValue, showCollapsedTables, collapsedTables } = useMemo(() => {\n const firstData = dataSource[0];\n\n const allKeys = firstData ? Object.keys(firstData) : [];\n const keys = headerKeys ? headerKeys : columnOptions ? allKeys.filter((key) => !columnOptions[key]?.hidden) : allKeys;\n if (!keys.includes('$actions') && columnOptions && columnOptions['$actions']) {\n keys.push('$actions');\n }\n\n const sortableColumnsDefaultValue: { [k: string]: 'asc' | 'desc' | 'none' } = {};\n\n let columns: Column<T>[] = keys.map((key: string) => {\n const sortable = columnOptions?.[key]?.sortable;\n if (sortable) {\n sortableColumnsDefaultValue[key] = 'none';\n }\n return {\n key,\n label: columnOptions?.[key]?.label || (key === '$actions' ? '' : key),\n width: columnOptions?.[key]?.width || 160,\n render: columnOptions?.[key]?.render,\n };\n });\n\n if (!headerKeys && columnOptions) {\n columns.sort((a, b) => {\n const aOrder = columnOptions[a.key]?.order || 0;\n const bOrder = columnOptions[b.key]?.order || 0;\n return bOrder - aOrder;\n });\n }\n\n let collapsedTables: CollapsedTable<any>[] = [];\n if (firstData && collapsedTableConfig?.options) {\n const collapsedTableOptions = collapsedTableConfig.options;\n collapsedTables = collapsedTableOptions\n .filter((item) => {\n return Array.isArray(firstData[item.key]);\n })\n .map((item) => {\n const index = columns.findIndex((c) => c.key === item.key);\n if (index > -1) {\n columns.splice(index, 1);\n }\n const keys = item.headerKeys || [];\n if (!keys.includes('$actions') && item.columnOptions && item.columnOptions['$actions']) {\n keys.push('$actions');\n }\n return {\n key: item.key as string,\n columns: keys.map((k) => {\n const option = item.columnOptions[k];\n return {\n key: k,\n label: option?.label || k,\n width: option?.width || 160,\n render: option?.render,\n };\n }),\n };\n })\n }\n\n const showCollapsedTables = collapsedTables.length > 0;\n if (showCollapsedTables && !virtualizedOptions?.isVirtualized) {\n const collapsedHandlerPosition = collapsedTableConfig?.collapsedHandlerPosition || 'right';\n if (collapsedHandlerPosition === 'right') {\n columns.push({\n key: '$collapsedHandler',\n label: '',\n width: 50,\n })\n } else {\n columns = [\n {\n key: '$collapsedHandler',\n label: '',\n width: 50,\n },\n ...columns\n ];\n }\n }\n\n return {\n columns,\n sortableColumnsDefaultValue,\n showCollapsedTables,\n collapsedTables,\n };\n }, [dataSource, columnOptions]);\n\n useEffect(() => {\n setSortableColumnsMap(sortableColumnsDefaultValue);\n }, [sortableColumnsDefaultValue]);\n\n useEffect(() => {\n setSortedData(dataSource);\n }, [dataSource]);\n\n if (asCard) {\n return (\n <CardUI\n className={className}\n rowKey={rowKey}\n sortedData={sortedData}\n columns={columns}\n cardOptions={cardOptions}\n onRowClick={onRowClick}\n autoScrollToTop={autoScrollToTop}\n emptyContent={emptyContent}\n isLoading={isLoading}\n loadingOptions={loadingOptions}\n loadingContent={loadingContent}\n virtualizedOptions={virtualizedOptions}\n />\n );\n }\n\n if (virtualizedOptions?.isVirtualized) {\n return (\n <VirtualizedListUI\n className={className}\n rowKey={rowKey}\n sortedData={sortedData}\n dataSource={dataSource}\n columns={columns}\n columnOptions={columnOptions}\n sortableColumnsMap={sortableColumnsMap}\n sortingUIOptions={sortingUIOptions}\n setSortableColumnsMap={setSortableColumnsMap}\n setSortedData={setSortedData}\n onRowClick={onRowClick}\n emptyContent={emptyContent}\n isLoading={isLoading}\n loadingOptions={loadingOptions}\n loadingContent={loadingContent}\n virtualizedOptions={virtualizedOptions}\n />\n )\n }\n\n return (\n <TableUI\n className={className}\n classNames={classNames}\n isHeaderSticky={isHeaderSticky}\n sortedData={sortedData}\n dataSource={dataSource}\n columns={columns}\n columnOptions={columnOptions}\n sortableColumnsMap={sortableColumnsMap}\n sortingUIOptions={sortingUIOptions}\n setSortableColumnsMap={setSortableColumnsMap}\n setSortedData={setSortedData}\n isLoading={isLoading}\n loadingContent={loadingContent}\n loadingOptions={loadingOptions}\n emptyContent={emptyContent}\n rowCss={rowCss}\n onRowClick={onRowClick}\n showCollapsedTables={showCollapsedTables}\n collapsedTableConfig={collapsedTableConfig}\n collapsedTables={collapsedTables}\n rowKey={rowKey}\n isServerPaging={isServerPaging}\n showPagination={showPagination}\n pagination={pagination}\n nextuiPaginationProps={nextuiPaginationProps}\n autoScrollToTop={autoScrollToTop}\n />\n )\n});\n\nfunction renderFieldValue(v: any) {\n if (typeof v == 'string' || typeof v == 'number') {\n return v;\n }\n if (v == null) {\n return null;\n }\n return JSON.stringify(v);\n}\n\nfunction sortData<T>({\n sortKey,\n key,\n type,\n sortableColumnsMap,\n dataSource,\n}: {\n sortKey: string | undefined;\n key: string;\n type: 'asc' | 'desc' | 'none';\n sortableColumnsMap: {\n [k: string]: 'asc' | 'desc' | 'none';\n };\n dataSource: T[];\n}) {\n const sortableColumns: { [k: string]: 'asc' | 'desc' | 'none' } = {};\n Object.keys(sortableColumnsMap).map((k) => {\n sortableColumns[k] = k === key ? type : 'none';\n });\n let sortedData = dataSource;\n if (type !== 'none') {\n const result = _.orderBy(\n dataSource,\n (o) => {\n const v = _.get(o, sortKey || key);\n if (v == null) {\n return type === 'desc' ? '' : v;\n }\n if (typeof v === 'string') {\n const _v = Number(v);\n if (isNaN(_v)) {\n return v.toLowerCase();\n } else {\n return _v;\n }\n }\n return v;\n },\n type,\n );\n sortedData = result;\n }\n return {\n sortableColumns,\n sortedData,\n };\n}\n\nfunction SortingComponent<T>({\n sortingUIOptions,\n columnOptions,\n sortableColumnsMap,\n item,\n onSort,\n}: {\n sortingUIOptions: SortingUIOptions;\n columnOptions?: ColumnOptions<T>;\n sortableColumnsMap: { [k: string]: 'asc' | 'desc' | 'none' };\n item: Column<T>;\n onSort: (e: { type: 'asc' | 'desc' | 'none'; key: string; sortKey: string }) => void;\n}) {\n if (sortingUIOptions?.showDropdown) {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger>\n <button className={cn('outline-none p-1', sortingUIOptions?.dropdownTriggerBtnClassName)}>\n {sortableColumnsMap[item.key] === 'desc' && <ChevronDown size={14} />}\n {sortableColumnsMap[item.key] === 'asc' && <ChevronUp size={14} />}\n {sortableColumnsMap[item.key] === 'none' && <ChevronsUpDown size={14} />}\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent className={cn('p-2 space-y-1 min-w-[4rem]', sortingUIOptions?.dropdownContentClassName)} collisionPadding={10} sideOffset={5}>\n <DropdownMenuItem\n className={cn('text-xs font-bold cursor-pointer', sortingUIOptions?.dropdownItemClassName)}\n onClick={() => {\n onSort({\n type: 'asc',\n key: item.key,\n sortKey: columnOptions?.[item.key]?.sortKey,\n });\n }}\n >\n {sortingUIOptions?.titles?.asc || 'ASC'}\n </DropdownMenuItem>\n <DropdownMenuItem\n className={cn('text-xs font-bold cursor-pointer', sortingUIOptions?.dropdownItemClassName)}\n onClick={() => {\n onSort({\n type: 'desc',\n key: item.key,\n sortKey: columnOptions?.[item.key]?.sortKey,\n });\n }}\n >\n {sortingUIOptions?.titles?.desc || 'DESC'}\n </DropdownMenuItem>\n <DropdownMenuItem\n className={cn('text-xs font-bold cursor-pointer', sortingUIOptions?.dropdownItemClassName)}\n onClick={() => {\n onSort({\n type: 'none',\n key: item.key,\n sortKey: columnOptions?.[item.key]?.sortKey,\n });\n }}\n >\n {sortingUIOptions?.titles?.none || 'NONE'}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n }\n\n return (\n <button className={cn('outline-none p-1', sortingUIOptions?.dropdownTriggerBtnClassName)}>\n {sortableColumnsMap[item.key] === 'none' && (\n <ChevronsUpDown\n size={14}\n onClick={() => {\n onSort({\n type: 'desc',\n key: item.key,\n sortKey: columnOptions?.[item.key]?.sortKey,\n });\n }}\n />\n )}\n {sortableColumnsMap[item.key] === 'desc' && (\n <ChevronDown\n size={14}\n onClick={() => {\n onSort({\n type: 'asc',\n key: item.key,\n sortKey: columnOptions?.[item.key]?.sortKey,\n });\n }}\n />\n )}\n {sortableColumnsMap[item.key] === 'asc' && (\n <ChevronUp\n size={14}\n onClick={() => {\n onSort({\n type: 'none',\n key: item.key,\n sortKey: columnOptions?.[item.key]?.sortKey,\n });\n }}\n />\n )}\n </button>\n );\n}\n\nfunction CardUI<T>({\n className,\n sortedData,\n columns,\n rowKey,\n cardOptions,\n onRowClick,\n emptyContent,\n isLoading,\n loadingOptions,\n loadingContent,\n virtualizedOptions,\n}: {\n className?: string;\n sortedData: T[];\n columns: Column<T>[];\n rowKey?: string;\n cardOptions?: CardOptions;\n onRowClick?: (item: T) => void;\n autoScrollToTop?: boolean;\n emptyContent?: React.ReactNode;\n isLoading?: boolean;\n loadingOptions?: LoadingOptions;\n loadingContent?: React.ReactNode;\n virtualizedOptions?: VirtualizedOptions;\n}) {\n const fetchedCountRef = useRef(-1);\n const elements = useMemo(\n () => sortedData.map((item, index) => {\n return (\n <Card\n key={rowKey ? item[rowKey] || index : index}\n className={cn('mb-2 w-full shadow-sm p-4 rounded-lg', cardOptions?.cardClassName)}\n isPressable={!!onRowClick}\n onPress={() => {\n onRowClick?.(item);\n }}\n >\n {columns.map((column, i) => {\n return (\n <div className=\"w-full\" key={column.key}>\n <div className={cn('w-full', cardOptions?.itemClassName)}>\n <div className={cn('font-meidum text-xs text-foreground-400', cardOptions?.labelClassName)}>{column.label}</div>\n <div className={cn('text-xs', cardOptions?.valueClassName)}>{column.render ? column.render(item) : renderFieldValue(item[column.key])}</div>\n </div>\n {cardOptions?.showDivider && i !== columns.length - 1 && <Divider className={cn('my-2', cardOptions?.dividerClassName)} />}\n </div>\n );\n })}\n </Card>\n );\n }),\n [sortedData]\n );\n return (\n <div className={className}>\n {sortedData.length > 0 ? (\n <VList\n style={{ height: virtualizedOptions?.vListHeight || 400 }}\n onRangeChange={async (_, endIndex) => {\n const count = sortedData.length;\n if (endIndex + 1 >= count && fetchedCountRef.current < count) {\n fetchedCountRef.current = count;\n if (virtualizedOptions?.fetchData) {\n await virtualizedOptions.fetchData()\n }\n }\n }}\n >\n {elements}\n {isLoading ? loadingContent || DefaultLoading({ loadingOptions }) : null}\n </VList>\n ) : (\n emptyContent ?? <DefaultEmptyContent />\n )}\n </div>\n );\n}\n\nfunction VirtualizedListUI<T>({\n className,\n sortedData,\n dataSource,\n columns,\n columnOptions,\n sortableColumnsMap,\n sortingUIOptions,\n setSortableColumnsMap,\n setSortedData,\n rowKey,\n onRowClick,\n rowCss,\n emptyContent,\n isLoading,\n loadingOptions,\n loadingContent,\n virtualizedOptions,\n}: {\n className: string;\n sortedData: T[];\n dataSource: T[];\n columns: Column<T>[];\n columnOptions: ColumnOptions<T>;\n sortableColumnsMap: { [k: string]: 'asc' | 'desc' | 'none' };\n sortingUIOptions: SortingUIOptions;\n setSortableColumnsMap: (value: React.SetStateAction<{\n [k: string]: \"asc\" | \"desc\" | \"none\";\n }>) => void;\n setSortedData: (value: React.SetStateAction<T[]>) => void;\n rowKey?: string;\n onRowClick?: (item: T) => void;\n rowCss?: string | ((item: T) => string | undefined);\n emptyContent?: React.ReactNode;\n isLoading?: boolean;\n loadingOptions?: LoadingOptions;\n loadingContent?: React.ReactNode;\n virtualizedOptions?: VirtualizedOptions;\n}) {\n const fetchedCountRef = useRef(-1);\n const elements = useMemo(\n () => sortedData.map((item, index) => {\n return (\n <div\n key={rowKey ? item[rowKey] || index : index}\n className={cn('flex items-center', virtualizedOptions?.classNames?.row, typeof rowCss === 'function' ? rowCss(item) : rowCss)}\n onClick={() => {\n onRowClick?.(item);\n }}\n >\n {columns.map((column) => {\n return (\n <div\n key={column.key}\n className={cn('flex-grow py-2 px-4 text-xs whitespace-nowrap overflow-auto', virtualizedOptions?.classNames?.rowCell)}\n style={{\n minWidth: column.width\n }}\n >\n {column.render ? column.render(item) : renderFieldValue(item[column.key])}\n </div>\n )\n })}\n </div>\n );\n }),\n [sortedData]\n );\n\n return (\n <div className={cn(\"w-full overflow-auto\", className)}>\n <div className='inline-block'>\n <div className={cn(\"flex items-center rounded-lg bg-default-100 mb-2\", virtualizedOptions?.classNames?.header)}>\n {columns.map((column) => {\n return (\n <div\n key={column.key}\n className={cn(\"flex-grow py-2 px-4 flex items-center text-xs font-semibold whitespace-nowrap\", virtualizedOptions?.classNames?.headerCell)}\n style={{\n minWidth: column.width\n }}\n >\n <span>{column.label}</span>\n {!!sortableColumnsMap[column.key] && (\n <SortingComponent\n sortingUIOptions={sortingUIOptions}\n columnOptions={columnOptions}\n sortableColumnsMap={sortableColumnsMap}\n item={column}\n onSort={({ type, key, sortKey }) => {\n const { sortableColumns, sortedData } = sortData({\n type,\n key,\n sortKey,\n sortableColumnsMap,\n dataSource,\n });\n setSortableColumnsMap(sortableColumns);\n setSortedData(sortedData);\n }}\n />\n )}\n </div>\n )\n })}\n </div>\n {sortedData.length > 0 ? (\n <VList\n style={{ height: virtualizedOptions?.vListHeight || 200 }}\n onRangeChange={async (_, endIndex) => {\n const count = sortedData.length;\n if (endIndex + 1 >= count && fetchedCountRef.current < count) {\n fetchedCountRef.current = count;\n if (virtualizedOptions?.fetchData) {\n await virtualizedOptions.fetchData()\n }\n }\n }}\n >\n {elements}\n {isLoading ? loadingContent || DefaultLoading({ loadingOptions }) : null}\n </VList>\n ) : (\n emptyContent ?? <DefaultEmptyContent />\n )}\n </div>\n </div>\n )\n}\n\nconst TableUI = observer(<T,>({\n className,\n classNames = {},\n isHeaderSticky,\n sortedData,\n dataSource,\n columns,\n columnOptions,\n sortableColumnsMap,\n sortingUIOptions,\n setSortableColumnsMap,\n setSortedData,\n isLoading,\n loadingContent,\n loadingOptions,\n emptyContent,\n rowCss,\n onRowClick,\n showCollapsedTables,\n collapsedTableConfig,\n collapsedTables,\n rowKey,\n isServerPaging,\n showPagination,\n pagination = new PaginationState({\n page: 1,\n limit: 10,\n }),\n nextuiPaginationProps = {},\n autoScrollToTop\n}: {\n className: string;\n classNames?: TableClassNames;\n isHeaderSticky: boolean;\n sortedData: T[];\n dataSource: T[];\n columns: Column<T>[];\n columnOptions?: ColumnOptions<T>;\n sortableColumnsMap: { [k: string]: 'asc' | 'desc' | 'none' };\n sortingUIOptions: SortingUIOptions;\n setSortableColumnsMap: (value: React.SetStateAction<{ [k: string]: 'asc' | 'desc' | 'none'; }>) => void;\n setSortedData: (value: React.SetStateAction<T[]>) => void;\n isLoading: boolean;\n loadingContent?: React.ReactNode;\n loadingOptions?: LoadingOptions;\n emptyContent?: React.ReactNode;\n rowCss?: string | ((item: T) => string | undefined);\n onRowClick?: (item: T) => void;\n showCollapsedTables: boolean;\n collapsedTableConfig?: CollapsedTableConfig<T>;\n collapsedTables: CollapsedTable<any>[];\n rowKey?: string;\n isServerPaging?: boolean;\n showPagination: boolean;\n pagination?: PaginationState;\n nextuiPaginationProps?: PaginationProps | {};\n autoScrollToTop: boolean;\n}) => {\n const tableBoxRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!isServerPaging) {\n pagination.setData({\n total: dataSource.length,\n });\n }\n }, [dataSource]);\n\n const data = (isServerPaging || !showPagination) ? sortedData : sortedData.slice(pagination.offset, pagination.offset + pagination.limit);\n\n return (\n <>\n <div className={cn('relative w-full', className)} ref={tableBoxRef}>\n <table className={cn('w-full h-auto table-auto', classNames.table)}>\n <thead className={cn(classNames.thead, { 'sticky top-0 z-30 [&>tr]:first:shadow-small [&>tr]:first:rounded-lg': isHeaderSticky })}>\n <tr className={classNames.tr}>\n {columns.map((item) => (\n <th\n key={item.key}\n className={cn('px-3 h-10 text-xs font-semibold whitespace-nowrap bg-default-100 first:rounded-l-lg last:rounded-r-lg outline-none', classNames.th)}\n style={{\n minWidth: item.width\n }}\n >\n <div className=\"flex items-center\">\n <span>{item.label}</span>\n {!!sortableColumnsMap[item.key] && (\n <SortingComponent\n sortingUIOptions={sortingUIOptions}\n columnOptions={columnOptions}\n sortableColumnsMap={sortableColumnsMap}\n item={item}\n onSort={({ type, key, sortKey }) => {\n const { sortableColumns, sortedData } = sortData({\n type,\n key,\n sortKey,\n sortableColumnsMap,\n dataSource,\n });\n setSortableColumnsMap(sortableColumns);\n setSortedData(sortedData);\n }}\n />\n )}\n </div>\n </th>\n ))}\n </tr>\n <tr aria-hidden=\"true\" className=\"w-px h-px block ml-[0.25rem] mt-[0.25rem]\"></tr>\n </thead>\n {isLoading ? (\n <tbody className={classNames.tbody}>\n <tr className={classNames.tr}>\n <td\n className={classNames.td}\n colSpan={columns.length}\n >\n {loadingContent || DefaultLoading({ loadingOptions })}\n </td>\n </tr>\n </tbody>\n ) : data.length > 0 ? (\n <tbody className={classNames.tbody}>\n {\n showCollapsedTables ?\n data.map(item => {\n return (\n <CollapseBodyRow\n classNames={classNames}\n item={item}\n columns={columns}\n rowCss={rowCss}\n onRowClick={onRowClick}\n collapsedTableConfig={collapsedTableConfig}\n collapsedTables={collapsedTables}\n />\n )\n })\n : data.map((item, index) => {\n return (\n <tr\n key={rowKey ? item[rowKey] || index : index}\n className={cn(classNames.tr, typeof rowCss === 'function' ? rowCss(item) : rowCss)}\n onClick={() => {\n onRowClick?.(item);\n }}\n >\n {columns.map((column) => {\n return (\n <td\n key={column.key}\n className={cn('py-2 px-3 text-xs', classNames.td)}\n style={{\n minWidth: column.width\n }}\n >\n {column.render ? column.render(item) : renderFieldValue(item[column.key])}\n </td>\n )\n })}\n </tr>\n );\n })\n }\n </tbody>\n ) : (\n <tbody className={classNames.tbody}>\n <tr className={classNames.tr}>\n <td\n className={classNames.td}\n colSpan={columns.length}\n >\n {emptyContent ?? <DefaultEmptyContent />}\n </td>\n </tr>\n </tbody>\n )}\n </table>\n </div>\n {showPagination && pagination.total > pagination.limit && (\n <div className=\"flex justify-center\">\n <NextuiPagination\n className=\"mt-2\"\n showControls\n showShadow\n size=\"sm\"\n radius=\"sm\"\n color=\"primary\"\n initialPage={1}\n total={Math.ceil(pagination.total / pagination.limit)}\n page={pagination.page}\n onChange={(currentPage) => {\n pagination.setData({\n page: currentPage,\n });\n if (autoScrollToTop && tableBoxRef.current) {\n scrollIntoTop(tableBoxRef.current);\n }\n }}\n {...nextuiPaginationProps}\n />\n </div>\n )}\n </>\n );\n})\n\nfunction DefaultLoading({ loadingOptions }: { loadingOptions?: LoadingOptions }) {\n const type = loadingOptions?.type || 'skeleton';\n const skeletonOptions = loadingOptions?.skeleton;\n const spinnerOptions = loadingOptions?.spinner;\n const spinnerProps = spinnerOptions?.spinnerProps || {};\n\n if (type === 'skeleton') {\n return <SkeletonBox className={cn('mt-2 flex-col', skeletonOptions?.boxClassName)} skClassName={cn('h-[30px] rounded', skeletonOptions?.skeletonClassName)} line={skeletonOptions?.line || 5} />;\n }\n\n return (\n <div className={cn('w-full h-[100px] flex justify-center items-center', spinnerOptions?.boxClassName)}>\n <Spinner size=\"sm\" color=\"primary\" {...spinnerProps} />\n <div className={cn('ml-2 text-[#64748B] text-sm', spinnerOptions?.textClassName)}>{spinnerOptions?.text || 'Loading...'}</div>\n </div>\n );\n}\n\nfunction DefaultEmptyContent() {\n return <div className=\"w-full h-[100px] flex justify-center items-center text-xs text-[#64748B] dark:text-[#cacaca]\">No Data</div>;\n}\n\nfunction scrollIntoTop(target: HTMLElement) {\n if (target) {\n const { top } = target.getBoundingClientRect();\n window.scrollTo({\n top: top + window.scrollY - 100,\n behavior: 'smooth',\n });\n }\n}\n\nfunction CollapseBodyRow<T>({\n classNames,\n item,\n columns,\n rowCss,\n onRowClick,\n collapsedTableConfig,\n collapsedTables,\n}: {\n classNames?: TableClassNames;\n item: T;\n columns: Column<T>[];\n rowCss?: string | ((item: T) => string | undefined),\n onRowClick?: (item: T) => void;\n collapsedTableConfig?: {\n classNames?: TableClassNames;\n collapsedHandlerPosition?: 'left' | 'right';\n collapsedHandlerBoxCss?: string;\n openedIcon?: React.ReactNode;\n closedIcon?: React.ReactNode;\n onRowClick?: (item: any) => void;\n rowCss?: string | ((item: any) => string | undefined);\n emptyContent?: React.ReactNode;\n };\n collapsedTables: CollapsedTable<any>[];\n}) {\n const [isOpen, setIsOpen] = useState(false);\n const collapsedHandlerPosition = collapsedTableConfig?.collapsedHandlerPosition || 'right';\n\n const { OpenedIcon, ClosedIcon } = useMemo(() => {\n const defaultOpenedIcon = <ChevronDown size={18} />;\n const defaultClosedIcon = collapsedHandlerPosition === 'left' ? <ChevronRight size={18} /> : <ChevronLeft size={18} />;\n return {\n OpenedIcon: collapsedTableConfig?.openedIcon || defaultOpenedIcon,\n ClosedIcon: collapsedTableConfig?.closedIcon || defaultClosedIcon,\n };\n }, []);\n\n return (\n <>\n <tr\n className={cn('text-xs cursor-pointer', classNames?.tr, typeof rowCss === 'function' ? rowCss(item) : rowCss)}\n onClick={(e: any) => {\n onRowClick?.(item);\n }}\n >\n {columns.map((column) => {\n if (column.key === '$collapsedHandler') {\n return (\n <td\n className={classNames?.td}\n style={{\n minWidth: column.width\n }}\n >\n <div\n className={cn(\"w-6 h-6 flex items-center justify-center rounded-sm hover:bg-[#f3f3f4] dark:hover:bg-[#1e1e1e]\", collapsedTableConfig?.collapsedHandlerBoxCss)}\n\n onClick={(e) => {\n e.stopPropagation();\n setIsOpen((v) => !v);\n }}\n >\n {isOpen ? OpenedIcon : ClosedIcon}\n </div>\n </td>\n );\n }\n return (\n <td\n key={column.key}\n className={cn(\"py-2 px-3 text-xs\", classNames?.td)}\n style={{\n minWidth: column.width\n }}\n >\n {column.render ? column.render(item) : renderFieldValue(item[column.key])}\n </td>\n );\n })}\n </tr>\n <tr className={cn(classNames?.tr, isOpen ? 'table-row' : 'hidden')}>\n <td colSpan={columns.length} className={cn(\"py-2 px-3 text-xs\", classNames?.td)}>\n {collapsedTables.map((ex) => {\n const exColumns = ex.columns;\n const exData = item[ex.key] || [];\n return (\n <table className={cn(\"w-full h-auto table-auto\", collapsedTableConfig?.classNames?.table)} key={ex.key}>\n <thead className={collapsedTableConfig?.classNames?.thead}>\n <tr className={collapsedTableConfig?.classNames?.tr}>\n {exColumns?.map((exC) => {\n return (\n <th\n key={exC.key}\n className={cn('px-3 h-10 text-xs text-left font-semibold bg-default-100 first:rounded-l-lg last:rounded-r-lg outline-none', collapsedTableConfig?.classNames?.th)}\n style={{\n minWidth: exC.width\n }}\n >\n {exC.label}\n </th>\n );\n })}\n </tr>\n <tr aria-hidden=\"true\" className=\"w-px h-px block ml-[0.25rem] mt-[0.25rem]\"></tr>\n </thead>\n {exData.length > 0 ? (\n <tbody className={collapsedTableConfig?.classNames?.tbody}>\n {\n exData.map((exItem) => (\n <tr\n key={exItem.key}\n className={cn('text-xs',\n collapsedTableConfig?.classNames?.tr,\n typeof collapsedTableConfig?.rowCss === 'function'\n ? collapsedTableConfig?.rowCss({\n ...exItem,\n $parent: item,\n })\n : collapsedTableConfig?.rowCss\n )}\n onClick={(e: any) => {\n collapsedTableConfig?.onRowClick?.({\n ...exItem,\n $parent: item,\n });\n }}\n >\n {exColumns?.map((exC) => {\n return (\n <td\n key={exC.key}\n className={cn('py-2 px-3 text-xs', collapsedTableConfig?.classNames?.td)}\n style={{\n minWidth: exC.width\n }}\n >\n {exC.render\n ? exC.render({\n ...exItem,\n $parent: item,\n })\n : renderFieldValue(exItem[exC.key])}\n </td>\n );\n })}\n </tr>\n ))\n }\n </tbody>\n ) : (\n <tbody className={collapsedTableConfig?.classNames?.tbody}>\n <tr className={collapsedTableConfig?.classNames?.tr}>\n <td\n className={collapsedTableConfig?.classNames?.td}\n colSpan={columns.length}\n >\n {collapsedTableConfig?.emptyContent ?? <DefaultEmptyContent />}\n </td>\n </tr>\n </tbody>\n )}\n </table>\n );\n })}\n </td>\n </tr>\n </>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\"\nimport { Check, ChevronRight, Circle } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\";\n\nconst DropdownMenu = DropdownMenuPrimitive.Root\n\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger\n\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group\n\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal\n\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub\n\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup\n\nconst DropdownMenuArrow = DropdownMenuPrimitive.Arrow\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n \"flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto h-4 w-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n))\nDropdownMenuSubTrigger.displayName =\n DropdownMenuPrimitive.SubTrigger.displayName\n\nconst DropdownMenuSubContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md bg-white dark:bg-[#18181B] border dark:border-none p-1 text-popover-foreground shadow-md animate-in data-[side=bottom]:slide-in-from-top-1 data-[side=left]:slide-in-from-right-1 data-[side=right]:slide-in-from-left-1 data-[side=top]:slide-in-from-bottom-1\",\n className\n )}\n {...props}\n />\n))\nDropdownMenuSubContent.displayName =\n DropdownMenuPrimitive.SubContent.displayName\n\nconst DropdownMenuContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-lg bg-white dark:bg-[#18181B] border dark:border-[#3e3e3e] p-1 text-popover-foreground shadow-md animate-in data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n))\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName\n\nconst DropdownMenuItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n))\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n))\nDropdownMenuCheckboxItem.displayName =\n DropdownMenuPrimitive.CheckboxItem.displayName\n\nconst DropdownMenuRadioItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Circle className=\"h-2 w-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n))\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName\n\nconst DropdownMenuLabel = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn(\n \"px-2 py-1.5 text-sm font-semibold\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n))\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName\n\nconst DropdownMenuSeparator = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...props}\n />\n))\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName\n\nconst DropdownMenuShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn(\"ml-auto text-xs tracking-widest opacity-60\", className)}\n {...props}\n />\n )\n}\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\"\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n DropdownMenuArrow,\n}\n"]}
@@ -13,6 +13,7 @@ type TableClassNames = {
13
13
  type HeaderKeys<T extends Record<string, any>> = Array<keyof T | '$actions'>;
14
14
  type ColumnConfig<T> = {
15
15
  label?: React.ReactNode;
16
+ width?: number;
16
17
  hidden?: boolean;
17
18
  sortable?: boolean;
18
19
  sortKey?: string;
@@ -73,13 +74,13 @@ type CollapsedTableConfig<T> = {
73
74
  emptyContent?: React.ReactNode;
74
75
  };
75
76
  type VirtualizedOptions = {
76
- isVirtualized: boolean;
77
- vListHeight: number;
77
+ isVirtualized?: boolean;
78
+ vListHeight?: number;
78
79
  classNames?: {
79
80
  header?: string;
80
- column?: string;
81
+ headerCell?: string;
81
82
  row?: string;
82
- rowItem?: string;
83
+ rowCell?: string;
83
84
  };
84
85
  fetchData?: () => Promise<void>;
85
86
  };
@@ -92,7 +93,7 @@ interface JSONTableProps<T extends Record<string, any>> {
92
93
  columnOptions?: ColumnOptions<T>;
93
94
  isServerPaging?: boolean;
94
95
  pagination?: PaginationState;
95
- nextuiPaginationProps?: PaginationProps | {};
96
+ nextuiPaginationProps?: Partial<PaginationProps>;
96
97
  showPagination?: boolean;
97
98
  onRowClick?: (item: T) => void;
98
99
  rowCss?: string | ((item: T) => string | undefined);
@@ -108,8 +109,6 @@ interface JSONTableProps<T extends Record<string, any>> {
108
109
  collapsedTableConfig?: CollapsedTableConfig<T>;
109
110
  virtualizedOptions?: VirtualizedOptions;
110
111
  }
111
- declare const JSONTable: (<T extends Record<string, any>>(props: JSONTableProps<T>) => React.JSX.Element) & {
112
- displayName: string;
113
- };
112
+ declare const JSONTable: <T extends Record<string, any>>(props: JSONTableProps<T>) => React.JSX.Element;
114
113
 
115
114
  export { CardOptions, CollapsedTableConfig, ColumnOptions, HeaderKeys, JSONTable, LoadingOptions, SortingUIOptions };
@@ -1,4 +1,4 @@
1
- export { JSONTable } from './chunk-XSHLTPP2.mjs';
1
+ export { JSONTable } from './chunk-ZQ5GQE2S.mjs';
2
2
  import './chunk-ONVPCAMQ.mjs';
3
3
  import './chunk-J5PZWR2P.mjs';
4
4
  import './chunk-K7LFG5BA.mjs';
package/dist/metrics.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { JSONTable } from './chunk-XSHLTPP2.mjs';
1
+ import { JSONTable } from './chunk-ZQ5GQE2S.mjs';
2
2
  import './chunk-ONVPCAMQ.mjs';
3
3
  import { SkeletonBox } from './chunk-J5PZWR2P.mjs';
4
4
  import './chunk-K7LFG5BA.mjs';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dappworks/kit",
3
- "version": "0.4.164",
3
+ "version": "0.4.166",
4
4
  "description": "",
5
5
  "main": "./dist/index.mjs",
6
6
  "types": "./dist/index.d.mts",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../components/JSONTable/index.tsx","../components/ui/dropdown-menu.tsx"],"names":["React","ChevronRight","sortableColumnsDefaultValue","columns","collapsedTables","keys","showCollapsedTables","_a","_"],"mappings":"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","sourcesContent":["import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport {\n Card,\n Divider,\n Pagination as NextuiPagination,\n PaginationProps,\n Spinner,\n SpinnerProps,\n} from '@nextui-org/react';\nimport { ChevronDown, ChevronLeft, ChevronRight, ChevronUp, ChevronsUpDown } from \"lucide-react\";\nimport { observer } from \"mobx-react-lite\";\nimport { PaginationState } from \"../../store/standard/PaginationState\";\nimport { SkeletonBox } from \"../Common/SkeletonBox\";\nimport { _ } from \"../../lib/lodash\";\nimport { cn } from \"../../lib/utils\";\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '../ui/dropdown-menu';\nimport { VList } from 'virtua';\n\nexport type TableClassNames = {\n table?: string;\n thead?: string;\n tr?: string;\n th?: string;\n tbody?: string;\n td?: string;\n}\n\nexport type HeaderKeys<T extends Record<string, any>> = Array<keyof T | '$actions'>;\n\nexport type ColumnConfig<T> = {\n label?: React.ReactNode;\n hidden?: boolean;\n sortable?: boolean;\n sortKey?: string;\n order?: number;\n render?: (item: T) => any;\n}\n\nexport type ColumnOptions<T> = {\n [key in keyof T]?: ColumnConfig<T>;\n} & {\n $actions?: ColumnConfig<T>;\n};\n\ntype Column<T> = {\n key: string;\n label: React.ReactNode;\n render?: (item: T) => any;\n};\n\ntype CollapsedTable<U> = {\n key: string;\n columns: Column<U>[];\n};\n\nexport type CardOptions = {\n cardClassName?: string;\n itemClassName?: string;\n labelClassName?: string;\n valueClassName?: string;\n showDivider?: boolean;\n dividerClassName?: string;\n};\n\nexport type LoadingOptions = {\n type?: 'skeleton' | 'spinner';\n skeleton?: {\n boxClassName?: string;\n skeletonClassName?: string;\n line?: number;\n };\n spinner?: {\n boxClassName?: string;\n spinnerProps?: SpinnerProps;\n text?: string;\n textClassName?: string;\n };\n};\n\nexport type SortingUIOptions = {\n showDropdown?: boolean;\n dropdownTriggerBtnClassName?: string;\n dropdownContentClassName?: string;\n dropdownItemClassName?: string;\n titles?: {\n asc?: string;\n desc?: string;\n none?: string;\n };\n};\n\nexport type CollapsedTableConfig<T> = {\n classNames?: TableClassNames;\n options: {\n key: keyof T;\n headerKeys: string[];\n columnOptions: ColumnOptions<any>;\n }[];\n collapsedHandlerPosition?: 'left' | 'right';\n collapsedHandlerBoxCss?: string;\n openedIcon?: React.ReactNode;\n closedIcon?: React.ReactNode;\n onRowClick?: (item: any) => void;\n rowCss?: string | ((item: any) => string | undefined);\n emptyContent?: React.ReactNode;\n}\n\nexport type VirtualizedOptions = {\n isVirtualized: boolean;\n vListHeight: number;\n classNames?: {\n header?: string;\n column?: string;\n row?: string;\n rowItem?: string;\n },\n fetchData?: () => Promise<void>;\n}\n\nexport interface JSONTableProps<T extends Record<string, any>> {\n className?: string;\n classNames?: TableClassNames;\n rowKey?: string;\n dataSource: T[];\n headerKeys?: HeaderKeys<T>;\n columnOptions?: ColumnOptions<T>;\n isServerPaging?: boolean;\n pagination?: PaginationState;\n nextuiPaginationProps?: PaginationProps | {};\n showPagination?: boolean;\n onRowClick?: (item: T) => void;\n rowCss?: string | ((item: T) => string | undefined);\n asCard?: boolean;\n cardOptions?: CardOptions;\n autoScrollToTop?: boolean;\n emptyContent?: React.ReactNode;\n isLoading?: boolean;\n loadingOptions?: LoadingOptions;\n loadingContent?: React.ReactNode;\n isHeaderSticky?: boolean;\n sortingUIOptions?: SortingUIOptions;\n collapsedTableConfig?: CollapsedTableConfig<T>;\n virtualizedOptions?: VirtualizedOptions;\n}\n\nexport const JSONTable = observer(<T extends Record<string, any>>(props: JSONTableProps<T>) => {\n const {\n className,\n classNames = {},\n dataSource = [],\n columnOptions,\n headerKeys,\n isServerPaging,\n pagination = new PaginationState({\n page: 1,\n limit: 8,\n }),\n nextuiPaginationProps = {},\n showPagination = true,\n rowKey,\n onRowClick,\n rowCss,\n asCard = false,\n cardOptions = {\n boxClassName: '',\n cardClassName: '',\n itemClassName: '',\n showDivider: true,\n dividerClassName: '',\n },\n autoScrollToTop = false,\n emptyContent,\n isLoading = false,\n loadingOptions,\n loadingContent,\n isHeaderSticky = false,\n sortingUIOptions,\n collapsedTableConfig,\n virtualizedOptions\n } = props;\n const [sortableColumnsMap, setSortableColumnsMap] = useState<{ [k: string]: 'asc' | 'desc' | 'none' }>({});\n const [sortedData, setSortedData] = useState<T[]>(dataSource);\n\n const { columns, sortableColumnsDefaultValue, showCollapsedTables, collapsedTables } = useMemo(() => {\n const firstData = dataSource[0];\n\n const allKeys = firstData ? Object.keys(firstData) : [];\n const keys = headerKeys ? headerKeys : columnOptions ? allKeys.filter((key) => !columnOptions[key]?.hidden) : allKeys;\n if (!keys.includes('$actions') && columnOptions && columnOptions['$actions']) {\n keys.push('$actions');\n }\n\n const sortableColumnsDefaultValue: { [k: string]: 'asc' | 'desc' | 'none' } = {};\n\n let columns: Column<T>[] = keys.map((key: string) => {\n const sortable = columnOptions?.[key]?.sortable;\n if (sortable) {\n sortableColumnsDefaultValue[key] = 'none';\n }\n return {\n key,\n label: columnOptions?.[key]?.label || (key === '$actions' ? '' : key),\n render: columnOptions?.[key]?.render,\n };\n });\n\n if (!headerKeys && columnOptions) {\n columns.sort((a, b) => {\n const aOrder = columnOptions[a.key]?.order || 0;\n const bOrder = columnOptions[b.key]?.order || 0;\n return bOrder - aOrder;\n });\n }\n\n let collapsedTables: CollapsedTable<any>[] = [];\n if (firstData && collapsedTableConfig?.options) {\n const collapsedTableOptions = collapsedTableConfig.options;\n collapsedTables = collapsedTableOptions\n .filter((item) => {\n return Array.isArray(firstData[item.key]);\n })\n .map((item) => {\n const index = columns.findIndex((c) => c.key === item.key);\n if (index > -1) {\n columns.splice(index, 1);\n }\n const keys = item.headerKeys || [];\n if (!keys.includes('$actions') && item.columnOptions && item.columnOptions['$actions']) {\n keys.push('$actions');\n }\n return {\n key: item.key as string,\n columns: keys.map((k) => {\n const option = item.columnOptions[k];\n return {\n key: k,\n label: option?.label || k,\n render: option?.render,\n };\n }),\n };\n })\n }\n\n const showCollapsedTables = collapsedTables.length > 0;\n if (showCollapsedTables && !virtualizedOptions?.isVirtualized) {\n const collapsedHandlerPosition = collapsedTableConfig?.collapsedHandlerPosition || 'right';\n if (collapsedHandlerPosition === 'right') {\n columns.push({\n key: '$collapsedHandler',\n label: '',\n })\n } else {\n columns = [{ key: '$collapsedHandler', label: '' }, ...columns];\n }\n }\n\n return {\n columns,\n sortableColumnsDefaultValue,\n showCollapsedTables,\n collapsedTables,\n };\n }, [dataSource, columnOptions]);\n\n useEffect(() => {\n setSortableColumnsMap(sortableColumnsDefaultValue);\n }, [sortableColumnsDefaultValue]);\n\n useEffect(() => {\n setSortedData(dataSource);\n if (!isServerPaging) {\n pagination.setData({\n total: dataSource.length,\n });\n }\n }, [dataSource]);\n\n const data = (isServerPaging || !showPagination || virtualizedOptions?.isVirtualized || asCard) ? sortedData : sortedData.slice(pagination.offset, pagination.offset + pagination.limit);\n\n if (asCard) {\n return (\n <CardUI\n className={className}\n rowKey={rowKey}\n data={data}\n columns={columns}\n cardOptions={cardOptions}\n onRowClick={onRowClick}\n autoScrollToTop={autoScrollToTop}\n emptyContent={emptyContent}\n isLoading={isLoading}\n loadingOptions={loadingOptions}\n loadingContent={loadingContent}\n virtualizedOptions={virtualizedOptions}\n />\n );\n }\n\n if (virtualizedOptions?.isVirtualized) {\n return (\n <VirtualizedListUI\n className={className}\n rowKey={rowKey}\n data={data}\n dataSource={dataSource}\n columns={columns}\n columnOptions={columnOptions}\n sortableColumnsMap={sortableColumnsMap}\n sortingUIOptions={sortingUIOptions}\n setSortableColumnsMap={setSortableColumnsMap}\n setSortedData={setSortedData}\n onRowClick={onRowClick}\n emptyContent={emptyContent}\n isLoading={isLoading}\n loadingOptions={loadingOptions}\n loadingContent={loadingContent}\n virtualizedOptions={virtualizedOptions}\n />\n )\n }\n\n return (\n <TableUI\n className={className}\n classNames={classNames}\n isHeaderSticky={isHeaderSticky}\n columns={columns}\n columnOptions={columnOptions}\n sortableColumnsMap={sortableColumnsMap}\n sortingUIOptions={sortingUIOptions}\n setSortableColumnsMap={setSortableColumnsMap}\n setSortedData={setSortedData}\n data={data}\n dataSource={dataSource}\n isLoading={isLoading}\n loadingContent={loadingContent}\n loadingOptions={loadingOptions}\n emptyContent={emptyContent}\n rowCss={rowCss}\n onRowClick={onRowClick}\n showCollapsedTables={showCollapsedTables}\n collapsedTableConfig={collapsedTableConfig}\n collapsedTables={collapsedTables}\n rowKey={rowKey}\n showPagination={showPagination}\n pagination={pagination}\n nextuiPaginationProps={nextuiPaginationProps}\n autoScrollToTop={autoScrollToTop}\n />\n )\n});\n\nfunction renderFieldValue(v: any) {\n if (typeof v == 'string' || typeof v == 'number') {\n return v;\n }\n if (v == null) {\n return null;\n }\n return JSON.stringify(v);\n}\n\nfunction sortData<T>({\n sortKey,\n key,\n type,\n sortableColumnsMap,\n dataSource,\n}: {\n sortKey: string | undefined;\n key: string;\n type: 'asc' | 'desc' | 'none';\n sortableColumnsMap: {\n [k: string]: 'asc' | 'desc' | 'none';\n };\n dataSource: T[];\n}) {\n const sortableColumns: { [k: string]: 'asc' | 'desc' | 'none' } = {};\n Object.keys(sortableColumnsMap).map((k) => {\n sortableColumns[k] = k === key ? type : 'none';\n });\n let sortedData = dataSource;\n if (type !== 'none') {\n const result = _.orderBy(\n dataSource,\n (o) => {\n const v = _.get(o, sortKey || key);\n if (v == null) {\n return type === 'desc' ? '' : v;\n }\n if (typeof v === 'string') {\n const _v = Number(v);\n if (isNaN(_v)) {\n return v.toLowerCase();\n } else {\n return _v;\n }\n }\n return v;\n },\n type,\n );\n sortedData = result;\n }\n return {\n sortableColumns,\n sortedData,\n };\n}\n\nfunction SortingComponent<T>({\n sortingUIOptions,\n columnOptions,\n sortableColumnsMap,\n item,\n onSort,\n}: {\n sortingUIOptions: SortingUIOptions;\n columnOptions?: ColumnOptions<T>;\n sortableColumnsMap: { [k: string]: 'asc' | 'desc' | 'none' };\n item: Column<T>;\n onSort: (e: { type: 'asc' | 'desc' | 'none'; key: string; sortKey: string }) => void;\n}) {\n if (sortingUIOptions?.showDropdown) {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger>\n <button className={cn('outline-none p-1', sortingUIOptions?.dropdownTriggerBtnClassName)}>\n {sortableColumnsMap[item.key] === 'desc' && <ChevronDown size={14} />}\n {sortableColumnsMap[item.key] === 'asc' && <ChevronUp size={14} />}\n {sortableColumnsMap[item.key] === 'none' && <ChevronsUpDown size={14} />}\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent className={cn('p-2 space-y-1 min-w-[4rem]', sortingUIOptions?.dropdownContentClassName)} collisionPadding={10} sideOffset={5}>\n <DropdownMenuItem\n className={cn('text-xs font-bold cursor-pointer', sortingUIOptions?.dropdownItemClassName)}\n onClick={() => {\n onSort({\n type: 'asc',\n key: item.key,\n sortKey: columnOptions?.[item.key]?.sortKey,\n });\n }}\n >\n {sortingUIOptions?.titles?.asc || 'ASC'}\n </DropdownMenuItem>\n <DropdownMenuItem\n className={cn('text-xs font-bold cursor-pointer', sortingUIOptions?.dropdownItemClassName)}\n onClick={() => {\n onSort({\n type: 'desc',\n key: item.key,\n sortKey: columnOptions?.[item.key]?.sortKey,\n });\n }}\n >\n {sortingUIOptions?.titles?.desc || 'DESC'}\n </DropdownMenuItem>\n <DropdownMenuItem\n className={cn('text-xs font-bold cursor-pointer', sortingUIOptions?.dropdownItemClassName)}\n onClick={() => {\n onSort({\n type: 'none',\n key: item.key,\n sortKey: columnOptions?.[item.key]?.sortKey,\n });\n }}\n >\n {sortingUIOptions?.titles?.none || 'NONE'}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n }\n\n return (\n <button className={cn('outline-none p-1', sortingUIOptions?.dropdownTriggerBtnClassName)}>\n {sortableColumnsMap[item.key] === 'none' && (\n <ChevronsUpDown\n size={14}\n onClick={() => {\n onSort({\n type: 'desc',\n key: item.key,\n sortKey: columnOptions?.[item.key]?.sortKey,\n });\n }}\n />\n )}\n {sortableColumnsMap[item.key] === 'desc' && (\n <ChevronDown\n size={14}\n onClick={() => {\n onSort({\n type: 'asc',\n key: item.key,\n sortKey: columnOptions?.[item.key]?.sortKey,\n });\n }}\n />\n )}\n {sortableColumnsMap[item.key] === 'asc' && (\n <ChevronUp\n size={14}\n onClick={() => {\n onSort({\n type: 'none',\n key: item.key,\n sortKey: columnOptions?.[item.key]?.sortKey,\n });\n }}\n />\n )}\n </button>\n );\n}\n\nfunction CardUI<T>({\n className,\n data,\n columns,\n rowKey,\n cardOptions,\n onRowClick,\n emptyContent,\n isLoading,\n loadingOptions,\n loadingContent,\n virtualizedOptions,\n}: {\n className?: string;\n data: T[];\n columns: Column<T>[];\n rowKey?: string;\n cardOptions?: CardOptions;\n onRowClick?: (item: T) => void;\n autoScrollToTop?: boolean;\n emptyContent?: React.ReactNode;\n isLoading?: boolean;\n loadingOptions?: LoadingOptions;\n loadingContent?: React.ReactNode;\n virtualizedOptions?: VirtualizedOptions;\n}) {\n const fetchedCountRef = useRef(-1);\n const elements = useMemo(\n () => data.map((item, index) => {\n return (\n <Card\n key={rowKey ? item[rowKey] || index : index}\n className={cn('mb-2 w-full shadow-sm p-4 rounded-lg', cardOptions?.cardClassName)}\n isPressable={!!onRowClick}\n onPress={() => {\n onRowClick?.(item);\n }}\n >\n {columns.map((column, i) => {\n return (\n <div className=\"w-full\" key={column.key}>\n <div className={cn('w-full', cardOptions?.itemClassName)}>\n <div className={cn('font-meidum text-xs text-foreground-400', cardOptions?.labelClassName)}>{column.label}</div>\n <div className={cn('text-xs', cardOptions?.valueClassName)}>{column.render ? column.render(item) : renderFieldValue(item[column.key])}</div>\n </div>\n {cardOptions?.showDivider && i !== columns.length - 1 && <Divider className={cn('my-2', cardOptions?.dividerClassName)} />}\n </div>\n );\n })}\n </Card>\n );\n }),\n [data]\n );\n return (\n <div className={className}>\n {data.length > 0 ? (\n <VList\n style={{ height: virtualizedOptions?.vListHeight || 400 }}\n onRangeChange={async (_, endIndex) => {\n const count = data.length;\n if (endIndex + 1 >= count && fetchedCountRef.current < count) {\n fetchedCountRef.current = count;\n if (virtualizedOptions?.fetchData) {\n await virtualizedOptions.fetchData()\n }\n }\n }}\n >\n {elements}\n {isLoading ? loadingContent || DefaultLoading({ loadingOptions }) : null}\n </VList>\n ) : (\n emptyContent ?? <DefaultEmptyContent />\n )}\n </div>\n );\n}\n\nfunction VirtualizedListUI<T>({\n className,\n data,\n dataSource,\n columns,\n columnOptions,\n sortableColumnsMap,\n sortingUIOptions,\n setSortableColumnsMap,\n setSortedData,\n rowKey,\n onRowClick,\n rowCss,\n emptyContent,\n isLoading,\n loadingOptions,\n loadingContent,\n virtualizedOptions,\n}: {\n className: string;\n data: T[];\n dataSource: T[];\n columns: Column<T>[];\n columnOptions: ColumnOptions<T>;\n sortableColumnsMap: { [k: string]: 'asc' | 'desc' | 'none' };\n sortingUIOptions: SortingUIOptions;\n setSortableColumnsMap: (value: React.SetStateAction<{\n [k: string]: \"asc\" | \"desc\" | \"none\";\n }>) => void;\n setSortedData: (value: React.SetStateAction<T[]>) => void;\n rowKey?: string;\n onRowClick?: (item: T) => void;\n rowCss?: string | ((item: T) => string | undefined);\n emptyContent?: React.ReactNode;\n isLoading?: boolean;\n loadingOptions?: LoadingOptions;\n loadingContent?: React.ReactNode;\n virtualizedOptions?: VirtualizedOptions;\n}) {\n const fetchedCountRef = useRef(-1);\n const elements = useMemo(\n () => data.map((item, index) => {\n return (\n <div\n key={rowKey ? item[rowKey] || index : index}\n className={cn('flex items-center', virtualizedOptions?.classNames?.row, typeof rowCss === 'function' ? rowCss(item) : rowCss)}\n onClick={() => {\n onRowClick?.(item);\n }}\n >\n {columns.map((column) => {\n return (\n <div\n key={column.key}\n className={cn('w-full py-2 px-3 text-xs', virtualizedOptions?.classNames?.rowItem)}\n >\n {column.render ? column.render(item) : renderFieldValue(item[column.key])}\n </div>\n )\n })}\n </div>\n );\n }),\n [data]\n );\n return (\n <div className={className}>\n <div className={cn(\"w-full flex items-center rounded-lg bg-default-100\", virtualizedOptions?.classNames?.header)}>\n {columns.map((column) => {\n return (\n <div key={column.key} className={cn(\"w-full h-10 px-3 flex items-center text-xs font-semibold whitespace-nowrap\", virtualizedOptions?.classNames?.column)}>\n <span>{column.label}</span>\n {!!sortableColumnsMap[column.key] && (\n <SortingComponent\n sortingUIOptions={sortingUIOptions}\n columnOptions={columnOptions}\n sortableColumnsMap={sortableColumnsMap}\n item={column}\n onSort={({ type, key, sortKey }) => {\n const { sortableColumns, sortedData } = sortData({\n type,\n key,\n sortKey,\n sortableColumnsMap,\n dataSource,\n });\n setSortableColumnsMap(sortableColumns);\n setSortedData(sortedData);\n }}\n />\n )}\n </div>\n )\n })}\n </div>\n {data.length > 0 ? (\n <VList\n className='mt-2 w-full'\n style={{ height: virtualizedOptions?.vListHeight || 200 }}\n onRangeChange={async (_, endIndex) => {\n const count = data.length;\n if (endIndex + 1 >= count && fetchedCountRef.current < count) {\n fetchedCountRef.current = count;\n if (virtualizedOptions?.fetchData) {\n await virtualizedOptions.fetchData()\n }\n }\n }}\n >\n {elements}\n {isLoading ? loadingContent || DefaultLoading({ loadingOptions }) : null}\n </VList>\n ) : (\n emptyContent ?? <DefaultEmptyContent />\n )}\n </div>\n )\n}\n\nfunction TableUI<T>({\n className,\n classNames,\n isHeaderSticky,\n columns,\n columnOptions,\n sortableColumnsMap,\n sortingUIOptions,\n setSortableColumnsMap,\n setSortedData,\n data,\n dataSource,\n isLoading,\n loadingContent,\n loadingOptions,\n emptyContent,\n rowCss,\n onRowClick,\n showCollapsedTables,\n collapsedTableConfig,\n collapsedTables,\n rowKey,\n showPagination,\n pagination,\n nextuiPaginationProps,\n autoScrollToTop\n}: {\n className: string;\n classNames: TableClassNames;\n isHeaderSticky: boolean;\n columns: Column<T>[];\n columnOptions?: ColumnOptions<T>;\n sortableColumnsMap: { [k: string]: 'asc' | 'desc' | 'none' };\n sortingUIOptions: SortingUIOptions;\n setSortableColumnsMap: (value: React.SetStateAction<{ [k: string]: 'asc' | 'desc' | 'none'; }>) => void;\n setSortedData: (value: React.SetStateAction<T[]>) => void;\n data: T[];\n dataSource: T[];\n isLoading: boolean;\n loadingContent?: React.ReactNode;\n loadingOptions?: LoadingOptions;\n emptyContent?: React.ReactNode;\n rowCss?: string | ((item: T) => string | undefined);\n onRowClick?: (item: T) => void;\n showCollapsedTables: boolean;\n collapsedTableConfig?: CollapsedTableConfig<T>;\n collapsedTables: CollapsedTable<any>[];\n rowKey?: string;\n showPagination: boolean;\n pagination: PaginationState;\n nextuiPaginationProps: PaginationProps | {};\n autoScrollToTop: boolean;\n}) {\n const tableBoxRef = useRef<HTMLDivElement>(null);\n return (\n <>\n <div className={cn('relative w-full', className)} ref={tableBoxRef}>\n <table className={cn('w-full h-auto table-auto', classNames.table)}>\n <thead className={cn(classNames.thead, { 'sticky top-0 z-30 [&>tr]:first:shadow-small [&>tr]:first:rounded-lg': isHeaderSticky })}>\n <tr className={classNames.tr}>\n {columns.map((item) => (\n <th\n key={item.key}\n className={cn('px-3 h-10 text-xs font-semibold whitespace-nowrap bg-default-100 first:rounded-l-lg last:rounded-r-lg outline-none', classNames.th)}\n >\n <div className=\"flex items-center\">\n <span>{item.label}</span>\n {!!sortableColumnsMap[item.key] && (\n <SortingComponent\n sortingUIOptions={sortingUIOptions}\n columnOptions={columnOptions}\n sortableColumnsMap={sortableColumnsMap}\n item={item}\n onSort={({ type, key, sortKey }) => {\n const { sortableColumns, sortedData } = sortData({\n type,\n key,\n sortKey,\n sortableColumnsMap,\n dataSource,\n });\n setSortableColumnsMap(sortableColumns);\n setSortedData(sortedData);\n }}\n />\n )}\n </div>\n </th>\n ))}\n </tr>\n <tr aria-hidden=\"true\" className=\"w-px h-px block ml-[0.25rem] mt-[0.25rem]\"></tr>\n </thead>\n {isLoading ? (\n <tbody className={classNames.tbody}>\n <tr className={classNames.tr}>\n <td\n className={classNames.td}\n colSpan={columns.length}\n >\n {loadingContent || DefaultLoading({ loadingOptions })}\n </td>\n </tr>\n </tbody>\n ) : data.length > 0 ? (\n <tbody className={classNames.tbody}>\n {\n showCollapsedTables ?\n data.map(item => {\n return (\n <CollapseBodyRow\n classNames={classNames}\n item={item}\n columns={columns}\n rowCss={rowCss}\n onRowClick={onRowClick}\n collapsedTableConfig={collapsedTableConfig}\n collapsedTables={collapsedTables}\n />\n )\n })\n : data.map((item, index) => {\n return (\n <tr\n key={rowKey ? item[rowKey] || index : index}\n className={cn(classNames.tr, typeof rowCss === 'function' ? rowCss(item) : rowCss)}\n onClick={() => {\n onRowClick?.(item);\n }}\n >\n {columns.map((column) => {\n return (\n <td\n key={column.key}\n className={cn('py-2 px-3 text-xs', classNames.td)}\n >\n {column.render ? column.render(item) : renderFieldValue(item[column.key])}\n </td>\n )\n })}\n </tr>\n );\n })\n }\n </tbody>\n ) : (\n <tbody className={classNames.tbody}>\n <tr className={classNames.tr}>\n <td\n className={classNames.td}\n colSpan={columns.length}\n >\n {emptyContent ?? <DefaultEmptyContent />}\n </td>\n </tr>\n </tbody>\n )}\n </table>\n </div>\n {showPagination && pagination.total > pagination.limit && (\n <div className=\"flex justify-center\">\n <NextuiPagination\n className=\"mt-2\"\n showControls\n showShadow\n size=\"sm\"\n radius=\"sm\"\n color=\"primary\"\n initialPage={1}\n total={Math.ceil(pagination.total / pagination.limit)}\n page={pagination.page}\n onChange={(currentPage) => {\n pagination.setData({\n page: currentPage,\n });\n if (autoScrollToTop && tableBoxRef.current) {\n scrollIntoTop(tableBoxRef.current);\n }\n }}\n {...nextuiPaginationProps}\n />\n </div>\n )}\n </>\n );\n}\n\nfunction DefaultLoading({ loadingOptions }: { loadingOptions?: LoadingOptions }) {\n const type = loadingOptions?.type || 'skeleton';\n const skeletonOptions = loadingOptions?.skeleton;\n const spinnerOptions = loadingOptions?.spinner;\n const spinnerProps = spinnerOptions?.spinnerProps || {};\n\n if (type === 'skeleton') {\n return <SkeletonBox className={cn('mt-2 flex-col', skeletonOptions?.boxClassName)} skClassName={cn('h-[30px] rounded', skeletonOptions?.skeletonClassName)} line={skeletonOptions?.line || 5} />;\n }\n\n return (\n <div className={cn('w-full h-[100px] flex justify-center items-center', spinnerOptions?.boxClassName)}>\n <Spinner size=\"sm\" color=\"primary\" {...spinnerProps} />\n <div className={cn('ml-2 text-[#64748B] text-sm', spinnerOptions?.textClassName)}>{spinnerOptions?.text || 'Loading...'}</div>\n </div>\n );\n}\n\nfunction DefaultEmptyContent() {\n return <div className=\"w-full h-[100px] flex justify-center items-center text-xs text-[#64748B] dark:text-[#cacaca]\">No Data</div>;\n}\n\nfunction scrollIntoTop(target: HTMLElement) {\n if (target) {\n const { top } = target.getBoundingClientRect();\n window.scrollTo({\n top: top + window.scrollY - 100,\n behavior: 'smooth',\n });\n }\n}\n\nfunction CollapseBodyRow<T>({\n classNames,\n item,\n columns,\n rowCss,\n onRowClick,\n collapsedTableConfig,\n collapsedTables,\n}: {\n classNames?: TableClassNames;\n item: T;\n columns: Column<T>[];\n rowCss?: string | ((item: T) => string | undefined),\n onRowClick?: (item: T) => void;\n collapsedTableConfig?: {\n classNames?: TableClassNames;\n collapsedHandlerPosition?: 'left' | 'right';\n collapsedHandlerBoxCss?: string;\n openedIcon?: React.ReactNode;\n closedIcon?: React.ReactNode;\n onRowClick?: (item: any) => void;\n rowCss?: string | ((item: any) => string | undefined);\n emptyContent?: React.ReactNode;\n };\n collapsedTables: CollapsedTable<any>[];\n}) {\n const [isOpen, setIsOpen] = useState(false);\n const collapsedHandlerPosition = collapsedTableConfig?.collapsedHandlerPosition || 'right';\n\n const { OpenedIcon, ClosedIcon } = useMemo(() => {\n const defaultOpenedIcon = <ChevronDown size={18} />;\n const defaultClosedIcon = collapsedHandlerPosition === 'left' ? <ChevronRight size={18} /> : <ChevronLeft size={18} />;\n return {\n OpenedIcon: collapsedTableConfig?.openedIcon || defaultOpenedIcon,\n ClosedIcon: collapsedTableConfig?.closedIcon || defaultClosedIcon,\n };\n }, []);\n\n return (\n <>\n <tr\n className={cn('text-xs cursor-pointer', classNames?.tr, typeof rowCss === 'function' ? rowCss(item) : rowCss)}\n onClick={(e: any) => {\n onRowClick?.(item);\n }}\n >\n {columns.map((column) => {\n if (column.key === '$collapsedHandler') {\n return (\n <td className={classNames?.td}>\n <div className={cn(\"w-6 h-6 flex items-center justify-center rounded-sm hover:bg-[#f3f3f4] dark:hover:bg-[#1e1e1e]\", collapsedTableConfig?.collapsedHandlerBoxCss)}\n onClick={(e) => {\n e.stopPropagation();\n setIsOpen((v) => !v);\n }}\n >\n {isOpen ? OpenedIcon : ClosedIcon}\n </div>\n </td>\n );\n }\n return (\n <td key={column.key} className={cn(\"py-2 px-3 text-xs\", classNames?.td)}>\n {column.render ? column.render(item) : renderFieldValue(item[column.key])}\n </td>\n );\n })}\n </tr>\n <tr className={cn(classNames?.tr, isOpen ? 'table-row' : 'hidden')}>\n <td colSpan={columns.length} className={cn(\"py-2 px-3 text-xs\", classNames?.td)}>\n {collapsedTables.map((ex) => {\n const exColumns = ex.columns;\n const exData = item[ex.key] || [];\n return (\n <table className={cn(\"w-full h-auto table-auto\", collapsedTableConfig?.classNames?.table)} key={ex.key}>\n <thead className={collapsedTableConfig?.classNames?.thead}>\n <tr className={collapsedTableConfig?.classNames?.tr}>\n {exColumns?.map((exC) => {\n return (\n <th\n key={exC.key}\n className={cn('px-3 h-10 text-xs text-left font-semibold bg-default-100 first:rounded-l-lg last:rounded-r-lg outline-none', collapsedTableConfig?.classNames?.th)}\n >\n {exC.label}\n </th>\n );\n })}\n </tr>\n <tr aria-hidden=\"true\" className=\"w-px h-px block ml-[0.25rem] mt-[0.25rem]\"></tr>\n </thead>\n {exData.length > 0 ? (\n <tbody className={collapsedTableConfig?.classNames?.tbody}>\n {\n exData.map((exItem) => (\n <tr\n key={exItem.key}\n className={cn('text-xs',\n collapsedTableConfig?.classNames?.tr,\n typeof collapsedTableConfig?.rowCss === 'function'\n ? collapsedTableConfig?.rowCss({\n ...exItem,\n $parent: item,\n })\n : collapsedTableConfig?.rowCss\n )}\n onClick={(e: any) => {\n collapsedTableConfig?.onRowClick?.({\n ...exItem,\n $parent: item,\n });\n }}\n >\n {exColumns?.map((exC) => {\n return (\n <td\n key={exC.key}\n className={cn('py-2 px-3 text-xs', collapsedTableConfig?.classNames?.td)}\n >\n {exC.render\n ? exC.render({\n ...exItem,\n $parent: item,\n })\n : renderFieldValue(exItem[exC.key])}\n </td>\n );\n })}\n </tr>\n ))\n }\n </tbody>\n ) : (\n <tbody className={collapsedTableConfig?.classNames?.tbody}>\n <tr className={collapsedTableConfig?.classNames?.tr}>\n <td\n className={collapsedTableConfig?.classNames?.td}\n colSpan={columns.length}\n >\n {collapsedTableConfig?.emptyContent ?? <DefaultEmptyContent />}\n </td>\n </tr>\n </tbody>\n )}\n </table>\n );\n })}\n </td>\n </tr>\n </>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\"\nimport { Check, ChevronRight, Circle } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\";\n\nconst DropdownMenu = DropdownMenuPrimitive.Root\n\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger\n\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group\n\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal\n\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub\n\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup\n\nconst DropdownMenuArrow = DropdownMenuPrimitive.Arrow\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n \"flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto h-4 w-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n))\nDropdownMenuSubTrigger.displayName =\n DropdownMenuPrimitive.SubTrigger.displayName\n\nconst DropdownMenuSubContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md bg-white dark:bg-[#18181B] border dark:border-none p-1 text-popover-foreground shadow-md animate-in data-[side=bottom]:slide-in-from-top-1 data-[side=left]:slide-in-from-right-1 data-[side=right]:slide-in-from-left-1 data-[side=top]:slide-in-from-bottom-1\",\n className\n )}\n {...props}\n />\n))\nDropdownMenuSubContent.displayName =\n DropdownMenuPrimitive.SubContent.displayName\n\nconst DropdownMenuContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-lg bg-white dark:bg-[#18181B] border dark:border-[#3e3e3e] p-1 text-popover-foreground shadow-md animate-in data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\",\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n))\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName\n\nconst DropdownMenuItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n))\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n))\nDropdownMenuCheckboxItem.displayName =\n DropdownMenuPrimitive.CheckboxItem.displayName\n\nconst DropdownMenuRadioItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Circle className=\"h-2 w-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n))\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName\n\nconst DropdownMenuLabel = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn(\n \"px-2 py-1.5 text-sm font-semibold\",\n inset && \"pl-8\",\n className\n )}\n {...props}\n />\n))\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName\n\nconst DropdownMenuSeparator = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...props}\n />\n))\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName\n\nconst DropdownMenuShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn(\"ml-auto text-xs tracking-widest opacity-60\", className)}\n {...props}\n />\n )\n}\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\"\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n DropdownMenuArrow,\n}\n"]}