powerform
Version:
A powerful form model.
105 lines (104 loc) • 3.55 kB
TypeScript
declare type Optional<T> = T | undefined;
declare type Error = string;
declare type Decoder<T> = (val: string) => [T, Error];
declare type ChangeHandler<T> = (val: T) => void;
declare type InputHandler = (val: string, preVal: string) => string;
declare type ErrorHandler = (error: string) => void;
export declare class Field<T> {
private decoder;
changeHandler?: ChangeHandler<T>;
inputHandler?: InputHandler;
errorHandler?: ErrorHandler;
fieldName: string;
form?: any;
private _error;
private initialValue;
private previousValue;
private currentValue;
private validators;
constructor(decoder: Decoder<T>, ...validators: Validator<NoUndefined<T>>[]);
optional(): Field<Optional<T>>;
initValue(val: any): this;
onInput(i: InputHandler): this;
onError(i: ErrorHandler): this;
onChange(c: ChangeHandler<T>): this;
triggerOnError(): void;
triggerOnChange(): void;
setValue(val: any, skipTrigger?: boolean): void;
get raw(): T;
get value(): T;
_validate(): string | undefined;
validate(): boolean;
isValid(): boolean;
setError(error: string, skipTrigger?: boolean): void;
get error(): string;
isDirty(): boolean;
makePristine(): void;
reset(): void;
setAndValidate(value: T): string;
}
declare type Schema<T> = {
[K in keyof T]: Field<T[K]>;
};
declare type Values<T> = {
[K in keyof T]: T[K];
};
export declare const defaultConfig: {
multipleErrors: boolean;
stopOnError: boolean;
};
declare type FormConfig = {
multipleErrors?: boolean;
stopOnError?: boolean;
};
declare type FormErrorHandler<T> = (errors: Errors<T>) => void;
declare type FormChangeHandler<T> = (values: Values<T>) => void;
export declare class Form<T> {
fields: Schema<T>;
private config;
getNotified: boolean;
errorHandler?: FormErrorHandler<T>;
changeHandler?: FormChangeHandler<T>;
constructor(fields: Schema<T>, config?: FormConfig);
initValue(values: Values<T>): this;
onError(handler: FormErrorHandler<T>): this;
onChange(handler: FormChangeHandler<T>): this;
toggleGetNotified(): void;
setValue(data: T, skipTrigger?: boolean): void;
triggerOnChange(): void;
triggerOnError(): void;
get value(): T;
get raw(): Values<T>;
getUpdates(): T;
setError(errors: Errors<T>, skipTrigger?: boolean): void;
get error(): Errors<T>;
isDirty(): boolean;
makePristine(): void;
reset(): void;
_validate(skipAttachError: boolean): boolean;
validate(): boolean;
isValid(): boolean;
}
declare type Errors<T> = {
[K in keyof T]: string;
};
export declare type Config<T> = {
onChange?: (data: T, form: Form<T>) => void;
onError?: (error: Errors<T>, form: Form<T>) => void;
multipleErrors: boolean;
stopOnError: boolean;
};
export declare type Context<T> = {
prevValue: T;
fieldName: string;
all: Record<string, any>;
};
declare type NoUndefined<T> = T extends undefined ? never : T;
export declare type Validator<T> = (val: T, ctx?: Context<T>) => string | undefined;
export declare function strDecoder(val: string): [string, Error];
export declare function numDecoder(val: string): [number, Error];
export declare function boolDecoder(val: string): [boolean, Error];
export declare function str(...validators: Validator<string>[]): Field<string>;
export declare function num(...validators: Validator<number>[]): Field<number>;
export declare function bool(...validators: Validator<boolean>[]): Field<boolean>;
export {};