@aatulwork/customform-renderer 1.0.0 → 1.2.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/README.md CHANGED
@@ -224,29 +224,375 @@ interface FormField {
224
224
 
225
225
  ### Reference Fields
226
226
 
227
+ Reference fields allow you to create dropdown selects that fetch options from other forms or external APIs. There are two types: **Form Reference** and **API Reference**.
228
+
229
+ #### Form Reference (`formReference`)
230
+
231
+ Form Reference fields fetch options from entries of another form in your system. This is useful for creating relationships between forms (e.g., selecting a user, product, or category).
232
+
233
+ **Field Configuration:**
227
234
  ```typescript
228
- // Form Reference
229
235
  {
230
236
  type: 'formReference',
231
- name: 'relatedForm',
232
- label: 'Related Form Entry',
233
- referenceFormName: 'users',
234
- referenceFieldName: 'name',
235
- allowMultiple: false
237
+ name: 'userId',
238
+ label: 'Select User',
239
+ required: true,
240
+ referenceFormName: 'users', // Name of the form to reference
241
+ referenceFieldName: 'fullName', // Field name to display as label
242
+ allowMultiple: false, // Allow selecting multiple items
243
+ placeholder: 'Select a user...'
244
+ }
245
+ ```
246
+
247
+ **Required Service Setup:**
248
+
249
+ You must provide a `formReference` service that fetches options from your form entries:
250
+
251
+ ```tsx
252
+ import { FormRenderer, FormServices } from '@custom-form/renderer';
253
+
254
+ const services: FormServices = {
255
+ formReference: {
256
+ fetchOptions: async (formName: string, fieldName: string) => {
257
+ // Fetch entries from the referenced form
258
+ const response = await fetch(`/api/forms/${formName}/entries`);
259
+ const data = await response.json();
260
+
261
+ // Transform entries into OptionItem format
262
+ return data.map((entry: any) => ({
263
+ label: entry.payload[fieldName] || entry[fieldName] || entry._id,
264
+ value: entry._id,
265
+ }));
266
+ },
267
+ },
268
+ };
269
+
270
+ <FormRenderer
271
+ formSchema={formSchema}
272
+ services={services}
273
+ onSubmit={handleSubmit}
274
+ />
275
+ ```
276
+
277
+ **Example: Complete Form Reference Setup**
278
+
279
+ ```tsx
280
+ import { FormRenderer, FormServices, FormSchema } from '@custom-form/renderer';
281
+
282
+ // Define your form schema with formReference field
283
+ const formSchema: FormSchema = {
284
+ title: 'Task Assignment',
285
+ name: 'task-assignment',
286
+ sections: [
287
+ {
288
+ id: 'assignment',
289
+ title: 'Assignment Details',
290
+ fields: [
291
+ {
292
+ type: 'formReference',
293
+ name: 'assignedTo',
294
+ label: 'Assign To',
295
+ required: true,
296
+ referenceFormName: 'users', // References the 'users' form
297
+ referenceFieldName: 'fullName', // Displays the 'fullName' field
298
+ placeholder: 'Select a user...',
299
+ },
300
+ {
301
+ type: 'formReference',
302
+ name: 'project',
303
+ label: 'Project',
304
+ required: true,
305
+ referenceFormName: 'projects',
306
+ referenceFieldName: 'title',
307
+ allowMultiple: false,
308
+ },
309
+ ],
310
+ },
311
+ ],
312
+ };
313
+
314
+ // Provide the formReference service
315
+ const services: FormServices = {
316
+ formReference: {
317
+ fetchOptions: async (formName: string, fieldName: string) => {
318
+ try {
319
+ // Example: Fetch from your API
320
+ const response = await fetch(`/api/forms/${formName}/entries?status=active`);
321
+
322
+ if (!response.ok) {
323
+ throw new Error(`Failed to fetch ${formName} entries`);
324
+ }
325
+
326
+ const entries = await response.json();
327
+
328
+ // Transform to OptionItem format
329
+ return entries.map((entry: any) => ({
330
+ label: entry.payload?.[fieldName] || entry[fieldName] || `Entry ${entry._id}`,
331
+ value: entry._id,
332
+ }));
333
+ } catch (error) {
334
+ console.error(`Error fetching ${formName} options:`, error);
335
+ return [];
336
+ }
337
+ },
338
+ },
339
+ };
340
+
341
+ function TaskForm() {
342
+ const handleSubmit = async (data: Record<string, any>) => {
343
+ console.log('Assigned to:', data.assignedTo); // Will be the _id of selected user
344
+ console.log('Project:', data.project); // Will be the _id of selected project
345
+ // Submit to your API...
346
+ };
347
+
348
+ return (
349
+ <FormRenderer
350
+ formSchema={formSchema}
351
+ services={services}
352
+ onSubmit={handleSubmit}
353
+ />
354
+ );
236
355
  }
356
+ ```
357
+
358
+ #### API Reference (`apiReference`)
237
359
 
238
- // API Reference
360
+ API Reference fields fetch options from any external API endpoint. This is useful for integrating with third-party APIs or your own REST endpoints.
361
+
362
+ **Field Configuration:**
363
+ ```typescript
239
364
  {
240
365
  type: 'apiReference',
241
366
  name: 'role',
242
- label: 'Role',
243
- apiEndpoint: '/api/roles',
244
- apiLabelField: 'name',
245
- apiValueField: '_id',
246
- allowMultiple: false
367
+ label: 'Select Role',
368
+ required: true,
369
+ apiEndpoint: '/api/roles', // API endpoint to fetch from
370
+ apiLabelField: 'name', // Field name to display as label
371
+ apiValueField: '_id', // Field name to use as value (default: '_id')
372
+ allowMultiple: false, // Allow selecting multiple items
373
+ placeholder: 'Select a role...'
247
374
  }
248
375
  ```
249
376
 
377
+ **Required Service Setup:**
378
+
379
+ You must provide an `apiReference` service that fetches options from your API:
380
+
381
+ ```tsx
382
+ import { FormRenderer, FormServices } from '@custom-form/renderer';
383
+
384
+ const services: FormServices = {
385
+ apiReference: {
386
+ fetchOptions: async (endpoint: string, labelField: string, valueField = '_id') => {
387
+ const response = await fetch(endpoint);
388
+ const data = await response.json();
389
+
390
+ // Handle both array responses and object responses
391
+ const items = Array.isArray(data) ? data : data.items || data.data || [];
392
+
393
+ return items.map((item: any) => ({
394
+ label: item[labelField],
395
+ value: item[valueField],
396
+ }));
397
+ },
398
+ },
399
+ };
400
+
401
+ <FormRenderer
402
+ formSchema={formSchema}
403
+ services={services}
404
+ onSubmit={handleSubmit}
405
+ />
406
+ ```
407
+
408
+ **Example: Complete API Reference Setup**
409
+
410
+ ```tsx
411
+ import { FormRenderer, FormServices, FormSchema } from '@custom-form/renderer';
412
+
413
+ // Define your form schema with apiReference field
414
+ const formSchema: FormSchema = {
415
+ title: 'User Registration',
416
+ name: 'user-registration',
417
+ sections: [
418
+ {
419
+ id: 'user-info',
420
+ title: 'User Information',
421
+ fields: [
422
+ {
423
+ type: 'text',
424
+ name: 'firstName',
425
+ label: 'First Name',
426
+ required: true,
427
+ },
428
+ {
429
+ type: 'apiReference',
430
+ name: 'country',
431
+ label: 'Country',
432
+ required: true,
433
+ apiEndpoint: '/api/countries',
434
+ apiLabelField: 'name',
435
+ apiValueField: 'code',
436
+ },
437
+ {
438
+ type: 'apiReference',
439
+ name: 'role',
440
+ label: 'Role',
441
+ required: true,
442
+ apiEndpoint: '/api/roles',
443
+ apiLabelField: 'name',
444
+ apiValueField: '_id', // Default, can be omitted
445
+ },
446
+ ],
447
+ },
448
+ ],
449
+ };
450
+
451
+ // Provide the apiReference service
452
+ const services: FormServices = {
453
+ apiReference: {
454
+ fetchOptions: async (endpoint: string, labelField: string, valueField = '_id') => {
455
+ try {
456
+ const response = await fetch(endpoint, {
457
+ headers: {
458
+ 'Authorization': `Bearer ${yourAuthToken}`, // Add auth if needed
459
+ 'Content-Type': 'application/json',
460
+ },
461
+ });
462
+
463
+ if (!response.ok) {
464
+ throw new Error(`Failed to fetch from ${endpoint}`);
465
+ }
466
+
467
+ const data = await response.json();
468
+
469
+ // Handle different response formats
470
+ const items = Array.isArray(data)
471
+ ? data
472
+ : data.items || data.data || data.results || [];
473
+
474
+ // Transform to OptionItem format
475
+ return items.map((item: any) => ({
476
+ label: item[labelField] || String(item[valueField]),
477
+ value: item[valueField],
478
+ }));
479
+ } catch (error) {
480
+ console.error(`Error fetching options from ${endpoint}:`, error);
481
+ return [];
482
+ }
483
+ },
484
+ },
485
+ };
486
+
487
+ function RegistrationForm() {
488
+ const handleSubmit = async (data: Record<string, any>) => {
489
+ console.log('Country code:', data.country); // Will be the country code
490
+ console.log('Role ID:', data.role); // Will be the role _id
491
+ // Submit to your API...
492
+ };
493
+
494
+ return (
495
+ <FormRenderer
496
+ formSchema={formSchema}
497
+ services={services}
498
+ onSubmit={handleSubmit}
499
+ />
500
+ );
501
+ }
502
+ ```
503
+
504
+ #### Multiple Selection Support
505
+
506
+ Both reference field types support multiple selections:
507
+
508
+ ```typescript
509
+ {
510
+ type: 'formReference',
511
+ name: 'tags',
512
+ label: 'Tags',
513
+ referenceFormName: 'tags',
514
+ referenceFieldName: 'name',
515
+ allowMultiple: true, // Enable multiple selection
516
+ }
517
+ ```
518
+
519
+ When `allowMultiple: true`, the field will return an array of selected values.
520
+
521
+ #### Advanced: Custom API with Query Parameters
522
+
523
+ You can create dynamic endpoints by modifying the service:
524
+
525
+ ```tsx
526
+ const services: FormServices = {
527
+ apiReference: {
528
+ fetchOptions: async (endpoint: string, labelField: string, valueField = '_id') => {
529
+ // Add query parameters
530
+ const url = new URL(endpoint, window.location.origin);
531
+ url.searchParams.append('status', 'active');
532
+ url.searchParams.append('limit', '100');
533
+
534
+ const response = await fetch(url.toString());
535
+ const data = await response.json();
536
+
537
+ return data.map((item: any) => ({
538
+ label: item[labelField],
539
+ value: item[valueField],
540
+ }));
541
+ },
542
+ },
543
+ };
544
+ ```
545
+
546
+ #### Error Handling
547
+
548
+ Both services should handle errors gracefully:
549
+
550
+ ```tsx
551
+ const services: FormServices = {
552
+ formReference: {
553
+ fetchOptions: async (formName: string, fieldName: string) => {
554
+ try {
555
+ const response = await fetch(`/api/forms/${formName}/entries`);
556
+ if (!response.ok) throw new Error('Failed to fetch');
557
+ const data = await response.json();
558
+ return data.map((entry: any) => ({
559
+ label: entry.payload?.[fieldName] || entry._id,
560
+ value: entry._id,
561
+ }));
562
+ } catch (error) {
563
+ console.error('Form reference error:', error);
564
+ return []; // Return empty array on error
565
+ }
566
+ },
567
+ },
568
+ apiReference: {
569
+ fetchOptions: async (endpoint: string, labelField: string, valueField = '_id') => {
570
+ try {
571
+ const response = await fetch(endpoint);
572
+ if (!response.ok) throw new Error('Failed to fetch');
573
+ const data = await response.json();
574
+ const items = Array.isArray(data) ? data : data.items || [];
575
+ return items.map((item: any) => ({
576
+ label: item[labelField],
577
+ value: item[valueField],
578
+ }));
579
+ } catch (error) {
580
+ console.error('API reference error:', error);
581
+ return []; // Return empty array on error
582
+ }
583
+ },
584
+ },
585
+ };
586
+ ```
587
+
588
+ #### Notes
589
+
590
+ - **Loading State**: Reference fields automatically show a loading indicator while fetching options
591
+ - **Disabled State**: Fields are disabled if required configuration is missing (e.g., `referenceFormName` or `apiEndpoint`)
592
+ - **Error Handling**: If the service throws an error or returns empty array, the field will be disabled
593
+ - **Caching**: Options are fetched once when the component mounts and when dependencies change
594
+ - **Custom Select Component**: You can provide a custom `SelectComponent` in services to use your own select component
595
+
250
596
  ## Service Injection
251
597
 
252
598
  The package uses a service injection pattern to handle external dependencies. You can provide custom services for file uploads, form references, API references, and more.
package/dist/index.d.mts CHANGED
@@ -73,6 +73,7 @@ interface FormRendererProps {
73
73
  allowResetOnValuesChange?: boolean;
74
74
  mode?: 'edit' | 'view';
75
75
  services?: FormServices;
76
+ colors?: FormColors;
76
77
  }
77
78
  interface FormServices {
78
79
  fileUpload?: FileUploadService;
@@ -115,6 +116,19 @@ interface DateFormatterService {
115
116
  datePickerMode?: 'date' | 'datetime' | 'time';
116
117
  }) => string;
117
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
+ }
118
132
  interface FieldRendererProps {
119
133
  field: FormField;
120
134
  control: any;
@@ -131,9 +145,10 @@ interface FieldRendererProps {
131
145
  }) => void;
132
146
  clearErrors?: (name?: string) => void;
133
147
  services?: FormServices;
148
+ colors?: FormColors;
134
149
  }
135
150
 
136
- declare const FormRenderer: ({ formSchema, onSubmit, onCancel, isLoading, onSuccess, initialValues, hideTitle, allowResetOnValuesChange, mode, services, }: FormRendererProps) => react_jsx_runtime.JSX.Element;
151
+ declare const FormRenderer: ({ formSchema, onSubmit, onCancel, isLoading, onSuccess, initialValues, hideTitle, allowResetOnValuesChange, mode, services, colors, }: FormRendererProps) => react_jsx_runtime.JSX.Element;
137
152
 
138
153
  interface FieldRendererComponentProps extends Omit<FieldRendererProps, 'defaultValue' | 'rules'> {
139
154
  formSchema: any;
@@ -152,8 +167,9 @@ interface FormViewModeProps {
152
167
  initialValues?: Record<string, any>;
153
168
  hideTitle?: boolean;
154
169
  services?: FormServices;
170
+ colors?: FormColors;
155
171
  }
156
- declare const FormViewMode: ({ formSchema, initialValues, hideTitle, services }: FormViewModeProps) => react_jsx_runtime.JSX.Element;
172
+ declare const FormViewMode: ({ formSchema, initialValues, hideTitle, services, colors }: FormViewModeProps) => react_jsx_runtime.JSX.Element;
157
173
 
158
174
  interface FieldViewProps {
159
175
  field: FormField;
@@ -181,7 +197,7 @@ declare global {
181
197
  ClassicEditor: any;
182
198
  }
183
199
  }
184
- declare const CKEditorField: ({ field, control, defaultValue, rules, errors, setValue, formSchema, services }: FieldRendererProps) => react_jsx_runtime.JSX.Element;
200
+ declare const CKEditorField: ({ field, control, defaultValue, rules, errors, setValue, formSchema, services, colors }: FieldRendererProps) => react_jsx_runtime.JSX.Element;
185
201
 
186
202
  interface FileFieldProps extends FieldRendererProps {
187
203
  uploadingFiles?: Record<string, boolean>;
@@ -192,7 +208,7 @@ interface FileFieldProps extends FieldRendererProps {
192
208
  }) => void;
193
209
  clearErrors?: (name?: string) => void;
194
210
  }
195
- declare const FileField: ({ field, control, defaultValue, rules, errors, formSchema, uploadingFiles, setUploadingFiles, setError, clearErrors, services, }: FileFieldProps) => react_jsx_runtime.JSX.Element;
211
+ declare const FileField: ({ field, control, defaultValue, rules, errors, formSchema, uploadingFiles, setUploadingFiles, setError, clearErrors, services, colors, }: FileFieldProps) => react_jsx_runtime.JSX.Element;
196
212
 
197
213
  declare const FormReferenceField: ({ field, control, defaultValue, rules, errors, services }: FieldRendererProps) => react_jsx_runtime.JSX.Element;
198
214
  declare const ApiReferenceField: ({ field, control, defaultValue, rules, errors, services }: FieldRendererProps) => react_jsx_runtime.JSX.Element;
@@ -349,4 +365,4 @@ declare const defaultApiReferenceService: ApiReferenceService;
349
365
  */
350
366
  declare const defaultDateFormatterService: DateFormatterService;
351
367
 
352
- export { ApiReferenceField, type ApiReferenceService, CKEditorField, CheckboxField, ColorField, type DateFormatterService, DateTimePickerField, FieldRenderer, type FieldRendererProps, type FieldType, type FieldValidation, FieldView, FileField, type FileUploadService, type FormField, FormReferenceField, type FormReferenceService, FormRenderer, type FormRendererProps, type FormSchema, type FormSection, type FormServices, FormViewMode, type OptionItem, RadioField, SelectField, SimpleSelect, type SimpleSelectOption, type SimpleSelectProps, TextField, ToggleField, type UploadedFile, buildFieldRules, defaultApiReferenceService, defaultDateFormatterService, defaultFileUploadService, defaultFormReferenceService, formatFileSize, getAllFields, getDefaultValue, isCKEditorAvailable, loadCKEditor, normalizeInitialValues, normalizeOptions, transformFormValues, useCKEditor, validateFile, waitForCKEditor };
368
+ export { ApiReferenceField, type ApiReferenceService, CKEditorField, CheckboxField, ColorField, type DateFormatterService, DateTimePickerField, FieldRenderer, type FieldRendererProps, type FieldType, type FieldValidation, FieldView, FileField, type FileUploadService, type FormColors, type FormField, FormReferenceField, type FormReferenceService, FormRenderer, type FormRendererProps, type FormSchema, type FormSection, type FormServices, FormViewMode, type OptionItem, RadioField, SelectField, SimpleSelect, type SimpleSelectOption, type SimpleSelectProps, TextField, ToggleField, type UploadedFile, buildFieldRules, defaultApiReferenceService, defaultDateFormatterService, defaultFileUploadService, defaultFormReferenceService, formatFileSize, getAllFields, getDefaultValue, isCKEditorAvailable, loadCKEditor, normalizeInitialValues, normalizeOptions, transformFormValues, useCKEditor, validateFile, waitForCKEditor };
package/dist/index.d.ts CHANGED
@@ -73,6 +73,7 @@ interface FormRendererProps {
73
73
  allowResetOnValuesChange?: boolean;
74
74
  mode?: 'edit' | 'view';
75
75
  services?: FormServices;
76
+ colors?: FormColors;
76
77
  }
77
78
  interface FormServices {
78
79
  fileUpload?: FileUploadService;
@@ -115,6 +116,19 @@ interface DateFormatterService {
115
116
  datePickerMode?: 'date' | 'datetime' | 'time';
116
117
  }) => string;
117
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
+ }
118
132
  interface FieldRendererProps {
119
133
  field: FormField;
120
134
  control: any;
@@ -131,9 +145,10 @@ interface FieldRendererProps {
131
145
  }) => void;
132
146
  clearErrors?: (name?: string) => void;
133
147
  services?: FormServices;
148
+ colors?: FormColors;
134
149
  }
135
150
 
136
- declare const FormRenderer: ({ formSchema, onSubmit, onCancel, isLoading, onSuccess, initialValues, hideTitle, allowResetOnValuesChange, mode, services, }: FormRendererProps) => react_jsx_runtime.JSX.Element;
151
+ declare const FormRenderer: ({ formSchema, onSubmit, onCancel, isLoading, onSuccess, initialValues, hideTitle, allowResetOnValuesChange, mode, services, colors, }: FormRendererProps) => react_jsx_runtime.JSX.Element;
137
152
 
138
153
  interface FieldRendererComponentProps extends Omit<FieldRendererProps, 'defaultValue' | 'rules'> {
139
154
  formSchema: any;
@@ -152,8 +167,9 @@ interface FormViewModeProps {
152
167
  initialValues?: Record<string, any>;
153
168
  hideTitle?: boolean;
154
169
  services?: FormServices;
170
+ colors?: FormColors;
155
171
  }
156
- declare const FormViewMode: ({ formSchema, initialValues, hideTitle, services }: FormViewModeProps) => react_jsx_runtime.JSX.Element;
172
+ declare const FormViewMode: ({ formSchema, initialValues, hideTitle, services, colors }: FormViewModeProps) => react_jsx_runtime.JSX.Element;
157
173
 
158
174
  interface FieldViewProps {
159
175
  field: FormField;
@@ -181,7 +197,7 @@ declare global {
181
197
  ClassicEditor: any;
182
198
  }
183
199
  }
184
- declare const CKEditorField: ({ field, control, defaultValue, rules, errors, setValue, formSchema, services }: FieldRendererProps) => react_jsx_runtime.JSX.Element;
200
+ declare const CKEditorField: ({ field, control, defaultValue, rules, errors, setValue, formSchema, services, colors }: FieldRendererProps) => react_jsx_runtime.JSX.Element;
185
201
 
186
202
  interface FileFieldProps extends FieldRendererProps {
187
203
  uploadingFiles?: Record<string, boolean>;
@@ -192,7 +208,7 @@ interface FileFieldProps extends FieldRendererProps {
192
208
  }) => void;
193
209
  clearErrors?: (name?: string) => void;
194
210
  }
195
- declare const FileField: ({ field, control, defaultValue, rules, errors, formSchema, uploadingFiles, setUploadingFiles, setError, clearErrors, services, }: FileFieldProps) => react_jsx_runtime.JSX.Element;
211
+ declare const FileField: ({ field, control, defaultValue, rules, errors, formSchema, uploadingFiles, setUploadingFiles, setError, clearErrors, services, colors, }: FileFieldProps) => react_jsx_runtime.JSX.Element;
196
212
 
197
213
  declare const FormReferenceField: ({ field, control, defaultValue, rules, errors, services }: FieldRendererProps) => react_jsx_runtime.JSX.Element;
198
214
  declare const ApiReferenceField: ({ field, control, defaultValue, rules, errors, services }: FieldRendererProps) => react_jsx_runtime.JSX.Element;
@@ -349,4 +365,4 @@ declare const defaultApiReferenceService: ApiReferenceService;
349
365
  */
350
366
  declare const defaultDateFormatterService: DateFormatterService;
351
367
 
352
- export { ApiReferenceField, type ApiReferenceService, CKEditorField, CheckboxField, ColorField, type DateFormatterService, DateTimePickerField, FieldRenderer, type FieldRendererProps, type FieldType, type FieldValidation, FieldView, FileField, type FileUploadService, type FormField, FormReferenceField, type FormReferenceService, FormRenderer, type FormRendererProps, type FormSchema, type FormSection, type FormServices, FormViewMode, type OptionItem, RadioField, SelectField, SimpleSelect, type SimpleSelectOption, type SimpleSelectProps, TextField, ToggleField, type UploadedFile, buildFieldRules, defaultApiReferenceService, defaultDateFormatterService, defaultFileUploadService, defaultFormReferenceService, formatFileSize, getAllFields, getDefaultValue, isCKEditorAvailable, loadCKEditor, normalizeInitialValues, normalizeOptions, transformFormValues, useCKEditor, validateFile, waitForCKEditor };
368
+ export { ApiReferenceField, type ApiReferenceService, CKEditorField, CheckboxField, ColorField, type DateFormatterService, DateTimePickerField, FieldRenderer, type FieldRendererProps, type FieldType, type FieldValidation, FieldView, FileField, type FileUploadService, type FormColors, type FormField, FormReferenceField, type FormReferenceService, FormRenderer, type FormRendererProps, type FormSchema, type FormSection, type FormServices, FormViewMode, type OptionItem, RadioField, SelectField, SimpleSelect, type SimpleSelectOption, type SimpleSelectProps, TextField, ToggleField, type UploadedFile, buildFieldRules, defaultApiReferenceService, defaultDateFormatterService, defaultFileUploadService, defaultFormReferenceService, formatFileSize, getAllFields, getDefaultValue, isCKEditorAvailable, loadCKEditor, normalizeInitialValues, normalizeOptions, transformFormValues, useCKEditor, validateFile, waitForCKEditor };