zmdms-webui 2.6.1 → 2.6.3

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.
@@ -228,6 +228,52 @@ interface ICanvasRowSelection<RecordType = any> {
228
228
  */
229
229
  fixed?: boolean;
230
230
  }
231
+ interface IExpandable<RecordType = any> {
232
+ /**
233
+ * 展开的keys集合
234
+ */
235
+ expandedRowKeys?: React__default.Key[];
236
+ /**
237
+ * 默认展开的keys集合
238
+ */
239
+ defaultExpandedRowKeys?: React__default.Key[];
240
+ /**
241
+ * 展开状态改变时的回调
242
+ */
243
+ onExpandedRowsChange?: (expandedKeys: React__default.Key[], row: RecordType, action: 'expand' | 'collapse') => void;
244
+ /**
245
+ * 是否默认展开所有行
246
+ */
247
+ defaultExpandAllRows?: boolean;
248
+ /**
249
+ * 展开图标的列索引(默认0,第一列)
250
+ */
251
+ expandIconColumnIndex?: number;
252
+ /**
253
+ * 自定义展开图标
254
+ */
255
+ expandIcon?: (params: {
256
+ expanded: boolean;
257
+ record: RecordType;
258
+ onExpand: (record: RecordType, expanded: boolean) => void;
259
+ }) => React__default.ReactNode;
260
+ /**
261
+ * 展开行的自定义渲染
262
+ */
263
+ expandedRowRender?: (params: {
264
+ record: RecordType;
265
+ index: number;
266
+ expanded: boolean;
267
+ }) => React__default.ReactNode;
268
+ /**
269
+ * 展开行的类名
270
+ */
271
+ expandedRowClassName?: (record: RecordType, index: number) => string;
272
+ /**
273
+ * 子节点数据的字段名(默认为'children')
274
+ */
275
+ childrenColumnName?: string;
276
+ }
231
277
  interface ICanvasTableProps<RecordType = any> {
232
278
  /**
233
279
  * 数据源
@@ -273,6 +319,10 @@ interface ICanvasTableProps<RecordType = any> {
273
319
  * 勾选配置
274
320
  */
275
321
  rowSelection?: ICanvasRowSelection<RecordType>;
322
+ /**
323
+ * 树形展开配置
324
+ */
325
+ expandable?: IExpandable<RecordType>;
276
326
  /**
277
327
  * 排序改变回调
278
328
  */
@@ -473,6 +523,26 @@ interface ICanvasTableRefHandle {
473
523
  * 设置选中的行keys
474
524
  */
475
525
  setSelectedRowKeys: (keys: React__default.Key[]) => void;
526
+ /**
527
+ * 获取展开的keys
528
+ */
529
+ getExpandedRowKeys: () => React__default.Key[];
530
+ /**
531
+ * 设置展开的keys
532
+ */
533
+ setExpandedRowKeys: (keys: React__default.Key[]) => void;
534
+ /**
535
+ * 展开指定行
536
+ */
537
+ expandRow: (key: React__default.Key) => void;
538
+ /**
539
+ * 收起指定行
540
+ */
541
+ collapseRow: (key: React__default.Key) => void;
542
+ /**
543
+ * 切换指定行展开状态
544
+ */
545
+ toggleExpandRow: (key: React__default.Key) => void;
476
546
  /**
477
547
  * 滚动到指定位置
478
548
  */
@@ -511,4 +581,4 @@ interface ICanvasTableRefHandle {
511
581
  clearFilter: () => void;
512
582
  }
513
583
 
514
- export { ColumnDataType, FilterConfig, IBadgeProps, ICanvasColumnType, ICanvasColumnsType, ICanvasRowSelection, ICanvasTableProps, ICanvasTableRefHandle, SortOrder };
584
+ export { ColumnDataType, FilterConfig, IBadgeProps, ICanvasColumnType, ICanvasColumnsType, ICanvasRowSelection, ICanvasTableProps, ICanvasTableRefHandle, IExpandable, SortOrder };
@@ -0,0 +1,118 @@
1
+ import { TEXT_PADDING, COLORS } from './constants.js';
2
+
3
+ /**
4
+ * 渲染辅助工具函数
5
+ * 提供通用的渲染计算和绘制功能
6
+ */
7
+ /**
8
+ * 计算文本X坐标(根据对齐方式)
9
+ */
10
+ var calculateTextX = function (drawX, actualWidth, align, padding) {
11
+ if (align === void 0) { align = "left"; }
12
+ if (padding === void 0) { padding = TEXT_PADDING; }
13
+ if (align === "center") {
14
+ return drawX + actualWidth / 2;
15
+ }
16
+ else if (align === "right") {
17
+ return drawX + actualWidth - padding;
18
+ }
19
+ return drawX + padding;
20
+ };
21
+ /**
22
+ * 设置Canvas文本对齐方式
23
+ */
24
+ var setTextAlign = function (ctx, align) {
25
+ if (align === void 0) { align = "left"; }
26
+ ctx.textAlign = align;
27
+ };
28
+ /**
29
+ * 计算固定列的右边界
30
+ */
31
+ var calculateFixedColumnsRightEdge = function (columnRenderInfos, getColumnWidth) {
32
+ var rightEdge = 0;
33
+ columnRenderInfos.forEach(function (info, index) {
34
+ if (info.fixed) {
35
+ var actualWidth = getColumnWidth ? getColumnWidth(index) : info.width;
36
+ rightEdge = Math.max(rightEdge, info.fixedLeft + actualWidth);
37
+ }
38
+ });
39
+ return rightEdge;
40
+ };
41
+ /**
42
+ * 判断是否应该在Canvas中渲染
43
+ * 检查render函数的返回值类型
44
+ */
45
+ var shouldRenderInCanvas = function (renderFn, cellValue, record, rowIndex, isSummaryRow) {
46
+ if (isSummaryRow === void 0) { isSummaryRow = false; }
47
+ // 合计行不应用 render 函数
48
+ if (isSummaryRow) {
49
+ return true;
50
+ }
51
+ // 如果没有 render 函数,在 Canvas 中渲染
52
+ if (!renderFn) {
53
+ return true;
54
+ }
55
+ var rendered = renderFn(cellValue, record, rowIndex);
56
+ // 如果返回的是字符串或数字,在 Canvas 中渲染
57
+ if (typeof rendered === "string" ||
58
+ typeof rendered === "number" ||
59
+ rendered === null ||
60
+ rendered === undefined) {
61
+ return true;
62
+ }
63
+ // 否则是自定义组件,应该在覆盖层渲染
64
+ return false;
65
+ };
66
+ var setupCellClip = function (params) {
67
+ var ctx = params.ctx, drawX = params.drawX, y = params.y, width = params.width, cellHeight = params.cellHeight, headerHeight = params.headerHeight, effectiveHeight = params.effectiveHeight, _a = params.fixedColumnsRightEdge, fixedColumnsRightEdge = _a === void 0 ? 0 : _a, isFixed = params.isFixed;
68
+ // 裁剪区域:确保不覆盖表头,从 headerHeight 开始
69
+ var clipY = Math.max(y, headerHeight);
70
+ // 计算单元格实际底部位置,并限制在可视区域内
71
+ var cellBottom = Math.min(y + cellHeight, effectiveHeight);
72
+ // 裁剪高度 = 单元格可见底部 - 裁剪起始位置
73
+ var clipHeight = Math.max(0, cellBottom - clipY);
74
+ // 对于非fixed列,还需要裁剪掉被fixed列遮挡的部分
75
+ var clipX = drawX;
76
+ var clipWidth = width;
77
+ if (!isFixed && fixedColumnsRightEdge > 0 && drawX < fixedColumnsRightEdge) {
78
+ // 调整裁剪区域,去掉被fixed列遮挡的部分
79
+ var overlap = fixedColumnsRightEdge - drawX;
80
+ if (overlap < width) {
81
+ clipX = fixedColumnsRightEdge;
82
+ clipWidth = width - overlap;
83
+ }
84
+ }
85
+ ctx.beginPath();
86
+ ctx.rect(clipX, clipY, clipWidth, clipHeight);
87
+ ctx.clip();
88
+ return { clipX: clipX, clipY: clipY, clipWidth: clipWidth, clipHeight: clipHeight };
89
+ };
90
+ var drawCellBackground = function (params) {
91
+ var ctx = params.ctx, clipX = params.clipX, clipY = params.clipY, clipWidth = params.clipWidth, clipHeight = params.clipHeight, isSelected = params.isSelected, isHover = params.isHover, isSummaryRow = params.isSummaryRow, isStriped = params.isStriped, rowIndex = params.rowIndex, customBgColor = params.customBgColor;
92
+ if (clipHeight > 0 && clipWidth > 0) {
93
+ var bgColor = void 0;
94
+ if (customBgColor) {
95
+ bgColor = customBgColor;
96
+ }
97
+ else if (isSelected) {
98
+ bgColor = COLORS.selectedBg;
99
+ }
100
+ else if (isSummaryRow) {
101
+ // 合计行使用表头背景色
102
+ bgColor = COLORS.headerBg;
103
+ }
104
+ else if (isHover) {
105
+ bgColor = COLORS.hoverBg;
106
+ }
107
+ else if (isStriped && rowIndex % 2 === 1) {
108
+ bgColor = COLORS.stripedBg;
109
+ }
110
+ else {
111
+ bgColor = COLORS.white;
112
+ }
113
+ ctx.fillStyle = bgColor;
114
+ ctx.fillRect(clipX, clipY, clipWidth, clipHeight);
115
+ }
116
+ };
117
+
118
+ export { calculateFixedColumnsRightEdge, calculateTextX, drawCellBackground, setTextAlign, setupCellClip, shouldRenderInCanvas };
@@ -102,10 +102,6 @@ interface IModalProps extends Omit<ModalProps, "onOk"> {
102
102
  * 最大高度
103
103
  */
104
104
  maxHeight?: number;
105
- /**
106
- * 默认宽度
107
- */
108
- defaultWidth?: string | number;
109
105
  /**
110
106
  * 默认高度
111
107
  */
@@ -9,18 +9,18 @@ import useResizable from './useResizable.js';
9
9
  import myMessage from '../message/index.js';
10
10
 
11
11
  var Modal = function (_a, ref) {
12
- var className = _a.className, defaultOpen = _a.defaultOpen, defaultTitle = _a.defaultTitle, defaultConfirmMsg = _a.defaultConfirmMsg, defaultConfirmOkText = _a.defaultConfirmOkText, defaultType = _a.defaultType, confirmPreHandle = _a.confirmPreHandle, confirmOnOk = _a.confirmOnOk, onOk = _a.onOk, footer = _a.footer, onOkValidate = _a.onOkValidate, _b = _a.isDrag, isDrag = _b === void 0 ? true : _b, _c = _a.isResize, isResize = _c === void 0 ? false : _c, minWidth = _a.minWidth, minHeight = _a.minHeight, maxWidth = _a.maxWidth, maxHeight = _a.maxHeight, defaultWidth = _a.defaultWidth, _d = _a.defaultHeight, defaultHeight = _d === void 0 ? 500 : _d, modalTitle = _a.title, modalRender = _a.modalRender, resetProps = __rest(_a, ["className", "defaultOpen", "defaultTitle", "defaultConfirmMsg", "defaultConfirmOkText", "defaultType", "confirmPreHandle", "confirmOnOk", "onOk", "footer", "onOkValidate", "isDrag", "isResize", "minWidth", "minHeight", "maxWidth", "maxHeight", "defaultWidth", "defaultHeight", "title", "modalRender"]);
12
+ var className = _a.className, defaultOpen = _a.defaultOpen, defaultTitle = _a.defaultTitle, defaultConfirmMsg = _a.defaultConfirmMsg, defaultConfirmOkText = _a.defaultConfirmOkText, defaultType = _a.defaultType, confirmPreHandle = _a.confirmPreHandle, confirmOnOk = _a.confirmOnOk, onOk = _a.onOk, footer = _a.footer, onOkValidate = _a.onOkValidate, _b = _a.isDrag, isDrag = _b === void 0 ? true : _b, _c = _a.isResize, isResize = _c === void 0 ? false : _c, minWidth = _a.minWidth, minHeight = _a.minHeight, maxWidth = _a.maxWidth, maxHeight = _a.maxHeight, defaultHeight = _a.defaultHeight, modalTitle = _a.title, modalRender = _a.modalRender, resetProps = __rest(_a, ["className", "defaultOpen", "defaultTitle", "defaultConfirmMsg", "defaultConfirmOkText", "defaultType", "confirmPreHandle", "confirmOnOk", "onOk", "footer", "onOkValidate", "isDrag", "isResize", "minWidth", "minHeight", "maxWidth", "maxHeight", "defaultHeight", "title", "modalRender"]);
13
13
  var classes = classNames("ztxk-modal", isResize && "ztxk-modal-resize", className);
14
14
  // 模态框基本属性
15
- var _e = useState(defaultOpen), open = _e[0], setOpen = _e[1];
16
- var _f = useState(defaultTitle), title = _f[0], setTitle = _f[1];
17
- var _g = useState(), loading = _g[0], setLoading = _g[1];
15
+ var _d = useState(defaultOpen), open = _d[0], setOpen = _d[1];
16
+ var _e = useState(defaultTitle), title = _e[0], setTitle = _e[1];
17
+ var _f = useState(), loading = _f[0], setLoading = _f[1];
18
18
  // 二次确认框相关配置
19
- var _h = useState(confirmOnOk ? true : false), isConfirm = _h[0], setIsConfirm = _h[1];
20
- var _j = useState(defaultConfirmMsg), confirmMsg = _j[0], setConfirmMsg = _j[1];
21
- var _k = useState(defaultConfirmOkText), confirmOkText = _k[0], setConfirmOkText = _k[1];
19
+ var _g = useState(confirmOnOk ? true : false), isConfirm = _g[0], setIsConfirm = _g[1];
20
+ var _h = useState(defaultConfirmMsg), confirmMsg = _h[0], setConfirmMsg = _h[1];
21
+ var _j = useState(defaultConfirmOkText), confirmOkText = _j[0], setConfirmOkText = _j[1];
22
22
  // 模态框类型
23
- var _l = useState(defaultType), type = _l[0], setType = _l[1];
23
+ var _k = useState(defaultType), type = _k[0], setType = _k[1];
24
24
  var close = useCallback(function () {
25
25
  setOpen(false);
26
26
  }, []);
@@ -142,21 +142,21 @@ var Modal = function (_a, ref) {
142
142
  setConfirmMsg: setConfirmOkText,
143
143
  };
144
144
  });
145
- var _m = useResizable({
145
+ var _l = useResizable({
146
146
  isResize: isResize,
147
147
  minWidth: minWidth,
148
148
  minHeight: minHeight,
149
149
  maxWidth: maxWidth,
150
150
  maxHeight: maxHeight,
151
- defaultWidth: defaultWidth,
151
+ defaultWidth: resetProps.width,
152
152
  defaultHeight: defaultHeight,
153
153
  modalRender: modalRender,
154
- }), resizableWidth = _m.width, resizableModalRender = _m.resizableModalRender;
155
- var _o = useDraggable({
154
+ }), resizableWidth = _l.width, resizableModalRender = _l.resizableModalRender;
155
+ var _m = useDraggable({
156
156
  isDrag: isDrag,
157
157
  title: modalTitle || title,
158
158
  modalRender: modalRender,
159
- }), dragTitle = _o.dragTitle, dragModalRender = _o.dragModalRender;
159
+ }), dragTitle = _m.dragTitle, dragModalRender = _m.dragModalRender;
160
160
  var finalWidth = isResize ? resizableWidth : resetProps.width || "70%";
161
161
  return (jsx(Modal$1, __assign({ open: open, onCancel: close, className: classes, okText: "\u4FDD\u5B58", onOk: footer ? undefined : onOkHandle, title: dragTitle, keyboard: false, maskClosable: false, confirmLoading: loading, cancelButtonProps: { loading: loading }, footer: footer, modalRender: function (modal) {
162
162
  var resized = resizableModalRender(modal);
@@ -3,7 +3,7 @@ import { jsxs, jsx } from 'react/jsx-runtime';
3
3
  import React__default, { useState, useRef, useCallback } from 'react';
4
4
 
5
5
  var useResizable = function (options) {
6
- var isResize = options.isResize, _a = options.minWidth, minWidth = _a === void 0 ? 400 : _a, _b = options.minHeight, minHeight = _b === void 0 ? 300 : _b, maxWidth = options.maxWidth, maxHeight = options.maxHeight, _c = options.defaultWidth, defaultWidth = _c === void 0 ? "70%" : _c, _d = options.defaultHeight, defaultHeight = _d === void 0 ? "auto" : _d;
6
+ var isResize = options.isResize, _a = options.minWidth, minWidth = _a === void 0 ? 100 : _a, _b = options.minHeight, minHeight = _b === void 0 ? 100 : _b, maxWidth = options.maxWidth, maxHeight = options.maxHeight, _c = options.defaultWidth, defaultWidth = _c === void 0 ? "70%" : _c, _d = options.defaultHeight, defaultHeight = _d === void 0 ? "auto" : _d;
7
7
  var _e = useState({
8
8
  width: defaultWidth,
9
9
  height: defaultHeight,
@@ -551,7 +551,7 @@ function applyExcelStyles(worksheet, data, numKeys, dateKeys, columns, headerRow
551
551
  var cellValue = rowData[dateKey.dataIndex];
552
552
  if (cellValue) {
553
553
  try {
554
- var date = dayjs(cellValue).toDate();
554
+ var date = dayjs(String(cellValue)).toDate();
555
555
  cell.value = date;
556
556
  cell.numFmt = columns[colIndex].dateFormat;
557
557
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zmdms-webui",
3
- "version": "2.6.1",
3
+ "version": "2.6.3",
4
4
  "private": false,
5
5
  "main": "dist/index.es.js",
6
6
  "module": "dist/index.es.js",