zmdms-webui 2.5.4 → 2.5.6

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.
@@ -9,7 +9,12 @@ interface IProps {
9
9
  logout?: () => void;
10
10
  userInfo?: any;
11
11
  updatePassword?: Function;
12
+ isNewUpdatePwd?: boolean;
12
13
  isSaveState?: boolean;
14
+ selfRender?: any;
15
+ userDetail?: boolean;
16
+ userInfoCanEdit?: boolean;
17
+ updateUserInfo?: Function;
13
18
  }
14
19
  declare const _default: React__default.NamedExoticComponent<IProps>;
15
20
 
@@ -7,9 +7,9 @@ import { LayoutHeaderContext } from './LayoutHeaderContext.js';
7
7
  import { Layout } from 'antd';
8
8
 
9
9
  var AppLayoutHeader = function (_a) {
10
- var tabs = _a.tabs, activeTab = _a.activeTab, deleteTabHandle = _a.deleteTabHandle, deleteTabsHandle = _a.deleteTabsHandle, setActiveTab = _a.setActiveTab, logout = _a.logout, userInfo = _a.userInfo, updatePassword = _a.updatePassword, isSaveState = _a.isSaveState;
10
+ var tabs = _a.tabs, activeTab = _a.activeTab, deleteTabHandle = _a.deleteTabHandle, deleteTabsHandle = _a.deleteTabsHandle, setActiveTab = _a.setActiveTab, logout = _a.logout, userInfo = _a.userInfo, updatePassword = _a.updatePassword, isSaveState = _a.isSaveState, selfRender = _a.selfRender, userDetail = _a.userDetail, userInfoCanEdit = _a.userInfoCanEdit, updateUserInfo = _a.updateUserInfo, isNewUpdatePwd = _a.isNewUpdatePwd;
11
11
  // console.log("layout-header- rerender");
12
- return (jsx(Layout.Header, __assign({ className: "zmdms-content--header" }, { children: jsxs(LayoutHeaderContext.Provider, __assign({ value: { userInfo: userInfo } }, { children: [jsx(TabsCom, { tabs: tabs, activeTab: activeTab, deleteTabHandle: deleteTabHandle, deleteTabsHandle: deleteTabsHandle, setActiveTab: setActiveTab, isSaveState: isSaveState }), jsx(SettingCom, { logout: logout, updatePassword: updatePassword })] })) })));
12
+ return (jsx(Layout.Header, __assign({ className: "zmdms-content--header" }, { children: jsxs(LayoutHeaderContext.Provider, __assign({ value: { userInfo: userInfo } }, { children: [jsx(TabsCom, { tabs: tabs, activeTab: activeTab, deleteTabHandle: deleteTabHandle, deleteTabsHandle: deleteTabsHandle, setActiveTab: setActiveTab, isSaveState: isSaveState }), jsx(SettingCom, { logout: logout, updatePassword: updatePassword, userDetail: userDetail, userInfoCanEdit: userInfoCanEdit, updateUserInfo: updateUserInfo, isNewUpdatePwd: isNewUpdatePwd }), selfRender] })) })));
13
13
  };
14
14
  AppLayoutHeader.displayName = "ZTXK_WEBUI_AppLayoutHeader";
15
15
  var AppLayoutHeader$1 = memo(AppLayoutHeader);
@@ -4,8 +4,8 @@ import FullCom from './fullCom.js';
4
4
  import UserInfo from './userInfo.js';
5
5
 
6
6
  var SettingCom = function (_a) {
7
- var logout = _a.logout, updatePassword = _a.updatePassword;
8
- return (jsxs("div", __assign({ className: "zmdms-content--header-info" }, { children: [jsx(FullCom, {}), jsx(UserInfo, { logout: logout, updatePassword: updatePassword })] })));
7
+ var logout = _a.logout, updatePassword = _a.updatePassword, userDetail = _a.userDetail, userInfoCanEdit = _a.userInfoCanEdit, updateUserInfo = _a.updateUserInfo, isNewUpdatePwd = _a.isNewUpdatePwd;
8
+ return (jsxs("div", __assign({ className: "zmdms-content--header-info" }, { children: [jsx(FullCom, {}), jsx(UserInfo, { logout: logout, updatePassword: updatePassword, userDetail: userDetail, userInfoCanEdit: userInfoCanEdit, updateUserInfo: updateUserInfo, isNewUpdatePwd: isNewUpdatePwd })] })));
9
9
  };
10
10
 
11
11
  export { SettingCom as default };
@@ -1,64 +1,80 @@
1
1
  import { __assign, __awaiter, __generator } from '../../_virtual/_tslib.js';
2
2
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
3
- import { useContext, useState, useMemo } from 'react';
3
+ import { useContext, useState, useRef, useMemo } from 'react';
4
4
  import { LayoutHeaderContext } from '../LayoutHeaderContext.js';
5
5
  import { useLatest } from 'ahooks';
6
- import LogoutOutlined from '../../node_modules/@ant-design/icons/es/icons/LogoutOutlined.js';
7
- import UnlockOutlined from '../../node_modules/@ant-design/icons/es/icons/UnlockOutlined.js';
6
+ import UserInfoModal from './userInfoModal.js';
7
+ import userPwdModal from './userPwdModal.js';
8
8
  import UserOutlined from '../../node_modules/@ant-design/icons/es/icons/UserOutlined.js';
9
+ import UnlockOutlined from '../../node_modules/@ant-design/icons/es/icons/UnlockOutlined.js';
10
+ import LogoutOutlined from '../../node_modules/@ant-design/icons/es/icons/LogoutOutlined.js';
9
11
  import { Dropdown, Spin } from 'antd';
10
12
 
11
13
  var UserInfo = function (_a) {
12
- var logout = _a.logout, updatePassword = _a.updatePassword;
14
+ var logout = _a.logout, userDetail = _a.userDetail, updatePassword = _a.updatePassword, userInfoCanEdit = _a.userInfoCanEdit, updateUserInfo = _a.updateUserInfo, isNewUpdatePwd = _a.isNewUpdatePwd;
13
15
  var userInfo = useContext(LayoutHeaderContext).userInfo;
14
16
  var _b = useState(false), spinning = _b[0], setSpinning = _b[1];
15
17
  var logoutLatest = useLatest(logout);
18
+ var userInfoModalRef = useRef(null);
19
+ var userPwdModalRef = useRef(null);
16
20
  var items = useMemo(function () {
17
- var items = [
18
- {
19
- label: (jsxs("div", __assign({ onClick: function () { return __awaiter(void 0, void 0, void 0, function () {
20
- var err_1;
21
- return __generator(this, function (_a) {
22
- switch (_a.label) {
23
- case 0:
24
- setSpinning(true);
25
- if (!logoutLatest.current) return [3 /*break*/, 4];
26
- _a.label = 1;
27
- case 1:
28
- _a.trys.push([1, 3, , 4]);
29
- return [4 /*yield*/, logoutLatest.current()];
30
- case 2:
31
- _a.sent();
32
- return [3 /*break*/, 4];
33
- case 3:
34
- err_1 = _a.sent();
35
- console.log(err_1);
36
- return [3 /*break*/, 4];
37
- case 4:
38
- setSpinning(false);
39
- return [2 /*return*/];
40
- }
41
- });
42
- }); } }, { children: [jsx(LogoutOutlined, { style: { marginRight: 5 } }), " \u9000\u51FA\u7CFB\u7EDF"] }))),
43
- key: "logout",
44
- },
45
- ];
21
+ var items = [];
22
+ if (userDetail) {
23
+ items.push({
24
+ label: (jsxs("div", __assign({ onClick: function () {
25
+ userInfoModalRef.current.show();
26
+ } }, { children: [jsx(UserOutlined, { style: { marginRight: 5 } }), " \u8D26\u53F7\u4FE1\u606F"] }))),
27
+ key: "userDetail",
28
+ });
29
+ }
46
30
  if (updatePassword) {
47
- items.unshift.apply(items, [
48
- {
49
- label: (jsxs("div", __assign({ onClick: function () {
50
- updatePassword();
51
- } }, { children: [jsx(UnlockOutlined, { style: { marginRight: 5 } }), " \u4FEE\u6539\u5BC6\u7801"] }))),
52
- key: "info",
53
- },
54
- {
55
- type: "divider",
56
- },
57
- ]);
31
+ items.push({
32
+ label: (jsxs("div", __assign({ onClick: function () {
33
+ if (isNewUpdatePwd) {
34
+ userPwdModalRef.current.show();
35
+ }
36
+ else {
37
+ updatePassword === null || updatePassword === void 0 ? void 0 : updatePassword();
38
+ }
39
+ } }, { children: [jsx(UnlockOutlined, { style: { marginRight: 5 } }), " \u4FEE\u6539\u5BC6\u7801"] }))),
40
+ key: "info",
41
+ });
42
+ }
43
+ if (userDetail || updatePassword) {
44
+ items.push({
45
+ type: "divider",
46
+ });
58
47
  }
48
+ items.push({
49
+ label: (jsxs("div", __assign({ onClick: function () { return __awaiter(void 0, void 0, void 0, function () {
50
+ var err_1;
51
+ return __generator(this, function (_a) {
52
+ switch (_a.label) {
53
+ case 0:
54
+ setSpinning(true);
55
+ if (!logoutLatest.current) return [3 /*break*/, 4];
56
+ _a.label = 1;
57
+ case 1:
58
+ _a.trys.push([1, 3, , 4]);
59
+ return [4 /*yield*/, logoutLatest.current()];
60
+ case 2:
61
+ _a.sent();
62
+ return [3 /*break*/, 4];
63
+ case 3:
64
+ err_1 = _a.sent();
65
+ console.log(err_1);
66
+ return [3 /*break*/, 4];
67
+ case 4:
68
+ setSpinning(false);
69
+ return [2 /*return*/];
70
+ }
71
+ });
72
+ }); } }, { children: [jsx(LogoutOutlined, { style: { marginRight: 5 } }), " \u9000\u51FA\u7CFB\u7EDF"] }))),
73
+ key: "logout",
74
+ });
59
75
  return items;
60
- }, [updatePassword, logoutLatest]);
61
- return (jsxs(Fragment, { children: [jsx(Dropdown, __assign({ menu: { items: items }, trigger: ["click"], placement: "bottomLeft" }, { children: jsxs("div", __assign({ className: "user-operation" }, { children: [jsx(UserOutlined, {}), jsx("span", { children: userInfo === null || userInfo === void 0 ? void 0 : userInfo.realName })] })) })), spinning && jsx(Spin, { spinning: true, tip: "\u9000\u51FA\u767B\u5F55\u4E2D", className: "logout-spin" })] }));
76
+ }, [userDetail, updatePassword, logoutLatest, isNewUpdatePwd]);
77
+ return (jsxs(Fragment, { children: [jsx(Dropdown, __assign({ menu: { items: items }, trigger: ["click"], placement: "bottomLeft" }, { children: jsxs("div", __assign({ className: "user-operation" }, { children: [jsx(UserOutlined, {}), jsx("span", { children: userInfo === null || userInfo === void 0 ? void 0 : userInfo.realName })] })) })), jsx(UserInfoModal, { ref: userInfoModalRef, userInfo: userInfo, canEdit: userInfoCanEdit, updateUserInfo: updateUserInfo }), jsx(userPwdModal, { ref: userPwdModalRef, updatePassword: updatePassword }), spinning && jsx(Spin, { spinning: true, tip: "\u9000\u51FA\u767B\u5F55\u4E2D", className: "logout-spin" })] }));
62
78
  };
63
79
 
64
80
  export { UserInfo as default };
@@ -0,0 +1,126 @@
1
+ import { __assign, __awaiter, __generator } from '../../_virtual/_tslib.js';
2
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
3
+ import { forwardRef, useState, useImperativeHandle, useEffect, useMemo } from 'react';
4
+ import { strLenValidate, phoneValidate, emailValidate, idCardValidate } from 'zmdms-utils';
5
+ import MemoForm from '../../form/form.js';
6
+ import MemoInput from '../../input/input.js';
7
+ import ButtonCom from '../../button/button.js';
8
+ import ModalComponent from '../../modal/modal.js';
9
+ import myMessage from '../../message/index.js';
10
+
11
+ var UserInfoModal = forwardRef(function (props, ref) {
12
+ var userInfo = props.userInfo, canEdit = props.canEdit, updateUserInfo = props.updateUserInfo;
13
+ var _a = useState(false), visible = _a[0], setVisible = _a[1];
14
+ var form = MemoForm.useForm()[0];
15
+ var _b = useState(false), isEdit = _b[0], setIsEdit = _b[1];
16
+ useImperativeHandle(ref, function () { return ({
17
+ show: function () { return setVisible(true); },
18
+ }); });
19
+ useEffect(function () {
20
+ if (userInfo) {
21
+ form.setFieldsValue(userInfo);
22
+ }
23
+ }, [userInfo, form]);
24
+ useEffect(function () {
25
+ if (!visible) {
26
+ setIsEdit(false);
27
+ }
28
+ }, [visible]);
29
+ var items = useMemo(function () {
30
+ return [
31
+ {
32
+ name: "account",
33
+ label: "账号",
34
+ rules: [
35
+ { required: true, message: "请输入账号" },
36
+ {
37
+ pattern: strLenValidate().regex,
38
+ message: strLenValidate().message,
39
+ },
40
+ ],
41
+ isChangeable: isEdit,
42
+ render: function (props) { return jsx(MemoInput, __assign({}, props)); },
43
+ },
44
+ {
45
+ name: "realName",
46
+ label: "姓名",
47
+ rules: [
48
+ { required: true, message: "请输入姓名" },
49
+ {
50
+ pattern: strLenValidate().regex,
51
+ message: strLenValidate().message,
52
+ },
53
+ ],
54
+ isChangeable: isEdit,
55
+ render: function (props) { return jsx(MemoInput, __assign({}, props)); },
56
+ },
57
+ {
58
+ name: "phone",
59
+ label: "电话",
60
+ rules: [
61
+ { required: true, message: "请输入电话" },
62
+ {
63
+ pattern: phoneValidate.regex,
64
+ message: phoneValidate.message,
65
+ },
66
+ ],
67
+ isChangeable: isEdit,
68
+ render: function (props) { return jsx(MemoInput, __assign({}, props)); },
69
+ },
70
+ {
71
+ name: "email",
72
+ label: "邮箱",
73
+ rules: [
74
+ {
75
+ pattern: emailValidate.regex,
76
+ message: emailValidate.message,
77
+ },
78
+ ],
79
+ isChangeable: isEdit,
80
+ render: function (props) { return jsx(MemoInput, __assign({}, props)); },
81
+ },
82
+ {
83
+ name: "identityCard",
84
+ label: "身份证号",
85
+ rules: [
86
+ {
87
+ pattern: idCardValidate.regex,
88
+ message: idCardValidate.message,
89
+ },
90
+ ],
91
+ isChangeable: isEdit,
92
+ render: function (props) { return jsx(MemoInput, __assign({}, props)); },
93
+ },
94
+ ];
95
+ }, [isEdit]);
96
+ var footerDom = isEdit ? (jsxs(Fragment, { children: [jsx(ButtonCom, __assign({ type: "primary", onClick: function () { return __awaiter(void 0, void 0, void 0, function () {
97
+ var data, err_1;
98
+ var _a, _b, _c;
99
+ return __generator(this, function (_d) {
100
+ switch (_d.label) {
101
+ case 0:
102
+ _d.trys.push([0, 3, , 4]);
103
+ return [4 /*yield*/, form.validateFields()];
104
+ case 1:
105
+ _d.sent();
106
+ console.log("验证通过,执行后续事件");
107
+ data = form.getFieldsValue();
108
+ return [4 /*yield*/, (updateUserInfo === null || updateUserInfo === void 0 ? void 0 : updateUserInfo(data))];
109
+ case 2:
110
+ _d.sent();
111
+ setIsEdit(false);
112
+ console.log(data);
113
+ return [3 /*break*/, 4];
114
+ case 3:
115
+ err_1 = _d.sent();
116
+ console.log(err_1);
117
+ myMessage.error((err_1 === null || err_1 === void 0 ? void 0 : err_1.message) || ((_c = (_b = (_a = err_1 === null || err_1 === void 0 ? void 0 : err_1.errorFields) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.errors) === null || _c === void 0 ? void 0 : _c[0]) || "保存失败!");
118
+ return [2 /*return*/];
119
+ case 4: return [2 /*return*/];
120
+ }
121
+ });
122
+ }); } }, { children: "\u4FDD\u5B58" })), jsx(ButtonCom, __assign({ type: "default", onClick: function () { return setIsEdit(false); } }, { children: "\u53D6\u6D88" }))] })) : (jsx(ButtonCom, __assign({ type: "primary", onClick: function () { return setIsEdit(true); } }, { children: "\u7F16\u8F91" })));
123
+ return (jsx(ModalComponent, __assign({ title: "\u7528\u6237\u4FE1\u606F", open: visible, onCancel: function () { return setVisible(false); }, footer: canEdit ? footerDom : null }, { children: jsx(MemoForm, { directionColumn: true, form: form, items: items }) })));
124
+ });
125
+
126
+ export { UserInfoModal as default };
@@ -0,0 +1,104 @@
1
+ import { __assign, __awaiter, __generator } from '../../_virtual/_tslib.js';
2
+ import { jsx, Fragment } from 'react/jsx-runtime';
3
+ import { forwardRef, useState, useImperativeHandle, useEffect, useMemo } from 'react';
4
+ import { validatePassword } from 'zmdms-utils';
5
+ import MemoForm from '../../form/form.js';
6
+ import MemoInput from '../../input/input.js';
7
+ import ButtonCom from '../../button/button.js';
8
+ import ModalComponent from '../../modal/modal.js';
9
+ import myMessage from '../../message/index.js';
10
+
11
+ var userPwdModal = forwardRef(function (props, ref) {
12
+ var userInfo = props.userInfo, updatePassword = props.updatePassword;
13
+ var _a = useState(false), visible = _a[0], setVisible = _a[1];
14
+ var form = MemoForm.useForm()[0];
15
+ useImperativeHandle(ref, function () { return ({
16
+ show: function () { return setVisible(true); },
17
+ }); });
18
+ useEffect(function () {
19
+ if (userInfo) {
20
+ form.setFieldsValue(userInfo);
21
+ }
22
+ }, [userInfo, form]);
23
+ var items = useMemo(function () {
24
+ return [
25
+ {
26
+ name: "oldPassword",
27
+ label: "原密码",
28
+ rules: [{ required: true, message: "请输入原密码" }],
29
+ render: function (props) { return (jsx(MemoInput.Password, __assign({ autoComplete: "new-password" }, props))); },
30
+ },
31
+ {
32
+ name: "newPassword",
33
+ label: "新密码",
34
+ rules: [
35
+ { required: true, message: "请输入新密码" },
36
+ function (_a) {
37
+ var getFieldValue = _a.getFieldValue;
38
+ return ({
39
+ validator: function (rule, value) {
40
+ var result = validatePassword(value, getFieldValue("account"));
41
+ if (result.result) {
42
+ return Promise.resolve();
43
+ }
44
+ else {
45
+ return Promise.reject(result.message);
46
+ }
47
+ },
48
+ });
49
+ },
50
+ ],
51
+ render: function (props) { return (jsx(MemoInput.Password, __assign({ autoComplete: "new-password" }, props))); },
52
+ nextNode: (jsx(MemoForm.ItemTipDom, __assign({ width: 500 }, { children: "\u5BC6\u7801\u957F\u5EA6\u5927\u4E8E8\u4F4D\uFF0C\u81F3\u5C11\u6EE1\u8DB3\u6570\u5B57\uFF0C\u5927\u5199\u5B57\u6BCD\uFF0C\u5C0F\u5199\u5B57\u6BCD\uFF0C\u7279\u6B8A\u5B57\u7B26\u4E2D\u7684\u4E09\u79CD!" }))),
53
+ },
54
+ {
55
+ name: "newPassword1",
56
+ label: "确认新密码",
57
+ rules: [
58
+ { required: true, message: "请确认密码" },
59
+ function (_a) {
60
+ var getFieldValue = _a.getFieldValue;
61
+ return ({
62
+ validator: function (rule, value) {
63
+ if (!value || getFieldValue("newPassword") === value) {
64
+ return Promise.resolve();
65
+ }
66
+ return Promise.reject("两次密码输入不一致");
67
+ },
68
+ });
69
+ },
70
+ ],
71
+ render: function (props) { return (jsx(MemoInput.Password, __assign({ autoComplete: "new-password" }, props))); },
72
+ },
73
+ ];
74
+ }, []);
75
+ var footerDom = (jsx(Fragment, { children: jsx(ButtonCom, __assign({ type: "primary", onClick: function () { return __awaiter(void 0, void 0, void 0, function () {
76
+ var data, err_1;
77
+ var _a, _b, _c;
78
+ return __generator(this, function (_d) {
79
+ switch (_d.label) {
80
+ case 0:
81
+ _d.trys.push([0, 3, , 4]);
82
+ return [4 /*yield*/, form.validateFields()];
83
+ case 1:
84
+ _d.sent();
85
+ console.log("验证通过,执行后续事件");
86
+ data = form.getFieldsValue();
87
+ return [4 /*yield*/, (updatePassword === null || updatePassword === void 0 ? void 0 : updatePassword(data))];
88
+ case 2:
89
+ _d.sent();
90
+ console.log(data);
91
+ return [3 /*break*/, 4];
92
+ case 3:
93
+ err_1 = _d.sent();
94
+ console.log(err_1);
95
+ myMessage.error((err_1 === null || err_1 === void 0 ? void 0 : err_1.message) || ((_c = (_b = (_a = err_1 === null || err_1 === void 0 ? void 0 : err_1.errorFields) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.errors) === null || _c === void 0 ? void 0 : _c[0]) || "保存失败!");
96
+ return [2 /*return*/];
97
+ case 4: return [2 /*return*/];
98
+ }
99
+ });
100
+ }); } }, { children: "\u4FDD\u5B58" })) }));
101
+ return (jsx(ModalComponent, __assign({ title: "\u4FEE\u6539\u5BC6\u7801", open: visible, onCancel: function () { return setVisible(false); }, footer: footerDom, width: "80%" }, { children: jsx(MemoForm, { directionColumn: true, form: form, items: items }) })));
102
+ });
103
+
104
+ export { userPwdModal as default };
@@ -112,11 +112,14 @@ function CanvasTable(props) {
112
112
  }), finalDataSource = _z.finalDataSource, hasSummaryRow = _z.hasSummaryRow;
113
113
  // 用于存储计算后的表头高度(用于自动高度的精确计算)
114
114
  var _0 = useState(undefined), preciseHeaderHeight = _0[0], setPreciseHeaderHeight = _0[1];
115
+ // 用于存储是否需要横向滚动条(用于自动高度的精确计算)
116
+ var _1 = useState(false), needHorizontalScrollbar = _1[0], setNeedHorizontalScrollbar = _1[1];
115
117
  // 自动高度计算(需要在容器尺寸计算之前)
116
118
  var autoHeight = useCanvasTableAutoHeight(isAutoScrollY, autoScrollYMarginBottom, canvasTableId, finalDataSource.length, // 数据行数(用于 content 模式)
117
119
  headerHeight, // 表头基础高度(用于 content 模式的初始计算)
118
120
  rowHeight, // 行高(用于 content 模式)
119
- preciseHeaderHeight // 计算后的表头高度(用于 content 模式的精确计算)
121
+ preciseHeaderHeight, // 计算后的表头高度(用于 content 模式的精确计算)
122
+ needHorizontalScrollbar // 是否需要横向滚动条(用于计算额外高度)
120
123
  );
121
124
  // 监听容器尺寸变化(提前计算,用于列宽自适应)
122
125
  var containerSize = useContainerSize({
@@ -124,6 +127,7 @@ function CanvasTable(props) {
124
127
  width: width,
125
128
  height: isAutoScrollY ? autoHeight || height : height,
126
129
  });
130
+ console.log("containerSize", containerSize);
127
131
  var containerWidth = containerSize.width;
128
132
  var containerHeight = containerSize.height;
129
133
  // 计算列的渲染信息(使用容器宽度进行自适应填充)
@@ -177,7 +181,7 @@ function CanvasTable(props) {
177
181
  return calculateTotalHeight(calculatedHeaderHeight, finalDataSource.length, rowHeight);
178
182
  }, [calculatedHeaderHeight, finalDataSource.length, rowHeight]);
179
183
  // 计算滚动条指标
180
- var _1 = useScrollbarMetrics({
184
+ var _2 = useScrollbarMetrics({
181
185
  containerWidth: containerWidth,
182
186
  containerHeight: containerHeight,
183
187
  totalWidth: totalWidth,
@@ -185,14 +189,14 @@ function CanvasTable(props) {
185
189
  headerHeight: calculatedHeaderHeight,
186
190
  scrollTop: 0,
187
191
  scrollLeft: 0,
188
- }), maxScrollTop = _1.maxScrollTop, maxScrollLeft = _1.maxScrollLeft;
192
+ }), maxScrollTop = _2.maxScrollTop, maxScrollLeft = _2.maxScrollLeft;
189
193
  // 滚动管理(使用预先计算的maxScrollTop和maxScrollLeft)
190
- var _2 = useTableScroll({
194
+ var _3 = useTableScroll({
191
195
  containerRef: containerRef,
192
196
  maxScrollTop: maxScrollTop,
193
197
  maxScrollLeft: maxScrollLeft,
194
198
  onScroll: onScroll,
195
- }), scrollState = _2.scrollState, setScrollState = _2.setScrollState;
199
+ }), scrollState = _3.scrollState, setScrollState = _3.setScrollState;
196
200
  // 使用 ref 保存最新的滚动位置,确保在组件卸载过程中仍能访问
197
201
  var scrollPositionRef = useRef({ x: 0, y: 0 });
198
202
  useEffect(function () {
@@ -220,13 +224,24 @@ function CanvasTable(props) {
220
224
  scrollTop: scrollState.scrollTop,
221
225
  scrollLeft: scrollState.scrollLeft,
222
226
  }).actualMetrics;
227
+ // 在 content 模式下,当横向滚动条状态变化时,更新状态以触发自动高度重新计算
228
+ useEffect(function () {
229
+ if (isAutoScrollY === "content" &&
230
+ scrollbarMetrics.needHorizontalScrollbar !== needHorizontalScrollbar) {
231
+ setNeedHorizontalScrollbar(scrollbarMetrics.needHorizontalScrollbar);
232
+ }
233
+ }, [
234
+ isAutoScrollY,
235
+ scrollbarMetrics.needHorizontalScrollbar,
236
+ needHorizontalScrollbar,
237
+ ]);
223
238
  // 单元格框选
224
- var _3 = useTableSelection({
239
+ var _4 = useTableSelection({
225
240
  state: state,
226
241
  setState: setState,
227
242
  }),
228
243
  // selectionStartRef,
229
- startSelection = _3.startSelection, updateSelection = _3.updateSelection, extendSelection = _3.extendSelection;
244
+ startSelection = _4.startSelection, updateSelection = _4.updateSelection, extendSelection = _4.extendSelection;
230
245
  // 处理列宽调整
231
246
  var handleColumnResize = useCallback(function (columnKey, newWidth) {
232
247
  var _a;
@@ -281,20 +296,20 @@ function CanvasTable(props) {
281
296
  onCurrentListChange,
282
297
  ]);
283
298
  // 列宽调整
284
- var _4 = useColumnResize({
299
+ var _5 = useColumnResize({
285
300
  columnRenderInfos: columnRenderInfos,
286
301
  containerWidth: containerWidth,
287
302
  headerHeight: calculatedHeaderHeight,
288
303
  scrollLeft: scrollState.scrollLeft,
289
304
  onColumnResize: handleColumnResize,
290
- }), resizeState = _4.resizeState, checkResizeHandle = _4.checkResizeHandle, startResize = _4.startResize, updateResize = _4.updateResize, endResize = _4.endResize, setHoverResizeColumn = _4.setHoverResizeColumn, getColumnWidth = _4.getColumnWidth, RESIZE_HANDLE_WIDTH = _4.RESIZE_HANDLE_WIDTH;
305
+ }), resizeState = _5.resizeState, checkResizeHandle = _5.checkResizeHandle, startResize = _5.startResize, updateResize = _5.updateResize, endResize = _5.endResize, setHoverResizeColumn = _5.setHoverResizeColumn, getColumnWidth = _5.getColumnWidth, RESIZE_HANDLE_WIDTH = _5.RESIZE_HANDLE_WIDTH;
291
306
  // 复制到剪贴板
292
- var _5 = useCopyToClipboard({
307
+ var _6 = useCopyToClipboard({
293
308
  cellSelection: state.cellSelection,
294
309
  processedDataSource: finalDataSource,
295
310
  columns: processedColumns,
296
311
  containerRef: containerRef,
297
- }), getSelectedCellsText = _5.getSelectedCellsText, copyToClipboard = _5.copyToClipboard;
312
+ }), getSelectedCellsText = _6.getSelectedCellsText, copyToClipboard = _6.copyToClipboard;
298
313
  // 处理右键菜单的复制操作
299
314
  var handleCopy = useCallback(function () {
300
315
  var text = getSelectedCellsText();
@@ -313,7 +328,7 @@ function CanvasTable(props) {
313
328
  summaryConfig: (exportExcelConfig === null || exportExcelConfig === void 0 ? void 0 : exportExcelConfig.isExportNoSummary) ? undefined : [],
314
329
  });
315
330
  // 交互事件处理(使用baseScrollbarMetrics的maxScrollTop/maxScrollLeft以保持稳定)
316
- var _6 = useTableInteraction({
331
+ var _7 = useTableInteraction({
317
332
  state: state,
318
333
  setState: setState,
319
334
  scrollState: scrollState,
@@ -360,7 +375,7 @@ function CanvasTable(props) {
360
375
  fixedRowsCount: fixedRowsCount,
361
376
  fixedRowsConfig: fixedRowsConfig,
362
377
  summaryFixed: summaryFixed,
363
- }), handleCanvasMouseDown = _6.handleCanvasMouseDown, handleCanvasMouseMove = _6.handleCanvasMouseMove, handleCanvasMouseUp = _6.handleCanvasMouseUp, handleCanvasMouseLeave = _6.handleCanvasMouseLeave, handleCanvasContextMenu = _6.handleCanvasContextMenu;
378
+ }), handleCanvasMouseDown = _7.handleCanvasMouseDown, handleCanvasMouseMove = _7.handleCanvasMouseMove, handleCanvasMouseUp = _7.handleCanvasMouseUp, handleCanvasMouseLeave = _7.handleCanvasMouseLeave, handleCanvasContextMenu = _7.handleCanvasContextMenu;
364
379
  // 渲染表格
365
380
  useTableRender(__assign(__assign({ canvasRef: canvasRef, processedDataSource: finalDataSource, columnRenderInfos: columnRenderInfos, columns: processedColumns, // 传递原始columns用于渲染多级表头
366
381
  state: state, scrollState: scrollState, rowSelection: rowSelection, containerWidth: containerWidth, containerHeight: containerHeight, headerHeight: calculatedHeaderHeight, baseHeaderHeight: headerHeight, // 传入原始基础高度用于计算每层高度
@@ -3,6 +3,8 @@ import { useState, useEffect } from 'react';
3
3
  /**
4
4
  * CanvasTable 自动高度计算 Hook
5
5
  */
6
+ // 滚动条宽度常量
7
+ var SCROLLBAR_SIZE = 12;
6
8
  /**
7
9
  * 计算CanvasTable高度
8
10
  * @param isAutoScrollY 自动高度模式
@@ -12,10 +14,12 @@ import { useState, useEffect } from 'react';
12
14
  * @param headerHeight 表头基础高度(用于 content 模式的初始计算)
13
15
  * @param rowHeight 行高(用于 content 模式)
14
16
  * @param calculatedHeaderHeight 计算后的表头高度(优先使用,用于 content 模式的精确计算)
17
+ * @param needHorizontalScrollbar 是否需要横向滚动条(用于计算额外高度)
15
18
  * @returns 计算出的表格高度
16
19
  */
17
- function useCanvasTableAutoHeight(isAutoScrollY, marginBottom, canvasTableId, dataLength, headerHeight, rowHeight, calculatedHeaderHeight) {
20
+ function useCanvasTableAutoHeight(isAutoScrollY, marginBottom, canvasTableId, dataLength, headerHeight, rowHeight, calculatedHeaderHeight, needHorizontalScrollbar) {
18
21
  if (marginBottom === void 0) { marginBottom = 65; }
22
+ if (needHorizontalScrollbar === void 0) { needHorizontalScrollbar = false; }
19
23
  var _a = useState(undefined), tableHeight = _a[0], setTableHeight = _a[1];
20
24
  useEffect(function () {
21
25
  // 归一化模式:true 转换为 'viewport'
@@ -30,15 +34,14 @@ function useCanvasTableAutoHeight(isAutoScrollY, marginBottom, canvasTableId, da
30
34
  // 优先使用计算后的表头高度(考虑了换行、多级表头等因素)
31
35
  // 如果还未计算完成,使用基础高度作为初始值
32
36
  var actualHeaderHeight = calculatedHeaderHeight || headerHeight;
33
- // 计算总高度 = 表头高度 + (数据行数 * 行高)
34
- var calculatedHeight = actualHeaderHeight + dataLength * rowHeight;
37
+ // 计算总高度 = 表头高度 + (数据行数 * 行高) + (横向滚动条高度)
38
+ var calculatedHeight = actualHeaderHeight +
39
+ dataLength * rowHeight +
40
+ (needHorizontalScrollbar ? SCROLLBAR_SIZE : 0);
35
41
  // 设置最小高度和最大高度
36
42
  var minHeight = 200;
37
- var maxHeight = 5000; // 防止数据过多时表格过高
38
43
  // 如果没有数据,使用最小高度(包含表头和空状态提示)
39
- var finalHeight = dataLength === 0
40
- ? minHeight
41
- : Math.min(Math.max(calculatedHeight, minHeight), maxHeight);
44
+ var finalHeight = dataLength === 0 ? minHeight : Math.max(calculatedHeight, minHeight);
42
45
  setTableHeight(finalHeight);
43
46
  }
44
47
  return;
@@ -95,7 +98,8 @@ function useCanvasTableAutoHeight(isAutoScrollY, marginBottom, canvasTableId, da
95
98
  dataLength,
96
99
  headerHeight,
97
100
  rowHeight,
98
- calculatedHeaderHeight, // 当计算后的表头高度变化时,重新计算总高度
101
+ calculatedHeaderHeight,
102
+ needHorizontalScrollbar, // 当横向滚动条状态变化时,重新计算总高度
99
103
  ]);
100
104
  return tableHeight;
101
105
  }
package/dist/index.es.js CHANGED
@@ -1,4 +1,3 @@
1
- export { default as Input } from './es/input/input.js';
2
1
  export { default as InputNumber } from './es/inputnumber/inputNumber.js';
3
2
  export { default as DatePicker } from './es/datepicker/index.js';
4
3
  export { default as Calendar } from './es/calendar/index.js';
@@ -10,14 +9,12 @@ export { default as Login } from './es/login/index.js';
10
9
  export { default as Icon } from './es/icon/index.js';
11
10
  export { default as IconOss } from './es/icon/icon-oss.js';
12
11
  export { default as DynamicSetting } from './es/dynamicsetting/dynamicSetting.js';
13
- export { default as Form } from './es/form/form.js';
14
12
  export { default as FormItem } from './es/formitem/formItem.js';
15
13
  export { default as Container } from './es/container/container.js';
16
14
  export { default as Footer } from './es/footer/footer.js';
17
15
  export { default as Pagination } from './es/pagination/pagination.js';
18
16
  export { default as Table } from './es/table/table.js';
19
17
  export { default as Tabs } from './es/tabs/tabs.js';
20
- export { default as Modal } from './es/modal/modal.js';
21
18
  export { default as DetailList } from './es/detaillist/list.js';
22
19
  export { default as AppLayout } from './es/applayout/appLayout.js';
23
20
  export { default as AppLayoutHeader } from './es/applayoutheader/appLayoutHeader.js';
@@ -49,4 +46,7 @@ export { default as message } from './es/message/index.js';
49
46
  export { default as CanvasTable } from './es/canvastable/canvasTable.js';
50
47
  export { Affix, Anchor, AutoComplete, Avatar, BackTop, Badge, Breadcrumb, Card, Carousel, Cascader, Checkbox, Col, Comment, ConfigProvider, Divider, Drawer, Dropdown, Empty, Grid, Image, Layout, List, Mentions, Menu, PageHeader, Popconfirm, Popover, Progress, Radio, Rate, Result, Row, Segmented, Skeleton, Slider, Space, Spin, Statistic, Steps, Switch, Timeline, Tooltip, Transfer, Typography, Upload, notification } from 'antd';
51
48
  export { default as Button } from './es/button/button.js';
49
+ export { default as Input } from './es/input/input.js';
50
+ export { default as Form } from './es/form/form.js';
51
+ export { default as Modal } from './es/modal/modal.js';
52
52
  export { default as NotAuthPage } from './es/notauthpage/notAuthPage.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zmdms-webui",
3
- "version": "2.5.4",
3
+ "version": "2.5.6",
4
4
  "private": false,
5
5
  "main": "dist/index.es.js",
6
6
  "module": "dist/index.es.js",
@@ -20,9 +20,9 @@
20
20
  "print-js": ">=1.6.0",
21
21
  "react": ">=16.8.0",
22
22
  "react-dom": ">=16.8.0",
23
+ "react-draggable": ">=4.4.5",
23
24
  "react-resizable": "^3.0.5",
24
25
  "react-router-dom": ">=6",
25
- "react-draggable": ">=4.4.5",
26
26
  "zmdms-utils": ">=0.0.1"
27
27
  },
28
28
  "sideEffects": [
@@ -135,7 +135,7 @@
135
135
  "storybook": "^7.6.16",
136
136
  "typescript": "^4.9.5",
137
137
  "web-vitals": "^2.1.4",
138
- "zmdms-utils": "^0.0.73"
138
+ "zmdms-utils": "^0.0.83"
139
139
  },
140
140
  "resolutions": {
141
141
  "rc-virtual-list": "3.11.3"