zmdms-webui 3.5.2 → 3.5.4

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.
Files changed (153) hide show
  1. package/dist/es/applayout/index.css +1 -1
  2. package/dist/es/applayoutheader/setting/fullCom.js +5 -1
  3. package/dist/es/applayoutheader/setting/userInfo.js +9 -5
  4. package/dist/es/applayoutheader/setting/userInfoModal.js +18 -12
  5. package/dist/es/applayoutheader/setting/userPwdModal.js +19 -13
  6. package/dist/es/applayoutheader/tabs/index.js +10 -6
  7. package/dist/es/applayoutsider/menu/Logo.js +5 -1
  8. package/dist/es/applayoutsider/menu/SearchInput.js +6 -2
  9. package/dist/es/applayoutsider/menu/SubMenu.js +6 -2
  10. package/dist/es/asyncdynamicsetting/asyncDynamicDrawer.js +2 -0
  11. package/dist/es/asyncdynamicsetting/useAsyncDrawer.js +2 -0
  12. package/dist/es/button/button.js +4 -2
  13. package/dist/es/button/buttonDownload.js +6 -4
  14. package/dist/es/button/buttonExport.js +8 -4
  15. package/dist/es/button/buttonPreview.js +6 -3
  16. package/dist/es/canvastable/canvasTable.js +46 -29
  17. package/dist/es/canvastable/components/CanvasTableMenu.js +5 -1
  18. package/dist/es/canvastable/components/FilterPopover.js +15 -11
  19. package/dist/es/canvastable/hooks/useProcessedColumns.js +7 -2
  20. package/dist/es/canvastable/hooks/useSelectionSnapshot.js +115 -0
  21. package/dist/es/canvastable/hooks/useSummaryRow.js +6 -2
  22. package/dist/es/canvastable/hooks/useTableRender.js +5 -1
  23. package/dist/es/canvastable/interface.d.ts +29 -1
  24. package/dist/es/chatroom/chat-room.js +8 -3
  25. package/dist/es/config/i18n/en/appLayoutHeader.js +70 -0
  26. package/dist/es/config/i18n/en/appLayoutSider.js +14 -0
  27. package/dist/es/config/i18n/en/asyncDynamicSetting.js +42 -0
  28. package/dist/es/config/i18n/en/authLoading.js +6 -0
  29. package/dist/es/config/i18n/en/button.js +14 -0
  30. package/dist/es/config/i18n/en/canvasTable.js +50 -0
  31. package/dist/es/config/i18n/en/chatRoom.js +14 -0
  32. package/dist/es/config/i18n/en/datePicker.js +22 -0
  33. package/dist/es/config/i18n/en/detailList.js +6 -0
  34. package/dist/es/config/i18n/en/differences.js +6 -0
  35. package/dist/es/config/i18n/en/dynamicSetting.js +72 -0
  36. package/dist/es/config/i18n/en/electronSignatures.js +173 -0
  37. package/dist/es/config/i18n/en/enhanceSelect.js +8 -0
  38. package/dist/es/config/i18n/en/footer.js +8 -0
  39. package/dist/es/config/i18n/en/form.js +26 -0
  40. package/dist/es/config/i18n/en/formItem.js +8 -0
  41. package/dist/es/config/i18n/en/inputNumber.js +7 -0
  42. package/dist/es/config/i18n/en/login.js +76 -0
  43. package/dist/es/config/i18n/en/modal.js +8 -0
  44. package/dist/es/config/i18n/en/notAuthPage.js +8 -0
  45. package/dist/es/config/i18n/en/notRoutePage.js +8 -0
  46. package/dist/es/config/i18n/en/operationBtn.js +10 -0
  47. package/dist/es/config/i18n/en/print.js +16 -0
  48. package/dist/es/config/i18n/en/select.js +6 -0
  49. package/dist/es/config/i18n/en/table.js +65 -0
  50. package/dist/es/config/i18n/en/tabs.js +10 -0
  51. package/dist/es/config/i18n/en/translationButton.js +26 -0
  52. package/dist/es/config/i18n/en/tree.js +6 -0
  53. package/dist/es/config/i18n/en/uploadList.js +82 -0
  54. package/dist/es/config/i18n/en/ztTransfer.js +14 -0
  55. package/dist/es/config/i18n/en.js +65 -1
  56. package/dist/es/config/i18n/i18nInstance.js +33 -0
  57. package/dist/es/config/i18n/zh_cn/appLayoutHeader.js +70 -0
  58. package/dist/es/config/i18n/zh_cn/appLayoutSider.js +14 -0
  59. package/dist/es/config/i18n/zh_cn/asyncDynamicSetting.js +42 -0
  60. package/dist/es/config/i18n/zh_cn/authLoading.js +6 -0
  61. package/dist/es/config/i18n/zh_cn/button.js +14 -0
  62. package/dist/es/config/i18n/zh_cn/canvasTable.js +50 -0
  63. package/dist/es/config/i18n/zh_cn/chatRoom.js +14 -0
  64. package/dist/es/config/i18n/zh_cn/datePicker.js +22 -0
  65. package/dist/es/config/i18n/zh_cn/detailList.js +6 -0
  66. package/dist/es/config/i18n/zh_cn/differences.js +6 -0
  67. package/dist/es/config/i18n/zh_cn/dynamicSetting.js +72 -0
  68. package/dist/es/config/i18n/zh_cn/electronSignatures.js +342 -0
  69. package/dist/es/config/i18n/zh_cn/enhanceSelect.js +8 -0
  70. package/dist/es/config/i18n/zh_cn/footer.js +8 -0
  71. package/dist/es/config/i18n/zh_cn/form.js +26 -0
  72. package/dist/es/config/i18n/zh_cn/formItem.js +8 -0
  73. package/dist/es/config/i18n/zh_cn/inputNumber.js +7 -0
  74. package/dist/es/config/i18n/zh_cn/login.js +76 -0
  75. package/dist/es/config/i18n/zh_cn/modal.js +8 -0
  76. package/dist/es/config/i18n/zh_cn/notAuthPage.js +8 -0
  77. package/dist/es/config/i18n/zh_cn/notRoutePage.js +8 -0
  78. package/dist/es/config/i18n/zh_cn/operationBtn.js +10 -0
  79. package/dist/es/config/i18n/zh_cn/print.js +16 -0
  80. package/dist/es/config/i18n/zh_cn/select.js +6 -0
  81. package/dist/es/config/i18n/zh_cn/table.js +65 -0
  82. package/dist/es/config/i18n/zh_cn/tabs.js +10 -0
  83. package/dist/es/config/i18n/zh_cn/translationButton.js +26 -0
  84. package/dist/es/config/i18n/zh_cn/tree.js +6 -0
  85. package/dist/es/config/i18n/zh_cn/uploadList.js +82 -0
  86. package/dist/es/config/i18n/zh_cn/ztTransfer.js +14 -0
  87. package/dist/es/config/i18n/zh_cn.d.ts +538 -0
  88. package/dist/es/config/i18n/zh_cn.js +65 -1
  89. package/dist/es/config/index.js +1 -1
  90. package/dist/es/config/useLocale.d.ts +560 -0
  91. package/dist/es/config/useLocale.js +41 -8
  92. package/dist/es/datepicker/index.js +9 -3
  93. package/dist/es/datepicker/utils.js +32 -26
  94. package/dist/es/detaillist/item.js +7 -2
  95. package/dist/es/detaillist/list.js +2 -0
  96. package/dist/es/differences/differences.js +8 -1
  97. package/dist/es/dynamicsetting/dynamicDrawer.js +41 -24
  98. package/dist/es/dynamicsetting/hooks.js +2 -0
  99. package/dist/es/dynamicsetting/moreConfig.js +6 -2
  100. package/dist/es/dynamicsetting/useSearch.js +5 -1
  101. package/dist/es/dynamicsetting/useTemplate.js +19 -15
  102. package/dist/es/electronsignatures/content.js +52 -31
  103. package/dist/es/electronsignatures/filecomponents/file-upload.js +2 -0
  104. package/dist/es/electronsignatures/filecomponents/useFetchFileTypeData.js +2 -0
  105. package/dist/es/enhanceselect/enhance-select.js +7 -3
  106. package/dist/es/enhanceselect/list-query.js +2 -0
  107. package/dist/es/enhanceselect/page-query.js +2 -0
  108. package/dist/es/form/common-search-list.js +7 -2
  109. package/dist/es/form/form.js +9 -5
  110. package/dist/es/form/resetButton.js +16 -11
  111. package/dist/es/form/useCommonSearch.js +12 -9
  112. package/dist/es/formitem/formItem.js +4 -2
  113. package/dist/es/inputnumber/inputNumber.js +11 -2
  114. package/dist/es/inputnumber/utils.js +41 -8
  115. package/dist/es/login/forget-password.js +9 -5
  116. package/dist/es/login/index.js +12 -8
  117. package/dist/es/modal/modal.js +6 -2
  118. package/dist/es/operationbtn/operationBtn.js +5 -3
  119. package/dist/es/select/hooks.js +5 -1
  120. package/dist/es/table/components/ColumnAddDel.js +11 -5
  121. package/dist/es/table/components/EnhanceBodyCell.js +7 -5
  122. package/dist/es/table/components/FilterDropdown.js +7 -3
  123. package/dist/es/table/components/SortTitle.js +8 -4
  124. package/dist/es/table/components/TableMenu.js +5 -1
  125. package/dist/es/table/components/TitleOperation.js +5 -1
  126. package/dist/es/table/components/table-header-operation/FillDown.js +7 -3
  127. package/dist/es/table/excel.js +8 -4
  128. package/dist/es/table/hooks/useSelectSubtotal.js +8 -1
  129. package/dist/es/table/table.js +6 -4
  130. package/dist/es/table/useColumns.js +8 -4
  131. package/dist/es/table/useSummary.js +6 -2
  132. package/dist/es/table/useTableValidate.js +39 -7
  133. package/dist/es/table/utils.js +10 -5
  134. package/dist/es/tabs/tab-type.js +10 -1
  135. package/dist/es/title/title.js +2 -0
  136. package/dist/es/translationbutton/DownFile.js +8 -4
  137. package/dist/es/translationbutton/PreviewFile.js +5 -3
  138. package/dist/es/translationbutton/hooks.js +5 -1
  139. package/dist/es/translationbutton/translationButton.js +15 -12
  140. package/dist/es/tree/tree.js +8 -2
  141. package/dist/es/uploadlist/hooks.js +17 -11
  142. package/dist/es/uploadlist/uploadList.js +39 -26
  143. package/dist/es/uploadlist/uploadListDetail.js +15 -11
  144. package/dist/es/uploadlist/uploadTable.js +23 -19
  145. package/dist/es/uploadlist/utils.js +8 -1
  146. package/dist/es/zttransfer/Container.js +5 -1
  147. package/dist/es/zttransfer/SelectContainer.js +5 -1
  148. package/dist/es/zttransfer/zt-transfer.js +5 -1
  149. package/dist/index.build.d.ts +2 -1
  150. package/dist/index.dark.css +2 -2
  151. package/dist/index.default.css +2 -2
  152. package/dist/index.es.js +1 -0
  153. package/package.json +6 -3
@@ -2,9 +2,9 @@ import { __rest, __assign, __awaiter, __generator } from '../_virtual/_tslib.js'
2
2
  import { jsx } from 'react/jsx-runtime';
3
3
  import ButtonCom from './button.js';
4
4
  import { formatUnit, previewFile } from 'zmdms-utils';
5
- import 'react';
6
- import '../config/ZtxkContext.js';
5
+ import useLocale, { formatLocaleText } from '../config/useLocale.js';
7
6
  import useBaseContext from '../config/useBaseContext.js';
7
+ import '../config/ZtxkContext.js';
8
8
  import '../config/MyStorage.js';
9
9
  import { MAX_PREVIEW_SIZE } from '../config/constant.js';
10
10
  import myMessage from '../message/index.js';
@@ -12,11 +12,14 @@ import myMessage from '../message/index.js';
12
12
  var ButtonPreview = function (props) {
13
13
  var attachId = props.attachId, attachName = props.attachName, attachSize = props.attachSize, attachList = props.attachList; props.isPublic; var FILE_BASEURL = props.FILE_BASEURL; props.onClick; var resetProps = __rest(props, ["attachId", "attachName", "attachSize", "attachList", "isPublic", "FILE_BASEURL", "onClick"]);
14
14
  var fileBaseUrl = useBaseContext().fileBaseUrl;
15
+ var locale = useLocale().Button;
15
16
  var onClickHandle = function (e) { return __awaiter(void 0, void 0, void 0, function () {
16
17
  return __generator(this, function (_a) {
17
18
  if (attachId) {
18
19
  if (attachSize && attachSize > MAX_PREVIEW_SIZE) {
19
- myMessage.info("\u6587\u4EF6\u5927\u4E8E".concat(formatUnit(MAX_PREVIEW_SIZE), ",\u6682\u4E0D\u652F\u6301\u5728\u7EBF\u9884\u89C8\uFF0C\u8BF7\u5148\u4E0B\u8F7D\u540E\u67E5\u770B"));
20
+ myMessage.info(formatLocaleText(locale.previewSizeLimit, {
21
+ size: formatUnit(MAX_PREVIEW_SIZE),
22
+ }));
20
23
  }
21
24
  else {
22
25
  previewFile(attachId, attachName, {
@@ -39,10 +39,15 @@ import { useExcelExport } from '../table/excel.js';
39
39
  import { getTableColumns } from '../table/utils.js';
40
40
  import DynamicSetting from '../dynamicsetting/dynamicSetting.js';
41
41
  import '../dynamicsetting/useTemplate.js';
42
+ import { useSelectionSnapshot } from './hooks/useSelectionSnapshot.js';
43
+ import useLocale from '../config/useLocale.js';
44
+ import '../config/ZtxkContext.js';
45
+ import '../config/MyStorage.js';
42
46
 
43
47
  function CanvasTable(props) {
44
48
  var _a;
45
- var _b = props.dataSource, dataSource = _b === void 0 ? [] : _b, _c = props.columns, columns = _c === void 0 ? [] : _c, _d = props.rowKey, rowKey = _d === void 0 ? "id" : _d, _e = props.height, height = _e === void 0 ? 600 : _e, width = props.width, _f = props.rowHeight, rowHeight = _f === void 0 ? 36 : _f, _g = props.headerHeight, headerHeight = _g === void 0 ? 36 : _g, rowSelection = props.rowSelection, onSortChange = props.onSortChange, onFilterChange = props.onFilterChange, onScroll = props.onScroll, onRowClick = props.onRowClick, onColumnResize = props.onColumnResize, _h = props.bordered, bordered = _h === void 0 ? true : _h, _j = props.striped, striped = _j === void 0 ? false : _j, _k = props.emptyText, emptyText = _k === void 0 ? "暂无数据" : _k, style = props.style, className = props.className, _l = props.loading, loading = _l === void 0 ? false : _l, _m = props.isContextMenu, isContextMenu = _m === void 0 ? true : _m, isFullscreenHandle = props.isFullscreenHandle, mode = props.mode, dynamicKey = props.dynamicKey, dynamicVersion = props.dynamicVersion, customDynamicListHandle = props.customDynamicListHandle, isDimensionDynamic = props.isDimensionDynamic, _o = props.isDimensionMergeChildren, isDimensionMergeChildren = _o === void 0 ? true : _o, dimensionCustomSumKeys = props.dimensionCustomSumKeys, isAutoMerge = props.isAutoMerge, _p = props.isIndexMerge, isIndexMerge = _p === void 0 ? true : _p, _q = props.isSelectionMerge, isSelectionMerge = _q === void 0 ? false : _q, _r = props.renderMode, renderMode = _r === void 0 ? "object" : _r, fixedRowsCount = props.fixedRowsCount, fixedRowsConfig = props.fixedRowsConfig, _s = props.summaryFixed, summaryFixed = _s === void 0 ? false : _s, _t = props.isAutoScrollY, isAutoScrollY = _t === void 0 ? false : _t, _u = props.autoScrollYMarginBottom, autoScrollYMarginBottom = _u === void 0 ? 65 : _u, canvasTableId = props.canvasTableId, headerWrap = props.headerWrap, _v = props.headerAlign, headerAlign = _v === void 0 ? "center" : _v, tableRefHandle = props.tableRefHandle, exportExcelConfig = props.exportExcelConfig, _w = props.maxHeight, maxHeight = _w === void 0 ? 3000 : _w, expandable = props.expandable;
49
+ var locale = useLocale().CanvasTable;
50
+ var _b = props.dataSource, dataSource = _b === void 0 ? [] : _b, _c = props.columns, columns = _c === void 0 ? [] : _c, _d = props.rowKey, rowKey = _d === void 0 ? "id" : _d, _e = props.height, height = _e === void 0 ? 600 : _e, width = props.width, _f = props.rowHeight, rowHeight = _f === void 0 ? 36 : _f, _g = props.headerHeight, headerHeight = _g === void 0 ? 36 : _g, rowSelection = props.rowSelection, onSortChange = props.onSortChange, onFilterChange = props.onFilterChange, onScroll = props.onScroll, onRowClick = props.onRowClick, onColumnResize = props.onColumnResize, _h = props.bordered, bordered = _h === void 0 ? true : _h, _j = props.striped, striped = _j === void 0 ? false : _j, emptyText = props.emptyText, style = props.style, className = props.className, _k = props.loading, loading = _k === void 0 ? false : _k, _l = props.isContextMenu, isContextMenu = _l === void 0 ? true : _l, isFullscreenHandle = props.isFullscreenHandle, mode = props.mode, dynamicKey = props.dynamicKey, dynamicVersion = props.dynamicVersion, customDynamicListHandle = props.customDynamicListHandle, isDimensionDynamic = props.isDimensionDynamic, _m = props.isDimensionMergeChildren, isDimensionMergeChildren = _m === void 0 ? true : _m, dimensionCustomSumKeys = props.dimensionCustomSumKeys, isAutoMerge = props.isAutoMerge, _o = props.isIndexMerge, isIndexMerge = _o === void 0 ? true : _o, _p = props.isSelectionMerge, isSelectionMerge = _p === void 0 ? false : _p, _q = props.renderMode, renderMode = _q === void 0 ? "object" : _q, fixedRowsCount = props.fixedRowsCount, fixedRowsConfig = props.fixedRowsConfig, _r = props.summaryFixed, summaryFixed = _r === void 0 ? false : _r, _s = props.isAutoScrollY, isAutoScrollY = _s === void 0 ? false : _s, _t = props.autoScrollYMarginBottom, autoScrollYMarginBottom = _t === void 0 ? 65 : _t, canvasTableId = props.canvasTableId, headerWrap = props.headerWrap, _u = props.headerAlign, headerAlign = _u === void 0 ? "center" : _u, tableRefHandle = props.tableRefHandle, exportExcelConfig = props.exportExcelConfig, _v = props.maxHeight, maxHeight = _v === void 0 ? 3000 : _v, expandable = props.expandable;
46
51
  var actualMode = "mode" in props ? mode : "index";
47
52
  var canvasRef = useRef(null);
48
53
  var containerRef = useRef(null);
@@ -65,17 +70,17 @@ function CanvasTable(props) {
65
70
  return String((_a = record[rowKey]) !== null && _a !== void 0 ? _a : index);
66
71
  }, [rowKey]);
67
72
  // 动态列配置
68
- var _x = useDynamicListByColumns(columns, {
73
+ var _w = useDynamicListByColumns(columns, {
69
74
  dynamicKey: dynamicKey,
70
75
  dynamicVersion: dynamicVersion,
71
76
  customDynamicListHandle: customDynamicListHandle,
72
- }), defaultDynamicList = _x.defaultDynamicList, currentDynamicList = _x.currentDynamicList, onCurrentListChange = _x.onCurrentListChange, dynamicSettingRef = _x.dynamicSettingRef;
77
+ }), defaultDynamicList = _w.defaultDynamicList, currentDynamicList = _w.currentDynamicList, onCurrentListChange = _w.onCurrentListChange, dynamicSettingRef = _w.dynamicSettingRef;
73
78
  // 根据动态列配置处理columns
74
79
  var dynamicColumns = useMemo(function () { return getTableColumns(columns, currentDynamicList); }, [columns, currentDynamicList]).columns;
75
80
  // 内部列宽状态(未开启动态配置时使用)
76
- var _y = useState({}), internalColumnWidths = _y[0], setInternalColumnWidths = _y[1];
81
+ var _x = useState({}), internalColumnWidths = _x[0], setInternalColumnWidths = _x[1];
77
82
  // 跟踪用户手动调整过宽度的列(用于排除自动宽度分配)
78
- var _z = useState(new Set()), manuallyResizedColumnKeys = _z[0], setManuallyResizedColumnKeys = _z[1];
83
+ var _y = useState(new Set()), manuallyResizedColumnKeys = _y[0], setManuallyResizedColumnKeys = _y[1];
79
84
  // 处理选中框列、序号列等
80
85
  var processedColumnsOld = useProcessedColumns({
81
86
  columns: columns,
@@ -90,31 +95,31 @@ function CanvasTable(props) {
90
95
  headerAlign: headerAlign,
91
96
  });
92
97
  // 表格状态管理
93
- var _0 = useTableState({
98
+ var _z = useTableState({
94
99
  dataSource: dataSource,
95
100
  columns: processedColumnsOld,
96
101
  rowSelection: rowSelection,
97
102
  onFilterChange: onFilterChange,
98
103
  isAutoMerge: isAutoMerge,
99
- }), state = _0.state, setState = _0.setState, handleFilterChange = _0.handleFilterChange, closeFilterPopover = _0.closeFilterPopover;
104
+ }), state = _z.state, setState = _z.setState, handleFilterChange = _z.handleFilterChange, closeFilterPopover = _z.closeFilterPopover;
100
105
  // 树形展开管理
101
- var _1 = useExpandable({
106
+ var _0 = useExpandable({
102
107
  dataSource: dataSource,
103
108
  expandable: expandable,
104
109
  rowKey: rowKey,
105
- }), expandedKeys = _1.expandedKeys, flattenedData = _1.flattenedData, toggleExpand = _1.toggleExpand, expandRow = _1.expandRow, collapseRow = _1.collapseRow, setExpandedRowKeys = _1.setExpandedRowKeys, hasExpandable = _1.hasExpandable;
110
+ }), expandedKeys = _0.expandedKeys, flattenedData = _0.flattenedData, toggleExpand = _0.toggleExpand, expandRow = _0.expandRow, collapseRow = _0.collapseRow, setExpandedRowKeys = _0.setExpandedRowKeys, hasExpandable = _0.hasExpandable;
106
111
  var order = useMemo(function () {
107
112
  return state.sortOrder && state.sortField
108
113
  ? { field: state.sortField, order: state.sortOrder }
109
114
  : undefined;
110
115
  }, [state.sortOrder, state.sortField]);
111
- var _2 = useAutoMerge(dataSource, processedColumnsOld, {
116
+ var _1 = useAutoMerge(dataSource, processedColumnsOld, {
112
117
  isAutoMerge: isAutoMerge,
113
118
  isDimensionDynamic: isDimensionDynamic,
114
119
  isDimensionMergeChildren: isDimensionMergeChildren,
115
120
  order: order,
116
121
  dimensionCustomSumKeys: dimensionCustomSumKeys,
117
- }), newDataSource = _2[0], processedColumns = _2[1];
122
+ }), newDataSource = _1[0], processedColumns = _1[1];
118
123
  // 如果开启了树形展开,使用扁平化后的数据源
119
124
  var expandedDataSource = useMemo(function () {
120
125
  if (hasExpandable) {
@@ -123,10 +128,10 @@ function CanvasTable(props) {
123
128
  return newDataSource;
124
129
  }, [hasExpandable, flattenedData, newDataSource]);
125
130
  // 生成合计行和最终数据源(基于全量数据,合计值不随筛选变化)
126
- var _3 = useSummaryRow({
131
+ var _2 = useSummaryRow({
127
132
  columns: processedColumns,
128
133
  dataSource: expandedDataSource,
129
- }), finalDataSource = _3.finalDataSource, hasSummaryRowConfig = _3.hasSummaryRow;
134
+ }), finalDataSource = _2.finalDataSource, hasSummaryRowConfig = _2.hasSummaryRow;
130
135
  // 基于含合计行的全量数据筛选
131
136
  // 末尾合计行(总计)始终保留在最后,不参与筛选
132
137
  var processedDataSource = useMemo(function () {
@@ -161,9 +166,9 @@ function CanvasTable(props) {
161
166
  // 基于含合计行的全量数据源生成筛选候选值
162
167
  var autoGeneratedFilters = useMemo(function () { return generateAutoFilters(finalDataSource, processedColumns); }, [finalDataSource, processedColumns]);
163
168
  // 用于存储计算后的表头高度(用于自动高度的精确计算)
164
- var _4 = useState(undefined), preciseHeaderHeight = _4[0], setPreciseHeaderHeight = _4[1];
169
+ var _3 = useState(undefined), preciseHeaderHeight = _3[0], setPreciseHeaderHeight = _3[1];
165
170
  // 用于存储是否需要横向滚动条(用于自动高度的精确计算)
166
- var _5 = useState(false), needHorizontalScrollbar = _5[0], setNeedHorizontalScrollbar = _5[1];
171
+ var _4 = useState(false), needHorizontalScrollbar = _4[0], setNeedHorizontalScrollbar = _4[1];
167
172
  // 自动高度计算(需要在容器尺寸计算之前)
168
173
  var autoHeight = useCanvasTableAutoHeight(isAutoScrollY, autoScrollYMarginBottom, canvasTableId, processedDataSource.length, // 数据行数(用于 content 模式)
169
174
  headerHeight, // 表头基础高度(用于 content 模式的初始计算)
@@ -230,7 +235,7 @@ function CanvasTable(props) {
230
235
  return calculateTotalHeight(calculatedHeaderHeight, processedDataSource.length, rowHeight);
231
236
  }, [calculatedHeaderHeight, processedDataSource.length, rowHeight]);
232
237
  // 计算滚动条指标
233
- var _6 = useScrollbarMetrics({
238
+ var _5 = useScrollbarMetrics({
234
239
  containerWidth: containerWidth,
235
240
  containerHeight: containerHeight,
236
241
  totalWidth: totalWidth,
@@ -238,14 +243,14 @@ function CanvasTable(props) {
238
243
  headerHeight: calculatedHeaderHeight,
239
244
  scrollTop: 0,
240
245
  scrollLeft: 0,
241
- }), maxScrollTop = _6.maxScrollTop, maxScrollLeft = _6.maxScrollLeft;
246
+ }), maxScrollTop = _5.maxScrollTop, maxScrollLeft = _5.maxScrollLeft;
242
247
  // 滚动管理(使用预先计算的maxScrollTop和maxScrollLeft)
243
- var _7 = useTableScroll({
248
+ var _6 = useTableScroll({
244
249
  containerRef: containerRef,
245
250
  maxScrollTop: maxScrollTop,
246
251
  maxScrollLeft: maxScrollLeft,
247
252
  onScroll: onScroll,
248
- }), scrollState = _7.scrollState, setScrollState = _7.setScrollState;
253
+ }), scrollState = _6.scrollState, setScrollState = _6.setScrollState;
249
254
  // 使用 ref 保存最新的滚动位置,确保在组件卸载过程中仍能访问
250
255
  var scrollPositionRef = useRef({ x: 0, y: 0 });
251
256
  useEffect(function () {
@@ -289,12 +294,12 @@ function CanvasTable(props) {
289
294
  needHorizontalScrollbar,
290
295
  ]);
291
296
  // 单元格框选
292
- var _8 = useTableSelection({
297
+ var _7 = useTableSelection({
293
298
  state: state,
294
299
  setState: setState,
295
300
  }),
296
301
  // selectionStartRef,
297
- startSelection = _8.startSelection, updateSelection = _8.updateSelection, extendSelection = _8.extendSelection;
302
+ startSelection = _7.startSelection, updateSelection = _7.updateSelection, extendSelection = _7.extendSelection;
298
303
  // 处理列宽调整
299
304
  var handleColumnResize = useCallback(function (columnKey, newWidth) {
300
305
  var _a;
@@ -349,20 +354,32 @@ function CanvasTable(props) {
349
354
  onCurrentListChange,
350
355
  ]);
351
356
  // 列宽调整
352
- var _9 = useColumnResize({
357
+ var _8 = useColumnResize({
353
358
  columnRenderInfos: columnRenderInfos,
354
359
  containerWidth: containerWidth,
355
360
  headerHeight: calculatedHeaderHeight,
356
361
  scrollLeft: scrollState.scrollLeft,
357
362
  onColumnResize: handleColumnResize,
358
- }), resizeState = _9.resizeState, checkResizeHandle = _9.checkResizeHandle, startResize = _9.startResize, updateResize = _9.updateResize, endResize = _9.endResize, setHoverResizeColumn = _9.setHoverResizeColumn, getColumnWidth = _9.getColumnWidth, RESIZE_HANDLE_WIDTH = _9.RESIZE_HANDLE_WIDTH;
363
+ }), resizeState = _8.resizeState, checkResizeHandle = _8.checkResizeHandle, startResize = _8.startResize, updateResize = _8.updateResize, endResize = _8.endResize, setHoverResizeColumn = _8.setHoverResizeColumn, getColumnWidth = _8.getColumnWidth, RESIZE_HANDLE_WIDTH = _8.RESIZE_HANDLE_WIDTH;
359
364
  // 复制到剪贴板
360
- var _10 = useCopyToClipboard({
365
+ var _9 = useCopyToClipboard({
361
366
  cellSelection: state.cellSelection,
362
367
  processedDataSource: processedDataSource,
363
368
  columns: processedColumns,
364
369
  containerRef: containerRef,
365
- }), getSelectedCellsText = _10.getSelectedCellsText, copyToClipboard = _10.copyToClipboard;
370
+ }), getSelectedCellsText = _9.getSelectedCellsText, copyToClipboard = _9.copyToClipboard;
371
+ useSelectionSnapshot({
372
+ selection: state.cellSelection,
373
+ selecting: state.isSelecting,
374
+ columns: processedColumns,
375
+ rows: processedDataSource,
376
+ scrollLeft: scrollState.scrollLeft,
377
+ scrollTop: scrollState.scrollTop,
378
+ containerRef: containerRef,
379
+ getText: getSelectedCellsText,
380
+ headerHeight: calculatedHeaderHeight,
381
+ onChange: props.onCellSelectionChange,
382
+ });
366
383
  // 处理右键菜单的复制操作
367
384
  var handleCopy = useCallback(function () {
368
385
  var text = getSelectedCellsText();
@@ -382,7 +399,7 @@ function CanvasTable(props) {
382
399
  childrenColumnName: (_a = props.expandable) === null || _a === void 0 ? void 0 : _a.childrenColumnName,
383
400
  });
384
401
  // 交互事件处理(使用baseScrollbarMetrics的maxScrollTop/maxScrollLeft以保持稳定)
385
- var _11 = useTableInteraction({
402
+ var _10 = useTableInteraction({
386
403
  state: state,
387
404
  setState: setState,
388
405
  scrollState: scrollState,
@@ -432,7 +449,7 @@ function CanvasTable(props) {
432
449
  fixedRowsCount: fixedRowsCount,
433
450
  fixedRowsConfig: fixedRowsConfig,
434
451
  summaryFixed: summaryFixed,
435
- }), handleCanvasMouseDown = _11.handleCanvasMouseDown, handleCanvasMouseMove = _11.handleCanvasMouseMove, handleCanvasMouseUp = _11.handleCanvasMouseUp, handleCanvasMouseLeave = _11.handleCanvasMouseLeave, handleCanvasContextMenu = _11.handleCanvasContextMenu;
452
+ }), handleCanvasMouseDown = _10.handleCanvasMouseDown, handleCanvasMouseMove = _10.handleCanvasMouseMove, handleCanvasMouseUp = _10.handleCanvasMouseUp, handleCanvasMouseLeave = _10.handleCanvasMouseLeave, handleCanvasContextMenu = _10.handleCanvasContextMenu;
436
453
  // 渲染表格
437
454
  useTableRender(__assign(__assign({ canvasRef: canvasRef, processedDataSource: processedDataSource, columnRenderInfos: columnRenderInfos, columns: processedColumns, // 传递原始columns用于渲染多级表头
438
455
  state: state, scrollState: scrollState, rowSelection: rowSelection, containerWidth: containerWidth, containerHeight: containerHeight, headerHeight: calculatedHeaderHeight, baseHeaderHeight: headerHeight, // 传入原始基础高度用于计算每层高度
@@ -603,8 +620,8 @@ function CanvasTable(props) {
603
620
  WebkitFontSmoothing: "antialiased",
604
621
  MozOsxFontSmoothing: "grayscale",
605
622
  textRendering: "optimizeLegibility",
606
- } }), dynamicKey ? (jsx(DynamicSetting, { parentDynamicKey: TABLE_DYNAMIC_KEY, dynamicKey: dynamicKey, defaultList: defaultDynamicList, onCurrentListChange: onCurrentListChange, ref: dynamicSettingRef, hiddenOperationIcon: true, isMore: true, isFixed: true, isDimensionDynamic: isDimensionDynamic })) : null, jsx(EmptyPlaceholder, { visible: processedDataSource.length === 0, text: emptyText, headerHeight: calculatedHeaderHeight }), jsx(HeaderOverlay, { overlays: headerOverlays }), jsx(CellOverlay, { overlays: cellOverlays }), filterPopoverElement, jsx(Tooltip, { visible: state.tooltip.visible, content: state.tooltip.content, position: state.tooltip.position }), jsx(BadgePopover, { visible: state.badgePopover.visible, content: state.badgePopover.content, position: state.badgePopover.position, popoverRef: badgePopoverRef }), menuId ? (jsx(CanvasTableMenu, { menuId: menuId, containerRef: containerRef, isFullscreenHandle: isFullscreenHandle, tableMenuRef: tableMenuRef, onCopy: handleCopy, onExport: function () {
607
- return exportExcel((exportExcelConfig === null || exportExcelConfig === void 0 ? void 0 : exportExcelConfig.fileName) || "表格数据.xlsx", exportExcelConfig);
623
+ } }), dynamicKey ? (jsx(DynamicSetting, { parentDynamicKey: TABLE_DYNAMIC_KEY, dynamicKey: dynamicKey, defaultList: defaultDynamicList, onCurrentListChange: onCurrentListChange, ref: dynamicSettingRef, hiddenOperationIcon: true, isMore: true, isFixed: true, isDimensionDynamic: isDimensionDynamic })) : null, jsx(EmptyPlaceholder, { visible: processedDataSource.length === 0, text: emptyText || locale.emptyText, headerHeight: calculatedHeaderHeight }), jsx(HeaderOverlay, { overlays: headerOverlays }), jsx(CellOverlay, { overlays: cellOverlays }), filterPopoverElement, jsx(Tooltip, { visible: state.tooltip.visible, content: state.tooltip.content, position: state.tooltip.position }), jsx(BadgePopover, { visible: state.badgePopover.visible, content: state.badgePopover.content, position: state.badgePopover.position, popoverRef: badgePopoverRef }), menuId ? (jsx(CanvasTableMenu, { menuId: menuId, containerRef: containerRef, isFullscreenHandle: isFullscreenHandle, tableMenuRef: tableMenuRef, onCopy: handleCopy, onExport: function () {
624
+ return exportExcel((exportExcelConfig === null || exportExcelConfig === void 0 ? void 0 : exportExcelConfig.fileName) || locale.exportFileName, exportExcelConfig);
608
625
  } })) : null] })) })));
609
626
  }
610
627
 
@@ -4,9 +4,13 @@ import { useState, useEffect, useImperativeHandle } from 'react';
4
4
  import { Menu as it, Item as pt } from '../../node_modules/react-contexify/dist/index.js';
5
5
  import screenfull from '../../node_modules/screenfull/index.js';
6
6
  import { useLatest } from 'ahooks';
7
+ import useLocale from '../../config/useLocale.js';
8
+ import '../../config/ZtxkContext.js';
9
+ import '../../config/MyStorage.js';
7
10
 
8
11
  var CanvasTableMenu = function (_a) {
9
12
  var menuId = _a.menuId, containerRef = _a.containerRef, isFullscreenHandle = _a.isFullscreenHandle, tableMenuRef = _a.tableMenuRef, onCopy = _a.onCopy, onExport = _a.onExport;
13
+ var locale = useLocale().CanvasTable;
10
14
  var _b = useState(false), isFull = _b[0], setIsFull = _b[1];
11
15
  var isFullscreenHandleRef = useLatest(isFullscreenHandle);
12
16
  function toggleFullscreen() {
@@ -67,7 +71,7 @@ var CanvasTableMenu = function (_a) {
67
71
  useImperativeHandle(tableMenuRef, function () { return ({
68
72
  toggleFullscreen: toggleFullscreen,
69
73
  }); });
70
- return (jsxs(Fragment, { children: [jsxs(it, __assign({ id: menuId, className: "canvas-table-menu" }, { children: [jsx(pt, __assign({ data: "copy", onClick: onMenuItemClick }, { children: "\u590D\u5236" })), onExport ? (jsx(pt, __assign({ data: "export", onClick: onMenuItemClick }, { children: "\u5BFC\u51FAExcel" }))) : null, jsx(pt, __assign({ data: "fullscreen", onClick: onMenuItemClick }, { children: isFull ? "退出全屏" : "全屏" }))] })), isFull ? (jsx("div", __assign({ className: "canvas-table--exit-fullscreen", onClick: toggleFullscreen }, { children: "\u9000\u51FA\u5168\u5C4F" }))) : null] }));
74
+ return (jsxs(Fragment, { children: [jsxs(it, __assign({ id: menuId, className: "canvas-table-menu" }, { children: [jsx(pt, __assign({ data: "copy", onClick: onMenuItemClick }, { children: locale.copy })), onExport ? (jsx(pt, __assign({ data: "export", onClick: onMenuItemClick }, { children: locale.exportExcel }))) : null, jsx(pt, __assign({ data: "fullscreen", onClick: onMenuItemClick }, { children: isFull ? locale.exitFullscreen : locale.fullscreen }))] })), isFull ? (jsx("div", __assign({ className: "canvas-table--exit-fullscreen", onClick: toggleFullscreen }, { children: locale.exitFullscreen }))) : null] }));
71
75
  };
72
76
 
73
77
  export { CanvasTableMenu as default };
@@ -2,10 +2,14 @@ import { __assign, __spreadArray } from '../../_virtual/_tslib.js';
2
2
  import { jsxs, jsx } from 'react/jsx-runtime';
3
3
  import { useState, useEffect, useMemo } from 'react';
4
4
  import { Select, Tabs, Space, Input, Button, Checkbox } from 'antd';
5
+ import useLocale, { formatLocaleText } from '../../config/useLocale.js';
6
+ import '../../config/ZtxkContext.js';
7
+ import '../../config/MyStorage.js';
5
8
 
6
9
  var Option = Select.Option;
7
10
  var FilterPopover = function (_a) {
8
11
  var visible = _a.visible; _a.columnKey; _a.columnTitle; var _b = _a.dataType, dataType = _b === void 0 ? "text" : _b, precision = _a.precision, thousand = _a.thousand, position = _a.position, filterOptions = _a.filterOptions, selectedValues = _a.selectedValues, onConfirm = _a.onConfirm, onReset = _a.onReset, onClose = _a.onClose, popoverRef = _a.popoverRef;
12
+ var locale = useLocale().CanvasTable;
9
13
  // 临时选中值(点击确认才生效)
10
14
  var _c = useState([]), tempSelectedValues = _c[0], setTempSelectedValues = _c[1];
11
15
  // 搜索关键词
@@ -217,27 +221,27 @@ var FilterPopover = function (_a) {
217
221
  } }, { children: [jsx(Tabs, { activeKey: activeTab, onChange: setActiveTab, size: "small", items: [
218
222
  {
219
223
  key: "single",
220
- label: "单值",
221
- children: (jsx("div", { children: jsxs(Space.Compact, __assign({ style: { width: "100%", marginBottom: "12px" } }, { children: [jsxs(Select, __assign({ value: numberOperator, onChange: setNumberOperator, style: { width: "80px" } }, { children: [jsx(Option, __assign({ value: "=" }, { children: "=" })), jsx(Option, __assign({ value: "!=" }, { children: "!=" })), jsx(Option, __assign({ value: ">" }, { children: ">" })), jsx(Option, __assign({ value: "<" }, { children: "<" })), jsx(Option, __assign({ value: ">=" }, { children: ">=" })), jsx(Option, __assign({ value: "<=" }, { children: "<=" }))] })), jsx(Input, { type: "number", placeholder: "\u8F93\u5165\u6570\u503C", value: numberValue, onChange: function (e) { return setNumberValue(e.target.value); }, onPressEnter: handleNumberFilter, style: { flex: 1 } })] })) })),
224
+ label: locale.filterSingle,
225
+ children: (jsx("div", { children: jsxs(Space.Compact, __assign({ style: { width: "100%", marginBottom: "12px" } }, { children: [jsxs(Select, __assign({ value: numberOperator, onChange: setNumberOperator, style: { width: "80px" } }, { children: [jsx(Option, __assign({ value: "=" }, { children: "=" })), jsx(Option, __assign({ value: "!=" }, { children: "!=" })), jsx(Option, __assign({ value: ">" }, { children: ">" })), jsx(Option, __assign({ value: "<" }, { children: "<" })), jsx(Option, __assign({ value: ">=" }, { children: ">=" })), jsx(Option, __assign({ value: "<=" }, { children: "<=" }))] })), jsx(Input, { type: "number", placeholder: locale.filterNumberPlaceholder, value: numberValue, onChange: function (e) { return setNumberValue(e.target.value); }, onPressEnter: handleNumberFilter, style: { flex: 1 } })] })) })),
222
226
  },
223
227
  {
224
228
  key: "range",
225
- label: "区间",
229
+ label: locale.filterRange,
226
230
  children: (jsxs("div", { children: [jsxs("div", __assign({ style: { marginBottom: "8px" } }, { children: [jsx("div", __assign({ style: {
227
231
  fontSize: "12px",
228
232
  color: "#666",
229
233
  marginBottom: "4px",
230
- } }, { children: "\u6700\u5C0F\u503C\uFF1A" })), jsxs(Space.Compact, __assign({ style: { width: "100%" } }, { children: [jsxs(Select, __assign({ value: minOperator, onChange: setMinOperator, style: { width: "70px" } }, { children: [jsx(Option, __assign({ value: ">=" }, { children: ">=" })), jsx(Option, __assign({ value: ">" }, { children: ">" }))] })), jsx(Input, { type: "number", placeholder: "\u6700\u5C0F\u503C", value: minValue, onChange: function (e) { return setMinValue(e.target.value); }, onPressEnter: handleNumberFilter, style: { flex: 1 } })] }))] })), jsxs("div", __assign({ style: { marginBottom: "12px" } }, { children: [jsx("div", __assign({ style: {
234
+ } }, { children: locale.filterMinLabel })), jsxs(Space.Compact, __assign({ style: { width: "100%" } }, { children: [jsxs(Select, __assign({ value: minOperator, onChange: setMinOperator, style: { width: "70px" } }, { children: [jsx(Option, __assign({ value: ">=" }, { children: ">=" })), jsx(Option, __assign({ value: ">" }, { children: ">" }))] })), jsx(Input, { type: "number", placeholder: locale.filterMinPlaceholder, value: minValue, onChange: function (e) { return setMinValue(e.target.value); }, onPressEnter: handleNumberFilter, style: { flex: 1 } })] }))] })), jsxs("div", __assign({ style: { marginBottom: "12px" } }, { children: [jsx("div", __assign({ style: {
231
235
  fontSize: "12px",
232
236
  color: "#666",
233
237
  marginBottom: "4px",
234
- } }, { children: "\u6700\u5927\u503C\uFF1A" })), jsxs(Space.Compact, __assign({ style: { width: "100%" } }, { children: [jsxs(Select, __assign({ value: maxOperator, onChange: setMaxOperator, style: { width: "70px" } }, { children: [jsx(Option, __assign({ value: "<=" }, { children: "<=" })), jsx(Option, __assign({ value: "<" }, { children: "<" }))] })), jsx(Input, { type: "number", placeholder: "\u6700\u5927\u503C", value: maxValue, onChange: function (e) { return setMaxValue(e.target.value); }, onPressEnter: handleNumberFilter, style: { flex: 1 } })] }))] })), jsx("div", __assign({ style: { fontSize: "12px", color: "#1890ff" } }, { children: "\u793A\u4F8B\uFF1A\u8BBE\u7F6E >=10 \u548C <=20 \u8868\u793A 10-20 \u4E4B\u95F4" }))] })),
238
+ } }, { children: locale.filterMaxLabel })), jsxs(Space.Compact, __assign({ style: { width: "100%" } }, { children: [jsxs(Select, __assign({ value: maxOperator, onChange: setMaxOperator, style: { width: "70px" } }, { children: [jsx(Option, __assign({ value: "<=" }, { children: "<=" })), jsx(Option, __assign({ value: "<" }, { children: "<" }))] })), jsx(Input, { type: "number", placeholder: locale.filterMaxPlaceholder, value: maxValue, onChange: function (e) { return setMaxValue(e.target.value); }, onPressEnter: handleNumberFilter, style: { flex: 1 } })] }))] })), jsx("div", __assign({ style: { fontSize: "12px", color: "#1890ff" } }, { children: locale.filterRangeExample }))] })),
235
239
  },
236
240
  ] }), jsx("div", __assign({ style: {
237
241
  borderTop: "1px solid #f0f0f0",
238
242
  paddingTop: "12px",
239
243
  marginTop: "12px",
240
- } }, { children: jsxs(Space, { children: [jsx(Button, __assign({ size: "small", type: "primary", onClick: handleNumberFilter, disabled: !numberValue && !minValue && !maxValue }, { children: "\u786E\u5B9A" })), jsx(Button, __assign({ size: "small", onClick: handleResetAndClose }, { children: "\u91CD\u7F6E" }))] }) }))] })));
244
+ } }, { children: jsxs(Space, { children: [jsx(Button, __assign({ size: "small", type: "primary", onClick: handleNumberFilter, disabled: !numberValue && !minValue && !maxValue }, { children: locale.filterOk })), jsx(Button, __assign({ size: "small", onClick: handleResetAndClose }, { children: locale.filterReset }))] }) }))] })));
241
245
  }
242
246
  // 文本类型的筛选界面
243
247
  return (jsxs("div", __assign({ ref: popoverRef, className: "canvas-table-filter-popover", style: {
@@ -251,24 +255,24 @@ var FilterPopover = function (_a) {
251
255
  padding: "8px",
252
256
  minWidth: "200px",
253
257
  maxWidth: "300px",
254
- } }, { children: [jsxs("div", __assign({ style: { padding: "4px 8px", marginBottom: "8px" } }, { children: [jsx(Input, { placeholder: "\u8F93\u5165\u5173\u952E\u8BCD\u6A21\u7CCA\u67E5\u8BE2", value: searchText, onChange: function (e) { return setSearchText(e.target.value); }, allowClear: true, size: "small", onPressEnter: handleConfirm }), searchText && (jsxs("div", __assign({ style: {
258
+ } }, { children: [jsxs("div", __assign({ style: { padding: "4px 8px", marginBottom: "8px" } }, { children: [jsx(Input, { placeholder: locale.filterSearchPlaceholder, value: searchText, onChange: function (e) { return setSearchText(e.target.value); }, allowClear: true, size: "small", onPressEnter: handleConfirm }), searchText && (jsx("div", __assign({ style: {
255
259
  fontSize: "12px",
256
260
  color: "#1890ff",
257
261
  marginTop: "4px",
258
262
  padding: "0 4px",
259
- } }, { children: ["\u6309\u56DE\u8F66\u6216\u70B9\u51FB\u786E\u5B9A\u4EE5\u6A21\u7CCA\u67E5\u8BE2\"", searchText, "\""] })))] })), jsx("div", __assign({ style: {
263
+ } }, { children: formatLocaleText(locale.filterFuzzyTip, { text: searchText }) })))] })), jsx("div", __assign({ style: {
260
264
  padding: "5px 12px",
261
265
  borderBottom: "1px solid #f0f0f0",
262
266
  marginBottom: "4px",
263
- } }, { children: jsx(Checkbox, __assign({ indeterminate: isIndeterminate, checked: isAllSelected, onChange: handleSelectAll }, { children: "\u5168\u9009" })) })), jsx("div", __assign({ style: { maxHeight: "300px", overflowY: "auto" } }, { children: filteredOptions.length > 0 ? (filteredOptions.map(function (filter) { return (jsx("div", __assign({ style: { padding: "5px 12px", cursor: "pointer" }, onClick: function () { return handleCheckboxChange(filter.value); } }, { children: jsx(Checkbox, __assign({ checked: tempSelectedValues.includes(filter.value) }, { children: filter.text })) }), filter.value)); })) : (jsx("div", __assign({ style: {
267
+ } }, { children: jsx(Checkbox, __assign({ indeterminate: isIndeterminate, checked: isAllSelected, onChange: handleSelectAll }, { children: locale.filterSelectAll })) })), jsx("div", __assign({ style: { maxHeight: "300px", overflowY: "auto" } }, { children: filteredOptions.length > 0 ? (filteredOptions.map(function (filter) { return (jsx("div", __assign({ style: { padding: "5px 12px", cursor: "pointer" }, onClick: function () { return handleCheckboxChange(filter.value); } }, { children: jsx(Checkbox, __assign({ checked: tempSelectedValues.includes(filter.value) }, { children: filter.text })) }), filter.value)); })) : (jsx("div", __assign({ style: {
264
268
  padding: "20px",
265
269
  textAlign: "center",
266
270
  color: "#999",
267
- } }, { children: "\u6682\u65E0\u5339\u914D\u9879" }))) })), jsx("div", __assign({ style: {
271
+ } }, { children: locale.filterNoMatch }))) })), jsx("div", __assign({ style: {
268
272
  borderTop: "1px solid #f0f0f0",
269
273
  marginTop: "8px",
270
274
  paddingTop: "8px",
271
- } }, { children: jsxs(Space, { children: [jsx(Button, __assign({ size: "small", type: "primary", onClick: handleConfirm }, { children: "\u786E\u5B9A" })), jsx(Button, __assign({ size: "small", onClick: handleResetAndClose }, { children: "\u91CD\u7F6E" }))] }) }))] })));
275
+ } }, { children: jsxs(Space, { children: [jsx(Button, __assign({ size: "small", type: "primary", onClick: handleConfirm }, { children: locale.filterOk })), jsx(Button, __assign({ size: "small", onClick: handleResetAndClose }, { children: locale.filterReset }))] }) }))] })));
272
276
  };
273
277
 
274
278
  export { FilterPopover as default };
@@ -9,6 +9,9 @@ import { MERGE_INDEX } from '../../table/constant.js';
9
9
  import 'lodash/isEqual';
10
10
  import 'ahooks';
11
11
  import '../../node_modules/immutability-helper/index.js';
12
+ import useLocale from '../../config/useLocale.js';
13
+ import '../../config/ZtxkContext.js';
14
+ import '../../config/MyStorage.js';
12
15
  import '../../node_modules/exceljs/dist/exceljs.min.js';
13
16
  import '../components/FilterPopover.js';
14
17
  import '../../node_modules/react-contexify/dist/index.js';
@@ -16,19 +19,20 @@ import '../../node_modules/screenfull/index.js';
16
19
  import ColumnDynamic from '../components/ColumnDynamic.js';
17
20
 
18
21
  var useProcessedColumns = function (params) {
22
+ var locale = useLocale().CanvasTable;
19
23
  var columns = params.columns, dynamicColumns = params.dynamicColumns, mode = params.mode, rowSelection = params.rowSelection, internalColumnWidths = params.internalColumnWidths, dynamicKey = params.dynamicKey, _a = params.renderMode, renderMode = _a === void 0 ? "object" : _a, dynamicSettingRef = params.dynamicSettingRef, headerWrap = params.headerWrap, _b = params.headerAlign, headerAlign = _b === void 0 ? "center" : _b;
20
24
  return useMemo(function () {
21
25
  var cols = __spreadArray([], (dynamicColumns || columns), true);
22
26
  // 添加序号列
23
27
  if (mode === "index") {
24
- var title = "序号";
28
+ var title = locale.serialNumber;
25
29
  if (dynamicKey && dynamicSettingRef) {
26
30
  title = jsx(ColumnDynamic, { dynamicSettingRef: dynamicSettingRef });
27
31
  }
28
32
  cols.unshift({
29
33
  key: "__index__",
30
34
  title: title,
31
- dynamicTitle: "序号",
35
+ dynamicTitle: locale.serialNumber,
32
36
  width: 60,
33
37
  fixed: "left",
34
38
  align: "center",
@@ -100,6 +104,7 @@ var useProcessedColumns = function (params) {
100
104
  dynamicSettingRef,
101
105
  headerWrap,
102
106
  headerAlign,
107
+ locale,
103
108
  ]);
104
109
  };
105
110
 
@@ -0,0 +1,115 @@
1
+ import { __assign, __spreadArray } from '../../_virtual/_tslib.js';
2
+ import { useRef, useEffect } from 'react';
3
+ import { flattenHeaders } from '../utils/multiHeaderHelpers.js';
4
+
5
+ /** 按显示顺序收集叶子列标题和明确配置的单位,保留多级表头路径。 */
6
+ function selectionColumns(columns, parents, parentUnit) {
7
+ if (parents === void 0) { parents = []; }
8
+ return columns.flatMap(function (column) {
9
+ var _a, _b, _c, _d, _e, _f;
10
+ var title = (_c = (_b = (_a = column.aiContext) === null || _a === void 0 ? void 0 : _a.columnTitle) !== null && _b !== void 0 ? _b : column.dynamicTitle) !== null && _c !== void 0 ? _c : (typeof column.title === "string" ? column.title : column.key);
11
+ var path = __spreadArray(__spreadArray([], parents, true), [title], false);
12
+ var unit = (_e = (_d = column.aiContext) === null || _d === void 0 ? void 0 : _d.displayUnit) !== null && _e !== void 0 ? _e : parentUnit;
13
+ return ((_f = column.children) === null || _f === void 0 ? void 0 : _f.length)
14
+ ? selectionColumns(column.children, path, unit)
15
+ : [
16
+ {
17
+ key: column.key,
18
+ fieldKey: column.dataIndex,
19
+ columnTitle: path.join(" / "),
20
+ displayUnit: unit || undefined,
21
+ },
22
+ ];
23
+ });
24
+ }
25
+ /** 框选完成才发布快照;数据、列、滚动变化清除旧快照,避免旧位置指向新记录。 */
26
+ function useSelectionSnapshot(options) {
27
+ var selection = options.selection, selecting = options.selecting, columns = options.columns, rows = options.rows, scrollLeft = options.scrollLeft, scrollTop = options.scrollTop, headerHeight = options.headerHeight, containerRef = options.containerRef, getText = options.getText, onChange = options.onChange;
28
+ var point = useRef({ x: 0, y: 0 });
29
+ var previous = useRef({ selection: selection, selecting: selecting });
30
+ var callback = useRef(onChange);
31
+ callback.current = onChange;
32
+ var enabled = !!onChange;
33
+ useEffect(function () {
34
+ if (!enabled)
35
+ return;
36
+ /** 在 Canvas mouseup 状态提交前记录最终鼠标坐标。 */
37
+ var rememberPoint = function (event) {
38
+ point.current = { x: event.clientX, y: event.clientY };
39
+ };
40
+ document.addEventListener("pointerup", rememberPoint, true);
41
+ return function () { return document.removeEventListener("pointerup", rememberPoint, true); };
42
+ }, [enabled]);
43
+ useEffect(function () {
44
+ var _a, _b, _c, _d, _e, _f;
45
+ var old = previous.current;
46
+ previous.current = { selection: selection, selecting: selecting };
47
+ if (!callback.current)
48
+ return;
49
+ if (!selection ||
50
+ selecting ||
51
+ (!old.selecting && selection === old.selection) ||
52
+ !containerRef.current) {
53
+ callback.current(null);
54
+ return;
55
+ }
56
+ var count = (Math.abs(selection.endRow - selection.startRow) + 1) *
57
+ (Math.abs(selection.endCol - selection.startCol) + 1);
58
+ // ponytail: 最多同步读取 200 格;更大范围分析应使用分页数据接口。
59
+ if (count > 200) {
60
+ callback.current(null);
61
+ return;
62
+ }
63
+ var metadata = selectionColumns(columns)
64
+ .slice(Math.min(selection.startCol, selection.endCol), Math.max(selection.startCol, selection.endCol) + 1)
65
+ .filter(function (column) {
66
+ return column.key !== "__selection__" && column.key !== "__index__";
67
+ });
68
+ var text = getText();
69
+ // 单击分组表头时解释实际表头,不能把所在叶子列误当成点击目标。
70
+ if (selection.startRow === -1 &&
71
+ selection.endRow === -1 &&
72
+ selection.startCol === selection.endCol) {
73
+ var headers = flattenHeaders(columns);
74
+ var y = point.current.y - containerRef.current.getBoundingClientRect().top;
75
+ var depth = Math.min(headers.length - 1, Math.max(0, Math.floor(y / (headerHeight / headers.length))));
76
+ var header = (_a = headers[depth]) === null || _a === void 0 ? void 0 : _a.find(function (cell) {
77
+ return selection.startCol >= cell.colIndex &&
78
+ selection.startCol < cell.colIndex + cell.colSpan;
79
+ });
80
+ if ((_b = header === null || header === void 0 ? void 0 : header.column.children) === null || _b === void 0 ? void 0 : _b.length) {
81
+ var column = header.column;
82
+ text =
83
+ (_e = (_d = (_c = column.aiContext) === null || _c === void 0 ? void 0 : _c.columnTitle) !== null && _d !== void 0 ? _d : column.dynamicTitle) !== null && _e !== void 0 ? _e : (typeof column.title === "string" ? column.title : column.key);
84
+ metadata.splice(0, metadata.length, {
85
+ key: column.key,
86
+ fieldKey: column.dataIndex,
87
+ columnTitle: text,
88
+ displayUnit: (_f = column.aiContext) === null || _f === void 0 ? void 0 : _f.displayUnit,
89
+ });
90
+ }
91
+ }
92
+ if (!text.trim()) {
93
+ callback.current(null);
94
+ return;
95
+ }
96
+ callback.current({
97
+ range: __assign({}, selection),
98
+ columns: metadata,
99
+ text: text,
100
+ anchor: __assign({}, point.current),
101
+ });
102
+ }, [
103
+ selection,
104
+ selecting,
105
+ columns,
106
+ rows,
107
+ scrollLeft,
108
+ scrollTop,
109
+ headerHeight,
110
+ containerRef,
111
+ getText,
112
+ ]);
113
+ }
114
+
115
+ export { useSelectionSnapshot };
@@ -5,6 +5,9 @@ import 'lodash/isEqual';
5
5
  import 'ahooks';
6
6
  import '../../node_modules/immutability-helper/index.js';
7
7
  import 'react/jsx-runtime';
8
+ import useLocale from '../../config/useLocale.js';
9
+ import '../../config/ZtxkContext.js';
10
+ import '../../config/MyStorage.js';
8
11
  import { plus, exactRound, addThousedSeparator } from 'zmdms-utils';
9
12
  import '../../node_modules/exceljs/dist/exceljs.min.js';
10
13
  import 'dayjs';
@@ -15,6 +18,7 @@ import { getAllLeafColumns } from '../utils/columnHelpers.js';
15
18
  */
16
19
  var useSummaryRow = function (params) {
17
20
  var columns = params.columns, dataSource = params.dataSource;
21
+ var locale = useLocale().CanvasTable;
18
22
  var summaryRow = useMemo(function () {
19
23
  // 先扁平化多级表头,获取所有叶子列
20
24
  var leafColumns = getAllLeafColumns(columns);
@@ -65,7 +69,7 @@ var useSummaryRow = function (params) {
65
69
  }
66
70
  else if (colIndex === firstColIndex) {
67
71
  // 第一列显示"合计"(可以是序号列、选择框列或数据列)
68
- summaryRecord[dataIndex] = "合计";
72
+ summaryRecord[dataIndex] = locale.total;
69
73
  }
70
74
  else {
71
75
  summaryRecord[dataIndex] = "";
@@ -79,7 +83,7 @@ var useSummaryRow = function (params) {
79
83
  });
80
84
  summaryRecord[IS_SUMMARY] = true;
81
85
  return summaryRecord;
82
- }, [columns, dataSource]);
86
+ }, [columns, dataSource, locale]);
83
87
  // 包含合计行的数据源
84
88
  var finalDataSource = useMemo(function () {
85
89
  if (summaryRow) {
@@ -4,6 +4,9 @@ import 'zmdms-utils';
4
4
  import 'dayjs';
5
5
  import '../../_virtual/_tslib.js';
6
6
  import { useMemoizedFn } from 'ahooks';
7
+ import useLocale from '../../config/useLocale.js';
8
+ import '../../config/ZtxkContext.js';
9
+ import '../../config/MyStorage.js';
7
10
  import './renderers/BadgeRenderer.js';
8
11
  import './renderers/ExpandIconRenderer.js';
9
12
  import { HeaderRenderer } from './renderers/HeaderRenderer.js';
@@ -19,6 +22,7 @@ import { FixedColumnRenderer } from './renderers/FixedColumnRenderer.js';
19
22
  * 重构版本:使用渲染器模式,职责分离
20
23
  */
21
24
  var useTableRender = function (params) {
25
+ var locale = useLocale().CanvasTable;
22
26
  // 添加节流机制,避免频繁重绘
23
27
  var rafIdRef = useRef(null);
24
28
  var isDrawingRef = useRef(false);
@@ -273,7 +277,7 @@ var useTableRender = function (params) {
273
277
  ctx.fillStyle = "#ff4d4f";
274
278
  ctx.font = "14px Arial";
275
279
  ctx.textAlign = "center";
276
- ctx.fillText("表格渲染异常,请检查数据或刷新页面", canvas.width / 2, canvas.height / 2);
280
+ ctx.fillText(locale.renderError, canvas.width / 2, canvas.height / 2);
277
281
  }
278
282
  }
279
283
  }
@@ -7,6 +7,11 @@ interface FilterConfig {
7
7
  }
8
8
  type ColumnDataType = "text" | "number" | "date" | "boolean";
9
9
  interface ICanvasColumnType<RecordType = any> {
10
+ /** 选区的展示标题和单位;子列继承父列单位,空字符串取消继承。 */
11
+ aiContext?: {
12
+ columnTitle?: string;
13
+ displayUnit?: string;
14
+ };
10
15
  /**
11
16
  * 列的key,唯一标识
12
17
  */
@@ -479,6 +484,8 @@ interface ICanvasTableProps<RecordType = any> {
479
484
  * 表格id(用于自动高度计算时定位元素)
480
485
  */
481
486
  canvasTableId?: string;
487
+ /** 框选结束发布展示快照,开始框选、数据或滚动变化传 null 使旧快照失效。 */
488
+ onCellSelectionChange?: (selection: ICanvasCellSelection | null) => void;
482
489
  /**
483
490
  * 表格ref句柄,用于暴露表格的一些方法
484
491
  */
@@ -590,6 +597,27 @@ interface ICanvasTableRefHandle {
590
597
  * 清除过滤
591
598
  */
592
599
  clearFilter: () => void;
600
+ }
601
+ /** 完成选区的展示快照,不暴露完整记录;超过 200 格不生成快照。 */
602
+ interface ICanvasCellSelection {
603
+ range: ICellSelection;
604
+ columns: {
605
+ fieldKey?: string;
606
+ columnTitle: string;
607
+ displayUnit?: string;
608
+ }[];
609
+ text: string;
610
+ /** 屏幕坐标,用于定位选区操作入口。 */
611
+ anchor: {
612
+ x: number;
613
+ y: number;
614
+ };
615
+ }
616
+ interface ICellSelection {
617
+ startRow: number;
618
+ endRow: number;
619
+ startCol: number;
620
+ endCol: number;
593
621
  }
594
622
 
595
- export { ColumnDataType, FilterConfig, IBadgeProps, ICanvasColumnType, ICanvasColumnsType, ICanvasRowSelection, ICanvasTableProps, ICanvasTableRefHandle, IExpandable, SortOrder };
623
+ export { ColumnDataType, FilterConfig, IBadgeProps, ICanvasCellSelection, ICanvasColumnType, ICanvasColumnsType, ICanvasRowSelection, ICanvasTableProps, ICanvasTableRefHandle, ICellSelection, IExpandable, SortOrder };