@algorithm-shift/design-system 1.3.116 → 1.3.118

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/client.js CHANGED
@@ -56,6 +56,8 @@ function cn(...inputs) {
56
56
  // src/components/Form/Wrapper.tsx
57
57
  var import_jsx_runtime = require("react/jsx-runtime");
58
58
  function normalizeBooleanLike(value) {
59
+ if (value === void 0 || value === null) return false;
60
+ if (value === "") return value;
59
61
  if (value === "true" || value === true) return true;
60
62
  if (value === "false" || value === false) return false;
61
63
  if (value === "1" || value === 1) return true;
@@ -97,7 +99,13 @@ function buildFieldSchema(field) {
97
99
  if (field.max) schema = schema.max(field.max, { message });
98
100
  if (field.email) schema = schema.email({ message });
99
101
  if (field.url) schema = schema.url({ message });
100
- if (field.regex) schema = schema.regex(new RegExp(field.regex), { message });
102
+ if (field.regex) {
103
+ if (field.isRequired) {
104
+ schema = schema.regex(new RegExp(field.regex), { message });
105
+ } else {
106
+ schema = schema.refine((val) => val === "" || new RegExp(field.regex).test(val), { message });
107
+ }
108
+ }
101
109
  return schema;
102
110
  }
103
111
  case "Email":
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.ts","../src/components/Form/Wrapper.tsx","../src/lib/utils.ts","../src/components/Form/Form.tsx","../src/components/StateManagment/stateReducer.ts","../src/components/StateManagment/StateContext.tsx"],"sourcesContent":["'use client';\r\n\r\nexport { default as FormWrapper } from './components/Form/Wrapper';\r\nexport { default as Form } from './components/Form/Form';\r\nexport { stateReducer } from './components/StateManagment/stateReducer';\r\nexport * from './components/StateManagment/StateContext';","'use client';\r\nimport React, { useEffect, useMemo, useRef } from 'react';\r\n\r\nimport { zodResolver } from '@hookform/resolvers/zod';\r\nimport { useForm, UseFormReturn, useWatch } from 'react-hook-form';\r\nimport { z } from 'zod';\r\n\r\nimport { cn } from '@/lib/utils';\r\n\r\ninterface FormWrapperProps<T extends z.ZodObject<any>> {\r\n validation?: Record<string, any>;\r\n formName?: string;\r\n defaultValues?: Partial<z.infer<T>> | any;\r\n children?: React.ReactNode | ((form: UseFormReturn<z.infer<T>>) => React.ReactNode);\r\n onSubmit?: (data: z.infer<T>) => void;\r\n onReset?: () => void;\r\n onValuesChange?: (values: z.infer<T>) => void;\r\n}\r\n\r\n// -------------------------\r\n// Normalize boolean strings for dependency comparison\r\n// -------------------------\r\nfunction normalizeBooleanLike(value: any): any {\r\n if (value === 'true' || value === true) return true;\r\n if (value === 'false' || value === false) return false;\r\n if (value === '1' || value === 1) return true;\r\n if (value === '0' || value === 0) return false;\r\n return value;\r\n}\r\n\r\n// -------------------------\r\n// Operator Matching Utility\r\n// -------------------------\r\nfunction evaluateOperator(depValue: any, ruleValue: any, operator: string) {\r\n // Normalize boolean strings so \"true\"/\"false\" match true/false in rules\r\n const normDep = normalizeBooleanLike(depValue);\r\n const normRule = normalizeBooleanLike(ruleValue);\r\n const dep = typeof normDep === 'boolean' && typeof normRule === 'boolean' ? normDep : depValue;\r\n const rule = typeof normDep === 'boolean' && typeof normRule === 'boolean' ? normRule : ruleValue;\r\n\r\n switch (operator) {\r\n case 'equals':\r\n return dep === rule;\r\n\r\n case 'not_equals':\r\n return dep !== rule;\r\n\r\n case 'greater_than':\r\n return Number(depValue) > Number(ruleValue);\r\n\r\n case 'less_than':\r\n return Number(depValue) < Number(ruleValue);\r\n\r\n case 'contains':\r\n if (Array.isArray(depValue)) return depValue.includes(ruleValue);\r\n if (typeof depValue === 'string') return depValue.includes(String(ruleValue));\r\n return false;\r\n\r\n case 'exists':\r\n return depValue !== null && depValue !== undefined && depValue !== '';\r\n\r\n default:\r\n return false;\r\n }\r\n}\r\n\r\n// -------------------------\r\n// Field Schema Generator\r\n// -------------------------\r\nfunction buildFieldSchema(field: any) {\r\n const message = field.message || `${field.name} is invalid`;\r\n\r\n switch (field.type) {\r\n case 'Text':\r\n case 'Search': {\r\n let schema = z.string({ message });\r\n\r\n if (field.min) schema = schema.min(field.min, { message });\r\n else if (field.isRequired) schema = schema.min(1, { message: `${message}. Cannot be empty` });\r\n\r\n if (field.max) schema = schema.max(field.max, { message });\r\n if (field.email) schema = schema.email({ message });\r\n if (field.url) schema = schema.url({ message });\r\n if (field.regex) schema = schema.regex(new RegExp(field.regex), { message });\r\n\r\n return schema;\r\n }\r\n\r\n case 'Email':\r\n return field.isRequired ? z.string().email({ message }) : z.string().nullable();\r\n\r\n case 'Password':\r\n return z\r\n .string({ message })\r\n .min(field.passwordLength, {\r\n message: `Password must be at least ${field.passwordLength} characters long`,\r\n });\r\n\r\n case 'Phone':\r\n if (!field.isRequired) return z.string({ message }).nullable();\r\n return z\r\n .string({ message })\r\n .transform((v) => v.replace(/\\D/g, '').slice(-10))\r\n .refine((val) => val.length === 10, {\r\n message: 'Phone number must be 10 digits long',\r\n });\r\n\r\n case 'DatePicker':\r\n const isTimePicker = field?.isTimePicker;\r\n return z\r\n .string({ message })\r\n .trim()\r\n .refine((v) => {\r\n if (field.isRequired && !v) return false;\r\n if (!v) return true;\r\n\r\n if (isTimePicker) {\r\n const timeRegex = /^([0-1]?[0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?$/;\r\n return timeRegex.test(v);\r\n } else {\r\n const d = new Date(v);\r\n return !isNaN(d.getTime());\r\n }\r\n }, { message });\r\n\r\n case 'FileInput': {\r\n let schema: any = z.instanceof(File, { message: 'Please select a file' });\r\n\r\n if (field.maxSize) {\r\n schema = schema.refine((file: File) => file.size <= field.maxSize, {\r\n message: `File size must be less than ${field.maxSize / 1024 / 1024} MB`,\r\n });\r\n }\r\n\r\n if (field.acceptedTypes) {\r\n schema = schema.refine(\r\n (file: File) => field.acceptedTypes.includes(file.type),\r\n { message: `File type must be one of: ${field.acceptedTypes.join(', ')}` }\r\n );\r\n }\r\n return schema;\r\n }\r\n\r\n case 'Checkbox':\r\n return z.preprocess(\r\n (v) => {\r\n if (v === 'false' || v === false || v === null) return false;\r\n if (v === 'true' || v === true) return true;\r\n if (v === '0' || v === 0) return false;\r\n if (v === '1' || v === 1) return true;\r\n return (v === '' ? undefined : v);\r\n },\r\n z.boolean({ message }).optional()\r\n );\r\n\r\n case 'Dropdown':\r\n return field.isRequired\r\n ? z.string({ message }).min(1, { message })\r\n : z.string({ message }).nullable();\r\n\r\n case 'NumberInput': {\r\n let numberSchema = z.number({ message });\r\n if (field.min !== '' && field.min !== undefined)\r\n numberSchema = numberSchema.min(field.min, {\r\n message: `Minimum value is ${field.min}`,\r\n });\r\n\r\n if (field.max !== '' && field.max !== undefined && field.max > 0)\r\n numberSchema = numberSchema.max(field.max, {\r\n message: `Maximum value is ${field.max}`,\r\n });\r\n\r\n return z.preprocess(\r\n (v) => {\r\n if (v === '' || v === null || v === undefined) return null;\r\n const n = Number(v);\r\n return isNaN(n) ? v : n;\r\n },\r\n numberSchema.nullable()\r\n );\r\n }\r\n\r\n default:\r\n return z.any();\r\n }\r\n}\r\n\r\n// -------------------------\r\n// Dependency Rule Validator with OR Operation\r\n// -------------------------\r\nfunction applyDependencyRules(schema: any, fields: any[]) {\r\n fields.forEach((f) => {\r\n\r\n if (!f.enableDependencyRules || !Array.isArray(f.dependencyRules)) return;\r\n\r\n const fieldName = f.name;\r\n const fieldType = f.type;\r\n\r\n schema = schema.superRefine((values: any, ctx: any) => {\r\n\r\n let fieldValue = values[fieldName] === '' ? undefined : values[fieldName];\r\n if (fieldType === 'NumberInput') {\r\n const isNumber = !isNaN(Number(fieldValue));\r\n fieldValue = isNumber ? Number(fieldValue) : undefined;\r\n }\r\n\r\n // Collect all rules that match (OR condition)\r\n const matchedRules = f.dependencyRules.filter((rule: any) => {\r\n if (!rule.conditions || rule.conditions.length === 0) return false;\r\n\r\n // AND logic for conditions inside the rule\r\n return rule.conditions.every((cond: any) => {\r\n const depVal = values[cond.dependsOn];\r\n return evaluateOperator(depVal, cond.value, cond.operator);\r\n });\r\n });\r\n\r\n // If no rule matches → skip validation\r\n if (matchedRules.length === 0) return;\r\n\r\n // Apply ONLY the first matched rule (OR behavior)\r\n const ruleToApply = matchedRules[0];\r\n const strValue = (fieldValue !== undefined && fieldValue !== null) ? String(fieldValue) : '';\r\n // ---- Apply required if value is empty ----\r\n if (strValue.trim().length === 0) {\r\n ctx.addIssue({\r\n code: 'custom',\r\n path: [fieldName],\r\n message: ruleToApply.message || `${fieldName} is required`,\r\n });\r\n return;\r\n }\r\n\r\n // ---- Apply min / max / regex ----\r\n if (ruleToApply.min !== '' && ruleToApply.min !== undefined &&\r\n Number(fieldValue) < Number(ruleToApply.min)) {\r\n ctx.addIssue({\r\n code: 'custom',\r\n path: [fieldName],\r\n message: ruleToApply.message || `${fieldName} must be >= ${ruleToApply.min}`,\r\n });\r\n }\r\n\r\n if (ruleToApply.max !== '' && ruleToApply.max !== undefined && ruleToApply.max > 0 &&\r\n Number(fieldValue) > Number(ruleToApply.max)) {\r\n ctx.addIssue({\r\n code: 'custom',\r\n path: [fieldName],\r\n message: ruleToApply.message || `${fieldName} must be <= ${ruleToApply.max}`,\r\n });\r\n }\r\n\r\n if (ruleToApply.regex) {\r\n const re = new RegExp(ruleToApply.regex);\r\n if (!re.test(fieldValue)) {\r\n ctx.addIssue({\r\n code: 'custom',\r\n path: [fieldName],\r\n message: ruleToApply.message || `${fieldName} does not match required pattern`,\r\n });\r\n }\r\n }\r\n });\r\n });\r\n\r\n return schema;\r\n}\r\n\r\nfunction generateZodSchema(data: any[]) {\r\n const fieldMap: Record<string, any> = {};\r\n\r\n // Build individual field schemas\r\n data.forEach((field) => {\r\n let schema = buildFieldSchema(field);\r\n if (\r\n field.enableDependencyRules &&\r\n Array.isArray(field.dependencyRules) &&\r\n field.dependencyRules.length > 0\r\n ) {\r\n // Accept anything — validation will be handled ONLY in applyDependencyRules()\r\n schema = z.any();\r\n } else {\r\n // Otherwise use the normal schema\r\n schema = buildFieldSchema(field);\r\n\r\n // Only apply nullable/optional for non-required fields\r\n if (!field.isRequired) {\r\n schema = field.type === 'Checkbox' ? schema.optional() : schema.nullable().optional();\r\n }\r\n }\r\n\r\n fieldMap[field.name] = schema;\r\n });\r\n\r\n // Create object schema\r\n let schema = z.object(fieldMap);\r\n\r\n // Apply dependency rules\r\n schema = applyDependencyRules(schema, data);\r\n\r\n return schema;\r\n}\r\n\r\nconst FormWrapper = <T extends z.ZodObject<any>>({\r\n defaultValues,\r\n children,\r\n onSubmit,\r\n onReset,\r\n onValuesChange,\r\n ...props\r\n}: FormWrapperProps<T>) => {\r\n const initDefaultsAppliedRef = useRef(false);\r\n // console.log('FormWrapper props.validation:', props.validation);\r\n const schema = useMemo(() => {\r\n if (Array.isArray(props.validation)) return null;\r\n // Transform validation to ensure isRequired is boolean\r\n const validation = Object.values(props.validation || {}).map(v => ({\r\n ...v,\r\n isRequired: !!v.isRequired\r\n }));\r\n\r\n const formValidation = validation?.filter(i => i);\r\n if (!formValidation || formValidation.length === 0) return null;\r\n return generateZodSchema(formValidation);\r\n }, [props.validation]);\r\n\r\n type FormData = z.infer<T>;\r\n\r\n const onError = (errors: any) => {\r\n const firstKey = Object.keys(errors)[0];\r\n const form = document.querySelector(`form[data-form-name=\"${props.formName || ''}\"]`);\r\n\r\n if (!form) return;\r\n\r\n const errorField = form.querySelector(`[name=\"${firstKey}\"]`);\r\n\r\n if (errorField instanceof HTMLElement) {\r\n errorField.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n errorField.focus();\r\n }\r\n };\r\n\r\n const form = useForm<FormData>({\r\n shouldUnregister: true,\r\n shouldFocusError: true,\r\n resolver: schema ? zodResolver(schema) as any : undefined,\r\n defaultValues,\r\n });\r\n\r\n const formValues = useWatch({ control: form.control }) as FormData;\r\n\r\n useEffect(() => {\r\n onValuesChange?.(formValues);\r\n }, [formValues]);\r\n\r\n useEffect(() => {\r\n if (!defaultValues) return;\r\n if (initDefaultsAppliedRef.current) return;\r\n // Only reset if defaultValues is an object (not null, undefined, or array)\r\n if (typeof defaultValues === 'object' && defaultValues !== null && !Array.isArray(defaultValues)) {\r\n form.reset(defaultValues);\r\n initDefaultsAppliedRef.current = true;\r\n }\r\n }, [defaultValues]);\r\n\r\n const formSubmit = (data: FormData) => {\r\n const formValues = form.getValues();\r\n if (onSubmit) onSubmit({ ...formValues, ...data } as z.infer<T>);\r\n };\r\n\r\n const handleReset = () => {\r\n form.reset();\r\n if (onReset) onReset();\r\n };\r\n\r\n return (\r\n <form\r\n onSubmit={form.handleSubmit(formSubmit, onError)}\r\n onReset={handleReset}\r\n className={cn(\r\n 'space-y-4 min-h-[100px] h-auto flex justify-between flex-col'\r\n )}\r\n data-form-name={props.formName || ''}\r\n >\r\n <div className='min-h-[50px]'>\r\n {typeof children === 'function'\r\n ? (children as (form: UseFormReturn<FormData>) => React.ReactNode)(form)\r\n : children}\r\n </div>\r\n </form>\r\n );\r\n};\r\n\r\nexport default FormWrapper;","import { clsx, type ClassValue } from \"clsx\"\r\nimport { twMerge } from \"tailwind-merge\"\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs))\r\n}\r\n\r\nexport function getInitials(name: string) {\r\n const words = name.split(' ');\r\n if (words.length === 0) {\r\n return '';\r\n }\r\n if (words.length === 1) {\r\n return words[0].charAt(0);\r\n }\r\n return words[0].charAt(0) + words[1].charAt(0);\r\n}","'use client';\r\nimport React, { useMemo } from 'react';\r\n\r\nimport { zodResolver } from '@hookform/resolvers/zod';\r\nimport { useForm, Controller } from 'react-hook-form';\r\nimport { z } from 'zod';\r\n\r\nimport { cn } from '@/lib/utils';\r\n\r\n// ****************** THIS COMPONENT NOT USED IN EXPORT CODE OR ANYWHERE ELSE YET. ************************\r\n\r\ninterface FormProps<T extends z.ZodObject<any>> {\r\n validation?: any[];\r\n formName?: string;\r\n defaultValues?: Partial<z.infer<T>> | any;\r\n children?: React.ReactNode;\r\n onSubmit?: (data: z.infer<T>) => void;\r\n onReset?: () => void;\r\n}\r\n\r\nfunction generateZodSchema(data: any[]): z.ZodObject<any> {\r\n const fields = data.reduce((acc, f) => {\r\n const name = f.name || 'unnamed';\r\n const message = f.message || `${name} is invalid`;\r\n const passwordLen = f.passwordLength;\r\n\r\n let fieldSchema: any = z.string({ message });\r\n\r\n switch (f.type) {\r\n case 'Text':\r\n case 'Search':\r\n fieldSchema = z.string({ message });\r\n if (f?.min && f?.min !== '') fieldSchema = fieldSchema.min(f.min);\r\n else if (f.isRequired) fieldSchema = fieldSchema.min(1, { message: `${message}. Cannot be empty` });\r\n if (f?.max && f?.max !== '') fieldSchema = fieldSchema.max(f.max);\r\n if (f?.email) fieldSchema = fieldSchema.email();\r\n if (f?.url) fieldSchema = fieldSchema.url();\r\n if (f?.regex) fieldSchema = fieldSchema.regex(new RegExp(f.regex));\r\n break;\r\n case 'Email':\r\n fieldSchema = z.email({ message });\r\n break;\r\n case 'Password':\r\n fieldSchema = z.string({ message }).min(passwordLen, { message: `Password must be at least ${passwordLen} characters long` });\r\n break;\r\n case 'Phone':\r\n fieldSchema = z.string().transform(val => val.replace(/\\D/g, '')).transform(val => val.slice(-10)).refine(val => {\r\n return val.length === 10;\r\n }, {\r\n message: 'Phone number must be 10 digits long',\r\n });\r\n break;\r\n case 'DatePicker':\r\n fieldSchema = z.string({\r\n message: message || 'Date is required',\r\n }).trim().refine((val) => {\r\n if (f.isRequired && !val) return false;\r\n if (!f.isRequired && !val) return true;\r\n const date = new Date(val);\r\n return !isNaN(date.getTime());\r\n }, { message: message || 'Invalid date' });\r\n break;\r\n case 'FileInput':\r\n fieldSchema = z.instanceof(File, { message: 'Please select a file' });\r\n if (f?.maxSize) {\r\n fieldSchema = fieldSchema.refine(\r\n (file: File) => file.size <= f.maxSize,\r\n { message: `File size must be less than ${f.maxSize / 1024 / 1024}MB` }\r\n );\r\n }\r\n if (f?.acceptedTypes) {\r\n fieldSchema = fieldSchema.refine(\r\n (file: File) => f.acceptedTypes.includes(file.type),\r\n { message: `File type must be one of: ${f.acceptedTypes.join(', ')}` }\r\n );\r\n }\r\n break;\r\n case 'Checkbox':\r\n fieldSchema = z.boolean({ message });\r\n break;\r\n case 'Dropdown':\r\n if (f.isRequired) {\r\n fieldSchema = z.string({ message }).min(1, { message });\r\n } else {\r\n fieldSchema = z.string().nullable();\r\n }\r\n break;\r\n case 'NumberInput':\r\n let numberSchema = z.number({ message });\r\n\r\n if (f.min !== undefined)\r\n numberSchema = numberSchema.min(f.min, {\r\n message: `Minimum value is ${f.min}`,\r\n });\r\n\r\n if (f.max !== undefined)\r\n numberSchema = numberSchema.max(f.max, {\r\n message: `Maximum value is ${f.max}`,\r\n });\r\n\r\n // Preprocess empty string/null → null and cast strings to numbers\r\n fieldSchema = z.preprocess(\r\n (val) => {\r\n if (val === '' || val === null || val === undefined) return null;\r\n const num = Number(val);\r\n return isNaN(num) ? val : num;\r\n },\r\n numberSchema.nullable()\r\n );\r\n break;\r\n default:\r\n fieldSchema = z.any();\r\n }\r\n\r\n if (!f.isRequired) fieldSchema = fieldSchema.nullable().optional();\r\n\r\n acc[name] = fieldSchema;\r\n return acc;\r\n }, {} as Record<string, any>);\r\n\r\n return z.object(fields);\r\n}\r\n\r\nconst Form = <T extends z.ZodObject<any>>({\r\n validation,\r\n defaultValues,\r\n children,\r\n onSubmit,\r\n onReset,\r\n}: FormProps<T>) => {\r\n\r\n const schema = useMemo(() => {\r\n if (!validation || validation.length === 0) return null;\r\n return generateZodSchema(validation);\r\n }, [validation]);\r\n\r\n type FormData = z.infer<T>;\r\n\r\n const {\r\n handleSubmit,\r\n control,\r\n formState: { errors },\r\n reset,\r\n } = useForm<FormData>({\r\n resolver: schema ? zodResolver(schema) as any : undefined,\r\n defaultValues,\r\n });\r\n\r\n const formSubmit = (data: FormData) => {\r\n if (onSubmit) onSubmit(data);\r\n };\r\n\r\n const handleReset = () => {\r\n reset();\r\n if (onReset) onReset();\r\n };\r\n\r\n return (\r\n <form\r\n onSubmit={handleSubmit(formSubmit)}\r\n onReset={handleReset}\r\n className={cn(\r\n 'space-y-4 min-h-[100px] h-auto flex justify-between flex-col'\r\n )}\r\n >\r\n <div className='min-h-[50px]'>\r\n {React.Children.map(children, child => {\r\n const processChild = (child: React.ReactNode): React.ReactNode => {\r\n if (React.isValidElement(child)) {\r\n const node = (child.props as any)?.node;\r\n\r\n if (node?.category === 'Form Controls') {\r\n const name = node.properties?.name || 'unnamed';\r\n return (\r\n <div key={node.id} className=\"flex flex-col\">\r\n <Controller\r\n name={name}\r\n control={control}\r\n render={({ field: controllerField }) => {\r\n const childElement = child as React.ReactElement<{ children?: React.ReactNode, input?: any }>;\r\n return React.cloneElement(childElement, {\r\n input: {\r\n ...controllerField,\r\n value: controllerField.value || '',\r\n hasFormContainer: true,\r\n validateOnMount: true,\r\n errorMessage: errors[name]?.message || null\r\n },\r\n children: undefined\r\n });\r\n }}\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n // Recursively process children of this element\r\n if ((child as React.ReactElement<{ children?: React.ReactNode }>).props?.children) {\r\n const childElement = child as React.ReactElement<{ children?: React.ReactNode }>;\r\n return React.cloneElement(childElement, {\r\n children: React.Children.map(childElement.props.children, processChild),\r\n });\r\n }\r\n\r\n return React.cloneElement(child);\r\n }\r\n return child;\r\n };\r\n\r\n return processChild(child);\r\n })}\r\n </div>\r\n </form>\r\n );\r\n};\r\n\r\nexport default Form;","export type CanvasState = Record<string, any>;\r\n\r\nexport type CanvasAction =\r\n | { type: 'SET_STATE'; key: string; value: any }\r\n | { type: 'SET_MULTIPLE_STATES'; values: Record<string, any> }\r\n | { type: 'SET_FORM_STATE'; formName: string; values: Record<string, any> };\r\n\r\nexport function stateReducer(state: CanvasState, action: CanvasAction): CanvasState {\r\n switch (action.type) {\r\n case 'SET_STATE':\r\n return { ...state, [action.key]: action.value };\r\n\r\n case 'SET_MULTIPLE_STATES':\r\n return { ...state, ...action.values };\r\n\r\n case 'SET_FORM_STATE':\r\n return {\r\n ...state,\r\n form: {\r\n ...(state.form || {}),\r\n [action.formName]: {\r\n ...(state.form && state.form[action.formName] ? state.form[action.formName] : {}),\r\n ...action.values\r\n }\r\n }\r\n };\r\n\r\n default:\r\n return state;\r\n }\r\n}\r\n","'use client';\r\nimport React, { createContext, useContext, useReducer } from 'react';\r\n\r\nimport { stateReducer, CanvasState } from './stateReducer';\r\n\r\nconst StateContext = createContext<any>(null);\r\n\r\nexport function StateProvider({ children, initialState = {} }: { children: React.ReactNode, initialState?: CanvasState }) {\r\n const [state, dispatch] = useReducer(stateReducer, initialState);\r\n return (\r\n <StateContext.Provider value={{ state, dispatch }}>\r\n {children}\r\n </StateContext.Provider>\r\n );\r\n}\r\n\r\nexport function useAppState() {\r\n return useContext(StateContext);\r\n}\r\n"],"mappings":"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","names":["import_zod","schema","form","formValues","import_react","import_zod","import_react_hook_form","import_jsx_runtime","generateZodSchema","React","child","import_react","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../src/client.ts","../src/components/Form/Wrapper.tsx","../src/lib/utils.ts","../src/components/Form/Form.tsx","../src/components/StateManagment/stateReducer.ts","../src/components/StateManagment/StateContext.tsx"],"sourcesContent":["'use client';\r\n\r\nexport { default as FormWrapper } from './components/Form/Wrapper';\r\nexport { default as Form } from './components/Form/Form';\r\nexport { stateReducer } from './components/StateManagment/stateReducer';\r\nexport * from './components/StateManagment/StateContext';","'use client';\r\nimport React, { useEffect, useMemo, useRef } from 'react';\r\n\r\nimport { zodResolver } from '@hookform/resolvers/zod';\r\nimport { useForm, UseFormReturn, useWatch } from 'react-hook-form';\r\nimport { z } from 'zod';\r\n\r\nimport { cn } from '@/lib/utils';\r\n\r\ninterface FormWrapperProps<T extends z.ZodObject<any>> {\r\n validation?: Record<string, any>;\r\n formName?: string;\r\n defaultValues?: Partial<z.infer<T>> | any;\r\n children?: React.ReactNode | ((form: UseFormReturn<z.infer<T>>) => React.ReactNode);\r\n onSubmit?: (data: z.infer<T>) => void;\r\n onReset?: () => void;\r\n onValuesChange?: (values: z.infer<T>) => void;\r\n}\r\n\r\n// -------------------------\r\n// Normalize boolean strings for dependency comparison\r\n// -------------------------\r\nfunction normalizeBooleanLike(value: any): any {\r\n // Do not normalize '' to false: empty string must stay distinct so that\r\n // rule \"equals ''\" does not match fields with value 'false' or '0', and\r\n // rule \"equals 'false'\" does not match empty fields.\r\n if (value === undefined || value === null) return false;\r\n if (value === '') return value;\r\n if (value === 'true' || value === true) return true;\r\n if (value === 'false' || value === false) return false;\r\n if (value === '1' || value === 1) return true;\r\n if (value === '0' || value === 0) return false;\r\n return value;\r\n}\r\n\r\n// -------------------------\r\n// Operator Matching Utility\r\n// -------------------------\r\nfunction evaluateOperator(depValue: any, ruleValue: any, operator: string) {\r\n // Normalize boolean strings so \"true\"/\"false\" match true/false in rules\r\n const normDep = normalizeBooleanLike(depValue);\r\n const normRule = normalizeBooleanLike(ruleValue);\r\n const dep = typeof normDep === 'boolean' && typeof normRule === 'boolean' ? normDep : depValue;\r\n const rule = typeof normDep === 'boolean' && typeof normRule === 'boolean' ? normRule : ruleValue;\r\n\r\n switch (operator) {\r\n case 'equals':\r\n return dep === rule;\r\n\r\n case 'not_equals':\r\n return dep !== rule;\r\n\r\n case 'greater_than':\r\n return Number(depValue) > Number(ruleValue);\r\n\r\n case 'less_than':\r\n return Number(depValue) < Number(ruleValue);\r\n\r\n case 'contains':\r\n if (Array.isArray(depValue)) return depValue.includes(ruleValue);\r\n if (typeof depValue === 'string') return depValue.includes(String(ruleValue));\r\n return false;\r\n\r\n case 'exists':\r\n return depValue !== null && depValue !== undefined && depValue !== '';\r\n\r\n default:\r\n return false;\r\n }\r\n}\r\n\r\n// -------------------------\r\n// Field Schema Generator\r\n// -------------------------\r\nfunction buildFieldSchema(field: any) {\r\n const message = field.message || `${field.name} is invalid`;\r\n\r\n switch (field.type) {\r\n case 'Text':\r\n case 'Search': {\r\n let schema = z.string({ message });\r\n\r\n if (field.min) schema = schema.min(field.min, { message });\r\n else if (field.isRequired) schema = schema.min(1, { message: `${message}. Cannot be empty` });\r\n\r\n if (field.max) schema = schema.max(field.max, { message });\r\n if (field.email) schema = schema.email({ message });\r\n if (field.url) schema = schema.url({ message });\r\n if (field.regex) {\r\n if (field.isRequired) {\r\n schema = schema.regex(new RegExp(field.regex), { message });\r\n } else {\r\n schema = schema.refine((val) => val === '' || new RegExp(field.regex).test(val), { message });\r\n }\r\n }\r\n\r\n return schema;\r\n }\r\n\r\n case 'Email':\r\n return field.isRequired ? z.string().email({ message }) : z.string().nullable();\r\n\r\n case 'Password':\r\n return z\r\n .string({ message })\r\n .min(field.passwordLength, {\r\n message: `Password must be at least ${field.passwordLength} characters long`,\r\n });\r\n\r\n case 'Phone':\r\n if (!field.isRequired) return z.string({ message }).nullable();\r\n return z\r\n .string({ message })\r\n .transform((v) => v.replace(/\\D/g, '').slice(-10))\r\n .refine((val) => val.length === 10, {\r\n message: 'Phone number must be 10 digits long',\r\n });\r\n\r\n case 'DatePicker':\r\n const isTimePicker = field?.isTimePicker;\r\n return z\r\n .string({ message })\r\n .trim()\r\n .refine((v) => {\r\n if (field.isRequired && !v) return false;\r\n if (!v) return true;\r\n\r\n if (isTimePicker) {\r\n const timeRegex = /^([0-1]?[0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?$/;\r\n return timeRegex.test(v);\r\n } else {\r\n const d = new Date(v);\r\n return !isNaN(d.getTime());\r\n }\r\n }, { message });\r\n\r\n case 'FileInput': {\r\n let schema: any = z.instanceof(File, { message: 'Please select a file' });\r\n\r\n if (field.maxSize) {\r\n schema = schema.refine((file: File) => file.size <= field.maxSize, {\r\n message: `File size must be less than ${field.maxSize / 1024 / 1024} MB`,\r\n });\r\n }\r\n\r\n if (field.acceptedTypes) {\r\n schema = schema.refine(\r\n (file: File) => field.acceptedTypes.includes(file.type),\r\n { message: `File type must be one of: ${field.acceptedTypes.join(', ')}` }\r\n );\r\n }\r\n return schema;\r\n }\r\n\r\n case 'Checkbox':\r\n return z.preprocess(\r\n (v) => {\r\n if (v === 'false' || v === false || v === null) return false;\r\n if (v === 'true' || v === true) return true;\r\n if (v === '0' || v === 0) return false;\r\n if (v === '1' || v === 1) return true;\r\n return (v === '' ? undefined : v);\r\n },\r\n z.boolean({ message }).optional()\r\n );\r\n\r\n case 'Dropdown':\r\n return field.isRequired\r\n ? z.string({ message }).min(1, { message })\r\n : z.string({ message }).nullable();\r\n\r\n case 'NumberInput': {\r\n let numberSchema = z.number({ message });\r\n if (field.min !== '' && field.min !== undefined)\r\n numberSchema = numberSchema.min(field.min, {\r\n message: `Minimum value is ${field.min}`,\r\n });\r\n\r\n if (field.max !== '' && field.max !== undefined && field.max > 0)\r\n numberSchema = numberSchema.max(field.max, {\r\n message: `Maximum value is ${field.max}`,\r\n });\r\n\r\n return z.preprocess(\r\n (v) => {\r\n if (v === '' || v === null || v === undefined) return null;\r\n const n = Number(v);\r\n return isNaN(n) ? v : n;\r\n },\r\n numberSchema.nullable()\r\n );\r\n }\r\n\r\n default:\r\n return z.any();\r\n }\r\n}\r\n\r\n// -------------------------\r\n// Dependency Rule Validator with OR Operation\r\n// -------------------------\r\nfunction applyDependencyRules(schema: any, fields: any[]) {\r\n fields.forEach((f) => {\r\n if (!f.enableDependencyRules || !Array.isArray(f.dependencyRules)) return;\r\n\r\n const fieldName = f.name;\r\n const fieldType = f.type;\r\n\r\n schema = schema.superRefine((values: any, ctx: any) => {\r\n\r\n let fieldValue = values[fieldName] === '' ? undefined : values[fieldName];\r\n if (fieldType === 'NumberInput') {\r\n const isNumber = !isNaN(Number(fieldValue));\r\n fieldValue = isNumber ? Number(fieldValue) : undefined;\r\n }\r\n\r\n // Collect all rules that match (OR condition)\r\n const matchedRules = f.dependencyRules.filter((rule: any) => {\r\n if (!rule.conditions || rule.conditions.length === 0) return false;\r\n\r\n // AND logic for conditions inside the rule\r\n return rule.conditions.every((cond: any) => {\r\n const depVal = values[cond.dependsOn];\r\n return evaluateOperator(depVal, cond.value, cond.operator);\r\n });\r\n });\r\n\r\n // If no rule matches → skip validation\r\n if (matchedRules.length === 0) return;\r\n\r\n // Apply ONLY the first matched rule (OR behavior)\r\n const ruleToApply = matchedRules[0];\r\n const strValue = (fieldValue !== undefined && fieldValue !== null) ? String(fieldValue) : '';\r\n // ---- Apply required if value is empty ----\r\n if (strValue.trim().length === 0) {\r\n ctx.addIssue({\r\n code: 'custom',\r\n path: [fieldName],\r\n message: ruleToApply.message || `${fieldName} is required`,\r\n });\r\n return;\r\n }\r\n\r\n // ---- Apply min / max / regex ----\r\n if (ruleToApply.min !== '' && ruleToApply.min !== undefined &&\r\n Number(fieldValue) < Number(ruleToApply.min)) {\r\n ctx.addIssue({\r\n code: 'custom',\r\n path: [fieldName],\r\n message: ruleToApply.message || `${fieldName} must be >= ${ruleToApply.min}`,\r\n });\r\n }\r\n\r\n if (ruleToApply.max !== '' && ruleToApply.max !== undefined && ruleToApply.max > 0 &&\r\n Number(fieldValue) > Number(ruleToApply.max)) {\r\n ctx.addIssue({\r\n code: 'custom',\r\n path: [fieldName],\r\n message: ruleToApply.message || `${fieldName} must be <= ${ruleToApply.max}`,\r\n });\r\n }\r\n\r\n if (ruleToApply.regex) {\r\n const re = new RegExp(ruleToApply.regex);\r\n if (!re.test(fieldValue)) {\r\n ctx.addIssue({\r\n code: 'custom',\r\n path: [fieldName],\r\n message: ruleToApply.message || `${fieldName} does not match required pattern`,\r\n });\r\n }\r\n }\r\n });\r\n });\r\n\r\n return schema;\r\n}\r\n\r\nfunction generateZodSchema(data: any[]) {\r\n const fieldMap: Record<string, any> = {};\r\n\r\n // Build individual field schemas\r\n data.forEach((field) => {\r\n let schema = buildFieldSchema(field);\r\n if (\r\n field.enableDependencyRules &&\r\n Array.isArray(field.dependencyRules) &&\r\n field.dependencyRules.length > 0\r\n ) {\r\n // Accept anything — validation will be handled ONLY in applyDependencyRules()\r\n schema = z.any();\r\n } else {\r\n // Otherwise use the normal schema\r\n schema = buildFieldSchema(field);\r\n\r\n // Only apply nullable/optional for non-required fields\r\n if (!field.isRequired) {\r\n schema = field.type === 'Checkbox' ? schema.optional() : schema.nullable().optional();\r\n }\r\n }\r\n\r\n fieldMap[field.name] = schema;\r\n });\r\n\r\n // Create object schema\r\n let schema = z.object(fieldMap);\r\n\r\n // Apply dependency rules\r\n schema = applyDependencyRules(schema, data);\r\n\r\n return schema;\r\n}\r\n\r\nconst FormWrapper = <T extends z.ZodObject<any>>({\r\n defaultValues,\r\n children,\r\n onSubmit,\r\n onReset,\r\n onValuesChange,\r\n ...props\r\n}: FormWrapperProps<T>) => {\r\n const initDefaultsAppliedRef = useRef(false);\r\n // console.log('FormWrapper props.validation:', props.validation);\r\n const schema = useMemo(() => {\r\n if (Array.isArray(props.validation)) return null;\r\n // Transform validation to ensure isRequired is boolean\r\n const validation = Object.values(props.validation || {}).map(v => ({\r\n ...v,\r\n isRequired: !!v.isRequired\r\n }));\r\n\r\n const formValidation = validation?.filter(i => i);\r\n if (!formValidation || formValidation.length === 0) return null;\r\n return generateZodSchema(formValidation);\r\n }, [props.validation]);\r\n\r\n type FormData = z.infer<T>;\r\n\r\n const onError = (errors: any) => {\r\n const firstKey = Object.keys(errors)[0];\r\n const form = document.querySelector(`form[data-form-name=\"${props.formName || ''}\"]`);\r\n\r\n if (!form) return;\r\n\r\n const errorField = form.querySelector(`[name=\"${firstKey}\"]`);\r\n\r\n if (errorField instanceof HTMLElement) {\r\n errorField.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n errorField.focus();\r\n }\r\n };\r\n\r\n const form = useForm<FormData>({\r\n shouldUnregister: true,\r\n shouldFocusError: true,\r\n resolver: schema ? zodResolver(schema) as any : undefined,\r\n defaultValues,\r\n });\r\n\r\n const formValues = useWatch({ control: form.control }) as FormData;\r\n\r\n useEffect(() => {\r\n onValuesChange?.(formValues);\r\n }, [formValues]);\r\n\r\n useEffect(() => {\r\n if (!defaultValues) return;\r\n if (initDefaultsAppliedRef.current) return;\r\n // Only reset if defaultValues is an object (not null, undefined, or array)\r\n if (typeof defaultValues === 'object' && defaultValues !== null && !Array.isArray(defaultValues)) {\r\n form.reset(defaultValues);\r\n initDefaultsAppliedRef.current = true;\r\n }\r\n }, [defaultValues]);\r\n\r\n const formSubmit = (data: FormData) => {\r\n const formValues = form.getValues();\r\n if (onSubmit) onSubmit({ ...formValues, ...data } as z.infer<T>);\r\n };\r\n\r\n const handleReset = () => {\r\n form.reset();\r\n if (onReset) onReset();\r\n };\r\n\r\n return (\r\n <form\r\n onSubmit={form.handleSubmit(formSubmit, onError)}\r\n onReset={handleReset}\r\n className={cn(\r\n 'space-y-4 min-h-[100px] h-auto flex justify-between flex-col'\r\n )}\r\n data-form-name={props.formName || ''}\r\n >\r\n <div className='min-h-[50px]'>\r\n {typeof children === 'function'\r\n ? (children as (form: UseFormReturn<FormData>) => React.ReactNode)(form)\r\n : children}\r\n </div>\r\n </form>\r\n );\r\n};\r\n\r\nexport default FormWrapper;","import { clsx, type ClassValue } from \"clsx\"\r\nimport { twMerge } from \"tailwind-merge\"\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs))\r\n}\r\n\r\nexport function getInitials(name: string) {\r\n const words = name.split(' ');\r\n if (words.length === 0) {\r\n return '';\r\n }\r\n if (words.length === 1) {\r\n return words[0].charAt(0);\r\n }\r\n return words[0].charAt(0) + words[1].charAt(0);\r\n}","'use client';\r\nimport React, { useMemo } from 'react';\r\n\r\nimport { zodResolver } from '@hookform/resolvers/zod';\r\nimport { useForm, Controller } from 'react-hook-form';\r\nimport { z } from 'zod';\r\n\r\nimport { cn } from '@/lib/utils';\r\n\r\n// ****************** THIS COMPONENT NOT USED IN EXPORT CODE OR ANYWHERE ELSE YET. ************************\r\n\r\ninterface FormProps<T extends z.ZodObject<any>> {\r\n validation?: any[];\r\n formName?: string;\r\n defaultValues?: Partial<z.infer<T>> | any;\r\n children?: React.ReactNode;\r\n onSubmit?: (data: z.infer<T>) => void;\r\n onReset?: () => void;\r\n}\r\n\r\nfunction generateZodSchema(data: any[]): z.ZodObject<any> {\r\n const fields = data.reduce((acc, f) => {\r\n const name = f.name || 'unnamed';\r\n const message = f.message || `${name} is invalid`;\r\n const passwordLen = f.passwordLength;\r\n\r\n let fieldSchema: any = z.string({ message });\r\n\r\n switch (f.type) {\r\n case 'Text':\r\n case 'Search':\r\n fieldSchema = z.string({ message });\r\n if (f?.min && f?.min !== '') fieldSchema = fieldSchema.min(f.min);\r\n else if (f.isRequired) fieldSchema = fieldSchema.min(1, { message: `${message}. Cannot be empty` });\r\n if (f?.max && f?.max !== '') fieldSchema = fieldSchema.max(f.max);\r\n if (f?.email) fieldSchema = fieldSchema.email();\r\n if (f?.url) fieldSchema = fieldSchema.url();\r\n if (f?.regex) fieldSchema = fieldSchema.regex(new RegExp(f.regex));\r\n break;\r\n case 'Email':\r\n fieldSchema = z.email({ message });\r\n break;\r\n case 'Password':\r\n fieldSchema = z.string({ message }).min(passwordLen, { message: `Password must be at least ${passwordLen} characters long` });\r\n break;\r\n case 'Phone':\r\n fieldSchema = z.string().transform(val => val.replace(/\\D/g, '')).transform(val => val.slice(-10)).refine(val => {\r\n return val.length === 10;\r\n }, {\r\n message: 'Phone number must be 10 digits long',\r\n });\r\n break;\r\n case 'DatePicker':\r\n fieldSchema = z.string({\r\n message: message || 'Date is required',\r\n }).trim().refine((val) => {\r\n if (f.isRequired && !val) return false;\r\n if (!f.isRequired && !val) return true;\r\n const date = new Date(val);\r\n return !isNaN(date.getTime());\r\n }, { message: message || 'Invalid date' });\r\n break;\r\n case 'FileInput':\r\n fieldSchema = z.instanceof(File, { message: 'Please select a file' });\r\n if (f?.maxSize) {\r\n fieldSchema = fieldSchema.refine(\r\n (file: File) => file.size <= f.maxSize,\r\n { message: `File size must be less than ${f.maxSize / 1024 / 1024}MB` }\r\n );\r\n }\r\n if (f?.acceptedTypes) {\r\n fieldSchema = fieldSchema.refine(\r\n (file: File) => f.acceptedTypes.includes(file.type),\r\n { message: `File type must be one of: ${f.acceptedTypes.join(', ')}` }\r\n );\r\n }\r\n break;\r\n case 'Checkbox':\r\n fieldSchema = z.boolean({ message });\r\n break;\r\n case 'Dropdown':\r\n if (f.isRequired) {\r\n fieldSchema = z.string({ message }).min(1, { message });\r\n } else {\r\n fieldSchema = z.string().nullable();\r\n }\r\n break;\r\n case 'NumberInput':\r\n let numberSchema = z.number({ message });\r\n\r\n if (f.min !== undefined)\r\n numberSchema = numberSchema.min(f.min, {\r\n message: `Minimum value is ${f.min}`,\r\n });\r\n\r\n if (f.max !== undefined)\r\n numberSchema = numberSchema.max(f.max, {\r\n message: `Maximum value is ${f.max}`,\r\n });\r\n\r\n // Preprocess empty string/null → null and cast strings to numbers\r\n fieldSchema = z.preprocess(\r\n (val) => {\r\n if (val === '' || val === null || val === undefined) return null;\r\n const num = Number(val);\r\n return isNaN(num) ? val : num;\r\n },\r\n numberSchema.nullable()\r\n );\r\n break;\r\n default:\r\n fieldSchema = z.any();\r\n }\r\n\r\n if (!f.isRequired) fieldSchema = fieldSchema.nullable().optional();\r\n\r\n acc[name] = fieldSchema;\r\n return acc;\r\n }, {} as Record<string, any>);\r\n\r\n return z.object(fields);\r\n}\r\n\r\nconst Form = <T extends z.ZodObject<any>>({\r\n validation,\r\n defaultValues,\r\n children,\r\n onSubmit,\r\n onReset,\r\n}: FormProps<T>) => {\r\n\r\n const schema = useMemo(() => {\r\n if (!validation || validation.length === 0) return null;\r\n return generateZodSchema(validation);\r\n }, [validation]);\r\n\r\n type FormData = z.infer<T>;\r\n\r\n const {\r\n handleSubmit,\r\n control,\r\n formState: { errors },\r\n reset,\r\n } = useForm<FormData>({\r\n resolver: schema ? zodResolver(schema) as any : undefined,\r\n defaultValues,\r\n });\r\n\r\n const formSubmit = (data: FormData) => {\r\n if (onSubmit) onSubmit(data);\r\n };\r\n\r\n const handleReset = () => {\r\n reset();\r\n if (onReset) onReset();\r\n };\r\n\r\n return (\r\n <form\r\n onSubmit={handleSubmit(formSubmit)}\r\n onReset={handleReset}\r\n className={cn(\r\n 'space-y-4 min-h-[100px] h-auto flex justify-between flex-col'\r\n )}\r\n >\r\n <div className='min-h-[50px]'>\r\n {React.Children.map(children, child => {\r\n const processChild = (child: React.ReactNode): React.ReactNode => {\r\n if (React.isValidElement(child)) {\r\n const node = (child.props as any)?.node;\r\n\r\n if (node?.category === 'Form Controls') {\r\n const name = node.properties?.name || 'unnamed';\r\n return (\r\n <div key={node.id} className=\"flex flex-col\">\r\n <Controller\r\n name={name}\r\n control={control}\r\n render={({ field: controllerField }) => {\r\n const childElement = child as React.ReactElement<{ children?: React.ReactNode, input?: any }>;\r\n return React.cloneElement(childElement, {\r\n input: {\r\n ...controllerField,\r\n value: controllerField.value || '',\r\n hasFormContainer: true,\r\n validateOnMount: true,\r\n errorMessage: errors[name]?.message || null\r\n },\r\n children: undefined\r\n });\r\n }}\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n // Recursively process children of this element\r\n if ((child as React.ReactElement<{ children?: React.ReactNode }>).props?.children) {\r\n const childElement = child as React.ReactElement<{ children?: React.ReactNode }>;\r\n return React.cloneElement(childElement, {\r\n children: React.Children.map(childElement.props.children, processChild),\r\n });\r\n }\r\n\r\n return React.cloneElement(child);\r\n }\r\n return child;\r\n };\r\n\r\n return processChild(child);\r\n })}\r\n </div>\r\n </form>\r\n );\r\n};\r\n\r\nexport default Form;","export type CanvasState = Record<string, any>;\r\n\r\nexport type CanvasAction =\r\n | { type: 'SET_STATE'; key: string; value: any }\r\n | { type: 'SET_MULTIPLE_STATES'; values: Record<string, any> }\r\n | { type: 'SET_FORM_STATE'; formName: string; values: Record<string, any> };\r\n\r\nexport function stateReducer(state: CanvasState, action: CanvasAction): CanvasState {\r\n switch (action.type) {\r\n case 'SET_STATE':\r\n return { ...state, [action.key]: action.value };\r\n\r\n case 'SET_MULTIPLE_STATES':\r\n return { ...state, ...action.values };\r\n\r\n case 'SET_FORM_STATE':\r\n return {\r\n ...state,\r\n form: {\r\n ...(state.form || {}),\r\n [action.formName]: {\r\n ...(state.form && state.form[action.formName] ? state.form[action.formName] : {}),\r\n ...action.values\r\n }\r\n }\r\n };\r\n\r\n default:\r\n return state;\r\n }\r\n}\r\n","'use client';\r\nimport React, { createContext, useContext, useReducer } from 'react';\r\n\r\nimport { stateReducer, CanvasState } from './stateReducer';\r\n\r\nconst StateContext = createContext<any>(null);\r\n\r\nexport function StateProvider({ children, initialState = {} }: { children: React.ReactNode, initialState?: CanvasState }) {\r\n const [state, dispatch] = useReducer(stateReducer, initialState);\r\n return (\r\n <StateContext.Provider value={{ state, dispatch }}>\r\n {children}\r\n </StateContext.Provider>\r\n );\r\n}\r\n\r\nexport function useAppState() {\r\n return useContext(StateContext);\r\n}\r\n"],"mappings":"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","names":["import_zod","schema","form","formValues","import_react","import_zod","import_react_hook_form","import_jsx_runtime","generateZodSchema","React","child","import_react","import_jsx_runtime"]}
package/dist/client.mjs CHANGED
@@ -11,6 +11,8 @@ import { useForm, useWatch } from "react-hook-form";
11
11
  import { z } from "zod";
12
12
  import { jsx } from "react/jsx-runtime";
13
13
  function normalizeBooleanLike(value) {
14
+ if (value === void 0 || value === null) return false;
15
+ if (value === "") return value;
14
16
  if (value === "true" || value === true) return true;
15
17
  if (value === "false" || value === false) return false;
16
18
  if (value === "1" || value === 1) return true;
@@ -52,7 +54,13 @@ function buildFieldSchema(field) {
52
54
  if (field.max) schema = schema.max(field.max, { message });
53
55
  if (field.email) schema = schema.email({ message });
54
56
  if (field.url) schema = schema.url({ message });
55
- if (field.regex) schema = schema.regex(new RegExp(field.regex), { message });
57
+ if (field.regex) {
58
+ if (field.isRequired) {
59
+ schema = schema.regex(new RegExp(field.regex), { message });
60
+ } else {
61
+ schema = schema.refine((val) => val === "" || new RegExp(field.regex).test(val), { message });
62
+ }
63
+ }
56
64
  return schema;
57
65
  }
58
66
  case "Email":
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Form/Wrapper.tsx","../src/components/Form/Form.tsx","../src/components/StateManagment/stateReducer.ts","../src/components/StateManagment/StateContext.tsx"],"sourcesContent":["'use client';\r\nimport React, { useEffect, useMemo, useRef } from 'react';\r\n\r\nimport { zodResolver } from '@hookform/resolvers/zod';\r\nimport { useForm, UseFormReturn, useWatch } from 'react-hook-form';\r\nimport { z } from 'zod';\r\n\r\nimport { cn } from '@/lib/utils';\r\n\r\ninterface FormWrapperProps<T extends z.ZodObject<any>> {\r\n validation?: Record<string, any>;\r\n formName?: string;\r\n defaultValues?: Partial<z.infer<T>> | any;\r\n children?: React.ReactNode | ((form: UseFormReturn<z.infer<T>>) => React.ReactNode);\r\n onSubmit?: (data: z.infer<T>) => void;\r\n onReset?: () => void;\r\n onValuesChange?: (values: z.infer<T>) => void;\r\n}\r\n\r\n// -------------------------\r\n// Normalize boolean strings for dependency comparison\r\n// -------------------------\r\nfunction normalizeBooleanLike(value: any): any {\r\n if (value === 'true' || value === true) return true;\r\n if (value === 'false' || value === false) return false;\r\n if (value === '1' || value === 1) return true;\r\n if (value === '0' || value === 0) return false;\r\n return value;\r\n}\r\n\r\n// -------------------------\r\n// Operator Matching Utility\r\n// -------------------------\r\nfunction evaluateOperator(depValue: any, ruleValue: any, operator: string) {\r\n // Normalize boolean strings so \"true\"/\"false\" match true/false in rules\r\n const normDep = normalizeBooleanLike(depValue);\r\n const normRule = normalizeBooleanLike(ruleValue);\r\n const dep = typeof normDep === 'boolean' && typeof normRule === 'boolean' ? normDep : depValue;\r\n const rule = typeof normDep === 'boolean' && typeof normRule === 'boolean' ? normRule : ruleValue;\r\n\r\n switch (operator) {\r\n case 'equals':\r\n return dep === rule;\r\n\r\n case 'not_equals':\r\n return dep !== rule;\r\n\r\n case 'greater_than':\r\n return Number(depValue) > Number(ruleValue);\r\n\r\n case 'less_than':\r\n return Number(depValue) < Number(ruleValue);\r\n\r\n case 'contains':\r\n if (Array.isArray(depValue)) return depValue.includes(ruleValue);\r\n if (typeof depValue === 'string') return depValue.includes(String(ruleValue));\r\n return false;\r\n\r\n case 'exists':\r\n return depValue !== null && depValue !== undefined && depValue !== '';\r\n\r\n default:\r\n return false;\r\n }\r\n}\r\n\r\n// -------------------------\r\n// Field Schema Generator\r\n// -------------------------\r\nfunction buildFieldSchema(field: any) {\r\n const message = field.message || `${field.name} is invalid`;\r\n\r\n switch (field.type) {\r\n case 'Text':\r\n case 'Search': {\r\n let schema = z.string({ message });\r\n\r\n if (field.min) schema = schema.min(field.min, { message });\r\n else if (field.isRequired) schema = schema.min(1, { message: `${message}. Cannot be empty` });\r\n\r\n if (field.max) schema = schema.max(field.max, { message });\r\n if (field.email) schema = schema.email({ message });\r\n if (field.url) schema = schema.url({ message });\r\n if (field.regex) schema = schema.regex(new RegExp(field.regex), { message });\r\n\r\n return schema;\r\n }\r\n\r\n case 'Email':\r\n return field.isRequired ? z.string().email({ message }) : z.string().nullable();\r\n\r\n case 'Password':\r\n return z\r\n .string({ message })\r\n .min(field.passwordLength, {\r\n message: `Password must be at least ${field.passwordLength} characters long`,\r\n });\r\n\r\n case 'Phone':\r\n if (!field.isRequired) return z.string({ message }).nullable();\r\n return z\r\n .string({ message })\r\n .transform((v) => v.replace(/\\D/g, '').slice(-10))\r\n .refine((val) => val.length === 10, {\r\n message: 'Phone number must be 10 digits long',\r\n });\r\n\r\n case 'DatePicker':\r\n const isTimePicker = field?.isTimePicker;\r\n return z\r\n .string({ message })\r\n .trim()\r\n .refine((v) => {\r\n if (field.isRequired && !v) return false;\r\n if (!v) return true;\r\n\r\n if (isTimePicker) {\r\n const timeRegex = /^([0-1]?[0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?$/;\r\n return timeRegex.test(v);\r\n } else {\r\n const d = new Date(v);\r\n return !isNaN(d.getTime());\r\n }\r\n }, { message });\r\n\r\n case 'FileInput': {\r\n let schema: any = z.instanceof(File, { message: 'Please select a file' });\r\n\r\n if (field.maxSize) {\r\n schema = schema.refine((file: File) => file.size <= field.maxSize, {\r\n message: `File size must be less than ${field.maxSize / 1024 / 1024} MB`,\r\n });\r\n }\r\n\r\n if (field.acceptedTypes) {\r\n schema = schema.refine(\r\n (file: File) => field.acceptedTypes.includes(file.type),\r\n { message: `File type must be one of: ${field.acceptedTypes.join(', ')}` }\r\n );\r\n }\r\n return schema;\r\n }\r\n\r\n case 'Checkbox':\r\n return z.preprocess(\r\n (v) => {\r\n if (v === 'false' || v === false || v === null) return false;\r\n if (v === 'true' || v === true) return true;\r\n if (v === '0' || v === 0) return false;\r\n if (v === '1' || v === 1) return true;\r\n return (v === '' ? undefined : v);\r\n },\r\n z.boolean({ message }).optional()\r\n );\r\n\r\n case 'Dropdown':\r\n return field.isRequired\r\n ? z.string({ message }).min(1, { message })\r\n : z.string({ message }).nullable();\r\n\r\n case 'NumberInput': {\r\n let numberSchema = z.number({ message });\r\n if (field.min !== '' && field.min !== undefined)\r\n numberSchema = numberSchema.min(field.min, {\r\n message: `Minimum value is ${field.min}`,\r\n });\r\n\r\n if (field.max !== '' && field.max !== undefined && field.max > 0)\r\n numberSchema = numberSchema.max(field.max, {\r\n message: `Maximum value is ${field.max}`,\r\n });\r\n\r\n return z.preprocess(\r\n (v) => {\r\n if (v === '' || v === null || v === undefined) return null;\r\n const n = Number(v);\r\n return isNaN(n) ? v : n;\r\n },\r\n numberSchema.nullable()\r\n );\r\n }\r\n\r\n default:\r\n return z.any();\r\n }\r\n}\r\n\r\n// -------------------------\r\n// Dependency Rule Validator with OR Operation\r\n// -------------------------\r\nfunction applyDependencyRules(schema: any, fields: any[]) {\r\n fields.forEach((f) => {\r\n\r\n if (!f.enableDependencyRules || !Array.isArray(f.dependencyRules)) return;\r\n\r\n const fieldName = f.name;\r\n const fieldType = f.type;\r\n\r\n schema = schema.superRefine((values: any, ctx: any) => {\r\n\r\n let fieldValue = values[fieldName] === '' ? undefined : values[fieldName];\r\n if (fieldType === 'NumberInput') {\r\n const isNumber = !isNaN(Number(fieldValue));\r\n fieldValue = isNumber ? Number(fieldValue) : undefined;\r\n }\r\n\r\n // Collect all rules that match (OR condition)\r\n const matchedRules = f.dependencyRules.filter((rule: any) => {\r\n if (!rule.conditions || rule.conditions.length === 0) return false;\r\n\r\n // AND logic for conditions inside the rule\r\n return rule.conditions.every((cond: any) => {\r\n const depVal = values[cond.dependsOn];\r\n return evaluateOperator(depVal, cond.value, cond.operator);\r\n });\r\n });\r\n\r\n // If no rule matches → skip validation\r\n if (matchedRules.length === 0) return;\r\n\r\n // Apply ONLY the first matched rule (OR behavior)\r\n const ruleToApply = matchedRules[0];\r\n const strValue = (fieldValue !== undefined && fieldValue !== null) ? String(fieldValue) : '';\r\n // ---- Apply required if value is empty ----\r\n if (strValue.trim().length === 0) {\r\n ctx.addIssue({\r\n code: 'custom',\r\n path: [fieldName],\r\n message: ruleToApply.message || `${fieldName} is required`,\r\n });\r\n return;\r\n }\r\n\r\n // ---- Apply min / max / regex ----\r\n if (ruleToApply.min !== '' && ruleToApply.min !== undefined &&\r\n Number(fieldValue) < Number(ruleToApply.min)) {\r\n ctx.addIssue({\r\n code: 'custom',\r\n path: [fieldName],\r\n message: ruleToApply.message || `${fieldName} must be >= ${ruleToApply.min}`,\r\n });\r\n }\r\n\r\n if (ruleToApply.max !== '' && ruleToApply.max !== undefined && ruleToApply.max > 0 &&\r\n Number(fieldValue) > Number(ruleToApply.max)) {\r\n ctx.addIssue({\r\n code: 'custom',\r\n path: [fieldName],\r\n message: ruleToApply.message || `${fieldName} must be <= ${ruleToApply.max}`,\r\n });\r\n }\r\n\r\n if (ruleToApply.regex) {\r\n const re = new RegExp(ruleToApply.regex);\r\n if (!re.test(fieldValue)) {\r\n ctx.addIssue({\r\n code: 'custom',\r\n path: [fieldName],\r\n message: ruleToApply.message || `${fieldName} does not match required pattern`,\r\n });\r\n }\r\n }\r\n });\r\n });\r\n\r\n return schema;\r\n}\r\n\r\nfunction generateZodSchema(data: any[]) {\r\n const fieldMap: Record<string, any> = {};\r\n\r\n // Build individual field schemas\r\n data.forEach((field) => {\r\n let schema = buildFieldSchema(field);\r\n if (\r\n field.enableDependencyRules &&\r\n Array.isArray(field.dependencyRules) &&\r\n field.dependencyRules.length > 0\r\n ) {\r\n // Accept anything — validation will be handled ONLY in applyDependencyRules()\r\n schema = z.any();\r\n } else {\r\n // Otherwise use the normal schema\r\n schema = buildFieldSchema(field);\r\n\r\n // Only apply nullable/optional for non-required fields\r\n if (!field.isRequired) {\r\n schema = field.type === 'Checkbox' ? schema.optional() : schema.nullable().optional();\r\n }\r\n }\r\n\r\n fieldMap[field.name] = schema;\r\n });\r\n\r\n // Create object schema\r\n let schema = z.object(fieldMap);\r\n\r\n // Apply dependency rules\r\n schema = applyDependencyRules(schema, data);\r\n\r\n return schema;\r\n}\r\n\r\nconst FormWrapper = <T extends z.ZodObject<any>>({\r\n defaultValues,\r\n children,\r\n onSubmit,\r\n onReset,\r\n onValuesChange,\r\n ...props\r\n}: FormWrapperProps<T>) => {\r\n const initDefaultsAppliedRef = useRef(false);\r\n // console.log('FormWrapper props.validation:', props.validation);\r\n const schema = useMemo(() => {\r\n if (Array.isArray(props.validation)) return null;\r\n // Transform validation to ensure isRequired is boolean\r\n const validation = Object.values(props.validation || {}).map(v => ({\r\n ...v,\r\n isRequired: !!v.isRequired\r\n }));\r\n\r\n const formValidation = validation?.filter(i => i);\r\n if (!formValidation || formValidation.length === 0) return null;\r\n return generateZodSchema(formValidation);\r\n }, [props.validation]);\r\n\r\n type FormData = z.infer<T>;\r\n\r\n const onError = (errors: any) => {\r\n const firstKey = Object.keys(errors)[0];\r\n const form = document.querySelector(`form[data-form-name=\"${props.formName || ''}\"]`);\r\n\r\n if (!form) return;\r\n\r\n const errorField = form.querySelector(`[name=\"${firstKey}\"]`);\r\n\r\n if (errorField instanceof HTMLElement) {\r\n errorField.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n errorField.focus();\r\n }\r\n };\r\n\r\n const form = useForm<FormData>({\r\n shouldUnregister: true,\r\n shouldFocusError: true,\r\n resolver: schema ? zodResolver(schema) as any : undefined,\r\n defaultValues,\r\n });\r\n\r\n const formValues = useWatch({ control: form.control }) as FormData;\r\n\r\n useEffect(() => {\r\n onValuesChange?.(formValues);\r\n }, [formValues]);\r\n\r\n useEffect(() => {\r\n if (!defaultValues) return;\r\n if (initDefaultsAppliedRef.current) return;\r\n // Only reset if defaultValues is an object (not null, undefined, or array)\r\n if (typeof defaultValues === 'object' && defaultValues !== null && !Array.isArray(defaultValues)) {\r\n form.reset(defaultValues);\r\n initDefaultsAppliedRef.current = true;\r\n }\r\n }, [defaultValues]);\r\n\r\n const formSubmit = (data: FormData) => {\r\n const formValues = form.getValues();\r\n if (onSubmit) onSubmit({ ...formValues, ...data } as z.infer<T>);\r\n };\r\n\r\n const handleReset = () => {\r\n form.reset();\r\n if (onReset) onReset();\r\n };\r\n\r\n return (\r\n <form\r\n onSubmit={form.handleSubmit(formSubmit, onError)}\r\n onReset={handleReset}\r\n className={cn(\r\n 'space-y-4 min-h-[100px] h-auto flex justify-between flex-col'\r\n )}\r\n data-form-name={props.formName || ''}\r\n >\r\n <div className='min-h-[50px]'>\r\n {typeof children === 'function'\r\n ? (children as (form: UseFormReturn<FormData>) => React.ReactNode)(form)\r\n : children}\r\n </div>\r\n </form>\r\n );\r\n};\r\n\r\nexport default FormWrapper;","'use client';\r\nimport React, { useMemo } from 'react';\r\n\r\nimport { zodResolver } from '@hookform/resolvers/zod';\r\nimport { useForm, Controller } from 'react-hook-form';\r\nimport { z } from 'zod';\r\n\r\nimport { cn } from '@/lib/utils';\r\n\r\n// ****************** THIS COMPONENT NOT USED IN EXPORT CODE OR ANYWHERE ELSE YET. ************************\r\n\r\ninterface FormProps<T extends z.ZodObject<any>> {\r\n validation?: any[];\r\n formName?: string;\r\n defaultValues?: Partial<z.infer<T>> | any;\r\n children?: React.ReactNode;\r\n onSubmit?: (data: z.infer<T>) => void;\r\n onReset?: () => void;\r\n}\r\n\r\nfunction generateZodSchema(data: any[]): z.ZodObject<any> {\r\n const fields = data.reduce((acc, f) => {\r\n const name = f.name || 'unnamed';\r\n const message = f.message || `${name} is invalid`;\r\n const passwordLen = f.passwordLength;\r\n\r\n let fieldSchema: any = z.string({ message });\r\n\r\n switch (f.type) {\r\n case 'Text':\r\n case 'Search':\r\n fieldSchema = z.string({ message });\r\n if (f?.min && f?.min !== '') fieldSchema = fieldSchema.min(f.min);\r\n else if (f.isRequired) fieldSchema = fieldSchema.min(1, { message: `${message}. Cannot be empty` });\r\n if (f?.max && f?.max !== '') fieldSchema = fieldSchema.max(f.max);\r\n if (f?.email) fieldSchema = fieldSchema.email();\r\n if (f?.url) fieldSchema = fieldSchema.url();\r\n if (f?.regex) fieldSchema = fieldSchema.regex(new RegExp(f.regex));\r\n break;\r\n case 'Email':\r\n fieldSchema = z.email({ message });\r\n break;\r\n case 'Password':\r\n fieldSchema = z.string({ message }).min(passwordLen, { message: `Password must be at least ${passwordLen} characters long` });\r\n break;\r\n case 'Phone':\r\n fieldSchema = z.string().transform(val => val.replace(/\\D/g, '')).transform(val => val.slice(-10)).refine(val => {\r\n return val.length === 10;\r\n }, {\r\n message: 'Phone number must be 10 digits long',\r\n });\r\n break;\r\n case 'DatePicker':\r\n fieldSchema = z.string({\r\n message: message || 'Date is required',\r\n }).trim().refine((val) => {\r\n if (f.isRequired && !val) return false;\r\n if (!f.isRequired && !val) return true;\r\n const date = new Date(val);\r\n return !isNaN(date.getTime());\r\n }, { message: message || 'Invalid date' });\r\n break;\r\n case 'FileInput':\r\n fieldSchema = z.instanceof(File, { message: 'Please select a file' });\r\n if (f?.maxSize) {\r\n fieldSchema = fieldSchema.refine(\r\n (file: File) => file.size <= f.maxSize,\r\n { message: `File size must be less than ${f.maxSize / 1024 / 1024}MB` }\r\n );\r\n }\r\n if (f?.acceptedTypes) {\r\n fieldSchema = fieldSchema.refine(\r\n (file: File) => f.acceptedTypes.includes(file.type),\r\n { message: `File type must be one of: ${f.acceptedTypes.join(', ')}` }\r\n );\r\n }\r\n break;\r\n case 'Checkbox':\r\n fieldSchema = z.boolean({ message });\r\n break;\r\n case 'Dropdown':\r\n if (f.isRequired) {\r\n fieldSchema = z.string({ message }).min(1, { message });\r\n } else {\r\n fieldSchema = z.string().nullable();\r\n }\r\n break;\r\n case 'NumberInput':\r\n let numberSchema = z.number({ message });\r\n\r\n if (f.min !== undefined)\r\n numberSchema = numberSchema.min(f.min, {\r\n message: `Minimum value is ${f.min}`,\r\n });\r\n\r\n if (f.max !== undefined)\r\n numberSchema = numberSchema.max(f.max, {\r\n message: `Maximum value is ${f.max}`,\r\n });\r\n\r\n // Preprocess empty string/null → null and cast strings to numbers\r\n fieldSchema = z.preprocess(\r\n (val) => {\r\n if (val === '' || val === null || val === undefined) return null;\r\n const num = Number(val);\r\n return isNaN(num) ? val : num;\r\n },\r\n numberSchema.nullable()\r\n );\r\n break;\r\n default:\r\n fieldSchema = z.any();\r\n }\r\n\r\n if (!f.isRequired) fieldSchema = fieldSchema.nullable().optional();\r\n\r\n acc[name] = fieldSchema;\r\n return acc;\r\n }, {} as Record<string, any>);\r\n\r\n return z.object(fields);\r\n}\r\n\r\nconst Form = <T extends z.ZodObject<any>>({\r\n validation,\r\n defaultValues,\r\n children,\r\n onSubmit,\r\n onReset,\r\n}: FormProps<T>) => {\r\n\r\n const schema = useMemo(() => {\r\n if (!validation || validation.length === 0) return null;\r\n return generateZodSchema(validation);\r\n }, [validation]);\r\n\r\n type FormData = z.infer<T>;\r\n\r\n const {\r\n handleSubmit,\r\n control,\r\n formState: { errors },\r\n reset,\r\n } = useForm<FormData>({\r\n resolver: schema ? zodResolver(schema) as any : undefined,\r\n defaultValues,\r\n });\r\n\r\n const formSubmit = (data: FormData) => {\r\n if (onSubmit) onSubmit(data);\r\n };\r\n\r\n const handleReset = () => {\r\n reset();\r\n if (onReset) onReset();\r\n };\r\n\r\n return (\r\n <form\r\n onSubmit={handleSubmit(formSubmit)}\r\n onReset={handleReset}\r\n className={cn(\r\n 'space-y-4 min-h-[100px] h-auto flex justify-between flex-col'\r\n )}\r\n >\r\n <div className='min-h-[50px]'>\r\n {React.Children.map(children, child => {\r\n const processChild = (child: React.ReactNode): React.ReactNode => {\r\n if (React.isValidElement(child)) {\r\n const node = (child.props as any)?.node;\r\n\r\n if (node?.category === 'Form Controls') {\r\n const name = node.properties?.name || 'unnamed';\r\n return (\r\n <div key={node.id} className=\"flex flex-col\">\r\n <Controller\r\n name={name}\r\n control={control}\r\n render={({ field: controllerField }) => {\r\n const childElement = child as React.ReactElement<{ children?: React.ReactNode, input?: any }>;\r\n return React.cloneElement(childElement, {\r\n input: {\r\n ...controllerField,\r\n value: controllerField.value || '',\r\n hasFormContainer: true,\r\n validateOnMount: true,\r\n errorMessage: errors[name]?.message || null\r\n },\r\n children: undefined\r\n });\r\n }}\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n // Recursively process children of this element\r\n if ((child as React.ReactElement<{ children?: React.ReactNode }>).props?.children) {\r\n const childElement = child as React.ReactElement<{ children?: React.ReactNode }>;\r\n return React.cloneElement(childElement, {\r\n children: React.Children.map(childElement.props.children, processChild),\r\n });\r\n }\r\n\r\n return React.cloneElement(child);\r\n }\r\n return child;\r\n };\r\n\r\n return processChild(child);\r\n })}\r\n </div>\r\n </form>\r\n );\r\n};\r\n\r\nexport default Form;","export type CanvasState = Record<string, any>;\r\n\r\nexport type CanvasAction =\r\n | { type: 'SET_STATE'; key: string; value: any }\r\n | { type: 'SET_MULTIPLE_STATES'; values: Record<string, any> }\r\n | { type: 'SET_FORM_STATE'; formName: string; values: Record<string, any> };\r\n\r\nexport function stateReducer(state: CanvasState, action: CanvasAction): CanvasState {\r\n switch (action.type) {\r\n case 'SET_STATE':\r\n return { ...state, [action.key]: action.value };\r\n\r\n case 'SET_MULTIPLE_STATES':\r\n return { ...state, ...action.values };\r\n\r\n case 'SET_FORM_STATE':\r\n return {\r\n ...state,\r\n form: {\r\n ...(state.form || {}),\r\n [action.formName]: {\r\n ...(state.form && state.form[action.formName] ? state.form[action.formName] : {}),\r\n ...action.values\r\n }\r\n }\r\n };\r\n\r\n default:\r\n return state;\r\n }\r\n}\r\n","'use client';\r\nimport React, { createContext, useContext, useReducer } from 'react';\r\n\r\nimport { stateReducer, CanvasState } from './stateReducer';\r\n\r\nconst StateContext = createContext<any>(null);\r\n\r\nexport function StateProvider({ children, initialState = {} }: { children: React.ReactNode, initialState?: CanvasState }) {\r\n const [state, dispatch] = useReducer(stateReducer, initialState);\r\n return (\r\n <StateContext.Provider value={{ state, dispatch }}>\r\n {children}\r\n </StateContext.Provider>\r\n );\r\n}\r\n\r\nexport function useAppState() {\r\n return useContext(StateContext);\r\n}\r\n"],"mappings":"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","names":["schema","form","formValues","React","useMemo","zodResolver","useForm","z","jsx","generateZodSchema","z","useMemo","useForm","zodResolver","React","child","jsx"]}
1
+ {"version":3,"sources":["../src/components/Form/Wrapper.tsx","../src/components/Form/Form.tsx","../src/components/StateManagment/stateReducer.ts","../src/components/StateManagment/StateContext.tsx"],"sourcesContent":["'use client';\r\nimport React, { useEffect, useMemo, useRef } from 'react';\r\n\r\nimport { zodResolver } from '@hookform/resolvers/zod';\r\nimport { useForm, UseFormReturn, useWatch } from 'react-hook-form';\r\nimport { z } from 'zod';\r\n\r\nimport { cn } from '@/lib/utils';\r\n\r\ninterface FormWrapperProps<T extends z.ZodObject<any>> {\r\n validation?: Record<string, any>;\r\n formName?: string;\r\n defaultValues?: Partial<z.infer<T>> | any;\r\n children?: React.ReactNode | ((form: UseFormReturn<z.infer<T>>) => React.ReactNode);\r\n onSubmit?: (data: z.infer<T>) => void;\r\n onReset?: () => void;\r\n onValuesChange?: (values: z.infer<T>) => void;\r\n}\r\n\r\n// -------------------------\r\n// Normalize boolean strings for dependency comparison\r\n// -------------------------\r\nfunction normalizeBooleanLike(value: any): any {\r\n // Do not normalize '' to false: empty string must stay distinct so that\r\n // rule \"equals ''\" does not match fields with value 'false' or '0', and\r\n // rule \"equals 'false'\" does not match empty fields.\r\n if (value === undefined || value === null) return false;\r\n if (value === '') return value;\r\n if (value === 'true' || value === true) return true;\r\n if (value === 'false' || value === false) return false;\r\n if (value === '1' || value === 1) return true;\r\n if (value === '0' || value === 0) return false;\r\n return value;\r\n}\r\n\r\n// -------------------------\r\n// Operator Matching Utility\r\n// -------------------------\r\nfunction evaluateOperator(depValue: any, ruleValue: any, operator: string) {\r\n // Normalize boolean strings so \"true\"/\"false\" match true/false in rules\r\n const normDep = normalizeBooleanLike(depValue);\r\n const normRule = normalizeBooleanLike(ruleValue);\r\n const dep = typeof normDep === 'boolean' && typeof normRule === 'boolean' ? normDep : depValue;\r\n const rule = typeof normDep === 'boolean' && typeof normRule === 'boolean' ? normRule : ruleValue;\r\n\r\n switch (operator) {\r\n case 'equals':\r\n return dep === rule;\r\n\r\n case 'not_equals':\r\n return dep !== rule;\r\n\r\n case 'greater_than':\r\n return Number(depValue) > Number(ruleValue);\r\n\r\n case 'less_than':\r\n return Number(depValue) < Number(ruleValue);\r\n\r\n case 'contains':\r\n if (Array.isArray(depValue)) return depValue.includes(ruleValue);\r\n if (typeof depValue === 'string') return depValue.includes(String(ruleValue));\r\n return false;\r\n\r\n case 'exists':\r\n return depValue !== null && depValue !== undefined && depValue !== '';\r\n\r\n default:\r\n return false;\r\n }\r\n}\r\n\r\n// -------------------------\r\n// Field Schema Generator\r\n// -------------------------\r\nfunction buildFieldSchema(field: any) {\r\n const message = field.message || `${field.name} is invalid`;\r\n\r\n switch (field.type) {\r\n case 'Text':\r\n case 'Search': {\r\n let schema = z.string({ message });\r\n\r\n if (field.min) schema = schema.min(field.min, { message });\r\n else if (field.isRequired) schema = schema.min(1, { message: `${message}. Cannot be empty` });\r\n\r\n if (field.max) schema = schema.max(field.max, { message });\r\n if (field.email) schema = schema.email({ message });\r\n if (field.url) schema = schema.url({ message });\r\n if (field.regex) {\r\n if (field.isRequired) {\r\n schema = schema.regex(new RegExp(field.regex), { message });\r\n } else {\r\n schema = schema.refine((val) => val === '' || new RegExp(field.regex).test(val), { message });\r\n }\r\n }\r\n\r\n return schema;\r\n }\r\n\r\n case 'Email':\r\n return field.isRequired ? z.string().email({ message }) : z.string().nullable();\r\n\r\n case 'Password':\r\n return z\r\n .string({ message })\r\n .min(field.passwordLength, {\r\n message: `Password must be at least ${field.passwordLength} characters long`,\r\n });\r\n\r\n case 'Phone':\r\n if (!field.isRequired) return z.string({ message }).nullable();\r\n return z\r\n .string({ message })\r\n .transform((v) => v.replace(/\\D/g, '').slice(-10))\r\n .refine((val) => val.length === 10, {\r\n message: 'Phone number must be 10 digits long',\r\n });\r\n\r\n case 'DatePicker':\r\n const isTimePicker = field?.isTimePicker;\r\n return z\r\n .string({ message })\r\n .trim()\r\n .refine((v) => {\r\n if (field.isRequired && !v) return false;\r\n if (!v) return true;\r\n\r\n if (isTimePicker) {\r\n const timeRegex = /^([0-1]?[0-9]|2[0-3]):[0-5][0-9](:[0-5][0-9])?$/;\r\n return timeRegex.test(v);\r\n } else {\r\n const d = new Date(v);\r\n return !isNaN(d.getTime());\r\n }\r\n }, { message });\r\n\r\n case 'FileInput': {\r\n let schema: any = z.instanceof(File, { message: 'Please select a file' });\r\n\r\n if (field.maxSize) {\r\n schema = schema.refine((file: File) => file.size <= field.maxSize, {\r\n message: `File size must be less than ${field.maxSize / 1024 / 1024} MB`,\r\n });\r\n }\r\n\r\n if (field.acceptedTypes) {\r\n schema = schema.refine(\r\n (file: File) => field.acceptedTypes.includes(file.type),\r\n { message: `File type must be one of: ${field.acceptedTypes.join(', ')}` }\r\n );\r\n }\r\n return schema;\r\n }\r\n\r\n case 'Checkbox':\r\n return z.preprocess(\r\n (v) => {\r\n if (v === 'false' || v === false || v === null) return false;\r\n if (v === 'true' || v === true) return true;\r\n if (v === '0' || v === 0) return false;\r\n if (v === '1' || v === 1) return true;\r\n return (v === '' ? undefined : v);\r\n },\r\n z.boolean({ message }).optional()\r\n );\r\n\r\n case 'Dropdown':\r\n return field.isRequired\r\n ? z.string({ message }).min(1, { message })\r\n : z.string({ message }).nullable();\r\n\r\n case 'NumberInput': {\r\n let numberSchema = z.number({ message });\r\n if (field.min !== '' && field.min !== undefined)\r\n numberSchema = numberSchema.min(field.min, {\r\n message: `Minimum value is ${field.min}`,\r\n });\r\n\r\n if (field.max !== '' && field.max !== undefined && field.max > 0)\r\n numberSchema = numberSchema.max(field.max, {\r\n message: `Maximum value is ${field.max}`,\r\n });\r\n\r\n return z.preprocess(\r\n (v) => {\r\n if (v === '' || v === null || v === undefined) return null;\r\n const n = Number(v);\r\n return isNaN(n) ? v : n;\r\n },\r\n numberSchema.nullable()\r\n );\r\n }\r\n\r\n default:\r\n return z.any();\r\n }\r\n}\r\n\r\n// -------------------------\r\n// Dependency Rule Validator with OR Operation\r\n// -------------------------\r\nfunction applyDependencyRules(schema: any, fields: any[]) {\r\n fields.forEach((f) => {\r\n if (!f.enableDependencyRules || !Array.isArray(f.dependencyRules)) return;\r\n\r\n const fieldName = f.name;\r\n const fieldType = f.type;\r\n\r\n schema = schema.superRefine((values: any, ctx: any) => {\r\n\r\n let fieldValue = values[fieldName] === '' ? undefined : values[fieldName];\r\n if (fieldType === 'NumberInput') {\r\n const isNumber = !isNaN(Number(fieldValue));\r\n fieldValue = isNumber ? Number(fieldValue) : undefined;\r\n }\r\n\r\n // Collect all rules that match (OR condition)\r\n const matchedRules = f.dependencyRules.filter((rule: any) => {\r\n if (!rule.conditions || rule.conditions.length === 0) return false;\r\n\r\n // AND logic for conditions inside the rule\r\n return rule.conditions.every((cond: any) => {\r\n const depVal = values[cond.dependsOn];\r\n return evaluateOperator(depVal, cond.value, cond.operator);\r\n });\r\n });\r\n\r\n // If no rule matches → skip validation\r\n if (matchedRules.length === 0) return;\r\n\r\n // Apply ONLY the first matched rule (OR behavior)\r\n const ruleToApply = matchedRules[0];\r\n const strValue = (fieldValue !== undefined && fieldValue !== null) ? String(fieldValue) : '';\r\n // ---- Apply required if value is empty ----\r\n if (strValue.trim().length === 0) {\r\n ctx.addIssue({\r\n code: 'custom',\r\n path: [fieldName],\r\n message: ruleToApply.message || `${fieldName} is required`,\r\n });\r\n return;\r\n }\r\n\r\n // ---- Apply min / max / regex ----\r\n if (ruleToApply.min !== '' && ruleToApply.min !== undefined &&\r\n Number(fieldValue) < Number(ruleToApply.min)) {\r\n ctx.addIssue({\r\n code: 'custom',\r\n path: [fieldName],\r\n message: ruleToApply.message || `${fieldName} must be >= ${ruleToApply.min}`,\r\n });\r\n }\r\n\r\n if (ruleToApply.max !== '' && ruleToApply.max !== undefined && ruleToApply.max > 0 &&\r\n Number(fieldValue) > Number(ruleToApply.max)) {\r\n ctx.addIssue({\r\n code: 'custom',\r\n path: [fieldName],\r\n message: ruleToApply.message || `${fieldName} must be <= ${ruleToApply.max}`,\r\n });\r\n }\r\n\r\n if (ruleToApply.regex) {\r\n const re = new RegExp(ruleToApply.regex);\r\n if (!re.test(fieldValue)) {\r\n ctx.addIssue({\r\n code: 'custom',\r\n path: [fieldName],\r\n message: ruleToApply.message || `${fieldName} does not match required pattern`,\r\n });\r\n }\r\n }\r\n });\r\n });\r\n\r\n return schema;\r\n}\r\n\r\nfunction generateZodSchema(data: any[]) {\r\n const fieldMap: Record<string, any> = {};\r\n\r\n // Build individual field schemas\r\n data.forEach((field) => {\r\n let schema = buildFieldSchema(field);\r\n if (\r\n field.enableDependencyRules &&\r\n Array.isArray(field.dependencyRules) &&\r\n field.dependencyRules.length > 0\r\n ) {\r\n // Accept anything — validation will be handled ONLY in applyDependencyRules()\r\n schema = z.any();\r\n } else {\r\n // Otherwise use the normal schema\r\n schema = buildFieldSchema(field);\r\n\r\n // Only apply nullable/optional for non-required fields\r\n if (!field.isRequired) {\r\n schema = field.type === 'Checkbox' ? schema.optional() : schema.nullable().optional();\r\n }\r\n }\r\n\r\n fieldMap[field.name] = schema;\r\n });\r\n\r\n // Create object schema\r\n let schema = z.object(fieldMap);\r\n\r\n // Apply dependency rules\r\n schema = applyDependencyRules(schema, data);\r\n\r\n return schema;\r\n}\r\n\r\nconst FormWrapper = <T extends z.ZodObject<any>>({\r\n defaultValues,\r\n children,\r\n onSubmit,\r\n onReset,\r\n onValuesChange,\r\n ...props\r\n}: FormWrapperProps<T>) => {\r\n const initDefaultsAppliedRef = useRef(false);\r\n // console.log('FormWrapper props.validation:', props.validation);\r\n const schema = useMemo(() => {\r\n if (Array.isArray(props.validation)) return null;\r\n // Transform validation to ensure isRequired is boolean\r\n const validation = Object.values(props.validation || {}).map(v => ({\r\n ...v,\r\n isRequired: !!v.isRequired\r\n }));\r\n\r\n const formValidation = validation?.filter(i => i);\r\n if (!formValidation || formValidation.length === 0) return null;\r\n return generateZodSchema(formValidation);\r\n }, [props.validation]);\r\n\r\n type FormData = z.infer<T>;\r\n\r\n const onError = (errors: any) => {\r\n const firstKey = Object.keys(errors)[0];\r\n const form = document.querySelector(`form[data-form-name=\"${props.formName || ''}\"]`);\r\n\r\n if (!form) return;\r\n\r\n const errorField = form.querySelector(`[name=\"${firstKey}\"]`);\r\n\r\n if (errorField instanceof HTMLElement) {\r\n errorField.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n errorField.focus();\r\n }\r\n };\r\n\r\n const form = useForm<FormData>({\r\n shouldUnregister: true,\r\n shouldFocusError: true,\r\n resolver: schema ? zodResolver(schema) as any : undefined,\r\n defaultValues,\r\n });\r\n\r\n const formValues = useWatch({ control: form.control }) as FormData;\r\n\r\n useEffect(() => {\r\n onValuesChange?.(formValues);\r\n }, [formValues]);\r\n\r\n useEffect(() => {\r\n if (!defaultValues) return;\r\n if (initDefaultsAppliedRef.current) return;\r\n // Only reset if defaultValues is an object (not null, undefined, or array)\r\n if (typeof defaultValues === 'object' && defaultValues !== null && !Array.isArray(defaultValues)) {\r\n form.reset(defaultValues);\r\n initDefaultsAppliedRef.current = true;\r\n }\r\n }, [defaultValues]);\r\n\r\n const formSubmit = (data: FormData) => {\r\n const formValues = form.getValues();\r\n if (onSubmit) onSubmit({ ...formValues, ...data } as z.infer<T>);\r\n };\r\n\r\n const handleReset = () => {\r\n form.reset();\r\n if (onReset) onReset();\r\n };\r\n\r\n return (\r\n <form\r\n onSubmit={form.handleSubmit(formSubmit, onError)}\r\n onReset={handleReset}\r\n className={cn(\r\n 'space-y-4 min-h-[100px] h-auto flex justify-between flex-col'\r\n )}\r\n data-form-name={props.formName || ''}\r\n >\r\n <div className='min-h-[50px]'>\r\n {typeof children === 'function'\r\n ? (children as (form: UseFormReturn<FormData>) => React.ReactNode)(form)\r\n : children}\r\n </div>\r\n </form>\r\n );\r\n};\r\n\r\nexport default FormWrapper;","'use client';\r\nimport React, { useMemo } from 'react';\r\n\r\nimport { zodResolver } from '@hookform/resolvers/zod';\r\nimport { useForm, Controller } from 'react-hook-form';\r\nimport { z } from 'zod';\r\n\r\nimport { cn } from '@/lib/utils';\r\n\r\n// ****************** THIS COMPONENT NOT USED IN EXPORT CODE OR ANYWHERE ELSE YET. ************************\r\n\r\ninterface FormProps<T extends z.ZodObject<any>> {\r\n validation?: any[];\r\n formName?: string;\r\n defaultValues?: Partial<z.infer<T>> | any;\r\n children?: React.ReactNode;\r\n onSubmit?: (data: z.infer<T>) => void;\r\n onReset?: () => void;\r\n}\r\n\r\nfunction generateZodSchema(data: any[]): z.ZodObject<any> {\r\n const fields = data.reduce((acc, f) => {\r\n const name = f.name || 'unnamed';\r\n const message = f.message || `${name} is invalid`;\r\n const passwordLen = f.passwordLength;\r\n\r\n let fieldSchema: any = z.string({ message });\r\n\r\n switch (f.type) {\r\n case 'Text':\r\n case 'Search':\r\n fieldSchema = z.string({ message });\r\n if (f?.min && f?.min !== '') fieldSchema = fieldSchema.min(f.min);\r\n else if (f.isRequired) fieldSchema = fieldSchema.min(1, { message: `${message}. Cannot be empty` });\r\n if (f?.max && f?.max !== '') fieldSchema = fieldSchema.max(f.max);\r\n if (f?.email) fieldSchema = fieldSchema.email();\r\n if (f?.url) fieldSchema = fieldSchema.url();\r\n if (f?.regex) fieldSchema = fieldSchema.regex(new RegExp(f.regex));\r\n break;\r\n case 'Email':\r\n fieldSchema = z.email({ message });\r\n break;\r\n case 'Password':\r\n fieldSchema = z.string({ message }).min(passwordLen, { message: `Password must be at least ${passwordLen} characters long` });\r\n break;\r\n case 'Phone':\r\n fieldSchema = z.string().transform(val => val.replace(/\\D/g, '')).transform(val => val.slice(-10)).refine(val => {\r\n return val.length === 10;\r\n }, {\r\n message: 'Phone number must be 10 digits long',\r\n });\r\n break;\r\n case 'DatePicker':\r\n fieldSchema = z.string({\r\n message: message || 'Date is required',\r\n }).trim().refine((val) => {\r\n if (f.isRequired && !val) return false;\r\n if (!f.isRequired && !val) return true;\r\n const date = new Date(val);\r\n return !isNaN(date.getTime());\r\n }, { message: message || 'Invalid date' });\r\n break;\r\n case 'FileInput':\r\n fieldSchema = z.instanceof(File, { message: 'Please select a file' });\r\n if (f?.maxSize) {\r\n fieldSchema = fieldSchema.refine(\r\n (file: File) => file.size <= f.maxSize,\r\n { message: `File size must be less than ${f.maxSize / 1024 / 1024}MB` }\r\n );\r\n }\r\n if (f?.acceptedTypes) {\r\n fieldSchema = fieldSchema.refine(\r\n (file: File) => f.acceptedTypes.includes(file.type),\r\n { message: `File type must be one of: ${f.acceptedTypes.join(', ')}` }\r\n );\r\n }\r\n break;\r\n case 'Checkbox':\r\n fieldSchema = z.boolean({ message });\r\n break;\r\n case 'Dropdown':\r\n if (f.isRequired) {\r\n fieldSchema = z.string({ message }).min(1, { message });\r\n } else {\r\n fieldSchema = z.string().nullable();\r\n }\r\n break;\r\n case 'NumberInput':\r\n let numberSchema = z.number({ message });\r\n\r\n if (f.min !== undefined)\r\n numberSchema = numberSchema.min(f.min, {\r\n message: `Minimum value is ${f.min}`,\r\n });\r\n\r\n if (f.max !== undefined)\r\n numberSchema = numberSchema.max(f.max, {\r\n message: `Maximum value is ${f.max}`,\r\n });\r\n\r\n // Preprocess empty string/null → null and cast strings to numbers\r\n fieldSchema = z.preprocess(\r\n (val) => {\r\n if (val === '' || val === null || val === undefined) return null;\r\n const num = Number(val);\r\n return isNaN(num) ? val : num;\r\n },\r\n numberSchema.nullable()\r\n );\r\n break;\r\n default:\r\n fieldSchema = z.any();\r\n }\r\n\r\n if (!f.isRequired) fieldSchema = fieldSchema.nullable().optional();\r\n\r\n acc[name] = fieldSchema;\r\n return acc;\r\n }, {} as Record<string, any>);\r\n\r\n return z.object(fields);\r\n}\r\n\r\nconst Form = <T extends z.ZodObject<any>>({\r\n validation,\r\n defaultValues,\r\n children,\r\n onSubmit,\r\n onReset,\r\n}: FormProps<T>) => {\r\n\r\n const schema = useMemo(() => {\r\n if (!validation || validation.length === 0) return null;\r\n return generateZodSchema(validation);\r\n }, [validation]);\r\n\r\n type FormData = z.infer<T>;\r\n\r\n const {\r\n handleSubmit,\r\n control,\r\n formState: { errors },\r\n reset,\r\n } = useForm<FormData>({\r\n resolver: schema ? zodResolver(schema) as any : undefined,\r\n defaultValues,\r\n });\r\n\r\n const formSubmit = (data: FormData) => {\r\n if (onSubmit) onSubmit(data);\r\n };\r\n\r\n const handleReset = () => {\r\n reset();\r\n if (onReset) onReset();\r\n };\r\n\r\n return (\r\n <form\r\n onSubmit={handleSubmit(formSubmit)}\r\n onReset={handleReset}\r\n className={cn(\r\n 'space-y-4 min-h-[100px] h-auto flex justify-between flex-col'\r\n )}\r\n >\r\n <div className='min-h-[50px]'>\r\n {React.Children.map(children, child => {\r\n const processChild = (child: React.ReactNode): React.ReactNode => {\r\n if (React.isValidElement(child)) {\r\n const node = (child.props as any)?.node;\r\n\r\n if (node?.category === 'Form Controls') {\r\n const name = node.properties?.name || 'unnamed';\r\n return (\r\n <div key={node.id} className=\"flex flex-col\">\r\n <Controller\r\n name={name}\r\n control={control}\r\n render={({ field: controllerField }) => {\r\n const childElement = child as React.ReactElement<{ children?: React.ReactNode, input?: any }>;\r\n return React.cloneElement(childElement, {\r\n input: {\r\n ...controllerField,\r\n value: controllerField.value || '',\r\n hasFormContainer: true,\r\n validateOnMount: true,\r\n errorMessage: errors[name]?.message || null\r\n },\r\n children: undefined\r\n });\r\n }}\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n // Recursively process children of this element\r\n if ((child as React.ReactElement<{ children?: React.ReactNode }>).props?.children) {\r\n const childElement = child as React.ReactElement<{ children?: React.ReactNode }>;\r\n return React.cloneElement(childElement, {\r\n children: React.Children.map(childElement.props.children, processChild),\r\n });\r\n }\r\n\r\n return React.cloneElement(child);\r\n }\r\n return child;\r\n };\r\n\r\n return processChild(child);\r\n })}\r\n </div>\r\n </form>\r\n );\r\n};\r\n\r\nexport default Form;","export type CanvasState = Record<string, any>;\r\n\r\nexport type CanvasAction =\r\n | { type: 'SET_STATE'; key: string; value: any }\r\n | { type: 'SET_MULTIPLE_STATES'; values: Record<string, any> }\r\n | { type: 'SET_FORM_STATE'; formName: string; values: Record<string, any> };\r\n\r\nexport function stateReducer(state: CanvasState, action: CanvasAction): CanvasState {\r\n switch (action.type) {\r\n case 'SET_STATE':\r\n return { ...state, [action.key]: action.value };\r\n\r\n case 'SET_MULTIPLE_STATES':\r\n return { ...state, ...action.values };\r\n\r\n case 'SET_FORM_STATE':\r\n return {\r\n ...state,\r\n form: {\r\n ...(state.form || {}),\r\n [action.formName]: {\r\n ...(state.form && state.form[action.formName] ? state.form[action.formName] : {}),\r\n ...action.values\r\n }\r\n }\r\n };\r\n\r\n default:\r\n return state;\r\n }\r\n}\r\n","'use client';\r\nimport React, { createContext, useContext, useReducer } from 'react';\r\n\r\nimport { stateReducer, CanvasState } from './stateReducer';\r\n\r\nconst StateContext = createContext<any>(null);\r\n\r\nexport function StateProvider({ children, initialState = {} }: { children: React.ReactNode, initialState?: CanvasState }) {\r\n const [state, dispatch] = useReducer(stateReducer, initialState);\r\n return (\r\n <StateContext.Provider value={{ state, dispatch }}>\r\n {children}\r\n </StateContext.Provider>\r\n );\r\n}\r\n\r\nexport function useAppState() {\r\n return useContext(StateContext);\r\n}\r\n"],"mappings":"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","names":["schema","form","formValues","React","useMemo","zodResolver","useForm","z","jsx","generateZodSchema","z","useMemo","useForm","zodResolver","React","child","jsx"]}
package/dist/index.d.mts CHANGED
@@ -112,7 +112,9 @@ interface SwitchToggleInputProps extends ElementProps, InputProperties {
112
112
  value?: boolean | any;
113
113
  onChange?: (value: boolean, name: string) => void;
114
114
  }
115
- interface PhoneInputProps extends ElementProps, InputProperties { }
115
+ interface PhoneInputProps extends ElementProps, InputProperties {
116
+ getPhoneState?: (meta: { inputValue: string; country: ParsedCountry }) => void;
117
+ }
116
118
  interface DateRangeInputProps extends ElementProps {
117
119
  name?: string;
118
120
  value?: { from?: Date; to?: Date } | undefined;
package/dist/index.d.ts CHANGED
@@ -112,7 +112,9 @@ interface SwitchToggleInputProps extends ElementProps, InputProperties {
112
112
  value?: boolean | any;
113
113
  onChange?: (value: boolean, name: string) => void;
114
114
  }
115
- interface PhoneInputProps extends ElementProps, InputProperties { }
115
+ interface PhoneInputProps extends ElementProps, InputProperties {
116
+ getPhoneState?: (meta: { inputValue: string; country: ParsedCountry }) => void;
117
+ }
116
118
  interface DateRangeInputProps extends ElementProps {
117
119
  name?: string;
118
120
  value?: { from?: Date; to?: Date } | undefined;
package/dist/index.js CHANGED
@@ -2070,6 +2070,9 @@ function useLazyDropdown(config) {
2070
2070
  const parts = path.split(/\./);
2071
2071
  return parts.reduce((acc, key) => acc?.[key], obj);
2072
2072
  }
2073
+ function isEmptyParamValue(value) {
2074
+ return value === "" || value === void 0 || value === null || value === "null" || value === "undefined";
2075
+ }
2073
2076
  const transformToOptions = (0, import_react21.useCallback)((data) => {
2074
2077
  if (!data || !Array.isArray(data)) return [];
2075
2078
  const cfg = configRef.current;
@@ -2094,7 +2097,7 @@ function useLazyDropdown(config) {
2094
2097
  let hasEmpty = false;
2095
2098
  const baseUrl = urlObj.origin + urlObj.pathname;
2096
2099
  urlObj.searchParams.forEach((value, key) => {
2097
- const isEmpty = value === "" || value === void 0 || value === null;
2100
+ const isEmpty = isEmptyParamValue(value);
2098
2101
  if (isEmpty) {
2099
2102
  hasEmpty = true;
2100
2103
  if (enforceStrict) return;
@@ -2271,7 +2274,9 @@ function useLazyDropdown(config) {
2271
2274
  );
2272
2275
  const queryParams = {};
2273
2276
  urlObj.searchParams.forEach((value, key) => {
2274
- queryParams[key] = value;
2277
+ if (!isEmptyParamValue(value)) {
2278
+ queryParams[key] = value;
2279
+ }
2275
2280
  });
2276
2281
  const body = {
2277
2282
  ...queryParams,
@@ -2627,40 +2632,34 @@ var import_react25 = require("react");
2627
2632
  var import_react_international_phone = require("react-international-phone");
2628
2633
  var import_style = require("react-international-phone/style.css");
2629
2634
  var import_jsx_runtime40 = require("react/jsx-runtime");
2630
- var ensureIndiaCode = (val) => {
2631
- if (!val) return "";
2632
- const trimmed = val.trim();
2633
- if (trimmed.startsWith("+")) return trimmed;
2634
- const local = trimmed.replace(/^0+/, "");
2635
- return `+91${local}`;
2636
- };
2637
2635
  var PhoneInput = ({ className, style, ...props }) => {
2636
+ const ref = (0, import_react25.useRef)(null);
2638
2637
  const placeholder = props.placeholder ?? "Enter phone number";
2639
2638
  const isEditable = props.isEditable ?? true;
2640
2639
  const isDisabled = props.isDisabled ?? false;
2641
2640
  (0, import_react25.useEffect)(() => {
2642
2641
  if (props.value !== void 0) {
2643
- const normalized = ensureIndiaCode(props.value);
2644
- handleChange?.(normalized);
2642
+ handleChange?.(props.value, ref.current?.state);
2645
2643
  }
2646
2644
  }, []);
2647
- const handleChange = (val) => {
2648
- const normalized = ensureIndiaCode(val);
2645
+ const handleChange = (value, meta) => {
2649
2646
  const event = {
2650
2647
  target: {
2651
2648
  name: props.name || "",
2652
- value: normalized
2649
+ value
2653
2650
  }
2654
2651
  };
2655
2652
  props.onChange?.(event, props.name || "");
2653
+ props.getPhoneState?.(meta);
2656
2654
  };
2657
2655
  return /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(import_jsx_runtime40.Fragment, { children: [
2658
2656
  /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(
2659
2657
  import_react_international_phone.PhoneInput,
2660
2658
  {
2659
+ ref,
2661
2660
  defaultCountry: "in",
2662
2661
  name: props.name,
2663
- value: props.value ? ensureIndiaCode(props.value) : "",
2662
+ value: props.value ? props.value : "",
2664
2663
  className: cn(
2665
2664
  "rounded-md border-1",
2666
2665
  className,
@@ -5692,7 +5691,7 @@ var StagesComponent = ({
5692
5691
  const lastStage = stages && stages.length > 0 ? stages[stages.length - 1][dataKey] : null;
5693
5692
  const isMobile = canvasMode === "mobile";
5694
5693
  const onStageClick = (stageKey) => {
5695
- if (!stageKey || stageKey === activeStage || activeStage === lastStage) return;
5694
+ if (!stageKey || stageKey === activeStage) return;
5696
5695
  setActiveStage(stageKey);
5697
5696
  if (triggerOnClick) {
5698
5697
  onStageChange?.(stageKey);