@rilaykit/forms 0.1.2 → 0.1.3
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/index.d.mts +25 -4
- package/dist/index.d.ts +25 -4
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +2 -2
package/dist/index.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
-
import { ril, FieldValidationConfig, RepeatableFieldConfig, ConditionalBehavior, FormFieldConfig, FormRowEntry, FormValidationConfig, FormConfiguration, ComponentRendererBaseProps, FormBodyRendererProps, FieldConditions, FormState, ValidationError, ValidationState, FieldState, ValidationResult, RepeatableFieldItem, MonitoringConfig, FormPerformanceMetrics, FormRowRendererProps, FormFieldRow, FormSubmitButtonRendererProps } from '@rilaykit/core';
|
|
2
|
+
import { ril, FieldValidationConfig, RepeatableFieldConfig, ConditionalBehavior, FormFieldConfig, FormRowEntry, FormValidationConfig, SubmitOptions, FormConfiguration, ComponentRendererBaseProps, FormBodyRendererProps, FieldConditions, FormState, ValidationError, ValidationState, FieldState, ValidationResult, RepeatableFieldItem, MonitoringConfig, FormPerformanceMetrics, FormRowRendererProps, FormFieldRow, FormSubmitButtonRendererProps } from '@rilaykit/core';
|
|
3
3
|
import * as React$1 from 'react';
|
|
4
4
|
import React__default from 'react';
|
|
5
5
|
import * as zustand from 'zustand';
|
|
@@ -145,6 +145,8 @@ declare class form<C extends Record<string, any> = Record<string, never>> {
|
|
|
145
145
|
private idGenerator;
|
|
146
146
|
/** Form-level validation configuration */
|
|
147
147
|
private formValidation?;
|
|
148
|
+
/** Default submit options for this form */
|
|
149
|
+
private _submitOptions?;
|
|
148
150
|
/**
|
|
149
151
|
* Creates a new form builder instance
|
|
150
152
|
*
|
|
@@ -430,6 +432,24 @@ declare class form<C extends Record<string, any> = Record<string, never>> {
|
|
|
430
432
|
* ```
|
|
431
433
|
*/
|
|
432
434
|
setValidation(validationConfig: FormValidationConfig): this;
|
|
435
|
+
/**
|
|
436
|
+
* Sets default submit options for this form
|
|
437
|
+
*
|
|
438
|
+
* These options can be overridden at submit-time by passing options to `submit()`.
|
|
439
|
+
*
|
|
440
|
+
* @param options - Submit options to use as defaults
|
|
441
|
+
* @returns The form builder instance for method chaining
|
|
442
|
+
*
|
|
443
|
+
* @example
|
|
444
|
+
* ```typescript
|
|
445
|
+
* // Always skip invalid fields on submit
|
|
446
|
+
* builder.setSubmitOptions({ skipInvalid: true });
|
|
447
|
+
*
|
|
448
|
+
* // Force submit by default (bypass validation)
|
|
449
|
+
* builder.setSubmitOptions({ force: true });
|
|
450
|
+
* ```
|
|
451
|
+
*/
|
|
452
|
+
setSubmitOptions(options: SubmitOptions): this;
|
|
433
453
|
/**
|
|
434
454
|
* Adds validators to the form-level validation
|
|
435
455
|
*
|
|
@@ -884,9 +904,10 @@ interface UseFormSubmissionWithStoreProps {
|
|
|
884
904
|
store: FormStore;
|
|
885
905
|
onSubmit?: (data: Record<string, unknown>) => void | Promise<void>;
|
|
886
906
|
validateForm: () => Promise<ValidationResult>;
|
|
907
|
+
defaultSubmitOptions?: SubmitOptions;
|
|
887
908
|
}
|
|
888
|
-
declare function useFormSubmissionWithStore({ store, onSubmit, validateForm, }: UseFormSubmissionWithStoreProps): {
|
|
889
|
-
submit: (
|
|
909
|
+
declare function useFormSubmissionWithStore({ store, onSubmit, validateForm, defaultSubmitOptions, }: UseFormSubmissionWithStoreProps): {
|
|
910
|
+
submit: (eventOrOptions?: React__default.FormEvent | SubmitOptions) => Promise<boolean>;
|
|
890
911
|
};
|
|
891
912
|
|
|
892
913
|
interface UseFormValidationWithStoreProps {
|
|
@@ -958,7 +979,7 @@ interface FormConfigContextValue {
|
|
|
958
979
|
conditionsHelpers: Omit<UseFormConditionsReturn, 'fieldConditions'>;
|
|
959
980
|
validateField: (fieldId: string, value?: unknown) => Promise<ValidationResult>;
|
|
960
981
|
validateForm: () => Promise<ValidationResult>;
|
|
961
|
-
submit: (
|
|
982
|
+
submit: (eventOrOptions?: React__default.FormEvent | SubmitOptions) => Promise<boolean>;
|
|
962
983
|
}
|
|
963
984
|
/**
|
|
964
985
|
* Access form configuration and validation methods
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
-
import { ril, FieldValidationConfig, RepeatableFieldConfig, ConditionalBehavior, FormFieldConfig, FormRowEntry, FormValidationConfig, FormConfiguration, ComponentRendererBaseProps, FormBodyRendererProps, FieldConditions, FormState, ValidationError, ValidationState, FieldState, ValidationResult, RepeatableFieldItem, MonitoringConfig, FormPerformanceMetrics, FormRowRendererProps, FormFieldRow, FormSubmitButtonRendererProps } from '@rilaykit/core';
|
|
2
|
+
import { ril, FieldValidationConfig, RepeatableFieldConfig, ConditionalBehavior, FormFieldConfig, FormRowEntry, FormValidationConfig, SubmitOptions, FormConfiguration, ComponentRendererBaseProps, FormBodyRendererProps, FieldConditions, FormState, ValidationError, ValidationState, FieldState, ValidationResult, RepeatableFieldItem, MonitoringConfig, FormPerformanceMetrics, FormRowRendererProps, FormFieldRow, FormSubmitButtonRendererProps } from '@rilaykit/core';
|
|
3
3
|
import * as React$1 from 'react';
|
|
4
4
|
import React__default from 'react';
|
|
5
5
|
import * as zustand from 'zustand';
|
|
@@ -145,6 +145,8 @@ declare class form<C extends Record<string, any> = Record<string, never>> {
|
|
|
145
145
|
private idGenerator;
|
|
146
146
|
/** Form-level validation configuration */
|
|
147
147
|
private formValidation?;
|
|
148
|
+
/** Default submit options for this form */
|
|
149
|
+
private _submitOptions?;
|
|
148
150
|
/**
|
|
149
151
|
* Creates a new form builder instance
|
|
150
152
|
*
|
|
@@ -430,6 +432,24 @@ declare class form<C extends Record<string, any> = Record<string, never>> {
|
|
|
430
432
|
* ```
|
|
431
433
|
*/
|
|
432
434
|
setValidation(validationConfig: FormValidationConfig): this;
|
|
435
|
+
/**
|
|
436
|
+
* Sets default submit options for this form
|
|
437
|
+
*
|
|
438
|
+
* These options can be overridden at submit-time by passing options to `submit()`.
|
|
439
|
+
*
|
|
440
|
+
* @param options - Submit options to use as defaults
|
|
441
|
+
* @returns The form builder instance for method chaining
|
|
442
|
+
*
|
|
443
|
+
* @example
|
|
444
|
+
* ```typescript
|
|
445
|
+
* // Always skip invalid fields on submit
|
|
446
|
+
* builder.setSubmitOptions({ skipInvalid: true });
|
|
447
|
+
*
|
|
448
|
+
* // Force submit by default (bypass validation)
|
|
449
|
+
* builder.setSubmitOptions({ force: true });
|
|
450
|
+
* ```
|
|
451
|
+
*/
|
|
452
|
+
setSubmitOptions(options: SubmitOptions): this;
|
|
433
453
|
/**
|
|
434
454
|
* Adds validators to the form-level validation
|
|
435
455
|
*
|
|
@@ -884,9 +904,10 @@ interface UseFormSubmissionWithStoreProps {
|
|
|
884
904
|
store: FormStore;
|
|
885
905
|
onSubmit?: (data: Record<string, unknown>) => void | Promise<void>;
|
|
886
906
|
validateForm: () => Promise<ValidationResult>;
|
|
907
|
+
defaultSubmitOptions?: SubmitOptions;
|
|
887
908
|
}
|
|
888
|
-
declare function useFormSubmissionWithStore({ store, onSubmit, validateForm, }: UseFormSubmissionWithStoreProps): {
|
|
889
|
-
submit: (
|
|
909
|
+
declare function useFormSubmissionWithStore({ store, onSubmit, validateForm, defaultSubmitOptions, }: UseFormSubmissionWithStoreProps): {
|
|
910
|
+
submit: (eventOrOptions?: React__default.FormEvent | SubmitOptions) => Promise<boolean>;
|
|
890
911
|
};
|
|
891
912
|
|
|
892
913
|
interface UseFormValidationWithStoreProps {
|
|
@@ -958,7 +979,7 @@ interface FormConfigContextValue {
|
|
|
958
979
|
conditionsHelpers: Omit<UseFormConditionsReturn, 'fieldConditions'>;
|
|
959
980
|
validateField: (fieldId: string, value?: unknown) => Promise<ValidationResult>;
|
|
960
981
|
validateForm: () => Promise<ValidationResult>;
|
|
961
|
-
submit: (
|
|
982
|
+
submit: (eventOrOptions?: React__default.FormEvent | SubmitOptions) => Promise<boolean>;
|
|
962
983
|
}
|
|
963
984
|
/**
|
|
964
985
|
* Access form configuration and validation methods
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
'use strict';var Ot=require('react'),core=require('@rilaykit/core'),zustand=require('zustand'),middleware=require('zustand/middleware'),jsxRuntime=require('react/jsx-runtime');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var Ot__default=/*#__PURE__*/_interopDefault(Ot);var j=class{constructor(e){this.innerForm=new T(e,"__repeatable_template__");}add(...e){return this.innerForm.add(...e),this}addSeparateRows(e){return this.innerForm.addSeparateRows(e),this}min(e){return this._min=e,this}max(e){return this._max=e,this}defaultValue(e){return this._defaultValue=e,this}validation(e){return this._validation=e,this}_build(e){let t=this.innerForm.getRows(),i=this.innerForm.getFields();if(t.length===0)throw new Error(`Repeatable "${e}" must have at least one field`);for(let o of i)if(o.id.includes("[")||o.id.includes("]"))throw new Error(`Repeatable template field ID "${o.id}" cannot contain "[" or "]" (reserved for composite keys)`);if(this._min!==void 0&&this._max!==void 0&&this._min>this._max)throw new Error(`Repeatable "${e}": min (${this._min}) cannot be greater than max (${this._max})`);return {id:e,rows:t.map(o=>({...o,kind:"fields"})),allFields:i,min:this._min,max:this._max,defaultValue:this._defaultValue,validation:this._validation}}_hasRepeatables(){return this.innerForm.getRows().some(e=>"kind"in e&&e.kind==="repeatable")}};var T=class r{constructor(e,t){this.rows=[];this.idGenerator=new core.IdGenerator;this.config=e,this.formId=t||`form-${Math.random().toString(36).substring(2,15)}`;}static create(e,t){return new r(e,t)}createFormField(e){let t=this.config.getComponent(e.type);if(!t)throw new Error(`No component found with type "${e.type}"`);let i;return (t.validation||e.validation)&&(i={validateOnChange:e.validation?.validateOnChange??t.validation?.validateOnChange,validateOnBlur:e.validation?.validateOnBlur??t.validation?.validateOnBlur,debounceMs:e.validation?.debounceMs??t.validation?.debounceMs,validate:(()=>{let o=t.validation?.validate,s=e.validation?.validate;if(!o)return s;if(!s)return o;let a=Array.isArray(o)?o:[o],n=Array.isArray(s)?s:[s];return [...a,...n]})()}),{id:e.id||this.idGenerator.next("field"),componentId:t.id,props:{...t.defaultProps,...e.props},validation:i,conditions:e.conditions}}createRow(e){if(e.length===0)throw new Error("At least one field is required");if(e.length>3)throw new Error("Maximum 3 fields per row");let t=e.map(i=>this.createFormField(i));return {kind:"fields",id:this.idGenerator.next("row"),fields:t,maxColumns:e.length}}add(...e){let t,i=false;if(e.length===1&&Array.isArray(e[0])?(t=e[0],i=true):t=e,t.length===0)throw new Error("At least one field is required");if(i&&t.length>3)throw new Error("Maximum 3 fields per row");if(t.length===1){let o=this.createRow(t);return this.rows.push(o),this}if(t.length<=3){let o=this.createRow(t);return this.rows.push(o),this}for(let o of t){let s=this.createRow([o]);this.rows.push(s);}return this}addSeparateRows(e){for(let t of e)this.add(t);return this}addRepeatable(e,t){if(e.includes("[")||e.includes("]"))throw new Error(`Repeatable ID "${e}" cannot contain "[" or "]" (reserved for composite keys)`);let i=new j(this.config),o=t(i);if(o._hasRepeatables())throw new Error(`Nested repeatables are not supported (in repeatable "${e}")`);let s=o._build(e),a={kind:"repeatable",id:this.idGenerator.next("repeatable"),repeatable:s};return this.rows.push(a),this}setId(e){return this.formId=e,this}updateField(e,t){let i=this.findField(e);if(!i)throw new Error(`Field with ID "${e}" not found`);return Object.assign(i,{...t,props:{...i.props,...t.props}}),this}findField(e){for(let t of this.rows)if(t.kind==="fields"){let i=t.fields.find(o=>o.id===e);if(i)return i}else {let i=t.repeatable.allFields.find(o=>o.id===e);if(i)return i}return null}removeField(e){return this.rows=this.rows.map(t=>t.kind==="repeatable"?t:{...t,fields:t.fields.filter(i=>i.id!==e)}).filter(t=>t.kind==="repeatable"||t.fields.length>0),this}getField(e){return this.findField(e)||void 0}getFields(){return this.rows.filter(e=>e.kind==="fields").flatMap(e=>e.fields)}getRows(){return [...this.rows]}clear(){return this.rows=[],this.idGenerator.reset(),this}setValidation(e){return this.formValidation=e,this}addFieldValidation(e,t){console.warn("addFieldValidation is deprecated. Use updateField with validation.validate property instead.");let i=this.findField(e);if(!i)throw new Error(`Field with ID "${e}" not found`);let o={...i.validation,...t};return this.updateField(e,{validation:o})}addFieldConditions(e,t){let i=this.findField(e);if(!i)throw new Error(`Field with ID "${e}" not found`);let o={...i.conditions,...t};return this.updateField(e,{conditions:o})}clone(e){let t=new r(this.config,e||`${this.formId}-clone`);return t.rows=core.deepClone(this.rows),t}validate(){let e=[],t=this.getFields(),i=this.rows.filter(n=>n.kind==="repeatable"),o=i.flatMap(n=>n.repeatable.allFields),s=[...t.map(n=>n.id),...o.map(n=>n.id)];try{core.ensureUnique(s,"field");}catch(n){e.push(n instanceof Error?n.message:String(n));}let a=i.map(n=>n.repeatable.id);try{core.ensureUnique(a,"repeatable");}catch(n){e.push(n instanceof Error?n.message:String(n));}for(let n of t)this.config.hasComponent(n.componentId)||e.push(`Component "${n.componentId}" not found for field "${n.id}"`);for(let n of o)this.config.hasComponent(n.componentId)||e.push(`Component "${n.componentId}" not found for repeatable template field "${n.id}"`);for(let n of this.rows)n.kind==="fields"&&(n.fields.length>3&&e.push(`Row "${n.id}" has ${n.fields.length} fields, maximum is 3`),n.fields.length===0&&e.push(`Row "${n.id}" is empty`));for(let n of t)(n.id.includes("[")||n.id.includes("]"))&&e.push(`Field ID "${n.id}" cannot contain "[" or "]" (reserved for repeatable composite keys)`);for(let n of a)(n.includes("[")||n.includes("]"))&&e.push(`Repeatable ID "${n}" cannot contain "[" or "]" (reserved for composite keys)`);return e}build(){let e=this.validate();if(e.length>0)throw new Error(`Form validation failed: ${e.join(", ")}`);let t=this.rows.filter(o=>o.kind==="repeatable"),i=t.length>0?Object.fromEntries(t.map(o=>[o.repeatable.id,o.repeatable])):void 0;return {id:this.formId,rows:[...this.rows],allFields:this.getFields(),repeatableFields:i,config:this.config,renderConfig:this.config.getFormRenderConfig(),validation:this.formValidation}}toJSON(){return {id:this.formId,rows:this.rows}}fromJSON(e){return e.id&&(this.formId=e.id),e.rows&&(this.rows=e.rows.map(t=>t.kind?t:{...t,kind:"fields"})),this}getStats(){let e=this.getFields(),t=this.rows.filter(s=>s.kind==="fields"),i=this.rows.filter(s=>s.kind==="repeatable"),o=t.map(s=>s.fields.length);return {totalFields:e.length,totalRows:this.rows.length,averageFieldsPerRow:t.length>0?e.length/t.length:0,maxFieldsInRow:o.length>0?Math.max(...o):0,minFieldsInRow:o.length>0?Math.min(...o):0,totalRepeatables:i.length,totalRepeatableFields:i.reduce((s,a)=>s+a.repeatable.allFields.length,0)}}};function er(r,e={},t={}){return Ot.useMemo(()=>{if(!r)return {visible:t.visible??true,disabled:t.disabled??false,required:t.required??false,readonly:t.readonly??false};let i=o=>{try{return o&&typeof o=="object"&&"build"in o?core.evaluateCondition(o.build(),e):core.evaluateCondition(o,e)}catch(s){return console.warn("Error evaluating condition:",s),false}};return {visible:r.visible?i(r.visible):t.visible??true,disabled:r.disabled?i(r.disabled):t.disabled??false,required:r.required?i(r.required):t.required??false,readonly:r.readonly?i(r.readonly):t.readonly??false}},[r,e,t])}function Te(r,e={}){return Ot.useMemo(()=>{let t={};for(let[i,o]of Object.entries(r))if(t[i]={visible:true,disabled:false,required:false,readonly:false},o){let s=a=>{try{return a&&typeof a=="object"&&"build"in a?core.evaluateCondition(a.build(),e):core.evaluateCondition(a,e)}catch(n){return console.warn(`Error evaluating condition for field ${i}:`,n),false}};t[i]={visible:o.visible?s(o.visible):true,disabled:o.disabled?s(o.disabled):false,required:o.required?s(o.required):false,readonly:o.readonly?s(o.readonly):false};}return t},[r,e])}var it=/^([^[\]]+)\[([^\]]+)\]\.(.+)$/;function V(r,e,t){return `${r}[${e}].${t}`}function L(r){let e=it.exec(r);return e?{repeatableId:e[1],itemKey:e[2],fieldId:e[3]}:null}function de(r,e,t){let i={},o=new Set;for(let[s,a]of Object.entries(t)){if(!e[s])continue;let n=e[s],u=[];for(let p of a){let f={};for(let m of n.allFields){let l=V(s,p,m.id);l in r&&(f[m.id]=r[l],o.add(l));}u.push(f);}i[s]=u;}for(let[s,a]of Object.entries(r))!o.has(s)&&!L(s)&&(i[s]=a);return i}function re(r,e){let t={},i={},o={};for(let[s,a]of Object.entries(r))if(e[s]&&Array.isArray(a)){let n=[],u=0;for(let p of a){let f=`k${u}`;n.push(f);for(let[m,l]of Object.entries(p))t[V(s,f,m)]=l;u++;}i[s]=n,o[s]=u;}else t[s]=a;return {values:t,order:i,nextKeys:o}}function ue(r={}){return zustand.createStore()(middleware.subscribeWithSelector((e,t)=>({values:{...r},errors:{},validationStates:{},touched:{},isDirty:false,isSubmitting:false,isValid:true,_defaultValues:{...r},_fieldConditions:{},_repeatableConfigs:{},_repeatableOrder:{},_repeatableNextKey:{},_setValue:(i,o)=>{e(s=>({values:{...s.values,[i]:o},isDirty:true}));},_setTouched:i=>{e(o=>({touched:{...o.touched,[i]:true}}));},_setErrors:(i,o)=>{e(s=>{let a={...s.errors,[i]:o},n=o.length>0?"invalid":"valid";return {errors:a,validationStates:{...s.validationStates,[i]:n}}}),t()._updateIsValid();},_clearErrors:i=>{e(o=>{let s={...o.errors};return delete s[i],{errors:s,validationStates:{...o.validationStates,[i]:"idle"}}}),t()._updateIsValid();},_setValidationState:(i,o)=>{e(s=>({validationStates:{...s.validationStates,[i]:o}}));},_setSubmitting:i=>{e({isSubmitting:i});},_reset:i=>{let o=i??t()._defaultValues;e({values:{...o},errors:{},validationStates:{},touched:{},isDirty:false,isSubmitting:false,isValid:true,_repeatableOrder:{},_repeatableNextKey:{}});},_setFieldConditions:(i,o)=>{e(s=>({_fieldConditions:{...s._fieldConditions,[i]:o}}));},_updateIsValid:()=>{let i=t(),o=Object.values(i.errors).some(a=>a&&a.length>0),s=Object.values(i.validationStates).some(a=>a==="invalid");e({isValid:!o&&!s});},_setRepeatableConfig:(i,o)=>{e(s=>({_repeatableConfigs:{...s._repeatableConfigs,[i]:o}}));},_appendRepeatableItem:(i,o)=>{let s=t(),a=s._repeatableConfigs[i];if(!a)return null;let n=s._repeatableOrder[i]??[];if(a.max!==void 0&&n.length>=a.max)return null;let u=s._repeatableNextKey[i]??0,p=`k${u}`,f=o??a.defaultValue??{},m={...s.values};for(let l of a.allFields){let d=V(i,p,l.id);m[d]=f[l.id]??void 0;}return e({values:m,isDirty:true,_repeatableOrder:{...s._repeatableOrder,[i]:[...n,p]},_repeatableNextKey:{...s._repeatableNextKey,[i]:u+1}}),p},_removeRepeatableItem:(i,o)=>{let s=t(),a=s._repeatableConfigs[i];if(!a)return false;let n=s._repeatableOrder[i]??[];if(a.min!==void 0&&n.length<=a.min||!n.includes(o))return false;let u=n.filter(F=>F!==o),p={...s.values},f={...s.errors},m={...s.validationStates},l={...s.touched},d={...s._fieldConditions};for(let F of a.allFields){let g=V(i,o,F.id);delete p[g],delete f[g],delete m[g],delete l[g],delete d[g];}return e({values:p,errors:f,validationStates:m,touched:l,isDirty:true,_fieldConditions:d,_repeatableOrder:{...s._repeatableOrder,[i]:u}}),t()._updateIsValid(),true},_moveRepeatableItem:(i,o,s)=>{let a=t(),n=a._repeatableOrder[i];if(!n||o<0||o>=n.length||s<0||s>=n.length||o===s)return;let u=[...n],[p]=u.splice(o,1);u.splice(s,0,p),e({_repeatableOrder:{...a._repeatableOrder,[i]:u}});},_insertRepeatableItem:(i,o,s)=>{let a=t(),n=a._repeatableConfigs[i];if(!n)return null;let u=a._repeatableOrder[i]??[];if(n.max!==void 0&&u.length>=n.max)return null;let p=a._repeatableNextKey[i]??0,f=`k${p}`,m=s??n.defaultValue??{},l={...a.values};for(let g of n.allFields){let c=V(i,f,g.id);l[c]=m[g.id]??void 0;}let d=[...u],F=Math.max(0,Math.min(o,d.length));return d.splice(F,0,f),e({values:l,isDirty:true,_repeatableOrder:{...a._repeatableOrder,[i]:d},_repeatableNextKey:{...a._repeatableNextKey,[i]:p+1}}),f}})))}var oe=Ot.createContext(null);function S(){let r=Ot.useContext(oe);if(!r)throw new Error("useFormStore must be used within a FormProvider");return r}var De=[];function ce(r){let e=S();return zustand.useStore(e,t=>t.values[r])}function dt(r){let e=S();return zustand.useStore(e,t=>t.errors[r]??De)}function ut(r){let e=S();return zustand.useStore(e,t=>t.touched[r]??false)}function ct(r){let e=S();return zustand.useStore(e,t=>t.validationStates[r]??"idle")}var mt={visible:true,disabled:false,required:false,readonly:false};function $(r){let e=S();return zustand.useStore(e,t=>t._fieldConditions[r]??mt)}function me(r){let e=S(),t=zustand.useStore(e,n=>n.values[r]),i=zustand.useStore(e,n=>n.errors[r]??De),o=zustand.useStore(e,n=>n.validationStates[r]??"idle"),s=zustand.useStore(e,n=>n.touched[r]??false),a=zustand.useStore(e,n=>n._defaultValues[r]);return {value:t,errors:i,validationState:o,touched:s,dirty:t!==a}}function ft(){let r=S();return zustand.useStore(r,e=>e.isSubmitting)}function pt(){let r=S();return zustand.useStore(r,e=>e.isValid)}function Ft(){let r=S();return zustand.useStore(r,e=>e.isDirty)}function gt(){let r=S();return zustand.useStore(r,e=>e.values)}function fe(){let r=S(),e=zustand.useStore(r,o=>o.isSubmitting),t=zustand.useStore(r,o=>o.isValid),i=zustand.useStore(r,o=>o.isDirty);return {isSubmitting:e,isValid:t,isDirty:i}}var bt=[];function pe(r){let e=S();return zustand.useStore(e,t=>t._repeatableOrder[r]??bt)}function Fe(r){let e=S();return {setValue:t=>e.getState()._setValue(r,t),setTouched:()=>e.getState()._setTouched(r),setErrors:t=>e.getState()._setErrors(r,t),clearErrors:()=>e.getState()._clearErrors(r),setValidationState:t=>e.getState()._setValidationState(r,t)}}function Ct(){let r=S();return {setValue:(e,t)=>r.getState()._setValue(e,t),setTouched:e=>r.getState()._setTouched(e),setErrors:(e,t)=>r.getState()._setErrors(e,t),setSubmitting:e=>r.getState()._setSubmitting(e),reset:e=>r.getState()._reset(e),setFieldConditions:(e,t)=>r.getState()._setFieldConditions(e,t)}}function H(){return S()}var Ae={visible:true,disabled:false,required:false,readonly:false};function Ke(r){try{return JSON.stringify(r)}catch{return String(Date.now())}}function ie(r,e){if(r)try{return typeof r=="object"&&"build"in r?core.evaluateCondition(r.build(),e):core.evaluateCondition(r,e)}catch(t){console.warn("Error evaluating condition:",t);return}}function be(r,e){if(!r)return Ae;let t=ie(r.visible,e),i=ie(r.disabled,e),o=ie(r.required,e),s=ie(r.readonly,e);return {visible:t??true,disabled:i??false,required:o??false,readonly:s??false}}function fr(r,e={}){let{conditions:t,skip:i=false}=e,o=H(),s=$(r),a=Ot.useRef(null);if(i||!t)return s;let n=o.getState().values,u=Ke(n);if(a.current?.valuesHash===u)return a.current.result;let p=be(t,n);return a.current={result:p,valuesHash:u},p}function pr(){let r=H(),e=Ot.useRef(new Map),t=Ot.useRef("");return Ot.useMemo(()=>function(o,s){if(!s)return Ae;let a=r.getState().values,n=Ke(a);t.current!==n&&(e.current.clear(),t.current=n);let u=e.current.get(o);if(u)return u.result;let p=be(s,a);return e.current.set(o,{result:p,valuesHash:n}),p},[r])}function Fr(r,e){let t=H(),i=$(r),o=Ot.useMemo(()=>()=>{if(!e)return i;let s=t.getState().values;return be(e,s)},[t,e,i]);return {conditions:i,refresh:o}}function Y(r,e,t,i){let o={};return r.visible&&(o.visible=G(r.visible,e,t,i)),r.disabled&&(o.disabled=G(r.disabled,e,t,i)),r.required&&(o.required=G(r.required,e,t,i)),r.readonly&&(o.readonly=G(r.readonly,e,t,i)),o}function G(r,e,t,i){let o=r.field&&i.has(r.field)?`${e}[${t}].${r.field}`:r.field,s=r.conditions?.map(a=>G(a,e,t,i));return {...r,field:o,conditions:s}}function Ue({formConfig:r,formValues:e,repeatableOrder:t}){let i=Ot.useMemo(()=>{let m={};for(let l of r.allFields)l.conditions&&(m[l.id]=l.conditions);if(t&&r.repeatableFields)for(let[l,d]of Object.entries(r.repeatableFields)){let F=t[l]??[];if(F.length===0)continue;let g=new Set(d.allFields.map(c=>c.id));for(let c of F)for(let R of d.allFields){if(!R.conditions)continue;let b=V(l,c,R.id);m[b]=Y(R.conditions,l,c,g);}}return m},[r.allFields,r.repeatableFields,t]),o=Ot.useMemo(()=>Object.keys(i).length>0,[i]),s=Te(o?i:{},o?e:{}),a=Ot.useCallback(m=>s[m],[s]),n=Ot.useCallback(m=>{let l=s[m];return l?l.visible:true},[s]),u=Ot.useCallback(m=>{let l=s[m];return l?l.disabled:false},[s]),p=Ot.useCallback(m=>{let l=s[m];return l?l.required:false},[s]),f=Ot.useCallback(m=>{let l=s[m];return l?l.readonly:false},[s]);return Ot.useMemo(()=>({fieldConditions:s,hasConditionalFields:o,getFieldCondition:a,isFieldVisible:n,isFieldDisabled:u,isFieldRequired:p,isFieldReadonly:f}),[s,o,a,n,u,p,f])}function $e({store:r,onSubmit:e,validateForm:t}){let i=Ot.useRef(e);return i.current=e,{submit:Ot.useCallback(async s=>{s?.preventDefault();let a=r.getState();if(a.isSubmitting)return false;a._setSubmitting(true);try{if(!(await t()).isValid)return a._setSubmitting(!1),!1;let u=r.getState(),f=Object.keys(u._repeatableConfigs).length>0?de(u.values,u._repeatableConfigs,u._repeatableOrder):u.values;return i.current&&await i.current(f),a._setSubmitting(!1),!0}catch(n){return a._setSubmitting(false),console.error("Form submission error:",n),false}},[r,t])}}function ne(){return {isValid:true,errors:[]}}function Le({formConfig:r,store:e,conditionsHelpers:t}){let i=Ot.useRef(r),o=Ot.useRef(t);i.current=r,o.current=t;let s=Ot.useCallback(async(n,u)=>{let p=i.current.allFields.find(d=>d.id===n);if(!p){let d=L(n);if(d&&i.current.repeatableFields){let F=i.current.repeatableFields[d.repeatableId];if(F){let g=F.allFields.find(c=>c.id===d.fieldId);g&&(p={...g,id:n});}}}let f=e.getState();if(!p)return ne();if(!o.current.isFieldVisible(n))return f._setErrors(n,[]),f._setValidationState(n,"valid"),ne();if(!p.validation||!core.hasUnifiedValidation(p.validation)){let d=o.current.isFieldRequired(n),F=u!==void 0?u:f.values[n];if(d&&core.isEmptyValue(F)){let g={isValid:false,errors:[{message:"This field is required",code:"CONDITIONAL_REQUIRED"}]};return f._setErrors(n,g.errors),f._setValidationState(n,"invalid"),g}return f._setErrors(n,[]),f._setValidationState(n,"valid"),ne()}let m=u!==void 0?u:f.values[n],l=core.createValidationContext({fieldId:n,formId:i.current.id,allFormData:{...f.values,[n]:m}});f._setValidationState(n,"validating");try{let d=await core.validateWithUnifiedConfig(p.validation,m,l);if(o.current.isFieldRequired(n)&&core.isEmptyValue(m)&&!d.errors.some(c=>c.code==="REQUIRED"||c.message.toLowerCase().includes("required"))){let c={isValid:!1,errors:[{message:"This field is required",code:"CONDITIONAL_REQUIRED"},...d.errors]};return f._setErrors(n,c.errors),f._setValidationState(n,"invalid"),c}return f._setErrors(n,d.errors),f._setValidationState(n,d.isValid?"valid":"invalid"),d}catch(d){let F={isValid:false,errors:[{message:d instanceof Error?d.message:"Validation failed",code:"VALIDATION_ERROR"}]};return f._setErrors(n,F.errors),f._setValidationState(n,"invalid"),F}},[e]),a=Ot.useCallback(async()=>{let n=e.getState(),u=i.current.allFields.filter(c=>{if(!o.current.isFieldVisible(c.id))return false;let b=c.validation&&core.hasUnifiedValidation(c.validation),k=o.current.isFieldRequired(c.id);return b||k}),p=i.current.allFields.filter(c=>!o.current.isFieldVisible(c.id));for(let c of p)n._setErrors(c.id,[]),n._setValidationState(c.id,"valid");let f=await Promise.all(u.map(c=>s(c.id))),m=f.some(c=>!c.isValid),l=i.current.repeatableFields??{},d=[];for(let[c,R]of Object.entries(l)){let b=n._repeatableOrder[c]??[];for(let k of b)for(let O of R.allFields){let P=V(c,k,O.id);if(!o.current.isFieldVisible(P)){n._setErrors(P,[]),n._setValidationState(P,"valid");continue}let D=await s(P);d.push(D);}R.min!==void 0&&b.length<R.min&&d.push({isValid:false,errors:[{message:`At least ${R.min} item(s) required`,code:"REPEATABLE_MIN_COUNT",path:c}]});}let F=d.some(c=>!c.isValid);m=m||F;let g=ne();if(i.current.validation&&core.hasUnifiedValidation(i.current.validation)){let c=Object.keys(n.values).reduce((b,k)=>(o.current.isFieldVisible(k)&&(b[k]=n.values[k]),b),{}),R=core.createValidationContext({formId:i.current.id,allFormData:c});try{g=await core.validateFormWithUnifiedConfig(i.current.validation,c,R);}catch(b){g={isValid:false,errors:[{message:b instanceof Error?b.message:"Form validation failed",code:"FORM_VALIDATION_ERROR"}]};}}return {isValid:!m&&g.isValid,errors:[...f.flatMap(c=>c.errors),...d.flatMap(c=>c.errors),...g.errors]}},[e,s]);return {validateField:s,validateForm:a}}function ve(r){let e=S(),{formConfig:t}=E(),i=pe(r),o=t.repeatableFields?.[r],s=Ot.useMemo(()=>o?new Set(o.allFields.map(l=>l.id)):new Set,[o]),a=Ot.useMemo(()=>o?i.map((l,d)=>{let F=o.allFields.map(c=>{let R=V(r,l,c.id),b=c.conditions?Y(c.conditions,r,l,s):void 0;return {...c,id:R,conditions:b}}),g=o.rows.map(c=>({...c,fields:c.fields.map(R=>{let b=V(r,l,R.id),k=R.conditions?Y(R.conditions,r,l,s):void 0;return {...R,id:b,conditions:k}})}));return {key:l,index:d,rows:g,allFields:F}}):[],[r,i,o,s]),n=Ot.useMemo(()=>o?o.max===void 0?true:i.length<o.max:false,[o,i.length]),u=Ot.useMemo(()=>{if(!o)return false;let l=o.min??0;return i.length>l},[o,i.length]),p=Ot.useCallback(l=>{e.getState()._appendRepeatableItem(r,l);},[e,r]),f=Ot.useCallback(l=>{e.getState()._removeRepeatableItem(r,l);},[e,r]),m=Ot.useCallback((l,d)=>{e.getState()._moveRepeatableItem(r,l,d);},[e,r]);return {items:a,append:p,remove:f,move:m,canAdd:n,canRemove:u,count:i.length}}function xt({formConfig:r,enabled:e=true}){let t=core.getGlobalMonitor(),i=Ot.useRef(null),o=Ot.useRef(0),s=Ot.useRef(0);Ot.useEffect(()=>{t&&e&&(i.current=t.getProfiler());},[t,e]);let a=Ot.useCallback(l=>{if(!t||!e)return;o.current++;let d={formId:r.id,fieldCount:r.allFields.length,timestamp:Date.now(),duration:0,renderDuration:0,validationDuration:0,validationErrors:0,renderCount:l||o.current};t.track("component_render",`form_${r.id}`,{formId:r.id,fieldCount:r.allFields.length,renderCount:o.current},d,"low");},[t,e,r.id,r.allFields.length]),n=Ot.useCallback((l,d)=>{if(!t||!e)return;let F=i.current?.getMetrics(`form_validation_${r.id}`),g={formId:r.id,fieldCount:d||r.allFields.length,timestamp:Date.now(),duration:F?.duration||0,renderDuration:0,validationDuration:F?.duration||0,validationErrors:l,renderCount:o.current};t.track("form_validation",`form_${r.id}`,{formId:r.id,validationErrors:l,fieldCount:d||r.allFields.length},g,l>0?"medium":"low");},[t,e,r.id,r.allFields.length]),u=Ot.useCallback((l,d)=>{if(!t||!e)return;let F=i.current?.getMetrics(`form_submission_${r.id}`),g={formId:r.id,fieldCount:d||r.allFields.length,timestamp:Date.now(),duration:F?.duration||0,renderDuration:0,validationDuration:0,validationErrors:l?0:1,renderCount:o.current};t.track("form_submission",`form_${r.id}`,{formId:r.id,success:l,fieldCount:d||r.allFields.length,fieldChanges:s.current},g,l?"low":"high");},[t,e,r.id,r.allFields.length]),p=Ot.useCallback((l,d)=>{!t||!e||(s.current++,t.track("component_update",`field_${l}`,{formId:r.id,fieldId:l,componentType:d,changeCount:s.current},void 0,"low"));},[t,e,r.id]),f=Ot.useCallback(l=>{!i.current||!e||i.current.start(l,{formId:r.id,renderCount:o.current});},[e,r.id]),m=Ot.useCallback(l=>{if(!i.current||!e)return null;let d=i.current.end(l);return d?{...d,formId:r.id,fieldCount:r.allFields.length,renderDuration:d.duration,validationDuration:0,validationErrors:0}:null},[e,r.id,r.allFields.length]);return {trackFormRender:a,trackFormValidation:n,trackFormSubmission:u,trackFieldChange:p,startPerformanceTracking:f,endPerformanceTracking:m}}var Ye=Ot.createContext(null);function E(){let r=Ot.useContext(Ye);if(!r)throw new Error("useFormConfigContext must be used within a FormProvider");return r}function xe({children:r,formConfig:e,defaultValues:t={},onSubmit:i,onFieldChange:o,className:s}){let[a]=Ot.useState(()=>{let _=e.repeatableFields??{},C={...t},h={},y={};if(Object.keys(_).some(v=>Array.isArray(t[v]))){let v=re(t,_);C=v.values,h=v.order,y=v.nextKeys;}for(let[v,B]of Object.entries(_))if(!h[v]){let Z=B.min??0,K=[],U=y[v]??0;for(let N=0;N<Z;N++){let W=`k${U}`;K.push(W);for(let ee of B.allFields){let tt=V(v,W,ee.id);C[tt]=B.defaultValue?.[ee.id]??void 0;}U++;}h[v]=K,y[v]=U;}let M=ue(C),x=M.getState();for(let[v,B]of Object.entries(_))x._setRepeatableConfig(v,B);return M.setState({_repeatableOrder:h,_repeatableNextKey:y}),M}),n=Ot.useRef(e.id),u=Ot.useRef(o);u.current=o,Ot.useEffect(()=>u.current?a.subscribe(C=>C.values,(C,h)=>{for(let y of Object.keys(C))C[y]!==h[y]&&u.current?.(y,C[y],C);}):void 0,[a]),Ot.useEffect(()=>{if(n.current!==e.id){n.current=e.id;let _=e.repeatableFields??{},C={...t},h={},y={};if(Object.keys(_).some(x=>Array.isArray(t[x]))){let x=re(t,_);C=x.values,h=x.order,y=x.nextKeys;}for(let[x,v]of Object.entries(_))if(!h[x]){let B=v.min??0,Z=[],K=y[x]??0;for(let U=0;U<B;U++){let N=`k${K}`;Z.push(N);for(let W of v.allFields){let ee=V(x,N,W.id);C[ee]=v.defaultValue?.[W.id]??void 0;}K++;}h[x]=Z,y[x]=K;}a.getState()._reset(C);let M=a.getState();for(let[x,v]of Object.entries(_))M._setRepeatableConfig(x,v);a.setState({_repeatableOrder:h,_repeatableNextKey:y});}},[e.id,e.repeatableFields,a,t]);let[p,f]=Ot.useState(()=>a.getState().values);Ot.useEffect(()=>a.subscribe(C=>C.values,C=>f(C)),[a]);let[m,l]=Ot.useState(()=>a.getState()._repeatableOrder);Ot.useEffect(()=>a.subscribe(C=>C._repeatableOrder,C=>l(C)),[a]);let{fieldConditions:d,hasConditionalFields:F,getFieldCondition:g,isFieldVisible:c,isFieldDisabled:R,isFieldRequired:b,isFieldReadonly:k}=Ue({formConfig:e,formValues:p,repeatableOrder:m});Ot.useEffect(()=>{for(let[_,C]of Object.entries(d)){let h={visible:C.visible,disabled:C.disabled,required:C.required,readonly:C.readonly};a.getState()._setFieldConditions(_,h);}},[d,a]);let O=Ot.useMemo(()=>({hasConditionalFields:F,getFieldCondition:g,isFieldVisible:c,isFieldDisabled:R,isFieldRequired:b,isFieldReadonly:k}),[F,g,c,R,b,k]),{validateField:P,validateForm:D}=Le({formConfig:e,store:a,conditionsHelpers:O}),{submit:q}=$e({store:a,onSubmit:i,validateForm:D}),X=Ot.useMemo(()=>({formConfig:e,conditionsHelpers:O,validateField:P,validateForm:D,submit:q}),[e,O,P,D,q]);return jsxRuntime.jsx(oe.Provider,{value:a,children:jsxRuntime.jsx(Ye.Provider,{value:X,children:jsxRuntime.jsx("form",{onSubmit:q,className:s,noValidate:true,children:r})})})}function Et({formConfig:r,defaultValues:e,onSubmit:t,onFieldChange:i,className:o,children:s}){let a=Ot.useMemo(()=>r instanceof T?r.build():r,[r]);return jsxRuntime.jsx(xe,{formConfig:a,defaultValues:e,onSubmit:t,onFieldChange:i,className:o,children:s})}var Q=Ot__default.default.memo(function({fieldId:e,fieldConfig:t,disabled:i=false,customProps:o={},className:s,forceVisible:a=false}){let{formConfig:n,validateField:u,conditionsHelpers:p}=E(),f=ce(e),m=me(e),l=$(e),{setValue:d,setTouched:F}=Fe(e),g=Ot.useMemo(()=>{if(t)return t;let h=n.allFields.find(A=>A.id===e);if(h)return h;let y=L(e);if(y&&n.repeatableFields){let A=n.repeatableFields[y.repeatableId];if(A){let M=A.allFields.find(x=>x.id===y.fieldId);if(M)return {...M,id:e}}}},[t,n.allFields,n.repeatableFields,e]);if(!g)throw new Error(`Field with ID "${e}" not found`);let c=n.config.getComponent(g.componentId);if(!c)throw new Error(`Component with ID "${g.componentId}" not found`);let R=m.validationState==="validating",b=Ot.useMemo(()=>({isVisible:a||l.visible,isFieldDisabled:i||l.disabled,isFieldRequired:l.required||p.isFieldRequired(e),isFieldReadonly:l.readonly}),[a,i,l,p,e]),k=Ot.useCallback(async h=>{d(h),(g.validation?.validateOnChange||m.touched)&&await u(e,h);},[e,d,u,g.validation?.validateOnChange,m.touched]),O=Ot.useCallback(async()=>{m.touched||F(),g.validation?.validateOnBlur!==false&&await u(e);},[e,m.touched,F,u,g.validation?.validateOnBlur]),P=Ot.useMemo(()=>({...c.defaultProps??{},...g.props,...o,disabled:b.isFieldDisabled,required:b.isFieldRequired,readOnly:b.isFieldReadonly}),[c.defaultProps,g.props,o,b.isFieldDisabled,b.isFieldRequired,b.isFieldReadonly]),D=Ot.useMemo(()=>({id:e,props:P,value:f,onChange:k,onBlur:O,disabled:b.isFieldDisabled,error:m.errors,isValidating:R,touched:m.touched}),[e,P,f,k,O,b.isFieldDisabled,m.errors,R,m.touched]);if(!b.isVisible)return null;let q=c.renderer(D),X=n.renderConfig?.fieldRenderer,_=c.useFieldRenderer!==false,C=X&&_?X({children:q,id:e,...P,error:m.errors,isValidating:R,touched:m.touched}):q;return jsxRuntime.jsx("div",{className:s,"data-field-id":e,"data-field-type":c.type,"data-field-visible":b.isVisible,"data-field-disabled":b.isFieldDisabled,"data-field-required":b.isFieldRequired,"data-field-readonly":b.isFieldReadonly,children:C})});var Qe=Ot__default.default.memo(function({row:e,className:t,...i}){let{formConfig:o,conditionsHelpers:s}=E(),a=Ot.useMemo(()=>e.fields.filter(p=>s.isFieldVisible(p.id)),[e.fields,s]),n=Ot.useMemo(()=>a.map(p=>jsxRuntime.jsx(Q,{fieldId:p.id},p.id)),[a]),u=Ot.useMemo(()=>({row:e,children:n,className:t}),[e,n,t]);return a.length===0?null:jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"FormRow",renderer:o.renderConfig?.rowRenderer,props:u,...i,children:n})}),le=Qe;var ke=Ot__default.default.memo(function({item:e,index:t,total:i,canRemove:o,canMoveUp:s,canMoveDown:a,onRemove:n,onMoveUp:u,onMoveDown:p}){let{formConfig:f}=E(),m=Ot.useMemo(()=>new Map(e.allFields.map(F=>[F.id,F])),[e.allFields]),l=Ot.useMemo(()=>e.rows.map(F=>jsxRuntime.jsx(le,{row:F,children:F.fields.map(g=>jsxRuntime.jsx(Q,{fieldId:g.id,fieldConfig:m.get(g.id)},g.id))},F.id)),[e.rows,m]),d=f.renderConfig?.repeatableItemRenderer;return d?d({item:e,index:t,total:i,canRemove:o,canMoveUp:s,canMoveDown:a,onRemove:n,onMoveUp:u,onMoveDown:p,children:l}):jsxRuntime.jsx("div",{"data-repeatable-item":e.key,"data-repeatable-index":t,children:l})});var Ee=Ot__default.default.memo(function({repeatableId:e,repeatableConfig:t,className:i}){let{formConfig:o}=E(),{items:s,append:a,remove:n,move:u,canAdd:p,canRemove:f}=ve(e),m=Ot.useMemo(()=>s.map((d,F)=>jsxRuntime.jsx(ke,{item:d,index:F,total:s.length,canRemove:f,canMoveUp:F>0,canMoveDown:F<s.length-1,onRemove:()=>n(d.key),onMoveUp:()=>u(F,F-1),onMoveDown:()=>u(F,F+1)},d.key)),[s,f,n,u]),l=o.renderConfig?.repeatableRenderer;return l?l({repeatableId:e,items:s,canAdd:p,canRemove:f,onAdd:()=>a(),min:t.min,max:t.max,children:m}):jsxRuntime.jsxs("div",{className:i,"data-repeatable-id":e,children:[m,p&&jsxRuntime.jsx("button",{type:"button",onClick:()=>a(),"data-repeatable-add":e,children:"Add"})]})});var It=Ot__default.default.memo(function({className:e,...t}){let{formConfig:i}=E(),o=Ot.useMemo(()=>i.rows.map(a=>a.kind==="repeatable"?jsxRuntime.jsx(Ee,{repeatableId:a.repeatable.id,repeatableConfig:a.repeatable},a.id):jsxRuntime.jsx(le,{row:a},a.id)),[i.rows]),s=Ot.useMemo(()=>({formConfig:i,children:o,className:e}),[i,o,e]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"FormBody",renderer:i.renderConfig?.bodyRenderer,props:s,...t,children:o})});var Lt=Ot__default.default.memo(function({className:e,isSubmitting:t,...i}){let{formConfig:o,submit:s}=E(),{isSubmitting:a}=fe(),n=Ot.useMemo(()=>({isSubmitting:t??a,onSubmit:s,className:e}),[t,a,s,e]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"FormSubmitButton",renderer:o.renderConfig?.submitButtonRenderer,props:n,...i})});exports.Form=Et;exports.FormBody=It;exports.FormBuilder=T;exports.FormField=Q;exports.FormProvider=xe;exports.FormRow=Qe;exports.FormStoreContext=oe;exports.FormSubmitButton=Lt;exports.RepeatableBuilder=j;exports.RepeatableField=Ee;exports.RepeatableItem=ke;exports.createFormStore=ue;exports.flattenRepeatableValues=re;exports.form=T;exports.structureFormValues=de;exports.useConditionEvaluation=er;exports.useConditionEvaluator=pr;exports.useFieldActions=Fe;exports.useFieldConditions=$;exports.useFieldConditionsLazy=fr;exports.useFieldConditionsWithRefresh=Fr;exports.useFieldErrors=dt;exports.useFieldState=me;exports.useFieldTouched=ut;exports.useFieldValidationState=ct;exports.useFieldValue=ce;exports.useFormActions=Ct;exports.useFormConditions=Ue;exports.useFormConfigContext=E;exports.useFormDirty=Ft;exports.useFormMonitoring=xt;exports.useFormStore=S;exports.useFormStoreApi=H;exports.useFormSubmissionWithStore=$e;exports.useFormSubmitState=fe;exports.useFormSubmitting=ft;exports.useFormValid=pt;exports.useFormValidationWithStore=Le;exports.useFormValues=gt;exports.useMultipleConditionEvaluation=Te;exports.useRepeatableField=ve;exports.useRepeatableKeys=pe;
|
|
1
|
+
'use strict';var Mt=require('react'),core=require('@rilaykit/core'),zustand=require('zustand'),middleware=require('zustand/middleware'),jsxRuntime=require('react/jsx-runtime');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var Mt__default=/*#__PURE__*/_interopDefault(Mt);var W=class{constructor(e){this.innerForm=new T(e,"__repeatable_template__");}add(...e){return this.innerForm.add(...e),this}addSeparateRows(e){return this.innerForm.addSeparateRows(e),this}min(e){return this._min=e,this}max(e){return this._max=e,this}defaultValue(e){return this._defaultValue=e,this}validation(e){return this._validation=e,this}_build(e){let t=this.innerForm.getRows(),i=this.innerForm.getFields();if(t.length===0)throw new Error(`Repeatable "${e}" must have at least one field`);for(let o of i)if(o.id.includes("[")||o.id.includes("]"))throw new Error(`Repeatable template field ID "${o.id}" cannot contain "[" or "]" (reserved for composite keys)`);if(this._min!==void 0&&this._max!==void 0&&this._min>this._max)throw new Error(`Repeatable "${e}": min (${this._min}) cannot be greater than max (${this._max})`);return {id:e,rows:t.map(o=>({...o,kind:"fields"})),allFields:i,min:this._min,max:this._max,defaultValue:this._defaultValue,validation:this._validation}}_hasRepeatables(){return this.innerForm.getRows().some(e=>"kind"in e&&e.kind==="repeatable")}};var T=class r{constructor(e,t){this.rows=[];this.idGenerator=new core.IdGenerator;this.config=e,this.formId=t||`form-${Math.random().toString(36).substring(2,15)}`;}static create(e,t){return new r(e,t)}createFormField(e){let t=this.config.getComponent(e.type);if(!t)throw new Error(`No component found with type "${e.type}"`);let i;return (t.validation||e.validation)&&(i={validateOnChange:e.validation?.validateOnChange??t.validation?.validateOnChange,validateOnBlur:e.validation?.validateOnBlur??t.validation?.validateOnBlur,debounceMs:e.validation?.debounceMs??t.validation?.debounceMs,validate:(()=>{let o=t.validation?.validate,s=e.validation?.validate;if(!o)return s;if(!s)return o;let a=Array.isArray(o)?o:[o],n=Array.isArray(s)?s:[s];return [...a,...n]})()}),{id:e.id||this.idGenerator.next("field"),componentId:t.id,props:{...t.defaultProps,...e.props},validation:i,conditions:e.conditions}}createRow(e){if(e.length===0)throw new Error("At least one field is required");if(e.length>3)throw new Error("Maximum 3 fields per row");let t=e.map(i=>this.createFormField(i));return {kind:"fields",id:this.idGenerator.next("row"),fields:t,maxColumns:e.length}}add(...e){let t,i=false;if(e.length===1&&Array.isArray(e[0])?(t=e[0],i=true):t=e,t.length===0)throw new Error("At least one field is required");if(i&&t.length>3)throw new Error("Maximum 3 fields per row");if(t.length===1){let o=this.createRow(t);return this.rows.push(o),this}if(t.length<=3){let o=this.createRow(t);return this.rows.push(o),this}for(let o of t){let s=this.createRow([o]);this.rows.push(s);}return this}addSeparateRows(e){for(let t of e)this.add(t);return this}addRepeatable(e,t){if(e.includes("[")||e.includes("]"))throw new Error(`Repeatable ID "${e}" cannot contain "[" or "]" (reserved for composite keys)`);let i=new W(this.config),o=t(i);if(o._hasRepeatables())throw new Error(`Nested repeatables are not supported (in repeatable "${e}")`);let s=o._build(e),a={kind:"repeatable",id:this.idGenerator.next("repeatable"),repeatable:s};return this.rows.push(a),this}setId(e){return this.formId=e,this}updateField(e,t){let i=this.findField(e);if(!i)throw new Error(`Field with ID "${e}" not found`);return Object.assign(i,{...t,props:{...i.props,...t.props}}),this}findField(e){for(let t of this.rows)if(t.kind==="fields"){let i=t.fields.find(o=>o.id===e);if(i)return i}else {let i=t.repeatable.allFields.find(o=>o.id===e);if(i)return i}return null}removeField(e){return this.rows=this.rows.map(t=>t.kind==="repeatable"?t:{...t,fields:t.fields.filter(i=>i.id!==e)}).filter(t=>t.kind==="repeatable"||t.fields.length>0),this}getField(e){return this.findField(e)||void 0}getFields(){return this.rows.filter(e=>e.kind==="fields").flatMap(e=>e.fields)}getRows(){return [...this.rows]}clear(){return this.rows=[],this.idGenerator.reset(),this}setValidation(e){return this.formValidation=e,this}setSubmitOptions(e){return this._submitOptions=e,this}addFieldValidation(e,t){console.warn("addFieldValidation is deprecated. Use updateField with validation.validate property instead.");let i=this.findField(e);if(!i)throw new Error(`Field with ID "${e}" not found`);let o={...i.validation,...t};return this.updateField(e,{validation:o})}addFieldConditions(e,t){let i=this.findField(e);if(!i)throw new Error(`Field with ID "${e}" not found`);let o={...i.conditions,...t};return this.updateField(e,{conditions:o})}clone(e){let t=new r(this.config,e||`${this.formId}-clone`);return t.rows=core.deepClone(this.rows),t}validate(){let e=[],t=this.getFields(),i=this.rows.filter(n=>n.kind==="repeatable"),o=i.flatMap(n=>n.repeatable.allFields),s=[...t.map(n=>n.id),...o.map(n=>n.id)];try{core.ensureUnique(s,"field");}catch(n){e.push(n instanceof Error?n.message:String(n));}let a=i.map(n=>n.repeatable.id);try{core.ensureUnique(a,"repeatable");}catch(n){e.push(n instanceof Error?n.message:String(n));}for(let n of t)this.config.hasComponent(n.componentId)||e.push(`Component "${n.componentId}" not found for field "${n.id}"`);for(let n of o)this.config.hasComponent(n.componentId)||e.push(`Component "${n.componentId}" not found for repeatable template field "${n.id}"`);for(let n of this.rows)n.kind==="fields"&&(n.fields.length>3&&e.push(`Row "${n.id}" has ${n.fields.length} fields, maximum is 3`),n.fields.length===0&&e.push(`Row "${n.id}" is empty`));for(let n of t)(n.id.includes("[")||n.id.includes("]"))&&e.push(`Field ID "${n.id}" cannot contain "[" or "]" (reserved for repeatable composite keys)`);for(let n of a)(n.includes("[")||n.includes("]"))&&e.push(`Repeatable ID "${n}" cannot contain "[" or "]" (reserved for composite keys)`);return e}build(){let e=this.validate();if(e.length>0)throw new Error(`Form validation failed: ${e.join(", ")}`);let t=this.rows.filter(o=>o.kind==="repeatable"),i=t.length>0?Object.fromEntries(t.map(o=>[o.repeatable.id,o.repeatable])):void 0;return {id:this.formId,rows:[...this.rows],allFields:this.getFields(),repeatableFields:i,config:this.config,renderConfig:this.config.getFormRenderConfig(),validation:this.formValidation,submitOptions:this._submitOptions}}toJSON(){return {id:this.formId,rows:this.rows}}fromJSON(e){return e.id&&(this.formId=e.id),e.rows&&(this.rows=e.rows.map(t=>t.kind?t:{...t,kind:"fields"})),this}getStats(){let e=this.getFields(),t=this.rows.filter(s=>s.kind==="fields"),i=this.rows.filter(s=>s.kind==="repeatable"),o=t.map(s=>s.fields.length);return {totalFields:e.length,totalRows:this.rows.length,averageFieldsPerRow:t.length>0?e.length/t.length:0,maxFieldsInRow:o.length>0?Math.max(...o):0,minFieldsInRow:o.length>0?Math.min(...o):0,totalRepeatables:i.length,totalRepeatableFields:i.reduce((s,a)=>s+a.repeatable.allFields.length,0)}}};function tr(r,e={},t={}){return Mt.useMemo(()=>{if(!r)return {visible:t.visible??true,disabled:t.disabled??false,required:t.required??false,readonly:t.readonly??false};let i=o=>{try{return o&&typeof o=="object"&&"build"in o?core.evaluateCondition(o.build(),e):core.evaluateCondition(o,e)}catch(s){return console.warn("Error evaluating condition:",s),false}};return {visible:r.visible?i(r.visible):t.visible??true,disabled:r.disabled?i(r.disabled):t.disabled??false,required:r.required?i(r.required):t.required??false,readonly:r.readonly?i(r.readonly):t.readonly??false}},[r,e,t])}function Te(r,e={}){return Mt.useMemo(()=>{let t={};for(let[i,o]of Object.entries(r))if(t[i]={visible:true,disabled:false,required:false,readonly:false},o){let s=a=>{try{return a&&typeof a=="object"&&"build"in a?core.evaluateCondition(a.build(),e):core.evaluateCondition(a,e)}catch(n){return console.warn(`Error evaluating condition for field ${i}:`,n),false}};t[i]={visible:o.visible?s(o.visible):true,disabled:o.disabled?s(o.disabled):false,required:o.required?s(o.required):false,readonly:o.readonly?s(o.readonly):false};}return t},[r,e])}var nt=/^([^[\]]+)\[([^\]]+)\]\.(.+)$/;function V(r,e,t){return `${r}[${e}].${t}`}function L(r){let e=nt.exec(r);return e?{repeatableId:e[1],itemKey:e[2],fieldId:e[3]}:null}function re(r,e,t){let i={},o=new Set;for(let[s,a]of Object.entries(t)){if(!e[s])continue;let n=e[s],f=[];for(let p of a){let m={};for(let c of n.allFields){let l=V(s,p,c.id);l in r&&(m[c.id]=r[l],o.add(l));}f.push(m);}i[s]=f;}for(let[s,a]of Object.entries(r))!o.has(s)&&!L(s)&&(i[s]=a);return i}function oe(r,e){let t={},i={},o={};for(let[s,a]of Object.entries(r))if(e[s]&&Array.isArray(a)){let n=[],f=0;for(let p of a){let m=`k${f}`;n.push(m);for(let[c,l]of Object.entries(p))t[V(s,m,c)]=l;f++;}i[s]=n,o[s]=f;}else t[s]=a;return {values:t,order:i,nextKeys:o}}function ue(r={}){return zustand.createStore()(middleware.subscribeWithSelector((e,t)=>({values:{...r},errors:{},validationStates:{},touched:{},isDirty:false,isSubmitting:false,isValid:true,_defaultValues:{...r},_fieldConditions:{},_repeatableConfigs:{},_repeatableOrder:{},_repeatableNextKey:{},_setValue:(i,o)=>{e(s=>({values:{...s.values,[i]:o},isDirty:true}));},_setTouched:i=>{e(o=>({touched:{...o.touched,[i]:true}}));},_setErrors:(i,o)=>{e(s=>{let a={...s.errors,[i]:o},n=o.length>0?"invalid":"valid";return {errors:a,validationStates:{...s.validationStates,[i]:n}}}),t()._updateIsValid();},_clearErrors:i=>{e(o=>{let s={...o.errors};return delete s[i],{errors:s,validationStates:{...o.validationStates,[i]:"idle"}}}),t()._updateIsValid();},_setValidationState:(i,o)=>{e(s=>({validationStates:{...s.validationStates,[i]:o}}));},_setSubmitting:i=>{e({isSubmitting:i});},_reset:i=>{let o=i??t()._defaultValues;e({values:{...o},errors:{},validationStates:{},touched:{},isDirty:false,isSubmitting:false,isValid:true,_repeatableOrder:{},_repeatableNextKey:{}});},_setFieldConditions:(i,o)=>{e(s=>({_fieldConditions:{...s._fieldConditions,[i]:o}}));},_updateIsValid:()=>{let i=t(),o=Object.values(i.errors).some(a=>a&&a.length>0),s=Object.values(i.validationStates).some(a=>a==="invalid");e({isValid:!o&&!s});},_setRepeatableConfig:(i,o)=>{e(s=>({_repeatableConfigs:{...s._repeatableConfigs,[i]:o}}));},_appendRepeatableItem:(i,o)=>{let s=t(),a=s._repeatableConfigs[i];if(!a)return null;let n=s._repeatableOrder[i]??[];if(a.max!==void 0&&n.length>=a.max)return null;let f=s._repeatableNextKey[i]??0,p=`k${f}`,m=o??a.defaultValue??{},c={...s.values};for(let l of a.allFields){let d=V(i,p,l.id);c[d]=m[l.id]??void 0;}return e({values:c,isDirty:true,_repeatableOrder:{...s._repeatableOrder,[i]:[...n,p]},_repeatableNextKey:{...s._repeatableNextKey,[i]:f+1}}),p},_removeRepeatableItem:(i,o)=>{let s=t(),a=s._repeatableConfigs[i];if(!a)return false;let n=s._repeatableOrder[i]??[];if(a.min!==void 0&&n.length<=a.min||!n.includes(o))return false;let f=n.filter(F=>F!==o),p={...s.values},m={...s.errors},c={...s.validationStates},l={...s.touched},d={...s._fieldConditions};for(let F of a.allFields){let g=V(i,o,F.id);delete p[g],delete m[g],delete c[g],delete l[g],delete d[g];}return e({values:p,errors:m,validationStates:c,touched:l,isDirty:true,_fieldConditions:d,_repeatableOrder:{...s._repeatableOrder,[i]:f}}),t()._updateIsValid(),true},_moveRepeatableItem:(i,o,s)=>{let a=t(),n=a._repeatableOrder[i];if(!n||o<0||o>=n.length||s<0||s>=n.length||o===s)return;let f=[...n],[p]=f.splice(o,1);f.splice(s,0,p),e({_repeatableOrder:{...a._repeatableOrder,[i]:f}});},_insertRepeatableItem:(i,o,s)=>{let a=t(),n=a._repeatableConfigs[i];if(!n)return null;let f=a._repeatableOrder[i]??[];if(n.max!==void 0&&f.length>=n.max)return null;let p=a._repeatableNextKey[i]??0,m=`k${p}`,c=s??n.defaultValue??{},l={...a.values};for(let g of n.allFields){let u=V(i,m,g.id);l[u]=c[g.id]??void 0;}let d=[...f],F=Math.max(0,Math.min(o,d.length));return d.splice(F,0,m),e({values:l,isDirty:true,_repeatableOrder:{...a._repeatableOrder,[i]:d},_repeatableNextKey:{...a._repeatableNextKey,[i]:p+1}}),m}})))}var ie=Mt.createContext(null);function S(){let r=Mt.useContext(ie);if(!r)throw new Error("useFormStore must be used within a FormProvider");return r}var De=[];function ce(r){let e=S();return zustand.useStore(e,t=>t.values[r])}function ut(r){let e=S();return zustand.useStore(e,t=>t.errors[r]??De)}function ct(r){let e=S();return zustand.useStore(e,t=>t.touched[r]??false)}function mt(r){let e=S();return zustand.useStore(e,t=>t.validationStates[r]??"idle")}var ft={visible:true,disabled:false,required:false,readonly:false};function U(r){let e=S();return zustand.useStore(e,t=>t._fieldConditions[r]??ft)}function me(r){let e=S(),t=zustand.useStore(e,n=>n.values[r]),i=zustand.useStore(e,n=>n.errors[r]??De),o=zustand.useStore(e,n=>n.validationStates[r]??"idle"),s=zustand.useStore(e,n=>n.touched[r]??false),a=zustand.useStore(e,n=>n._defaultValues[r]);return {value:t,errors:i,validationState:o,touched:s,dirty:t!==a}}function pt(){let r=S();return zustand.useStore(r,e=>e.isSubmitting)}function Ft(){let r=S();return zustand.useStore(r,e=>e.isValid)}function gt(){let r=S();return zustand.useStore(r,e=>e.isDirty)}function bt(){let r=S();return zustand.useStore(r,e=>e.values)}function fe(){let r=S(),e=zustand.useStore(r,o=>o.isSubmitting),t=zustand.useStore(r,o=>o.isValid),i=zustand.useStore(r,o=>o.isDirty);return {isSubmitting:e,isValid:t,isDirty:i}}var Ct=[];function pe(r){let e=S();return zustand.useStore(e,t=>t._repeatableOrder[r]??Ct)}function Fe(r){let e=S();return {setValue:t=>e.getState()._setValue(r,t),setTouched:()=>e.getState()._setTouched(r),setErrors:t=>e.getState()._setErrors(r,t),clearErrors:()=>e.getState()._clearErrors(r),setValidationState:t=>e.getState()._setValidationState(r,t)}}function Rt(){let r=S();return {setValue:(e,t)=>r.getState()._setValue(e,t),setTouched:e=>r.getState()._setTouched(e),setErrors:(e,t)=>r.getState()._setErrors(e,t),setSubmitting:e=>r.getState()._setSubmitting(e),reset:e=>r.getState()._reset(e),setFieldConditions:(e,t)=>r.getState()._setFieldConditions(e,t)}}function H(){return S()}var Ae={visible:true,disabled:false,required:false,readonly:false};function Ke(r){try{return JSON.stringify(r)}catch{return String(Date.now())}}function ne(r,e){if(r)try{return typeof r=="object"&&"build"in r?core.evaluateCondition(r.build(),e):core.evaluateCondition(r,e)}catch(t){console.warn("Error evaluating condition:",t);return}}function be(r,e){if(!r)return Ae;let t=ne(r.visible,e),i=ne(r.disabled,e),o=ne(r.required,e),s=ne(r.readonly,e);return {visible:t??true,disabled:i??false,required:o??false,readonly:s??false}}function pr(r,e={}){let{conditions:t,skip:i=false}=e,o=H(),s=U(r),a=Mt.useRef(null);if(i||!t)return s;let n=o.getState().values,f=Ke(n);if(a.current?.valuesHash===f)return a.current.result;let p=be(t,n);return a.current={result:p,valuesHash:f},p}function Fr(){let r=H(),e=Mt.useRef(new Map),t=Mt.useRef("");return Mt.useMemo(()=>function(o,s){if(!s)return Ae;let a=r.getState().values,n=Ke(a);t.current!==n&&(e.current.clear(),t.current=n);let f=e.current.get(o);if(f)return f.result;let p=be(s,a);return e.current.set(o,{result:p,valuesHash:n}),p},[r])}function gr(r,e){let t=H(),i=U(r),o=Mt.useMemo(()=>()=>{if(!e)return i;let s=t.getState().values;return be(e,s)},[t,e,i]);return {conditions:i,refresh:o}}function Y(r,e,t,i){let o={};return r.visible&&(o.visible=G(r.visible,e,t,i)),r.disabled&&(o.disabled=G(r.disabled,e,t,i)),r.required&&(o.required=G(r.required,e,t,i)),r.readonly&&(o.readonly=G(r.readonly,e,t,i)),o}function G(r,e,t,i){let o=r.field&&i.has(r.field)?`${e}[${t}].${r.field}`:r.field,s=r.conditions?.map(a=>G(a,e,t,i));return {...r,field:o,conditions:s}}function Ie({formConfig:r,formValues:e,repeatableOrder:t}){let i=Mt.useMemo(()=>{let c={};for(let l of r.allFields)l.conditions&&(c[l.id]=l.conditions);if(t&&r.repeatableFields)for(let[l,d]of Object.entries(r.repeatableFields)){let F=t[l]??[];if(F.length===0)continue;let g=new Set(d.allFields.map(u=>u.id));for(let u of F)for(let C of d.allFields){if(!C.conditions)continue;let b=V(l,u,C.id);c[b]=Y(C.conditions,l,u,g);}}return c},[r.allFields,r.repeatableFields,t]),o=Mt.useMemo(()=>Object.keys(i).length>0,[i]),s=Te(o?i:{},o?e:{}),a=Mt.useCallback(c=>s[c],[s]),n=Mt.useCallback(c=>{let l=s[c];return l?l.visible:true},[s]),f=Mt.useCallback(c=>{let l=s[c];return l?l.disabled:false},[s]),p=Mt.useCallback(c=>{let l=s[c];return l?l.required:false},[s]),m=Mt.useCallback(c=>{let l=s[c];return l?l.readonly:false},[s]);return Mt.useMemo(()=>({fieldConditions:s,hasConditionalFields:o,getFieldCondition:a,isFieldVisible:n,isFieldDisabled:f,isFieldRequired:p,isFieldReadonly:m}),[s,o,a,n,f,p,m])}function vt(r){return typeof r=="object"&&r!==null&&"preventDefault"in r}function $e({store:r,onSubmit:e,validateForm:t,defaultSubmitOptions:i}){let o=Mt.useRef(e);o.current=e;let s=Mt.useRef(i);return s.current=i,{submit:Mt.useCallback(async n=>{let f={};vt(n)?n.preventDefault():n&&(f=n);let p={...s.current,...f},m=r.getState();if(m.isSubmitting)return false;m._setSubmitting(true);try{if(p.force){let u=r.getState(),b=Object.keys(u._repeatableConfigs).length>0?re(u.values,u._repeatableConfigs,u._repeatableOrder):u.values;return o.current&&await o.current(b),m._setSubmitting(!1),!0}let c=await t();if(!c.isValid&&!p.skipInvalid)return m._setSubmitting(!1),!1;let l=r.getState(),d=l.values;if(p.skipInvalid&&!c.isValid){let u=new Set(Object.entries(l.errors).filter(([,C])=>C.length>0).map(([C])=>C));d=Object.fromEntries(Object.entries(d).filter(([C])=>!u.has(C)));}let g=Object.keys(l._repeatableConfigs).length>0?re(d,l._repeatableConfigs,l._repeatableOrder):d;return o.current&&await o.current(g),m._setSubmitting(!1),!0}catch(c){return m._setSubmitting(false),console.error("Form submission error:",c),false}},[r,t])}}function se(){return {isValid:true,errors:[]}}function He({formConfig:r,store:e,conditionsHelpers:t}){let i=Mt.useRef(r),o=Mt.useRef(t);i.current=r,o.current=t;let s=Mt.useCallback(async(n,f)=>{let p=i.current.allFields.find(d=>d.id===n);if(!p){let d=L(n);if(d&&i.current.repeatableFields){let F=i.current.repeatableFields[d.repeatableId];if(F){let g=F.allFields.find(u=>u.id===d.fieldId);g&&(p={...g,id:n});}}}let m=e.getState();if(!p)return se();if(!o.current.isFieldVisible(n))return m._setErrors(n,[]),m._setValidationState(n,"valid"),se();if(!p.validation||!core.hasUnifiedValidation(p.validation)){let d=o.current.isFieldRequired(n),F=f!==void 0?f:m.values[n];if(d&&core.isEmptyValue(F)){let g={isValid:false,errors:[{message:"This field is required",code:"CONDITIONAL_REQUIRED"}]};return m._setErrors(n,g.errors),m._setValidationState(n,"invalid"),g}return m._setErrors(n,[]),m._setValidationState(n,"valid"),se()}let c=f!==void 0?f:m.values[n],l=core.createValidationContext({fieldId:n,formId:i.current.id,allFormData:{...m.values,[n]:c}});m._setValidationState(n,"validating");try{let d=await core.validateWithUnifiedConfig(p.validation,c,l);if(o.current.isFieldRequired(n)&&core.isEmptyValue(c)&&!d.errors.some(u=>u.code==="REQUIRED"||u.message.toLowerCase().includes("required"))){let u={isValid:!1,errors:[{message:"This field is required",code:"CONDITIONAL_REQUIRED"},...d.errors]};return m._setErrors(n,u.errors),m._setValidationState(n,"invalid"),u}return m._setErrors(n,d.errors),m._setValidationState(n,d.isValid?"valid":"invalid"),d}catch(d){let F={isValid:false,errors:[{message:d instanceof Error?d.message:"Validation failed",code:"VALIDATION_ERROR"}]};return m._setErrors(n,F.errors),m._setValidationState(n,"invalid"),F}},[e]),a=Mt.useCallback(async()=>{let n=e.getState(),f=i.current.allFields.filter(u=>{if(!o.current.isFieldVisible(u.id))return false;let b=u.validation&&core.hasUnifiedValidation(u.validation),k=o.current.isFieldRequired(u.id);return b||k}),p=i.current.allFields.filter(u=>!o.current.isFieldVisible(u.id));for(let u of p)n._setErrors(u.id,[]),n._setValidationState(u.id,"valid");let m=await Promise.all(f.map(u=>s(u.id))),c=m.some(u=>!u.isValid),l=i.current.repeatableFields??{},d=[];for(let[u,C]of Object.entries(l)){let b=n._repeatableOrder[u]??[];for(let k of b)for(let P of C.allFields){let O=V(u,k,P.id);if(!o.current.isFieldVisible(O)){n._setErrors(O,[]),n._setValidationState(O,"valid");continue}let D=await s(O);d.push(D);}C.min!==void 0&&b.length<C.min&&d.push({isValid:false,errors:[{message:`At least ${C.min} item(s) required`,code:"REPEATABLE_MIN_COUNT",path:u}]});}let F=d.some(u=>!u.isValid);c=c||F;let g=se();if(i.current.validation&&core.hasUnifiedValidation(i.current.validation)){let u=Object.keys(n.values).reduce((b,k)=>(o.current.isFieldVisible(k)&&(b[k]=n.values[k]),b),{}),C=core.createValidationContext({formId:i.current.id,allFormData:u});try{g=await core.validateFormWithUnifiedConfig(i.current.validation,u,C);}catch(b){g={isValid:false,errors:[{message:b instanceof Error?b.message:"Form validation failed",code:"FORM_VALIDATION_ERROR"}]};}}return {isValid:!c&&g.isValid,errors:[...m.flatMap(u=>u.errors),...d.flatMap(u=>u.errors),...g.errors]}},[e,s]);return {validateField:s,validateForm:a}}function ve(r){let e=S(),{formConfig:t}=E(),i=pe(r),o=t.repeatableFields?.[r],s=Mt.useMemo(()=>o?new Set(o.allFields.map(l=>l.id)):new Set,[o]),a=Mt.useMemo(()=>o?i.map((l,d)=>{let F=o.allFields.map(u=>{let C=V(r,l,u.id),b=u.conditions?Y(u.conditions,r,l,s):void 0;return {...u,id:C,conditions:b}}),g=o.rows.map(u=>({...u,fields:u.fields.map(C=>{let b=V(r,l,C.id),k=C.conditions?Y(C.conditions,r,l,s):void 0;return {...C,id:b,conditions:k}})}));return {key:l,index:d,rows:g,allFields:F}}):[],[r,i,o,s]),n=Mt.useMemo(()=>o?o.max===void 0?true:i.length<o.max:false,[o,i.length]),f=Mt.useMemo(()=>{if(!o)return false;let l=o.min??0;return i.length>l},[o,i.length]),p=Mt.useCallback(l=>{e.getState()._appendRepeatableItem(r,l);},[e,r]),m=Mt.useCallback(l=>{e.getState()._removeRepeatableItem(r,l);},[e,r]),c=Mt.useCallback((l,d)=>{e.getState()._moveRepeatableItem(r,l,d);},[e,r]);return {items:a,append:p,remove:m,move:c,canAdd:n,canRemove:f,count:i.length}}function xt({formConfig:r,enabled:e=true}){let t=core.getGlobalMonitor(),i=Mt.useRef(null),o=Mt.useRef(0),s=Mt.useRef(0);Mt.useEffect(()=>{t&&e&&(i.current=t.getProfiler());},[t,e]);let a=Mt.useCallback(l=>{if(!t||!e)return;o.current++;let d={formId:r.id,fieldCount:r.allFields.length,timestamp:Date.now(),duration:0,renderDuration:0,validationDuration:0,validationErrors:0,renderCount:l||o.current};t.track("component_render",`form_${r.id}`,{formId:r.id,fieldCount:r.allFields.length,renderCount:o.current},d,"low");},[t,e,r.id,r.allFields.length]),n=Mt.useCallback((l,d)=>{if(!t||!e)return;let F=i.current?.getMetrics(`form_validation_${r.id}`),g={formId:r.id,fieldCount:d||r.allFields.length,timestamp:Date.now(),duration:F?.duration||0,renderDuration:0,validationDuration:F?.duration||0,validationErrors:l,renderCount:o.current};t.track("form_validation",`form_${r.id}`,{formId:r.id,validationErrors:l,fieldCount:d||r.allFields.length},g,l>0?"medium":"low");},[t,e,r.id,r.allFields.length]),f=Mt.useCallback((l,d)=>{if(!t||!e)return;let F=i.current?.getMetrics(`form_submission_${r.id}`),g={formId:r.id,fieldCount:d||r.allFields.length,timestamp:Date.now(),duration:F?.duration||0,renderDuration:0,validationDuration:0,validationErrors:l?0:1,renderCount:o.current};t.track("form_submission",`form_${r.id}`,{formId:r.id,success:l,fieldCount:d||r.allFields.length,fieldChanges:s.current},g,l?"low":"high");},[t,e,r.id,r.allFields.length]),p=Mt.useCallback((l,d)=>{!t||!e||(s.current++,t.track("component_update",`field_${l}`,{formId:r.id,fieldId:l,componentType:d,changeCount:s.current},void 0,"low"));},[t,e,r.id]),m=Mt.useCallback(l=>{!i.current||!e||i.current.start(l,{formId:r.id,renderCount:o.current});},[e,r.id]),c=Mt.useCallback(l=>{if(!i.current||!e)return null;let d=i.current.end(l);return d?{...d,formId:r.id,fieldCount:r.allFields.length,renderDuration:d.duration,validationDuration:0,validationErrors:0}:null},[e,r.id,r.allFields.length]);return {trackFormRender:a,trackFormValidation:n,trackFormSubmission:f,trackFieldChange:p,startPerformanceTracking:m,endPerformanceTracking:c}}var ze=Mt.createContext(null);function E(){let r=Mt.useContext(ze);if(!r)throw new Error("useFormConfigContext must be used within a FormProvider");return r}function _e({children:r,formConfig:e,defaultValues:t={},onSubmit:i,onFieldChange:o,className:s}){let[a]=Mt.useState(()=>{let x=e.repeatableFields??{},R={...t},h={},y={};if(Object.keys(x).some(v=>Array.isArray(t[v]))){let v=oe(t,x);R=v.values,h=v.order,y=v.nextKeys;}for(let[v,B]of Object.entries(x))if(!h[v]){let Z=B.min??0,K=[],I=y[v]??0;for(let N=0;N<Z;N++){let j=`k${I}`;K.push(j);for(let ee of B.allFields){let rt=V(v,j,ee.id);R[rt]=B.defaultValue?.[ee.id]??void 0;}I++;}h[v]=K,y[v]=I;}let M=ue(R),_=M.getState();for(let[v,B]of Object.entries(x))_._setRepeatableConfig(v,B);return M.setState({_repeatableOrder:h,_repeatableNextKey:y}),M}),n=Mt.useRef(e.id),f=Mt.useRef(o);f.current=o,Mt.useEffect(()=>f.current?a.subscribe(R=>R.values,(R,h)=>{for(let y of Object.keys(R))R[y]!==h[y]&&f.current?.(y,R[y],R);}):void 0,[a]),Mt.useEffect(()=>{if(n.current!==e.id){n.current=e.id;let x=e.repeatableFields??{},R={...t},h={},y={};if(Object.keys(x).some(_=>Array.isArray(t[_]))){let _=oe(t,x);R=_.values,h=_.order,y=_.nextKeys;}for(let[_,v]of Object.entries(x))if(!h[_]){let B=v.min??0,Z=[],K=y[_]??0;for(let I=0;I<B;I++){let N=`k${K}`;Z.push(N);for(let j of v.allFields){let ee=V(_,N,j.id);R[ee]=v.defaultValue?.[j.id]??void 0;}K++;}h[_]=Z,y[_]=K;}a.getState()._reset(R);let M=a.getState();for(let[_,v]of Object.entries(x))M._setRepeatableConfig(_,v);a.setState({_repeatableOrder:h,_repeatableNextKey:y});}},[e.id,e.repeatableFields,a,t]);let[p,m]=Mt.useState(()=>a.getState().values);Mt.useEffect(()=>a.subscribe(R=>R.values,R=>m(R)),[a]);let[c,l]=Mt.useState(()=>a.getState()._repeatableOrder);Mt.useEffect(()=>a.subscribe(R=>R._repeatableOrder,R=>l(R)),[a]);let{fieldConditions:d,hasConditionalFields:F,getFieldCondition:g,isFieldVisible:u,isFieldDisabled:C,isFieldRequired:b,isFieldReadonly:k}=Ie({formConfig:e,formValues:p,repeatableOrder:c});Mt.useEffect(()=>{for(let[x,R]of Object.entries(d)){let h={visible:R.visible,disabled:R.disabled,required:R.required,readonly:R.readonly};a.getState()._setFieldConditions(x,h);}},[d,a]);let P=Mt.useMemo(()=>({hasConditionalFields:F,getFieldCondition:g,isFieldVisible:u,isFieldDisabled:C,isFieldRequired:b,isFieldReadonly:k}),[F,g,u,C,b,k]),{validateField:O,validateForm:D}=He({formConfig:e,store:a,conditionsHelpers:P}),{submit:q}=$e({store:a,onSubmit:i,validateForm:D,defaultSubmitOptions:e.submitOptions}),X=Mt.useMemo(()=>({formConfig:e,conditionsHelpers:P,validateField:O,validateForm:D,submit:q}),[e,P,O,D,q]);return jsxRuntime.jsx(ie.Provider,{value:a,children:jsxRuntime.jsx(ze.Provider,{value:X,children:jsxRuntime.jsx("form",{onSubmit:q,className:s,noValidate:true,children:r})})})}function Ot({formConfig:r,defaultValues:e,onSubmit:t,onFieldChange:i,className:o,children:s}){let a=Mt.useMemo(()=>r instanceof T?r.build():r,[r]);return jsxRuntime.jsx(_e,{formConfig:a,defaultValues:e,onSubmit:t,onFieldChange:i,className:o,children:s})}var Q=Mt__default.default.memo(function({fieldId:e,fieldConfig:t,disabled:i=false,customProps:o={},className:s,forceVisible:a=false}){let{formConfig:n,validateField:f,conditionsHelpers:p}=E(),m=ce(e),c=me(e),l=U(e),{setValue:d,setTouched:F}=Fe(e),g=Mt.useMemo(()=>{if(t)return t;let h=n.allFields.find(A=>A.id===e);if(h)return h;let y=L(e);if(y&&n.repeatableFields){let A=n.repeatableFields[y.repeatableId];if(A){let M=A.allFields.find(_=>_.id===y.fieldId);if(M)return {...M,id:e}}}},[t,n.allFields,n.repeatableFields,e]);if(!g)throw new Error(`Field with ID "${e}" not found`);let u=n.config.getComponent(g.componentId);if(!u)throw new Error(`Component with ID "${g.componentId}" not found`);let C=c.validationState==="validating",b=Mt.useMemo(()=>({isVisible:a||l.visible,isFieldDisabled:i||l.disabled,isFieldRequired:l.required||p.isFieldRequired(e),isFieldReadonly:l.readonly}),[a,i,l,p,e]),k=Mt.useCallback(async h=>{d(h),(g.validation?.validateOnChange||c.touched)&&await f(e,h);},[e,d,f,g.validation?.validateOnChange,c.touched]),P=Mt.useCallback(async()=>{c.touched||F(),g.validation?.validateOnBlur!==false&&await f(e);},[e,c.touched,F,f,g.validation?.validateOnBlur]),O=Mt.useMemo(()=>({...u.defaultProps??{},...g.props,...o,disabled:b.isFieldDisabled,required:b.isFieldRequired,readOnly:b.isFieldReadonly}),[u.defaultProps,g.props,o,b.isFieldDisabled,b.isFieldRequired,b.isFieldReadonly]),D=Mt.useMemo(()=>({id:e,props:O,value:m,onChange:k,onBlur:P,disabled:b.isFieldDisabled,error:c.errors,isValidating:C,touched:c.touched}),[e,O,m,k,P,b.isFieldDisabled,c.errors,C,c.touched]);if(!b.isVisible)return null;let q=u.renderer(D),X=n.renderConfig?.fieldRenderer,x=u.useFieldRenderer!==false,R=X&&x?X({children:q,id:e,...O,error:c.errors,isValidating:C,touched:c.touched}):q;return jsxRuntime.jsx("div",{className:s,"data-field-id":e,"data-field-type":u.type,"data-field-visible":b.isVisible,"data-field-disabled":b.isFieldDisabled,"data-field-required":b.isFieldRequired,"data-field-readonly":b.isFieldReadonly,children:R})});var Xe=Mt__default.default.memo(function({row:e,className:t,...i}){let{formConfig:o,conditionsHelpers:s}=E(),a=Mt.useMemo(()=>e.fields.filter(p=>s.isFieldVisible(p.id)),[e.fields,s]),n=Mt.useMemo(()=>a.map(p=>jsxRuntime.jsx(Q,{fieldId:p.id},p.id)),[a]),f=Mt.useMemo(()=>({row:e,children:n,className:t}),[e,n,t]);return a.length===0?null:jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"FormRow",renderer:o.renderConfig?.rowRenderer,props:f,...i,children:n})}),de=Xe;var ke=Mt__default.default.memo(function({item:e,index:t,total:i,canRemove:o,canMoveUp:s,canMoveDown:a,onRemove:n,onMoveUp:f,onMoveDown:p}){let{formConfig:m}=E(),c=Mt.useMemo(()=>new Map(e.allFields.map(F=>[F.id,F])),[e.allFields]),l=Mt.useMemo(()=>e.rows.map(F=>jsxRuntime.jsx(de,{row:F,children:F.fields.map(g=>jsxRuntime.jsx(Q,{fieldId:g.id,fieldConfig:c.get(g.id)},g.id))},F.id)),[e.rows,c]),d=m.renderConfig?.repeatableItemRenderer;return d?d({item:e,index:t,total:i,canRemove:o,canMoveUp:s,canMoveDown:a,onRemove:n,onMoveUp:f,onMoveDown:p,children:l}):jsxRuntime.jsx("div",{"data-repeatable-item":e.key,"data-repeatable-index":t,children:l})});var Ee=Mt__default.default.memo(function({repeatableId:e,repeatableConfig:t,className:i}){let{formConfig:o}=E(),{items:s,append:a,remove:n,move:f,canAdd:p,canRemove:m}=ve(e),c=Mt.useMemo(()=>s.map((d,F)=>jsxRuntime.jsx(ke,{item:d,index:F,total:s.length,canRemove:m,canMoveUp:F>0,canMoveDown:F<s.length-1,onRemove:()=>n(d.key),onMoveUp:()=>f(F,F-1),onMoveDown:()=>f(F,F+1)},d.key)),[s,m,n,f]),l=o.renderConfig?.repeatableRenderer;return l?l({repeatableId:e,items:s,canAdd:p,canRemove:m,onAdd:()=>a(),min:t.min,max:t.max,children:c}):jsxRuntime.jsxs("div",{className:i,"data-repeatable-id":e,children:[c,p&&jsxRuntime.jsx("button",{type:"button",onClick:()=>a(),"data-repeatable-add":e,children:"Add"})]})});var Nt=Mt__default.default.memo(function({className:e,...t}){let{formConfig:i}=E(),o=Mt.useMemo(()=>i.rows.map(a=>a.kind==="repeatable"?jsxRuntime.jsx(Ee,{repeatableId:a.repeatable.id,repeatableConfig:a.repeatable},a.id):jsxRuntime.jsx(de,{row:a},a.id)),[i.rows]),s=Mt.useMemo(()=>({formConfig:i,children:o,className:e}),[i,o,e]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"FormBody",renderer:i.renderConfig?.bodyRenderer,props:s,...t,children:o})});var Ht=Mt__default.default.memo(function({className:e,isSubmitting:t,...i}){let{formConfig:o,submit:s}=E(),{isSubmitting:a}=fe(),n=Mt.useMemo(()=>({isSubmitting:t??a,onSubmit:s,className:e}),[t,a,s,e]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"FormSubmitButton",renderer:o.renderConfig?.submitButtonRenderer,props:n,...i})});exports.Form=Ot;exports.FormBody=Nt;exports.FormBuilder=T;exports.FormField=Q;exports.FormProvider=_e;exports.FormRow=Xe;exports.FormStoreContext=ie;exports.FormSubmitButton=Ht;exports.RepeatableBuilder=W;exports.RepeatableField=Ee;exports.RepeatableItem=ke;exports.createFormStore=ue;exports.flattenRepeatableValues=oe;exports.form=T;exports.structureFormValues=re;exports.useConditionEvaluation=tr;exports.useConditionEvaluator=Fr;exports.useFieldActions=Fe;exports.useFieldConditions=U;exports.useFieldConditionsLazy=pr;exports.useFieldConditionsWithRefresh=gr;exports.useFieldErrors=ut;exports.useFieldState=me;exports.useFieldTouched=ct;exports.useFieldValidationState=mt;exports.useFieldValue=ce;exports.useFormActions=Rt;exports.useFormConditions=Ie;exports.useFormConfigContext=E;exports.useFormDirty=gt;exports.useFormMonitoring=xt;exports.useFormStore=S;exports.useFormStoreApi=H;exports.useFormSubmissionWithStore=$e;exports.useFormSubmitState=fe;exports.useFormSubmitting=pt;exports.useFormValid=Ft;exports.useFormValidationWithStore=He;exports.useFormValues=bt;exports.useMultipleConditionEvaluation=Te;exports.useRepeatableField=ve;exports.useRepeatableKeys=pe;
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import Ot,{createContext,useMemo,useCallback,useContext,useRef,useEffect,useState}from'react';import {ComponentRendererWrapper,IdGenerator,deepClone,ensureUnique,hasUnifiedValidation,isEmptyValue,createValidationContext,validateWithUnifiedConfig,validateFormWithUnifiedConfig,getGlobalMonitor,evaluateCondition}from'@rilaykit/core';import {useStore,createStore}from'zustand';import {subscribeWithSelector}from'zustand/middleware';import {jsx,jsxs}from'react/jsx-runtime';var j=class{constructor(e){this.innerForm=new T(e,"__repeatable_template__");}add(...e){return this.innerForm.add(...e),this}addSeparateRows(e){return this.innerForm.addSeparateRows(e),this}min(e){return this._min=e,this}max(e){return this._max=e,this}defaultValue(e){return this._defaultValue=e,this}validation(e){return this._validation=e,this}_build(e){let t=this.innerForm.getRows(),i=this.innerForm.getFields();if(t.length===0)throw new Error(`Repeatable "${e}" must have at least one field`);for(let o of i)if(o.id.includes("[")||o.id.includes("]"))throw new Error(`Repeatable template field ID "${o.id}" cannot contain "[" or "]" (reserved for composite keys)`);if(this._min!==void 0&&this._max!==void 0&&this._min>this._max)throw new Error(`Repeatable "${e}": min (${this._min}) cannot be greater than max (${this._max})`);return {id:e,rows:t.map(o=>({...o,kind:"fields"})),allFields:i,min:this._min,max:this._max,defaultValue:this._defaultValue,validation:this._validation}}_hasRepeatables(){return this.innerForm.getRows().some(e=>"kind"in e&&e.kind==="repeatable")}};var T=class r{constructor(e,t){this.rows=[];this.idGenerator=new IdGenerator;this.config=e,this.formId=t||`form-${Math.random().toString(36).substring(2,15)}`;}static create(e,t){return new r(e,t)}createFormField(e){let t=this.config.getComponent(e.type);if(!t)throw new Error(`No component found with type "${e.type}"`);let i;return (t.validation||e.validation)&&(i={validateOnChange:e.validation?.validateOnChange??t.validation?.validateOnChange,validateOnBlur:e.validation?.validateOnBlur??t.validation?.validateOnBlur,debounceMs:e.validation?.debounceMs??t.validation?.debounceMs,validate:(()=>{let o=t.validation?.validate,s=e.validation?.validate;if(!o)return s;if(!s)return o;let a=Array.isArray(o)?o:[o],n=Array.isArray(s)?s:[s];return [...a,...n]})()}),{id:e.id||this.idGenerator.next("field"),componentId:t.id,props:{...t.defaultProps,...e.props},validation:i,conditions:e.conditions}}createRow(e){if(e.length===0)throw new Error("At least one field is required");if(e.length>3)throw new Error("Maximum 3 fields per row");let t=e.map(i=>this.createFormField(i));return {kind:"fields",id:this.idGenerator.next("row"),fields:t,maxColumns:e.length}}add(...e){let t,i=false;if(e.length===1&&Array.isArray(e[0])?(t=e[0],i=true):t=e,t.length===0)throw new Error("At least one field is required");if(i&&t.length>3)throw new Error("Maximum 3 fields per row");if(t.length===1){let o=this.createRow(t);return this.rows.push(o),this}if(t.length<=3){let o=this.createRow(t);return this.rows.push(o),this}for(let o of t){let s=this.createRow([o]);this.rows.push(s);}return this}addSeparateRows(e){for(let t of e)this.add(t);return this}addRepeatable(e,t){if(e.includes("[")||e.includes("]"))throw new Error(`Repeatable ID "${e}" cannot contain "[" or "]" (reserved for composite keys)`);let i=new j(this.config),o=t(i);if(o._hasRepeatables())throw new Error(`Nested repeatables are not supported (in repeatable "${e}")`);let s=o._build(e),a={kind:"repeatable",id:this.idGenerator.next("repeatable"),repeatable:s};return this.rows.push(a),this}setId(e){return this.formId=e,this}updateField(e,t){let i=this.findField(e);if(!i)throw new Error(`Field with ID "${e}" not found`);return Object.assign(i,{...t,props:{...i.props,...t.props}}),this}findField(e){for(let t of this.rows)if(t.kind==="fields"){let i=t.fields.find(o=>o.id===e);if(i)return i}else {let i=t.repeatable.allFields.find(o=>o.id===e);if(i)return i}return null}removeField(e){return this.rows=this.rows.map(t=>t.kind==="repeatable"?t:{...t,fields:t.fields.filter(i=>i.id!==e)}).filter(t=>t.kind==="repeatable"||t.fields.length>0),this}getField(e){return this.findField(e)||void 0}getFields(){return this.rows.filter(e=>e.kind==="fields").flatMap(e=>e.fields)}getRows(){return [...this.rows]}clear(){return this.rows=[],this.idGenerator.reset(),this}setValidation(e){return this.formValidation=e,this}addFieldValidation(e,t){console.warn("addFieldValidation is deprecated. Use updateField with validation.validate property instead.");let i=this.findField(e);if(!i)throw new Error(`Field with ID "${e}" not found`);let o={...i.validation,...t};return this.updateField(e,{validation:o})}addFieldConditions(e,t){let i=this.findField(e);if(!i)throw new Error(`Field with ID "${e}" not found`);let o={...i.conditions,...t};return this.updateField(e,{conditions:o})}clone(e){let t=new r(this.config,e||`${this.formId}-clone`);return t.rows=deepClone(this.rows),t}validate(){let e=[],t=this.getFields(),i=this.rows.filter(n=>n.kind==="repeatable"),o=i.flatMap(n=>n.repeatable.allFields),s=[...t.map(n=>n.id),...o.map(n=>n.id)];try{ensureUnique(s,"field");}catch(n){e.push(n instanceof Error?n.message:String(n));}let a=i.map(n=>n.repeatable.id);try{ensureUnique(a,"repeatable");}catch(n){e.push(n instanceof Error?n.message:String(n));}for(let n of t)this.config.hasComponent(n.componentId)||e.push(`Component "${n.componentId}" not found for field "${n.id}"`);for(let n of o)this.config.hasComponent(n.componentId)||e.push(`Component "${n.componentId}" not found for repeatable template field "${n.id}"`);for(let n of this.rows)n.kind==="fields"&&(n.fields.length>3&&e.push(`Row "${n.id}" has ${n.fields.length} fields, maximum is 3`),n.fields.length===0&&e.push(`Row "${n.id}" is empty`));for(let n of t)(n.id.includes("[")||n.id.includes("]"))&&e.push(`Field ID "${n.id}" cannot contain "[" or "]" (reserved for repeatable composite keys)`);for(let n of a)(n.includes("[")||n.includes("]"))&&e.push(`Repeatable ID "${n}" cannot contain "[" or "]" (reserved for composite keys)`);return e}build(){let e=this.validate();if(e.length>0)throw new Error(`Form validation failed: ${e.join(", ")}`);let t=this.rows.filter(o=>o.kind==="repeatable"),i=t.length>0?Object.fromEntries(t.map(o=>[o.repeatable.id,o.repeatable])):void 0;return {id:this.formId,rows:[...this.rows],allFields:this.getFields(),repeatableFields:i,config:this.config,renderConfig:this.config.getFormRenderConfig(),validation:this.formValidation}}toJSON(){return {id:this.formId,rows:this.rows}}fromJSON(e){return e.id&&(this.formId=e.id),e.rows&&(this.rows=e.rows.map(t=>t.kind?t:{...t,kind:"fields"})),this}getStats(){let e=this.getFields(),t=this.rows.filter(s=>s.kind==="fields"),i=this.rows.filter(s=>s.kind==="repeatable"),o=t.map(s=>s.fields.length);return {totalFields:e.length,totalRows:this.rows.length,averageFieldsPerRow:t.length>0?e.length/t.length:0,maxFieldsInRow:o.length>0?Math.max(...o):0,minFieldsInRow:o.length>0?Math.min(...o):0,totalRepeatables:i.length,totalRepeatableFields:i.reduce((s,a)=>s+a.repeatable.allFields.length,0)}}};function er(r,e={},t={}){return useMemo(()=>{if(!r)return {visible:t.visible??true,disabled:t.disabled??false,required:t.required??false,readonly:t.readonly??false};let i=o=>{try{return o&&typeof o=="object"&&"build"in o?evaluateCondition(o.build(),e):evaluateCondition(o,e)}catch(s){return console.warn("Error evaluating condition:",s),false}};return {visible:r.visible?i(r.visible):t.visible??true,disabled:r.disabled?i(r.disabled):t.disabled??false,required:r.required?i(r.required):t.required??false,readonly:r.readonly?i(r.readonly):t.readonly??false}},[r,e,t])}function Te(r,e={}){return useMemo(()=>{let t={};for(let[i,o]of Object.entries(r))if(t[i]={visible:true,disabled:false,required:false,readonly:false},o){let s=a=>{try{return a&&typeof a=="object"&&"build"in a?evaluateCondition(a.build(),e):evaluateCondition(a,e)}catch(n){return console.warn(`Error evaluating condition for field ${i}:`,n),false}};t[i]={visible:o.visible?s(o.visible):true,disabled:o.disabled?s(o.disabled):false,required:o.required?s(o.required):false,readonly:o.readonly?s(o.readonly):false};}return t},[r,e])}var it=/^([^[\]]+)\[([^\]]+)\]\.(.+)$/;function V(r,e,t){return `${r}[${e}].${t}`}function L(r){let e=it.exec(r);return e?{repeatableId:e[1],itemKey:e[2],fieldId:e[3]}:null}function de(r,e,t){let i={},o=new Set;for(let[s,a]of Object.entries(t)){if(!e[s])continue;let n=e[s],u=[];for(let p of a){let f={};for(let m of n.allFields){let l=V(s,p,m.id);l in r&&(f[m.id]=r[l],o.add(l));}u.push(f);}i[s]=u;}for(let[s,a]of Object.entries(r))!o.has(s)&&!L(s)&&(i[s]=a);return i}function re(r,e){let t={},i={},o={};for(let[s,a]of Object.entries(r))if(e[s]&&Array.isArray(a)){let n=[],u=0;for(let p of a){let f=`k${u}`;n.push(f);for(let[m,l]of Object.entries(p))t[V(s,f,m)]=l;u++;}i[s]=n,o[s]=u;}else t[s]=a;return {values:t,order:i,nextKeys:o}}function ue(r={}){return createStore()(subscribeWithSelector((e,t)=>({values:{...r},errors:{},validationStates:{},touched:{},isDirty:false,isSubmitting:false,isValid:true,_defaultValues:{...r},_fieldConditions:{},_repeatableConfigs:{},_repeatableOrder:{},_repeatableNextKey:{},_setValue:(i,o)=>{e(s=>({values:{...s.values,[i]:o},isDirty:true}));},_setTouched:i=>{e(o=>({touched:{...o.touched,[i]:true}}));},_setErrors:(i,o)=>{e(s=>{let a={...s.errors,[i]:o},n=o.length>0?"invalid":"valid";return {errors:a,validationStates:{...s.validationStates,[i]:n}}}),t()._updateIsValid();},_clearErrors:i=>{e(o=>{let s={...o.errors};return delete s[i],{errors:s,validationStates:{...o.validationStates,[i]:"idle"}}}),t()._updateIsValid();},_setValidationState:(i,o)=>{e(s=>({validationStates:{...s.validationStates,[i]:o}}));},_setSubmitting:i=>{e({isSubmitting:i});},_reset:i=>{let o=i??t()._defaultValues;e({values:{...o},errors:{},validationStates:{},touched:{},isDirty:false,isSubmitting:false,isValid:true,_repeatableOrder:{},_repeatableNextKey:{}});},_setFieldConditions:(i,o)=>{e(s=>({_fieldConditions:{...s._fieldConditions,[i]:o}}));},_updateIsValid:()=>{let i=t(),o=Object.values(i.errors).some(a=>a&&a.length>0),s=Object.values(i.validationStates).some(a=>a==="invalid");e({isValid:!o&&!s});},_setRepeatableConfig:(i,o)=>{e(s=>({_repeatableConfigs:{...s._repeatableConfigs,[i]:o}}));},_appendRepeatableItem:(i,o)=>{let s=t(),a=s._repeatableConfigs[i];if(!a)return null;let n=s._repeatableOrder[i]??[];if(a.max!==void 0&&n.length>=a.max)return null;let u=s._repeatableNextKey[i]??0,p=`k${u}`,f=o??a.defaultValue??{},m={...s.values};for(let l of a.allFields){let d=V(i,p,l.id);m[d]=f[l.id]??void 0;}return e({values:m,isDirty:true,_repeatableOrder:{...s._repeatableOrder,[i]:[...n,p]},_repeatableNextKey:{...s._repeatableNextKey,[i]:u+1}}),p},_removeRepeatableItem:(i,o)=>{let s=t(),a=s._repeatableConfigs[i];if(!a)return false;let n=s._repeatableOrder[i]??[];if(a.min!==void 0&&n.length<=a.min||!n.includes(o))return false;let u=n.filter(F=>F!==o),p={...s.values},f={...s.errors},m={...s.validationStates},l={...s.touched},d={...s._fieldConditions};for(let F of a.allFields){let g=V(i,o,F.id);delete p[g],delete f[g],delete m[g],delete l[g],delete d[g];}return e({values:p,errors:f,validationStates:m,touched:l,isDirty:true,_fieldConditions:d,_repeatableOrder:{...s._repeatableOrder,[i]:u}}),t()._updateIsValid(),true},_moveRepeatableItem:(i,o,s)=>{let a=t(),n=a._repeatableOrder[i];if(!n||o<0||o>=n.length||s<0||s>=n.length||o===s)return;let u=[...n],[p]=u.splice(o,1);u.splice(s,0,p),e({_repeatableOrder:{...a._repeatableOrder,[i]:u}});},_insertRepeatableItem:(i,o,s)=>{let a=t(),n=a._repeatableConfigs[i];if(!n)return null;let u=a._repeatableOrder[i]??[];if(n.max!==void 0&&u.length>=n.max)return null;let p=a._repeatableNextKey[i]??0,f=`k${p}`,m=s??n.defaultValue??{},l={...a.values};for(let g of n.allFields){let c=V(i,f,g.id);l[c]=m[g.id]??void 0;}let d=[...u],F=Math.max(0,Math.min(o,d.length));return d.splice(F,0,f),e({values:l,isDirty:true,_repeatableOrder:{...a._repeatableOrder,[i]:d},_repeatableNextKey:{...a._repeatableNextKey,[i]:p+1}}),f}})))}var oe=createContext(null);function S(){let r=useContext(oe);if(!r)throw new Error("useFormStore must be used within a FormProvider");return r}var De=[];function ce(r){let e=S();return useStore(e,t=>t.values[r])}function dt(r){let e=S();return useStore(e,t=>t.errors[r]??De)}function ut(r){let e=S();return useStore(e,t=>t.touched[r]??false)}function ct(r){let e=S();return useStore(e,t=>t.validationStates[r]??"idle")}var mt={visible:true,disabled:false,required:false,readonly:false};function $(r){let e=S();return useStore(e,t=>t._fieldConditions[r]??mt)}function me(r){let e=S(),t=useStore(e,n=>n.values[r]),i=useStore(e,n=>n.errors[r]??De),o=useStore(e,n=>n.validationStates[r]??"idle"),s=useStore(e,n=>n.touched[r]??false),a=useStore(e,n=>n._defaultValues[r]);return {value:t,errors:i,validationState:o,touched:s,dirty:t!==a}}function ft(){let r=S();return useStore(r,e=>e.isSubmitting)}function pt(){let r=S();return useStore(r,e=>e.isValid)}function Ft(){let r=S();return useStore(r,e=>e.isDirty)}function gt(){let r=S();return useStore(r,e=>e.values)}function fe(){let r=S(),e=useStore(r,o=>o.isSubmitting),t=useStore(r,o=>o.isValid),i=useStore(r,o=>o.isDirty);return {isSubmitting:e,isValid:t,isDirty:i}}var bt=[];function pe(r){let e=S();return useStore(e,t=>t._repeatableOrder[r]??bt)}function Fe(r){let e=S();return {setValue:t=>e.getState()._setValue(r,t),setTouched:()=>e.getState()._setTouched(r),setErrors:t=>e.getState()._setErrors(r,t),clearErrors:()=>e.getState()._clearErrors(r),setValidationState:t=>e.getState()._setValidationState(r,t)}}function Ct(){let r=S();return {setValue:(e,t)=>r.getState()._setValue(e,t),setTouched:e=>r.getState()._setTouched(e),setErrors:(e,t)=>r.getState()._setErrors(e,t),setSubmitting:e=>r.getState()._setSubmitting(e),reset:e=>r.getState()._reset(e),setFieldConditions:(e,t)=>r.getState()._setFieldConditions(e,t)}}function H(){return S()}var Ae={visible:true,disabled:false,required:false,readonly:false};function Ke(r){try{return JSON.stringify(r)}catch{return String(Date.now())}}function ie(r,e){if(r)try{return typeof r=="object"&&"build"in r?evaluateCondition(r.build(),e):evaluateCondition(r,e)}catch(t){console.warn("Error evaluating condition:",t);return}}function be(r,e){if(!r)return Ae;let t=ie(r.visible,e),i=ie(r.disabled,e),o=ie(r.required,e),s=ie(r.readonly,e);return {visible:t??true,disabled:i??false,required:o??false,readonly:s??false}}function fr(r,e={}){let{conditions:t,skip:i=false}=e,o=H(),s=$(r),a=useRef(null);if(i||!t)return s;let n=o.getState().values,u=Ke(n);if(a.current?.valuesHash===u)return a.current.result;let p=be(t,n);return a.current={result:p,valuesHash:u},p}function pr(){let r=H(),e=useRef(new Map),t=useRef("");return useMemo(()=>function(o,s){if(!s)return Ae;let a=r.getState().values,n=Ke(a);t.current!==n&&(e.current.clear(),t.current=n);let u=e.current.get(o);if(u)return u.result;let p=be(s,a);return e.current.set(o,{result:p,valuesHash:n}),p},[r])}function Fr(r,e){let t=H(),i=$(r),o=useMemo(()=>()=>{if(!e)return i;let s=t.getState().values;return be(e,s)},[t,e,i]);return {conditions:i,refresh:o}}function Y(r,e,t,i){let o={};return r.visible&&(o.visible=G(r.visible,e,t,i)),r.disabled&&(o.disabled=G(r.disabled,e,t,i)),r.required&&(o.required=G(r.required,e,t,i)),r.readonly&&(o.readonly=G(r.readonly,e,t,i)),o}function G(r,e,t,i){let o=r.field&&i.has(r.field)?`${e}[${t}].${r.field}`:r.field,s=r.conditions?.map(a=>G(a,e,t,i));return {...r,field:o,conditions:s}}function Ue({formConfig:r,formValues:e,repeatableOrder:t}){let i=useMemo(()=>{let m={};for(let l of r.allFields)l.conditions&&(m[l.id]=l.conditions);if(t&&r.repeatableFields)for(let[l,d]of Object.entries(r.repeatableFields)){let F=t[l]??[];if(F.length===0)continue;let g=new Set(d.allFields.map(c=>c.id));for(let c of F)for(let R of d.allFields){if(!R.conditions)continue;let b=V(l,c,R.id);m[b]=Y(R.conditions,l,c,g);}}return m},[r.allFields,r.repeatableFields,t]),o=useMemo(()=>Object.keys(i).length>0,[i]),s=Te(o?i:{},o?e:{}),a=useCallback(m=>s[m],[s]),n=useCallback(m=>{let l=s[m];return l?l.visible:true},[s]),u=useCallback(m=>{let l=s[m];return l?l.disabled:false},[s]),p=useCallback(m=>{let l=s[m];return l?l.required:false},[s]),f=useCallback(m=>{let l=s[m];return l?l.readonly:false},[s]);return useMemo(()=>({fieldConditions:s,hasConditionalFields:o,getFieldCondition:a,isFieldVisible:n,isFieldDisabled:u,isFieldRequired:p,isFieldReadonly:f}),[s,o,a,n,u,p,f])}function $e({store:r,onSubmit:e,validateForm:t}){let i=useRef(e);return i.current=e,{submit:useCallback(async s=>{s?.preventDefault();let a=r.getState();if(a.isSubmitting)return false;a._setSubmitting(true);try{if(!(await t()).isValid)return a._setSubmitting(!1),!1;let u=r.getState(),f=Object.keys(u._repeatableConfigs).length>0?de(u.values,u._repeatableConfigs,u._repeatableOrder):u.values;return i.current&&await i.current(f),a._setSubmitting(!1),!0}catch(n){return a._setSubmitting(false),console.error("Form submission error:",n),false}},[r,t])}}function ne(){return {isValid:true,errors:[]}}function Le({formConfig:r,store:e,conditionsHelpers:t}){let i=useRef(r),o=useRef(t);i.current=r,o.current=t;let s=useCallback(async(n,u)=>{let p=i.current.allFields.find(d=>d.id===n);if(!p){let d=L(n);if(d&&i.current.repeatableFields){let F=i.current.repeatableFields[d.repeatableId];if(F){let g=F.allFields.find(c=>c.id===d.fieldId);g&&(p={...g,id:n});}}}let f=e.getState();if(!p)return ne();if(!o.current.isFieldVisible(n))return f._setErrors(n,[]),f._setValidationState(n,"valid"),ne();if(!p.validation||!hasUnifiedValidation(p.validation)){let d=o.current.isFieldRequired(n),F=u!==void 0?u:f.values[n];if(d&&isEmptyValue(F)){let g={isValid:false,errors:[{message:"This field is required",code:"CONDITIONAL_REQUIRED"}]};return f._setErrors(n,g.errors),f._setValidationState(n,"invalid"),g}return f._setErrors(n,[]),f._setValidationState(n,"valid"),ne()}let m=u!==void 0?u:f.values[n],l=createValidationContext({fieldId:n,formId:i.current.id,allFormData:{...f.values,[n]:m}});f._setValidationState(n,"validating");try{let d=await validateWithUnifiedConfig(p.validation,m,l);if(o.current.isFieldRequired(n)&&isEmptyValue(m)&&!d.errors.some(c=>c.code==="REQUIRED"||c.message.toLowerCase().includes("required"))){let c={isValid:!1,errors:[{message:"This field is required",code:"CONDITIONAL_REQUIRED"},...d.errors]};return f._setErrors(n,c.errors),f._setValidationState(n,"invalid"),c}return f._setErrors(n,d.errors),f._setValidationState(n,d.isValid?"valid":"invalid"),d}catch(d){let F={isValid:false,errors:[{message:d instanceof Error?d.message:"Validation failed",code:"VALIDATION_ERROR"}]};return f._setErrors(n,F.errors),f._setValidationState(n,"invalid"),F}},[e]),a=useCallback(async()=>{let n=e.getState(),u=i.current.allFields.filter(c=>{if(!o.current.isFieldVisible(c.id))return false;let b=c.validation&&hasUnifiedValidation(c.validation),k=o.current.isFieldRequired(c.id);return b||k}),p=i.current.allFields.filter(c=>!o.current.isFieldVisible(c.id));for(let c of p)n._setErrors(c.id,[]),n._setValidationState(c.id,"valid");let f=await Promise.all(u.map(c=>s(c.id))),m=f.some(c=>!c.isValid),l=i.current.repeatableFields??{},d=[];for(let[c,R]of Object.entries(l)){let b=n._repeatableOrder[c]??[];for(let k of b)for(let O of R.allFields){let P=V(c,k,O.id);if(!o.current.isFieldVisible(P)){n._setErrors(P,[]),n._setValidationState(P,"valid");continue}let D=await s(P);d.push(D);}R.min!==void 0&&b.length<R.min&&d.push({isValid:false,errors:[{message:`At least ${R.min} item(s) required`,code:"REPEATABLE_MIN_COUNT",path:c}]});}let F=d.some(c=>!c.isValid);m=m||F;let g=ne();if(i.current.validation&&hasUnifiedValidation(i.current.validation)){let c=Object.keys(n.values).reduce((b,k)=>(o.current.isFieldVisible(k)&&(b[k]=n.values[k]),b),{}),R=createValidationContext({formId:i.current.id,allFormData:c});try{g=await validateFormWithUnifiedConfig(i.current.validation,c,R);}catch(b){g={isValid:false,errors:[{message:b instanceof Error?b.message:"Form validation failed",code:"FORM_VALIDATION_ERROR"}]};}}return {isValid:!m&&g.isValid,errors:[...f.flatMap(c=>c.errors),...d.flatMap(c=>c.errors),...g.errors]}},[e,s]);return {validateField:s,validateForm:a}}function ve(r){let e=S(),{formConfig:t}=E(),i=pe(r),o=t.repeatableFields?.[r],s=useMemo(()=>o?new Set(o.allFields.map(l=>l.id)):new Set,[o]),a=useMemo(()=>o?i.map((l,d)=>{let F=o.allFields.map(c=>{let R=V(r,l,c.id),b=c.conditions?Y(c.conditions,r,l,s):void 0;return {...c,id:R,conditions:b}}),g=o.rows.map(c=>({...c,fields:c.fields.map(R=>{let b=V(r,l,R.id),k=R.conditions?Y(R.conditions,r,l,s):void 0;return {...R,id:b,conditions:k}})}));return {key:l,index:d,rows:g,allFields:F}}):[],[r,i,o,s]),n=useMemo(()=>o?o.max===void 0?true:i.length<o.max:false,[o,i.length]),u=useMemo(()=>{if(!o)return false;let l=o.min??0;return i.length>l},[o,i.length]),p=useCallback(l=>{e.getState()._appendRepeatableItem(r,l);},[e,r]),f=useCallback(l=>{e.getState()._removeRepeatableItem(r,l);},[e,r]),m=useCallback((l,d)=>{e.getState()._moveRepeatableItem(r,l,d);},[e,r]);return {items:a,append:p,remove:f,move:m,canAdd:n,canRemove:u,count:i.length}}function xt({formConfig:r,enabled:e=true}){let t=getGlobalMonitor(),i=useRef(null),o=useRef(0),s=useRef(0);useEffect(()=>{t&&e&&(i.current=t.getProfiler());},[t,e]);let a=useCallback(l=>{if(!t||!e)return;o.current++;let d={formId:r.id,fieldCount:r.allFields.length,timestamp:Date.now(),duration:0,renderDuration:0,validationDuration:0,validationErrors:0,renderCount:l||o.current};t.track("component_render",`form_${r.id}`,{formId:r.id,fieldCount:r.allFields.length,renderCount:o.current},d,"low");},[t,e,r.id,r.allFields.length]),n=useCallback((l,d)=>{if(!t||!e)return;let F=i.current?.getMetrics(`form_validation_${r.id}`),g={formId:r.id,fieldCount:d||r.allFields.length,timestamp:Date.now(),duration:F?.duration||0,renderDuration:0,validationDuration:F?.duration||0,validationErrors:l,renderCount:o.current};t.track("form_validation",`form_${r.id}`,{formId:r.id,validationErrors:l,fieldCount:d||r.allFields.length},g,l>0?"medium":"low");},[t,e,r.id,r.allFields.length]),u=useCallback((l,d)=>{if(!t||!e)return;let F=i.current?.getMetrics(`form_submission_${r.id}`),g={formId:r.id,fieldCount:d||r.allFields.length,timestamp:Date.now(),duration:F?.duration||0,renderDuration:0,validationDuration:0,validationErrors:l?0:1,renderCount:o.current};t.track("form_submission",`form_${r.id}`,{formId:r.id,success:l,fieldCount:d||r.allFields.length,fieldChanges:s.current},g,l?"low":"high");},[t,e,r.id,r.allFields.length]),p=useCallback((l,d)=>{!t||!e||(s.current++,t.track("component_update",`field_${l}`,{formId:r.id,fieldId:l,componentType:d,changeCount:s.current},void 0,"low"));},[t,e,r.id]),f=useCallback(l=>{!i.current||!e||i.current.start(l,{formId:r.id,renderCount:o.current});},[e,r.id]),m=useCallback(l=>{if(!i.current||!e)return null;let d=i.current.end(l);return d?{...d,formId:r.id,fieldCount:r.allFields.length,renderDuration:d.duration,validationDuration:0,validationErrors:0}:null},[e,r.id,r.allFields.length]);return {trackFormRender:a,trackFormValidation:n,trackFormSubmission:u,trackFieldChange:p,startPerformanceTracking:f,endPerformanceTracking:m}}var Ye=createContext(null);function E(){let r=useContext(Ye);if(!r)throw new Error("useFormConfigContext must be used within a FormProvider");return r}function xe({children:r,formConfig:e,defaultValues:t={},onSubmit:i,onFieldChange:o,className:s}){let[a]=useState(()=>{let _=e.repeatableFields??{},C={...t},h={},y={};if(Object.keys(_).some(v=>Array.isArray(t[v]))){let v=re(t,_);C=v.values,h=v.order,y=v.nextKeys;}for(let[v,B]of Object.entries(_))if(!h[v]){let Z=B.min??0,K=[],U=y[v]??0;for(let N=0;N<Z;N++){let W=`k${U}`;K.push(W);for(let ee of B.allFields){let tt=V(v,W,ee.id);C[tt]=B.defaultValue?.[ee.id]??void 0;}U++;}h[v]=K,y[v]=U;}let M=ue(C),x=M.getState();for(let[v,B]of Object.entries(_))x._setRepeatableConfig(v,B);return M.setState({_repeatableOrder:h,_repeatableNextKey:y}),M}),n=useRef(e.id),u=useRef(o);u.current=o,useEffect(()=>u.current?a.subscribe(C=>C.values,(C,h)=>{for(let y of Object.keys(C))C[y]!==h[y]&&u.current?.(y,C[y],C);}):void 0,[a]),useEffect(()=>{if(n.current!==e.id){n.current=e.id;let _=e.repeatableFields??{},C={...t},h={},y={};if(Object.keys(_).some(x=>Array.isArray(t[x]))){let x=re(t,_);C=x.values,h=x.order,y=x.nextKeys;}for(let[x,v]of Object.entries(_))if(!h[x]){let B=v.min??0,Z=[],K=y[x]??0;for(let U=0;U<B;U++){let N=`k${K}`;Z.push(N);for(let W of v.allFields){let ee=V(x,N,W.id);C[ee]=v.defaultValue?.[W.id]??void 0;}K++;}h[x]=Z,y[x]=K;}a.getState()._reset(C);let M=a.getState();for(let[x,v]of Object.entries(_))M._setRepeatableConfig(x,v);a.setState({_repeatableOrder:h,_repeatableNextKey:y});}},[e.id,e.repeatableFields,a,t]);let[p,f]=useState(()=>a.getState().values);useEffect(()=>a.subscribe(C=>C.values,C=>f(C)),[a]);let[m,l]=useState(()=>a.getState()._repeatableOrder);useEffect(()=>a.subscribe(C=>C._repeatableOrder,C=>l(C)),[a]);let{fieldConditions:d,hasConditionalFields:F,getFieldCondition:g,isFieldVisible:c,isFieldDisabled:R,isFieldRequired:b,isFieldReadonly:k}=Ue({formConfig:e,formValues:p,repeatableOrder:m});useEffect(()=>{for(let[_,C]of Object.entries(d)){let h={visible:C.visible,disabled:C.disabled,required:C.required,readonly:C.readonly};a.getState()._setFieldConditions(_,h);}},[d,a]);let O=useMemo(()=>({hasConditionalFields:F,getFieldCondition:g,isFieldVisible:c,isFieldDisabled:R,isFieldRequired:b,isFieldReadonly:k}),[F,g,c,R,b,k]),{validateField:P,validateForm:D}=Le({formConfig:e,store:a,conditionsHelpers:O}),{submit:q}=$e({store:a,onSubmit:i,validateForm:D}),X=useMemo(()=>({formConfig:e,conditionsHelpers:O,validateField:P,validateForm:D,submit:q}),[e,O,P,D,q]);return jsx(oe.Provider,{value:a,children:jsx(Ye.Provider,{value:X,children:jsx("form",{onSubmit:q,className:s,noValidate:true,children:r})})})}function Et({formConfig:r,defaultValues:e,onSubmit:t,onFieldChange:i,className:o,children:s}){let a=useMemo(()=>r instanceof T?r.build():r,[r]);return jsx(xe,{formConfig:a,defaultValues:e,onSubmit:t,onFieldChange:i,className:o,children:s})}var Q=Ot.memo(function({fieldId:e,fieldConfig:t,disabled:i=false,customProps:o={},className:s,forceVisible:a=false}){let{formConfig:n,validateField:u,conditionsHelpers:p}=E(),f=ce(e),m=me(e),l=$(e),{setValue:d,setTouched:F}=Fe(e),g=useMemo(()=>{if(t)return t;let h=n.allFields.find(A=>A.id===e);if(h)return h;let y=L(e);if(y&&n.repeatableFields){let A=n.repeatableFields[y.repeatableId];if(A){let M=A.allFields.find(x=>x.id===y.fieldId);if(M)return {...M,id:e}}}},[t,n.allFields,n.repeatableFields,e]);if(!g)throw new Error(`Field with ID "${e}" not found`);let c=n.config.getComponent(g.componentId);if(!c)throw new Error(`Component with ID "${g.componentId}" not found`);let R=m.validationState==="validating",b=useMemo(()=>({isVisible:a||l.visible,isFieldDisabled:i||l.disabled,isFieldRequired:l.required||p.isFieldRequired(e),isFieldReadonly:l.readonly}),[a,i,l,p,e]),k=useCallback(async h=>{d(h),(g.validation?.validateOnChange||m.touched)&&await u(e,h);},[e,d,u,g.validation?.validateOnChange,m.touched]),O=useCallback(async()=>{m.touched||F(),g.validation?.validateOnBlur!==false&&await u(e);},[e,m.touched,F,u,g.validation?.validateOnBlur]),P=useMemo(()=>({...c.defaultProps??{},...g.props,...o,disabled:b.isFieldDisabled,required:b.isFieldRequired,readOnly:b.isFieldReadonly}),[c.defaultProps,g.props,o,b.isFieldDisabled,b.isFieldRequired,b.isFieldReadonly]),D=useMemo(()=>({id:e,props:P,value:f,onChange:k,onBlur:O,disabled:b.isFieldDisabled,error:m.errors,isValidating:R,touched:m.touched}),[e,P,f,k,O,b.isFieldDisabled,m.errors,R,m.touched]);if(!b.isVisible)return null;let q=c.renderer(D),X=n.renderConfig?.fieldRenderer,_=c.useFieldRenderer!==false,C=X&&_?X({children:q,id:e,...P,error:m.errors,isValidating:R,touched:m.touched}):q;return jsx("div",{className:s,"data-field-id":e,"data-field-type":c.type,"data-field-visible":b.isVisible,"data-field-disabled":b.isFieldDisabled,"data-field-required":b.isFieldRequired,"data-field-readonly":b.isFieldReadonly,children:C})});var Qe=Ot.memo(function({row:e,className:t,...i}){let{formConfig:o,conditionsHelpers:s}=E(),a=useMemo(()=>e.fields.filter(p=>s.isFieldVisible(p.id)),[e.fields,s]),n=useMemo(()=>a.map(p=>jsx(Q,{fieldId:p.id},p.id)),[a]),u=useMemo(()=>({row:e,children:n,className:t}),[e,n,t]);return a.length===0?null:jsx(ComponentRendererWrapper,{name:"FormRow",renderer:o.renderConfig?.rowRenderer,props:u,...i,children:n})}),le=Qe;var ke=Ot.memo(function({item:e,index:t,total:i,canRemove:o,canMoveUp:s,canMoveDown:a,onRemove:n,onMoveUp:u,onMoveDown:p}){let{formConfig:f}=E(),m=useMemo(()=>new Map(e.allFields.map(F=>[F.id,F])),[e.allFields]),l=useMemo(()=>e.rows.map(F=>jsx(le,{row:F,children:F.fields.map(g=>jsx(Q,{fieldId:g.id,fieldConfig:m.get(g.id)},g.id))},F.id)),[e.rows,m]),d=f.renderConfig?.repeatableItemRenderer;return d?d({item:e,index:t,total:i,canRemove:o,canMoveUp:s,canMoveDown:a,onRemove:n,onMoveUp:u,onMoveDown:p,children:l}):jsx("div",{"data-repeatable-item":e.key,"data-repeatable-index":t,children:l})});var Ee=Ot.memo(function({repeatableId:e,repeatableConfig:t,className:i}){let{formConfig:o}=E(),{items:s,append:a,remove:n,move:u,canAdd:p,canRemove:f}=ve(e),m=useMemo(()=>s.map((d,F)=>jsx(ke,{item:d,index:F,total:s.length,canRemove:f,canMoveUp:F>0,canMoveDown:F<s.length-1,onRemove:()=>n(d.key),onMoveUp:()=>u(F,F-1),onMoveDown:()=>u(F,F+1)},d.key)),[s,f,n,u]),l=o.renderConfig?.repeatableRenderer;return l?l({repeatableId:e,items:s,canAdd:p,canRemove:f,onAdd:()=>a(),min:t.min,max:t.max,children:m}):jsxs("div",{className:i,"data-repeatable-id":e,children:[m,p&&jsx("button",{type:"button",onClick:()=>a(),"data-repeatable-add":e,children:"Add"})]})});var It=Ot.memo(function({className:e,...t}){let{formConfig:i}=E(),o=useMemo(()=>i.rows.map(a=>a.kind==="repeatable"?jsx(Ee,{repeatableId:a.repeatable.id,repeatableConfig:a.repeatable},a.id):jsx(le,{row:a},a.id)),[i.rows]),s=useMemo(()=>({formConfig:i,children:o,className:e}),[i,o,e]);return jsx(ComponentRendererWrapper,{name:"FormBody",renderer:i.renderConfig?.bodyRenderer,props:s,...t,children:o})});var Lt=Ot.memo(function({className:e,isSubmitting:t,...i}){let{formConfig:o,submit:s}=E(),{isSubmitting:a}=fe(),n=useMemo(()=>({isSubmitting:t??a,onSubmit:s,className:e}),[t,a,s,e]);return jsx(ComponentRendererWrapper,{name:"FormSubmitButton",renderer:o.renderConfig?.submitButtonRenderer,props:n,...i})});export{Et as Form,It as FormBody,T as FormBuilder,Q as FormField,xe as FormProvider,Qe as FormRow,oe as FormStoreContext,Lt as FormSubmitButton,j as RepeatableBuilder,Ee as RepeatableField,ke as RepeatableItem,ue as createFormStore,re as flattenRepeatableValues,T as form,de as structureFormValues,er as useConditionEvaluation,pr as useConditionEvaluator,Fe as useFieldActions,$ as useFieldConditions,fr as useFieldConditionsLazy,Fr as useFieldConditionsWithRefresh,dt as useFieldErrors,me as useFieldState,ut as useFieldTouched,ct as useFieldValidationState,ce as useFieldValue,Ct as useFormActions,Ue as useFormConditions,E as useFormConfigContext,Ft as useFormDirty,xt as useFormMonitoring,S as useFormStore,H as useFormStoreApi,$e as useFormSubmissionWithStore,fe as useFormSubmitState,ft as useFormSubmitting,pt as useFormValid,Le as useFormValidationWithStore,gt as useFormValues,Te as useMultipleConditionEvaluation,ve as useRepeatableField,pe as useRepeatableKeys};
|
|
1
|
+
import Mt,{createContext,useMemo,useCallback,useContext,useRef,useEffect,useState}from'react';import {ComponentRendererWrapper,IdGenerator,deepClone,ensureUnique,hasUnifiedValidation,isEmptyValue,createValidationContext,validateWithUnifiedConfig,validateFormWithUnifiedConfig,getGlobalMonitor,evaluateCondition}from'@rilaykit/core';import {useStore,createStore}from'zustand';import {subscribeWithSelector}from'zustand/middleware';import {jsx,jsxs}from'react/jsx-runtime';var W=class{constructor(e){this.innerForm=new T(e,"__repeatable_template__");}add(...e){return this.innerForm.add(...e),this}addSeparateRows(e){return this.innerForm.addSeparateRows(e),this}min(e){return this._min=e,this}max(e){return this._max=e,this}defaultValue(e){return this._defaultValue=e,this}validation(e){return this._validation=e,this}_build(e){let t=this.innerForm.getRows(),i=this.innerForm.getFields();if(t.length===0)throw new Error(`Repeatable "${e}" must have at least one field`);for(let o of i)if(o.id.includes("[")||o.id.includes("]"))throw new Error(`Repeatable template field ID "${o.id}" cannot contain "[" or "]" (reserved for composite keys)`);if(this._min!==void 0&&this._max!==void 0&&this._min>this._max)throw new Error(`Repeatable "${e}": min (${this._min}) cannot be greater than max (${this._max})`);return {id:e,rows:t.map(o=>({...o,kind:"fields"})),allFields:i,min:this._min,max:this._max,defaultValue:this._defaultValue,validation:this._validation}}_hasRepeatables(){return this.innerForm.getRows().some(e=>"kind"in e&&e.kind==="repeatable")}};var T=class r{constructor(e,t){this.rows=[];this.idGenerator=new IdGenerator;this.config=e,this.formId=t||`form-${Math.random().toString(36).substring(2,15)}`;}static create(e,t){return new r(e,t)}createFormField(e){let t=this.config.getComponent(e.type);if(!t)throw new Error(`No component found with type "${e.type}"`);let i;return (t.validation||e.validation)&&(i={validateOnChange:e.validation?.validateOnChange??t.validation?.validateOnChange,validateOnBlur:e.validation?.validateOnBlur??t.validation?.validateOnBlur,debounceMs:e.validation?.debounceMs??t.validation?.debounceMs,validate:(()=>{let o=t.validation?.validate,s=e.validation?.validate;if(!o)return s;if(!s)return o;let a=Array.isArray(o)?o:[o],n=Array.isArray(s)?s:[s];return [...a,...n]})()}),{id:e.id||this.idGenerator.next("field"),componentId:t.id,props:{...t.defaultProps,...e.props},validation:i,conditions:e.conditions}}createRow(e){if(e.length===0)throw new Error("At least one field is required");if(e.length>3)throw new Error("Maximum 3 fields per row");let t=e.map(i=>this.createFormField(i));return {kind:"fields",id:this.idGenerator.next("row"),fields:t,maxColumns:e.length}}add(...e){let t,i=false;if(e.length===1&&Array.isArray(e[0])?(t=e[0],i=true):t=e,t.length===0)throw new Error("At least one field is required");if(i&&t.length>3)throw new Error("Maximum 3 fields per row");if(t.length===1){let o=this.createRow(t);return this.rows.push(o),this}if(t.length<=3){let o=this.createRow(t);return this.rows.push(o),this}for(let o of t){let s=this.createRow([o]);this.rows.push(s);}return this}addSeparateRows(e){for(let t of e)this.add(t);return this}addRepeatable(e,t){if(e.includes("[")||e.includes("]"))throw new Error(`Repeatable ID "${e}" cannot contain "[" or "]" (reserved for composite keys)`);let i=new W(this.config),o=t(i);if(o._hasRepeatables())throw new Error(`Nested repeatables are not supported (in repeatable "${e}")`);let s=o._build(e),a={kind:"repeatable",id:this.idGenerator.next("repeatable"),repeatable:s};return this.rows.push(a),this}setId(e){return this.formId=e,this}updateField(e,t){let i=this.findField(e);if(!i)throw new Error(`Field with ID "${e}" not found`);return Object.assign(i,{...t,props:{...i.props,...t.props}}),this}findField(e){for(let t of this.rows)if(t.kind==="fields"){let i=t.fields.find(o=>o.id===e);if(i)return i}else {let i=t.repeatable.allFields.find(o=>o.id===e);if(i)return i}return null}removeField(e){return this.rows=this.rows.map(t=>t.kind==="repeatable"?t:{...t,fields:t.fields.filter(i=>i.id!==e)}).filter(t=>t.kind==="repeatable"||t.fields.length>0),this}getField(e){return this.findField(e)||void 0}getFields(){return this.rows.filter(e=>e.kind==="fields").flatMap(e=>e.fields)}getRows(){return [...this.rows]}clear(){return this.rows=[],this.idGenerator.reset(),this}setValidation(e){return this.formValidation=e,this}setSubmitOptions(e){return this._submitOptions=e,this}addFieldValidation(e,t){console.warn("addFieldValidation is deprecated. Use updateField with validation.validate property instead.");let i=this.findField(e);if(!i)throw new Error(`Field with ID "${e}" not found`);let o={...i.validation,...t};return this.updateField(e,{validation:o})}addFieldConditions(e,t){let i=this.findField(e);if(!i)throw new Error(`Field with ID "${e}" not found`);let o={...i.conditions,...t};return this.updateField(e,{conditions:o})}clone(e){let t=new r(this.config,e||`${this.formId}-clone`);return t.rows=deepClone(this.rows),t}validate(){let e=[],t=this.getFields(),i=this.rows.filter(n=>n.kind==="repeatable"),o=i.flatMap(n=>n.repeatable.allFields),s=[...t.map(n=>n.id),...o.map(n=>n.id)];try{ensureUnique(s,"field");}catch(n){e.push(n instanceof Error?n.message:String(n));}let a=i.map(n=>n.repeatable.id);try{ensureUnique(a,"repeatable");}catch(n){e.push(n instanceof Error?n.message:String(n));}for(let n of t)this.config.hasComponent(n.componentId)||e.push(`Component "${n.componentId}" not found for field "${n.id}"`);for(let n of o)this.config.hasComponent(n.componentId)||e.push(`Component "${n.componentId}" not found for repeatable template field "${n.id}"`);for(let n of this.rows)n.kind==="fields"&&(n.fields.length>3&&e.push(`Row "${n.id}" has ${n.fields.length} fields, maximum is 3`),n.fields.length===0&&e.push(`Row "${n.id}" is empty`));for(let n of t)(n.id.includes("[")||n.id.includes("]"))&&e.push(`Field ID "${n.id}" cannot contain "[" or "]" (reserved for repeatable composite keys)`);for(let n of a)(n.includes("[")||n.includes("]"))&&e.push(`Repeatable ID "${n}" cannot contain "[" or "]" (reserved for composite keys)`);return e}build(){let e=this.validate();if(e.length>0)throw new Error(`Form validation failed: ${e.join(", ")}`);let t=this.rows.filter(o=>o.kind==="repeatable"),i=t.length>0?Object.fromEntries(t.map(o=>[o.repeatable.id,o.repeatable])):void 0;return {id:this.formId,rows:[...this.rows],allFields:this.getFields(),repeatableFields:i,config:this.config,renderConfig:this.config.getFormRenderConfig(),validation:this.formValidation,submitOptions:this._submitOptions}}toJSON(){return {id:this.formId,rows:this.rows}}fromJSON(e){return e.id&&(this.formId=e.id),e.rows&&(this.rows=e.rows.map(t=>t.kind?t:{...t,kind:"fields"})),this}getStats(){let e=this.getFields(),t=this.rows.filter(s=>s.kind==="fields"),i=this.rows.filter(s=>s.kind==="repeatable"),o=t.map(s=>s.fields.length);return {totalFields:e.length,totalRows:this.rows.length,averageFieldsPerRow:t.length>0?e.length/t.length:0,maxFieldsInRow:o.length>0?Math.max(...o):0,minFieldsInRow:o.length>0?Math.min(...o):0,totalRepeatables:i.length,totalRepeatableFields:i.reduce((s,a)=>s+a.repeatable.allFields.length,0)}}};function tr(r,e={},t={}){return useMemo(()=>{if(!r)return {visible:t.visible??true,disabled:t.disabled??false,required:t.required??false,readonly:t.readonly??false};let i=o=>{try{return o&&typeof o=="object"&&"build"in o?evaluateCondition(o.build(),e):evaluateCondition(o,e)}catch(s){return console.warn("Error evaluating condition:",s),false}};return {visible:r.visible?i(r.visible):t.visible??true,disabled:r.disabled?i(r.disabled):t.disabled??false,required:r.required?i(r.required):t.required??false,readonly:r.readonly?i(r.readonly):t.readonly??false}},[r,e,t])}function Te(r,e={}){return useMemo(()=>{let t={};for(let[i,o]of Object.entries(r))if(t[i]={visible:true,disabled:false,required:false,readonly:false},o){let s=a=>{try{return a&&typeof a=="object"&&"build"in a?evaluateCondition(a.build(),e):evaluateCondition(a,e)}catch(n){return console.warn(`Error evaluating condition for field ${i}:`,n),false}};t[i]={visible:o.visible?s(o.visible):true,disabled:o.disabled?s(o.disabled):false,required:o.required?s(o.required):false,readonly:o.readonly?s(o.readonly):false};}return t},[r,e])}var nt=/^([^[\]]+)\[([^\]]+)\]\.(.+)$/;function V(r,e,t){return `${r}[${e}].${t}`}function L(r){let e=nt.exec(r);return e?{repeatableId:e[1],itemKey:e[2],fieldId:e[3]}:null}function re(r,e,t){let i={},o=new Set;for(let[s,a]of Object.entries(t)){if(!e[s])continue;let n=e[s],f=[];for(let p of a){let m={};for(let c of n.allFields){let l=V(s,p,c.id);l in r&&(m[c.id]=r[l],o.add(l));}f.push(m);}i[s]=f;}for(let[s,a]of Object.entries(r))!o.has(s)&&!L(s)&&(i[s]=a);return i}function oe(r,e){let t={},i={},o={};for(let[s,a]of Object.entries(r))if(e[s]&&Array.isArray(a)){let n=[],f=0;for(let p of a){let m=`k${f}`;n.push(m);for(let[c,l]of Object.entries(p))t[V(s,m,c)]=l;f++;}i[s]=n,o[s]=f;}else t[s]=a;return {values:t,order:i,nextKeys:o}}function ue(r={}){return createStore()(subscribeWithSelector((e,t)=>({values:{...r},errors:{},validationStates:{},touched:{},isDirty:false,isSubmitting:false,isValid:true,_defaultValues:{...r},_fieldConditions:{},_repeatableConfigs:{},_repeatableOrder:{},_repeatableNextKey:{},_setValue:(i,o)=>{e(s=>({values:{...s.values,[i]:o},isDirty:true}));},_setTouched:i=>{e(o=>({touched:{...o.touched,[i]:true}}));},_setErrors:(i,o)=>{e(s=>{let a={...s.errors,[i]:o},n=o.length>0?"invalid":"valid";return {errors:a,validationStates:{...s.validationStates,[i]:n}}}),t()._updateIsValid();},_clearErrors:i=>{e(o=>{let s={...o.errors};return delete s[i],{errors:s,validationStates:{...o.validationStates,[i]:"idle"}}}),t()._updateIsValid();},_setValidationState:(i,o)=>{e(s=>({validationStates:{...s.validationStates,[i]:o}}));},_setSubmitting:i=>{e({isSubmitting:i});},_reset:i=>{let o=i??t()._defaultValues;e({values:{...o},errors:{},validationStates:{},touched:{},isDirty:false,isSubmitting:false,isValid:true,_repeatableOrder:{},_repeatableNextKey:{}});},_setFieldConditions:(i,o)=>{e(s=>({_fieldConditions:{...s._fieldConditions,[i]:o}}));},_updateIsValid:()=>{let i=t(),o=Object.values(i.errors).some(a=>a&&a.length>0),s=Object.values(i.validationStates).some(a=>a==="invalid");e({isValid:!o&&!s});},_setRepeatableConfig:(i,o)=>{e(s=>({_repeatableConfigs:{...s._repeatableConfigs,[i]:o}}));},_appendRepeatableItem:(i,o)=>{let s=t(),a=s._repeatableConfigs[i];if(!a)return null;let n=s._repeatableOrder[i]??[];if(a.max!==void 0&&n.length>=a.max)return null;let f=s._repeatableNextKey[i]??0,p=`k${f}`,m=o??a.defaultValue??{},c={...s.values};for(let l of a.allFields){let d=V(i,p,l.id);c[d]=m[l.id]??void 0;}return e({values:c,isDirty:true,_repeatableOrder:{...s._repeatableOrder,[i]:[...n,p]},_repeatableNextKey:{...s._repeatableNextKey,[i]:f+1}}),p},_removeRepeatableItem:(i,o)=>{let s=t(),a=s._repeatableConfigs[i];if(!a)return false;let n=s._repeatableOrder[i]??[];if(a.min!==void 0&&n.length<=a.min||!n.includes(o))return false;let f=n.filter(F=>F!==o),p={...s.values},m={...s.errors},c={...s.validationStates},l={...s.touched},d={...s._fieldConditions};for(let F of a.allFields){let g=V(i,o,F.id);delete p[g],delete m[g],delete c[g],delete l[g],delete d[g];}return e({values:p,errors:m,validationStates:c,touched:l,isDirty:true,_fieldConditions:d,_repeatableOrder:{...s._repeatableOrder,[i]:f}}),t()._updateIsValid(),true},_moveRepeatableItem:(i,o,s)=>{let a=t(),n=a._repeatableOrder[i];if(!n||o<0||o>=n.length||s<0||s>=n.length||o===s)return;let f=[...n],[p]=f.splice(o,1);f.splice(s,0,p),e({_repeatableOrder:{...a._repeatableOrder,[i]:f}});},_insertRepeatableItem:(i,o,s)=>{let a=t(),n=a._repeatableConfigs[i];if(!n)return null;let f=a._repeatableOrder[i]??[];if(n.max!==void 0&&f.length>=n.max)return null;let p=a._repeatableNextKey[i]??0,m=`k${p}`,c=s??n.defaultValue??{},l={...a.values};for(let g of n.allFields){let u=V(i,m,g.id);l[u]=c[g.id]??void 0;}let d=[...f],F=Math.max(0,Math.min(o,d.length));return d.splice(F,0,m),e({values:l,isDirty:true,_repeatableOrder:{...a._repeatableOrder,[i]:d},_repeatableNextKey:{...a._repeatableNextKey,[i]:p+1}}),m}})))}var ie=createContext(null);function S(){let r=useContext(ie);if(!r)throw new Error("useFormStore must be used within a FormProvider");return r}var De=[];function ce(r){let e=S();return useStore(e,t=>t.values[r])}function ut(r){let e=S();return useStore(e,t=>t.errors[r]??De)}function ct(r){let e=S();return useStore(e,t=>t.touched[r]??false)}function mt(r){let e=S();return useStore(e,t=>t.validationStates[r]??"idle")}var ft={visible:true,disabled:false,required:false,readonly:false};function U(r){let e=S();return useStore(e,t=>t._fieldConditions[r]??ft)}function me(r){let e=S(),t=useStore(e,n=>n.values[r]),i=useStore(e,n=>n.errors[r]??De),o=useStore(e,n=>n.validationStates[r]??"idle"),s=useStore(e,n=>n.touched[r]??false),a=useStore(e,n=>n._defaultValues[r]);return {value:t,errors:i,validationState:o,touched:s,dirty:t!==a}}function pt(){let r=S();return useStore(r,e=>e.isSubmitting)}function Ft(){let r=S();return useStore(r,e=>e.isValid)}function gt(){let r=S();return useStore(r,e=>e.isDirty)}function bt(){let r=S();return useStore(r,e=>e.values)}function fe(){let r=S(),e=useStore(r,o=>o.isSubmitting),t=useStore(r,o=>o.isValid),i=useStore(r,o=>o.isDirty);return {isSubmitting:e,isValid:t,isDirty:i}}var Ct=[];function pe(r){let e=S();return useStore(e,t=>t._repeatableOrder[r]??Ct)}function Fe(r){let e=S();return {setValue:t=>e.getState()._setValue(r,t),setTouched:()=>e.getState()._setTouched(r),setErrors:t=>e.getState()._setErrors(r,t),clearErrors:()=>e.getState()._clearErrors(r),setValidationState:t=>e.getState()._setValidationState(r,t)}}function Rt(){let r=S();return {setValue:(e,t)=>r.getState()._setValue(e,t),setTouched:e=>r.getState()._setTouched(e),setErrors:(e,t)=>r.getState()._setErrors(e,t),setSubmitting:e=>r.getState()._setSubmitting(e),reset:e=>r.getState()._reset(e),setFieldConditions:(e,t)=>r.getState()._setFieldConditions(e,t)}}function H(){return S()}var Ae={visible:true,disabled:false,required:false,readonly:false};function Ke(r){try{return JSON.stringify(r)}catch{return String(Date.now())}}function ne(r,e){if(r)try{return typeof r=="object"&&"build"in r?evaluateCondition(r.build(),e):evaluateCondition(r,e)}catch(t){console.warn("Error evaluating condition:",t);return}}function be(r,e){if(!r)return Ae;let t=ne(r.visible,e),i=ne(r.disabled,e),o=ne(r.required,e),s=ne(r.readonly,e);return {visible:t??true,disabled:i??false,required:o??false,readonly:s??false}}function pr(r,e={}){let{conditions:t,skip:i=false}=e,o=H(),s=U(r),a=useRef(null);if(i||!t)return s;let n=o.getState().values,f=Ke(n);if(a.current?.valuesHash===f)return a.current.result;let p=be(t,n);return a.current={result:p,valuesHash:f},p}function Fr(){let r=H(),e=useRef(new Map),t=useRef("");return useMemo(()=>function(o,s){if(!s)return Ae;let a=r.getState().values,n=Ke(a);t.current!==n&&(e.current.clear(),t.current=n);let f=e.current.get(o);if(f)return f.result;let p=be(s,a);return e.current.set(o,{result:p,valuesHash:n}),p},[r])}function gr(r,e){let t=H(),i=U(r),o=useMemo(()=>()=>{if(!e)return i;let s=t.getState().values;return be(e,s)},[t,e,i]);return {conditions:i,refresh:o}}function Y(r,e,t,i){let o={};return r.visible&&(o.visible=G(r.visible,e,t,i)),r.disabled&&(o.disabled=G(r.disabled,e,t,i)),r.required&&(o.required=G(r.required,e,t,i)),r.readonly&&(o.readonly=G(r.readonly,e,t,i)),o}function G(r,e,t,i){let o=r.field&&i.has(r.field)?`${e}[${t}].${r.field}`:r.field,s=r.conditions?.map(a=>G(a,e,t,i));return {...r,field:o,conditions:s}}function Ie({formConfig:r,formValues:e,repeatableOrder:t}){let i=useMemo(()=>{let c={};for(let l of r.allFields)l.conditions&&(c[l.id]=l.conditions);if(t&&r.repeatableFields)for(let[l,d]of Object.entries(r.repeatableFields)){let F=t[l]??[];if(F.length===0)continue;let g=new Set(d.allFields.map(u=>u.id));for(let u of F)for(let C of d.allFields){if(!C.conditions)continue;let b=V(l,u,C.id);c[b]=Y(C.conditions,l,u,g);}}return c},[r.allFields,r.repeatableFields,t]),o=useMemo(()=>Object.keys(i).length>0,[i]),s=Te(o?i:{},o?e:{}),a=useCallback(c=>s[c],[s]),n=useCallback(c=>{let l=s[c];return l?l.visible:true},[s]),f=useCallback(c=>{let l=s[c];return l?l.disabled:false},[s]),p=useCallback(c=>{let l=s[c];return l?l.required:false},[s]),m=useCallback(c=>{let l=s[c];return l?l.readonly:false},[s]);return useMemo(()=>({fieldConditions:s,hasConditionalFields:o,getFieldCondition:a,isFieldVisible:n,isFieldDisabled:f,isFieldRequired:p,isFieldReadonly:m}),[s,o,a,n,f,p,m])}function vt(r){return typeof r=="object"&&r!==null&&"preventDefault"in r}function $e({store:r,onSubmit:e,validateForm:t,defaultSubmitOptions:i}){let o=useRef(e);o.current=e;let s=useRef(i);return s.current=i,{submit:useCallback(async n=>{let f={};vt(n)?n.preventDefault():n&&(f=n);let p={...s.current,...f},m=r.getState();if(m.isSubmitting)return false;m._setSubmitting(true);try{if(p.force){let u=r.getState(),b=Object.keys(u._repeatableConfigs).length>0?re(u.values,u._repeatableConfigs,u._repeatableOrder):u.values;return o.current&&await o.current(b),m._setSubmitting(!1),!0}let c=await t();if(!c.isValid&&!p.skipInvalid)return m._setSubmitting(!1),!1;let l=r.getState(),d=l.values;if(p.skipInvalid&&!c.isValid){let u=new Set(Object.entries(l.errors).filter(([,C])=>C.length>0).map(([C])=>C));d=Object.fromEntries(Object.entries(d).filter(([C])=>!u.has(C)));}let g=Object.keys(l._repeatableConfigs).length>0?re(d,l._repeatableConfigs,l._repeatableOrder):d;return o.current&&await o.current(g),m._setSubmitting(!1),!0}catch(c){return m._setSubmitting(false),console.error("Form submission error:",c),false}},[r,t])}}function se(){return {isValid:true,errors:[]}}function He({formConfig:r,store:e,conditionsHelpers:t}){let i=useRef(r),o=useRef(t);i.current=r,o.current=t;let s=useCallback(async(n,f)=>{let p=i.current.allFields.find(d=>d.id===n);if(!p){let d=L(n);if(d&&i.current.repeatableFields){let F=i.current.repeatableFields[d.repeatableId];if(F){let g=F.allFields.find(u=>u.id===d.fieldId);g&&(p={...g,id:n});}}}let m=e.getState();if(!p)return se();if(!o.current.isFieldVisible(n))return m._setErrors(n,[]),m._setValidationState(n,"valid"),se();if(!p.validation||!hasUnifiedValidation(p.validation)){let d=o.current.isFieldRequired(n),F=f!==void 0?f:m.values[n];if(d&&isEmptyValue(F)){let g={isValid:false,errors:[{message:"This field is required",code:"CONDITIONAL_REQUIRED"}]};return m._setErrors(n,g.errors),m._setValidationState(n,"invalid"),g}return m._setErrors(n,[]),m._setValidationState(n,"valid"),se()}let c=f!==void 0?f:m.values[n],l=createValidationContext({fieldId:n,formId:i.current.id,allFormData:{...m.values,[n]:c}});m._setValidationState(n,"validating");try{let d=await validateWithUnifiedConfig(p.validation,c,l);if(o.current.isFieldRequired(n)&&isEmptyValue(c)&&!d.errors.some(u=>u.code==="REQUIRED"||u.message.toLowerCase().includes("required"))){let u={isValid:!1,errors:[{message:"This field is required",code:"CONDITIONAL_REQUIRED"},...d.errors]};return m._setErrors(n,u.errors),m._setValidationState(n,"invalid"),u}return m._setErrors(n,d.errors),m._setValidationState(n,d.isValid?"valid":"invalid"),d}catch(d){let F={isValid:false,errors:[{message:d instanceof Error?d.message:"Validation failed",code:"VALIDATION_ERROR"}]};return m._setErrors(n,F.errors),m._setValidationState(n,"invalid"),F}},[e]),a=useCallback(async()=>{let n=e.getState(),f=i.current.allFields.filter(u=>{if(!o.current.isFieldVisible(u.id))return false;let b=u.validation&&hasUnifiedValidation(u.validation),k=o.current.isFieldRequired(u.id);return b||k}),p=i.current.allFields.filter(u=>!o.current.isFieldVisible(u.id));for(let u of p)n._setErrors(u.id,[]),n._setValidationState(u.id,"valid");let m=await Promise.all(f.map(u=>s(u.id))),c=m.some(u=>!u.isValid),l=i.current.repeatableFields??{},d=[];for(let[u,C]of Object.entries(l)){let b=n._repeatableOrder[u]??[];for(let k of b)for(let P of C.allFields){let O=V(u,k,P.id);if(!o.current.isFieldVisible(O)){n._setErrors(O,[]),n._setValidationState(O,"valid");continue}let D=await s(O);d.push(D);}C.min!==void 0&&b.length<C.min&&d.push({isValid:false,errors:[{message:`At least ${C.min} item(s) required`,code:"REPEATABLE_MIN_COUNT",path:u}]});}let F=d.some(u=>!u.isValid);c=c||F;let g=se();if(i.current.validation&&hasUnifiedValidation(i.current.validation)){let u=Object.keys(n.values).reduce((b,k)=>(o.current.isFieldVisible(k)&&(b[k]=n.values[k]),b),{}),C=createValidationContext({formId:i.current.id,allFormData:u});try{g=await validateFormWithUnifiedConfig(i.current.validation,u,C);}catch(b){g={isValid:false,errors:[{message:b instanceof Error?b.message:"Form validation failed",code:"FORM_VALIDATION_ERROR"}]};}}return {isValid:!c&&g.isValid,errors:[...m.flatMap(u=>u.errors),...d.flatMap(u=>u.errors),...g.errors]}},[e,s]);return {validateField:s,validateForm:a}}function ve(r){let e=S(),{formConfig:t}=E(),i=pe(r),o=t.repeatableFields?.[r],s=useMemo(()=>o?new Set(o.allFields.map(l=>l.id)):new Set,[o]),a=useMemo(()=>o?i.map((l,d)=>{let F=o.allFields.map(u=>{let C=V(r,l,u.id),b=u.conditions?Y(u.conditions,r,l,s):void 0;return {...u,id:C,conditions:b}}),g=o.rows.map(u=>({...u,fields:u.fields.map(C=>{let b=V(r,l,C.id),k=C.conditions?Y(C.conditions,r,l,s):void 0;return {...C,id:b,conditions:k}})}));return {key:l,index:d,rows:g,allFields:F}}):[],[r,i,o,s]),n=useMemo(()=>o?o.max===void 0?true:i.length<o.max:false,[o,i.length]),f=useMemo(()=>{if(!o)return false;let l=o.min??0;return i.length>l},[o,i.length]),p=useCallback(l=>{e.getState()._appendRepeatableItem(r,l);},[e,r]),m=useCallback(l=>{e.getState()._removeRepeatableItem(r,l);},[e,r]),c=useCallback((l,d)=>{e.getState()._moveRepeatableItem(r,l,d);},[e,r]);return {items:a,append:p,remove:m,move:c,canAdd:n,canRemove:f,count:i.length}}function xt({formConfig:r,enabled:e=true}){let t=getGlobalMonitor(),i=useRef(null),o=useRef(0),s=useRef(0);useEffect(()=>{t&&e&&(i.current=t.getProfiler());},[t,e]);let a=useCallback(l=>{if(!t||!e)return;o.current++;let d={formId:r.id,fieldCount:r.allFields.length,timestamp:Date.now(),duration:0,renderDuration:0,validationDuration:0,validationErrors:0,renderCount:l||o.current};t.track("component_render",`form_${r.id}`,{formId:r.id,fieldCount:r.allFields.length,renderCount:o.current},d,"low");},[t,e,r.id,r.allFields.length]),n=useCallback((l,d)=>{if(!t||!e)return;let F=i.current?.getMetrics(`form_validation_${r.id}`),g={formId:r.id,fieldCount:d||r.allFields.length,timestamp:Date.now(),duration:F?.duration||0,renderDuration:0,validationDuration:F?.duration||0,validationErrors:l,renderCount:o.current};t.track("form_validation",`form_${r.id}`,{formId:r.id,validationErrors:l,fieldCount:d||r.allFields.length},g,l>0?"medium":"low");},[t,e,r.id,r.allFields.length]),f=useCallback((l,d)=>{if(!t||!e)return;let F=i.current?.getMetrics(`form_submission_${r.id}`),g={formId:r.id,fieldCount:d||r.allFields.length,timestamp:Date.now(),duration:F?.duration||0,renderDuration:0,validationDuration:0,validationErrors:l?0:1,renderCount:o.current};t.track("form_submission",`form_${r.id}`,{formId:r.id,success:l,fieldCount:d||r.allFields.length,fieldChanges:s.current},g,l?"low":"high");},[t,e,r.id,r.allFields.length]),p=useCallback((l,d)=>{!t||!e||(s.current++,t.track("component_update",`field_${l}`,{formId:r.id,fieldId:l,componentType:d,changeCount:s.current},void 0,"low"));},[t,e,r.id]),m=useCallback(l=>{!i.current||!e||i.current.start(l,{formId:r.id,renderCount:o.current});},[e,r.id]),c=useCallback(l=>{if(!i.current||!e)return null;let d=i.current.end(l);return d?{...d,formId:r.id,fieldCount:r.allFields.length,renderDuration:d.duration,validationDuration:0,validationErrors:0}:null},[e,r.id,r.allFields.length]);return {trackFormRender:a,trackFormValidation:n,trackFormSubmission:f,trackFieldChange:p,startPerformanceTracking:m,endPerformanceTracking:c}}var ze=createContext(null);function E(){let r=useContext(ze);if(!r)throw new Error("useFormConfigContext must be used within a FormProvider");return r}function _e({children:r,formConfig:e,defaultValues:t={},onSubmit:i,onFieldChange:o,className:s}){let[a]=useState(()=>{let x=e.repeatableFields??{},R={...t},h={},y={};if(Object.keys(x).some(v=>Array.isArray(t[v]))){let v=oe(t,x);R=v.values,h=v.order,y=v.nextKeys;}for(let[v,B]of Object.entries(x))if(!h[v]){let Z=B.min??0,K=[],I=y[v]??0;for(let N=0;N<Z;N++){let j=`k${I}`;K.push(j);for(let ee of B.allFields){let rt=V(v,j,ee.id);R[rt]=B.defaultValue?.[ee.id]??void 0;}I++;}h[v]=K,y[v]=I;}let M=ue(R),_=M.getState();for(let[v,B]of Object.entries(x))_._setRepeatableConfig(v,B);return M.setState({_repeatableOrder:h,_repeatableNextKey:y}),M}),n=useRef(e.id),f=useRef(o);f.current=o,useEffect(()=>f.current?a.subscribe(R=>R.values,(R,h)=>{for(let y of Object.keys(R))R[y]!==h[y]&&f.current?.(y,R[y],R);}):void 0,[a]),useEffect(()=>{if(n.current!==e.id){n.current=e.id;let x=e.repeatableFields??{},R={...t},h={},y={};if(Object.keys(x).some(_=>Array.isArray(t[_]))){let _=oe(t,x);R=_.values,h=_.order,y=_.nextKeys;}for(let[_,v]of Object.entries(x))if(!h[_]){let B=v.min??0,Z=[],K=y[_]??0;for(let I=0;I<B;I++){let N=`k${K}`;Z.push(N);for(let j of v.allFields){let ee=V(_,N,j.id);R[ee]=v.defaultValue?.[j.id]??void 0;}K++;}h[_]=Z,y[_]=K;}a.getState()._reset(R);let M=a.getState();for(let[_,v]of Object.entries(x))M._setRepeatableConfig(_,v);a.setState({_repeatableOrder:h,_repeatableNextKey:y});}},[e.id,e.repeatableFields,a,t]);let[p,m]=useState(()=>a.getState().values);useEffect(()=>a.subscribe(R=>R.values,R=>m(R)),[a]);let[c,l]=useState(()=>a.getState()._repeatableOrder);useEffect(()=>a.subscribe(R=>R._repeatableOrder,R=>l(R)),[a]);let{fieldConditions:d,hasConditionalFields:F,getFieldCondition:g,isFieldVisible:u,isFieldDisabled:C,isFieldRequired:b,isFieldReadonly:k}=Ie({formConfig:e,formValues:p,repeatableOrder:c});useEffect(()=>{for(let[x,R]of Object.entries(d)){let h={visible:R.visible,disabled:R.disabled,required:R.required,readonly:R.readonly};a.getState()._setFieldConditions(x,h);}},[d,a]);let P=useMemo(()=>({hasConditionalFields:F,getFieldCondition:g,isFieldVisible:u,isFieldDisabled:C,isFieldRequired:b,isFieldReadonly:k}),[F,g,u,C,b,k]),{validateField:O,validateForm:D}=He({formConfig:e,store:a,conditionsHelpers:P}),{submit:q}=$e({store:a,onSubmit:i,validateForm:D,defaultSubmitOptions:e.submitOptions}),X=useMemo(()=>({formConfig:e,conditionsHelpers:P,validateField:O,validateForm:D,submit:q}),[e,P,O,D,q]);return jsx(ie.Provider,{value:a,children:jsx(ze.Provider,{value:X,children:jsx("form",{onSubmit:q,className:s,noValidate:true,children:r})})})}function Ot({formConfig:r,defaultValues:e,onSubmit:t,onFieldChange:i,className:o,children:s}){let a=useMemo(()=>r instanceof T?r.build():r,[r]);return jsx(_e,{formConfig:a,defaultValues:e,onSubmit:t,onFieldChange:i,className:o,children:s})}var Q=Mt.memo(function({fieldId:e,fieldConfig:t,disabled:i=false,customProps:o={},className:s,forceVisible:a=false}){let{formConfig:n,validateField:f,conditionsHelpers:p}=E(),m=ce(e),c=me(e),l=U(e),{setValue:d,setTouched:F}=Fe(e),g=useMemo(()=>{if(t)return t;let h=n.allFields.find(A=>A.id===e);if(h)return h;let y=L(e);if(y&&n.repeatableFields){let A=n.repeatableFields[y.repeatableId];if(A){let M=A.allFields.find(_=>_.id===y.fieldId);if(M)return {...M,id:e}}}},[t,n.allFields,n.repeatableFields,e]);if(!g)throw new Error(`Field with ID "${e}" not found`);let u=n.config.getComponent(g.componentId);if(!u)throw new Error(`Component with ID "${g.componentId}" not found`);let C=c.validationState==="validating",b=useMemo(()=>({isVisible:a||l.visible,isFieldDisabled:i||l.disabled,isFieldRequired:l.required||p.isFieldRequired(e),isFieldReadonly:l.readonly}),[a,i,l,p,e]),k=useCallback(async h=>{d(h),(g.validation?.validateOnChange||c.touched)&&await f(e,h);},[e,d,f,g.validation?.validateOnChange,c.touched]),P=useCallback(async()=>{c.touched||F(),g.validation?.validateOnBlur!==false&&await f(e);},[e,c.touched,F,f,g.validation?.validateOnBlur]),O=useMemo(()=>({...u.defaultProps??{},...g.props,...o,disabled:b.isFieldDisabled,required:b.isFieldRequired,readOnly:b.isFieldReadonly}),[u.defaultProps,g.props,o,b.isFieldDisabled,b.isFieldRequired,b.isFieldReadonly]),D=useMemo(()=>({id:e,props:O,value:m,onChange:k,onBlur:P,disabled:b.isFieldDisabled,error:c.errors,isValidating:C,touched:c.touched}),[e,O,m,k,P,b.isFieldDisabled,c.errors,C,c.touched]);if(!b.isVisible)return null;let q=u.renderer(D),X=n.renderConfig?.fieldRenderer,x=u.useFieldRenderer!==false,R=X&&x?X({children:q,id:e,...O,error:c.errors,isValidating:C,touched:c.touched}):q;return jsx("div",{className:s,"data-field-id":e,"data-field-type":u.type,"data-field-visible":b.isVisible,"data-field-disabled":b.isFieldDisabled,"data-field-required":b.isFieldRequired,"data-field-readonly":b.isFieldReadonly,children:R})});var Xe=Mt.memo(function({row:e,className:t,...i}){let{formConfig:o,conditionsHelpers:s}=E(),a=useMemo(()=>e.fields.filter(p=>s.isFieldVisible(p.id)),[e.fields,s]),n=useMemo(()=>a.map(p=>jsx(Q,{fieldId:p.id},p.id)),[a]),f=useMemo(()=>({row:e,children:n,className:t}),[e,n,t]);return a.length===0?null:jsx(ComponentRendererWrapper,{name:"FormRow",renderer:o.renderConfig?.rowRenderer,props:f,...i,children:n})}),de=Xe;var ke=Mt.memo(function({item:e,index:t,total:i,canRemove:o,canMoveUp:s,canMoveDown:a,onRemove:n,onMoveUp:f,onMoveDown:p}){let{formConfig:m}=E(),c=useMemo(()=>new Map(e.allFields.map(F=>[F.id,F])),[e.allFields]),l=useMemo(()=>e.rows.map(F=>jsx(de,{row:F,children:F.fields.map(g=>jsx(Q,{fieldId:g.id,fieldConfig:c.get(g.id)},g.id))},F.id)),[e.rows,c]),d=m.renderConfig?.repeatableItemRenderer;return d?d({item:e,index:t,total:i,canRemove:o,canMoveUp:s,canMoveDown:a,onRemove:n,onMoveUp:f,onMoveDown:p,children:l}):jsx("div",{"data-repeatable-item":e.key,"data-repeatable-index":t,children:l})});var Ee=Mt.memo(function({repeatableId:e,repeatableConfig:t,className:i}){let{formConfig:o}=E(),{items:s,append:a,remove:n,move:f,canAdd:p,canRemove:m}=ve(e),c=useMemo(()=>s.map((d,F)=>jsx(ke,{item:d,index:F,total:s.length,canRemove:m,canMoveUp:F>0,canMoveDown:F<s.length-1,onRemove:()=>n(d.key),onMoveUp:()=>f(F,F-1),onMoveDown:()=>f(F,F+1)},d.key)),[s,m,n,f]),l=o.renderConfig?.repeatableRenderer;return l?l({repeatableId:e,items:s,canAdd:p,canRemove:m,onAdd:()=>a(),min:t.min,max:t.max,children:c}):jsxs("div",{className:i,"data-repeatable-id":e,children:[c,p&&jsx("button",{type:"button",onClick:()=>a(),"data-repeatable-add":e,children:"Add"})]})});var Nt=Mt.memo(function({className:e,...t}){let{formConfig:i}=E(),o=useMemo(()=>i.rows.map(a=>a.kind==="repeatable"?jsx(Ee,{repeatableId:a.repeatable.id,repeatableConfig:a.repeatable},a.id):jsx(de,{row:a},a.id)),[i.rows]),s=useMemo(()=>({formConfig:i,children:o,className:e}),[i,o,e]);return jsx(ComponentRendererWrapper,{name:"FormBody",renderer:i.renderConfig?.bodyRenderer,props:s,...t,children:o})});var Ht=Mt.memo(function({className:e,isSubmitting:t,...i}){let{formConfig:o,submit:s}=E(),{isSubmitting:a}=fe(),n=useMemo(()=>({isSubmitting:t??a,onSubmit:s,className:e}),[t,a,s,e]);return jsx(ComponentRendererWrapper,{name:"FormSubmitButton",renderer:o.renderConfig?.submitButtonRenderer,props:n,...i})});export{Ot as Form,Nt as FormBody,T as FormBuilder,Q as FormField,_e as FormProvider,Xe as FormRow,ie as FormStoreContext,Ht as FormSubmitButton,W as RepeatableBuilder,Ee as RepeatableField,ke as RepeatableItem,ue as createFormStore,oe as flattenRepeatableValues,T as form,re as structureFormValues,tr as useConditionEvaluation,Fr as useConditionEvaluator,Fe as useFieldActions,U as useFieldConditions,pr as useFieldConditionsLazy,gr as useFieldConditionsWithRefresh,ut as useFieldErrors,me as useFieldState,ct as useFieldTouched,mt as useFieldValidationState,ce as useFieldValue,Rt as useFormActions,Ie as useFormConditions,E as useFormConfigContext,gt as useFormDirty,xt as useFormMonitoring,S as useFormStore,H as useFormStoreApi,$e as useFormSubmissionWithStore,fe as useFormSubmitState,pt as useFormSubmitting,Ft as useFormValid,He as useFormValidationWithStore,bt as useFormValues,Te as useMultipleConditionEvaluation,ve as useRepeatableField,pe as useRepeatableKeys};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rilaykit/forms",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Form building utilities and components for RilayKit",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
39
|
"zustand": "^5.0.5",
|
|
40
|
-
"@rilaykit/core": "0.1.
|
|
40
|
+
"@rilaykit/core": "0.1.3"
|
|
41
41
|
},
|
|
42
42
|
"peerDependencies": {
|
|
43
43
|
"react": ">=18.0.0",
|