@akinon/akiform-builder 0.5.0 → 0.7.0
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/dist/cjs/akiform-builder.d.ts +6 -0
- package/dist/cjs/akiform-builder.d.ts.map +1 -0
- package/dist/cjs/akiform-builder.js +283 -0
- package/dist/cjs/field-builder.d.ts +35 -0
- package/dist/cjs/field-builder.d.ts.map +1 -0
- package/dist/cjs/field-builder.js +87 -0
- package/dist/cjs/i18n/index.d.ts +5 -0
- package/dist/cjs/i18n/index.d.ts.map +1 -0
- package/dist/cjs/i18n/index.js +14 -0
- package/dist/cjs/i18n/translations/en.d.ts +7 -0
- package/dist/cjs/i18n/translations/en.d.ts.map +1 -0
- package/dist/cjs/i18n/translations/en.js +8 -0
- package/dist/cjs/i18n/translations/tr.d.ts +7 -0
- package/dist/cjs/i18n/translations/tr.d.ts.map +1 -0
- package/dist/cjs/i18n/translations/tr.js +8 -0
- package/dist/cjs/index.d.ts +2 -4
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +4 -9
- package/dist/cjs/types.d.ts +62 -62
- package/dist/cjs/types.d.ts.map +1 -1
- package/dist/esm/akiform-builder.d.ts +6 -0
- package/dist/esm/akiform-builder.d.ts.map +1 -0
- package/dist/esm/akiform-builder.js +280 -0
- package/dist/esm/field-builder.d.ts +35 -0
- package/dist/esm/field-builder.d.ts.map +1 -0
- package/dist/esm/field-builder.js +84 -0
- package/dist/esm/i18n/index.d.ts +5 -0
- package/dist/esm/i18n/index.d.ts.map +1 -0
- package/dist/esm/i18n/index.js +11 -0
- package/dist/esm/i18n/translations/en.d.ts +7 -0
- package/dist/esm/i18n/translations/en.d.ts.map +1 -0
- package/dist/esm/i18n/translations/en.js +6 -0
- package/dist/esm/i18n/translations/tr.d.ts +7 -0
- package/dist/esm/i18n/translations/tr.d.ts.map +1 -0
- package/dist/esm/i18n/translations/tr.js +6 -0
- package/dist/esm/index.d.ts +2 -4
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +2 -4
- package/dist/esm/types.d.ts +62 -62
- package/dist/esm/types.d.ts.map +1 -1
- package/package.json +15 -17
- package/dist/cjs/FormBuilderWatch.d.ts +0 -16
- package/dist/cjs/FormBuilderWatch.d.ts.map +0 -1
- package/dist/cjs/FormBuilderWatch.js +0 -75
- package/dist/cjs/RenderField.d.ts +0 -5
- package/dist/cjs/RenderField.d.ts.map +0 -1
- package/dist/cjs/RenderField.js +0 -45
- package/dist/cjs/component.d.ts +0 -4
- package/dist/cjs/component.d.ts.map +0 -1
- package/dist/cjs/component.js +0 -46
- package/dist/cjs/hook.d.ts +0 -3
- package/dist/cjs/hook.d.ts.map +0 -1
- package/dist/cjs/hook.js +0 -38
- package/dist/cjs/transformers/index.d.ts +0 -4
- package/dist/cjs/transformers/index.d.ts.map +0 -1
- package/dist/cjs/transformers/index.js +0 -77
- package/dist/cjs/transformers/types.d.ts +0 -22
- package/dist/cjs/transformers/types.d.ts.map +0 -1
- package/dist/cjs/transformers/types.js +0 -18
- package/dist/esm/FormBuilderWatch.d.ts +0 -16
- package/dist/esm/FormBuilderWatch.d.ts.map +0 -1
- package/dist/esm/FormBuilderWatch.js +0 -71
- package/dist/esm/RenderField.d.ts +0 -5
- package/dist/esm/RenderField.d.ts.map +0 -1
- package/dist/esm/RenderField.js +0 -41
- package/dist/esm/component.d.ts +0 -4
- package/dist/esm/component.d.ts.map +0 -1
- package/dist/esm/component.js +0 -42
- package/dist/esm/hook.d.ts +0 -3
- package/dist/esm/hook.d.ts.map +0 -1
- package/dist/esm/hook.js +0 -34
- package/dist/esm/transformers/index.d.ts +0 -4
- package/dist/esm/transformers/index.d.ts.map +0 -1
- package/dist/esm/transformers/index.js +0 -73
- package/dist/esm/transformers/types.d.ts +0 -22
- package/dist/esm/transformers/types.d.ts.map +0 -1
- package/dist/esm/transformers/types.js +0 -15
package/dist/cjs/types.d.ts
CHANGED
|
@@ -1,82 +1,82 @@
|
|
|
1
|
-
|
|
2
|
-
import { AkiformProps, Control, FieldArrayWithId, UseFormReturn } from '@akinon/akiform';
|
|
1
|
+
import { AkiformProps, Control, FieldPath, FieldValues } from '@akinon/akiform';
|
|
3
2
|
import { AnySchema } from '@akinon/akival';
|
|
4
|
-
|
|
5
|
-
export
|
|
6
|
-
|
|
7
|
-
key:
|
|
3
|
+
import { FormEventHandler, ReactElement } from 'react';
|
|
4
|
+
export type FieldType = 'text' | 'number' | 'select' | 'checkbox' | 'date' | 'fieldArray' | 'textarea' | 'custom' | 'section';
|
|
5
|
+
export interface BaseField<TFieldValues extends FieldValues = FieldValues> {
|
|
6
|
+
key: FieldPath<TFieldValues>;
|
|
8
7
|
label: string;
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
type: FieldType;
|
|
9
|
+
placeholder?: string;
|
|
10
|
+
defaultValue?: unknown;
|
|
11
11
|
validation?: AnySchema;
|
|
12
|
+
config?: FieldConfig;
|
|
12
13
|
}
|
|
13
|
-
export interface
|
|
14
|
-
type: '
|
|
15
|
-
config: FieldArrayConfig;
|
|
16
|
-
}
|
|
17
|
-
interface FieldArrayConfig {
|
|
18
|
-
name: string;
|
|
19
|
-
keyName?: string;
|
|
20
|
-
fields: FormField[];
|
|
21
|
-
}
|
|
22
|
-
export interface InputField extends BaseField<string> {
|
|
23
|
-
type: 'input';
|
|
24
|
-
placeholder?: string;
|
|
25
|
-
props?: {
|
|
26
|
-
mode?: 'multiple';
|
|
27
|
-
};
|
|
14
|
+
export interface TextField<TFieldValues extends FieldValues = FieldValues> extends BaseField<TFieldValues> {
|
|
15
|
+
type: 'text';
|
|
28
16
|
}
|
|
29
|
-
export interface NumberField extends BaseField<
|
|
17
|
+
export interface NumberField<TFieldValues extends FieldValues = FieldValues> extends BaseField<TFieldValues> {
|
|
30
18
|
type: 'number';
|
|
31
|
-
placeholder?: string;
|
|
32
19
|
}
|
|
33
|
-
export interface SelectField extends
|
|
20
|
+
export interface SelectField<TFieldValues extends FieldValues = FieldValues> extends BaseField<TFieldValues> {
|
|
34
21
|
type: 'select';
|
|
35
22
|
options: Array<{
|
|
36
|
-
key: string;
|
|
37
23
|
value: string | number;
|
|
38
24
|
label: string;
|
|
39
25
|
}>;
|
|
40
|
-
placeholder?: string;
|
|
41
|
-
props?: {
|
|
42
|
-
mode?: 'multiple';
|
|
43
|
-
};
|
|
44
26
|
}
|
|
45
|
-
export interface CheckboxField extends BaseField<
|
|
27
|
+
export interface CheckboxField<TFieldValues extends FieldValues = FieldValues> extends BaseField<TFieldValues> {
|
|
46
28
|
type: 'checkbox';
|
|
47
|
-
|
|
48
|
-
|
|
29
|
+
}
|
|
30
|
+
export interface DateField<TFieldValues extends FieldValues = FieldValues> extends BaseField<TFieldValues> {
|
|
31
|
+
type: 'date';
|
|
32
|
+
}
|
|
33
|
+
export interface FieldArrayField<TFieldValues extends FieldValues = FieldValues> extends BaseField<TFieldValues> {
|
|
34
|
+
type: 'fieldArray';
|
|
35
|
+
fields: FormField<TFieldValues>[];
|
|
36
|
+
}
|
|
37
|
+
export interface TextareaField<TFieldValues extends FieldValues = FieldValues> extends BaseField<TFieldValues> {
|
|
38
|
+
type: 'textarea';
|
|
39
|
+
}
|
|
40
|
+
export interface CustomField<TFieldValues extends FieldValues = FieldValues> extends BaseField<TFieldValues> {
|
|
41
|
+
type: 'custom';
|
|
42
|
+
render: (props: {
|
|
43
|
+
field: BaseField<TFieldValues>;
|
|
44
|
+
formValues: TFieldValues;
|
|
45
|
+
control: Control<TFieldValues>;
|
|
46
|
+
formState: any;
|
|
47
|
+
}) => ReactElement;
|
|
48
|
+
}
|
|
49
|
+
export interface SectionField<TFieldValues extends FieldValues = FieldValues> extends BaseField<TFieldValues> {
|
|
50
|
+
type: 'section';
|
|
51
|
+
fields: FormField<TFieldValues>[];
|
|
52
|
+
defaultExpanded?: boolean;
|
|
53
|
+
}
|
|
54
|
+
export type FormField<TFieldValues extends FieldValues = FieldValues> = TextField<TFieldValues> | NumberField<TFieldValues> | SelectField<TFieldValues> | CheckboxField<TFieldValues> | DateField<TFieldValues> | FieldArrayField<TFieldValues> | TextareaField<TFieldValues> | CustomField<TFieldValues> | SectionField<TFieldValues>;
|
|
55
|
+
export type FormLayout = 'vertical' | 'horizontal' | 'inline';
|
|
56
|
+
export interface LayoutOptions {
|
|
57
|
+
labelCol?: {
|
|
58
|
+
span: number;
|
|
59
|
+
};
|
|
60
|
+
wrapperCol?: {
|
|
61
|
+
span: number;
|
|
49
62
|
};
|
|
50
63
|
}
|
|
51
|
-
export interface
|
|
52
|
-
|
|
53
|
-
|
|
64
|
+
export interface AkiformBuilderProps<TFieldValues extends FieldValues = FieldValues> extends Omit<AkiformProps, 'fields' | 'onReset' | 'onChange'> {
|
|
65
|
+
fields: FormField<TFieldValues>[];
|
|
66
|
+
onSubmit: (values: TFieldValues) => void;
|
|
67
|
+
layout?: FormLayout;
|
|
68
|
+
layoutOptions?: LayoutOptions;
|
|
69
|
+
showResetButton?: boolean;
|
|
70
|
+
onReset?: FormEventHandler<HTMLFormElement>;
|
|
71
|
+
controlled?: boolean;
|
|
72
|
+
values?: TFieldValues;
|
|
73
|
+
onValueChange?: (values: TFieldValues) => void;
|
|
54
74
|
}
|
|
55
|
-
export
|
|
56
|
-
|
|
57
|
-
builderFields: FormField[];
|
|
58
|
-
children?: React.ReactNode;
|
|
75
|
+
export interface AkiformBuilderRef<TFieldValues extends FieldValues = FieldValues> {
|
|
76
|
+
reset: (values?: Partial<TFieldValues>) => void;
|
|
59
77
|
}
|
|
60
|
-
export interface
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
watch: UseFormReturn['watch'];
|
|
64
|
-
reset: UseFormReturn['reset'];
|
|
65
|
-
control: Control;
|
|
66
|
-
formState: UseFormReturn['formState'];
|
|
67
|
-
getValues: UseFormReturn['getValues'];
|
|
68
|
-
setValue: UseFormReturn['setValue'];
|
|
69
|
-
trigger: UseFormReturn['trigger'];
|
|
70
|
-
fieldArrays: Array<{
|
|
71
|
-
name: string;
|
|
72
|
-
fields: FieldArrayWithId<any>[];
|
|
73
|
-
append: (value: any) => void;
|
|
74
|
-
remove: (index?: number | number[]) => void;
|
|
75
|
-
prepend: (value: any) => void;
|
|
76
|
-
insert: (index: number, value: any) => void;
|
|
77
|
-
swap: (indexA: number, indexB: number) => void;
|
|
78
|
-
move: (from: number, to: number) => void;
|
|
79
|
-
}>;
|
|
78
|
+
export interface FieldConfig<T = unknown> {
|
|
79
|
+
disabled?: boolean | ((values: T) => boolean);
|
|
80
|
+
visible?: boolean | ((values: T) => boolean);
|
|
80
81
|
}
|
|
81
|
-
export {};
|
|
82
82
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/cjs/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { FieldValues } from '@akinon/akiform';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { AkiformBuilderProps, AkiformBuilderRef } from './types';
|
|
4
|
+
export declare const THROTTLE_DELAY = 300;
|
|
5
|
+
export declare const AkiformBuilder: React.ForwardRefExoticComponent<AkiformBuilderProps<FieldValues> & React.RefAttributes<AkiformBuilderRef<FieldValues>>>;
|
|
6
|
+
//# sourceMappingURL=akiform-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"akiform-builder.d.ts","sourceRoot":"","sources":["../../src/akiform-builder.tsx"],"names":[],"mappings":"AAAA,OAAO,EAKL,WAAW,EAMZ,MAAM,iBAAiB,CAAC;AAUzB,OAAO,KAWN,MAAM,OAAO,CAAC;AAGf,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EAMlB,MAAM,SAAS,CAAC;AAEjB,eAAO,MAAM,cAAc,MAAM,CAAC;AAkIlC,eAAO,MAAM,cAAc,yHA8Q1B,CAAC"}
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
2
|
+
var t = {};
|
|
3
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
4
|
+
t[p] = s[p];
|
|
5
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
6
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
7
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
8
|
+
t[p[i]] = s[p[i]];
|
|
9
|
+
}
|
|
10
|
+
return t;
|
|
11
|
+
};
|
|
12
|
+
import { Akiform, akivalResolver, FormItem, useFieldArray, useForm, useWatch } from '@akinon/akiform';
|
|
13
|
+
import { akival } from '@akinon/akival';
|
|
14
|
+
import { Button } from '@akinon/ui-button';
|
|
15
|
+
import { Checkbox } from '@akinon/ui-checkbox';
|
|
16
|
+
import { Collapse } from '@akinon/ui-collapse';
|
|
17
|
+
import { DatePicker } from '@akinon/ui-date-picker';
|
|
18
|
+
import { Input, InputTextArea } from '@akinon/ui-input';
|
|
19
|
+
import { InputNumber } from '@akinon/ui-input-number';
|
|
20
|
+
import { Select } from '@akinon/ui-select';
|
|
21
|
+
import { Space } from '@akinon/ui-space';
|
|
22
|
+
import React, { forwardRef, Fragment, useCallback, useEffect, useImperativeHandle, useMemo, useRef } from 'react';
|
|
23
|
+
import { i18n } from './i18n';
|
|
24
|
+
export const THROTTLE_DELAY = 300; // ms
|
|
25
|
+
const SectionComponent = ({ field, control, formValues, formState, layout, layoutOptions }) => {
|
|
26
|
+
return (React.createElement(Collapse, { defaultActiveKey: field.defaultExpanded ? [field.key] : [], items: [
|
|
27
|
+
{
|
|
28
|
+
label: field.label,
|
|
29
|
+
key: field.key,
|
|
30
|
+
children: field.fields.map(nestedField => {
|
|
31
|
+
var _a, _b;
|
|
32
|
+
const isVisible = typeof ((_a = nestedField.config) === null || _a === void 0 ? void 0 : _a.visible) === 'function'
|
|
33
|
+
? nestedField.config.visible(formValues)
|
|
34
|
+
: ((_b = nestedField.config) === null || _b === void 0 ? void 0 : _b.visible) !== false;
|
|
35
|
+
if (!isVisible) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
return (React.createElement(FormItem, { key: nestedField.key, control: control, name: nestedField.key, label: nestedField.label }, renderField(nestedField, control, formValues, formState, layout, layoutOptions)));
|
|
39
|
+
})
|
|
40
|
+
}
|
|
41
|
+
] }));
|
|
42
|
+
};
|
|
43
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
44
|
+
const renderField = (field, control, formValues,
|
|
45
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
46
|
+
formState, layout, layoutOptions) => {
|
|
47
|
+
const commonProps = {
|
|
48
|
+
'aria-required': field.validation ? true : false,
|
|
49
|
+
'aria-invalid': formState.errors[field.key] ? true : false
|
|
50
|
+
};
|
|
51
|
+
switch (field.type) {
|
|
52
|
+
case 'text':
|
|
53
|
+
return React.createElement(Input, Object.assign({ placeholder: field.placeholder }, commonProps));
|
|
54
|
+
case 'number':
|
|
55
|
+
return React.createElement(InputNumber, Object.assign({ placeholder: field.placeholder }, commonProps));
|
|
56
|
+
case 'select':
|
|
57
|
+
return (React.createElement(Select, Object.assign({ placeholder: field.placeholder, options: field.options }, commonProps)));
|
|
58
|
+
case 'checkbox':
|
|
59
|
+
return (React.createElement(Checkbox, Object.assign({ checked: formValues[field.key] }, commonProps), field.label));
|
|
60
|
+
case 'date':
|
|
61
|
+
return React.createElement(DatePicker, Object.assign({ placeholder: field.placeholder }, commonProps));
|
|
62
|
+
case 'textarea':
|
|
63
|
+
return React.createElement(InputTextArea, Object.assign({ placeholder: field.placeholder }, commonProps));
|
|
64
|
+
case 'fieldArray':
|
|
65
|
+
return (React.createElement(FieldArrayComponent, { field: field, control: control, formValues: formValues, formState: formState, layout: layout, layoutOptions: layoutOptions }));
|
|
66
|
+
case 'custom':
|
|
67
|
+
if (typeof field.render === 'function') {
|
|
68
|
+
return field.render({ field, formValues, control, formState });
|
|
69
|
+
}
|
|
70
|
+
console.warn(`Custom field "${field.key}" has no render function`);
|
|
71
|
+
return React.createElement(Fragment, null);
|
|
72
|
+
case 'section':
|
|
73
|
+
return (React.createElement(SectionComponent, { field: field, control: control, formValues: formValues, formState: formState, layout: layout, layoutOptions: layoutOptions }));
|
|
74
|
+
default:
|
|
75
|
+
return React.createElement(Fragment, null);
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
export const AkiformBuilder = forwardRef((_a, ref) => {
|
|
79
|
+
var _b, _c;
|
|
80
|
+
var { fields, onSubmit, layout = 'vertical', layoutOptions, showResetButton = false, onReset, controlled = false, values, onValueChange } = _a, rest = __rest(_a, ["fields", "onSubmit", "layout", "layoutOptions", "showResetButton", "onReset", "controlled", "values", "onValueChange"]);
|
|
81
|
+
const validationSchema = useMemo(() => {
|
|
82
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
83
|
+
const schema = {};
|
|
84
|
+
fields.forEach(field => {
|
|
85
|
+
if (field.validation) {
|
|
86
|
+
schema[field.key] = field.validation;
|
|
87
|
+
}
|
|
88
|
+
if (field.type === 'fieldArray') {
|
|
89
|
+
schema[field.key] = akival.array().of(akival.object().shape(field.fields.reduce((acc, nestedField) => {
|
|
90
|
+
if (nestedField.validation) {
|
|
91
|
+
acc[nestedField.key] = nestedField.validation;
|
|
92
|
+
}
|
|
93
|
+
return acc;
|
|
94
|
+
},
|
|
95
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
96
|
+
{})));
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
return akival.object().shape(schema);
|
|
100
|
+
}, [fields]);
|
|
101
|
+
const { control, handleSubmit, reset, setValue, formState } = useForm(Object.assign({
|
|
102
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
103
|
+
resolver: akivalResolver(validationSchema),
|
|
104
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
105
|
+
defaultValues: rest.initialValues }, (controlled && { values: values })));
|
|
106
|
+
const formValues = useWatch({ control });
|
|
107
|
+
const prevFormValuesRef = useRef(null);
|
|
108
|
+
const isInitialRenderRef = useRef(true);
|
|
109
|
+
const throttleTimeoutRef = useRef(null);
|
|
110
|
+
const handleValueChange = useCallback((values) => {
|
|
111
|
+
if (!controlled) {
|
|
112
|
+
if (throttleTimeoutRef.current) {
|
|
113
|
+
clearTimeout(throttleTimeoutRef.current);
|
|
114
|
+
}
|
|
115
|
+
throttleTimeoutRef.current = setTimeout(() => {
|
|
116
|
+
onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange(values);
|
|
117
|
+
}, THROTTLE_DELAY);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange(values);
|
|
121
|
+
}
|
|
122
|
+
}, [controlled, onValueChange]);
|
|
123
|
+
useEffect(() => {
|
|
124
|
+
if (isInitialRenderRef.current) {
|
|
125
|
+
isInitialRenderRef.current = false;
|
|
126
|
+
prevFormValuesRef.current = Object.assign({}, formValues);
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
if (formState.isDirty ||
|
|
130
|
+
Object.keys(formState.touchedFields).length > 0) {
|
|
131
|
+
const hasChanged = JSON.stringify(formValues) !==
|
|
132
|
+
JSON.stringify(prevFormValuesRef.current);
|
|
133
|
+
if (hasChanged) {
|
|
134
|
+
handleValueChange(formValues);
|
|
135
|
+
prevFormValuesRef.current = Object.assign({}, formValues);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}, [
|
|
139
|
+
formValues,
|
|
140
|
+
formState.isDirty,
|
|
141
|
+
formState.touchedFields,
|
|
142
|
+
handleValueChange
|
|
143
|
+
]);
|
|
144
|
+
useEffect(() => {
|
|
145
|
+
return () => {
|
|
146
|
+
if (throttleTimeoutRef.current) {
|
|
147
|
+
clearTimeout(throttleTimeoutRef.current);
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
}, []);
|
|
151
|
+
useEffect(() => {
|
|
152
|
+
if (controlled && onValueChange) {
|
|
153
|
+
onValueChange(formValues);
|
|
154
|
+
}
|
|
155
|
+
}, [controlled, onValueChange, formValues]);
|
|
156
|
+
const formItemLayout = useMemo(() => {
|
|
157
|
+
const defaultHorizontalLayout = {
|
|
158
|
+
labelCol: { span: 6 },
|
|
159
|
+
wrapperCol: { span: 18 }
|
|
160
|
+
};
|
|
161
|
+
const defaultInlineLayout = {
|
|
162
|
+
wrapperCol: { span: 24 }
|
|
163
|
+
};
|
|
164
|
+
switch (layout) {
|
|
165
|
+
case 'horizontal':
|
|
166
|
+
return {
|
|
167
|
+
labelCol: (layoutOptions === null || layoutOptions === void 0 ? void 0 : layoutOptions.labelCol) || defaultHorizontalLayout.labelCol,
|
|
168
|
+
wrapperCol: (layoutOptions === null || layoutOptions === void 0 ? void 0 : layoutOptions.wrapperCol) || defaultHorizontalLayout.wrapperCol
|
|
169
|
+
};
|
|
170
|
+
case 'inline':
|
|
171
|
+
return {
|
|
172
|
+
wrapperCol: (layoutOptions === null || layoutOptions === void 0 ? void 0 : layoutOptions.wrapperCol) || defaultInlineLayout.wrapperCol
|
|
173
|
+
};
|
|
174
|
+
case 'vertical':
|
|
175
|
+
default:
|
|
176
|
+
return {};
|
|
177
|
+
}
|
|
178
|
+
}, [layout, layoutOptions]);
|
|
179
|
+
const handleReset = (event) => {
|
|
180
|
+
event.preventDefault();
|
|
181
|
+
reset();
|
|
182
|
+
if (onReset) {
|
|
183
|
+
// Create a synthetic FormEvent if the event is a MouseEvent
|
|
184
|
+
const formEvent = event.type === 'click'
|
|
185
|
+
? {
|
|
186
|
+
preventDefault: () => { },
|
|
187
|
+
target: event.target.closest('form')
|
|
188
|
+
}
|
|
189
|
+
: event;
|
|
190
|
+
onReset(formEvent);
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
useImperativeHandle(ref, () => ({
|
|
194
|
+
reset: (values) => {
|
|
195
|
+
if (values) {
|
|
196
|
+
// Partial reset: only reset specified fields
|
|
197
|
+
Object.keys(values).forEach(key => {
|
|
198
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
199
|
+
setValue(key, values[key]);
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
// Full reset
|
|
204
|
+
reset();
|
|
205
|
+
}
|
|
206
|
+
if (onReset) {
|
|
207
|
+
const syntheticEvent = {
|
|
208
|
+
preventDefault: () => { },
|
|
209
|
+
target: { reset: () => { } }
|
|
210
|
+
};
|
|
211
|
+
onReset(syntheticEvent);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}));
|
|
215
|
+
return (React.createElement(Akiform, Object.assign({ onFinish: handleSubmit(onSubmit), onReset: handleReset, layout: layout }, formItemLayout, rest, { "data-testid": "akiform-builder", role: "form", "aria-label": i18n.t('formLabel') }),
|
|
216
|
+
fields.map(field => {
|
|
217
|
+
var _a, _b, _c, _d;
|
|
218
|
+
const isDisabled = typeof ((_a = field.config) === null || _a === void 0 ? void 0 : _a.disabled) === 'function'
|
|
219
|
+
? field.config.disabled(formValues)
|
|
220
|
+
: (_b = field.config) === null || _b === void 0 ? void 0 : _b.disabled;
|
|
221
|
+
const isVisible = typeof ((_c = field.config) === null || _c === void 0 ? void 0 : _c.visible) === 'function'
|
|
222
|
+
? field.config.visible(formValues)
|
|
223
|
+
: ((_d = field.config) === null || _d === void 0 ? void 0 : _d.visible) !== false;
|
|
224
|
+
if (!isVisible) {
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
if (field.type === 'section') {
|
|
228
|
+
return (React.createElement(SectionComponent, { key: field.key, field: field, control: control, formValues: formValues, formState: formState, layout: layout, layoutOptions: layoutOptions }));
|
|
229
|
+
}
|
|
230
|
+
return (React.createElement(FormItem, { key: field.key, control: control, name: field.key, label: field.label, disabled: isDisabled }, renderField(field, control, formValues, formState, layout, layoutOptions)));
|
|
231
|
+
}),
|
|
232
|
+
React.createElement(FormItem, { control: control, name: 'form_actions', wrapperCol: layout === 'horizontal'
|
|
233
|
+
? {
|
|
234
|
+
offset: (_b = formItemLayout.labelCol) === null || _b === void 0 ? void 0 : _b.span,
|
|
235
|
+
span: (_c = formItemLayout.wrapperCol) === null || _c === void 0 ? void 0 : _c.span
|
|
236
|
+
}
|
|
237
|
+
: undefined },
|
|
238
|
+
React.createElement(Space, null,
|
|
239
|
+
React.createElement(Button, { type: "primary", htmlType: "submit" }, i18n.t('submit')),
|
|
240
|
+
showResetButton && (
|
|
241
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
242
|
+
React.createElement(Button, { onClick: handleReset, htmlType: "reset" }, i18n.t('reset')))))));
|
|
243
|
+
});
|
|
244
|
+
AkiformBuilder.displayName = 'AkiformBuilder';
|
|
245
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
246
|
+
const FieldArrayComponent = ({ field, control, formValues, formState, layout, layoutOptions }) => {
|
|
247
|
+
const { fields, append, remove } = useFieldArray({
|
|
248
|
+
control,
|
|
249
|
+
name: field.key
|
|
250
|
+
});
|
|
251
|
+
const createInitialValue = () => {
|
|
252
|
+
return field.fields.reduce((acc, nestedField) => {
|
|
253
|
+
acc[nestedField.key] = nestedField.defaultValue || '';
|
|
254
|
+
return acc;
|
|
255
|
+
},
|
|
256
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
257
|
+
{});
|
|
258
|
+
};
|
|
259
|
+
return (React.createElement("div", { role: "group", "aria-labelledby": `${field.key}-label` },
|
|
260
|
+
React.createElement("div", { id: `${field.key}-label`, className: "sr-only" }, field.label),
|
|
261
|
+
fields.map((item, index) => (React.createElement("div", { key: item.id },
|
|
262
|
+
field.fields.map(nestedField => {
|
|
263
|
+
var _a, _b;
|
|
264
|
+
const isVisible = typeof ((_a = nestedField.config) === null || _a === void 0 ? void 0 : _a.visible) === 'function'
|
|
265
|
+
? nestedField.config.visible(((_b = formValues[field.key]) === null || _b === void 0 ? void 0 : _b[index]) || {})
|
|
266
|
+
: true;
|
|
267
|
+
if (!isVisible) {
|
|
268
|
+
return null;
|
|
269
|
+
}
|
|
270
|
+
return (React.createElement(FormItem, { key: `${field.key}.${index}.${nestedField.key}`, control: control, name: `${field.key}.${index}.${nestedField.key}`, label: nestedField.label }, renderField(Object.assign(Object.assign({}, nestedField), {
|
|
271
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
272
|
+
key: `${field.key}.${index}.${nestedField.key}` }), control, formValues, formState, layout, layoutOptions)));
|
|
273
|
+
}),
|
|
274
|
+
React.createElement(Button, { onClick: () => remove(index), "aria-label": `Remove ${field.label} ${index + 1}` }, "Remove")))),
|
|
275
|
+
React.createElement(Button
|
|
276
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
277
|
+
, {
|
|
278
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
279
|
+
onClick: () => append(createInitialValue()), "aria-label": `Add ${field.label}` }, "Add")));
|
|
280
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { FieldPath, FieldValues } from '@akinon/akiform';
|
|
2
|
+
import { AnySchema } from '@akinon/akival';
|
|
3
|
+
import { FieldConfig, FieldType, FormField } from './types';
|
|
4
|
+
type FieldTypeToBuilder<T extends FieldType, TFieldValues extends FieldValues = FieldValues> = T extends 'select' ? SelectFieldBuilder<TFieldValues> : T extends 'custom' ? CustomFieldBuilder<TFieldValues> : T extends 'section' ? SectionFieldBuilder<TFieldValues> : BaseFieldBuilder<TFieldValues>;
|
|
5
|
+
declare class BaseFieldBuilder<TFieldValues extends FieldValues = FieldValues> {
|
|
6
|
+
protected field: Partial<FormField<TFieldValues>>;
|
|
7
|
+
key(key: FieldPath<TFieldValues>): this;
|
|
8
|
+
label(label: string): this;
|
|
9
|
+
type<T extends FieldType>(type: T): FieldTypeToBuilder<T, TFieldValues>;
|
|
10
|
+
placeholder(placeholder: string): this;
|
|
11
|
+
defaultValue(value: any): this;
|
|
12
|
+
validation(schema: AnySchema): this;
|
|
13
|
+
config(config: FieldConfig<TFieldValues>): this;
|
|
14
|
+
build(): FormField<TFieldValues>;
|
|
15
|
+
}
|
|
16
|
+
declare class SelectFieldBuilder<TFieldValues extends FieldValues = FieldValues> extends BaseFieldBuilder<TFieldValues> {
|
|
17
|
+
options(options: Array<{
|
|
18
|
+
value: string | number;
|
|
19
|
+
label: string;
|
|
20
|
+
}>): this;
|
|
21
|
+
}
|
|
22
|
+
declare class CustomFieldBuilder<TFieldValues extends FieldValues = FieldValues> extends BaseFieldBuilder<TFieldValues> {
|
|
23
|
+
render(renderFn: (props: {
|
|
24
|
+
field: FormField<TFieldValues>;
|
|
25
|
+
formValues: TFieldValues;
|
|
26
|
+
control: any;
|
|
27
|
+
}) => React.ReactElement): this;
|
|
28
|
+
}
|
|
29
|
+
declare class SectionFieldBuilder<TFieldValues extends FieldValues = FieldValues> extends BaseFieldBuilder<TFieldValues> {
|
|
30
|
+
fields(fields: FormField<TFieldValues>[]): this;
|
|
31
|
+
defaultExpanded(expanded: boolean): this;
|
|
32
|
+
}
|
|
33
|
+
export declare function field<TFieldValues extends FieldValues = FieldValues>(): BaseFieldBuilder<TFieldValues> & SelectFieldBuilder<TFieldValues> & CustomFieldBuilder<TFieldValues> & SectionFieldBuilder<TFieldValues>;
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=field-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-builder.d.ts","sourceRoot":"","sources":["../../src/field-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAE5D,KAAK,kBAAkB,CACrB,CAAC,SAAS,SAAS,EACnB,YAAY,SAAS,WAAW,GAAG,WAAW,IAC5C,CAAC,SAAS,QAAQ,GAClB,kBAAkB,CAAC,YAAY,CAAC,GAChC,CAAC,SAAS,QAAQ,GAChB,kBAAkB,CAAC,YAAY,CAAC,GAChC,CAAC,SAAS,SAAS,GACjB,mBAAmB,CAAC,YAAY,CAAC,GACjC,gBAAgB,CAAC,YAAY,CAAC,CAAC;AAEvC,cAAM,gBAAgB,CAAC,YAAY,SAAS,WAAW,GAAG,WAAW;IACnE,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAM;IAEvD,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,YAAY,CAAC,GAAG,IAAI;IAKvC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK1B,IAAI,CAAC,CAAC,SAAS,SAAS,EAAE,IAAI,EAAE,CAAC,GAAG,kBAAkB,CAAC,CAAC,EAAE,YAAY,CAAC;IAKvE,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAMtC,YAAY,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI;IAK9B,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI;IAKnC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,YAAY,CAAC,GAAG,IAAI;IAM/C,KAAK,IAAI,SAAS,CAAC,YAAY,CAAC;CAMjC;AAED,cAAM,kBAAkB,CACtB,YAAY,SAAS,WAAW,GAAG,WAAW,CAC9C,SAAQ,gBAAgB,CAAC,YAAY,CAAC;IACtC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;CAKzE;AAED,cAAM,kBAAkB,CACtB,YAAY,SAAS,WAAW,GAAG,WAAW,CAC9C,SAAQ,gBAAgB,CAAC,YAAY,CAAC;IACtC,MAAM,CACJ,QAAQ,EAAE,CAAC,KAAK,EAAE;QAChB,KAAK,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC;QAC/B,UAAU,EAAE,YAAY,CAAC;QAEzB,OAAO,EAAE,GAAG,CAAC;KACd,KAAK,KAAK,CAAC,YAAY,GACvB,IAAI;CAKR;AAED,cAAM,mBAAmB,CACvB,YAAY,SAAS,WAAW,GAAG,WAAW,CAC9C,SAAQ,gBAAgB,CAAC,YAAY,CAAC;IACtC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,YAAY,CAAC,EAAE,GAAG,IAAI;IAM/C,eAAe,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI;CAKzC;AAED,wBAAgB,KAAK,CACnB,YAAY,SAAS,WAAW,GAAG,WAAW,KAC3C,gBAAgB,CAAC,YAAY,CAAC,GACjC,kBAAkB,CAAC,YAAY,CAAC,GAChC,kBAAkB,CAAC,YAAY,CAAC,GAChC,mBAAmB,CAAC,YAAY,CAAC,CAmBlC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
class BaseFieldBuilder {
|
|
2
|
+
constructor() {
|
|
3
|
+
this.field = {};
|
|
4
|
+
}
|
|
5
|
+
key(key) {
|
|
6
|
+
this.field.key = key;
|
|
7
|
+
return this;
|
|
8
|
+
}
|
|
9
|
+
label(label) {
|
|
10
|
+
this.field.label = label;
|
|
11
|
+
return this;
|
|
12
|
+
}
|
|
13
|
+
type(type) {
|
|
14
|
+
this.field.type = type;
|
|
15
|
+
return this;
|
|
16
|
+
}
|
|
17
|
+
placeholder(placeholder) {
|
|
18
|
+
this.field.placeholder = placeholder;
|
|
19
|
+
return this;
|
|
20
|
+
}
|
|
21
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
22
|
+
defaultValue(value) {
|
|
23
|
+
this.field.defaultValue = value;
|
|
24
|
+
return this;
|
|
25
|
+
}
|
|
26
|
+
validation(schema) {
|
|
27
|
+
this.field.validation = schema;
|
|
28
|
+
return this;
|
|
29
|
+
}
|
|
30
|
+
config(config) {
|
|
31
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
32
|
+
this.field.config = config;
|
|
33
|
+
return this;
|
|
34
|
+
}
|
|
35
|
+
build() {
|
|
36
|
+
if (!this.field.key || !this.field.label || !this.field.type) {
|
|
37
|
+
throw new Error('Field must have at least a key, label, and type');
|
|
38
|
+
}
|
|
39
|
+
return this.field;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
class SelectFieldBuilder extends BaseFieldBuilder {
|
|
43
|
+
options(options) {
|
|
44
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
45
|
+
this.field.options = options;
|
|
46
|
+
return this;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
class CustomFieldBuilder extends BaseFieldBuilder {
|
|
50
|
+
render(renderFn) {
|
|
51
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
52
|
+
this.field.render = renderFn;
|
|
53
|
+
return this;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
class SectionFieldBuilder extends BaseFieldBuilder {
|
|
57
|
+
fields(fields) {
|
|
58
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
59
|
+
this.field.fields = fields;
|
|
60
|
+
return this;
|
|
61
|
+
}
|
|
62
|
+
defaultExpanded(expanded) {
|
|
63
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
64
|
+
this.field.defaultExpanded = expanded;
|
|
65
|
+
return this;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export function field() {
|
|
69
|
+
return new Proxy(new BaseFieldBuilder(), {
|
|
70
|
+
get(target, prop) {
|
|
71
|
+
if (prop === 'options') {
|
|
72
|
+
return SelectFieldBuilder.prototype.options;
|
|
73
|
+
}
|
|
74
|
+
if (prop === 'render') {
|
|
75
|
+
return CustomFieldBuilder.prototype.render;
|
|
76
|
+
}
|
|
77
|
+
if (prop === 'fields' || prop === 'defaultExpanded') {
|
|
78
|
+
return SectionFieldBuilder.prototype[prop];
|
|
79
|
+
}
|
|
80
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
81
|
+
return target[prop];
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/i18n/index.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,IAAI;4BAQszB,CAAC;;CADt0B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../../../src/i18n/translations/en.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,YAAY;;;;CAIR,CAAC;AAEX,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tr.d.ts","sourceRoot":"","sources":["../../../../src/i18n/translations/tr.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,YAAY;;;;CAIR,CAAC;AAEX,eAAe,YAAY,CAAC"}
|