@aatulwork/customform-renderer 1.11.0 → 1.12.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.js +16 -3
- package/dist/fields.js.map +1 -1
- package/dist/fields.mjs +17 -4
- package/dist/fields.mjs.map +1 -1
- package/dist/index.js +18 -5
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +19 -6
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/fields.js
CHANGED
|
@@ -164,6 +164,7 @@ var SimpleSelect = ({
|
|
|
164
164
|
onRefresh
|
|
165
165
|
}) => {
|
|
166
166
|
const [filterText, setFilterText] = react.useState("");
|
|
167
|
+
const selectId = react.useId();
|
|
167
168
|
const handleChange = (event) => {
|
|
168
169
|
const val = event.target.value;
|
|
169
170
|
onChange(val);
|
|
@@ -178,10 +179,21 @@ var SimpleSelect = ({
|
|
|
178
179
|
setFilterText("");
|
|
179
180
|
};
|
|
180
181
|
return /* @__PURE__ */ jsxRuntime.jsxs(material.FormControl, { fullWidth, size, required, error, disabled, children: [
|
|
181
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
182
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
183
|
+
material.FormLabel,
|
|
184
|
+
{
|
|
185
|
+
component: "label",
|
|
186
|
+
htmlFor: selectId,
|
|
187
|
+
required,
|
|
188
|
+
error,
|
|
189
|
+
sx: { mb: 0.5, display: "block" },
|
|
190
|
+
children: label
|
|
191
|
+
}
|
|
192
|
+
),
|
|
182
193
|
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
183
194
|
material.Select,
|
|
184
195
|
{
|
|
196
|
+
id: selectId,
|
|
185
197
|
value: value ?? (multiple ? [] : ""),
|
|
186
198
|
onChange: handleChange,
|
|
187
199
|
onClose: handleClose,
|
|
@@ -413,11 +425,12 @@ var ColorField = ({ field, control, defaultValue, rules, errors }) => {
|
|
|
413
425
|
onChange: formField.onChange,
|
|
414
426
|
onBlur: formField.onBlur,
|
|
415
427
|
sx: {
|
|
416
|
-
width:
|
|
417
|
-
height:
|
|
428
|
+
width: 30,
|
|
429
|
+
height: 30,
|
|
418
430
|
padding: 0,
|
|
419
431
|
cursor: "pointer",
|
|
420
432
|
backgroundColor: "transparent",
|
|
433
|
+
border: "none",
|
|
421
434
|
"&::-webkit-color-swatch-wrapper": { padding: 0 },
|
|
422
435
|
"&::-webkit-color-swatch": { border: "none", borderRadius: "4px" },
|
|
423
436
|
"&::-moz-color-swatch": { border: "none", borderRadius: "4px" }
|
package/dist/fields.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/fields/TextField.tsx","../src/utils/fieldHelpers.ts","../src/components/common/SimpleSelect.tsx","../src/components/fields/SelectField.tsx","../src/components/fields/CheckboxField.tsx","../src/components/fields/RadioField.tsx","../src/components/fields/ToggleField.tsx","../src/components/fields/ColorField.tsx","../src/components/fields/DatePickerField.tsx","../src/utils/useFormColors.ts","../src/services/defaultServices.ts","../src/utils/ckeditorLoader.ts","../src/hooks/useCKEditor.ts","../src/components/fields/CKEditorField.tsx","../src/components/fields/FileField.tsx","../src/utils/formHelpers.ts","../src/components/fields/ReferenceFields.tsx"],"names":["jsx","Controller","jsxs","FormControl","FormLabel","MuiTextField","useState","MuiSelect","OutlinedInput","CircularProgress","InputAdornment","IconButton","RefreshIcon","Box","option","Chip","ListSubheader","TextField","MenuItem","FormHelperText","useMemo","FormControlLabel","Checkbox","RadioGroup","Radio","Switch","Typography","Fragment","LocalizationProvider","AdapterDayjs","DatePicker","dayjs","DateTimePicker","TimePicker","useTheme","error","useEffect","useRef","useWatch","useCallback","alpha","CKEditor","useMediaQuery","isUploading","CloudUploadIcon","InsertDriveFileIcon","Tooltip","CloseIcon"],"mappings":"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","file":"fields.js","sourcesContent":["import React from 'react';\r\nimport { Controller } from 'react-hook-form';\r\nimport { FormControl, FormLabel, TextField as MuiTextField } from '@mui/material';\r\nimport { FieldRendererProps } from '../../types';\r\n\r\nexport const TextField = ({ field, control, defaultValue, rules, errors }: FieldRendererProps) => {\r\n return (\r\n <Controller\r\n key={field.name}\r\n name={field.name}\r\n control={control}\r\n defaultValue={defaultValue}\r\n rules={rules}\r\n render={({ field: formField }) => (\r\n <FormControl\r\n fullWidth\r\n required={field.required}\r\n error={!!errors[field.name]}\r\n >\r\n <FormLabel> {field.label}</FormLabel>\r\n <MuiTextField\r\n {...formField}\r\n type={field.type === 'number' ? 'number' : field.type}\r\n placeholder={field.placeholder || 'Enter value'}\r\n fullWidth\r\n size=\"small\"\r\n required={field.required}\r\n error={!!errors[field.name]}\r\n helperText={errors[field.name]?.message as string}\r\n inputProps={\r\n field.type === 'number'\r\n ? {\r\n min: field.validation?.min,\r\n max: field.validation?.max,\r\n }\r\n : undefined\r\n }\r\n />\r\n </FormControl>\r\n )}\r\n />\r\n );\r\n};\r\n","import { FormField } from '../types';\r\n\r\n/**\r\n * Format file size in human-readable format\r\n */\r\nexport const formatFileSize = (bytes: number): string => {\r\n if (bytes === 0) return '0 Bytes';\r\n const k = 1024;\r\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n return Math.round(bytes / Math.pow(k, i) * 100) / 100 + ' ' + sizes[i];\r\n};\r\n\r\n/**\r\n * Validate file based on field configuration\r\n */\r\nexport const validateFile = (file: File, field: FormField): string | true => {\r\n // Check file type\r\n if (field.validation?.allowedFileTypes && field.validation.allowedFileTypes.length > 0) {\r\n const fileExtension = file.name.split('.').pop()?.toLowerCase();\r\n const allowedTypes = field.validation.allowedFileTypes.map(t => t.toLowerCase().replace('.', ''));\r\n if (!fileExtension || !allowedTypes.includes(fileExtension)) {\r\n return `File type not allowed. Allowed types: ${field.validation.allowedFileTypes.join(', ')}`;\r\n }\r\n }\r\n\r\n // Check file size\r\n if (field.validation?.maxFileSize) {\r\n if (file.size > field.validation.maxFileSize) {\r\n const maxSizeFormatted = formatFileSize(field.validation.maxFileSize);\r\n return `File size exceeds maximum allowed size of ${maxSizeFormatted}`;\r\n }\r\n }\r\n\r\n return true;\r\n};\r\n\r\n/**\r\n * Build validation rules for a field\r\n */\r\nexport const buildFieldRules = (field: FormField): any => {\r\n const rules: any = {};\r\n \r\n if (field.required) {\r\n rules.required = `${field.label} is required`;\r\n }\r\n\r\n // File validation rules\r\n if (field.type === 'file') {\r\n rules.validate = (value: any) => {\r\n if (field.required) {\r\n if (field.allowMultiple) {\r\n const files = Array.isArray(value) ? value : [];\r\n if (files.length === 0) {\r\n return `${field.label} is required`;\r\n }\r\n const hasValidFiles = files.some((file: any) => \r\n file && typeof file === 'object' && ('fileName' in file || 'fileUrl' in file)\r\n );\r\n if (!hasValidFiles) {\r\n return `${field.label} is required`;\r\n }\r\n } else {\r\n if (!value || (typeof value === 'object' && !('fileName' in value || 'fileUrl' in value))) {\r\n return `${field.label} is required`;\r\n }\r\n }\r\n }\r\n return true;\r\n };\r\n }\r\n\r\n // Multiple select validation\r\n if ((field.type === 'select' || field.type === 'formReference' || field.type === 'apiReference') && field.allowMultiple) {\r\n rules.validate = (value: string | string[] | null) => {\r\n const values = value as string[] | null;\r\n if (!values || values.length === 0) {\r\n if (field.required) {\r\n return `${field.label} is required`;\r\n }\r\n return true;\r\n }\r\n return true;\r\n };\r\n }\r\n\r\n return rules;\r\n};\r\n\r\n/**\r\n * Normalize options to OptionItem format\r\n */\r\nexport const normalizeOptions = (options?: FormField['options']): Array<{ label: string; value: string | number }> => {\r\n if (!options) return [];\r\n \r\n return options.map(opt => {\r\n if (typeof opt === 'string') {\r\n return { label: opt, value: opt };\r\n }\r\n return opt;\r\n });\r\n};\r\n","import React, { useState } from 'react';\r\nimport {\r\n FormControl,\r\n FormLabel,\r\n Select as MuiSelect,\r\n MenuItem,\r\n FormHelperText,\r\n Chip,\r\n Box,\r\n OutlinedInput,\r\n CircularProgress,\r\n TextField,\r\n ListSubheader,\r\n InputAdornment,\r\n IconButton,\r\n} from '@mui/material';\r\nimport RefreshIcon from '@mui/icons-material/Refresh';\r\n\r\nexport interface SimpleSelectOption {\r\n value: string | number;\r\n label: string;\r\n}\r\n\r\nexport interface SimpleSelectProps {\r\n label: string;\r\n value: string | string[] | number | number[] | null | undefined;\r\n onChange: (value: string | string[] | null) => void;\r\n options: SimpleSelectOption[];\r\n placeholder?: string;\r\n helperText?: string;\r\n fullWidth?: boolean;\r\n size?: 'small' | 'medium';\r\n required?: boolean;\r\n error?: boolean;\r\n disabled?: boolean;\r\n multiple?: boolean;\r\n isLoading?: boolean;\r\n filterable?: boolean;\r\n filterPlaceholder?: string;\r\n refreshable?: boolean;\r\n onRefresh?: () => void;\r\n}\r\n\r\nexport const SimpleSelect: React.FC<SimpleSelectProps> = ({\r\n label,\r\n value,\r\n onChange,\r\n options,\r\n placeholder,\r\n helperText,\r\n fullWidth = true,\r\n size = 'small',\r\n required = false,\r\n error = false,\r\n disabled = false,\r\n multiple = false,\r\n isLoading = false,\r\n filterable = true,\r\n filterPlaceholder = 'Filter...',\r\n refreshable = false,\r\n onRefresh,\r\n}) => {\r\n const [filterText, setFilterText] = useState('');\r\n\r\n const handleChange = (event: any) => {\r\n const val = event.target.value;\r\n onChange(val);\r\n };\r\n\r\n const filteredOptions =\r\n filterable && filterText\r\n ? options.filter((opt) =>\r\n String(opt.label).toLowerCase().includes(filterText.toLowerCase())\r\n )\r\n : options;\r\n\r\n const handleFilterChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n setFilterText(e.target.value);\r\n };\r\n\r\n const handleClose = () => {\r\n setFilterText('');\r\n };\r\n\r\n return (\r\n <FormControl fullWidth={fullWidth} size={size} required={required} error={error} disabled={disabled}>\r\n <FormLabel required={required} error={error} sx={{ mb: 0.5, display: 'block' }}>\r\n {label}\r\n </FormLabel>\r\n <MuiSelect\r\n value={value ?? (multiple ? [] : '')}\r\n onChange={handleChange}\r\n onClose={handleClose}\r\n input={<OutlinedInput />}\r\n MenuProps={{\r\n autoFocus: false,\r\n }}\r\n multiple={multiple}\r\n disabled={disabled || isLoading}\r\n endAdornment={\r\n isLoading ? (\r\n <CircularProgress size={20} />\r\n ) : refreshable && onRefresh ? (\r\n <InputAdornment position=\"end\" sx={{ mr: 2 }}>\r\n <IconButton\r\n size=\"small\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onRefresh();\r\n }}\r\n disabled={disabled}\r\n aria-label=\"Refresh options\"\r\n >\r\n <RefreshIcon fontSize=\"small\" />\r\n </IconButton>\r\n </InputAdornment>\r\n ) : undefined\r\n }\r\n renderValue={(selected) => {\r\n if (multiple) {\r\n const selectedValues = selected as (string | number)[];\r\n if (selectedValues.length === 0) {\r\n return <em>{placeholder || 'Select...'}</em>;\r\n }\r\n return (\r\n <Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 0.5 }}>\r\n {selectedValues.map((val) => {\r\n const option = options.find((opt) => opt.value === val);\r\n return (\r\n <Chip\r\n key={val}\r\n label={option?.label || val}\r\n size=\"small\"\r\n />\r\n );\r\n })}\r\n </Box>\r\n );\r\n }\r\n const option = options.find((opt) => opt.value === selected);\r\n return option?.label || selected || <em>{placeholder || 'Select...'}</em>;\r\n }}\r\n >\r\n {filterable && (\r\n <ListSubheader\r\n sx={{ py: 1 }}\r\n onMouseDown={(e) => e.stopPropagation()}\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <TextField\r\n size=\"small\"\r\n fullWidth\r\n placeholder={filterPlaceholder}\r\n value={filterText}\r\n onChange={handleFilterChange}\r\n variant=\"outlined\"\r\n sx={{ mt: -0.5 }}\r\n autoFocus\r\n />\r\n </ListSubheader>\r\n )}\r\n {filteredOptions.map((option) => (\r\n <MenuItem key={option.value} value={option.value}>\r\n {option.label}\r\n </MenuItem>\r\n ))}\r\n </MuiSelect>\r\n {helperText && <FormHelperText>{helperText}</FormHelperText>}\r\n </FormControl>\r\n );\r\n};\r\n","import React, { useMemo } from 'react';\r\nimport { Controller } from 'react-hook-form';\r\nimport { FieldRendererProps } from '../../types';\r\nimport { normalizeOptions } from '../../utils/fieldHelpers';\r\nimport { SimpleSelect, SimpleSelectOption } from '../common/SimpleSelect';\r\n\r\nexport const SelectField = ({ field, control, defaultValue, rules, errors }: FieldRendererProps) => {\r\n const isMultiple = field.allowMultiple || false;\r\n const normalizedOptions = normalizeOptions(field.options);\r\n\r\n // Convert to SimpleSelectOption format\r\n const selectOptions: SimpleSelectOption[] = useMemo(() => {\r\n return normalizedOptions.map((opt) => ({\r\n value: String(opt.value),\r\n label: opt.label,\r\n }));\r\n }, [normalizedOptions]);\r\n\r\n return (\r\n <Controller\r\n key={field.name}\r\n name={field.name}\r\n control={control}\r\n defaultValue={defaultValue}\r\n rules={rules}\r\n render={({ field: formField }) => {\r\n return (\r\n <SimpleSelect\r\n label={field.label}\r\n value={formField.value}\r\n onChange={(value: string | string[] | null) => {\r\n formField.onChange(value);\r\n }}\r\n options={selectOptions}\r\n placeholder={field.placeholder || 'Select...'}\r\n helperText={errors[field.name]?.message as string}\r\n fullWidth={true}\r\n size=\"small\"\r\n required={field.required}\r\n error={!!errors[field.name]}\r\n disabled={false}\r\n multiple={isMultiple}\r\n />\r\n );\r\n }}\r\n />\r\n );\r\n};\r\n","import React from 'react';\r\nimport { Controller } from 'react-hook-form';\r\nimport { FormControlLabel, Checkbox } from '@mui/material';\r\nimport { FieldRendererProps } from '../../types';\r\n\r\nexport const CheckboxField = ({ field, control, defaultValue, rules }: FieldRendererProps) => {\r\n return (\r\n <Controller\r\n key={field.name}\r\n name={field.name}\r\n control={control}\r\n defaultValue={defaultValue}\r\n rules={rules}\r\n render={({ field: formField }) => (\r\n <FormControlLabel\r\n control={\r\n <Checkbox\r\n {...formField}\r\n checked={formField.value || false}\r\n size=\"small\"\r\n />\r\n }\r\n label={field.label}\r\n />\r\n )}\r\n />\r\n );\r\n};\r\n","import React from 'react';\r\nimport { Controller } from 'react-hook-form';\r\nimport { FormControl, FormLabel, RadioGroup, FormControlLabel, Radio } from '@mui/material';\r\nimport { FieldRendererProps, OptionItem } from '../../types';\r\nimport { normalizeOptions } from '../../utils/fieldHelpers';\r\n\r\nexport const RadioField = ({ field, control, defaultValue, rules, errors }: FieldRendererProps) => {\r\n const normalizedOptions = normalizeOptions(field.options);\r\n \r\n return (\r\n <Controller\r\n key={field.name}\r\n name={field.name}\r\n control={control}\r\n defaultValue={defaultValue}\r\n rules={rules}\r\n render={({ field: formField }) => (\r\n <FormControl component=\"fieldset\" required={field.required} error={!!errors[field.name]}>\r\n <FormLabel required={field.required} error={!!errors[field.name]}>\r\n {field.label}\r\n </FormLabel>\r\n\r\n <RadioGroup {...formField} row>\r\n {normalizedOptions.map((option, index) => (\r\n <FormControlLabel\r\n key={index}\r\n value={option.value}\r\n control={<Radio size=\"small\" />}\r\n label={option.label}\r\n />\r\n ))}\r\n </RadioGroup>\r\n </FormControl>\r\n )}\r\n />\r\n );\r\n};\r\n","import React from 'react';\r\nimport { Controller } from 'react-hook-form';\r\nimport { FormControlLabel, Switch, Box, Typography } from '@mui/material';\r\nimport { FieldRendererProps } from '../../types';\r\n\r\nexport const ToggleField = ({ field, control, defaultValue, rules, errors }: FieldRendererProps) => {\r\n return (\r\n <Controller\r\n key={field.name}\r\n name={field.name}\r\n control={control}\r\n defaultValue={defaultValue}\r\n rules={rules}\r\n render={({ field: formField }) => (\r\n <FormControlLabel\r\n control={\r\n <Switch\r\n {...formField}\r\n checked={formField.value || false}\r\n size=\"medium\"\r\n />\r\n }\r\n label={\r\n <Box>\r\n <Typography variant=\"body2\">\r\n {field.label} {field.required && '*'}\r\n </Typography>\r\n {errors[field.name] && (\r\n <Typography variant=\"caption\" color=\"error\" sx={{ display: 'block', mt: 0.5 }}>\r\n {errors[field.name]?.message as string}\r\n </Typography>\r\n )}\r\n </Box>\r\n }\r\n />\r\n )}\r\n />\r\n );\r\n};\r\n","import React from 'react';\r\nimport { Controller } from 'react-hook-form';\r\nimport { Box, Typography, FormLabel } from '@mui/material';\r\nimport { FieldRendererProps } from '../../types';\r\n\r\nexport const ColorField = ({ field, control, defaultValue, rules, errors }: FieldRendererProps) => {\r\n return (\r\n <Controller\r\n key={field.name}\r\n name={field.name}\r\n control={control}\r\n defaultValue={defaultValue}\r\n rules={rules}\r\n render={({ field: formField }) => {\r\n const inputId = `color-field-${field.name}`;\r\n return (\r\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 2, width: '100%' }}>\r\n <FormLabel\r\n component=\"label\"\r\n htmlFor={inputId}\r\n required={field.required}\r\n error={!!errors[field.name]}\r\n >\r\n {field.label}\r\n </FormLabel>\r\n <Box sx={{ display: 'flex', flexDirection: 'column', flex: 1, maxWidth: 200 }}>\r\n <Box\r\n component=\"input\"\r\n type=\"color\"\r\n id={inputId}\r\n ref={formField.ref}\r\n name={formField.name}\r\n value={formField.value ?? '#000000'}\r\n onChange={formField.onChange}\r\n onBlur={formField.onBlur}\r\n sx={{\r\n width: 40,\r\n height: 40,\r\n padding: 0,\r\n cursor: 'pointer',\r\n backgroundColor: 'transparent',\r\n '&::-webkit-color-swatch-wrapper': { padding: 0 },\r\n '&::-webkit-color-swatch': { border: 'none', borderRadius: '4px' },\r\n '&::-moz-color-swatch': { border: 'none', borderRadius: '4px' },\r\n }}\r\n />\r\n {errors[field.name] && (\r\n <Typography variant=\"caption\" color=\"error\" sx={{ mt: 0.5 }}>\r\n {errors[field.name]?.message as string}\r\n </Typography>\r\n )}\r\n </Box>\r\n </Box>\r\n );\r\n }}\r\n />\r\n );\r\n};\r\n","import React from 'react';\r\nimport { Controller } from 'react-hook-form';\r\nimport { DatePicker } from '@mui/x-date-pickers/DatePicker';\r\nimport { DateTimePicker } from '@mui/x-date-pickers/DateTimePicker';\r\nimport { TimePicker } from '@mui/x-date-pickers/TimePicker';\r\nimport { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';\r\nimport { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';\r\nimport dayjs, { Dayjs } from 'dayjs';\r\nimport { FieldRendererProps } from '../../types';\r\nimport { FormLabel } from '@mui/material';\r\n\r\nconst textFieldSlotProps = (field: FieldRendererProps['field'], errors: FieldRendererProps['errors']) => ({\r\n fullWidth: true,\r\n size: 'small' as const,\r\n required: field.required,\r\n error: !!errors[field.name],\r\n helperText: errors[field.name]?.message as string,\r\n});\r\n\r\nfunction resolveDatePickerMode(field: FieldRendererProps['field']): 'date' | 'datetime' | 'time' {\r\n if (field.datePickerMode) return field.datePickerMode;\r\n return field?.displayTime ? 'datetime' : 'date';\r\n}\r\n\r\nexport const DateTimePickerField = ({ field, control, defaultValue, rules, errors }: FieldRendererProps) => {\r\n const mode = resolveDatePickerMode(field);\r\n\r\n return (\r\n <Controller\r\n key={field.name}\r\n name={field.name}\r\n control={control}\r\n defaultValue={defaultValue}\r\n rules={rules}\r\n render={({ field: formField }) => (\r\n <>\r\n <FormLabel\r\n required={field.required}\r\n error={!!errors[field.name]}\r\n >\r\n {field.label}\r\n </FormLabel>\r\n <LocalizationProvider dateAdapter={AdapterDayjs}>\r\n {mode === 'date' && (\r\n <DatePicker\r\n format=\"DD-MM-YYYY\"\r\n value={formField.value ? dayjs(formField.value) : null}\r\n onChange={(date: Dayjs | null) => formField.onChange(date?.toISOString() ?? null)}\r\n slotProps={{ textField: textFieldSlotProps(field, errors) }}\r\n />\r\n )}\r\n {mode === 'datetime' && (\r\n <DateTimePicker\r\n format=\"DD-MM-YYYY hh:mm A\"\r\n value={formField.value ? dayjs(formField.value) : null}\r\n onChange={(date: Dayjs | null) => formField.onChange(date?.toISOString() ?? null)}\r\n slotProps={{ textField: textFieldSlotProps(field, errors) }}\r\n />\r\n )}\r\n {mode === 'time' && (\r\n <TimePicker\r\n format=\"hh:mm A\"\r\n value={formField.value ? dayjs(formField.value) : null}\r\n onChange={(date: Dayjs | null) => formField.onChange(date?.toISOString() ?? null)}\r\n slotProps={{ textField: textFieldSlotProps(field, errors) }}\r\n />\r\n )}\r\n </LocalizationProvider>\r\n </>\r\n )}\r\n />\r\n );\r\n};\r\n","import { useTheme } from '@mui/material';\r\nimport { FormColors } from '../types';\r\n\r\n/**\r\n * Hook to get form colors - uses custom colors if provided, otherwise falls back to Material-UI theme\r\n */\r\nexport const useFormColors = (customColors?: FormColors) => {\r\n const theme = useTheme();\r\n\r\n return {\r\n primary: customColors?.primary || theme.palette.primary.main,\r\n secondary: customColors?.secondary || theme.palette.secondary.main,\r\n error: customColors?.error || theme.palette.error.main,\r\n success: customColors?.success || theme.palette.success.main,\r\n warning: customColors?.warning || theme.palette.warning.main,\r\n info: customColors?.info || theme.palette.info.main,\r\n textPrimary: customColors?.textPrimary || theme.palette.text.primary,\r\n textSecondary: customColors?.textSecondary || theme.palette.text.secondary,\r\n divider: customColors?.divider || theme.palette.divider,\r\n background: customColors?.background || theme.palette.background.default,\r\n backgroundPaper: customColors?.backgroundPaper || theme.palette.background.paper,\r\n };\r\n};\r\n","/**\r\n * Default service implementations\r\n * These are fallback implementations that can be overridden\r\n */\r\n\r\nimport {\r\n FileUploadService,\r\n FormReferenceService,\r\n ApiReferenceService,\r\n DateFormatterService,\r\n OptionItem,\r\n UploadedFile,\r\n} from '../types';\r\nimport dayjs from 'dayjs';\r\n\r\n/**\r\n * Default file upload service - throws error, must be provided\r\n */\r\nexport const defaultFileUploadService: FileUploadService = {\r\n uploadFiles: async () => {\r\n throw new Error('File upload service not provided. Please provide a fileUpload service in FormServices.');\r\n },\r\n};\r\n\r\n/**\r\n * Default form reference service - throws error, must be provided\r\n */\r\nexport const defaultFormReferenceService: FormReferenceService = {\r\n fetchOptions: async () => {\r\n throw new Error('Form reference service not provided. Please provide a formReference service in FormServices.');\r\n },\r\n};\r\n\r\n/**\r\n * Default API reference service - throws error, must be provided\r\n */\r\nexport const defaultApiReferenceService: ApiReferenceService = {\r\n fetchOptions: async () => {\r\n throw new Error('API reference service not provided. Please provide an apiReference service in FormServices.');\r\n },\r\n};\r\n\r\n/**\r\n * Default date formatter service\r\n */\r\nexport const defaultDateFormatterService: DateFormatterService = {\r\n format: (value: any, options?: { datePickerMode?: 'date' | 'datetime' | 'time' }) => {\r\n if (!value) return '—';\r\n \r\n const mode = options?.datePickerMode || 'date';\r\n const date = dayjs(value);\r\n \r\n if (!date.isValid()) return String(value);\r\n \r\n switch (mode) {\r\n case 'date':\r\n return date.format('DD/MM/YYYY');\r\n case 'time':\r\n return date.format('hh:mm A');\r\n case 'datetime':\r\n return date.format('DD/MM/YYYY hh:mm A');\r\n default:\r\n return date.format('DD/MM/YYYY');\r\n }\r\n },\r\n};\r\n","/**\r\n * CKEditor Loader Utility\r\n * \r\n * This utility helps load CKEditor from the lib/ckeditor/ckeditor.js file\r\n * and provides a way to check if CKEditor is available.\r\n */\r\n\r\n/**\r\n * Load CKEditor script dynamically\r\n * @param scriptPath - Path to ckeditor.js file (default: '/lib/ckeditor/ckeditor.js')\r\n * @returns Promise that resolves when CKEditor is loaded\r\n */\r\nexport const loadCKEditor = (scriptPath: string = '/lib/ckeditor/ckeditor.js'): Promise<void> => {\r\n return new Promise((resolve, reject) => {\r\n // Check if already loaded\r\n if (window.ClassicEditor) {\r\n resolve();\r\n return;\r\n }\r\n\r\n // Check if script is already being loaded\r\n const existingScript = document.querySelector(`script[src=\"${scriptPath}\"]`);\r\n if (existingScript) {\r\n // Wait for it to load\r\n existingScript.addEventListener('load', () => {\r\n if (window.ClassicEditor) {\r\n resolve();\r\n } else {\r\n reject(new Error('CKEditor script loaded but ClassicEditor not found on window'));\r\n }\r\n });\r\n existingScript.addEventListener('error', () => {\r\n reject(new Error('Failed to load CKEditor script'));\r\n });\r\n return;\r\n }\r\n\r\n // Create and load script\r\n const script = document.createElement('script');\r\n script.src = scriptPath;\r\n script.async = true;\r\n \r\n script.onload = () => {\r\n // Wait a bit for ClassicEditor to be available\r\n const checkInterval = setInterval(() => {\r\n if (window.ClassicEditor) {\r\n clearInterval(checkInterval);\r\n resolve();\r\n }\r\n }, 100);\r\n\r\n // Timeout after 10 seconds\r\n setTimeout(() => {\r\n clearInterval(checkInterval);\r\n if (!window.ClassicEditor) {\r\n reject(\r\n new Error(\r\n 'CKEditor script loaded but ClassicEditor was not found on window. ' +\r\n 'Ensure you are using the package-provided build from lib/ckeditor/ckeditor.js (see CKEDITOR_SETUP.md).'\r\n )\r\n );\r\n }\r\n }, 10000);\r\n };\r\n\r\n script.onerror = () => {\r\n reject(\r\n new Error(\r\n `Failed to load CKEditor from ${scriptPath}. ` +\r\n 'Ensure the file exists at that URL (e.g. copy from node_modules/@aatulwork/customform-renderer/lib/ckeditor/ckeditor.js to public/lib/ckeditor/ckeditor.js) or set services.ckEditorScriptPath to a working URL.'\r\n )\r\n );\r\n };\r\n\r\n document.head.appendChild(script);\r\n });\r\n};\r\n\r\n/**\r\n * Check if CKEditor is available\r\n * @returns true if ClassicEditor is available on window\r\n */\r\nexport const isCKEditorAvailable = (): boolean => {\r\n return typeof window !== 'undefined' && typeof window.ClassicEditor !== 'undefined';\r\n};\r\n\r\n/**\r\n * Wait for CKEditor to be available\r\n * @param timeout - Maximum time to wait in milliseconds (default: 10000)\r\n * @returns Promise that resolves when CKEditor is available\r\n */\r\nexport const waitForCKEditor = (timeout: number = 10000): Promise<void> => {\r\n return new Promise((resolve, reject) => {\r\n if (isCKEditorAvailable()) {\r\n resolve();\r\n return;\r\n }\r\n\r\n const startTime = Date.now();\r\n const checkInterval = setInterval(() => {\r\n if (isCKEditorAvailable()) {\r\n clearInterval(checkInterval);\r\n resolve();\r\n } else if (Date.now() - startTime > timeout) {\r\n clearInterval(checkInterval);\r\n reject(new Error('CKEditor not available after timeout'));\r\n }\r\n }, 100);\r\n });\r\n};\r\n","import { useState, useEffect } from 'react';\r\nimport { isCKEditorAvailable, waitForCKEditor, loadCKEditor } from '../utils/ckeditorLoader';\r\n\r\ninterface UseCKEditorOptions {\r\n /**\r\n * Path to CKEditor script (default: '/lib/ckeditor/ckeditor.js')\r\n */\r\n scriptPath?: string;\r\n /**\r\n * Auto-load CKEditor if not available (default: true)\r\n */\r\n autoLoad?: boolean;\r\n /**\r\n * Timeout for waiting for CKEditor (default: 10000ms)\r\n */\r\n timeout?: number;\r\n}\r\n\r\ninterface UseCKEditorReturn {\r\n /**\r\n * Whether CKEditor is ready\r\n */\r\n isReady: boolean;\r\n /**\r\n * Loading state\r\n */\r\n isLoading: boolean;\r\n /**\r\n * Error if loading failed\r\n */\r\n error: Error | null;\r\n /**\r\n * Manually trigger loading\r\n */\r\n load: () => Promise<void>;\r\n}\r\n\r\n/**\r\n * React hook for loading and checking CKEditor availability\r\n * \r\n * @example\r\n * ```tsx\r\n * const { isReady, isLoading, error } = useCKEditor();\r\n * \r\n * if (!isReady) {\r\n * return <div>Loading CKEditor...</div>;\r\n * }\r\n * ```\r\n */\r\nexport const useCKEditor = (options: UseCKEditorOptions = {}): UseCKEditorReturn => {\r\n const {\r\n scriptPath = '/lib/ckeditor/ckeditor.js',\r\n autoLoad = true,\r\n timeout = 10000,\r\n } = options;\r\n\r\n const [isReady, setIsReady] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<Error | null>(null);\r\n\r\n const load = async () => {\r\n if (isCKEditorAvailable()) {\r\n setIsReady(true);\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n setIsLoading(true);\r\n setError(null);\r\n\r\n try {\r\n await loadCKEditor(scriptPath);\r\n setIsReady(true);\r\n } catch (err) {\r\n const error = err instanceof Error ? err : new Error('Failed to load CKEditor');\r\n setError(error);\r\n setIsReady(false);\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n // Check if already available\r\n if (isCKEditorAvailable()) {\r\n setIsReady(true);\r\n return;\r\n }\r\n\r\n // Auto-load if enabled\r\n if (autoLoad) {\r\n load();\r\n } else {\r\n // Just wait for it to become available\r\n waitForCKEditor(timeout)\r\n .then(() => setIsReady(true))\r\n .catch((err) => setError(err instanceof Error ? err : new Error('CKEditor not available')));\r\n }\r\n }, [scriptPath, autoLoad, timeout]);\r\n\r\n return {\r\n isReady,\r\n isLoading,\r\n error,\r\n load,\r\n };\r\n};\r\n","import React, { useState, useEffect, useRef, useCallback } from 'react';\r\nimport { Controller, useWatch } from 'react-hook-form';\r\nimport { Box, FormHelperText, useTheme, alpha, FormLabel } from '@mui/material';\r\nimport { useFormColors } from '../../utils/useFormColors';\r\nimport { CKEditor } from '@ckeditor/ckeditor5-react';\r\nimport { FieldRendererProps } from './../../types';\r\nimport {\r\n defaultFileUploadService,\r\n} from '../../services/defaultServices';\r\nimport { useCKEditor } from '../../hooks/useCKEditor';\r\n\r\n// Declare ClassicEditor on window\r\ndeclare global {\r\n interface Window {\r\n ClassicEditor: any;\r\n }\r\n}\r\n\r\nexport const CKEditorField = ({ field, control, defaultValue, rules, errors, setValue, formSchema, services, colors }: FieldRendererProps) => {\r\n const theme = useTheme();\r\n const formColors = useFormColors(colors);\r\n const editorContainerRef = useRef<HTMLDivElement>(null);\r\n const editorInstanceRef = useRef<any>(null);\r\n const isUserTypingRef = useRef<boolean>(false);\r\n \r\n const fileUploadService = services?.fileUpload || defaultFileUploadService;\r\n const fileBaseUrl = services?.fileBaseUrl || '';\r\n const licenseKey = services?.ckEditorLicenseKey || 'GPL';\r\n const ckEditorScriptPath = services?.ckEditorScriptPath || '/lib/ckeditor/ckeditor.js';\r\n\r\n // Use CKEditor hook to load and check availability\r\n const { isReady: isCKEditorReady, isLoading: isCKEditorLoading, error: ckEditorError } = useCKEditor({\r\n scriptPath: ckEditorScriptPath,\r\n autoLoad: true,\r\n });\r\n\r\n // Watch the field value to sync CKEditor when form resets\r\n const watchedValue = useWatch({\r\n control,\r\n name: field.name,\r\n defaultValue: defaultValue || '',\r\n });\r\n\r\n // Sync CKEditor content when watched value changes externally (e.g., after form reset)\r\n // Skip sync if the change came from user typing (handled by onChange)\r\n useEffect(() => {\r\n if (editorInstanceRef.current && isCKEditorReady && !isUserTypingRef.current) {\r\n const currentEditorData = editorInstanceRef.current.getData();\r\n const formValue = watchedValue || '';\r\n \r\n // Only update if the values differ (handles form reset scenarios)\r\n if (currentEditorData !== formValue) {\r\n editorInstanceRef.current.setData(formValue);\r\n }\r\n }\r\n // Reset the typing flag after sync check\r\n isUserTypingRef.current = false;\r\n }, [watchedValue, isCKEditorReady]);\r\n\r\n // Custom upload adapter that uses fileUploadService\r\n const createCustomUploadAdapter = useCallback((loader: any) => {\r\n return {\r\n upload: async () => {\r\n if (!formSchema?.name) {\r\n throw new Error('Form schema name is required for image uploads');\r\n }\r\n\r\n try {\r\n const file = await loader.file;\r\n\r\n if (!file) {\r\n throw new Error('No file provided');\r\n }\r\n\r\n // Validate file type (images only)\r\n if (!file.type.startsWith('image/')) {\r\n throw new Error('Only image files are allowed');\r\n }\r\n\r\n const uploadedFiles = await fileUploadService.uploadFiles(\r\n formSchema.name,\r\n field.name,\r\n [file]\r\n );\r\n\r\n if (uploadedFiles && uploadedFiles.length > 0 && uploadedFiles[0].fileUrl) {\r\n const fileUrl = uploadedFiles[0].fileUrl;\r\n const isFullUrl = fileUrl.startsWith('http://') || fileUrl.startsWith('https://');\r\n const url = isFullUrl ? fileUrl : fileBaseUrl + fileUrl;\r\n return {\r\n default: url\r\n };\r\n }\r\n\r\n throw new Error('Upload failed: No file URL returned');\r\n } catch (error: any) {\r\n console.error('Upload error:', error);\r\n const errorMessage = error.response?.data?.message || error.message || 'Upload failed';\r\n throw new Error(errorMessage);\r\n }\r\n },\r\n abort: () => {\r\n console.log('Upload aborted');\r\n }\r\n };\r\n }, [formSchema?.name, field.name, fileUploadService, fileBaseUrl]);\r\n\r\n // Show loading or error state\r\n if (isCKEditorLoading) {\r\n return (\r\n <Box>\r\n <FormLabel required={field.required} error={!!errors[field.name]}>\r\n {field.label}\r\n </FormLabel>\r\n <Box sx={{ p: 2, textAlign: 'center', color: formColors.textSecondary }}>\r\n Loading editor...\r\n </Box>\r\n </Box>\r\n );\r\n }\r\n\r\n if (ckEditorError || !isCKEditorReady) {\r\n const message =\r\n ckEditorError?.message ||\r\n `CKEditor failed to load. Script path: ${ckEditorScriptPath}. Copy ckeditor.js to public/lib/ckeditor/ or set services.ckEditorScriptPath. See CKEDITOR_SETUP.md.`;\r\n return (\r\n <Box>\r\n <FormLabel required={field.required} error={!!errors[field.name]}>\r\n {field.label}\r\n </FormLabel>\r\n <Box sx={{ p: 2, border: '1px solid', borderColor: formColors.error, borderRadius: 1 }}>\r\n <FormHelperText error>{message}</FormHelperText>\r\n </Box>\r\n </Box>\r\n );\r\n }\r\n\r\n return (\r\n <Controller\r\n key={field.name}\r\n name={field.name}\r\n control={control}\r\n defaultValue={defaultValue || ''}\r\n rules={rules}\r\n render={({ field: formField }) => (\r\n <Box>\r\n <FormLabel\r\n required={field.required}\r\n error={!!errors[field.name]}\r\n >\r\n {field.label}\r\n </FormLabel>\r\n <Box\r\n ref={editorContainerRef}\r\n sx={{\r\n '& .ck-editor': {\r\n borderRadius: '4px',\r\n '& .ck-toolbar': {\r\n width: '100%',\r\n maxWidth: '100%',\r\n overflow: 'visible',\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n '& .ck-toolbar__items': {\r\n display: 'flex',\r\n flexWrap: 'wrap !important',\r\n width: '100%',\r\n maxWidth: '100%',\r\n '& > *': {\r\n flexShrink: 0,\r\n },\r\n },\r\n },\r\n '& .ck-editor__editable': {\r\n minHeight: '100px'\r\n },\r\n '&:hover': {\r\n borderColor: errors[field.name]\r\n ? formColors.error\r\n : theme.palette.mode === 'dark' ? 'rgba(255, 255, 255, 0.87)' : formColors.primary\r\n },\r\n '& .ck-focused': {\r\n border: errors[field.name]\r\n ? `1px solid ${formColors.error} !important`\r\n : `1px solid ${theme.palette.mode === 'dark' ? 'rgba(255, 255, 255, 0.23)' : formColors.primary} !important`,\r\n boxShadow: errors[field.name]\r\n ? `0 0 0 1px ${formColors.error}`\r\n : `0 0 0 1px ${alpha(formColors.primary, 0.5)} !important`\r\n }\r\n }\r\n }}\r\n >\r\n {window.ClassicEditor && isCKEditorReady && (\r\n <CKEditor\r\n editor={window.ClassicEditor}\r\n config={{\r\n licenseKey: licenseKey,\r\n initialData: formField.value || '',\r\n } as any}\r\n data={formField.value || ''}\r\n onReady={(editor) => {\r\n editorInstanceRef.current = editor;\r\n \r\n // Set up custom upload adapter via FileRepository\r\n if (formSchema?.name) {\r\n try {\r\n const fileRepository = editor.plugins.get('FileRepository');\r\n if (fileRepository) {\r\n fileRepository.createUploadAdapter = (loader: any) => {\r\n return createCustomUploadAdapter(loader);\r\n };\r\n } else {\r\n console.warn('FileRepository plugin not found');\r\n }\r\n } catch (error) {\r\n console.error('Error setting up upload adapter:', error);\r\n }\r\n } else {\r\n console.warn('Form schema name not available, upload adapter not set');\r\n }\r\n\r\n // Set initial value if provided\r\n if (defaultValue && !formField.value) {\r\n editor.setData(defaultValue);\r\n setValue?.(field.name, defaultValue);\r\n }\r\n }}\r\n onChange={(_event, editor) => {\r\n const data = editor.getData();\r\n isUserTypingRef.current = true; // Mark that user is typing\r\n formField.onChange(data);\r\n }}\r\n onBlur={() => {\r\n formField.onBlur();\r\n }}\r\n />\r\n )}\r\n </Box>\r\n {errors[field.name] && (\r\n <FormHelperText error sx={{ mt: 0.5, mx: 0 }}>\r\n {errors[field.name]?.message as string}\r\n </FormHelperText>\r\n )}\r\n </Box>\r\n )}\r\n />\r\n );\r\n};\r\n","import React from 'react';\r\nimport { Controller } from 'react-hook-form';\r\nimport {\r\n Box,\r\n Typography,\r\n IconButton,\r\n CircularProgress,\r\n Tooltip,\r\n FormLabel,\r\n useTheme,\r\n useMediaQuery,\r\n} from '@mui/material';\r\nimport CloseIcon from '@mui/icons-material/Close';\r\nimport CloudUploadIcon from '@mui/icons-material/CloudUpload';\r\nimport InsertDriveFileIcon from '@mui/icons-material/InsertDriveFile';\r\nimport { FieldRendererProps, UploadedFile } from '../../types';\r\nimport { validateFile, formatFileSize } from '../../utils/fieldHelpers';\r\nimport { useFormColors } from '../../utils/useFormColors';\r\nimport {\r\n defaultFileUploadService,\r\n} from '../../services/defaultServices';\r\n\r\ninterface FileFieldProps extends FieldRendererProps {\r\n uploadingFiles?: Record<string, boolean>;\r\n setUploadingFiles?: React.Dispatch<React.SetStateAction<Record<string, boolean>>>;\r\n setError?: (name: string, error: { type: string; message: string }) => void;\r\n clearErrors?: (name?: string) => void;\r\n}\r\n\r\nexport const FileField = ({\r\n field,\r\n control,\r\n defaultValue,\r\n rules,\r\n errors,\r\n formSchema,\r\n uploadingFiles = {},\r\n setUploadingFiles,\r\n setError,\r\n clearErrors,\r\n services,\r\n colors,\r\n}: FileFieldProps) => {\r\n const theme = useTheme();\r\n const isMobile = useMediaQuery(theme.breakpoints.down('md'));\r\n const formColors = useFormColors(colors);\r\n const acceptTypes = field.validation?.allowedFileTypes\r\n ? field.validation.allowedFileTypes.map((type: string) => `.${type.replace('.', '')}`).join(',')\r\n : undefined;\r\n const isMultiple = field.allowMultiple || false;\r\n\r\n const fileUploadService = services?.fileUpload || defaultFileUploadService;\r\n\r\n return (\r\n <Controller\r\n key={field.name}\r\n name={field.name}\r\n control={control}\r\n defaultValue={defaultValue}\r\n rules={rules}\r\n render={({ field: formField }) => {\r\n const isUploading = uploadingFiles[field.name] || false;\r\n let files: (File | UploadedFile)[] = [];\r\n\r\n if (isMultiple) {\r\n files = Array.isArray(formField.value) ? formField.value : [];\r\n } else {\r\n files = formField.value ? [formField.value] : [];\r\n }\r\n\r\n const hasFiles = files.length > 0;\r\n\r\n return (\r\n <Box>\r\n <FormLabel\r\n required={field.required}\r\n error={!!errors[field.name]}\r\n >\r\n {field.label}\r\n </FormLabel>\r\n <Box\r\n component=\"label\"\r\n htmlFor={`file-input-${field.name}`}\r\n sx={{\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n border: '1px dashed',\r\n borderColor: errors[field.name] ? formColors.error : (isUploading ? formColors.primary : hasFiles ? formColors.primary : formColors.divider),\r\n p: 1,\r\n cursor: isUploading ? 'wait' : 'pointer',\r\n transition: 'all 0.2s ease-in-out',\r\n backgroundColor: (isUploading || hasFiles) ? 'action.hover' : formColors.backgroundPaper,\r\n opacity: isUploading ? 0.7 : 1,\r\n pointerEvents: isUploading ? 'none' : 'auto',\r\n '&:hover': {\r\n borderColor: isUploading ? formColors.primary : formColors.primary,\r\n backgroundColor: 'action.hover',\r\n },\r\n }}\r\n >\r\n <input\r\n id={`file-input-${field.name}`}\r\n type=\"file\"\r\n hidden\r\n multiple={isMultiple}\r\n accept={acceptTypes}\r\n onChange={async (e) => {\r\n const fileList = e.target.files;\r\n if (!fileList || fileList.length === 0) return;\r\n\r\n const newFiles = Array.from(fileList);\r\n const isUploading = uploadingFiles[field.name] || false;\r\n\r\n if (isUploading) {\r\n e.target.value = '';\r\n return;\r\n }\r\n\r\n for (const file of newFiles) {\r\n const validationResult = validateFile(file, field);\r\n if (validationResult !== true) {\r\n setError?.(field.name, {\r\n type: 'manual',\r\n message: validationResult as string,\r\n });\r\n e.target.value = '';\r\n return;\r\n }\r\n }\r\n\r\n try {\r\n setUploadingFiles?.((prev) => ({ ...prev, [field.name]: true }));\r\n clearErrors?.(field.name);\r\n\r\n if (!formSchema?.name) {\r\n throw new Error('Form schema name is required for file uploads');\r\n }\r\n\r\n const uploadedFiles = await fileUploadService.uploadFiles(\r\n formSchema.name,\r\n field.name,\r\n newFiles\r\n );\r\n\r\n if (isMultiple) {\r\n const currentValue = formField.value;\r\n const existingFiles = Array.isArray(currentValue)\r\n ? currentValue.filter((item: any) => item && typeof item === 'object' && 'fileName' in item)\r\n : [];\r\n const allUploadedFiles = [...existingFiles, ...uploadedFiles];\r\n formField.onChange(allUploadedFiles);\r\n } else {\r\n formField.onChange(uploadedFiles[0] || null);\r\n }\r\n } catch (error: any) {\r\n console.error(`Failed to upload files for field ${field.name}:`, error);\r\n const errorMessage = error.response?.data?.message || error.message || 'Failed to upload files';\r\n setError?.(field.name, {\r\n type: 'manual',\r\n message: `Failed to upload files: ${errorMessage}`,\r\n });\r\n } finally {\r\n setUploadingFiles?.((prev) => ({ ...prev, [field.name]: false }));\r\n e.target.value = '';\r\n }\r\n }}\r\n disabled={uploadingFiles[field.name] || false}\r\n />\r\n {isUploading ? (\r\n <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 1, py: 3, width: '100%' }}>\r\n <CircularProgress size={40} />\r\n <Typography variant=\"body2\" sx={{ fontWeight: 500, color: formColors.primary }}>\r\n Uploading files...\r\n </Typography>\r\n <Typography variant=\"caption\" sx={{ color: formColors.textSecondary }}>\r\n Please wait while files are being uploaded\r\n </Typography>\r\n </Box>\r\n ) : !hasFiles ? (\r\n <>\r\n <CloudUploadIcon sx={{ fontSize: 40, color: formColors.textSecondary, mb: 1 }} />\r\n <Typography variant=\"caption\" sx={{ color: formColors.textSecondary }}>\r\n Click to upload or drag and drop\r\n {isMultiple && ' (multiple files allowed)'}\r\n </Typography>\r\n {field.validation?.allowedFileTypes && field.validation.allowedFileTypes.length > 0 && (\r\n <Typography variant=\"caption\" sx={{ mt: 0.5, color: formColors.textSecondary }}>\r\n Allowed: {field.validation.allowedFileTypes.join(', ')}\r\n </Typography>\r\n )}\r\n {field.validation?.maxFileSize && (\r\n <Typography variant=\"caption\" sx={{ mt: 0.5, color: formColors.textSecondary }}>\r\n Max size: {formatFileSize(field.validation.maxFileSize)} per file\r\n </Typography>\r\n )}\r\n </>\r\n ) : (\r\n <Box sx={{ width: '100%' }}>\r\n {isMultiple && (\r\n <Typography variant=\"body2\" sx={{ fontWeight: 500, mb: 1.5 }}>\r\n {files.length} file{files.length !== 1 ? 's' : ''} uploaded\r\n </Typography>\r\n )}\r\n {files.length === 1 && !isMultiple ? (\r\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 2, width: '100%' }}>\r\n <InsertDriveFileIcon sx={{ fontSize: 40, color: formColors.primary }} />\r\n <Box sx={{ flexGrow: 1, minWidth: 0 }}>\r\n <Typography variant=\"body2\" sx={{ fontWeight: 500, overflow: 'hidden', textOverflow: 'ellipsis', maxWidth: isMobile ? '200px' : '300px' }}>\r\n {files[0] instanceof File\r\n ? files[0].name\r\n : ((files[0] as UploadedFile).originalName || (files[0] as UploadedFile).fileName)}\r\n </Typography>\r\n <Typography variant=\"caption\" sx={{ color: formColors.textSecondary }}>\r\n {formatFileSize((files[0] as any).size || 0)}\r\n </Typography>\r\n </Box>\r\n <Tooltip title=\"Remove file\" placement=\"bottom\" arrow>\r\n <IconButton\r\n size=\"small\"\r\n onClick={(e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n formField.onChange(null);\r\n const fileInput = document.getElementById(`file-input-${field.name}`) as HTMLInputElement;\r\n if (fileInput) {\r\n fileInput.value = '';\r\n }\r\n }}\r\n sx={{ color: formColors.error }}\r\n >\r\n <CloseIcon fontSize=\"small\" />\r\n </IconButton>\r\n </Tooltip>\r\n </Box>\r\n ) : (\r\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 1, width: '100%' }}>\r\n {files.map((file, index) => {\r\n const fileName = file instanceof File\r\n ? file.name\r\n : ((file as UploadedFile).originalName || (file as UploadedFile).fileName);\r\n return (\r\n <Box\r\n key={`${fileName}-${index}`}\r\n sx={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 1.5,\r\n p: 1,\r\n borderRadius: 1,\r\n backgroundColor: formColors.background,\r\n border: '1px solid',\r\n borderColor: formColors.divider,\r\n }}\r\n >\r\n <InsertDriveFileIcon sx={{ fontSize: 32, color: formColors.primary }} />\r\n <Box sx={{ flexGrow: 1, minWidth: 0 }}>\r\n <Typography variant=\"body2\" sx={{ fontWeight: 500, overflow: 'hidden', textOverflow: 'ellipsis' }}>\r\n {fileName}\r\n </Typography>\r\n <Typography variant=\"caption\" sx={{ color: formColors.textSecondary }}>\r\n {formatFileSize((file as any).size || 0)}\r\n </Typography>\r\n </Box>\r\n <Tooltip title=\"Remove file\" placement=\"bottom\" arrow>\r\n <IconButton\r\n size=\"small\"\r\n onClick={(e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n if (isMultiple) {\r\n const updatedFiles = files.filter((_, i) => i !== index);\r\n formField.onChange(updatedFiles.length > 0 ? updatedFiles : []);\r\n } else {\r\n formField.onChange(null);\r\n }\r\n }}\r\n sx={{ color: formColors.error }}\r\n >\r\n <CloseIcon fontSize=\"small\" />\r\n </IconButton>\r\n </Tooltip>\r\n </Box>\r\n );\r\n })}\r\n </Box>\r\n )}\r\n </Box>\r\n )}\r\n </Box>\r\n {errors[field.name] && (\r\n <Typography variant=\"caption\" sx={{ mt: 1, display: 'block', color: formColors.error }}>\r\n {errors[field.name]?.message as string}\r\n </Typography>\r\n )}\r\n </Box>\r\n );\r\n }}\r\n />\r\n );\r\n};\r\n","import { FormSchema, FormField } from '../types';\r\n\r\n/**\r\n * Get all fields from form schema (sections or legacy fields)\r\n */\r\nexport const getAllFields = (formSchema: FormSchema): FormField[] => {\r\n return formSchema.sections\r\n ? formSchema.sections.flatMap(section => section.fields)\r\n : (formSchema.fields || []);\r\n};\r\n\r\n/**\r\n * Normalize initial values to handle backward compatibility\r\n * - Single value -> array for multiple fields\r\n * - Array -> first element for single fields\r\n */\r\nexport const normalizeInitialValues = (\r\n values: Record<string, any>,\r\n formSchema: FormSchema\r\n): Record<string, any> => {\r\n if (!values) return values;\r\n\r\n const normalized: Record<string, any> = { ...values };\r\n const allFields = getAllFields(formSchema);\r\n\r\n allFields.forEach(field => {\r\n const fieldValue = normalized[field.name];\r\n\r\n // Handle select, formReference, and apiReference fields\r\n if (field.type === 'select' || field.type === 'formReference' || field.type === 'apiReference') {\r\n if (field.allowMultiple) {\r\n // Multiple selection: convert single value to array\r\n if (fieldValue !== null && fieldValue !== undefined && fieldValue !== '') {\r\n if (!Array.isArray(fieldValue)) {\r\n normalized[field.name] = [fieldValue];\r\n }\r\n } else {\r\n normalized[field.name] = [];\r\n }\r\n } else {\r\n // Single selection: convert array to first element\r\n if (Array.isArray(fieldValue) && fieldValue.length > 0) {\r\n normalized[field.name] = fieldValue[0];\r\n } else if (Array.isArray(fieldValue) && fieldValue.length === 0) {\r\n normalized[field.name] = '';\r\n }\r\n }\r\n }\r\n\r\n // Normalize file fields: convert single file to array if field allows multiple\r\n if (field.type === 'file') {\r\n if (field.allowMultiple) {\r\n if (fieldValue !== null && fieldValue !== undefined) {\r\n if (!Array.isArray(fieldValue)) {\r\n normalized[field.name] = [fieldValue];\r\n }\r\n } else {\r\n normalized[field.name] = [];\r\n }\r\n } else {\r\n // Single file: convert array to first element\r\n if (Array.isArray(fieldValue) && fieldValue.length > 0) {\r\n normalized[field.name] = fieldValue[0];\r\n } else if (Array.isArray(fieldValue) && fieldValue.length === 0) {\r\n normalized[field.name] = null;\r\n }\r\n }\r\n }\r\n });\r\n\r\n return normalized;\r\n};\r\n\r\n/**\r\n * Get default value for a field based on its type\r\n */\r\nexport const getDefaultValue = (field: FormField): any => {\r\n switch (field.type) {\r\n case 'checkbox':\r\n case 'toggle':\r\n return false;\r\n case 'datepicker':\r\n return null;\r\n case 'file':\r\n return field.allowMultiple ? [] : null;\r\n case 'select':\r\n case 'formReference':\r\n case 'apiReference':\r\n return field.allowMultiple ? [] : '';\r\n case 'text':\r\n case 'email':\r\n case 'number':\r\n case 'radio':\r\n case 'ckeditor':\r\n default:\r\n return '';\r\n }\r\n};\r\n\r\n/**\r\n * Transform form values based on field types.\r\n */\r\nexport const transformFormValues = (\r\n data: Record<string, any>,\r\n formSchema: FormSchema\r\n): Record<string, any> => {\r\n const allFields = getAllFields(formSchema);\r\n const fieldTypeMap = new Map<string, string>();\r\n allFields.forEach(field => {\r\n fieldTypeMap.set(field.name, field.type);\r\n });\r\n\r\n const transformedData: Record<string, any> = {};\r\n\r\n Object.keys(data).forEach(key => {\r\n const fieldType = fieldTypeMap.get(key);\r\n const value = data[key];\r\n\r\n if (value === null || value === undefined) {\r\n transformedData[key] = value;\r\n return;\r\n }\r\n\r\n switch (fieldType) {\r\n case 'number':\r\n if (value === '' || value === null || value === undefined) {\r\n transformedData[key] = null;\r\n } else {\r\n const numValue = Number(value);\r\n transformedData[key] = isNaN(numValue) ? value : numValue;\r\n }\r\n break;\r\n case 'checkbox':\r\n case 'toggle':\r\n transformedData[key] = Boolean(value);\r\n break;\r\n case 'datepicker':\r\n case 'file':\r\n default:\r\n transformedData[key] = value;\r\n }\r\n });\r\n\r\n return transformedData;\r\n};\r\n","import React, { useMemo, useEffect, useState, useCallback } from 'react';\r\nimport { Controller } from 'react-hook-form';\r\nimport { FieldRendererProps, OptionItem } from '../../types';\r\nimport { getDefaultValue } from '../../utils/formHelpers';\r\nimport { buildFieldRules } from '../../utils/fieldHelpers';\r\nimport { SimpleSelect, SimpleSelectOption } from '../common/SimpleSelect';\r\nimport {\r\n defaultFormReferenceService,\r\n defaultApiReferenceService,\r\n} from '../../services/defaultServices';\r\n\r\nexport const FormReferenceField = ({ field, control, defaultValue, rules, errors, services }: FieldRendererProps) => {\r\n const isMultiple = field.allowMultiple || false;\r\n const [options, setOptions] = useState<OptionItem[]>([]);\r\n const [isLoading, setIsLoading] = useState(false);\r\n\r\n const formReferenceService = services?.formReference || defaultFormReferenceService;\r\n\r\n const fetchOptions = useCallback(() => {\r\n if (!field.referenceFormName || !field.referenceFieldName) return;\r\n setIsLoading(true);\r\n formReferenceService\r\n .fetchOptions(field.referenceFormName, field.referenceFieldName)\r\n .then((opts: OptionItem[]) => {\r\n setOptions(opts);\r\n })\r\n .catch((error: any) => {\r\n console.error('Failed to fetch form reference options:', error);\r\n setOptions([]);\r\n })\r\n .finally(() => {\r\n setIsLoading(false);\r\n });\r\n }, [field.referenceFormName, field.referenceFieldName, formReferenceService]);\r\n\r\n useEffect(() => {\r\n fetchOptions();\r\n }, [fetchOptions]);\r\n\r\n // Convert OptionItem[] to SimpleSelectOption[]\r\n const selectOptions: SimpleSelectOption[] = useMemo(() => {\r\n return options.map((opt: OptionItem) => ({\r\n value: String(opt.value),\r\n label: opt.label,\r\n }));\r\n }, [options]);\r\n\r\n const fieldDefaultValue = defaultValue ?? getDefaultValue(field);\r\n const fieldRules = rules ?? buildFieldRules(field);\r\n const isDisabled = !field.referenceFormName || !field.referenceFieldName;\r\n\r\n return (\r\n <Controller\r\n key={field.name}\r\n name={field.name}\r\n control={control}\r\n defaultValue={fieldDefaultValue}\r\n rules={fieldRules}\r\n render={({ field: formField }) => {\r\n return (\r\n <SimpleSelect\r\n label={field.label}\r\n value={formField.value}\r\n onChange={(value: string | string[] | null) => {\r\n formField.onChange(value);\r\n }}\r\n options={selectOptions}\r\n placeholder={field.placeholder || 'Search and select...'}\r\n helperText={errors[field.name]?.message as string}\r\n fullWidth={true}\r\n size=\"small\"\r\n required={field.required}\r\n error={!!errors[field.name]}\r\n disabled={isDisabled || isLoading}\r\n multiple={isMultiple}\r\n isLoading={isLoading}\r\n refreshable={true}\r\n onRefresh={fetchOptions}\r\n />\r\n );\r\n }}\r\n />\r\n );\r\n};\r\n\r\nexport const ApiReferenceField = ({ field, control, defaultValue, rules, errors, services }: FieldRendererProps) => {\r\n const isMultiple = field.allowMultiple || false;\r\n const [options, setOptions] = useState<OptionItem[]>([]);\r\n const [isLoading, setIsLoading] = useState(false);\r\n\r\n const apiReferenceService = services?.apiReference || defaultApiReferenceService;\r\n\r\n const fetchOptions = useCallback(() => {\r\n if (!field.apiEndpoint || !field.apiLabelField) return;\r\n setIsLoading(true);\r\n apiReferenceService\r\n .fetchOptions(field.apiEndpoint, field.apiLabelField, field.apiValueField || '_id')\r\n .then((opts: OptionItem[]) => {\r\n setOptions(opts);\r\n })\r\n .catch((error: any) => {\r\n console.error('Failed to fetch API reference options:', error);\r\n setOptions([]);\r\n })\r\n .finally(() => {\r\n setIsLoading(false);\r\n });\r\n }, [field.apiEndpoint, field.apiLabelField, field.apiValueField, apiReferenceService]);\r\n\r\n useEffect(() => {\r\n fetchOptions();\r\n }, [fetchOptions]);\r\n\r\n // Convert OptionItem[] to SimpleSelectOption[]\r\n const selectOptions: SimpleSelectOption[] = useMemo(() => {\r\n return options.map((opt: OptionItem) => ({\r\n value: String(opt.value),\r\n label: opt.label,\r\n }));\r\n }, [options]);\r\n\r\n const fieldDefaultValue = defaultValue ?? getDefaultValue(field);\r\n const fieldRules = rules ?? buildFieldRules(field);\r\n const isDisabled = !field.apiEndpoint || !field.apiLabelField;\r\n\r\n return (\r\n <Controller\r\n key={field.name}\r\n name={field.name}\r\n control={control}\r\n defaultValue={fieldDefaultValue}\r\n rules={fieldRules}\r\n render={({ field: formField }) => {\r\n return (\r\n <SimpleSelect\r\n label={field.label}\r\n value={formField.value}\r\n onChange={(value: string | string[] | null) => {\r\n formField.onChange(value);\r\n }}\r\n options={selectOptions}\r\n placeholder={field.placeholder || 'Search and select...'}\r\n helperText={errors[field.name]?.message as string}\r\n fullWidth={true}\r\n size=\"small\"\r\n required={field.required}\r\n error={!!errors[field.name]}\r\n disabled={isDisabled || isLoading}\r\n multiple={isMultiple}\r\n isLoading={isLoading}\r\n refreshable={true}\r\n onRefresh={fetchOptions}\r\n />\r\n );\r\n }}\r\n />\r\n );\r\n};\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/fields/TextField.tsx","../src/utils/fieldHelpers.ts","../src/components/common/SimpleSelect.tsx","../src/components/fields/SelectField.tsx","../src/components/fields/CheckboxField.tsx","../src/components/fields/RadioField.tsx","../src/components/fields/ToggleField.tsx","../src/components/fields/ColorField.tsx","../src/components/fields/DatePickerField.tsx","../src/utils/useFormColors.ts","../src/services/defaultServices.ts","../src/utils/ckeditorLoader.ts","../src/hooks/useCKEditor.ts","../src/components/fields/CKEditorField.tsx","../src/components/fields/FileField.tsx","../src/utils/formHelpers.ts","../src/components/fields/ReferenceFields.tsx"],"names":["jsx","Controller","jsxs","FormControl","FormLabel","MuiTextField","useState","useId","MuiSelect","OutlinedInput","CircularProgress","InputAdornment","IconButton","RefreshIcon","Box","option","Chip","ListSubheader","TextField","MenuItem","FormHelperText","useMemo","FormControlLabel","Checkbox","RadioGroup","Radio","Switch","Typography","Fragment","LocalizationProvider","AdapterDayjs","DatePicker","dayjs","DateTimePicker","TimePicker","useTheme","error","useEffect","useRef","useWatch","useCallback","alpha","CKEditor","useMediaQuery","isUploading","CloudUploadIcon","InsertDriveFileIcon","Tooltip","CloseIcon"],"mappings":"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","file":"fields.js","sourcesContent":["import React from 'react';\r\nimport { Controller } from 'react-hook-form';\r\nimport { FormControl, FormLabel, TextField as MuiTextField } from '@mui/material';\r\nimport { FieldRendererProps } from '../../types';\r\n\r\nexport const TextField = ({ field, control, defaultValue, rules, errors }: FieldRendererProps) => {\r\n return (\r\n <Controller\r\n key={field.name}\r\n name={field.name}\r\n control={control}\r\n defaultValue={defaultValue}\r\n rules={rules}\r\n render={({ field: formField }) => (\r\n <FormControl\r\n fullWidth\r\n required={field.required}\r\n error={!!errors[field.name]}\r\n >\r\n <FormLabel> {field.label}</FormLabel>\r\n <MuiTextField\r\n {...formField}\r\n type={field.type === 'number' ? 'number' : field.type}\r\n placeholder={field.placeholder || 'Enter value'}\r\n fullWidth\r\n size=\"small\"\r\n required={field.required}\r\n error={!!errors[field.name]}\r\n helperText={errors[field.name]?.message as string}\r\n inputProps={\r\n field.type === 'number'\r\n ? {\r\n min: field.validation?.min,\r\n max: field.validation?.max,\r\n }\r\n : undefined\r\n }\r\n />\r\n </FormControl>\r\n )}\r\n />\r\n );\r\n};\r\n","import { FormField } from '../types';\r\n\r\n/**\r\n * Format file size in human-readable format\r\n */\r\nexport const formatFileSize = (bytes: number): string => {\r\n if (bytes === 0) return '0 Bytes';\r\n const k = 1024;\r\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n return Math.round(bytes / Math.pow(k, i) * 100) / 100 + ' ' + sizes[i];\r\n};\r\n\r\n/**\r\n * Validate file based on field configuration\r\n */\r\nexport const validateFile = (file: File, field: FormField): string | true => {\r\n // Check file type\r\n if (field.validation?.allowedFileTypes && field.validation.allowedFileTypes.length > 0) {\r\n const fileExtension = file.name.split('.').pop()?.toLowerCase();\r\n const allowedTypes = field.validation.allowedFileTypes.map(t => t.toLowerCase().replace('.', ''));\r\n if (!fileExtension || !allowedTypes.includes(fileExtension)) {\r\n return `File type not allowed. Allowed types: ${field.validation.allowedFileTypes.join(', ')}`;\r\n }\r\n }\r\n\r\n // Check file size\r\n if (field.validation?.maxFileSize) {\r\n if (file.size > field.validation.maxFileSize) {\r\n const maxSizeFormatted = formatFileSize(field.validation.maxFileSize);\r\n return `File size exceeds maximum allowed size of ${maxSizeFormatted}`;\r\n }\r\n }\r\n\r\n return true;\r\n};\r\n\r\n/**\r\n * Build validation rules for a field\r\n */\r\nexport const buildFieldRules = (field: FormField): any => {\r\n const rules: any = {};\r\n \r\n if (field.required) {\r\n rules.required = `${field.label} is required`;\r\n }\r\n\r\n // File validation rules\r\n if (field.type === 'file') {\r\n rules.validate = (value: any) => {\r\n if (field.required) {\r\n if (field.allowMultiple) {\r\n const files = Array.isArray(value) ? value : [];\r\n if (files.length === 0) {\r\n return `${field.label} is required`;\r\n }\r\n const hasValidFiles = files.some((file: any) => \r\n file && typeof file === 'object' && ('fileName' in file || 'fileUrl' in file)\r\n );\r\n if (!hasValidFiles) {\r\n return `${field.label} is required`;\r\n }\r\n } else {\r\n if (!value || (typeof value === 'object' && !('fileName' in value || 'fileUrl' in value))) {\r\n return `${field.label} is required`;\r\n }\r\n }\r\n }\r\n return true;\r\n };\r\n }\r\n\r\n // Multiple select validation\r\n if ((field.type === 'select' || field.type === 'formReference' || field.type === 'apiReference') && field.allowMultiple) {\r\n rules.validate = (value: string | string[] | null) => {\r\n const values = value as string[] | null;\r\n if (!values || values.length === 0) {\r\n if (field.required) {\r\n return `${field.label} is required`;\r\n }\r\n return true;\r\n }\r\n return true;\r\n };\r\n }\r\n\r\n return rules;\r\n};\r\n\r\n/**\r\n * Normalize options to OptionItem format\r\n */\r\nexport const normalizeOptions = (options?: FormField['options']): Array<{ label: string; value: string | number }> => {\r\n if (!options) return [];\r\n \r\n return options.map(opt => {\r\n if (typeof opt === 'string') {\r\n return { label: opt, value: opt };\r\n }\r\n return opt;\r\n });\r\n};\r\n","import React, { useState, useId } from 'react';\r\nimport {\r\n FormControl,\r\n FormLabel,\r\n Select as MuiSelect,\r\n MenuItem,\r\n FormHelperText,\r\n Chip,\r\n Box,\r\n OutlinedInput,\r\n CircularProgress,\r\n TextField,\r\n ListSubheader,\r\n InputAdornment,\r\n IconButton,\r\n} from '@mui/material';\r\nimport RefreshIcon from '@mui/icons-material/Refresh';\r\n\r\nexport interface SimpleSelectOption {\r\n value: string | number;\r\n label: string;\r\n}\r\n\r\nexport interface SimpleSelectProps {\r\n label: string;\r\n value: string | string[] | number | number[] | null | undefined;\r\n onChange: (value: string | string[] | null) => void;\r\n options: SimpleSelectOption[];\r\n placeholder?: string;\r\n helperText?: string;\r\n fullWidth?: boolean;\r\n size?: 'small' | 'medium';\r\n required?: boolean;\r\n error?: boolean;\r\n disabled?: boolean;\r\n multiple?: boolean;\r\n isLoading?: boolean;\r\n filterable?: boolean;\r\n filterPlaceholder?: string;\r\n refreshable?: boolean;\r\n onRefresh?: () => void;\r\n}\r\n\r\nexport const SimpleSelect: React.FC<SimpleSelectProps> = ({\r\n label,\r\n value,\r\n onChange,\r\n options,\r\n placeholder,\r\n helperText,\r\n fullWidth = true,\r\n size = 'small',\r\n required = false,\r\n error = false,\r\n disabled = false,\r\n multiple = false,\r\n isLoading = false,\r\n filterable = true,\r\n filterPlaceholder = 'Filter...',\r\n refreshable = false,\r\n onRefresh,\r\n}) => {\r\n const [filterText, setFilterText] = useState('');\r\n const selectId = useId();\r\n\r\n const handleChange = (event: any) => {\r\n const val = event.target.value;\r\n onChange(val);\r\n };\r\n\r\n const filteredOptions =\r\n filterable && filterText\r\n ? options.filter((opt) =>\r\n String(opt.label).toLowerCase().includes(filterText.toLowerCase())\r\n )\r\n : options;\r\n\r\n const handleFilterChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n setFilterText(e.target.value);\r\n };\r\n\r\n const handleClose = () => {\r\n setFilterText('');\r\n };\r\n\r\n return (\r\n <FormControl fullWidth={fullWidth} size={size} required={required} error={error} disabled={disabled}>\r\n <FormLabel\r\n component=\"label\"\r\n htmlFor={selectId}\r\n required={required}\r\n error={error}\r\n sx={{ mb: 0.5, display: 'block' }}\r\n >\r\n {label}\r\n </FormLabel>\r\n <MuiSelect\r\n id={selectId}\r\n value={value ?? (multiple ? [] : '')}\r\n onChange={handleChange}\r\n onClose={handleClose}\r\n input={<OutlinedInput />}\r\n MenuProps={{\r\n autoFocus: false,\r\n }}\r\n multiple={multiple}\r\n disabled={disabled || isLoading}\r\n endAdornment={\r\n isLoading ? (\r\n <CircularProgress size={20} />\r\n ) : refreshable && onRefresh ? (\r\n <InputAdornment position=\"end\" sx={{ mr: 2 }}>\r\n <IconButton\r\n size=\"small\"\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onRefresh();\r\n }}\r\n disabled={disabled}\r\n aria-label=\"Refresh options\"\r\n >\r\n <RefreshIcon fontSize=\"small\" />\r\n </IconButton>\r\n </InputAdornment>\r\n ) : undefined\r\n }\r\n renderValue={(selected) => {\r\n if (multiple) {\r\n const selectedValues = selected as (string | number)[];\r\n if (selectedValues.length === 0) {\r\n return <em>{placeholder || 'Select...'}</em>;\r\n }\r\n return (\r\n <Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 0.5 }}>\r\n {selectedValues.map((val) => {\r\n const option = options.find((opt) => opt.value === val);\r\n return (\r\n <Chip\r\n key={val}\r\n label={option?.label || val}\r\n size=\"small\"\r\n />\r\n );\r\n })}\r\n </Box>\r\n );\r\n }\r\n const option = options.find((opt) => opt.value === selected);\r\n return option?.label || selected || <em>{placeholder || 'Select...'}</em>;\r\n }}\r\n >\r\n {filterable && (\r\n <ListSubheader\r\n sx={{ py: 1 }}\r\n onMouseDown={(e) => e.stopPropagation()}\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <TextField\r\n size=\"small\"\r\n fullWidth\r\n placeholder={filterPlaceholder}\r\n value={filterText}\r\n onChange={handleFilterChange}\r\n variant=\"outlined\"\r\n sx={{ mt: -0.5 }}\r\n autoFocus\r\n />\r\n </ListSubheader>\r\n )}\r\n {filteredOptions.map((option) => (\r\n <MenuItem key={option.value} value={option.value}>\r\n {option.label}\r\n </MenuItem>\r\n ))}\r\n </MuiSelect>\r\n {helperText && <FormHelperText>{helperText}</FormHelperText>}\r\n </FormControl>\r\n );\r\n};\r\n","import React, { useMemo } from 'react';\r\nimport { Controller } from 'react-hook-form';\r\nimport { FieldRendererProps } from '../../types';\r\nimport { normalizeOptions } from '../../utils/fieldHelpers';\r\nimport { SimpleSelect, SimpleSelectOption } from '../common/SimpleSelect';\r\n\r\nexport const SelectField = ({ field, control, defaultValue, rules, errors }: FieldRendererProps) => {\r\n const isMultiple = field.allowMultiple || false;\r\n const normalizedOptions = normalizeOptions(field.options);\r\n\r\n // Convert to SimpleSelectOption format\r\n const selectOptions: SimpleSelectOption[] = useMemo(() => {\r\n return normalizedOptions.map((opt) => ({\r\n value: String(opt.value),\r\n label: opt.label,\r\n }));\r\n }, [normalizedOptions]);\r\n\r\n return (\r\n <Controller\r\n key={field.name}\r\n name={field.name}\r\n control={control}\r\n defaultValue={defaultValue}\r\n rules={rules}\r\n render={({ field: formField }) => {\r\n return (\r\n <SimpleSelect\r\n label={field.label}\r\n value={formField.value}\r\n onChange={(value: string | string[] | null) => {\r\n formField.onChange(value);\r\n }}\r\n options={selectOptions}\r\n placeholder={field.placeholder || 'Select...'}\r\n helperText={errors[field.name]?.message as string}\r\n fullWidth={true}\r\n size=\"small\"\r\n required={field.required}\r\n error={!!errors[field.name]}\r\n disabled={false}\r\n multiple={isMultiple}\r\n />\r\n );\r\n }}\r\n />\r\n );\r\n};\r\n","import React from 'react';\r\nimport { Controller } from 'react-hook-form';\r\nimport { FormControlLabel, Checkbox } from '@mui/material';\r\nimport { FieldRendererProps } from '../../types';\r\n\r\nexport const CheckboxField = ({ field, control, defaultValue, rules }: FieldRendererProps) => {\r\n return (\r\n <Controller\r\n key={field.name}\r\n name={field.name}\r\n control={control}\r\n defaultValue={defaultValue}\r\n rules={rules}\r\n render={({ field: formField }) => (\r\n <FormControlLabel\r\n control={\r\n <Checkbox\r\n {...formField}\r\n checked={formField.value || false}\r\n size=\"small\"\r\n />\r\n }\r\n label={field.label}\r\n />\r\n )}\r\n />\r\n );\r\n};\r\n","import React from 'react';\r\nimport { Controller } from 'react-hook-form';\r\nimport { FormControl, FormLabel, RadioGroup, FormControlLabel, Radio } from '@mui/material';\r\nimport { FieldRendererProps, OptionItem } from '../../types';\r\nimport { normalizeOptions } from '../../utils/fieldHelpers';\r\n\r\nexport const RadioField = ({ field, control, defaultValue, rules, errors }: FieldRendererProps) => {\r\n const normalizedOptions = normalizeOptions(field.options);\r\n \r\n return (\r\n <Controller\r\n key={field.name}\r\n name={field.name}\r\n control={control}\r\n defaultValue={defaultValue}\r\n rules={rules}\r\n render={({ field: formField }) => (\r\n <FormControl component=\"fieldset\" required={field.required} error={!!errors[field.name]}>\r\n <FormLabel required={field.required} error={!!errors[field.name]}>\r\n {field.label}\r\n </FormLabel>\r\n\r\n <RadioGroup {...formField} row>\r\n {normalizedOptions.map((option, index) => (\r\n <FormControlLabel\r\n key={index}\r\n value={option.value}\r\n control={<Radio size=\"small\" />}\r\n label={option.label}\r\n />\r\n ))}\r\n </RadioGroup>\r\n </FormControl>\r\n )}\r\n />\r\n );\r\n};\r\n","import React from 'react';\r\nimport { Controller } from 'react-hook-form';\r\nimport { FormControlLabel, Switch, Box, Typography } from '@mui/material';\r\nimport { FieldRendererProps } from '../../types';\r\n\r\nexport const ToggleField = ({ field, control, defaultValue, rules, errors }: FieldRendererProps) => {\r\n return (\r\n <Controller\r\n key={field.name}\r\n name={field.name}\r\n control={control}\r\n defaultValue={defaultValue}\r\n rules={rules}\r\n render={({ field: formField }) => (\r\n <FormControlLabel\r\n control={\r\n <Switch\r\n {...formField}\r\n checked={formField.value || false}\r\n size=\"medium\"\r\n />\r\n }\r\n label={\r\n <Box>\r\n <Typography variant=\"body2\">\r\n {field.label} {field.required && '*'}\r\n </Typography>\r\n {errors[field.name] && (\r\n <Typography variant=\"caption\" color=\"error\" sx={{ display: 'block', mt: 0.5 }}>\r\n {errors[field.name]?.message as string}\r\n </Typography>\r\n )}\r\n </Box>\r\n }\r\n />\r\n )}\r\n />\r\n );\r\n};\r\n","import React from 'react';\r\nimport { Controller } from 'react-hook-form';\r\nimport { Box, Typography, FormLabel } from '@mui/material';\r\nimport { FieldRendererProps } from '../../types';\r\n\r\nexport const ColorField = ({ field, control, defaultValue, rules, errors }: FieldRendererProps) => {\r\n return (\r\n <Controller\r\n key={field.name}\r\n name={field.name}\r\n control={control}\r\n defaultValue={defaultValue}\r\n rules={rules}\r\n render={({ field: formField }) => {\r\n const inputId = `color-field-${field.name}`;\r\n return (\r\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 2, width: '100%' }}>\r\n <FormLabel\r\n component=\"label\"\r\n htmlFor={inputId}\r\n required={field.required}\r\n error={!!errors[field.name]}\r\n >\r\n {field.label}\r\n </FormLabel>\r\n <Box sx={{ display: 'flex', flexDirection: 'column', flex: 1, maxWidth: 200 }}>\r\n <Box\r\n component=\"input\"\r\n type=\"color\"\r\n id={inputId}\r\n ref={formField.ref}\r\n name={formField.name}\r\n value={formField.value ?? '#000000'}\r\n onChange={formField.onChange}\r\n onBlur={formField.onBlur}\r\n sx={{\r\n width: 30,\r\n height: 30,\r\n padding: 0,\r\n cursor: 'pointer',\r\n backgroundColor: 'transparent',\r\n border: 'none',\r\n '&::-webkit-color-swatch-wrapper': { padding: 0 },\r\n '&::-webkit-color-swatch': { border: 'none', borderRadius: '4px' },\r\n '&::-moz-color-swatch': { border: 'none', borderRadius: '4px' },\r\n }}\r\n />\r\n {errors[field.name] && (\r\n <Typography variant=\"caption\" color=\"error\" sx={{ mt: 0.5 }}>\r\n {errors[field.name]?.message as string}\r\n </Typography>\r\n )}\r\n </Box>\r\n </Box>\r\n );\r\n }}\r\n />\r\n );\r\n};\r\n","import React from 'react';\r\nimport { Controller } from 'react-hook-form';\r\nimport { DatePicker } from '@mui/x-date-pickers/DatePicker';\r\nimport { DateTimePicker } from '@mui/x-date-pickers/DateTimePicker';\r\nimport { TimePicker } from '@mui/x-date-pickers/TimePicker';\r\nimport { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';\r\nimport { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';\r\nimport dayjs, { Dayjs } from 'dayjs';\r\nimport { FieldRendererProps } from '../../types';\r\nimport { FormLabel } from '@mui/material';\r\n\r\nconst textFieldSlotProps = (field: FieldRendererProps['field'], errors: FieldRendererProps['errors']) => ({\r\n fullWidth: true,\r\n size: 'small' as const,\r\n required: field.required,\r\n error: !!errors[field.name],\r\n helperText: errors[field.name]?.message as string,\r\n});\r\n\r\nfunction resolveDatePickerMode(field: FieldRendererProps['field']): 'date' | 'datetime' | 'time' {\r\n if (field.datePickerMode) return field.datePickerMode;\r\n return field?.displayTime ? 'datetime' : 'date';\r\n}\r\n\r\nexport const DateTimePickerField = ({ field, control, defaultValue, rules, errors }: FieldRendererProps) => {\r\n const mode = resolveDatePickerMode(field);\r\n\r\n return (\r\n <Controller\r\n key={field.name}\r\n name={field.name}\r\n control={control}\r\n defaultValue={defaultValue}\r\n rules={rules}\r\n render={({ field: formField }) => (\r\n <>\r\n <FormLabel\r\n required={field.required}\r\n error={!!errors[field.name]}\r\n >\r\n {field.label}\r\n </FormLabel>\r\n <LocalizationProvider dateAdapter={AdapterDayjs}>\r\n {mode === 'date' && (\r\n <DatePicker\r\n format=\"DD-MM-YYYY\"\r\n value={formField.value ? dayjs(formField.value) : null}\r\n onChange={(date: Dayjs | null) => formField.onChange(date?.toISOString() ?? null)}\r\n slotProps={{ textField: textFieldSlotProps(field, errors) }}\r\n />\r\n )}\r\n {mode === 'datetime' && (\r\n <DateTimePicker\r\n format=\"DD-MM-YYYY hh:mm A\"\r\n value={formField.value ? dayjs(formField.value) : null}\r\n onChange={(date: Dayjs | null) => formField.onChange(date?.toISOString() ?? null)}\r\n slotProps={{ textField: textFieldSlotProps(field, errors) }}\r\n />\r\n )}\r\n {mode === 'time' && (\r\n <TimePicker\r\n format=\"hh:mm A\"\r\n value={formField.value ? dayjs(formField.value) : null}\r\n onChange={(date: Dayjs | null) => formField.onChange(date?.toISOString() ?? null)}\r\n slotProps={{ textField: textFieldSlotProps(field, errors) }}\r\n />\r\n )}\r\n </LocalizationProvider>\r\n </>\r\n )}\r\n />\r\n );\r\n};\r\n","import { useTheme } from '@mui/material';\r\nimport { FormColors } from '../types';\r\n\r\n/**\r\n * Hook to get form colors - uses custom colors if provided, otherwise falls back to Material-UI theme\r\n */\r\nexport const useFormColors = (customColors?: FormColors) => {\r\n const theme = useTheme();\r\n\r\n return {\r\n primary: customColors?.primary || theme.palette.primary.main,\r\n secondary: customColors?.secondary || theme.palette.secondary.main,\r\n error: customColors?.error || theme.palette.error.main,\r\n success: customColors?.success || theme.palette.success.main,\r\n warning: customColors?.warning || theme.palette.warning.main,\r\n info: customColors?.info || theme.palette.info.main,\r\n textPrimary: customColors?.textPrimary || theme.palette.text.primary,\r\n textSecondary: customColors?.textSecondary || theme.palette.text.secondary,\r\n divider: customColors?.divider || theme.palette.divider,\r\n background: customColors?.background || theme.palette.background.default,\r\n backgroundPaper: customColors?.backgroundPaper || theme.palette.background.paper,\r\n };\r\n};\r\n","/**\r\n * Default service implementations\r\n * These are fallback implementations that can be overridden\r\n */\r\n\r\nimport {\r\n FileUploadService,\r\n FormReferenceService,\r\n ApiReferenceService,\r\n DateFormatterService,\r\n OptionItem,\r\n UploadedFile,\r\n} from '../types';\r\nimport dayjs from 'dayjs';\r\n\r\n/**\r\n * Default file upload service - throws error, must be provided\r\n */\r\nexport const defaultFileUploadService: FileUploadService = {\r\n uploadFiles: async () => {\r\n throw new Error('File upload service not provided. Please provide a fileUpload service in FormServices.');\r\n },\r\n};\r\n\r\n/**\r\n * Default form reference service - throws error, must be provided\r\n */\r\nexport const defaultFormReferenceService: FormReferenceService = {\r\n fetchOptions: async () => {\r\n throw new Error('Form reference service not provided. Please provide a formReference service in FormServices.');\r\n },\r\n};\r\n\r\n/**\r\n * Default API reference service - throws error, must be provided\r\n */\r\nexport const defaultApiReferenceService: ApiReferenceService = {\r\n fetchOptions: async () => {\r\n throw new Error('API reference service not provided. Please provide an apiReference service in FormServices.');\r\n },\r\n};\r\n\r\n/**\r\n * Default date formatter service\r\n */\r\nexport const defaultDateFormatterService: DateFormatterService = {\r\n format: (value: any, options?: { datePickerMode?: 'date' | 'datetime' | 'time' }) => {\r\n if (!value) return '—';\r\n \r\n const mode = options?.datePickerMode || 'date';\r\n const date = dayjs(value);\r\n \r\n if (!date.isValid()) return String(value);\r\n \r\n switch (mode) {\r\n case 'date':\r\n return date.format('DD/MM/YYYY');\r\n case 'time':\r\n return date.format('hh:mm A');\r\n case 'datetime':\r\n return date.format('DD/MM/YYYY hh:mm A');\r\n default:\r\n return date.format('DD/MM/YYYY');\r\n }\r\n },\r\n};\r\n","/**\r\n * CKEditor Loader Utility\r\n * \r\n * This utility helps load CKEditor from the lib/ckeditor/ckeditor.js file\r\n * and provides a way to check if CKEditor is available.\r\n */\r\n\r\n/**\r\n * Load CKEditor script dynamically\r\n * @param scriptPath - Path to ckeditor.js file (default: '/lib/ckeditor/ckeditor.js')\r\n * @returns Promise that resolves when CKEditor is loaded\r\n */\r\nexport const loadCKEditor = (scriptPath: string = '/lib/ckeditor/ckeditor.js'): Promise<void> => {\r\n return new Promise((resolve, reject) => {\r\n // Check if already loaded\r\n if (window.ClassicEditor) {\r\n resolve();\r\n return;\r\n }\r\n\r\n // Check if script is already being loaded\r\n const existingScript = document.querySelector(`script[src=\"${scriptPath}\"]`);\r\n if (existingScript) {\r\n // Wait for it to load\r\n existingScript.addEventListener('load', () => {\r\n if (window.ClassicEditor) {\r\n resolve();\r\n } else {\r\n reject(new Error('CKEditor script loaded but ClassicEditor not found on window'));\r\n }\r\n });\r\n existingScript.addEventListener('error', () => {\r\n reject(new Error('Failed to load CKEditor script'));\r\n });\r\n return;\r\n }\r\n\r\n // Create and load script\r\n const script = document.createElement('script');\r\n script.src = scriptPath;\r\n script.async = true;\r\n \r\n script.onload = () => {\r\n // Wait a bit for ClassicEditor to be available\r\n const checkInterval = setInterval(() => {\r\n if (window.ClassicEditor) {\r\n clearInterval(checkInterval);\r\n resolve();\r\n }\r\n }, 100);\r\n\r\n // Timeout after 10 seconds\r\n setTimeout(() => {\r\n clearInterval(checkInterval);\r\n if (!window.ClassicEditor) {\r\n reject(\r\n new Error(\r\n 'CKEditor script loaded but ClassicEditor was not found on window. ' +\r\n 'Ensure you are using the package-provided build from lib/ckeditor/ckeditor.js (see CKEDITOR_SETUP.md).'\r\n )\r\n );\r\n }\r\n }, 10000);\r\n };\r\n\r\n script.onerror = () => {\r\n reject(\r\n new Error(\r\n `Failed to load CKEditor from ${scriptPath}. ` +\r\n 'Ensure the file exists at that URL (e.g. copy from node_modules/@aatulwork/customform-renderer/lib/ckeditor/ckeditor.js to public/lib/ckeditor/ckeditor.js) or set services.ckEditorScriptPath to a working URL.'\r\n )\r\n );\r\n };\r\n\r\n document.head.appendChild(script);\r\n });\r\n};\r\n\r\n/**\r\n * Check if CKEditor is available\r\n * @returns true if ClassicEditor is available on window\r\n */\r\nexport const isCKEditorAvailable = (): boolean => {\r\n return typeof window !== 'undefined' && typeof window.ClassicEditor !== 'undefined';\r\n};\r\n\r\n/**\r\n * Wait for CKEditor to be available\r\n * @param timeout - Maximum time to wait in milliseconds (default: 10000)\r\n * @returns Promise that resolves when CKEditor is available\r\n */\r\nexport const waitForCKEditor = (timeout: number = 10000): Promise<void> => {\r\n return new Promise((resolve, reject) => {\r\n if (isCKEditorAvailable()) {\r\n resolve();\r\n return;\r\n }\r\n\r\n const startTime = Date.now();\r\n const checkInterval = setInterval(() => {\r\n if (isCKEditorAvailable()) {\r\n clearInterval(checkInterval);\r\n resolve();\r\n } else if (Date.now() - startTime > timeout) {\r\n clearInterval(checkInterval);\r\n reject(new Error('CKEditor not available after timeout'));\r\n }\r\n }, 100);\r\n });\r\n};\r\n","import { useState, useEffect } from 'react';\r\nimport { isCKEditorAvailable, waitForCKEditor, loadCKEditor } from '../utils/ckeditorLoader';\r\n\r\ninterface UseCKEditorOptions {\r\n /**\r\n * Path to CKEditor script (default: '/lib/ckeditor/ckeditor.js')\r\n */\r\n scriptPath?: string;\r\n /**\r\n * Auto-load CKEditor if not available (default: true)\r\n */\r\n autoLoad?: boolean;\r\n /**\r\n * Timeout for waiting for CKEditor (default: 10000ms)\r\n */\r\n timeout?: number;\r\n}\r\n\r\ninterface UseCKEditorReturn {\r\n /**\r\n * Whether CKEditor is ready\r\n */\r\n isReady: boolean;\r\n /**\r\n * Loading state\r\n */\r\n isLoading: boolean;\r\n /**\r\n * Error if loading failed\r\n */\r\n error: Error | null;\r\n /**\r\n * Manually trigger loading\r\n */\r\n load: () => Promise<void>;\r\n}\r\n\r\n/**\r\n * React hook for loading and checking CKEditor availability\r\n * \r\n * @example\r\n * ```tsx\r\n * const { isReady, isLoading, error } = useCKEditor();\r\n * \r\n * if (!isReady) {\r\n * return <div>Loading CKEditor...</div>;\r\n * }\r\n * ```\r\n */\r\nexport const useCKEditor = (options: UseCKEditorOptions = {}): UseCKEditorReturn => {\r\n const {\r\n scriptPath = '/lib/ckeditor/ckeditor.js',\r\n autoLoad = true,\r\n timeout = 10000,\r\n } = options;\r\n\r\n const [isReady, setIsReady] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<Error | null>(null);\r\n\r\n const load = async () => {\r\n if (isCKEditorAvailable()) {\r\n setIsReady(true);\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n setIsLoading(true);\r\n setError(null);\r\n\r\n try {\r\n await loadCKEditor(scriptPath);\r\n setIsReady(true);\r\n } catch (err) {\r\n const error = err instanceof Error ? err : new Error('Failed to load CKEditor');\r\n setError(error);\r\n setIsReady(false);\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n // Check if already available\r\n if (isCKEditorAvailable()) {\r\n setIsReady(true);\r\n return;\r\n }\r\n\r\n // Auto-load if enabled\r\n if (autoLoad) {\r\n load();\r\n } else {\r\n // Just wait for it to become available\r\n waitForCKEditor(timeout)\r\n .then(() => setIsReady(true))\r\n .catch((err) => setError(err instanceof Error ? err : new Error('CKEditor not available')));\r\n }\r\n }, [scriptPath, autoLoad, timeout]);\r\n\r\n return {\r\n isReady,\r\n isLoading,\r\n error,\r\n load,\r\n };\r\n};\r\n","import React, { useState, useEffect, useRef, useCallback } from 'react';\r\nimport { Controller, useWatch } from 'react-hook-form';\r\nimport { Box, FormHelperText, useTheme, alpha, FormLabel } from '@mui/material';\r\nimport { useFormColors } from '../../utils/useFormColors';\r\nimport { CKEditor } from '@ckeditor/ckeditor5-react';\r\nimport { FieldRendererProps } from './../../types';\r\nimport {\r\n defaultFileUploadService,\r\n} from '../../services/defaultServices';\r\nimport { useCKEditor } from '../../hooks/useCKEditor';\r\n\r\n// Declare ClassicEditor on window\r\ndeclare global {\r\n interface Window {\r\n ClassicEditor: any;\r\n }\r\n}\r\n\r\nexport const CKEditorField = ({ field, control, defaultValue, rules, errors, setValue, formSchema, services, colors }: FieldRendererProps) => {\r\n const theme = useTheme();\r\n const formColors = useFormColors(colors);\r\n const editorContainerRef = useRef<HTMLDivElement>(null);\r\n const editorInstanceRef = useRef<any>(null);\r\n const isUserTypingRef = useRef<boolean>(false);\r\n \r\n const fileUploadService = services?.fileUpload || defaultFileUploadService;\r\n const fileBaseUrl = services?.fileBaseUrl || '';\r\n const licenseKey = services?.ckEditorLicenseKey || 'GPL';\r\n const ckEditorScriptPath = services?.ckEditorScriptPath || '/lib/ckeditor/ckeditor.js';\r\n\r\n // Use CKEditor hook to load and check availability\r\n const { isReady: isCKEditorReady, isLoading: isCKEditorLoading, error: ckEditorError } = useCKEditor({\r\n scriptPath: ckEditorScriptPath,\r\n autoLoad: true,\r\n });\r\n\r\n // Watch the field value to sync CKEditor when form resets\r\n const watchedValue = useWatch({\r\n control,\r\n name: field.name,\r\n defaultValue: defaultValue || '',\r\n });\r\n\r\n // Sync CKEditor content when watched value changes externally (e.g., after form reset)\r\n // Skip sync if the change came from user typing (handled by onChange)\r\n useEffect(() => {\r\n if (editorInstanceRef.current && isCKEditorReady && !isUserTypingRef.current) {\r\n const currentEditorData = editorInstanceRef.current.getData();\r\n const formValue = watchedValue || '';\r\n \r\n // Only update if the values differ (handles form reset scenarios)\r\n if (currentEditorData !== formValue) {\r\n editorInstanceRef.current.setData(formValue);\r\n }\r\n }\r\n // Reset the typing flag after sync check\r\n isUserTypingRef.current = false;\r\n }, [watchedValue, isCKEditorReady]);\r\n\r\n // Custom upload adapter that uses fileUploadService\r\n const createCustomUploadAdapter = useCallback((loader: any) => {\r\n return {\r\n upload: async () => {\r\n if (!formSchema?.name) {\r\n throw new Error('Form schema name is required for image uploads');\r\n }\r\n\r\n try {\r\n const file = await loader.file;\r\n\r\n if (!file) {\r\n throw new Error('No file provided');\r\n }\r\n\r\n // Validate file type (images only)\r\n if (!file.type.startsWith('image/')) {\r\n throw new Error('Only image files are allowed');\r\n }\r\n\r\n const uploadedFiles = await fileUploadService.uploadFiles(\r\n formSchema.name,\r\n field.name,\r\n [file]\r\n );\r\n\r\n if (uploadedFiles && uploadedFiles.length > 0 && uploadedFiles[0].fileUrl) {\r\n const fileUrl = uploadedFiles[0].fileUrl;\r\n const isFullUrl = fileUrl.startsWith('http://') || fileUrl.startsWith('https://');\r\n const url = isFullUrl ? fileUrl : fileBaseUrl + fileUrl;\r\n return {\r\n default: url\r\n };\r\n }\r\n\r\n throw new Error('Upload failed: No file URL returned');\r\n } catch (error: any) {\r\n console.error('Upload error:', error);\r\n const errorMessage = error.response?.data?.message || error.message || 'Upload failed';\r\n throw new Error(errorMessage);\r\n }\r\n },\r\n abort: () => {\r\n console.log('Upload aborted');\r\n }\r\n };\r\n }, [formSchema?.name, field.name, fileUploadService, fileBaseUrl]);\r\n\r\n // Show loading or error state\r\n if (isCKEditorLoading) {\r\n return (\r\n <Box>\r\n <FormLabel required={field.required} error={!!errors[field.name]}>\r\n {field.label}\r\n </FormLabel>\r\n <Box sx={{ p: 2, textAlign: 'center', color: formColors.textSecondary }}>\r\n Loading editor...\r\n </Box>\r\n </Box>\r\n );\r\n }\r\n\r\n if (ckEditorError || !isCKEditorReady) {\r\n const message =\r\n ckEditorError?.message ||\r\n `CKEditor failed to load. Script path: ${ckEditorScriptPath}. Copy ckeditor.js to public/lib/ckeditor/ or set services.ckEditorScriptPath. See CKEDITOR_SETUP.md.`;\r\n return (\r\n <Box>\r\n <FormLabel required={field.required} error={!!errors[field.name]}>\r\n {field.label}\r\n </FormLabel>\r\n <Box sx={{ p: 2, border: '1px solid', borderColor: formColors.error, borderRadius: 1 }}>\r\n <FormHelperText error>{message}</FormHelperText>\r\n </Box>\r\n </Box>\r\n );\r\n }\r\n\r\n return (\r\n <Controller\r\n key={field.name}\r\n name={field.name}\r\n control={control}\r\n defaultValue={defaultValue || ''}\r\n rules={rules}\r\n render={({ field: formField }) => (\r\n <Box>\r\n <FormLabel\r\n required={field.required}\r\n error={!!errors[field.name]}\r\n >\r\n {field.label}\r\n </FormLabel>\r\n <Box\r\n ref={editorContainerRef}\r\n sx={{\r\n '& .ck-editor': {\r\n borderRadius: '4px',\r\n '& .ck-toolbar': {\r\n width: '100%',\r\n maxWidth: '100%',\r\n overflow: 'visible',\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n '& .ck-toolbar__items': {\r\n display: 'flex',\r\n flexWrap: 'wrap !important',\r\n width: '100%',\r\n maxWidth: '100%',\r\n '& > *': {\r\n flexShrink: 0,\r\n },\r\n },\r\n },\r\n '& .ck-editor__editable': {\r\n minHeight: '100px'\r\n },\r\n '&:hover': {\r\n borderColor: errors[field.name]\r\n ? formColors.error\r\n : theme.palette.mode === 'dark' ? 'rgba(255, 255, 255, 0.87)' : formColors.primary\r\n },\r\n '& .ck-focused': {\r\n border: errors[field.name]\r\n ? `1px solid ${formColors.error} !important`\r\n : `1px solid ${theme.palette.mode === 'dark' ? 'rgba(255, 255, 255, 0.23)' : formColors.primary} !important`,\r\n boxShadow: errors[field.name]\r\n ? `0 0 0 1px ${formColors.error}`\r\n : `0 0 0 1px ${alpha(formColors.primary, 0.5)} !important`\r\n }\r\n }\r\n }}\r\n >\r\n {window.ClassicEditor && isCKEditorReady && (\r\n <CKEditor\r\n editor={window.ClassicEditor}\r\n config={{\r\n licenseKey: licenseKey,\r\n initialData: formField.value || '',\r\n } as any}\r\n data={formField.value || ''}\r\n onReady={(editor) => {\r\n editorInstanceRef.current = editor;\r\n \r\n // Set up custom upload adapter via FileRepository\r\n if (formSchema?.name) {\r\n try {\r\n const fileRepository = editor.plugins.get('FileRepository');\r\n if (fileRepository) {\r\n fileRepository.createUploadAdapter = (loader: any) => {\r\n return createCustomUploadAdapter(loader);\r\n };\r\n } else {\r\n console.warn('FileRepository plugin not found');\r\n }\r\n } catch (error) {\r\n console.error('Error setting up upload adapter:', error);\r\n }\r\n } else {\r\n console.warn('Form schema name not available, upload adapter not set');\r\n }\r\n\r\n // Set initial value if provided\r\n if (defaultValue && !formField.value) {\r\n editor.setData(defaultValue);\r\n setValue?.(field.name, defaultValue);\r\n }\r\n }}\r\n onChange={(_event, editor) => {\r\n const data = editor.getData();\r\n isUserTypingRef.current = true; // Mark that user is typing\r\n formField.onChange(data);\r\n }}\r\n onBlur={() => {\r\n formField.onBlur();\r\n }}\r\n />\r\n )}\r\n </Box>\r\n {errors[field.name] && (\r\n <FormHelperText error sx={{ mt: 0.5, mx: 0 }}>\r\n {errors[field.name]?.message as string}\r\n </FormHelperText>\r\n )}\r\n </Box>\r\n )}\r\n />\r\n );\r\n};\r\n","import React from 'react';\r\nimport { Controller } from 'react-hook-form';\r\nimport {\r\n Box,\r\n Typography,\r\n IconButton,\r\n CircularProgress,\r\n Tooltip,\r\n FormLabel,\r\n useTheme,\r\n useMediaQuery,\r\n} from '@mui/material';\r\nimport CloseIcon from '@mui/icons-material/Close';\r\nimport CloudUploadIcon from '@mui/icons-material/CloudUpload';\r\nimport InsertDriveFileIcon from '@mui/icons-material/InsertDriveFile';\r\nimport { FieldRendererProps, UploadedFile } from '../../types';\r\nimport { validateFile, formatFileSize } from '../../utils/fieldHelpers';\r\nimport { useFormColors } from '../../utils/useFormColors';\r\nimport {\r\n defaultFileUploadService,\r\n} from '../../services/defaultServices';\r\n\r\ninterface FileFieldProps extends FieldRendererProps {\r\n uploadingFiles?: Record<string, boolean>;\r\n setUploadingFiles?: React.Dispatch<React.SetStateAction<Record<string, boolean>>>;\r\n setError?: (name: string, error: { type: string; message: string }) => void;\r\n clearErrors?: (name?: string) => void;\r\n}\r\n\r\nexport const FileField = ({\r\n field,\r\n control,\r\n defaultValue,\r\n rules,\r\n errors,\r\n formSchema,\r\n uploadingFiles = {},\r\n setUploadingFiles,\r\n setError,\r\n clearErrors,\r\n services,\r\n colors,\r\n}: FileFieldProps) => {\r\n const theme = useTheme();\r\n const isMobile = useMediaQuery(theme.breakpoints.down('md'));\r\n const formColors = useFormColors(colors);\r\n const acceptTypes = field.validation?.allowedFileTypes\r\n ? field.validation.allowedFileTypes.map((type: string) => `.${type.replace('.', '')}`).join(',')\r\n : undefined;\r\n const isMultiple = field.allowMultiple || false;\r\n\r\n const fileUploadService = services?.fileUpload || defaultFileUploadService;\r\n\r\n return (\r\n <Controller\r\n key={field.name}\r\n name={field.name}\r\n control={control}\r\n defaultValue={defaultValue}\r\n rules={rules}\r\n render={({ field: formField }) => {\r\n const isUploading = uploadingFiles[field.name] || false;\r\n let files: (File | UploadedFile)[] = [];\r\n\r\n if (isMultiple) {\r\n files = Array.isArray(formField.value) ? formField.value : [];\r\n } else {\r\n files = formField.value ? [formField.value] : [];\r\n }\r\n\r\n const hasFiles = files.length > 0;\r\n\r\n return (\r\n <Box>\r\n <FormLabel\r\n required={field.required}\r\n error={!!errors[field.name]}\r\n >\r\n {field.label}\r\n </FormLabel>\r\n <Box\r\n component=\"label\"\r\n htmlFor={`file-input-${field.name}`}\r\n sx={{\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n border: '1px dashed',\r\n borderColor: errors[field.name] ? formColors.error : (isUploading ? formColors.primary : hasFiles ? formColors.primary : formColors.divider),\r\n p: 1,\r\n cursor: isUploading ? 'wait' : 'pointer',\r\n transition: 'all 0.2s ease-in-out',\r\n backgroundColor: (isUploading || hasFiles) ? 'action.hover' : formColors.backgroundPaper,\r\n opacity: isUploading ? 0.7 : 1,\r\n pointerEvents: isUploading ? 'none' : 'auto',\r\n '&:hover': {\r\n borderColor: isUploading ? formColors.primary : formColors.primary,\r\n backgroundColor: 'action.hover',\r\n },\r\n }}\r\n >\r\n <input\r\n id={`file-input-${field.name}`}\r\n type=\"file\"\r\n hidden\r\n multiple={isMultiple}\r\n accept={acceptTypes}\r\n onChange={async (e) => {\r\n const fileList = e.target.files;\r\n if (!fileList || fileList.length === 0) return;\r\n\r\n const newFiles = Array.from(fileList);\r\n const isUploading = uploadingFiles[field.name] || false;\r\n\r\n if (isUploading) {\r\n e.target.value = '';\r\n return;\r\n }\r\n\r\n for (const file of newFiles) {\r\n const validationResult = validateFile(file, field);\r\n if (validationResult !== true) {\r\n setError?.(field.name, {\r\n type: 'manual',\r\n message: validationResult as string,\r\n });\r\n e.target.value = '';\r\n return;\r\n }\r\n }\r\n\r\n try {\r\n setUploadingFiles?.((prev) => ({ ...prev, [field.name]: true }));\r\n clearErrors?.(field.name);\r\n\r\n if (!formSchema?.name) {\r\n throw new Error('Form schema name is required for file uploads');\r\n }\r\n\r\n const uploadedFiles = await fileUploadService.uploadFiles(\r\n formSchema.name,\r\n field.name,\r\n newFiles\r\n );\r\n\r\n if (isMultiple) {\r\n const currentValue = formField.value;\r\n const existingFiles = Array.isArray(currentValue)\r\n ? currentValue.filter((item: any) => item && typeof item === 'object' && 'fileName' in item)\r\n : [];\r\n const allUploadedFiles = [...existingFiles, ...uploadedFiles];\r\n formField.onChange(allUploadedFiles);\r\n } else {\r\n formField.onChange(uploadedFiles[0] || null);\r\n }\r\n } catch (error: any) {\r\n console.error(`Failed to upload files for field ${field.name}:`, error);\r\n const errorMessage = error.response?.data?.message || error.message || 'Failed to upload files';\r\n setError?.(field.name, {\r\n type: 'manual',\r\n message: `Failed to upload files: ${errorMessage}`,\r\n });\r\n } finally {\r\n setUploadingFiles?.((prev) => ({ ...prev, [field.name]: false }));\r\n e.target.value = '';\r\n }\r\n }}\r\n disabled={uploadingFiles[field.name] || false}\r\n />\r\n {isUploading ? (\r\n <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 1, py: 3, width: '100%' }}>\r\n <CircularProgress size={40} />\r\n <Typography variant=\"body2\" sx={{ fontWeight: 500, color: formColors.primary }}>\r\n Uploading files...\r\n </Typography>\r\n <Typography variant=\"caption\" sx={{ color: formColors.textSecondary }}>\r\n Please wait while files are being uploaded\r\n </Typography>\r\n </Box>\r\n ) : !hasFiles ? (\r\n <>\r\n <CloudUploadIcon sx={{ fontSize: 40, color: formColors.textSecondary, mb: 1 }} />\r\n <Typography variant=\"caption\" sx={{ color: formColors.textSecondary }}>\r\n Click to upload or drag and drop\r\n {isMultiple && ' (multiple files allowed)'}\r\n </Typography>\r\n {field.validation?.allowedFileTypes && field.validation.allowedFileTypes.length > 0 && (\r\n <Typography variant=\"caption\" sx={{ mt: 0.5, color: formColors.textSecondary }}>\r\n Allowed: {field.validation.allowedFileTypes.join(', ')}\r\n </Typography>\r\n )}\r\n {field.validation?.maxFileSize && (\r\n <Typography variant=\"caption\" sx={{ mt: 0.5, color: formColors.textSecondary }}>\r\n Max size: {formatFileSize(field.validation.maxFileSize)} per file\r\n </Typography>\r\n )}\r\n </>\r\n ) : (\r\n <Box sx={{ width: '100%' }}>\r\n {isMultiple && (\r\n <Typography variant=\"body2\" sx={{ fontWeight: 500, mb: 1.5 }}>\r\n {files.length} file{files.length !== 1 ? 's' : ''} uploaded\r\n </Typography>\r\n )}\r\n {files.length === 1 && !isMultiple ? (\r\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 2, width: '100%' }}>\r\n <InsertDriveFileIcon sx={{ fontSize: 40, color: formColors.primary }} />\r\n <Box sx={{ flexGrow: 1, minWidth: 0 }}>\r\n <Typography variant=\"body2\" sx={{ fontWeight: 500, overflow: 'hidden', textOverflow: 'ellipsis', maxWidth: isMobile ? '200px' : '300px' }}>\r\n {files[0] instanceof File\r\n ? files[0].name\r\n : ((files[0] as UploadedFile).originalName || (files[0] as UploadedFile).fileName)}\r\n </Typography>\r\n <Typography variant=\"caption\" sx={{ color: formColors.textSecondary }}>\r\n {formatFileSize((files[0] as any).size || 0)}\r\n </Typography>\r\n </Box>\r\n <Tooltip title=\"Remove file\" placement=\"bottom\" arrow>\r\n <IconButton\r\n size=\"small\"\r\n onClick={(e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n formField.onChange(null);\r\n const fileInput = document.getElementById(`file-input-${field.name}`) as HTMLInputElement;\r\n if (fileInput) {\r\n fileInput.value = '';\r\n }\r\n }}\r\n sx={{ color: formColors.error }}\r\n >\r\n <CloseIcon fontSize=\"small\" />\r\n </IconButton>\r\n </Tooltip>\r\n </Box>\r\n ) : (\r\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 1, width: '100%' }}>\r\n {files.map((file, index) => {\r\n const fileName = file instanceof File\r\n ? file.name\r\n : ((file as UploadedFile).originalName || (file as UploadedFile).fileName);\r\n return (\r\n <Box\r\n key={`${fileName}-${index}`}\r\n sx={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 1.5,\r\n p: 1,\r\n borderRadius: 1,\r\n backgroundColor: formColors.background,\r\n border: '1px solid',\r\n borderColor: formColors.divider,\r\n }}\r\n >\r\n <InsertDriveFileIcon sx={{ fontSize: 32, color: formColors.primary }} />\r\n <Box sx={{ flexGrow: 1, minWidth: 0 }}>\r\n <Typography variant=\"body2\" sx={{ fontWeight: 500, overflow: 'hidden', textOverflow: 'ellipsis' }}>\r\n {fileName}\r\n </Typography>\r\n <Typography variant=\"caption\" sx={{ color: formColors.textSecondary }}>\r\n {formatFileSize((file as any).size || 0)}\r\n </Typography>\r\n </Box>\r\n <Tooltip title=\"Remove file\" placement=\"bottom\" arrow>\r\n <IconButton\r\n size=\"small\"\r\n onClick={(e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n if (isMultiple) {\r\n const updatedFiles = files.filter((_, i) => i !== index);\r\n formField.onChange(updatedFiles.length > 0 ? updatedFiles : []);\r\n } else {\r\n formField.onChange(null);\r\n }\r\n }}\r\n sx={{ color: formColors.error }}\r\n >\r\n <CloseIcon fontSize=\"small\" />\r\n </IconButton>\r\n </Tooltip>\r\n </Box>\r\n );\r\n })}\r\n </Box>\r\n )}\r\n </Box>\r\n )}\r\n </Box>\r\n {errors[field.name] && (\r\n <Typography variant=\"caption\" sx={{ mt: 1, display: 'block', color: formColors.error }}>\r\n {errors[field.name]?.message as string}\r\n </Typography>\r\n )}\r\n </Box>\r\n );\r\n }}\r\n />\r\n );\r\n};\r\n","import { FormSchema, FormField } from '../types';\r\n\r\n/**\r\n * Get all fields from form schema (sections or legacy fields)\r\n */\r\nexport const getAllFields = (formSchema: FormSchema): FormField[] => {\r\n return formSchema.sections\r\n ? formSchema.sections.flatMap(section => section.fields)\r\n : (formSchema.fields || []);\r\n};\r\n\r\n/**\r\n * Normalize initial values to handle backward compatibility\r\n * - Single value -> array for multiple fields\r\n * - Array -> first element for single fields\r\n */\r\nexport const normalizeInitialValues = (\r\n values: Record<string, any>,\r\n formSchema: FormSchema\r\n): Record<string, any> => {\r\n if (!values) return values;\r\n\r\n const normalized: Record<string, any> = { ...values };\r\n const allFields = getAllFields(formSchema);\r\n\r\n allFields.forEach(field => {\r\n const fieldValue = normalized[field.name];\r\n\r\n // Handle select, formReference, and apiReference fields\r\n if (field.type === 'select' || field.type === 'formReference' || field.type === 'apiReference') {\r\n if (field.allowMultiple) {\r\n // Multiple selection: convert single value to array\r\n if (fieldValue !== null && fieldValue !== undefined && fieldValue !== '') {\r\n if (!Array.isArray(fieldValue)) {\r\n normalized[field.name] = [fieldValue];\r\n }\r\n } else {\r\n normalized[field.name] = [];\r\n }\r\n } else {\r\n // Single selection: convert array to first element\r\n if (Array.isArray(fieldValue) && fieldValue.length > 0) {\r\n normalized[field.name] = fieldValue[0];\r\n } else if (Array.isArray(fieldValue) && fieldValue.length === 0) {\r\n normalized[field.name] = '';\r\n }\r\n }\r\n }\r\n\r\n // Normalize file fields: convert single file to array if field allows multiple\r\n if (field.type === 'file') {\r\n if (field.allowMultiple) {\r\n if (fieldValue !== null && fieldValue !== undefined) {\r\n if (!Array.isArray(fieldValue)) {\r\n normalized[field.name] = [fieldValue];\r\n }\r\n } else {\r\n normalized[field.name] = [];\r\n }\r\n } else {\r\n // Single file: convert array to first element\r\n if (Array.isArray(fieldValue) && fieldValue.length > 0) {\r\n normalized[field.name] = fieldValue[0];\r\n } else if (Array.isArray(fieldValue) && fieldValue.length === 0) {\r\n normalized[field.name] = null;\r\n }\r\n }\r\n }\r\n });\r\n\r\n return normalized;\r\n};\r\n\r\n/**\r\n * Get default value for a field based on its type\r\n */\r\nexport const getDefaultValue = (field: FormField): any => {\r\n switch (field.type) {\r\n case 'checkbox':\r\n case 'toggle':\r\n return false;\r\n case 'datepicker':\r\n return null;\r\n case 'file':\r\n return field.allowMultiple ? [] : null;\r\n case 'select':\r\n case 'formReference':\r\n case 'apiReference':\r\n return field.allowMultiple ? [] : '';\r\n case 'text':\r\n case 'email':\r\n case 'number':\r\n case 'radio':\r\n case 'ckeditor':\r\n default:\r\n return '';\r\n }\r\n};\r\n\r\n/**\r\n * Transform form values based on field types.\r\n */\r\nexport const transformFormValues = (\r\n data: Record<string, any>,\r\n formSchema: FormSchema\r\n): Record<string, any> => {\r\n const allFields = getAllFields(formSchema);\r\n const fieldTypeMap = new Map<string, string>();\r\n allFields.forEach(field => {\r\n fieldTypeMap.set(field.name, field.type);\r\n });\r\n\r\n const transformedData: Record<string, any> = {};\r\n\r\n Object.keys(data).forEach(key => {\r\n const fieldType = fieldTypeMap.get(key);\r\n const value = data[key];\r\n\r\n if (value === null || value === undefined) {\r\n transformedData[key] = value;\r\n return;\r\n }\r\n\r\n switch (fieldType) {\r\n case 'number':\r\n if (value === '' || value === null || value === undefined) {\r\n transformedData[key] = null;\r\n } else {\r\n const numValue = Number(value);\r\n transformedData[key] = isNaN(numValue) ? value : numValue;\r\n }\r\n break;\r\n case 'checkbox':\r\n case 'toggle':\r\n transformedData[key] = Boolean(value);\r\n break;\r\n case 'datepicker':\r\n case 'file':\r\n default:\r\n transformedData[key] = value;\r\n }\r\n });\r\n\r\n return transformedData;\r\n};\r\n","import React, { useMemo, useEffect, useState, useCallback } from 'react';\r\nimport { Controller } from 'react-hook-form';\r\nimport { FieldRendererProps, OptionItem } from '../../types';\r\nimport { getDefaultValue } from '../../utils/formHelpers';\r\nimport { buildFieldRules } from '../../utils/fieldHelpers';\r\nimport { SimpleSelect, SimpleSelectOption } from '../common/SimpleSelect';\r\nimport {\r\n defaultFormReferenceService,\r\n defaultApiReferenceService,\r\n} from '../../services/defaultServices';\r\n\r\nexport const FormReferenceField = ({ field, control, defaultValue, rules, errors, services }: FieldRendererProps) => {\r\n const isMultiple = field.allowMultiple || false;\r\n const [options, setOptions] = useState<OptionItem[]>([]);\r\n const [isLoading, setIsLoading] = useState(false);\r\n\r\n const formReferenceService = services?.formReference || defaultFormReferenceService;\r\n\r\n const fetchOptions = useCallback(() => {\r\n if (!field.referenceFormName || !field.referenceFieldName) return;\r\n setIsLoading(true);\r\n formReferenceService\r\n .fetchOptions(field.referenceFormName, field.referenceFieldName)\r\n .then((opts: OptionItem[]) => {\r\n setOptions(opts);\r\n })\r\n .catch((error: any) => {\r\n console.error('Failed to fetch form reference options:', error);\r\n setOptions([]);\r\n })\r\n .finally(() => {\r\n setIsLoading(false);\r\n });\r\n }, [field.referenceFormName, field.referenceFieldName, formReferenceService]);\r\n\r\n useEffect(() => {\r\n fetchOptions();\r\n }, [fetchOptions]);\r\n\r\n // Convert OptionItem[] to SimpleSelectOption[]\r\n const selectOptions: SimpleSelectOption[] = useMemo(() => {\r\n return options.map((opt: OptionItem) => ({\r\n value: String(opt.value),\r\n label: opt.label,\r\n }));\r\n }, [options]);\r\n\r\n const fieldDefaultValue = defaultValue ?? getDefaultValue(field);\r\n const fieldRules = rules ?? buildFieldRules(field);\r\n const isDisabled = !field.referenceFormName || !field.referenceFieldName;\r\n\r\n return (\r\n <Controller\r\n key={field.name}\r\n name={field.name}\r\n control={control}\r\n defaultValue={fieldDefaultValue}\r\n rules={fieldRules}\r\n render={({ field: formField }) => {\r\n return (\r\n <SimpleSelect\r\n label={field.label}\r\n value={formField.value}\r\n onChange={(value: string | string[] | null) => {\r\n formField.onChange(value);\r\n }}\r\n options={selectOptions}\r\n placeholder={field.placeholder || 'Search and select...'}\r\n helperText={errors[field.name]?.message as string}\r\n fullWidth={true}\r\n size=\"small\"\r\n required={field.required}\r\n error={!!errors[field.name]}\r\n disabled={isDisabled || isLoading}\r\n multiple={isMultiple}\r\n isLoading={isLoading}\r\n refreshable={true}\r\n onRefresh={fetchOptions}\r\n />\r\n );\r\n }}\r\n />\r\n );\r\n};\r\n\r\nexport const ApiReferenceField = ({ field, control, defaultValue, rules, errors, services }: FieldRendererProps) => {\r\n const isMultiple = field.allowMultiple || false;\r\n const [options, setOptions] = useState<OptionItem[]>([]);\r\n const [isLoading, setIsLoading] = useState(false);\r\n\r\n const apiReferenceService = services?.apiReference || defaultApiReferenceService;\r\n\r\n const fetchOptions = useCallback(() => {\r\n if (!field.apiEndpoint || !field.apiLabelField) return;\r\n setIsLoading(true);\r\n apiReferenceService\r\n .fetchOptions(field.apiEndpoint, field.apiLabelField, field.apiValueField || '_id')\r\n .then((opts: OptionItem[]) => {\r\n setOptions(opts);\r\n })\r\n .catch((error: any) => {\r\n console.error('Failed to fetch API reference options:', error);\r\n setOptions([]);\r\n })\r\n .finally(() => {\r\n setIsLoading(false);\r\n });\r\n }, [field.apiEndpoint, field.apiLabelField, field.apiValueField, apiReferenceService]);\r\n\r\n useEffect(() => {\r\n fetchOptions();\r\n }, [fetchOptions]);\r\n\r\n // Convert OptionItem[] to SimpleSelectOption[]\r\n const selectOptions: SimpleSelectOption[] = useMemo(() => {\r\n return options.map((opt: OptionItem) => ({\r\n value: String(opt.value),\r\n label: opt.label,\r\n }));\r\n }, [options]);\r\n\r\n const fieldDefaultValue = defaultValue ?? getDefaultValue(field);\r\n const fieldRules = rules ?? buildFieldRules(field);\r\n const isDisabled = !field.apiEndpoint || !field.apiLabelField;\r\n\r\n return (\r\n <Controller\r\n key={field.name}\r\n name={field.name}\r\n control={control}\r\n defaultValue={fieldDefaultValue}\r\n rules={fieldRules}\r\n render={({ field: formField }) => {\r\n return (\r\n <SimpleSelect\r\n label={field.label}\r\n value={formField.value}\r\n onChange={(value: string | string[] | null) => {\r\n formField.onChange(value);\r\n }}\r\n options={selectOptions}\r\n placeholder={field.placeholder || 'Search and select...'}\r\n helperText={errors[field.name]?.message as string}\r\n fullWidth={true}\r\n size=\"small\"\r\n required={field.required}\r\n error={!!errors[field.name]}\r\n disabled={isDisabled || isLoading}\r\n multiple={isMultiple}\r\n isLoading={isLoading}\r\n refreshable={true}\r\n onRefresh={fetchOptions}\r\n />\r\n );\r\n }}\r\n />\r\n );\r\n};\r\n"]}
|