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.
- package/dist/es/applayout/index.css +1 -1
- package/dist/es/applayoutheader/setting/fullCom.js +5 -1
- package/dist/es/applayoutheader/setting/userInfo.js +9 -5
- package/dist/es/applayoutheader/setting/userInfoModal.js +18 -12
- package/dist/es/applayoutheader/setting/userPwdModal.js +19 -13
- package/dist/es/applayoutheader/tabs/index.js +10 -6
- package/dist/es/applayoutsider/menu/Logo.js +5 -1
- package/dist/es/applayoutsider/menu/SearchInput.js +6 -2
- package/dist/es/applayoutsider/menu/SubMenu.js +6 -2
- package/dist/es/asyncdynamicsetting/asyncDynamicDrawer.js +2 -0
- package/dist/es/asyncdynamicsetting/useAsyncDrawer.js +2 -0
- package/dist/es/button/button.js +4 -2
- package/dist/es/button/buttonDownload.js +6 -4
- package/dist/es/button/buttonExport.js +8 -4
- package/dist/es/button/buttonPreview.js +6 -3
- package/dist/es/canvastable/canvasTable.js +46 -29
- package/dist/es/canvastable/components/CanvasTableMenu.js +5 -1
- package/dist/es/canvastable/components/FilterPopover.js +15 -11
- package/dist/es/canvastable/hooks/useProcessedColumns.js +7 -2
- package/dist/es/canvastable/hooks/useSelectionSnapshot.js +115 -0
- package/dist/es/canvastable/hooks/useSummaryRow.js +6 -2
- package/dist/es/canvastable/hooks/useTableRender.js +5 -1
- package/dist/es/canvastable/interface.d.ts +29 -1
- package/dist/es/chatroom/chat-room.js +8 -3
- package/dist/es/config/i18n/en/appLayoutHeader.js +70 -0
- package/dist/es/config/i18n/en/appLayoutSider.js +14 -0
- package/dist/es/config/i18n/en/asyncDynamicSetting.js +42 -0
- package/dist/es/config/i18n/en/authLoading.js +6 -0
- package/dist/es/config/i18n/en/button.js +14 -0
- package/dist/es/config/i18n/en/canvasTable.js +50 -0
- package/dist/es/config/i18n/en/chatRoom.js +14 -0
- package/dist/es/config/i18n/en/datePicker.js +22 -0
- package/dist/es/config/i18n/en/detailList.js +6 -0
- package/dist/es/config/i18n/en/differences.js +6 -0
- package/dist/es/config/i18n/en/dynamicSetting.js +72 -0
- package/dist/es/config/i18n/en/electronSignatures.js +173 -0
- package/dist/es/config/i18n/en/enhanceSelect.js +8 -0
- package/dist/es/config/i18n/en/footer.js +8 -0
- package/dist/es/config/i18n/en/form.js +26 -0
- package/dist/es/config/i18n/en/formItem.js +8 -0
- package/dist/es/config/i18n/en/inputNumber.js +7 -0
- package/dist/es/config/i18n/en/login.js +76 -0
- package/dist/es/config/i18n/en/modal.js +8 -0
- package/dist/es/config/i18n/en/notAuthPage.js +8 -0
- package/dist/es/config/i18n/en/notRoutePage.js +8 -0
- package/dist/es/config/i18n/en/operationBtn.js +10 -0
- package/dist/es/config/i18n/en/print.js +16 -0
- package/dist/es/config/i18n/en/select.js +6 -0
- package/dist/es/config/i18n/en/table.js +65 -0
- package/dist/es/config/i18n/en/tabs.js +10 -0
- package/dist/es/config/i18n/en/translationButton.js +26 -0
- package/dist/es/config/i18n/en/tree.js +6 -0
- package/dist/es/config/i18n/en/uploadList.js +82 -0
- package/dist/es/config/i18n/en/ztTransfer.js +14 -0
- package/dist/es/config/i18n/en.js +65 -1
- package/dist/es/config/i18n/i18nInstance.js +33 -0
- package/dist/es/config/i18n/zh_cn/appLayoutHeader.js +70 -0
- package/dist/es/config/i18n/zh_cn/appLayoutSider.js +14 -0
- package/dist/es/config/i18n/zh_cn/asyncDynamicSetting.js +42 -0
- package/dist/es/config/i18n/zh_cn/authLoading.js +6 -0
- package/dist/es/config/i18n/zh_cn/button.js +14 -0
- package/dist/es/config/i18n/zh_cn/canvasTable.js +50 -0
- package/dist/es/config/i18n/zh_cn/chatRoom.js +14 -0
- package/dist/es/config/i18n/zh_cn/datePicker.js +22 -0
- package/dist/es/config/i18n/zh_cn/detailList.js +6 -0
- package/dist/es/config/i18n/zh_cn/differences.js +6 -0
- package/dist/es/config/i18n/zh_cn/dynamicSetting.js +72 -0
- package/dist/es/config/i18n/zh_cn/electronSignatures.js +342 -0
- package/dist/es/config/i18n/zh_cn/enhanceSelect.js +8 -0
- package/dist/es/config/i18n/zh_cn/footer.js +8 -0
- package/dist/es/config/i18n/zh_cn/form.js +26 -0
- package/dist/es/config/i18n/zh_cn/formItem.js +8 -0
- package/dist/es/config/i18n/zh_cn/inputNumber.js +7 -0
- package/dist/es/config/i18n/zh_cn/login.js +76 -0
- package/dist/es/config/i18n/zh_cn/modal.js +8 -0
- package/dist/es/config/i18n/zh_cn/notAuthPage.js +8 -0
- package/dist/es/config/i18n/zh_cn/notRoutePage.js +8 -0
- package/dist/es/config/i18n/zh_cn/operationBtn.js +10 -0
- package/dist/es/config/i18n/zh_cn/print.js +16 -0
- package/dist/es/config/i18n/zh_cn/select.js +6 -0
- package/dist/es/config/i18n/zh_cn/table.js +65 -0
- package/dist/es/config/i18n/zh_cn/tabs.js +10 -0
- package/dist/es/config/i18n/zh_cn/translationButton.js +26 -0
- package/dist/es/config/i18n/zh_cn/tree.js +6 -0
- package/dist/es/config/i18n/zh_cn/uploadList.js +82 -0
- package/dist/es/config/i18n/zh_cn/ztTransfer.js +14 -0
- package/dist/es/config/i18n/zh_cn.d.ts +538 -0
- package/dist/es/config/i18n/zh_cn.js +65 -1
- package/dist/es/config/index.js +1 -1
- package/dist/es/config/useLocale.d.ts +560 -0
- package/dist/es/config/useLocale.js +41 -8
- package/dist/es/datepicker/index.js +9 -3
- package/dist/es/datepicker/utils.js +32 -26
- package/dist/es/detaillist/item.js +7 -2
- package/dist/es/detaillist/list.js +2 -0
- package/dist/es/differences/differences.js +8 -1
- package/dist/es/dynamicsetting/dynamicDrawer.js +41 -24
- package/dist/es/dynamicsetting/hooks.js +2 -0
- package/dist/es/dynamicsetting/moreConfig.js +6 -2
- package/dist/es/dynamicsetting/useSearch.js +5 -1
- package/dist/es/dynamicsetting/useTemplate.js +19 -15
- package/dist/es/electronsignatures/content.js +52 -31
- package/dist/es/electronsignatures/filecomponents/file-upload.js +2 -0
- package/dist/es/electronsignatures/filecomponents/useFetchFileTypeData.js +2 -0
- package/dist/es/enhanceselect/enhance-select.js +7 -3
- package/dist/es/enhanceselect/list-query.js +2 -0
- package/dist/es/enhanceselect/page-query.js +2 -0
- package/dist/es/form/common-search-list.js +7 -2
- package/dist/es/form/form.js +9 -5
- package/dist/es/form/resetButton.js +16 -11
- package/dist/es/form/useCommonSearch.js +12 -9
- package/dist/es/formitem/formItem.js +4 -2
- package/dist/es/inputnumber/inputNumber.js +11 -2
- package/dist/es/inputnumber/utils.js +41 -8
- package/dist/es/login/forget-password.js +9 -5
- package/dist/es/login/index.js +12 -8
- package/dist/es/modal/modal.js +6 -2
- package/dist/es/operationbtn/operationBtn.js +5 -3
- package/dist/es/select/hooks.js +5 -1
- package/dist/es/table/components/ColumnAddDel.js +11 -5
- package/dist/es/table/components/EnhanceBodyCell.js +7 -5
- package/dist/es/table/components/FilterDropdown.js +7 -3
- package/dist/es/table/components/SortTitle.js +8 -4
- package/dist/es/table/components/TableMenu.js +5 -1
- package/dist/es/table/components/TitleOperation.js +5 -1
- package/dist/es/table/components/table-header-operation/FillDown.js +7 -3
- package/dist/es/table/excel.js +8 -4
- package/dist/es/table/hooks/useSelectSubtotal.js +8 -1
- package/dist/es/table/table.js +6 -4
- package/dist/es/table/useColumns.js +8 -4
- package/dist/es/table/useSummary.js +6 -2
- package/dist/es/table/useTableValidate.js +39 -7
- package/dist/es/table/utils.js +10 -5
- package/dist/es/tabs/tab-type.js +10 -1
- package/dist/es/title/title.js +2 -0
- package/dist/es/translationbutton/DownFile.js +8 -4
- package/dist/es/translationbutton/PreviewFile.js +5 -3
- package/dist/es/translationbutton/hooks.js +5 -1
- package/dist/es/translationbutton/translationButton.js +15 -12
- package/dist/es/tree/tree.js +8 -2
- package/dist/es/uploadlist/hooks.js +17 -11
- package/dist/es/uploadlist/uploadList.js +39 -26
- package/dist/es/uploadlist/uploadListDetail.js +15 -11
- package/dist/es/uploadlist/uploadTable.js +23 -19
- package/dist/es/uploadlist/utils.js +8 -1
- package/dist/es/zttransfer/Container.js +5 -1
- package/dist/es/zttransfer/SelectContainer.js +5 -1
- package/dist/es/zttransfer/zt-transfer.js +5 -1
- package/dist/index.build.d.ts +2 -1
- package/dist/index.dark.css +2 -2
- package/dist/index.default.css +2 -2
- package/dist/index.es.js +1 -0
- 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 '
|
|
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(
|
|
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
|
|
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
|
|
73
|
+
var _w = useDynamicListByColumns(columns, {
|
|
69
74
|
dynamicKey: dynamicKey,
|
|
70
75
|
dynamicVersion: dynamicVersion,
|
|
71
76
|
customDynamicListHandle: customDynamicListHandle,
|
|
72
|
-
}), defaultDynamicList =
|
|
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
|
|
81
|
+
var _x = useState({}), internalColumnWidths = _x[0], setInternalColumnWidths = _x[1];
|
|
77
82
|
// 跟踪用户手动调整过宽度的列(用于排除自动宽度分配)
|
|
78
|
-
var
|
|
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
|
|
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 =
|
|
104
|
+
}), state = _z.state, setState = _z.setState, handleFilterChange = _z.handleFilterChange, closeFilterPopover = _z.closeFilterPopover;
|
|
100
105
|
// 树形展开管理
|
|
101
|
-
var
|
|
106
|
+
var _0 = useExpandable({
|
|
102
107
|
dataSource: dataSource,
|
|
103
108
|
expandable: expandable,
|
|
104
109
|
rowKey: rowKey,
|
|
105
|
-
}), expandedKeys =
|
|
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
|
|
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 =
|
|
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
|
|
131
|
+
var _2 = useSummaryRow({
|
|
127
132
|
columns: processedColumns,
|
|
128
133
|
dataSource: expandedDataSource,
|
|
129
|
-
}), finalDataSource =
|
|
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
|
|
169
|
+
var _3 = useState(undefined), preciseHeaderHeight = _3[0], setPreciseHeaderHeight = _3[1];
|
|
165
170
|
// 用于存储是否需要横向滚动条(用于自动高度的精确计算)
|
|
166
|
-
var
|
|
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
|
|
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 =
|
|
246
|
+
}), maxScrollTop = _5.maxScrollTop, maxScrollLeft = _5.maxScrollLeft;
|
|
242
247
|
// 滚动管理(使用预先计算的maxScrollTop和maxScrollLeft)
|
|
243
|
-
var
|
|
248
|
+
var _6 = useTableScroll({
|
|
244
249
|
containerRef: containerRef,
|
|
245
250
|
maxScrollTop: maxScrollTop,
|
|
246
251
|
maxScrollLeft: maxScrollLeft,
|
|
247
252
|
onScroll: onScroll,
|
|
248
|
-
}), scrollState =
|
|
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
|
|
297
|
+
var _7 = useTableSelection({
|
|
293
298
|
state: state,
|
|
294
299
|
setState: setState,
|
|
295
300
|
}),
|
|
296
301
|
// selectionStartRef,
|
|
297
|
-
startSelection =
|
|
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
|
|
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 =
|
|
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
|
|
365
|
+
var _9 = useCopyToClipboard({
|
|
361
366
|
cellSelection: state.cellSelection,
|
|
362
367
|
processedDataSource: processedDataSource,
|
|
363
368
|
columns: processedColumns,
|
|
364
369
|
containerRef: containerRef,
|
|
365
|
-
}), getSelectedCellsText =
|
|
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
|
|
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 =
|
|
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) ||
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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(
|
|
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 };
|