import React from "react"; import { StyledProps } from "../_type"; import { CommonDropdownProps } from "../dropdown/Dropdown"; import { CheckTreeProps } from "../checktree"; export interface CascaderBaseProps extends Omit { /** * 选择模式 * - `"tabs"` 选项卡类型 * - `"menu"` 菜单类型 * * @default "tabs" * @since 2.6.0 */ type?: "tabs" | "menu"; /** * 选项数据 * * - `"tabs"` 选项卡类型需传递 `title` 等完整 `CascaderData` 数据 * - `"menu"` 菜单类型只需传递选项 `CascaderMenuOption` 数据 */ data: CascaderData | CascaderMenuOption[]; /** * 动态加载数据,**需要返回 Promise** * * - 选项卡类型在 `data` 中某级包含 `child` 且 `child` 不包含 `options` 时调用 * - 菜单类型在 `data` 中某级包含不包含 `children` 且`isLeaf` 为 `false` 时调用 */ onLoad?: (value: string[], options: CascaderOption[]) => Promise; /** * 是否支持清空 * @default false * @since 2.3.2 */ clearable?: boolean; /** * 占位符 * @default "请选择"(已处理国际化) */ placeholder?: string; /** * 是否禁用选择 * @default false */ disabled?: boolean; /** * 支持搜索 * @default false * @since 2.6.0 */ searchable?: boolean; /** * 自定义搜索筛选规则 * * 默认根据输入值筛选 * @since 2.6.0 */ filter?: (inputValue: string, option: CascaderOption) => boolean; /** * 自定义选择值展示 * @since 2.6.16 */ valueRender?: (selectedOptions: CascaderOption[]) => React.ReactNode; } /** * 菜单模式(`type="menu"`)级联选择 */ export interface CascaderMenuProps { /** * 次级菜单展开方式 * * *仅在 `type="menu"` 时可用* * * @default "click" */ expandTrigger?: "click" | "hover"; /** * 菜单列表顶部提示,可分别为每级列表配置 * * *仅在 `type="menu"` 时可用* * * @since 2.7.0 */ tips?: (parentValue: T, searchValue?: string) => React.ReactNode; /** * 菜单列表底部提示,可用于滚动加载等场景 * * *仅在 `type="menu"` 时可用* * * @since 2.7.0 */ bottomTips?: (parentValue: T, searchValue?: string) => React.ReactNode; /** * 菜单列表滚动到底部回调 * * *仅在 `type="menu"` 时可用* * * @since 2.7.0 */ onScrollBottom?: (parentValue: T, searchValue?: string) => void; /** * 搜索值变化时回调 * * *仅在 `type="menu"` 时可用* * * @since 2.7.0 */ onSearch?: (inputValue: string) => void; } /** * 单选模式 */ export interface CascaderSingleProps extends CascaderBaseProps, CascaderMenuProps, StyledProps { /** * 是否为多选模式 * * **建议总是传递 `false` 以完善类型推断** * * @since 2.2.1 */ multiple?: false; /** * 未提供 `value` 的情况下,提供了 `defaultValue`,则可以当做是非受控组件使用 */ defaultValue?: string[]; /** * 当前值 */ value?: string[]; /** * 值发生变更时进行回调 * - `value` 变更的目标值 * - `context` 此次变更的更多上下文信息,其中 `context.event` 可以获得导致变更的 React 事件 */ onChange?( value: string[], context: { options: CascaderOption[]; event: React.SyntheticEvent } ): void; /** * 是否每级选项变化都触发改变 * @default false */ changeOnSelect?: boolean; } /** * 多选模式 */ export interface CascaderMultipleProps extends CascaderBaseProps, CascaderMenuProps, StyledProps { /** * 是否为多选模式 * * 🚨 多选模式暂不支持配置 `changeOnSelect` * * @since 2.2.1 */ multiple: true; /** * 是否展示全选 * * ** 当前只在 `type="menu"` 时生效** * * @default false * @since 2.6.12 */ all?: | boolean | { /** * 选项文案 */ label: React.ReactNode; /** * 全选项对应值 */ value?: string; }; /** * 未提供 `value` 的情况下,提供了 `defaultValue`,则可以当做是非受控组件使用 */ defaultValue?: string[][]; /** * 当前值 */ value?: string[][]; /** * 值发生变更时进行回调 * - `value` 变更的目标值 * - `context` 此次变更的更多上下文信息,其中 `context.event` 可以获得导致变更的 React 事件 */ onChange?( value: string[][], context: { options?: CascaderOption[][]; event: React.SyntheticEvent } ): void; /** * 选择值的描述方式 * * *影响 `value` 和 `onChange` 值的格式* * * - `"all"` - 使用全部层级 * - `"onlyLeaf"` - 仅使用子节点 * - `"parentFirst"` - 当子节点全部选中时,仅使用父节点 * * @default "onlyLeaf" * @since 2.7.0 */ valueMode?: CheckTreeProps["valueMode"]; /** * 选中项的展示方式 * * *影响选中项展示的方式* * * - `"onlyLeaf"` - 仅展示子节点项 * - `"parentFirst"` - 当子节点全部选中时,仅展示父节点项 * * @default "onlyLeaf" * @since 2.7.0 */ showMode?: "onlyLeaf" | "parentFirst"; } export type CascaderProps = CascaderSingleProps | CascaderMultipleProps; /** * 选项卡模式(`type="tabs"`)数据 */ export interface CascaderOption { /** * 选项值 */ value: string; /** * 选项标题 */ label: React.ReactNode; /** * 子级数据 */ child?: CascaderData; /** * 是否为禁用状态 * @default false * @since 2.5.0 */ disabled?: boolean; } /** * 菜单模式(`type="menu"`)选项数据 */ export interface CascaderMenuOption { /** * 选项值 */ value: string; /** * 选项文案 */ label: React.ReactNode; /** * 子级数据 */ children?: CascaderMenuOption[]; /** * 是否为禁用状态 * @default false */ disabled?: boolean; /** * 是否为叶子节点 * * 配合 `loadData` 使用 * @default false */ isLeaf?: boolean; } export interface CascaderData { /** * 当前选择面板标题 */ title: React.ReactNode; /** * 面板布局列数,支持 `1`, `2`, `4` * @default 4 */ col?: number; /** * 选项 * * 当该项为空时将触发 `onLoad` 加载数据 */ options?: CascaderOption[]; } export interface CascaderBoxProps extends CascaderMenuProps, StyledProps { /** * 选择数据 */ data: CascaderData; /** * 当前选择值 */ curValue?: CascaderSingleProps["value"]; /** * 多选模式下当前选择值 */ curValueList?: CascaderMultipleProps["value"]; /** * 选择回调回调 */ onSelect: CascaderSingleProps["onChange"]; /** * 多选模式下取消选择回调 */ onDeselect?: CascaderSingleProps["onChange"]; /** * 多选模式下变化回调 */ onChange?: CascaderMultipleProps["onChange"]; /** * 选择完毕收起下拉框 */ onClose: () => void; /** * 动态加载数据 */ onLoad: CascaderProps["onLoad"]; /** * 是否每级选项变化都触发改变 * @default false */ changeOnSelect?: CascaderSingleProps["changeOnSelect"]; /** * 是否为多选模式 */ multiple?: boolean; /** * 多选模式下是否被选中 */ isSelected?: (value: string[]) => boolean; /** * 下拉容器渲染更新 */ scheduleUpdate?: () => void; /** * 面板是否展示全选 */ all?: CascaderMultipleProps["all"]; } export interface CascaderSearchProps extends Pick< CascaderMenuProps, "onSearch" | "tips" | "bottomTips" | "onScrollBottom" >, StyledProps { /** * 选择数据 */ data: CascaderData; /** * 搜索值 */ searchValue: string; /** * 是否为多选模式 */ multiple?: boolean; /** * 当前项是否已选中 */ isSelected?: (value: string[]) => boolean; /** * 搜索值 */ filter: CascaderBaseProps["filter"]; /** * 当前选择值变化回调 */ onChange: ( value: string[], { options, event, selected, }: { options: CascaderOption[]; event: React.MouseEvent; selected?: boolean; } ) => void; /** * 是否每级选项变化都触发改变 * @default false */ changeOnSelect: CascaderSingleProps["changeOnSelect"]; /** * 下拉容器渲染更新 */ scheduleUpdate?: () => void; } export interface CascaderLoadingProps { /** * 动态加载数据 */ onLoad: () => Promise; }