1 | import {
|
2 | ChangeEvent,
|
3 | Component,
|
4 | ComponentType,
|
5 | DragEvent,
|
6 | FocusEvent,
|
7 | InputHTMLAttributes,
|
8 | ReactElement,
|
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>
|
65 | extends Component<P>
|
66 | {
|
67 | dirty: boolean;
|
68 | name: string;
|
69 | pristine: boolean;
|
70 | value: any;
|
71 | getRenderedComponent(): Component<WrappedFieldProps & P>;
|
72 | }
|
73 |
|
74 | export interface WrappedFieldProps {
|
75 | input: WrappedFieldInputProps;
|
76 | meta: WrappedFieldMetaProps;
|
77 | }
|
78 |
|
79 | export interface WrappedFieldInputProps extends CommonFieldInputProps {
|
80 | checked?: boolean | undefined;
|
81 | value: any;
|
82 | onBlur: EventOrValueHandler<FocusEvent<any>>;
|
83 | onChange: EventOrValueHandler<ChangeEvent<any>>;
|
84 | }
|
85 |
|
86 | export interface WrappedFieldMetaProps {
|
87 | active?: boolean | undefined;
|
88 | autofilled: boolean;
|
89 | asyncValidating: boolean;
|
90 | dirty: boolean;
|
91 | dispatch: Dispatch<any>;
|
92 | error?: any;
|
93 | form: string;
|
94 | initial: any;
|
95 | invalid: boolean;
|
96 | pristine: boolean;
|
97 | submitting: boolean;
|
98 | submitFailed: boolean;
|
99 | touched: boolean;
|
100 | valid: boolean;
|
101 | visited: boolean;
|
102 | warning?: any;
|
103 | }
|
104 |
|
105 | export default Field;
|