@react-fabric/form 1.0.0-beta.6 → 1.0.0-beta.61
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{src/input/ArrayInput.module.css → css/_arrayInput.css} +8 -8
- package/css/_colorPicker.css +65 -0
- package/{src/internal/Field.module.css → css/_field.css} +66 -30
- package/{src/input/File.module.css → css/_file.css} +21 -6
- package/css/styles.css +27 -0
- package/dist/cjs/builder/FileField.js +40 -28
- package/dist/cjs/builder/FormField.js +50 -34
- package/dist/cjs/builder/SchemaEditor.js +72 -0
- package/dist/cjs/builder/components/AddSchemaFields.js +63 -0
- package/dist/cjs/builder/components/SchemaArrayForm.js +145 -0
- package/dist/cjs/builder/components/SchemaField.js +414 -0
- package/dist/cjs/form/Controller.js +46 -1
- package/dist/cjs/form/Form.js +71 -13
- package/dist/cjs/hooks/useFileUploader.js +16 -0
- package/dist/cjs/hooks/useFormBuilder.js +67 -18
- package/dist/cjs/i18n/ar.json.js +5 -4
- package/dist/cjs/i18n/en.json.js +5 -5
- package/dist/cjs/index.js +12 -2
- package/dist/cjs/input/ArrayInput.js +128 -38
- package/dist/cjs/input/AvatarInput.js +43 -23
- package/dist/cjs/input/Checkbox.js +18 -8
- package/dist/cjs/input/ColorInput.js +114 -59
- package/dist/cjs/input/ColorPicker.js +60 -76
- package/dist/cjs/input/DateInput.js +197 -0
- package/dist/cjs/input/Field.js +10 -4
- package/dist/cjs/input/File.js +15 -8
- package/dist/cjs/input/Hidden.js +13 -2
- package/dist/cjs/input/Input.js +24 -10
- package/dist/cjs/input/Number.js +22 -10
- package/dist/cjs/input/Password.js +23 -13
- package/dist/cjs/input/Radio.js +14 -5
- package/dist/cjs/input/RadioGroup.js +10 -1
- package/dist/cjs/input/{Range.js → RangeSlider.js} +16 -8
- package/dist/cjs/input/Search.js +32 -22
- package/dist/cjs/input/Slider.js +12 -6
- package/dist/cjs/input/Switch.js +20 -9
- package/dist/cjs/input/Textarea.js +29 -8
- package/dist/cjs/internal/ErrorIcon.js +2 -2
- package/dist/cjs/internal/FieldWrapper.js +11 -4
- package/dist/cjs/internal/InputWrapper.js +29 -22
- package/dist/cjs/select/AutoComplete.js +22 -13
- package/dist/cjs/select/DualList.js +34 -12
- package/dist/cjs/select/List.js +49 -21
- package/dist/cjs/select/Options.js +49 -42
- package/dist/cjs/select/Select.js +21 -10
- package/dist/cjs/select/useSelect.js +22 -11
- package/dist/cjs/types/schema.js +43 -0
- package/dist/cjs/utils/eventHandlers.js +15 -5
- package/dist/esm/builder/FileField.js +42 -30
- package/dist/esm/builder/FormField.js +50 -34
- package/dist/esm/builder/SchemaEditor.js +72 -0
- package/dist/esm/builder/components/AddSchemaFields.js +63 -0
- package/dist/esm/builder/components/SchemaArrayForm.js +145 -0
- package/dist/esm/builder/components/SchemaField.js +414 -0
- package/dist/esm/form/Controller.js +46 -1
- package/dist/esm/form/Form.js +73 -16
- package/dist/esm/hooks/useFileUploader.js +16 -0
- package/dist/esm/hooks/useFormBuilder.js +65 -16
- package/dist/esm/i18n/ar.json.js +5 -4
- package/dist/esm/i18n/en.json.js +5 -5
- package/dist/esm/index.js +6 -2
- package/dist/esm/input/ArrayInput.js +128 -38
- package/dist/esm/input/AvatarInput.js +43 -23
- package/dist/esm/input/Checkbox.js +19 -9
- package/dist/esm/input/ColorInput.js +116 -61
- package/dist/esm/input/ColorPicker.js +60 -76
- package/dist/esm/input/DateInput.js +197 -0
- package/dist/esm/input/Field.js +11 -5
- package/dist/esm/input/File.js +18 -11
- package/dist/esm/input/Hidden.js +13 -2
- package/dist/esm/input/Input.js +26 -12
- package/dist/esm/input/Number.js +24 -12
- package/dist/esm/input/Password.js +26 -16
- package/dist/esm/input/Radio.js +15 -6
- package/dist/esm/input/RadioGroup.js +11 -2
- package/dist/esm/input/{Range.js → RangeSlider.js} +16 -8
- package/dist/esm/input/Search.js +35 -25
- package/dist/esm/input/Slider.js +12 -6
- package/dist/esm/input/Switch.js +20 -9
- package/dist/esm/input/Textarea.js +30 -9
- package/dist/esm/internal/ErrorIcon.js +3 -3
- package/dist/esm/internal/FieldWrapper.js +11 -4
- package/dist/esm/internal/InputWrapper.js +30 -23
- package/dist/esm/select/AutoComplete.js +23 -14
- package/dist/esm/select/DualList.js +35 -13
- package/dist/esm/select/List.js +50 -22
- package/dist/esm/select/Options.js +49 -42
- package/dist/esm/select/Select.js +22 -11
- package/dist/esm/select/useSelect.js +23 -12
- package/{src/input/ColorPicker.module.css → dist/esm/types/schema.js} +18 -27
- package/dist/esm/utils/eventHandlers.js +15 -5
- package/dist/types/builder/FileField.d.ts +4 -2
- package/dist/types/builder/FormField.d.ts +3 -1
- package/dist/types/builder/SchemaEditor.d.ts +9 -0
- package/dist/types/builder/components/AddSchemaFields.d.ts +2 -0
- package/dist/types/builder/components/SchemaArrayForm.d.ts +2 -0
- package/dist/types/builder/components/SchemaField.d.ts +10 -0
- package/dist/types/form/Controller.d.ts +47 -2
- package/dist/types/form/Form.d.ts +49 -6
- package/dist/types/hooks/useFileUploader.d.ts +16 -0
- package/dist/types/hooks/useFormBuilder.d.ts +38 -1
- package/dist/types/index.d.ts +6 -3
- package/dist/types/input/ArrayInput.d.ts +69 -12
- package/dist/types/input/AvatarInput.d.ts +23 -3
- package/dist/types/input/Checkbox.d.ts +13 -4
- package/dist/types/input/ColorInput.d.ts +15 -2
- package/dist/types/input/ColorPicker.d.ts +11 -1
- package/dist/types/input/DateInput.d.ts +28 -0
- package/dist/types/input/Field.d.ts +5 -1
- package/dist/types/input/File.d.ts +9 -0
- package/dist/types/input/Hidden.d.ts +13 -1
- package/dist/types/input/Input.d.ts +9 -1
- package/dist/types/input/Number.d.ts +9 -1
- package/dist/types/input/Password.d.ts +7 -1
- package/dist/types/input/Radio.d.ts +9 -1
- package/dist/types/input/RadioGroup.d.ts +8 -1
- package/dist/types/input/RangeSlider.d.ts +67 -0
- package/dist/types/input/Search.d.ts +14 -1
- package/dist/types/input/Slider.d.ts +8 -2
- package/dist/types/input/Switch.d.ts +10 -2
- package/dist/types/input/Textarea.d.ts +15 -1
- package/dist/types/internal/FieldWrapper.d.ts +1 -1
- package/dist/types/internal/InputWrapper.d.ts +1 -1
- package/dist/types/ranger/index.d.ts +2 -2
- package/dist/types/select/AutoComplete.d.ts +8 -1
- package/dist/types/select/DualList.d.ts +21 -7
- package/dist/types/select/List.d.ts +9 -1
- package/dist/types/select/Options.d.ts +4 -3
- package/dist/types/select/Select.d.ts +9 -1
- package/dist/types/select/useSelect.d.ts +10 -6
- package/dist/types/types/index.d.ts +38 -10
- package/dist/types/types/schema.d.ts +78 -33
- package/dist/types/utils/eventHandlers.d.ts +2 -2
- package/package.json +22 -20
- package/src/builder/FileField.tsx +56 -30
- package/src/builder/FormField.tsx +52 -32
- package/src/builder/SchemaEditor.tsx +79 -0
- package/src/builder/components/AddSchemaFields.tsx +75 -0
- package/src/builder/components/SchemaArrayForm.tsx +155 -0
- package/src/builder/components/SchemaField.tsx +435 -0
- package/src/form/Controller.tsx +48 -3
- package/src/form/Form.tsx +84 -13
- package/src/hooks/useFileUploader.ts +16 -0
- package/src/hooks/useFormBuilder.tsx +70 -19
- package/src/i18n/ar.json +5 -4
- package/src/i18n/en.json +5 -5
- package/src/index.ts +12 -3
- package/src/input/ArrayInput.tsx +195 -66
- package/src/input/AvatarInput.tsx +66 -18
- package/src/input/Checkbox.tsx +22 -9
- package/src/input/ColorInput.tsx +128 -72
- package/src/input/ColorPicker.tsx +54 -72
- package/src/input/DateInput.tsx +260 -0
- package/src/input/Field.tsx +15 -11
- package/src/input/File.tsx +18 -16
- package/src/input/Hidden.tsx +17 -2
- package/src/input/Input.tsx +27 -13
- package/src/input/Number.tsx +22 -13
- package/src/input/Password.tsx +28 -18
- package/src/input/Radio.tsx +15 -6
- package/src/input/RadioGroup.tsx +12 -3
- package/src/input/{Range.tsx → RangeSlider.tsx} +17 -9
- package/src/input/Search.tsx +36 -25
- package/src/input/Slider.tsx +20 -11
- package/src/input/Switch.tsx +17 -6
- package/src/input/Textarea.tsx +34 -9
- package/src/internal/ErrorIcon.tsx +3 -3
- package/src/internal/FieldWrapper.tsx +8 -4
- package/src/internal/InputWrapper.tsx +56 -30
- package/src/select/AutoComplete.tsx +16 -6
- package/src/select/DualList.tsx +40 -22
- package/src/select/List.tsx +52 -8
- package/src/select/Options.tsx +50 -46
- package/src/select/Select.tsx +29 -10
- package/src/select/useSelect.tsx +26 -9
- package/src/types/index.ts +42 -10
- package/src/types/schema.ts +96 -41
- package/src/utils/eventHandlers.ts +14 -4
- package/dist/cjs/input/ArrayInput.module.css +0 -1
- package/dist/cjs/input/ColorPicker.module.css +0 -1
- package/dist/cjs/input/File.module.css +0 -1
- package/dist/cjs/internal/Field.module.css +0 -1
- package/dist/esm/input/ArrayInput.module.css +0 -1
- package/dist/esm/input/ColorPicker.module.css +0 -1
- package/dist/esm/input/File.module.css +0 -1
- package/dist/esm/internal/Field.module.css +0 -1
- package/dist/types/input/Range.d.ts +0 -59
|
@@ -1,23 +1,26 @@
|
|
|
1
|
-
/// <reference types="react" />
|
|
2
1
|
interface State {
|
|
3
2
|
multiple: boolean;
|
|
4
3
|
emptyValue: AnyObject;
|
|
5
4
|
open: boolean;
|
|
6
5
|
loading: boolean;
|
|
7
6
|
activeIndex: number | null;
|
|
7
|
+
activeItem: AnyObject;
|
|
8
8
|
selectedIndex: number | null;
|
|
9
9
|
value: AnyObject;
|
|
10
10
|
query?: string;
|
|
11
11
|
items: AnyObject[];
|
|
12
12
|
}
|
|
13
|
-
export declare const useSelect: ({ options, value, autoComplete, multiple, allowCreate, groupProperty, valueProperty, labelProperty, createOption, matcher, onQuery, onChange, onSelect, }: {
|
|
13
|
+
export declare const useSelect: ({ options, value, autoComplete, alwaysOpen, defaultOpen, multiple, allowCreate, groupProperty, valueProperty, labelProperty, sortProperty, createOption, matcher, onQuery, onChange, onSelect, }: {
|
|
14
14
|
value?: AnyObject;
|
|
15
15
|
options?: AnyObject[];
|
|
16
16
|
multiple?: boolean;
|
|
17
|
+
alwaysOpen?: boolean;
|
|
18
|
+
defaultOpen?: boolean;
|
|
17
19
|
allowCreate?: boolean;
|
|
18
20
|
groupProperty?: AnyObject;
|
|
19
21
|
valueProperty?: AnyObject;
|
|
20
22
|
labelProperty?: AnyObject;
|
|
23
|
+
sortProperty?: AnyObject;
|
|
21
24
|
autoComplete?: boolean;
|
|
22
25
|
matcher?: (item: AnyObject, query: string) => boolean;
|
|
23
26
|
createOption?: (query: string) => AnyObject;
|
|
@@ -28,17 +31,18 @@ export declare const useSelect: ({ options, value, autoComplete, multiple, allow
|
|
|
28
31
|
state: State | {
|
|
29
32
|
value: any;
|
|
30
33
|
activeIndex: null;
|
|
34
|
+
activeItem: null;
|
|
31
35
|
selectedIndex: any;
|
|
32
36
|
multiple: boolean;
|
|
33
37
|
emptyValue: AnyObject;
|
|
34
38
|
open: boolean;
|
|
35
39
|
loading: boolean;
|
|
36
|
-
query?: string
|
|
40
|
+
query?: string;
|
|
37
41
|
items: AnyObject[];
|
|
38
42
|
};
|
|
39
|
-
listRef: import("react").
|
|
40
|
-
focusableRef: import("react").RefObject<HTMLElement>;
|
|
41
|
-
listContentRef: import("react").
|
|
43
|
+
listRef: import("react").RefObject<HTMLElement[]>;
|
|
44
|
+
focusableRef: import("react").RefObject<HTMLElement | null>;
|
|
45
|
+
listContentRef: import("react").RefObject<any[]>;
|
|
42
46
|
handleChange: (value?: AnyObject) => void;
|
|
43
47
|
handleRemove: (index?: number) => void;
|
|
44
48
|
handleQuery: (query: string) => void;
|
|
@@ -1,14 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
import { type RefProp, type TestProps } from "@react-fabric/core/dist/types/types";
|
|
1
|
+
import { type NestedKeys, type ReactElement, type RefProp, type TestProps } from "@react-fabric/core/dist/types/types";
|
|
3
2
|
export interface InputProps<V = string> extends TestProps {
|
|
4
3
|
/**
|
|
5
4
|
* value
|
|
6
5
|
*/
|
|
7
|
-
value?: V;
|
|
6
|
+
value?: V | null;
|
|
7
|
+
/**
|
|
8
|
+
* default value
|
|
9
|
+
*/
|
|
10
|
+
defaultValue?: V | null;
|
|
8
11
|
/**
|
|
9
12
|
* change handler
|
|
10
13
|
*/
|
|
11
|
-
onChange?: (value
|
|
14
|
+
onChange?: (value: V | null) => void;
|
|
12
15
|
/**
|
|
13
16
|
* on focus event handler
|
|
14
17
|
*/
|
|
@@ -45,10 +48,13 @@ export interface InputProps<V = string> extends TestProps {
|
|
|
45
48
|
*
|
|
46
49
|
*/
|
|
47
50
|
decorateEnd?: JSX.Element | string | number | boolean;
|
|
51
|
+
decorateEndShowWhenEmpty?: boolean;
|
|
52
|
+
decorateEndHideWhenEmpty?: boolean;
|
|
48
53
|
/**
|
|
49
54
|
* info label at bottom
|
|
50
55
|
*/
|
|
51
56
|
info?: string;
|
|
57
|
+
monospace?: boolean;
|
|
52
58
|
/**
|
|
53
59
|
* required
|
|
54
60
|
*/
|
|
@@ -90,7 +96,15 @@ export interface InputProps<V = string> extends TestProps {
|
|
|
90
96
|
*/
|
|
91
97
|
labelWidth?: string;
|
|
92
98
|
}
|
|
93
|
-
export interface BaseSelectProps<T
|
|
99
|
+
export interface BaseSelectProps<T extends AnyObject = string> {
|
|
100
|
+
/**
|
|
101
|
+
* open dropdown by default
|
|
102
|
+
*/
|
|
103
|
+
defaultOpen?: boolean;
|
|
104
|
+
/**
|
|
105
|
+
* hide dropdown handle
|
|
106
|
+
*/
|
|
107
|
+
hideHandle?: boolean;
|
|
94
108
|
/**
|
|
95
109
|
* list options
|
|
96
110
|
*/
|
|
@@ -98,15 +112,23 @@ export interface BaseSelectProps<T> extends RefProp<HTMLInputElement>, Omit<Inpu
|
|
|
98
112
|
/**
|
|
99
113
|
* group by property name
|
|
100
114
|
*/
|
|
101
|
-
groupProperty?:
|
|
115
|
+
groupProperty?: NestedKeys<T>;
|
|
102
116
|
/**
|
|
103
117
|
* label property name
|
|
104
118
|
*/
|
|
105
|
-
labelProperty?:
|
|
119
|
+
labelProperty?: NestedKeys<T>;
|
|
120
|
+
/**
|
|
121
|
+
* value property name
|
|
122
|
+
*/
|
|
123
|
+
valueProperty?: NestedKeys<T>;
|
|
106
124
|
/**
|
|
107
125
|
* value property name
|
|
108
126
|
*/
|
|
109
|
-
|
|
127
|
+
infoProperty?: NestedKeys<T>;
|
|
128
|
+
/**
|
|
129
|
+
* value property name
|
|
130
|
+
*/
|
|
131
|
+
sortProperty?: NestedKeys<T> | true;
|
|
110
132
|
/**
|
|
111
133
|
* searchable list
|
|
112
134
|
*/
|
|
@@ -115,6 +137,10 @@ export interface BaseSelectProps<T> extends RefProp<HTMLInputElement>, Omit<Inpu
|
|
|
115
137
|
* allow create item
|
|
116
138
|
*/
|
|
117
139
|
allowCreate?: boolean;
|
|
140
|
+
/**
|
|
141
|
+
* empty list display
|
|
142
|
+
*/
|
|
143
|
+
emptyDisplay?: ReactElement;
|
|
118
144
|
/**
|
|
119
145
|
* create new item object
|
|
120
146
|
*/
|
|
@@ -126,13 +152,14 @@ export interface BaseSelectProps<T> extends RefProp<HTMLInputElement>, Omit<Inpu
|
|
|
126
152
|
/**
|
|
127
153
|
* item renderer
|
|
128
154
|
*/
|
|
129
|
-
renderer?: (option: T) =>
|
|
155
|
+
renderer?: (option: T) => ReactElement;
|
|
130
156
|
/**
|
|
131
157
|
* item matcher
|
|
132
158
|
*/
|
|
133
159
|
matcher?: (option: T, query: string) => boolean;
|
|
134
160
|
}
|
|
135
|
-
|
|
161
|
+
type BaseSelectType<T> = BaseSelectProps<T> & RefProp<HTMLInputElement> & Omit<InputProps, "value" | "onChange">;
|
|
162
|
+
export type SelectProps<T> = BaseSelectType<T> & ({
|
|
136
163
|
/**
|
|
137
164
|
* is multiple selection
|
|
138
165
|
*/
|
|
@@ -167,3 +194,4 @@ export type SelectProps<T> = BaseSelectProps<T> & ({
|
|
|
167
194
|
*/
|
|
168
195
|
onChange?: (value?: string[]) => void;
|
|
169
196
|
});
|
|
197
|
+
export {};
|
|
@@ -1,59 +1,104 @@
|
|
|
1
|
-
|
|
1
|
+
import { type Elements } from "@react-fabric/core/dist/types/types";
|
|
2
|
+
import { type DateLike } from "@react-fabric/date";
|
|
3
|
+
export declare enum DATA_TYPES {
|
|
4
|
+
TEXT = "text",
|
|
5
|
+
COLOR = "color",
|
|
6
|
+
BOOL = "bool",
|
|
7
|
+
DATE = "date",
|
|
8
|
+
DATETIME = "datetime",
|
|
9
|
+
STRING = "string",
|
|
10
|
+
NUMBER = "number",
|
|
11
|
+
RANGE = "range",
|
|
12
|
+
FILE = "file",
|
|
13
|
+
AVATAR = "avatar",
|
|
14
|
+
SCHEMA = "schema"
|
|
15
|
+
}
|
|
16
|
+
export declare const SCHEMA_CUSTOM_LIST = "--CUSTOM--";
|
|
17
|
+
interface SingleValue {
|
|
18
|
+
multiple?: false;
|
|
19
|
+
minItems?: never;
|
|
20
|
+
maxItems?: never;
|
|
21
|
+
}
|
|
22
|
+
interface MultipleValue {
|
|
23
|
+
multiple: true;
|
|
24
|
+
minItems?: number;
|
|
25
|
+
maxItems?: number;
|
|
26
|
+
}
|
|
27
|
+
export type ValueType = SingleValue | MultipleValue;
|
|
28
|
+
interface BaseSchema {
|
|
2
29
|
id: string;
|
|
3
30
|
label: string;
|
|
4
31
|
datatype: string;
|
|
5
32
|
required?: boolean;
|
|
6
|
-
multiple?: boolean;
|
|
7
|
-
defaultValue?: AnyObject;
|
|
8
33
|
}
|
|
9
|
-
interface
|
|
10
|
-
datatype:
|
|
34
|
+
export interface DefaultSchema extends BaseSchema {
|
|
35
|
+
datatype: DATA_TYPES.TEXT | DATA_TYPES.COLOR;
|
|
11
36
|
}
|
|
12
|
-
interface BooleanSchema extends
|
|
13
|
-
datatype:
|
|
14
|
-
defaultValue?: boolean;
|
|
37
|
+
export interface BooleanSchema extends BaseSchema {
|
|
38
|
+
datatype: DATA_TYPES.BOOL;
|
|
15
39
|
}
|
|
16
|
-
interface StringSchema extends
|
|
17
|
-
datatype:
|
|
18
|
-
options?: string[];
|
|
40
|
+
export interface StringSchema extends BaseSchema {
|
|
41
|
+
datatype: DATA_TYPES.STRING;
|
|
19
42
|
regex?: string;
|
|
20
|
-
|
|
43
|
+
options?: string[];
|
|
44
|
+
optionList?: string;
|
|
45
|
+
allowCustom?: boolean;
|
|
21
46
|
}
|
|
22
|
-
interface RangeSchema extends
|
|
23
|
-
datatype:
|
|
47
|
+
export interface RangeSchema extends BaseSchema {
|
|
48
|
+
datatype: DATA_TYPES.RANGE;
|
|
24
49
|
min?: number;
|
|
25
50
|
max?: number;
|
|
26
51
|
step?: number;
|
|
27
|
-
defaultValue?: [number, number];
|
|
28
52
|
}
|
|
29
|
-
interface
|
|
30
|
-
datatype:
|
|
31
|
-
min?:
|
|
32
|
-
max?:
|
|
33
|
-
step?: number;
|
|
34
|
-
defaultValue?: number;
|
|
53
|
+
export interface DateSchema extends BaseSchema {
|
|
54
|
+
datatype: DATA_TYPES.DATE | DATA_TYPES.DATETIME;
|
|
55
|
+
min?: DateLike;
|
|
56
|
+
max?: DateLike;
|
|
35
57
|
}
|
|
36
|
-
interface
|
|
37
|
-
datatype:
|
|
58
|
+
export interface NumberSchema extends BaseSchema {
|
|
59
|
+
datatype: DATA_TYPES.NUMBER;
|
|
38
60
|
min?: number;
|
|
39
61
|
max?: number;
|
|
40
62
|
step?: number;
|
|
41
|
-
defaultValue?: number;
|
|
42
63
|
}
|
|
43
|
-
export interface FileSchema extends
|
|
44
|
-
datatype:
|
|
64
|
+
export interface FileSchema extends BaseSchema {
|
|
65
|
+
datatype: DATA_TYPES.FILE;
|
|
45
66
|
accept?: string;
|
|
46
67
|
}
|
|
47
|
-
export interface AvatarSchema extends
|
|
48
|
-
datatype:
|
|
68
|
+
export interface AvatarSchema extends BaseSchema {
|
|
69
|
+
datatype: DATA_TYPES.AVATAR;
|
|
49
70
|
multiple?: false;
|
|
50
71
|
}
|
|
51
|
-
export type SchemaType =
|
|
52
|
-
export interface ChildSchema extends
|
|
53
|
-
datatype:
|
|
72
|
+
export type SchemaType = (DefaultSchema & ValueType) | (BooleanSchema & ValueType) | (StringSchema & ValueType) | (RangeSchema & ValueType) | (DateSchema & ValueType) | (NumberSchema & ValueType) | (FileSchema & ValueType) | (AvatarSchema & ValueType);
|
|
73
|
+
export interface ChildSchema extends BaseSchema {
|
|
74
|
+
datatype: DATA_TYPES.SCHEMA;
|
|
54
75
|
inline?: boolean;
|
|
55
76
|
schema: SchemaType[];
|
|
56
|
-
defaultValue?: never;
|
|
57
77
|
}
|
|
58
|
-
export type
|
|
78
|
+
export type SchemaDef = SchemaType | (ChildSchema & ValueType);
|
|
79
|
+
export type FormSchema = SchemaDef[];
|
|
80
|
+
export interface SchemaEditorProps {
|
|
81
|
+
/**
|
|
82
|
+
* default form schema
|
|
83
|
+
*/
|
|
84
|
+
schemaDef: FormSchema;
|
|
85
|
+
/**
|
|
86
|
+
* is dynamic schema (allow add/remove)
|
|
87
|
+
*/
|
|
88
|
+
dynamic?: boolean;
|
|
89
|
+
/**
|
|
90
|
+
* acceptable list of data types
|
|
91
|
+
*/
|
|
92
|
+
acceptableTypes?: DATA_TYPES[];
|
|
93
|
+
/**
|
|
94
|
+
* available option lists in application
|
|
95
|
+
*/
|
|
96
|
+
optionLists?: string[];
|
|
97
|
+
/**
|
|
98
|
+
* footer actions
|
|
99
|
+
*/
|
|
100
|
+
children?: Elements<JSX.Element> | Array<Elements<JSX.Element>>;
|
|
101
|
+
onChange?: (schema: FormSchema) => void;
|
|
102
|
+
onSubmit?: (schema: FormSchema) => void;
|
|
103
|
+
}
|
|
59
104
|
export {};
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { type KeyboardEvent, type MouseEvent } from "react";
|
|
2
2
|
/** ***************** common handler for enter press *******************/
|
|
3
|
-
export declare const
|
|
3
|
+
export declare const useHandleEnter: (callback?: (e: KeyboardEvent) => void, { stopPropagation, preventDefault, }?: {
|
|
4
4
|
stopPropagation?: boolean;
|
|
5
5
|
preventDefault?: boolean;
|
|
6
|
-
}) => (e: KeyboardEvent) => false | undefined;
|
|
6
|
+
}) => (e: KeyboardEvent<HTMLInputElement>) => false | undefined;
|
|
7
7
|
/** ***************** common handler for mouse primary click *******************/
|
|
8
8
|
export declare const handleClick: (callback?: (e: MouseEvent) => void, { stopPropagation, preventDefault, }?: {
|
|
9
9
|
stopPropagation?: boolean;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@react-fabric/form",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.61",
|
|
4
4
|
"description": "RUF: Form package",
|
|
5
5
|
"author": "Adarsh Pastakia <adarshpastakia@outlook.com>",
|
|
6
6
|
"license": "MIT",
|
|
@@ -11,9 +11,11 @@
|
|
|
11
11
|
"types": "dist/types/index.d.ts",
|
|
12
12
|
"directories": {
|
|
13
13
|
"src": "src",
|
|
14
|
+
"styles": "css",
|
|
14
15
|
"test": "tests"
|
|
15
16
|
},
|
|
16
17
|
"files": [
|
|
18
|
+
"css",
|
|
17
19
|
"src",
|
|
18
20
|
"dist"
|
|
19
21
|
],
|
|
@@ -33,32 +35,32 @@
|
|
|
33
35
|
"watch": "npm-run-all -p watch:rollup watch:dts"
|
|
34
36
|
},
|
|
35
37
|
"dependencies": {
|
|
36
|
-
"@dnd-kit/core": "
|
|
37
|
-
"@dnd-kit/modifiers": "
|
|
38
|
-
"@dnd-kit/sortable": "
|
|
39
|
-
"@dnd-kit/utilities": "
|
|
40
|
-
"@floating-ui/react": "0.
|
|
41
|
-
"@hookform/resolvers": "
|
|
42
|
-
"@react-fabric/core": "^1.0.0-beta.
|
|
43
|
-
"@react-fabric/
|
|
44
|
-
"
|
|
45
|
-
"
|
|
46
|
-
"
|
|
47
|
-
"react-
|
|
38
|
+
"@dnd-kit/core": "~6.3.1",
|
|
39
|
+
"@dnd-kit/modifiers": "~9.0.0",
|
|
40
|
+
"@dnd-kit/sortable": "~10.0.0",
|
|
41
|
+
"@dnd-kit/utilities": "~3.2.2",
|
|
42
|
+
"@floating-ui/react": "~0.27.16",
|
|
43
|
+
"@hookform/resolvers": "~5.2.2",
|
|
44
|
+
"@react-fabric/core": "^1.0.0-beta.61",
|
|
45
|
+
"@react-fabric/date": "^1.0.0-beta.61",
|
|
46
|
+
"@react-fabric/utilities": "^1.0.0-beta.61",
|
|
47
|
+
"classnames": "~2.5.1",
|
|
48
|
+
"color": "~5.0.2",
|
|
49
|
+
"react-color": "~2.19.3",
|
|
50
|
+
"react-hook-form": "~7.65.0"
|
|
48
51
|
},
|
|
49
52
|
"peerDependencies": {
|
|
50
|
-
"i18next": "
|
|
51
|
-
"react": "
|
|
52
|
-
"react-dom": "
|
|
53
|
-
"react-i18next": "
|
|
53
|
+
"i18next": "~25.6.0",
|
|
54
|
+
"react": "~19.2.0",
|
|
55
|
+
"react-dom": "~19.2.0",
|
|
56
|
+
"react-i18next": "~16.2.1"
|
|
54
57
|
},
|
|
55
58
|
"devDependencies": {
|
|
56
|
-
"@types/
|
|
57
|
-
"@types/react-color": "^3.0.12"
|
|
59
|
+
"@types/react-color": "~3.0.13"
|
|
58
60
|
},
|
|
59
61
|
"engines": {
|
|
60
62
|
"node": ">=18.12.0",
|
|
61
63
|
"npm": ">=8.19.0"
|
|
62
64
|
},
|
|
63
|
-
"gitHead": "
|
|
65
|
+
"gitHead": "a0b0c571bf9c189fa3355bbc3b896ecc4b9d6a04"
|
|
64
66
|
}
|
|
@@ -21,28 +21,35 @@
|
|
|
21
21
|
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
|
-
import { Button, Icon, ProgressBar } from "@react-fabric/core";
|
|
25
|
-
import { FileUtil, Format } from "@react-fabric/utilities";
|
|
24
|
+
import { Button, Icon, ProgressBar, Tooltip } from "@react-fabric/core";
|
|
25
|
+
import { FileUtil, Format, isString } from "@react-fabric/utilities";
|
|
26
26
|
import { Fragment } from "react";
|
|
27
|
-
import {
|
|
27
|
+
import { useTranslation } from "react-i18next";
|
|
28
|
+
import { useFileUploader, type UploadHandler } from "../hooks/useFileUploader";
|
|
28
29
|
import { Field } from "../input/Field";
|
|
29
30
|
import { HiddenInput } from "../input/Hidden";
|
|
30
|
-
import { type FileSchema } from "../types/schema";
|
|
31
|
+
import { type FileSchema, type ValueType } from "../types/schema";
|
|
31
32
|
|
|
32
33
|
export const FileField = ({
|
|
33
34
|
uploadHandler,
|
|
34
35
|
inline,
|
|
35
36
|
label,
|
|
36
37
|
accept,
|
|
37
|
-
multiple = false,
|
|
38
38
|
value,
|
|
39
|
+
fileUrl,
|
|
40
|
+
multiple,
|
|
41
|
+
invalid,
|
|
42
|
+
error,
|
|
39
43
|
...rest
|
|
40
|
-
}: Partial<FileSchema> & {
|
|
44
|
+
}: Partial<FileSchema & ValueType> & {
|
|
41
45
|
value?: AnyObject;
|
|
42
46
|
inline?: boolean;
|
|
47
|
+
invalid?: boolean;
|
|
48
|
+
error?: AnyObject;
|
|
43
49
|
fileUrl?: (path: string) => string;
|
|
44
50
|
uploadHandler: UploadHandler;
|
|
45
51
|
}) => {
|
|
52
|
+
const { t } = useTranslation();
|
|
46
53
|
const { pending, files, list, upload, remove } = useFileUploader(
|
|
47
54
|
async (data, config) => await uploadHandler?.(data, config),
|
|
48
55
|
value,
|
|
@@ -51,29 +58,48 @@ export const FileField = ({
|
|
|
51
58
|
|
|
52
59
|
return (
|
|
53
60
|
<Fragment>
|
|
54
|
-
<Field plain inline={inline} label={label}
|
|
61
|
+
<Field plain inline={inline} label={label}>
|
|
55
62
|
<HiddenInput hiddenValue={multiple ? list : list?.[0]} {...rest} />
|
|
56
|
-
<span>
|
|
57
|
-
<Button
|
|
58
|
-
badge={pending > 0 ? `${pending}` : undefined}
|
|
59
|
-
data-ref="filebtn"
|
|
60
|
-
>
|
|
61
|
-
<Fragment>
|
|
62
|
-
<span>Add file</span>
|
|
63
|
-
<input
|
|
64
|
-
type="file"
|
|
65
|
-
accept={accept}
|
|
66
|
-
multiple={multiple}
|
|
67
|
-
className="absolute inset-0 opacity-0 z-5"
|
|
68
|
-
onChange={(e) => [
|
|
69
|
-
upload(e.target.files),
|
|
70
|
-
(e.target.value = ""),
|
|
71
|
-
]}
|
|
72
|
-
/>
|
|
73
|
-
</Fragment>
|
|
74
|
-
</Button>
|
|
75
|
-
</span>
|
|
76
63
|
</Field>
|
|
64
|
+
<Tooltip
|
|
65
|
+
color="danger-200"
|
|
66
|
+
content={
|
|
67
|
+
isString(error)
|
|
68
|
+
? `${error}`
|
|
69
|
+
: error &&
|
|
70
|
+
(t(
|
|
71
|
+
error?.key,
|
|
72
|
+
error.values
|
|
73
|
+
? {
|
|
74
|
+
...error?.values,
|
|
75
|
+
label: t(
|
|
76
|
+
error.values?.label ?? "form:badkey",
|
|
77
|
+
error.values?.path,
|
|
78
|
+
),
|
|
79
|
+
}
|
|
80
|
+
: {},
|
|
81
|
+
) as string)
|
|
82
|
+
}
|
|
83
|
+
disabled={!error}
|
|
84
|
+
>
|
|
85
|
+
<Button
|
|
86
|
+
badge={pending > 0 ? `${pending}` : undefined}
|
|
87
|
+
color={error ? "danger" : undefined}
|
|
88
|
+
variant={error ? "soft" : undefined}
|
|
89
|
+
data-ref="filebtn"
|
|
90
|
+
>
|
|
91
|
+
<Fragment>
|
|
92
|
+
<span>Add file</span>
|
|
93
|
+
<input
|
|
94
|
+
type="file"
|
|
95
|
+
accept={accept}
|
|
96
|
+
multiple={multiple}
|
|
97
|
+
className="absolute inset-0 opacity-0 z-5"
|
|
98
|
+
onChange={(e) => [upload(e.target.files), (e.target.value = "")]}
|
|
99
|
+
/>
|
|
100
|
+
</Fragment>
|
|
101
|
+
</Button>
|
|
102
|
+
</Tooltip>
|
|
77
103
|
<br />
|
|
78
104
|
<div className="bg-alternate">
|
|
79
105
|
{files.map((file, idx) => (
|
|
@@ -92,18 +118,18 @@ export const FileField = ({
|
|
|
92
118
|
</div>
|
|
93
119
|
{file.progress && (
|
|
94
120
|
<Icon
|
|
95
|
-
icon="mdi
|
|
121
|
+
icon="icon-[mdi--stop]"
|
|
96
122
|
bg="danger"
|
|
97
123
|
color="white"
|
|
98
124
|
size="sm"
|
|
99
|
-
className="p-
|
|
125
|
+
className="p-0.5"
|
|
100
126
|
aria-label="abort"
|
|
101
127
|
onClick={() => file.abort?.()}
|
|
102
128
|
/>
|
|
103
129
|
)}
|
|
104
130
|
{!file.progress && (
|
|
105
131
|
<Icon
|
|
106
|
-
icon="mdi
|
|
132
|
+
icon="icon-[mdi--trash-can-outline]"
|
|
107
133
|
color="danger"
|
|
108
134
|
size="sm"
|
|
109
135
|
aria-label="remove"
|