///
export interface ExprRule {
[key: string]: any;
}
export interface RuleConfig {
autoValidate?: boolean;
required?: 0 | 1;
min?: number;
max?: number;
mutex?: Array>;
customValidator?: (value: SelectionValue) => Promise;
}
export interface GroupItem {
id?: number;
title?: string;
mode?: 'single' | 'multiple';
valueType?: 'primitive' | 'object';
preserve?: boolean;
fieldNames?: {
label?: string;
value?: string;
cover?: string;
};
ruleConfig?: RuleConfig;
dataSource?: OptionItem[];
}
export interface OptionItem {
id?: number;
title?: string;
label?: string;
value?: OptionKey;
cover?: string;
groups?: GroupItem[];
disabled?: boolean;
ruleConfig?: {
min?: number;
max?: number;
};
[key: string]: any;
}
export declare type OptionKey = number | string;
/** 原始值类型:单选时为id,多选时为id[] */
export declare type SelectionValuePrimitive = T | T[];
/** 复杂对象值类型:包含id、数量等额外信息 */
export interface SelectionValueObject {
value?: T;
quantity?: number;
[key: string]: any;
}
/** 单选值类型 */
export declare type SelectionValueSingle = T | SelectionValueObject;
/** 多选值类型 */
export declare type SelectionValueMultiple = T[] | SelectionValueObject[];
/** 选择器值类型 */
export declare type SelectionValue = SelectionValueSingle | SelectionValueMultiple;
export declare type RenderItemProps = {
dataSource: OptionItem;
actions: any;
optionItemValue?: any;
indicator: React.ReactNode;
numberSelector: React.ReactNode;
values: any;
quantityInfo: {
maxReached: boolean;
remainingCount: number;
selectedCount: number;
};
};
export declare type ItemProps = {
layout?: 'vertical' | 'horizontal';
renderContent?: (props: {
dataSource: OptionItem;
}) => React.ReactNode;
styles?: {
[key: string]: React.CSSProperties;
};
[key: string]: any;
};
export declare type LayoutType = 'antdGrid' | 'custom';
/** 单个断点的完整配置 */
export declare type BreakpointConfig = {
columns: number;
gap?: number | string;
style?: React.CSSProperties;
};
/**
* 断点映射
* key: 最小宽度(px)
* value: 列数(简写)或完整配置
* @example { 0: 1, 420: 2, 630: 3 } // 简写
* @example { 0: { columns: 1, gap: 12 }, 420: { columns: 2, gap: 16 } } // 完整
*/
export declare type BreakpointMap = Record;
/** 响应式布局配置 */
export declare type ResponsiveConfig = {
/** 每项最小宽度,系统自动计算断点 */
minWidth?: number;
/** 最大列数限制 */
maxColumns?: number;
/**
* 显式断点映射,key 为容器最小宽度(px)
* @example { 0: 1, 420: 2, 630: 3, 841: 4, 1367: 5 }
* @example { 0: { columns: 1, gap: 12 }, 420: { columns: 2, gap: 16 } }
*/
breakpoints?: BreakpointMap;
/** 默认列数(容器宽度小于所有断点时),默认为 1 */
defaultColumns?: number;
/** 间距,默认为 16 */
gap?: number | string;
/** ResizeObserver 防抖延迟(ms),默认为 0 */
debounce?: number;
};
export declare type LayoutConfig = {
type?: LayoutType;
className?: string;
containerStyle?: React.CSSProperties;
/**
* 响应式布局配置
* 存在此配置时自动启用 ResizeObserver 响应式布局
*/
responsive?: ResponsiveConfig;
columns?: number;
gutter?: number | object | Array;
align?: 'top' | 'middle' | 'bottom' | 'stretch';
justify?: 'start' | 'end' | 'center' | 'space-between' | 'space-around';
wrap?: boolean;
colConfig?: {
[key: string]: any;
};
};
export interface PresetConfig {
variant?: '1' | '2' | '3' | '4' | '5';
}
export declare type ItemLayout = 'vertical' | 'horizontal';
export declare type SelectorVariant = 'default' | 'select' | 'card' | 'media';
export declare type HeaderProps = {
visible?: boolean;
style?: React.CSSProperties;
title?: {
visible?: boolean;
text?: React.ReactNode;
style?: React.CSSProperties;
};
icon?: {
visible?: boolean;
icon?: React.ReactNode;
style?: React.CSSProperties;
};
tip?: {
visible?: boolean;
text?: React.ReactNode;
style?: React.CSSProperties;
};
renderExtra?: (props: {
dataSource: OptionItem;
values: SelectionValue;
}) => React.ReactNode;
};
export interface SelectorProps extends GroupItem {
className?: string;
theme?: {
token?: {
colorPrimary?: string;
};
};
value?: SelectionValue;
defaultValue?: SelectionValue;
onChange?: (value: SelectionValue) => void;
onClear?: () => void;
disabled?: boolean;
variant?: SelectorVariant;
itemLayout?: ItemLayout;
preset?: PresetConfig;
layout?: LayoutConfig;
renderItem?: (props: RenderItemProps) => React.ReactNode;
itemProps?: ItemProps;
indicatorProps?: {
show?: boolean;
variant?: 'outlined' | 'filled';
render?: (props: {
option: OptionItem;
selected: boolean;
disabled: boolean;
actions: any;
}) => React.ReactNode;
[key: string]: any;
};
showStepper?: true | false | 'auto';
stepperProps?: {
size?: 'small' | 'middle' | 'large';
shape?: 'round' | 'square';
horizontalPadding?: number | string;
};
style?: React.CSSProperties;
/**
* @deprecated
*/
titleProps?: HeaderProps;
headerProps?: HeaderProps;
selectProps?: any;
}
export interface SelectorGroupProps {
allowedValuesPolicy?: 'relaxed' | 'strict';
className?: string;
customScrollParent?: HTMLElement | string;
dataSource: GroupItem[];
defaultValue?: Record;
linkageRules?: ExprRule[] | Record;
theme?: {
token?: {
colorPrimary?: string;
};
};
onChange?: (values: Record) => void;
preserve?: boolean;
tabProps?: {
visible?: boolean;
};
style?: React.CSSProperties;
value?: Record;
scrollToFirstError?: boolean;
[key: string]: any;
}