@douyinfe/semi-ui 2.51.3 → 2.52.0-beta.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 (51) 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 +434 -111
  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/dropdown/dropdownItem.js +2 -1
  15. package/lib/cjs/input/index.d.ts +1 -0
  16. package/lib/cjs/input/index.js +12 -4
  17. package/lib/cjs/modal/Modal.d.ts +1 -0
  18. package/lib/cjs/modal/Modal.js +11 -3
  19. package/lib/cjs/modal/confirm.d.ts +5 -0
  20. package/lib/cjs/slider/index.js +33 -1
  21. package/lib/cjs/table/ColumnFilter.d.ts +34 -18
  22. package/lib/cjs/table/ColumnFilter.js +134 -73
  23. package/lib/cjs/table/Table.d.ts +5 -5
  24. package/lib/cjs/table/Table.js +38 -13
  25. package/lib/cjs/table/index.d.ts +1 -1
  26. package/lib/cjs/table/interface.d.ts +30 -10
  27. package/lib/cjs/treeSelect/index.d.ts +2 -0
  28. package/lib/cjs/treeSelect/index.js +4 -0
  29. package/lib/es/_utils/index.d.ts +2 -1
  30. package/lib/es/_utils/index.js +0 -5
  31. package/lib/es/avatar/TopSlotSvg.d.ts +5 -0
  32. package/lib/es/avatar/TopSlotSvg.js +66 -0
  33. package/lib/es/avatar/index.d.ts +25 -0
  34. package/lib/es/avatar/index.js +126 -8
  35. package/lib/es/avatar/interface.d.ts +24 -1
  36. package/lib/es/dropdown/dropdownItem.js +2 -1
  37. package/lib/es/input/index.d.ts +1 -0
  38. package/lib/es/input/index.js +12 -4
  39. package/lib/es/modal/Modal.d.ts +1 -0
  40. package/lib/es/modal/Modal.js +11 -3
  41. package/lib/es/modal/confirm.d.ts +5 -0
  42. package/lib/es/slider/index.js +33 -1
  43. package/lib/es/table/ColumnFilter.d.ts +34 -18
  44. package/lib/es/table/ColumnFilter.js +135 -74
  45. package/lib/es/table/Table.d.ts +5 -5
  46. package/lib/es/table/Table.js +38 -13
  47. package/lib/es/table/index.d.ts +1 -1
  48. package/lib/es/table/interface.d.ts +30 -10
  49. package/lib/es/treeSelect/index.d.ts +2 -0
  50. package/lib/es/treeSelect/index.js +4 -0
  51. package/package.json +8 -8
@@ -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
  }
@@ -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
  */
@@ -468,6 +468,7 @@ class Table extends BaseComponent {
468
468
  this.renderSelection = function () {
469
469
  let record = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
470
470
  let inHeader = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
471
+ let index = arguments.length > 2 ? arguments[2] : undefined;
471
472
  const {
472
473
  rowSelection,
473
474
  allDisabledRowKeysSet
@@ -477,43 +478,67 @@ class Table extends BaseComponent {
477
478
  selectedRowKeys = [],
478
479
  selectedRowKeysSet = new Set(),
479
480
  getCheckboxProps,
480
- disabled
481
+ disabled,
482
+ renderCell
481
483
  } = rowSelection;
484
+ const allRowKeys = _this2.cachedFilteredSortedRowKeys;
485
+ const allRowKeysSet = _this2.cachedFilteredSortedRowKeysSet;
486
+ const allIsSelected = _this2.foundation.allIsSelected(selectedRowKeysSet, allDisabledRowKeysSet, allRowKeys);
487
+ const hasRowSelected = _this2.foundation.hasRowSelected(selectedRowKeys, allRowKeysSet);
488
+ const indeterminate = hasRowSelected && !allIsSelected;
482
489
  if (inHeader) {
483
490
  const columnKey = _get(rowSelection, 'key', strings.DEFAULT_KEY_COLUMN_SELECTION);
484
- const allRowKeys = _this2.cachedFilteredSortedRowKeys;
485
- const allRowKeysSet = _this2.cachedFilteredSortedRowKeysSet;
486
- const allIsSelected = _this2.foundation.allIsSelected(selectedRowKeysSet, allDisabledRowKeysSet, allRowKeys);
487
- const hasRowSelected = _this2.foundation.hasRowSelected(selectedRowKeys, allRowKeysSet);
488
- return /*#__PURE__*/React.createElement(ColumnSelection, {
491
+ const originNode = /*#__PURE__*/React.createElement(ColumnSelection, {
489
492
  "aria-label": `${allIsSelected ? 'Deselect' : 'Select'} all rows`,
490
493
  disabled: disabled,
491
494
  key: columnKey,
492
495
  selected: allIsSelected,
493
- indeterminate: hasRowSelected && !allIsSelected,
496
+ indeterminate: indeterminate,
494
497
  onChange: (selected, e) => {
495
498
  _this2.toggleSelectAllRow(selected, e);
496
499
  }
497
500
  });
501
+ const selectAll = (selected, e) => _this2.toggleSelectAllRow(selected, e);
502
+ return _isFunction(renderCell) ? renderCell({
503
+ selected: allIsSelected,
504
+ record,
505
+ originNode,
506
+ inHeader,
507
+ disabled,
508
+ indeterminate,
509
+ selectAll
510
+ }) : originNode;
498
511
  } else {
499
512
  const key = _this2.foundation.getRecordKey(record);
500
513
  const selected = selectedRowKeysSet.has(key);
501
514
  const checkboxPropsFn = () => typeof getCheckboxProps === 'function' ? getCheckboxProps(record) : {};
502
- return /*#__PURE__*/React.createElement(ColumnSelection, {
515
+ const originNode = /*#__PURE__*/React.createElement(ColumnSelection, {
503
516
  "aria-label": `${selected ? 'Deselect' : 'Select'} this row`,
504
517
  getCheckboxProps: checkboxPropsFn,
505
518
  selected: selected,
506
519
  onChange: (status, e) => _this2.toggleSelectRow(status, key, e)
507
520
  });
521
+ const selectRow = (selected, e) => _this2.toggleSelectRow(selected, key, e);
522
+ return _isFunction(renderCell) ? renderCell({
523
+ selected,
524
+ record,
525
+ index,
526
+ originNode,
527
+ inHeader: false,
528
+ disabled,
529
+ indeterminate,
530
+ selectRow
531
+ }) : originNode;
508
532
  }
509
533
  }
510
534
  return null;
511
535
  };
512
536
  this.renderRowSelectionCallback = function (text) {
513
537
  let record = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
514
- return _this2.renderSelection(record);
538
+ let index = arguments.length > 2 ? arguments[2] : undefined;
539
+ return _this2.renderSelection(record, false, index);
515
540
  };
516
- this.renderTitleSelectionCallback = () => this.renderSelection(null, true);
541
+ this.renderTitleSelectionCallback = () => this.renderSelection(undefined, true);
517
542
  this.normalizeSelectionColumn = function () {
518
543
  let props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
519
544
  const {
@@ -608,7 +633,7 @@ class Table extends BaseComponent {
608
633
  const {
609
634
  prefixCls
610
635
  } = _this2.props;
611
- if (column && (column.sorter || column.filters || column.useFullRender)) {
636
+ if (column && (column.sorter || column.filters || column.onFilter || column.useFullRender)) {
612
637
  let hasSorterOrFilter = false;
613
638
  const {
614
639
  dataIndex,
@@ -650,10 +675,10 @@ class Table extends BaseComponent {
650
675
  const stateFilteredValue = _get(curQuery, 'filteredValue');
651
676
  const defaultFilteredValue = _get(curQuery, 'defaultFilteredValue');
652
677
  const filteredValue = stateFilteredValue ? stateFilteredValue : defaultFilteredValue;
653
- if (Array.isArray(column.filters) && column.filters.length || /*#__PURE__*/isValidElement(column.filterDropdown)) {
678
+ if (Array.isArray(column.filters) && column.filters.length || /*#__PURE__*/isValidElement(column.filterDropdown) || typeof column.renderFilterDropdown === 'function') {
654
679
  const filter = /*#__PURE__*/React.createElement(ColumnFilter, Object.assign({
655
680
  key: strings.DEFAULT_KEY_COLUMN_FILTER
656
- }, curQuery, {
681
+ }, _omit(curQuery, 'children'), {
657
682
  filteredValue: filteredValue,
658
683
  onFilterDropdownVisibleChange: visible => _this2.foundation.toggleShowFilter(dataIndex, visible),
659
684
  onSelect: data => _this2.foundation.handleFilterSelect(dataIndex, data)
@@ -96,7 +96,7 @@ declare class Table<RecordType extends Record<string, any> = Data> extends React
96
96
  tableRef: React.RefObject<NormalTable<RecordType>>;
97
97
  context: ContextValue;
98
98
  constructor(props: TableProps);
99
- getCurrentPageData: () => any;
99
+ getCurrentPageData: () => Pick<import("@douyinfe/semi-foundation/lib/es/table/foundation").BasePageData<RecordType>, "dataSource" | "groups">;
100
100
  render(): JSX.Element;
101
101
  }
102
102
  export * from './interface';
@@ -1,13 +1,13 @@
1
1
  import React, { ReactNode, MutableRefObject } from 'react';
2
- import { BaseProps } from '../_base/baseComponent';
3
- import { PaginationProps } from '../pagination';
4
- import { CheckboxProps } from '../checkbox';
5
- import { DropdownProps } from '../dropdown';
6
- import { Locale } from '../locale/interface';
7
- import { ArrayElement } from '../_base/base';
2
+ import type { BaseProps } from '../_base/baseComponent';
3
+ import type { PaginationProps } from '../pagination';
4
+ import type { CheckboxProps } from '../checkbox';
5
+ import type { Locale } from '../locale/interface';
6
+ import type { ArrayElement } from '../_base/base';
8
7
  import { strings } from '@douyinfe/semi-foundation/lib/es/table/constants';
9
- import { BaseRowKeyType, BaseSortOrder, BaseGroupBy, BaseGroupByFn, BaseFixed, BaseAlign, BaseChangeInfoSorter, BaseSorter, BaseFilter, BaseChangeInfoFilter, BaseIncludeGroupRecord, BaseEllipsis } from '@douyinfe/semi-foundation/lib/es/table/foundation';
10
- import { ScrollDirection, CSSDirection } from 'react-window';
8
+ import type { BaseRowKeyType, BaseSortOrder, BaseGroupBy, BaseGroupByFn, BaseFixed, BaseAlign, BaseChangeInfoSorter, BaseSorter, BaseFilter, BaseChangeInfoFilter, BaseIncludeGroupRecord, BaseEllipsis } from '@douyinfe/semi-foundation/lib/es/table/foundation';
9
+ import type { ScrollDirection, CSSDirection } from 'react-window';
10
+ import type { ColumnFilterProps } from './ColumnFilter';
11
11
  export interface TableProps<RecordType extends Record<string, any> = any> extends BaseProps {
12
12
  bordered?: boolean;
13
13
  children?: ReactNode;
@@ -65,29 +65,37 @@ export interface ColumnProps<RecordType extends Record<string, any> = any> {
65
65
  children?: Array<ColumnProps<RecordType>>;
66
66
  className?: string;
67
67
  colSpan?: number;
68
+ /** use `dataIndex` to get current column data item from record. If you use `sorter` or `onFilter`, a unique `dataIndex` is required */
68
69
  dataIndex?: string;
69
70
  defaultFilteredValue?: any[];
70
71
  defaultSortOrder?: SortOrder;
71
72
  filterChildrenRecord?: boolean;
72
- filterDropdown?: React.ReactNode;
73
- filterDropdownProps?: DropdownProps;
73
+ filterDropdown?: ColumnFilterProps['filterDropdown'];
74
+ /** render filter Dropdown panel content */
75
+ renderFilterDropdown?: ColumnFilterProps['renderFilterDropdown'];
76
+ /** filter Dropdown props */
77
+ filterDropdownProps?: ColumnFilterProps['filterDropdownProps'];
74
78
  filterDropdownVisible?: boolean;
75
79
  filterIcon?: FilterIcon;
76
80
  filterMultiple?: boolean;
77
81
  filteredValue?: any[];
82
+ /** `filters` is not required if you use `renderFilterDropdown` */
78
83
  filters?: Filter[];
79
84
  fixed?: Fixed;
85
+ /** the key required by React. If you have already set the `dataIndex`, the key does not need to be set again. */
80
86
  key?: string | number;
81
87
  render?: ColumnRender<RecordType>;
82
88
  renderFilterDropdownItem?: RenderFilterDropdownItem;
83
89
  sortChildrenRecord?: boolean;
84
90
  sortOrder?: SortOrder;
91
+ /** enable sorting, `dataIndex` is required at the same time */
85
92
  sorter?: Sorter<RecordType>;
86
93
  sortIcon?: SortIcon;
87
94
  title?: ColumnTitle;
88
95
  useFullRender?: boolean;
89
96
  width?: string | number;
90
97
  onCell?: OnCell<RecordType>;
98
+ /** enable filtering, `dataIndex` is required at the same time */
91
99
  onFilter?: OnFilter<RecordType>;
92
100
  onFilterDropdownVisibleChange?: OnFilterDropdownVisibleChange;
93
101
  onHeaderCell?: OnHeaderCell<RecordType>;
@@ -217,7 +225,19 @@ export interface RowSelectionProps<RecordType> {
217
225
  onChange?: RowSelectionOnChange<RecordType>;
218
226
  onSelect?: RowSelectionOnSelect<RecordType>;
219
227
  onSelectAll?: RowSelectionOnSelectAll<RecordType>;
228
+ renderCell?: RowSelectionRenderCell<RecordType>;
220
229
  }
230
+ export type RowSelectionRenderCell<RecordType> = (renderCellArgs: {
231
+ selected: boolean;
232
+ record: RecordType;
233
+ originNode: JSX.Element;
234
+ inHeader: boolean;
235
+ disabled: boolean;
236
+ indeterminate: boolean;
237
+ index?: number;
238
+ selectRow?: (selected: boolean, e: Event) => void;
239
+ selectAll?: (selected: boolean, e: Event) => void;
240
+ }) => ReactNode;
221
241
  export type GetCheckboxProps<RecordType> = (record: RecordType) => CheckboxProps;
222
242
  export type RowSelectionOnChange<RecordType> = (selectedRowKeys?: (string | number)[], selectedRows?: RecordType[]) => void;
223
243
  export type RowSelectionOnSelect<RecordType> = (record?: RecordType, selected?: boolean, selectedRows?: RecordType[], nativeEvent?: React.MouseEvent) => void;
@@ -82,6 +82,7 @@ export interface TreeSelectProps extends Omit<BasicTreeSelectProps, OverrideComm
82
82
  onChange?: OnChange;
83
83
  onFocus?: (e: React.MouseEvent) => void;
84
84
  onVisibleChange?: (isVisible: boolean) => void;
85
+ onClear?: (e: React.MouseEvent | React.KeyboardEvent<HTMLDivElement>) => void;
85
86
  }
86
87
  export type OverrideCommonState = 'keyEntities' | 'treeData' | 'disabledKeys' | 'flattenNodes';
87
88
  export interface TreeSelectState extends Omit<BasicTreeSelectInnerData, OverrideCommonState | 'prevProps'>, Pick<TreeState, OverrideCommonState> {
@@ -121,6 +122,7 @@ declare class TreeSelect extends BaseComponent<TreeSelectProps, TreeSelectState>
121
122
  virtualize: PropTypes.Requireable<object>;
122
123
  treeNodeFilterProp: PropTypes.Requireable<string>;
123
124
  onChange: PropTypes.Requireable<(...args: any[]) => any>;
125
+ onClear: PropTypes.Requireable<(...args: any[]) => any>;
124
126
  onSearch: PropTypes.Requireable<(...args: any[]) => any>;
125
127
  onSelect: PropTypes.Requireable<(...args: any[]) => any>;
126
128
  onExpand: PropTypes.Requireable<(...args: any[]) => any>;
@@ -1146,6 +1146,9 @@ class TreeSelect extends BaseComponent {
1146
1146
  onLoad
1147
1147
  } = this.props;
1148
1148
  _isFunction(onLoad) && onLoad(newLoadedKeys, data);
1149
+ },
1150
+ notifyClear: e => {
1151
+ this.props.onClear && this.props.onClear(e);
1149
1152
  }
1150
1153
  };
1151
1154
  return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, super.adapter), filterAdapter), treeSelectAdapter), treeAdapter), {
@@ -1317,6 +1320,7 @@ TreeSelect.propTypes = {
1317
1320
  virtualize: PropTypes.object,
1318
1321
  treeNodeFilterProp: PropTypes.string,
1319
1322
  onChange: PropTypes.func,
1323
+ onClear: PropTypes.func,
1320
1324
  onSearch: PropTypes.func,
1321
1325
  onSelect: PropTypes.func,
1322
1326
  onExpand: PropTypes.func,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@douyinfe/semi-ui",
3
- "version": "2.51.3",
3
+ "version": "2.52.0-beta.0",
4
4
  "description": "A modern, comprehensive, flexible design system and UI library. Connect DesignOps & DevOps. Quickly build beautiful React apps. Maintained by Douyin-fe team.",
5
5
  "main": "lib/cjs/index.js",
6
6
  "module": "lib/es/index.js",
@@ -20,12 +20,12 @@
20
20
  "@dnd-kit/core": "^6.0.8",
21
21
  "@dnd-kit/sortable": "^7.0.2",
22
22
  "@dnd-kit/utilities": "^3.2.1",
23
- "@douyinfe/semi-animation": "2.51.3",
24
- "@douyinfe/semi-animation-react": "2.51.3",
25
- "@douyinfe/semi-foundation": "2.51.3",
26
- "@douyinfe/semi-icons": "2.51.3",
27
- "@douyinfe/semi-illustrations": "2.51.3",
28
- "@douyinfe/semi-theme-default": "2.51.3",
23
+ "@douyinfe/semi-animation": "2.52.0-beta.0",
24
+ "@douyinfe/semi-animation-react": "2.52.0-beta.0",
25
+ "@douyinfe/semi-foundation": "2.52.0-beta.0",
26
+ "@douyinfe/semi-icons": "2.52.0-beta.0",
27
+ "@douyinfe/semi-illustrations": "2.52.0-beta.0",
28
+ "@douyinfe/semi-theme-default": "2.52.0-beta.0",
29
29
  "async-validator": "^3.5.0",
30
30
  "classnames": "^2.2.6",
31
31
  "copy-text-to-clipboard": "^2.1.1",
@@ -75,7 +75,7 @@
75
75
  ],
76
76
  "author": "",
77
77
  "license": "MIT",
78
- "gitHead": "d39b89cf05ae9bed8f2a18f6d73026b915db87a4",
78
+ "gitHead": "92b9e3fc80cd5a352f6b9a1ffcb8f5191c688d95",
79
79
  "devDependencies": {
80
80
  "@babel/plugin-proposal-decorators": "^7.15.8",
81
81
  "@babel/plugin-transform-runtime": "^7.15.8",