@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/README.md +341 -341
- package/dist/index.cjs +704 -126
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +21 -2
- package/dist/index.d.ts +21 -2
- package/dist/index.js +706 -129
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { createContext, forwardRef, useMemo, useRef, useState, useImperativeHandle, useContext,
|
|
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 (!
|
|
526
|
-
return createSelectionChartOption(
|
|
527
|
-
}, [chartType,
|
|
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:
|
|
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
|
-
|
|
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:
|
|
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 [
|
|
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({
|
|
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
|
-
|
|
1281
|
+
ScrollbarModeMenu,
|
|
1075
1282
|
{
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
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:
|
|
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
|
-
|
|
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:
|
|
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 [
|
|
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
|
-
|
|
3342
|
-
|
|
3343
|
-
|
|
3344
|
-
|
|
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("
|
|
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
|
-
|
|
3748
|
+
setError("");
|
|
3371
3749
|
},
|
|
3372
3750
|
onPressEnter: confirm
|
|
3373
3751
|
}
|
|
3374
3752
|
),
|
|
3375
|
-
/* @__PURE__ */ jsx("span", { "aria-label": "\u6587\u4EF6\u540E\u7F00",
|
|
3753
|
+
/* @__PURE__ */ jsx("span", { "aria-label": "\u6587\u4EF6\u540E\u7F00", children: extension })
|
|
3376
3754
|
] })
|
|
3377
3755
|
] }),
|
|
3378
|
-
|
|
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: () =>
|
|
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
|
-
[
|
|
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
|
-
|
|
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
|
-
|
|
5534
|
-
/* @__PURE__ */ jsx(
|
|
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
|
-
)
|
|
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(
|
|
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
|