@aatulwork/customform-renderer 1.8.0 → 1.10.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/fields-BM8DDh8m.d.mts +186 -0
- package/dist/fields-BM8DDh8m.d.ts +186 -0
- package/dist/fields.d.mts +3 -0
- package/dist/fields.d.ts +3 -0
- package/dist/fields.js +1230 -0
- package/dist/fields.js.map +1 -0
- package/dist/fields.mjs +1210 -0
- package/dist/fields.mjs.map +1 -0
- package/dist/index.d.mts +10 -186
- package/dist/index.d.ts +10 -186
- package/dist/index.js +84 -28
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +85 -30
- package/dist/index.mjs.map +1 -1
- package/package.json +6 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,159 +1,14 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
* Core types for Custom Form Renderer
|
|
6
|
-
*/
|
|
7
|
-
interface OptionItem {
|
|
8
|
-
label: string;
|
|
9
|
-
value: string | number;
|
|
10
|
-
icon?: string;
|
|
11
|
-
group?: string;
|
|
12
|
-
}
|
|
13
|
-
type FieldType = 'text' | 'email' | 'number' | 'select' | 'checkbox' | 'radio' | 'datepicker' | 'file' | 'ckeditor' | 'toggle' | 'color' | 'formReference' | 'apiReference';
|
|
14
|
-
interface FieldValidation {
|
|
15
|
-
min?: number;
|
|
16
|
-
max?: number;
|
|
17
|
-
pattern?: string;
|
|
18
|
-
maxFileSize?: number;
|
|
19
|
-
allowedFileTypes?: string[];
|
|
20
|
-
}
|
|
21
|
-
interface FormField {
|
|
22
|
-
type: FieldType;
|
|
23
|
-
label: string;
|
|
24
|
-
name: string;
|
|
25
|
-
required?: boolean;
|
|
26
|
-
placeholder?: string;
|
|
27
|
-
allowFilter?: boolean;
|
|
28
|
-
options?: OptionItem[] | string[];
|
|
29
|
-
validation?: FieldValidation;
|
|
30
|
-
referenceFormName?: string;
|
|
31
|
-
referenceFieldName?: string;
|
|
32
|
-
apiEndpoint?: string;
|
|
33
|
-
referenceModel?: string;
|
|
34
|
-
apiLabelField?: string;
|
|
35
|
-
apiValueField?: string;
|
|
36
|
-
allowMultiple?: boolean;
|
|
37
|
-
datePickerMode?: 'date' | 'datetime' | 'time';
|
|
38
|
-
/** @deprecated Use datePickerMode instead */
|
|
39
|
-
displayTime?: boolean;
|
|
40
|
-
}
|
|
41
|
-
interface FormSection {
|
|
42
|
-
id: string;
|
|
43
|
-
title: string;
|
|
44
|
-
description?: string;
|
|
45
|
-
fields: FormField[];
|
|
46
|
-
}
|
|
47
|
-
interface FormSchema {
|
|
48
|
-
_id?: string;
|
|
49
|
-
id?: string;
|
|
50
|
-
title: string;
|
|
51
|
-
name: string;
|
|
52
|
-
module?: string | null;
|
|
53
|
-
formType?: 'system' | 'custom';
|
|
54
|
-
collectionName?: string;
|
|
55
|
-
sections?: FormSection[];
|
|
56
|
-
fields?: FormField[];
|
|
57
|
-
settings?: {
|
|
58
|
-
sectionDisplayMode?: 'panel' | 'stepper';
|
|
59
|
-
fieldsPerRow?: number;
|
|
60
|
-
[key: string]: any;
|
|
61
|
-
};
|
|
62
|
-
createdAt?: string;
|
|
63
|
-
updatedAt?: string;
|
|
64
|
-
}
|
|
65
|
-
interface FormRendererProps {
|
|
66
|
-
formSchema: FormSchema;
|
|
67
|
-
onSubmit?: (data: Record<string, any>) => void | Promise<void>;
|
|
68
|
-
onCancel?: () => void;
|
|
69
|
-
isLoading?: boolean;
|
|
70
|
-
onSuccess?: () => void;
|
|
71
|
-
initialValues?: Record<string, any>;
|
|
72
|
-
hideTitle?: boolean;
|
|
73
|
-
allowResetOnValuesChange?: boolean;
|
|
74
|
-
mode?: 'edit' | 'view';
|
|
75
|
-
services?: FormServices;
|
|
76
|
-
colors?: FormColors;
|
|
77
|
-
}
|
|
78
|
-
interface FormServices {
|
|
79
|
-
fileUpload?: FileUploadService;
|
|
80
|
-
formReference?: FormReferenceService;
|
|
81
|
-
apiReference?: ApiReferenceService;
|
|
82
|
-
dateFormatter?: DateFormatterService;
|
|
83
|
-
SelectComponent?: React.ComponentType<any>;
|
|
84
|
-
FileDisplayComponent?: React.ComponentType<{
|
|
85
|
-
fieldValue: any;
|
|
86
|
-
}>;
|
|
87
|
-
CKEditorDisplayComponent?: React.ComponentType<{
|
|
88
|
-
content: string;
|
|
89
|
-
maxLength?: number;
|
|
90
|
-
showViewButton?: boolean;
|
|
91
|
-
}>;
|
|
92
|
-
fileBaseUrl?: string;
|
|
93
|
-
ckEditorLicenseKey?: string;
|
|
94
|
-
ckEditorScriptPath?: string;
|
|
95
|
-
}
|
|
96
|
-
interface FileUploadService {
|
|
97
|
-
uploadFiles: (formName: string, fieldName: string, files: File[]) => Promise<UploadedFile[]>;
|
|
98
|
-
}
|
|
99
|
-
interface UploadedFile {
|
|
100
|
-
_id?: string;
|
|
101
|
-
fileName: string;
|
|
102
|
-
originalName?: string;
|
|
103
|
-
fileUrl: string;
|
|
104
|
-
size?: number;
|
|
105
|
-
mimeType?: string;
|
|
106
|
-
[key: string]: any;
|
|
107
|
-
}
|
|
108
|
-
interface FormReferenceService {
|
|
109
|
-
fetchOptions: (formName: string, fieldName: string) => Promise<OptionItem[]>;
|
|
110
|
-
}
|
|
111
|
-
interface ApiReferenceService {
|
|
112
|
-
fetchOptions: (endpoint: string, labelField: string, valueField?: string) => Promise<OptionItem[]>;
|
|
113
|
-
}
|
|
114
|
-
interface DateFormatterService {
|
|
115
|
-
format: (value: any, options?: {
|
|
116
|
-
datePickerMode?: 'date' | 'datetime' | 'time';
|
|
117
|
-
}) => string;
|
|
118
|
-
}
|
|
119
|
-
interface FormColors {
|
|
120
|
-
primary?: string;
|
|
121
|
-
secondary?: string;
|
|
122
|
-
error?: string;
|
|
123
|
-
success?: string;
|
|
124
|
-
warning?: string;
|
|
125
|
-
info?: string;
|
|
126
|
-
textPrimary?: string;
|
|
127
|
-
textSecondary?: string;
|
|
128
|
-
divider?: string;
|
|
129
|
-
background?: string;
|
|
130
|
-
backgroundPaper?: string;
|
|
131
|
-
}
|
|
132
|
-
interface FieldRendererProps {
|
|
133
|
-
field: FormField;
|
|
134
|
-
control: any;
|
|
135
|
-
defaultValue: any;
|
|
136
|
-
rules: any;
|
|
137
|
-
errors: any;
|
|
138
|
-
setValue: any;
|
|
139
|
-
formSchema?: FormSchema;
|
|
140
|
-
uploadingFiles?: Record<string, boolean>;
|
|
141
|
-
setUploadingFiles?: React.Dispatch<React.SetStateAction<Record<string, boolean>>>;
|
|
142
|
-
setError?: (name: string, error: {
|
|
143
|
-
type: string;
|
|
144
|
-
message: string;
|
|
145
|
-
}) => void;
|
|
146
|
-
clearErrors?: (name?: string) => void;
|
|
147
|
-
services?: FormServices;
|
|
148
|
-
colors?: FormColors;
|
|
149
|
-
}
|
|
2
|
+
import { F as FormRendererProps, a as FieldRendererProps, b as FormSchema, c as FormServices, d as FormColors, e as FormField, A as ApiReferenceService, D as DateFormatterService, f as FileUploadService, g as FormReferenceService } from './fields-BM8DDh8m.js';
|
|
3
|
+
export { h as ApiReferenceField, C as CKEditorField, i as CheckboxField, j as ColorField, k as DateTimePickerField, l as FieldType, m as FieldValidation, n as FileField, o as FormReferenceField, p as FormSection, O as OptionItem, R as RadioField, S as SelectField, T as TextField, q as ToggleField, U as UploadedFile } from './fields-BM8DDh8m.js';
|
|
4
|
+
import React from 'react';
|
|
150
5
|
|
|
151
6
|
declare const FormRenderer: ({ formSchema, onSubmit, onCancel, isLoading, onSuccess, initialValues, hideTitle, allowResetOnValuesChange, mode, services, colors, }: FormRendererProps) => react_jsx_runtime.JSX.Element;
|
|
152
7
|
|
|
153
8
|
interface FieldRendererComponentProps extends Omit<FieldRendererProps, 'defaultValue' | 'rules'> {
|
|
154
9
|
formSchema: any;
|
|
155
10
|
uploadingFiles: Record<string, boolean>;
|
|
156
|
-
setUploadingFiles: React
|
|
11
|
+
setUploadingFiles: React.Dispatch<React.SetStateAction<Record<string, boolean>>>;
|
|
157
12
|
setError: (name: string, error: {
|
|
158
13
|
type: string;
|
|
159
14
|
message: string;
|
|
@@ -178,41 +33,6 @@ interface FieldViewProps {
|
|
|
178
33
|
}
|
|
179
34
|
declare const FieldView: ({ field, value, services }: FieldViewProps) => react_jsx_runtime.JSX.Element;
|
|
180
35
|
|
|
181
|
-
declare const TextField: ({ field, control, defaultValue, rules, errors }: FieldRendererProps) => react_jsx_runtime.JSX.Element;
|
|
182
|
-
|
|
183
|
-
declare const SelectField: ({ field, control, defaultValue, rules, errors, services }: FieldRendererProps) => react_jsx_runtime.JSX.Element;
|
|
184
|
-
|
|
185
|
-
declare const CheckboxField: ({ field, control, defaultValue, rules }: FieldRendererProps) => react_jsx_runtime.JSX.Element;
|
|
186
|
-
|
|
187
|
-
declare const RadioField: ({ field, control, defaultValue, rules, errors }: FieldRendererProps) => react_jsx_runtime.JSX.Element;
|
|
188
|
-
|
|
189
|
-
declare const ToggleField: ({ field, control, defaultValue, rules, errors }: FieldRendererProps) => react_jsx_runtime.JSX.Element;
|
|
190
|
-
|
|
191
|
-
declare const ColorField: ({ field, control, defaultValue, rules, errors }: FieldRendererProps) => react_jsx_runtime.JSX.Element;
|
|
192
|
-
|
|
193
|
-
declare const DateTimePickerField: ({ field, control, defaultValue, rules, errors }: FieldRendererProps) => react_jsx_runtime.JSX.Element;
|
|
194
|
-
|
|
195
|
-
declare global {
|
|
196
|
-
interface Window {
|
|
197
|
-
ClassicEditor: any;
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
declare const CKEditorField: ({ field, control, defaultValue, rules, errors, setValue, formSchema, services, colors }: FieldRendererProps) => react_jsx_runtime.JSX.Element;
|
|
201
|
-
|
|
202
|
-
interface FileFieldProps extends FieldRendererProps {
|
|
203
|
-
uploadingFiles?: Record<string, boolean>;
|
|
204
|
-
setUploadingFiles?: React$1.Dispatch<React$1.SetStateAction<Record<string, boolean>>>;
|
|
205
|
-
setError?: (name: string, error: {
|
|
206
|
-
type: string;
|
|
207
|
-
message: string;
|
|
208
|
-
}) => void;
|
|
209
|
-
clearErrors?: (name?: string) => void;
|
|
210
|
-
}
|
|
211
|
-
declare const FileField: ({ field, control, defaultValue, rules, errors, formSchema, uploadingFiles, setUploadingFiles, setError, clearErrors, services, colors, }: FileFieldProps) => react_jsx_runtime.JSX.Element;
|
|
212
|
-
|
|
213
|
-
declare const FormReferenceField: ({ field, control, defaultValue, rules, errors, services }: FieldRendererProps) => react_jsx_runtime.JSX.Element;
|
|
214
|
-
declare const ApiReferenceField: ({ field, control, defaultValue, rules, errors, services }: FieldRendererProps) => react_jsx_runtime.JSX.Element;
|
|
215
|
-
|
|
216
36
|
interface SimpleSelectOption {
|
|
217
37
|
value: string | number;
|
|
218
38
|
label: string;
|
|
@@ -231,8 +51,12 @@ interface SimpleSelectProps {
|
|
|
231
51
|
disabled?: boolean;
|
|
232
52
|
multiple?: boolean;
|
|
233
53
|
isLoading?: boolean;
|
|
54
|
+
filterable?: boolean;
|
|
55
|
+
filterPlaceholder?: string;
|
|
56
|
+
refreshable?: boolean;
|
|
57
|
+
onRefresh?: () => void;
|
|
234
58
|
}
|
|
235
|
-
declare const SimpleSelect: React
|
|
59
|
+
declare const SimpleSelect: React.FC<SimpleSelectProps>;
|
|
236
60
|
|
|
237
61
|
/**
|
|
238
62
|
* Get all fields from form schema (sections or legacy fields)
|
|
@@ -365,4 +189,4 @@ declare const defaultApiReferenceService: ApiReferenceService;
|
|
|
365
189
|
*/
|
|
366
190
|
declare const defaultDateFormatterService: DateFormatterService;
|
|
367
191
|
|
|
368
|
-
export {
|
|
192
|
+
export { ApiReferenceService, DateFormatterService, FieldRenderer, FieldRendererProps, FieldView, FileUploadService, FormColors, FormField, FormReferenceService, FormRenderer, FormRendererProps, FormSchema, FormServices, FormViewMode, SimpleSelect, type SimpleSelectOption, type SimpleSelectProps, buildFieldRules, defaultApiReferenceService, defaultDateFormatterService, defaultFileUploadService, defaultFormReferenceService, formatFileSize, getAllFields, getDefaultValue, isCKEditorAvailable, loadCKEditor, normalizeInitialValues, normalizeOptions, transformFormValues, useCKEditor, validateFile, waitForCKEditor };
|
package/dist/index.js
CHANGED
|
@@ -8,6 +8,7 @@ var DoubleArrowOutlinedIcon = require('@mui/icons-material/DoubleArrowOutlined')
|
|
|
8
8
|
var ArrowForwardIcon = require('@mui/icons-material/ArrowForward');
|
|
9
9
|
var ArrowBackIcon = require('@mui/icons-material/ArrowBack');
|
|
10
10
|
var jsxRuntime = require('react/jsx-runtime');
|
|
11
|
+
var RefreshIcon = require('@mui/icons-material/Refresh');
|
|
11
12
|
var ckeditor5React = require('@ckeditor/ckeditor5-react');
|
|
12
13
|
var dayjs2 = require('dayjs');
|
|
13
14
|
var CloseIcon = require('@mui/icons-material/Close');
|
|
@@ -25,6 +26,7 @@ var ExpandMoreIcon__default = /*#__PURE__*/_interopDefault(ExpandMoreIcon);
|
|
|
25
26
|
var DoubleArrowOutlinedIcon__default = /*#__PURE__*/_interopDefault(DoubleArrowOutlinedIcon);
|
|
26
27
|
var ArrowForwardIcon__default = /*#__PURE__*/_interopDefault(ArrowForwardIcon);
|
|
27
28
|
var ArrowBackIcon__default = /*#__PURE__*/_interopDefault(ArrowBackIcon);
|
|
29
|
+
var RefreshIcon__default = /*#__PURE__*/_interopDefault(RefreshIcon);
|
|
28
30
|
var dayjs2__default = /*#__PURE__*/_interopDefault(dayjs2);
|
|
29
31
|
var CloseIcon__default = /*#__PURE__*/_interopDefault(CloseIcon);
|
|
30
32
|
var CloudUploadIcon__default = /*#__PURE__*/_interopDefault(CloudUploadIcon);
|
|
@@ -284,23 +286,57 @@ var SimpleSelect = ({
|
|
|
284
286
|
error = false,
|
|
285
287
|
disabled = false,
|
|
286
288
|
multiple = false,
|
|
287
|
-
isLoading = false
|
|
289
|
+
isLoading = false,
|
|
290
|
+
filterable = true,
|
|
291
|
+
filterPlaceholder = "Filter...",
|
|
292
|
+
refreshable = false,
|
|
293
|
+
onRefresh
|
|
288
294
|
}) => {
|
|
295
|
+
const [filterText, setFilterText] = react.useState("");
|
|
289
296
|
const handleChange = (event) => {
|
|
290
297
|
const val = event.target.value;
|
|
298
|
+
if (val === "__refresh__") {
|
|
299
|
+
onRefresh?.();
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
291
302
|
onChange(val);
|
|
292
303
|
};
|
|
304
|
+
const filteredOptions = filterable && filterText ? options.filter(
|
|
305
|
+
(opt) => String(opt.label).toLowerCase().includes(filterText.toLowerCase())
|
|
306
|
+
) : options;
|
|
307
|
+
const handleFilterChange = (e) => {
|
|
308
|
+
setFilterText(e.target.value);
|
|
309
|
+
};
|
|
310
|
+
const handleClose = () => {
|
|
311
|
+
setFilterText("");
|
|
312
|
+
};
|
|
293
313
|
return /* @__PURE__ */ jsxRuntime.jsxs(material.FormControl, { fullWidth, size, required, error, disabled, children: [
|
|
294
314
|
/* @__PURE__ */ jsxRuntime.jsx(material.InputLabel, { children: label }),
|
|
295
|
-
/* @__PURE__ */ jsxRuntime.
|
|
315
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
296
316
|
material.Select,
|
|
297
317
|
{
|
|
298
318
|
value: value ?? (multiple ? [] : ""),
|
|
299
319
|
onChange: handleChange,
|
|
320
|
+
onClose: handleClose,
|
|
300
321
|
input: /* @__PURE__ */ jsxRuntime.jsx(material.OutlinedInput, { label }),
|
|
322
|
+
MenuProps: {
|
|
323
|
+
autoFocus: false
|
|
324
|
+
},
|
|
301
325
|
multiple,
|
|
302
326
|
disabled: disabled || isLoading,
|
|
303
|
-
endAdornment: isLoading ? /* @__PURE__ */ jsxRuntime.jsx(material.CircularProgress, { size: 20 }) :
|
|
327
|
+
endAdornment: isLoading ? /* @__PURE__ */ jsxRuntime.jsx(material.CircularProgress, { size: 20 }) : refreshable && onRefresh ? /* @__PURE__ */ jsxRuntime.jsx(material.InputAdornment, { position: "end", sx: { mr: 2 }, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
328
|
+
material.IconButton,
|
|
329
|
+
{
|
|
330
|
+
size: "small",
|
|
331
|
+
onClick: (e) => {
|
|
332
|
+
e.stopPropagation();
|
|
333
|
+
onRefresh();
|
|
334
|
+
},
|
|
335
|
+
disabled,
|
|
336
|
+
"aria-label": "Refresh options",
|
|
337
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(RefreshIcon__default.default, { fontSize: "small" })
|
|
338
|
+
}
|
|
339
|
+
) }) : void 0,
|
|
304
340
|
renderValue: (selected) => {
|
|
305
341
|
if (multiple) {
|
|
306
342
|
const selectedValues = selected;
|
|
@@ -322,13 +358,36 @@ var SimpleSelect = ({
|
|
|
322
358
|
const option = options.find((opt) => opt.value === selected);
|
|
323
359
|
return option?.label || selected || /* @__PURE__ */ jsxRuntime.jsx("em", { children: placeholder || "Select..." });
|
|
324
360
|
},
|
|
325
|
-
children:
|
|
361
|
+
children: [
|
|
362
|
+
filterable && /* @__PURE__ */ jsxRuntime.jsx(
|
|
363
|
+
material.ListSubheader,
|
|
364
|
+
{
|
|
365
|
+
sx: { py: 1 },
|
|
366
|
+
onMouseDown: (e) => e.stopPropagation(),
|
|
367
|
+
onClick: (e) => e.stopPropagation(),
|
|
368
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
369
|
+
material.TextField,
|
|
370
|
+
{
|
|
371
|
+
size: "small",
|
|
372
|
+
fullWidth: true,
|
|
373
|
+
placeholder: filterPlaceholder,
|
|
374
|
+
value: filterText,
|
|
375
|
+
onChange: handleFilterChange,
|
|
376
|
+
variant: "outlined",
|
|
377
|
+
sx: { mt: -0.5 },
|
|
378
|
+
autoFocus: true
|
|
379
|
+
}
|
|
380
|
+
)
|
|
381
|
+
}
|
|
382
|
+
),
|
|
383
|
+
filteredOptions.map((option) => /* @__PURE__ */ jsxRuntime.jsx(material.MenuItem, { value: option.value, children: option.label }, option.value))
|
|
384
|
+
]
|
|
326
385
|
}
|
|
327
386
|
),
|
|
328
387
|
helperText && /* @__PURE__ */ jsxRuntime.jsx(material.FormHelperText, { children: helperText })
|
|
329
388
|
] });
|
|
330
389
|
};
|
|
331
|
-
var SelectField = ({ field, control, defaultValue, rules, errors
|
|
390
|
+
var SelectField = ({ field, control, defaultValue, rules, errors }) => {
|
|
332
391
|
const isMultiple = field.allowMultiple || false;
|
|
333
392
|
const normalizedOptions = normalizeOptions(field.options);
|
|
334
393
|
const selectOptions = react.useMemo(() => {
|
|
@@ -337,7 +396,6 @@ var SelectField = ({ field, control, defaultValue, rules, errors, services }) =>
|
|
|
337
396
|
label: opt.label
|
|
338
397
|
}));
|
|
339
398
|
}, [normalizedOptions]);
|
|
340
|
-
const SelectComponent = services?.SelectComponent || SimpleSelect;
|
|
341
399
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
342
400
|
reactHookForm.Controller,
|
|
343
401
|
{
|
|
@@ -347,7 +405,7 @@ var SelectField = ({ field, control, defaultValue, rules, errors, services }) =>
|
|
|
347
405
|
rules,
|
|
348
406
|
render: ({ field: formField }) => {
|
|
349
407
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
350
|
-
|
|
408
|
+
SimpleSelect,
|
|
351
409
|
{
|
|
352
410
|
label: field.label,
|
|
353
411
|
value: formField.value,
|
|
@@ -1077,7 +1135,7 @@ var FormReferenceField = ({ field, control, defaultValue, rules, errors, service
|
|
|
1077
1135
|
const [options, setOptions] = react.useState([]);
|
|
1078
1136
|
const [isLoading, setIsLoading] = react.useState(false);
|
|
1079
1137
|
const formReferenceService = services?.formReference || defaultFormReferenceService;
|
|
1080
|
-
react.
|
|
1138
|
+
const fetchOptions = react.useCallback(() => {
|
|
1081
1139
|
if (!field.referenceFormName || !field.referenceFieldName) return;
|
|
1082
1140
|
setIsLoading(true);
|
|
1083
1141
|
formReferenceService.fetchOptions(field.referenceFormName, field.referenceFieldName).then((opts) => {
|
|
@@ -1089,6 +1147,9 @@ var FormReferenceField = ({ field, control, defaultValue, rules, errors, service
|
|
|
1089
1147
|
setIsLoading(false);
|
|
1090
1148
|
});
|
|
1091
1149
|
}, [field.referenceFormName, field.referenceFieldName, formReferenceService]);
|
|
1150
|
+
react.useEffect(() => {
|
|
1151
|
+
fetchOptions();
|
|
1152
|
+
}, [fetchOptions]);
|
|
1092
1153
|
const selectOptions = react.useMemo(() => {
|
|
1093
1154
|
return options.map((opt) => ({
|
|
1094
1155
|
value: String(opt.value),
|
|
@@ -1098,7 +1159,6 @@ var FormReferenceField = ({ field, control, defaultValue, rules, errors, service
|
|
|
1098
1159
|
const fieldDefaultValue = defaultValue ?? getDefaultValue(field);
|
|
1099
1160
|
const fieldRules = rules ?? buildFieldRules(field);
|
|
1100
1161
|
const isDisabled = !field.referenceFormName || !field.referenceFieldName;
|
|
1101
|
-
const SelectComponent = services?.SelectComponent || SimpleSelect;
|
|
1102
1162
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
1103
1163
|
reactHookForm.Controller,
|
|
1104
1164
|
{
|
|
@@ -1108,7 +1168,7 @@ var FormReferenceField = ({ field, control, defaultValue, rules, errors, service
|
|
|
1108
1168
|
rules: fieldRules,
|
|
1109
1169
|
render: ({ field: formField }) => {
|
|
1110
1170
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
1111
|
-
|
|
1171
|
+
SimpleSelect,
|
|
1112
1172
|
{
|
|
1113
1173
|
label: field.label,
|
|
1114
1174
|
value: formField.value,
|
|
@@ -1124,7 +1184,9 @@ var FormReferenceField = ({ field, control, defaultValue, rules, errors, service
|
|
|
1124
1184
|
error: !!errors[field.name],
|
|
1125
1185
|
disabled: isDisabled || isLoading,
|
|
1126
1186
|
multiple: isMultiple,
|
|
1127
|
-
isLoading
|
|
1187
|
+
isLoading,
|
|
1188
|
+
refreshable: true,
|
|
1189
|
+
onRefresh: fetchOptions
|
|
1128
1190
|
}
|
|
1129
1191
|
);
|
|
1130
1192
|
}
|
|
@@ -1137,7 +1199,7 @@ var ApiReferenceField = ({ field, control, defaultValue, rules, errors, services
|
|
|
1137
1199
|
const [options, setOptions] = react.useState([]);
|
|
1138
1200
|
const [isLoading, setIsLoading] = react.useState(false);
|
|
1139
1201
|
const apiReferenceService = services?.apiReference || defaultApiReferenceService;
|
|
1140
|
-
react.
|
|
1202
|
+
const fetchOptions = react.useCallback(() => {
|
|
1141
1203
|
if (!field.apiEndpoint || !field.apiLabelField) return;
|
|
1142
1204
|
setIsLoading(true);
|
|
1143
1205
|
apiReferenceService.fetchOptions(field.apiEndpoint, field.apiLabelField, field.apiValueField || "_id").then((opts) => {
|
|
@@ -1149,6 +1211,9 @@ var ApiReferenceField = ({ field, control, defaultValue, rules, errors, services
|
|
|
1149
1211
|
setIsLoading(false);
|
|
1150
1212
|
});
|
|
1151
1213
|
}, [field.apiEndpoint, field.apiLabelField, field.apiValueField, apiReferenceService]);
|
|
1214
|
+
react.useEffect(() => {
|
|
1215
|
+
fetchOptions();
|
|
1216
|
+
}, [fetchOptions]);
|
|
1152
1217
|
const selectOptions = react.useMemo(() => {
|
|
1153
1218
|
return options.map((opt) => ({
|
|
1154
1219
|
value: String(opt.value),
|
|
@@ -1158,7 +1223,6 @@ var ApiReferenceField = ({ field, control, defaultValue, rules, errors, services
|
|
|
1158
1223
|
const fieldDefaultValue = defaultValue ?? getDefaultValue(field);
|
|
1159
1224
|
const fieldRules = rules ?? buildFieldRules(field);
|
|
1160
1225
|
const isDisabled = !field.apiEndpoint || !field.apiLabelField;
|
|
1161
|
-
const SelectComponent = services?.SelectComponent || SimpleSelect;
|
|
1162
1226
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
1163
1227
|
reactHookForm.Controller,
|
|
1164
1228
|
{
|
|
@@ -1168,7 +1232,7 @@ var ApiReferenceField = ({ field, control, defaultValue, rules, errors, services
|
|
|
1168
1232
|
rules: fieldRules,
|
|
1169
1233
|
render: ({ field: formField }) => {
|
|
1170
1234
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
1171
|
-
|
|
1235
|
+
SimpleSelect,
|
|
1172
1236
|
{
|
|
1173
1237
|
label: field.label,
|
|
1174
1238
|
value: formField.value,
|
|
@@ -1184,7 +1248,9 @@ var ApiReferenceField = ({ field, control, defaultValue, rules, errors, services
|
|
|
1184
1248
|
error: !!errors[field.name],
|
|
1185
1249
|
disabled: isDisabled || isLoading,
|
|
1186
1250
|
multiple: isMultiple,
|
|
1187
|
-
isLoading
|
|
1251
|
+
isLoading,
|
|
1252
|
+
refreshable: true,
|
|
1253
|
+
onRefresh: fetchOptions
|
|
1188
1254
|
}
|
|
1189
1255
|
);
|
|
1190
1256
|
}
|
|
@@ -1565,11 +1631,9 @@ var FormRenderer = ({
|
|
|
1565
1631
|
control,
|
|
1566
1632
|
handleSubmit,
|
|
1567
1633
|
reset,
|
|
1568
|
-
resetField,
|
|
1569
1634
|
clearErrors,
|
|
1570
1635
|
setValue,
|
|
1571
1636
|
setError,
|
|
1572
|
-
getValues,
|
|
1573
1637
|
formState: { errors }
|
|
1574
1638
|
} = reactHookForm.useForm({
|
|
1575
1639
|
defaultValues: initialValues || {}
|
|
@@ -1624,17 +1688,6 @@ var FormRenderer = ({
|
|
|
1624
1688
|
try {
|
|
1625
1689
|
await onSubmit(transformedData);
|
|
1626
1690
|
const resetValues = initialValues || {};
|
|
1627
|
-
const allFields = getAllFields(formSchema);
|
|
1628
|
-
clearErrors();
|
|
1629
|
-
allFields.forEach((field) => {
|
|
1630
|
-
const fieldValue = resetValues[field.name] ?? (field.type === "checkbox" ? false : "");
|
|
1631
|
-
resetField(field.name, {
|
|
1632
|
-
defaultValue: fieldValue,
|
|
1633
|
-
keepError: false,
|
|
1634
|
-
keepDirty: false,
|
|
1635
|
-
keepTouched: false
|
|
1636
|
-
});
|
|
1637
|
-
});
|
|
1638
1691
|
reset(resetValues, {
|
|
1639
1692
|
keepErrors: false,
|
|
1640
1693
|
keepDirty: false,
|
|
@@ -1642,6 +1695,9 @@ var FormRenderer = ({
|
|
|
1642
1695
|
keepIsSubmitted: false,
|
|
1643
1696
|
keepSubmitCount: false
|
|
1644
1697
|
});
|
|
1698
|
+
setTimeout(() => {
|
|
1699
|
+
clearErrors();
|
|
1700
|
+
}, 0);
|
|
1645
1701
|
if (onSuccess) onSuccess();
|
|
1646
1702
|
} catch (error) {
|
|
1647
1703
|
console.error("Form submission error:", error);
|