@dappworks/kit 0.5.7 → 0.5.8

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.
@@ -5,7 +5,7 @@ import { cn } from './chunk-2HNXZE3X.mjs';
5
5
  import { __objRest, __spreadValues, __spreadProps } from './chunk-R4SQKVDQ.mjs';
6
6
  import * as React2 from 'react';
7
7
  import React2__default, { useRef, useEffect, useState, useMemo } from 'react';
8
- import { Pagination, Spinner, Card, Divider } from '@nextui-org/react';
8
+ import { Card, Divider, Pagination, Spinner } 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';
@@ -496,83 +496,77 @@ function SortingComponent({
496
496
  }
497
497
  ));
498
498
  }
499
- var CardUI = observer(({
500
- className,
501
- sortedData,
502
- columns,
503
- rowKey,
504
- cardOptions,
505
- onRowClick,
506
- emptyContent,
507
- columnSlot,
508
- isServerPaging,
509
- showPagination,
510
- pagination,
511
- nextuiPaginationProps,
512
- autoScrollToTop
513
- }) => {
514
- const cardBoxRef = useRef(null);
515
- useEffect(() => {
516
- if (!isServerPaging) {
517
- pagination.setData({
518
- total: sortedData.length
519
- });
520
- }
521
- }, [sortedData]);
522
- const data = isServerPaging || !showPagination ? sortedData : sortedData.slice(pagination.offset, pagination.offset + pagination.limit);
523
- const MyCard = ({ item }) => {
524
- return /* @__PURE__ */ React2__default.createElement(
525
- Card,
526
- {
527
- className: cn("mb-2 w-full shadow-sm p-4 rounded-lg", cardOptions == null ? void 0 : cardOptions.cardClassName),
528
- isPressable: !!onRowClick,
529
- onPress: () => {
530
- onRowClick == null ? void 0 : onRowClick(item);
531
- }
532
- },
533
- columns.map((column, i) => {
534
- return /* @__PURE__ */ React2__default.createElement("div", { className: "w-full", key: column.key }, /* @__PURE__ */ React2__default.createElement("div", { className: cn("w-full", cardOptions == null ? void 0 : cardOptions.itemClassName) }, /* @__PURE__ */ React2__default.createElement("div", { className: cn("font-meidum text-xs text-foreground-400", cardOptions == null ? void 0 : cardOptions.labelClassName) }, column.label), /* @__PURE__ */ React2__default.createElement("div", { className: cn("text-xs", cardOptions == null ? void 0 : cardOptions.valueClassName) }, column.render ? column.render(item) : renderFieldValue(item[column.key]))), (cardOptions == null ? void 0 : cardOptions.showDivider) && i !== columns.length - 1 && /* @__PURE__ */ React2__default.createElement(Divider, { className: cn("my-2", cardOptions == null ? void 0 : cardOptions.dividerClassName) }));
535
- }),
536
- typeof columnSlot === "function" ? columnSlot({ row: item }) : columnSlot
537
- );
538
- };
539
- const GroupUI = () => {
540
- const colSpan = (cardOptions == null ? void 0 : cardOptions.colSpan) || 1;
541
- if (colSpan === 1) {
542
- return data.map((item, index) => {
543
- return /* @__PURE__ */ React2__default.createElement(MyCard, { key: rowKey ? item[rowKey] || index : index, item });
544
- });
545
- }
546
- const groupData = groupByColSpan(data, colSpan);
547
- return groupData.map((group, gIndex) => {
548
- return /* @__PURE__ */ React2__default.createElement("div", { className: cn("flex items-center justify-between space-x-1", cardOptions == null ? void 0 : cardOptions.cardGroupClassName), key: gIndex }, group.map((item, index) => {
549
- return /* @__PURE__ */ React2__default.createElement(MyCard, { key: rowKey ? item[rowKey] || index : index, item });
550
- }));
551
- });
552
- };
553
- return /* @__PURE__ */ React2__default.createElement("div", { className, ref: cardBoxRef }, sortedData.length > 0 ? /* @__PURE__ */ React2__default.createElement(React2__default.Fragment, null, /* @__PURE__ */ React2__default.createElement(GroupUI, null), showPagination && pagination.total > pagination.limit && /* @__PURE__ */ React2__default.createElement("div", { className: "flex justify-center" }, /* @__PURE__ */ React2__default.createElement(
554
- Pagination,
555
- __spreadValues({
556
- className: "mt-2",
557
- showControls: true,
558
- showShadow: true,
559
- size: "sm",
560
- radius: "sm",
561
- color: "primary",
562
- initialPage: 1,
563
- total: Math.ceil(pagination.total / pagination.limit),
564
- page: pagination.page,
565
- onChange: (currentPage) => {
499
+ var CardUI = observer(
500
+ ({
501
+ className,
502
+ sortedData,
503
+ columns,
504
+ rowKey,
505
+ cardOptions,
506
+ onRowClick,
507
+ emptyContent,
508
+ columnSlot,
509
+ isServerPaging,
510
+ showPagination,
511
+ pagination,
512
+ nextuiPaginationProps,
513
+ autoScrollToTop
514
+ }) => {
515
+ const cardBoxRef = useRef(null);
516
+ pagination = pagination ? pagination : useRef(
517
+ new PaginationState({
518
+ page: 1,
519
+ limit: 10
520
+ })
521
+ ).current;
522
+ useEffect(() => {
523
+ if (!isServerPaging && pagination) {
566
524
  pagination.setData({
567
- page: currentPage
525
+ total: sortedData.length
568
526
  });
569
- if (autoScrollToTop && cardBoxRef.current) {
570
- scrollIntoTop(cardBoxRef.current);
571
- }
572
527
  }
573
- }, nextuiPaginationProps)
574
- ))) : emptyContent != null ? emptyContent : /* @__PURE__ */ React2__default.createElement(DefaultEmptyContent, null));
575
- });
528
+ }, [sortedData]);
529
+ const data = isServerPaging || !showPagination ? sortedData : sortedData.slice(pagination.offset, pagination.offset + pagination.limit);
530
+ return /* @__PURE__ */ React2__default.createElement("div", { className, ref: cardBoxRef }, sortedData.length > 0 ? /* @__PURE__ */ React2__default.createElement(React2__default.Fragment, null, /* @__PURE__ */ React2__default.createElement("div", { className: cardOptions == null ? void 0 : cardOptions.cardContainerClassName }, data.map((item, index) => {
531
+ return /* @__PURE__ */ React2__default.createElement(
532
+ Card,
533
+ {
534
+ key: rowKey ? item[rowKey] || index : index,
535
+ className: cn("mb-2 w-full shadow-sm p-4 rounded-lg", cardOptions == null ? void 0 : cardOptions.cardClassName),
536
+ isPressable: !!onRowClick,
537
+ onPress: () => {
538
+ onRowClick == null ? void 0 : onRowClick(item);
539
+ }
540
+ },
541
+ columns.map((column, i) => {
542
+ return /* @__PURE__ */ React2__default.createElement("div", { className: "w-full", key: column.key }, /* @__PURE__ */ React2__default.createElement("div", { className: cn("w-full", cardOptions == null ? void 0 : cardOptions.itemClassName) }, /* @__PURE__ */ React2__default.createElement("div", { className: cn("font-meidum text-xs text-foreground-400", cardOptions == null ? void 0 : cardOptions.labelClassName) }, column.label), /* @__PURE__ */ React2__default.createElement("div", { className: cn("text-xs", cardOptions == null ? void 0 : cardOptions.valueClassName) }, column.render ? column.render(item) : renderFieldValue(item[column.key]))), (cardOptions == null ? void 0 : cardOptions.showDivider) && i !== columns.length - 1 && /* @__PURE__ */ React2__default.createElement(Divider, { className: cn("my-2", cardOptions == null ? void 0 : cardOptions.dividerClassName) }));
543
+ }),
544
+ typeof columnSlot === "function" ? columnSlot({ row: item }) : columnSlot
545
+ );
546
+ })), showPagination && pagination.total > pagination.limit && /* @__PURE__ */ React2__default.createElement("div", { className: "flex justify-center" }, /* @__PURE__ */ React2__default.createElement(
547
+ Pagination,
548
+ __spreadValues({
549
+ className: "mt-2",
550
+ showControls: true,
551
+ showShadow: true,
552
+ size: "sm",
553
+ radius: "sm",
554
+ color: "primary",
555
+ initialPage: 1,
556
+ total: Math.ceil(pagination.total / pagination.limit),
557
+ page: pagination.page,
558
+ onChange: (currentPage) => {
559
+ pagination.setData({
560
+ page: currentPage
561
+ });
562
+ if (autoScrollToTop && cardBoxRef.current) {
563
+ scrollIntoTop(cardBoxRef.current);
564
+ }
565
+ }
566
+ }, nextuiPaginationProps)
567
+ ))) : emptyContent != null ? emptyContent : /* @__PURE__ */ React2__default.createElement(DefaultEmptyContent, null));
568
+ }
569
+ );
576
570
  function VirtualizedCardUI({
577
571
  className,
578
572
  sortedData,
@@ -587,41 +581,47 @@ function VirtualizedCardUI({
587
581
  virtualizedOptions,
588
582
  columnSlot
589
583
  }) {
590
- const colSpan = (cardOptions == null ? void 0 : cardOptions.colSpan) || 1;
584
+ var _a, _b;
585
+ const colSpan = ((_a = virtualizedOptions == null ? void 0 : virtualizedOptions.cardOptions) == null ? void 0 : _a.colSpan) || ((_b = cardOptions == null ? void 0 : cardOptions.virtualizedOptions) == null ? void 0 : _b.colSpan) || 1;
591
586
  const fetchedCountRef = useRef(-1);
592
- const elements = useMemo(
593
- () => {
594
- const MyCard = ({ item }) => {
587
+ const elements = useMemo(() => {
588
+ const MyCard = ({ item }) => {
589
+ return /* @__PURE__ */ React2__default.createElement(
590
+ Card,
591
+ {
592
+ className: cn("mb-2 w-full shadow-sm p-4 rounded-lg", cardOptions == null ? void 0 : cardOptions.cardClassName),
593
+ isPressable: !!onRowClick,
594
+ onPress: () => {
595
+ onRowClick == null ? void 0 : onRowClick(item);
596
+ }
597
+ },
598
+ columns.map((column, i) => {
599
+ return /* @__PURE__ */ React2__default.createElement("div", { className: "w-full", key: column.key }, /* @__PURE__ */ React2__default.createElement("div", { className: cn("w-full", cardOptions == null ? void 0 : cardOptions.itemClassName) }, /* @__PURE__ */ React2__default.createElement("div", { className: cn("font-meidum text-xs text-foreground-400", cardOptions == null ? void 0 : cardOptions.labelClassName) }, column.label), /* @__PURE__ */ React2__default.createElement("div", { className: cn("text-xs", cardOptions == null ? void 0 : cardOptions.valueClassName) }, column.render ? column.render(item) : renderFieldValue(item[column.key]))), (cardOptions == null ? void 0 : cardOptions.showDivider) && i !== columns.length - 1 && /* @__PURE__ */ React2__default.createElement(Divider, { className: cn("my-2", cardOptions == null ? void 0 : cardOptions.dividerClassName) }));
600
+ }),
601
+ typeof columnSlot === "function" ? columnSlot({ row: item }) : columnSlot
602
+ );
603
+ };
604
+ if (colSpan === 1) {
605
+ return sortedData.map((item, index) => {
606
+ return /* @__PURE__ */ React2__default.createElement(MyCard, { key: rowKey ? item[rowKey] || index : index, item });
607
+ });
608
+ } else {
609
+ const groupData = groupByColSpan(sortedData, colSpan);
610
+ return groupData.map((group, gIndex) => {
611
+ var _a2, _b2;
595
612
  return /* @__PURE__ */ React2__default.createElement(
596
- Card,
613
+ "div",
597
614
  {
598
- className: cn("mb-2 w-full shadow-sm p-4 rounded-lg", cardOptions == null ? void 0 : cardOptions.cardClassName),
599
- isPressable: !!onRowClick,
600
- onPress: () => {
601
- onRowClick == null ? void 0 : onRowClick(item);
602
- }
615
+ className: cn("flex items-center justify-between space-x-1", ((_a2 = virtualizedOptions == null ? void 0 : virtualizedOptions.cardOptions) == null ? void 0 : _a2.cardContainerClassName) || ((_b2 = cardOptions == null ? void 0 : cardOptions.virtualizedOptions) == null ? void 0 : _b2.cardContainerClassName)),
616
+ key: gIndex
603
617
  },
604
- columns.map((column, i) => {
605
- return /* @__PURE__ */ React2__default.createElement("div", { className: "w-full", key: column.key }, /* @__PURE__ */ React2__default.createElement("div", { className: cn("w-full", cardOptions == null ? void 0 : cardOptions.itemClassName) }, /* @__PURE__ */ React2__default.createElement("div", { className: cn("font-meidum text-xs text-foreground-400", cardOptions == null ? void 0 : cardOptions.labelClassName) }, column.label), /* @__PURE__ */ React2__default.createElement("div", { className: cn("text-xs", cardOptions == null ? void 0 : cardOptions.valueClassName) }, column.render ? column.render(item) : renderFieldValue(item[column.key]))), (cardOptions == null ? void 0 : cardOptions.showDivider) && i !== columns.length - 1 && /* @__PURE__ */ React2__default.createElement(Divider, { className: cn("my-2", cardOptions == null ? void 0 : cardOptions.dividerClassName) }));
606
- }),
607
- typeof columnSlot === "function" ? columnSlot({ row: item }) : columnSlot
608
- );
609
- };
610
- if (colSpan === 1) {
611
- return sortedData.map((item, index) => {
612
- return /* @__PURE__ */ React2__default.createElement(MyCard, { key: rowKey ? item[rowKey] || index : index, item });
613
- });
614
- } else {
615
- const groupData = groupByColSpan(sortedData, colSpan);
616
- return groupData.map((group, gIndex) => {
617
- return /* @__PURE__ */ React2__default.createElement("div", { className: cn("flex items-center justify-between space-x-1", cardOptions == null ? void 0 : cardOptions.cardGroupClassName), key: gIndex }, group.map((item, index) => {
618
+ group.map((item, index) => {
618
619
  return /* @__PURE__ */ React2__default.createElement(MyCard, { key: rowKey ? item[rowKey] || index : index, item });
619
- }));
620
- });
621
- }
622
- },
623
- [sortedData]
624
- );
620
+ })
621
+ );
622
+ });
623
+ }
624
+ }, [sortedData]);
625
625
  return /* @__PURE__ */ React2__default.createElement("div", { className }, sortedData.length > 0 ? /* @__PURE__ */ React2__default.createElement(
626
626
  VList,
627
627
  {
@@ -742,150 +742,141 @@ function VirtualizedListUI({
742
742
  isLoading ? loadingContent || DefaultLoading({ loadingOptions }) : null
743
743
  ) : emptyContent != null ? emptyContent : /* @__PURE__ */ React2__default.createElement(DefaultEmptyContent, null)));
744
744
  }
745
- var TableUI = observer(({
746
- className,
747
- classNames = {},
748
- isHeaderSticky,
749
- sortedData,
750
- dataSource,
751
- columns,
752
- columnOptions,
753
- sortableColumnsMap,
754
- sortingUIOptions,
755
- setSortableColumnsMap,
756
- setSortedData,
757
- isLoading,
758
- loadingContent,
759
- loadingOptions,
760
- emptyContent,
761
- rowCss,
762
- onRowClick,
763
- showCollapsedTables,
764
- collapsedTableConfig,
765
- collapsedTables,
766
- rowKey,
767
- isServerPaging,
768
- showPagination,
769
- pagination = new PaginationState({
770
- page: 1,
771
- limit: 10
772
- }),
773
- nextuiPaginationProps = {},
774
- autoScrollToTop,
775
- columnSlot
776
- }) => {
777
- const tableBoxRef = useRef(null);
778
- useEffect(() => {
779
- if (!isServerPaging) {
780
- pagination.setData({
781
- total: dataSource.length
782
- });
783
- }
784
- }, [dataSource]);
785
- const data = isServerPaging || !showPagination ? sortedData : sortedData.slice(pagination.offset, pagination.offset + pagination.limit);
786
- 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(
787
- "th",
788
- {
789
- key: item.key,
790
- 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),
791
- style: {
792
- minWidth: item.width
793
- }
794
- },
795
- /* @__PURE__ */ React2__default.createElement("div", { className: "flex items-center" }, /* @__PURE__ */ React2__default.createElement("span", null, item.label), !!sortableColumnsMap[item.key] && /* @__PURE__ */ React2__default.createElement(
796
- SortingComponent,
797
- {
798
- sortingUIOptions,
799
- columnOptions,
800
- sortableColumnsMap,
801
- item,
802
- onSort: ({ type, key, sortKey }) => {
803
- const { sortableColumns, sortedData: sortedData2 } = sortData({
804
- type,
805
- key,
806
- sortKey,
807
- sortableColumnsMap,
808
- dataSource
809
- });
810
- setSortableColumnsMap(sortableColumns);
811
- setSortedData(sortedData2);
812
- }
813
- }
814
- ))
815
- ))), /* @__PURE__ */ React2__default.createElement("tr", { "aria-hidden": "true", className: "w-px h-px block ml-[0.25rem] mt-[0.25rem]" })), isLoading ? /* @__PURE__ */ React2__default.createElement("tbody", { className: classNames.tbody }, /* @__PURE__ */ React2__default.createElement("tr", { className: classNames.tr }, /* @__PURE__ */ React2__default.createElement(
816
- "td",
817
- {
818
- className: classNames.td,
819
- colSpan: columns.length
820
- },
821
- loadingContent || DefaultLoading({ loadingOptions })
822
- ))) : data.length > 0 ? /* @__PURE__ */ React2__default.createElement("tbody", { className: classNames.tbody }, showCollapsedTables ? data.map((item) => {
823
- return /* @__PURE__ */ React2__default.createElement(
824
- CollapseBodyRow,
825
- {
826
- classNames,
827
- item,
828
- columns,
829
- rowCss,
830
- onRowClick,
831
- collapsedTableConfig,
832
- collapsedTables
745
+ var TableUI = observer(
746
+ ({
747
+ className,
748
+ classNames = {},
749
+ isHeaderSticky,
750
+ sortedData,
751
+ dataSource,
752
+ columns,
753
+ columnOptions,
754
+ sortableColumnsMap,
755
+ sortingUIOptions,
756
+ setSortableColumnsMap,
757
+ setSortedData,
758
+ isLoading,
759
+ loadingContent,
760
+ loadingOptions,
761
+ emptyContent,
762
+ rowCss,
763
+ onRowClick,
764
+ showCollapsedTables,
765
+ collapsedTableConfig,
766
+ collapsedTables,
767
+ rowKey,
768
+ isServerPaging,
769
+ showPagination,
770
+ pagination,
771
+ nextuiPaginationProps = {},
772
+ autoScrollToTop,
773
+ columnSlot
774
+ }) => {
775
+ const tableBoxRef = useRef(null);
776
+ pagination = pagination ? pagination : useRef(
777
+ new PaginationState({
778
+ page: 1,
779
+ limit: 10
780
+ })
781
+ ).current;
782
+ useEffect(() => {
783
+ if (!isServerPaging) {
784
+ pagination.setData({
785
+ total: dataSource.length
786
+ });
833
787
  }
834
- );
835
- }) : data.map((item, index) => {
836
- return /* @__PURE__ */ React2__default.createElement(React2__default.Fragment, null, /* @__PURE__ */ React2__default.createElement(
837
- "tr",
788
+ }, [dataSource]);
789
+ const data = isServerPaging || !showPagination ? sortedData : sortedData.slice(pagination.offset, pagination.offset + pagination.limit);
790
+ 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(
791
+ "th",
838
792
  {
839
- key: rowKey ? item[rowKey] || index : index,
840
- className: cn(classNames.tr, typeof rowCss === "function" ? rowCss(item) : rowCss),
841
- onClick: () => {
842
- onRowClick == null ? void 0 : onRowClick(item);
793
+ key: item.key,
794
+ 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),
795
+ style: {
796
+ minWidth: item.width
843
797
  }
844
798
  },
845
- columns.map((column) => {
846
- return /* @__PURE__ */ React2__default.createElement(
847
- "td",
848
- {
849
- key: column.key,
850
- className: cn("py-2 px-3 text-xs", classNames.td),
851
- style: {
852
- minWidth: column.width
853
- }
854
- },
855
- column.render ? column.render(item) : renderFieldValue(item[column.key])
856
- );
857
- })
858
- ), columnSlot && /* @__PURE__ */ React2__default.createElement("tr", null, /* @__PURE__ */ React2__default.createElement("td", { colSpan: columns.length }, typeof columnSlot === "function" ? columnSlot({ row: item }) : columnSlot)));
859
- })) : /* @__PURE__ */ React2__default.createElement("tbody", { className: classNames.tbody }, /* @__PURE__ */ React2__default.createElement("tr", { className: classNames.tr }, /* @__PURE__ */ React2__default.createElement(
860
- "td",
861
- {
862
- className: classNames.td,
863
- colSpan: columns.length
864
- },
865
- emptyContent != null ? emptyContent : /* @__PURE__ */ React2__default.createElement(DefaultEmptyContent, null)
866
- ))))), showPagination && pagination.total > pagination.limit && /* @__PURE__ */ React2__default.createElement("div", { className: "flex justify-center" }, /* @__PURE__ */ React2__default.createElement(
867
- Pagination,
868
- __spreadValues({
869
- className: "mt-2",
870
- showControls: true,
871
- showShadow: true,
872
- size: "sm",
873
- radius: "sm",
874
- color: "primary",
875
- initialPage: 1,
876
- total: Math.ceil(pagination.total / pagination.limit),
877
- page: pagination.page,
878
- onChange: (currentPage) => {
879
- pagination.setData({
880
- page: currentPage
881
- });
882
- if (autoScrollToTop && tableBoxRef.current) {
883
- scrollIntoTop(tableBoxRef.current);
799
+ /* @__PURE__ */ React2__default.createElement("div", { className: "flex items-center" }, /* @__PURE__ */ React2__default.createElement("span", null, item.label), !!sortableColumnsMap[item.key] && /* @__PURE__ */ React2__default.createElement(
800
+ SortingComponent,
801
+ {
802
+ sortingUIOptions,
803
+ columnOptions,
804
+ sortableColumnsMap,
805
+ item,
806
+ onSort: ({ type, key, sortKey }) => {
807
+ const { sortableColumns, sortedData: sortedData2 } = sortData({
808
+ type,
809
+ key,
810
+ sortKey,
811
+ sortableColumnsMap,
812
+ dataSource
813
+ });
814
+ setSortableColumnsMap(sortableColumns);
815
+ setSortedData(sortedData2);
816
+ }
884
817
  }
885
- }
886
- }, nextuiPaginationProps)
887
- )));
888
- });
818
+ ))
819
+ ))), /* @__PURE__ */ React2__default.createElement("tr", { "aria-hidden": "true", className: "w-px h-px block ml-[0.25rem] mt-[0.25rem]" })), isLoading ? /* @__PURE__ */ React2__default.createElement("tbody", { className: classNames.tbody }, /* @__PURE__ */ React2__default.createElement("tr", { className: classNames.tr }, /* @__PURE__ */ React2__default.createElement("td", { className: classNames.td, colSpan: columns.length }, loadingContent || DefaultLoading({ loadingOptions })))) : data.length > 0 ? /* @__PURE__ */ React2__default.createElement("tbody", { className: classNames.tbody }, showCollapsedTables ? data.map((item) => {
820
+ return /* @__PURE__ */ React2__default.createElement(
821
+ CollapseBodyRow,
822
+ {
823
+ classNames,
824
+ item,
825
+ columns,
826
+ rowCss,
827
+ onRowClick,
828
+ collapsedTableConfig,
829
+ collapsedTables
830
+ }
831
+ );
832
+ }) : data.map((item, index) => {
833
+ return /* @__PURE__ */ React2__default.createElement(React2__default.Fragment, null, /* @__PURE__ */ React2__default.createElement(
834
+ "tr",
835
+ {
836
+ key: rowKey ? item[rowKey] || index : index,
837
+ className: cn(classNames.tr, typeof rowCss === "function" ? rowCss(item) : rowCss),
838
+ onClick: () => {
839
+ onRowClick == null ? void 0 : onRowClick(item);
840
+ }
841
+ },
842
+ columns.map((column) => {
843
+ return /* @__PURE__ */ React2__default.createElement(
844
+ "td",
845
+ {
846
+ key: column.key,
847
+ className: cn("py-2 px-3 text-xs", classNames.td),
848
+ style: {
849
+ minWidth: column.width
850
+ }
851
+ },
852
+ column.render ? column.render(item) : renderFieldValue(item[column.key])
853
+ );
854
+ })
855
+ ), columnSlot && /* @__PURE__ */ React2__default.createElement("tr", null, /* @__PURE__ */ React2__default.createElement("td", { colSpan: columns.length }, typeof columnSlot === "function" ? columnSlot({ row: item }) : columnSlot)));
856
+ })) : /* @__PURE__ */ React2__default.createElement("tbody", { className: classNames.tbody }, /* @__PURE__ */ React2__default.createElement("tr", { className: classNames.tr }, /* @__PURE__ */ React2__default.createElement("td", { className: classNames.td, colSpan: columns.length }, emptyContent != null ? emptyContent : /* @__PURE__ */ React2__default.createElement(DefaultEmptyContent, null)))))), showPagination && pagination.total > pagination.limit && /* @__PURE__ */ React2__default.createElement("div", { className: "flex justify-center" }, /* @__PURE__ */ React2__default.createElement(
857
+ Pagination,
858
+ __spreadValues({
859
+ className: "mt-2",
860
+ showControls: true,
861
+ showShadow: true,
862
+ size: "sm",
863
+ radius: "sm",
864
+ color: "primary",
865
+ initialPage: 1,
866
+ total: Math.ceil(pagination.total / pagination.limit),
867
+ page: pagination.page,
868
+ onChange: (currentPage) => {
869
+ pagination.setData({
870
+ page: currentPage
871
+ });
872
+ if (autoScrollToTop && tableBoxRef.current) {
873
+ scrollIntoTop(tableBoxRef.current);
874
+ }
875
+ }
876
+ }, nextuiPaginationProps)
877
+ )));
878
+ }
879
+ );
889
880
  function DefaultLoading({ loadingOptions }) {
890
881
  const type = (loadingOptions == null ? void 0 : loadingOptions.type) || "skeleton";
891
882
  const skeletonOptions = loadingOptions == null ? void 0 : loadingOptions.skeleton;
@@ -1024,14 +1015,7 @@ function CollapseBodyRow({
1024
1015
  );
1025
1016
  })
1026
1017
  );
1027
- })) : /* @__PURE__ */ React2__default.createElement("tbody", { className: (_e = collapsedTableConfig == null ? void 0 : collapsedTableConfig.classNames) == null ? void 0 : _e.tbody }, /* @__PURE__ */ React2__default.createElement("tr", { className: (_f = collapsedTableConfig == null ? void 0 : collapsedTableConfig.classNames) == null ? void 0 : _f.tr }, /* @__PURE__ */ React2__default.createElement(
1028
- "td",
1029
- {
1030
- className: (_g = collapsedTableConfig == null ? void 0 : collapsedTableConfig.classNames) == null ? void 0 : _g.td,
1031
- colSpan: columns.length
1032
- },
1033
- (_h = collapsedTableConfig == null ? void 0 : collapsedTableConfig.emptyContent) != null ? _h : /* @__PURE__ */ React2__default.createElement(DefaultEmptyContent, null)
1034
- ))));
1018
+ })) : /* @__PURE__ */ React2__default.createElement("tbody", { className: (_e = collapsedTableConfig == null ? void 0 : collapsedTableConfig.classNames) == null ? void 0 : _e.tbody }, /* @__PURE__ */ React2__default.createElement("tr", { className: (_f = collapsedTableConfig == null ? void 0 : collapsedTableConfig.classNames) == null ? void 0 : _f.tr }, /* @__PURE__ */ React2__default.createElement("td", { className: (_g = collapsedTableConfig == null ? void 0 : collapsedTableConfig.classNames) == null ? void 0 : _g.td, colSpan: columns.length }, (_h = collapsedTableConfig == null ? void 0 : collapsedTableConfig.emptyContent) != null ? _h : /* @__PURE__ */ React2__default.createElement(DefaultEmptyContent, null)))));
1035
1019
  }))));
1036
1020
  }
1037
1021
  function groupByColSpan(arr, colSpan) {
@@ -1044,4 +1028,4 @@ function groupByColSpan(arr, colSpan) {
1044
1028
 
1045
1029
  export { JSONTable };
1046
1030
  //# sourceMappingURL=out.js.map
1047
- //# sourceMappingURL=chunk-24SBSTZU.mjs.map
1031
+ //# sourceMappingURL=chunk-QYVOP7FN.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","_b","_","sortedData"],"mappings":"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","sourcesContent":["import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport { Card, Divider, Pagination as NextuiPagination, PaginationProps, Spinner, SpinnerProps } 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 cardContainerClassName?: string;\n cardClassName?: string;\n itemClassName?: string;\n labelClassName?: string;\n valueClassName?: string;\n showDivider?: boolean;\n dividerClassName?: string;\n virtualizedOptions?: {\n colSpan?: number;\n cardContainerClassName?: string;\n };\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 cardOptions?: {\n colSpan?: number;\n cardContainerClassName?: 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 columnSlot?: ((props: { row: T }) => React.ReactNode) | 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 columnSlot,\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 ?? 60,\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 ?? 60,\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: 60,\n });\n } else {\n columns = [\n {\n key: \"$collapsedHandler\",\n label: \"\",\n width: 60,\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 if (virtualizedOptions?.isVirtualized) {\n return (\n <VirtualizedCardUI\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 columnSlot={columnSlot}\n />\n );\n } else {\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 columnSlot={columnSlot}\n showPagination={showPagination}\n pagination={pagination}\n nextuiPaginationProps={nextuiPaginationProps}\n />\n );\n }\n } else {\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 } else {\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 columnSlot={columnSlot}\n />\n );\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\nconst CardUI = observer(\n <T,>({\n className,\n sortedData,\n columns,\n rowKey,\n cardOptions,\n onRowClick,\n emptyContent,\n columnSlot,\n isServerPaging,\n showPagination,\n pagination,\n nextuiPaginationProps,\n autoScrollToTop,\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 columnSlot?: ((props: { row: T }) => React.ReactNode) | React.ReactNode;\n isServerPaging?: boolean;\n showPagination: boolean;\n pagination?: PaginationState;\n nextuiPaginationProps?: PaginationProps | {};\n }) => {\n const cardBoxRef = useRef<HTMLDivElement>(null);\n pagination = pagination\n ? pagination\n : useRef(\n new PaginationState({\n page: 1,\n limit: 10,\n }),\n ).current;\n\n useEffect(() => {\n if (!isServerPaging && pagination) {\n pagination.setData({\n total: sortedData.length,\n });\n }\n }, [sortedData]);\n\n const data = isServerPaging || !showPagination ? sortedData : sortedData.slice(pagination.offset, pagination.offset + pagination.limit);\n\n return (\n <div className={className} ref={cardBoxRef}>\n {sortedData.length > 0 ? (\n <>\n <div className={cardOptions?.cardContainerClassName}>\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 {typeof columnSlot === \"function\" ? columnSlot({ row: item }) : columnSlot}\n </Card>\n );\n })}\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 && cardBoxRef.current) {\n scrollIntoTop(cardBoxRef.current);\n }\n }}\n {...nextuiPaginationProps}\n />\n </div>\n )}\n </>\n ) : (\n (emptyContent ?? <DefaultEmptyContent />)\n )}\n </div>\n );\n },\n);\n\nfunction VirtualizedCardUI<T>({\n className,\n sortedData,\n columns,\n rowKey,\n cardOptions,\n onRowClick,\n emptyContent,\n isLoading,\n loadingOptions,\n loadingContent,\n virtualizedOptions,\n columnSlot,\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 columnSlot?: ((props: { row: T }) => React.ReactNode) | React.ReactNode;\n}) {\n const colSpan = virtualizedOptions?.cardOptions?.colSpan || cardOptions?.virtualizedOptions?.colSpan || 1;\n const fetchedCountRef = useRef(-1);\n const elements = useMemo(() => {\n const MyCard = ({ item }) => {\n return (\n <Card\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 {typeof columnSlot === \"function\" ? columnSlot({ row: item }) : columnSlot}\n </Card>\n );\n };\n if (colSpan === 1) {\n return sortedData.map((item, index) => {\n return <MyCard key={rowKey ? item[rowKey] || index : index} item={item} />;\n });\n } else {\n const groupData = groupByColSpan(sortedData, colSpan);\n return groupData.map((group, gIndex) => {\n return (\n <div\n className={cn(\"flex items-center justify-between space-x-1\", virtualizedOptions?.cardOptions?.cardContainerClassName || cardOptions?.virtualizedOptions?.cardContainerClassName)}\n key={gIndex}\n >\n {group.map((item, index) => {\n return <MyCard key={rowKey ? item[rowKey] || index : index} item={item} />;\n })}\n </div>\n );\n });\n }\n }, [sortedData]);\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 / colSpan;\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: (\n value: React.SetStateAction<{\n [k: string]: \"asc\" | \"desc\" | \"none\";\n }>,\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 () =>\n sortedData.map((item, index) => {\n return (\n <div\n key={rowKey ? item[rowKey] || index : index}\n className={cn(\"w-full flex items-center space-x-1\", 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 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-x-auto\", className)}>\n <div className=\"inline-block min-w-fit w-full\">\n <div className={cn(\"w-full flex items-center rounded-lg bg-default-100 space-x-1 mb-2\", virtualizedOptions?.classNames?.header)}>\n {columns.map((column) => {\n return (\n <div\n key={column.key}\n className={cn(\"w-full flex-grow py-2 px-4 flex items-center text-xs font-semibold whitespace-nowrap overflow-auto\", 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(\n <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,\n nextuiPaginationProps = {},\n autoScrollToTop,\n columnSlot,\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 columnSlot?: ((props: { row: T }) => React.ReactNode) | React.ReactNode;\n }) => {\n const tableBoxRef = useRef<HTMLDivElement>(null);\n pagination = pagination\n ? pagination\n : useRef(\n new PaginationState({\n page: 1,\n limit: 10,\n }),\n ).current;\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 className={classNames.td} colSpan={columns.length}>\n {loadingContent || DefaultLoading({ loadingOptions })}\n </td>\n </tr>\n </tbody>\n ) : data.length > 0 ? (\n <tbody className={classNames.tbody}>\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 <>\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 {columnSlot && (\n <tr>\n <td colSpan={columns.length}>{typeof columnSlot === \"function\" ? columnSlot({ row: item }) : columnSlot}</td>\n </tr>\n )}\n </>\n );\n })}\n </tbody>\n ) : (\n <tbody className={classNames.tbody}>\n <tr className={classNames.tr}>\n <td className={classNames.td} colSpan={columns.length}>\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);\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-[60px] 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-[60px] 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 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 {exData.map((exItem) => (\n <tr\n key={exItem.key}\n className={cn(\n \"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 </tbody>\n ) : (\n <tbody className={collapsedTableConfig?.classNames?.tbody}>\n <tr className={collapsedTableConfig?.classNames?.tr}>\n <td className={collapsedTableConfig?.classNames?.td} colSpan={columns.length}>\n {collapsedTableConfig?.emptyContent ?? <DefaultEmptyContent />}\n </td>\n </tr>\n </tbody>\n )}\n </table>\n );\n })}\n </td>\n </tr>\n </>\n );\n}\n\nfunction groupByColSpan(arr: any[], colSpan: number) {\n const result = [];\n for (let i = 0; i < arr.length; i += colSpan) {\n result.push(arr.slice(i, i + colSpan));\n }\n return result;\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"]}
@@ -10,7 +10,7 @@ type TableClassNames = {
10
10
  tbody?: string;
11
11
  td?: string;
12
12
  };
13
- type HeaderKeys<T extends Record<string, any>> = Array<keyof T | '$actions'>;
13
+ type HeaderKeys<T extends Record<string, any>> = Array<keyof T | "$actions">;
14
14
  type ColumnConfig<T> = {
15
15
  label?: React.ReactNode;
16
16
  width?: number;
@@ -26,17 +26,20 @@ type ColumnOptions<T> = {
26
26
  $actions?: ColumnConfig<T>;
27
27
  };
28
28
  type CardOptions = {
29
+ cardContainerClassName?: string;
29
30
  cardClassName?: string;
30
31
  itemClassName?: string;
31
32
  labelClassName?: string;
32
33
  valueClassName?: string;
33
34
  showDivider?: boolean;
34
35
  dividerClassName?: string;
35
- colSpan?: number;
36
- cardGroupClassName?: string;
36
+ virtualizedOptions?: {
37
+ colSpan?: number;
38
+ cardContainerClassName?: string;
39
+ };
37
40
  };
38
41
  type LoadingOptions = {
39
- type?: 'skeleton' | 'spinner';
42
+ type?: "skeleton" | "spinner";
40
43
  skeleton?: {
41
44
  boxClassName?: string;
42
45
  skeletonClassName?: string;
@@ -67,7 +70,7 @@ type CollapsedTableConfig<T> = {
67
70
  headerKeys: string[];
68
71
  columnOptions: ColumnOptions<any>;
69
72
  }[];
70
- collapsedHandlerPosition?: 'left' | 'right';
73
+ collapsedHandlerPosition?: "left" | "right";
71
74
  collapsedHandlerBoxCss?: string;
72
75
  openedIcon?: React.ReactNode;
73
76
  closedIcon?: React.ReactNode;
@@ -84,6 +87,10 @@ type VirtualizedOptions = {
84
87
  row?: string;
85
88
  rowCell?: string;
86
89
  };
90
+ cardOptions?: {
91
+ colSpan?: number;
92
+ cardContainerClassName?: string;
93
+ };
87
94
  fetchData?: () => Promise<void>;
88
95
  };
89
96
  interface JSONTableProps<T extends Record<string, any>> {
@@ -1,4 +1,4 @@
1
- export { JSONTable } from './chunk-24SBSTZU.mjs';
1
+ export { JSONTable } from './chunk-QYVOP7FN.mjs';
2
2
  import './chunk-ONVPCAMQ.mjs';
3
3
  import './chunk-QA3E2PJT.mjs';
4
4
  import './chunk-K7LFG5BA.mjs';
package/dist/metrics.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { JSONTable } from './chunk-24SBSTZU.mjs';
1
+ import { JSONTable } from './chunk-QYVOP7FN.mjs';
2
2
  import './chunk-ONVPCAMQ.mjs';
3
3
  import { SkeletonBox } from './chunk-QA3E2PJT.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.5.7",
3
+ "version": "0.5.8",
4
4
  "description": "",
5
5
  "main": "./dist/index.mjs",
6
6
  "types": "./dist/index.d.mts",
@@ -169,4 +169,4 @@
169
169
  "reflect-metadata": "^0.2.2",
170
170
  "virtua": "0.33.7"
171
171
  }
172
- }
172
+ }
@@ -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","_","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};\n\nexport type CardOptions = {\n cardClassName?: string;\n itemClassName?: string;\n labelClassName?: string;\n valueClassName?: string;\n showDivider?: boolean;\n dividerClassName?: string;\n colSpan?: number\n cardGroupClassName?: 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 columnSlot?: ((props: { row: T }) => React.ReactNode) | 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 columnSlot,\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 ?? 60,\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 ?? 60,\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: 60,\n })\n } else {\n columns = [\n {\n key: '$collapsedHandler',\n label: '',\n width: 60,\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 if (virtualizedOptions?.isVirtualized) {\n return (\n <VirtualizedCardUI\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 columnSlot={columnSlot}\n\n />\n )\n } else {\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 columnSlot={columnSlot}\n showPagination={showPagination}\n pagination={pagination}\n nextuiPaginationProps={nextuiPaginationProps}\n />\n )\n }\n } else {\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 } else {\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 columnSlot={columnSlot}\n />\n )\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\nconst CardUI = observer(<T,>({\n className,\n sortedData,\n columns,\n rowKey,\n cardOptions,\n onRowClick,\n emptyContent,\n columnSlot,\n isServerPaging,\n showPagination,\n pagination,\n nextuiPaginationProps,\n autoScrollToTop,\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 columnSlot?: ((props: { row: T; }) => React.ReactNode) | React.ReactNode;\n isServerPaging?: boolean;\n showPagination: boolean;\n pagination?: PaginationState;\n nextuiPaginationProps?: PaginationProps | {};\n}) => {\n const cardBoxRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!isServerPaging) {\n pagination.setData({\n total: sortedData.length,\n });\n }\n }, [sortedData]);\n\n const data = (isServerPaging || !showPagination) ? sortedData : sortedData.slice(pagination.offset, pagination.offset + pagination.limit);\n\n const MyCard = ({ item }) => {\n return (\n <Card\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 {typeof columnSlot === 'function' ? columnSlot({ row: item }) : columnSlot}\n </Card>\n );\n }\n\n const GroupUI = () => {\n const colSpan = cardOptions?.colSpan || 1;\n if (colSpan === 1) {\n return data.map((item, index) => {\n return <MyCard key={rowKey ? item[rowKey] || index : index} item={item} />;\n });\n }\n const groupData = groupByColSpan(data, colSpan);\n return groupData.map((group, gIndex) => {\n return (\n <div className={cn(\"flex items-center justify-between space-x-1\", cardOptions?.cardGroupClassName)} key={gIndex}>\n {group.map((item, index) => {\n return <MyCard key={rowKey ? item[rowKey] || index : index} item={item} />;\n })}\n </div>\n );\n });\n }\n\n return (\n <div className={className} ref={cardBoxRef}>\n {sortedData.length > 0 ? (\n <>\n <GroupUI />\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 && cardBoxRef.current) {\n scrollIntoTop(cardBoxRef.current);\n }\n }}\n {...nextuiPaginationProps}\n />\n </div>\n )}\n </>\n ) : (\n emptyContent ?? <DefaultEmptyContent />\n )}\n </div>\n );\n})\n\nfunction VirtualizedCardUI<T>({\n className,\n sortedData,\n columns,\n rowKey,\n cardOptions,\n onRowClick,\n emptyContent,\n isLoading,\n loadingOptions,\n loadingContent,\n virtualizedOptions,\n columnSlot,\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 columnSlot?: ((props: { row: T; }) => React.ReactNode) | React.ReactNode;\n}) {\n const colSpan = cardOptions?.colSpan || 1;\n const fetchedCountRef = useRef(-1);\n const elements = useMemo(\n () => {\n const MyCard = ({ item }) => {\n return (\n <Card\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 {typeof columnSlot === 'function' ? columnSlot({ row: item }) : columnSlot}\n </Card>\n );\n }\n if (colSpan === 1) {\n return sortedData.map((item, index) => {\n return <MyCard key={rowKey ? item[rowKey] || index : index} item={item} />;\n });\n } else {\n const groupData = groupByColSpan(sortedData, colSpan);\n return groupData.map((group, gIndex) => {\n return (\n <div className={cn(\"flex items-center justify-between space-x-1\", cardOptions?.cardGroupClassName)} key={gIndex}>\n {group.map((item, index) => {\n return <MyCard key={rowKey ? item[rowKey] || index : index} item={item} />;\n })}\n </div>\n );\n });\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 / colSpan;\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('w-full flex items-center space-x-1', 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 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-x-auto\", className)}>\n <div className='inline-block min-w-fit w-full'>\n <div className={cn(\"w-full flex items-center rounded-lg bg-default-100 space-x-1 mb-2\", virtualizedOptions?.classNames?.header)}>\n {columns.map((column) => {\n return (\n <div\n key={column.key}\n className={cn(\"w-full flex-grow py-2 px-4 flex items-center text-xs font-semibold whitespace-nowrap overflow-auto\", 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 columnSlot,\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 columnSlot?: ((props: { row: T; }) => React.ReactNode) | React.ReactNode;\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 <>\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 {columnSlot && (\n <tr>\n <td colSpan={columns.length}>\n {typeof columnSlot === 'function'\n ? columnSlot({ row: item })\n : columnSlot}\n </td>\n </tr>\n )}\n </>\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-[60px] 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-[60px] 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\nfunction groupByColSpan(arr: any[], colSpan: number) {\n const result = [];\n for (let i = 0; i < arr.length; i += colSpan) {\n result.push(arr.slice(i, i + colSpan));\n }\n return result;\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"]}