@canvas-components/react-list-table 0.2.0 → 0.2.2

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.d.cts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as react from 'react';
2
2
  import { CSSProperties, ReactNode, ForwardedRef } from 'react';
3
- import { ListTableOptions, ListTableQueryChange, ListTableScrollToOptions, ListTable, ListTableColumn, ListTablePaginationOptions, ListTableQueryOptions, ListTableRowSelectionOptions } from '@canvas-components/list-table';
3
+ import { ListTableOptions, ListTableQueryChange, ListTableExportXlsxOptions, ListTableScrollToOptions, ListTable, ListTableColumn, ListTablePaginationOptions, ListTableQueryOptions, ListTableRowSelectionOptions } from '@canvas-components/list-table';
4
4
 
5
5
  interface ReactListTableScrollConfig {
6
6
  x?: number | string | true;
@@ -30,7 +30,11 @@ interface ReactListTableToolbarOptions {
30
30
  showColumnSetting?: boolean;
31
31
  /** 列设置弹层宽度,数字值按像素处理。 */
32
32
  columnSettingWidth?: number | string;
33
+ /** 列设置标题栏中位于重置按钮前的扩展内容。 */
34
+ columnSettingHeaderExtra?: ReactNode;
33
35
  showExport?: boolean;
36
+ /** 默认导出行为使用的文件名和汇总行配置。 */
37
+ exportOptions?: ListTableExportXlsxOptions;
34
38
  onRefresh?: () => void;
35
39
  /** 自定义导出行为;未配置时默认异步导出全量 XLSX 数据。 */
36
40
  onExport?: () => void;
@@ -43,7 +47,7 @@ interface ReactListTableToolbarOptions {
43
47
  */
44
48
  interface ReactListTableRef<RecordType = Record<string, unknown>> {
45
49
  validate: () => Promise<RecordType[]>;
46
- exportXlsx: () => void;
50
+ exportXlsx: (options?: ListTableExportXlsxOptions) => void;
47
51
  scrollTo: (options: ListTableScrollToOptions) => void;
48
52
  getDebugSnapshot: () => ReturnType<ListTable<RecordType>["getDebugSnapshot"]>;
49
53
  resetSorter: () => void;
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as react from 'react';
2
2
  import { CSSProperties, ReactNode, ForwardedRef } from 'react';
3
- import { ListTableOptions, ListTableQueryChange, ListTableScrollToOptions, ListTable, ListTableColumn, ListTablePaginationOptions, ListTableQueryOptions, ListTableRowSelectionOptions } from '@canvas-components/list-table';
3
+ import { ListTableOptions, ListTableQueryChange, ListTableExportXlsxOptions, ListTableScrollToOptions, ListTable, ListTableColumn, ListTablePaginationOptions, ListTableQueryOptions, ListTableRowSelectionOptions } from '@canvas-components/list-table';
4
4
 
5
5
  interface ReactListTableScrollConfig {
6
6
  x?: number | string | true;
@@ -30,7 +30,11 @@ interface ReactListTableToolbarOptions {
30
30
  showColumnSetting?: boolean;
31
31
  /** 列设置弹层宽度,数字值按像素处理。 */
32
32
  columnSettingWidth?: number | string;
33
+ /** 列设置标题栏中位于重置按钮前的扩展内容。 */
34
+ columnSettingHeaderExtra?: ReactNode;
33
35
  showExport?: boolean;
36
+ /** 默认导出行为使用的文件名和汇总行配置。 */
37
+ exportOptions?: ListTableExportXlsxOptions;
34
38
  onRefresh?: () => void;
35
39
  /** 自定义导出行为;未配置时默认异步导出全量 XLSX 数据。 */
36
40
  onExport?: () => void;
@@ -43,7 +47,7 @@ interface ReactListTableToolbarOptions {
43
47
  */
44
48
  interface ReactListTableRef<RecordType = Record<string, unknown>> {
45
49
  validate: () => Promise<RecordType[]>;
46
- exportXlsx: () => void;
50
+ exportXlsx: (options?: ListTableExportXlsxOptions) => void;
47
51
  scrollTo: (options: ListTableScrollToOptions) => void;
48
52
  getDebugSnapshot: () => ReturnType<ListTable<RecordType>["getDebugSnapshot"]>;
49
53
  resetSorter: () => void;
package/dist/index.js CHANGED
@@ -162,6 +162,8 @@ function ReactTableContextMenuView(props) {
162
162
  }
163
163
  ),
164
164
  /* @__PURE__ */ jsx(SummaryMenu, { request }),
165
+ /* @__PURE__ */ jsx(AlignmentMenu, { request }),
166
+ /* @__PURE__ */ jsx(DataFormatMenu, { request }),
165
167
  /* @__PURE__ */ jsx(
166
168
  MenuSubmenu,
167
169
  {
@@ -215,13 +217,7 @@ function ReactTableContextMenuView(props) {
215
217
  onChange: request.onChangeDensity
216
218
  }
217
219
  ),
218
- /* @__PURE__ */ jsx(
219
- ZoomMenu,
220
- {
221
- value: request.zoom ?? 1,
222
- onChange: request.onChangeZoom
223
- }
224
- ),
220
+ /* @__PURE__ */ jsx(ZoomMenu, { value: request.zoom ?? 1, onChange: request.onChangeZoom }),
225
221
  request.columns?.length && request.onToggleColumn ? /* @__PURE__ */ jsxs(Fragment, { children: [
226
222
  /* @__PURE__ */ jsx(MenuDivider, {}),
227
223
  /* @__PURE__ */ jsx(
@@ -522,11 +518,11 @@ function ZoomMenu(props) {
522
518
  anchorRef: triggerRef,
523
519
  placement: "rightTop",
524
520
  offset: 2,
525
- minWidth: 220,
521
+ minWidth: 280,
526
522
  onOpenChange: setOpen,
527
523
  surfaceStyle: {
528
524
  ...CONTEXT_MENU_SURFACE_STYLE,
529
- width: 220
525
+ width: 280
530
526
  },
531
527
  children: /* @__PURE__ */ jsxs(
532
528
  "div",
@@ -555,45 +551,58 @@ function ZoomMenu(props) {
555
551
  children: "\u8868\u683C\u7F29\u653E\uFF0850% - 200%\uFF09"
556
552
  }
557
553
  ),
558
- /* @__PURE__ */ jsx("div", { style: { padding: "0 8px 4px" }, children: /* @__PURE__ */ jsx(
559
- ReactInputNumber,
560
- {
561
- value: percent,
562
- min: CONTEXT_MENU_ZOOM_MIN,
563
- max: CONTEXT_MENU_ZOOM_MAX,
564
- step: CONTEXT_MENU_ZOOM_STEP,
565
- precision: 0,
566
- addonAfter: "%",
567
- onChange: (next) => {
568
- if (next == null || !Number.isFinite(next)) {
569
- return;
570
- }
571
- onChange(Math.round(next) / 100);
572
- }
573
- }
574
- ) }),
575
- /* @__PURE__ */ jsx(
576
- "button",
554
+ /* @__PURE__ */ jsxs(
555
+ "div",
577
556
  {
578
- type: "button",
579
- disabled: percent === 100,
580
- onClick: () => {
581
- onChange(1);
582
- },
583
- className: "react-list-table-menu-action",
584
557
  style: {
585
- display: "block",
586
- width: "100%",
587
- height: 32,
588
- padding: "0 8px",
589
- border: "none",
590
- borderRadius: 8,
591
- background: "transparent",
592
- color: percent === 100 ? "#9ca3af" : "#374151",
593
- textAlign: "left",
594
- cursor: percent === 100 ? "not-allowed" : "pointer"
558
+ display: "flex",
559
+ alignItems: "stretch",
560
+ gap: 6,
561
+ padding: "0 8px 4px"
595
562
  },
596
- children: "\u91CD\u7F6E\u7F29\u653E"
563
+ children: [
564
+ /* @__PURE__ */ jsx(
565
+ ReactInputNumber,
566
+ {
567
+ value: percent,
568
+ min: CONTEXT_MENU_ZOOM_MIN,
569
+ max: CONTEXT_MENU_ZOOM_MAX,
570
+ step: CONTEXT_MENU_ZOOM_STEP,
571
+ precision: 0,
572
+ addonAfter: "%",
573
+ style: { flex: "1 1 auto", minWidth: 0 },
574
+ onChange: (next) => {
575
+ if (next == null || !Number.isFinite(next)) {
576
+ return;
577
+ }
578
+ onChange(Math.round(next) / 100);
579
+ }
580
+ }
581
+ ),
582
+ /* @__PURE__ */ jsx(
583
+ "button",
584
+ {
585
+ type: "button",
586
+ disabled: percent === 100,
587
+ onClick: () => {
588
+ onChange(1);
589
+ },
590
+ className: "react-list-table-menu-action",
591
+ style: {
592
+ flex: "0 0 52px",
593
+ height: 32,
594
+ padding: 0,
595
+ border: "1px solid #d1d5db",
596
+ borderRadius: 6,
597
+ background: "#ffffff",
598
+ color: percent === 100 ? "#9ca3af" : "#374151",
599
+ textAlign: "center",
600
+ cursor: percent === 100 ? "not-allowed" : "pointer"
601
+ },
602
+ children: "\u91CD\u7F6E"
603
+ }
604
+ )
605
+ ]
597
606
  }
598
607
  )
599
608
  ]
@@ -1059,6 +1068,129 @@ function SummaryMenu(props) {
1059
1068
  }
1060
1069
  );
1061
1070
  }
1071
+ function AlignmentMenu(props) {
1072
+ const { request } = props;
1073
+ if (!request.alignment || !request.onChangeAlignment) {
1074
+ return null;
1075
+ }
1076
+ return /* @__PURE__ */ jsx(
1077
+ MenuSubmenu,
1078
+ {
1079
+ label: "\u5BF9\u9F50\u65B9\u5F0F",
1080
+ items: [],
1081
+ footer: /* @__PURE__ */ jsxs("div", { style: { display: "grid", gap: 10, padding: "4px 8px" }, children: [
1082
+ /* @__PURE__ */ jsx(
1083
+ AlignmentGroup,
1084
+ {
1085
+ label: "\u8868\u5934",
1086
+ horizontal: request.alignment.headerHorizontal,
1087
+ vertical: request.alignment.headerVertical,
1088
+ onHorizontalChange: (value) => request.onChangeAlignment?.("header", "horizontal", value),
1089
+ onVerticalChange: (value) => request.onChangeAlignment?.("header", "vertical", value)
1090
+ }
1091
+ ),
1092
+ /* @__PURE__ */ jsx(
1093
+ AlignmentGroup,
1094
+ {
1095
+ label: "\u8868\u4F53",
1096
+ horizontal: request.alignment.bodyHorizontal,
1097
+ vertical: request.alignment.bodyVertical,
1098
+ onHorizontalChange: (value) => request.onChangeAlignment?.("body", "horizontal", value),
1099
+ onVerticalChange: (value) => request.onChangeAlignment?.("body", "vertical", value)
1100
+ }
1101
+ )
1102
+ ] })
1103
+ }
1104
+ );
1105
+ }
1106
+ function AlignmentGroup(props) {
1107
+ return /* @__PURE__ */ jsxs("div", { style: { display: "grid", gap: 6 }, children: [
1108
+ /* @__PURE__ */ jsx("strong", { style: { color: "#374151", fontSize: 13 }, children: props.label }),
1109
+ /* @__PURE__ */ jsx(
1110
+ AlignmentSegment,
1111
+ {
1112
+ label: "\u6C34\u5E73",
1113
+ value: props.horizontal,
1114
+ options: [
1115
+ { label: "\u5DE6", value: "left" },
1116
+ { label: "\u4E2D", value: "center" },
1117
+ { label: "\u53F3", value: "right" }
1118
+ ],
1119
+ onChange: props.onHorizontalChange
1120
+ }
1121
+ ),
1122
+ /* @__PURE__ */ jsx(
1123
+ AlignmentSegment,
1124
+ {
1125
+ label: "\u5782\u76F4",
1126
+ value: props.vertical,
1127
+ options: [
1128
+ { label: "\u4E0A", value: "top" },
1129
+ { label: "\u4E2D", value: "middle" },
1130
+ { label: "\u4E0B", value: "bottom" }
1131
+ ],
1132
+ onChange: props.onVerticalChange
1133
+ }
1134
+ )
1135
+ ] });
1136
+ }
1137
+ function AlignmentSegment(props) {
1138
+ return /* @__PURE__ */ jsxs(
1139
+ "div",
1140
+ {
1141
+ style: {
1142
+ display: "grid",
1143
+ gridTemplateColumns: "40px repeat(3, 1fr)",
1144
+ gap: 4,
1145
+ alignItems: "center"
1146
+ },
1147
+ children: [
1148
+ /* @__PURE__ */ jsx("span", { style: { color: "#6b7280", fontSize: 12 }, children: props.label }),
1149
+ props.options.map((option) => /* @__PURE__ */ jsx(
1150
+ "button",
1151
+ {
1152
+ type: "button",
1153
+ className: "react-list-table-menu-action",
1154
+ style: {
1155
+ height: 28,
1156
+ border: "1px solid #d1d5db",
1157
+ borderRadius: 4,
1158
+ background: props.value === option.value ? "#e8f3ff" : "#ffffff",
1159
+ color: props.value === option.value ? "#1677ff" : "#374151",
1160
+ cursor: "pointer"
1161
+ },
1162
+ onClick: () => props.onChange(option.value),
1163
+ children: option.label
1164
+ },
1165
+ option.value
1166
+ ))
1167
+ ]
1168
+ }
1169
+ );
1170
+ }
1171
+ function DataFormatMenu(props) {
1172
+ const { request } = props;
1173
+ if (!request.onChangeDataFormat) {
1174
+ return null;
1175
+ }
1176
+ return /* @__PURE__ */ jsx(
1177
+ MenuSubmenu,
1178
+ {
1179
+ label: "\u6570\u636E\u683C\u5F0F",
1180
+ items: [
1181
+ { key: "default", label: "\u9ED8\u8BA4", value: "default" },
1182
+ { key: "number", label: "\u666E\u901A\u6570\u5B57", value: "number" },
1183
+ { key: "thousands", label: "\u5343\u4F4D\u5206\u9694", value: "thousands" },
1184
+ { key: "money", label: "\u91D1\u989D\uFF08\u4E24\u4F4D\u5C0F\u6570\uFF09", value: "money" }
1185
+ ].map((item) => ({
1186
+ key: `data-format-${item.key}`,
1187
+ label: item.label,
1188
+ selected: request.dataFormat === item.value,
1189
+ onClick: () => request.onChangeDataFormat?.(item.value)
1190
+ }))
1191
+ }
1192
+ );
1193
+ }
1062
1194
 
1063
1195
  // src/features/editor/utils.ts
1064
1196
  function toNumberValue(value) {
@@ -2299,7 +2431,15 @@ function ReactTableToolbar(props) {
2299
2431
  children: isFullscreen ? /* @__PURE__ */ jsx(FullscreenExitOutlined, {}) : /* @__PURE__ */ jsx(FullscreenOutlined, {})
2300
2432
  }
2301
2433
  ) : null,
2302
- config.showRefresh !== false ? /* @__PURE__ */ jsx(ToolButton, { label: "\u5237\u65B0", iconSize: 14, onClick: () => config.onRefresh?.(), children: /* @__PURE__ */ jsx(ReloadOutlined, {}) }) : null,
2434
+ config.showRefresh !== false ? /* @__PURE__ */ jsx(
2435
+ ToolButton,
2436
+ {
2437
+ label: "\u5237\u65B0",
2438
+ iconSize: 14,
2439
+ onClick: () => config.onRefresh?.(),
2440
+ children: /* @__PURE__ */ jsx(ReloadOutlined, {})
2441
+ }
2442
+ ) : null,
2303
2443
  config.showExport ? /* @__PURE__ */ jsx(
2304
2444
  ToolButton,
2305
2445
  {
@@ -2309,14 +2449,21 @@ function ReactTableToolbar(props) {
2309
2449
  if (config.onExport) {
2310
2450
  config.onExport();
2311
2451
  } else {
2312
- props.onExport();
2452
+ props.onExport(config.exportOptions);
2313
2453
  }
2314
2454
  },
2315
2455
  children: /* @__PURE__ */ jsx(ExportOutlined, {})
2316
2456
  }
2317
2457
  ) : null,
2318
2458
  config.showDensity !== false ? /* @__PURE__ */ jsxs("div", { className: "react-list-table-tool-wrap", children: [
2319
- /* @__PURE__ */ jsx(ToolButton, { label: "\u8868\u683C\u5BC6\u5EA6", onClick: () => setDensityOpen((v) => !v), children: /* @__PURE__ */ jsx(ColumnHeightOutlined, {}) }),
2459
+ /* @__PURE__ */ jsx(
2460
+ ToolButton,
2461
+ {
2462
+ label: "\u8868\u683C\u5BC6\u5EA6",
2463
+ onClick: () => setDensityOpen((v) => !v),
2464
+ children: /* @__PURE__ */ jsx(ColumnHeightOutlined, {})
2465
+ }
2466
+ ),
2320
2467
  densityOpen ? /* @__PURE__ */ jsx("div", { className: "react-list-table-tool-menu", children: [48, 40, 32].map((height) => /* @__PURE__ */ jsx(
2321
2468
  "button",
2322
2469
  {
@@ -2332,7 +2479,14 @@ function ReactTableToolbar(props) {
2332
2479
  )) }) : null
2333
2480
  ] }) : null,
2334
2481
  config.showColumnSetting !== false ? /* @__PURE__ */ jsxs("div", { className: "react-list-table-tool-wrap", children: [
2335
- /* @__PURE__ */ jsx(ToolButton, { label: "\u5217\u8BBE\u7F6E", onClick: () => setSettingOpen((v) => !v), children: /* @__PURE__ */ jsx(SettingOutlined, {}) }),
2482
+ /* @__PURE__ */ jsx(
2483
+ ToolButton,
2484
+ {
2485
+ label: "\u5217\u8BBE\u7F6E",
2486
+ onClick: () => setSettingOpen((v) => !v),
2487
+ children: /* @__PURE__ */ jsx(SettingOutlined, {})
2488
+ }
2489
+ ),
2336
2490
  settingOpen ? /* @__PURE__ */ jsxs(
2337
2491
  "div",
2338
2492
  {
@@ -2341,6 +2495,7 @@ function ReactTableToolbar(props) {
2341
2495
  children: [
2342
2496
  /* @__PURE__ */ jsxs("div", { className: "react-list-table-column-setting-head", children: [
2343
2497
  /* @__PURE__ */ jsx("strong", { children: "\u5217\u8BBE\u7F6E" }),
2498
+ /* @__PURE__ */ jsx("span", { style: { marginLeft: "auto" }, children: config.columnSettingHeaderExtra }),
2344
2499
  /* @__PURE__ */ jsx("button", { type: "button", onClick: props.onResetColumns, children: "\u91CD\u7F6E" })
2345
2500
  ] }),
2346
2501
  /* @__PURE__ */ jsx("div", { className: "react-list-table-column-setting-body", children: /* @__PURE__ */ jsx(
@@ -2372,6 +2527,7 @@ function ReactTableToolbar(props) {
2372
2527
  {
2373
2528
  type: "checkbox",
2374
2529
  checked: !column.hidden,
2530
+ disabled: column.disableHide,
2375
2531
  onChange: (event) => props.onColumnVisibilityChange(
2376
2532
  column.key,
2377
2533
  event.target.checked
@@ -2395,7 +2551,10 @@ function ReactTableToolbar(props) {
2395
2551
  style: { width: 80, height: 24 },
2396
2552
  onChange: (width) => {
2397
2553
  if (width != null && Number.isFinite(width) && width > 0 && (column.minWidth == null || width >= column.minWidth) && (column.maxWidth == null || width <= column.maxWidth)) {
2398
- props.onColumnWidthChange(column.key, width);
2554
+ props.onColumnWidthChange(
2555
+ column.key,
2556
+ width
2557
+ );
2399
2558
  }
2400
2559
  }
2401
2560
  }
@@ -2434,12 +2593,26 @@ function ReactTableToolbar(props) {
2434
2593
  ] });
2435
2594
  }
2436
2595
  function ToolButton(props) {
2437
- return /* @__PURE__ */ jsx("button", { type: "button", className: "react-list-table-tool", style: { fontSize: props.iconSize ?? 16 }, title: props.label, "aria-label": props.label, onClick: props.onClick, children: props.children });
2596
+ return /* @__PURE__ */ jsx(
2597
+ "button",
2598
+ {
2599
+ type: "button",
2600
+ className: "react-list-table-tool",
2601
+ style: { fontSize: props.iconSize ?? 16 },
2602
+ title: props.label,
2603
+ "aria-label": props.label,
2604
+ onClick: props.onClick,
2605
+ children: props.children
2606
+ }
2607
+ );
2438
2608
  }
2439
2609
  function flattenColumns(columns, parentKey = "root", level = 0) {
2440
2610
  return columns.flatMap((column) => {
2611
+ if (column.hideInSetting) {
2612
+ return [];
2613
+ }
2441
2614
  const key = String(column.key ?? column.dataIndex);
2442
- const label = typeof column.title === "string" ? column.title : key;
2615
+ const label = column.settingTitle ?? (typeof column.title === "string" ? column.title : key);
2443
2616
  const current = {
2444
2617
  key,
2445
2618
  label,
@@ -2450,7 +2623,8 @@ function flattenColumns(columns, parentKey = "root", level = 0) {
2450
2623
  maxWidth: typeof column.maxWidth === "number" ? column.maxWidth : void 0,
2451
2624
  fixed: column.fixed,
2452
2625
  level,
2453
- isGroup: Boolean(column.children?.length)
2626
+ isGroup: Boolean(column.children?.length),
2627
+ disableHide: column.disableHide === true
2454
2628
  };
2455
2629
  return column.children?.length ? [current, ...flattenColumns(column.children, key, level + 1)] : [current];
2456
2630
  });
@@ -2724,8 +2898,8 @@ function ReactListTableInner(props, ref) {
2724
2898
  ref,
2725
2899
  () => ({
2726
2900
  validate: () => tableRef.current?.validate() ?? Promise.resolve([]),
2727
- exportXlsx: () => {
2728
- tableRef.current?.exportXlsx();
2901
+ exportXlsx: (options2) => {
2902
+ tableRef.current?.exportXlsx(options2);
2729
2903
  },
2730
2904
  scrollTo: (options2) => {
2731
2905
  tableRef.current?.scrollTo(options2);
@@ -2762,7 +2936,7 @@ function ReactListTableInner(props, ref) {
2762
2936
  columns: resolvedColumns,
2763
2937
  density: resolvedRowHeight === "auto" ? 40 : resolvedRowHeight ?? 40,
2764
2938
  hostRef: shellRef,
2765
- onExport: () => tableRef.current?.exportXlsx(),
2939
+ onExport: (options2) => tableRef.current?.exportXlsx(options2),
2766
2940
  onDensityChange: setDensityOverride,
2767
2941
  onColumnVisibilityChange: (columnKey, visible) => {
2768
2942
  setColumnVisibility((current) => {
@@ -2880,15 +3054,13 @@ function ReactListTableInner(props, ref) {
2880
3054
  }
2881
3055
  function applyColumnManagerState(columns, visibility, orders, config, parentKey = "root") {
2882
3056
  const order = orders.get(parentKey);
2883
- const sortedColumns = order ? [...columns].sort(
2884
- (left, right) => order.indexOf(resolveColumnKey(left)) - order.indexOf(resolveColumnKey(right))
2885
- ) : columns;
3057
+ const sortedColumns = order ? applyManagedColumnOrder(columns, order) : columns;
2886
3058
  return sortedColumns.map((column) => {
2887
3059
  const key = resolveColumnKey(column);
2888
3060
  const managedConfig = config.get(key);
2889
3061
  return {
2890
3062
  ...column,
2891
- hidden: visibility.has(key) ? visibility.get(key) === false : column.hidden,
3063
+ hidden: visibility.has(key) ? visibility.get(key) === false : column.hidden ?? column.initialHide,
2892
3064
  width: managedConfig?.width ?? column.width,
2893
3065
  minWidth: column.minWidth,
2894
3066
  maxWidth: column.maxWidth,
@@ -2903,6 +3075,24 @@ function applyColumnManagerState(columns, visibility, orders, config, parentKey
2903
3075
  };
2904
3076
  });
2905
3077
  }
3078
+ function applyManagedColumnOrder(columns, orderedKeys) {
3079
+ const managedKeySet = new Set(orderedKeys);
3080
+ const managedSlots = columns.map(
3081
+ (column, index) => managedKeySet.has(resolveColumnKey(column)) ? index : -1
3082
+ ).filter((index) => index >= 0);
3083
+ const columnByKey = new Map(
3084
+ columns.map((column) => [resolveColumnKey(column), column])
3085
+ );
3086
+ const next = [...columns];
3087
+ orderedKeys.forEach((key, index) => {
3088
+ const slot = managedSlots[index];
3089
+ const column = columnByKey.get(key);
3090
+ if (slot != null && column) {
3091
+ next[slot] = column;
3092
+ }
3093
+ });
3094
+ return next;
3095
+ }
2906
3096
  function resolveColumnKey(column) {
2907
3097
  return String(column.key ?? column.dataIndex);
2908
3098
  }