@lobehub/ui
Version:
Lobe UI is an open-source UI component library for building AIGC web apps
122 lines • 4.86 kB
text/typescript
import { IconProps } from "../../Icon/type.mjs";
import "../../Icon/index.mjs";
import { FormLayout, FormVariant } from "../Form/type.mjs";
import { ValidateOn } from "./engine/types.mjs";
import { FieldValidate, StandardSchema } from "./schema.mjs";
import { CSSProperties, FormHTMLAttributes, ReactElement, ReactNode, Ref } from "react";
//#region src/base-ui/FormKit/type.d.ts
type Depth = [never, 0, 1, 2, 3, 4, 5];
type IsAny<T> = 0 extends 1 & T ? true : false;
type FieldPath<T, D extends number = 6> = [D] extends [never] ? string : IsAny<T> extends true ? string : T extends readonly (infer U)[] ? `${number}` | `${number}.${FieldPath<U, Depth[D]>}` : T extends object ? { [K in keyof T & string]: K | (NonNullable<T[K]> extends object ? `${K}.${FieldPath<NonNullable<T[K]>, Depth[D]>}` : never); }[keyof T & string] : never;
type FieldPathValue<T, P extends string> = IsAny<T> extends true ? any : P extends `${infer K}.${infer Rest}` ? K extends keyof T ? FieldPathValue<NonNullable<T[K]>, Rest> : T extends readonly (infer U)[] ? FieldPathValue<U, Rest> : unknown : P extends keyof T ? T[P] : T extends readonly (infer U)[] ? U : unknown;
type DeepPartial<T> = T extends object ? { [K in keyof T]?: DeepPartial<T[K]>; } : T;
type FormValues = Record<string, any>;
interface SetValueOptions {
asUser?: boolean;
}
interface FormValidateResult<T> {
errors: Partial<Record<FieldPath<T>, string>>;
valid: boolean;
}
interface FormInstance<T extends FormValues = FormValues> {
getValue: <P extends FieldPath<T>>(name: P) => FieldPathValue<T, P>;
getValues: () => T;
isDirty: () => boolean;
isTouched: (name: FieldPath<T>) => boolean;
reset: (values?: T) => void;
resetField: (name: FieldPath<T>) => void;
setErrors: (errors: Partial<Record<FieldPath<T>, string | undefined>>) => void;
setSchema: (schema: StandardSchema | undefined) => void;
setValue: <P extends FieldPath<T>>(name: P, value: FieldPathValue<T, P>, options?: SetValueOptions) => void;
setValues: (values: DeepPartial<T>, options?: SetValueOptions) => void;
submit: () => Promise<FormValidateResult<T>>;
subscribe: <S>(selector: (values: T) => S, callback: (selected: S) => void) => () => void;
validate: (names?: FieldPath<T>[]) => Promise<FormValidateResult<T>>;
}
interface UseFormOptions<T extends FormValues> {
initialValues?: T;
onSubmit?: (values: T) => unknown;
onValuesChange?: (changed: DeepPartial<T>, values: T) => void;
schema?: StandardSchema;
validateOn?: ValidateOn;
values?: T;
valuesChangeDebounce?: number;
}
interface FieldBinding {
emptyValue?: unknown;
getValue?: (...args: any[]) => unknown;
trigger?: string;
valueProp?: string;
}
interface FieldRenderProps<V = any> {
error: string | undefined;
name: string;
onBlur: () => void;
onChange: (value: V) => void;
touched: boolean;
validating: boolean;
value: V;
}
interface FormGroupItem<T extends FormValues = FormValues> {
children: FormFieldProps<T>[] | ReactNode;
collapsible?: boolean;
defaultActive?: boolean;
desc?: ReactNode;
extra?: ReactNode;
icon?: IconProps['icon'];
key?: string;
title: ReactNode;
variant?: FormVariant;
}
interface FormProps<T extends FormValues = FormValues> extends Omit<FormHTMLAttributes<HTMLFormElement>, 'children' | 'className' | 'onSubmit' | 'style'> {
activeKey?: (string | number)[];
children?: ReactNode;
className?: string;
classNames?: {
group?: string;
item?: string;
};
collapsible?: boolean;
defaultActiveKey?: (string | number)[];
footer?: ReactNode;
form: FormInstance<T>;
gap?: number | string;
itemMinWidth?: string | number;
items?: FormGroupItem<T>[] | FormFieldProps<T>[];
itemsType?: 'group' | 'flat';
layout?: FormLayout;
onCollapse?: (keys: (string | number)[]) => void;
ref?: Ref<HTMLFormElement>;
style?: CSSProperties;
styles?: {
group?: CSSProperties;
item?: CSSProperties;
};
variant?: FormVariant;
}
interface FormFieldProps<T extends FormValues = FormValues> extends FieldBinding {
avatar?: ReactNode;
bare?: boolean;
children?: ReactElement | ReactNode;
className?: string;
deps?: FieldPath<T>[];
desc?: ReactNode;
divider?: boolean;
extra?: ReactNode;
hidden?: boolean;
label?: ReactNode;
layout?: FormLayout;
minWidth?: string | number;
name?: FieldPath<T>;
render?: (field: FieldRenderProps) => ReactNode;
required?: boolean | string;
style?: CSSProperties;
tag?: string;
validate?: FieldValidate;
validateDebounce?: number;
validateOn?: ValidateOn;
variant?: FormVariant;
}
//#endregion
export { DeepPartial, FieldBinding, FieldPath, FieldPathValue, FieldRenderProps, type FieldValidate, FormFieldProps, FormGroupItem, FormInstance, FormProps, FormValidateResult, FormValues, SetValueOptions, type StandardSchema, UseFormOptions };
//# sourceMappingURL=type.d.mts.map