import { ReactNode, RefObject, MouseEvent, KeyboardEvent } from 'react'; import { OptionObject, ConfiguredComponent } from '@befe/brick-core'; import { Menu, MenuProps } from '@befe/brick-comp-menu'; export interface CascadeOption extends Omit { loading?: boolean; isLeaf?: boolean; children?: CascadeOption[]; } export type CascadeOptionValue = CascadeOption['value']; export interface CascadeOptionEnhanced extends Omit { ancestorPath: CascadeOptionValue[]; children?: CascadeOptionEnhanced[]; } export interface CascadePanelProps { /** * 自定义 class */ className?: string; /** * 选中项 value 控制值 */ value?: CascadeOptionValue[] | CascadeOptionValue[][]; /** * 选中项 value 默认值 */ defaultValue?: CascadeOptionValue[] | CascadeOptionValue[][]; /** * 选择模式 */ mode?: 'single' | 'multiple'; /** * 选项 * - 静态全量 options * - 懒加载 options async getter */ options?: CascadeOption[] | ((value?: CascadeOptionValue) => Promise); /** * 展开次级触发类型 * selectOnExpand 模式下,hover 在只触发展开次级,不会进行 select */ expandTrigger?: 'click' | 'hover'; /** * 尺寸 * use config context `baseSize` as default */ size?: 'sm' | 'md'; /** * 展开下一级时的回调 */ onExpand?: (value: CascadeOptionValue[], expandedChain: CascadeOption[]) => void; /** * 值变化时发生的回调,回调参数是 “选中项” 的三种等价形式, * * - value 标准 “值”,详见 FAQ 《如何理解 “值” 类型》 * - enhancedOptionValue 以 EnhancedOption 形式表示的选中值 * - selected 选中项 的 EnhancedOption 列表 * * **注意** * * - value, enhancedOptionValue 多选是为 1 维,多选是 2 维 * - selected 总是 1 维的,因为是选中项的列表,而非层级结构 */ onChange?: { bivarianceHack(value: CascadeOptionValue[] | CascadeOptionValue[][], enhancedOptionValue: CascadeOptionEnhanced[] | CascadeOptionEnhanced[][], selected: CascadeOptionEnhanced[]): void; }['bivarianceHack']; /** * 是否在展开时进行点选 * * - 用于需要使叶子节点可点选的情景 * - 在 expandTrigger 为 hover 时,hover 只展开 * - 仅在单选模式有效 */ selectOnExpand?: boolean; /** * 联动父子选择/反选 onChangeSelectedIds * * - **注意** 联动模式下,全选与否的考虑范围不包括 disabled 节点 * - 仅在多选模式下有效 * - 在 `props.options` 为 function 的懒加载 options 时无效 */ harmonizeSelections?: boolean; /** * @private */ onMouseDown?: MenuProps['onMouseDown']; } export interface CascadePanelState { value: CascadeOptionValue[][]; options: CascadeOptionEnhanced[]; selected: CascadeOptionEnhanced[]; expandedChain: CascadeOptionEnhanced[]; } export declare function getOptionMap(options: T[]): { optionMap: Record; orderMap: Record; }; export declare function enhanceOptions(options: CascadeOption[], ancestorPath?: CascadeOptionValue[]): CascadeOptionEnhanced[]; export declare function shouldHarmonizeSelections(props: Pick): boolean; export declare function normalizeValue(value: CascadePanelProps['value']): import("@befe/brick-core").ObjectId[][]; export declare function fromValueToSelected(value: CascadeOptionValue[][], options: CascadeOptionEnhanced[]): CascadeOptionEnhanced[]; export declare function fromSelectedToChains(selected: CascadeOptionEnhanced[], options: CascadeOptionEnhanced[]): CascadeOptionEnhanced[][]; export declare function fromSelectedToValue(selected: CascadeOptionEnhanced[], options: CascadeOptionEnhanced[]): { selectedValue: CascadeOptionEnhanced[][]; value: import("@befe/brick-core").ObjectId[][]; }; export declare function isCascadeOptionHasChildren(opt: CascadeOption): boolean; export declare function loadOptions(toLoadChains: CascadeOptionValue[][], stateOptions: CascadeOptionEnhanced[], fetchOptions: CascadePanelProps['options'], onUpdateOption: (option: CascadeOptionEnhanced) => void): void; export declare class CascadePanel extends ConfiguredComponent { static displayName: string; static defaultProps: { className: string; expandTrigger: string; selectOnExpand: boolean; harmonizeSelections: boolean; mode: string; }; componentLocale: import("@befe/brick-core").ComponentLocale<{ en_us: { no_options: string; select_all: string; }; zh_cn: { no_options: string; select_all: string; }; }>; state: CascadePanelState; refMenuList: Array>; constructor(props: CascadePanelProps); static getDerivedStateFromProps(nextProps: CascadePanelProps, state: CascadePanelState): Partial | null; get className(): string; get isMultiple(): boolean; get shouldHarmonizeSelections(): boolean; get size(): "sm" | "md"; get options(): CascadeOptionEnhanced[]; get inCursorOption(): CascadeOptionEnhanced | undefined; get currentMenu(): Menu | null; get currentAvailableOptions(): CascadeOptionEnhanced[]; isOptionSelected(option: CascadeOption): boolean; updateOption(option: CascadeOptionEnhanced): void; harmonizeDescendantSelections(selectedOpt: CascadeOptionEnhanced, selected: CascadeOptionEnhanced[]): CascadeOptionEnhanced[]; harmonizeAncestorSelections(selectedOpt: CascadeOptionEnhanced, selected: CascadeOptionEnhanced[]): CascadeOptionEnhanced[]; makeOptionSelected(option: CascadeOptionEnhanced, selected: CascadeOptionEnhanced[], isSelected: boolean): CascadeOptionEnhanced[]; changeSelectedAll(selectedOptions: CascadeOptionEnhanced[], isSelected: boolean): void; changeSelected(selectedOpt: CascadeOptionEnhanced, isSelected: boolean): void; toggleSelected(opt: CascadeOptionEnhanced): void; expand(opt: CascadeOptionEnhanced, byKeyDown?: boolean): void; handleMouseEnterItem: (opt: CascadeOptionEnhanced) => void; touchItem(opt: CascadeOptionEnhanced, e?: MouseEvent | KeyboardEvent): void; changeValue(selected: CascadeOptionEnhanced[]): void; renderMenuItem: (opt: CascadeOptionEnhanced) => import("react/jsx-runtime").JSX.Element; operateByKeyDown(e: KeyboardEvent): void; resetMenuCursor(): void; initMenuCursor(): void; moveMenuCursor(step: number): void; renderMenuSelectAll(options: CascadeOptionEnhanced[]): import("react/jsx-runtime").JSX.Element | null; renderMenu(options: CascadeOptionEnhanced[], chainIndex: number): import("react/jsx-runtime").JSX.Element; renderCascadeMenu(): ReactNode[] | null; handleOptionsLoaded: (targetOption: CascadeOptionEnhanced) => void; loadOptions(): void; initOptions(): void; componentDidMount(): void; componentDidUpdate(): void; render(): import("react/jsx-runtime").JSX.Element; }