@douyinfe/semi-ui 2.51.4 → 2.52.0-beta.1

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 (65) hide show
  1. package/dist/css/semi.css +285 -0
  2. package/dist/css/semi.min.css +1 -1
  3. package/dist/umd/semi-ui.js +488 -214
  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/_utils/index.d.ts +2 -1
  8. package/lib/cjs/_utils/index.js +0 -5
  9. package/lib/cjs/avatar/TopSlotSvg.d.ts +5 -0
  10. package/lib/cjs/avatar/TopSlotSvg.js +74 -0
  11. package/lib/cjs/avatar/index.d.ts +25 -0
  12. package/lib/cjs/avatar/index.js +126 -8
  13. package/lib/cjs/avatar/interface.d.ts +24 -1
  14. package/lib/cjs/cascader/index.d.ts +2 -3
  15. package/lib/cjs/cascader/index.js +19 -28
  16. package/lib/cjs/datePicker/datePicker.js +1 -1
  17. package/lib/cjs/datePicker/yearAndMonth.js +16 -20
  18. package/lib/cjs/dropdown/dropdownItem.js +2 -1
  19. package/lib/cjs/form/hoc/withField.d.ts +3 -3
  20. package/lib/cjs/input/index.d.ts +1 -0
  21. package/lib/cjs/input/index.js +12 -4
  22. package/lib/cjs/modal/Modal.d.ts +1 -0
  23. package/lib/cjs/modal/Modal.js +13 -5
  24. package/lib/cjs/modal/confirm.d.ts +5 -0
  25. package/lib/cjs/select/option.js +1 -2
  26. package/lib/cjs/slider/index.js +33 -1
  27. package/lib/cjs/table/ColumnFilter.d.ts +34 -18
  28. package/lib/cjs/table/ColumnFilter.js +134 -73
  29. package/lib/cjs/table/ResizableTable.js +1 -1
  30. package/lib/cjs/table/Table.d.ts +5 -5
  31. package/lib/cjs/table/Table.js +38 -13
  32. package/lib/cjs/table/index.d.ts +1 -1
  33. package/lib/cjs/table/interface.d.ts +30 -10
  34. package/lib/cjs/treeSelect/index.d.ts +2 -0
  35. package/lib/cjs/treeSelect/index.js +4 -0
  36. package/lib/es/_utils/index.d.ts +2 -1
  37. package/lib/es/_utils/index.js +0 -5
  38. package/lib/es/avatar/TopSlotSvg.d.ts +5 -0
  39. package/lib/es/avatar/TopSlotSvg.js +66 -0
  40. package/lib/es/avatar/index.d.ts +25 -0
  41. package/lib/es/avatar/index.js +126 -8
  42. package/lib/es/avatar/interface.d.ts +24 -1
  43. package/lib/es/cascader/index.d.ts +2 -3
  44. package/lib/es/cascader/index.js +19 -28
  45. package/lib/es/datePicker/datePicker.js +1 -1
  46. package/lib/es/datePicker/yearAndMonth.js +16 -20
  47. package/lib/es/dropdown/dropdownItem.js +2 -1
  48. package/lib/es/form/hoc/withField.d.ts +3 -3
  49. package/lib/es/input/index.d.ts +1 -0
  50. package/lib/es/input/index.js +12 -4
  51. package/lib/es/modal/Modal.d.ts +1 -0
  52. package/lib/es/modal/Modal.js +13 -5
  53. package/lib/es/modal/confirm.d.ts +5 -0
  54. package/lib/es/select/option.js +1 -2
  55. package/lib/es/slider/index.js +33 -1
  56. package/lib/es/table/ColumnFilter.d.ts +34 -18
  57. package/lib/es/table/ColumnFilter.js +135 -74
  58. package/lib/es/table/ResizableTable.js +1 -1
  59. package/lib/es/table/Table.d.ts +5 -5
  60. package/lib/es/table/Table.js +38 -13
  61. package/lib/es/table/index.d.ts +1 -1
  62. package/lib/es/table/interface.d.ts +30 -10
  63. package/lib/es/treeSelect/index.d.ts +2 -0
  64. package/lib/es/treeSelect/index.js +4 -0
  65. package/package.json +8 -8
@@ -37,7 +37,8 @@ class DropdownItem extends BaseComponent {
37
37
  const events = {};
38
38
  if (!disabled) {
39
39
  ['onClick', 'onMouseEnter', 'onMouseLeave', 'onContextMenu'].forEach(eventName => {
40
- if (eventName === "onClick") {
40
+ const isInAnotherDropdown = this.context.level !== 1;
41
+ if (isInAnotherDropdown && eventName === "onClick") {
41
42
  events["onMouseDown"] = e => {
42
43
  var _a, _b;
43
44
  if (e.button === 0) {
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
- import type { WithFieldOption } from '@douyinfe/semi-foundation/lib/es/form/interface';
3
- import type { CommonFieldProps, CommonexcludeType } from '../interface';
4
- import type { Subtract } from 'utility-types';
2
+ import { WithFieldOption } from '@douyinfe/semi-foundation/lib/es/form/interface';
3
+ import { CommonFieldProps, CommonexcludeType } from '../interface';
4
+ import { Subtract } from 'utility-types';
5
5
  /**
6
6
  * withFiled is used to inject components
7
7
  * 1. Takes over the value and onChange of the component and synchronizes them to Form Foundation
@@ -51,6 +51,7 @@ export interface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElem
51
51
  preventScroll?: boolean;
52
52
  /** internal prop, DatePicker use it */
53
53
  showClearIgnoreDisabled?: boolean;
54
+ onlyBorder?: number;
54
55
  }
55
56
  export interface InputState {
56
57
  value: React.ReactText;
@@ -333,9 +333,10 @@ class Input extends BaseComponent {
333
333
  getValueLength,
334
334
  preventScroll,
335
335
  borderless,
336
- showClearIgnoreDisabled
336
+ showClearIgnoreDisabled,
337
+ onlyBorder
337
338
  } = _a,
338
- rest = __rest(_a, ["addonAfter", "addonBefore", "autoFocus", "clearIcon", "className", "disabled", "defaultValue", "placeholder", "prefix", "mode", "insetLabel", "insetLabelId", "validateStatus", "type", "readonly", "size", "suffix", "style", "showClear", "onEnterPress", "onClear", "hideSuffix", "inputStyle", "forwardRef", "maxLength", "getValueLength", "preventScroll", "borderless", "showClearIgnoreDisabled"]);
339
+ rest = __rest(_a, ["addonAfter", "addonBefore", "autoFocus", "clearIcon", "className", "disabled", "defaultValue", "placeholder", "prefix", "mode", "insetLabel", "insetLabelId", "validateStatus", "type", "readonly", "size", "suffix", "style", "showClear", "onEnterPress", "onClear", "hideSuffix", "inputStyle", "forwardRef", "maxLength", "getValueLength", "preventScroll", "borderless", "showClearIgnoreDisabled", "onlyBorder"]);
339
340
  const {
340
341
  value,
341
342
  isFocus,
@@ -363,7 +364,8 @@ class Input extends BaseComponent {
363
364
  [`${wrapperPrefix}-modebtn`]: mode === 'password',
364
365
  [`${wrapperPrefix}-hidden`]: type === 'hidden',
365
366
  [`${wrapperPrefix}-${size}`]: size,
366
- [`${prefixCls}-borderless`]: borderless
367
+ [`${prefixCls}-borderless`]: borderless,
368
+ [`${prefixCls}-only_border`]: onlyBorder !== undefined && onlyBorder !== null
367
369
  });
368
370
  const inputCls = cls(prefixCls, {
369
371
  [`${prefixCls}-${size}`]: size,
@@ -397,12 +399,18 @@ class Input extends BaseComponent {
397
399
  if (validateStatus === 'error') {
398
400
  inputProps['aria-invalid'] = 'true';
399
401
  }
402
+ let wrapperStyle = Object.assign({}, style);
403
+ if (onlyBorder !== undefined) {
404
+ wrapperStyle = Object.assign({
405
+ borderWidth: onlyBorder
406
+ }, style);
407
+ }
400
408
  return (
401
409
  /*#__PURE__*/
402
410
  // eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions
403
411
  React.createElement("div", {
404
412
  className: wrapperCls,
405
- style: style,
413
+ style: wrapperStyle,
406
414
  onMouseEnter: e => this.handleMouseOver(e),
407
415
  onMouseLeave: e => this.handleMouseLeave(e),
408
416
  onClick: e => this.handleClick(e)
@@ -66,6 +66,7 @@ declare class Modal extends BaseComponent<ModalReactProps, ModalState> {
66
66
  lazyRender: PropTypes.Requireable<boolean>;
67
67
  direction: PropTypes.Requireable<string>;
68
68
  fullScreen: PropTypes.Requireable<boolean>;
69
+ footerFill: PropTypes.Requireable<boolean>;
69
70
  };
70
71
  static defaultProps: {
71
72
  zIndex: number;
@@ -26,7 +26,6 @@ export const destroyFns = [];
26
26
  class Modal extends BaseComponent {
27
27
  constructor(props) {
28
28
  super(props);
29
- this.bodyOverflow = null;
30
29
  this.handleCancel = e => {
31
30
  this.foundation.handleCancel(e);
32
31
  };
@@ -46,7 +45,8 @@ class Modal extends BaseComponent {
46
45
  cancelText,
47
46
  confirmLoading,
48
47
  cancelLoading,
49
- hasCancel
48
+ hasCancel,
49
+ footerFill
50
50
  } = this.props;
51
51
  const getCancelButton = locale => {
52
52
  if (!hasCancel) {
@@ -57,6 +57,7 @@ class Modal extends BaseComponent {
57
57
  onClick: this.handleCancel,
58
58
  loading: cancelLoading === undefined ? this.state.onCancelReturnPromiseStatus === "pending" : cancelLoading,
59
59
  type: "tertiary",
60
+ block: footerFill,
60
61
  autoFocus: true
61
62
  }, this.props.cancelButtonProps, {
62
63
  "x-semi-children-alias": "cancelText"
@@ -65,10 +66,15 @@ class Modal extends BaseComponent {
65
66
  };
66
67
  return /*#__PURE__*/React.createElement(LocaleConsumer, {
67
68
  componentName: "Modal"
68
- }, (locale, localeCode) => /*#__PURE__*/React.createElement("div", null, getCancelButton(locale), /*#__PURE__*/React.createElement(Button, Object.assign({
69
+ }, (locale, localeCode) => /*#__PURE__*/React.createElement("div", {
70
+ className: cls({
71
+ [`${cssClasses.DIALOG}-footerfill`]: footerFill
72
+ })
73
+ }, getCancelButton(locale), /*#__PURE__*/React.createElement(Button, Object.assign({
69
74
  "aria-label": "confirm",
70
75
  type: okType,
71
76
  theme: "solid",
77
+ block: footerFill,
72
78
  loading: confirmLoading === undefined ? this.state.onOKReturnPromiseStatus === "pending" : confirmLoading,
73
79
  onClick: this.handleOk
74
80
  }, this.props.okButtonProps, {
@@ -166,6 +172,7 @@ class Modal extends BaseComponent {
166
172
  };
167
173
  this.foundation = new ModalFoundation(this.adapter);
168
174
  this.modalRef = /*#__PURE__*/React.createRef();
175
+ this.bodyOverflow = '';
169
176
  this.scrollBarWidth = 0;
170
177
  this.originBodyWidth = '100%';
171
178
  }
@@ -186,7 +193,7 @@ class Modal extends BaseComponent {
186
193
  const {
187
194
  getPopupContainer
188
195
  } = this.props;
189
- if (!getPopupContainer && this.bodyOverflow !== null && this.bodyOverflow !== 'hidden') {
196
+ if (!getPopupContainer && this.bodyOverflow !== 'hidden') {
190
197
  document.body.style.overflow = this.bodyOverflow;
191
198
  document.body.style.width = this.originBodyWidth;
192
199
  }
@@ -301,7 +308,8 @@ Modal.propTypes = {
301
308
  keepDOM: PropTypes.bool,
302
309
  lazyRender: PropTypes.bool,
303
310
  direction: PropTypes.oneOf(strings.directions),
304
- fullScreen: PropTypes.bool
311
+ fullScreen: PropTypes.bool,
312
+ footerFill: PropTypes.bool
305
313
  };
306
314
  Modal.defaultProps = {
307
315
  zIndex: 1000,
@@ -51,6 +51,7 @@ export declare function withInfo(props: ModalReactProps): {
51
51
  direction?: any;
52
52
  fullScreen?: boolean;
53
53
  preventScroll?: boolean;
54
+ footerFill?: boolean;
54
55
  type: "info";
55
56
  };
56
57
  export declare function withSuccess(props: ModalReactProps): {
@@ -94,6 +95,7 @@ export declare function withSuccess(props: ModalReactProps): {
94
95
  direction?: any;
95
96
  fullScreen?: boolean;
96
97
  preventScroll?: boolean;
98
+ footerFill?: boolean;
97
99
  type: "success";
98
100
  };
99
101
  export declare function withWarning(props: ModalReactProps): {
@@ -137,6 +139,7 @@ export declare function withWarning(props: ModalReactProps): {
137
139
  direction?: any;
138
140
  fullScreen?: boolean;
139
141
  preventScroll?: boolean;
142
+ footerFill?: boolean;
140
143
  type: "warning";
141
144
  };
142
145
  export declare function withError(props: ModalReactProps): {
@@ -179,6 +182,7 @@ export declare function withError(props: ModalReactProps): {
179
182
  onOk?: (e: React.MouseEvent<Element, MouseEvent>) => void | Promise<any>;
180
183
  lazyRender?: boolean;
181
184
  fullScreen?: boolean;
185
+ footerFill?: boolean;
182
186
  type: "error";
183
187
  okButtonProps: {
184
188
  id?: string;
@@ -506,5 +510,6 @@ export declare function withConfirm(props: ModalReactProps): {
506
510
  direction?: any;
507
511
  fullScreen?: boolean;
508
512
  preventScroll?: boolean;
513
+ footerFill?: boolean;
509
514
  type: "confirm";
510
515
  };
@@ -101,8 +101,7 @@ class Option extends PureComponent {
101
101
  value,
102
102
  label,
103
103
  children
104
- }, rest), e),
105
- className
104
+ }, rest), e)
106
105
  }, rest));
107
106
  }
108
107
  const config = {
@@ -28,6 +28,7 @@ export default class Slider extends BaseComponent {
28
28
  constructor(props) {
29
29
  super(props);
30
30
  this.renderHandle = () => {
31
+ var _a, _b, _c, _d, _e, _f, _g, _h;
31
32
  const {
32
33
  vertical,
33
34
  range,
@@ -126,6 +127,14 @@ export default class Slider extends BaseComponent {
126
127
  "aria-valuenow": currentValue,
127
128
  "aria-valuemax": max,
128
129
  "aria-valuemin": min
130
+ }), this.props.handleDot && /*#__PURE__*/React.createElement("div", {
131
+ className: cssClasses.HANDLE_DOT,
132
+ style: Object.assign(Object.assign({}, ((_a = this.props.handleDot) === null || _a === void 0 ? void 0 : _a.size) ? {
133
+ width: this.props.handleDot.size,
134
+ height: this.props.handleDot.size
135
+ } : {}), ((_b = this.props.handleDot) === null || _b === void 0 ? void 0 : _b.color) ? {
136
+ backgroundColor: this.props.handleDot.color
137
+ } : {})
129
138
  }))) : /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Tooltip, {
130
139
  content: tipChildren.min,
131
140
  position: "top",
@@ -177,6 +186,14 @@ export default class Slider extends BaseComponent {
177
186
  "aria-valuenow": currentValue[0],
178
187
  "aria-valuemax": currentValue[1],
179
188
  "aria-valuemin": min
189
+ }), ((_c = this.props.handleDot) === null || _c === void 0 ? void 0 : _c[0]) && /*#__PURE__*/React.createElement("div", {
190
+ className: cssClasses.HANDLE_DOT,
191
+ style: Object.assign(Object.assign({}, ((_d = this.props.handleDot[0]) === null || _d === void 0 ? void 0 : _d.size) ? {
192
+ width: this.props.handleDot[0].size,
193
+ height: this.props.handleDot[0].size
194
+ } : {}), ((_e = this.props.handleDot[0]) === null || _e === void 0 ? void 0 : _e.color) ? {
195
+ backgroundColor: this.props.handleDot[0].color
196
+ } : {})
180
197
  }))), /*#__PURE__*/React.createElement(Tooltip, {
181
198
  content: tipChildren.max,
182
199
  position: "top",
@@ -228,6 +245,14 @@ export default class Slider extends BaseComponent {
228
245
  "aria-valuenow": currentValue[1],
229
246
  "aria-valuemax": max,
230
247
  "aria-valuemin": currentValue[0]
248
+ }), ((_f = this.props.handleDot) === null || _f === void 0 ? void 0 : _f[1]) && /*#__PURE__*/React.createElement("div", {
249
+ className: cssClasses.HANDLE_DOT,
250
+ style: Object.assign(Object.assign({}, ((_g = this.props.handleDot[1]) === null || _g === void 0 ? void 0 : _g.size) ? {
251
+ width: this.props.handleDot[1].size,
252
+ height: this.props.handleDot[1].size
253
+ } : {}), ((_h = this.props.handleDot[1]) === null || _h === void 0 ? void 0 : _h.color) ? {
254
+ backgroundColor: this.props.handleDot[1].color
255
+ } : {})
231
256
  }))));
232
257
  return handleContents;
233
258
  };
@@ -644,7 +669,14 @@ Slider.propTypes = {
644
669
  showBoundary: PropTypes.bool,
645
670
  railStyle: PropTypes.object,
646
671
  verticalReverse: PropTypes.bool,
647
- getAriaValueText: PropTypes.func
672
+ getAriaValueText: PropTypes.func,
673
+ handleDot: PropTypes.oneOfType([PropTypes.shape({
674
+ size: PropTypes.string,
675
+ color: PropTypes.string
676
+ }), PropTypes.arrayOf(PropTypes.shape({
677
+ size: PropTypes.string,
678
+ color: PropTypes.string
679
+ }))])
648
680
  };
649
681
  Slider.defaultProps = {
650
682
  // allowClear: false,
@@ -1,34 +1,50 @@
1
1
  import React from 'react';
2
2
  import { DropdownProps } from '../dropdown';
3
- import { Trigger, Position } from '../tooltip';
4
3
  import { FilterIcon, Filter, OnFilterDropdownVisibleChange, RenderFilterDropdownItem } from './interface';
5
- export interface ColumnFilterProps {
4
+ export default function ColumnFilter(props?: ColumnFilterProps): React.ReactElement;
5
+ export interface ColumnFilterProps extends Omit<RenderDropdownProps, keyof RenderFilterDropdownProps> {
6
6
  prefixCls?: string;
7
7
  filteredValue?: any[];
8
8
  filterIcon?: FilterIcon;
9
9
  filterDropdown?: React.ReactElement;
10
- renderFilterDropdown?: (props: RenderDropdownProps, options: {
11
- iconElem: React.ReactNode;
12
- }) => React.ReactElement;
13
- filterDropdownProps?: DropdownProps;
14
- onFilterDropdownVisibleChange?: OnFilterDropdownVisibleChange;
15
- onSelect?: (data: OnSelectData) => void;
16
- }
17
- export default function ColumnFilter(props?: ColumnFilterProps): React.ReactElement;
18
- export interface OnSelectData {
19
- value: any;
20
- filteredValue: any;
21
- included: boolean;
22
- domEvent: React.MouseEvent<HTMLElement>;
10
+ filterDropdownProps?: FilterDropdownProps;
11
+ filters?: Filter[];
23
12
  }
24
- export interface RenderDropdownProps {
13
+ export interface RenderDropdownProps extends FilterDropdownProps, RenderFilterDropdownProps {
25
14
  filterMultiple?: boolean;
26
15
  filters?: Filter[];
27
16
  filteredValue?: any[];
28
17
  filterDropdownVisible?: boolean;
29
18
  onSelect?: (data: OnSelectData) => void;
30
19
  onFilterDropdownVisibleChange?: OnFilterDropdownVisibleChange;
31
- trigger?: Trigger;
32
- position?: Position;
20
+ renderFilterDropdown?: (props?: RenderFilterDropdownProps) => React.ReactNode;
33
21
  renderFilterDropdownItem?: RenderFilterDropdownItem;
34
22
  }
23
+ export interface FilterDropdownProps extends Omit<DropdownProps, 'render' | 'onVisibleChange'> {
24
+ }
25
+ export interface OnSelectData {
26
+ value?: any;
27
+ /** only this value is used now */
28
+ filteredValue: any;
29
+ included?: boolean;
30
+ domEvent?: React.MouseEvent<HTMLElement>;
31
+ }
32
+ export interface RenderFilterDropdownProps {
33
+ /** temporary filteredValue */
34
+ tempFilteredValue: any[];
35
+ /** set temporary filteredValue */
36
+ setTempFilteredValue: (tempFilteredValue: any[]) => void;
37
+ /** set tempFilteredValue to filteredValue. You can also pass filteredValue to directly set the filteredValue */
38
+ confirm: (props?: {
39
+ closeDropdown?: boolean;
40
+ filteredValue?: any[];
41
+ }) => void;
42
+ /** clear tempFilteredValue and filteredValue */
43
+ clear: (props?: {
44
+ closeDropdown?: boolean;
45
+ }) => void;
46
+ /** close dropdown */
47
+ close: () => void;
48
+ /** column filters */
49
+ filters?: RenderDropdownProps['filters'];
50
+ }
@@ -1,13 +1,14 @@
1
+ import _pick from "lodash/pick";
1
2
  import _noop from "lodash/noop";
2
- import React, { isValidElement } from 'react';
3
+ import _isEqual from "lodash/isEqual";
4
+ import React, { isValidElement, useEffect, useState } from 'react';
3
5
  import cls from 'classnames';
4
6
  import { IconFilter } from '@douyinfe/semi-icons';
5
7
  import { cssClasses } from '@douyinfe/semi-foundation/lib/es/table/constants';
6
8
  import Dropdown from '../dropdown';
7
9
  import { Radio } from '../radio';
8
10
  import { Checkbox } from '../checkbox';
9
- function renderDropdown() {
10
- let props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
11
+ function renderDropdown(props) {
11
12
  let nestedElem = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
12
13
  let level = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
13
14
  const {
@@ -19,77 +20,80 @@ function renderDropdown() {
19
20
  onFilterDropdownVisibleChange = _noop,
20
21
  trigger = 'click',
21
22
  position = 'bottom',
23
+ renderFilterDropdown,
22
24
  renderFilterDropdownItem
23
- } = props;
25
+ } = props !== null && props !== void 0 ? props : {};
26
+ const renderFilterDropdownProps = _pick(props, ['tempFilteredValue', 'setTempFilteredValue', 'confirm', 'clear', 'close', 'filters']);
27
+ const render = typeof renderFilterDropdown === 'function' ? renderFilterDropdown(renderFilterDropdownProps) : /*#__PURE__*/React.createElement(Dropdown.Menu, null, Array.isArray(filters) && filters.map((filter, index) => {
28
+ const changeFn = e => {
29
+ const domEvent = e && e.nativeEvent;
30
+ if (domEvent) {
31
+ // Block this event to prevent the pop-up layer from closing
32
+ domEvent.stopImmediatePropagation();
33
+ // Prevent bubbling and default events to prevent label click events from triggering twice
34
+ domEvent.stopPropagation();
35
+ domEvent.preventDefault();
36
+ }
37
+ let values = [...filteredValue];
38
+ const included = values.includes(filter.value);
39
+ const idx = values.indexOf(filter.value);
40
+ if (idx > -1) {
41
+ values.splice(idx, 1);
42
+ } else if (filterMultiple) {
43
+ values.push(filter.value);
44
+ } else {
45
+ values = [filter.value];
46
+ }
47
+ return onSelect({
48
+ value: filter.value,
49
+ filteredValue: values,
50
+ included: !included,
51
+ domEvent
52
+ });
53
+ };
54
+ const checked = filteredValue.includes(filter.value);
55
+ const {
56
+ text
57
+ } = filter;
58
+ const {
59
+ value
60
+ } = filter;
61
+ const key = `${level}_${index}`;
62
+ const dropdownItem = typeof renderFilterDropdownItem === 'function' ? renderFilterDropdownItem({
63
+ onChange: changeFn,
64
+ filterMultiple,
65
+ value,
66
+ text,
67
+ checked,
68
+ filteredValue,
69
+ level
70
+ }) : null;
71
+ let item = dropdownItem && /*#__PURE__*/React.isValidElement(dropdownItem) ? /*#__PURE__*/React.cloneElement(dropdownItem, {
72
+ key
73
+ }) : /*#__PURE__*/React.createElement(Dropdown.Item, {
74
+ key: key,
75
+ onClick: changeFn
76
+ }, filterMultiple ? /*#__PURE__*/React.createElement(Checkbox, {
77
+ checked: checked
78
+ }, text) : /*#__PURE__*/React.createElement(Radio, {
79
+ checked: checked
80
+ }, text));
81
+ if (Array.isArray(filter.children) && filter.children.length) {
82
+ const childrenDropdownProps = Object.assign(Object.assign({}, props), {
83
+ filters: filter.children,
84
+ trigger: 'hover',
85
+ position: 'right'
86
+ });
87
+ delete childrenDropdownProps.filterDropdownVisible;
88
+ item = renderDropdown(childrenDropdownProps, item, level + 1);
89
+ }
90
+ return item;
91
+ }));
24
92
  const dropdownProps = Object.assign(Object.assign({}, props), {
25
93
  onVisibleChange: visible => onFilterDropdownVisibleChange(visible),
26
94
  trigger,
27
95
  position,
28
- render: /*#__PURE__*/React.createElement(Dropdown.Menu, null, Array.isArray(filters) && filters.map((filter, index) => {
29
- const changeFn = e => {
30
- const domEvent = e && e.nativeEvent;
31
- if (domEvent) {
32
- // Block this event to prevent the pop-up layer from closing
33
- domEvent.stopImmediatePropagation();
34
- // Prevent bubbling and default events to prevent label click events from triggering twice
35
- domEvent.stopPropagation();
36
- domEvent.preventDefault();
37
- }
38
- let values = [...filteredValue];
39
- const included = values.includes(filter.value);
40
- const idx = values.indexOf(filter.value);
41
- if (idx > -1) {
42
- values.splice(idx, 1);
43
- } else if (filterMultiple) {
44
- values.push(filter.value);
45
- } else {
46
- values = [filter.value];
47
- }
48
- return onSelect({
49
- value: filter.value,
50
- filteredValue: values,
51
- included: !included,
52
- domEvent
53
- });
54
- };
55
- const checked = filteredValue.includes(filter.value);
56
- const {
57
- text
58
- } = filter;
59
- const {
60
- value
61
- } = filter;
62
- const key = `${level}_${index}`;
63
- const dropdownItem = typeof renderFilterDropdownItem === 'function' ? renderFilterDropdownItem({
64
- onChange: changeFn,
65
- filterMultiple,
66
- value,
67
- text,
68
- checked,
69
- filteredValue,
70
- level
71
- }) : null;
72
- let item = dropdownItem && /*#__PURE__*/React.isValidElement(dropdownItem) ? /*#__PURE__*/React.cloneElement(dropdownItem, {
73
- key
74
- }) : /*#__PURE__*/React.createElement(Dropdown.Item, {
75
- key: key,
76
- onClick: changeFn
77
- }, filterMultiple ? /*#__PURE__*/React.createElement(Checkbox, {
78
- checked: checked
79
- }, text) : /*#__PURE__*/React.createElement(Radio, {
80
- checked: checked
81
- }, text));
82
- if (Array.isArray(filter.children) && filter.children.length) {
83
- const childrenDropdownProps = Object.assign(Object.assign({}, props), {
84
- filters: filter.children,
85
- trigger: 'hover',
86
- position: 'right'
87
- });
88
- delete childrenDropdownProps.filterDropdownVisible;
89
- item = renderDropdown(childrenDropdownProps, item, level + 1);
90
- }
91
- return item;
92
- }))
96
+ render
93
97
  });
94
98
  if (filterDropdownVisible != null) {
95
99
  dropdownProps.visible = filterDropdownVisible;
@@ -105,12 +109,68 @@ export default function ColumnFilter() {
105
109
  prefixCls = cssClasses.PREFIX,
106
110
  filteredValue,
107
111
  filterIcon = 'filter',
112
+ filterDropdownProps,
113
+ onSelect,
114
+ filterDropdownVisible,
108
115
  renderFilterDropdown,
109
- filterDropdownProps
116
+ onFilterDropdownVisibleChange
110
117
  } = props;
111
118
  let {
112
119
  filterDropdown = null
113
120
  } = props;
121
+ // custom filter related status
122
+ const isFilterDropdownVisibleControlled = typeof filterDropdownVisible !== 'undefined';
123
+ const isCustomFilterDropdown = typeof renderFilterDropdown === 'function';
124
+ const isCustomDropdownVisible = !isFilterDropdownVisibleControlled && isCustomFilterDropdown;
125
+ const [tempFilteredValue, setTempFilteredValue] = useState(filteredValue);
126
+ const dropdownVisibleInitValue = isCustomDropdownVisible ? false : filterDropdownVisible;
127
+ const [dropdownVisible, setDropdownVisible] = useState(dropdownVisibleInitValue);
128
+ useEffect(() => {
129
+ if (typeof filterDropdownVisible !== 'undefined') {
130
+ setDropdownVisible(filterDropdownVisible);
131
+ }
132
+ }, [filterDropdownVisible]);
133
+ useEffect(() => {
134
+ setTempFilteredValue(filteredValue);
135
+ }, [filteredValue]);
136
+ const confirm = function () {
137
+ let props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
138
+ const newFilteredValue = (props === null || props === void 0 ? void 0 : props.filteredValue) || tempFilteredValue;
139
+ if (!_isEqual(newFilteredValue, filteredValue)) {
140
+ onSelect({
141
+ filteredValue: newFilteredValue
142
+ });
143
+ }
144
+ if (props.closeDropdown) {
145
+ setDropdownVisible(false);
146
+ }
147
+ };
148
+ const clear = function () {
149
+ let props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
150
+ setTempFilteredValue([]);
151
+ onSelect({
152
+ filteredValue: []
153
+ });
154
+ if (props.closeDropdown) {
155
+ setDropdownVisible(false);
156
+ }
157
+ };
158
+ const close = () => {
159
+ setDropdownVisible(false);
160
+ };
161
+ const handleFilterDropdownVisibleChange = visible => {
162
+ if (isCustomDropdownVisible) {
163
+ setDropdownVisible(visible);
164
+ }
165
+ onFilterDropdownVisibleChange(visible);
166
+ };
167
+ const renderFilterDropdownProps = {
168
+ tempFilteredValue,
169
+ setTempFilteredValue,
170
+ confirm,
171
+ clear,
172
+ close
173
+ };
114
174
  const finalCls = cls(`${prefixCls}-column-filter`, {
115
175
  on: Array.isArray(filteredValue) && filteredValue.length
116
176
  });
@@ -130,9 +190,10 @@ export default function ColumnFilter() {
130
190
  size: "default"
131
191
  }));
132
192
  }
133
- const renderProps = Object.assign(Object.assign({}, props), filterDropdownProps);
134
- filterDropdown = /*#__PURE__*/React.isValidElement(filterDropdown) ? filterDropdown : typeof renderFilterDropdown === 'function' ? renderFilterDropdown(renderProps, {
135
- iconElem
136
- }) : renderDropdown(renderProps, iconElem);
193
+ const renderProps = Object.assign(Object.assign(Object.assign(Object.assign({}, props), filterDropdownProps), renderFilterDropdownProps), {
194
+ filterDropdownVisible: isFilterDropdownVisibleControlled ? filterDropdownVisible : dropdownVisible,
195
+ onFilterDropdownVisibleChange: handleFilterDropdownVisibleChange
196
+ });
197
+ filterDropdown = /*#__PURE__*/React.isValidElement(filterDropdown) ? filterDropdown : renderDropdown(renderProps, iconElem);
137
198
  return filterDropdown;
138
199
  }
@@ -57,7 +57,7 @@ const ResizableTable = function () {
57
57
  width: numbers.DEFAULT_WIDTH_COLUMN_EXPAND
58
58
  });
59
59
  }
60
- if (props.rowSelection && !_get(props.rowSelection, 'hidden') && !_find(rawColumns, item => item.key === strings.DEFAULT_KEY_COLUMN_SELECTION)) {
60
+ if (props.rowSelection && !_find(rawColumns, item => item.key === strings.DEFAULT_KEY_COLUMN_SELECTION)) {
61
61
  newColumns.unshift({
62
62
  width: _get(props, 'rowSelection.width', numbers.DEFAULT_WIDTH_COLUMN_SELECTION),
63
63
  key: strings.DEFAULT_KEY_COLUMN_SELECTION
@@ -1,7 +1,7 @@
1
1
  import React, { ReactNode } from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import Store from '@douyinfe/semi-foundation/lib/es/utils/Store';
4
- import TableFoundation, { TableAdapter, BaseRowKeyType, BaseHeadWidth } from '@douyinfe/semi-foundation/lib/es/table/foundation';
4
+ import TableFoundation, { TableAdapter, BasePageData, BaseRowKeyType, BaseHeadWidth } from '@douyinfe/semi-foundation/lib/es/table/foundation';
5
5
  import { TableSelectionCellEvent } from '@douyinfe/semi-foundation/lib/es/table/tableSelectionCellFoundation';
6
6
  import { strings } from '@douyinfe/semi-foundation/lib/es/table/constants';
7
7
  import '@douyinfe/semi-foundation/lib/es/table/table.css';
@@ -185,7 +185,7 @@ declare class Table<RecordType extends Record<string, any>> extends BaseComponen
185
185
  _invokeRowSelection: (funcName: string, ...args: any[]) => void;
186
186
  _invokeColumnFn: (key: string, funcName: string, ...args: any[]) => void;
187
187
  _cacheHeaderRef: (node: HTMLDivElement) => void;
188
- getCurrentPageData: () => any;
188
+ getCurrentPageData: () => Pick<BasePageData<RecordType>, "dataSource" | "groups">;
189
189
  getColumns: (columns: ColumnProps<RecordType>[], children: ReactNode) => ColumnProps<RecordType>[];
190
190
  getCellWidths: (...args: any[]) => number[];
191
191
  setHeadWidths: (...args: any[]) => void;
@@ -200,8 +200,8 @@ declare class Table<RecordType extends Record<string, any>> extends BaseComponen
200
200
  setScrollPosition: (position: BodyScrollPosition) => void;
201
201
  setScrollPositionClassName: () => void;
202
202
  syncTableWidth: () => void;
203
- renderSelection: (record?: any, inHeader?: boolean) => React.ReactNode;
204
- renderRowSelectionCallback: (text: string, record?: RecordType) => React.ReactNode;
203
+ renderSelection: (record?: any, inHeader?: boolean, index?: number) => React.ReactNode;
204
+ renderRowSelectionCallback: (text: string, record: RecordType, index: number) => React.ReactNode;
205
205
  renderTitleSelectionCallback: () => React.ReactNode;
206
206
  normalizeSelectionColumn: (props?: {
207
207
  rowSelection?: TableStateRowSelection<RecordType>;
@@ -283,7 +283,7 @@ declare class Table<RecordType extends Record<string, any>> extends BaseComponen
283
283
  * @param {ReactNode} children
284
284
  * @returns {Array}
285
285
  */
286
- normalizeColumns: (columns: ColumnProps<RecordType>[], children: ReactNode) => any;
286
+ normalizeColumns: (columns: ColumnProps<RecordType>[], children: ReactNode) => ColumnProps<RecordType>[];
287
287
  /**
288
288
  * Combine pagination and table paging processing functions
289
289
  */