iq-line-form-builder-renderer 1.0.13 → 1.0.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +112 -15
- package/dist/{fieldApiTransformer-DpvHi_69.mjs → fieldApiTransformer-4xiptSG0.mjs} +2 -2
- package/dist/{fieldApiTransformer-DpvHi_69.mjs.map → fieldApiTransformer-4xiptSG0.mjs.map} +1 -1
- package/dist/form-renderer.es.js +1 -1
- package/dist/form-renderer.umd.js +1 -1
- package/dist/form-renderer.umd.js.map +1 -1
- package/dist/{index-Clh0z6_i.mjs → index-yq9uvWxZ.mjs} +155 -148
- package/dist/{index-Clh0z6_i.mjs.map → index-yq9uvWxZ.mjs.map} +1 -1
- package/dist/style.css +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -256,30 +256,92 @@ axios.interceptors.request.use((config) => {
|
|
|
256
256
|
|
|
257
257
|
### Import Styles
|
|
258
258
|
|
|
259
|
+
**Import styles once** in your app's entry point (e.g., `main.tsx`, `App.tsx`):
|
|
260
|
+
|
|
259
261
|
```tsx
|
|
260
|
-
import 'iq-line-form-builder-renderer
|
|
262
|
+
import { FormRenderer } from 'iq-line-form-builder-renderer';
|
|
263
|
+
import 'iq-line-form-builder-renderer/styles'; // ✅ Import styles here
|
|
264
|
+
|
|
265
|
+
function App() {
|
|
266
|
+
return (
|
|
267
|
+
<div>
|
|
268
|
+
{/* Your existing UI - NOT affected */}
|
|
269
|
+
<YourHeader />
|
|
270
|
+
|
|
271
|
+
{/* FormRenderer - styles are scoped */}
|
|
272
|
+
<FormRenderer formId="my-form" />
|
|
273
|
+
</div>
|
|
274
|
+
);
|
|
275
|
+
}
|
|
261
276
|
```
|
|
262
277
|
|
|
263
|
-
### CSS Scoping
|
|
278
|
+
### CSS Scoping - How It Works
|
|
279
|
+
|
|
280
|
+
This package uses **scoped CSS** to prevent conflicts with your application's styles.
|
|
281
|
+
|
|
282
|
+
#### Automatic Scoping
|
|
264
283
|
|
|
265
|
-
|
|
284
|
+
1. **FormRenderer automatically wraps content** in `.iq-line-form-renderer` class
|
|
285
|
+
2. **All CSS rules are prefixed** with `.iq-line-form-renderer` during build
|
|
286
|
+
3. **Styles only apply inside FormRenderer** - your UI remains unaffected
|
|
266
287
|
|
|
267
|
-
|
|
288
|
+
```tsx
|
|
289
|
+
// What you write:
|
|
290
|
+
<FormRenderer formId="my-form" />
|
|
291
|
+
|
|
292
|
+
// What gets rendered:
|
|
293
|
+
<div className="iq-line-form-renderer">
|
|
294
|
+
<form>
|
|
295
|
+
{/* form content */}
|
|
296
|
+
</form>
|
|
297
|
+
</div>
|
|
298
|
+
```
|
|
268
299
|
|
|
269
|
-
|
|
300
|
+
#### Why Your UI Won't Be Affected
|
|
270
301
|
|
|
271
|
-
- ✅
|
|
272
|
-
- ✅
|
|
273
|
-
- ✅
|
|
274
|
-
- ✅
|
|
302
|
+
- ✅ **Scoped selectors**: All CSS rules are prefixed with `.iq-line-form-renderer`
|
|
303
|
+
- ✅ **Isolated styles**: Only elements inside FormRenderer are styled
|
|
304
|
+
- ✅ **No global pollution**: Your buttons, inputs, etc. remain unchanged
|
|
305
|
+
- ✅ **Works with any UI library**: shadcn/ui, Material-UI, Tailwind, etc.
|
|
306
|
+
|
|
307
|
+
**Example:**
|
|
308
|
+
```tsx
|
|
309
|
+
function MyPage() {
|
|
310
|
+
return (
|
|
311
|
+
<div>
|
|
312
|
+
{/* ✅ Your button - NOT affected by FormRenderer styles */}
|
|
313
|
+
<button className="my-button">Click Me</button>
|
|
314
|
+
|
|
315
|
+
{/* ✅ FormRenderer - styles scoped, won't affect above */}
|
|
316
|
+
<FormRenderer formId="my-form" />
|
|
317
|
+
</div>
|
|
318
|
+
);
|
|
319
|
+
}
|
|
320
|
+
```
|
|
275
321
|
|
|
276
322
|
#### CSS Variables
|
|
277
323
|
|
|
278
|
-
CSS variables (defined in `:root`) are kept global
|
|
324
|
+
CSS variables (defined in `:root`) are kept **global** for theming support:
|
|
325
|
+
|
|
326
|
+
```css
|
|
327
|
+
:root {
|
|
328
|
+
--background: 0 0% 100%;
|
|
329
|
+
--foreground: 222.2 84% 4.9%;
|
|
330
|
+
/* ... */
|
|
331
|
+
}
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
You can override these in your app if needed:
|
|
335
|
+
|
|
336
|
+
```css
|
|
337
|
+
:root {
|
|
338
|
+
--primary: #your-color; /* Override FormRenderer variable */
|
|
339
|
+
}
|
|
340
|
+
```
|
|
279
341
|
|
|
280
342
|
#### Custom Styling
|
|
281
343
|
|
|
282
|
-
You can
|
|
344
|
+
You can customize FormRenderer styles:
|
|
283
345
|
|
|
284
346
|
1. **Using className prop**:
|
|
285
347
|
```tsx
|
|
@@ -291,7 +353,7 @@ You can override styles by targeting the scoped class:
|
|
|
291
353
|
|
|
292
354
|
2. **CSS Overrides**:
|
|
293
355
|
```css
|
|
294
|
-
/*
|
|
356
|
+
/* Target the scoped class */
|
|
295
357
|
.iq-line-form-renderer input {
|
|
296
358
|
border-color: #your-color;
|
|
297
359
|
}
|
|
@@ -302,17 +364,52 @@ You can override styles by targeting the scoped class:
|
|
|
302
364
|
}
|
|
303
365
|
```
|
|
304
366
|
|
|
305
|
-
3. **Tailwind Configuration**: If your app uses Tailwind, ensure the renderer's Tailwind classes are included in your config.
|
|
306
|
-
|
|
307
367
|
#### Compatibility
|
|
308
368
|
|
|
309
369
|
This package is designed to work alongside:
|
|
310
370
|
- ✅ shadcn/ui components
|
|
311
371
|
- ✅ Tailwind CSS
|
|
372
|
+
- ✅ Material-UI
|
|
373
|
+
- ✅ Bootstrap
|
|
312
374
|
- ✅ Other CSS frameworks
|
|
313
375
|
- ✅ Global CSS stylesheets
|
|
314
376
|
|
|
315
|
-
The scoped CSS ensures no conflicts with your application's global styles
|
|
377
|
+
**The scoped CSS ensures no conflicts with your application's global styles.**
|
|
378
|
+
|
|
379
|
+
### Using FormRenderer in Modals/Dialogs
|
|
380
|
+
|
|
381
|
+
FormRenderer works perfectly inside modals, dialogs, and overlay components:
|
|
382
|
+
|
|
383
|
+
```tsx
|
|
384
|
+
import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog';
|
|
385
|
+
import { FormRenderer } from 'iq-line-form-builder-renderer';
|
|
386
|
+
import 'iq-line-form-builder-renderer/styles';
|
|
387
|
+
|
|
388
|
+
function MyModal() {
|
|
389
|
+
return (
|
|
390
|
+
<Dialog>
|
|
391
|
+
<DialogContent>
|
|
392
|
+
{/* ✅ Your DialogHeader - uses YOUR styles */}
|
|
393
|
+
<DialogHeader>
|
|
394
|
+
<DialogTitle>Create Batch</DialogTitle>
|
|
395
|
+
</DialogHeader>
|
|
396
|
+
|
|
397
|
+
{/* ✅ FormRenderer - styles scoped, won't affect Dialog */}
|
|
398
|
+
<FormRenderer formId="batch-form" />
|
|
399
|
+
</DialogContent>
|
|
400
|
+
</Dialog>
|
|
401
|
+
);
|
|
402
|
+
}
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
**How it works:**
|
|
406
|
+
- Modal shell (Dialog, DialogContent, etc.) uses **your app's styles**
|
|
407
|
+
- FormRenderer content uses **scoped package styles**
|
|
408
|
+
- CSS isolation ensures **no conflicts** between modal and form styles
|
|
409
|
+
|
|
410
|
+
📖 **For detailed guides, see**:
|
|
411
|
+
- [CSS-SCOPING-GUIDE.md](./doc/form-renderer/CSS-SCOPING-GUIDE.md) - CSS scoping details
|
|
412
|
+
- [MODAL-INTEGRATION-GUIDE.md](./doc/form-renderer/MODAL-INTEGRATION-GUIDE.md) - Modal integration guide
|
|
316
413
|
|
|
317
414
|
## Advanced Usage
|
|
318
415
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { g as O, a as P } from "./index-
|
|
1
|
+
import { g as O, a as P } from "./index-yq9uvWxZ.mjs";
|
|
2
2
|
function S(e, u) {
|
|
3
3
|
const i = {};
|
|
4
4
|
let p = !1, o, t, s, c, d;
|
|
@@ -92,4 +92,4 @@ export {
|
|
|
92
92
|
S as transformFieldToBulkPayload,
|
|
93
93
|
E as transformFieldsToBulkPayload
|
|
94
94
|
};
|
|
95
|
-
//# sourceMappingURL=fieldApiTransformer-
|
|
95
|
+
//# sourceMappingURL=fieldApiTransformer-4xiptSG0.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fieldApiTransformer-DpvHi_69.mjs","sources":["../src/modules/formbuilder/utils/fieldApiTransformer.ts"],"sourcesContent":["// Purpose: Transform frontend FormField to API bulk create format\r\n// Scope: Converts FormField to the format expected by /api/form-builder/form-fields/bulk\r\n\r\nimport type { FormField } from '../types/field';\r\nimport { getApiDataFromProperties, getNonApiMetadata } from './apiDataHelpers';\r\n\r\nexport interface BulkFieldPayload {\r\n formDefinitionId: string;\r\n fieldKey: string;\r\n fieldType: string;\r\n label: string;\r\n placeholder?: string;\r\n defaultValue?: string;\r\n isRequired: boolean;\r\n \r\n // Position (both nested and flat for backend compatibility)\r\n position: {\r\n row: number;\r\n column: number;\r\n width: number;\r\n order: number;\r\n };\r\n positionRow: number;\r\n positionColumn: number;\r\n positionWidth: number;\r\n positionOrder: number;\r\n \r\n // Validation (both nested and flat for backend compatibility)\r\n validation?: Record<string, any>;\r\n validationRequired: boolean;\r\n validationMinLength?: number;\r\n validationMaxLength?: number;\r\n validationMin?: number;\r\n validationMax?: number;\r\n validationPattern?: string;\r\n \r\n // Field state\r\n disabled?: boolean;\r\n readOnly?: boolean;\r\n hidden?: boolean;\r\n \r\n // Appearance\r\n size?: string;\r\n labelPosition?: string;\r\n hideLabel?: boolean;\r\n customClass?: string;\r\n \r\n // Options for select/radio/checkbox fields (JSON string)\r\n options?: string;\r\n \r\n // Additional metadata (JSON string) - non-API fields only\r\n metadata?: string;\r\n \r\n // API data (new structure, preferred)\r\n apidata?: {\r\n apiKey?: string;\r\n valueSource?: string;\r\n apiEndpoint?: string;\r\n apiAutoDetect?: boolean;\r\n apiLabelField?: string;\r\n apiValueField?: string;\r\n apiMethod?: string;\r\n apiRealtime?: boolean;\r\n apiQueryParams?: {\r\n limit?: string;\r\n page?: string;\r\n sort?: string;\r\n orderBy?: string;\r\n custom?: Array<{ key: string; value: string }>;\r\n };\r\n apiClientFilter?: {\r\n filterField: string;\r\n matchField: string;\r\n };\r\n };\r\n \r\n // Help text\r\n helpText?: string;\r\n}\r\n\r\n/**\r\n * Transforms a frontend FormField to the API bulk create format\r\n */\r\nexport function transformFieldToBulkPayload(\r\n field: FormField,\r\n formDefinitionId: string\r\n): BulkFieldPayload {\r\n // Extract validation rules\r\n const validation: Record<string, any> = {};\r\n let isRequired = false;\r\n let validationMinLength: number | undefined;\r\n let validationMaxLength: number | undefined;\r\n let validationMin: number | undefined;\r\n let validationMax: number | undefined;\r\n let validationPattern: string | undefined;\r\n\r\n if (field.validation && Array.isArray(field.validation)) {\r\n field.validation.forEach((rule) => {\r\n if (rule.type === 'required') {\r\n isRequired = true;\r\n validation.required = true;\r\n } else if (rule.type === 'minLength' && typeof rule.value === 'number') {\r\n validationMinLength = rule.value;\r\n validation.minLength = rule.value;\r\n } else if (rule.type === 'maxLength' && typeof rule.value === 'number') {\r\n validationMaxLength = rule.value;\r\n validation.maxLength = rule.value;\r\n } else if (rule.type === 'min' && typeof rule.value === 'number') {\r\n validationMin = rule.value;\r\n validation.min = rule.value;\r\n } else if (rule.type === 'max' && typeof rule.value === 'number') {\r\n validationMax = rule.value;\r\n validation.max = rule.value;\r\n } else if (rule.type === 'pattern' && typeof rule.value === 'string') {\r\n validationPattern = rule.value;\r\n validation.pattern = rule.value;\r\n } else {\r\n // Store other validation rules (including character restrictions)\r\n validation[rule.type] = rule.value;\r\n }\r\n });\r\n }\r\n\r\n // Check if field is required from field properties\r\n if (field.properties && typeof field.properties === 'object') {\r\n const props = field.properties as any;\r\n if (props.required === true) {\r\n isRequired = true;\r\n validation.required = true;\r\n }\r\n }\r\n\r\n // Extract options for select/radio/checkbox fields\r\n let optionsString: string | undefined;\r\n if (field.properties && typeof field.properties === 'object') {\r\n const props = field.properties as any;\r\n if (props.options && Array.isArray(props.options)) {\r\n optionsString = JSON.stringify(props.options);\r\n }\r\n }\r\n\r\n // Extract appearance properties\r\n const appearance = field.appearance || {};\r\n const size = appearance.size || 'md';\r\n const labelPosition = appearance.labelPlacement || 'top';\r\n const hideLabel = appearance.hideLabel || false;\r\n const customClass = appearance.className || '';\r\n\r\n // Separate API fields from non-API metadata\r\n let apidata: any = undefined;\r\n let metadata: Record<string, any> = {};\r\n\r\n if (field.properties) {\r\n const props = field.properties as any;\r\n \r\n // Extract API data (new structure)\r\n const apiData = getApiDataFromProperties(props);\r\n if (apiData) {\r\n apidata = apiData;\r\n console.log(`[fieldApiTransformer] Field \"${field.name}\" (${field.type}) API config being saved in apidata:`, {\r\n apiEndpoint: apiData.apiEndpoint,\r\n apiMethod: apiData.apiMethod || 'GET',\r\n apiRealtime: apiData.apiRealtime ?? false,\r\n apiAutoDetect: apiData.apiAutoDetect ?? false,\r\n apiLabelField: apiData.apiLabelField,\r\n apiValueField: apiData.apiValueField,\r\n });\r\n }\r\n\r\n // Extract non-API metadata (searchable, clearable, etc.)\r\n metadata = getNonApiMetadata(props);\r\n }\r\n\r\n // Always include field state in metadata (also sent as top-level fields)\r\n metadata.disabled = field.disabled ?? false;\r\n metadata.readOnly = field.readOnly ?? false;\r\n metadata.hidden = field.hidden ?? false;\r\n \r\n // Include hideLabel in metadata if present (from appearance or properties)\r\n // This ensures it's available when loading from backend\r\n if (hideLabel !== undefined) {\r\n metadata.hideLabel = hideLabel;\r\n }\r\n // Also check properties.hideLabel for button fields\r\n if (field.properties && (field.properties as any).hideLabel !== undefined) {\r\n metadata.hideLabel = (field.properties as any).hideLabel;\r\n }\r\n \r\n const metadataString = JSON.stringify(metadata);\r\n\r\n // Position values\r\n const positionRow = field.position.order;\r\n const positionColumn = field.position.column || 1;\r\n const positionWidth = field.position.columnSpan || 1;\r\n const positionOrder = field.position.order;\r\n\r\n // Build payload, only including validation fields if they have values\r\n const payload: BulkFieldPayload = {\r\n formDefinitionId,\r\n fieldKey: field.name,\r\n fieldType: field.type,\r\n label: field.label,\r\n placeholder: field.placeholder,\r\n defaultValue: field.defaultValue ? String(field.defaultValue) : undefined,\r\n isRequired,\r\n \r\n // Position (both formats)\r\n position: {\r\n row: positionRow,\r\n column: positionColumn,\r\n width: positionWidth,\r\n order: positionOrder,\r\n },\r\n positionRow,\r\n positionColumn,\r\n positionWidth,\r\n positionOrder,\r\n \r\n // Validation (both formats)\r\n validation: Object.keys(validation).length > 0 ? validation : undefined,\r\n validationRequired: isRequired,\r\n \r\n // Field state (ensure boolean values, default to false)\r\n disabled: field.disabled ?? false,\r\n readOnly: field.readOnly ?? false,\r\n hidden: field.hidden ?? false,\r\n \r\n // Appearance\r\n size,\r\n labelPosition,\r\n hideLabel,\r\n customClass,\r\n \r\n // Options and metadata\r\n options: optionsString,\r\n metadata: metadataString,\r\n \r\n // API data (new structure, preferred)\r\n ...(apidata && { apidata }),\r\n \r\n // Help text\r\n helpText: field.description,\r\n };\r\n \r\n // Only include validation fields if they have actual values (not undefined/null)\r\n // Note: 0 is a valid value for minLength/maxLength, so we explicitly check for null/undefined\r\n if (validationMinLength !== undefined && validationMinLength !== null) {\r\n payload.validationMinLength = validationMinLength;\r\n }\r\n // Omit the field if undefined/null to let backend handle defaults\r\n if (validationMaxLength !== undefined && validationMaxLength !== null) {\r\n payload.validationMaxLength = validationMaxLength;\r\n }\r\n // Omit the field if undefined/null to let backend handle defaults\r\n if (validationMin !== undefined && validationMin !== null) {\r\n payload.validationMin = validationMin;\r\n }\r\n // Omit the field if undefined/null to let backend handle defaults\r\n if (validationMax !== undefined && validationMax !== null) {\r\n payload.validationMax = validationMax;\r\n }\r\n // Omit the field if undefined/null/empty to let backend handle defaults\r\n if (validationPattern !== undefined && validationPattern !== null && validationPattern !== '') {\r\n payload.validationPattern = validationPattern;\r\n }\r\n \r\n return payload;\r\n}\r\n\r\n/**\r\n * Transforms an array of FormFields to bulk create payload\r\n */\r\nexport function transformFieldsToBulkPayload(\r\n fields: FormField[],\r\n formDefinitionId: string\r\n): BulkFieldPayload[] {\r\n const filteredFields = fields.filter((field) => {\r\n // Filter out layout-only fields (section, divider, header, spacer)\r\n const layoutFields = ['section', 'divider', 'header', 'spacer'];\r\n return !layoutFields.includes(field.type);\r\n });\r\n\r\n const payloads = filteredFields.map((field) => transformFieldToBulkPayload(field, formDefinitionId));\r\n\r\n // Log summary of API configuration fields\r\n const apiFields = payloads.filter((p) => {\r\n try {\r\n const metadata = p.metadata ? JSON.parse(p.metadata) : {};\r\n return !!metadata.apiEndpoint;\r\n } catch {\r\n return false;\r\n }\r\n });\r\n\r\n if (apiFields.length > 0) {\r\n console.log(`[fieldApiTransformer] Summary: ${apiFields.length} field(s) with API configuration:`, \r\n apiFields.map((f) => ({\r\n fieldKey: f.fieldKey,\r\n fieldType: f.fieldType,\r\n apiEndpoint: f.metadata ? (() => {\r\n try {\r\n const meta = JSON.parse(f.metadata);\r\n return meta.apiEndpoint;\r\n } catch {\r\n return 'parse-error';\r\n }\r\n })() : 'no-metadata',\r\n }))\r\n );\r\n }\r\n\r\n return payloads;\r\n}\r\n\r\n/**\r\n * Utility to sync fields to localStorage.\r\n */\r\nexport function syncFieldsToLocalStorage(formId: string | undefined, fields: FormField[]) {\r\n if (!formId) return;\r\n try {\r\n localStorage.setItem(`formsmith_fields_${formId}`, JSON.stringify(fields));\r\n } catch (e) {\r\n console.error('Failed to save fields to localStorage:', e);\r\n }\r\n}\r\n\r\n/**\r\n * Utility to get fields from localStorage.\r\n */\r\nexport function getFieldsFromLocalStorage(formId: string | undefined): FormField[] | null {\r\n if (!formId) return null;\r\n try {\r\n const stored = localStorage.getItem(`formsmith_fields_${formId}`);\r\n if (stored) {\r\n return JSON.parse(stored);\r\n }\r\n return null;\r\n } catch (e) {\r\n console.error('Failed to load fields from localStorage:', e);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Utility to clear fields from localStorage.\r\n */\r\nexport function clearFieldsFromLocalStorage(formId: string | undefined) {\r\n if (!formId) return;\r\n try {\r\n localStorage.removeItem(`formsmith_fields_${formId}`);\r\n console.log(`[clearFieldsFromLocalStorage] Cleared fields for form ${formId}`);\r\n } catch (e) {\r\n console.error('Failed to clear fields from localStorage:', e);\r\n }\r\n}\r\n"],"names":["transformFieldToBulkPayload","field","formDefinitionId","validation","isRequired","validationMinLength","validationMaxLength","validationMin","validationMax","validationPattern","rule","optionsString","props","appearance","size","labelPosition","hideLabel","customClass","apidata","metadata","apiData","getApiDataFromProperties","getNonApiMetadata","metadataString","positionRow","positionColumn","positionWidth","positionOrder","payload","transformFieldsToBulkPayload","fields","payloads","apiFields","p","f"],"mappings":";AAmFO,SAASA,EACdC,GACAC,GACkB;AAElB,QAAMC,IAAkC,CAAA;AACxC,MAAIC,IAAa,IACbC,GACAC,GACAC,GACAC,GACAC;AAEJ,EAAIR,EAAM,cAAc,MAAM,QAAQA,EAAM,UAAU,KACpDA,EAAM,WAAW,QAAQ,CAACS,MAAS;AACjC,IAAIA,EAAK,SAAS,cAChBN,IAAa,IACbD,EAAW,WAAW,MACbO,EAAK,SAAS,eAAe,OAAOA,EAAK,SAAU,YAC5DL,IAAsBK,EAAK,OAC3BP,EAAW,YAAYO,EAAK,SACnBA,EAAK,SAAS,eAAe,OAAOA,EAAK,SAAU,YAC5DJ,IAAsBI,EAAK,OAC3BP,EAAW,YAAYO,EAAK,SACnBA,EAAK,SAAS,SAAS,OAAOA,EAAK,SAAU,YACtDH,IAAgBG,EAAK,OACrBP,EAAW,MAAMO,EAAK,SACbA,EAAK,SAAS,SAAS,OAAOA,EAAK,SAAU,YACtDF,IAAgBE,EAAK,OACrBP,EAAW,MAAMO,EAAK,SACbA,EAAK,SAAS,aAAa,OAAOA,EAAK,SAAU,YAC1DD,IAAoBC,EAAK,OACzBP,EAAW,UAAUO,EAAK,SAG1BP,EAAWO,EAAK,IAAI,IAAIA,EAAK;AAAA,EAEjC,CAAC,GAICT,EAAM,cAAc,OAAOA,EAAM,cAAe,YACpCA,EAAM,WACV,aAAa,OACrBG,IAAa,IACbD,EAAW,WAAW;AAK1B,MAAIQ;AACJ,MAAIV,EAAM,cAAc,OAAOA,EAAM,cAAe,UAAU;AAC5D,UAAMW,IAAQX,EAAM;AACpB,IAAIW,EAAM,WAAW,MAAM,QAAQA,EAAM,OAAO,MAC9CD,IAAgB,KAAK,UAAUC,EAAM,OAAO;AAAA,EAEhD;AAGA,QAAMC,IAAaZ,EAAM,cAAc,CAAA,GACjCa,IAAOD,EAAW,QAAQ,MAC1BE,IAAgBF,EAAW,kBAAkB,OAC7CG,IAAYH,EAAW,aAAa,IACpCI,IAAcJ,EAAW,aAAa;AAG5C,MAAIK,GACAC,IAAgC,CAAA;AAEpC,MAAIlB,EAAM,YAAY;AACpB,UAAMW,IAAQX,EAAM,YAGdmB,IAAUC,EAAyBT,CAAK;AAC9C,IAAIQ,MACFF,IAAUE,GACV,QAAQ,IAAI,gCAAgCnB,EAAM,IAAI,MAAMA,EAAM,IAAI,wCAAwC;AAAA,MAC5G,aAAamB,EAAQ;AAAA,MACrB,WAAWA,EAAQ,aAAa;AAAA,MAChC,aAAaA,EAAQ,eAAe;AAAA,MACpC,eAAeA,EAAQ,iBAAiB;AAAA,MACxC,eAAeA,EAAQ;AAAA,MACvB,eAAeA,EAAQ;AAAA,IAAA,CACxB,IAIHD,IAAWG,EAAkBV,CAAK;AAAA,EACpC;AAGA,EAAAO,EAAS,WAAWlB,EAAM,YAAY,IACtCkB,EAAS,WAAWlB,EAAM,YAAY,IACtCkB,EAAS,SAASlB,EAAM,UAAU,IAI9Be,MAAc,WAChBG,EAAS,YAAYH,IAGnBf,EAAM,cAAeA,EAAM,WAAmB,cAAc,WAC9DkB,EAAS,YAAalB,EAAM,WAAmB;AAGjD,QAAMsB,IAAiB,KAAK,UAAUJ,CAAQ,GAGxCK,IAAcvB,EAAM,SAAS,OAC7BwB,IAAiBxB,EAAM,SAAS,UAAU,GAC1CyB,IAAgBzB,EAAM,SAAS,cAAc,GAC7C0B,IAAgB1B,EAAM,SAAS,OAG/B2B,IAA4B;AAAA,IAChC,kBAAA1B;AAAA,IACA,UAAUD,EAAM;AAAA,IAChB,WAAWA,EAAM;AAAA,IACjB,OAAOA,EAAM;AAAA,IACb,aAAaA,EAAM;AAAA,IACnB,cAAcA,EAAM,eAAe,OAAOA,EAAM,YAAY,IAAI;AAAA,IAChE,YAAAG;AAAA;AAAA,IAGA,UAAU;AAAA,MACR,KAAKoB;AAAA,MACL,QAAQC;AAAA,MACR,OAAOC;AAAA,MACP,OAAOC;AAAA,IAAA;AAAA,IAET,aAAAH;AAAA,IACA,gBAAAC;AAAA,IACA,eAAAC;AAAA,IACA,eAAAC;AAAA;AAAA,IAGA,YAAY,OAAO,KAAKxB,CAAU,EAAE,SAAS,IAAIA,IAAa;AAAA,IAC9D,oBAAoBC;AAAA;AAAA,IAGpB,UAAUH,EAAM,YAAY;AAAA,IAC5B,UAAUA,EAAM,YAAY;AAAA,IAC5B,QAAQA,EAAM,UAAU;AAAA;AAAA,IAGxB,MAAAa;AAAA,IACA,eAAAC;AAAA,IACA,WAAAC;AAAA,IACA,aAAAC;AAAA;AAAA,IAGA,SAASN;AAAA,IACT,UAAUY;AAAA;AAAA,IAGV,GAAIL,KAAW,EAAE,SAAAA,EAAA;AAAA;AAAA,IAGjB,UAAUjB,EAAM;AAAA,EAAA;AAKlB,SAAyCI,KAAwB,SAC/DuB,EAAQ,sBAAsBvB,IAGSC,KAAwB,SAC/DsB,EAAQ,sBAAsBtB,IAGGC,KAAkB,SACnDqB,EAAQ,gBAAgBrB,IAGSC,KAAkB,SACnDoB,EAAQ,gBAAgBpB,IAGaC,KAAsB,QAAQA,MAAsB,OACzFmB,EAAQ,oBAAoBnB,IAGvBmB;AACT;AAKO,SAASC,EACdC,GACA5B,GACoB;AAOpB,QAAM6B,IANiBD,EAAO,OAAO,CAAC7B,MAG7B,CADc,CAAC,WAAW,WAAW,UAAU,QAAQ,EACzC,SAASA,EAAM,IAAI,CACzC,EAE+B,IAAI,CAACA,MAAUD,EAA4BC,GAAOC,CAAgB,CAAC,GAG7F8B,IAAYD,EAAS,OAAO,CAACE,MAAM;AACvC,QAAI;AAEF,aAAO,CAAC,EADSA,EAAE,WAAW,KAAK,MAAMA,EAAE,QAAQ,IAAI,CAAA,GACrC;AAAA,IACpB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAED,SAAID,EAAU,SAAS,KACrB,QAAQ;AAAA,IAAI,kCAAkCA,EAAU,MAAM;AAAA,IAC5DA,EAAU,IAAI,CAACE,OAAO;AAAA,MACpB,UAAUA,EAAE;AAAA,MACZ,WAAWA,EAAE;AAAA,MACb,aAAaA,EAAE,YAAY,MAAM;AAC/B,YAAI;AAEF,iBADa,KAAK,MAAMA,EAAE,QAAQ,EACtB;AAAA,QACd,QAAQ;AACN,iBAAO;AAAA,QACT;AAAA,MACF,OAAO;AAAA,IAAA,EACP;AAAA,EAAA,GAICH;AACT;"}
|
|
1
|
+
{"version":3,"file":"fieldApiTransformer-4xiptSG0.mjs","sources":["../src/modules/formbuilder/utils/fieldApiTransformer.ts"],"sourcesContent":["// Purpose: Transform frontend FormField to API bulk create format\r\n// Scope: Converts FormField to the format expected by /api/form-builder/form-fields/bulk\r\n\r\nimport type { FormField } from '../types/field';\r\nimport { getApiDataFromProperties, getNonApiMetadata } from './apiDataHelpers';\r\n\r\nexport interface BulkFieldPayload {\r\n formDefinitionId: string;\r\n fieldKey: string;\r\n fieldType: string;\r\n label: string;\r\n placeholder?: string;\r\n defaultValue?: string;\r\n isRequired: boolean;\r\n \r\n // Position (both nested and flat for backend compatibility)\r\n position: {\r\n row: number;\r\n column: number;\r\n width: number;\r\n order: number;\r\n };\r\n positionRow: number;\r\n positionColumn: number;\r\n positionWidth: number;\r\n positionOrder: number;\r\n \r\n // Validation (both nested and flat for backend compatibility)\r\n validation?: Record<string, any>;\r\n validationRequired: boolean;\r\n validationMinLength?: number;\r\n validationMaxLength?: number;\r\n validationMin?: number;\r\n validationMax?: number;\r\n validationPattern?: string;\r\n \r\n // Field state\r\n disabled?: boolean;\r\n readOnly?: boolean;\r\n hidden?: boolean;\r\n \r\n // Appearance\r\n size?: string;\r\n labelPosition?: string;\r\n hideLabel?: boolean;\r\n customClass?: string;\r\n \r\n // Options for select/radio/checkbox fields (JSON string)\r\n options?: string;\r\n \r\n // Additional metadata (JSON string) - non-API fields only\r\n metadata?: string;\r\n \r\n // API data (new structure, preferred)\r\n apidata?: {\r\n apiKey?: string;\r\n valueSource?: string;\r\n apiEndpoint?: string;\r\n apiAutoDetect?: boolean;\r\n apiLabelField?: string;\r\n apiValueField?: string;\r\n apiMethod?: string;\r\n apiRealtime?: boolean;\r\n apiQueryParams?: {\r\n limit?: string;\r\n page?: string;\r\n sort?: string;\r\n orderBy?: string;\r\n custom?: Array<{ key: string; value: string }>;\r\n };\r\n apiClientFilter?: {\r\n filterField: string;\r\n matchField: string;\r\n };\r\n };\r\n \r\n // Help text\r\n helpText?: string;\r\n}\r\n\r\n/**\r\n * Transforms a frontend FormField to the API bulk create format\r\n */\r\nexport function transformFieldToBulkPayload(\r\n field: FormField,\r\n formDefinitionId: string\r\n): BulkFieldPayload {\r\n // Extract validation rules\r\n const validation: Record<string, any> = {};\r\n let isRequired = false;\r\n let validationMinLength: number | undefined;\r\n let validationMaxLength: number | undefined;\r\n let validationMin: number | undefined;\r\n let validationMax: number | undefined;\r\n let validationPattern: string | undefined;\r\n\r\n if (field.validation && Array.isArray(field.validation)) {\r\n field.validation.forEach((rule) => {\r\n if (rule.type === 'required') {\r\n isRequired = true;\r\n validation.required = true;\r\n } else if (rule.type === 'minLength' && typeof rule.value === 'number') {\r\n validationMinLength = rule.value;\r\n validation.minLength = rule.value;\r\n } else if (rule.type === 'maxLength' && typeof rule.value === 'number') {\r\n validationMaxLength = rule.value;\r\n validation.maxLength = rule.value;\r\n } else if (rule.type === 'min' && typeof rule.value === 'number') {\r\n validationMin = rule.value;\r\n validation.min = rule.value;\r\n } else if (rule.type === 'max' && typeof rule.value === 'number') {\r\n validationMax = rule.value;\r\n validation.max = rule.value;\r\n } else if (rule.type === 'pattern' && typeof rule.value === 'string') {\r\n validationPattern = rule.value;\r\n validation.pattern = rule.value;\r\n } else {\r\n // Store other validation rules (including character restrictions)\r\n validation[rule.type] = rule.value;\r\n }\r\n });\r\n }\r\n\r\n // Check if field is required from field properties\r\n if (field.properties && typeof field.properties === 'object') {\r\n const props = field.properties as any;\r\n if (props.required === true) {\r\n isRequired = true;\r\n validation.required = true;\r\n }\r\n }\r\n\r\n // Extract options for select/radio/checkbox fields\r\n let optionsString: string | undefined;\r\n if (field.properties && typeof field.properties === 'object') {\r\n const props = field.properties as any;\r\n if (props.options && Array.isArray(props.options)) {\r\n optionsString = JSON.stringify(props.options);\r\n }\r\n }\r\n\r\n // Extract appearance properties\r\n const appearance = field.appearance || {};\r\n const size = appearance.size || 'md';\r\n const labelPosition = appearance.labelPlacement || 'top';\r\n const hideLabel = appearance.hideLabel || false;\r\n const customClass = appearance.className || '';\r\n\r\n // Separate API fields from non-API metadata\r\n let apidata: any = undefined;\r\n let metadata: Record<string, any> = {};\r\n\r\n if (field.properties) {\r\n const props = field.properties as any;\r\n \r\n // Extract API data (new structure)\r\n const apiData = getApiDataFromProperties(props);\r\n if (apiData) {\r\n apidata = apiData;\r\n console.log(`[fieldApiTransformer] Field \"${field.name}\" (${field.type}) API config being saved in apidata:`, {\r\n apiEndpoint: apiData.apiEndpoint,\r\n apiMethod: apiData.apiMethod || 'GET',\r\n apiRealtime: apiData.apiRealtime ?? false,\r\n apiAutoDetect: apiData.apiAutoDetect ?? false,\r\n apiLabelField: apiData.apiLabelField,\r\n apiValueField: apiData.apiValueField,\r\n });\r\n }\r\n\r\n // Extract non-API metadata (searchable, clearable, etc.)\r\n metadata = getNonApiMetadata(props);\r\n }\r\n\r\n // Always include field state in metadata (also sent as top-level fields)\r\n metadata.disabled = field.disabled ?? false;\r\n metadata.readOnly = field.readOnly ?? false;\r\n metadata.hidden = field.hidden ?? false;\r\n \r\n // Include hideLabel in metadata if present (from appearance or properties)\r\n // This ensures it's available when loading from backend\r\n if (hideLabel !== undefined) {\r\n metadata.hideLabel = hideLabel;\r\n }\r\n // Also check properties.hideLabel for button fields\r\n if (field.properties && (field.properties as any).hideLabel !== undefined) {\r\n metadata.hideLabel = (field.properties as any).hideLabel;\r\n }\r\n \r\n const metadataString = JSON.stringify(metadata);\r\n\r\n // Position values\r\n const positionRow = field.position.order;\r\n const positionColumn = field.position.column || 1;\r\n const positionWidth = field.position.columnSpan || 1;\r\n const positionOrder = field.position.order;\r\n\r\n // Build payload, only including validation fields if they have values\r\n const payload: BulkFieldPayload = {\r\n formDefinitionId,\r\n fieldKey: field.name,\r\n fieldType: field.type,\r\n label: field.label,\r\n placeholder: field.placeholder,\r\n defaultValue: field.defaultValue ? String(field.defaultValue) : undefined,\r\n isRequired,\r\n \r\n // Position (both formats)\r\n position: {\r\n row: positionRow,\r\n column: positionColumn,\r\n width: positionWidth,\r\n order: positionOrder,\r\n },\r\n positionRow,\r\n positionColumn,\r\n positionWidth,\r\n positionOrder,\r\n \r\n // Validation (both formats)\r\n validation: Object.keys(validation).length > 0 ? validation : undefined,\r\n validationRequired: isRequired,\r\n \r\n // Field state (ensure boolean values, default to false)\r\n disabled: field.disabled ?? false,\r\n readOnly: field.readOnly ?? false,\r\n hidden: field.hidden ?? false,\r\n \r\n // Appearance\r\n size,\r\n labelPosition,\r\n hideLabel,\r\n customClass,\r\n \r\n // Options and metadata\r\n options: optionsString,\r\n metadata: metadataString,\r\n \r\n // API data (new structure, preferred)\r\n ...(apidata && { apidata }),\r\n \r\n // Help text\r\n helpText: field.description,\r\n };\r\n \r\n // Only include validation fields if they have actual values (not undefined/null)\r\n // Note: 0 is a valid value for minLength/maxLength, so we explicitly check for null/undefined\r\n if (validationMinLength !== undefined && validationMinLength !== null) {\r\n payload.validationMinLength = validationMinLength;\r\n }\r\n // Omit the field if undefined/null to let backend handle defaults\r\n if (validationMaxLength !== undefined && validationMaxLength !== null) {\r\n payload.validationMaxLength = validationMaxLength;\r\n }\r\n // Omit the field if undefined/null to let backend handle defaults\r\n if (validationMin !== undefined && validationMin !== null) {\r\n payload.validationMin = validationMin;\r\n }\r\n // Omit the field if undefined/null to let backend handle defaults\r\n if (validationMax !== undefined && validationMax !== null) {\r\n payload.validationMax = validationMax;\r\n }\r\n // Omit the field if undefined/null/empty to let backend handle defaults\r\n if (validationPattern !== undefined && validationPattern !== null && validationPattern !== '') {\r\n payload.validationPattern = validationPattern;\r\n }\r\n \r\n return payload;\r\n}\r\n\r\n/**\r\n * Transforms an array of FormFields to bulk create payload\r\n */\r\nexport function transformFieldsToBulkPayload(\r\n fields: FormField[],\r\n formDefinitionId: string\r\n): BulkFieldPayload[] {\r\n const filteredFields = fields.filter((field) => {\r\n // Filter out layout-only fields (section, divider, header, spacer)\r\n const layoutFields = ['section', 'divider', 'header', 'spacer'];\r\n return !layoutFields.includes(field.type);\r\n });\r\n\r\n const payloads = filteredFields.map((field) => transformFieldToBulkPayload(field, formDefinitionId));\r\n\r\n // Log summary of API configuration fields\r\n const apiFields = payloads.filter((p) => {\r\n try {\r\n const metadata = p.metadata ? JSON.parse(p.metadata) : {};\r\n return !!metadata.apiEndpoint;\r\n } catch {\r\n return false;\r\n }\r\n });\r\n\r\n if (apiFields.length > 0) {\r\n console.log(`[fieldApiTransformer] Summary: ${apiFields.length} field(s) with API configuration:`, \r\n apiFields.map((f) => ({\r\n fieldKey: f.fieldKey,\r\n fieldType: f.fieldType,\r\n apiEndpoint: f.metadata ? (() => {\r\n try {\r\n const meta = JSON.parse(f.metadata);\r\n return meta.apiEndpoint;\r\n } catch {\r\n return 'parse-error';\r\n }\r\n })() : 'no-metadata',\r\n }))\r\n );\r\n }\r\n\r\n return payloads;\r\n}\r\n\r\n/**\r\n * Utility to sync fields to localStorage.\r\n */\r\nexport function syncFieldsToLocalStorage(formId: string | undefined, fields: FormField[]) {\r\n if (!formId) return;\r\n try {\r\n localStorage.setItem(`formsmith_fields_${formId}`, JSON.stringify(fields));\r\n } catch (e) {\r\n console.error('Failed to save fields to localStorage:', e);\r\n }\r\n}\r\n\r\n/**\r\n * Utility to get fields from localStorage.\r\n */\r\nexport function getFieldsFromLocalStorage(formId: string | undefined): FormField[] | null {\r\n if (!formId) return null;\r\n try {\r\n const stored = localStorage.getItem(`formsmith_fields_${formId}`);\r\n if (stored) {\r\n return JSON.parse(stored);\r\n }\r\n return null;\r\n } catch (e) {\r\n console.error('Failed to load fields from localStorage:', e);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Utility to clear fields from localStorage.\r\n */\r\nexport function clearFieldsFromLocalStorage(formId: string | undefined) {\r\n if (!formId) return;\r\n try {\r\n localStorage.removeItem(`formsmith_fields_${formId}`);\r\n console.log(`[clearFieldsFromLocalStorage] Cleared fields for form ${formId}`);\r\n } catch (e) {\r\n console.error('Failed to clear fields from localStorage:', e);\r\n }\r\n}\r\n"],"names":["transformFieldToBulkPayload","field","formDefinitionId","validation","isRequired","validationMinLength","validationMaxLength","validationMin","validationMax","validationPattern","rule","optionsString","props","appearance","size","labelPosition","hideLabel","customClass","apidata","metadata","apiData","getApiDataFromProperties","getNonApiMetadata","metadataString","positionRow","positionColumn","positionWidth","positionOrder","payload","transformFieldsToBulkPayload","fields","payloads","apiFields","p","f"],"mappings":"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"}
|
package/dist/form-renderer.es.js
CHANGED
|
@@ -111,5 +111,5 @@
|
|
|
111
111
|
*
|
|
112
112
|
* This source code is licensed under the ISC license.
|
|
113
113
|
* See the LICENSE file in the root directory of this source tree.
|
|
114
|
-
*/const Yi=_e("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]),da=({field:e,value:t,onChange:r,onBlur:n,error:a,disabled:o,readOnly:s,isRequired:l,className:c})=>{var u,p;const i=v.useCallback(h=>{r(h.target.value)},[r]),d=((u=e.appearance)==null?void 0:u.size)||"md",m={sm:"h-8 text-sm",md:"h-10",lg:"h-12 text-lg"};return b.jsx(Te,{field:e,error:a,isRequired:l,className:c,children:b.jsxs("div",{className:"relative",children:[b.jsx(Ki,{className:"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground"}),b.jsx(wt,{id:Se(e),type:"email",value:t||"",onChange:i,onBlur:n,placeholder:e.placeholder||"email@example.com",disabled:o||e.disabled,readOnly:s||e.readOnly,autoComplete:"email",inputMode:"email","aria-describedby":Pe(e,!!a),"aria-invalid":Me(!!a),"aria-required":l,className:q(m[d],"pl-10",a&&"border-destructive focus-visible:ring-destructive",(p=e.appearance)==null?void 0:p.className)})]})})},ua=({field:e,value:t,onChange:r,onBlur:n,error:a,disabled:o,readOnly:s,isRequired:l,className:c})=>{var u,p;const i=v.useCallback(h=>{const g=h.target.value.replace(/[^\d\s+\-()]/g,"");r(g)},[r]),d=((u=e.appearance)==null?void 0:u.size)||"md",m={sm:"h-8 text-sm",md:"h-10",lg:"h-12 text-lg"};return b.jsx(Te,{field:e,error:a,isRequired:l,className:c,children:b.jsxs("div",{className:"relative",children:[b.jsx(Gi,{className:"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground"}),b.jsx(wt,{id:Se(e),type:"tel",value:t||"",onChange:i,onBlur:n,placeholder:e.placeholder||"+91 12345 67890",disabled:o||e.disabled,readOnly:s||e.readOnly,autoComplete:"tel",inputMode:"tel","aria-describedby":Pe(e,!!a),"aria-invalid":Me(!!a),"aria-required":l,className:q(m[d],"pl-10",a&&"border-destructive focus-visible:ring-destructive",(p=e.appearance)==null?void 0:p.className)})]})})},pa=he.forwardRef(({className:e,...t},r)=>b.jsx("textarea",{className:q("flex min-h-[80px] w-full rounded-md border-2 border-border bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground/70 focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50",e),ref:r,...t}));pa.displayName="Textarea";const fa=({field:e,value:t,onChange:r,onBlur:n,error:a,disabled:o,readOnly:s,isRequired:l,className:c})=>{var h;const i=e.properties,d=v.useCallback(g=>{r(g.target.value)},[r]),m=(t||"").length,u=i==null?void 0:i.maxLength,p=u&&u>0;return b.jsx(Te,{field:e,error:a,isRequired:l,className:c,children:b.jsxs("div",{className:"relative",children:[b.jsx(pa,{id:Se(e),value:t||"",onChange:d,onBlur:n,placeholder:e.placeholder,disabled:o||e.disabled,readOnly:s||e.readOnly,minLength:i==null?void 0:i.minLength,maxLength:i==null?void 0:i.maxLength,rows:4,"aria-describedby":Pe(e,!!a),"aria-invalid":Me(!!a),"aria-required":l,className:q("min-h-[100px] resize-y",a&&"border-destructive focus-visible:ring-destructive",(h=e.appearance)==null?void 0:h.className)}),p&&b.jsxs("span",{className:"absolute bottom-2 right-2 text-xs text-muted-foreground",children:[m,"/",u]})]})})},zr=he.createContext({options:[],setOptions:()=>{}}),Xi=({value:e,defaultValue:t,onValueChange:r,disabled:n,children:a})=>{const[o,s]=he.useState(t||e||""),[l,c]=he.useState([]),i=e!==void 0?e:o,d=m=>{e===void 0&&s(m),r==null||r(m)};return he.useEffect(()=>{const m=p=>{const h=[];return he.Children.forEach(p,g=>{var f;he.isValidElement(g)&&(g.type&&g.type.displayName==="SelectContent"?h.push(...m(g.props.children)):g.type&&g.type.displayName==="SelectItem"?h.push({value:g.props.value,label:g.props.children,disabled:g.props.disabled}):h.push(...m((f=g.props)==null?void 0:f.children)))}),h},u=m(a);c(u)},[a]),b.jsx(zr.Provider,{value:{value:i,onValueChange:d,disabled:n,options:l,setOptions:c},children:a})},ma=he.forwardRef(({className:e,children:t,asChild:r,...n},a)=>{const o=he.useContext(zr),s=he.useRef(null);return b.jsxs("div",{"data-select-trigger":!0,ref:l=>{typeof a=="function"?a(l):a&&"current"in a&&(a.current=l)},className:q("relative flex h-10 w-full items-center justify-between rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground disabled:cursor-not-allowed disabled:opacity-50",e),...n,onClick:()=>{var l;return(l=s.current)==null?void 0:l.focus()},children:[t,b.jsxs("select",{ref:s,value:o.value||(o.options.length>0?"__placeholder__":""),onChange:l=>{var i,d;const c=l.target.value;if(c==="__placeholder__"){(i=o.onValueChange)==null||i.call(o,"");return}(d=o.onValueChange)==null||d.call(o,c)},disabled:o.disabled,className:"absolute inset-0 opacity-0 cursor-pointer z-10 [&:focus]:outline-none [&:focus]:ring-0 [&:focus]:ring-offset-0",style:{position:"absolute",width:"100%",height:"100%",left:0,top:0,outline:"none",border:"none",pointerEvents:"auto"},children:[!o.value&&o.options.length>0&&b.jsx("option",{value:"__placeholder__",disabled:!0,children:"Select..."}),o.options.map(l=>b.jsx("option",{value:l.value,disabled:l.disabled,children:typeof l.label=="string"?l.label:String(l.value)},l.value))]})]})});ma.displayName="SelectTrigger";const Qi=({placeholder:e,children:t})=>{const r=he.useContext(zr),n=r.options.find(o=>o.value===r.value),a=n?typeof n.label=="string"?n.label:String(n.value):e||"Select...";return b.jsx("span",{className:"flex-1",children:t||a})},ha=he.forwardRef(({className:e,children:t,...r},n)=>b.jsx("div",{ref:n,className:"hidden",...r,children:t}));ha.displayName="SelectContent";const Br=he.forwardRef(({className:e,children:t,value:r,disabled:n})=>b.jsx("span",{className:"hidden","data-value":r,"data-disabled":n,children:t}));Br.displayName="SelectItem";function St(e,t){if(!t||!e)return;const r=t.split(".");let n=e;for(const a of r){if(n==null)return;n=n[a]}return n}function ga(e,t,r){if(!e)return[];if(Array.isArray(e))return e.length===0?[]:typeof e[0]=="string"?e.map(n=>({label:n,value:n})):e.map(n=>{let a,o;if(t){const s=t.includes(".")?St(n,t):n[t];s!==void 0?a=String(s):a=n.label||n.name||n.title||n.text||n.username||n.email||String(n.value||n.id||n)}else a=n.label||n.name||n.title||n.text||n.username||n.email||String(n.value||n.id||n);if(r){const s=r.includes(".")?St(n,r):n[r];s!==void 0?o=String(s):o=n.value||n.id||n.key||n.email||n.username||String(n.label||n.name||n)}else o=n.value||n.id||n.key||n.email||n.username||String(n.label||n.name||n);return{label:String(a),value:String(o),disabled:n.disabled||!1}});if(typeof e=="object"){let n=e.data||e.items||e.results||e.options||e,a="";if(n&&typeof n=="object"&&!Array.isArray(n)){let o=null,s="";n.states?(o=n.states,s="states"):n.cities?(o=n.cities,s="cities"):n.districts?(o=n.districts,s="districts"):n.items?(o=n.items,s="items"):n.results?(o=n.results,s="results"):n.options?(o=n.options,s="options"):n.data?(o=n.data,s="data"):n.list&&(o=n.list,s="list"),Array.isArray(o)&&(a=`data.${s}.`,n=o)}if(Array.isArray(n)){const o=t!=null&&t.startsWith(a)?t.substring(a.length):t,s=r!=null&&r.startsWith(a)?r.substring(a.length):r;return ga(n,o,s)}}return[]}const ya=({field:e,value:t,onChange:r,onBlur:n,error:a,disabled:o,isRequired:s,className:l,formValues:c={}})=>{var D,re,U,M,ae,oe,_,$;const i=e.properties,d=i!=null&&i.apiEndpoint?{apiEndpoint:i.apiEndpoint,apiMethod:i.apiMethod,apiKey:i.apiKey,apiRealtime:i.apiRealtime,apiAutoDetect:i.apiAutoDetect,apiLabelField:i.apiLabelField,apiValueField:i.apiValueField,apiQueryParams:i.apiQueryParams,apiClientFilter:i.apiClientFilter,valueSource:i.valueSource,optionsSource:i.optionsSource}:null,m=e.apidata||null,u=d||m,[p,h]=v.useState([]),[g,f]=v.useState([]),[y,w]=v.useState([]),[x,C]=v.useState(!1),[O,S]=v.useState(null),F=!!(u!=null&&u.apiEndpoint&&((u==null?void 0:u.valueSource)==="api"||(u==null?void 0:u.optionsSource)==="api"||(i==null?void 0:i.valueSource)==="api"||(i==null?void 0:i.optionsSource)==="api")),A=e.options||(i==null?void 0:i.options)||[],T=Array.isArray(A)&&A.length>0?A.filter(N=>N!=null).map((N,Q)=>{if(typeof N=="string")return{label:N,value:N};if(typeof N=="object"&&N!==null){const J=N.label||N.value||String(N),k=N.value||N.label||String(N);return!J&&!k?{label:`Option ${Q+1}`,value:String(Q)}:{label:String(J),value:String(k),disabled:N.disabled||!1}}return{label:String(N),value:String(N)}}):[],V=v.useMemo(()=>{if(!((u==null?void 0:u.apiRealtime)||(i==null?void 0:i.apiRealtime)))return null;const J=((u==null?void 0:u.apiEndpoint)||(i==null?void 0:i.apiEndpoint)||"").match(/\{(\w+)\}/g)||[],k=(u==null?void 0:u.apiQueryParams)||(i==null?void 0:i.apiQueryParams)||{},Y=[];k.limit&&Y.push(...k.limit.match(/\{(\w+)\}/g)||[]),k.page&&Y.push(...k.page.match(/\{(\w+)\}/g)||[]),k.sort&&Y.push(...k.sort.match(/\{(\w+)\}/g)||[]),k.orderBy&&Y.push(...k.orderBy.match(/\{(\w+)\}/g)||[]),k.custom&&k.custom.forEach(({value:se})=>{se&&Y.push(...se.match(/\{(\w+)\}/g)||[])});const Ce=[...J,...Y];return new Set(Ce.map(se=>se.replace(/[{}]/g,"")))},[u==null?void 0:u.apiRealtime,i==null?void 0:i.apiRealtime,u==null?void 0:u.apiEndpoint,i==null?void 0:i.apiEndpoint,u==null?void 0:u.apiQueryParams,i==null?void 0:i.apiQueryParams]),le=v.useMemo(()=>{if(!(i!=null&&i.apiRealtime)||!V)return null;const N={};return V.forEach(Q=>{N[Q]=c[Q]}),JSON.stringify(N)},[i==null?void 0:i.apiRealtime,V,c]);v.useEffect(()=>{const N=u==null?void 0:u.apiEndpoint;if(!F||!N){h([]);return}(async()=>{C(!0),S(null);try{const J=(u==null?void 0:u.apiMethod)||(i==null?void 0:i.apiMethod)||"GET";let k=N;const Y=(u==null?void 0:u.apiRealtime)||(i==null?void 0:i.apiRealtime),Ce=N.match(/\{(\w+)\}/g)||[],se=(u==null?void 0:u.apiQueryParams)||(i==null?void 0:i.apiQueryParams)||{},X=[];se.custom&&se.custom.forEach(({value:I})=>{I&&X.push(...I.match(/\{(\w+)\}/g)||[])});const Oe=[...Ce,...X],xe=new Set(Oe.map(I=>I.replace(/[{}]/g,"")));let et=!0;if(xe.size>0&&Y)for(const I of xe){const R=c[I];if(R==null||R===""){et=!1;break}}if(!et&&Y&&xe.size>0){h([]),C(!1);return}if(Y&&(k=k.replace(/\{(\w+)\}/g,(I,R)=>{let j=c[R];if(j==null||j===""){const K=Object.keys(c).find(L=>L.toLowerCase()===R.toLowerCase());K&&(j=c[K])}return j==null||j===""?console.warn(`[SelectField] Placeholder ${I} could not be replaced. Available form values:`,Object.keys(c)):console.log(`[SelectField] Replaced ${I} with value:`,j),j!=null&&j!==""?String(j):I})),se&&Object.keys(se).length>0){const I=se,R=[];if(I.limit){let j=I.limit;Y&&Object.keys(c).length>0&&(j=j.replace(/\{(\w+)\}/g,(K,L)=>{const G=c[L];return G!=null?String(G):K})),R.push(`_limit=${encodeURIComponent(j)}`)}if(I.page){let j=I.page;Y&&Object.keys(c).length>0&&(j=j.replace(/\{(\w+)\}/g,(K,L)=>{const G=c[L];return G!=null?String(G):K})),R.push(`page=${encodeURIComponent(j)}`)}if(I.sort){let j=I.sort;Y&&Object.keys(c).length>0&&(j=j.replace(/\{(\w+)\}/g,(K,L)=>{const G=c[L];return G!=null?String(G):K})),R.push(`sort=${encodeURIComponent(j)}`)}if(I.orderBy){let j=I.orderBy;Y&&Object.keys(c).length>0&&(j=j.replace(/\{(\w+)\}/g,(K,L)=>{const G=c[L];return G!=null?String(G):K})),R.push(`orderBy=${encodeURIComponent(j)}`)}if(I.custom&&I.custom.length>0&&I.custom.forEach(({key:j,value:K})=>{if(j&&K){let L=K;Y&&Object.keys(c).length>0&&(L=L.replace(/\{(\w+)\}/g,(G,ee)=>{let W=c[ee];if(W==null||W===""){const z=Object.keys(c).find(ne=>ne.toLowerCase()===ee.toLowerCase());z&&(W=c[z])}return W!=null&&W!==""?String(W):G})),L.match(/\{[^}]+\}/)||R.push(`${encodeURIComponent(j)}=${encodeURIComponent(L)}`)}}),R.length>0){const j=k.includes("?")?"&":"?";k=`${k}${j}${R.join("&")}`}}const Ft={"Content-Type":"application/json"},dt=(u==null?void 0:u.apiKey)||(i==null?void 0:i.apiKey);dt&&(Ft["X-CSCAPI-KEY"]=dt);let $e={method:J.toLowerCase(),url:k,headers:Ft};if(Y&&Object.keys(c).length>0)if(J.toLowerCase()==="get"){const I=N.match(/\{(\w+)\}/g)||[],R=[];se.limit&&R.push(...se.limit.match(/\{(\w+)\}/g)||[]),se.page&&R.push(...se.page.match(/\{(\w+)\}/g)||[]),se.sort&&R.push(...se.sort.match(/\{(\w+)\}/g)||[]),se.orderBy&&R.push(...se.orderBy.match(/\{(\w+)\}/g)||[]),se.custom&&se.custom.forEach(({value:G})=>{G&&R.push(...G.match(/\{(\w+)\}/g)||[])});const j=[...I,...R],K=new Set(j.map(G=>G.replace(/[{}]/g,""))),L={};if(Object.keys(c).forEach(G=>{K.has(G)||(L[G]=c[G])}),Object.keys(L).length>0){const G=k.includes("?")?"&":"?",ee=new URLSearchParams(L).toString();k=`${k}${G}${ee}`}}else $e.data=c;else["post","put","patch"].includes(J.toLowerCase())&&($e.data=c||{});$e.url=k,console.log("[SelectField] Making API call:",{method:$e.method,url:$e.url,headers:$e.headers,formValues:c,fieldName:e.name});const Xe=await be($e),$t=(u==null?void 0:u.apiLabelField)||(i==null?void 0:i.apiLabelField),ut=(u==null?void 0:u.apiValueField)||(i==null?void 0:i.apiValueField),ve=Xe.data;let Le=[];Array.isArray(ve)?Le=ve:ve!=null&&ve.data&&(Array.isArray(ve.data)?Le=ve.data:ve.data.districts?Le=ve.data.districts:ve.data.states?Le=ve.data.states:ve.data.cities&&(Le=ve.data.cities)),w(Le);const De=ga(Xe.data,$t,ut);f(De);let pt=De;const Ge=(u==null?void 0:u.apiClientFilter)||(i==null?void 0:i.apiClientFilter);if(Ge&&Ge.filterField&&Ge.matchField){const I=c[Ge.matchField];I!=null?pt=De.filter(R=>{const j=Le.find(K=>{const L=St(K,ut||"code");return String(L)===String(R.value)});if(j){const K=St(j,Ge.filterField);return String(K)===String(I)}return!1}):pt=[]}h(pt)}catch(J){console.error("Failed to fetch dropdown options from API:",J),console.error("API Endpoint used:",N),console.error("Form values:",c);let k="Failed to load options";if(J.response){const Y=J.response.data;J.response.status===404?k="API endpoint not found. Check if the URL is correct and placeholders are replaced with valid values.":J.response.status===401?k="Authentication failed. Check your API key.":J.response.status===400?typeof Y=="string"?k=Y:Y&&typeof Y=="object"?k=Y.error||Y.message||Y.explanation||Y.detail||'Invalid request. Check if placeholder values are correct (e.g., country should be ISO2 code like "IN", "US", not full name).':k='Invalid request. Check if placeholder values are correct (e.g., country should be ISO2 code like "IN", "US", not full name).':typeof Y=="string"?k=Y:Y&&typeof Y=="object"?k=Y.error||Y.message||Y.explanation||Y.detail||`API error (${J.response.status})`:k=`API error (${J.response.status})`}else J.message&&(k=typeof J.message=="string"?J.message:"Failed to load options");typeof k!="string"&&(k="Failed to load options"),S(k),h([])}finally{C(!1)}})()},[F,u==null?void 0:u.apiEndpoint,u==null?void 0:u.apiMethod,i==null?void 0:i.apiEndpoint,i==null?void 0:i.apiMethod,le]),v.useEffect(()=>{const N=(u==null?void 0:u.apiClientFilter)||(i==null?void 0:i.apiClientFilter);if(!F||!N||y.length===0)return;const Q=c[N.matchField],J=(u==null?void 0:u.apiValueField)||(i==null?void 0:i.apiValueField);if(Q==null){h([]);return}const k=g.filter(Y=>{const Ce=y.find(se=>{const X=St(se,J||"code");return String(X)===String(Y.value)});if(Ce){const se=St(Ce,N.filterField);return String(se)===String(Q)}return!1});h(k)},[F,(D=u==null?void 0:u.apiClientFilter)==null?void 0:D.matchField,(re=i==null?void 0:i.apiClientFilter)==null?void 0:re.matchField,(U=u==null?void 0:u.apiClientFilter)==null?void 0:U.filterField,(M=i==null?void 0:i.apiClientFilter)==null?void 0:M.filterField,u==null?void 0:u.apiValueField,i==null?void 0:i.apiValueField,c[((ae=u==null?void 0:u.apiClientFilter)==null?void 0:ae.matchField)||((oe=i==null?void 0:i.apiClientFilter)==null?void 0:oe.matchField)||""],g,y]);const P=F?p.length>0?p:T.length>0?T:[]:T,me=v.useCallback(N=>{r(N),n==null||n()},[r,n]),ie=((_=e.appearance)==null?void 0:_.size)||"md",B={sm:"h-8 text-sm",md:"h-10",lg:"h-12 text-lg"};return b.jsx(Te,{field:e,error:a||O||void 0,isRequired:s,className:l,children:b.jsxs(Xi,{value:t||"",onValueChange:me,disabled:o||e.disabled||x,children:[b.jsx(ma,{id:Se(e),"aria-describedby":Pe(e,!!a||!!O),"aria-invalid":Me(!!a||!!O),"aria-required":s,className:q(B[ie],a&&"border-destructive focus-visible:ring-destructive",O&&"border-destructive focus-visible:ring-destructive",($=e.appearance)==null?void 0:$.className),children:b.jsxs("div",{className:"flex items-center gap-2",children:[x&&b.jsx(ia,{className:"h-4 w-4 animate-spin text-muted-foreground"}),b.jsx(Qi,{placeholder:e.placeholder||"Select an option"})]})}),b.jsx(ha,{children:P.length===0?b.jsx(Br,{value:"__no_options__",disabled:!0,children:x?"Loading options...":F?"No options available from API":"No options available"}):P.map((N,Q)=>{const J=String(N.value||N.label||Q),k=N.label||N.value||String(N);return b.jsx(Br,{value:J,disabled:N.disabled||!1,children:k},J)})})]})})},ba=he.forwardRef(({className:e,onCheckedChange:t,onChange:r,...n},a)=>{const o=s=>{r==null||r(s),t==null||t(!!s.target.checked)};return b.jsx("input",{type:"checkbox",className:q("h-4 w-4 rounded border border-primary text-primary focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",e),ref:a,...n,onChange:o})});ba.displayName="Checkbox";const va=({field:e,value:t,onChange:r,onBlur:n,error:a,disabled:o,isRequired:s,className:l})=>{const c=v.useCallback(i=>{r(i===!0),n==null||n()},[r,n]);return b.jsxs("div",{className:q("space-y-2",l),children:[b.jsxs("div",{className:"flex items-start space-x-3",children:[b.jsx(ba,{id:Se(e),checked:t||!1,onCheckedChange:c,disabled:o||e.disabled,"aria-describedby":Pe(e,!!a),"aria-required":s,className:q(a&&"border-destructive")}),b.jsxs("div",{className:"grid gap-1.5 leading-none",children:[b.jsxs(Rt,{id:$r(e),htmlFor:Se(e),className:q("text-sm font-medium cursor-pointer",a&&"text-destructive"),children:[e.label,s&&b.jsx("span",{className:"text-destructive ml-1",children:"*"})]}),e.description&&!a&&b.jsx("p",{id:or(e),className:"text-xs text-muted-foreground",children:e.description})]})]}),a&&b.jsx("p",{id:sr(e),className:"text-xs text-destructive",role:"alert",children:a})]})},wa=he.createContext({}),Sa=he.forwardRef(({className:e,value:t,onValueChange:r,disabled:n,...a},o)=>{const s=he.useId();return b.jsx(wa.Provider,{value:{value:t,onValueChange:r,name:s},children:b.jsx("div",{className:q("grid gap-2",e),ref:o,role:"radiogroup","aria-disabled":n,...a})})});Sa.displayName="RadioGroup";const xa=he.forwardRef(({className:e,value:t,...r},n)=>{const a=he.useContext(wa),o=a.value!==void 0?a.value===t:void 0,s=l=>{var c,i;(c=r.onChange)==null||c.call(r,l),(i=a.onValueChange)==null||i.call(a,l.target.value)};return b.jsx("input",{type:"radio",name:a.name,value:t,checked:o,className:q("h-4 w-4 border border-primary text-primary focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",e),ref:n,...r,onChange:s})});xa.displayName="RadioGroupItem";const Fa=({field:e,value:t,onChange:r,onBlur:n,error:a,disabled:o,isRequired:s,className:l})=>{const c=e.properties,i=(c==null?void 0:c.options)||[],d=v.useCallback(m=>{r(m),n==null||n()},[r,n]);return b.jsx(Te,{field:e,error:a,isRequired:s,className:l,children:b.jsx(Sa,{value:t||"",onValueChange:d,disabled:o||e.disabled,className:"flex flex-col space-y-2","aria-required":s,children:i.map(m=>b.jsxs("div",{className:"flex items-center space-x-3",children:[b.jsx(xa,{id:`${Se(e)}-${m.value}`,value:m.value,disabled:m.disabled,className:q(a&&"border-destructive")}),b.jsxs(Rt,{htmlFor:`${Se(e)}-${m.value}`,className:q("text-sm font-normal cursor-pointer",m.disabled&&"text-muted-foreground cursor-not-allowed"),children:[m.label,m.description&&b.jsx("span",{className:"block text-xs text-muted-foreground",children:m.description})]})]},m.value))})})},Ea=({field:e,value:t,onChange:r,onBlur:n,error:a,disabled:o,readOnly:s,isRequired:l,className:c})=>{var C,O,S,F;const i=e.properties,d=v.useCallback(A=>{r(A.target.value)},[r]),m=A=>{if(A)return A==="today"?new Date().toISOString().split("T")[0]:A},u=m(i==null?void 0:i.minDate),p=m(i==null?void 0:i.maxDate),g=(()=>{switch(e.type){case"time":return"time";case"datetime":return"datetime-local";case"daterange":return"date";default:return"date"}})(),f=((C=e.appearance)==null?void 0:C.size)||"md",y={sm:"h-8 text-sm",md:"h-10",lg:"h-12 text-lg"},w=((O=e.appearance)==null?void 0:O.labelPlacement)||"top",x=!((S=e.appearance)!=null&&S.hideLabel)&&e.label;return b.jsxs("div",{className:q("space-y-2 w-fit",w==="left"&&"flex items-start gap-4",c),children:[x&&b.jsxs(Rt,{id:$r(e),htmlFor:Se(e),className:q("text-sm font-medium",w==="left"&&"w-32 pt-2 text-right",a&&"text-destructive"),children:[e.label,l&&b.jsx("span",{className:"text-destructive ml-1",children:"*"})]}),b.jsxs("div",{className:"w-fit",children:[b.jsxs("div",{className:"relative w-fit max-w-full",children:[b.jsx(Bi,{className:"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground pointer-events-none"}),b.jsx(wt,{id:Se(e),type:g,value:t||"",onChange:d,onBlur:n,disabled:o||e.disabled,readOnly:s||e.readOnly,min:u,max:p,"aria-describedby":Pe(e,!!a),"aria-invalid":Me(!!a),"aria-required":l,className:q(y[f],"pl-10 w-fit",a&&"border-destructive focus-visible:ring-destructive",(F=e.appearance)==null?void 0:F.className)})]}),e.description&&!a&&b.jsx("p",{id:or(e),className:"mt-1.5 text-xs text-muted-foreground",children:e.description}),a&&b.jsx("p",{id:sr(e),className:"mt-1.5 text-xs text-destructive",role:"alert",children:a})]})]})},xt=he.forwardRef(({className:e,variant:t="default",size:r="default",...n},a)=>b.jsx("button",{className:q("inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50",{"bg-primary text-primary-foreground hover:bg-primary/90":t==="default","bg-destructive text-destructive-foreground hover:bg-destructive/90":t==="destructive","border border-input bg-background hover:bg-accent hover:text-accent-foreground":t==="outline","bg-secondary text-secondary-foreground hover:bg-secondary/80":t==="secondary","hover:bg-accent hover:text-accent-foreground":t==="ghost","text-primary underline-offset-4 hover:underline":t==="link","h-10 px-4 py-2":r==="default","h-9 rounded-md px-3":r==="sm","h-11 rounded-md px-8":r==="lg","h-10 w-10":r==="icon"},e),ref:a,...n}));xt.displayName="Button";function Ca(e){if(e===0)return"0 Bytes";const t=1024,r=["Bytes","KB","MB","GB"],n=Math.floor(Math.log(e)/Math.log(t));return parseFloat((e/Math.pow(t,n)).toFixed(2))+" "+r[n]}const Zi=({field:e,value:t,onChange:r,onBlur:n,error:a,disabled:o,isRequired:s,className:l})=>{var A;const c=e.properties,i=v.useRef(null),[d,m]=v.useState(!1),u=(c==null?void 0:c.multiple)??!1,p=((A=c==null?void 0:c.accept)==null?void 0:A.join(","))||"",h=(c==null?void 0:c.maxSize)||10*1024*1024,g=(c==null?void 0:c.maxFiles)||5,f=t?Array.isArray(t)?t:[t]:[],y=()=>{var T;(T=i.current)==null||T.click()},w=v.useCallback(T=>{const V=Array.from(T.target.files||[]);x(V),i.current&&(i.current.value="")},[r,u,h,g]),x=T=>{const V=T.filter(le=>le.size<=h);if(V.length!==T.length&&console.warn("Some files were rejected due to size limits"),u){const le=[...f,...V].slice(0,g);r(le)}else r(V[0]||null);n==null||n()},C=v.useCallback(T=>{if(u){const V=f.filter((le,P)=>P!==T);r(V.length>0?V:null)}else r(null)},[f,u,r]),O=T=>{T.preventDefault(),m(!0)},S=()=>{m(!1)},F=T=>{T.preventDefault(),m(!1);const V=Array.from(T.dataTransfer.files);x(V)};return b.jsx(Te,{field:e,error:a,isRequired:s,className:l,children:b.jsxs("div",{className:"space-y-3",children:[b.jsxs("div",{onClick:y,onDragOver:O,onDragLeave:S,onDrop:F,className:q("border-2 border-dashed rounded-lg p-6 text-center cursor-pointer transition-colors min-h-[180px] flex flex-col items-center justify-center","hover:border-primary hover:bg-primary/5",d&&"border-primary bg-primary/10",a&&"border-destructive",o&&"opacity-50 cursor-not-allowed"),children:[b.jsx("input",{ref:i,id:Se(e),type:"file",accept:p,multiple:u,onChange:w,disabled:o||e.disabled,className:"hidden","aria-describedby":Pe(e,!!a),"aria-invalid":Me(!!a),"aria-required":s}),b.jsx(Ji,{className:"mx-auto h-10 w-10 text-muted-foreground mb-3"}),b.jsx("p",{className:"text-sm text-muted-foreground",children:"Drag & drop files here, or click to browse"}),b.jsxs("p",{className:"text-xs text-muted-foreground mt-1",children:["Max size: ",Ca(h),u&&` • Max files: ${g}`]})]}),f.length>0&&b.jsx("ul",{className:"space-y-2",children:f.map((T,V)=>b.jsxs("li",{className:"flex items-center gap-3 p-2 bg-muted rounded-md",children:[b.jsx(Hi,{className:"h-4 w-4 text-muted-foreground flex-shrink-0"}),b.jsxs("div",{className:"flex-1 min-w-0",children:[b.jsx("p",{className:"text-sm truncate",children:T.name}),b.jsx("p",{className:"text-xs text-muted-foreground",children:Ca(T.size)})]}),b.jsx(xt,{type:"button",variant:"ghost",size:"icon",className:"h-7 w-7",onClick:()=>C(V),disabled:o,children:b.jsx(Yi,{className:"h-4 w-4"})})]},`${T.name}-${V}`))})]})})},el=({field:e,value:t,onChange:r,onBlur:n,error:a,disabled:o,readOnly:s,isRequired:l,className:c,onClick:i,onSubmit:d,onReset:m,onCancel:u,isSubmitting:p=!1,formValues:h={},bffSubmitApi:g})=>{var ie,B;const f=e.properties;let y=f==null?void 0:f.action;if(!y&&e.type==="button"){try{const D=e.metadata;typeof D=="string"?y=JSON.parse(D).action:D&&typeof D=="object"&&(y=D.action)}catch{}y=y||"submit"}y=y||"download";const w=(f==null?void 0:f.variant)||"default",x=(f==null?void 0:f.size)||"default",C=(f==null?void 0:f.hideLabel)??((ie=e.appearance)==null?void 0:ie.hideLabel)??!1,O=(f==null?void 0:f.buttonText)||e.label||"Button",S=(f==null?void 0:f.closeOnCancel)??!0,F=async D=>{D.preventDefault(),console.log("[ButtonField] Button clicked:",{fieldName:e.name,fieldType:e.type,action:y,hasOnSubmit:!!d,hasBffApi:!!g,hasButtonApi:!!((f==null?void 0:f.submitAction)==="api"&&(f!=null&&f.apiEndpoint))});const re=y==="submit"||e.type==="button"&&d?"submit":y;if(console.log("[ButtonField] Effective action:",re),re==="submit"){if(g&&g.url)try{await A();return}catch(U){console.error("BFF submission failed:",U)}if((f==null?void 0:f.submitAction)==="api"&&(f!=null&&f.apiEndpoint))try{await T(),d&&await d(D)}catch(U){console.error("API submission failed:",U),d&&await d(D)}else if(console.log("[ButtonField] Calling onSubmit handler"),d)try{const U=await d(D);console.log("[ButtonField] onSubmit completed:",U)}catch(U){throw console.error("[ButtonField] onSubmit error:",U),U}else console.warn("[ButtonField] Submit button clicked but no onSubmit handler provided")}else if(y==="reset"&&m)m();else if(y==="cancel")S?u&&u():m&&m();else if(y==="download"){if(f!=null&&f.downloadApiEndpoint)try{const U=(f==null?void 0:f.downloadApiMethod)||"GET",M={method:U,headers:{}};U!=="GET"&&U!=="DELETE"&&(M.headers={"Content-Type":"application/json"});const ae=await fetch(f.downloadApiEndpoint,M);if(!ae.ok)throw new Error(`Download failed: ${ae.statusText}`);const oe=await ae.blob(),_=window.URL.createObjectURL(oe),$=document.createElement("a");$.href=_;const N=ae.headers.get("Content-Disposition");let Q="download";if(N){const J=N.match(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/);J&&J[1]&&(Q=J[1].replace(/['"]/g,""))}$.download=Q,document.body.appendChild($),$.click(),document.body.removeChild($),window.URL.revokeObjectURL(_)}catch(U){console.error("Download failed:",U),alert("Failed to download file. Please check the API endpoint and try again.")}}else i?i():r&&t!==void 0&&r(t||"");n==null||n()},A=async()=>{var _,$;if(!g||!g.url)throw new Error("BFF submit API configuration is missing");const D={};Object.keys(h).forEach(N=>{const Q=e.name===N&&e.type==="button",J=N.toLowerCase().includes("button");!Q&&!J&&(D[N]=h[N])});const re={workflow_id:((_=g.payload)==null?void 0:_.workflow_id)||"",current_step_id:(($=g.payload)==null?void 0:$.current_step_id)||"",form_data:D};if((f==null?void 0:f.submitAction)==="api"&&(f!=null&&f.apiEndpoint))try{const N=await T();re.submit_result={success:N.success||!1,display_message:N.message||N.display_message}}catch(N){console.error("Button API call failed:",N),re.submit_result={success:!1,display_message:N instanceof Error?N.message:"Submission failed"}}const U=(g.method||"POST").toUpperCase(),M={"Content-Type":"application/json",...g.headers||{}},ae=await fetch(g.url,{method:U,headers:M,body:JSON.stringify(re)});if(!ae.ok){const N=await ae.text();throw new Error(`BFF submission failed: ${ae.status} ${N}`)}const oe=await ae.json();return console.log("[ButtonField] BFF submission successful:",oe),d&&await d(),oe},T=async()=>{if(!(f!=null&&f.apiEndpoint))throw new Error("Button API endpoint is not configured");const D=((f==null?void 0:f.submitApiMethod)||"POST").toUpperCase(),re=f.apiEndpoint;let U={};if(f.apiBodyStructure==="flat"?U={...h}:U={data:{...h}},f.apiFieldTypes&&Object.keys(f.apiFieldTypes).forEach(_=>{if(U[_]!==void 0){const $=f.apiFieldTypes[_],N=U[_];switch($){case"number":U[_]=Number(N)||0;break;case"boolean":U[_]=!!N;break;case"date":U[_]=N instanceof Date?N.toISOString():String(N);break;default:U[_]=String(N)}}}),f.apiFieldMapping){const _={};Object.keys(U).forEach($=>{const N=f.apiFieldMapping[$]||$;_[N]=U[$]}),U=_}f.apiBodyFields&&f.apiBodyFields.forEach(({key:_,value:$})=>{let N=$;if($.startsWith("{ctx:")){const Q=$.replace(/[{}ctx:]/g,"");N=h[Q]||h[`ctx_${Q}`]||$}U[_]=N});const M={"Content-Type":"application/json"};f.apiHeaders&&f.apiHeaders.forEach(({key:_,value:$})=>{M[_]=$});let ae=re;if(f.apiQueryParams&&f.apiQueryParams.length>0){const _=new URLSearchParams;f.apiQueryParams.forEach(({key:$,value:N})=>{_.append($,N)}),ae=`${ae}?${_.toString()}`}const oe=await fetch(ae,{method:D,headers:M,body:D!=="GET"?JSON.stringify(U):void 0});if(!oe.ok){const _=await oe.text();throw new Error(`Button API call failed: ${oe.status} ${_}`)}return await oe.json()},V=y==="submit"||e.type==="button"&&d?"submit":y,le=V==="submit"?"submit":V==="reset"?"reset":"button",P=o||e.disabled||s||e.readOnly||V==="submit"&&p,me=O;return b.jsx(Te,{field:e,error:a,isRequired:l,className:c,hideLabel:C,children:b.jsx(xt,{id:Se(e),type:le,variant:w,size:x,disabled:P,onClick:F,className:q((B=e.appearance)==null?void 0:B.className),children:me})})},tl=({field:e,value:t,onChange:r,onBlur:n,error:a,disabled:o,readOnly:s,isRequired:l,className:c})=>{const i=e.properties,d=(i==null?void 0:i.max)||5,m=(i==null?void 0:i.icon)||"star",u=g=>{o||s||e.disabled||e.readOnly||(r(g),n==null||n())},p=g=>{},h=g=>{const f=t>=g+1,y=q("transition-colors cursor-pointer",f?"fill-yellow-400 text-yellow-400":"text-muted-foreground",(o||s||e.disabled||e.readOnly)&&"cursor-not-allowed opacity-50",!(o||s||e.disabled||e.readOnly)&&"hover:text-yellow-400");return m==="star"?b.jsx(la,{className:q(y,"h-6 w-6"),onClick:()=>u(g+1),onMouseEnter:()=>p()},g):b.jsx(la,{className:q(y,"h-6 w-6"),onClick:()=>u(g+1),onMouseEnter:()=>p()},g)};return b.jsx(Te,{field:e,error:a,isRequired:l,className:c,children:b.jsxs("div",{id:Se(e),className:"flex items-center gap-1",role:"radiogroup","aria-label":e.label,"aria-describedby":Pe(e,!!a),"aria-invalid":Me(!!a),"aria-required":l,children:[Array.from({length:d},(g,f)=>h(f)),(i==null?void 0:i.showValue)!==!1&&b.jsx("span",{className:"ml-2 text-sm text-muted-foreground",children:t>0?t:""})]})})},Oa=he.forwardRef(({className:e,value:t,onValueChange:r,onChange:n,...a},o)=>{const s=Array.isArray(t)?t[0]:typeof t=="number"?t:t!=null?Number(t):void 0,l=s!=null?String(s):void 0,c=i=>{n==null||n(i);const d=Number(i.target.value);Number.isNaN(d)||r==null||r([d])};return b.jsx("input",{type:"range",className:q("w-full h-2 bg-secondary rounded-lg appearance-none cursor-pointer",e),ref:o,...a,value:l,onChange:c})});Oa.displayName="Slider";const rl=({field:e,value:t,onChange:r,onBlur:n,error:a,disabled:o,readOnly:s,isRequired:l,className:c})=>{var y;const i=e.properties,d=(i==null?void 0:i.min)??0,m=(i==null?void 0:i.max)??100,u=(i==null?void 0:i.step)??1,p=(i==null?void 0:i.showValue)!==!1,h=(i==null?void 0:i.marks)||[],g=w=>{o||s||e.disabled||e.readOnly||(r(w[0]??d),n==null||n())},f=t??d;return b.jsx(Te,{field:e,error:a,isRequired:l,className:c,children:b.jsxs("div",{className:"space-y-2",children:[b.jsxs("div",{className:"flex items-center justify-between",children:[p&&b.jsx("span",{className:"text-sm font-medium",children:f}),!p&&b.jsx("span",{className:"text-sm text-muted-foreground",children:d}),!p&&b.jsx("span",{className:"text-sm text-muted-foreground",children:m})]}),b.jsx(Oa,{id:Se(e),value:[f],onValueChange:g,min:d,max:m,step:u,disabled:o||e.disabled||s||e.readOnly,className:q("w-full",a&&"border-destructive",(y=e.appearance)==null?void 0:y.className),"aria-describedby":Pe(e,!!a),"aria-invalid":Me(!!a),"aria-required":l}),h.length>0&&b.jsx("div",{className:"flex justify-between text-xs text-muted-foreground",children:h.map((w,x)=>b.jsx("span",{className:"text-center",children:w.label},x))})]})})},nl=({field:e,value:t,onChange:r,onBlur:n,error:a,disabled:o,readOnly:s,isRequired:l,className:c})=>{const i=v.useRef(null),[d,m]=v.useState(!1),u=o||e.disabled||s||e.readOnly,p=v.useCallback(y=>{if(u)return;m(!0);const w=i.current;if(!w)return;const x=w.getContext("2d");if(!x)return;const C=w.getBoundingClientRect(),O="touches"in y?y.touches[0].clientX-C.left:y.clientX-C.left,S="touches"in y?y.touches[0].clientY-C.top:y.clientY-C.top;x.beginPath(),x.moveTo(O,S)},[u]),h=v.useCallback(y=>{if(!d||u)return;const w=i.current;if(!w)return;const x=w.getContext("2d");if(!x)return;const C=w.getBoundingClientRect(),O="touches"in y?y.touches[0].clientX-C.left:y.clientX-C.left,S="touches"in y?y.touches[0].clientY-C.top:y.clientY-C.top;x.lineWidth=2,x.lineCap="round",x.strokeStyle="#000",x.lineTo(O,S),x.stroke(),x.beginPath(),x.moveTo(O,S)},[d,u]),g=v.useCallback(()=>{if(!d)return;m(!1);const y=i.current;if(!y)return;const w=y.toDataURL();r(w),n==null||n()},[d,r,n]),f=v.useCallback(()=>{const y=i.current;if(!y||u)return;const w=y.getContext("2d");w&&(w.clearRect(0,0,y.width,y.height),r(null),n==null||n())},[u,r,n]);return v.useEffect(()=>{const y=i.current;if(y&&(y.width=y.offsetWidth,y.height=200,t)){const w=new Image;w.onload=()=>{const x=y.getContext("2d");x&&x.drawImage(w,0,0)},w.src=t}},[t]),b.jsx(Te,{field:e,error:a,isRequired:l,className:c,children:b.jsxs("div",{className:"space-y-2",children:[b.jsx("div",{className:q("border-2 border-dashed rounded-lg overflow-hidden",a&&"border-destructive",u&&"opacity-50 cursor-not-allowed"),children:b.jsx("canvas",{ref:i,id:Se(e),className:"w-full cursor-crosshair touch-none",onMouseDown:p,onMouseMove:h,onMouseUp:g,onMouseLeave:g,onTouchStart:p,onTouchMove:h,onTouchEnd:g,"aria-describedby":Pe(e,!!a),"aria-invalid":Me(!!a),"aria-required":l,style:{height:"200px"}})}),!u&&b.jsx("div",{className:"flex justify-end",children:b.jsxs(xt,{type:"button",variant:"outline",size:"sm",onClick:f,className:"text-xs",children:[b.jsx(ca,{className:"h-3 w-3 mr-1"}),"Clear"]})})]})})},al=({field:e,value:t,onChange:r,onBlur:n,error:a,disabled:o,readOnly:s,isRequired:l,className:c})=>{const i=e.properties,d=(i==null?void 0:i.columns)||[],m=(i==null?void 0:i.minRows)||1,u=(i==null?void 0:i.maxRows)||10,p=(i==null?void 0:i.allowAddRow)!==!1,h=(i==null?void 0:i.allowDeleteRow)!==!1,g=o||e.disabled||s||e.readOnly,f=t||[],y=p&&f.length<u,w=h&&f.length>m,x=v.useCallback(()=>{if(!y||g)return;const S={};d.forEach(F=>{S[F.name]=F.defaultValue??""}),r([...f,S]),n==null||n()},[f,d,y,g,r,n]),C=v.useCallback(S=>{if(!w||g)return;const F=f.filter((A,T)=>T!==S);r(F),n==null||n()},[f,w,g,r,n]),O=v.useCallback((S,F,A)=>{if(g)return;const T=[...f];T[S]||(T[S]={}),T[S][F]=A,r(T),n==null||n()},[f,g,r,n]);return v.useEffect(()=>{if(f.length<m){const S=[];for(let F=0;F<m;F++){const A={};d.forEach(T=>{A[T.name]=T.defaultValue??""}),S.push(A)}r(S)}},[m,d,r]),d.length===0?b.jsx(Te,{field:e,error:a,isRequired:l,className:c,children:b.jsx("div",{className:"p-4 border rounded-md bg-muted/50 text-sm text-muted-foreground",children:"No columns defined for this table field"})}):b.jsx(Te,{field:e,error:a,isRequired:l,className:c,children:b.jsxs("div",{id:Se(e),className:q("border rounded-lg overflow-hidden",a&&"border-destructive",g&&"opacity-50"),"aria-describedby":Pe(e,!!a),"aria-invalid":Me(!!a),"aria-required":l,children:[b.jsx("div",{className:"overflow-x-auto",children:b.jsxs("table",{className:"w-full border-collapse",children:[b.jsx("thead",{children:b.jsxs("tr",{className:"border-b bg-muted/50",children:[d.map(S=>b.jsx("th",{className:"px-4 py-2 text-left text-sm font-medium text-muted-foreground",children:S.label},S.id)),h&&b.jsx("th",{className:"w-12"})]})}),b.jsx("tbody",{children:f.map((S,F)=>b.jsxs("tr",{className:"border-b hover:bg-muted/30",children:[d.map(A=>{const T={...A,name:`${e.name}_${F}_${A.name}`},V=S[A.name],le=()=>{switch(A.type){case"text":case"password":case"url":return b.jsx(jr,{field:T,value:V||"",onChange:P=>O(F,A.name,P),disabled:g,readOnly:g,className:"min-w-[120px]"});case"number":return b.jsx(sa,{field:T,value:V??null,onChange:P=>O(F,A.name,P),disabled:g,readOnly:g,className:"min-w-[120px]"});case"email":return b.jsx(da,{field:T,value:V||"",onChange:P=>O(F,A.name,P),disabled:g,readOnly:g,className:"min-w-[120px]"});case"phone":case"aadhaar":return b.jsx(ua,{field:T,value:V||"",onChange:P=>O(F,A.name,P),disabled:g,readOnly:g,className:"min-w-[120px]"});case"textarea":return b.jsx(fa,{field:T,value:V||"",onChange:P=>O(F,A.name,P),disabled:g,readOnly:g,className:"min-w-[120px]"});case"select":case"multiselect":return b.jsx(ya,{field:T,value:V||"",onChange:P=>O(F,A.name,P),disabled:g,className:"min-w-[120px]"});case"checkbox":return b.jsx(va,{field:T,value:V||!1,onChange:P=>O(F,A.name,P),disabled:g,className:"min-w-[120px]"});case"radio":case"checkboxgroup":return b.jsx(Fa,{field:T,value:V||"",onChange:P=>O(F,A.name,P),disabled:g,className:"min-w-[120px]"});case"date":case"time":case"datetime":case"daterange":return b.jsx(Ea,{field:T,value:V||"",onChange:P=>O(F,A.name,P),disabled:g,readOnly:g,className:"min-w-[120px]"});default:return b.jsx(jr,{field:T,value:String(V||""),onChange:P=>O(F,A.name,P),disabled:g,readOnly:g,className:"min-w-[120px]"})}};return b.jsx("td",{className:"px-4 py-2",children:le()},A.id)}),h&&b.jsx("td",{className:"px-2 py-2",children:b.jsx(xt,{type:"button",variant:"ghost",size:"icon",className:"h-8 w-8",onClick:()=>C(F),disabled:!w||g,children:b.jsx(ca,{className:"h-4 w-4"})})})]},F))})]})}),y&&b.jsx("div",{className:"p-2 border-t bg-muted/30",children:b.jsxs(xt,{type:"button",variant:"ghost",size:"sm",onClick:x,disabled:g,className:"w-full",children:[b.jsx(Wi,{className:"h-4 w-4 mr-2"}),"Add Row"]})})]})})},Ia=({field:e,children:t,className:r})=>{const n=e.properties,a=(n==null?void 0:n.collapsible)??!1,o=(n==null?void 0:n.defaultCollapsed)??!1,s=(n==null?void 0:n.columns)??1,[l,c]=v.useState(o),i=()=>{a&&c(!l)},d={1:"grid-cols-1",2:"grid-cols-1 md:grid-cols-2",3:"grid-cols-1 md:grid-cols-2 lg:grid-cols-3",4:"grid-cols-1 md:grid-cols-2 lg:grid-cols-4"};return b.jsxs("div",{className:q("border rounded-lg bg-card",r),children:[b.jsxs("div",{className:q("flex items-center gap-2 px-4 py-3 border-b bg-muted/50",a&&"cursor-pointer hover:bg-muted/70 transition-colors"),onClick:i,children:[a&&b.jsx("span",{className:"text-muted-foreground",children:l?b.jsx(qi,{className:"h-4 w-4"}):b.jsx(Vi,{className:"h-4 w-4"})}),b.jsx("h3",{className:"font-medium text-sm",children:e.label}),e.description&&b.jsx("span",{className:"text-xs text-muted-foreground ml-2",children:e.description})]}),!l&&b.jsx("div",{className:q("p-4 grid gap-4",d[s]),children:t})]})},Na=he.forwardRef(({className:e,orientation:t="horizontal",decorative:r=!0,...n},a)=>b.jsx("div",{ref:a,role:r?"none":"separator","aria-orientation":t,className:q("shrink-0 bg-border",t==="horizontal"?"h-[1px] w-full":"h-full w-[1px]",e),...n}));Na.displayName="Separator";const ol=({field:e,className:t})=>b.jsx("div",{className:q("py-2",t),children:b.jsx(Na,{})}),sl=({field:e,className:t})=>b.jsxs("div",{className:q("space-y-1",t),children:[b.jsx("h3",{className:"text-lg font-semibold",children:e.label}),e.description&&b.jsx("p",{className:"text-sm text-muted-foreground",children:e.description})]}),il=({field:e,className:t})=>{var a;const r=((a=e.appearance)==null?void 0:a.size)||"md",n={sm:"h-4",md:"h-8",lg:"h-12"};return b.jsx("div",{className:q(n[r],t),"aria-hidden":"true"})},Mt=({field:e,value:t,error:r,onChange:n,onBlur:a,disabled:o,readOnly:s,isRequired:l,className:c,formValues:i={},onSubmit:d,onReset:m,onCancel:u,isSubmitting:p,bffSubmitApi:h})=>{switch(e.type){case"divider":return b.jsx(ol,{field:e,className:c});case"header":return b.jsx(sl,{field:e,className:c});case"spacer":return b.jsx(il,{field:e,className:c})}switch(e.type){case"text":case"password":case"url":return b.jsx(jr,{field:e,value:t||"",onChange:n,onBlur:a,error:r,disabled:o,readOnly:s,isRequired:l,className:c});case"number":return b.jsx(sa,{field:e,value:t??null,onChange:n,onBlur:a,error:r,disabled:o,readOnly:s,isRequired:l,className:c});case"email":return b.jsx(da,{field:e,value:t||"",onChange:n,onBlur:a,error:r,disabled:o,readOnly:s,isRequired:l,className:c});case"phone":case"aadhaar":return b.jsx(ua,{field:e,value:t||"",onChange:n,onBlur:a,error:r,disabled:o,readOnly:s,isRequired:l,className:c});case"textarea":case"richtext":return b.jsx(fa,{field:e,value:t||"",onChange:n,onBlur:a,error:r,disabled:o,readOnly:s,isRequired:l,className:c});case"select":case"multiselect":return b.jsx(ya,{field:e,value:t||"",onChange:n,onBlur:a,error:r,disabled:o,isRequired:l,className:c,formValues:i});case"checkbox":case"terms":return b.jsx(va,{field:e,value:t||!1,onChange:n,onBlur:a,error:r,disabled:o,isRequired:l,className:c});case"radio":case"checkboxgroup":return b.jsx(Fa,{field:e,value:t||"",onChange:n,onBlur:a,error:r,disabled:o,isRequired:l,className:c});case"date":case"time":case"datetime":case"daterange":return b.jsx(Ea,{field:e,value:t||"",onChange:n,onBlur:a,error:r,disabled:o,readOnly:s,isRequired:l,className:c});case"file":return b.jsx(Zi,{field:e,value:t,onChange:n,onBlur:a,error:r,disabled:o,isRequired:l,className:c});case"signature":return b.jsx(nl,{field:e,value:t||null,onChange:n,onBlur:a,error:r,disabled:o,readOnly:s,isRequired:l,className:c});case"rating":return b.jsx(tl,{field:e,value:t||0,onChange:n,onBlur:a,error:r,disabled:o,readOnly:s,isRequired:l,className:c});case"slider":return b.jsx(rl,{field:e,value:t||0,onChange:n,onBlur:a,error:r,disabled:o,readOnly:s,isRequired:l,className:c});case"table":return b.jsx(al,{field:e,value:t||[],onChange:n,onBlur:a,error:r,disabled:o,readOnly:s,isRequired:l,className:c});case"button":return b.jsx(el,{field:e,value:t,onChange:n,onBlur:a,error:r,disabled:o,readOnly:s,isRequired:l,className:c,onSubmit:d,onReset:m,onCancel:u,isSubmitting:p,formValues:i,bffSubmitApi:h});default:return b.jsx("div",{className:"p-3 border rounded-md bg-muted/50",children:b.jsxs("p",{className:"text-sm text-muted-foreground",children:["Unsupported field type: ",e.type]})})}},ll=({steps:e,currentStep:t,completedSteps:r,onStepClick:n,className:a})=>b.jsx("div",{className:q("mb-8",a),children:b.jsx("nav",{"aria-label":"Progress",children:b.jsx("ol",{className:"flex items-center",children:e.map((o,s)=>{const l=r.has(s),c=t===s,i=n&&(l||s===t+1||s<=t);return b.jsxs("li",{className:q("relative",s!==e.length-1&&"pr-8 sm:pr-20 flex-1"),children:[s!==e.length-1&&b.jsx("div",{className:q("absolute top-4 left-8 -right-8 sm:left-12 sm:-right-12 h-0.5",l?"bg-primary":"bg-border"),"aria-hidden":"true"}),b.jsx("button",{type:"button",onClick:()=>i&&(n==null?void 0:n(s)),disabled:!i,className:q("relative flex h-8 w-8 items-center justify-center rounded-full text-sm font-medium","transition-colors focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2",l&&"bg-primary text-primary-foreground",c&&!l&&"border-2 border-primary text-primary",!l&&!c&&"border-2 border-border text-muted-foreground",i&&"cursor-pointer hover:bg-primary/10",!i&&"cursor-default"),"aria-current":c?"step":void 0,children:l?b.jsx(Ui,{className:"h-4 w-4"}):b.jsx("span",{children:s+1})}),b.jsxs("div",{className:"mt-2",children:[b.jsx("span",{className:q("text-sm font-medium",c&&"text-primary",!c&&!l&&"text-muted-foreground"),children:o.name}),o.description&&b.jsx("p",{className:"text-xs text-muted-foreground hidden sm:block",children:o.description})]})]},o.id)})})})});function cl({className:e,size:t="md"}){const r={sm:"h-4 w-4",md:"h-8 w-8",lg:"h-12 w-12"};return b.jsx(ia,{className:q("animate-spin text-primary",r[t],e)})}const dl=({schema:e,formId:t,initialValues:r,onSubmit:n,onChange:a,onValidationError:o,onClose:s,mode:l="fill",className:c,children:i,gridLayout:d,submissionContext:m})=>{var Ge;const[u,p]=v.useState(e||null),[h,g]=v.useState(!!t&&!e),[f,y]=v.useState(null),w=v.useMemo(()=>{if(!u)return null;const I=u.layout,R=u.rules,j=u.clientMapping,K=(Array.isArray(u.fields)?u.fields:[]).map(ee=>{let W={...ee};if(ee.validationRules&&typeof ee.validationRules=="object"&&!ee.validation){const z=ee.validationRules,ne=[];z.required===!0&&ne.push({type:"required",message:"This field is required"}),z.minLength!==void 0&&typeof z.minLength=="number"&&ne.push({type:"minLength",value:z.minLength,message:`Minimum length is ${z.minLength}`}),z.maxLength!==void 0&&typeof z.maxLength=="number"&&ne.push({type:"maxLength",value:z.maxLength,message:`Maximum length is ${z.maxLength}`}),z.pattern&&typeof z.pattern=="string"&&ne.push({type:"pattern",value:z.pattern,message:"Invalid format"}),z.allowLetters!==void 0&&ne.push({type:"allowLetters",value:z.allowLetters}),z.allowNumbers!==void 0&&ne.push({type:"allowNumbers",value:z.allowNumbers}),z.allowSpecialChars!==void 0&&ne.push({type:"allowSpecialChars",value:z.allowSpecialChars}),ne.length>0&&(W={...W,validation:ne})}if(ee.apidata&&typeof ee.apidata=="object"){const z=ee.apidata,ne=W.properties||{};!ne.apiEndpoint&&z.apiEndpoint&&(W={...W,properties:{...ne,apiEndpoint:z.apiEndpoint,apiMethod:z.apiMethod,apiKey:z.apiKey,apiRealtime:z.apiRealtime,apiAutoDetect:z.apiAutoDetect,apiLabelField:z.apiLabelField,apiValueField:z.apiValueField,apiQueryParams:z.apiQueryParams,apiClientFilter:z.apiClientFilter,valueSource:z.valueSource||(z.apiEndpoint?"api":void 0),optionsSource:z.optionsSource||(z.apiEndpoint?"api":void 0)}})}return W});let L=u.config||{submitAction:"database",layout:"default",autoSave:!0,validateOnChange:!0,showFieldErrors:"inline"};return!L.layout&&I?typeof I=="object"&&I!==null?L.layout="default":typeof I=="string"&&["default","card","compact"].includes(I)?L.layout=I:L.layout="default":L.layout||(L.layout="default"),R&&!L.rules&&(L.rules=R),j&&!L.clientMapping&&(L.clientMapping=j),{...u,fields:K,config:L}},[u]);v.useEffect(()=>{t&&!e&&x()},[t,e]);const x=async()=>{if(t){g(!0);try{const I=await Ye.getForRendering(t),R=Nr(I.form,I.fields,I.layout,I.rules);p(R),I.BFF_submit_api&&(y(I.BFF_submit_api),console.log("[FormRenderer] BFF_submit_api loaded:",I.BFF_submit_api))}catch(I){console.error("Failed to load form:",I)}finally{g(!1)}}};if(h)return b.jsx("div",{className:"flex items-center justify-center py-12",children:b.jsx(cl,{})});if(!w)return b.jsx("div",{className:"text-center py-12 text-muted-foreground",children:"Form not found"});const C=w,O=v.useCallback(async I=>{if(n){const R=m?{...I,...m}:I;return n(R)}return{success:!0}},[n,m]),{values:S,errors:F,touched:A,isSubmitting:T,isValid:V,currentStep:le,totalSteps:P,completedSteps:me,currentStepFields:ie,isLastStep:B,setFieldValue:D,setFieldTouched:re,handleSubmit:U,resetForm:M,nextStep:ae,goToStep:oe,shouldShowField:_,isFieldEnabled:$,isFieldRequired:N,loadDraft:Q}=aa({schema:C,initialValues:r,onSubmit:O,onChange:a});$i({fields:C.fields,values:S}),v.useEffect(()=>{var I;(I=C.config)!=null&&I.allowDraft&&l==="fill"&&Q()},[C.id]),v.useEffect(()=>{Object.keys(F).length>0&&(o==null||o(F))},[F,o]);const J=P>1,k=l==="view",Y=C.fields.filter(I=>!I.parentId),se=[...J?ie:Y.length>0?Y:C.fields].filter(I=>!(!I||typeof I!="object"||!I.name&&!I.key)).sort((I,R)=>{var ee,W,z,ne;const j=typeof((ee=I.position)==null?void 0:ee.order)=="number"?I.position.order:typeof I.positionOrder=="number"?I.positionOrder:Number.MAX_SAFE_INTEGER,K=typeof((W=R.position)==null?void 0:W.order)=="number"?R.position.order:typeof R.positionOrder=="number"?R.positionOrder:Number.MAX_SAFE_INTEGER;if(j!==K)return j-K;const L=typeof((z=I.position)==null?void 0:z.column)=="number"?I.position.column:1,G=typeof((ne=R.position)==null?void 0:ne.column)=="number"?R.position.column:1;return L-G}),X=async I=>{if(I==null||I.preventDefault(),J&&!B)await ae();else return await U(I)},Oe=v.useCallback(()=>{M(),s&&s()},[M,s]),xe=((Ge=C.config)==null?void 0:Ge.layout)??C.layout??"default",et=["default","card","compact"].includes(xe)?xe:"default",Ft={default:"",card:"bg-card border rounded-lg shadow-sm p-6",compact:"space-y-2"},dt=d!=null,$e=(d==null?void 0:d.rows)??8,Xe=(d==null?void 0:d.columns)??3,$t=(d==null?void 0:d.verticalSpacing)||(d==null?void 0:d.spacing)||"16px",ut=(d==null?void 0:d.horizontalSpacing)||(d==null?void 0:d.spacing)||"16px",ve=I=>{const R=["richtext","textarea","multiselect","radio","checkboxgroup","signature"],K=I.position.rowSpan??1;return I.type==="file"?Math.max(K,3):R.includes(I.type)?Math.max(K,2):K},Le=I=>{const R=I.name||I.key||I.id,j=I.hidden===!0;return _(R)||!j&&R},De=(I,R,j)=>j.some(K=>{var Be,ft,We;if(!Le(K))return!1;const L=(Be=K.position)==null?void 0:Be.order;if(typeof L!="number")return!1;const G=((ft=K.position)==null?void 0:ft.column)??1,ee=ve(K),W=((We=K.position)==null?void 0:We.columnSpan)??1,z=I>=L&&I<L+ee,ne=R>=G-1&&R<G-1+W,pe=I===L&&R===G-1;return z&&ne&&!pe}),pt=(I,R)=>se.find(j=>{var G,ee;if(!Le(j))return!1;const K=(G=j.position)==null?void 0:G.order,L=((ee=j.position)==null?void 0:ee.column)??1;return typeof K=="number"&&K===I&&L===R+1});return b.jsx("div",{className:q("iq-line-form-renderer",c),children:b.jsxs("form",{onSubmit:X,className:q("space-y-6 pb-[100px]",Ft[et]),children:[J&&C.steps&&b.jsx(ll,{steps:C.steps,currentStep:le,completedSteps:me,onStepClick:oe}),dt?b.jsx("div",{className:"grid w-full",style:{gridTemplateRows:`repeat(${$e}, 95px)`,gridTemplateColumns:`repeat(${Xe}, 1fr)`,rowGap:$t,columnGap:ut},children:Array.from({length:$e},(I,R)=>Array.from({length:Xe},(j,K)=>{if(De(R,K,se))return b.jsx("div",{},`empty-${R}-${K}`);const L=pt(R,K);if(!L)return b.jsx("div",{},`empty-${R}-${K}`);const G=ve(L),ee=L.position.columnSpan??1;if(L.type==="section"){const z=C.fields.filter(ne=>ne.parentId===L.id&&ne.position!=null).sort((ne,pe)=>{var We,jt;const Be=typeof((We=ne.position)==null?void 0:We.order)=="number"?ne.position.order:0,ft=typeof((jt=pe.position)==null?void 0:jt.order)=="number"?pe.position.order:0;return Be-ft});return b.jsx("div",{style:{gridRow:`${R+1} / span ${G}`,gridColumn:`${K+1} / span ${ee}`},children:b.jsx(Ia,{field:L,children:z.map(ne=>{const pe=ne.name||ne.key||ne.id,Be=ne.hidden===!0;return _(pe)||!Be&&pe?b.jsx(Mt,{field:ne,value:S[pe],error:A[pe]?F[pe]:void 0,onChange:We=>D(pe,We),onBlur:()=>re(pe),disabled:!$(pe)||k||!!ne.disabled,readOnly:k||!!ne.readOnly,isRequired:N(pe),formValues:S,onSubmit:X,onReset:M,onCancel:Oe,isSubmitting:T,bffSubmitApi:f},ne.id):null})})},L.id)}const W=L.name||L.key||L.id;return b.jsx("div",{style:{gridRow:`${R+1} / span ${G}`,gridColumn:`${K+1} / span ${ee}`},children:b.jsx(Mt,{field:L,value:S[W],error:A[W]?F[W]:void 0,onChange:z=>D(W,z),onBlur:()=>re(W),disabled:!$(W)||k||!!L.disabled,readOnly:k||!!L.readOnly,isRequired:N(W),formValues:S,onSubmit:X,onReset:M,onCancel:Oe,isSubmitting:T,bffSubmitApi:f})},L.id)}))}):b.jsx("div",{className:"space-y-4",children:se.map(I=>{const R=I.name||I.key||I.id,j=I.hidden===!0;if(!(_(R)||!j&&R))return null;if(I.type==="section"){const G=C.fields.filter(ee=>ee.parentId===I.id&&ee.position!=null).sort((ee,W)=>{var pe,Be;const z=typeof((pe=ee.position)==null?void 0:pe.order)=="number"?ee.position.order:0,ne=typeof((Be=W.position)==null?void 0:Be.order)=="number"?W.position.order:0;return z-ne});return b.jsx(Ia,{field:I,children:G.map(ee=>{const W=ee.name||ee.key||ee.id,z=ee.hidden===!0;return _(W)||!z&&W?b.jsx(Mt,{field:ee,value:S[W],error:A[W]?F[W]:void 0,onChange:pe=>D(W,pe),onBlur:()=>re(W),disabled:!$(W)||k||!!ee.disabled,readOnly:k||!!ee.readOnly,isRequired:N(W),formValues:S,onSubmit:X,onReset:M,onCancel:Oe,isSubmitting:T,bffSubmitApi:f},ee.id):null})},I.id)}const L=I.name||I.key||I.id;return b.jsx(Mt,{field:I,value:S[L],error:A[L]?F[L]:void 0,onChange:G=>D(L,G),onBlur:()=>re(L),disabled:!$(L)||k||!!I.disabled,readOnly:k||!!I.readOnly,isRequired:N(L),formValues:S,onSubmit:X,onReset:M,onCancel:Oe,isSubmitting:T,bffSubmitApi:f},I.id)})}),i]})})};function ul({formSchema:e}){const t=v.useMemo(()=>{var d;if(!e)return[];const o=[];(!e.name||e.name.trim()==="")&&o.push({id:"form-name-required",type:"error",message:"Form name is required"});const s=new Set,l=new Set;e.fields.forEach((m,u)=>{const p=`field-${m.id}`;if(l.has(m.id)&&o.push({id:`${p}-duplicate-id`,type:"error",message:`Field "${m.label||m.name||`Field ${u+1}`}" has a duplicate ID`,fieldId:m.id}),l.add(m.id),m.name&&s.has(m.name)&&o.push({id:`${p}-duplicate-name`,type:"error",message:`Field "${m.label||m.name}" has a duplicate name: "${m.name}"`,fieldId:m.id}),m.name&&s.add(m.name),(!m.label||m.label.trim()==="")&&o.push({id:`${p}-missing-label`,type:"warning",message:`Field "${m.name||m.id}" is missing a label`,fieldId:m.id}),(!m.name||m.name.trim()==="")&&o.push({id:`${p}-missing-name`,type:"error",message:`Field "${m.label||m.id}" is missing a field name`,fieldId:m.id}),m.name&&!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(m.name)&&o.push({id:`${p}-invalid-name`,type:"error",message:`Field "${m.label||m.name}" has an invalid name. Use only letters, numbers, and underscores.`,fieldId:m.id}),["select","multiselect","radio","checkboxgroup"].includes(m.type)){const f=m.properties;(!(f!=null&&f.options)||f.options.length===0)&&o.push({id:`${p}-no-options`,type:"warning",message:`Field "${m.label||m.name}" has no options defined`,fieldId:m.id})}m.parentId&&(e.fields.some(y=>y.id===m.parentId)||o.push({id:`${p}-orphaned`,type:"error",message:`Field "${m.label||m.name}" references a non-existent parent`,fieldId:m.id}));const g=(f,y)=>{if(y.has(f))return!0;y.add(f);const w=e.fields.find(x=>x.id===f);return w!=null&&w.parentId?g(w.parentId,y):!1};m.parentId&&g(m.id,new Set)&&o.push({id:`${p}-circular-reference`,type:"error",message:`Field "${m.label||m.name}" has a circular parent reference`,fieldId:m.id})}),(d=e.config.workflowTrigger)!=null&&d.workflowId&&(e.fields.some(u=>{var p;return(p=u.validation)==null?void 0:p.some(h=>h.type==="required")})||o.push({id:"workflow-no-required-fields",type:"info",message:"Form linked to workflow but has no required fields"}));const c=e.fields.filter(m=>!m.parentId),i=new Map;return c.forEach(m=>{const u=m.position.order;i.has(u)||i.set(u,[]),i.get(u).push(m)}),i.forEach((m,u)=>{m.length>3&&o.push({id:`row-${u}-too-many-fields`,type:"warning",message:`Row ${u+1} has ${m.length} fields (maximum recommended is 3)`})}),o},[e]),r=v.useMemo(()=>t.filter(o=>o.type==="error"),[t]),n=v.useMemo(()=>t.filter(o=>o.type==="warning"),[t]),a=v.useMemo(()=>r.length===0,[r]);return{issues:t,errors:r,warnings:n,isValid:a}}function pl({field:e,value:t,allValues:r,validateOnChange:n=!1,validateOnBlur:a=!0,debounceMs:o=Io}){const[s,l]=v.useState(),[c,i]=v.useState(!1),d=v.useRef(void 0),m=v.useRef(t),u=v.useCallback(async()=>{if(!e.validation||e.validation.length===0){l(void 0);return}i(!0);let y;for(const w of e.validation){const x=ar(t,w,r);if(typeof x=="string"){y=x;break}}return l(y),i(!1),y},[e.validation,t,r]),p=v.useCallback(()=>{d.current&&clearTimeout(d.current),d.current=setTimeout(()=>{u()},o)},[u,o]);v.useEffect(()=>(n&&m.current!==t&&p(),m.current=t,()=>{d.current&&clearTimeout(d.current)}),[t,n,p]);const h=v.useCallback(()=>{a&&u()},[a,u]),g=v.useCallback(()=>{l(void 0)},[]),f=v.useCallback(y=>{l(y)},[]);return{error:s,isValidating:c,validate:u,handleBlur:h,clearError:g,setCustomError:f}}function Aa(e,t){const r={};let n=!1,a,o,s,l,c;e.validation&&Array.isArray(e.validation)&&e.validation.forEach(F=>{F.type==="required"?(n=!0,r.required=!0):F.type==="minLength"&&typeof F.value=="number"?(a=F.value,r.minLength=F.value):F.type==="maxLength"&&typeof F.value=="number"?(o=F.value,r.maxLength=F.value):F.type==="min"&&typeof F.value=="number"?(s=F.value,r.min=F.value):F.type==="max"&&typeof F.value=="number"?(l=F.value,r.max=F.value):F.type==="pattern"&&typeof F.value=="string"?(c=F.value,r.pattern=F.value):r[F.type]=F.value}),e.properties&&typeof e.properties=="object"&&e.properties.required===!0&&(n=!0,r.required=!0);let i;if(e.properties&&typeof e.properties=="object"){const F=e.properties;F.options&&Array.isArray(F.options)&&(i=JSON.stringify(F.options))}const d=e.appearance||{},m=d.size||"md",u=d.labelPlacement||"top",p=d.hideLabel||!1,h=d.className||"";let g,f={};if(e.properties){const F=e.properties,A=Wn(F);A&&(g=A,console.log(`[fieldApiTransformer] Field "${e.name}" (${e.type}) API config being saved in apidata:`,{apiEndpoint:A.apiEndpoint,apiMethod:A.apiMethod||"GET",apiRealtime:A.apiRealtime??!1,apiAutoDetect:A.apiAutoDetect??!1,apiLabelField:A.apiLabelField,apiValueField:A.apiValueField})),f=Jn(F)}f.disabled=e.disabled??!1,f.readOnly=e.readOnly??!1,f.hidden=e.hidden??!1,p!==void 0&&(f.hideLabel=p),e.properties&&e.properties.hideLabel!==void 0&&(f.hideLabel=e.properties.hideLabel);const y=JSON.stringify(f),w=e.position.order,x=e.position.column||1,C=e.position.columnSpan||1,O=e.position.order,S={formDefinitionId:t,fieldKey:e.name,fieldType:e.type,label:e.label,placeholder:e.placeholder,defaultValue:e.defaultValue?String(e.defaultValue):void 0,isRequired:n,position:{row:w,column:x,width:C,order:O},positionRow:w,positionColumn:x,positionWidth:C,positionOrder:O,validation:Object.keys(r).length>0?r:void 0,validationRequired:n,disabled:e.disabled??!1,readOnly:e.readOnly??!1,hidden:e.hidden??!1,size:m,labelPosition:u,hideLabel:p,customClass:h,options:i,metadata:y,...g&&{apidata:g},helpText:e.description};return a!=null&&(S.validationMinLength=a),o!=null&&(S.validationMaxLength=o),s!=null&&(S.validationMin=s),l!=null&&(S.validationMax=l),c!=null&&c!==""&&(S.validationPattern=c),S}function fl(e,t){const n=e.filter(o=>!["section","divider","header","spacer"].includes(o.type)).map(o=>Aa(o,t)),a=n.filter(o=>{try{return!!(o.metadata?JSON.parse(o.metadata):{}).apiEndpoint}catch{return!1}});return a.length>0&&console.log(`[fieldApiTransformer] Summary: ${a.length} field(s) with API configuration:`,a.map(o=>({fieldKey:o.fieldKey,fieldType:o.fieldType,apiEndpoint:o.metadata?(()=>{try{return JSON.parse(o.metadata).apiEndpoint}catch{return"parse-error"}})():"no-metadata"}))),n}const ml=Object.freeze(Object.defineProperty({__proto__:null,transformFieldToBulkPayload:Aa,transformFieldsToBulkPayload:fl},Symbol.toStringTag,{value:"Module"}));we.FIELD_TYPE_REGISTRY=ln,we.FieldRenderer=Mt,we.FormRenderer=dl,we.backendToFormSchema=Nr,we.useFieldValidation=pl,we.useFormRenderer=aa,we.useFormValidation=ul,Object.defineProperty(we,Symbol.toStringTag,{value:"Module"})});
|
|
114
|
+
*/const Yi=_e("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]),da=({field:e,value:t,onChange:r,onBlur:n,error:a,disabled:o,readOnly:s,isRequired:l,className:c})=>{var u,p;const i=v.useCallback(h=>{r(h.target.value)},[r]),d=((u=e.appearance)==null?void 0:u.size)||"md",m={sm:"h-8 text-sm",md:"h-10",lg:"h-12 text-lg"};return b.jsx(Te,{field:e,error:a,isRequired:l,className:c,children:b.jsxs("div",{className:"relative",children:[b.jsx(Ki,{className:"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground"}),b.jsx(wt,{id:Se(e),type:"email",value:t||"",onChange:i,onBlur:n,placeholder:e.placeholder||"email@example.com",disabled:o||e.disabled,readOnly:s||e.readOnly,autoComplete:"email",inputMode:"email","aria-describedby":Pe(e,!!a),"aria-invalid":Me(!!a),"aria-required":l,className:q(m[d],"pl-10",a&&"border-destructive focus-visible:ring-destructive",(p=e.appearance)==null?void 0:p.className)})]})})},ua=({field:e,value:t,onChange:r,onBlur:n,error:a,disabled:o,readOnly:s,isRequired:l,className:c})=>{var u,p;const i=v.useCallback(h=>{const g=h.target.value.replace(/[^\d\s+\-()]/g,"");r(g)},[r]),d=((u=e.appearance)==null?void 0:u.size)||"md",m={sm:"h-8 text-sm",md:"h-10",lg:"h-12 text-lg"};return b.jsx(Te,{field:e,error:a,isRequired:l,className:c,children:b.jsxs("div",{className:"relative",children:[b.jsx(Gi,{className:"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground"}),b.jsx(wt,{id:Se(e),type:"tel",value:t||"",onChange:i,onBlur:n,placeholder:e.placeholder||"+91 12345 67890",disabled:o||e.disabled,readOnly:s||e.readOnly,autoComplete:"tel",inputMode:"tel","aria-describedby":Pe(e,!!a),"aria-invalid":Me(!!a),"aria-required":l,className:q(m[d],"pl-10",a&&"border-destructive focus-visible:ring-destructive",(p=e.appearance)==null?void 0:p.className)})]})})},pa=he.forwardRef(({className:e,...t},r)=>b.jsx("textarea",{className:q("flex min-h-[80px] w-full rounded-md border-2 border-border bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground/70 focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50",e),ref:r,...t}));pa.displayName="Textarea";const fa=({field:e,value:t,onChange:r,onBlur:n,error:a,disabled:o,readOnly:s,isRequired:l,className:c})=>{var h;const i=e.properties,d=v.useCallback(g=>{r(g.target.value)},[r]),m=(t||"").length,u=i==null?void 0:i.maxLength,p=u&&u>0;return b.jsx(Te,{field:e,error:a,isRequired:l,className:c,children:b.jsxs("div",{className:"relative",children:[b.jsx(pa,{id:Se(e),value:t||"",onChange:d,onBlur:n,placeholder:e.placeholder,disabled:o||e.disabled,readOnly:s||e.readOnly,minLength:i==null?void 0:i.minLength,maxLength:i==null?void 0:i.maxLength,rows:4,"aria-describedby":Pe(e,!!a),"aria-invalid":Me(!!a),"aria-required":l,className:q("min-h-[100px] resize-y",a&&"border-destructive focus-visible:ring-destructive",(h=e.appearance)==null?void 0:h.className)}),p&&b.jsxs("span",{className:"absolute bottom-2 right-2 text-xs text-muted-foreground",children:[m,"/",u]})]})})},zr=he.createContext({options:[],setOptions:()=>{}}),Xi=({value:e,defaultValue:t,onValueChange:r,disabled:n,children:a})=>{const[o,s]=he.useState(t||e||""),[l,c]=he.useState([]),i=e!==void 0?e:o,d=m=>{e===void 0&&s(m),r==null||r(m)};return he.useEffect(()=>{const m=p=>{const h=[];return he.Children.forEach(p,g=>{var f;he.isValidElement(g)&&(g.type&&g.type.displayName==="SelectContent"?h.push(...m(g.props.children)):g.type&&g.type.displayName==="SelectItem"?h.push({value:g.props.value,label:g.props.children,disabled:g.props.disabled}):h.push(...m((f=g.props)==null?void 0:f.children)))}),h},u=m(a);c(u)},[a]),b.jsx(zr.Provider,{value:{value:i,onValueChange:d,disabled:n,options:l,setOptions:c},children:a})},ma=he.forwardRef(({className:e,children:t,asChild:r,...n},a)=>{const o=he.useContext(zr),s=he.useRef(null);return b.jsxs("div",{"data-select-trigger":!0,ref:l=>{typeof a=="function"?a(l):a&&"current"in a&&(a.current=l)},className:q("relative flex h-10 w-full items-center justify-between rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground disabled:cursor-not-allowed disabled:opacity-50",e),...n,onClick:()=>{var l;return(l=s.current)==null?void 0:l.focus()},children:[t,b.jsxs("select",{ref:s,value:o.value||(o.options.length>0?"__placeholder__":""),onChange:l=>{var i,d;const c=l.target.value;if(c==="__placeholder__"){(i=o.onValueChange)==null||i.call(o,"");return}(d=o.onValueChange)==null||d.call(o,c)},disabled:o.disabled,className:"absolute inset-0 opacity-0 cursor-pointer z-10 [&:focus]:outline-none [&:focus]:ring-0 [&:focus]:ring-offset-0",style:{position:"absolute",width:"100%",height:"100%",left:0,top:0,outline:"none",border:"none",pointerEvents:"auto"},children:[!o.value&&o.options.length>0&&b.jsx("option",{value:"__placeholder__",disabled:!0,children:"Select..."}),o.options.map(l=>b.jsx("option",{value:l.value,disabled:l.disabled,children:typeof l.label=="string"?l.label:String(l.value)},l.value))]})]})});ma.displayName="SelectTrigger";const Qi=({placeholder:e,children:t})=>{const r=he.useContext(zr),n=r.options.find(o=>o.value===r.value),a=n?typeof n.label=="string"?n.label:String(n.value):e||"Select...";return b.jsx("span",{className:"flex-1",children:t||a})},ha=he.forwardRef(({className:e,children:t,...r},n)=>b.jsx("div",{ref:n,className:"hidden",...r,children:t}));ha.displayName="SelectContent";const Br=he.forwardRef(({className:e,children:t,value:r,disabled:n})=>b.jsx("span",{className:"hidden","data-value":r,"data-disabled":n,children:t}));Br.displayName="SelectItem";function St(e,t){if(!t||!e)return;const r=t.split(".");let n=e;for(const a of r){if(n==null)return;n=n[a]}return n}function ga(e,t,r){if(!e)return[];if(Array.isArray(e))return e.length===0?[]:typeof e[0]=="string"?e.map(n=>({label:n,value:n})):e.map(n=>{let a,o;if(t){const s=t.includes(".")?St(n,t):n[t];s!==void 0?a=String(s):a=n.label||n.name||n.title||n.text||n.username||n.email||String(n.value||n.id||n)}else a=n.label||n.name||n.title||n.text||n.username||n.email||String(n.value||n.id||n);if(r){const s=r.includes(".")?St(n,r):n[r];s!==void 0?o=String(s):o=n.value||n.id||n.key||n.email||n.username||String(n.label||n.name||n)}else o=n.value||n.id||n.key||n.email||n.username||String(n.label||n.name||n);return{label:String(a),value:String(o),disabled:n.disabled||!1}});if(typeof e=="object"){let n=e.data||e.items||e.results||e.options||e,a="";if(n&&typeof n=="object"&&!Array.isArray(n)){let o=null,s="";n.states?(o=n.states,s="states"):n.cities?(o=n.cities,s="cities"):n.districts?(o=n.districts,s="districts"):n.items?(o=n.items,s="items"):n.results?(o=n.results,s="results"):n.options?(o=n.options,s="options"):n.data?(o=n.data,s="data"):n.list&&(o=n.list,s="list"),Array.isArray(o)&&(a=`data.${s}.`,n=o)}if(Array.isArray(n)){const o=t!=null&&t.startsWith(a)?t.substring(a.length):t,s=r!=null&&r.startsWith(a)?r.substring(a.length):r;return ga(n,o,s)}}return[]}const ya=({field:e,value:t,onChange:r,onBlur:n,error:a,disabled:o,isRequired:s,className:l,formValues:c={}})=>{var D,re,U,M,ae,oe,_,$;const i=e.properties,d=i!=null&&i.apiEndpoint?{apiEndpoint:i.apiEndpoint,apiMethod:i.apiMethod,apiKey:i.apiKey,apiRealtime:i.apiRealtime,apiAutoDetect:i.apiAutoDetect,apiLabelField:i.apiLabelField,apiValueField:i.apiValueField,apiQueryParams:i.apiQueryParams,apiClientFilter:i.apiClientFilter,valueSource:i.valueSource,optionsSource:i.optionsSource}:null,m=e.apidata||null,u=d||m,[p,h]=v.useState([]),[g,f]=v.useState([]),[y,w]=v.useState([]),[x,C]=v.useState(!1),[O,S]=v.useState(null),F=!!(u!=null&&u.apiEndpoint&&((u==null?void 0:u.valueSource)==="api"||(u==null?void 0:u.optionsSource)==="api"||(i==null?void 0:i.valueSource)==="api"||(i==null?void 0:i.optionsSource)==="api")),A=e.options||(i==null?void 0:i.options)||[],T=Array.isArray(A)&&A.length>0?A.filter(N=>N!=null).map((N,Q)=>{if(typeof N=="string")return{label:N,value:N};if(typeof N=="object"&&N!==null){const J=N.label||N.value||String(N),k=N.value||N.label||String(N);return!J&&!k?{label:`Option ${Q+1}`,value:String(Q)}:{label:String(J),value:String(k),disabled:N.disabled||!1}}return{label:String(N),value:String(N)}}):[],V=v.useMemo(()=>{if(!((u==null?void 0:u.apiRealtime)||(i==null?void 0:i.apiRealtime)))return null;const J=((u==null?void 0:u.apiEndpoint)||(i==null?void 0:i.apiEndpoint)||"").match(/\{(\w+)\}/g)||[],k=(u==null?void 0:u.apiQueryParams)||(i==null?void 0:i.apiQueryParams)||{},Y=[];k.limit&&Y.push(...k.limit.match(/\{(\w+)\}/g)||[]),k.page&&Y.push(...k.page.match(/\{(\w+)\}/g)||[]),k.sort&&Y.push(...k.sort.match(/\{(\w+)\}/g)||[]),k.orderBy&&Y.push(...k.orderBy.match(/\{(\w+)\}/g)||[]),k.custom&&k.custom.forEach(({value:se})=>{se&&Y.push(...se.match(/\{(\w+)\}/g)||[])});const Ce=[...J,...Y];return new Set(Ce.map(se=>se.replace(/[{}]/g,"")))},[u==null?void 0:u.apiRealtime,i==null?void 0:i.apiRealtime,u==null?void 0:u.apiEndpoint,i==null?void 0:i.apiEndpoint,u==null?void 0:u.apiQueryParams,i==null?void 0:i.apiQueryParams]),le=v.useMemo(()=>{if(!(i!=null&&i.apiRealtime)||!V)return null;const N={};return V.forEach(Q=>{N[Q]=c[Q]}),JSON.stringify(N)},[i==null?void 0:i.apiRealtime,V,c]);v.useEffect(()=>{const N=u==null?void 0:u.apiEndpoint;if(!F||!N){h([]);return}(async()=>{C(!0),S(null);try{const J=(u==null?void 0:u.apiMethod)||(i==null?void 0:i.apiMethod)||"GET";let k=N;const Y=(u==null?void 0:u.apiRealtime)||(i==null?void 0:i.apiRealtime),Ce=N.match(/\{(\w+)\}/g)||[],se=(u==null?void 0:u.apiQueryParams)||(i==null?void 0:i.apiQueryParams)||{},X=[];se.custom&&se.custom.forEach(({value:I})=>{I&&X.push(...I.match(/\{(\w+)\}/g)||[])});const Oe=[...Ce,...X],xe=new Set(Oe.map(I=>I.replace(/[{}]/g,"")));let et=!0;if(xe.size>0&&Y)for(const I of xe){const R=c[I];if(R==null||R===""){et=!1;break}}if(!et&&Y&&xe.size>0){h([]),C(!1);return}if(Y&&(k=k.replace(/\{(\w+)\}/g,(I,R)=>{let j=c[R];if(j==null||j===""){const K=Object.keys(c).find(L=>L.toLowerCase()===R.toLowerCase());K&&(j=c[K])}return j==null||j===""?console.warn(`[SelectField] Placeholder ${I} could not be replaced. Available form values:`,Object.keys(c)):console.log(`[SelectField] Replaced ${I} with value:`,j),j!=null&&j!==""?String(j):I})),se&&Object.keys(se).length>0){const I=se,R=[];if(I.limit){let j=I.limit;Y&&Object.keys(c).length>0&&(j=j.replace(/\{(\w+)\}/g,(K,L)=>{const G=c[L];return G!=null?String(G):K})),R.push(`_limit=${encodeURIComponent(j)}`)}if(I.page){let j=I.page;Y&&Object.keys(c).length>0&&(j=j.replace(/\{(\w+)\}/g,(K,L)=>{const G=c[L];return G!=null?String(G):K})),R.push(`page=${encodeURIComponent(j)}`)}if(I.sort){let j=I.sort;Y&&Object.keys(c).length>0&&(j=j.replace(/\{(\w+)\}/g,(K,L)=>{const G=c[L];return G!=null?String(G):K})),R.push(`sort=${encodeURIComponent(j)}`)}if(I.orderBy){let j=I.orderBy;Y&&Object.keys(c).length>0&&(j=j.replace(/\{(\w+)\}/g,(K,L)=>{const G=c[L];return G!=null?String(G):K})),R.push(`orderBy=${encodeURIComponent(j)}`)}if(I.custom&&I.custom.length>0&&I.custom.forEach(({key:j,value:K})=>{if(j&&K){let L=K;Y&&Object.keys(c).length>0&&(L=L.replace(/\{(\w+)\}/g,(G,ee)=>{let W=c[ee];if(W==null||W===""){const z=Object.keys(c).find(ne=>ne.toLowerCase()===ee.toLowerCase());z&&(W=c[z])}return W!=null&&W!==""?String(W):G})),L.match(/\{[^}]+\}/)||R.push(`${encodeURIComponent(j)}=${encodeURIComponent(L)}`)}}),R.length>0){const j=k.includes("?")?"&":"?";k=`${k}${j}${R.join("&")}`}}const Ft={"Content-Type":"application/json"},dt=(u==null?void 0:u.apiKey)||(i==null?void 0:i.apiKey);dt&&(Ft["X-CSCAPI-KEY"]=dt);let $e={method:J.toLowerCase(),url:k,headers:Ft};if(Y&&Object.keys(c).length>0)if(J.toLowerCase()==="get"){const I=N.match(/\{(\w+)\}/g)||[],R=[];se.limit&&R.push(...se.limit.match(/\{(\w+)\}/g)||[]),se.page&&R.push(...se.page.match(/\{(\w+)\}/g)||[]),se.sort&&R.push(...se.sort.match(/\{(\w+)\}/g)||[]),se.orderBy&&R.push(...se.orderBy.match(/\{(\w+)\}/g)||[]),se.custom&&se.custom.forEach(({value:G})=>{G&&R.push(...G.match(/\{(\w+)\}/g)||[])});const j=[...I,...R],K=new Set(j.map(G=>G.replace(/[{}]/g,""))),L={};if(Object.keys(c).forEach(G=>{K.has(G)||(L[G]=c[G])}),Object.keys(L).length>0){const G=k.includes("?")?"&":"?",ee=new URLSearchParams(L).toString();k=`${k}${G}${ee}`}}else $e.data=c;else["post","put","patch"].includes(J.toLowerCase())&&($e.data=c||{});$e.url=k,console.log("[SelectField] Making API call:",{method:$e.method,url:$e.url,headers:$e.headers,formValues:c,fieldName:e.name});const Xe=await be($e),$t=(u==null?void 0:u.apiLabelField)||(i==null?void 0:i.apiLabelField),ut=(u==null?void 0:u.apiValueField)||(i==null?void 0:i.apiValueField),ve=Xe.data;let Le=[];Array.isArray(ve)?Le=ve:ve!=null&&ve.data&&(Array.isArray(ve.data)?Le=ve.data:ve.data.districts?Le=ve.data.districts:ve.data.states?Le=ve.data.states:ve.data.cities&&(Le=ve.data.cities)),w(Le);const De=ga(Xe.data,$t,ut);f(De);let pt=De;const Ge=(u==null?void 0:u.apiClientFilter)||(i==null?void 0:i.apiClientFilter);if(Ge&&Ge.filterField&&Ge.matchField){const I=c[Ge.matchField];I!=null?pt=De.filter(R=>{const j=Le.find(K=>{const L=St(K,ut||"code");return String(L)===String(R.value)});if(j){const K=St(j,Ge.filterField);return String(K)===String(I)}return!1}):pt=[]}h(pt)}catch(J){console.error("Failed to fetch dropdown options from API:",J),console.error("API Endpoint used:",N),console.error("Form values:",c);let k="Failed to load options";if(J.response){const Y=J.response.data;J.response.status===404?k="API endpoint not found. Check if the URL is correct and placeholders are replaced with valid values.":J.response.status===401?k="Authentication failed. Check your API key.":J.response.status===400?typeof Y=="string"?k=Y:Y&&typeof Y=="object"?k=Y.error||Y.message||Y.explanation||Y.detail||'Invalid request. Check if placeholder values are correct (e.g., country should be ISO2 code like "IN", "US", not full name).':k='Invalid request. Check if placeholder values are correct (e.g., country should be ISO2 code like "IN", "US", not full name).':typeof Y=="string"?k=Y:Y&&typeof Y=="object"?k=Y.error||Y.message||Y.explanation||Y.detail||`API error (${J.response.status})`:k=`API error (${J.response.status})`}else J.message&&(k=typeof J.message=="string"?J.message:"Failed to load options");typeof k!="string"&&(k="Failed to load options"),S(k),h([])}finally{C(!1)}})()},[F,u==null?void 0:u.apiEndpoint,u==null?void 0:u.apiMethod,i==null?void 0:i.apiEndpoint,i==null?void 0:i.apiMethod,le]),v.useEffect(()=>{const N=(u==null?void 0:u.apiClientFilter)||(i==null?void 0:i.apiClientFilter);if(!F||!N||y.length===0)return;const Q=c[N.matchField],J=(u==null?void 0:u.apiValueField)||(i==null?void 0:i.apiValueField);if(Q==null){h([]);return}const k=g.filter(Y=>{const Ce=y.find(se=>{const X=St(se,J||"code");return String(X)===String(Y.value)});if(Ce){const se=St(Ce,N.filterField);return String(se)===String(Q)}return!1});h(k)},[F,(D=u==null?void 0:u.apiClientFilter)==null?void 0:D.matchField,(re=i==null?void 0:i.apiClientFilter)==null?void 0:re.matchField,(U=u==null?void 0:u.apiClientFilter)==null?void 0:U.filterField,(M=i==null?void 0:i.apiClientFilter)==null?void 0:M.filterField,u==null?void 0:u.apiValueField,i==null?void 0:i.apiValueField,c[((ae=u==null?void 0:u.apiClientFilter)==null?void 0:ae.matchField)||((oe=i==null?void 0:i.apiClientFilter)==null?void 0:oe.matchField)||""],g,y]);const P=F?p.length>0?p:T.length>0?T:[]:T,me=v.useCallback(N=>{r(N),n==null||n()},[r,n]),ie=((_=e.appearance)==null?void 0:_.size)||"md",B={sm:"h-8 text-sm",md:"h-10",lg:"h-12 text-lg"};return b.jsx(Te,{field:e,error:a||O||void 0,isRequired:s,className:l,children:b.jsxs(Xi,{value:t||"",onValueChange:me,disabled:o||e.disabled||x,children:[b.jsx(ma,{id:Se(e),"aria-describedby":Pe(e,!!a||!!O),"aria-invalid":Me(!!a||!!O),"aria-required":s,className:q(B[ie],a&&"border-destructive focus-visible:ring-destructive",O&&"border-destructive focus-visible:ring-destructive",($=e.appearance)==null?void 0:$.className),children:b.jsxs("div",{className:"flex items-center gap-2",children:[x&&b.jsx(ia,{className:"h-4 w-4 animate-spin text-muted-foreground"}),b.jsx(Qi,{placeholder:e.placeholder||"Select an option"})]})}),b.jsx(ha,{children:P.length===0?b.jsx(Br,{value:"__no_options__",disabled:!0,children:x?"Loading options...":F?"No options available from API":"No options available"}):P.map((N,Q)=>{const J=String(N.value||N.label||Q),k=N.label||N.value||String(N);return b.jsx(Br,{value:J,disabled:N.disabled||!1,children:k},J)})})]})})},ba=he.forwardRef(({className:e,onCheckedChange:t,onChange:r,...n},a)=>{const o=s=>{r==null||r(s),t==null||t(!!s.target.checked)};return b.jsx("input",{type:"checkbox",className:q("h-4 w-4 rounded border border-primary text-primary focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",e),ref:a,...n,onChange:o})});ba.displayName="Checkbox";const va=({field:e,value:t,onChange:r,onBlur:n,error:a,disabled:o,isRequired:s,className:l})=>{const c=v.useCallback(i=>{r(i===!0),n==null||n()},[r,n]);return b.jsxs("div",{className:q("space-y-2",l),children:[b.jsxs("div",{className:"flex items-start space-x-3",children:[b.jsx(ba,{id:Se(e),checked:t||!1,onCheckedChange:c,disabled:o||e.disabled,"aria-describedby":Pe(e,!!a),"aria-required":s,className:q(a&&"border-destructive")}),b.jsxs("div",{className:"grid gap-1.5 leading-none",children:[b.jsxs(Rt,{id:$r(e),htmlFor:Se(e),className:q("text-sm font-medium cursor-pointer",a&&"text-destructive"),children:[e.label,s&&b.jsx("span",{className:"text-destructive ml-1",children:"*"})]}),e.description&&!a&&b.jsx("p",{id:or(e),className:"text-xs text-muted-foreground",children:e.description})]})]}),a&&b.jsx("p",{id:sr(e),className:"text-xs text-destructive",role:"alert",children:a})]})},wa=he.createContext({}),Sa=he.forwardRef(({className:e,value:t,onValueChange:r,disabled:n,...a},o)=>{const s=he.useId();return b.jsx(wa.Provider,{value:{value:t,onValueChange:r,name:s},children:b.jsx("div",{className:q("grid gap-2",e),ref:o,role:"radiogroup","aria-disabled":n,...a})})});Sa.displayName="RadioGroup";const xa=he.forwardRef(({className:e,value:t,...r},n)=>{const a=he.useContext(wa),o=a.value!==void 0?a.value===t:void 0,s=l=>{var c,i;(c=r.onChange)==null||c.call(r,l),(i=a.onValueChange)==null||i.call(a,l.target.value)};return b.jsx("input",{type:"radio",name:a.name,value:t,checked:o,className:q("h-4 w-4 border border-primary text-primary focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",e),ref:n,...r,onChange:s})});xa.displayName="RadioGroupItem";const Fa=({field:e,value:t,onChange:r,onBlur:n,error:a,disabled:o,isRequired:s,className:l})=>{const c=e.properties,i=(c==null?void 0:c.options)||[],d=v.useCallback(m=>{r(m),n==null||n()},[r,n]);return b.jsx(Te,{field:e,error:a,isRequired:s,className:l,children:b.jsx(Sa,{value:t||"",onValueChange:d,disabled:o||e.disabled,className:"flex flex-col space-y-2","aria-required":s,children:i.map(m=>b.jsxs("div",{className:"flex items-center space-x-3",children:[b.jsx(xa,{id:`${Se(e)}-${m.value}`,value:m.value,disabled:m.disabled,className:q(a&&"border-destructive")}),b.jsxs(Rt,{htmlFor:`${Se(e)}-${m.value}`,className:q("text-sm font-normal cursor-pointer",m.disabled&&"text-muted-foreground cursor-not-allowed"),children:[m.label,m.description&&b.jsx("span",{className:"block text-xs text-muted-foreground",children:m.description})]})]},m.value))})})},Ea=({field:e,value:t,onChange:r,onBlur:n,error:a,disabled:o,readOnly:s,isRequired:l,className:c})=>{var C,O,S,F;const i=e.properties,d=v.useCallback(A=>{r(A.target.value)},[r]),m=A=>{if(A)return A==="today"?new Date().toISOString().split("T")[0]:A},u=m(i==null?void 0:i.minDate),p=m(i==null?void 0:i.maxDate),g=(()=>{switch(e.type){case"time":return"time";case"datetime":return"datetime-local";case"daterange":return"date";default:return"date"}})(),f=((C=e.appearance)==null?void 0:C.size)||"md",y={sm:"h-8 text-sm",md:"h-10",lg:"h-12 text-lg"},w=((O=e.appearance)==null?void 0:O.labelPlacement)||"top",x=!((S=e.appearance)!=null&&S.hideLabel)&&e.label;return b.jsxs("div",{className:q("space-y-2 w-fit",w==="left"&&"flex items-start gap-4",c),children:[x&&b.jsxs(Rt,{id:$r(e),htmlFor:Se(e),className:q("text-sm font-medium",w==="left"&&"w-32 pt-2 text-right",a&&"text-destructive"),children:[e.label,l&&b.jsx("span",{className:"text-destructive ml-1",children:"*"})]}),b.jsxs("div",{className:"w-fit",children:[b.jsxs("div",{className:"relative w-fit max-w-full",children:[b.jsx(Bi,{className:"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground pointer-events-none"}),b.jsx(wt,{id:Se(e),type:g,value:t||"",onChange:d,onBlur:n,disabled:o||e.disabled,readOnly:s||e.readOnly,min:u,max:p,"aria-describedby":Pe(e,!!a),"aria-invalid":Me(!!a),"aria-required":l,className:q(y[f],"pl-10 w-fit",a&&"border-destructive focus-visible:ring-destructive",(F=e.appearance)==null?void 0:F.className)})]}),e.description&&!a&&b.jsx("p",{id:or(e),className:"mt-1.5 text-xs text-muted-foreground",children:e.description}),a&&b.jsx("p",{id:sr(e),className:"mt-1.5 text-xs text-destructive",role:"alert",children:a})]})]})},xt=he.forwardRef(({className:e,variant:t="default",size:r="default",...n},a)=>b.jsx("button",{className:q("inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50",{"bg-primary text-primary-foreground hover:bg-primary/90":t==="default","bg-destructive text-destructive-foreground hover:bg-destructive/90":t==="destructive","border border-input bg-background hover:bg-accent hover:text-accent-foreground":t==="outline","bg-secondary text-secondary-foreground hover:bg-secondary/80":t==="secondary","hover:bg-accent hover:text-accent-foreground":t==="ghost","text-primary underline-offset-4 hover:underline":t==="link","h-10 px-4 py-2":r==="default","h-9 rounded-md px-3":r==="sm","h-11 rounded-md px-8":r==="lg","h-10 w-10":r==="icon"},e),ref:a,...n}));xt.displayName="Button";function Ca(e){if(e===0)return"0 Bytes";const t=1024,r=["Bytes","KB","MB","GB"],n=Math.floor(Math.log(e)/Math.log(t));return parseFloat((e/Math.pow(t,n)).toFixed(2))+" "+r[n]}const Zi=({field:e,value:t,onChange:r,onBlur:n,error:a,disabled:o,isRequired:s,className:l})=>{var A;const c=e.properties,i=v.useRef(null),[d,m]=v.useState(!1),u=(c==null?void 0:c.multiple)??!1,p=((A=c==null?void 0:c.accept)==null?void 0:A.join(","))||"",h=(c==null?void 0:c.maxSize)||10*1024*1024,g=(c==null?void 0:c.maxFiles)||5,f=t?Array.isArray(t)?t:[t]:[],y=()=>{var T;(T=i.current)==null||T.click()},w=v.useCallback(T=>{const V=Array.from(T.target.files||[]);x(V),i.current&&(i.current.value="")},[r,u,h,g]),x=T=>{const V=T.filter(le=>le.size<=h);if(V.length!==T.length&&console.warn("Some files were rejected due to size limits"),u){const le=[...f,...V].slice(0,g);r(le)}else r(V[0]||null);n==null||n()},C=v.useCallback(T=>{if(u){const V=f.filter((le,P)=>P!==T);r(V.length>0?V:null)}else r(null)},[f,u,r]),O=T=>{T.preventDefault(),m(!0)},S=()=>{m(!1)},F=T=>{T.preventDefault(),m(!1);const V=Array.from(T.dataTransfer.files);x(V)};return b.jsx(Te,{field:e,error:a,isRequired:s,className:l,children:b.jsxs("div",{className:"space-y-3",children:[b.jsxs("div",{onClick:y,onDragOver:O,onDragLeave:S,onDrop:F,className:q("border-2 border-dashed rounded-lg p-6 text-center cursor-pointer transition-colors min-h-[180px] flex flex-col items-center justify-center","hover:border-primary hover:bg-primary/5",d&&"border-primary bg-primary/10",a&&"border-destructive",o&&"opacity-50 cursor-not-allowed"),children:[b.jsx("input",{ref:i,id:Se(e),type:"file",accept:p,multiple:u,onChange:w,disabled:o||e.disabled,className:"hidden","aria-describedby":Pe(e,!!a),"aria-invalid":Me(!!a),"aria-required":s}),b.jsx(Ji,{className:"mx-auto h-10 w-10 text-muted-foreground mb-3"}),b.jsx("p",{className:"text-sm text-muted-foreground",children:"Drag & drop files here, or click to browse"}),b.jsxs("p",{className:"text-xs text-muted-foreground mt-1",children:["Max size: ",Ca(h),u&&` • Max files: ${g}`]})]}),f.length>0&&b.jsx("ul",{className:"space-y-2",children:f.map((T,V)=>b.jsxs("li",{className:"flex items-center gap-3 p-2 bg-muted rounded-md",children:[b.jsx(Hi,{className:"h-4 w-4 text-muted-foreground flex-shrink-0"}),b.jsxs("div",{className:"flex-1 min-w-0",children:[b.jsx("p",{className:"text-sm truncate",children:T.name}),b.jsx("p",{className:"text-xs text-muted-foreground",children:Ca(T.size)})]}),b.jsx(xt,{type:"button",variant:"ghost",size:"icon",className:"h-7 w-7",onClick:()=>C(V),disabled:o,children:b.jsx(Yi,{className:"h-4 w-4"})})]},`${T.name}-${V}`))})]})})},el=({field:e,value:t,onChange:r,onBlur:n,error:a,disabled:o,readOnly:s,isRequired:l,className:c,onClick:i,onSubmit:d,onReset:m,onCancel:u,isSubmitting:p=!1,formValues:h={},bffSubmitApi:g})=>{var ie,B;const f=e.properties;let y=f==null?void 0:f.action;if(!y&&e.type==="button"){try{const D=e.metadata;typeof D=="string"?y=JSON.parse(D).action:D&&typeof D=="object"&&(y=D.action)}catch{}y=y||"submit"}y=y||"download";const w=(f==null?void 0:f.variant)||"default",x=(f==null?void 0:f.size)||"default",C=(f==null?void 0:f.hideLabel)??((ie=e.appearance)==null?void 0:ie.hideLabel)??!1,O=(f==null?void 0:f.buttonText)||e.label||"Button",S=(f==null?void 0:f.closeOnCancel)??!0,F=async D=>{D.preventDefault(),console.log("[ButtonField] Button clicked:",{fieldName:e.name,fieldType:e.type,action:y,hasOnSubmit:!!d,hasBffApi:!!g,hasButtonApi:!!((f==null?void 0:f.submitAction)==="api"&&(f!=null&&f.apiEndpoint))});const re=y==="submit"||e.type==="button"&&d?"submit":y;if(console.log("[ButtonField] Effective action:",re),re==="submit"){if(g&&g.url)try{await A();return}catch(U){console.error("BFF submission failed:",U)}if((f==null?void 0:f.submitAction)==="api"&&(f!=null&&f.apiEndpoint))try{await T(),d&&await d(D)}catch(U){console.error("API submission failed:",U),d&&await d(D)}else if(console.log("[ButtonField] Calling onSubmit handler"),d)try{const U=await d(D);console.log("[ButtonField] onSubmit completed:",U)}catch(U){throw console.error("[ButtonField] onSubmit error:",U),U}else console.warn("[ButtonField] Submit button clicked but no onSubmit handler provided")}else if(y==="reset"&&m)m();else if(y==="cancel")S?u&&u():m&&m();else if(y==="download"){if(f!=null&&f.downloadApiEndpoint)try{const U=(f==null?void 0:f.downloadApiMethod)||"GET",M={method:U,headers:{}};U!=="GET"&&U!=="DELETE"&&(M.headers={"Content-Type":"application/json"});const ae=await fetch(f.downloadApiEndpoint,M);if(!ae.ok)throw new Error(`Download failed: ${ae.statusText}`);const oe=await ae.blob(),_=window.URL.createObjectURL(oe),$=document.createElement("a");$.href=_;const N=ae.headers.get("Content-Disposition");let Q="download";if(N){const J=N.match(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/);J&&J[1]&&(Q=J[1].replace(/['"]/g,""))}$.download=Q,document.body.appendChild($),$.click(),document.body.removeChild($),window.URL.revokeObjectURL(_)}catch(U){console.error("Download failed:",U),alert("Failed to download file. Please check the API endpoint and try again.")}}else i?i():r&&t!==void 0&&r(t||"");n==null||n()},A=async()=>{var _,$;if(!g||!g.url)throw new Error("BFF submit API configuration is missing");const D={};Object.keys(h).forEach(N=>{const Q=e.name===N&&e.type==="button",J=N.toLowerCase().includes("button");!Q&&!J&&(D[N]=h[N])});const re={workflow_id:((_=g.payload)==null?void 0:_.workflow_id)||"",current_step_id:(($=g.payload)==null?void 0:$.current_step_id)||"",form_data:D};if((f==null?void 0:f.submitAction)==="api"&&(f!=null&&f.apiEndpoint))try{const N=await T();re.submit_result={success:N.success||!1,display_message:N.message||N.display_message}}catch(N){console.error("Button API call failed:",N),re.submit_result={success:!1,display_message:N instanceof Error?N.message:"Submission failed"}}const U=(g.method||"POST").toUpperCase(),M={"Content-Type":"application/json",...g.headers||{}},ae=await fetch(g.url,{method:U,headers:M,body:JSON.stringify(re)});if(!ae.ok){const N=await ae.text();throw new Error(`BFF submission failed: ${ae.status} ${N}`)}const oe=await ae.json();return console.log("[ButtonField] BFF submission successful:",oe),d&&await d(),oe},T=async()=>{if(!(f!=null&&f.apiEndpoint))throw new Error("Button API endpoint is not configured");const D=((f==null?void 0:f.submitApiMethod)||"POST").toUpperCase(),re=f.apiEndpoint;let U={};if(f.apiBodyStructure==="flat"?U={...h}:U={data:{...h}},f.apiFieldTypes&&Object.keys(f.apiFieldTypes).forEach(_=>{if(U[_]!==void 0){const $=f.apiFieldTypes[_],N=U[_];switch($){case"number":U[_]=Number(N)||0;break;case"boolean":U[_]=!!N;break;case"date":U[_]=N instanceof Date?N.toISOString():String(N);break;default:U[_]=String(N)}}}),f.apiFieldMapping){const _={};Object.keys(U).forEach($=>{const N=f.apiFieldMapping[$]||$;_[N]=U[$]}),U=_}f.apiBodyFields&&f.apiBodyFields.forEach(({key:_,value:$})=>{let N=$;if($.startsWith("{ctx:")){const Q=$.replace(/[{}ctx:]/g,"");N=h[Q]||h[`ctx_${Q}`]||$}U[_]=N});const M={"Content-Type":"application/json"};f.apiHeaders&&f.apiHeaders.forEach(({key:_,value:$})=>{M[_]=$});let ae=re;if(f.apiQueryParams&&f.apiQueryParams.length>0){const _=new URLSearchParams;f.apiQueryParams.forEach(({key:$,value:N})=>{_.append($,N)}),ae=`${ae}?${_.toString()}`}const oe=await fetch(ae,{method:D,headers:M,body:D!=="GET"?JSON.stringify(U):void 0});if(!oe.ok){const _=await oe.text();throw new Error(`Button API call failed: ${oe.status} ${_}`)}return await oe.json()},V=y==="submit"||e.type==="button"&&d?"submit":y,le=V==="submit"?"submit":V==="reset"?"reset":"button",P=o||e.disabled||s||e.readOnly||V==="submit"&&p,me=O;return b.jsx(Te,{field:e,error:a,isRequired:l,className:c,hideLabel:C,children:b.jsx(xt,{id:Se(e),type:le,variant:w,size:x,disabled:P,onClick:F,className:q((B=e.appearance)==null?void 0:B.className),children:me})})},tl=({field:e,value:t,onChange:r,onBlur:n,error:a,disabled:o,readOnly:s,isRequired:l,className:c})=>{const i=e.properties,d=(i==null?void 0:i.max)||5,m=(i==null?void 0:i.icon)||"star",u=g=>{o||s||e.disabled||e.readOnly||(r(g),n==null||n())},p=g=>{},h=g=>{const f=t>=g+1,y=q("transition-colors cursor-pointer",f?"fill-yellow-400 text-yellow-400":"text-muted-foreground",(o||s||e.disabled||e.readOnly)&&"cursor-not-allowed opacity-50",!(o||s||e.disabled||e.readOnly)&&"hover:text-yellow-400");return m==="star"?b.jsx(la,{className:q(y,"h-6 w-6"),onClick:()=>u(g+1),onMouseEnter:()=>p()},g):b.jsx(la,{className:q(y,"h-6 w-6"),onClick:()=>u(g+1),onMouseEnter:()=>p()},g)};return b.jsx(Te,{field:e,error:a,isRequired:l,className:c,children:b.jsxs("div",{id:Se(e),className:"flex items-center gap-1",role:"radiogroup","aria-label":e.label,"aria-describedby":Pe(e,!!a),"aria-invalid":Me(!!a),"aria-required":l,children:[Array.from({length:d},(g,f)=>h(f)),(i==null?void 0:i.showValue)!==!1&&b.jsx("span",{className:"ml-2 text-sm text-muted-foreground",children:t>0?t:""})]})})},Oa=he.forwardRef(({className:e,value:t,onValueChange:r,onChange:n,...a},o)=>{const s=Array.isArray(t)?t[0]:typeof t=="number"?t:t!=null?Number(t):void 0,l=s!=null?String(s):void 0,c=i=>{n==null||n(i);const d=Number(i.target.value);Number.isNaN(d)||r==null||r([d])};return b.jsx("input",{type:"range",className:q("w-full h-2 bg-secondary rounded-lg appearance-none cursor-pointer",e),ref:o,...a,value:l,onChange:c})});Oa.displayName="Slider";const rl=({field:e,value:t,onChange:r,onBlur:n,error:a,disabled:o,readOnly:s,isRequired:l,className:c})=>{var y;const i=e.properties,d=(i==null?void 0:i.min)??0,m=(i==null?void 0:i.max)??100,u=(i==null?void 0:i.step)??1,p=(i==null?void 0:i.showValue)!==!1,h=(i==null?void 0:i.marks)||[],g=w=>{o||s||e.disabled||e.readOnly||(r(w[0]??d),n==null||n())},f=t??d;return b.jsx(Te,{field:e,error:a,isRequired:l,className:c,children:b.jsxs("div",{className:"space-y-2",children:[b.jsxs("div",{className:"flex items-center justify-between",children:[p&&b.jsx("span",{className:"text-sm font-medium",children:f}),!p&&b.jsx("span",{className:"text-sm text-muted-foreground",children:d}),!p&&b.jsx("span",{className:"text-sm text-muted-foreground",children:m})]}),b.jsx(Oa,{id:Se(e),value:[f],onValueChange:g,min:d,max:m,step:u,disabled:o||e.disabled||s||e.readOnly,className:q("w-full",a&&"border-destructive",(y=e.appearance)==null?void 0:y.className),"aria-describedby":Pe(e,!!a),"aria-invalid":Me(!!a),"aria-required":l}),h.length>0&&b.jsx("div",{className:"flex justify-between text-xs text-muted-foreground",children:h.map((w,x)=>b.jsx("span",{className:"text-center",children:w.label},x))})]})})},nl=({field:e,value:t,onChange:r,onBlur:n,error:a,disabled:o,readOnly:s,isRequired:l,className:c})=>{const i=v.useRef(null),[d,m]=v.useState(!1),u=o||e.disabled||s||e.readOnly,p=v.useCallback(y=>{if(u)return;m(!0);const w=i.current;if(!w)return;const x=w.getContext("2d");if(!x)return;const C=w.getBoundingClientRect(),O="touches"in y?y.touches[0].clientX-C.left:y.clientX-C.left,S="touches"in y?y.touches[0].clientY-C.top:y.clientY-C.top;x.beginPath(),x.moveTo(O,S)},[u]),h=v.useCallback(y=>{if(!d||u)return;const w=i.current;if(!w)return;const x=w.getContext("2d");if(!x)return;const C=w.getBoundingClientRect(),O="touches"in y?y.touches[0].clientX-C.left:y.clientX-C.left,S="touches"in y?y.touches[0].clientY-C.top:y.clientY-C.top;x.lineWidth=2,x.lineCap="round",x.strokeStyle="#000",x.lineTo(O,S),x.stroke(),x.beginPath(),x.moveTo(O,S)},[d,u]),g=v.useCallback(()=>{if(!d)return;m(!1);const y=i.current;if(!y)return;const w=y.toDataURL();r(w),n==null||n()},[d,r,n]),f=v.useCallback(()=>{const y=i.current;if(!y||u)return;const w=y.getContext("2d");w&&(w.clearRect(0,0,y.width,y.height),r(null),n==null||n())},[u,r,n]);return v.useEffect(()=>{const y=i.current;if(y&&(y.width=y.offsetWidth,y.height=200,t)){const w=new Image;w.onload=()=>{const x=y.getContext("2d");x&&x.drawImage(w,0,0)},w.src=t}},[t]),b.jsx(Te,{field:e,error:a,isRequired:l,className:c,children:b.jsxs("div",{className:"space-y-2",children:[b.jsx("div",{className:q("border-2 border-dashed rounded-lg overflow-hidden",a&&"border-destructive",u&&"opacity-50 cursor-not-allowed"),children:b.jsx("canvas",{ref:i,id:Se(e),className:"w-full cursor-crosshair touch-none",onMouseDown:p,onMouseMove:h,onMouseUp:g,onMouseLeave:g,onTouchStart:p,onTouchMove:h,onTouchEnd:g,"aria-describedby":Pe(e,!!a),"aria-invalid":Me(!!a),"aria-required":l,style:{height:"200px"}})}),!u&&b.jsx("div",{className:"flex justify-end",children:b.jsxs(xt,{type:"button",variant:"outline",size:"sm",onClick:f,className:"text-xs",children:[b.jsx(ca,{className:"h-3 w-3 mr-1"}),"Clear"]})})]})})},al=({field:e,value:t,onChange:r,onBlur:n,error:a,disabled:o,readOnly:s,isRequired:l,className:c})=>{const i=e.properties,d=(i==null?void 0:i.columns)||[],m=(i==null?void 0:i.minRows)||1,u=(i==null?void 0:i.maxRows)||10,p=(i==null?void 0:i.allowAddRow)!==!1,h=(i==null?void 0:i.allowDeleteRow)!==!1,g=o||e.disabled||s||e.readOnly,f=t||[],y=p&&f.length<u,w=h&&f.length>m,x=v.useCallback(()=>{if(!y||g)return;const S={};d.forEach(F=>{S[F.name]=F.defaultValue??""}),r([...f,S]),n==null||n()},[f,d,y,g,r,n]),C=v.useCallback(S=>{if(!w||g)return;const F=f.filter((A,T)=>T!==S);r(F),n==null||n()},[f,w,g,r,n]),O=v.useCallback((S,F,A)=>{if(g)return;const T=[...f];T[S]||(T[S]={}),T[S][F]=A,r(T),n==null||n()},[f,g,r,n]);return v.useEffect(()=>{if(f.length<m){const S=[];for(let F=0;F<m;F++){const A={};d.forEach(T=>{A[T.name]=T.defaultValue??""}),S.push(A)}r(S)}},[m,d,r]),d.length===0?b.jsx(Te,{field:e,error:a,isRequired:l,className:c,children:b.jsx("div",{className:"p-4 border rounded-md bg-muted/50 text-sm text-muted-foreground",children:"No columns defined for this table field"})}):b.jsx(Te,{field:e,error:a,isRequired:l,className:c,children:b.jsxs("div",{id:Se(e),className:q("border rounded-lg overflow-hidden",a&&"border-destructive",g&&"opacity-50"),"aria-describedby":Pe(e,!!a),"aria-invalid":Me(!!a),"aria-required":l,children:[b.jsx("div",{className:"overflow-x-auto",children:b.jsxs("table",{className:"w-full border-collapse",children:[b.jsx("thead",{children:b.jsxs("tr",{className:"border-b bg-muted/50",children:[d.map(S=>b.jsx("th",{className:"px-4 py-2 text-left text-sm font-medium text-muted-foreground",children:S.label},S.id)),h&&b.jsx("th",{className:"w-12"})]})}),b.jsx("tbody",{children:f.map((S,F)=>b.jsxs("tr",{className:"border-b hover:bg-muted/30",children:[d.map(A=>{const T={...A,name:`${e.name}_${F}_${A.name}`},V=S[A.name],le=()=>{switch(A.type){case"text":case"password":case"url":return b.jsx(jr,{field:T,value:V||"",onChange:P=>O(F,A.name,P),disabled:g,readOnly:g,className:"min-w-[120px]"});case"number":return b.jsx(sa,{field:T,value:V??null,onChange:P=>O(F,A.name,P),disabled:g,readOnly:g,className:"min-w-[120px]"});case"email":return b.jsx(da,{field:T,value:V||"",onChange:P=>O(F,A.name,P),disabled:g,readOnly:g,className:"min-w-[120px]"});case"phone":case"aadhaar":return b.jsx(ua,{field:T,value:V||"",onChange:P=>O(F,A.name,P),disabled:g,readOnly:g,className:"min-w-[120px]"});case"textarea":return b.jsx(fa,{field:T,value:V||"",onChange:P=>O(F,A.name,P),disabled:g,readOnly:g,className:"min-w-[120px]"});case"select":case"multiselect":return b.jsx(ya,{field:T,value:V||"",onChange:P=>O(F,A.name,P),disabled:g,className:"min-w-[120px]"});case"checkbox":return b.jsx(va,{field:T,value:V||!1,onChange:P=>O(F,A.name,P),disabled:g,className:"min-w-[120px]"});case"radio":case"checkboxgroup":return b.jsx(Fa,{field:T,value:V||"",onChange:P=>O(F,A.name,P),disabled:g,className:"min-w-[120px]"});case"date":case"time":case"datetime":case"daterange":return b.jsx(Ea,{field:T,value:V||"",onChange:P=>O(F,A.name,P),disabled:g,readOnly:g,className:"min-w-[120px]"});default:return b.jsx(jr,{field:T,value:String(V||""),onChange:P=>O(F,A.name,P),disabled:g,readOnly:g,className:"min-w-[120px]"})}};return b.jsx("td",{className:"px-4 py-2",children:le()},A.id)}),h&&b.jsx("td",{className:"px-2 py-2",children:b.jsx(xt,{type:"button",variant:"ghost",size:"icon",className:"h-8 w-8",onClick:()=>C(F),disabled:!w||g,children:b.jsx(ca,{className:"h-4 w-4"})})})]},F))})]})}),y&&b.jsx("div",{className:"p-2 border-t bg-muted/30",children:b.jsxs(xt,{type:"button",variant:"ghost",size:"sm",onClick:x,disabled:g,className:"w-full",children:[b.jsx(Wi,{className:"h-4 w-4 mr-2"}),"Add Row"]})})]})})},Ia=({field:e,children:t,className:r})=>{const n=e.properties,a=(n==null?void 0:n.collapsible)??!1,o=(n==null?void 0:n.defaultCollapsed)??!1,s=(n==null?void 0:n.columns)??1,[l,c]=v.useState(o),i=()=>{a&&c(!l)},d={1:"grid-cols-1",2:"grid-cols-1 md:grid-cols-2",3:"grid-cols-1 md:grid-cols-2 lg:grid-cols-3",4:"grid-cols-1 md:grid-cols-2 lg:grid-cols-4"};return b.jsxs("div",{className:q("border rounded-lg bg-card",r),children:[b.jsxs("div",{className:q("flex items-center gap-2 px-4 py-3 border-b bg-muted/50",a&&"cursor-pointer hover:bg-muted/70 transition-colors"),onClick:i,children:[a&&b.jsx("span",{className:"text-muted-foreground",children:l?b.jsx(qi,{className:"h-4 w-4"}):b.jsx(Vi,{className:"h-4 w-4"})}),b.jsx("h3",{className:"font-medium text-sm",children:e.label}),e.description&&b.jsx("span",{className:"text-xs text-muted-foreground ml-2",children:e.description})]}),!l&&b.jsx("div",{className:q("p-4 grid gap-4",d[s]),children:t})]})},Na=he.forwardRef(({className:e,orientation:t="horizontal",decorative:r=!0,...n},a)=>b.jsx("div",{ref:a,role:r?"none":"separator","aria-orientation":t,className:q("shrink-0 bg-border",t==="horizontal"?"h-[1px] w-full":"h-full w-[1px]",e),...n}));Na.displayName="Separator";const ol=({field:e,className:t})=>b.jsx("div",{className:q("py-2",t),children:b.jsx(Na,{})}),sl=({field:e,className:t})=>b.jsxs("div",{className:q("space-y-1",t),children:[b.jsx("h3",{className:"text-lg font-semibold",children:e.label}),e.description&&b.jsx("p",{className:"text-sm text-muted-foreground",children:e.description})]}),il=({field:e,className:t})=>{var a;const r=((a=e.appearance)==null?void 0:a.size)||"md",n={sm:"h-4",md:"h-8",lg:"h-12"};return b.jsx("div",{className:q(n[r],t),"aria-hidden":"true"})},Mt=({field:e,value:t,error:r,onChange:n,onBlur:a,disabled:o,readOnly:s,isRequired:l,className:c,formValues:i={},onSubmit:d,onReset:m,onCancel:u,isSubmitting:p,bffSubmitApi:h})=>{switch(e.type){case"divider":return b.jsx(ol,{field:e,className:c});case"header":return b.jsx(sl,{field:e,className:c});case"spacer":return b.jsx(il,{field:e,className:c})}switch(e.type){case"text":case"password":case"url":return b.jsx(jr,{field:e,value:t||"",onChange:n,onBlur:a,error:r,disabled:o,readOnly:s,isRequired:l,className:c});case"number":return b.jsx(sa,{field:e,value:t??null,onChange:n,onBlur:a,error:r,disabled:o,readOnly:s,isRequired:l,className:c});case"email":return b.jsx(da,{field:e,value:t||"",onChange:n,onBlur:a,error:r,disabled:o,readOnly:s,isRequired:l,className:c});case"phone":case"aadhaar":return b.jsx(ua,{field:e,value:t||"",onChange:n,onBlur:a,error:r,disabled:o,readOnly:s,isRequired:l,className:c});case"textarea":case"richtext":return b.jsx(fa,{field:e,value:t||"",onChange:n,onBlur:a,error:r,disabled:o,readOnly:s,isRequired:l,className:c});case"select":case"multiselect":return b.jsx(ya,{field:e,value:t||"",onChange:n,onBlur:a,error:r,disabled:o,isRequired:l,className:c,formValues:i});case"checkbox":case"terms":return b.jsx(va,{field:e,value:t||!1,onChange:n,onBlur:a,error:r,disabled:o,isRequired:l,className:c});case"radio":case"checkboxgroup":return b.jsx(Fa,{field:e,value:t||"",onChange:n,onBlur:a,error:r,disabled:o,isRequired:l,className:c});case"date":case"time":case"datetime":case"daterange":return b.jsx(Ea,{field:e,value:t||"",onChange:n,onBlur:a,error:r,disabled:o,readOnly:s,isRequired:l,className:c});case"file":return b.jsx(Zi,{field:e,value:t,onChange:n,onBlur:a,error:r,disabled:o,isRequired:l,className:c});case"signature":return b.jsx(nl,{field:e,value:t||null,onChange:n,onBlur:a,error:r,disabled:o,readOnly:s,isRequired:l,className:c});case"rating":return b.jsx(tl,{field:e,value:t||0,onChange:n,onBlur:a,error:r,disabled:o,readOnly:s,isRequired:l,className:c});case"slider":return b.jsx(rl,{field:e,value:t||0,onChange:n,onBlur:a,error:r,disabled:o,readOnly:s,isRequired:l,className:c});case"table":return b.jsx(al,{field:e,value:t||[],onChange:n,onBlur:a,error:r,disabled:o,readOnly:s,isRequired:l,className:c});case"button":return b.jsx(el,{field:e,value:t,onChange:n,onBlur:a,error:r,disabled:o,readOnly:s,isRequired:l,className:c,onSubmit:d,onReset:m,onCancel:u,isSubmitting:p,formValues:i,bffSubmitApi:h});default:return b.jsx("div",{className:"p-3 border rounded-md bg-muted/50",children:b.jsxs("p",{className:"text-sm text-muted-foreground",children:["Unsupported field type: ",e.type]})})}},ll=({steps:e,currentStep:t,completedSteps:r,onStepClick:n,className:a})=>b.jsx("div",{className:q("mb-8",a),children:b.jsx("nav",{"aria-label":"Progress",children:b.jsx("ol",{className:"flex items-center",children:e.map((o,s)=>{const l=r.has(s),c=t===s,i=n&&(l||s===t+1||s<=t);return b.jsxs("li",{className:q("relative",s!==e.length-1&&"pr-8 sm:pr-20 flex-1"),children:[s!==e.length-1&&b.jsx("div",{className:q("absolute top-4 left-8 -right-8 sm:left-12 sm:-right-12 h-0.5",l?"bg-primary":"bg-border"),"aria-hidden":"true"}),b.jsx("button",{type:"button",onClick:()=>i&&(n==null?void 0:n(s)),disabled:!i,className:q("relative flex h-8 w-8 items-center justify-center rounded-full text-sm font-medium","transition-colors focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2",l&&"bg-primary text-primary-foreground",c&&!l&&"border-2 border-primary text-primary",!l&&!c&&"border-2 border-border text-muted-foreground",i&&"cursor-pointer hover:bg-primary/10",!i&&"cursor-default"),"aria-current":c?"step":void 0,children:l?b.jsx(Ui,{className:"h-4 w-4"}):b.jsx("span",{children:s+1})}),b.jsxs("div",{className:"mt-2",children:[b.jsx("span",{className:q("text-sm font-medium",c&&"text-primary",!c&&!l&&"text-muted-foreground"),children:o.name}),o.description&&b.jsx("p",{className:"text-xs text-muted-foreground hidden sm:block",children:o.description})]})]},o.id)})})})});function cl({className:e,size:t="md"}){const r={sm:"h-4 w-4",md:"h-8 w-8",lg:"h-12 w-12"};return b.jsx(ia,{className:q("animate-spin text-primary",r[t],e)})}const dl=({schema:e,formId:t,initialValues:r,onSubmit:n,onChange:a,onValidationError:o,onClose:s,mode:l="fill",className:c,children:i,gridLayout:d,submissionContext:m})=>{var Ge;const[u,p]=v.useState(e||null),[h,g]=v.useState(!!t&&!e),[f,y]=v.useState(null),w=v.useMemo(()=>{if(!u)return null;const I=u.layout,R=u.rules,j=u.clientMapping,K=(Array.isArray(u.fields)?u.fields:[]).map(ee=>{let W={...ee};if(ee.validationRules&&typeof ee.validationRules=="object"&&!ee.validation){const z=ee.validationRules,ne=[];z.required===!0&&ne.push({type:"required",message:"This field is required"}),z.minLength!==void 0&&typeof z.minLength=="number"&&ne.push({type:"minLength",value:z.minLength,message:`Minimum length is ${z.minLength}`}),z.maxLength!==void 0&&typeof z.maxLength=="number"&&ne.push({type:"maxLength",value:z.maxLength,message:`Maximum length is ${z.maxLength}`}),z.pattern&&typeof z.pattern=="string"&&ne.push({type:"pattern",value:z.pattern,message:"Invalid format"}),z.allowLetters!==void 0&&ne.push({type:"allowLetters",value:z.allowLetters}),z.allowNumbers!==void 0&&ne.push({type:"allowNumbers",value:z.allowNumbers}),z.allowSpecialChars!==void 0&&ne.push({type:"allowSpecialChars",value:z.allowSpecialChars}),ne.length>0&&(W={...W,validation:ne})}if(ee.apidata&&typeof ee.apidata=="object"){const z=ee.apidata,ne=W.properties||{};!ne.apiEndpoint&&z.apiEndpoint&&(W={...W,properties:{...ne,apiEndpoint:z.apiEndpoint,apiMethod:z.apiMethod,apiKey:z.apiKey,apiRealtime:z.apiRealtime,apiAutoDetect:z.apiAutoDetect,apiLabelField:z.apiLabelField,apiValueField:z.apiValueField,apiQueryParams:z.apiQueryParams,apiClientFilter:z.apiClientFilter,valueSource:z.valueSource||(z.apiEndpoint?"api":void 0),optionsSource:z.optionsSource||(z.apiEndpoint?"api":void 0)}})}return W});let L=u.config||{submitAction:"database",layout:"default",autoSave:!0,validateOnChange:!0,showFieldErrors:"inline"};return!L.layout&&I?typeof I=="object"&&I!==null?L.layout="default":typeof I=="string"&&["default","card","compact"].includes(I)?L.layout=I:L.layout="default":L.layout||(L.layout="default"),R&&!L.rules&&(L.rules=R),j&&!L.clientMapping&&(L.clientMapping=j),{...u,fields:K,config:L}},[u]);v.useEffect(()=>{t&&!e&&x()},[t,e]);const x=async()=>{if(t){g(!0);try{const I=await Ye.getForRendering(t),R=Nr(I.form,I.fields,I.layout,I.rules);p(R),I.BFF_submit_api&&(y(I.BFF_submit_api),console.log("[FormRenderer] BFF_submit_api loaded:",I.BFF_submit_api))}catch(I){console.error("Failed to load form:",I)}finally{g(!1)}}};if(h)return b.jsx("div",{className:"flex items-center justify-center py-12",children:b.jsx(cl,{})});if(!w)return b.jsx("div",{className:"text-center py-12 text-muted-foreground",children:"Form not found"});const C=w,O=v.useCallback(async I=>{if(n){const R=m?{...I,...m}:I;return n(R)}return{success:!0}},[n,m]),{values:S,errors:F,touched:A,isSubmitting:T,isValid:V,currentStep:le,totalSteps:P,completedSteps:me,currentStepFields:ie,isLastStep:B,setFieldValue:D,setFieldTouched:re,handleSubmit:U,resetForm:M,nextStep:ae,goToStep:oe,shouldShowField:_,isFieldEnabled:$,isFieldRequired:N,loadDraft:Q}=aa({schema:C,initialValues:r,onSubmit:O,onChange:a});$i({fields:C.fields,values:S}),v.useEffect(()=>{var I;(I=C.config)!=null&&I.allowDraft&&l==="fill"&&Q()},[C.id]),v.useEffect(()=>{Object.keys(F).length>0&&(o==null||o(F))},[F,o]);const J=P>1,k=l==="view",Y=C.fields.filter(I=>!I.parentId),se=[...J?ie:Y.length>0?Y:C.fields].filter(I=>!(!I||typeof I!="object"||!I.name&&!I.key)).sort((I,R)=>{var ee,W,z,ne;const j=typeof((ee=I.position)==null?void 0:ee.order)=="number"?I.position.order:typeof I.positionOrder=="number"?I.positionOrder:Number.MAX_SAFE_INTEGER,K=typeof((W=R.position)==null?void 0:W.order)=="number"?R.position.order:typeof R.positionOrder=="number"?R.positionOrder:Number.MAX_SAFE_INTEGER;if(j!==K)return j-K;const L=typeof((z=I.position)==null?void 0:z.column)=="number"?I.position.column:1,G=typeof((ne=R.position)==null?void 0:ne.column)=="number"?R.position.column:1;return L-G}),X=async I=>{if(I==null||I.preventDefault(),J&&!B)await ae();else return await U(I)},Oe=v.useCallback(()=>{M(),s&&s()},[M,s]),xe=((Ge=C.config)==null?void 0:Ge.layout)??C.layout??"default",et=["default","card","compact"].includes(xe)?xe:"default",Ft={default:"",card:"bg-card border rounded-lg shadow-sm p-6",compact:"space-y-2"},dt=d!=null,$e=(d==null?void 0:d.rows)??8,Xe=(d==null?void 0:d.columns)??3,$t=(d==null?void 0:d.verticalSpacing)||(d==null?void 0:d.spacing)||"16px",ut=(d==null?void 0:d.horizontalSpacing)||(d==null?void 0:d.spacing)||"16px",ve=I=>{const R=["richtext","textarea","multiselect","radio","checkboxgroup","signature"],K=I.position.rowSpan??1;return I.type==="file"?Math.max(K,3):R.includes(I.type)?Math.max(K,2):K},Le=I=>{const R=I.name||I.key||I.id,j=I.hidden===!0;return _(R)||!j&&R},De=(I,R,j)=>j.some(K=>{var Be,ft,We;if(!Le(K))return!1;const L=(Be=K.position)==null?void 0:Be.order;if(typeof L!="number")return!1;const G=((ft=K.position)==null?void 0:ft.column)??1,ee=ve(K),W=((We=K.position)==null?void 0:We.columnSpan)??1,z=I>=L&&I<L+ee,ne=R>=G-1&&R<G-1+W,pe=I===L&&R===G-1;return z&&ne&&!pe}),pt=(I,R)=>se.find(j=>{var G,ee;if(!Le(j))return!1;const K=(G=j.position)==null?void 0:G.order,L=((ee=j.position)==null?void 0:ee.column)??1;return typeof K=="number"&&K===I&&L===R+1});return b.jsx("div",{className:q("iq-line-form-renderer",c),style:{isolation:"isolate"},children:b.jsxs("form",{onSubmit:X,className:q("space-y-6 pb-[100px]",Ft[et]),children:[J&&C.steps&&b.jsx(ll,{steps:C.steps,currentStep:le,completedSteps:me,onStepClick:oe}),dt?b.jsx("div",{className:"grid w-full",style:{gridTemplateRows:`repeat(${$e}, 95px)`,gridTemplateColumns:`repeat(${Xe}, 1fr)`,rowGap:$t,columnGap:ut},children:Array.from({length:$e},(I,R)=>Array.from({length:Xe},(j,K)=>{if(De(R,K,se))return b.jsx("div",{},`empty-${R}-${K}`);const L=pt(R,K);if(!L)return b.jsx("div",{},`empty-${R}-${K}`);const G=ve(L),ee=L.position.columnSpan??1;if(L.type==="section"){const z=C.fields.filter(ne=>ne.parentId===L.id&&ne.position!=null).sort((ne,pe)=>{var We,jt;const Be=typeof((We=ne.position)==null?void 0:We.order)=="number"?ne.position.order:0,ft=typeof((jt=pe.position)==null?void 0:jt.order)=="number"?pe.position.order:0;return Be-ft});return b.jsx("div",{style:{gridRow:`${R+1} / span ${G}`,gridColumn:`${K+1} / span ${ee}`},children:b.jsx(Ia,{field:L,children:z.map(ne=>{const pe=ne.name||ne.key||ne.id,Be=ne.hidden===!0;return _(pe)||!Be&&pe?b.jsx(Mt,{field:ne,value:S[pe],error:A[pe]?F[pe]:void 0,onChange:We=>D(pe,We),onBlur:()=>re(pe),disabled:!$(pe)||k||!!ne.disabled,readOnly:k||!!ne.readOnly,isRequired:N(pe),formValues:S,onSubmit:X,onReset:M,onCancel:Oe,isSubmitting:T,bffSubmitApi:f},ne.id):null})})},L.id)}const W=L.name||L.key||L.id;return b.jsx("div",{style:{gridRow:`${R+1} / span ${G}`,gridColumn:`${K+1} / span ${ee}`},children:b.jsx(Mt,{field:L,value:S[W],error:A[W]?F[W]:void 0,onChange:z=>D(W,z),onBlur:()=>re(W),disabled:!$(W)||k||!!L.disabled,readOnly:k||!!L.readOnly,isRequired:N(W),formValues:S,onSubmit:X,onReset:M,onCancel:Oe,isSubmitting:T,bffSubmitApi:f})},L.id)}))}):b.jsx("div",{className:"space-y-4",children:se.map(I=>{const R=I.name||I.key||I.id,j=I.hidden===!0;if(!(_(R)||!j&&R))return null;if(I.type==="section"){const G=C.fields.filter(ee=>ee.parentId===I.id&&ee.position!=null).sort((ee,W)=>{var pe,Be;const z=typeof((pe=ee.position)==null?void 0:pe.order)=="number"?ee.position.order:0,ne=typeof((Be=W.position)==null?void 0:Be.order)=="number"?W.position.order:0;return z-ne});return b.jsx(Ia,{field:I,children:G.map(ee=>{const W=ee.name||ee.key||ee.id,z=ee.hidden===!0;return _(W)||!z&&W?b.jsx(Mt,{field:ee,value:S[W],error:A[W]?F[W]:void 0,onChange:pe=>D(W,pe),onBlur:()=>re(W),disabled:!$(W)||k||!!ee.disabled,readOnly:k||!!ee.readOnly,isRequired:N(W),formValues:S,onSubmit:X,onReset:M,onCancel:Oe,isSubmitting:T,bffSubmitApi:f},ee.id):null})},I.id)}const L=I.name||I.key||I.id;return b.jsx(Mt,{field:I,value:S[L],error:A[L]?F[L]:void 0,onChange:G=>D(L,G),onBlur:()=>re(L),disabled:!$(L)||k||!!I.disabled,readOnly:k||!!I.readOnly,isRequired:N(L),formValues:S,onSubmit:X,onReset:M,onCancel:Oe,isSubmitting:T,bffSubmitApi:f},I.id)})}),i]})})};function ul({formSchema:e}){const t=v.useMemo(()=>{var d;if(!e)return[];const o=[];(!e.name||e.name.trim()==="")&&o.push({id:"form-name-required",type:"error",message:"Form name is required"});const s=new Set,l=new Set;e.fields.forEach((m,u)=>{const p=`field-${m.id}`;if(l.has(m.id)&&o.push({id:`${p}-duplicate-id`,type:"error",message:`Field "${m.label||m.name||`Field ${u+1}`}" has a duplicate ID`,fieldId:m.id}),l.add(m.id),m.name&&s.has(m.name)&&o.push({id:`${p}-duplicate-name`,type:"error",message:`Field "${m.label||m.name}" has a duplicate name: "${m.name}"`,fieldId:m.id}),m.name&&s.add(m.name),(!m.label||m.label.trim()==="")&&o.push({id:`${p}-missing-label`,type:"warning",message:`Field "${m.name||m.id}" is missing a label`,fieldId:m.id}),(!m.name||m.name.trim()==="")&&o.push({id:`${p}-missing-name`,type:"error",message:`Field "${m.label||m.id}" is missing a field name`,fieldId:m.id}),m.name&&!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(m.name)&&o.push({id:`${p}-invalid-name`,type:"error",message:`Field "${m.label||m.name}" has an invalid name. Use only letters, numbers, and underscores.`,fieldId:m.id}),["select","multiselect","radio","checkboxgroup"].includes(m.type)){const f=m.properties;(!(f!=null&&f.options)||f.options.length===0)&&o.push({id:`${p}-no-options`,type:"warning",message:`Field "${m.label||m.name}" has no options defined`,fieldId:m.id})}m.parentId&&(e.fields.some(y=>y.id===m.parentId)||o.push({id:`${p}-orphaned`,type:"error",message:`Field "${m.label||m.name}" references a non-existent parent`,fieldId:m.id}));const g=(f,y)=>{if(y.has(f))return!0;y.add(f);const w=e.fields.find(x=>x.id===f);return w!=null&&w.parentId?g(w.parentId,y):!1};m.parentId&&g(m.id,new Set)&&o.push({id:`${p}-circular-reference`,type:"error",message:`Field "${m.label||m.name}" has a circular parent reference`,fieldId:m.id})}),(d=e.config.workflowTrigger)!=null&&d.workflowId&&(e.fields.some(u=>{var p;return(p=u.validation)==null?void 0:p.some(h=>h.type==="required")})||o.push({id:"workflow-no-required-fields",type:"info",message:"Form linked to workflow but has no required fields"}));const c=e.fields.filter(m=>!m.parentId),i=new Map;return c.forEach(m=>{const u=m.position.order;i.has(u)||i.set(u,[]),i.get(u).push(m)}),i.forEach((m,u)=>{m.length>3&&o.push({id:`row-${u}-too-many-fields`,type:"warning",message:`Row ${u+1} has ${m.length} fields (maximum recommended is 3)`})}),o},[e]),r=v.useMemo(()=>t.filter(o=>o.type==="error"),[t]),n=v.useMemo(()=>t.filter(o=>o.type==="warning"),[t]),a=v.useMemo(()=>r.length===0,[r]);return{issues:t,errors:r,warnings:n,isValid:a}}function pl({field:e,value:t,allValues:r,validateOnChange:n=!1,validateOnBlur:a=!0,debounceMs:o=Io}){const[s,l]=v.useState(),[c,i]=v.useState(!1),d=v.useRef(void 0),m=v.useRef(t),u=v.useCallback(async()=>{if(!e.validation||e.validation.length===0){l(void 0);return}i(!0);let y;for(const w of e.validation){const x=ar(t,w,r);if(typeof x=="string"){y=x;break}}return l(y),i(!1),y},[e.validation,t,r]),p=v.useCallback(()=>{d.current&&clearTimeout(d.current),d.current=setTimeout(()=>{u()},o)},[u,o]);v.useEffect(()=>(n&&m.current!==t&&p(),m.current=t,()=>{d.current&&clearTimeout(d.current)}),[t,n,p]);const h=v.useCallback(()=>{a&&u()},[a,u]),g=v.useCallback(()=>{l(void 0)},[]),f=v.useCallback(y=>{l(y)},[]);return{error:s,isValidating:c,validate:u,handleBlur:h,clearError:g,setCustomError:f}}function Aa(e,t){const r={};let n=!1,a,o,s,l,c;e.validation&&Array.isArray(e.validation)&&e.validation.forEach(F=>{F.type==="required"?(n=!0,r.required=!0):F.type==="minLength"&&typeof F.value=="number"?(a=F.value,r.minLength=F.value):F.type==="maxLength"&&typeof F.value=="number"?(o=F.value,r.maxLength=F.value):F.type==="min"&&typeof F.value=="number"?(s=F.value,r.min=F.value):F.type==="max"&&typeof F.value=="number"?(l=F.value,r.max=F.value):F.type==="pattern"&&typeof F.value=="string"?(c=F.value,r.pattern=F.value):r[F.type]=F.value}),e.properties&&typeof e.properties=="object"&&e.properties.required===!0&&(n=!0,r.required=!0);let i;if(e.properties&&typeof e.properties=="object"){const F=e.properties;F.options&&Array.isArray(F.options)&&(i=JSON.stringify(F.options))}const d=e.appearance||{},m=d.size||"md",u=d.labelPlacement||"top",p=d.hideLabel||!1,h=d.className||"";let g,f={};if(e.properties){const F=e.properties,A=Wn(F);A&&(g=A,console.log(`[fieldApiTransformer] Field "${e.name}" (${e.type}) API config being saved in apidata:`,{apiEndpoint:A.apiEndpoint,apiMethod:A.apiMethod||"GET",apiRealtime:A.apiRealtime??!1,apiAutoDetect:A.apiAutoDetect??!1,apiLabelField:A.apiLabelField,apiValueField:A.apiValueField})),f=Jn(F)}f.disabled=e.disabled??!1,f.readOnly=e.readOnly??!1,f.hidden=e.hidden??!1,p!==void 0&&(f.hideLabel=p),e.properties&&e.properties.hideLabel!==void 0&&(f.hideLabel=e.properties.hideLabel);const y=JSON.stringify(f),w=e.position.order,x=e.position.column||1,C=e.position.columnSpan||1,O=e.position.order,S={formDefinitionId:t,fieldKey:e.name,fieldType:e.type,label:e.label,placeholder:e.placeholder,defaultValue:e.defaultValue?String(e.defaultValue):void 0,isRequired:n,position:{row:w,column:x,width:C,order:O},positionRow:w,positionColumn:x,positionWidth:C,positionOrder:O,validation:Object.keys(r).length>0?r:void 0,validationRequired:n,disabled:e.disabled??!1,readOnly:e.readOnly??!1,hidden:e.hidden??!1,size:m,labelPosition:u,hideLabel:p,customClass:h,options:i,metadata:y,...g&&{apidata:g},helpText:e.description};return a!=null&&(S.validationMinLength=a),o!=null&&(S.validationMaxLength=o),s!=null&&(S.validationMin=s),l!=null&&(S.validationMax=l),c!=null&&c!==""&&(S.validationPattern=c),S}function fl(e,t){const n=e.filter(o=>!["section","divider","header","spacer"].includes(o.type)).map(o=>Aa(o,t)),a=n.filter(o=>{try{return!!(o.metadata?JSON.parse(o.metadata):{}).apiEndpoint}catch{return!1}});return a.length>0&&console.log(`[fieldApiTransformer] Summary: ${a.length} field(s) with API configuration:`,a.map(o=>({fieldKey:o.fieldKey,fieldType:o.fieldType,apiEndpoint:o.metadata?(()=>{try{return JSON.parse(o.metadata).apiEndpoint}catch{return"parse-error"}})():"no-metadata"}))),n}const ml=Object.freeze(Object.defineProperty({__proto__:null,transformFieldToBulkPayload:Aa,transformFieldsToBulkPayload:fl},Symbol.toStringTag,{value:"Module"}));we.FIELD_TYPE_REGISTRY=ln,we.FieldRenderer=Mt,we.FormRenderer=dl,we.backendToFormSchema=Nr,we.useFieldValidation=pl,we.useFormRenderer=aa,we.useFormValidation=ul,Object.defineProperty(we,Symbol.toStringTag,{value:"Module"})});
|
|
115
115
|
//# sourceMappingURL=form-renderer.umd.js.map
|