@rilaykit/forms 0.1.1-alpha.1 → 0.1.1
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/LICENSE +21 -0
- package/dist/index.d.mts +794 -153
- package/dist/index.d.ts +794 -153
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +24 -10
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
'use strict';var ir=require('react'),jsxRuntime=require('react/jsx-runtime'),er=require('clsx'),core=require('@rilaykit/core');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var ir__default=/*#__PURE__*/_interopDefault(ir);var er__default=/*#__PURE__*/_interopDefault(er);function j(i,r){switch(r.type){case "SET_VALUE":{let o={...i.values,[r.fieldId]:r.value};return {...i,values:o,isDirty:true}}case "SET_ERROR":return {...i,errors:{...i.errors,[r.fieldId]:r.errors},isValid:false};case "SET_WARNING":return {...i,warnings:{...i.warnings,[r.fieldId]:r.warnings}};case "CLEAR_ERROR":{let o={...i.errors};return delete o[r.fieldId],{...i,errors:o}}case "CLEAR_WARNING":{let o={...i.warnings};return delete o[r.fieldId],{...i,warnings:o}}case "MARK_TOUCHED":return {...i,touched:new Set([...i.touched,r.fieldId])};case "SET_VALIDATING":{let o=new Set(i.isValidating);return r.isValidating?o.add(r.fieldId):o.delete(r.fieldId),{...i,isValidating:o}}case "SET_SUBMITTING":return {...i,isSubmitting:r.isSubmitting};case "RESET":return {values:r.values||{},errors:{},warnings:{},touched:new Set,isValidating:new Set,isDirty:false,isValid:true,isSubmitting:false};case "UPDATE_VALIDATION_STATE":{let o=Object.keys(i.errors).some(s=>i.errors[s].length>0);return {...i,isValid:!o}}default:return i}}var U=ir.createContext(null);function _({children:i,formConfig:r,defaultValues:o={},onSubmit:s,onFieldChange:e,className:a}){let m={values:o,errors:{},warnings:{},touched:new Set,isValidating:new Set,isDirty:false,isValid:true,isSubmitting:false},[d,l]=ir.useReducer(j,m),t=ir.useRef(new Map),h=ir.useRef(s),u=ir.useRef(e);h.current=s,u.current=e;let y=ir.useCallback((n,f)=>{l({type:"SET_ERROR",fieldId:n,errors:f}),l({type:"UPDATE_VALIDATION_STATE"});},[]),E=ir.useCallback((n,f)=>{l({type:"SET_WARNING",fieldId:n,warnings:f});},[]),R=ir.useCallback(n=>{l({type:"CLEAR_ERROR",fieldId:n}),l({type:"UPDATE_VALIDATION_STATE"});},[]),w=ir.useCallback(n=>{l({type:"CLEAR_WARNING",fieldId:n});},[]),b=ir.useCallback(n=>{l({type:"MARK_TOUCHED",fieldId:n});},[]),S=ir.useCallback((n,f)=>{l({type:"SET_VALIDATING",fieldId:n,isValidating:f});},[]),F=ir.useCallback((n,f)=>{if(l({type:"SET_VALUE",fieldId:n,value:f}),d.errors[n]&&d.errors[n].length>0&&(l({type:"CLEAR_ERROR",fieldId:n}),l({type:"UPDATE_VALIDATION_STATE"})),u.current){let c={...d.values,[n]:f};u.current(n,f,c);}},[d.errors,d.values]),v=ir.useMemo(()=>r,[r]),V=ir.useCallback(async(n,f)=>{let c=v.allFields.find(P=>P.id===n);if(!c?.validation?.validator)return {isValid:true,errors:[]};let z=f!==void 0?f:d.values[n],B=t.current.get(n);B&&clearTimeout(B);let Z={fieldId:n,formData:d.values,fieldProps:c.props,touched:d.touched.has(n),dirty:d.isDirty},L=c.validation.debounceMs||0;return new Promise(P=>{let O=async()=>{S(n,true);try{let p=await c.validation.validator(z,Z,c.props);p.errors.length>0?y(n,p.errors):R(n),p.warnings&&p.warnings.length>0?E(n,p.warnings):w(n),P(p);}catch(p){let M={isValid:false,errors:[{code:"validation_error",message:p instanceof Error?p.message:"Validation error"}]};y(n,M.errors),P(M);}finally{S(n,false);}};if(L>0){let p=setTimeout(O,L);t.current.set(n,p);}else O();})},[v,d.values,d.touched,d.isDirty,y,E,R,w,S]),I=ir.useCallback(async()=>{let n=v.allFields.map(c=>V(c.id));return (await Promise.all(n)).every(c=>c.isValid)},[v,V]),D=ir.useCallback(n=>{l({type:"RESET",values:n});},[]),A=ir.useCallback(async n=>{if(n?.preventDefault(),!h.current)return true;l({type:"SET_SUBMITTING",isSubmitting:true});try{return await I()?(await h.current(d.values),!0):!1}catch(f){return console.error("Error during form submission:",f),false}finally{l({type:"SET_SUBMITTING",isSubmitting:false});}},[d.values,I]),K=ir.useMemo(()=>({formState:d,formConfig:v,setValue:F,setError:y,setWarning:E,clearError:R,clearWarning:w,markFieldTouched:b,setFieldValidating:S,validateField:V,validateAllFields:I,reset:D,submit:A}),[d,v,F,y,E,R,w,b,S,V,I,D,A]);return jsxRuntime.jsx(U.Provider,{value:K,children:jsxRuntime.jsx("form",{onSubmit:A,className:a,noValidate:true,children:i})})}function C(){let i=ir.useContext(U);if(!i)throw new Error("useFormContext must be used within a FormProvider");return i}function rr({formConfig:i,defaultValues:r,onSubmit:o,onFieldChange:s,children:e}){return jsxRuntime.jsx(_,{formConfig:i,defaultValues:r,onSubmit:o,onFieldChange:s,className:"streamline-form",children:e})}function W({fieldId:i,disabled:r=false,customProps:o={},className:s}){let{formState:e,formConfig:a,setValue:m,markFieldTouched:d,validateField:l}=C(),t=ir.useMemo(()=>a.allFields.find(F=>F.id===i),[a.allFields,i]);if(!t)throw new Error(`Field with ID "${i}" not found`);let h=ir.useMemo(()=>a.config.getComponent(t.componentId),[a.config,t.componentId]);if(!h)throw new Error(`Component with ID "${t.componentId}" not found`);let u=ir.useMemo(()=>({value:e.values[t.id],errors:e.errors[t.id]||[],warnings:e.warnings[t.id]||[],touched:e.touched.has(t.id),validating:e.isValidating.has(t.id)}),[e.values,e.errors,e.warnings,e.touched,e.isValidating,t.id]),y=ir.useCallback(F=>{let v=u.errors.length>0;m(t.id,F),(t.validation?.validateOnChange||v&&t.validation?.validator||u.touched&&t.validation?.validator)&&l(t.id,F);},[t.id,t.validation,m,l,u.errors.length,u.touched]),E=ir.useCallback(()=>{d(t.id),(t.validation?.validateOnBlur||t.validation?.validator)&&l(t.id);},[t.id,t.validation,d,l]),R=ir.useMemo(()=>{if(!t.conditional)return true;try{return t.conditional.condition(e.values)}catch(F){return console.warn(`Conditional evaluation failed for field "${t.id}":`,F),true}},[t.conditional,e.values,t.id]),w=ir.useMemo(()=>{if(!t.conditional||!R)return {};switch(t.conditional.action){case "disable":return {disabled:true};case "require":return {required:true};default:return {}}},[t.conditional,R]);if(!R&&t.conditional?.action==="hide")return null;let b=ir.useMemo(()=>({...h.defaultProps,...t.props,...o,...w}),[h.defaultProps,t.props,o,w]),S=ir.useMemo(()=>({id:t.id,props:b,value:u.value,onChange:y,onBlur:E,error:u.errors,warnings:u.warnings,touched:u.touched,disabled:r||w.disabled,isValidating:u.validating}),[t.id,b,u.value,y,E,u.errors,u.warnings,u.touched,r,w.disabled,u.validating]);return jsxRuntime.jsx("div",{className:er__default.default("streamline-form-field",s),"data-field-id":t.id,"data-field-type":h.subType,children:h.renderer(S)})}var q=ir__default.default.memo(W);function H({row:i,className:r}){let{formConfig:o}=C(),s=o.renderConfig?.rowRenderer;if(!s)throw new Error(`No rowRenderer configured for form "${o.id}". Please configure a rowRenderer using config.setRowRenderer() or config.setFormRenderConfig().`);let e=i.fields.map(m=>jsxRuntime.jsx(q,{fieldId:m.id},m.id)),a={row:i,children:e,className:r,spacing:i.spacing,alignment:i.alignment};return s(a)}var J=H;function ar({className:i}){let{formConfig:r}=C(),o=r.renderConfig?.bodyRenderer;if(!o)throw new Error(`No bodyRenderer configured for form "${r.id}". Please configure a bodyRenderer using config.setBodyRenderer() or config.setFormRenderConfig().`);let s=ir.useMemo(()=>r.rows.map(a=>jsxRuntime.jsx(J,{row:a},a.id)),[r.rows]);return o({formConfig:r,children:s,className:i})}function lr({className:i,children:r}){let{formState:o,submit:s,formConfig:e}=C(),a=e.renderConfig?.submitButtonRenderer;if(!a)throw new Error(`No submitButtonRenderer configured for form "${e.id}". Please configure a submitButtonRenderer using config.setSubmitButtonRenderer() or config.setFormRenderConfig().`);let m={isSubmitting:o.isSubmitting,isValid:o.isValid,isDirty:o.isDirty,onSubmit:s,className:i,children:r};return a(m)}var x=class i{constructor(r,o){this.rows=[];this.rowCounter=0;this.config=r,this.formId=o||`form-${Date.now()}`;}static create(r,o){return new i(r,o)}addField(r,o,s={},e){return this.addRowFields([{fieldId:r,componentSubType:o,props:s,validation:e?.validation,conditional:e?.conditional}])}addRowFields(r,o){if(r.length===0)throw new Error("At least one field is required");if(r.length>3)throw new Error("Maximum 3 fields per row");let s=`row-${++this.rowCounter}`,e=[];for(let m of r){let d=this.config.getComponentsBySubType(m.componentSubType);if(d.length===0)throw new Error(`No component found with subType "${m.componentSubType}"`);let l=d[0],t={id:m.fieldId,componentId:l.id,props:{...l.defaultProps,...m.props},validation:m.validation,conditional:m.conditional};e.push(t);}let a={id:s,fields:e,maxColumns:r.length,spacing:o?.spacing||"normal",alignment:o?.alignment||"stretch"};return this.rows.push(a),this}addFields(r){for(let o of r)this.addField(o.fieldId,o.componentSubType,o.props,{validation:o.validation,conditional:o.conditional});return this}setId(r){return this.formId=r,this}updateField(r,o){let s=false;for(let e of this.rows){let a=e.fields.findIndex(m=>m.id===r);a!==-1&&(e.fields[a]={...e.fields[a],...o,props:{...e.fields[a].props,...o.props}},s=true);}if(!s)throw new Error(`Field with ID "${r}" not found`);return this}removeField(r){for(let o of this.rows){let s=o.fields.filter(e=>e.id!==r);Object.assign(o,{fields:s});}return this.rows=this.rows.filter(o=>o.fields.length>0),this}getField(r){for(let o of this.rows){let s=o.fields.find(e=>e.id===r);if(s)return s}}getFields(){return this.rows.flatMap(r=>r.fields)}getRows(){return [...this.rows]}clear(){return this.rows=[],this.rowCounter=0,this}clone(r){let o=new i(this.config,r);return o.rows=this.rows.map(s=>({...s,fields:s.fields.map(e=>({...e}))})),o.rowCounter=this.rowCounter,o}validate(){let r=[],o=this.getFields(),s=o.map(a=>a.id),e=s.filter((a,m)=>s.indexOf(a)!==m);e.length>0&&r.push(`Duplicate field IDs: ${e.join(", ")}`);for(let a of o)this.config.hasComponent(a.componentId)||r.push(`Component "${a.componentId}" not found for field "${a.id}"`);for(let a of this.rows)a.fields.length>3&&r.push(`Row "${a.id}" has ${a.fields.length} fields, maximum is 3`),a.fields.length===0&&r.push(`Row "${a.id}" is empty`);return r}build(){let r=this.validate();if(r.length>0)throw new Error(`Form validation failed: ${r.join(", ")}`);return {id:this.formId,rows:[...this.rows],allFields:this.getFields(),config:this.config,renderConfig:this.config.getFormRenderConfig()}}toJSON(){return {id:this.formId,rows:this.rows}}fromJSON(r){return r.id&&(this.formId=r.id),r.rows&&(this.rows=r.rows,this.rowCounter=this.rows.length),this}getStats(){let r=this.getFields(),o=this.rows.map(s=>s.fields.length);return {totalFields:r.length,totalRows:this.rows.length,averageFieldsPerRow:this.rows.length>0?r.length/this.rows.length:0,maxFieldsInRow:o.length>0?Math.max(...o):0,minFieldsInRow:o.length>0?Math.min(...o):0}}};Object.defineProperty(exports,"createZodValidator",{enumerable:true,get:function(){return core.createZodValidator}});Object.defineProperty(exports,"ril",{enumerable:true,get:function(){return core.ril}});exports.Form=rr;exports.FormBody=ar;exports.FormBuilder=x;exports.FormField=W;exports.FormProvider=_;exports.FormRow=H;exports.FormSubmitButton=lr;exports.form=x;exports.useFormContext=C;
|
|
1
|
+
'use strict';var Xe=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 Xe__default=/*#__PURE__*/_interopDefault(Xe);var x=class o{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 o(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 r=t.validation?.validate,n=e.validation?.validate;if(!r)return n;if(!n)return r;let a=Array.isArray(r)?r:[r],s=Array.isArray(n)?n:[n];return [...a,...s]})()}),{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 {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 r=this.createRow(t);return this.rows.push(r),this}if(t.length<=3){let r=this.createRow(t);return this.rows.push(r),this}for(let r of t){let n=this.createRow([r]);this.rows.push(n);}return this}addSeparateRows(e){for(let t of e)this.add(t);return 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){let i=t.fields.find(r=>r.id===e);if(i)return i}return null}removeField(e){return this.rows=this.rows.map(t=>({...t,fields:t.fields.filter(i=>i.id!==e)})).filter(t=>t.fields.length>0),this}getField(e){return this.findField(e)||void 0}getFields(){return this.rows.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 r={...i.validation,...t};return this.updateField(e,{validation:r})}addFieldConditions(e,t){let i=this.findField(e);if(!i)throw new Error(`Field with ID "${e}" not found`);let r={...i.conditions,...t};return this.updateField(e,{conditions:r})}clone(e){let t=new o(this.config,e||`${this.formId}-clone`);return t.rows=core.deepClone(this.rows),t}validate(){let e=[],t=this.getFields(),i=t.map(r=>r.id);try{core.ensureUnique(i,"field");}catch(r){e.push(r instanceof Error?r.message:String(r));}for(let r of t)this.config.hasComponent(r.componentId)||e.push(`Component "${r.componentId}" not found for field "${r.id}"`);for(let r of this.rows)r.fields.length>3&&e.push(`Row "${r.id}" has ${r.fields.length} fields, maximum is 3`),r.fields.length===0&&e.push(`Row "${r.id}" is empty`);return e}build(){let e=this.validate();if(e.length>0)throw new Error(`Form validation failed: ${e.join(", ")}`);return {id:this.formId,rows:[...this.rows],allFields:this.getFields(),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),this}getStats(){let e=this.getFields(),t=this.rows.map(i=>i.fields.length);return {totalFields:e.length,totalRows:this.rows.length,averageFieldsPerRow:this.rows.length>0?e.length/this.rows.length:0,maxFieldsInRow:t.length>0?Math.max(...t):0,minFieldsInRow:t.length>0?Math.min(...t):0}}};function Ft(o,e={},t={}){return Xe.useMemo(()=>{if(!o)return {visible:t.visible??true,disabled:t.disabled??false,required:t.required??false,readonly:t.readonly??false};let i=r=>{try{return r&&typeof r=="object"&&"build"in r?core.evaluateCondition(r.build(),e):core.evaluateCondition(r,e)}catch(n){return console.warn("Error evaluating condition:",n),false}};return {visible:o.visible?i(o.visible):t.visible??true,disabled:o.disabled?i(o.disabled):t.disabled??false,required:o.required?i(o.required):t.required??false,readonly:o.readonly?i(o.readonly):t.readonly??false}},[o,e,t])}function oe(o,e={}){return Xe.useMemo(()=>{let t={};for(let[i,r]of Object.entries(o))if(t[i]={visible:true,disabled:false,required:false,readonly:false},r){let n=a=>{try{return a&&typeof a=="object"&&"build"in a?core.evaluateCondition(a.build(),e):core.evaluateCondition(a,e)}catch(s){return console.warn(`Error evaluating condition for field ${i}:`,s),false}};t[i]={visible:r.visible?n(r.visible):true,disabled:r.disabled?n(r.disabled):false,required:r.required?n(r.required):false,readonly:r.readonly?n(r.readonly):false};}return t},[o,e])}function $(o={}){return zustand.createStore()(middleware.subscribeWithSelector((e,t)=>({values:{...o},errors:{},validationStates:{},touched:{},isDirty:false,isSubmitting:false,isValid:true,_defaultValues:{...o},_fieldConditions:{},_setValue:(i,r)=>{e(n=>({values:{...n.values,[i]:r},isDirty:true}));},_setTouched:i=>{e(r=>({touched:{...r.touched,[i]:true}}));},_setErrors:(i,r)=>{e(n=>{let a={...n.errors,[i]:r},s=r.length>0?"invalid":"valid";return {errors:a,validationStates:{...n.validationStates,[i]:s}}}),t()._updateIsValid();},_clearErrors:i=>{e(r=>{let n={...r.errors};return delete n[i],{errors:n,validationStates:{...r.validationStates,[i]:"idle"}}}),t()._updateIsValid();},_setValidationState:(i,r)=>{e(n=>({validationStates:{...n.validationStates,[i]:r}}));},_setSubmitting:i=>{e({isSubmitting:i});},_reset:i=>{let r=i??t()._defaultValues;e({values:{...r},errors:{},validationStates:{},touched:{},isDirty:false,isSubmitting:false,isValid:true});},_setFieldConditions:(i,r)=>{e(n=>({_fieldConditions:{...n._fieldConditions,[i]:r}}));},_updateIsValid:()=>{let i=t(),r=Object.values(i.errors).some(a=>a&&a.length>0),n=Object.values(i.validationStates).some(a=>a==="invalid");e({isValid:!r&&!n});}})))}var O=Xe.createContext(null);function v(){let o=Xe.useContext(O);if(!o)throw new Error("useFormStore must be used within a FormProvider");return o}var re=[];function N(o){let e=v();return zustand.useStore(e,t=>t.values[o])}function Me(o){let e=v();return zustand.useStore(e,t=>t.errors[o]??re)}function Be(o){let e=v();return zustand.useStore(e,t=>t.touched[o]??false)}function Te(o){let e=v();return zustand.useStore(e,t=>t.validationStates[o]??"idle")}var De={visible:true,disabled:false,required:false,readonly:false};function P(o){let e=v();return zustand.useStore(e,t=>t._fieldConditions[o]??De)}function W(o){let e=v(),t=zustand.useStore(e,s=>s.values[o]),i=zustand.useStore(e,s=>s.errors[o]??re),r=zustand.useStore(e,s=>s.validationStates[o]??"idle"),n=zustand.useStore(e,s=>s.touched[o]??false),a=zustand.useStore(e,s=>s._defaultValues[o]);return {value:t,errors:i,validationState:r,touched:n,dirty:t!==a}}function qe(){let o=v();return zustand.useStore(o,e=>e.isSubmitting)}function Oe(){let o=v();return zustand.useStore(o,e=>e.isValid)}function Ue(){let o=v();return zustand.useStore(o,e=>e.isDirty)}function Ae(){let o=v();return zustand.useStore(o,e=>e.values)}function H(){let o=v(),e=zustand.useStore(o,r=>r.isSubmitting),t=zustand.useStore(o,r=>r.isValid),i=zustand.useStore(o,r=>r.isDirty);return {isSubmitting:e,isValid:t,isDirty:i}}function L(o){let e=v();return {setValue:t=>e.getState()._setValue(o,t),setTouched:()=>e.getState()._setTouched(o),setErrors:t=>e.getState()._setErrors(o,t),clearErrors:()=>e.getState()._clearErrors(o),setValidationState:t=>e.getState()._setValidationState(o,t)}}function Ie(){let o=v();return {setValue:(e,t)=>o.getState()._setValue(e,t),setTouched:e=>o.getState()._setTouched(e),setErrors:(e,t)=>o.getState()._setErrors(e,t),setSubmitting:e=>o.getState()._setSubmitting(e),reset:e=>o.getState()._reset(e),setFieldConditions:(e,t)=>o.getState()._setFieldConditions(e,t)}}function B(){return v()}var se={visible:true,disabled:false,required:false,readonly:false};function ae(o){try{return JSON.stringify(o)}catch{return String(Date.now())}}function U(o,e){if(o)try{return typeof o=="object"&&"build"in o?core.evaluateCondition(o.build(),e):core.evaluateCondition(o,e)}catch(t){console.warn("Error evaluating condition:",t);return}}function j(o,e){if(!o)return se;let t=U(o.visible,e),i=U(o.disabled,e),r=U(o.required,e),n=U(o.readonly,e);return {visible:t??true,disabled:i??false,required:r??false,readonly:n??false}}function Vt(o,e={}){let{conditions:t,skip:i=false}=e,r=B(),n=P(o),a=Xe.useRef(null);if(i||!t)return n;let s=r.getState().values,F=ae(s);if(a.current?.valuesHash===F)return a.current.result;let m=j(t,s);return a.current={result:m,valuesHash:F},m}function xt(){let o=B(),e=Xe.useRef(new Map),t=Xe.useRef("");return Xe.useMemo(()=>function(r,n){if(!n)return se;let a=o.getState().values,s=ae(a);t.current!==s&&(e.current.clear(),t.current=s);let F=e.current.get(r);if(F)return F.result;let m=j(n,a);return e.current.set(r,{result:m,valuesHash:s}),m},[o])}function Pt(o,e){let t=B(),i=P(o),r=Xe.useMemo(()=>()=>{if(!e)return i;let n=t.getState().values;return j(e,n)},[t,e,i]);return {conditions:i,refresh:r}}function de({formConfig:o,formValues:e}){let t=Xe.useMemo(()=>{let l={};for(let u of o.allFields)u.conditions&&(l[u.id]=u.conditions);return l},[o.allFields]),i=Xe.useMemo(()=>Object.keys(t).length>0,[t]),r=oe(i?t:{},i?e:{}),n=Xe.useCallback(l=>r[l],[r]),a=Xe.useCallback(l=>{let u=r[l];return u?u.visible:true},[r]),s=Xe.useCallback(l=>{let u=r[l];return u?u.disabled:false},[r]),F=Xe.useCallback(l=>{let u=r[l];return u?u.required:false},[r]),m=Xe.useCallback(l=>{let u=r[l];return u?u.readonly:false},[r]);return Xe.useMemo(()=>({fieldConditions:r,hasConditionalFields:i,getFieldCondition:n,isFieldVisible:a,isFieldDisabled:s,isFieldRequired:F,isFieldReadonly:m}),[r,i,n,a,s,F,m])}function le({store:o,onSubmit:e,validateForm:t}){let i=Xe.useRef(e);return i.current=e,{submit:Xe.useCallback(async n=>{n?.preventDefault();let a=o.getState();if(a.isSubmitting)return false;a._setSubmitting(true);try{if(!(await t()).isValid)return a._setSubmitting(!1),!1;let F=o.getState().values;return i.current&&await i.current(F),a._setSubmitting(!1),!0}catch(s){return a._setSubmitting(false),console.error("Form submission error:",s),false}},[o,t])}}function A(){return {isValid:true,errors:[]}}function fe({formConfig:o,store:e,conditionsHelpers:t}){let i=Xe.useRef(o),r=Xe.useRef(t);i.current=o,r.current=t;let n=Xe.useCallback(async(s,F)=>{let m=i.current.allFields.find(d=>d.id===s),l=e.getState();if(!m)return A();if(!r.current.isFieldVisible(s))return l._setErrors(s,[]),l._setValidationState(s,"valid"),A();if(!m.validation||!core.hasUnifiedValidation(m.validation))return l._setErrors(s,[]),l._setValidationState(s,"valid"),A();let u=F!==void 0?F:l.values[s],c=core.createValidationContext({fieldId:s,formId:i.current.id,allFormData:{...l.values,[s]:u}});l._setValidationState(s,"validating");try{let d=await core.validateWithUnifiedConfig(m.validation,u,c),f=r.current.isFieldRequired(s),p=u==null||u==="";if(f&&p&&!d.errors.some(g=>g.code==="REQUIRED"||g.message.toLowerCase().includes("required"))){let g={isValid:!1,errors:[{message:"This field is required",code:"CONDITIONAL_REQUIRED"},...d.errors]};return l._setErrors(s,g.errors),l._setValidationState(s,"invalid"),g}return l._setErrors(s,d.errors),l._setValidationState(s,d.isValid?"valid":"invalid"),d}catch(d){let f={isValid:false,errors:[{message:d instanceof Error?d.message:"Validation failed",code:"VALIDATION_ERROR"}]};return l._setErrors(s,f.errors),l._setValidationState(s,"invalid"),f}},[e]),a=Xe.useCallback(async()=>{let s=e.getState(),F=i.current.allFields.filter(d=>{let f=r.current.isFieldVisible(d.id),p=d.validation&&core.hasUnifiedValidation(d.validation);return f&&p}),m=i.current.allFields.filter(d=>!r.current.isFieldVisible(d.id));for(let d of m)s._setErrors(d.id,[]),s._setValidationState(d.id,"valid");let l=await Promise.all(F.map(d=>n(d.id))),u=l.some(d=>!d.isValid),c=A();if(i.current.validation&&core.hasUnifiedValidation(i.current.validation)){let d=Object.keys(s.values).reduce((p,b)=>(r.current.isFieldVisible(b)&&(p[b]=s.values[b]),p),{}),f=core.createValidationContext({formId:i.current.id,allFormData:d});try{c=await core.validateFormWithUnifiedConfig(i.current.validation,d,f);}catch(p){c={isValid:false,errors:[{message:p instanceof Error?p.message:"Form validation failed",code:"FORM_VALIDATION_ERROR"}]};}}return {isValid:!u&&c.isValid,errors:[...l.flatMap(d=>d.errors),...c.errors]}},[e,n]);return {validateField:n,validateForm:a}}function je({formConfig:o,enabled:e=true}){let t=core.getGlobalMonitor(),i=Xe.useRef(null),r=Xe.useRef(0),n=Xe.useRef(0);Xe.useEffect(()=>{t&&e&&(i.current=t.getProfiler());},[t,e]);let a=Xe.useCallback(c=>{if(!t||!e)return;r.current++;let d={formId:o.id,fieldCount:o.allFields.length,timestamp:Date.now(),duration:0,renderDuration:0,validationDuration:0,validationErrors:0,renderCount:c||r.current};t.track("component_render",`form_${o.id}`,{formId:o.id,fieldCount:o.allFields.length,renderCount:r.current},d,"low");},[t,e,o.id,o.allFields.length]),s=Xe.useCallback((c,d)=>{if(!t||!e)return;let f=i.current?.getMetrics(`form_validation_${o.id}`),p={formId:o.id,fieldCount:d||o.allFields.length,timestamp:Date.now(),duration:f?.duration||0,renderDuration:0,validationDuration:f?.duration||0,validationErrors:c,renderCount:r.current};t.track("form_validation",`form_${o.id}`,{formId:o.id,validationErrors:c,fieldCount:d||o.allFields.length},p,c>0?"medium":"low");},[t,e,o.id,o.allFields.length]),F=Xe.useCallback((c,d)=>{if(!t||!e)return;let f=i.current?.getMetrics(`form_submission_${o.id}`),p={formId:o.id,fieldCount:d||o.allFields.length,timestamp:Date.now(),duration:f?.duration||0,renderDuration:0,validationDuration:0,validationErrors:c?0:1,renderCount:r.current};t.track("form_submission",`form_${o.id}`,{formId:o.id,success:c,fieldCount:d||o.allFields.length,fieldChanges:n.current},p,c?"low":"high");},[t,e,o.id,o.allFields.length]),m=Xe.useCallback((c,d)=>{!t||!e||(n.current++,t.track("component_update",`field_${c}`,{formId:o.id,fieldId:c,componentType:d,changeCount:n.current},void 0,"low"));},[t,e,o.id]),l=Xe.useCallback(c=>{!i.current||!e||i.current.start(c,{formId:o.id,renderCount:r.current});},[e,o.id]),u=Xe.useCallback(c=>{if(!i.current||!e)return null;let d=i.current.end(c);return d?{...d,formId:o.id,fieldCount:o.allFields.length,renderDuration:d.duration,validationDuration:0,validationErrors:0}:null},[e,o.id,o.allFields.length]);return {trackFormRender:a,trackFormValidation:s,trackFormSubmission:F,trackFieldChange:m,startPerformanceTracking:l,endPerformanceTracking:u}}var Ce=Xe.createContext(null);function y(){let o=Xe.useContext(Ce);if(!o)throw new Error("useFormConfigContext must be used within a FormProvider");return o}function K({children:o,formConfig:e,defaultValues:t={},onSubmit:i,onFieldChange:r,className:n}){let[a]=Xe.useState(()=>$(t)),s=Xe.useRef(e.id),F=Xe.useRef(r);F.current=r,Xe.useEffect(()=>F.current?a.subscribe(C=>C.values,(C,M)=>{for(let R of Object.keys(C))C[R]!==M[R]&&F.current?.(R,C[R],C);}):void 0,[a]),Xe.useEffect(()=>{s.current!==e.id&&(s.current=e.id,a.getState()._reset(t));},[e.id,a,t]);let[m,l]=Xe.useState(()=>a.getState().values);Xe.useEffect(()=>a.subscribe(C=>C.values,C=>l(C)),[a]);let{fieldConditions:u,hasConditionalFields:c,getFieldCondition:d,isFieldVisible:f,isFieldDisabled:p,isFieldRequired:b,isFieldReadonly:g}=de({formConfig:e,formValues:m});Xe.useEffect(()=>{for(let[V,C]of Object.entries(u)){let M={visible:C.visible,disabled:C.disabled,required:C.required,readonly:C.readonly};a.getState()._setFieldConditions(V,M);}},[u,a]);let w=Xe.useMemo(()=>({hasConditionalFields:c,getFieldCondition:d,isFieldVisible:f,isFieldDisabled:p,isFieldRequired:b,isFieldReadonly:g}),[c,d,f,p,b,g]),{validateField:_,validateForm:S}=fe({formConfig:e,store:a,conditionsHelpers:w}),{submit:k}=le({store:a,onSubmit:i,validateForm:S}),D=Xe.useMemo(()=>({formConfig:e,conditionsHelpers:w,validateField:_,validateForm:S,submit:k}),[e,w,_,S,k]);return jsxRuntime.jsx(O.Provider,{value:a,children:jsxRuntime.jsx(Ce.Provider,{value:D,children:jsxRuntime.jsx("form",{onSubmit:k,className:n,noValidate:true,children:o})})})}function Ye({formConfig:o,defaultValues:e,onSubmit:t,onFieldChange:i,children:r}){let n=Xe.useMemo(()=>o instanceof x?o.build():o,[o]);return jsxRuntime.jsx(K,{formConfig:n,defaultValues:e,onSubmit:t,onFieldChange:i,children:r})}var Z=Xe__default.default.memo(function({fieldId:e,disabled:t=false,customProps:i={},className:r,forceVisible:n=false}){let{formConfig:a,validateField:s,conditionsHelpers:F}=y(),m=N(e),l=W(e),u=P(e),{setValue:c,setTouched:d}=L(e),f=a.allFields.find(R=>R.id===e);if(!f)throw new Error(`Field with ID "${e}" not found`);let p=a.config.getComponent(f.componentId);if(!p)throw new Error(`Component with ID "${f.componentId}" not found`);let b=l.validationState==="validating",g=Xe.useMemo(()=>({isVisible:n||u.visible,isFieldDisabled:t||u.disabled,isFieldRequired:u.required||F.isFieldRequired(e),isFieldReadonly:u.readonly}),[n,t,u,F,e]),w=Xe.useCallback(async R=>{c(R),(f.validation?.validateOnChange||l.touched)&&await s(e,R);},[e,c,s,f.validation?.validateOnChange,l.touched]),_=Xe.useCallback(async()=>{l.touched||d(),f.validation?.validateOnBlur!==false&&await s(e);},[e,l.touched,d,s,f.validation?.validateOnBlur]),S=Xe.useMemo(()=>({...p.defaultProps??{},...f.props,...i,disabled:g.isFieldDisabled,required:g.isFieldRequired,readOnly:g.isFieldReadonly}),[p.defaultProps,f.props,i,g.isFieldDisabled,g.isFieldRequired,g.isFieldReadonly]),k=Xe.useMemo(()=>({id:e,props:S,value:m,onChange:w,onBlur:_,disabled:g.isFieldDisabled,error:l.errors,isValidating:b,touched:l.touched}),[e,S,m,w,_,g.isFieldDisabled,l.errors,b,l.touched]);if(!g.isVisible)return null;let D=p.renderer(k),V=a.renderConfig?.fieldRenderer,C=p.useFieldRenderer!==false,M=V&&C?V({children:D,id:e,...S,error:l.errors,isValidating:b,touched:l.touched}):D;return jsxRuntime.jsx("div",{className:r,"data-field-id":e,"data-field-type":p.type,"data-field-visible":g.isVisible,"data-field-disabled":g.isFieldDisabled,"data-field-required":g.isFieldRequired,"data-field-readonly":g.isFieldReadonly,children:M})});var be=Xe__default.default.memo(function({row:e,className:t,...i}){let{formConfig:r,conditionsHelpers:n}=y(),a=Xe.useMemo(()=>e.fields.filter(m=>n.isFieldVisible(m.id)),[e.fields,n]),s=Xe.useMemo(()=>a.map(m=>jsxRuntime.jsx(Z,{fieldId:m.id},m.id)),[a]),F=Xe.useMemo(()=>({row:e,children:s,className:t}),[e,s,t]);return a.length===0?null:jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"FormRow",renderer:r.renderConfig?.rowRenderer,props:F,...i,children:s})}),Re=be;var it=Xe__default.default.memo(function({className:e,...t}){let{formConfig:i}=y(),r=Xe.useMemo(()=>i.rows.map(a=>jsxRuntime.jsx(Re,{row:a},a.id)),[i.rows]),n=Xe.useMemo(()=>({formConfig:i,children:r,className:e}),[i,r,e]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"FormBody",renderer:i.renderConfig?.bodyRenderer,props:n,...t,children:r})});var dt=Xe__default.default.memo(function({className:e,isSubmitting:t,...i}){let{formConfig:r,submit:n}=y(),{isSubmitting:a}=H(),s=Xe.useMemo(()=>({isSubmitting:t??a,onSubmit:n,className:e}),[t,a,n,e]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"FormSubmitButton",renderer:r.renderConfig?.submitButtonRenderer,props:s,...i})});exports.Form=Ye;exports.FormBody=it;exports.FormBuilder=x;exports.FormField=Z;exports.FormProvider=K;exports.FormRow=be;exports.FormStoreContext=O;exports.FormSubmitButton=dt;exports.createFormStore=$;exports.form=x;exports.useConditionEvaluation=Ft;exports.useConditionEvaluator=xt;exports.useFieldActions=L;exports.useFieldConditions=P;exports.useFieldConditionsLazy=Vt;exports.useFieldConditionsWithRefresh=Pt;exports.useFieldErrors=Me;exports.useFieldState=W;exports.useFieldTouched=Be;exports.useFieldValidationState=Te;exports.useFieldValue=N;exports.useFormActions=Ie;exports.useFormConditions=de;exports.useFormConfigContext=y;exports.useFormDirty=Ue;exports.useFormMonitoring=je;exports.useFormStore=v;exports.useFormStoreApi=B;exports.useFormSubmissionWithStore=le;exports.useFormSubmitState=H;exports.useFormSubmitting=qe;exports.useFormValid=Oe;exports.useFormValidationWithStore=fe;exports.useFormValues=Ae;exports.useMultipleConditionEvaluation=oe;
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import ir,{createContext,useMemo,useCallback,useContext,useReducer,useRef}from'react';import {jsx}from'react/jsx-runtime';import er from'clsx';export{createZodValidator,ril}from'@rilaykit/core';function j(i,r){switch(r.type){case "SET_VALUE":{let o={...i.values,[r.fieldId]:r.value};return {...i,values:o,isDirty:true}}case "SET_ERROR":return {...i,errors:{...i.errors,[r.fieldId]:r.errors},isValid:false};case "SET_WARNING":return {...i,warnings:{...i.warnings,[r.fieldId]:r.warnings}};case "CLEAR_ERROR":{let o={...i.errors};return delete o[r.fieldId],{...i,errors:o}}case "CLEAR_WARNING":{let o={...i.warnings};return delete o[r.fieldId],{...i,warnings:o}}case "MARK_TOUCHED":return {...i,touched:new Set([...i.touched,r.fieldId])};case "SET_VALIDATING":{let o=new Set(i.isValidating);return r.isValidating?o.add(r.fieldId):o.delete(r.fieldId),{...i,isValidating:o}}case "SET_SUBMITTING":return {...i,isSubmitting:r.isSubmitting};case "RESET":return {values:r.values||{},errors:{},warnings:{},touched:new Set,isValidating:new Set,isDirty:false,isValid:true,isSubmitting:false};case "UPDATE_VALIDATION_STATE":{let o=Object.keys(i.errors).some(s=>i.errors[s].length>0);return {...i,isValid:!o}}default:return i}}var U=createContext(null);function _({children:i,formConfig:r,defaultValues:o={},onSubmit:s,onFieldChange:e,className:a}){let m={values:o,errors:{},warnings:{},touched:new Set,isValidating:new Set,isDirty:false,isValid:true,isSubmitting:false},[d,l]=useReducer(j,m),t=useRef(new Map),h=useRef(s),u=useRef(e);h.current=s,u.current=e;let y=useCallback((n,f)=>{l({type:"SET_ERROR",fieldId:n,errors:f}),l({type:"UPDATE_VALIDATION_STATE"});},[]),E=useCallback((n,f)=>{l({type:"SET_WARNING",fieldId:n,warnings:f});},[]),R=useCallback(n=>{l({type:"CLEAR_ERROR",fieldId:n}),l({type:"UPDATE_VALIDATION_STATE"});},[]),w=useCallback(n=>{l({type:"CLEAR_WARNING",fieldId:n});},[]),b=useCallback(n=>{l({type:"MARK_TOUCHED",fieldId:n});},[]),S=useCallback((n,f)=>{l({type:"SET_VALIDATING",fieldId:n,isValidating:f});},[]),F=useCallback((n,f)=>{if(l({type:"SET_VALUE",fieldId:n,value:f}),d.errors[n]&&d.errors[n].length>0&&(l({type:"CLEAR_ERROR",fieldId:n}),l({type:"UPDATE_VALIDATION_STATE"})),u.current){let c={...d.values,[n]:f};u.current(n,f,c);}},[d.errors,d.values]),v=useMemo(()=>r,[r]),V=useCallback(async(n,f)=>{let c=v.allFields.find(P=>P.id===n);if(!c?.validation?.validator)return {isValid:true,errors:[]};let z=f!==void 0?f:d.values[n],B=t.current.get(n);B&&clearTimeout(B);let Z={fieldId:n,formData:d.values,fieldProps:c.props,touched:d.touched.has(n),dirty:d.isDirty},L=c.validation.debounceMs||0;return new Promise(P=>{let O=async()=>{S(n,true);try{let p=await c.validation.validator(z,Z,c.props);p.errors.length>0?y(n,p.errors):R(n),p.warnings&&p.warnings.length>0?E(n,p.warnings):w(n),P(p);}catch(p){let M={isValid:false,errors:[{code:"validation_error",message:p instanceof Error?p.message:"Validation error"}]};y(n,M.errors),P(M);}finally{S(n,false);}};if(L>0){let p=setTimeout(O,L);t.current.set(n,p);}else O();})},[v,d.values,d.touched,d.isDirty,y,E,R,w,S]),I=useCallback(async()=>{let n=v.allFields.map(c=>V(c.id));return (await Promise.all(n)).every(c=>c.isValid)},[v,V]),D=useCallback(n=>{l({type:"RESET",values:n});},[]),A=useCallback(async n=>{if(n?.preventDefault(),!h.current)return true;l({type:"SET_SUBMITTING",isSubmitting:true});try{return await I()?(await h.current(d.values),!0):!1}catch(f){return console.error("Error during form submission:",f),false}finally{l({type:"SET_SUBMITTING",isSubmitting:false});}},[d.values,I]),K=useMemo(()=>({formState:d,formConfig:v,setValue:F,setError:y,setWarning:E,clearError:R,clearWarning:w,markFieldTouched:b,setFieldValidating:S,validateField:V,validateAllFields:I,reset:D,submit:A}),[d,v,F,y,E,R,w,b,S,V,I,D,A]);return jsx(U.Provider,{value:K,children:jsx("form",{onSubmit:A,className:a,noValidate:true,children:i})})}function C(){let i=useContext(U);if(!i)throw new Error("useFormContext must be used within a FormProvider");return i}function rr({formConfig:i,defaultValues:r,onSubmit:o,onFieldChange:s,children:e}){return jsx(_,{formConfig:i,defaultValues:r,onSubmit:o,onFieldChange:s,className:"streamline-form",children:e})}function W({fieldId:i,disabled:r=false,customProps:o={},className:s}){let{formState:e,formConfig:a,setValue:m,markFieldTouched:d,validateField:l}=C(),t=useMemo(()=>a.allFields.find(F=>F.id===i),[a.allFields,i]);if(!t)throw new Error(`Field with ID "${i}" not found`);let h=useMemo(()=>a.config.getComponent(t.componentId),[a.config,t.componentId]);if(!h)throw new Error(`Component with ID "${t.componentId}" not found`);let u=useMemo(()=>({value:e.values[t.id],errors:e.errors[t.id]||[],warnings:e.warnings[t.id]||[],touched:e.touched.has(t.id),validating:e.isValidating.has(t.id)}),[e.values,e.errors,e.warnings,e.touched,e.isValidating,t.id]),y=useCallback(F=>{let v=u.errors.length>0;m(t.id,F),(t.validation?.validateOnChange||v&&t.validation?.validator||u.touched&&t.validation?.validator)&&l(t.id,F);},[t.id,t.validation,m,l,u.errors.length,u.touched]),E=useCallback(()=>{d(t.id),(t.validation?.validateOnBlur||t.validation?.validator)&&l(t.id);},[t.id,t.validation,d,l]),R=useMemo(()=>{if(!t.conditional)return true;try{return t.conditional.condition(e.values)}catch(F){return console.warn(`Conditional evaluation failed for field "${t.id}":`,F),true}},[t.conditional,e.values,t.id]),w=useMemo(()=>{if(!t.conditional||!R)return {};switch(t.conditional.action){case "disable":return {disabled:true};case "require":return {required:true};default:return {}}},[t.conditional,R]);if(!R&&t.conditional?.action==="hide")return null;let b=useMemo(()=>({...h.defaultProps,...t.props,...o,...w}),[h.defaultProps,t.props,o,w]),S=useMemo(()=>({id:t.id,props:b,value:u.value,onChange:y,onBlur:E,error:u.errors,warnings:u.warnings,touched:u.touched,disabled:r||w.disabled,isValidating:u.validating}),[t.id,b,u.value,y,E,u.errors,u.warnings,u.touched,r,w.disabled,u.validating]);return jsx("div",{className:er("streamline-form-field",s),"data-field-id":t.id,"data-field-type":h.subType,children:h.renderer(S)})}var q=ir.memo(W);function H({row:i,className:r}){let{formConfig:o}=C(),s=o.renderConfig?.rowRenderer;if(!s)throw new Error(`No rowRenderer configured for form "${o.id}". Please configure a rowRenderer using config.setRowRenderer() or config.setFormRenderConfig().`);let e=i.fields.map(m=>jsx(q,{fieldId:m.id},m.id)),a={row:i,children:e,className:r,spacing:i.spacing,alignment:i.alignment};return s(a)}var J=H;function ar({className:i}){let{formConfig:r}=C(),o=r.renderConfig?.bodyRenderer;if(!o)throw new Error(`No bodyRenderer configured for form "${r.id}". Please configure a bodyRenderer using config.setBodyRenderer() or config.setFormRenderConfig().`);let s=useMemo(()=>r.rows.map(a=>jsx(J,{row:a},a.id)),[r.rows]);return o({formConfig:r,children:s,className:i})}function lr({className:i,children:r}){let{formState:o,submit:s,formConfig:e}=C(),a=e.renderConfig?.submitButtonRenderer;if(!a)throw new Error(`No submitButtonRenderer configured for form "${e.id}". Please configure a submitButtonRenderer using config.setSubmitButtonRenderer() or config.setFormRenderConfig().`);let m={isSubmitting:o.isSubmitting,isValid:o.isValid,isDirty:o.isDirty,onSubmit:s,className:i,children:r};return a(m)}var x=class i{constructor(r,o){this.rows=[];this.rowCounter=0;this.config=r,this.formId=o||`form-${Date.now()}`;}static create(r,o){return new i(r,o)}addField(r,o,s={},e){return this.addRowFields([{fieldId:r,componentSubType:o,props:s,validation:e?.validation,conditional:e?.conditional}])}addRowFields(r,o){if(r.length===0)throw new Error("At least one field is required");if(r.length>3)throw new Error("Maximum 3 fields per row");let s=`row-${++this.rowCounter}`,e=[];for(let m of r){let d=this.config.getComponentsBySubType(m.componentSubType);if(d.length===0)throw new Error(`No component found with subType "${m.componentSubType}"`);let l=d[0],t={id:m.fieldId,componentId:l.id,props:{...l.defaultProps,...m.props},validation:m.validation,conditional:m.conditional};e.push(t);}let a={id:s,fields:e,maxColumns:r.length,spacing:o?.spacing||"normal",alignment:o?.alignment||"stretch"};return this.rows.push(a),this}addFields(r){for(let o of r)this.addField(o.fieldId,o.componentSubType,o.props,{validation:o.validation,conditional:o.conditional});return this}setId(r){return this.formId=r,this}updateField(r,o){let s=false;for(let e of this.rows){let a=e.fields.findIndex(m=>m.id===r);a!==-1&&(e.fields[a]={...e.fields[a],...o,props:{...e.fields[a].props,...o.props}},s=true);}if(!s)throw new Error(`Field with ID "${r}" not found`);return this}removeField(r){for(let o of this.rows){let s=o.fields.filter(e=>e.id!==r);Object.assign(o,{fields:s});}return this.rows=this.rows.filter(o=>o.fields.length>0),this}getField(r){for(let o of this.rows){let s=o.fields.find(e=>e.id===r);if(s)return s}}getFields(){return this.rows.flatMap(r=>r.fields)}getRows(){return [...this.rows]}clear(){return this.rows=[],this.rowCounter=0,this}clone(r){let o=new i(this.config,r);return o.rows=this.rows.map(s=>({...s,fields:s.fields.map(e=>({...e}))})),o.rowCounter=this.rowCounter,o}validate(){let r=[],o=this.getFields(),s=o.map(a=>a.id),e=s.filter((a,m)=>s.indexOf(a)!==m);e.length>0&&r.push(`Duplicate field IDs: ${e.join(", ")}`);for(let a of o)this.config.hasComponent(a.componentId)||r.push(`Component "${a.componentId}" not found for field "${a.id}"`);for(let a of this.rows)a.fields.length>3&&r.push(`Row "${a.id}" has ${a.fields.length} fields, maximum is 3`),a.fields.length===0&&r.push(`Row "${a.id}" is empty`);return r}build(){let r=this.validate();if(r.length>0)throw new Error(`Form validation failed: ${r.join(", ")}`);return {id:this.formId,rows:[...this.rows],allFields:this.getFields(),config:this.config,renderConfig:this.config.getFormRenderConfig()}}toJSON(){return {id:this.formId,rows:this.rows}}fromJSON(r){return r.id&&(this.formId=r.id),r.rows&&(this.rows=r.rows,this.rowCounter=this.rows.length),this}getStats(){let r=this.getFields(),o=this.rows.map(s=>s.fields.length);return {totalFields:r.length,totalRows:this.rows.length,averageFieldsPerRow:this.rows.length>0?r.length/this.rows.length:0,maxFieldsInRow:o.length>0?Math.max(...o):0,minFieldsInRow:o.length>0?Math.min(...o):0}}};export{rr as Form,ar as FormBody,x as FormBuilder,W as FormField,_ as FormProvider,H as FormRow,lr as FormSubmitButton,x as form,C as useFormContext};
|
|
1
|
+
import Xe,{createContext,useMemo,useCallback,useContext,useRef,useEffect,useState}from'react';import {ComponentRendererWrapper,IdGenerator,deepClone,ensureUnique,hasUnifiedValidation,createValidationContext,validateWithUnifiedConfig,validateFormWithUnifiedConfig,getGlobalMonitor,evaluateCondition}from'@rilaykit/core';import {useStore,createStore}from'zustand';import {subscribeWithSelector}from'zustand/middleware';import {jsx}from'react/jsx-runtime';var x=class o{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 o(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 r=t.validation?.validate,n=e.validation?.validate;if(!r)return n;if(!n)return r;let a=Array.isArray(r)?r:[r],s=Array.isArray(n)?n:[n];return [...a,...s]})()}),{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 {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 r=this.createRow(t);return this.rows.push(r),this}if(t.length<=3){let r=this.createRow(t);return this.rows.push(r),this}for(let r of t){let n=this.createRow([r]);this.rows.push(n);}return this}addSeparateRows(e){for(let t of e)this.add(t);return 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){let i=t.fields.find(r=>r.id===e);if(i)return i}return null}removeField(e){return this.rows=this.rows.map(t=>({...t,fields:t.fields.filter(i=>i.id!==e)})).filter(t=>t.fields.length>0),this}getField(e){return this.findField(e)||void 0}getFields(){return this.rows.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 r={...i.validation,...t};return this.updateField(e,{validation:r})}addFieldConditions(e,t){let i=this.findField(e);if(!i)throw new Error(`Field with ID "${e}" not found`);let r={...i.conditions,...t};return this.updateField(e,{conditions:r})}clone(e){let t=new o(this.config,e||`${this.formId}-clone`);return t.rows=deepClone(this.rows),t}validate(){let e=[],t=this.getFields(),i=t.map(r=>r.id);try{ensureUnique(i,"field");}catch(r){e.push(r instanceof Error?r.message:String(r));}for(let r of t)this.config.hasComponent(r.componentId)||e.push(`Component "${r.componentId}" not found for field "${r.id}"`);for(let r of this.rows)r.fields.length>3&&e.push(`Row "${r.id}" has ${r.fields.length} fields, maximum is 3`),r.fields.length===0&&e.push(`Row "${r.id}" is empty`);return e}build(){let e=this.validate();if(e.length>0)throw new Error(`Form validation failed: ${e.join(", ")}`);return {id:this.formId,rows:[...this.rows],allFields:this.getFields(),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),this}getStats(){let e=this.getFields(),t=this.rows.map(i=>i.fields.length);return {totalFields:e.length,totalRows:this.rows.length,averageFieldsPerRow:this.rows.length>0?e.length/this.rows.length:0,maxFieldsInRow:t.length>0?Math.max(...t):0,minFieldsInRow:t.length>0?Math.min(...t):0}}};function Ft(o,e={},t={}){return useMemo(()=>{if(!o)return {visible:t.visible??true,disabled:t.disabled??false,required:t.required??false,readonly:t.readonly??false};let i=r=>{try{return r&&typeof r=="object"&&"build"in r?evaluateCondition(r.build(),e):evaluateCondition(r,e)}catch(n){return console.warn("Error evaluating condition:",n),false}};return {visible:o.visible?i(o.visible):t.visible??true,disabled:o.disabled?i(o.disabled):t.disabled??false,required:o.required?i(o.required):t.required??false,readonly:o.readonly?i(o.readonly):t.readonly??false}},[o,e,t])}function oe(o,e={}){return useMemo(()=>{let t={};for(let[i,r]of Object.entries(o))if(t[i]={visible:true,disabled:false,required:false,readonly:false},r){let n=a=>{try{return a&&typeof a=="object"&&"build"in a?evaluateCondition(a.build(),e):evaluateCondition(a,e)}catch(s){return console.warn(`Error evaluating condition for field ${i}:`,s),false}};t[i]={visible:r.visible?n(r.visible):true,disabled:r.disabled?n(r.disabled):false,required:r.required?n(r.required):false,readonly:r.readonly?n(r.readonly):false};}return t},[o,e])}function $(o={}){return createStore()(subscribeWithSelector((e,t)=>({values:{...o},errors:{},validationStates:{},touched:{},isDirty:false,isSubmitting:false,isValid:true,_defaultValues:{...o},_fieldConditions:{},_setValue:(i,r)=>{e(n=>({values:{...n.values,[i]:r},isDirty:true}));},_setTouched:i=>{e(r=>({touched:{...r.touched,[i]:true}}));},_setErrors:(i,r)=>{e(n=>{let a={...n.errors,[i]:r},s=r.length>0?"invalid":"valid";return {errors:a,validationStates:{...n.validationStates,[i]:s}}}),t()._updateIsValid();},_clearErrors:i=>{e(r=>{let n={...r.errors};return delete n[i],{errors:n,validationStates:{...r.validationStates,[i]:"idle"}}}),t()._updateIsValid();},_setValidationState:(i,r)=>{e(n=>({validationStates:{...n.validationStates,[i]:r}}));},_setSubmitting:i=>{e({isSubmitting:i});},_reset:i=>{let r=i??t()._defaultValues;e({values:{...r},errors:{},validationStates:{},touched:{},isDirty:false,isSubmitting:false,isValid:true});},_setFieldConditions:(i,r)=>{e(n=>({_fieldConditions:{...n._fieldConditions,[i]:r}}));},_updateIsValid:()=>{let i=t(),r=Object.values(i.errors).some(a=>a&&a.length>0),n=Object.values(i.validationStates).some(a=>a==="invalid");e({isValid:!r&&!n});}})))}var O=createContext(null);function v(){let o=useContext(O);if(!o)throw new Error("useFormStore must be used within a FormProvider");return o}var re=[];function N(o){let e=v();return useStore(e,t=>t.values[o])}function Me(o){let e=v();return useStore(e,t=>t.errors[o]??re)}function Be(o){let e=v();return useStore(e,t=>t.touched[o]??false)}function Te(o){let e=v();return useStore(e,t=>t.validationStates[o]??"idle")}var De={visible:true,disabled:false,required:false,readonly:false};function P(o){let e=v();return useStore(e,t=>t._fieldConditions[o]??De)}function W(o){let e=v(),t=useStore(e,s=>s.values[o]),i=useStore(e,s=>s.errors[o]??re),r=useStore(e,s=>s.validationStates[o]??"idle"),n=useStore(e,s=>s.touched[o]??false),a=useStore(e,s=>s._defaultValues[o]);return {value:t,errors:i,validationState:r,touched:n,dirty:t!==a}}function qe(){let o=v();return useStore(o,e=>e.isSubmitting)}function Oe(){let o=v();return useStore(o,e=>e.isValid)}function Ue(){let o=v();return useStore(o,e=>e.isDirty)}function Ae(){let o=v();return useStore(o,e=>e.values)}function H(){let o=v(),e=useStore(o,r=>r.isSubmitting),t=useStore(o,r=>r.isValid),i=useStore(o,r=>r.isDirty);return {isSubmitting:e,isValid:t,isDirty:i}}function L(o){let e=v();return {setValue:t=>e.getState()._setValue(o,t),setTouched:()=>e.getState()._setTouched(o),setErrors:t=>e.getState()._setErrors(o,t),clearErrors:()=>e.getState()._clearErrors(o),setValidationState:t=>e.getState()._setValidationState(o,t)}}function Ie(){let o=v();return {setValue:(e,t)=>o.getState()._setValue(e,t),setTouched:e=>o.getState()._setTouched(e),setErrors:(e,t)=>o.getState()._setErrors(e,t),setSubmitting:e=>o.getState()._setSubmitting(e),reset:e=>o.getState()._reset(e),setFieldConditions:(e,t)=>o.getState()._setFieldConditions(e,t)}}function B(){return v()}var se={visible:true,disabled:false,required:false,readonly:false};function ae(o){try{return JSON.stringify(o)}catch{return String(Date.now())}}function U(o,e){if(o)try{return typeof o=="object"&&"build"in o?evaluateCondition(o.build(),e):evaluateCondition(o,e)}catch(t){console.warn("Error evaluating condition:",t);return}}function j(o,e){if(!o)return se;let t=U(o.visible,e),i=U(o.disabled,e),r=U(o.required,e),n=U(o.readonly,e);return {visible:t??true,disabled:i??false,required:r??false,readonly:n??false}}function Vt(o,e={}){let{conditions:t,skip:i=false}=e,r=B(),n=P(o),a=useRef(null);if(i||!t)return n;let s=r.getState().values,F=ae(s);if(a.current?.valuesHash===F)return a.current.result;let m=j(t,s);return a.current={result:m,valuesHash:F},m}function xt(){let o=B(),e=useRef(new Map),t=useRef("");return useMemo(()=>function(r,n){if(!n)return se;let a=o.getState().values,s=ae(a);t.current!==s&&(e.current.clear(),t.current=s);let F=e.current.get(r);if(F)return F.result;let m=j(n,a);return e.current.set(r,{result:m,valuesHash:s}),m},[o])}function Pt(o,e){let t=B(),i=P(o),r=useMemo(()=>()=>{if(!e)return i;let n=t.getState().values;return j(e,n)},[t,e,i]);return {conditions:i,refresh:r}}function de({formConfig:o,formValues:e}){let t=useMemo(()=>{let l={};for(let u of o.allFields)u.conditions&&(l[u.id]=u.conditions);return l},[o.allFields]),i=useMemo(()=>Object.keys(t).length>0,[t]),r=oe(i?t:{},i?e:{}),n=useCallback(l=>r[l],[r]),a=useCallback(l=>{let u=r[l];return u?u.visible:true},[r]),s=useCallback(l=>{let u=r[l];return u?u.disabled:false},[r]),F=useCallback(l=>{let u=r[l];return u?u.required:false},[r]),m=useCallback(l=>{let u=r[l];return u?u.readonly:false},[r]);return useMemo(()=>({fieldConditions:r,hasConditionalFields:i,getFieldCondition:n,isFieldVisible:a,isFieldDisabled:s,isFieldRequired:F,isFieldReadonly:m}),[r,i,n,a,s,F,m])}function le({store:o,onSubmit:e,validateForm:t}){let i=useRef(e);return i.current=e,{submit:useCallback(async n=>{n?.preventDefault();let a=o.getState();if(a.isSubmitting)return false;a._setSubmitting(true);try{if(!(await t()).isValid)return a._setSubmitting(!1),!1;let F=o.getState().values;return i.current&&await i.current(F),a._setSubmitting(!1),!0}catch(s){return a._setSubmitting(false),console.error("Form submission error:",s),false}},[o,t])}}function A(){return {isValid:true,errors:[]}}function fe({formConfig:o,store:e,conditionsHelpers:t}){let i=useRef(o),r=useRef(t);i.current=o,r.current=t;let n=useCallback(async(s,F)=>{let m=i.current.allFields.find(d=>d.id===s),l=e.getState();if(!m)return A();if(!r.current.isFieldVisible(s))return l._setErrors(s,[]),l._setValidationState(s,"valid"),A();if(!m.validation||!hasUnifiedValidation(m.validation))return l._setErrors(s,[]),l._setValidationState(s,"valid"),A();let u=F!==void 0?F:l.values[s],c=createValidationContext({fieldId:s,formId:i.current.id,allFormData:{...l.values,[s]:u}});l._setValidationState(s,"validating");try{let d=await validateWithUnifiedConfig(m.validation,u,c),f=r.current.isFieldRequired(s),p=u==null||u==="";if(f&&p&&!d.errors.some(g=>g.code==="REQUIRED"||g.message.toLowerCase().includes("required"))){let g={isValid:!1,errors:[{message:"This field is required",code:"CONDITIONAL_REQUIRED"},...d.errors]};return l._setErrors(s,g.errors),l._setValidationState(s,"invalid"),g}return l._setErrors(s,d.errors),l._setValidationState(s,d.isValid?"valid":"invalid"),d}catch(d){let f={isValid:false,errors:[{message:d instanceof Error?d.message:"Validation failed",code:"VALIDATION_ERROR"}]};return l._setErrors(s,f.errors),l._setValidationState(s,"invalid"),f}},[e]),a=useCallback(async()=>{let s=e.getState(),F=i.current.allFields.filter(d=>{let f=r.current.isFieldVisible(d.id),p=d.validation&&hasUnifiedValidation(d.validation);return f&&p}),m=i.current.allFields.filter(d=>!r.current.isFieldVisible(d.id));for(let d of m)s._setErrors(d.id,[]),s._setValidationState(d.id,"valid");let l=await Promise.all(F.map(d=>n(d.id))),u=l.some(d=>!d.isValid),c=A();if(i.current.validation&&hasUnifiedValidation(i.current.validation)){let d=Object.keys(s.values).reduce((p,b)=>(r.current.isFieldVisible(b)&&(p[b]=s.values[b]),p),{}),f=createValidationContext({formId:i.current.id,allFormData:d});try{c=await validateFormWithUnifiedConfig(i.current.validation,d,f);}catch(p){c={isValid:false,errors:[{message:p instanceof Error?p.message:"Form validation failed",code:"FORM_VALIDATION_ERROR"}]};}}return {isValid:!u&&c.isValid,errors:[...l.flatMap(d=>d.errors),...c.errors]}},[e,n]);return {validateField:n,validateForm:a}}function je({formConfig:o,enabled:e=true}){let t=getGlobalMonitor(),i=useRef(null),r=useRef(0),n=useRef(0);useEffect(()=>{t&&e&&(i.current=t.getProfiler());},[t,e]);let a=useCallback(c=>{if(!t||!e)return;r.current++;let d={formId:o.id,fieldCount:o.allFields.length,timestamp:Date.now(),duration:0,renderDuration:0,validationDuration:0,validationErrors:0,renderCount:c||r.current};t.track("component_render",`form_${o.id}`,{formId:o.id,fieldCount:o.allFields.length,renderCount:r.current},d,"low");},[t,e,o.id,o.allFields.length]),s=useCallback((c,d)=>{if(!t||!e)return;let f=i.current?.getMetrics(`form_validation_${o.id}`),p={formId:o.id,fieldCount:d||o.allFields.length,timestamp:Date.now(),duration:f?.duration||0,renderDuration:0,validationDuration:f?.duration||0,validationErrors:c,renderCount:r.current};t.track("form_validation",`form_${o.id}`,{formId:o.id,validationErrors:c,fieldCount:d||o.allFields.length},p,c>0?"medium":"low");},[t,e,o.id,o.allFields.length]),F=useCallback((c,d)=>{if(!t||!e)return;let f=i.current?.getMetrics(`form_submission_${o.id}`),p={formId:o.id,fieldCount:d||o.allFields.length,timestamp:Date.now(),duration:f?.duration||0,renderDuration:0,validationDuration:0,validationErrors:c?0:1,renderCount:r.current};t.track("form_submission",`form_${o.id}`,{formId:o.id,success:c,fieldCount:d||o.allFields.length,fieldChanges:n.current},p,c?"low":"high");},[t,e,o.id,o.allFields.length]),m=useCallback((c,d)=>{!t||!e||(n.current++,t.track("component_update",`field_${c}`,{formId:o.id,fieldId:c,componentType:d,changeCount:n.current},void 0,"low"));},[t,e,o.id]),l=useCallback(c=>{!i.current||!e||i.current.start(c,{formId:o.id,renderCount:r.current});},[e,o.id]),u=useCallback(c=>{if(!i.current||!e)return null;let d=i.current.end(c);return d?{...d,formId:o.id,fieldCount:o.allFields.length,renderDuration:d.duration,validationDuration:0,validationErrors:0}:null},[e,o.id,o.allFields.length]);return {trackFormRender:a,trackFormValidation:s,trackFormSubmission:F,trackFieldChange:m,startPerformanceTracking:l,endPerformanceTracking:u}}var Ce=createContext(null);function y(){let o=useContext(Ce);if(!o)throw new Error("useFormConfigContext must be used within a FormProvider");return o}function K({children:o,formConfig:e,defaultValues:t={},onSubmit:i,onFieldChange:r,className:n}){let[a]=useState(()=>$(t)),s=useRef(e.id),F=useRef(r);F.current=r,useEffect(()=>F.current?a.subscribe(C=>C.values,(C,M)=>{for(let R of Object.keys(C))C[R]!==M[R]&&F.current?.(R,C[R],C);}):void 0,[a]),useEffect(()=>{s.current!==e.id&&(s.current=e.id,a.getState()._reset(t));},[e.id,a,t]);let[m,l]=useState(()=>a.getState().values);useEffect(()=>a.subscribe(C=>C.values,C=>l(C)),[a]);let{fieldConditions:u,hasConditionalFields:c,getFieldCondition:d,isFieldVisible:f,isFieldDisabled:p,isFieldRequired:b,isFieldReadonly:g}=de({formConfig:e,formValues:m});useEffect(()=>{for(let[V,C]of Object.entries(u)){let M={visible:C.visible,disabled:C.disabled,required:C.required,readonly:C.readonly};a.getState()._setFieldConditions(V,M);}},[u,a]);let w=useMemo(()=>({hasConditionalFields:c,getFieldCondition:d,isFieldVisible:f,isFieldDisabled:p,isFieldRequired:b,isFieldReadonly:g}),[c,d,f,p,b,g]),{validateField:_,validateForm:S}=fe({formConfig:e,store:a,conditionsHelpers:w}),{submit:k}=le({store:a,onSubmit:i,validateForm:S}),D=useMemo(()=>({formConfig:e,conditionsHelpers:w,validateField:_,validateForm:S,submit:k}),[e,w,_,S,k]);return jsx(O.Provider,{value:a,children:jsx(Ce.Provider,{value:D,children:jsx("form",{onSubmit:k,className:n,noValidate:true,children:o})})})}function Ye({formConfig:o,defaultValues:e,onSubmit:t,onFieldChange:i,children:r}){let n=useMemo(()=>o instanceof x?o.build():o,[o]);return jsx(K,{formConfig:n,defaultValues:e,onSubmit:t,onFieldChange:i,children:r})}var Z=Xe.memo(function({fieldId:e,disabled:t=false,customProps:i={},className:r,forceVisible:n=false}){let{formConfig:a,validateField:s,conditionsHelpers:F}=y(),m=N(e),l=W(e),u=P(e),{setValue:c,setTouched:d}=L(e),f=a.allFields.find(R=>R.id===e);if(!f)throw new Error(`Field with ID "${e}" not found`);let p=a.config.getComponent(f.componentId);if(!p)throw new Error(`Component with ID "${f.componentId}" not found`);let b=l.validationState==="validating",g=useMemo(()=>({isVisible:n||u.visible,isFieldDisabled:t||u.disabled,isFieldRequired:u.required||F.isFieldRequired(e),isFieldReadonly:u.readonly}),[n,t,u,F,e]),w=useCallback(async R=>{c(R),(f.validation?.validateOnChange||l.touched)&&await s(e,R);},[e,c,s,f.validation?.validateOnChange,l.touched]),_=useCallback(async()=>{l.touched||d(),f.validation?.validateOnBlur!==false&&await s(e);},[e,l.touched,d,s,f.validation?.validateOnBlur]),S=useMemo(()=>({...p.defaultProps??{},...f.props,...i,disabled:g.isFieldDisabled,required:g.isFieldRequired,readOnly:g.isFieldReadonly}),[p.defaultProps,f.props,i,g.isFieldDisabled,g.isFieldRequired,g.isFieldReadonly]),k=useMemo(()=>({id:e,props:S,value:m,onChange:w,onBlur:_,disabled:g.isFieldDisabled,error:l.errors,isValidating:b,touched:l.touched}),[e,S,m,w,_,g.isFieldDisabled,l.errors,b,l.touched]);if(!g.isVisible)return null;let D=p.renderer(k),V=a.renderConfig?.fieldRenderer,C=p.useFieldRenderer!==false,M=V&&C?V({children:D,id:e,...S,error:l.errors,isValidating:b,touched:l.touched}):D;return jsx("div",{className:r,"data-field-id":e,"data-field-type":p.type,"data-field-visible":g.isVisible,"data-field-disabled":g.isFieldDisabled,"data-field-required":g.isFieldRequired,"data-field-readonly":g.isFieldReadonly,children:M})});var be=Xe.memo(function({row:e,className:t,...i}){let{formConfig:r,conditionsHelpers:n}=y(),a=useMemo(()=>e.fields.filter(m=>n.isFieldVisible(m.id)),[e.fields,n]),s=useMemo(()=>a.map(m=>jsx(Z,{fieldId:m.id},m.id)),[a]),F=useMemo(()=>({row:e,children:s,className:t}),[e,s,t]);return a.length===0?null:jsx(ComponentRendererWrapper,{name:"FormRow",renderer:r.renderConfig?.rowRenderer,props:F,...i,children:s})}),Re=be;var it=Xe.memo(function({className:e,...t}){let{formConfig:i}=y(),r=useMemo(()=>i.rows.map(a=>jsx(Re,{row:a},a.id)),[i.rows]),n=useMemo(()=>({formConfig:i,children:r,className:e}),[i,r,e]);return jsx(ComponentRendererWrapper,{name:"FormBody",renderer:i.renderConfig?.bodyRenderer,props:n,...t,children:r})});var dt=Xe.memo(function({className:e,isSubmitting:t,...i}){let{formConfig:r,submit:n}=y(),{isSubmitting:a}=H(),s=useMemo(()=>({isSubmitting:t??a,onSubmit:n,className:e}),[t,a,n,e]);return jsx(ComponentRendererWrapper,{name:"FormSubmitButton",renderer:r.renderConfig?.submitButtonRenderer,props:s,...i})});export{Ye as Form,it as FormBody,x as FormBuilder,Z as FormField,K as FormProvider,be as FormRow,O as FormStoreContext,dt as FormSubmitButton,$ as createFormStore,x as form,Ft as useConditionEvaluation,xt as useConditionEvaluator,L as useFieldActions,P as useFieldConditions,Vt as useFieldConditionsLazy,Pt as useFieldConditionsWithRefresh,Me as useFieldErrors,W as useFieldState,Be as useFieldTouched,Te as useFieldValidationState,N as useFieldValue,Ie as useFormActions,de as useFormConditions,y as useFormConfigContext,Ue as useFormDirty,je as useFormMonitoring,v as useFormStore,B as useFormStoreApi,le as useFormSubmissionWithStore,H as useFormSubmitState,qe as useFormSubmitting,Oe as useFormValid,fe as useFormValidationWithStore,Ae as useFormValues,oe as useMultipleConditionEvaluation};
|
package/package.json
CHANGED
|
@@ -1,9 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rilaykit/forms",
|
|
3
|
-
"version": "0.1.1
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"private": false,
|
|
4
5
|
"description": "Form building utilities and components for RilayKit",
|
|
5
6
|
"main": "dist/index.js",
|
|
7
|
+
"module": "dist/index.mjs",
|
|
6
8
|
"types": "dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.mjs",
|
|
13
|
+
"require": "./dist/index.js"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
7
16
|
"files": [
|
|
8
17
|
"dist"
|
|
9
18
|
],
|
|
@@ -13,11 +22,19 @@
|
|
|
13
22
|
"form-builder",
|
|
14
23
|
"typescript"
|
|
15
24
|
],
|
|
16
|
-
"author": "
|
|
25
|
+
"author": "AND YOU CREATE <contact@andyoucreate.com>",
|
|
17
26
|
"license": "MIT",
|
|
27
|
+
"homepage": "https://rilay.io",
|
|
28
|
+
"repository": {
|
|
29
|
+
"type": "git",
|
|
30
|
+
"url": "https://github.com/andyoucreate/rilay.git"
|
|
31
|
+
},
|
|
32
|
+
"bugs": {
|
|
33
|
+
"url": "https://github.com/andyoucreate/rilay/issues"
|
|
34
|
+
},
|
|
18
35
|
"dependencies": {
|
|
19
|
-
"
|
|
20
|
-
"@rilaykit/core": "0.1.1
|
|
36
|
+
"zustand": "^5.0.5",
|
|
37
|
+
"@rilaykit/core": "0.1.1"
|
|
21
38
|
},
|
|
22
39
|
"peerDependencies": {
|
|
23
40
|
"react": ">=18.0.0",
|
|
@@ -27,16 +44,13 @@
|
|
|
27
44
|
"@testing-library/jest-dom": "^6.6.3",
|
|
28
45
|
"@testing-library/react": "^16.3.0",
|
|
29
46
|
"@testing-library/user-event": "^14.6.1",
|
|
30
|
-
"@types/react": "^18.
|
|
31
|
-
"@types/react-dom": "^18.
|
|
47
|
+
"@types/react": "^18.3.23",
|
|
48
|
+
"@types/react-dom": "^18.3.0",
|
|
32
49
|
"react": "^18.3.1",
|
|
33
50
|
"react-dom": "^18.3.1",
|
|
34
|
-
"typescript": "^5.3
|
|
51
|
+
"typescript": "^5.8.3",
|
|
35
52
|
"vitest": "^3.2.4"
|
|
36
53
|
},
|
|
37
|
-
"publishConfig": {
|
|
38
|
-
"access": "public"
|
|
39
|
-
},
|
|
40
54
|
"scripts": {
|
|
41
55
|
"build": "tsup",
|
|
42
56
|
"dev": "tsup --watch",
|