UNPKG

@uplink-protocol/form-controller

Version:

Reactive multi-step form controller with dynamic validation and state management

2 lines 27.3 kB
var e={473:(e,i,t)=>{t.r(i),t.d(i,{getValidator:()=>c,predefinedValidators:()=>o,registerValidator:()=>s,runValidator:()=>a,unregisterValidator:()=>n});const r={},s=(e,i)=>{r[e]&&console.warn(`Validator '${e}' already exists and will be overwritten.`),r[e]=i},n=e=>!!r[e]&&(delete r[e],!0),c=e=>r[e],a=(e,i,t,s)=>{const n=r[e];return n?(s&&(t={...t,field:{...t.field,validation:{...t.field.validation,dynamicValidatorParams:s}}}),n(i,t)):(console.warn(`Validator '${e}' not found.`),!0)};s("requiredIf",((e,i)=>{const{condition:t,fields:r,errorMessage:s}=i.field.validation?.dynamicValidatorParams||{};if(!t||!r||!r.length)return!0;const n=r.map((e=>i.formData[e]));let c=!1;switch(t){case"equals":const e=i.field.validation?.dynamicValidatorParams?.value;c=n.some((i=>i===e));break;case"notEmpty":c=n.every((e=>null!=e&&""!==e));break;case"notEquals":const t=i.field.validation?.dynamicValidatorParams?.value;c=n.every((e=>e!==t));break;default:return!0}return!c||("checkbox"===i.field.type?!1!==e:null!=e&&""!==e)||(s||`${i.field.label} is required`)})),s("equals",((e,i)=>{const{targetValue:t,targetField:r,errorMessage:s}=i.field.validation?.dynamicValidatorParams||{};let n;if(r)n=i.formData[r];else{if(void 0===t)return!0;n=t}return e===n||s||`${i.field.label} must equal ${r?"the other field":t}`}));const o={requiredIf:"requiredIf",equals:"equals"}}},i={};function t(r){var s=i[r];if(void 0!==s)return s.exports;var n=i[r]={exports:{}};return e[r](n,n.exports,t),n.exports}t.d=(e,i)=>{for(var r in i)t.o(i,r)&&!t.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:i[r]})},t.o=(e,i)=>Object.prototype.hasOwnProperty.call(e,i),t.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};class r{constructor(e){Object.defineProperty(this,"current",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_callbacks",{enumerable:!0,configurable:!0,writable:!0,value:[]}),this.current=e}subscribe(e){return this._callbacks.push(e),e(this.current),()=>{this._callbacks=this._callbacks.filter((i=>i!==e))}}set(e){this.current=e,this._callbacks&&this._callbacks.length&&this._callbacks.forEach((i=>i(e)))}get(){return this.current}}class s extends r{constructor(e){super(e)}updateConfig(e){this.set(e)}updateConfigAndReset(e,i){this.updateConfig(e),i()}addStep(e,i){const t={...this.current},r=[...t.steps],s=void 0!==i?i:r.length;return r.splice(s,0,e),t.steps=r,this.set(t),r.length}removeStep(e){const i={...this.current};return-1!==i.steps.findIndex((i=>i.id===e))&&(i.steps=i.steps.filter((i=>i.id!==e)),this.set(i),!0)}getStepById(e){return this.current.steps.find((i=>i.id===e))}getStepByIndex(e){return this.current.steps[e]}get totalSteps(){return this.current.steps.length}}var n=t(473);const c=(e,i,t,r=!1)=>{if(e.disabled)return{isValid:!0};const s=[],c=!0===e.required||e.validation&&!0===e.validation.required,a="checkbox"===e.type||"boolean"==typeof i?!1===i:null==i||""===i;if(c&&a){const i=e.validation?.errorMessages?.required||e.validation?.errorMessage||`${e.label} is required`;if(!r)return{isValid:!1,error:i,errors:[i]};s.push(i)}if(!e.validation)return s.length?{isValid:!1,error:s[0],errors:s}:{isValid:!0};const o=e.validation;if(null==i||""===i)return s.length?{isValid:!1,error:s[0],errors:s}:{isValid:!0};switch(e.type){case"email":if(!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(String(i))){const e=o.errorMessages?.email||o.errorMessage||"Please enter a valid email address";if(s.push(e),!r)return{isValid:!1,error:e,errors:s}}break;case"text":case"textarea":case"password":if(void 0!==o.minLength&&String(i).length<o.minLength){const i=o.errorMessages?.minLength||o.errorMessage||`${e.label} must be at least ${o.minLength} characters`;if(s.push(i),!r)return{isValid:!1,error:i,errors:s}}if(void 0!==o.maxLength&&String(i).length>o.maxLength){const i=o.errorMessages?.maxLength||o.errorMessage||`${e.label} cannot exceed ${o.maxLength} characters`;if(s.push(i),!r)return{isValid:!1,error:i,errors:s}}if(o.pattern&&!(o.pattern instanceof RegExp?o.pattern:new RegExp(o.pattern)).test(String(i))){const i=o.errorMessages?.pattern||o.errorMessage||`${e.label} format is invalid`;if(s.push(i),!r)return{isValid:!1,error:i,errors:s}}break;case"number":case"tel":if(void 0!==o.min&&Number(i)<o.min){const i=o.errorMessages?.min||o.errorMessage||`${e.label} must be at least ${o.min}`;if(s.push(i),!r)return{isValid:!1,error:i,errors:s}}if(void 0!==o.max&&Number(i)>o.max){const i=o.errorMessages?.max||o.errorMessage||`${e.label} cannot exceed ${o.max}`;if(s.push(i),!r)return{isValid:!1,error:i,errors:s}}}if(o.custom){const t=o.custom(i);if(!1===t){const i=o.errorMessages?.custom||o.errorMessage||`${e.label} is invalid`;if(s.push(i),!r)return{isValid:!1,error:i,errors:s}}else if("string"==typeof t&&(s.push(t),!r))return{isValid:!1,error:t,errors:s}}const l={field:e,formData:t?.formData||{},stepId:t?.stepId||"",fieldId:t?.fieldId||""};if(o.dynamicValidator&&t){const t=(0,n.runValidator)(o.dynamicValidator,i,l,o.dynamicValidatorParams);if(!1===t){const i=o.errorMessage||`${e.label} is invalid`;if(s.push(i),!r)return{isValid:!1,error:i,errors:s}}else if("string"==typeof t&&(s.push(t),!r))return{isValid:!1,error:t,errors:s}}if(o.dynamicValidators&&o.dynamicValidators.length>0&&t)for(const t of o.dynamicValidators){const c=(0,n.runValidator)(t.name,i,l,t.params);if(!1===c){const i=t.errorMessage||o.errorMessage||`${e.label} is invalid`;if(s.push(i),!r)return{isValid:!1,error:i,errors:s}}else if("string"==typeof c&&(s.push(c),!r))return{isValid:!1,error:c,errors:s}}return s.length>0?{isValid:!1,error:s[0],errors:s}:{isValid:!0}};class a{constructor(e,i,t,r){Object.defineProperty(this,"configService",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"formService",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"fieldErrorsService",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"stepsValidityService",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.configService=e,this.formService=i,this.fieldErrorsService=t,this.stepsValidityService=r}validateField(e,i,t,r=!0){const s=this.configService.getStepById(e);if(!s)return!1;const n=s.fields[i];if(!n)return!1;const a=void 0!==t?t:this.formService.get()[e]?.[i],o={field:n,fieldId:i,stepId:e,formData:this.formService.get()[e]||{}},l=!0===n.validation?.collectAllErrors,d=c(n,a,o,l);if(r){const t={...this.fieldErrorsService.get()};t[e]||(t[e]={}),d.isValid?delete t[e][i]:d.errors&&d.errors.length>1&&l?t[e][i]=d.errors.join(" | "):t[e][i]=d.error||"Invalid field",this.fieldErrorsService.set(t)}else if(d.isValid){const t={...this.fieldErrorsService.get()};t[e]&&t[e][i]&&(delete t[e][i],this.fieldErrorsService.set(t))}return d.isValid}validateStep(e,i=!0){const t=this.configService.getStepById(e);if(!t)return!1;let r=!0;const s=this.formService.getStepData(e);if(Object.keys(t.fields).forEach((t=>{this.validateField(e,t,s[t],i)||(r=!1)})),r&&t.validation){const n=t.validation(s);if(!0!==n&&(r=!1,i)){const i={...this.fieldErrorsService.get()};i[e]||(i[e]={}),i[e].__step__="string"==typeof n?n:"Invalid step data",this.fieldErrorsService.set(i)}}const n={...this.stepsValidityService.get()};return n[e]=r,this.stepsValidityService.set(n),r}validateForm(e=!0){const i=this.configService.get();let t=!0;return i.steps.forEach((i=>{this.validateStep(i.id,e)||(t=!1)})),t}getFieldErrorsService(){return this.fieldErrorsService}getStepsValidityService(){return this.stepsValidityService}}class o extends r{constructor(e,i,t,r){super(e),Object.defineProperty(this,"configService",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"fieldErrorsService",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.configService=i,this.fieldErrorsService=t}updateField(e,i,t){const r=this.configService.getStepById(e);if(!r||!r.fields[i])return void console.error(`Step "${e}" or field "${i}" doesn't exist`);const s=JSON.parse(JSON.stringify(this.current));s[e]||(s[e]={}),s[e][i]=t,this.set(s)}getStepData(e){return this.current[e]||{}}getAllData(){return this.current}getFlatData(){const e={};return Object.values(this.current).forEach((i=>{Object.entries(i).forEach((([i,t])=>{e[i]=t}))})),e}updateFieldWithValidation(e,i,t,r,s,n){this.updateField(e,i,t),r(e,i,!0),s(e,i,t,!0),n(e)}resetFormWithState(e,i,t){this.resetForm(e),i&&i(),t&&t(!1)}submitForm(e,i,t){if(e()){const e=this.getAllData();return console.log("Form submitted:",JSON.stringify(e,null,2)),{success:!0,data:e}}{console.warn("Cannot submit form: validation failed");const e=i();return-1!==e&&t(e),{success:!1,errors:this.fieldErrorsService.get()}}}completeReset(e,i){this.resetForm(),e(),i()}getConfigService(){return this.configService}resetForm(e){const i=this.configService.get(),t={};i.steps.forEach((r=>{t[r.id]={},Object.entries(r.fields).forEach((([s,n])=>{const c=e?.[s]??i.defaultValues?.[s]??n.value??"";t[r.id][s]=c}))})),this.set(t),this.fieldErrorsService.set({})}}class l{constructor(e,i){Object.defineProperty(this,"touchedFields",{enumerable:!0,configurable:!0,writable:!0,value:{}}),Object.defineProperty(this,"configService",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"fieldService",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.configService=e,this.fieldService=i,this.initTouchTracking()}initTouchTracking(){this.configService.get().steps.forEach((e=>{this.touchedFields[e.id]={},Object.keys(e.fields).forEach((i=>{this.touchedFields[e.id][i]=!1}))}))}markFieldTouched(e,i,t=!0){this.touchedFields[e]||(this.touchedFields[e]={}),this.touchedFields[e][i]=t}markAllFieldsInStepTouched(e,i=!0){const t=this.configService.getStepById(e);t&&(this.touchedFields[e]||(this.touchedFields[e]={}),Object.keys(t.fields).forEach((t=>{this.touchedFields[e][t]=i})))}markAllFieldsTouched(e=!0){this.configService.get().steps.forEach((i=>{this.touchedFields[i.id]||(this.touchedFields[i.id]={}),Object.keys(i.fields).forEach((t=>{this.touchedFields[i.id][t]=e}))}))}isFieldTouched(e,i){return!0===this.touchedFields[e]?.[i]}validateStepWithTouchedErrors(e){const i=this.configService.getStepById(e);if(!i)return!1;let t=!0;return Object.keys(i.fields).forEach((i=>{const r=!0===this.touchedFields[e]?.[i];this.fieldService.validateField(e,i,void 0,r)||(t=!1)})),t}resetTouchTracking(){this.initTouchTracking()}getTouchState(){return this.touchedFields}}class d extends r{constructor(e,i){super(e),Object.defineProperty(this,"configService",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.configService=i}nextStep(e){if(this.current<this.configService.totalSteps-1){if(e&&!e())return this.current;const i=this.current+1;return this.set(i),i}return this.current}validateAndNext(e,i,t){if(i(e,!0),t(!0)){const e=this.current+1;if(e<this.configService.totalSteps)return this.set(e),e}return this.get()}prevStep(){if(this.current>0){const e=this.current-1;return this.set(e),e}return 0}goToStep(e){return e>=0&&e<this.configService.totalSteps&&(this.set(e),this.current=e,!0)}get isFirstStep(){return 0===this.current}get isLastStep(){return this.current===this.configService.totalSteps-1}nextStepWithValidation(e,i,t,r){if(i(e.id,!0),t(!0)){const e=this.get()+1;if(e<this.configService.totalSteps)return this.set(e),r(e,this.configService.getStepByIndex(e)||null),e}return this.get()}prevStepWithBindings(e){const i=this.get();if(i>0){const t=i-1;return this.set(t),e(t,this.configService.getStepByIndex(t)||null),t}return i}goToStepWithBindings(e,i){const t=this.goToStep(e);return t&&i(e,this.configService.getStepByIndex(e)||null),t}}class u{constructor(){}registerValidator(e,i){const{registerValidator:r}=t(473);r(e,i)}unregisterValidator(e){const{unregisterValidator:i}=t(473);return i(e)}getAvailableValidators(){const{predefinedValidators:e}=t(473);return e}}class f{constructor(e,i,t,r,s){Object.defineProperty(this,"configService",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"stepperService",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"formService",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"fieldErrorsService",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"stepsValidityService",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"bindings",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.configService=e,this.stepperService=i,this.formService=t,this.fieldErrorsService=r,this.stepsValidityService=s,this.initializeBindings()}initializeBindings(){const e=this,i=this.configService.get();this.bindings={config:{current:i,_callbacks:[],subscribe:function(i){return e.configService.subscribe(i)},set:function(i){e.configService.set(i)}},currentStepIndex:{current:e.stepperService.get(),_callbacks:[],subscribe:function(i){return e.stepperService.subscribe(i)},set:function(i){e.stepperService.set(i)}},currentStep:{current:e.configService.getStepByIndex(e.stepperService.get())||i.steps[0],_callbacks:[],subscribe:function(i){const t=e.stepperService.subscribe((t=>{const r=e.configService.getStepByIndex(t);r&&(i(r),this.current=r)})),r=e.configService.subscribe((t=>{const r=t.steps[e.stepperService.get()];r&&(i(r),this.current=r)}));return i(this.current),()=>{t(),r()}},set:function(){console.warn("Cannot directly set currentStep as it's computed from currentStepIndex")}},formData:{current:e.formService.get(),_callbacks:[],subscribe:function(i){return e.formService.subscribe(i)},set:function(i){e.formService.set(i)}},stepsValidity:{current:e.stepsValidityService.get(),_callbacks:[],subscribe:function(i){return e.stepsValidityService.subscribe(i)},set:function(i){e.stepsValidityService.set(i)}},isCurrentStepValid:{current:!1,_callbacks:[],subscribe:function(i){const t=e.bindings.currentStep.subscribe((t=>{const r=e.stepsValidityService.get()[t.id]||!1;i(r),this.current=r})),r=e.stepsValidityService.subscribe((t=>{const r=t[e.bindings.currentStep.current.id]||!1;i(r),this.current=r}));return()=>{t(),r()}},set:function(){console.warn("Cannot directly set isCurrentStepValid as it's computed")}},fieldErrors:{current:{},_callbacks:[],subscribe:function(i){return e.fieldErrorsService.subscribe(i)},set:function(i){e.fieldErrorsService.set(i)}},totalSteps:{current:i.steps.length,_callbacks:[],subscribe:function(i){const t=e.configService.subscribe((e=>{const t=e.steps.length;i(t),this.current=t}));return i(this.current),t},set:function(){console.warn("Cannot directly set totalSteps as it's computed from config")}},isLastStep:{current:1===i.steps.length,_callbacks:[],subscribe:function(i){const t=()=>e.stepperService.isLastStep,r=e.stepperService.subscribe((()=>{const e=t();i(e),this.current=e})),s=e.bindings.totalSteps.subscribe((()=>{const e=t();i(e),this.current=e}));return i(this.current),()=>{r(),s()}},set:function(){}},isFirstStep:{current:!0,_callbacks:[],subscribe:function(i){const t=e.stepperService.subscribe((()=>{const t=e.stepperService.isFirstStep;i(t),this.current=t}));return i(this.current),t},set:function(){}},isFormValid:{current:!1,_callbacks:[],subscribe:function(i){const t=()=>{const i=e.configService.get().steps,t=e.stepsValidityService.get();return i.every((e=>!0===t[e.id]))},r=e.stepsValidityService.subscribe((()=>{const e=t();i(e),this.current=e})),s=e.configService.subscribe((()=>{const e=t();i(e),this.current=e})),n=t();return this.current=n,i(n),()=>{r(),s()}},set:function(){}}}}updateBindingsAfterNavigation(e,i){this.bindings&&(this.bindings.currentStepIndex.current=e,i&&(this.bindings.currentStep.current=i))}}class v{constructor(e,i,t,r){Object.defineProperty(this,"formService",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"fieldService",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"interactionService",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"stepperService",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.formService=e,this.fieldService=i,this.interactionService=t,this.stepperService=r}updateFieldWithValidation(e,i,t){this.formService.updateField(e,i,t),this.interactionService.markFieldTouched(e,i,!0),this.fieldService.validateField(e,i,t,!0),this.interactionService.validateStepWithTouchedErrors(e)}submitFormWithValidation(e=!0){if(this.interactionService.markAllFieldsTouched(!0),this.fieldService.validateForm(e))return{success:!0,data:this.formService.getAllData()};{const e=this.fieldService.getStepsValidityService().get(),i=this.formService.getConfigService().get().steps.findIndex((i=>!e[i.id]));return-1!==i&&i!==this.stepperService.get()&&this.stepperService.goToStep(i),{success:!1,errors:this.fieldService.getFieldErrorsService().get()}}}resetFormCompletely(){this.formService.resetForm(),this.interactionService.resetTouchTracking(),this.fieldService.validateForm(!1),this.stepperService.set(0)}}class h{constructor(e,i,t,r,s,n,c){Object.defineProperty(this,"configService",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"formService",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"fieldService",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"interactionService",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"fieldErrorsService",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"stepsValidityService",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"stepperService",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.configService=e,this.formService=i,this.fieldService=t,this.interactionService=r,this.fieldErrorsService=s,this.stepsValidityService=n,this.stepperService=c}updateConfigWithReset(e){this.configService.set(e),this.interactionService.resetTouchTracking()}updateConfigWithFullReset(e){this.configService.set(e),this.interactionService.resetTouchTracking();const i={};e.steps.forEach((t=>{i[t.id]={},Object.entries(t.fields).forEach((([r,s])=>{const n=e.defaultValues?.[r]??s.value??"";i[t.id][r]=n}))})),this.formService.resetForm(),this.fieldService.validateForm(!1),this.stepperService.set(0)}addStepWithFormData(e,i){const t=this.configService.get(),r=[...t.steps];void 0!==i&&i>=0&&i<=r.length?r.splice(i,0,e):r.push(e);const s={...t,steps:r};this.configService.set(s);const n={...this.formService.get()};return n[e.id]={},Object.entries(e.fields).forEach((([i,t])=>{const r=s.defaultValues?.[i]??t.value??"";n[e.id][i]=r})),this.formService.set(n),this.fieldService.validateStep(e.id,!1),r.length}removeStepWithCleanup(e){const i=this.configService.get();if(-1===i.steps.findIndex((i=>i.id===e)))return!1;const t=i.steps.filter((i=>i.id!==e)),r={...i,steps:t};this.configService.set(r);const s={...this.formService.get()};delete s[e],this.formService.set(s);const n={...this.stepsValidityService.get()};delete n[e],this.stepsValidityService.set(n);const c={...this.fieldErrorsService.get()};return delete c[e],this.fieldErrorsService.set(c),this.stepperService.get()>=t.length&&this.stepperService.set(Math.max(0,t.length-1)),!0}}class g{constructor(e,i,t,r){Object.defineProperty(this,"stepperService",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"configService",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"fieldService",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"interactionService",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.stepperService=e,this.configService=i,this.fieldService=t,this.interactionService=r}goToNextWithValidation(e){const i=this.stepperService.get(),t=this.configService.get().steps[i];if(!t)return i;this.interactionService.markAllFieldsInStepTouched(t.id,!0);const r=this.fieldService.validateStep(t.id,!0),s=this.configService.get().steps.length;if(r&&i<s-1){const t=i+1;return this.stepperService.set(t),e(t,this.configService.get().steps[t]||null),t}return i}goToPrevious(e){const i=this.stepperService.get();if(i>0){const t=i-1;return this.stepperService.set(t),e(t,this.configService.get().steps[t]||null),t}return i}goToSpecificStep(e,i){return e>=0&&e<this.configService.get().steps.length&&(this.stepperService.set(e),i(e,this.configService.get().steps[e]||null),!0)}}class S{constructor(e){Object.defineProperty(this,"configService",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"stepperService",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"formService",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"fieldService",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"interactionService",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"validatorService",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"fieldErrorsService",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"stepsValidityService",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"formManagerService",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"configManagerService",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"navigationManager",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"bindingManager",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"initialFormData",{enumerable:!0,configurable:!0,writable:!0,value:{}}),Object.defineProperty(this,"stepValidationState",{enumerable:!0,configurable:!0,writable:!0,value:{}}),Object.defineProperty(this,"bindings",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"methods",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.setupInitialFormData(e),this.initializeServices(e),this.initializeManagerServices(),this.bindings=this.bindingManager.bindings,this.initializeMethods(),this.initializeStepValidation()}setupInitialFormData(e){e.steps.forEach((i=>{this.initialFormData[i.id]={},Object.entries(i.fields).forEach((([t,r])=>{const s=e.defaultValues?.[t]??r.value??"";this.initialFormData[i.id][t]=s}));const t=Object.values(i.fields).some((e=>!0===e.required));this.stepValidationState[i.id]=!t}))}initializeServices(e){this.fieldErrorsService=new r({}),this.stepsValidityService=new r(this.stepValidationState),this.configService=new s(e),this.stepperService=new d(0,this.configService),this.formService=new o(this.initialFormData,this.configService,this.fieldErrorsService,this.stepsValidityService),this.fieldService=new a(this.configService,this.formService,this.fieldErrorsService,this.stepsValidityService),this.interactionService=new l(this.configService,this.fieldService),this.validatorService=new u}initializeManagerServices(){this.formManagerService=new v(this.formService,this.fieldService,this.interactionService,this.stepperService),this.configManagerService=new h(this.configService,this.formService,this.fieldService,this.interactionService,this.fieldErrorsService,this.stepsValidityService,this.stepperService),this.navigationManager=new g(this.stepperService,this.configService,this.fieldService,this.interactionService),this.bindingManager=new f(this.configService,this.stepperService,this.formService,this.fieldErrorsService,this.stepsValidityService)}initializeMethods(){const e=this;this.methods={nextStep:()=>e.navigationManager.goToNextWithValidation(((i,t)=>{e.bindings.currentStepIndex.current=i,t&&(e.bindings.currentStep.current=t)})),prevStep:()=>e.navigationManager.goToPrevious(((i,t)=>{e.bindings.currentStepIndex.current=i,t&&(e.bindings.currentStep.current=t)})),goToStep:i=>e.navigationManager.goToSpecificStep(i,((i,t)=>{e.bindings.currentStepIndex.current=i,t&&(e.bindings.currentStep.current=t)})),updateField:(i,t,r)=>{e.formManagerService.updateFieldWithValidation(i,t,r),e.bindings.formData.current=e.formService.get()},validateField:(i,t,r,s=!0)=>{const n=e.configService.getStepById(i),c=n?.fields[t];if(!n||!c)return!1;const a=e.fieldService.validateField(i,t,r,s);if(!a&&s){const r=e.fieldErrorsService.get();r[i]||(r[i]={}),r[i][t]||(r[i][t]=`${c.label} is required`),e.bindings.fieldErrors.current={...r}}return a},validateStep:(i,t=!0)=>e.fieldService.validateStep(i,t),validateCurrentStep:(i=!0)=>{const t=e.bindings.currentStep.current;return e.fieldService.validateStep(t.id,i)},validateCurrentStepWithTouchedErrors:()=>{const i=e.bindings.currentStep.current;return e.interactionService.validateStepWithTouchedErrors(i.id)},validateStepWithTouchedErrors:i=>e.interactionService.validateStepWithTouchedErrors(i),validateForm:(i=!0)=>e.fieldService.validateForm(i),submitForm:()=>e.formManagerService.submitFormWithValidation(!0),resetForm:()=>{e.formManagerService.resetFormCompletely(),e.bindings.formData.current=e.formService.get()},updateConfig:i=>{e.configManagerService.updateConfigWithFullReset(i),e.bindings.config.current=i,e.bindings.totalSteps.current=i.steps.length},getStepData:i=>e.formService.getStepData(i),getAllData:()=>e.formService.getAllData(),getFlatData:()=>e.formService.getFlatData(),addStep:(i,t)=>{const r=e.configManagerService.addStepWithFormData(i,t);return e.bindings.config.current=e.configService.get(),e.bindings.totalSteps.current=r,e.bindings.formData.current=e.formService.get(),r},removeStep:i=>{const t=e.configManagerService.removeStepWithCleanup(i);return t&&(e.bindings.config.current=e.configService.get(),e.bindings.totalSteps.current=e.configService.get().steps.length,e.bindings.formData.current=e.formService.get(),e.bindings.fieldErrors.current=e.fieldErrorsService.get()),t},registerValidator:(i,t)=>{e.validatorService.registerValidator(i,t)},unregisterValidator:i=>e.validatorService.unregisterValidator(i),getAvailableValidators:()=>e.validatorService.getAvailableValidators()}}initializeStepValidation(){this.configService.get().steps.forEach((e=>{if(Object.entries(e.fields).some((([i,t])=>{if(t.required||t.validation&&t.validation.required){const r=this.initialFormData[e.id]?.[i];return"checkbox"===t.type?!1===r:!r}return!1}))){const i={...this.stepsValidityService.get()};i[e.id]=!1,this.stepsValidityService.set(i)}}))}}const p=e=>new S(e),b=n.registerValidator,m=n.unregisterValidator,y=()=>n.predefinedValidators;export{r as BaseService,f as BindingManager,h as ConfigManagerService,s as ConfigService,a as FieldService,p as FormController,S as FormControllerClass,v as FormManagerService,o as FormService,l as InteractionService,g as NavigationManager,d as StepperService,u as ValidatorService,y as getAvailableValidators,b as registerValidator,m as unregisterValidator,c as validateField}; //# sourceMappingURL=index.js.map