@douyinfe/semi-ui 2.48.0 → 2.49.0

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 (91) hide show
  1. package/dist/css/semi.css +4 -0
  2. package/dist/css/semi.min.css +1 -1
  3. package/dist/umd/semi-ui.js +319 -293
  4. package/dist/umd/semi-ui.js.map +1 -1
  5. package/dist/umd/semi-ui.min.js +1 -1
  6. package/dist/umd/semi-ui.min.js.map +1 -1
  7. package/lib/cjs/banner/index.d.ts +2 -2
  8. package/lib/cjs/banner/index.js +2 -2
  9. package/lib/cjs/breadcrumb/item.d.ts +1 -1
  10. package/lib/cjs/breadcrumb/item.js +1 -1
  11. package/lib/cjs/calendar/dayCalendar.d.ts +1 -0
  12. package/lib/cjs/calendar/dayCalendar.js +4 -1
  13. package/lib/cjs/calendar/dayCol.d.ts +2 -0
  14. package/lib/cjs/calendar/dayCol.js +6 -6
  15. package/lib/cjs/calendar/index.d.ts +1 -0
  16. package/lib/cjs/calendar/index.js +1 -0
  17. package/lib/cjs/calendar/interface.d.ts +2 -1
  18. package/lib/cjs/calendar/rangeCalendar.js +4 -2
  19. package/lib/cjs/calendar/weekCalendar.js +4 -2
  20. package/lib/cjs/image/interface.d.ts +3 -3
  21. package/lib/cjs/image/previewFooter.js +5 -8
  22. package/lib/cjs/image/previewHeader.d.ts +2 -2
  23. package/lib/cjs/image/previewHeader.js +9 -8
  24. package/lib/cjs/image/previewImage.d.ts +1 -12
  25. package/lib/cjs/image/previewImage.js +23 -83
  26. package/lib/cjs/image/previewInner.d.ts +11 -2
  27. package/lib/cjs/image/previewInner.js +60 -42
  28. package/lib/cjs/modal/Modal.d.ts +1 -1
  29. package/lib/cjs/modal/Modal.js +1 -1
  30. package/lib/cjs/navigation/SubNav.d.ts +1 -1
  31. package/lib/cjs/navigation/SubNav.js +1 -1
  32. package/lib/cjs/popconfirm/index.d.ts +1 -1
  33. package/lib/cjs/popconfirm/index.js +1 -1
  34. package/lib/cjs/sideSheet/SideSheetContent.d.ts +3 -1
  35. package/lib/cjs/sideSheet/SideSheetContent.js +6 -3
  36. package/lib/cjs/table/Body/BaseRow.d.ts +3 -0
  37. package/lib/cjs/table/Body/BaseRow.js +4 -1
  38. package/lib/cjs/table/Body/ExpandedRow.d.ts +1 -0
  39. package/lib/cjs/table/Body/ExpandedRow.js +4 -2
  40. package/lib/cjs/table/Body/index.d.ts +3 -0
  41. package/lib/cjs/table/Body/index.js +18 -10
  42. package/lib/cjs/table/interface.d.ts +1 -0
  43. package/lib/cjs/timePicker/TimePicker.d.ts +3 -0
  44. package/lib/cjs/timePicker/TimePicker.js +7 -3
  45. package/lib/cjs/timePicker/index.d.ts +2 -0
  46. package/lib/cjs/toast/toast.d.ts +1 -1
  47. package/lib/cjs/toast/toast.js +1 -1
  48. package/lib/cjs/typography/util.js +5 -6
  49. package/lib/es/banner/index.d.ts +2 -2
  50. package/lib/es/banner/index.js +2 -2
  51. package/lib/es/breadcrumb/item.d.ts +1 -1
  52. package/lib/es/breadcrumb/item.js +1 -1
  53. package/lib/es/calendar/dayCalendar.d.ts +1 -0
  54. package/lib/es/calendar/dayCalendar.js +4 -1
  55. package/lib/es/calendar/dayCol.d.ts +2 -0
  56. package/lib/es/calendar/dayCol.js +6 -6
  57. package/lib/es/calendar/index.d.ts +1 -0
  58. package/lib/es/calendar/index.js +1 -0
  59. package/lib/es/calendar/interface.d.ts +2 -1
  60. package/lib/es/calendar/rangeCalendar.js +4 -2
  61. package/lib/es/calendar/weekCalendar.js +4 -2
  62. package/lib/es/image/interface.d.ts +3 -3
  63. package/lib/es/image/previewFooter.js +5 -8
  64. package/lib/es/image/previewHeader.d.ts +2 -2
  65. package/lib/es/image/previewHeader.js +4 -3
  66. package/lib/es/image/previewImage.d.ts +1 -12
  67. package/lib/es/image/previewImage.js +23 -83
  68. package/lib/es/image/previewInner.d.ts +11 -2
  69. package/lib/es/image/previewInner.js +60 -42
  70. package/lib/es/modal/Modal.d.ts +1 -1
  71. package/lib/es/modal/Modal.js +1 -1
  72. package/lib/es/navigation/SubNav.d.ts +1 -1
  73. package/lib/es/navigation/SubNav.js +1 -1
  74. package/lib/es/popconfirm/index.d.ts +1 -1
  75. package/lib/es/popconfirm/index.js +1 -1
  76. package/lib/es/sideSheet/SideSheetContent.d.ts +3 -1
  77. package/lib/es/sideSheet/SideSheetContent.js +6 -3
  78. package/lib/es/table/Body/BaseRow.d.ts +3 -0
  79. package/lib/es/table/Body/BaseRow.js +4 -1
  80. package/lib/es/table/Body/ExpandedRow.d.ts +1 -0
  81. package/lib/es/table/Body/ExpandedRow.js +4 -2
  82. package/lib/es/table/Body/index.d.ts +3 -0
  83. package/lib/es/table/Body/index.js +18 -10
  84. package/lib/es/table/interface.d.ts +1 -0
  85. package/lib/es/timePicker/TimePicker.d.ts +3 -0
  86. package/lib/es/timePicker/TimePicker.js +7 -3
  87. package/lib/es/timePicker/index.d.ts +2 -0
  88. package/lib/es/toast/toast.d.ts +1 -1
  89. package/lib/es/toast/toast.js +1 -1
  90. package/lib/es/typography/util.js +5 -6
  91. package/package.json +8 -8
@@ -21,14 +21,6 @@ var _previewContext = require("./previewContext");
21
21
  var _utils = require("../_utils");
22
22
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
23
  const prefixCls = _constants.cssClasses.PREFIX;
24
- let startMouseDown = {
25
- x: 0,
26
- y: 0
27
- };
28
- let mouseActiveTime = null;
29
- let stopTiming = false;
30
- let timer = null;
31
- // let bodyOverflowValue = document.body.style.overflow;
32
24
  class PreviewInner extends _baseComponent.default {
33
25
  get adapter() {
34
26
  return Object.assign(Object.assign({}, super.adapter), {
@@ -112,30 +104,22 @@ class PreviewInner extends _baseComponent.default {
112
104
  unregisterKeyDownListener: () => {
113
105
  window && window.removeEventListener("keydown", this.handleKeyDown);
114
106
  },
115
- getMouseActiveTime: () => {
116
- return mouseActiveTime;
117
- },
118
- getStopTiming: () => {
119
- return stopTiming;
120
- },
121
- setStopTiming: value => {
122
- stopTiming = value;
123
- },
124
- getStartMouseDown: () => {
125
- return startMouseDown;
126
- },
127
- setStartMouseDown: (x, y) => {
128
- startMouseDown = {
129
- x,
130
- y
131
- };
132
- },
133
- setMouseActiveTime: time => {
134
- mouseActiveTime = time;
135
- },
136
107
  getSetDownloadFunc: () => {
137
108
  var _a, _b;
138
109
  return (_b = (_a = this.context) === null || _a === void 0 ? void 0 : _a.setDownloadName) !== null && _b !== void 0 ? _b : this.props.setDownloadName;
110
+ },
111
+ isValidTarget: e => {
112
+ const headerDom = this.headerRef && this.headerRef.current;
113
+ const footerDom = this.footerRef && this.footerRef.current;
114
+ const leftIconDom = this.leftIconRef && this.leftIconRef.current;
115
+ const rightIconDom = this.rightIconRef && this.rightIconRef.current;
116
+ const target = e.target;
117
+ if (headerDom && headerDom.contains(target) || footerDom && footerDom.contains(target) || leftIconDom && leftIconDom.contains(target) || rightIconDom && rightIconDom.contains(target)) {
118
+ // Move in the operation area, return false
119
+ return false;
120
+ }
121
+ // Move in the preview area except the operation area, return true
122
+ return true;
139
123
  }
140
124
  });
141
125
  }
@@ -168,9 +152,6 @@ class PreviewInner extends _baseComponent.default {
168
152
  this.handleMouseMove = e => {
169
153
  this.foundation.handleMouseMove(e);
170
154
  };
171
- this.handleMouseEvent = (e, event) => {
172
- this.foundation.handleMouseMoveEvent(e, event);
173
- };
174
155
  this.handleKeyDown = e => {
175
156
  this.foundation.handleKeyDown(e);
176
157
  };
@@ -183,6 +164,31 @@ class PreviewInner extends _baseComponent.default {
183
164
  this.handleMouseDown = e => {
184
165
  this.foundation.handleMouseDown(e);
185
166
  };
167
+ this.handleWheel = e => {
168
+ this.foundation.handleWheel(e);
169
+ };
170
+ // 为什么通过 addEventListener 注册 wheel 事件而不是使用 onWheel 事件?
171
+ // 因为 Passive Event Listeners(https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#improving_scrolling_performance_with_passive_listeners)
172
+ // Passive Event Listeners 是一种优化技术,用于提高滚动性能。在默认情况下,浏览器会假设事件的监听器不会调用
173
+ // preventDefault() 方法来阻止事件的默认行为,从而允许进行一些优化操作,例如滚动平滑。
174
+ // 对于 Image 而言,如果使用触控板,双指朝不同方向分开放大图片,则需要 preventDefault 防止页面整体放大。
175
+ // Why register wheel event through addEventListener instead of using onWheel event?
176
+ // Because of Passive Event Listeners(an optimization technique used to improve scrolling performance. By default,
177
+ // the browser will assume that event listeners will not call preventDefault() method to prevent the default behavior of the event,
178
+ // allowing some optimization operations such as scroll smoothing.)
179
+ // For Image, if we use the trackpad and spread your fingers in different directions to enlarge the image, we need to preventDefault
180
+ // to prevent the page from being enlarged as a whole.
181
+ this.registryImageWrapRef = ref => {
182
+ if (this.imageWrapRef) {
183
+ this.imageWrapRef.removeEventListener("wheel", this.handleWheel);
184
+ }
185
+ if (ref) {
186
+ ref.addEventListener("wheel", this.handleWheel, {
187
+ passive: false
188
+ });
189
+ }
190
+ this.imageWrapRef = ref;
191
+ };
186
192
  this.state = {
187
193
  imgSrc: [],
188
194
  imgLoadStatus: new Map(),
@@ -199,6 +205,11 @@ class PreviewInner extends _baseComponent.default {
199
205
  this.bodyOverflow = '';
200
206
  this.originBodyWidth = '100%';
201
207
  this.scrollBarWidth = 0;
208
+ this.imageWrapRef = null;
209
+ this.headerRef = /*#__PURE__*/_react.default.createRef();
210
+ this.footerRef = /*#__PURE__*/_react.default.createRef();
211
+ this.leftIconRef = /*#__PURE__*/_react.default.createRef();
212
+ this.rightIconRef = /*#__PURE__*/_react.default.createRef();
202
213
  }
203
214
  static getDerivedStateFromProps(props, state) {
204
215
  const willUpdateStates = {};
@@ -214,6 +225,9 @@ class PreviewInner extends _baseComponent.default {
214
225
  willUpdateStates.visible = props.visible;
215
226
  if (props.visible) {
216
227
  willUpdateStates.preloadAfterVisibleChange = true;
228
+ willUpdateStates.viewerVisible = true;
229
+ willUpdateStates.rotation = 0;
230
+ willUpdateStates.ratio = 'adaptation';
217
231
  }
218
232
  }
219
233
  if ("currentIndex" in props && props.currentIndex !== state.currentIndex) {
@@ -232,10 +246,8 @@ class PreviewInner extends _baseComponent.default {
232
246
  }
233
247
  }
234
248
  componentDidUpdate(prevProps, prevState) {
235
- if (prevState.visible !== this.props.visible && this.props.visible) {
236
- mouseActiveTime = new Date().getTime();
237
- timer && clearInterval(timer);
238
- timer = setInterval(this.viewVisibleChange, 1000);
249
+ if (prevProps.src !== this.props.src) {
250
+ this.foundation.updateTimer();
239
251
  }
240
252
  // hide => show
241
253
  if (!prevProps.visible && this.props.visible) {
@@ -247,7 +259,7 @@ class PreviewInner extends _baseComponent.default {
247
259
  }
248
260
  }
249
261
  componentWillUnmount() {
250
- timer && clearInterval(timer);
262
+ this.foundation.clearTimer();
251
263
  }
252
264
  isInGroup() {
253
265
  return Boolean(this.context && this.context.isGroup);
@@ -312,10 +324,10 @@ class PreviewInner extends _baseComponent.default {
312
324
  style: style,
313
325
  onMouseDown: this.handleMouseDown,
314
326
  onMouseUp: this.handleMouseUp,
315
- onMouseMove: this.handleMouseMove,
316
- onMouseOver: e => this.handleMouseEvent(e.nativeEvent, "over"),
317
- onMouseOut: e => this.handleMouseEvent(e.nativeEvent, "out")
327
+ ref: this.registryImageWrapRef,
328
+ onMouseMove: this.handleMouseMove
318
329
  }, /*#__PURE__*/_react.default.createElement(_previewHeader.default, {
330
+ ref: this.headerRef,
319
331
  className: (0, _classnames.default)(hideViewerCls),
320
332
  onClose: this.handlePreviewClose,
321
333
  renderHeader: renderHeader
@@ -326,7 +338,6 @@ class PreviewInner extends _baseComponent.default {
326
338
  setRatio: this.handleAdjustRatio,
327
339
  zoom: zoom,
328
340
  ratio: ratio,
329
- zoomStep: zoomStep,
330
341
  rotation: rotation,
331
342
  crossOrigin: crossOrigin,
332
343
  onError: this.onImageError,
@@ -335,6 +346,7 @@ class PreviewInner extends _baseComponent.default {
335
346
  /*#__PURE__*/
336
347
  // eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions
337
348
  _react.default.createElement("div", {
349
+ ref: this.leftIconRef,
338
350
  className: (0, _classnames.default)(`${previewPrefixCls}-icon`, `${previewPrefixCls}-prev`, hideViewerCls),
339
351
  onClick: () => this.handleSwitchImage("prev")
340
352
  }, /*#__PURE__*/_react.default.createElement(_semiIcons.IconArrowLeft, {
@@ -343,11 +355,13 @@ class PreviewInner extends _baseComponent.default {
343
355
  /*#__PURE__*/
344
356
  // eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions
345
357
  _react.default.createElement("div", {
358
+ ref: this.rightIconRef,
346
359
  className: (0, _classnames.default)(`${previewPrefixCls}-icon`, `${previewPrefixCls}-next`, hideViewerCls),
347
360
  onClick: () => this.handleSwitchImage("next")
348
361
  }, /*#__PURE__*/_react.default.createElement(_semiIcons.IconArrowRight, {
349
362
  size: "large"
350
363
  })), /*#__PURE__*/_react.default.createElement(_previewFooter.default, {
364
+ forwardRef: this.footerRef,
351
365
  className: hideViewerCls,
352
366
  totalNum: total,
353
367
  curPage: currentIndex + 1,
@@ -406,6 +420,8 @@ PreviewInner.propTypes = {
406
420
  disableDownload: _propTypes.default.bool,
407
421
  viewerVisibleDelay: _propTypes.default.number,
408
422
  zIndex: _propTypes.default.number,
423
+ maxZoom: _propTypes.default.number,
424
+ minZoom: _propTypes.default.number,
409
425
  renderHeader: _propTypes.default.func,
410
426
  renderPreviewMenu: _propTypes.default.func,
411
427
  getPopupContainer: _propTypes.default.func,
@@ -430,5 +446,7 @@ PreviewInner.defaultProps = {
430
446
  preLoadGap: 2,
431
447
  zIndex: 1000,
432
448
  maskClosable: true,
433
- viewerVisibleDelay: 10000
449
+ viewerVisibleDelay: 10000,
450
+ maxZoom: 5,
451
+ minZoom: 0.1
434
452
  };
@@ -59,7 +59,7 @@ declare class Modal extends BaseComponent<ModalReactProps, ModalState> {
59
59
  getPopupContainer: PropTypes.Requireable<(...args: any[]) => any>;
60
60
  getContainerContext: PropTypes.Requireable<(...args: any[]) => any>;
61
61
  maskFixed: PropTypes.Requireable<boolean>;
62
- closeIcon: PropTypes.Requireable<NonNullable<PropTypes.ReactNodeLike>>;
62
+ closeIcon: PropTypes.Requireable<PropTypes.ReactNodeLike>;
63
63
  closeOnEsc: PropTypes.Requireable<boolean>;
64
64
  size: PropTypes.Requireable<string>;
65
65
  keepDOM: PropTypes.Requireable<boolean>;
@@ -303,7 +303,7 @@ Modal.propTypes = {
303
303
  getPopupContainer: _propTypes.default.func,
304
304
  getContainerContext: _propTypes.default.func,
305
305
  maskFixed: _propTypes.default.bool,
306
- closeIcon: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.node]),
306
+ closeIcon: _propTypes.default.node,
307
307
  closeOnEsc: _propTypes.default.bool,
308
308
  size: _propTypes.default.oneOf(_constants.strings.SIZE),
309
309
  keepDOM: _propTypes.default.bool,
@@ -53,7 +53,7 @@ export default class SubNav extends BaseComponent<SubNavProps, SubNavState> {
53
53
  /**
54
54
  * Icon name on the left
55
55
  */
56
- icon: PropTypes.Requireable<NonNullable<PropTypes.ReactNodeLike>>;
56
+ icon: PropTypes.Requireable<PropTypes.ReactNodeLike>;
57
57
  /**
58
58
  * Maximum height (for animation)
59
59
  */
@@ -354,7 +354,7 @@ SubNav.propTypes = {
354
354
  /**
355
355
  * Icon name on the left
356
356
  */
357
- icon: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.node]),
357
+ icon: _propTypes.default.node,
358
358
  /**
359
359
  * Maximum height (for animation)
360
360
  */
@@ -46,7 +46,7 @@ export default class Popconfirm extends BaseComponent<PopconfirmProps, Popconfir
46
46
  prefixCls: PropTypes.Requireable<string>;
47
47
  className: PropTypes.Requireable<string>;
48
48
  style: PropTypes.Requireable<object>;
49
- icon: PropTypes.Requireable<NonNullable<PropTypes.ReactNodeLike>>;
49
+ icon: PropTypes.Requireable<PropTypes.ReactNodeLike>;
50
50
  okText: PropTypes.Requireable<string>;
51
51
  okType: PropTypes.Requireable<string>;
52
52
  cancelText: PropTypes.Requireable<string>;
@@ -241,7 +241,7 @@ Popconfirm.propTypes = {
241
241
  prefixCls: _propTypes.default.string,
242
242
  className: _propTypes.default.string,
243
243
  style: _propTypes.default.object,
244
- icon: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.node]),
244
+ icon: _propTypes.default.node,
245
245
  okText: _propTypes.default.string,
246
246
  okType: _propTypes.default.string,
247
247
  cancelText: _propTypes.default.string,
@@ -1,8 +1,9 @@
1
- import React, { CSSProperties } from 'react';
1
+ import React, { CSSProperties, ReactNode } from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import { SideSheetProps } from '@douyinfe/semi-foundation/lib/cjs/sideSheet/sideSheetFoundation';
4
4
  export interface SideSheetContentProps {
5
5
  onClose?: (e: React.MouseEvent) => void;
6
+ closeIcon?: ReactNode;
6
7
  mask?: boolean;
7
8
  maskStyle?: CSSProperties;
8
9
  maskClosable?: boolean;
@@ -30,6 +31,7 @@ export interface SideSheetContentProps {
30
31
  export default class SideSheetContent extends React.PureComponent<SideSheetContentProps> {
31
32
  static propTypes: {
32
33
  onClose: PropTypes.Requireable<(...args: any[]) => any>;
34
+ closeIcon: PropTypes.Requireable<PropTypes.ReactNodeLike>;
33
35
  };
34
36
  static defaultProps: {
35
37
  onClose: (...args: any[]) => void;
@@ -66,7 +66,8 @@ class SideSheetContent extends _react.default.PureComponent {
66
66
  const {
67
67
  title,
68
68
  closable,
69
- headerStyle
69
+ headerStyle,
70
+ closeIcon
70
71
  } = this.props;
71
72
  let header, closer;
72
73
  if (title) {
@@ -76,12 +77,13 @@ class SideSheetContent extends _react.default.PureComponent {
76
77
  }, this.props.title);
77
78
  }
78
79
  if (closable) {
80
+ const iconType = closeIcon || /*#__PURE__*/_react.default.createElement(_semiIcons.IconClose, null);
79
81
  closer = /*#__PURE__*/_react.default.createElement(_iconButton.default, {
80
82
  className: `${prefixCls}-close`,
81
83
  key: "close-btn",
82
84
  onClick: this.close,
83
85
  type: "tertiary",
84
- icon: /*#__PURE__*/_react.default.createElement(_semiIcons.IconClose, null),
86
+ icon: iconType,
85
87
  theme: "borderless",
86
88
  size: "small"
87
89
  });
@@ -168,7 +170,8 @@ class SideSheetContent extends _react.default.PureComponent {
168
170
  }
169
171
  exports.default = SideSheetContent;
170
172
  SideSheetContent.propTypes = {
171
- onClose: _propTypes.default.func
173
+ onClose: _propTypes.default.func,
174
+ closeIcon: _propTypes.default.node
172
175
  };
173
176
  SideSheetContent.defaultProps = {
174
177
  onClose: _noop2.default
@@ -43,6 +43,8 @@ export interface BaseRowProps {
43
43
  style?: React.CSSProperties;
44
44
  virtualized?: Virtualized;
45
45
  visible: boolean;
46
+ /** whether display none */
47
+ displayNone?: boolean;
46
48
  }
47
49
  export default class TableRow extends BaseComponent<BaseRowProps, Record<string, any>> {
48
50
  static propTypes: {
@@ -55,6 +57,7 @@ export default class TableRow extends BaseComponent<BaseRowProps, Record<string,
55
57
  expandIcon: PropTypes.Requireable<NonNullable<PropTypes.ReactNodeLike | ((...args: any[]) => any)>>;
56
58
  expandableRow: PropTypes.Requireable<boolean>;
57
59
  expanded: PropTypes.Requireable<boolean>;
60
+ displayNone: PropTypes.Requireable<boolean>;
58
61
  expandedRow: PropTypes.Requireable<boolean>;
59
62
  fixed: PropTypes.Requireable<NonNullable<string | boolean>>;
60
63
  height: PropTypes.Requireable<NonNullable<string | number>>;
@@ -221,6 +221,7 @@ class TableRow extends _baseComponent.default {
221
221
  record,
222
222
  hovered,
223
223
  expanded,
224
+ displayNone,
224
225
  expandableRow,
225
226
  level,
226
227
  expandedRow,
@@ -238,7 +239,8 @@ class TableRow extends _baseComponent.default {
238
239
  const rowCls = typeof replaceClassName === 'string' && replaceClassName.length ? replaceClassName : (0, _classnames.default)(className, `${prefixCls}-row`, {
239
240
  [`${prefixCls}-row-selected`]: selected,
240
241
  [`${prefixCls}-row-expanded`]: expanded,
241
- [`${prefixCls}-row-hovered`]: hovered
242
+ [`${prefixCls}-row-hovered`]: hovered,
243
+ [`${prefixCls}-row-hidden`]: displayNone
242
244
  }, customClassName);
243
245
  const ariaProps = {};
244
246
  if (typeof index === 'number') {
@@ -280,6 +282,7 @@ TableRow.propTypes = {
280
282
  expandIcon: _propTypes.default.oneOfType([_propTypes.default.bool, _propTypes.default.func, _propTypes.default.node]),
281
283
  expandableRow: _propTypes.default.bool,
282
284
  expanded: _propTypes.default.bool,
285
+ displayNone: _propTypes.default.bool,
283
286
  expandedRow: _propTypes.default.bool,
284
287
  fixed: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.bool]),
285
288
  height: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.number]),
@@ -23,6 +23,7 @@ export interface TableExpandedRowProps {
23
23
  store?: Store;
24
24
  style?: React.CSSProperties;
25
25
  virtualized?: Virtualized;
26
+ displayNone?: boolean;
26
27
  }
27
28
  /**
28
29
  * Render expanded row
@@ -45,7 +45,8 @@ class TableExpandedRow extends _react.PureComponent {
45
45
  style,
46
46
  virtualized,
47
47
  indentSize,
48
- cellWidths
48
+ cellWidths,
49
+ displayNone
49
50
  } = this.props;
50
51
  const {
51
52
  tableWidth,
@@ -104,7 +105,8 @@ class TableExpandedRow extends _react.PureComponent {
104
105
  store: store,
105
106
  virtualized: virtualized,
106
107
  indentSize: indentSize,
107
- cellWidths: baseRowCellWidths
108
+ cellWidths: baseRowCellWidths,
109
+ displayNone: displayNone
108
110
  });
109
111
  }
110
112
  }
@@ -32,6 +32,7 @@ export interface BodyProps extends BaseProps {
32
32
  renderExpandIcon: (record: Record<string, any>, isNested: boolean) => ReactNode | null;
33
33
  headerRef?: React.MutableRefObject<HTMLDivElement> | ((instance: any) => void);
34
34
  onScroll?: VirtualizedOnScroll;
35
+ keepDOM?: boolean;
35
36
  }
36
37
  export interface BodyState {
37
38
  virtualizedData?: Array<FlattenData | GroupFlattenData>;
@@ -61,6 +62,8 @@ export interface RenderExpandedRowProps {
61
62
  rowKey?: RowKey<Record<string, any>>;
62
63
  virtualized?: Virtualized;
63
64
  level?: number;
65
+ keepDOM?: boolean;
66
+ displayNone?: boolean;
64
67
  }
65
68
  export interface RenderSectionRowProps {
66
69
  dataSource?: Record<string, any>[];
@@ -308,7 +308,8 @@ class Body extends _baseComponent.default {
308
308
  expanded,
309
309
  index,
310
310
  rowKey,
311
- virtualized
311
+ virtualized,
312
+ displayNone
312
313
  } = props;
313
314
  let key = (0, _utils.getRecordKey)(record, rowKey);
314
315
  if (key == null) {
@@ -334,7 +335,8 @@ class Body extends _baseComponent.default {
334
335
  index: index,
335
336
  virtualized: virtualized,
336
337
  key: (0, _utils.genExpandedRowKey)(key),
337
- cellWidths: _this.cellWidths
338
+ cellWidths: _this.cellWidths,
339
+ displayNone: displayNone
338
340
  });
339
341
  };
340
342
  /**
@@ -346,7 +348,8 @@ class Body extends _baseComponent.default {
346
348
  groups,
347
349
  dataSource: data,
348
350
  rowKey,
349
- expandedRowKeys
351
+ expandedRowKeys,
352
+ keepDOM
350
353
  } = this.props;
351
354
  const {
352
355
  flattenedColumns
@@ -381,7 +384,7 @@ class Body extends _baseComponent.default {
381
384
  expanded
382
385
  })));
383
386
  // Render the grouped content when the group is expanded
384
- if (expanded) {
387
+ if (expanded || keepDOM) {
385
388
  const dataInGroup = [];
386
389
  group.forEach(recordKey => {
387
390
  const record = (0, _utils.getRecord)(data, recordKey, rowKey);
@@ -392,7 +395,7 @@ class Body extends _baseComponent.default {
392
395
  /**
393
396
  * Render the contents of the group row
394
397
  */
395
- renderedRows.push(this.renderBodyRows(dataInGroup));
398
+ renderedRows.push(this.renderBodyRows(dataInGroup, undefined, [], !expanded));
396
399
  }
397
400
  });
398
401
  return renderedRows;
@@ -636,12 +639,14 @@ class Body extends _baseComponent.default {
636
639
  let data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
637
640
  let level = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
638
641
  let renderedRows = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
642
+ let displayNone = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
639
643
  const {
640
644
  rowKey,
641
645
  expandedRowRender,
642
646
  expandedRowKeys,
643
647
  childrenRecordName,
644
- rowExpandable
648
+ rowExpandable,
649
+ keepDOM
645
650
  } = this.props;
646
651
  const hasExpandedRowRender = typeof expandedRowRender === 'function';
647
652
  const expandBtnShouldInRow = this.state.cachedExpandBtnShouldInRow;
@@ -658,6 +663,7 @@ class Body extends _baseComponent.default {
658
663
  renderedRows.push(this.renderBaseRow(Object.assign(Object.assign({}, this.props), {
659
664
  columns: flattenedColumns,
660
665
  expandBtnShouldInRow,
666
+ displayNone,
661
667
  record,
662
668
  key,
663
669
  level,
@@ -665,13 +671,15 @@ class Body extends _baseComponent.default {
665
671
  })));
666
672
  // render expand row
667
673
  const expanded = (0, _utils.isExpanded)(expandedRowKeys, key);
668
- if (hasExpandedRowRender && rowExpandable && rowExpandable(record) && expanded) {
674
+ const shouldRenderExpandedRows = expanded || keepDOM;
675
+ if (hasExpandedRowRender && rowExpandable && rowExpandable(record) && shouldRenderExpandedRows) {
669
676
  const currentExpandRow = this.renderExpandedRow(Object.assign(Object.assign({}, this.props), {
670
677
  columns: flattenedColumns,
671
678
  level,
672
679
  index,
673
680
  record,
674
- expanded
681
+ expanded,
682
+ displayNone: displayNone || !expanded
675
683
  }));
676
684
  /**
677
685
  * If expandedRowRender returns falsy, this expanded row will not be rendered
@@ -682,8 +690,8 @@ class Body extends _baseComponent.default {
682
690
  }
683
691
  }
684
692
  // render tree data
685
- if (recordHasChildren && expanded) {
686
- const nestedRows = this.renderBodyRows(recordChildren, level + 1);
693
+ if (recordHasChildren && shouldRenderExpandedRows) {
694
+ const nestedRows = this.renderBodyRows(recordChildren, level + 1, [], displayNone || !expanded);
687
695
  renderedRows.push(...nestedRows);
688
696
  }
689
697
  });
@@ -34,6 +34,7 @@ export interface TableProps<RecordType extends Record<string, any> = any> extend
34
34
  hideExpandedColumn?: boolean;
35
35
  id?: string;
36
36
  indentSize?: number;
37
+ keepDOM?: boolean;
37
38
  loading?: boolean;
38
39
  pagination?: TablePagination;
39
40
  prefixCls?: string;
@@ -63,6 +63,7 @@ export type TimePickerProps = {
63
63
  secondStep?: number;
64
64
  showClear?: boolean;
65
65
  size?: InputSize;
66
+ stopPropagation: boolean;
66
67
  style?: React.CSSProperties;
67
68
  timeZone?: string | number;
68
69
  triggerRender?: (props?: any) => React.ReactNode;
@@ -133,6 +134,7 @@ export default class TimePicker extends BaseComponent<TimePickerProps, TimePicke
133
134
  focusOnOpen: PropTypes.Requireable<boolean>;
134
135
  autoFocus: PropTypes.Requireable<boolean>;
135
136
  size: PropTypes.Requireable<"default" | "small" | "large">;
137
+ stopPropagation: PropTypes.Requireable<boolean>;
136
138
  panels: PropTypes.Requireable<PropTypes.InferProps<{
137
139
  panelHeader: PropTypes.Requireable<NonNullable<PropTypes.ReactNodeLike>>;
138
140
  panelFooter: PropTypes.Requireable<NonNullable<PropTypes.ReactNodeLike>>;
@@ -166,6 +168,7 @@ export default class TimePicker extends BaseComponent<TimePickerProps, TimePicke
166
168
  prefixCls: string;
167
169
  inputReadOnly: boolean;
168
170
  style: {};
171
+ stopPropagation: boolean;
169
172
  className: string;
170
173
  popupClassName: string;
171
174
  popupStyle: {
@@ -269,9 +269,10 @@ class TimePicker extends _baseComponent.default {
269
269
  scrollItemProps,
270
270
  triggerRender,
271
271
  motion,
272
- autoAdjustOverflow
272
+ autoAdjustOverflow,
273
+ stopPropagation
273
274
  } = _a,
274
- rest = __rest(_a, ["prefixCls", "placeholder", "disabled", "defaultValue", "dropdownMargin", "className", "popupStyle", "size", "style", "locale", "localeCode", "zIndex", "getPopupContainer", "insetLabel", "insetLabelId", "inputStyle", "showClear", "panelHeader", "panelFooter", "rangeSeparator", "onOpenChange", "onChangeWithDateFirst", "popupClassName", "hideDisabledOptions", "use12Hours", "minuteStep", "hourStep", "secondStep", "scrollItemProps", "triggerRender", "motion", "autoAdjustOverflow"]);
275
+ rest = __rest(_a, ["prefixCls", "placeholder", "disabled", "defaultValue", "dropdownMargin", "className", "popupStyle", "size", "style", "locale", "localeCode", "zIndex", "getPopupContainer", "insetLabel", "insetLabelId", "inputStyle", "showClear", "panelHeader", "panelFooter", "rangeSeparator", "onOpenChange", "onChangeWithDateFirst", "popupClassName", "hideDisabledOptions", "use12Hours", "minuteStep", "hourStep", "secondStep", "scrollItemProps", "triggerRender", "motion", "autoAdjustOverflow", "stopPropagation"]);
275
276
  const format = this.foundation.getDefaultFormatIfNeed();
276
277
  const position = this.foundation.getPosition();
277
278
  const useCustomTrigger = typeof triggerRender === 'function';
@@ -329,7 +330,8 @@ class TimePicker extends _baseComponent.default {
329
330
  visible: disabled ? false : Boolean(open),
330
331
  motion: motion,
331
332
  margin: dropdownMargin,
332
- autoAdjustOverflow: autoAdjustOverflow
333
+ autoAdjustOverflow: autoAdjustOverflow,
334
+ stopPropagation: stopPropagation
333
335
  }, useCustomTrigger ? /*#__PURE__*/_react.default.createElement(_trigger.default, {
334
336
  triggerRender: triggerRender,
335
337
  disabled: disabled,
@@ -385,6 +387,7 @@ TimePicker.propTypes = Object.assign(Object.assign({
385
387
  focusOnOpen: _propTypes.default.bool,
386
388
  autoFocus: _propTypes.default.bool,
387
389
  size: _propTypes.default.oneOf(_constants.strings.SIZE),
390
+ stopPropagation: _propTypes.default.bool,
388
391
  panels: _propTypes.default.arrayOf(_propTypes.default.shape(_PanelShape.PanelShape)),
389
392
  onFocus: _propTypes.default.func,
390
393
  onBlur: _propTypes.default.func,
@@ -418,6 +421,7 @@ TimePicker.defaultProps = Object.assign({
418
421
  prefixCls: _constants.cssClasses.PREFIX,
419
422
  inputReadOnly: false,
420
423
  style: {},
424
+ stopPropagation: true,
421
425
  className: '',
422
426
  popupClassName: '',
423
427
  popupStyle: {
@@ -50,6 +50,7 @@ export default class LocaleTimePicker extends React.PureComponent<LocalePickerPr
50
50
  focusOnOpen: import("prop-types").Requireable<boolean>;
51
51
  autoFocus: import("prop-types").Requireable<boolean>;
52
52
  size: import("prop-types").Requireable<"default" | "small" | "large">;
53
+ stopPropagation: import("prop-types").Requireable<boolean>;
53
54
  panels: import("prop-types").Requireable<import("prop-types").InferProps<{
54
55
  panelHeader: import("prop-types").Requireable<NonNullable<import("prop-types").ReactNodeLike>>;
55
56
  panelFooter: import("prop-types").Requireable<NonNullable<import("prop-types").ReactNodeLike>>;
@@ -83,6 +84,7 @@ export default class LocaleTimePicker extends React.PureComponent<LocalePickerPr
83
84
  prefixCls: string;
84
85
  inputReadOnly: boolean;
85
86
  style: {};
87
+ stopPropagation: boolean;
86
88
  className: string;
87
89
  popupClassName: string;
88
90
  popupStyle: {
@@ -32,7 +32,7 @@ declare class Toast extends BaseComponent<ToastReactProps, ToastState> {
32
32
  showClose: PropTypes.Requireable<boolean>;
33
33
  stack: PropTypes.Requireable<boolean>;
34
34
  stackExpanded: PropTypes.Requireable<boolean>;
35
- icon: PropTypes.Requireable<NonNullable<PropTypes.ReactNodeLike>>;
35
+ icon: PropTypes.Requireable<PropTypes.ReactNodeLike>;
36
36
  direction: PropTypes.Requireable<string>;
37
37
  };
38
38
  static defaultProps: {
@@ -157,7 +157,7 @@ Toast.propTypes = {
157
157
  showClose: _propTypes.default.bool,
158
158
  stack: _propTypes.default.bool,
159
159
  stackExpanded: _propTypes.default.bool,
160
- icon: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.node]),
160
+ icon: _propTypes.default.node,
161
161
  direction: _propTypes.default.oneOf(_constants.strings.directions)
162
162
  };
163
163
  Toast.defaultProps = {
@@ -49,7 +49,6 @@ const getRenderText = function (originEle, rows) {
49
49
  const lineHeight = pxToNumber(originStyle.lineHeight);
50
50
  const maxHeight = Math.round(lineHeight * (rows + 1) + pxToNumber(originStyle.paddingTop) + pxToNumber(originStyle.paddingBottom));
51
51
  // Set shadow
52
- const maxWidth = parseInt(originStyle.width);
53
52
  ellipsisContainer.setAttribute('style', originCSS);
54
53
  ellipsisContainer.style.position = 'fixed';
55
54
  ellipsisContainer.style.left = '0';
@@ -61,12 +60,12 @@ const getRenderText = function (originEle, rows) {
61
60
  ellipsisContainer.style.webkitLineClamp = 'none';
62
61
  // Render fake container
63
62
  _reactDom.default.render( /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null), ellipsisContainer);
64
- // Check if ellipsis in measure div is height enough for content
63
+ // Check if ellipsis in measure div is enough for content
65
64
  function inRange() {
66
- if (originStyle.whiteSpace === 'nowrap') {
67
- return ellipsisContainer.scrollWidth <= maxWidth;
68
- }
69
- return ellipsisContainer.scrollHeight < maxHeight;
65
+ // If content does not wrap due to line break strategy, width should be judged to determine whether it's in range
66
+ const widthInRange = ellipsisContainer.scrollWidth <= ellipsisContainer.offsetWidth;
67
+ const heightInRange = ellipsisContainer.scrollHeight < maxHeight;
68
+ return rows === 1 ? widthInRange && heightInRange : heightInRange;
70
69
  }
71
70
  // ========================= Find match ellipsis content =========================
72
71
  // Create origin content holder
@@ -26,8 +26,8 @@ export default class Banner extends BaseComponent<BannerProps, BannerState> {
26
26
  type: PropTypes.Requireable<string>;
27
27
  title: PropTypes.Requireable<PropTypes.ReactNodeLike>;
28
28
  description: PropTypes.Requireable<PropTypes.ReactNodeLike>;
29
- icon: PropTypes.Requireable<NonNullable<PropTypes.ReactNodeLike>>;
30
- closeIcon: PropTypes.Requireable<NonNullable<PropTypes.ReactNodeLike>>;
29
+ icon: PropTypes.Requireable<PropTypes.ReactNodeLike>;
30
+ closeIcon: PropTypes.Requireable<PropTypes.ReactNodeLike>;
31
31
  children: PropTypes.Requireable<PropTypes.ReactNodeLike>;
32
32
  style: PropTypes.Requireable<object>;
33
33
  className: PropTypes.Requireable<string>;