@canvas-components/react-list-table 0.3.28 → 0.3.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
- import { createContext, forwardRef, useMemo, useRef, useState, useImperativeHandle, useContext, useEffect, useLayoutEffect, Fragment as Fragment$1 } from 'react';
1
+ import { createContext, forwardRef, useMemo, useRef, useState, useEffect, useImperativeHandle, useContext, useLayoutEffect, useId, Fragment as Fragment$1 } from 'react';
2
2
  import { createPortal } from 'react-dom';
3
- import { ReactImagePreview, ReactCheckbox, ReactNumberInput, ReactSelect, ReactPagination, ReactFilterPanel, ReactPopup, ReactModal, ReactInput, ReactPopconfirm, ReactContentScaleProvider, ReactButton, ReactColorPicker, ReactInputNumber, ReactAutoComplete, ReactTimeRangePicker, ReactDateTimeRangePicker, ReactDateTimePicker, ReactTimePicker, ReactDateRangePicker, ReactDatePicker, ReactMonthPicker, ReactQuarterPicker, ReactYearPicker, ReactInputRange, ReactCascader, ReactTreeSelect } from '@canvas-components/react-components';
3
+ import { getSharedScrollbarSettings, subscribeSharedScrollbarSettings, setSharedScrollbarSettings, ReactImagePreview, ReactCheckbox, ReactNumberInput, ReactSelect, ReactPagination, ReactFilterPanel, ReactPopup, ReactScrollbarSettingsDialog, ReactScrollbarPositionDialog, ReactModal, ReactInput, ReactPopconfirm, ReactContentScaleProvider, ReactButton, ReactColorPicker, ReactInputNumber, ReactAutoComplete, ReactTimeRangePicker, ReactDateTimeRangePicker, ReactDateTimePicker, ReactTimePicker, ReactDateRangePicker, ReactDatePicker, ReactMonthPicker, ReactQuarterPicker, ReactYearPicker, ReactInputRange, ReactCascader, ReactTreeSelect } from '@canvas-components/react-components';
4
4
  import { EXPAND_COLUMN, SELECTION_COLUMN, ROW_SELECTION_COLUMN, resetListTableStoredColumnConfig, ListTable } from '@canvas-components/list-table';
5
5
  export { EXPAND_COLUMN, ROW_SELECTION_COLUMN, SELECTION_COLUMN, getListTableStoredPageSize } from '@canvas-components/list-table';
6
6
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
@@ -327,7 +327,8 @@ function buildCacheMenuItems(request) {
327
327
  ["alignment", "\u5BF9\u9F50"],
328
328
  ["dataFormat", "\u683C\u5F0F"],
329
329
  ["density", "\u8868\u683C\u5BC6\u5EA6"],
330
- ["zoom", "\u7F29\u653E"]
330
+ ["zoom", "\u7F29\u653E"],
331
+ ["scrollbar", "\u6EDA\u52A8\u6761"]
331
332
  ];
332
333
  for (const [category, label] of categories)
333
334
  items.push({
@@ -375,6 +376,24 @@ var SELECTION_CHART_TYPES = [
375
376
  { value: "gauge", label: "\u4EEA\u8868\u76D8" }
376
377
  ];
377
378
  var COLORS = ["#1677ff", "#13c2c2", "#fa8c16", "#722ed1", "#eb2f96"];
379
+ function isSameSelectionChartData(left, right) {
380
+ if (left === right) return true;
381
+ if (!left || !right) return false;
382
+ if (left.labels.length !== right.labels.length || left.keys?.length !== right.keys?.length || left.series.length !== right.series.length) {
383
+ return false;
384
+ }
385
+ if (left.labels.some((label, index) => label !== right.labels[index])) {
386
+ return false;
387
+ }
388
+ if (left.keys?.some((key, index) => key !== right.keys?.[index])) {
389
+ return false;
390
+ }
391
+ return left.series.every(
392
+ (series, index) => series.name === right.series[index]?.name && series.data.length === right.series[index]?.data.length && series.data.every(
393
+ (value, valueIndex) => value === right.series[index]?.data[valueIndex]
394
+ )
395
+ );
396
+ }
378
397
  function createSelectionChartOption(data, chartType, seriesIndex = 0) {
379
398
  const activeSeries = data.series[Math.min(seriesIndex, data.series.length - 1)];
380
399
  if (["pie", "donut", "rose", "half-donut"].includes(chartType)) {
@@ -387,6 +406,7 @@ function createSelectionChartOption(data, chartType, seriesIndex = 0) {
387
406
  name: activeSeries.name,
388
407
  data: data.labels.map((name, index) => ({
389
408
  name,
409
+ key: data.keys?.[index],
390
410
  value: Math.max(activeSeries.data[index] ?? 0, 0)
391
411
  })),
392
412
  radius: chartType === "pie" || chartType === "rose" ? "62%" : ["28%", "62%"],
@@ -408,6 +428,7 @@ function createSelectionChartOption(data, chartType, seriesIndex = 0) {
408
428
  ...series.flatMap((item) => item.data.slice(0, labels.length))
409
429
  );
410
430
  const option2 = {
431
+ categoryKeys: data.keys?.slice(0, labels.length),
411
432
  color: COLORS,
412
433
  radar: {
413
434
  indicator: labels.map((name) => ({
@@ -455,6 +476,7 @@ function createSelectionChartOption(data, chartType, seriesIndex = 0) {
455
476
  const area = chartType.includes("area");
456
477
  const bumpData = chartType === "bump" ? resolveBumpRanks(data) : null;
457
478
  const option = {
479
+ categoryKeys: data.keys,
458
480
  grid: {
459
481
  show: true,
460
482
  left: 20,
@@ -516,29 +538,48 @@ function resolveBumpRanks(data) {
516
538
  return ranks;
517
539
  }
518
540
  function ChartDialog(props) {
541
+ const [data, setData] = useState(props.data);
519
542
  const [chartType, setChartType] = useState("line");
520
543
  const [seriesIndex, setSeriesIndex] = useState(0);
521
544
  const [ready, setReady] = useState(false);
522
545
  const chartHostRef = useRef(null);
523
546
  const chartRef = useRef(null);
524
547
  const chartConfig = useMemo(() => {
525
- if (!props.data) return null;
526
- return createSelectionChartOption(props.data, chartType, seriesIndex);
527
- }, [chartType, props.data, seriesIndex]);
548
+ if (!data) return null;
549
+ return createSelectionChartOption(data, chartType, seriesIndex);
550
+ }, [chartType, data, seriesIndex]);
551
+ useEffect(() => {
552
+ if (!props.getData) return;
553
+ const timer = globalThis.setInterval(() => {
554
+ const next = props.getData?.() ?? null;
555
+ setData(
556
+ (current) => isSameSelectionChartData(current, next) ? current : next
557
+ );
558
+ }, 500);
559
+ return () => globalThis.clearInterval(timer);
560
+ }, [props.getData]);
561
+ useEffect(() => {
562
+ if (!data && chartRef.current) {
563
+ chartRef.current.destroy();
564
+ chartRef.current = null;
565
+ }
566
+ }, [data]);
528
567
  useEffect(() => {
529
568
  if (!ready || !chartConfig || !chartHostRef.current) return;
530
569
  let chart = chartRef.current;
531
570
  if (!chart) {
532
571
  chart = new CanvasChart(chartHostRef.current, {
533
572
  type: chartConfig.type,
534
- option: chartConfig.option
573
+ option: chartConfig.option,
574
+ animation: { duration: 720, easing: "linear" }
535
575
  });
536
576
  chart.mount();
537
577
  chartRef.current = chart;
538
578
  } else {
539
579
  chart.updateOptions({
540
580
  type: chartConfig.type,
541
- option: chartConfig.option
581
+ option: chartConfig.option,
582
+ animation: { duration: 720, easing: "linear" }
542
583
  });
543
584
  }
544
585
  }, [chartConfig, ready]);
@@ -563,7 +604,7 @@ function ChartDialog(props) {
563
604
  onCancel: props.onClose,
564
605
  afterOpenChange: setReady,
565
606
  bodyStyle: { padding: "12px 20px 20px", display: "flex" },
566
- children: props.data ? /* @__PURE__ */ jsxs(
607
+ children: data ? /* @__PURE__ */ jsxs(
567
608
  "div",
568
609
  {
569
610
  style: {
@@ -598,7 +639,7 @@ function ChartDialog(props) {
598
639
  ]
599
640
  }
600
641
  ),
601
- props.data.series.length > 1 && [
642
+ data.series.length > 1 && [
602
643
  "pie",
603
644
  "donut",
604
645
  "rose",
@@ -620,7 +661,7 @@ function ChartDialog(props) {
620
661
  {
621
662
  value: seriesIndex,
622
663
  allowClear: false,
623
- options: props.data.series.map((series, index) => ({
664
+ options: data.series.map((series, index) => ({
624
665
  value: index,
625
666
  label: series.name
626
667
  })),
@@ -674,9 +715,90 @@ var CONTEXT_MENU_SURFACE_STYLE = {
674
715
  boxShadow: "0 8px 24px rgba(15, 23, 42, 0.16)",
675
716
  fontSize: 14
676
717
  };
718
+ function ScrollbarModeMenu(props) {
719
+ const { request, onOpenSettings } = props;
720
+ return /* @__PURE__ */ jsx(
721
+ MenuSubmenu,
722
+ {
723
+ label: "\u6EDA\u52A8\u6761\u6A21\u5F0F",
724
+ items: [
725
+ ["scrollbar", "\u6EDA\u52A8\u6761"],
726
+ ["button", "\u6309\u94AE"]
727
+ ].map(([mode, label]) => ({
728
+ key: `scrollbar-mode-${mode}`,
729
+ label,
730
+ selected: (request.scrollbar?.mode ?? "scrollbar") === mode,
731
+ onClick: () => {
732
+ request.onChangeScrollbar?.({
733
+ ...request.scrollbar,
734
+ mode,
735
+ horizontal: request.scrollbar?.horizontal === false ? false : { ...request.scrollbar?.horizontal, mode },
736
+ vertical: request.scrollbar?.vertical === false ? false : { ...request.scrollbar?.vertical, mode }
737
+ });
738
+ request.onClose();
739
+ }
740
+ })),
741
+ footer: /* @__PURE__ */ jsx(ReactButton, { onClick: onOpenSettings, style: { width: "100%" }, children: "\u914D\u7F6E\u6EDA\u52A8\u6761\u5C5E\u6027" })
742
+ }
743
+ );
744
+ }
745
+ function ResetMenu(props) {
746
+ const { request } = props;
747
+ return /* @__PURE__ */ jsx(
748
+ MenuSubmenu,
749
+ {
750
+ label: "\u91CD\u7F6E",
751
+ items: [
752
+ {
753
+ key: "reset-filter",
754
+ label: "\u91CD\u7F6E\u7B5B\u9009",
755
+ onClick: request.onResetFilter
756
+ },
757
+ { key: "reset-sort", label: "\u91CD\u7F6E\u6392\u5E8F", onClick: request.onResetSort },
758
+ {
759
+ key: "reset-header",
760
+ label: "\u91CD\u7F6E\u8868\u5934\u914D\u7F6E",
761
+ onClick: request.onResetHeader
762
+ },
763
+ {
764
+ key: "reset-grouping",
765
+ label: "\u91CD\u7F6E\u5206\u7EC4",
766
+ onClick: request.onResetGrouping
767
+ },
768
+ {
769
+ key: "reset-summary",
770
+ label: "\u91CD\u7F6E\u6C47\u603B",
771
+ onClick: request.onResetSummary
772
+ },
773
+ {
774
+ key: "reset-alignment",
775
+ label: "\u91CD\u7F6E\u5BF9\u9F50",
776
+ onClick: request.onResetAlignment
777
+ },
778
+ {
779
+ key: "reset-data-format",
780
+ label: "\u91CD\u7F6E\u683C\u5F0F",
781
+ onClick: request.onResetDataFormat
782
+ },
783
+ {
784
+ key: "reset-scrollbar",
785
+ label: "\u91CD\u7F6E\u6EDA\u52A8\u914D\u7F6E",
786
+ onClick: () => {
787
+ request.onResetScrollbar?.();
788
+ request.onClose();
789
+ }
790
+ }
791
+ ]
792
+ }
793
+ );
794
+ }
677
795
  function ReactTableContextMenuView(props) {
678
796
  const { request } = props;
679
- const [menuOpen, setMenuOpen] = useState(true);
797
+ const [closedRequest, setClosedRequest] = useState(null);
798
+ const menuOpen = request !== null && closedRequest !== request;
799
+ const setMenuOpen = (open) => {
800
+ setClosedRequest(open ? null : request);
801
+ };
680
802
  const [conditionalEditor, setConditionalEditor] = useState(null);
681
803
  const conditionalDialog = conditionalEditor ? /* @__PURE__ */ jsx(
682
804
  ConditionalFormatDialog,
@@ -689,6 +811,31 @@ function ReactTableContextMenuView(props) {
689
811
  }
690
812
  ) : null;
691
813
  const [moreFormatRequest, setMoreFormatRequest] = useState(null);
814
+ const [scrollbarSettingsRequest, setScrollbarSettingsRequest] = useState(null);
815
+ const [scrollbarPositionRequest, setScrollbarPositionRequest] = useState(null);
816
+ const scrollbarDialog = scrollbarSettingsRequest ? /* @__PURE__ */ jsx(
817
+ ReactScrollbarSettingsDialog,
818
+ {
819
+ value: scrollbarSettingsRequest.scrollbar,
820
+ onConfirm: (value) => {
821
+ scrollbarSettingsRequest.onChangeScrollbar?.({
822
+ ...scrollbarSettingsRequest.scrollbar,
823
+ ...value
824
+ });
825
+ setScrollbarSettingsRequest(null);
826
+ },
827
+ onClose: () => setScrollbarSettingsRequest(null)
828
+ }
829
+ ) : null;
830
+ const scrollbarPositionDialog = scrollbarPositionRequest ? /* @__PURE__ */ jsx(
831
+ ReactScrollbarPositionDialog,
832
+ {
833
+ rowCount: scrollbarPositionRequest.scrollbarRowCount ?? 0,
834
+ columnCount: scrollbarPositionRequest.scrollbarColumnCount ?? 0,
835
+ onConfirm: (row, column) => scrollbarPositionRequest.onScrollToPosition?.(row, column),
836
+ onClose: () => setScrollbarPositionRequest(null)
837
+ }
838
+ ) : null;
692
839
  const [customSelectionRequest, setCustomSelectionRequest] = useState(null);
693
840
  const [chartRequest, setChartRequest] = useState(null);
694
841
  const [columnEditor, setColumnEditor] = useState(null);
@@ -707,6 +854,8 @@ function ReactTableContextMenuView(props) {
707
854
  ) : null });
708
855
  if (!request) {
709
856
  return /* @__PURE__ */ jsxs(Fragment, { children: [
857
+ scrollbarDialog,
858
+ scrollbarPositionDialog,
710
859
  conditionalDialog,
711
860
  columnDialogs,
712
861
  moreFormatRequest ? /* @__PURE__ */ jsx(
@@ -730,6 +879,7 @@ function ReactTableContextMenuView(props) {
730
879
  ChartDialog,
731
880
  {
732
881
  data: chartRequest.data,
882
+ getData: chartRequest.request.onCreateChart,
733
883
  onClose: () => {
734
884
  chartRequest.request.onClose();
735
885
  setChartRequest(null);
@@ -738,11 +888,64 @@ function ReactTableContextMenuView(props) {
738
888
  ) : null
739
889
  ] });
740
890
  }
891
+ const openScrollbarSettings = () => {
892
+ setScrollbarSettingsRequest(request);
893
+ request.onClose();
894
+ };
895
+ if (request.scrollbarArea) {
896
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
897
+ scrollbarDialog,
898
+ scrollbarPositionDialog,
899
+ /* @__PURE__ */ jsxs(
900
+ ReactPopup,
901
+ {
902
+ constrainHeight: true,
903
+ open: menuOpen,
904
+ anchorRect: { x: request.x, y: request.y, width: 0, height: 0 },
905
+ minWidth: 260,
906
+ onOpenChange: (open) => {
907
+ setMenuOpen(open);
908
+ if (!open) request.onClose();
909
+ },
910
+ surfaceStyle: { ...CONTEXT_MENU_SURFACE_STYLE, width: 260 },
911
+ children: [
912
+ /* @__PURE__ */ jsx(
913
+ ScrollbarModeMenu,
914
+ {
915
+ request,
916
+ onOpenSettings: openScrollbarSettings
917
+ }
918
+ ),
919
+ /* @__PURE__ */ jsx(
920
+ MenuAction,
921
+ {
922
+ label: "\u6EDA\u52A8\u5230\u6307\u5B9A\u884C / \u5217",
923
+ onClick: () => {
924
+ setScrollbarPositionRequest(request);
925
+ request.onClose();
926
+ }
927
+ }
928
+ ),
929
+ /* @__PURE__ */ jsx(ResetMenu, { request }),
930
+ buildCacheMenuItems(request).length > 0 ? /* @__PURE__ */ jsx(
931
+ MenuSubmenu,
932
+ {
933
+ label: "\u7F13\u5B58\u5230\u672C\u5730",
934
+ items: buildCacheMenuItems(request)
935
+ }
936
+ ) : null
937
+ ]
938
+ }
939
+ )
940
+ ] });
941
+ }
741
942
  const surfaceStyle = {
742
943
  ...CONTEXT_MENU_SURFACE_STYLE,
743
944
  width: 260
744
945
  };
745
946
  return /* @__PURE__ */ jsxs(Fragment, { children: [
947
+ scrollbarDialog,
948
+ scrollbarPositionDialog,
746
949
  conditionalDialog,
747
950
  columnDialogs,
748
951
  /* @__PURE__ */ jsx(
@@ -830,7 +1033,10 @@ function ReactTableContextMenuView(props) {
830
1033
  {
831
1034
  label: "\u521B\u5EFA\u56FE\u8868",
832
1035
  onClick: request.onCreateChart ? () => {
833
- setChartRequest({ request, data: request.onCreateChart?.() ?? null });
1036
+ setChartRequest({
1037
+ request,
1038
+ data: request.onCreateChart?.() ?? null
1039
+ });
834
1040
  setMenuOpen(false);
835
1041
  } : void 0
836
1042
  }
@@ -1070,47 +1276,22 @@ function ReactTableContextMenuView(props) {
1070
1276
  ]
1071
1277
  }
1072
1278
  ),
1279
+ /* @__PURE__ */ jsx(ResetMenu, { request }),
1073
1280
  /* @__PURE__ */ jsx(
1074
- MenuSubmenu,
1281
+ ScrollbarModeMenu,
1075
1282
  {
1076
- label: "\u91CD\u7F6E",
1077
- items: [
1078
- {
1079
- key: "reset-filter",
1080
- label: "\u91CD\u7F6E\u7B5B\u9009",
1081
- onClick: request.onResetFilter
1082
- },
1083
- {
1084
- key: "reset-sort",
1085
- label: "\u91CD\u7F6E\u6392\u5E8F",
1086
- onClick: request.onResetSort
1087
- },
1088
- {
1089
- key: "reset-header",
1090
- label: "\u91CD\u7F6E\u8868\u5934\u914D\u7F6E",
1091
- onClick: request.onResetHeader
1092
- },
1093
- {
1094
- key: "reset-grouping",
1095
- label: "\u91CD\u7F6E\u5206\u7EC4",
1096
- onClick: request.onResetGrouping
1097
- },
1098
- {
1099
- key: "reset-summary",
1100
- label: "\u91CD\u7F6E\u6C47\u603B",
1101
- onClick: request.onResetSummary
1102
- },
1103
- {
1104
- key: "reset-alignment",
1105
- label: "\u91CD\u7F6E\u5BF9\u9F50",
1106
- onClick: request.onResetAlignment
1107
- },
1108
- {
1109
- key: "reset-data-format",
1110
- label: "\u91CD\u7F6E\u683C\u5F0F",
1111
- onClick: request.onResetDataFormat
1112
- }
1113
- ]
1283
+ request,
1284
+ onOpenSettings: openScrollbarSettings
1285
+ }
1286
+ ),
1287
+ /* @__PURE__ */ jsx(
1288
+ MenuAction,
1289
+ {
1290
+ label: "\u6EDA\u52A8\u5230\u6307\u5B9A\u884C / \u5217",
1291
+ onClick: () => {
1292
+ setScrollbarPositionRequest(request);
1293
+ request.onClose();
1294
+ }
1114
1295
  }
1115
1296
  ),
1116
1297
  /* @__PURE__ */ jsx(
@@ -1181,6 +1362,7 @@ function ReactTableContextMenuView(props) {
1181
1362
  ChartDialog,
1182
1363
  {
1183
1364
  data: chartRequest.data,
1365
+ getData: chartRequest.request.onCreateChart,
1184
1366
  onClose: () => {
1185
1367
  chartRequest.request.onClose();
1186
1368
  setChartRequest(null);
@@ -1609,6 +1791,7 @@ function ColumnEditorDialog(props) {
1609
1791
  minWidth: item?.minWidth ?? Math.min(40, item?.width ?? 160),
1610
1792
  maxWidth: item?.maxWidth ?? Math.max(2e3, item?.width ?? 160),
1611
1793
  fixed: item?.fixed,
1794
+ sortOrder: item && (item.sortable === false || item.children?.length) ? void 0 : item ? request.sortState?.find((entry) => entry.key === item.key)?.order ?? null : null,
1612
1795
  order: item?.order ?? (parentItem?.children?.length ?? request.columns?.length ?? 0) + 1
1613
1796
  }));
1614
1797
  const [error, setError] = useState(null);
@@ -1715,6 +1898,25 @@ function ColumnEditorDialog(props) {
1715
1898
  }
1716
1899
  )
1717
1900
  ] }),
1901
+ /* @__PURE__ */ jsxs("div", { style: fieldStyle, children: [
1902
+ /* @__PURE__ */ jsx("span", { children: "\u6392\u5E8F\u65B9\u5F0F" }),
1903
+ /* @__PURE__ */ jsx(
1904
+ ReactSelect,
1905
+ {
1906
+ value: draft.sortOrder ?? "default",
1907
+ allowClear: false,
1908
+ disabled: item?.sortable === false || Boolean(item?.children?.length),
1909
+ options: [
1910
+ { label: "\u9ED8\u8BA4\u6392\u5E8F", value: "default" },
1911
+ { label: "\u5347\u5E8F", value: "ascend" },
1912
+ { label: "\u964D\u5E8F", value: "descend" }
1913
+ ],
1914
+ onChange: (value) => update({
1915
+ sortOrder: value === "ascend" || value === "descend" ? value : null
1916
+ })
1917
+ }
1918
+ )
1919
+ ] }),
1718
1920
  isUserColumn ? /* @__PURE__ */ jsxs("label", { style: fieldStyle, children: [
1719
1921
  /* @__PURE__ */ jsx("span", { children: "\u56FA\u5B9A\u4F4D\u7F6E" }),
1720
1922
  /* @__PURE__ */ jsx(
@@ -1744,6 +1946,7 @@ function ColumnVisibilityMenu(props) {
1744
1946
  const [open, setOpen] = useState(false);
1745
1947
  const [deleteConfirmKey, setDeleteConfirmKey] = useState(null);
1746
1948
  const closeTimerRef = useRef(null);
1949
+ const keepOpenAfterToggleRef = useRef(false);
1747
1950
  const clearCloseTimer = () => {
1748
1951
  if (closeTimerRef.current != null) {
1749
1952
  window.clearTimeout(closeTimerRef.current);
@@ -1751,13 +1954,19 @@ function ColumnVisibilityMenu(props) {
1751
1954
  }
1752
1955
  };
1753
1956
  const scheduleClose = () => {
1754
- if (deleteConfirmKey) return;
1957
+ if (deleteConfirmKey || keepOpenAfterToggleRef.current) return;
1755
1958
  clearCloseTimer();
1756
1959
  closeTimerRef.current = window.setTimeout(() => {
1757
1960
  setOpen(false);
1758
1961
  closeTimerRef.current = null;
1759
1962
  }, 120);
1760
1963
  };
1964
+ const handleToggle = (columnKey, visible) => {
1965
+ clearCloseTimer();
1966
+ keepOpenAfterToggleRef.current = true;
1967
+ setOpen(true);
1968
+ onToggle(columnKey, visible);
1969
+ };
1761
1970
  return /* @__PURE__ */ jsxs(
1762
1971
  "div",
1763
1972
  {
@@ -1810,7 +2019,10 @@ function ColumnVisibilityMenu(props) {
1810
2019
  placement: "rightTop",
1811
2020
  offset: 2,
1812
2021
  minWidth: 300,
1813
- onOpenChange: setOpen,
2022
+ onOpenChange: (nextOpen) => {
2023
+ if (!nextOpen) keepOpenAfterToggleRef.current = false;
2024
+ setOpen(nextOpen);
2025
+ },
1814
2026
  surfaceClassName: "canvas-react-scrollbar",
1815
2027
  surfaceStyle: {
1816
2028
  ...CONTEXT_MENU_SURFACE_STYLE,
@@ -1842,7 +2054,7 @@ function ColumnVisibilityMenu(props) {
1842
2054
  ColumnVisibilityItem,
1843
2055
  {
1844
2056
  item: column,
1845
- onToggle,
2057
+ onToggle: handleToggle,
1846
2058
  onAddChild,
1847
2059
  onEdit,
1848
2060
  onDelete,
@@ -1876,6 +2088,7 @@ function ColumnVisibilityItem(props) {
1876
2088
  const triggerRef = useRef(null);
1877
2089
  const [open, setOpen] = useState(false);
1878
2090
  const closeTimerRef = useRef(null);
2091
+ const keepOpenAfterToggleRef = useRef(false);
1879
2092
  const hasChildren = !!item.children?.length;
1880
2093
  const clearCloseTimer = () => {
1881
2094
  if (closeTimerRef.current != null) {
@@ -1884,13 +2097,18 @@ function ColumnVisibilityItem(props) {
1884
2097
  }
1885
2098
  };
1886
2099
  const scheduleClose = () => {
1887
- if (deleteConfirmKey) return;
2100
+ if (deleteConfirmKey || keepOpenAfterToggleRef.current) return;
1888
2101
  clearCloseTimer();
1889
2102
  closeTimerRef.current = window.setTimeout(() => {
1890
2103
  setOpen(false);
1891
2104
  closeTimerRef.current = null;
1892
2105
  }, 120);
1893
2106
  };
2107
+ const handleToggle = (columnKey, visible) => {
2108
+ clearCloseTimer();
2109
+ keepOpenAfterToggleRef.current = true;
2110
+ onToggle(columnKey, visible);
2111
+ };
1894
2112
  return /* @__PURE__ */ jsxs(
1895
2113
  "div",
1896
2114
  {
@@ -1926,7 +2144,7 @@ function ColumnVisibilityItem(props) {
1926
2144
  disabled: item.disabled,
1927
2145
  indeterminate: !!item.indeterminate,
1928
2146
  onChange: (event) => {
1929
- onToggle(item.key, !!event.target.checked);
2147
+ handleToggle(item.key, !!event.target.checked);
1930
2148
  },
1931
2149
  children: [
1932
2150
  item.title,
@@ -1998,7 +2216,10 @@ function ColumnVisibilityItem(props) {
1998
2216
  placement: "rightTop",
1999
2217
  offset: 2,
2000
2218
  minWidth: 300,
2001
- onOpenChange: setOpen,
2219
+ onOpenChange: (nextOpen) => {
2220
+ if (!nextOpen) keepOpenAfterToggleRef.current = false;
2221
+ setOpen(nextOpen);
2222
+ },
2002
2223
  surfaceClassName: "canvas-react-scrollbar",
2003
2224
  surfaceStyle: {
2004
2225
  ...CONTEXT_MENU_SURFACE_STYLE,
@@ -2030,7 +2251,7 @@ function ColumnVisibilityItem(props) {
2030
2251
  ColumnVisibilityItem,
2031
2252
  {
2032
2253
  item: child,
2033
- onToggle,
2254
+ onToggle: handleToggle,
2034
2255
  onAddChild,
2035
2256
  onEdit,
2036
2257
  onDelete,
@@ -3328,36 +3549,193 @@ var toolButtonStyle = {
3328
3549
  lineHeight: 1,
3329
3550
  cursor: "pointer"
3330
3551
  };
3552
+ var sortOptions = [
3553
+ { value: "default", label: "\u9ED8\u8BA4" },
3554
+ { value: "ascend", label: "\u5347\u5E8F" },
3555
+ { value: "descend", label: "\u964D\u5E8F" }
3556
+ ];
3557
+ var summaryOptions = [
3558
+ { value: "original", label: "\u539F\u6C47\u603B" },
3559
+ { value: "none", label: "\u65E0\u6C47\u603B" },
3560
+ { value: "title", label: "\u6807\u9898" },
3561
+ { value: "sum", label: "\u6C42\u548C" },
3562
+ { value: "avg", label: "\u5E73\u5747\u503C" },
3563
+ { value: "count", label: "\u8BA1\u6570" },
3564
+ { value: "unionCount", label: "\u53BB\u91CD\u8BA1\u6570" },
3565
+ { value: "rowCount", label: "\u884C\u6570" },
3566
+ { value: "mergedRowCount", label: "\u5408\u5E76\u884C\u6570" },
3567
+ { value: "min", label: "\u6700\u5C0F\u503C" },
3568
+ { value: "max", label: "\u6700\u5927\u503C" }
3569
+ ];
3570
+ var roundingOptions = [
3571
+ { value: "round", label: "\u56DB\u820D\u4E94\u5165" },
3572
+ { value: "floor", label: "\u5411\u4E0B\u53D6\u6574" },
3573
+ { value: "ceil", label: "\u5411\u4E0A\u53D6\u6574" },
3574
+ { value: "truncate", label: "\u622A\u65AD" }
3575
+ ];
3576
+ var booleanOptions = [
3577
+ { value: "yes", label: "\u662F" },
3578
+ { value: "no", label: "\u5426" }
3579
+ ];
3580
+ function createExportDialogRows(columns) {
3581
+ return columns.map((column) => ({
3582
+ key: column.key,
3583
+ title: column.title,
3584
+ sortOrder: column.sortOrder,
3585
+ sortIndex: column.sortIndex,
3586
+ sortPriority: column.sortPriority,
3587
+ summaryType: column.summary.type,
3588
+ showTypePrefix: column.summary.showTypePrefix ? "yes" : "no",
3589
+ precision: column.summary.precision,
3590
+ roundingMode: column.summary.roundingMode,
3591
+ preserveTrailingZeros: column.summary.preserveTrailingZeros ? "yes" : "no"
3592
+ }));
3593
+ }
3594
+ function buildExportDialogSettings(rows, selectedKeys, includeSummary) {
3595
+ const selected = new Set(selectedKeys.map(String));
3596
+ return {
3597
+ columnKeys: rows.filter((row) => selected.has(row.key)).map((row) => row.key),
3598
+ sortState: rows.filter((row) => selected.has(row.key) && row.sortOrder !== "default").sort(
3599
+ (a, b) => (a.sortIndex ?? Number.MAX_SAFE_INTEGER) - (b.sortIndex ?? Number.MAX_SAFE_INTEGER)
3600
+ ).map((row) => ({
3601
+ key: row.key,
3602
+ order: row.sortOrder,
3603
+ ...row.sortPriority != null ? { priority: row.sortPriority } : {}
3604
+ })),
3605
+ summaries: Object.fromEntries(
3606
+ rows.map((row) => [
3607
+ row.key,
3608
+ {
3609
+ type: row.summaryType,
3610
+ showTypePrefix: row.showTypePrefix === "yes",
3611
+ precision: row.precision,
3612
+ roundingMode: row.roundingMode,
3613
+ preserveTrailingZeros: row.preserveTrailingZeros === "yes"
3614
+ }
3615
+ ])
3616
+ ),
3617
+ includeSummary
3618
+ };
3619
+ }
3331
3620
  function ReactListTableExportNameDialog({
3332
- request
3621
+ request,
3622
+ onClose,
3623
+ renderTable
3333
3624
  }) {
3625
+ const tableId = useId();
3334
3626
  const extension = request.fileName.match(/\.(xlsx|csv|txt|json)$/i)?.[0] ?? "";
3335
3627
  const [fileName, setFileName] = useState(
3336
3628
  extension ? request.fileName.slice(0, -extension.length) : request.fileName
3337
3629
  );
3338
- const [invalid, setInvalid] = useState(false);
3630
+ const [rows, setRows] = useState(() => createExportDialogRows(request.columns ?? []));
3631
+ const [selectedKeys, setSelectedKeys] = useState(
3632
+ () => (request.columns ?? []).filter((column) => column.selected !== false).map((column) => column.key)
3633
+ );
3634
+ const [includeSummary, setIncludeSummary] = useState(request.includeSummary ?? false);
3635
+ const [error, setError] = useState("");
3636
+ const columns = useMemo(
3637
+ () => [
3638
+ {
3639
+ key: "position",
3640
+ dataIndex: "key",
3641
+ title: "\u5217\u987A\u5E8F\uFF08\u62D6\u52A8\u884C\u6392\u5E8F\uFF09",
3642
+ width: 160,
3643
+ render: (_value, _row, index) => String(index + 1),
3644
+ headerAlign: "center",
3645
+ align: "center"
3646
+ },
3647
+ ROW_SELECTION_COLUMN,
3648
+ { key: "title", dataIndex: "title", title: "\u5217\u540D\u79F0", width: 190 },
3649
+ {
3650
+ key: "sortOrder",
3651
+ dataIndex: "sortOrder",
3652
+ title: "\u6570\u636E\u6392\u5E8F",
3653
+ width: 120,
3654
+ editable: true,
3655
+ formItemProps: { valueType: "select", clickCount: 1, options: sortOptions },
3656
+ render: (value) => sortOptions.find((option) => option.value === value)?.label ?? "\u9ED8\u8BA4"
3657
+ },
3658
+ ...includeSummary ? [{
3659
+ key: "summary-group",
3660
+ dataIndex: "summaryType",
3661
+ title: "\u6C47\u603B",
3662
+ children: [
3663
+ {
3664
+ key: "summaryType",
3665
+ dataIndex: "summaryType",
3666
+ title: "\u6C47\u603B\u65B9\u5F0F",
3667
+ width: 135,
3668
+ editable: true,
3669
+ formItemProps: { valueType: "select", clickCount: 1, options: summaryOptions.filter((option) => option.value !== "original" || request.columns?.some((column) => column.summary.type === "original")) },
3670
+ render: (value) => summaryOptions.find((option) => option.value === value)?.label ?? "\u65E0\u6C47\u603B"
3671
+ },
3672
+ {
3673
+ key: "showTypePrefix",
3674
+ dataIndex: "showTypePrefix",
3675
+ title: "\u6C47\u603B\u524D\u7F00",
3676
+ width: 115,
3677
+ editable: true,
3678
+ formItemProps: { valueType: "select", clickCount: 1, options: booleanOptions },
3679
+ render: (value) => value === "yes" ? "\u662F" : "\u5426"
3680
+ },
3681
+ {
3682
+ key: "precision",
3683
+ dataIndex: "precision",
3684
+ title: "\u6C47\u603B\u5C0F\u6570\u4F4D\u6570",
3685
+ width: 135,
3686
+ editable: true,
3687
+ formItemProps: { valueType: "number", clickCount: 1, min: 0, max: 20 }
3688
+ },
3689
+ {
3690
+ key: "roundingMode",
3691
+ dataIndex: "roundingMode",
3692
+ title: "\u53D6\u6574\u65B9\u5F0F",
3693
+ width: 130,
3694
+ editable: true,
3695
+ formItemProps: { valueType: "select", clickCount: 1, options: roundingOptions },
3696
+ render: (value) => roundingOptions.find((option) => option.value === value)?.label ?? "\u56DB\u820D\u4E94\u5165"
3697
+ },
3698
+ {
3699
+ key: "preserveTrailingZeros",
3700
+ dataIndex: "preserveTrailingZeros",
3701
+ title: "\u4FDD\u7559\u65E0\u6548\u96F6",
3702
+ width: 125,
3703
+ editable: true,
3704
+ formItemProps: { valueType: "select", clickCount: 1, options: booleanOptions },
3705
+ render: (value) => value === "yes" ? "\u662F" : "\u5426"
3706
+ }
3707
+ ]
3708
+ }] : []
3709
+ ],
3710
+ [includeSummary, request.columns]
3711
+ );
3339
3712
  const confirm = () => {
3340
- if (!fileName.trim()) {
3341
- setInvalid(true);
3342
- return;
3343
- }
3344
- request.onConfirm(`${fileName.trim()}${extension}`);
3713
+ if (!fileName.trim()) return setError("\u8BF7\u8F93\u5165\u6587\u4EF6\u540D\u79F0");
3714
+ if (request.columns && !selectedKeys.length) return setError("\u8BF7\u81F3\u5C11\u9009\u62E9\u4E00\u5217");
3715
+ request.onConfirm(
3716
+ `${fileName.trim()}${extension}`,
3717
+ request.columns ? buildExportDialogSettings(rows, selectedKeys, includeSummary) : void 0
3718
+ );
3719
+ onClose?.();
3345
3720
  };
3346
3721
  return /* @__PURE__ */ jsxs(
3347
3722
  ReactModal,
3348
3723
  {
3349
3724
  open: true,
3350
3725
  title: "\u5BFC\u51FA\u6587\u4EF6",
3351
- width: 420,
3726
+ width: request.columns ? 1180 : 420,
3352
3727
  fullscreenable: false,
3353
- onCancel: request.onCancel,
3354
3728
  onOk: confirm,
3355
3729
  okText: "\u5BFC\u51FA",
3356
3730
  cancelText: "\u53D6\u6D88",
3731
+ onCancel: () => {
3732
+ onClose?.();
3733
+ request.onCancel();
3734
+ },
3357
3735
  children: [
3358
3736
  /* @__PURE__ */ jsxs("label", { style: { display: "flex", flexDirection: "column", gap: 8 }, children: [
3359
3737
  "\u6587\u4EF6\u540D\u79F0",
3360
- /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: 8 }, children: [
3738
+ /* @__PURE__ */ jsxs("span", { style: { display: "flex", alignItems: "center", gap: 8 }, children: [
3361
3739
  /* @__PURE__ */ jsx(
3362
3740
  ReactInput,
3363
3741
  {
@@ -3367,15 +3745,72 @@ function ReactListTableExportNameDialog({
3367
3745
  onFocus: (event) => event.target.select(),
3368
3746
  onChange: (event) => {
3369
3747
  setFileName(event.target.value);
3370
- setInvalid(false);
3748
+ setError("");
3371
3749
  },
3372
3750
  onPressEnter: confirm
3373
3751
  }
3374
3752
  ),
3375
- /* @__PURE__ */ jsx("span", { "aria-label": "\u6587\u4EF6\u540E\u7F00", style: { flexShrink: 0 }, children: extension })
3753
+ /* @__PURE__ */ jsx("span", { "aria-label": "\u6587\u4EF6\u540E\u7F00", children: extension })
3376
3754
  ] })
3377
3755
  ] }),
3378
- invalid ? /* @__PURE__ */ jsx("div", { role: "alert", style: { color: "#ff4d4f", marginTop: 8 }, children: "\u8BF7\u8F93\u5165\u6587\u4EF6\u540D\u79F0" }) : null
3756
+ request.columns ? /* @__PURE__ */ jsxs("div", { style: { marginTop: 16 }, children: [
3757
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: 16, marginBottom: 8 }, children: [
3758
+ /* @__PURE__ */ jsx("span", { style: { fontWeight: 600 }, children: "\u5BFC\u51FA\u8868\u683C\u5217" }),
3759
+ /* @__PURE__ */ jsxs("label", { style: { display: "inline-flex", alignItems: "center", gap: 6 }, children: [
3760
+ /* @__PURE__ */ jsx(
3761
+ ReactCheckbox,
3762
+ {
3763
+ checked: includeSummary,
3764
+ "aria-label": "\u5BFC\u51FA\u6C47\u603B\u884C",
3765
+ onChange: (event) => setIncludeSummary(event.target.checked)
3766
+ }
3767
+ ),
3768
+ "\u5BFC\u51FA\u6C47\u603B\u884C"
3769
+ ] })
3770
+ ] }),
3771
+ /* @__PURE__ */ jsx("div", { style: { height: "min(45vh, 520px)", minHeight: 250, overflow: "hidden" }, children: renderTable({
3772
+ tableId,
3773
+ columns,
3774
+ dataSource: rows,
3775
+ rowKey: "key",
3776
+ rowHeight: 42,
3777
+ headerRowHeight: 38,
3778
+ toolbar: false,
3779
+ contextMenu: false,
3780
+ pagination: false,
3781
+ resizable: true,
3782
+ draggable: true,
3783
+ rowSelection: {
3784
+ type: "checkbox",
3785
+ selectedRowKeys: selectedKeys,
3786
+ selectRowByClick: false,
3787
+ columnWidth: 54,
3788
+ onChange: (keys) => {
3789
+ setSelectedKeys(keys);
3790
+ setError("");
3791
+ }
3792
+ },
3793
+ rowDrag: {
3794
+ enabled: true,
3795
+ droppable: true,
3796
+ allowSelfDrop: true,
3797
+ mode: "move",
3798
+ onDrop: ({ rows: dragged, insertIndex, source }) => {
3799
+ if (source.tableId !== tableId || insertIndex == null) return;
3800
+ const draggedKeys = new Set(dragged.map((row) => row.key));
3801
+ setRows((current) => {
3802
+ const moved = current.filter((row) => draggedKeys.has(row.key));
3803
+ const preceding = current.slice(0, insertIndex).filter((row) => !draggedKeys.has(row.key)).length;
3804
+ const remaining = current.filter((row) => !draggedKeys.has(row.key));
3805
+ remaining.splice(preceding, 0, ...moved);
3806
+ return remaining;
3807
+ });
3808
+ }
3809
+ },
3810
+ style: { width: "100%", height: "100%" }
3811
+ }) })
3812
+ ] }) : null,
3813
+ error ? /* @__PURE__ */ jsx("div", { role: "alert", style: { color: "#ff4d4f", marginTop: 8 }, children: error }) : null
3379
3814
  ]
3380
3815
  }
3381
3816
  );
@@ -4709,7 +5144,7 @@ function resolveSortableTransform(index, sourceIndex, targetIndex, height) {
4709
5144
  }
4710
5145
 
4711
5146
  // src/features/toolbar/style.css
4712
- styleInject(".react-list-table-shell {\n background: #fff;\n font-size: 14px;\n}\n.react-list-table-titlebar {\n height: 44px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 0;\n box-sizing: border-box;\n background: #fff;\n}\n.react-list-table-shell-fullscreen {\n width: 100% !important;\n height: 100% !important;\n}\n.react-list-table-shell-fullscreen .canvas-list-table-root {\n height: 100% !important;\n}\n.react-list-table-title {\n min-width: 0;\n color: #1f2937;\n font-size: 14px;\n font-weight: 600;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n.react-list-table-tools {\n display: flex;\n align-items: center;\n gap: 14px;\n color: #475569;\n}\n.react-list-table-tool-wrap {\n position: relative;\n display: inline-flex;\n}\n.react-list-table-tool {\n width: 20px;\n height: 24px;\n padding: 0;\n border: 0;\n color: inherit;\n background: transparent;\n font: 16px/24px sans-serif;\n cursor: pointer;\n}\n.react-list-table-tool:hover {\n color: #1677ff;\n}\n.react-list-table-tool-menu,\n.react-list-table-column-setting {\n position: absolute;\n z-index: 120;\n top: 28px;\n right: 0;\n min-width: 112px;\n padding: 6px;\n border: 1px solid #e5e7eb;\n border-radius: 6px;\n background: #fff;\n box-shadow: 0 8px 24px rgba(15, 23, 42, 0.14);\n}\n.react-list-table-tool-menu button {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n width: 100%;\n height: 32px;\n padding: 0 10px;\n border: 0;\n border-radius: 8px;\n background: transparent;\n color: #374151;\n font-size: 14px;\n text-align: left;\n cursor: pointer;\n}\n.react-list-table-tool-menu {\n width: max-content;\n min-width: 0;\n padding: 8px;\n border-radius: 8px;\n}\n.react-list-table-tool-menu-check {\n width: 16px;\n flex: 0 0 16px;\n margin-right: 6px;\n text-align: center;\n}\n.react-list-table-tool-menu button:hover {\n background: #f3f4f6;\n}\n.react-list-table-column-setting {\n width: 328px;\n max-height: 360px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n.react-list-table-column-setting-head {\n display: flex;\n gap: 12px;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n padding: 4px 6px 8px;\n border-bottom: 1px solid #f0f0f0;\n flex: 0 0 auto;\n}\n.react-list-table-column-setting-head button {\n border: 0;\n color: #1677ff;\n background: transparent;\n cursor: pointer;\n}\n.react-list-table-column-setting-body {\n flex: 1 1 auto;\n min-height: 0;\n overflow: auto;\n}\n.react-list-table-column-item {\n display: flex;\n align-items: center;\n gap: 8px;\n justify-content: space-between;\n padding: 7px 6px;\n box-sizing: border-box;\n cursor: pointer;\n}\n.react-list-table-column-main,\n.react-list-table-column-actions {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n}\n.react-list-table-column-main {\n min-width: 0;\n}\n.react-list-table-column-actions {\n flex: 0 0 auto;\n}\n.react-list-table-column-actions > .canvas-react-select-wrap {\n flex: 0 0 96px;\n width: 96px;\n height: 24px;\n}\n.react-list-table-column-label {\n min-width: 64px;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n.react-list-table-column-width-input {\n height: 22px;\n padding-inline: 5px;\n}\n.react-list-table-column-fixed-input {\n height: 22px;\n padding-inline: 6px;\n font-size: 14px;\n}\n.react-list-table-column-setting label.dragging {\n opacity: 0.45;\n background: #e6f4ff;\n}\n.react-list-table-column-setting [data-sortable-key].dragging {\n opacity: 0.28;\n}\n.react-list-table-column-drag {\n color: #94a3b8;\n display: inline-flex;\n font-size: 14px;\n cursor: grab;\n user-select: none;\n}\nbody.react-list-table-sorting,\nbody.react-list-table-sorting * {\n cursor: grabbing !important;\n}\n.react-list-table-sort-overlay {\n position: fixed;\n z-index: 1400;\n display: block;\n padding: 0;\n box-sizing: border-box;\n color: #334155;\n background: #fff;\n border: 1px solid #91caff;\n border-radius: 6px;\n box-shadow: 0 8px 24px rgba(15, 23, 42, 0.18);\n pointer-events: none;\n}\n.react-list-table-sort-overlay .react-list-table-column-item {\n width: 100%;\n height: 100%;\n}\n");
5147
+ styleInject(".react-list-table-shell {\n background: #fff;\n font-size: 14px;\n}\n.react-list-table-titlebar {\n height: 44px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 0;\n box-sizing: border-box;\n background: #fff;\n}\n.react-list-table-shell-fullscreen {\n width: 100% !important;\n height: 100% !important;\n}\n.react-list-table-shell-fullscreen .canvas-list-table-root {\n height: 100% !important;\n}\n.react-list-table-title {\n min-width: 0;\n color: #1f2937;\n font-size: 14px;\n font-weight: 600;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n.react-list-table-tools {\n display: flex;\n align-items: center;\n gap: 14px;\n color: #475569;\n}\n.react-list-table-tool-wrap {\n position: relative;\n display: inline-flex;\n}\n.react-list-table-tool {\n width: 20px;\n height: 24px;\n padding: 0;\n border: 0;\n color: inherit;\n background: transparent;\n font: 16px/24px sans-serif;\n cursor: pointer;\n}\n.react-list-table-tool:hover {\n color: #1677ff;\n}\n.react-list-table-tool-menu,\n.react-list-table-column-setting {\n position: absolute;\n z-index: 120;\n top: 28px;\n right: 0;\n min-width: 112px;\n padding: 6px;\n border: 1px solid #e5e7eb;\n border-radius: 6px;\n background: #fff;\n box-shadow: 0 8px 24px rgba(15, 23, 42, 0.14);\n}\n.react-list-table-tool-menu button {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n width: 100%;\n height: 32px;\n padding: 0 10px;\n border: 0;\n border-radius: 8px;\n background: transparent;\n color: #374151;\n font-size: 14px;\n text-align: left;\n cursor: pointer;\n}\n.react-list-table-tool-menu {\n width: max-content;\n min-width: 0;\n padding: 8px;\n border-radius: 8px;\n}\n.react-list-table-tool-menu-check {\n width: 16px;\n flex: 0 0 16px;\n margin-right: 6px;\n text-align: center;\n}\n.react-list-table-tool-menu button:hover {\n background: #f3f4f6;\n}\n.react-list-table-column-setting {\n width: 328px;\n max-height: 360px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n.react-list-table-column-setting-head {\n display: flex;\n gap: 12px;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n padding: 4px 6px 8px;\n border-bottom: 1px solid #f0f0f0;\n flex: 0 0 auto;\n}\n.react-list-table-column-setting-head button {\n border: 0;\n color: #1677ff;\n background: transparent;\n cursor: pointer;\n}\n.react-list-table-column-setting-body {\n flex: 1 1 auto;\n min-height: 0;\n overflow: auto;\n}\n.react-list-table-column-item {\n display: flex;\n align-items: center;\n gap: 8px;\n justify-content: space-between;\n padding: 7px 6px;\n box-sizing: border-box;\n cursor: pointer;\n}\n.react-list-table-column-main,\n.react-list-table-column-actions {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n}\n.react-list-table-column-main {\n min-width: 0;\n}\n.react-list-table-column-actions {\n flex: 0 0 auto;\n}\n.react-list-table-column-actions > .canvas-react-select-wrap {\n flex: 0 0 96px;\n width: 96px;\n height: 24px;\n}\n.react-list-table-column-label {\n min-width: 64px;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n.react-list-table-column-width-input {\n height: 22px;\n padding-inline: 5px;\n}\n.react-list-table-column-fixed-input {\n height: 22px;\n padding-inline: 6px;\n font-size: 14px;\n}\n.react-list-table-column-sort-input {\n height: 22px;\n padding-inline: 6px;\n font-size: 14px;\n}\n.react-list-table-column-setting label.dragging {\n opacity: 0.45;\n background: #e6f4ff;\n}\n.react-list-table-column-setting [data-sortable-key].dragging {\n opacity: 0.28;\n}\n.react-list-table-column-drag {\n color: #94a3b8;\n display: inline-flex;\n font-size: 14px;\n cursor: grab;\n user-select: none;\n}\nbody.react-list-table-sorting,\nbody.react-list-table-sorting * {\n cursor: grabbing !important;\n}\n.react-list-table-sort-overlay {\n position: fixed;\n z-index: 1400;\n display: block;\n padding: 0;\n box-sizing: border-box;\n color: #334155;\n background: #fff;\n border: 1px solid #91caff;\n border-radius: 6px;\n box-shadow: 0 8px 24px rgba(15, 23, 42, 0.18);\n pointer-events: none;\n}\n.react-list-table-sort-overlay .react-list-table-column-item {\n width: 100%;\n height: 100%;\n}\n");
4713
5148
  function ReactTableToolbar(props) {
4714
5149
  const { toolbar, title } = props;
4715
5150
  const [densityOpen, setDensityOpen] = useState(false);
@@ -4824,7 +5259,10 @@ function ReactTableToolbar(props) {
4824
5259
  ToolButton,
4825
5260
  {
4826
5261
  label: "\u5217\u8BBE\u7F6E",
4827
- onClick: () => setSettingOpen((v) => !v),
5262
+ onClick: () => {
5263
+ if (!settingOpen) props.onColumnSettingsOpen();
5264
+ setSettingOpen((v) => !v);
5265
+ },
4828
5266
  children: /* @__PURE__ */ jsx(SettingOutlined, {})
4829
5267
  }
4830
5268
  ),
@@ -4832,7 +5270,7 @@ function ReactTableToolbar(props) {
4832
5270
  "div",
4833
5271
  {
4834
5272
  className: "react-list-table-column-setting",
4835
- style: { width: config.columnSettingWidth },
5273
+ style: { width: config.columnSettingWidth ?? 430 },
4836
5274
  children: [
4837
5275
  /* @__PURE__ */ jsxs("div", { className: "react-list-table-column-setting-head", children: [
4838
5276
  /* @__PURE__ */ jsx("strong", { children: "\u5217\u8BBE\u7F6E" }),
@@ -4912,6 +5350,29 @@ function ReactTableToolbar(props) {
4912
5350
  }
4913
5351
  }
4914
5352
  ),
5353
+ /* @__PURE__ */ jsx(
5354
+ ReactSelect,
5355
+ {
5356
+ className: "react-list-table-column-sort-input",
5357
+ value: props.sortState.find(
5358
+ (item) => item.key === column.key
5359
+ )?.order ?? "default",
5360
+ options: [
5361
+ { label: "\u9ED8\u8BA4\u6392\u5E8F", value: "default" },
5362
+ { label: "\u5347\u5E8F", value: "ascend" },
5363
+ { label: "\u964D\u5E8F", value: "descend" }
5364
+ ],
5365
+ disabled: !column.sortable,
5366
+ allowClear: false,
5367
+ showSearch: false,
5368
+ style: { width: "100%", height: 24 },
5369
+ "aria-label": `${column.label}\u6392\u5E8F\u65B9\u5F0F`,
5370
+ onChange: (value) => props.onColumnSortChange(
5371
+ column.key,
5372
+ value === "ascend" || value === "descend" ? value : null
5373
+ )
5374
+ }
5375
+ ),
4915
5376
  /* @__PURE__ */ jsx(
4916
5377
  ReactSelect,
4917
5378
  {
@@ -4977,7 +5438,8 @@ function flattenColumns(columns, parentKey = "root", level = 0) {
4977
5438
  fixed: column.fixed,
4978
5439
  level,
4979
5440
  isGroup: Boolean(column.children?.length),
4980
- disableHide: column.disableHide === true
5441
+ disableHide: column.disableHide === true,
5442
+ sortable: column.allowSort !== false && column.sorter !== false
4981
5443
  };
4982
5444
  return column.children?.length ? [current, ...flattenColumns(column.children, key, level + 1)] : [current];
4983
5445
  });
@@ -5046,6 +5508,7 @@ function useReactListTableState(options) {
5046
5508
  }),
5047
5509
  [options.ui]
5048
5510
  );
5511
+ const appliedOptionsRef = useRef(null);
5049
5512
  useEffect(() => {
5050
5513
  const container = containerRef.current;
5051
5514
  if (!container) {
@@ -5055,11 +5518,13 @@ function useReactListTableState(options) {
5055
5518
  ...options,
5056
5519
  ui: uiOptions
5057
5520
  });
5521
+ appliedOptionsRef.current = { options, uiOptions };
5058
5522
  table.mount();
5059
5523
  tableRef.current = table;
5060
5524
  return () => {
5061
5525
  table.destroy();
5062
5526
  tableRef.current = null;
5527
+ appliedOptionsRef.current = null;
5063
5528
  setEditorRequest(null);
5064
5529
  setPaginationConfig(null);
5065
5530
  setTooltipRequest(null);
@@ -5074,6 +5539,10 @@ function useReactListTableState(options) {
5074
5539
  };
5075
5540
  }, []);
5076
5541
  useEffect(() => {
5542
+ if (appliedOptionsRef.current?.options === options && appliedOptionsRef.current.uiOptions === uiOptions) {
5543
+ return;
5544
+ }
5545
+ appliedOptionsRef.current = { options, uiOptions };
5077
5546
  tableRef.current?.updateOptions({
5078
5547
  ...options,
5079
5548
  ui: uiOptions
@@ -5093,6 +5562,9 @@ function useReactListTableState(options) {
5093
5562
  imagePreviewRequest,
5094
5563
  dangerConfirmRequest,
5095
5564
  exportNameRequest,
5565
+ closeExportNameRequest: () => {
5566
+ setExportNameRequest(null);
5567
+ },
5096
5568
  closeDangerConfirmRequest: () => {
5097
5569
  setDangerConfirmRequest(null);
5098
5570
  options.ui?.onDangerConfirmRequest?.(null);
@@ -5154,6 +5626,70 @@ function resolveReactListTableDebugOptions(debug, inheritedEnabled) {
5154
5626
  enabled: true
5155
5627
  };
5156
5628
  }
5629
+
5630
+ // src/components/column-manager-state.ts
5631
+ function applyColumnManagerState(columns, visibility, orders, config, parentKey = "root") {
5632
+ const order = orders.get(parentKey);
5633
+ const sortedColumns = order ? applyManagedColumnOrder(columns, order) : columns;
5634
+ return sortedColumns.map((column) => {
5635
+ const key = resolveColumnKey(column);
5636
+ const managedConfig = config.get(key);
5637
+ return {
5638
+ ...column,
5639
+ hidden: visibility.has(key) ? visibility.get(key) === false : column.hidden ?? column.initialHide,
5640
+ width: managedConfig?.width ?? column.width,
5641
+ minWidth: column.minWidth,
5642
+ maxWidth: column.maxWidth,
5643
+ fixed: managedConfig?.fixed === null ? void 0 : managedConfig?.fixed ?? column.fixed,
5644
+ children: column.children ? applyColumnManagerState(
5645
+ column.children,
5646
+ visibility,
5647
+ orders,
5648
+ config,
5649
+ key
5650
+ ) : void 0
5651
+ };
5652
+ });
5653
+ }
5654
+ function applyManagedColumnOrder(columns, orderedKeys) {
5655
+ const managedKeySet = new Set(orderedKeys);
5656
+ const managedSlots = columns.map(
5657
+ (column, index) => managedKeySet.has(resolveColumnKey(column)) ? index : -1
5658
+ ).filter((index) => index >= 0);
5659
+ const columnByKey = new Map(
5660
+ columns.map((column) => [resolveColumnKey(column), column])
5661
+ );
5662
+ const next = [...columns];
5663
+ orderedKeys.forEach((key, index) => {
5664
+ const slot = managedSlots[index];
5665
+ const column = columnByKey.get(key);
5666
+ if (slot != null && column) {
5667
+ next[slot] = column;
5668
+ }
5669
+ });
5670
+ return next;
5671
+ }
5672
+ function resolveColumnKey(column) {
5673
+ return String(column.key ?? column.dataIndex);
5674
+ }
5675
+ function getColumnSettingsSignature(columns) {
5676
+ return JSON.stringify(
5677
+ columns.map((column) => ({
5678
+ key: resolveColumnKey(column),
5679
+ title: String(
5680
+ column.settingTitle ?? (typeof column.title === "string" ? column.title : "")
5681
+ ),
5682
+ dataIndex: column.dataIndex,
5683
+ userDefined: column.userDefined,
5684
+ hidden: column.hidden,
5685
+ width: column.width,
5686
+ minWidth: column.minWidth,
5687
+ maxWidth: column.maxWidth,
5688
+ fixed: column.fixed,
5689
+ children: column.children ? getColumnSettingsSignature(column.children) : void 0
5690
+ }))
5691
+ );
5692
+ }
5157
5693
  function ReactListTableInner(props, ref) {
5158
5694
  const {
5159
5695
  className,
@@ -5166,6 +5702,7 @@ function ReactListTableInner(props, ref) {
5166
5702
  onChange,
5167
5703
  rowKey,
5168
5704
  columns,
5705
+ showCollapsedColumnIcon,
5169
5706
  dataSource,
5170
5707
  loading,
5171
5708
  onRow,
@@ -5173,6 +5710,7 @@ function ReactListTableInner(props, ref) {
5173
5710
  styles,
5174
5711
  striped,
5175
5712
  highlightMode,
5713
+ keyboardNavigation,
5176
5714
  contextMenu,
5177
5715
  grouping,
5178
5716
  rowHeight,
@@ -5207,13 +5745,31 @@ function ReactListTableInner(props, ref) {
5207
5745
  );
5208
5746
  const shellRef = useRef(null);
5209
5747
  const [isFullscreen, setIsFullscreen] = useState(false);
5748
+ const [scrollbarOverride, setScrollbarOverride] = useState(null);
5749
+ const [sharedScrollbar, setSharedScrollbar] = useState(
5750
+ getSharedScrollbarSettings
5751
+ );
5752
+ useEffect(
5753
+ () => subscribeSharedScrollbarSettings(
5754
+ () => setSharedScrollbar(getSharedScrollbarSettings())
5755
+ ),
5756
+ []
5757
+ );
5758
+ const effectiveScrollbar = sharedScrollbar.shared ? sharedScrollbar.value : scrollbarOverride ?? scrollbar;
5210
5759
  const [densityOverride, setDensityOverride] = useState(null);
5211
5760
  const [columnVisibility, setColumnVisibility] = useState(() => /* @__PURE__ */ new Map());
5212
5761
  const [columnOrders, setColumnOrders] = useState(
5213
5762
  () => /* @__PURE__ */ new Map()
5214
5763
  );
5215
5764
  const [columnConfig, setColumnConfig] = useState(() => /* @__PURE__ */ new Map());
5765
+ const restoredColumnTreeRef = useRef(null);
5766
+ const [restoredColumnTree, setRestoredColumnTree] = useState(
5767
+ restoredColumnTreeRef.current
5768
+ );
5216
5769
  const [columnConfigRevision, setColumnConfigRevision] = useState(0);
5770
+ const [toolbarSortState, setToolbarSortState] = useState(
5771
+ []
5772
+ );
5217
5773
  const [columnSettingsCacheOverride, setColumnSettingsCacheOverride] = useState(null);
5218
5774
  const resolvedColumnSettingsCache = (columnSettingsCacheOverride?.storageKey === storageKey ? columnSettingsCacheOverride?.value : void 0) ?? cacheColumnSettings ?? true;
5219
5775
  const [cachePreferencesOverride, setCachePreferencesOverride] = useState();
@@ -5221,12 +5777,19 @@ function ReactListTableInner(props, ref) {
5221
5777
  const [columnConfigResetRevision, setColumnConfigResetRevision] = useState(0);
5222
5778
  const resolvedColumns = useMemo(
5223
5779
  () => applyColumnManagerState(
5224
- columns,
5780
+ restoredColumnTree?.sourceColumns === columns && restoredColumnTree.storageKey === storageKey ? restoredColumnTree.columns : columns,
5225
5781
  columnVisibility,
5226
5782
  columnOrders,
5227
5783
  columnConfig
5228
5784
  ),
5229
- [columns, columnVisibility, columnOrders, columnConfig]
5785
+ [
5786
+ columns,
5787
+ storageKey,
5788
+ restoredColumnTree,
5789
+ columnVisibility,
5790
+ columnOrders,
5791
+ columnConfig
5792
+ ]
5230
5793
  );
5231
5794
  const resolvedRowHeight = densityOverride ?? rowHeight;
5232
5795
  const resolvedHeaderRowHeight = resolveDensityLinkedHeight(
@@ -5248,6 +5811,7 @@ function ReactListTableInner(props, ref) {
5248
5811
  onChange,
5249
5812
  rowKey,
5250
5813
  columns: resolvedColumns,
5814
+ showCollapsedColumnIcon,
5251
5815
  dataSource,
5252
5816
  loading,
5253
5817
  onRow,
@@ -5255,6 +5819,7 @@ function ReactListTableInner(props, ref) {
5255
5819
  styles,
5256
5820
  striped,
5257
5821
  highlightMode,
5822
+ keyboardNavigation,
5258
5823
  contextMenu,
5259
5824
  grouping,
5260
5825
  rowHeight: resolvedRowHeight,
@@ -5267,7 +5832,7 @@ function ReactListTableInner(props, ref) {
5267
5832
  rowSelection,
5268
5833
  expandable,
5269
5834
  pagination,
5270
- scrollbar,
5835
+ scrollbar: effectiveScrollbar,
5271
5836
  carouselScroll,
5272
5837
  stretchColumns,
5273
5838
  resizable,
@@ -5292,6 +5857,24 @@ function ReactListTableInner(props, ref) {
5292
5857
  ui: {
5293
5858
  ...nextOptions.ui,
5294
5859
  onDensityChange: setDensityOverride,
5860
+ onScrollbarChange: setScrollbarOverride,
5861
+ onColumnSettingsChange: (restoredColumns) => {
5862
+ const signature = getColumnSettingsSignature(restoredColumns);
5863
+ const current = restoredColumnTreeRef.current;
5864
+ if (current?.sourceColumns === columns && current.storageKey === storageKey && current.signature === signature)
5865
+ return;
5866
+ const next = {
5867
+ sourceColumns: columns,
5868
+ storageKey,
5869
+ columns: restoredColumns,
5870
+ signature
5871
+ };
5872
+ restoredColumnTreeRef.current = next;
5873
+ setRestoredColumnTree(next);
5874
+ setColumnVisibility(/* @__PURE__ */ new Map());
5875
+ setColumnOrders(/* @__PURE__ */ new Map());
5876
+ setColumnConfig(/* @__PURE__ */ new Map());
5877
+ },
5295
5878
  onColumnSettingsCacheChange: (value) => setColumnSettingsCacheOverride(
5296
5879
  (current) => current?.storageKey === storageKey && current?.value === value ? current : { storageKey, value }
5297
5880
  ),
@@ -5310,6 +5893,7 @@ function ReactListTableInner(props, ref) {
5310
5893
  onChange,
5311
5894
  rowKey,
5312
5895
  resolvedColumns,
5896
+ showCollapsedColumnIcon,
5313
5897
  dataSource,
5314
5898
  loading,
5315
5899
  onRow,
@@ -5317,6 +5901,7 @@ function ReactListTableInner(props, ref) {
5317
5901
  styles,
5318
5902
  striped,
5319
5903
  highlightMode,
5904
+ keyboardNavigation,
5320
5905
  contextMenu,
5321
5906
  grouping,
5322
5907
  resolvedRowHeight,
@@ -5329,7 +5914,7 @@ function ReactListTableInner(props, ref) {
5329
5914
  rowSelection,
5330
5915
  expandable,
5331
5916
  pagination,
5332
- scrollbar,
5917
+ effectiveScrollbar,
5333
5918
  carouselScroll,
5334
5919
  stretchColumns,
5335
5920
  resizable,
@@ -5358,6 +5943,7 @@ function ReactListTableInner(props, ref) {
5358
5943
  imagePreviewRequest,
5359
5944
  dangerConfirmRequest,
5360
5945
  exportNameRequest,
5946
+ closeExportNameRequest,
5361
5947
  closeDangerConfirmRequest
5362
5948
  } = useReactListTableState(options);
5363
5949
  const hasPagination = paginationConfig != null;
@@ -5410,6 +5996,12 @@ function ReactListTableInner(props, ref) {
5410
5996
  columnSettingsCacheAvailable: Boolean(storageKey),
5411
5997
  onColumnSettingsCacheChange: (enabled) => tableRef.current?.setColumnSettingsCache(enabled),
5412
5998
  columns: resolvedColumns,
5999
+ sortState: toolbarSortState,
6000
+ onColumnSettingsOpen: () => setToolbarSortState(tableRef.current?.getSortState() ?? []),
6001
+ onColumnSortChange: (columnKey, order) => {
6002
+ tableRef.current?.setSortOrder(columnKey, order);
6003
+ setToolbarSortState(tableRef.current?.getSortState() ?? []);
6004
+ },
5413
6005
  density: resolvedRowHeight ?? 32,
5414
6006
  hostRef: shellRef,
5415
6007
  onFullscreenChange: setIsFullscreen,
@@ -5473,6 +6065,8 @@ function ReactListTableInner(props, ref) {
5473
6065
  setColumnVisibility(/* @__PURE__ */ new Map());
5474
6066
  setColumnOrders(/* @__PURE__ */ new Map());
5475
6067
  setColumnConfig(/* @__PURE__ */ new Map());
6068
+ restoredColumnTreeRef.current = null;
6069
+ setRestoredColumnTree(null);
5476
6070
  setColumnConfigResetRevision((current) => current + 1);
5477
6071
  setColumnConfigRevision((current) => current + 1);
5478
6072
  });
@@ -5530,16 +6124,43 @@ function ReactListTableInner(props, ref) {
5530
6124
  /* @__PURE__ */ jsx(ReactTableFixedPopupView, { request: fixedPopupRequest }),
5531
6125
  portalContainer
5532
6126
  ) : null,
5533
- headerContextMenuRequest ? createPortal(
5534
- /* @__PURE__ */ jsx(ReactTableContextMenuView, { request: headerContextMenuRequest }),
6127
+ createPortal(
6128
+ /* @__PURE__ */ jsx(
6129
+ ReactTableContextMenuView,
6130
+ {
6131
+ request: headerContextMenuRequest ? {
6132
+ ...headerContextMenuRequest,
6133
+ scrollbar: effectiveScrollbar,
6134
+ onChangeScrollbar: (value) => {
6135
+ headerContextMenuRequest.onChangeScrollbar?.(value);
6136
+ setScrollbarOverride(value);
6137
+ if (getSharedScrollbarSettings().shared)
6138
+ setSharedScrollbarSettings({ shared: true, value });
6139
+ },
6140
+ onResetScrollbar: () => {
6141
+ headerContextMenuRequest.onResetScrollbar?.();
6142
+ setScrollbarOverride(null);
6143
+ if (getSharedScrollbarSettings().shared)
6144
+ setSharedScrollbarSettings({ shared: true, value: {} });
6145
+ }
6146
+ } : null
6147
+ }
6148
+ ),
5535
6149
  portalContainer
5536
- ) : null,
6150
+ ),
5537
6151
  searchRequest ? createPortal(
5538
6152
  /* @__PURE__ */ jsx(ReactListTableSearchDialog, { request: searchRequest }),
5539
6153
  portalContainer
5540
6154
  ) : null,
5541
6155
  exportNameRequest ? createPortal(
5542
- /* @__PURE__ */ jsx(ReactListTableExportNameDialog, { request: exportNameRequest }),
6156
+ /* @__PURE__ */ jsx(
6157
+ ReactListTableExportNameDialog,
6158
+ {
6159
+ request: exportNameRequest,
6160
+ onClose: closeExportNameRequest,
6161
+ renderTable: (tableProps) => /* @__PURE__ */ jsx(ReactListTable, { ...tableProps })
6162
+ }
6163
+ ),
5543
6164
  portalContainer
5544
6165
  ) : null,
5545
6166
  dangerConfirmRequest ? createPortal(
@@ -5570,50 +6191,6 @@ function ReactListTableInner(props, ref) {
5570
6191
  ) : null
5571
6192
  ] });
5572
6193
  }
5573
- function applyColumnManagerState(columns, visibility, orders, config, parentKey = "root") {
5574
- const order = orders.get(parentKey);
5575
- const sortedColumns = order ? applyManagedColumnOrder(columns, order) : columns;
5576
- return sortedColumns.map((column) => {
5577
- const key = resolveColumnKey(column);
5578
- const managedConfig = config.get(key);
5579
- return {
5580
- ...column,
5581
- hidden: visibility.has(key) ? visibility.get(key) === false : column.hidden ?? column.initialHide,
5582
- width: managedConfig?.width ?? column.width,
5583
- minWidth: column.minWidth,
5584
- maxWidth: column.maxWidth,
5585
- fixed: managedConfig?.fixed === null ? void 0 : managedConfig?.fixed ?? column.fixed,
5586
- children: column.children ? applyColumnManagerState(
5587
- column.children,
5588
- visibility,
5589
- orders,
5590
- config,
5591
- key
5592
- ) : void 0
5593
- };
5594
- });
5595
- }
5596
- function applyManagedColumnOrder(columns, orderedKeys) {
5597
- const managedKeySet = new Set(orderedKeys);
5598
- const managedSlots = columns.map(
5599
- (column, index) => managedKeySet.has(resolveColumnKey(column)) ? index : -1
5600
- ).filter((index) => index >= 0);
5601
- const columnByKey = new Map(
5602
- columns.map((column) => [resolveColumnKey(column), column])
5603
- );
5604
- const next = [...columns];
5605
- orderedKeys.forEach((key, index) => {
5606
- const slot = managedSlots[index];
5607
- const column = columnByKey.get(key);
5608
- if (slot != null && column) {
5609
- next[slot] = column;
5610
- }
5611
- });
5612
- return next;
5613
- }
5614
- function resolveColumnKey(column) {
5615
- return String(column.key ?? column.dataIndex);
5616
- }
5617
6194
  var ReactListTable = forwardRef(
5618
6195
  ReactListTableInner
5619
6196
  );
@@ -5621,6 +6198,6 @@ ReactListTable.EXPAND_COLUMN = EXPAND_COLUMN;
5621
6198
  ReactListTable.SELECTION_COLUMN = SELECTION_COLUMN;
5622
6199
  ReactListTable.ROW_SELECTION_COLUMN = ROW_SELECTION_COLUMN;
5623
6200
 
5624
- export { ReactListTable, ReactListTableDebugProvider };
6201
+ export { ReactListTable, ReactListTableDebugProvider, ReactListTableExportNameDialog };
5625
6202
  //# sourceMappingURL=index.js.map
5626
6203
  //# sourceMappingURL=index.js.map