1 | import {
|
2 | Component,
|
3 | ComponentType,
|
4 | ReactElement,
|
5 | ChangeEvent,
|
6 | DragEvent,
|
7 | FocusEvent,
|
8 | InputHTMLAttributes,
|
9 | SelectHTMLAttributes,
|
10 | TextareaHTMLAttributes
|
11 | } from "react";
|
12 | import { Dispatch } from "redux";
|
13 |
|
14 | export type Normalizer = (value: any, previousValue?: any, allValues?: any, previousAllValues?: any) => any;
|
15 | export type Formatter = (value: any, name: string) => any;
|
16 | export type Parser = (value: any, name: string) => any;
|
17 | export type Validator = (value: any, allValues?: any, props?: any, name?: any) => any;
|
18 |
|
19 | export type EventHandler<Event> = (event: Event, name?: string) => void;
|
20 | export type EventWithDataHandler<Event> = (event?: Event, newValue?: any, previousValue?: any, name?: string) => void;
|
21 |
|
22 | export interface EventOrValueHandler<Event> extends EventHandler<Event> {
|
23 | (value: any): void;
|
24 | }
|
25 |
|
26 | export interface CommonFieldInputProps {
|
27 | name: string;
|
28 | onDragStart: EventHandler<DragEvent<any>>;
|
29 | onDrop: EventHandler<DragEvent<any>>;
|
30 | onFocus: EventHandler<FocusEvent<any>>;
|
31 | }
|
32 |
|
33 | export interface CommonFieldProps extends CommonFieldInputProps {
|
34 | onBlur: EventWithDataHandler<FocusEvent<any>>;
|
35 | onChange: EventWithDataHandler<ChangeEvent<any>>;
|
36 | }
|
37 |
|
38 | export interface BaseFieldProps<P = {}> extends Partial<CommonFieldProps> {
|
39 | name: string;
|
40 | component?: ComponentType<WrappedFieldProps & P> | "input" | "select" | "textarea" | undefined;
|
41 | format?: Formatter | null | undefined;
|
42 | normalize?: Normalizer | undefined;
|
43 | props?: P | undefined;
|
44 | parse?: Parser | undefined;
|
45 | validate?: Validator | Validator[] | undefined;
|
46 | warn?: Validator | Validator[] | undefined;
|
47 | forwardRef?: boolean | undefined;
|
48 | immutableProps?: string[] | undefined;
|
49 | }
|
50 |
|
51 | export interface GenericField<P> extends Component<BaseFieldProps<P> & P> {
|
52 | dirty: boolean;
|
53 | name: string;
|
54 | pristine: boolean;
|
55 | value: any;
|
56 | getRenderedComponent(): Component<WrappedFieldProps & P>;
|
57 | }
|
58 |
|
59 | export type GenericFieldHTMLAttributes =
|
60 | InputHTMLAttributes<HTMLInputElement> |
|
61 | SelectHTMLAttributes<HTMLSelectElement> |
|
62 | TextareaHTMLAttributes<HTMLTextAreaElement>;
|
63 |
|
64 | export class Field<P extends GenericFieldHTMLAttributes | BaseFieldProps = GenericFieldHTMLAttributes | BaseFieldProps> extends Component<P> {
|
65 | dirty: boolean;
|
66 | name: string;
|
67 | pristine: boolean;
|
68 | value: any;
|
69 | getRenderedComponent(): Component<WrappedFieldProps & P>;
|
70 | }
|
71 |
|
72 | export interface WrappedFieldProps {
|
73 | input: WrappedFieldInputProps;
|
74 | meta: WrappedFieldMetaProps;
|
75 | }
|
76 |
|
77 | export interface WrappedFieldInputProps extends CommonFieldInputProps {
|
78 | checked?: boolean | undefined;
|
79 | value: any;
|
80 | onBlur: EventOrValueHandler<FocusEvent<any>>;
|
81 | onChange: EventOrValueHandler<ChangeEvent<any>>;
|
82 | }
|
83 |
|
84 | export interface WrappedFieldMetaProps {
|
85 | active?: boolean | undefined;
|
86 | autofilled: boolean;
|
87 | asyncValidating: boolean;
|
88 | dirty: boolean;
|
89 | dispatch: Dispatch<any>;
|
90 | error?: any;
|
91 | form: string;
|
92 | initial: any;
|
93 | invalid: boolean;
|
94 | pristine: boolean;
|
95 | submitting: boolean;
|
96 | submitFailed: boolean;
|
97 | touched: boolean;
|
98 | valid: boolean;
|
99 | visited: boolean;
|
100 | warning?: any;
|
101 | }
|
102 |
|
103 | export default Field;
|