@alifd/next
Version:
A configurable component library for web built on React.
285 lines (284 loc) • 9.12 kB
TypeScript
import type React from 'react';
import type { CommonProps } from '../util';
import type { SearchProps } from '../search';
import type { Locale } from '../locale/types';
export type TransferLocale = Locale['Transfer'];
/**
* @api TransferDataItem
*/
export type TransferDataItem = {
label: string | React.ReactNode;
value: string;
title?: string;
disabled?: boolean;
children?: TransferDataItem[];
[key: string]: unknown;
};
/**
* @api PositionType
*/
export type PositionType = 'left' | 'right';
/**
* @api DragGapType
*/
export type DragGapType = 'before' | 'after';
/**
* @api ExtraOptions
*/
export type ExtraOptions = {
/**
* 移动的方向,值为'left'或'right'
* @en Move direction, 'left' or 'right'
*/
direction: PositionType;
/**
* 左面板值
* @en Data of left panel
*/
leftValue: string[];
/**
* 左面板数据
* @en Data of left panel
*/
leftData: TransferDataItem[];
/**
* 发生移动的数据
* @en Moved data
*/
movedData: TransferDataItem[];
/**
* 发生移动的值
* @en Moved value
*/
movedValue: string[];
};
type HTMLAttributesWeak = Omit<React.HTMLAttributes<HTMLElement>, 'onChange' | 'onSelect' | 'defaultValue'>;
export interface TransferItemState {
highlight: boolean;
}
export interface TransferItemProps extends Pick<TransferPanelProps, 'mode' | 'disabled' | 'itemRender'>, Omit<HTMLAttributesWeak, 'title' | 'onClick' | 'onDragOver' | 'onDragStart' | 'onDragEnd' | 'onDrop'>, CommonProps {
locale?: TransferLocale;
item: TransferDataItem;
checked: boolean;
needHighlight: boolean;
draggable: TransferPanelProps['sortable'];
panelPosition: TransferPanelProps['position'];
dragPosition?: PositionType;
dragOverValue?: string | null;
dragValue: string | null;
title?: TransferDataItem['title'];
onCheck: (value: string, checked: boolean) => void;
onClick: TransferPanelProps['onMove'];
onDragStart: (position: PositionType, value: string) => void;
onDragOver: (value: string) => void;
onDragEnd: () => void;
onDrop: (...args: Parameters<Required<TransferPanelProps>['onSort']>) => void;
}
export interface TransferPanelState {
searchedValue: string;
dragValue: string | null;
dragOverValue: string | null;
dragPosition?: PositionType;
}
export interface TransferPanelProps extends Pick<TransferProps, 'mode' | 'disabled' | 'filter' | 'onSearch' | 'searchPlaceholder' | 'notFoundContent' | 'listClassName' | 'itemRender' | 'sortable' | 'listStyle' | 'useVirtual' | 'showCheckAll'>, Omit<HTMLAttributesWeak, 'title'>, CommonProps {
locale?: TransferLocale;
value: string[];
dataSource: TransferDataItem[];
baseId: TransferProps['id'];
position: PositionType;
showSearch?: boolean;
searchProps?: SearchProps;
title?: React.ReactNode;
onMove: (direction: PositionType, v: string) => void;
onMoveAll: (direction: PositionType) => void;
onChange: (position: PositionType, value: string[]) => void;
onSort: (position: PositionType, dragValue: string | null, referenceValue: string, dragGap: DragGapType) => void;
customerList?: TransferProps['children'];
}
export interface TransferState {
value: Array<string>;
leftCheckedValue: Array<string>;
rightCheckedValue: Array<string>;
leftValue: Array<string>;
innerUpdate?: boolean;
}
/**
* @api Transfer
*/
export interface TransferProps extends HTMLAttributesWeak, CommonProps {
/**
* 国际化文案对象
* @skip
*/
locale?: TransferLocale;
/**
* 移动选项模式
* @en Move mode
* @defaultValue 'normal'
*/
mode?: 'normal' | 'simple';
/**
* 数据源
* @en Data source
* @defaultValue []
*/
dataSource?: Array<TransferDataItem>;
/**
* (用于受控)当前值
* @en (under control) current value
*/
value?: Array<string>;
/**
* (用于非受控)初始值
* @en (under uncontrolled) default value
* @defaultValue []
*/
defaultValue?: Array<string>;
/**
* 值发生改变的时候触发的回调函数
* @en Callback function triggered when value change
* @param value - 右面板值 - Value of right panel
* @param data - 右面板数据 - Data of right panel
* @param extra - 额外参数 - Extra parameters
*/
onChange?: (value: Array<string>, data: Array<TransferDataItem>, extra: ExtraOptions) => void;
/**
* Item 被选中的时候触发的回调函数
* @en Callback function triggered when item selected
* @param sourceSelectedValue - 源面板选中的 Item 列表 - Value of checked items in source panel
* @param targetSelectedValue - 目标面板选中的 Item 列表 - Value of checked items in target panel
* @param target - 触发面板 'source' | 'target' - trigger panel `source | target`
*/
onSelect?: (sourceSelectedValue: Array<string>, targetSelectedValue: Array<string>, target: 'source' | 'target') => void;
/**
* 是否禁用
* @en Disable operations on transfer
* @defaultValue false
*/
disabled?: boolean;
/**
* 是否禁用左侧面板
* @en Disable left panel
* @defaultValue false
*/
leftDisabled?: boolean;
/**
* 是否禁用右侧面板
* @en Disable right panel
* @defaultValue false
*/
rightDisabled?: boolean;
/**
* 列表项渲染函数
* @en Item render function
* @param data - 数据 - Data
* @returns 列表项内容 - content of item
*/
itemRender?: (data: TransferDataItem) => React.ReactNode;
/**
* 左右面板是否显示搜索框
* @en Whether to show the search box
* @defaultValue false
*/
showSearch?: boolean | [leftPanel: boolean, rightPanel: boolean];
/**
* 左右面板搜索框配置
* @en Props passed to Search when showSearch is true
*/
searchProps?: SearchProps | [leftPanel: SearchProps, rightPanel: SearchProps];
/**
* 自定义搜索函数
* @en Custom search function
* @param searchedValue - 搜索框输入的值 - Search keyword
* @param data - 数据 - Data
* @returns 是否匹配到 - Whether is matched
*/
filter?: (searchedValue: string, data: TransferDataItem) => boolean;
/**
* 搜索框输入时触发的回调函数
* @en Callback function triggered when search
* @param searchedValue - 搜索框输入的值 - Search keyword
* @param position - 搜索面板的位置 - Position of the search box
*/
onSearch?: (searchedValue: string, position: string) => void;
/**
* 是否开启虚拟滚动
* @en Whether use virtual
*/
useVirtual?: boolean;
/**
* 搜索框占位符
* @en Placeholder of the search box
*/
searchPlaceholder?: string;
/**
* 列表为空显示内容
* @en Content when list is empty
* @defaultValue 'Not Found'
*/
notFoundContent?: React.ReactNode | [leftPanel: React.ReactNode, rightPanel: React.ReactNode];
/**
* 左右面板标题
* @en Title of the left and right panel
* @defaultValue []
*/
titles?: [leftPanel: React.ReactNode, rightPanel: React.ReactNode];
/**
* 向右向左移动按钮显示内容
* @en Text of move buttons
* @defaultValue []
*/
operations?: [leftPanel: React.ReactNode, rightPanel: React.ReactNode];
/**
* 左面板默认选中值
* @en Default checked value of left panel
* @defaultValue []
*/
defaultLeftChecked?: Array<string>;
/**
* 右面板默认选中值
* @en Default checked value of right panel
* @defaultValue []
*/
defaultRightChecked?: Array<string>;
/**
* 左右面板列表自定义样式类名
* @en Custom list class name
*/
listClassName?: string;
/**
* 左右面板列表自定义样式对象
* @en Custom list style
*/
listStyle?: React.CSSProperties;
/**
* 是否允许拖拽排序
* @en Whether to allow drag and drop sort
* @defaultValue false
*/
sortable?: boolean;
/**
* 拖拽排序时触发的回调函数
* @en Callback function triggered when dragging sort
* @param value - 右面板值 - Sorted value
* @param position - 拖拽的面板位置,值为:left 或 right - Position of the sorted panel, 'left' or 'right'
*/
onSort?: (value: Array<string>, position: PositionType) => void;
/**
* 请设置 id 以保证transfer的可访问性
* @en Unique id to make component accessible
*/
id?: string;
/**
* 是否显示底部全选 checkbox
* @en Whether show footer's check-all checkbox
* @defaultValue true
*/
showCheckAll?: boolean;
/**
* 接收 children 自定义渲染列表
* @en Customer panel
*/
children?: (props: TransferPanelProps) => React.ReactNode;
}
export {};