@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
@@ -14,14 +14,6 @@ import PreviewInnerFoundation from '@douyinfe/semi-foundation/lib/es/image/previ
14
14
  import { PreviewContext } from "./previewContext";
15
15
  import { getScrollbarWidth } from "../_utils";
16
16
  const prefixCls = cssClasses.PREFIX;
17
- let startMouseDown = {
18
- x: 0,
19
- y: 0
20
- };
21
- let mouseActiveTime = null;
22
- let stopTiming = false;
23
- let timer = null;
24
- // let bodyOverflowValue = document.body.style.overflow;
25
17
  export default class PreviewInner extends BaseComponent {
26
18
  get adapter() {
27
19
  return Object.assign(Object.assign({}, super.adapter), {
@@ -105,30 +97,22 @@ export default class PreviewInner extends BaseComponent {
105
97
  unregisterKeyDownListener: () => {
106
98
  window && window.removeEventListener("keydown", this.handleKeyDown);
107
99
  },
108
- getMouseActiveTime: () => {
109
- return mouseActiveTime;
110
- },
111
- getStopTiming: () => {
112
- return stopTiming;
113
- },
114
- setStopTiming: value => {
115
- stopTiming = value;
116
- },
117
- getStartMouseDown: () => {
118
- return startMouseDown;
119
- },
120
- setStartMouseDown: (x, y) => {
121
- startMouseDown = {
122
- x,
123
- y
124
- };
125
- },
126
- setMouseActiveTime: time => {
127
- mouseActiveTime = time;
128
- },
129
100
  getSetDownloadFunc: () => {
130
101
  var _a, _b;
131
102
  return (_b = (_a = this.context) === null || _a === void 0 ? void 0 : _a.setDownloadName) !== null && _b !== void 0 ? _b : this.props.setDownloadName;
103
+ },
104
+ isValidTarget: e => {
105
+ const headerDom = this.headerRef && this.headerRef.current;
106
+ const footerDom = this.footerRef && this.footerRef.current;
107
+ const leftIconDom = this.leftIconRef && this.leftIconRef.current;
108
+ const rightIconDom = this.rightIconRef && this.rightIconRef.current;
109
+ const target = e.target;
110
+ if (headerDom && headerDom.contains(target) || footerDom && footerDom.contains(target) || leftIconDom && leftIconDom.contains(target) || rightIconDom && rightIconDom.contains(target)) {
111
+ // Move in the operation area, return false
112
+ return false;
113
+ }
114
+ // Move in the preview area except the operation area, return true
115
+ return true;
132
116
  }
133
117
  });
134
118
  }
@@ -161,9 +145,6 @@ export default class PreviewInner extends BaseComponent {
161
145
  this.handleMouseMove = e => {
162
146
  this.foundation.handleMouseMove(e);
163
147
  };
164
- this.handleMouseEvent = (e, event) => {
165
- this.foundation.handleMouseMoveEvent(e, event);
166
- };
167
148
  this.handleKeyDown = e => {
168
149
  this.foundation.handleKeyDown(e);
169
150
  };
@@ -176,6 +157,31 @@ export default class PreviewInner extends BaseComponent {
176
157
  this.handleMouseDown = e => {
177
158
  this.foundation.handleMouseDown(e);
178
159
  };
160
+ this.handleWheel = e => {
161
+ this.foundation.handleWheel(e);
162
+ };
163
+ // 为什么通过 addEventListener 注册 wheel 事件而不是使用 onWheel 事件?
164
+ // 因为 Passive Event Listeners(https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#improving_scrolling_performance_with_passive_listeners)
165
+ // Passive Event Listeners 是一种优化技术,用于提高滚动性能。在默认情况下,浏览器会假设事件的监听器不会调用
166
+ // preventDefault() 方法来阻止事件的默认行为,从而允许进行一些优化操作,例如滚动平滑。
167
+ // 对于 Image 而言,如果使用触控板,双指朝不同方向分开放大图片,则需要 preventDefault 防止页面整体放大。
168
+ // Why register wheel event through addEventListener instead of using onWheel event?
169
+ // Because of Passive Event Listeners(an optimization technique used to improve scrolling performance. By default,
170
+ // the browser will assume that event listeners will not call preventDefault() method to prevent the default behavior of the event,
171
+ // allowing some optimization operations such as scroll smoothing.)
172
+ // For Image, if we use the trackpad and spread your fingers in different directions to enlarge the image, we need to preventDefault
173
+ // to prevent the page from being enlarged as a whole.
174
+ this.registryImageWrapRef = ref => {
175
+ if (this.imageWrapRef) {
176
+ this.imageWrapRef.removeEventListener("wheel", this.handleWheel);
177
+ }
178
+ if (ref) {
179
+ ref.addEventListener("wheel", this.handleWheel, {
180
+ passive: false
181
+ });
182
+ }
183
+ this.imageWrapRef = ref;
184
+ };
179
185
  this.state = {
180
186
  imgSrc: [],
181
187
  imgLoadStatus: new Map(),
@@ -192,6 +198,11 @@ export default class PreviewInner extends BaseComponent {
192
198
  this.bodyOverflow = '';
193
199
  this.originBodyWidth = '100%';
194
200
  this.scrollBarWidth = 0;
201
+ this.imageWrapRef = null;
202
+ this.headerRef = /*#__PURE__*/React.createRef();
203
+ this.footerRef = /*#__PURE__*/React.createRef();
204
+ this.leftIconRef = /*#__PURE__*/React.createRef();
205
+ this.rightIconRef = /*#__PURE__*/React.createRef();
195
206
  }
196
207
  static getDerivedStateFromProps(props, state) {
197
208
  const willUpdateStates = {};
@@ -207,6 +218,9 @@ export default class PreviewInner extends BaseComponent {
207
218
  willUpdateStates.visible = props.visible;
208
219
  if (props.visible) {
209
220
  willUpdateStates.preloadAfterVisibleChange = true;
221
+ willUpdateStates.viewerVisible = true;
222
+ willUpdateStates.rotation = 0;
223
+ willUpdateStates.ratio = 'adaptation';
210
224
  }
211
225
  }
212
226
  if ("currentIndex" in props && props.currentIndex !== state.currentIndex) {
@@ -225,10 +239,8 @@ export default class PreviewInner extends BaseComponent {
225
239
  }
226
240
  }
227
241
  componentDidUpdate(prevProps, prevState) {
228
- if (prevState.visible !== this.props.visible && this.props.visible) {
229
- mouseActiveTime = new Date().getTime();
230
- timer && clearInterval(timer);
231
- timer = setInterval(this.viewVisibleChange, 1000);
242
+ if (prevProps.src !== this.props.src) {
243
+ this.foundation.updateTimer();
232
244
  }
233
245
  // hide => show
234
246
  if (!prevProps.visible && this.props.visible) {
@@ -240,7 +252,7 @@ export default class PreviewInner extends BaseComponent {
240
252
  }
241
253
  }
242
254
  componentWillUnmount() {
243
- timer && clearInterval(timer);
255
+ this.foundation.clearTimer();
244
256
  }
245
257
  isInGroup() {
246
258
  return Boolean(this.context && this.context.isGroup);
@@ -305,10 +317,10 @@ export default class PreviewInner extends BaseComponent {
305
317
  style: style,
306
318
  onMouseDown: this.handleMouseDown,
307
319
  onMouseUp: this.handleMouseUp,
308
- onMouseMove: this.handleMouseMove,
309
- onMouseOver: e => this.handleMouseEvent(e.nativeEvent, "over"),
310
- onMouseOut: e => this.handleMouseEvent(e.nativeEvent, "out")
320
+ ref: this.registryImageWrapRef,
321
+ onMouseMove: this.handleMouseMove
311
322
  }, /*#__PURE__*/React.createElement(Header, {
323
+ ref: this.headerRef,
312
324
  className: cls(hideViewerCls),
313
325
  onClose: this.handlePreviewClose,
314
326
  renderHeader: renderHeader
@@ -319,7 +331,6 @@ export default class PreviewInner extends BaseComponent {
319
331
  setRatio: this.handleAdjustRatio,
320
332
  zoom: zoom,
321
333
  ratio: ratio,
322
- zoomStep: zoomStep,
323
334
  rotation: rotation,
324
335
  crossOrigin: crossOrigin,
325
336
  onError: this.onImageError,
@@ -328,6 +339,7 @@ export default class PreviewInner extends BaseComponent {
328
339
  /*#__PURE__*/
329
340
  // eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions
330
341
  React.createElement("div", {
342
+ ref: this.leftIconRef,
331
343
  className: cls(`${previewPrefixCls}-icon`, `${previewPrefixCls}-prev`, hideViewerCls),
332
344
  onClick: () => this.handleSwitchImage("prev")
333
345
  }, /*#__PURE__*/React.createElement(IconArrowLeft, {
@@ -336,11 +348,13 @@ export default class PreviewInner extends BaseComponent {
336
348
  /*#__PURE__*/
337
349
  // eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions
338
350
  React.createElement("div", {
351
+ ref: this.rightIconRef,
339
352
  className: cls(`${previewPrefixCls}-icon`, `${previewPrefixCls}-next`, hideViewerCls),
340
353
  onClick: () => this.handleSwitchImage("next")
341
354
  }, /*#__PURE__*/React.createElement(IconArrowRight, {
342
355
  size: "large"
343
356
  })), /*#__PURE__*/React.createElement(Footer, {
357
+ forwardRef: this.footerRef,
344
358
  className: hideViewerCls,
345
359
  totalNum: total,
346
360
  curPage: currentIndex + 1,
@@ -398,6 +412,8 @@ PreviewInner.propTypes = {
398
412
  disableDownload: PropTypes.bool,
399
413
  viewerVisibleDelay: PropTypes.number,
400
414
  zIndex: PropTypes.number,
415
+ maxZoom: PropTypes.number,
416
+ minZoom: PropTypes.number,
401
417
  renderHeader: PropTypes.func,
402
418
  renderPreviewMenu: PropTypes.func,
403
419
  getPopupContainer: PropTypes.func,
@@ -422,5 +438,7 @@ PreviewInner.defaultProps = {
422
438
  preLoadGap: 2,
423
439
  zIndex: 1000,
424
440
  maskClosable: true,
425
- viewerVisibleDelay: 10000
441
+ viewerVisibleDelay: 10000,
442
+ maxZoom: 5,
443
+ minZoom: 0.1
426
444
  };
@@ -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>;
@@ -293,7 +293,7 @@ Modal.propTypes = {
293
293
  getPopupContainer: PropTypes.func,
294
294
  getContainerContext: PropTypes.func,
295
295
  maskFixed: PropTypes.bool,
296
- closeIcon: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),
296
+ closeIcon: PropTypes.node,
297
297
  closeOnEsc: PropTypes.bool,
298
298
  size: PropTypes.oneOf(strings.SIZE),
299
299
  keepDOM: PropTypes.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
  */
@@ -346,7 +346,7 @@ SubNav.propTypes = {
346
346
  /**
347
347
  * Icon name on the left
348
348
  */
349
- icon: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),
349
+ icon: PropTypes.node,
350
350
  /**
351
351
  * Maximum height (for animation)
352
352
  */
@@ -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>;
@@ -233,7 +233,7 @@ Popconfirm.propTypes = {
233
233
  prefixCls: PropTypes.string,
234
234
  className: PropTypes.string,
235
235
  style: PropTypes.object,
236
- icon: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),
236
+ icon: PropTypes.node,
237
237
  okText: PropTypes.string,
238
238
  okType: PropTypes.string,
239
239
  cancelText: PropTypes.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/es/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;
@@ -59,7 +59,8 @@ export default class SideSheetContent extends React.PureComponent {
59
59
  const {
60
60
  title,
61
61
  closable,
62
- headerStyle
62
+ headerStyle,
63
+ closeIcon
63
64
  } = this.props;
64
65
  let header, closer;
65
66
  if (title) {
@@ -69,12 +70,13 @@ export default class SideSheetContent extends React.PureComponent {
69
70
  }, this.props.title);
70
71
  }
71
72
  if (closable) {
73
+ const iconType = closeIcon || /*#__PURE__*/React.createElement(IconClose, null);
72
74
  closer = /*#__PURE__*/React.createElement(Button, {
73
75
  className: `${prefixCls}-close`,
74
76
  key: "close-btn",
75
77
  onClick: this.close,
76
78
  type: "tertiary",
77
- icon: /*#__PURE__*/React.createElement(IconClose, null),
79
+ icon: iconType,
78
80
  theme: "borderless",
79
81
  size: "small"
80
82
  });
@@ -160,7 +162,8 @@ export default class SideSheetContent extends React.PureComponent {
160
162
  }
161
163
  }
162
164
  SideSheetContent.propTypes = {
163
- onClose: PropTypes.func
165
+ onClose: PropTypes.func,
166
+ closeIcon: PropTypes.node
164
167
  };
165
168
  SideSheetContent.defaultProps = {
166
169
  onClose: _noop
@@ -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>>;
@@ -212,6 +212,7 @@ export default class TableRow extends BaseComponent {
212
212
  record,
213
213
  hovered,
214
214
  expanded,
215
+ displayNone,
215
216
  expandableRow,
216
217
  level,
217
218
  expandedRow,
@@ -229,7 +230,8 @@ export default class TableRow extends BaseComponent {
229
230
  const rowCls = typeof replaceClassName === 'string' && replaceClassName.length ? replaceClassName : classnames(className, `${prefixCls}-row`, {
230
231
  [`${prefixCls}-row-selected`]: selected,
231
232
  [`${prefixCls}-row-expanded`]: expanded,
232
- [`${prefixCls}-row-hovered`]: hovered
233
+ [`${prefixCls}-row-hovered`]: hovered,
234
+ [`${prefixCls}-row-hidden`]: displayNone
233
235
  }, customClassName);
234
236
  const ariaProps = {};
235
237
  if (typeof index === 'number') {
@@ -270,6 +272,7 @@ TableRow.propTypes = {
270
272
  expandIcon: PropTypes.oneOfType([PropTypes.bool, PropTypes.func, PropTypes.node]),
271
273
  expandableRow: PropTypes.bool,
272
274
  expanded: PropTypes.bool,
275
+ displayNone: PropTypes.bool,
273
276
  expandedRow: PropTypes.bool,
274
277
  fixed: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]),
275
278
  height: PropTypes.oneOfType([PropTypes.string, PropTypes.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
@@ -36,7 +36,8 @@ export default class TableExpandedRow extends PureComponent {
36
36
  style,
37
37
  virtualized,
38
38
  indentSize,
39
- cellWidths
39
+ cellWidths,
40
+ displayNone
40
41
  } = this.props;
41
42
  const {
42
43
  tableWidth,
@@ -95,7 +96,8 @@ export default class TableExpandedRow extends PureComponent {
95
96
  store: store,
96
97
  virtualized: virtualized,
97
98
  indentSize: indentSize,
98
- cellWidths: baseRowCellWidths
99
+ cellWidths: baseRowCellWidths,
100
+ displayNone: displayNone
99
101
  });
100
102
  }
101
103
  }
@@ -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>[];
@@ -301,7 +301,8 @@ class Body extends BaseComponent {
301
301
  expanded,
302
302
  index,
303
303
  rowKey,
304
- virtualized
304
+ virtualized,
305
+ displayNone
305
306
  } = props;
306
307
  let key = getRecordKey(record, rowKey);
307
308
  if (key == null) {
@@ -327,7 +328,8 @@ class Body extends BaseComponent {
327
328
  index: index,
328
329
  virtualized: virtualized,
329
330
  key: genExpandedRowKey(key),
330
- cellWidths: _this.cellWidths
331
+ cellWidths: _this.cellWidths,
332
+ displayNone: displayNone
331
333
  });
332
334
  };
333
335
  /**
@@ -339,7 +341,8 @@ class Body extends BaseComponent {
339
341
  groups,
340
342
  dataSource: data,
341
343
  rowKey,
342
- expandedRowKeys
344
+ expandedRowKeys,
345
+ keepDOM
343
346
  } = this.props;
344
347
  const {
345
348
  flattenedColumns
@@ -374,7 +377,7 @@ class Body extends BaseComponent {
374
377
  expanded
375
378
  })));
376
379
  // Render the grouped content when the group is expanded
377
- if (expanded) {
380
+ if (expanded || keepDOM) {
378
381
  const dataInGroup = [];
379
382
  group.forEach(recordKey => {
380
383
  const record = getRecord(data, recordKey, rowKey);
@@ -385,7 +388,7 @@ class Body extends BaseComponent {
385
388
  /**
386
389
  * Render the contents of the group row
387
390
  */
388
- renderedRows.push(this.renderBodyRows(dataInGroup));
391
+ renderedRows.push(this.renderBodyRows(dataInGroup, undefined, [], !expanded));
389
392
  }
390
393
  });
391
394
  return renderedRows;
@@ -629,12 +632,14 @@ class Body extends BaseComponent {
629
632
  let data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
630
633
  let level = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
631
634
  let renderedRows = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
635
+ let displayNone = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
632
636
  const {
633
637
  rowKey,
634
638
  expandedRowRender,
635
639
  expandedRowKeys,
636
640
  childrenRecordName,
637
- rowExpandable
641
+ rowExpandable,
642
+ keepDOM
638
643
  } = this.props;
639
644
  const hasExpandedRowRender = typeof expandedRowRender === 'function';
640
645
  const expandBtnShouldInRow = this.state.cachedExpandBtnShouldInRow;
@@ -651,6 +656,7 @@ class Body extends BaseComponent {
651
656
  renderedRows.push(this.renderBaseRow(Object.assign(Object.assign({}, this.props), {
652
657
  columns: flattenedColumns,
653
658
  expandBtnShouldInRow,
659
+ displayNone,
654
660
  record,
655
661
  key,
656
662
  level,
@@ -658,13 +664,15 @@ class Body extends BaseComponent {
658
664
  })));
659
665
  // render expand row
660
666
  const expanded = isExpanded(expandedRowKeys, key);
661
- if (hasExpandedRowRender && rowExpandable && rowExpandable(record) && expanded) {
667
+ const shouldRenderExpandedRows = expanded || keepDOM;
668
+ if (hasExpandedRowRender && rowExpandable && rowExpandable(record) && shouldRenderExpandedRows) {
662
669
  const currentExpandRow = this.renderExpandedRow(Object.assign(Object.assign({}, this.props), {
663
670
  columns: flattenedColumns,
664
671
  level,
665
672
  index,
666
673
  record,
667
- expanded
674
+ expanded,
675
+ displayNone: displayNone || !expanded
668
676
  }));
669
677
  /**
670
678
  * If expandedRowRender returns falsy, this expanded row will not be rendered
@@ -675,8 +683,8 @@ class Body extends BaseComponent {
675
683
  }
676
684
  }
677
685
  // render tree data
678
- if (recordHasChildren && expanded) {
679
- const nestedRows = this.renderBodyRows(recordChildren, level + 1);
686
+ if (recordHasChildren && shouldRenderExpandedRows) {
687
+ const nestedRows = this.renderBodyRows(recordChildren, level + 1, [], displayNone || !expanded);
680
688
  renderedRows.push(...nestedRows);
681
689
  }
682
690
  });
@@ -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: {
@@ -262,9 +262,10 @@ export default class TimePicker extends BaseComponent {
262
262
  scrollItemProps,
263
263
  triggerRender,
264
264
  motion,
265
- autoAdjustOverflow
265
+ autoAdjustOverflow,
266
+ stopPropagation
266
267
  } = _a,
267
- 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"]);
268
+ 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"]);
268
269
  const format = this.foundation.getDefaultFormatIfNeed();
269
270
  const position = this.foundation.getPosition();
270
271
  const useCustomTrigger = typeof triggerRender === 'function';
@@ -322,7 +323,8 @@ export default class TimePicker extends BaseComponent {
322
323
  visible: disabled ? false : Boolean(open),
323
324
  motion: motion,
324
325
  margin: dropdownMargin,
325
- autoAdjustOverflow: autoAdjustOverflow
326
+ autoAdjustOverflow: autoAdjustOverflow,
327
+ stopPropagation: stopPropagation
326
328
  }, useCustomTrigger ? /*#__PURE__*/React.createElement(Trigger, {
327
329
  triggerRender: triggerRender,
328
330
  disabled: disabled,
@@ -377,6 +379,7 @@ TimePicker.propTypes = Object.assign(Object.assign({
377
379
  focusOnOpen: PropTypes.bool,
378
380
  autoFocus: PropTypes.bool,
379
381
  size: PropTypes.oneOf(strings.SIZE),
382
+ stopPropagation: PropTypes.bool,
380
383
  panels: PropTypes.arrayOf(PropTypes.shape(PanelShape)),
381
384
  onFocus: PropTypes.func,
382
385
  onBlur: PropTypes.func,
@@ -410,6 +413,7 @@ TimePicker.defaultProps = Object.assign({
410
413
  prefixCls: cssClasses.PREFIX,
411
414
  inputReadOnly: false,
412
415
  style: {},
416
+ stopPropagation: true,
413
417
  className: '',
414
418
  popupClassName: '',
415
419
  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: {
@@ -150,7 +150,7 @@ Toast.propTypes = {
150
150
  showClose: PropTypes.bool,
151
151
  stack: PropTypes.bool,
152
152
  stackExpanded: PropTypes.bool,
153
- icon: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),
153
+ icon: PropTypes.node,
154
154
  direction: PropTypes.oneOf(strings.directions)
155
155
  };
156
156
  Toast.defaultProps = {
@@ -42,7 +42,6 @@ const getRenderText = function (originEle, rows) {
42
42
  const lineHeight = pxToNumber(originStyle.lineHeight);
43
43
  const maxHeight = Math.round(lineHeight * (rows + 1) + pxToNumber(originStyle.paddingTop) + pxToNumber(originStyle.paddingBottom));
44
44
  // Set shadow
45
- const maxWidth = parseInt(originStyle.width);
46
45
  ellipsisContainer.setAttribute('style', originCSS);
47
46
  ellipsisContainer.style.position = 'fixed';
48
47
  ellipsisContainer.style.left = '0';
@@ -54,12 +53,12 @@ const getRenderText = function (originEle, rows) {
54
53
  ellipsisContainer.style.webkitLineClamp = 'none';
55
54
  // Render fake container
56
55
  ReactDOM.render( /*#__PURE__*/React.createElement(React.Fragment, null), ellipsisContainer);
57
- // Check if ellipsis in measure div is height enough for content
56
+ // Check if ellipsis in measure div is enough for content
58
57
  function inRange() {
59
- if (originStyle.whiteSpace === 'nowrap') {
60
- return ellipsisContainer.scrollWidth <= maxWidth;
61
- }
62
- return ellipsisContainer.scrollHeight < maxHeight;
58
+ // If content does not wrap due to line break strategy, width should be judged to determine whether it's in range
59
+ const widthInRange = ellipsisContainer.scrollWidth <= ellipsisContainer.offsetWidth;
60
+ const heightInRange = ellipsisContainer.scrollHeight < maxHeight;
61
+ return rows === 1 ? widthInRange && heightInRange : heightInRange;
63
62
  }
64
63
  // ========================= Find match ellipsis content =========================
65
64
  // Create origin content holder