@zat-design/sisyphus-react 3.13.1 → 3.13.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/index.esm.css +3 -0
  2. package/dist/less.esm.css +3 -0
  3. package/es/ProForm/components/render/RenderFields.js +5 -1
  4. package/es/ProForm/components/render/propsType.d.ts +6 -1
  5. package/es/ProForm/propsType.d.ts +4 -0
  6. package/es/ProForm/utils/processDependencies.d.ts +29 -0
  7. package/es/ProForm/utils/processDependencies.js +55 -0
  8. package/es/ProIcon/index.js +7 -4
  9. package/es/ProLayout/components/ProCollapse/index.js +2 -0
  10. package/es/ProStepTab/index.js +14 -10
  11. package/es/ProTable/components/RenderColumn/index.js +28 -25
  12. package/es/ProTable/style/index.less +3 -0
  13. package/es/ProTable/utils/index.d.ts +2 -6
  14. package/es/ProTable/utils/index.js +20 -14
  15. package/es/ProTooltip/index.d.ts +0 -1
  16. package/es/ProTooltip/index.js +48 -59
  17. package/es/ProTooltip/propsType.d.ts +4 -4
  18. package/es/utils/index.d.ts +8 -0
  19. package/es/utils/index.js +17 -0
  20. package/lib/ProForm/components/render/RenderFields.js +5 -1
  21. package/lib/ProForm/components/render/propsType.d.ts +6 -1
  22. package/lib/ProForm/propsType.d.ts +4 -0
  23. package/lib/ProForm/utils/processDependencies.d.ts +29 -0
  24. package/lib/ProForm/utils/processDependencies.js +63 -0
  25. package/lib/ProIcon/index.js +7 -4
  26. package/lib/ProLayout/components/ProCollapse/index.js +2 -0
  27. package/lib/ProStepTab/index.js +14 -10
  28. package/lib/ProTable/components/RenderColumn/index.js +26 -23
  29. package/lib/ProTable/style/index.less +3 -0
  30. package/lib/ProTable/utils/index.d.ts +2 -6
  31. package/lib/ProTable/utils/index.js +21 -15
  32. package/lib/ProTooltip/index.d.ts +0 -1
  33. package/lib/ProTooltip/index.js +47 -58
  34. package/lib/ProTooltip/propsType.d.ts +4 -4
  35. package/lib/utils/index.d.ts +8 -0
  36. package/lib/utils/index.js +18 -1
  37. package/package.json +1 -1
@@ -17,6 +17,7 @@ var componentMap = _interopRequireWildcard(require("../index"));
17
17
  var _utils = require("../../utils");
18
18
  var _useFieldProps = require("../../utils/useFieldProps");
19
19
  var _locale = _interopRequireDefault(require("../../../locale"));
20
+ var _processDependencies = _interopRequireDefault(require("../../utils/processDependencies"));
20
21
  var _excluded = ["show", "type", "viewRender", "viewType", "valueType", "formItemProps", "colProps", "formItemChildProps", "fieldProps", "onDiff", "clearNotShow", "required", "confirm", "desensitization", "span"];
21
22
  var RenderFields = function RenderFields(props) {
22
23
  var isView = props.isView,
@@ -88,10 +89,13 @@ var RenderFields = function RenderFields(props) {
88
89
  var component = column.component;
89
90
  var _isView = typeof column.isView === 'boolean' ? column.isView : isView;
90
91
  var defaultProps = (0, _getDefaultProps.getDefaultProps)(column);
92
+ // 处理dependencies,支持namesPaths格式
93
+ var processedDeps = (0, _processDependencies.default)(column.dependencies);
91
94
  // 允许formItem的属性放在column最外层 并优先级高于 formItemProps 内部参数
92
95
  var _formItemProps = (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, defaultProps), formItemProps), otherFormItemProps), {}, {
93
96
  required: columnRequired !== null && columnRequired !== void 0 ? columnRequired : required,
94
- clearNotShow: clearNotShow
97
+ clearNotShow: clearNotShow,
98
+ dependencies: processedDeps
95
99
  });
96
100
  _formItemProps.labelWidth = _formItemProps.labelWidth || labelWidth; // 接收Form中的labelWidth
97
101
  if (type && component) {
@@ -31,6 +31,7 @@ import type { GroupType as GroupCopyProps } from '../combination/Group/propsType
31
31
  import type { ProCollapseProps } from '../../../ProLayout/components/ProCollapse/PropTypes';
32
32
  import type { DistributiveOmit, DiffConfigType } from '../../propsType';
33
33
  import type { DiffOriginalParams } from '../../utils/diffOriginal';
34
+ import { NamePathsDependencyType } from '../../utils/processDependencies';
34
35
  type ValidateKey = keyof typeof validate;
35
36
  type RegExpKey = keyof typeof regExp;
36
37
  export interface ProRule extends Omit<RuleObject, 'type'> {
@@ -230,7 +231,11 @@ export interface ProFormColumn<Values = any> extends Omit<FormItemProps<Values>,
230
231
  /** 脱敏数据位置下标 */
231
232
  desensitization?: [number, number] | ReactiveFunction<Values, [number, number]>;
232
233
  }
233
- export type ProFormColumnType<T = any> = ProFormColumn<T> & ColumnTypeMap<T, 'ProForm'>;
234
+ export interface ProFormColumnWithExtendedDeps<Values = any> extends Omit<ProFormColumn<Values>, 'dependencies'> {
235
+ /** 表单项依赖关系,扩展支持namesPaths类型 */
236
+ dependencies?: NamePath[] | (NamePath | NamePathsDependencyType)[];
237
+ }
238
+ export type ProFormColumnType<T = any> = ProFormColumnWithExtendedDeps<T> & ColumnTypeMap<T, 'ProForm'>;
234
239
  /**
235
240
  * 表单渲染类型
236
241
  */
@@ -65,6 +65,10 @@ export interface ProFormType<Values = any> extends FormProps<Values> {
65
65
  /** 全局控制优先 */
66
66
  globalControl?: boolean;
67
67
  mode?: ModeEnum;
68
+ /**
69
+ * 如果有formKey,则会在全局中查找或创建表单实例
70
+ * 可以不需要手动传入form实例 且formKey的优先级高于form
71
+ */
68
72
  formKey?: string;
69
73
  /** 是否查看 */
70
74
  isView?: boolean;
@@ -0,0 +1,29 @@
1
+ import type { NamePath } from 'antd/es/form/interface';
2
+ /**
3
+ * 定义支持多字段依赖的类型
4
+ */
5
+ export interface NamePathsDependencyType {
6
+ type: 'namesPaths';
7
+ paths: NamePath[][];
8
+ }
9
+ /**
10
+ * dependencies支持的类型
11
+ */
12
+ export type Dependencies = NamePath[] | NamePathsDependencyType;
13
+ /**
14
+ * 处理表单依赖项
15
+ *
16
+ * 将常规的依赖项数组与namesPaths类型的依赖项进行处理
17
+ * 对于namesPaths类型,将其转换为特定格式的字符串:
18
+ * - 同一路径内的多级通过下划线(_)连接
19
+ * - 不同路径之间通过连字符(-)连接
20
+ *
21
+ * 例如:
22
+ * { type: 'namesPaths', paths: [['a', 'b'], ['c', 'd']] }
23
+ * 会被转换成: ['a_b-c_d']
24
+ *
25
+ * @param dependencies 依赖项配置
26
+ * @returns 处理后的依赖项数组
27
+ */
28
+ export declare function processDependencies(dependencies?: any): any;
29
+ export default processDependencies;
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ exports.processDependencies = processDependencies;
9
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
10
+ /**
11
+ * 处理表单依赖项
12
+ *
13
+ * 将常规的依赖项数组与namesPaths类型的依赖项进行处理
14
+ * 对于namesPaths类型,将其转换为特定格式的字符串:
15
+ * - 同一路径内的多级通过下划线(_)连接
16
+ * - 不同路径之间通过连字符(-)连接
17
+ *
18
+ * 例如:
19
+ * { type: 'namesPaths', paths: [['a', 'b'], ['c', 'd']] }
20
+ * 会被转换成: ['a_b-c_d']
21
+ *
22
+ * @param dependencies 依赖项配置
23
+ * @returns 处理后的依赖项数组
24
+ */
25
+ function processDependencies(dependencies) {
26
+ /**
27
+ * 1、没有 dependencies,直接返回
28
+ */
29
+ if (!dependencies) return undefined;
30
+ /**
31
+ * 2、如果是数组,处理可能包含多种类型的元素
32
+ */
33
+ if (Array.isArray(dependencies)) {
34
+ return dependencies.map(function (item) {
35
+ // 处理数组中的namesPaths类型元素
36
+ if ((0, _typeof2.default)(item) === 'object' && item !== null && 'type' in item && item.type === 'namesPaths') {
37
+ // 安全类型转换
38
+ var itemWithPaths = item;
39
+ var paths = itemWithPaths.paths;
40
+ return paths.map(function (path) {
41
+ return Array.isArray(path) ? path.join('_') : String(path);
42
+ }).join('-');
43
+ }
44
+ // 其他类型元素保持不变
45
+ return item;
46
+ });
47
+ }
48
+ /**
49
+ * 3、如果是单个namesPaths对象,转换为特定的字符串形式
50
+ * 例如:[['a','b','c'], ['a','b','d']] => 'a_b_c-a_b_d'
51
+ */
52
+ if ('type' in dependencies && dependencies.type === 'namesPaths') {
53
+ var paths = dependencies.paths;
54
+ return [paths.map(function (path) {
55
+ return Array.isArray(path) ? path.join('_') : String(path);
56
+ }).join('-')];
57
+ }
58
+ /**
59
+ * 4、如果是普通的 dependencies,直接返回
60
+ */
61
+ return dependencies;
62
+ }
63
+ var _default = exports.default = processDependencies;
@@ -137,6 +137,9 @@ var ProIcon = function ProIcon(props) {
137
137
  }, rotateStyle), style)
138
138
  };
139
139
  var icon = !src ? (0, _jsxRuntime.jsx)("svg", (0, _objectSpread2.default)((0, _objectSpread2.default)({}, svgProps), {}, {
140
+ style: (0, _objectSpread2.default)({
141
+ color: color
142
+ }, svgProps === null || svgProps === void 0 ? void 0 : svgProps.style),
140
143
  onClick: onClick,
141
144
  "aria-hidden": "true",
142
145
  children: (0, _jsxRuntime.jsx)("use", {
@@ -153,13 +156,13 @@ var ProIcon = function ProIcon(props) {
153
156
  actionMap: actionMap,
154
157
  primaryColor: isQiankun ? qiankunPrimaryColor : primaryColor
155
158
  });
159
+ if (color) {
160
+ svg.setAttribute('fill', color);
161
+ }
156
162
  }
157
163
  }));
158
164
  var RenderIcon = (0, _jsxRuntime.jsx)("span", (0, _objectSpread2.default)((0, _objectSpread2.default)({
159
- className: "anticon",
160
- style: {
161
- color: color
162
- }
165
+ className: "anticon"
163
166
  }, reset), {}, {
164
167
  children: (0, _jsxRuntime.jsx)(_antd.Tooltip, {
165
168
  title: iconText,
@@ -141,6 +141,8 @@ var ProCollapse = function ProCollapse(props) {
141
141
  var rect = proCollapseNoTitles[0].getBoundingClientRect();
142
142
  if ((rect === null || rect === void 0 ? void 0 : rect.height) < window.innerHeight - rect.top) {
143
143
  proCollapseNoTitles[0].style.minHeight = "calc(100vh - ".concat(rect.top + 16, "px)");
144
+ } else {
145
+ proCollapseNoTitles[0].style.minHeight = 'auto';
144
146
  }
145
147
  if (proFooterNode) {
146
148
  proCollapseNoTitles[0].style.minHeight = "calc(100vh - ".concat(rect.top + proFooterNode.offsetHeight + 16, "px)");
@@ -257,7 +257,7 @@ function useStepTab() {
257
257
  case 0:
258
258
  handler = handlesState[activeKey];
259
259
  if (!handler) {
260
- _context4.next = 14;
260
+ _context4.next = 15;
261
261
  break;
262
262
  }
263
263
  _context4.next = 4;
@@ -265,29 +265,33 @@ function useStepTab() {
265
265
  case 4:
266
266
  result = _context4.sent;
267
267
  if (!(result && autoNext)) {
268
- _context4.next = 11;
268
+ _context4.next = 12;
269
269
  break;
270
270
  }
271
271
  // 只有当activeKey能转换为数字时才执行自动跳转
272
272
  currentKeyNum = Number(activeKey);
273
273
  if ((0, _lodash.isNaN)(currentKeyNum)) {
274
- _context4.next = 11;
274
+ _context4.next = 12;
275
275
  break;
276
276
  }
277
- nextKey = String(currentKeyNum + 1); // 自动跳转到下一个tab
278
- _context4.next = 11;
277
+ nextKey = String(currentKeyNum + 1);
278
+ if (Number(nextKey) > queueSteps) {
279
+ nextKey = String(queueSteps);
280
+ }
281
+ // 自动跳转到下一个tab
282
+ _context4.next = 12;
279
283
  return setCheckActiveKey(nextKey, false);
280
- case 11:
284
+ case 12:
281
285
  if (!(result === false)) {
282
- _context4.next = 13;
286
+ _context4.next = 14;
283
287
  break;
284
288
  }
285
289
  return _context4.abrupt("return", Promise.reject());
286
- case 13:
287
- return _context4.abrupt("return", result);
288
290
  case 14:
289
- return _context4.abrupt("return", Promise.resolve(true));
291
+ return _context4.abrupt("return", result);
290
292
  case 15:
293
+ return _context4.abrupt("return", Promise.resolve(true));
294
+ case 16:
291
295
  case "end":
292
296
  return _context4.stop();
293
297
  }
@@ -8,6 +8,7 @@ exports.default = void 0;
8
8
  var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
9
9
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
10
  var _jsxRuntime = require("react/jsx-runtime");
11
+ var _react = require("react");
11
12
  var _antd = require("antd");
12
13
  var _ahooks = require("ahooks");
13
14
  var _lodash = require("lodash");
@@ -34,35 +35,33 @@ var RenderColumn = function RenderColumn(props) {
34
35
  minWidth = props.minWidth,
35
36
  isInNewRowFlag = props.isInNewRowFlag,
36
37
  scroll = props.scroll;
38
+ var textRef = (0, _react.useRef)(null);
37
39
  var _useSetState = (0, _ahooks.useSetState)({
38
40
  tooltip: false
39
41
  }),
40
42
  _useSetState2 = (0, _slicedToArray2.default)(_useSetState, 2),
41
43
  tooltip = _useSetState2[0].tooltip,
42
44
  setState = _useSetState2[1];
45
+ // 计算并更新宽度
46
+ var updateCalculatedWidth = function updateCalculatedWidth(element) {
47
+ if (!element) return null;
48
+ if (!textRef.current) return;
49
+ // 使用closest方法查找最近的tr
50
+ var tr = element.closest('tr');
51
+ if (!tr) return;
52
+ // 获取tr的宽度
53
+ var trWidth = tr.getBoundingClientRect().width;
54
+ // 计算实际宽度
55
+ var newWidth = (0, _utils.parseWidth)(width, trWidth);
56
+ return newWidth;
57
+ };
43
58
  var cellDiffCls = (0, _classnames.default)({
44
59
  'varied-cell': props === null || props === void 0 ? void 0 : props.isChanged,
45
60
  'add-cell': props === null || props === void 0 ? void 0 : props.isAddCell
46
61
  });
47
- var checkEllipsis = function checkEllipsis(box) {
48
- var range = document.createRange();
49
- range.setStart(box, 0);
50
- range.setEnd(box, box.childNodes.length);
51
- var rangeWidth = range.getBoundingClientRect().width;
52
- var _getPadding = (0, _utils.getPadding)(box),
53
- pLeft = _getPadding.pLeft,
54
- pRight = _getPadding.pRight,
55
- pTop = _getPadding.pTop,
56
- pBottom = _getPadding.pBottom;
57
- var horizontalPadding = pLeft + pRight;
58
- if (rangeWidth + horizontalPadding > box.clientWidth) {
59
- return true;
60
- }
61
- return false;
62
- };
63
62
  var handleMouseOver = function handleMouseOver(e) {
64
63
  setState({
65
- tooltip: checkEllipsis(e.target)
64
+ tooltip: (0, _utils2.isEllipsisActive)(e.target)
66
65
  });
67
66
  };
68
67
  var tooltipProps = (0, _objectSpread2.default)({
@@ -135,6 +134,7 @@ var RenderColumn = function RenderColumn(props) {
135
134
  minWidth: minWidth
136
135
  },
137
136
  overlayClassName: "original-value-tooltip",
137
+ destroyTooltipOnHide: true,
138
138
  placement: "topLeft",
139
139
  autoAdjustOverflow: false,
140
140
  title: (0, _jsxRuntime.jsx)(_antd.Space, {
@@ -152,10 +152,7 @@ var RenderColumn = function RenderColumn(props) {
152
152
  }) : null
153
153
  })]
154
154
  }) : node
155
- }),
156
- getPopupContainer: function getPopupContainer(triggerNode) {
157
- return triggerNode.parentNode;
158
- }
155
+ })
159
156
  }, toolTipProps), {}, {
160
157
  children: renderNode
161
158
  }));
@@ -200,18 +197,24 @@ var RenderColumn = function RenderColumn(props) {
200
197
  children: "-"
201
198
  });
202
199
  }
200
+ var calculatedWidth = updateCalculatedWidth(textRef.current);
203
201
  return (0, _jsxRuntime.jsx)(_antd.Tooltip, (0, _objectSpread2.default)((0, _objectSpread2.default)({
204
202
  title: value,
205
- onOpenChange: function onOpenChange(open) {
203
+ destroyTooltipOnHide: true,
204
+ onOpenChange: function onOpenChange() {
206
205
  setState({
207
206
  tooltip: false
208
207
  });
209
208
  },
210
209
  open: tooltip
211
210
  }, tooltipProps), {}, {
211
+ getPopupContainer: function getPopupContainer() {
212
+ return document.body;
213
+ },
212
214
  children: (0, _jsxRuntime.jsx)(Text, {
215
+ ref: textRef,
213
216
  style: {
214
- width: width,
217
+ width: calculatedWidth,
215
218
  minWidth: minWidth
216
219
  },
217
220
  ellipsis: true,
@@ -28,6 +28,9 @@
28
28
 
29
29
  .@{ant-prefix}-table-content {
30
30
  > table {
31
+ .@{ant-prefix}-table-cell-fix-left-last:after{
32
+ width: 8px;
33
+ }
31
34
  .@{ant-prefix}-table-summary {
32
35
  color: var(--zaui-text, #343434);
33
36
  font-weight: 600;
@@ -33,11 +33,7 @@ export declare const getRowKey: (rowKey: any, record: any) => any;
33
33
  export declare const removeEmptyKeys: (obj?: Record<string, any>) => {
34
34
  [k: string]: any;
35
35
  };
36
- export declare const getPadding: (el: HTMLElement) => {
37
- pLeft: number;
38
- pRight: number;
39
- pTop: number;
40
- pBottom: number;
41
- };
42
36
  /** 判断是有值的对象 */
43
37
  export declare const isNonEmptyObject: (obj: any) => obj is Record<string, any>;
38
+ /** 解析宽度值 */
39
+ export declare const parseWidth: (widthValue: number | string | undefined, trWidth: number) => number;
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.removeEmptyKeys = exports.isNonEmptyObject = exports.isListResult = exports.getRowKey = exports.getPadding = exports.getOriginalValue = exports.getDecimalDigits = exports.getColumnDataIndex = void 0;
7
+ exports.removeEmptyKeys = exports.parseWidth = exports.isNonEmptyObject = exports.isListResult = exports.getRowKey = exports.getOriginalValue = exports.getDecimalDigits = exports.getColumnDataIndex = void 0;
8
8
  var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
9
9
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
10
  var _lodash = require("lodash");
@@ -95,21 +95,27 @@ var removeEmptyKeys = exports.removeEmptyKeys = function removeEmptyKeys(obj) {
95
95
  // 使用 Object.fromEntries() 将过滤后的键值对数组转换回对象
96
96
  return Object.fromEntries(filteredEntries);
97
97
  };
98
- /* 获取边距 */
99
- var getPadding = exports.getPadding = function getPadding(el) {
100
- var style = window.getComputedStyle(el, null);
101
- var paddingLeft = Number.parseInt(style.paddingLeft, 10) || 0;
102
- var paddingRight = Number.parseInt(style.paddingRight, 10) || 0;
103
- var paddingTop = Number.parseInt(style.paddingTop, 10) || 0;
104
- var paddingBottom = Number.parseInt(style.paddingBottom, 10) || 0;
105
- return {
106
- pLeft: paddingLeft,
107
- pRight: paddingRight,
108
- pTop: paddingTop,
109
- pBottom: paddingBottom
110
- };
111
- };
112
98
  /** 判断是有值的对象 */
113
99
  var isNonEmptyObject = exports.isNonEmptyObject = function isNonEmptyObject(obj) {
114
100
  return obj !== null && (0, _typeof2.default)(obj) === 'object' && !Array.isArray(obj) && Object.keys(obj).length > 0;
101
+ };
102
+ /** 解析宽度值 */
103
+ var parseWidth = exports.parseWidth = function parseWidth(widthValue, trWidth) {
104
+ // 如果是数字,直接返回
105
+ if (typeof widthValue === 'number') return widthValue;
106
+ // 如果是字符串,检查是否是百分比
107
+ if (typeof widthValue === 'string') {
108
+ if (widthValue.endsWith('%')) {
109
+ // 计算百分比
110
+ var percentage = parseFloat(widthValue) / 100;
111
+ return Math.max(trWidth * percentage, 0);
112
+ }
113
+ // 尝试解析为数字(处理如'300px'这样的情况)
114
+ var numericValue = parseFloat(widthValue);
115
+ if (!Number.isNaN(numericValue)) {
116
+ return numericValue;
117
+ }
118
+ }
119
+ // 所有其他情况,返回默认值
120
+ return null;
115
121
  };
@@ -1,4 +1,3 @@
1
1
  import type { ProTooltipType } from './propsType';
2
- import './style/index.less';
3
2
  declare const ProTooltip: (props: ProTooltipType) => import("react/jsx-runtime").JSX.Element;
4
3
  export default ProTooltip;
@@ -14,28 +14,27 @@ var _ahooks = require("ahooks");
14
14
  var _antd = require("antd");
15
15
  var _react = require("react");
16
16
  var _classnames2 = _interopRequireDefault(require("classnames"));
17
- require("./style/index.less");
18
- var _excluded = ["text", "mode", "width", "line", "isResponsiveWidth", "className", "style", "lineHeight"];
17
+ var _utils = require("../utils");
18
+ var _excluded = ["text", "mode", "width", "line", "className", "style", "lineHeight", "scrollFollowParent"];
19
19
  var ProTooltip = function ProTooltip(props) {
20
- var _useSize;
20
+ var _useSize, _parentElement$tagNam;
21
21
  var ref = (0, _react.useRef)();
22
22
  var childRef = (0, _react.useRef)();
23
23
  var contentWrapRef = (0, _react.useRef)();
24
24
  var text = props.text,
25
25
  _props$mode = props.mode,
26
26
  mode = _props$mode === void 0 ? 'default' : _props$mode,
27
- _props$width = props.width,
28
- width = _props$width === void 0 ? '120px' : _props$width,
27
+ width = props.width,
29
28
  _props$line = props.line,
30
29
  line = _props$line === void 0 ? 1 : _props$line,
31
- _props$isResponsiveWi = props.isResponsiveWidth,
32
- isResponsiveWidth = _props$isResponsiveWi === void 0 ? false : _props$isResponsiveWi,
33
30
  _props$className = props.className,
34
31
  className = _props$className === void 0 ? '' : _props$className,
35
32
  _props$style = props.style,
36
33
  style = _props$style === void 0 ? {} : _props$style,
37
34
  _props$lineHeight = props.lineHeight,
38
35
  lineHeight = _props$lineHeight === void 0 ? 22 : _props$lineHeight,
36
+ _props$scrollFollowPa = props.scrollFollowParent,
37
+ scrollFollowParent = _props$scrollFollowPa === void 0 ? true : _props$scrollFollowPa,
39
38
  restProps = (0, _objectWithoutProperties2.default)(props, _excluded);
40
39
  var _width = mode === 'auto' ? 'auto' : width;
41
40
  var content = text !== null && text !== void 0 ? text : '-';
@@ -65,6 +64,7 @@ var ProTooltip = function ProTooltip(props) {
65
64
  });
66
65
  var _ref = (_useSize = (0, _ahooks.useSize)(localElement)) !== null && _useSize !== void 0 ? _useSize : {},
67
66
  _localSizeWidth = _ref.width;
67
+ var isTable = (parentElement === null || parentElement === void 0 ? void 0 : (_parentElement$tagNam = parentElement.tagName) === null || _parentElement$tagNam === void 0 ? void 0 : _parentElement$tagNam.toLowerCase()) === 'td';
68
68
  var overlayStyle = mode === 'auto' ? {
69
69
  maxWidth: _localSizeWidth
70
70
  } : {};
@@ -147,23 +147,6 @@ var ProTooltip = function ProTooltip(props) {
147
147
  }
148
148
  return line > 1 ? (0, _jsxRuntime.jsx)(AutoMixinMulti, {}) : (0, _jsxRuntime.jsx)(AutoMixinSingle, {});
149
149
  };
150
- (0, _ahooks.useDebounceEffect)(function () {
151
- if (isResponsiveWidth && parentElement) {
152
- var cWidth = parentElement.clientWidth - 32;
153
- var contentDom = childRef.current;
154
- setState({
155
- isShowToolTip: contentDom.scrollWidth > contentDom.offsetWidth,
156
- localWidth: cWidth
157
- });
158
- }
159
- if (!isResponsiveWidth) {
160
- setState({
161
- localWidth: _width
162
- });
163
- }
164
- }, [isResponsiveWidth, size], {
165
- wait: 300
166
- });
167
150
  (0, _react.useEffect)(function () {
168
151
  if (mode === 'auto' && line === 1) {
169
152
  var localDom = ref.current;
@@ -243,57 +226,63 @@ var ProTooltip = function ProTooltip(props) {
243
226
  }, [debouncedValue]);
244
227
  (0, _react.useEffect)(function () {
245
228
  var localDom = ref.current;
246
- var contentDom = childRef.current;
229
+ var isEllipsis = (0, _utils.isEllipsisActive)(childRef === null || childRef === void 0 ? void 0 : childRef.current);
247
230
  setState({
248
231
  parentElement: localDom.parentElement,
249
- isShowToolTip: contentDom.scrollWidth > contentDom.offsetWidth
232
+ isShowToolTip: isEllipsis
250
233
  });
251
234
  }, []);
252
235
  var cls = (0, _classnames2.default)((0, _defineProperty2.default)({
253
236
  'pro-tooltip': true
254
237
  }, "".concat(className), className));
255
- return (0, _jsxRuntime.jsx)("div", {
256
- className: cls,
257
- ref: ref,
258
- style: (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, style), multiStyle), {}, {
259
- width: localWidth
260
- }),
261
- children: isResponsiveWidth && isShowToolTip ? (0, _jsxRuntime.jsx)(_antd.Tooltip, (0, _objectSpread2.default)((0, _objectSpread2.default)({
262
- title: text,
263
- getPopupContainer: function getPopupContainer(triggerNode) {
264
- return triggerNode.parentNode;
265
- }
266
- }, restProps), {}, {
267
- children: (0, _jsxRuntime.jsx)("div", {
268
- className: isMultiLine ? 'multiLine' : 'singleLine',
269
- style: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, multiStyle), {}, {
270
- width: localWidth
271
- }),
272
- ref: childRef,
273
- children: content
274
- })
275
- })) : isResponsiveWidth ? (0, _jsxRuntime.jsx)("div", {
238
+ var renderContentBox = function renderContentBox() {
239
+ return (0, _jsxRuntime.jsx)("div", {
276
240
  className: isMultiLine ? 'multiLine' : 'singleLine',
277
241
  style: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, multiStyle), {}, {
278
242
  width: localWidth
279
243
  }),
280
244
  ref: childRef,
281
245
  children: content
282
- }) : mode === 'default' ? (0, _jsxRuntime.jsx)(_antd.Tooltip, (0, _objectSpread2.default)((0, _objectSpread2.default)({
246
+ });
247
+ };
248
+ var renderTooltipContent = function renderTooltipContent() {
249
+ return (0, _jsxRuntime.jsx)(_antd.Tooltip, (0, _objectSpread2.default)((0, _objectSpread2.default)({
283
250
  title: text,
284
251
  getPopupContainer: function getPopupContainer(triggerNode) {
285
- return triggerNode.parentNode;
252
+ // 修复scrollFollowParent为false时tooltip不显示的问题
253
+ // 当scrollFollowParent为false时,应该返回document.body而不是triggerNode本身
254
+ return scrollFollowParent ? triggerNode.parentNode : document.body;
286
255
  }
287
256
  }, restProps), {}, {
288
- children: (0, _jsxRuntime.jsx)("div", {
289
- className: isMultiLine ? 'multiLine' : 'singleLine',
290
- style: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, multiStyle), {}, {
291
- width: localWidth
292
- }),
293
- ref: childRef,
294
- children: content
295
- })
296
- })) : (0, _jsxRuntime.jsx)(AutoMixin, {})
257
+ overlayStyle: mode === 'auto' ? overlayStyle : {},
258
+ children: renderContentBox()
259
+ }));
260
+ };
261
+ var renderContent = function renderContent() {
262
+ // 自动模式使用专门的渲染逻辑
263
+ if (mode === 'auto') {
264
+ return (0, _jsxRuntime.jsx)(AutoMixin, {});
265
+ }
266
+ // 响应式宽度模式,根据是否需要显示tooltip决定渲染内容 且 父元素为table
267
+ if (isTable) {
268
+ if (isShowToolTip) {
269
+ return renderTooltipContent();
270
+ }
271
+ return renderContentBox();
272
+ }
273
+ // 默认模式始终显示tooltip
274
+ if (mode === 'default') {
275
+ return renderTooltipContent();
276
+ }
277
+ return renderContentBox();
278
+ };
279
+ return (0, _jsxRuntime.jsx)("div", {
280
+ className: cls,
281
+ ref: ref,
282
+ style: (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, style), multiStyle), {}, {
283
+ width: localWidth
284
+ }),
285
+ children: renderContent()
297
286
  });
298
287
  };
299
288
  var _default = exports.default = ProTooltip;
@@ -19,11 +19,11 @@ export interface ProTooltipType {
19
19
  */
20
20
  line?: number;
21
21
  /**
22
- * 是否响应式宽度
23
- * @description 启用后提示框宽度将根据内容自适应
24
- * @default false
22
+ * 是否跟随父元素滚动
23
+ * @description 启用后,提示框将跟随父元素滚动
24
+ * @default true
25
25
  */
26
- isResponsiveWidth?: Boolean;
26
+ scrollFollowParent?: boolean;
27
27
  /**
28
28
  * 自定义类名
29
29
  * @description 额外的CSS类名
@@ -3,4 +3,12 @@
3
3
  * 空值 或者 仅包含空值的数组视为空
4
4
  */
5
5
  export declare const isEmpty: (value: any, emptyValue?: string) => boolean;
6
+ /**
7
+ * 判断一个元素是否触发了省略号(文本溢出)
8
+ * 如果元素设置为单行(white-space: nowrap)则比较 scrollWidth 与 clientWidth,
9
+ * 如果是多行文本(例如使用 -webkit-line-clamp 实现多行截断)则比较 scrollHeight 与 clientHeight。
10
+ * @param {HTMLElement} element 要检测的元素
11
+ * @returns {boolean} 如果内容溢出返回 true,否则返回 false
12
+ */
13
+ export declare const isEllipsisActive: (element: Element) => boolean;
6
14
  export declare const useFocus: (element: Element) => boolean;
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.useFocus = exports.isEmpty = void 0;
7
+ exports.useFocus = exports.isEmpty = exports.isEllipsisActive = void 0;
8
8
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
9
9
  var _react = require("react");
10
10
  var EMPTY_VALUE = [undefined, null, ''];
@@ -26,6 +26,23 @@ var isEmpty = exports.isEmpty = function isEmpty(value, emptyValue) {
26
26
  }
27
27
  return false;
28
28
  };
29
+ /**
30
+ * 判断一个元素是否触发了省略号(文本溢出)
31
+ * 如果元素设置为单行(white-space: nowrap)则比较 scrollWidth 与 clientWidth,
32
+ * 如果是多行文本(例如使用 -webkit-line-clamp 实现多行截断)则比较 scrollHeight 与 clientHeight。
33
+ * @param {HTMLElement} element 要检测的元素
34
+ * @returns {boolean} 如果内容溢出返回 true,否则返回 false
35
+ */
36
+ var isEllipsisActive = exports.isEllipsisActive = function isEllipsisActive(element) {
37
+ if (!element) return false;
38
+ var computedStyle = window.getComputedStyle(element);
39
+ // 如果使用单行显示(nowrap),则判断宽度是否足够
40
+ if (computedStyle.whiteSpace === 'nowrap') {
41
+ return element.scrollWidth > element.clientWidth;
42
+ }
43
+ // 多行情况下,判断高度是否足够
44
+ return element.scrollHeight > element.clientHeight;
45
+ };
29
46
  var useFocus = exports.useFocus = function useFocus(element) {
30
47
  var _useState = (0, _react.useState)(false),
31
48
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),