|
@@ -2,7 +2,7 @@ import React from 'react';
|
|
import cls from 'classnames';
|
|
import cls from 'classnames';
|
|
import { SortableContainer, SortableElement, SortableHandle } from 'react-sortable-hoc';
|
|
import { SortableContainer, SortableElement, SortableHandle } from 'react-sortable-hoc';
|
|
import PropTypes from 'prop-types';
|
|
import PropTypes from 'prop-types';
|
|
-import { isEqual, noop, omit, isEmpty, isArray } from 'lodash';
|
|
|
|
|
|
+import { isEqual, noop, omit, isEmpty, isArray, pick } from 'lodash';
|
|
import TransferFoundation, { TransferAdapter, BasicDataItem, OnSortEndProps } from '@douyinfe/semi-foundation/transfer/foundation';
|
|
import TransferFoundation, { TransferAdapter, BasicDataItem, OnSortEndProps } from '@douyinfe/semi-foundation/transfer/foundation';
|
|
import { _generateDataByType, _generateSelectedItems } from '@douyinfe/semi-foundation/transfer/transferUtils';
|
|
import { _generateDataByType, _generateSelectedItems } from '@douyinfe/semi-foundation/transfer/transferUtils';
|
|
import { cssClasses, strings } from '@douyinfe/semi-foundation/transfer/constants';
|
|
import { cssClasses, strings } from '@douyinfe/semi-foundation/transfer/constants';
|
|
@@ -115,7 +115,22 @@ interface HeaderConfig {
|
|
allContent: string;
|
|
allContent: string;
|
|
onAllClick: () => void;
|
|
onAllClick: () => void;
|
|
type: string;
|
|
type: string;
|
|
- showButton: boolean
|
|
|
|
|
|
+ showButton: boolean;
|
|
|
|
+ num: number;
|
|
|
|
+ allChecked?: boolean
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+type SourceHeaderProps = {
|
|
|
|
+ num: number;
|
|
|
|
+ showButton: boolean;
|
|
|
|
+ allChecked: boolean;
|
|
|
|
+ onAllClick: () => void
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+type SelectedHeaderProps = {
|
|
|
|
+ num: number;
|
|
|
|
+ showButton: boolean;
|
|
|
|
+ onClear: () => void
|
|
}
|
|
}
|
|
|
|
|
|
export interface TransferState {
|
|
export interface TransferState {
|
|
@@ -147,7 +162,9 @@ export interface TransferProps {
|
|
renderSourceItem?: (item: RenderSourceItemProps) => React.ReactNode;
|
|
renderSourceItem?: (item: RenderSourceItemProps) => React.ReactNode;
|
|
renderSelectedItem?: (item: RenderSelectedItemProps) => React.ReactNode;
|
|
renderSelectedItem?: (item: RenderSelectedItemProps) => React.ReactNode;
|
|
renderSourcePanel?: (sourcePanelProps: SourcePanelProps) => React.ReactNode;
|
|
renderSourcePanel?: (sourcePanelProps: SourcePanelProps) => React.ReactNode;
|
|
- renderSelectedPanel?: (selectedPanelProps: SelectedPanelProps) => React.ReactNode
|
|
|
|
|
|
+ renderSelectedPanel?: (selectedPanelProps: SelectedPanelProps) => React.ReactNode;
|
|
|
|
+ renderSourceHeader?: (headProps: SourceHeaderProps) => React.ReactNode;
|
|
|
|
+ renderSelectedHeader?: (headProps: SelectedHeaderProps) => React.ReactNode
|
|
}
|
|
}
|
|
|
|
|
|
const prefixCls = cssClasses.PREFIX;
|
|
const prefixCls = cssClasses.PREFIX;
|
|
@@ -336,13 +353,24 @@ class Transfer extends BaseComponent<TransferProps, TransferState> {
|
|
}
|
|
}
|
|
|
|
|
|
renderHeader(headerConfig: HeaderConfig) {
|
|
renderHeader(headerConfig: HeaderConfig) {
|
|
- const { disabled } = this.props;
|
|
|
|
|
|
+ const { disabled, renderSourceHeader, renderSelectedHeader } = this.props;
|
|
const { totalContent, allContent, onAllClick, type, showButton } = headerConfig;
|
|
const { totalContent, allContent, onAllClick, type, showButton } = headerConfig;
|
|
const headerCls = cls({
|
|
const headerCls = cls({
|
|
[`${prefixCls}-header`]: true,
|
|
[`${prefixCls}-header`]: true,
|
|
[`${prefixCls}-right-header`]: type === 'right',
|
|
[`${prefixCls}-right-header`]: type === 'right',
|
|
[`${prefixCls}-left-header`]: type === 'left',
|
|
[`${prefixCls}-left-header`]: type === 'left',
|
|
});
|
|
});
|
|
|
|
+
|
|
|
|
+ if (type === 'left' && typeof renderSourceHeader === 'function') {
|
|
|
|
+ const { num, showButton, allChecked, onAllClick } = headerConfig;
|
|
|
|
+ return renderSourceHeader({ num, showButton, allChecked, onAllClick });
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (type === 'right' && typeof renderSelectedHeader === 'function') {
|
|
|
|
+ const { num, showButton, onAllClick: onClear } = headerConfig;
|
|
|
|
+ return renderSelectedHeader({ num, showButton, onClear });
|
|
|
|
+ }
|
|
|
|
+
|
|
return (
|
|
return (
|
|
<div className={headerCls}>
|
|
<div className={headerCls}>
|
|
<span className={`${prefixCls}-header-total`}>{totalContent}</span>
|
|
<span className={`${prefixCls}-header-total`}>{totalContent}</span>
|
|
@@ -409,6 +437,8 @@ class Transfer extends BaseComponent<TransferProps, TransferState> {
|
|
onAllClick: () => this.foundation.handleAll(leftContainesNotInSelected),
|
|
onAllClick: () => this.foundation.handleAll(leftContainesNotInSelected),
|
|
type: 'left',
|
|
type: 'left',
|
|
showButton: type !== strings.TYPE_TREE_TO_LIST,
|
|
showButton: type !== strings.TYPE_TREE_TO_LIST,
|
|
|
|
+ num: showNumber,
|
|
|
|
+ allChecked: !leftContainesNotInSelected
|
|
};
|
|
};
|
|
const inputCom = this.renderFilter(locale);
|
|
const inputCom = this.renderFilter(locale);
|
|
const headerCom = this.renderHeader(headerConfig);
|
|
const headerCom = this.renderHeader(headerConfig);
|
|
@@ -623,6 +653,7 @@ class Transfer extends BaseComponent<TransferProps, TransferState> {
|
|
onAllClick: () => this.foundation.handleClear(),
|
|
onAllClick: () => this.foundation.handleClear(),
|
|
type: 'right',
|
|
type: 'right',
|
|
showButton: Boolean(selectedData.length),
|
|
showButton: Boolean(selectedData.length),
|
|
|
|
+ num: selectedData.length,
|
|
};
|
|
};
|
|
const headerCom = this.renderHeader(headerConfig);
|
|
const headerCom = this.renderHeader(headerConfig);
|
|
const emptyCom = this.renderEmpty('right', emptyContent.right ? emptyContent.right : locale.emptyRight);
|
|
const emptyCom = this.renderEmpty('right', emptyContent.right ? emptyContent.right : locale.emptyRight);
|