@douyinfe/semi-ui
Version:
A modern, comprehensive, flexible design system and UI library. Connect DesignOps & DevOps. Quickly build beautiful React apps. Maintained by Douyin-fe team.
267 lines (266 loc) • 13.7 kB
TypeScript
import React from 'react';
import PropTypes from 'prop-types';
import { Size, BasicTriggerRenderProps, BasicTreeSelectProps, BasicTreeSelectInnerData, TreeSelectAdapter } from '@douyinfe/semi-foundation/lib/cjs/treeSelect/foundation';
import '@douyinfe/semi-foundation/lib/cjs/tree/tree.css';
import '@douyinfe/semi-foundation/lib/cjs/treeSelect/treeSelect.css';
import BaseComponent, { ValidateStatus } from '../_base/baseComponent';
import { ContextValue } from '../configProvider/context';
import Input, { InputProps } from '../input/index';
import TagInput from '../tagInput';
import { TreeProps, TreeState, FlattenNode, TreeNodeData, TreeNodeProps } from '../tree/interface';
import { PopoverProps } from '../popover/index';
export type ExpandAction = false | 'click' | 'doubleClick';
export interface TriggerRenderProps extends Omit<BasicTriggerRenderProps, 'componentProps'> {
[x: string]: any;
componentProps: TreeSelectProps;
value: TreeNodeData[];
onClear: (e: React.MouseEvent) => void;
}
export interface OnChange {
(value: TreeNodeData['value'] | Array<TreeNodeData['value']>, node: TreeNodeData[] | TreeNodeData, e: React.MouseEvent): void;
(node: TreeNodeData[] | TreeNodeData, e: React.MouseEvent): void;
}
export type RenderSelectedItemInSingle = (treeNode: TreeNodeData) => React.ReactNode;
export type RenderSelectedItemInMultiple = (treeNode: TreeNodeData, otherProps: {
index: number | string;
onClose: (tagContent: any, e: React.MouseEvent) => void;
}) => {
isRenderInTag: boolean;
content: React.ReactNode;
};
export type RenderSelectedItem = RenderSelectedItemInSingle | RenderSelectedItemInMultiple;
export type OverrideCommonProps = 'renderFullLabel' | 'renderLabel' | 'defaultValue' | 'emptyContent' | 'filterTreeNode' | 'style' | 'treeData' | 'value' | 'onExpand' | 'keyMaps' | 'showLine';
/**
* Type definition description:
* TreeSelectProps inherits some properties from BasicTreeSelectProps (from foundation) and TreeProps (from semi-ui-react).
*/
export interface TreeSelectProps extends Omit<BasicTreeSelectProps, OverrideCommonProps | 'validateStatus' | 'searchRender'>, Pick<TreeProps, OverrideCommonProps> {
'aria-describedby'?: React.AriaAttributes['aria-describedby'];
'aria-errormessage'?: React.AriaAttributes['aria-errormessage'];
'aria-invalid'?: React.AriaAttributes['aria-invalid'];
'aria-labelledby'?: React.AriaAttributes['aria-labelledby'];
'aria-required'?: React.AriaAttributes['aria-required'];
motion?: boolean;
mouseEnterDelay?: number;
mouseLeaveDelay?: number;
arrowIcon?: React.ReactNode;
autoAdjustOverflow?: boolean;
clickToHide?: boolean;
clearIcon?: React.ReactNode;
defaultOpen?: boolean;
dropdownClassName?: string;
dropdownMatchSelectWidth?: boolean;
dropdownStyle?: React.CSSProperties;
dropdownMargin?: PopoverProps['margin'];
insetLabel?: React.ReactNode;
insetLabelId?: string;
maxTagCount?: number;
motionExpand?: boolean;
optionListStyle?: React.CSSProperties;
outerBottomSlot?: React.ReactNode;
outerTopSlot?: React.ReactNode;
placeholder?: string;
prefix?: React.ReactNode;
position?: PopoverProps['position'];
searchAutoFocus?: boolean;
searchPlaceholder?: string;
showSearchClear?: boolean;
size?: Size;
suffix?: React.ReactNode;
treeNodeLabelProp?: string;
validateStatus?: ValidateStatus;
zIndex?: number;
searchPosition?: string;
stopPropagation?: boolean | string;
restTagsPopoverProps?: PopoverProps;
expandIcon?: React.ReactNode | ((props: {
onClick: (e: MouseEvent) => void;
className: string;
expanded: boolean;
}) => React.ReactNode);
searchRender?: boolean | ((inputProps: InputProps) => React.ReactNode);
onSelect?: (selectedKey: string, selected: boolean, selectedNode: TreeNodeData) => void;
renderSelectedItem?: RenderSelectedItem;
getPopupContainer?: () => HTMLElement;
triggerRender?: (props: TriggerRenderProps) => React.ReactNode;
onBlur?: (e: React.MouseEvent) => void;
onChange?: OnChange;
onFocus?: (e: React.MouseEvent) => void;
onVisibleChange?: (isVisible: boolean) => void;
onClear?: (e: React.MouseEvent | React.KeyboardEvent<HTMLDivElement>) => void;
autoMergeValue?: boolean;
}
export type OverrideCommonState = 'keyEntities' | 'treeData' | 'disabledKeys' | 'flattenNodes';
export interface TreeSelectState extends Omit<BasicTreeSelectInnerData, OverrideCommonState | 'prevProps'>, Pick<TreeState, OverrideCommonState> {
inputTriggerFocus: boolean;
isOpen: boolean;
rePosKey: number;
dropdownMinWidth: null | number;
isHovering: boolean;
prevProps: TreeSelectProps;
isFocus: boolean;
}
declare class TreeSelect extends BaseComponent<TreeSelectProps, TreeSelectState> {
static contextType: React.Context<ContextValue>;
static propTypes: {
'aria-describedby': PropTypes.Requireable<string>;
'aria-errormessage': PropTypes.Requireable<string>;
'aria-invalid': PropTypes.Requireable<boolean>;
'aria-labelledby': PropTypes.Requireable<string>;
'aria-required': PropTypes.Requireable<boolean>;
borderless: PropTypes.Requireable<boolean>;
loadedKeys: PropTypes.Requireable<string[]>;
loadData: PropTypes.Requireable<(...args: any[]) => any>;
onLoad: PropTypes.Requireable<(...args: any[]) => any>;
arrowIcon: PropTypes.Requireable<PropTypes.ReactNodeLike>;
clearIcon: PropTypes.Requireable<PropTypes.ReactNodeLike>;
defaultOpen: PropTypes.Requireable<boolean>;
defaultValue: PropTypes.Requireable<NonNullable<string | object>>;
defaultExpandAll: PropTypes.Requireable<boolean>;
defaultExpandedKeys: PropTypes.Requireable<any[]>;
expandAll: PropTypes.Requireable<boolean>;
disabled: PropTypes.Requireable<boolean>;
disableStrictly: PropTypes.Requireable<boolean>;
filterTreeNode: PropTypes.Requireable<NonNullable<boolean | ((...args: any[]) => any)>>;
multiple: PropTypes.Requireable<boolean>;
searchPlaceholder: PropTypes.Requireable<string>;
searchAutoFocus: PropTypes.Requireable<boolean>;
virtualize: PropTypes.Requireable<object>;
treeNodeFilterProp: PropTypes.Requireable<string>;
onChange: PropTypes.Requireable<(...args: any[]) => any>;
onClear: PropTypes.Requireable<(...args: any[]) => any>;
onSearch: PropTypes.Requireable<(...args: any[]) => any>;
onSelect: PropTypes.Requireable<(...args: any[]) => any>;
onExpand: PropTypes.Requireable<(...args: any[]) => any>;
onChangeWithObject: PropTypes.Requireable<boolean>;
onBlur: PropTypes.Requireable<(...args: any[]) => any>;
onFocus: PropTypes.Requireable<(...args: any[]) => any>;
value: PropTypes.Requireable<NonNullable<string | number | object>>;
expandedKeys: PropTypes.Requireable<any[]>;
autoExpandParent: PropTypes.Requireable<boolean>;
showClear: PropTypes.Requireable<boolean>;
showSearchClear: PropTypes.Requireable<boolean>;
autoAdjustOverflow: PropTypes.Requireable<boolean>;
showFilteredOnly: PropTypes.Requireable<boolean>;
showLine: PropTypes.Requireable<boolean>;
motionExpand: PropTypes.Requireable<boolean>;
emptyContent: PropTypes.Requireable<PropTypes.ReactNodeLike>;
keyMaps: PropTypes.Requireable<object>;
leafOnly: PropTypes.Requireable<boolean>;
treeData: PropTypes.Requireable<PropTypes.InferProps<{
key: PropTypes.Requireable<string>;
value: PropTypes.Requireable<NonNullable<string | number>>;
label: PropTypes.Requireable<any>;
}>[]>;
dropdownClassName: PropTypes.Requireable<string>;
dropdownStyle: PropTypes.Requireable<object>;
dropdownMargin: PropTypes.Requireable<NonNullable<number | object>>;
motion: PropTypes.Requireable<boolean>;
placeholder: PropTypes.Requireable<string>;
maxTagCount: PropTypes.Requireable<number>;
size: PropTypes.Requireable<Size>;
className: PropTypes.Requireable<string>;
style: PropTypes.Requireable<object>;
treeNodeLabelProp: PropTypes.Requireable<string>;
suffix: PropTypes.Requireable<PropTypes.ReactNodeLike>;
prefix: PropTypes.Requireable<PropTypes.ReactNodeLike>;
insetLabel: PropTypes.Requireable<PropTypes.ReactNodeLike>;
insetLabelId: PropTypes.Requireable<string>;
zIndex: PropTypes.Requireable<number>;
getPopupContainer: PropTypes.Requireable<(...args: any[]) => any>;
dropdownMatchSelectWidth: PropTypes.Requireable<boolean>;
validateStatus: PropTypes.Requireable<"default" | "error" | "warning" | "success">;
mouseEnterDelay: PropTypes.Requireable<number>;
mouseLeaveDelay: PropTypes.Requireable<number>;
triggerRender: PropTypes.Requireable<(...args: any[]) => any>;
stopPropagation: PropTypes.Requireable<NonNullable<string | boolean>>;
outerBottomSlot: PropTypes.Requireable<PropTypes.ReactNodeLike>;
outerTopSlot: PropTypes.Requireable<PropTypes.ReactNodeLike>;
onVisibleChange: PropTypes.Requireable<(...args: any[]) => any>;
expandAction: PropTypes.Requireable<false | "click" | "doubleClick">;
searchPosition: PropTypes.Requireable<"trigger" | "dropdown">;
clickToHide: PropTypes.Requireable<boolean>;
renderLabel: PropTypes.Requireable<(...args: any[]) => any>;
renderFullLabel: PropTypes.Requireable<(...args: any[]) => any>;
labelEllipsis: PropTypes.Requireable<boolean>;
optionListStyle: PropTypes.Requireable<object>;
searchRender: PropTypes.Requireable<NonNullable<boolean | ((...args: any[]) => any)>>;
renderSelectedItem: PropTypes.Requireable<(...args: any[]) => any>;
checkRelation: PropTypes.Requireable<string>;
'aria-label': PropTypes.Requireable<string>;
showRestTagsPopover: PropTypes.Requireable<boolean>;
restTagsPopoverProps: PropTypes.Requireable<object>;
preventScroll: PropTypes.Requireable<boolean>;
clickTriggerToHide: PropTypes.Requireable<boolean>;
autoMergeValue: PropTypes.Requireable<boolean>;
};
static defaultProps: Partial<TreeSelectProps>;
inputRef: React.RefObject<typeof Input>;
tagInputRef: React.RefObject<TagInput>;
triggerRef: React.RefObject<HTMLDivElement>;
optionsRef: React.RefObject<any>;
clickOutsideHandler: any;
onNodeClick: any;
onNodeDoubleClick: any;
onMotionEnd: any;
treeSelectID: string;
context: ContextValue;
constructor(props: TreeSelectProps);
static getDerivedStateFromProps(props: TreeSelectProps, prevState: TreeSelectState): Partial<TreeSelectState>;
get adapter(): TreeSelectAdapter<TreeSelectProps, TreeSelectState>;
componentDidMount(): void;
componentWillUnmount(): void;
renderSuffix: () => React.JSX.Element;
renderPrefix: () => React.JSX.Element;
renderContent: () => React.JSX.Element;
removeTag: (removedKey: TreeNodeData['key']) => void;
handleClick: (e: React.MouseEvent) => void;
getDataForKeyNotInKeyEntities: (key: string) => any;
handleSelectionEnterPress: (e: React.KeyboardEvent<HTMLDivElement>) => void;
hasValue: () => boolean;
showClearBtn: () => boolean;
renderTagList: (triggerRenderKeys: string[]) => React.ReactNode[];
/**
* When single selection and the search box is on trigger, the items displayed in the rendered search box
*/
renderSingleTriggerSearchItem: () => React.JSX.Element;
/**
* Single selection and the search box content rendered when the search box is on trigger
*/
renderSingleTriggerSearch: () => React.JSX.Element;
renderSelectContent: (triggerRenderKeys: string[]) => React.JSX.Element;
handleClear: (e: React.MouseEvent) => void;
handleClearEnterPress: (e: React.KeyboardEvent<HTMLDivElement>) => void;
handleMouseOver: (e: React.MouseEvent) => void;
handleMouseLeave: (e: React.MouseEvent) => void;
search: (value: string) => void;
close: () => void;
renderArrow: () => React.JSX.Element;
renderClearBtn: () => React.JSX.Element;
renderSelection: () => React.JSX.Element;
renderTagItem: (key: string, idx: number) => any;
renderTagInput: (triggerRenderKeys: string[]) => React.JSX.Element;
renderInput: () => React.JSX.Element;
renderEmpty: () => React.JSX.Element;
onNodeLoad: (data: TreeNodeData) => Promise<unknown>;
onNodeSelect: (e: React.MouseEvent | React.KeyboardEvent, treeNode: TreeNodeProps) => void;
onNodeCheck: (e: React.MouseEvent | React.KeyboardEvent, treeNode: TreeNodeProps) => void;
onNodeExpand: (e: React.MouseEvent | React.KeyboardEvent, treeNode: TreeNodeProps) => void;
getTreeNodeRequiredProps: () => {
expandedKeys: Set<string>;
selectedKeys: string[];
checkedKeys: Set<string>;
halfCheckedKeys: Set<string>;
filteredKeys: Set<string>;
keyEntities: import("../tree/interface").KeyEntities;
};
getTreeNodeKey: (treeNode: TreeNodeData) => string;
handlePopoverVisibleChange: (isVisible: any) => void;
afterClose: () => void;
renderTreeNode: (treeNode: FlattenNode, ind: number, style: React.CSSProperties) => React.JSX.Element;
itemKey: (index: number, data: Record<string, any>) => any;
renderNodeList: () => React.JSX.Element;
renderTree: () => React.JSX.Element;
render(): React.JSX.Element;
}
export default TreeSelect;