@nuralyui/form 0.1.4 → 0.1.5

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/bundle.js CHANGED
@@ -73,17 +73,17 @@ import{css as t,LitElement as i,html as s}from"lit";import{property as e,state a
73
73
  * @license
74
74
  * Copyright 2023 Nuraly, Laabidi Aymen
75
75
  * SPDX-License-Identifier: MIT
76
- */var u=function(t,i,s,e){return new(s||(s=Promise))((function(n,r){function o(t){try{d(e.next(t))}catch(t){r(t)}}function a(t){try{d(e.throw(t))}catch(t){r(t)}}function d(t){var i;t.done?n(t.value):(i=t.value,i instanceof s?i:new s((function(t){t(i)}))).then(o,a)}d((e=e.apply(t,i||[])).next())}))};class c{constructor(t){this.host=t,this.fields=new Map,this.validationState=d.Pristine,this.validationPromise=null}registerField(t){var i;const s=t.name||t.getAttribute("name")||`field-${Date.now()}`,e={element:t,name:s,value:t.value,isValid:t.getValidationStatus().isValid,validationMessage:t.validationMessage||"",required:null!==(i=t.required)&&void 0!==i&&i,touched:!1,dirty:!1};this.fields.set(s,e),this.addFieldListeners(t,s)}unregisterField(t){const i=this.fields.get(t);i&&(this.removeFieldListeners(i.element),this.fields.delete(t))}addFieldListeners(t,i){t.addEventListener("nr-validation",(t=>this.handleFieldValidation(i,t)))}removeFieldListeners(t){}handleFieldValidation(t,i){const s=this.fields.get(t);if(s){if(i&&i.detail)s.isValid=i.detail.isValid||!1,s.validationMessage=i.detail.validationMessage||"";else{const t=s.element.getValidationStatus();s.isValid=t.isValid,s.validationMessage=s.element.validationMessage||""}this.updateFormValidationState()}}updateFormValidationState(){const t=this.getInvalidFields(),i=0===t.length;this.validationState=i?d.Valid:d.Invalid;const s={isValid:i,invalidFields:t,validationErrors:this.buildValidationErrors(),summary:i?"Form is valid":`${t.length} field(s) have errors`};this.dispatchValidationEvent(s)}buildValidationErrors(){const t={};for(const[i,s]of this.fields)!s.isValid&&s.validationMessage&&(t[i]=s.validationMessage);return t}validateForm(){return this.validationPromise||(this.validationState=d.Pending,this.validationPromise=this.performValidation()),this.validationPromise}performValidation(){return u(this,void 0,void 0,(function*(){const t=[],i={};for(const[s,e]of this.fields){const n=e.element.getValidationStatus().isValid;e.isValid=n,e.validationMessage=e.element.validationMessage||"",n||(t.push(e),i[s]=e.validationMessage)}const s=0===t.length;this.validationState=s?d.Valid:d.Invalid;const e={isValid:s,invalidFields:t,validationErrors:i,summary:s?"Form is valid":`${t.length} field(s) have errors`};return this.dispatchValidationEvent(e),this.validationPromise=null,e}))}getValidationState(){return this.validationState}getFields(){return Array.from(this.fields.values())}getInvalidFields(){return Array.from(this.fields.values()).filter((t=>!t.isValid))}isValid(){return this.validationState===d.Valid&&Array.from(this.fields.values()).every((t=>t.isValid))}focusFirstInvalidField(){const t=Array.from(this.fields.values()).find((t=>!t.isValid));return!(!t||"function"!=typeof t.element.focus)&&(t.element.focus(),!0)}reset(){for(const t of this.fields.values())"clearValidation"in t.element&&"function"==typeof t.element.clearValidation&&t.element.clearValidation(),"value"in t.element&&(t.element.value=""),t.touched=!1,t.dirty=!1,t.isValid=!0,t.validationMessage="";this.validationState=d.Pristine,this.dispatchResetEvent()}dispatchValidationEvent(t){var i,s;null===(s=(i=this.host).dispatchCustomEvent)||void 0===s||s.call(i,h.VALIDATION_CHANGED,{validationResult:t})}dispatchResetEvent(){var t,i;null===(i=(t=this.host).dispatchCustomEvent)||void 0===i||i.call(t,h.RESET,{})}}
76
+ */var u=function(t,i,s,e){return new(s||(s=Promise))(function(n,r){function o(t){try{d(e.next(t))}catch(t){r(t)}}function a(t){try{d(e.throw(t))}catch(t){r(t)}}function d(t){var i;t.done?n(t.value):(i=t.value,i instanceof s?i:new s(function(t){t(i)})).then(o,a)}d((e=e.apply(t,i||[])).next())})};class c{constructor(t){this.host=t,this.fields=new Map,this.validationState=d.Pristine,this.validationPromise=null}registerField(t){var i;const s=t.name||t.getAttribute("name")||`field-${Date.now()}`,e={element:t,name:s,value:t.value,isValid:t.getValidationStatus().isValid,validationMessage:t.validationMessage||"",required:null!==(i=t.required)&&void 0!==i&&i,touched:!1,dirty:!1};this.fields.set(s,e),this.addFieldListeners(t,s)}unregisterField(t){const i=this.fields.get(t);i&&(this.removeFieldListeners(i.element),this.fields.delete(t))}addFieldListeners(t,i){t.addEventListener("nr-validation",t=>this.handleFieldValidation(i,t))}removeFieldListeners(t){}handleFieldValidation(t,i){const s=this.fields.get(t);if(s){if(i&&i.detail)s.isValid=i.detail.isValid||!1,s.validationMessage=i.detail.validationMessage||"";else{const t=s.element.getValidationStatus();s.isValid=t.isValid,s.validationMessage=s.element.validationMessage||""}this.updateFormValidationState()}}updateFormValidationState(){const t=this.getInvalidFields(),i=0===t.length;this.validationState=i?d.Valid:d.Invalid;const s={isValid:i,invalidFields:t,validationErrors:this.buildValidationErrors(),summary:i?"Form is valid":`${t.length} field(s) have errors`};this.dispatchValidationEvent(s)}buildValidationErrors(){const t={};for(const[i,s]of this.fields)!s.isValid&&s.validationMessage&&(t[i]=s.validationMessage);return t}validateForm(){return this.validationPromise||(this.validationState=d.Pending,this.validationPromise=this.performValidation()),this.validationPromise}performValidation(){return u(this,void 0,void 0,function*(){const t=[],i={};for(const[s,e]of this.fields){const n=e.element.getValidationStatus().isValid;e.isValid=n,e.validationMessage=e.element.validationMessage||"",n||(t.push(e),i[s]=e.validationMessage)}const s=0===t.length;this.validationState=s?d.Valid:d.Invalid;const e={isValid:s,invalidFields:t,validationErrors:i,summary:s?"Form is valid":`${t.length} field(s) have errors`};return this.dispatchValidationEvent(e),this.validationPromise=null,e})}getValidationState(){return this.validationState}getFields(){return Array.from(this.fields.values())}getInvalidFields(){return Array.from(this.fields.values()).filter(t=>!t.isValid)}isValid(){return this.validationState===d.Valid&&Array.from(this.fields.values()).every(t=>t.isValid)}focusFirstInvalidField(){const t=Array.from(this.fields.values()).find(t=>!t.isValid);return!(!t||"function"!=typeof t.element.focus)&&(t.element.focus(),!0)}reset(){for(const t of this.fields.values())"clearValidation"in t.element&&"function"==typeof t.element.clearValidation&&t.element.clearValidation(),"value"in t.element&&(t.element.value=""),t.touched=!1,t.dirty=!1,t.isValid=!0,t.validationMessage="";this.validationState=d.Pristine,this.dispatchResetEvent()}dispatchValidationEvent(t){var i,s;null===(s=(i=this.host).dispatchCustomEvent)||void 0===s||s.call(i,h.VALIDATION_CHANGED,{validationResult:t})}dispatchResetEvent(){var t,i;null===(i=(t=this.host).dispatchCustomEvent)||void 0===i||i.call(t,h.RESET,{})}}
77
77
  /**
78
78
  * @license
79
79
  * Copyright 2023 Nuraly, Laabidi Aymen
80
80
  * SPDX-License-Identifier: MIT
81
- */var v=function(t,i,s,e){return new(s||(s=Promise))((function(n,r){function o(t){try{d(e.next(t))}catch(t){r(t)}}function a(t){try{d(e.throw(t))}catch(t){r(t)}}function d(t){var i;t.done?n(t.value):(i=t.value,i instanceof s?i:new s((function(t){t(i)}))).then(o,a)}d((e=e.apply(t,i||[])).next())}))};class m{constructor(t){this.host=t,this.submissionState=l.Idle,this.lastSubmissionData=null}getSubmissionState(){return this.submissionState}isSubmitting(){return this.submissionState===l.Submitting}collectFormData(){const t=new FormData,i={},s={};return this.getFormFields().forEach((e=>{const n=e.name||e.getAttribute("name");if(!n)return;const r=e.value;null!=r&&t.append(n,String(r)),i[n]=r,s[n]={element:e,value:r,name:n,type:e.tagName.toLowerCase(),required:e.required||!1,disabled:e.disabled||!1}})),{formData:t,jsonData:i,fields:s}}submitForm(t){return v(this,void 0,void 0,(function*(){if(this.isSubmitting())throw new Error("Form is already submitting");try{this.setSubmissionState(l.Submitting);const i=this.host.validationController;if(i){const t=yield i.validateForm();if(!t.isValid)throw i.focusFirstInvalidField(),this.dispatchSubmitAttemptEvent(t),new Error(`Form validation failed: ${t.summary}`)}const s=this.collectFormData();return t&&(Object.assign(s.jsonData,t),Object.entries(t).forEach((([t,i])=>{s.formData.append(t,String(i))}))),this.lastSubmissionData=s,this.dispatchSubmitSuccessEvent(s),this.setSubmissionState(l.Success),s}catch(t){throw this.setSubmissionState(l.Error),this.dispatchSubmitErrorEvent(t),t}}))}resetSubmission(){this.submissionState=l.Idle,this.lastSubmissionData=null}getLastSubmissionData(){return this.lastSubmissionData}getFormFields(){var t;const i=this.host,s=[],e=["nr-input","nr-select","nr-radio","nr-checkbox","nr-textarea","nr-timepicker","nr-datepicker","input","select","textarea"];e.forEach((t=>{i.querySelectorAll(t).forEach((t=>{(t.name||t.getAttribute("name"))&&s.push(t)}))}));return((null===(t=i.shadowRoot)||void 0===t?void 0:t.querySelectorAll("slot"))||[]).forEach((t=>{t.assignedElements({flatten:!0}).forEach((t=>{e.forEach((i=>{if(t.matches&&t.matches(i)){const i=t;(i.name||i.getAttribute("name"))&&s.push(i)}t.querySelectorAll(i).forEach((t=>{const i=t;(i.name||i.getAttribute("name"))&&s.push(i)}))}))}))})),s}setSubmissionState(t){var i,s;this.submissionState=t,null===(s=(i=this.host).requestUpdate)||void 0===s||s.call(i)}dispatchSubmitAttemptEvent(t){var i,s;null===(s=(i=this.host).dispatchCustomEvent)||void 0===s||s.call(i,h.SUBMIT_ATTEMPT,{validationResult:t})}dispatchSubmitSuccessEvent(t){var i,s;null===(s=(i=this.host).dispatchCustomEvent)||void 0===s||s.call(i,h.SUBMIT_SUCCESS,{formData:t})}dispatchSubmitErrorEvent(t){var i,s;null===(s=(i=this.host).dispatchCustomEvent)||void 0===s||s.call(i,h.SUBMIT_ERROR,{error:t})}}
81
+ */var v=function(t,i,s,e){return new(s||(s=Promise))(function(n,r){function o(t){try{d(e.next(t))}catch(t){r(t)}}function a(t){try{d(e.throw(t))}catch(t){r(t)}}function d(t){var i;t.done?n(t.value):(i=t.value,i instanceof s?i:new s(function(t){t(i)})).then(o,a)}d((e=e.apply(t,i||[])).next())})};class m{constructor(t){this.host=t,this.submissionState=l.Idle,this.lastSubmissionData=null}getSubmissionState(){return this.submissionState}isSubmitting(){return this.submissionState===l.Submitting}collectFormData(){const t=new FormData,i={},s={};return this.getFormFields().forEach(e=>{const n=e.name||e.getAttribute("name");if(!n)return;const r=e.value;null!=r&&t.append(n,String(r)),i[n]=r,s[n]={element:e,value:r,name:n,type:e.tagName.toLowerCase(),required:e.required||!1,disabled:e.disabled||!1}}),{formData:t,jsonData:i,fields:s}}submitForm(t){return v(this,void 0,void 0,function*(){if(this.isSubmitting())throw new Error("Form is already submitting");try{this.setSubmissionState(l.Submitting);const i=this.host.validationController;if(i){const t=yield i.validateForm();if(!t.isValid)throw i.focusFirstInvalidField(),this.dispatchSubmitAttemptEvent(t),new Error(`Form validation failed: ${t.summary}`)}const s=this.collectFormData();return t&&(Object.assign(s.jsonData,t),Object.entries(t).forEach(([t,i])=>{s.formData.append(t,String(i))})),this.lastSubmissionData=s,this.dispatchSubmitSuccessEvent(s),this.setSubmissionState(l.Success),s}catch(t){throw this.setSubmissionState(l.Error),this.dispatchSubmitErrorEvent(t),t}})}resetSubmission(){this.submissionState=l.Idle,this.lastSubmissionData=null}getLastSubmissionData(){return this.lastSubmissionData}getFormFields(){var t;const i=this.host,s=[],e=["nr-input","nr-select","nr-radio","nr-checkbox","nr-textarea","nr-timepicker","nr-datepicker","input","select","textarea"];e.forEach(t=>{i.querySelectorAll(t).forEach(t=>{(t.name||t.getAttribute("name"))&&s.push(t)})});return((null===(t=i.shadowRoot)||void 0===t?void 0:t.querySelectorAll("slot"))||[]).forEach(t=>{t.assignedElements({flatten:!0}).forEach(t=>{e.forEach(i=>{if(t.matches&&t.matches(i)){const i=t;(i.name||i.getAttribute("name"))&&s.push(i)}t.querySelectorAll(i).forEach(t=>{const i=t;(i.name||i.getAttribute("name"))&&s.push(i)})})})}),s}setSubmissionState(t){var i,s;this.submissionState=t,null===(s=(i=this.host).requestUpdate)||void 0===s||s.call(i)}dispatchSubmitAttemptEvent(t){var i,s;null===(s=(i=this.host).dispatchCustomEvent)||void 0===s||s.call(i,h.SUBMIT_ATTEMPT,{validationResult:t})}dispatchSubmitSuccessEvent(t){var i,s;null===(s=(i=this.host).dispatchCustomEvent)||void 0===s||s.call(i,h.SUBMIT_SUCCESS,{formData:t})}dispatchSubmitErrorEvent(t){var i,s;null===(s=(i=this.host).dispatchCustomEvent)||void 0===s||s.call(i,h.SUBMIT_ERROR,{error:t})}}
82
82
  /**
83
83
  * @license
84
84
  * Copyright 2023 Nuraly, Laabidi Aymen
85
85
  * SPDX-License-Identifier: MIT
86
- */var f=function(t,i,s,e){for(var n,r=arguments.length,o=r<3?i:null===e?e=Object.getOwnPropertyDescriptor(i,s):e,a=t.length-1;a>=0;a--)(n=t[a])&&(o=(r<3?n(o):r>3?n(i,s,o):n(i,s))||o);return r>3&&o&&Object.defineProperty(i,s,o),o},p=function(t,i,s,e){return new(s||(s=Promise))((function(n,r){function o(t){try{d(e.next(t))}catch(t){r(t)}}function a(t){try{d(e.throw(t))}catch(t){r(t)}}function d(t){var i;t.done?n(t.value):(i=t.value,i instanceof s?i:new s((function(t){t(i)}))).then(o,a)}d((e=e.apply(t,i||[])).next())}))};let b=class extends(o(i)){constructor(){super(...arguments),this.config={validateOnChange:!1,validateOnBlur:!0,showErrorsImmediately:!1,preventInvalidSubmission:!0,resetOnSuccess:!1,validationDelay:300},this.validateOnChange=!1,this.validateOnBlur=!0,this.preventInvalidSubmission=!0,this.resetOnSuccess=!1,this.method="POST",this.enctype="multipart/form-data",this.disabled=!1,this._validationState=d.Pristine,this._submissionState=l.Idle,this.validationController=new c(this),this.submissionController=new m(this),this.handleValidationChanged=t=>{const i=t.detail.validationResult;i&&(this._validationState=i.isValid?d.Valid:d.Invalid)}}get validationState(){return this._validationState}get submissionState(){return this._submissionState}connectedCallback(){super.connectedCallback(),this.setupFormObserver()}disconnectedCallback(){super.disconnectedCallback(),this.cleanupFormObserver()}willUpdate(t){super.willUpdate(t),(t.has("validateOnChange")||t.has("validateOnBlur")||t.has("preventInvalidSubmission")||t.has("resetOnSuccess"))&&(this.config=Object.assign(Object.assign({},this.config),{validateOnChange:this.validateOnChange,validateOnBlur:this.validateOnBlur,preventInvalidSubmission:this.preventInvalidSubmission,resetOnSuccess:this.resetOnSuccess}))}firstUpdated(){this.registerExistingFields(),this.setupFormEvents()}setupFormObserver(){const t=new MutationObserver((t=>{t.forEach((t=>{t.addedNodes.forEach((t=>{t.nodeType===Node.ELEMENT_NODE&&this.registerFieldsInElement(t)}))}))}));t.observe(this,{childList:!0,subtree:!0}),this._formObserver=t}cleanupFormObserver(){const t=this._formObserver;t&&t.disconnect()}registerExistingFields(){this.registerFieldsInElement(this)}registerFieldsInElement(t){["nr-input","nr-select","nr-radio","nr-checkbox","nr-textarea","nr-timepicker","nr-datepicker"].forEach((i=>{t.querySelectorAll(i).forEach((t=>{t.getAttribute("name")&&this.validationController.registerField(t)}))}))}setupFormEvents(){this.addEventListener("submit",this.handleFormSubmit),this.addEventListener("reset",this.handleFormReset),this.addEventListener(h.VALIDATION_CHANGED,this.handleValidationChanged)}handleFormSubmit(t){return p(this,void 0,void 0,(function*(){if(t.preventDefault(),!this.disabled)try{const t=yield this.submissionController.submitForm();this.resetOnSuccess&&this.reset(),this.action&&this.performNativeSubmission(t.formData)}catch(t){console.error("Form submission failed:",t)}}))}handleFormReset(t){t.preventDefault(),this.reset()}performNativeSubmission(t){const i=document.createElement("form");i.action=this.action,i.method=this.method,i.enctype=this.enctype,this.target&&(i.target=this.target);for(const[s,e]of t.entries()){const t=document.createElement("input");t.type="hidden",t.name=s,t.value=e,i.appendChild(t)}document.body.appendChild(i),i.submit(),document.body.removeChild(i)}validate(){return p(this,void 0,void 0,(function*(){return(yield this.validationController.validateForm()).isValid}))}submit(t){return p(this,void 0,void 0,(function*(){yield this.submissionController.submitForm(t)}))}reset(){this.validationController.reset(),this.submissionController.resetSubmission(),this._validationState=d.Pristine,this._submissionState=l.Idle}get isValid(){return this.validationController.isValid()}get isSubmitting(){return this.submissionController.isSubmitting()}getFormData(){return this.submissionController.collectFormData()}getInvalidFields(){return this.validationController.getInvalidFields()}getFieldsValue(t){const i=this.getFormData().jsonData;if(t&&t.length>0){const s={};return t.forEach((t=>{t in i&&(s[t]=i[t])})),s}return i}getFieldValue(t){return this.getFieldsValue()[t]}setFieldsValue(t){Object.entries(t).forEach((([t,i])=>{this.setFieldValue(t,i)}))}setFieldValue(t,i){const s=this.validationController.getFields().find((i=>i.name===t));s&&s.element&&(s.element.value=i,s.value=i,s.element.dispatchEvent(new Event("change",{bubbles:!0})))}validateFields(t){return p(this,void 0,void 0,(function*(){const i=yield this.validationController.validateForm();if(t&&t.length>0){const s={};if(t.forEach((t=>{i.validationErrors[t]&&(s[t]=i.validationErrors[t])})),Object.keys(s).length>0)throw new Error(JSON.stringify(s));return this.getFieldsValue(t)}if(!i.isValid)throw new Error(JSON.stringify(i.validationErrors));return this.getFieldsValue()}))}resetFields(t){if(!t||0===t.length)return void this.reset();const i=this.validationController.getFields();t.forEach((t=>{const s=i.find((i=>i.name===t));s&&s.element&&(s.element.value="",s.value="",s.touched=!1,s.dirty=!1,s.isValid=!0,s.validationMessage="",s.element.dispatchEvent(new Event("change",{bubbles:!0})))}))}getFieldError(t){const i=this.validationController.getFields().find((i=>i.name===t));return i&&!i.isValid?i.validationMessage:null}getFieldsError(t){const i=this.validationController.getFields(),s={};return(t?i.filter((i=>t.includes(i.name))):i).forEach((t=>{s[t.name]=t.isValid?null:t.validationMessage})),s}isFieldTouched(t){const i=this.validationController.getFields().find((i=>i.name===t));return!!i&&i.touched}isFieldsTouched(t){const i=this.validationController.getFields();return(t?i.filter((i=>t.includes(i.name))):i).some((t=>t.touched))}isFieldDirty(t){const i=this.validationController.getFields().find((i=>i.name===t));return!!i&&i.dirty}isFieldsDirty(t){const i=this.validationController.getFields();return(t?i.filter((i=>t.includes(i.name))):i).some((t=>t.dirty))}getFieldInstance(t){const i=this.validationController.getFields().find((i=>i.name===t));return i?i.element:null}scrollToField(t){if(t){const i=this.getFieldInstance(t);return!!i&&(i.scrollIntoView({behavior:"smooth",block:"center"}),"function"==typeof i.focus&&i.focus(),!0)}return this.validationController.focusFirstInvalidField()}finish(){return p(this,void 0,void 0,(function*(){try{const t=yield this.validateFields();return yield this.submit(),t}catch(t){throw this.scrollToField(),t}}))}getFieldsWithErrors(){return this.validationController.getFields().filter((t=>!t.isValid)).map((t=>t.name))}hasErrors(){return this.getFieldsWithErrors().length>0}getFormState(){const t=this.validationController.getFields();return{isValid:this.isValid,isSubmitting:this.isSubmitting,hasErrors:this.hasErrors(),errorCount:this.getFieldsWithErrors().length,fieldCount:t.length,touchedFields:t.filter((t=>t.touched)).map((t=>t.name)),dirtyFields:t.filter((t=>t.dirty)).map((t=>t.name)),invalidFields:this.getFieldsWithErrors()}}setLoading(t){this.disabled=t,this.requestUpdate()}render(){return s`
86
+ */var f=function(t,i,s,e){for(var n,r=arguments.length,o=r<3?i:null===e?e=Object.getOwnPropertyDescriptor(i,s):e,a=t.length-1;a>=0;a--)(n=t[a])&&(o=(r<3?n(o):r>3?n(i,s,o):n(i,s))||o);return r>3&&o&&Object.defineProperty(i,s,o),o},p=function(t,i,s,e){return new(s||(s=Promise))(function(n,r){function o(t){try{d(e.next(t))}catch(t){r(t)}}function a(t){try{d(e.throw(t))}catch(t){r(t)}}function d(t){var i;t.done?n(t.value):(i=t.value,i instanceof s?i:new s(function(t){t(i)})).then(o,a)}d((e=e.apply(t,i||[])).next())})};let b=class extends(o(i)){constructor(){super(...arguments),this.config={validateOnChange:!1,validateOnBlur:!0,showErrorsImmediately:!1,preventInvalidSubmission:!0,resetOnSuccess:!1,validationDelay:300},this.validateOnChange=!1,this.validateOnBlur=!0,this.preventInvalidSubmission=!0,this.resetOnSuccess=!1,this.method="POST",this.enctype="multipart/form-data",this.disabled=!1,this._validationState=d.Pristine,this._submissionState=l.Idle,this.validationController=new c(this),this.submissionController=new m(this),this.handleValidationChanged=t=>{const i=t.detail.validationResult;i&&(this._validationState=i.isValid?d.Valid:d.Invalid)}}get validationState(){return this._validationState}get submissionState(){return this._submissionState}connectedCallback(){super.connectedCallback(),this.setupFormObserver()}disconnectedCallback(){super.disconnectedCallback(),this.cleanupFormObserver()}willUpdate(t){super.willUpdate(t),(t.has("validateOnChange")||t.has("validateOnBlur")||t.has("preventInvalidSubmission")||t.has("resetOnSuccess"))&&(this.config=Object.assign(Object.assign({},this.config),{validateOnChange:this.validateOnChange,validateOnBlur:this.validateOnBlur,preventInvalidSubmission:this.preventInvalidSubmission,resetOnSuccess:this.resetOnSuccess}))}firstUpdated(){this.registerExistingFields(),this.setupFormEvents()}setupFormObserver(){const t=new MutationObserver(t=>{t.forEach(t=>{t.addedNodes.forEach(t=>{t.nodeType===Node.ELEMENT_NODE&&this.registerFieldsInElement(t)})})});t.observe(this,{childList:!0,subtree:!0}),this._formObserver=t}cleanupFormObserver(){const t=this._formObserver;t&&t.disconnect()}registerExistingFields(){this.registerFieldsInElement(this)}registerFieldsInElement(t){["nr-input","nr-select","nr-radio","nr-checkbox","nr-textarea","nr-timepicker","nr-datepicker"].forEach(i=>{t.querySelectorAll(i).forEach(t=>{t.getAttribute("name")&&this.validationController.registerField(t)})})}setupFormEvents(){this.addEventListener("submit",this.handleFormSubmit),this.addEventListener("reset",this.handleFormReset),this.addEventListener(h.VALIDATION_CHANGED,this.handleValidationChanged)}handleFormSubmit(t){return p(this,void 0,void 0,function*(){if(t.preventDefault(),!this.disabled)try{const t=yield this.submissionController.submitForm();this.resetOnSuccess&&this.reset(),this.action&&this.performNativeSubmission(t.formData)}catch(t){console.error("Form submission failed:",t)}})}handleFormReset(t){t.preventDefault(),this.reset()}performNativeSubmission(t){const i=document.createElement("form");i.action=this.action,i.method=this.method,i.enctype=this.enctype,this.target&&(i.target=this.target);for(const[s,e]of t.entries()){const t=document.createElement("input");t.type="hidden",t.name=s,t.value=e,i.appendChild(t)}document.body.appendChild(i),i.submit(),document.body.removeChild(i)}validate(){return p(this,void 0,void 0,function*(){return(yield this.validationController.validateForm()).isValid})}submit(t){return p(this,void 0,void 0,function*(){yield this.submissionController.submitForm(t)})}reset(){this.validationController.reset(),this.submissionController.resetSubmission(),this._validationState=d.Pristine,this._submissionState=l.Idle}get isValid(){return this.validationController.isValid()}get isSubmitting(){return this.submissionController.isSubmitting()}getFormData(){return this.submissionController.collectFormData()}getInvalidFields(){return this.validationController.getInvalidFields()}getFieldsValue(t){const i=this.getFormData().jsonData;if(t&&t.length>0){const s={};return t.forEach(t=>{t in i&&(s[t]=i[t])}),s}return i}getFieldValue(t){return this.getFieldsValue()[t]}setFieldsValue(t){Object.entries(t).forEach(([t,i])=>{this.setFieldValue(t,i)})}setFieldValue(t,i){const s=this.validationController.getFields().find(i=>i.name===t);s&&s.element&&(s.element.value=i,s.value=i,s.element.dispatchEvent(new Event("change",{bubbles:!0})))}validateFields(t){return p(this,void 0,void 0,function*(){const i=yield this.validationController.validateForm();if(t&&t.length>0){const s={};if(t.forEach(t=>{i.validationErrors[t]&&(s[t]=i.validationErrors[t])}),Object.keys(s).length>0)throw new Error(JSON.stringify(s));return this.getFieldsValue(t)}if(!i.isValid)throw new Error(JSON.stringify(i.validationErrors));return this.getFieldsValue()})}resetFields(t){if(!t||0===t.length)return void this.reset();const i=this.validationController.getFields();t.forEach(t=>{const s=i.find(i=>i.name===t);s&&s.element&&(s.element.value="",s.value="",s.touched=!1,s.dirty=!1,s.isValid=!0,s.validationMessage="",s.element.dispatchEvent(new Event("change",{bubbles:!0})))})}getFieldError(t){const i=this.validationController.getFields().find(i=>i.name===t);return i&&!i.isValid?i.validationMessage:null}getFieldsError(t){const i=this.validationController.getFields(),s={};return(t?i.filter(i=>t.includes(i.name)):i).forEach(t=>{s[t.name]=t.isValid?null:t.validationMessage}),s}isFieldTouched(t){const i=this.validationController.getFields().find(i=>i.name===t);return!!i&&i.touched}isFieldsTouched(t){const i=this.validationController.getFields();return(t?i.filter(i=>t.includes(i.name)):i).some(t=>t.touched)}isFieldDirty(t){const i=this.validationController.getFields().find(i=>i.name===t);return!!i&&i.dirty}isFieldsDirty(t){const i=this.validationController.getFields();return(t?i.filter(i=>t.includes(i.name)):i).some(t=>t.dirty)}getFieldInstance(t){const i=this.validationController.getFields().find(i=>i.name===t);return i?i.element:null}scrollToField(t){if(t){const i=this.getFieldInstance(t);return!!i&&(i.scrollIntoView({behavior:"smooth",block:"center"}),"function"==typeof i.focus&&i.focus(),!0)}return this.validationController.focusFirstInvalidField()}finish(){return p(this,void 0,void 0,function*(){try{const t=yield this.validateFields();return yield this.submit(),t}catch(t){throw this.scrollToField(),t}})}getFieldsWithErrors(){return this.validationController.getFields().filter(t=>!t.isValid).map(t=>t.name)}hasErrors(){return this.getFieldsWithErrors().length>0}getFormState(){const t=this.validationController.getFields();return{isValid:this.isValid,isSubmitting:this.isSubmitting,hasErrors:this.hasErrors(),errorCount:this.getFieldsWithErrors().length,fieldCount:t.length,touchedFields:t.filter(t=>t.touched).map(t=>t.name),dirtyFields:t.filter(t=>t.dirty).map(t=>t.name),invalidFields:this.getFieldsWithErrors()}}setLoading(t){this.disabled=t,this.requestUpdate()}render(){return s`
87
87
  <form
88
88
  action="${this.action||""}"
89
89
  method="${this.method.toLowerCase()}"
@@ -1 +1 @@
1
- {"version":3,"file":"submission.controller.d.ts","sourceRoot":"","sources":["../../../../src/components/form/controllers/submission.controller.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EAGpB,MAAM,kBAAkB,CAAC;AAE1B;;GAEG;AACH,qBAAa,wBAAwB;IAIvB,OAAO,CAAC,IAAI;IAHxB,OAAO,CAAC,eAAe,CAAiD;IACxE,OAAO,CAAC,kBAAkB,CAAmC;gBAEzC,IAAI,EAAE,GAAG;IAE7B;;OAEG;IACH,kBAAkB,IAAI,mBAAmB;IAIzC;;OAEG;IACH,YAAY,IAAI,OAAO;IAIvB;;OAEG;IACH,eAAe,IAAI,kBAAkB;IAsCrC;;OAEG;IACG,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAsD/E;;OAEG;IACH,eAAe,IAAI,IAAI;IAKvB;;OAEG;IACH,qBAAqB,IAAI,kBAAkB,GAAG,IAAI;IAIlD;;OAEG;IACH,OAAO,CAAC,aAAa;IAwDrB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAK1B;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAMlC;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAMlC;;OAEG;IACH,OAAO,CAAC,wBAAwB;CAKjC"}
1
+ {"version":3,"file":"submission.controller.d.ts","sourceRoot":"","sources":["../../../../../src/components/form/controllers/submission.controller.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EAGpB,MAAM,kBAAkB,CAAC;AAE1B;;GAEG;AACH,qBAAa,wBAAwB;IAIvB,OAAO,CAAC,IAAI;IAHxB,OAAO,CAAC,eAAe,CAAiD;IACxE,OAAO,CAAC,kBAAkB,CAAmC;gBAEzC,IAAI,EAAE,GAAG;IAE7B;;OAEG;IACH,kBAAkB,IAAI,mBAAmB;IAIzC;;OAEG;IACH,YAAY,IAAI,OAAO;IAIvB;;OAEG;IACH,eAAe,IAAI,kBAAkB;IAsCrC;;OAEG;IACG,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAsD/E;;OAEG;IACH,eAAe,IAAI,IAAI;IAKvB;;OAEG;IACH,qBAAqB,IAAI,kBAAkB,GAAG,IAAI;IAIlD;;OAEG;IACH,OAAO,CAAC,aAAa;IAwDrB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAK1B;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAMlC;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAMlC;;OAEG;IACH,OAAO,CAAC,wBAAwB;CAKjC"}
@@ -1 +1 @@
1
- {"version":3,"file":"submission.controller.js","sourceRoot":"","sources":["../../../../src/components/form/controllers/submission.controller.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\nimport { \n FormSubmissionData, \n FormSubmissionState, \n FormFieldCapable,\n FORM_EVENTS \n} from '../form.types.js';\n\n/**\n * Controller that handles form submission logic\n */\nexport class FormSubmissionController {\n private submissionState: FormSubmissionState = FormSubmissionState.Idle;\n private lastSubmissionData: FormSubmissionData | null = null;\n\n constructor(private host: any) {}\n\n /**\n * Get current submission state\n */\n getSubmissionState(): FormSubmissionState {\n return this.submissionState;\n }\n\n /**\n * Check if form is currently submitting\n */\n isSubmitting(): boolean {\n return this.submissionState === FormSubmissionState.Submitting;\n }\n\n /**\n * Collect form data from all registered fields\n */\n collectFormData(): FormSubmissionData {\n const formData = new FormData();\n const jsonData: Record<string, any> = {};\n const fields: Record<string, any> = {};\n\n // Get all form field elements\n const formFields = this.getFormFields();\n\n formFields.forEach(element => {\n const name = element.name || element.getAttribute('name');\n if (!name) return;\n\n const value = element.value;\n \n // Add to FormData\n if (value !== null && value !== undefined) {\n formData.append(name, String(value));\n }\n\n // Add to JSON data\n jsonData[name] = value;\n fields[name] = {\n element,\n value,\n name,\n type: element.tagName.toLowerCase(),\n required: element.required || false,\n disabled: element.disabled || false\n };\n });\n\n return {\n formData,\n jsonData,\n fields\n };\n }\n\n /**\n * Submit form with validation\n */\n async submitForm(customData?: Record<string, any>): Promise<FormSubmissionData> {\n if (this.isSubmitting()) {\n throw new Error('Form is already submitting');\n }\n\n try {\n this.setSubmissionState(FormSubmissionState.Submitting);\n\n // Validate form first\n const validationController = (this.host as any).validationController;\n if (validationController) {\n const validationResult = await validationController.validateForm();\n \n if (!validationResult.isValid) {\n // Focus first invalid field\n validationController.focusFirstInvalidField();\n \n // Dispatch submit attempt event\n this.dispatchSubmitAttemptEvent(validationResult);\n \n throw new Error(`Form validation failed: ${validationResult.summary}`);\n }\n }\n\n // Collect form data\n const submissionData = this.collectFormData();\n \n // Merge custom data if provided\n if (customData) {\n Object.assign(submissionData.jsonData, customData);\n Object.entries(customData).forEach(([key, value]) => {\n submissionData.formData.append(key, String(value));\n });\n }\n\n this.lastSubmissionData = submissionData;\n\n // Dispatch submit success event\n this.dispatchSubmitSuccessEvent(submissionData);\n \n this.setSubmissionState(FormSubmissionState.Success);\n \n return submissionData;\n\n } catch (error) {\n this.setSubmissionState(FormSubmissionState.Error);\n \n // Dispatch submit error event\n this.dispatchSubmitErrorEvent(error as Error);\n \n throw error;\n }\n }\n\n /**\n * Reset submission state\n */\n resetSubmission(): void {\n this.submissionState = FormSubmissionState.Idle;\n this.lastSubmissionData = null;\n }\n\n /**\n * Get last submission data\n */\n getLastSubmissionData(): FormSubmissionData | null {\n return this.lastSubmissionData;\n }\n\n /**\n * Get all form field elements from the host\n */\n private getFormFields(): (HTMLElement & FormFieldCapable)[] {\n const host = this.host;\n const fields: (HTMLElement & FormFieldCapable)[] = [];\n\n // Query for all potential form field elements\n const selectors = [\n 'nr-input',\n 'nr-select', \n 'nr-radio',\n 'nr-checkbox',\n 'nr-textarea',\n 'nr-timepicker',\n 'nr-datepicker',\n 'input',\n 'select',\n 'textarea'\n ];\n\n // Search in light DOM\n selectors.forEach(selector => {\n const elements = host.querySelectorAll(selector);\n elements.forEach((element: HTMLElement & FormFieldCapable) => {\n if (element.name || element.getAttribute('name')) {\n fields.push(element);\n }\n });\n });\n\n // Search in slotted content\n const slots = host.shadowRoot?.querySelectorAll('slot') || [];\n slots.forEach((slot: HTMLSlotElement) => {\n const assignedElements = slot.assignedElements({ flatten: true });\n assignedElements.forEach(element => {\n selectors.forEach(selector => {\n if (element.matches && element.matches(selector)) {\n const fieldElement = element as HTMLElement & FormFieldCapable;\n if (fieldElement.name || fieldElement.getAttribute('name')) {\n fields.push(fieldElement);\n }\n }\n \n // Also search within the element\n const nestedFields = element.querySelectorAll(selector);\n nestedFields.forEach((nested) => {\n const fieldElement = nested as HTMLElement & FormFieldCapable;\n if (fieldElement.name || fieldElement.getAttribute('name')) {\n fields.push(fieldElement);\n }\n });\n });\n });\n });\n\n return fields;\n }\n\n /**\n * Set submission state and update host\n */\n private setSubmissionState(state: FormSubmissionState): void {\n this.submissionState = state;\n (this.host as any).requestUpdate?.();\n }\n\n /**\n * Dispatch submit attempt event\n */\n private dispatchSubmitAttemptEvent(validationResult: any): void {\n (this.host as any).dispatchCustomEvent?.(FORM_EVENTS.SUBMIT_ATTEMPT, {\n validationResult\n });\n }\n\n /**\n * Dispatch submit success event\n */\n private dispatchSubmitSuccessEvent(data: FormSubmissionData): void {\n (this.host as any).dispatchCustomEvent?.(FORM_EVENTS.SUBMIT_SUCCESS, {\n formData: data\n });\n }\n\n /**\n * Dispatch submit error event\n */\n private dispatchSubmitErrorEvent(error: Error): void {\n (this.host as any).dispatchCustomEvent?.(FORM_EVENTS.SUBMIT_ERROR, {\n error\n });\n }\n}\n"]}
1
+ {"version":3,"file":"submission.controller.js","sourceRoot":"","sources":["../../../../../src/components/form/controllers/submission.controller.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\nimport { \n FormSubmissionData, \n FormSubmissionState, \n FormFieldCapable,\n FORM_EVENTS \n} from '../form.types.js';\n\n/**\n * Controller that handles form submission logic\n */\nexport class FormSubmissionController {\n private submissionState: FormSubmissionState = FormSubmissionState.Idle;\n private lastSubmissionData: FormSubmissionData | null = null;\n\n constructor(private host: any) {}\n\n /**\n * Get current submission state\n */\n getSubmissionState(): FormSubmissionState {\n return this.submissionState;\n }\n\n /**\n * Check if form is currently submitting\n */\n isSubmitting(): boolean {\n return this.submissionState === FormSubmissionState.Submitting;\n }\n\n /**\n * Collect form data from all registered fields\n */\n collectFormData(): FormSubmissionData {\n const formData = new FormData();\n const jsonData: Record<string, any> = {};\n const fields: Record<string, any> = {};\n\n // Get all form field elements\n const formFields = this.getFormFields();\n\n formFields.forEach(element => {\n const name = element.name || element.getAttribute('name');\n if (!name) return;\n\n const value = element.value;\n \n // Add to FormData\n if (value !== null && value !== undefined) {\n formData.append(name, String(value));\n }\n\n // Add to JSON data\n jsonData[name] = value;\n fields[name] = {\n element,\n value,\n name,\n type: element.tagName.toLowerCase(),\n required: element.required || false,\n disabled: element.disabled || false\n };\n });\n\n return {\n formData,\n jsonData,\n fields\n };\n }\n\n /**\n * Submit form with validation\n */\n async submitForm(customData?: Record<string, any>): Promise<FormSubmissionData> {\n if (this.isSubmitting()) {\n throw new Error('Form is already submitting');\n }\n\n try {\n this.setSubmissionState(FormSubmissionState.Submitting);\n\n // Validate form first\n const validationController = (this.host as any).validationController;\n if (validationController) {\n const validationResult = await validationController.validateForm();\n \n if (!validationResult.isValid) {\n // Focus first invalid field\n validationController.focusFirstInvalidField();\n \n // Dispatch submit attempt event\n this.dispatchSubmitAttemptEvent(validationResult);\n \n throw new Error(`Form validation failed: ${validationResult.summary}`);\n }\n }\n\n // Collect form data\n const submissionData = this.collectFormData();\n \n // Merge custom data if provided\n if (customData) {\n Object.assign(submissionData.jsonData, customData);\n Object.entries(customData).forEach(([key, value]) => {\n submissionData.formData.append(key, String(value));\n });\n }\n\n this.lastSubmissionData = submissionData;\n\n // Dispatch submit success event\n this.dispatchSubmitSuccessEvent(submissionData);\n \n this.setSubmissionState(FormSubmissionState.Success);\n \n return submissionData;\n\n } catch (error) {\n this.setSubmissionState(FormSubmissionState.Error);\n \n // Dispatch submit error event\n this.dispatchSubmitErrorEvent(error as Error);\n \n throw error;\n }\n }\n\n /**\n * Reset submission state\n */\n resetSubmission(): void {\n this.submissionState = FormSubmissionState.Idle;\n this.lastSubmissionData = null;\n }\n\n /**\n * Get last submission data\n */\n getLastSubmissionData(): FormSubmissionData | null {\n return this.lastSubmissionData;\n }\n\n /**\n * Get all form field elements from the host\n */\n private getFormFields(): (HTMLElement & FormFieldCapable)[] {\n const host = this.host;\n const fields: (HTMLElement & FormFieldCapable)[] = [];\n\n // Query for all potential form field elements\n const selectors = [\n 'nr-input',\n 'nr-select', \n 'nr-radio',\n 'nr-checkbox',\n 'nr-textarea',\n 'nr-timepicker',\n 'nr-datepicker',\n 'input',\n 'select',\n 'textarea'\n ];\n\n // Search in light DOM\n selectors.forEach(selector => {\n const elements = host.querySelectorAll(selector);\n elements.forEach((element: HTMLElement & FormFieldCapable) => {\n if (element.name || element.getAttribute('name')) {\n fields.push(element);\n }\n });\n });\n\n // Search in slotted content\n const slots = host.shadowRoot?.querySelectorAll('slot') || [];\n slots.forEach((slot: HTMLSlotElement) => {\n const assignedElements = slot.assignedElements({ flatten: true });\n assignedElements.forEach(element => {\n selectors.forEach(selector => {\n if (element.matches && element.matches(selector)) {\n const fieldElement = element as HTMLElement & FormFieldCapable;\n if (fieldElement.name || fieldElement.getAttribute('name')) {\n fields.push(fieldElement);\n }\n }\n \n // Also search within the element\n const nestedFields = element.querySelectorAll(selector);\n nestedFields.forEach((nested) => {\n const fieldElement = nested as HTMLElement & FormFieldCapable;\n if (fieldElement.name || fieldElement.getAttribute('name')) {\n fields.push(fieldElement);\n }\n });\n });\n });\n });\n\n return fields;\n }\n\n /**\n * Set submission state and update host\n */\n private setSubmissionState(state: FormSubmissionState): void {\n this.submissionState = state;\n (this.host as any).requestUpdate?.();\n }\n\n /**\n * Dispatch submit attempt event\n */\n private dispatchSubmitAttemptEvent(validationResult: any): void {\n (this.host as any).dispatchCustomEvent?.(FORM_EVENTS.SUBMIT_ATTEMPT, {\n validationResult\n });\n }\n\n /**\n * Dispatch submit success event\n */\n private dispatchSubmitSuccessEvent(data: FormSubmissionData): void {\n (this.host as any).dispatchCustomEvent?.(FORM_EVENTS.SUBMIT_SUCCESS, {\n formData: data\n });\n }\n\n /**\n * Dispatch submit error event\n */\n private dispatchSubmitErrorEvent(error: Error): void {\n (this.host as any).dispatchCustomEvent?.(FORM_EVENTS.SUBMIT_ERROR, {\n error\n });\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"validation.controller.d.ts","sourceRoot":"","sources":["../../../../src/components/form/controllers/validation.controller.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACH,SAAS,EACT,oBAAoB,EACpB,mBAAmB,EAEtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAE/D;;;GAGG;AACH,qBAAa,wBAAwB;IAKvB,OAAO,CAAC,IAAI;IAJxB,OAAO,CAAC,MAAM,CAAqC;IACnD,OAAO,CAAC,eAAe,CAAqD;IAC5E,OAAO,CAAC,iBAAiB,CAA8C;gBAEnD,IAAI,EAAE,GAAG;IAE7B;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,oBAAoB,GAAG,IAAI;IAoBhE;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQnC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAM5B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAmB7B;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAgBjC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAY7B;;OAEG;IACH,YAAY,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAa7C;;OAEG;YACW,iBAAiB;IAoC/B;;OAEG;IACH,kBAAkB,IAAI,mBAAmB;IAIzC;;OAEG;IACH,SAAS,IAAI,SAAS,EAAE;IAIxB;;OAEG;IACH,gBAAgB,IAAI,SAAS,EAAE;IAI/B;;OAEG;IACH,OAAO,IAAI,OAAO;IAKlB;;OAEG;IACH,sBAAsB,IAAI,OAAO;IASjC;;OAEG;IACH,KAAK,IAAI,IAAI;IAsBb;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAM/B;;OAEG;IACH,OAAO,CAAC,kBAAkB;CAG3B"}
1
+ {"version":3,"file":"validation.controller.d.ts","sourceRoot":"","sources":["../../../../../src/components/form/controllers/validation.controller.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACH,SAAS,EACT,oBAAoB,EACpB,mBAAmB,EAEtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAE/D;;;GAGG;AACH,qBAAa,wBAAwB;IAKvB,OAAO,CAAC,IAAI;IAJxB,OAAO,CAAC,MAAM,CAAqC;IACnD,OAAO,CAAC,eAAe,CAAqD;IAC5E,OAAO,CAAC,iBAAiB,CAA8C;gBAEnD,IAAI,EAAE,GAAG;IAE7B;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,oBAAoB,GAAG,IAAI;IAoBhE;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQnC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAM5B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAmB7B;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAgBjC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAY7B;;OAEG;IACH,YAAY,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAa7C;;OAEG;YACW,iBAAiB;IAoC/B;;OAEG;IACH,kBAAkB,IAAI,mBAAmB;IAIzC;;OAEG;IACH,SAAS,IAAI,SAAS,EAAE;IAIxB;;OAEG;IACH,gBAAgB,IAAI,SAAS,EAAE;IAI/B;;OAEG;IACH,OAAO,IAAI,OAAO;IAKlB;;OAEG;IACH,sBAAsB,IAAI,OAAO;IASjC;;OAEG;IACH,KAAK,IAAI,IAAI;IAsBb;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAM/B;;OAEG;IACH,OAAO,CAAC,kBAAkB;CAG3B"}
@@ -1 +1 @@
1
- {"version":3,"file":"validation.controller.js","sourceRoot":"","sources":["../../../../src/components/form/controllers/validation.controller.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\nimport {\n FormField,\n FormValidationResult,\n FormValidationState,\n FORM_EVENTS\n} from '../form.types.js';\nimport { ValidatableComponent } from '@nuralyui/common/mixins';\n\n/**\n * Controller that coordinates validation across all form fields\n * This does NOT perform validation - it coordinates existing component validations\n */\nexport class FormValidationController {\n private fields: Map<string, FormField> = new Map();\n private validationState: FormValidationState = FormValidationState.Pristine;\n private validationPromise: Promise<FormValidationResult> | null = null;\n\n constructor(private host: any) {}\n\n /**\n * Register a form field for validation coordination\n */\n registerField(element: HTMLElement & ValidatableComponent): void {\n const name = element.name || element.getAttribute('name') || `field-${Date.now()}`;\n \n const field: FormField = {\n element,\n name,\n value: element.value,\n isValid: element.getValidationStatus().isValid,\n validationMessage: element.validationMessage || '',\n required: element.required ?? false,\n touched: false,\n dirty: false\n };\n\n this.fields.set(name, field);\n\n // Listen for field changes\n this.addFieldListeners(element, name);\n }\n\n /**\n * Unregister a form field\n */\n unregisterField(name: string): void {\n const field = this.fields.get(name);\n if (field) {\n this.removeFieldListeners(field.element);\n this.fields.delete(name);\n }\n }\n\n /**\n * Add event listeners to a form field\n */\n private addFieldListeners(element: HTMLElement, fieldName: string): void {\n element.addEventListener('nr-validation', (event) => this.handleFieldValidation(fieldName, event as CustomEvent));\n }\n\n /**\n * Remove event listeners from a form field\n */\n private removeFieldListeners(_element: HTMLElement): void {\n // Remove all event listeners (implementation depends on your needs)\n // You might want to store listener references for proper cleanup\n }\n\n\n /**\n * Handle field validation event\n */\n private handleFieldValidation(fieldName: string, event?: CustomEvent): void {\n const field = this.fields.get(fieldName);\n if (!field) return;\n\n if (event && event.detail) {\n // Use the detailed validation information from the nr-validation event\n field.isValid = event.detail.isValid || false;\n field.validationMessage = event.detail.validationMessage || '';\n } else {\n // Fallback to ValidatableComponent validation\n const status = field.element.getValidationStatus();\n field.isValid = status.isValid;\n field.validationMessage = field.element.validationMessage || '';\n }\n\n // Update form validation state based on all fields\n this.updateFormValidationState();\n }\n\n /**\n * Update form validation state based on current field states\n */\n private updateFormValidationState(): void {\n const invalidFields = this.getInvalidFields();\n const isFormValid = invalidFields.length === 0;\n \n this.validationState = isFormValid ? FormValidationState.Valid : FormValidationState.Invalid;\n \n const result: FormValidationResult = {\n isValid: isFormValid,\n invalidFields,\n validationErrors: this.buildValidationErrors(),\n summary: isFormValid ? 'Form is valid' : `${invalidFields.length} field(s) have errors`\n };\n \n this.dispatchValidationEvent(result);\n }\n\n /**\n * Build validation errors object from current field states\n */\n private buildValidationErrors(): Record<string, string> {\n const errors: Record<string, string> = {};\n for (const [name, field] of this.fields) {\n if (!field.isValid && field.validationMessage) {\n errors[name] = field.validationMessage;\n }\n }\n return errors;\n }\n\n \n\n /**\n * Validate all form fields (coordinates existing validations)\n */\n validateForm(): Promise<FormValidationResult> {\n // Return existing promise if validation is in progress\n if (this.validationPromise) {\n return this.validationPromise;\n }\n\n this.validationState = FormValidationState.Pending;\n\n this.validationPromise = this.performValidation();\n \n return this.validationPromise;\n }\n\n /**\n * Perform the actual validation coordination\n */\n private async performValidation(): Promise<FormValidationResult> {\n const invalidFields: FormField[] = [];\n const validationErrors: Record<string, string> = {};\n\n // Check each field's validation state\n for (const [name, field] of this.fields) {\n // Trigger validation on the field component itself\n const status = field.element.getValidationStatus();\n const isValid = status.isValid;\n \n field.isValid = isValid;\n field.validationMessage = field.element.validationMessage || '';\n\n if (!isValid) {\n invalidFields.push(field);\n validationErrors[name] = field.validationMessage;\n }\n }\n\n const isFormValid = invalidFields.length === 0;\n this.validationState = isFormValid ? FormValidationState.Valid : FormValidationState.Invalid;\n\n const result: FormValidationResult = {\n isValid: isFormValid,\n invalidFields,\n validationErrors,\n summary: isFormValid ? 'Form is valid' : `${invalidFields.length} field(s) have errors`\n };\n\n this.dispatchValidationEvent(result);\n\n this.validationPromise = null;\n\n return result;\n }\n\n /**\n * Get current validation state\n */\n getValidationState(): FormValidationState {\n return this.validationState;\n }\n\n /**\n * Get all registered fields\n */\n getFields(): FormField[] {\n return Array.from(this.fields.values());\n }\n\n /**\n * Get invalid fields\n */\n getInvalidFields(): FormField[] {\n return Array.from(this.fields.values()).filter(field => !field.isValid);\n }\n\n /**\n * Check if form is valid\n */\n isValid(): boolean {\n return this.validationState === FormValidationState.Valid && \n Array.from(this.fields.values()).every(field => field.isValid);\n }\n\n /**\n * Focus first invalid field\n */\n focusFirstInvalidField(): boolean {\n const invalidField = Array.from(this.fields.values()).find(field => !field.isValid);\n if (invalidField && typeof invalidField.element.focus === 'function') {\n invalidField.element.focus();\n return true;\n }\n return false;\n }\n\n /**\n * Reset all fields\n */\n reset(): void {\n for (const field of this.fields.values()) {\n // Reset using ValidatableComponent interface if available\n if ('clearValidation' in field.element && typeof field.element.clearValidation === 'function') {\n field.element.clearValidation();\n }\n // Reset value if component supports it\n if ('value' in field.element) {\n field.element.value = '';\n }\n field.touched = false;\n field.dirty = false;\n field.isValid = true;\n field.validationMessage = '';\n }\n \n this.validationState = FormValidationState.Pristine;\n this.dispatchResetEvent();\n }\n\n \n\n /**\n * Dispatch validation event\n */\n private dispatchValidationEvent(result: FormValidationResult): void {\n (this.host as any).dispatchCustomEvent?.(FORM_EVENTS.VALIDATION_CHANGED, {\n validationResult: result\n });\n }\n\n /**\n * Dispatch reset event\n */\n private dispatchResetEvent(): void {\n (this.host as any).dispatchCustomEvent?.(FORM_EVENTS.RESET, {});\n }\n}\n"]}
1
+ {"version":3,"file":"validation.controller.js","sourceRoot":"","sources":["../../../../../src/components/form/controllers/validation.controller.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\nimport {\n FormField,\n FormValidationResult,\n FormValidationState,\n FORM_EVENTS\n} from '../form.types.js';\nimport { ValidatableComponent } from '@nuralyui/common/mixins';\n\n/**\n * Controller that coordinates validation across all form fields\n * This does NOT perform validation - it coordinates existing component validations\n */\nexport class FormValidationController {\n private fields: Map<string, FormField> = new Map();\n private validationState: FormValidationState = FormValidationState.Pristine;\n private validationPromise: Promise<FormValidationResult> | null = null;\n\n constructor(private host: any) {}\n\n /**\n * Register a form field for validation coordination\n */\n registerField(element: HTMLElement & ValidatableComponent): void {\n const name = element.name || element.getAttribute('name') || `field-${Date.now()}`;\n \n const field: FormField = {\n element,\n name,\n value: element.value,\n isValid: element.getValidationStatus().isValid,\n validationMessage: element.validationMessage || '',\n required: element.required ?? false,\n touched: false,\n dirty: false\n };\n\n this.fields.set(name, field);\n\n // Listen for field changes\n this.addFieldListeners(element, name);\n }\n\n /**\n * Unregister a form field\n */\n unregisterField(name: string): void {\n const field = this.fields.get(name);\n if (field) {\n this.removeFieldListeners(field.element);\n this.fields.delete(name);\n }\n }\n\n /**\n * Add event listeners to a form field\n */\n private addFieldListeners(element: HTMLElement, fieldName: string): void {\n element.addEventListener('nr-validation', (event) => this.handleFieldValidation(fieldName, event as CustomEvent));\n }\n\n /**\n * Remove event listeners from a form field\n */\n private removeFieldListeners(_element: HTMLElement): void {\n // Remove all event listeners (implementation depends on your needs)\n // You might want to store listener references for proper cleanup\n }\n\n\n /**\n * Handle field validation event\n */\n private handleFieldValidation(fieldName: string, event?: CustomEvent): void {\n const field = this.fields.get(fieldName);\n if (!field) return;\n\n if (event && event.detail) {\n // Use the detailed validation information from the nr-validation event\n field.isValid = event.detail.isValid || false;\n field.validationMessage = event.detail.validationMessage || '';\n } else {\n // Fallback to ValidatableComponent validation\n const status = field.element.getValidationStatus();\n field.isValid = status.isValid;\n field.validationMessage = field.element.validationMessage || '';\n }\n\n // Update form validation state based on all fields\n this.updateFormValidationState();\n }\n\n /**\n * Update form validation state based on current field states\n */\n private updateFormValidationState(): void {\n const invalidFields = this.getInvalidFields();\n const isFormValid = invalidFields.length === 0;\n \n this.validationState = isFormValid ? FormValidationState.Valid : FormValidationState.Invalid;\n \n const result: FormValidationResult = {\n isValid: isFormValid,\n invalidFields,\n validationErrors: this.buildValidationErrors(),\n summary: isFormValid ? 'Form is valid' : `${invalidFields.length} field(s) have errors`\n };\n \n this.dispatchValidationEvent(result);\n }\n\n /**\n * Build validation errors object from current field states\n */\n private buildValidationErrors(): Record<string, string> {\n const errors: Record<string, string> = {};\n for (const [name, field] of this.fields) {\n if (!field.isValid && field.validationMessage) {\n errors[name] = field.validationMessage;\n }\n }\n return errors;\n }\n\n \n\n /**\n * Validate all form fields (coordinates existing validations)\n */\n validateForm(): Promise<FormValidationResult> {\n // Return existing promise if validation is in progress\n if (this.validationPromise) {\n return this.validationPromise;\n }\n\n this.validationState = FormValidationState.Pending;\n\n this.validationPromise = this.performValidation();\n \n return this.validationPromise;\n }\n\n /**\n * Perform the actual validation coordination\n */\n private async performValidation(): Promise<FormValidationResult> {\n const invalidFields: FormField[] = [];\n const validationErrors: Record<string, string> = {};\n\n // Check each field's validation state\n for (const [name, field] of this.fields) {\n // Trigger validation on the field component itself\n const status = field.element.getValidationStatus();\n const isValid = status.isValid;\n \n field.isValid = isValid;\n field.validationMessage = field.element.validationMessage || '';\n\n if (!isValid) {\n invalidFields.push(field);\n validationErrors[name] = field.validationMessage;\n }\n }\n\n const isFormValid = invalidFields.length === 0;\n this.validationState = isFormValid ? FormValidationState.Valid : FormValidationState.Invalid;\n\n const result: FormValidationResult = {\n isValid: isFormValid,\n invalidFields,\n validationErrors,\n summary: isFormValid ? 'Form is valid' : `${invalidFields.length} field(s) have errors`\n };\n\n this.dispatchValidationEvent(result);\n\n this.validationPromise = null;\n\n return result;\n }\n\n /**\n * Get current validation state\n */\n getValidationState(): FormValidationState {\n return this.validationState;\n }\n\n /**\n * Get all registered fields\n */\n getFields(): FormField[] {\n return Array.from(this.fields.values());\n }\n\n /**\n * Get invalid fields\n */\n getInvalidFields(): FormField[] {\n return Array.from(this.fields.values()).filter(field => !field.isValid);\n }\n\n /**\n * Check if form is valid\n */\n isValid(): boolean {\n return this.validationState === FormValidationState.Valid && \n Array.from(this.fields.values()).every(field => field.isValid);\n }\n\n /**\n * Focus first invalid field\n */\n focusFirstInvalidField(): boolean {\n const invalidField = Array.from(this.fields.values()).find(field => !field.isValid);\n if (invalidField && typeof invalidField.element.focus === 'function') {\n invalidField.element.focus();\n return true;\n }\n return false;\n }\n\n /**\n * Reset all fields\n */\n reset(): void {\n for (const field of this.fields.values()) {\n // Reset using ValidatableComponent interface if available\n if ('clearValidation' in field.element && typeof field.element.clearValidation === 'function') {\n field.element.clearValidation();\n }\n // Reset value if component supports it\n if ('value' in field.element) {\n field.element.value = '';\n }\n field.touched = false;\n field.dirty = false;\n field.isValid = true;\n field.validationMessage = '';\n }\n \n this.validationState = FormValidationState.Pristine;\n this.dispatchResetEvent();\n }\n\n \n\n /**\n * Dispatch validation event\n */\n private dispatchValidationEvent(result: FormValidationResult): void {\n (this.host as any).dispatchCustomEvent?.(FORM_EVENTS.VALIDATION_CHANGED, {\n validationResult: result\n });\n }\n\n /**\n * Dispatch reset event\n */\n private dispatchResetEvent(): void {\n (this.host as any).dispatchCustomEvent?.(FORM_EVENTS.RESET, {});\n }\n}\n"]}
@@ -3,7 +3,7 @@
3
3
  * Copyright 2023 Nuraly, Laabidi Aymen
4
4
  * SPDX-License-Identifier: MIT
5
5
  */
6
- import { LitElement, PropertyValues } from 'lit';
6
+ import { LitElement, type PropertyValues } from 'lit';
7
7
  import { FormConfig, FormValidationState, FormSubmissionState } from './form.types.js';
8
8
  declare const NrFormElement_base: (new (...args: any[]) => import("@nuralyui/common/mixins").DependencyAware) & (new (...args: any[]) => import("@nuralyui/common/mixins").ThemeAware) & (new (...args: any[]) => import("@nuralyui/common/mixins").EventHandlerCapable) & typeof LitElement;
9
9
  /**
@@ -273,7 +273,7 @@ export declare class NrFormElement extends NrFormElement_base {
273
273
  * @param loading Whether form is in loading state
274
274
  */
275
275
  setLoading(loading: boolean): void;
276
- render(): import("lit").TemplateResult<1>;
276
+ render(): import("lit-html").TemplateResult<1>;
277
277
  }
278
278
  export {};
279
279
  //# sourceMappingURL=form.component.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"form.component.js","sourceRoot":"","sources":["../../../src/components/form/form.component.ts"],"names":[],"mappings":"AAAA;;;;GAIG;;;;;;;;;;;;;;;;AAEH,OAAO,EAAE,UAAU,EAAE,IAAI,EAAkB,MAAM,KAAK,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAEL,mBAAmB,EACnB,mBAAmB,EAEnB,WAAW,EACZ,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAClF,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAElF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AAEH,IAAa,aAAa,GAA1B,MAAa,aAAc,SAAQ,iBAAiB,CAAC,UAAU,CAAC;IAAhE;;QAGE,yBAAyB;QAEzB,WAAM,GAAe;YACnB,gBAAgB,EAAE,KAAK;YACvB,cAAc,EAAE,IAAI;YACpB,qBAAqB,EAAE,KAAK;YAC5B,wBAAwB,EAAE,IAAI;YAC9B,cAAc,EAAE,KAAK;YACrB,eAAe,EAAE,GAAG;SACrB,CAAC;QAEF,mDAAmD;QAEnD,qBAAgB,GAAG,KAAK,CAAC,CAAE,mBAAmB;QAE9C,sCAAsC;QAEtC,mBAAc,GAAG,IAAI,CAAC;QAEtB,kDAAkD;QAElD,6BAAwB,GAAG,IAAI,CAAC;QAEhC,6CAA6C;QAE7C,mBAAc,GAAG,KAAK,CAAC;QAMvB,wCAAwC;QAExC,WAAM,GAAmB,MAAM,CAAC;QAEhC,yBAAyB;QAEzB,YAAO,GAAW,qBAAqB,CAAC;QAMxC,8BAA8B;QAE9B,aAAQ,GAAG,KAAK,CAAC;QAEjB,4BAA4B;QAEpB,qBAAgB,GAAwB,mBAAmB,CAAC,QAAQ,CAAC;QAE7E,4BAA4B;QAEpB,qBAAgB,GAAwB,mBAAmB,CAAC,IAAI,CAAC;QAEzE,4BAA4B;QACpB,yBAAoB,GAAG,IAAI,wBAAwB,CAAC,IAAI,CAAC,CAAC;QAElE,4BAA4B;QACpB,yBAAoB,GAAG,IAAI,wBAAwB,CAAC,IAAI,CAAC,CAAC;QA0JlE;;WAEG;QACK,4BAAuB,GAAG,CAAC,KAAY,EAAQ,EAAE;YACvD,MAAM,WAAW,GAAG,KAAqC,CAAC;YAC1D,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,gBAAgB,CAAC;YACnD,IAAI,MAAM,EAAE;gBACV,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;oBACtC,mBAAmB,CAAC,KAAK,CAAC,CAAC;oBAC3B,mBAAmB,CAAC,OAAO,CAAC;aAC/B;QACH,CAAC,CAAC;IA+YJ,CAAC;IAljBC,mCAAmC;IACnC,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;IAED,mCAAmC;IACnC,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;IAEQ,iBAAiB;QACxB,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC1B,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC;IAEQ,oBAAoB;QAC3B,KAAK,CAAC,oBAAoB,EAAE,CAAC;QAC7B,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC7B,CAAC;IAEQ,UAAU,CAAC,iBAAiC;QACnD,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;QAEpC,uCAAuC;QACvC,IAAI,iBAAiB,CAAC,GAAG,CAAC,kBAAkB,CAAC;YACzC,iBAAiB,CAAC,GAAG,CAAC,gBAAgB,CAAC;YACvC,iBAAiB,CAAC,GAAG,CAAC,0BAA0B,CAAC;YACjD,iBAAiB,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE;YAC3C,IAAI,CAAC,MAAM,mCACN,IAAI,CAAC,MAAM,KACd,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EACvC,cAAc,EAAE,IAAI,CAAC,cAAc,EACnC,wBAAwB,EAAE,IAAI,CAAC,wBAAwB,EACvD,cAAc,EAAE,IAAI,CAAC,cAAc,GACpC,CAAC;SACH;IACH,CAAC;IAEQ,YAAY;QACnB,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC9B,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAED;;OAEG;IACK,iBAAiB;QACvB,kEAAkE;QAClE,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,CAAC,SAAS,EAAE,EAAE;YAClD,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAC3B,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;oBACjC,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,YAAY,EAAE;wBACvC,IAAI,CAAC,uBAAuB,CAAC,IAAe,CAAC,CAAC;qBAC/C;gBACH,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE;YACrB,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QAEF,IAAY,CAAC,aAAa,GAAG,QAAQ,CAAC;IACzC,CAAC;IAED;;OAEG;IACK,mBAAmB;QACzB,MAAM,QAAQ,GAAI,IAAY,CAAC,aAAa,CAAC;QAC7C,IAAI,QAAQ,EAAE;YACZ,QAAQ,CAAC,UAAU,EAAE,CAAC;SACvB;IACH,CAAC;IAED;;OAEG;IACK,sBAAsB;QAC5B,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACK,uBAAuB,CAAC,OAAgB;QAC9C,MAAM,SAAS,GAAG;YAChB,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa;YAClD,aAAa,EAAE,eAAe,EAAE,eAAe;SAChD,CAAC;QAEF,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;YAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YAClD,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;gBACrB,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE;oBAC9B,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC,KAAY,CAAC,CAAC;iBACvD;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,eAAe;QACrB,6BAA6B;QAC7B,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAEvD,wBAAwB;QACxB,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QAErD,+BAA+B;QAC/B,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,kBAAkB,EAAE,IAAI,CAAC,uBAAwC,CAAC,CAAC;IACvG,CAAC;IAED;;OAEG;IACW,gBAAgB,CAAC,KAAY;;YACzC,KAAK,CAAC,cAAc,EAAE,CAAC;YAEvB,IAAI,IAAI,CAAC,QAAQ,EAAE;gBACjB,OAAO;aACR;YAED,IAAI;gBACF,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,UAAU,EAAE,CAAC;gBAEpE,IAAI,IAAI,CAAC,cAAc,EAAE;oBACvB,IAAI,CAAC,KAAK,EAAE,CAAC;iBACd;gBAED,oDAAoD;gBACpD,IAAI,IAAI,CAAC,MAAM,EAAE;oBACf,IAAI,CAAC,uBAAuB,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;iBACvD;aAEF;YAAC,OAAO,KAAK,EAAE;gBACd,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;gBAChD,+DAA+D;aAChE;QACH,CAAC;KAAA;IAED;;OAEG;IACK,eAAe,CAAC,KAAY;QAClC,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IAeD;;OAEG;IACK,uBAAuB,CAAC,QAAkB;QAChD,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAO,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,IAAI,IAAI,CAAC,MAAM;YAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAE3C,iCAAiC;QACjC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE;YAC9C,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAC9C,KAAK,CAAC,IAAI,GAAG,QAAQ,CAAC;YACtB,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;YAClB,KAAK,CAAC,KAAK,GAAG,KAAe,CAAC;YAC9B,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;SACzB;QAED,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,MAAM,EAAE,CAAC;QACd,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACG,QAAQ;;YACZ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,YAAY,EAAE,CAAC;YAC9D,OAAO,MAAM,CAAC,OAAO,CAAC;QACxB,CAAC;KAAA;IAED;;OAEG;IACG,MAAM,CAAC,UAAgC;;YAC3C,MAAM,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QACzD,CAAC;KAAA;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,CAAC;QAClC,IAAI,CAAC,oBAAoB,CAAC,eAAe,EAAE,CAAC;QAC5C,IAAI,CAAC,gBAAgB,GAAG,mBAAmB,CAAC,QAAQ,CAAC;QACrD,IAAI,CAAC,gBAAgB,GAAG,mBAAmB,CAAC,IAAI,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,oBAAoB,CAAC,YAAY,EAAE,CAAC;IAClD,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,oBAAoB,CAAC,eAAe,EAAE,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,OAAO,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,EAAE,CAAC;IACtD,CAAC;IAED,+CAA+C;IAC/C,mBAAmB;IACnB,+CAA+C;IAE/C;;;OAGG;IACH,cAAc,CAAC,QAAmB;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAEjC,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;YACnC,MAAM,cAAc,GAAwB,EAAE,CAAC;YAC/C,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBACtB,IAAI,IAAI,IAAI,MAAM,EAAE;oBAClB,cAAc,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;iBACrC;YACH,CAAC,CAAC,CAAC;YACH,OAAO,cAAc,CAAC;SACvB;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACH,aAAa,CAAC,IAAY;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACrC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IAED;;;OAGG;IACH,cAAc,CAAC,MAA2B;QACxC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE;YAC/C,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,aAAa,CAAC,IAAY,EAAE,KAAU;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,CAAC;QACrD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAEhD,IAAI,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE;YAC1B,KAAK,CAAC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;YAC5B,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;YACpB,4CAA4C;YAC5C,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;SACrE;IACH,CAAC;IAED;;;;OAIG;IACG,cAAc,CAAC,QAAmB;;YACtC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,YAAY,EAAE,CAAC;YAE9D,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;gBACnC,+CAA+C;gBAC/C,MAAM,cAAc,GAA2B,EAAE,CAAC;gBAClD,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;oBACtB,IAAI,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE;wBACjC,cAAc,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;qBACtD;gBACH,CAAC,CAAC,CAAC;gBAEH,IAAI,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC1C,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC;iBACjD;gBAED,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;aACtC;YAED,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;gBACnB,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC;aAC1D;YAED,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC;QAC/B,CAAC;KAAA;IAED;;;OAGG;IACH,WAAW,CAAC,QAAmB;QAC7B,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;YACtC,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,OAAO;SACR;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,CAAC;QACrD,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACtB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;YAChD,IAAI,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE;gBAC1B,cAAc;gBACd,KAAK,CAAC,OAAO,CAAC,KAAK,GAAG,EAAE,CAAC;gBACzB,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC;gBACjB,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;gBACtB,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;gBACpB,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;gBACrB,KAAK,CAAC,iBAAiB,GAAG,EAAE,CAAC;gBAE7B,uBAAuB;gBACvB,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;aACrE;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,aAAa,CAAC,IAAY;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,CAAC;QACrD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAChD,OAAO,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC;IAClE,CAAC;IAED;;;;OAIG;IACH,cAAc,CAAC,QAAmB;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,CAAC;QACrD,MAAM,MAAM,GAAkC,EAAE,CAAC;QAEjD,MAAM,YAAY,GAAG,QAAQ;YAC3B,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC/C,CAAC,CAAC,MAAM,CAAC;QAEX,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YAC3B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACH,cAAc,CAAC,IAAY;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,CAAC;QACrD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAChD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IACvC,CAAC;IAED;;;;OAIG;IACH,eAAe,CAAC,QAAmB;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,CAAC;QACrD,MAAM,YAAY,GAAG,QAAQ;YAC3B,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC/C,CAAC,CAAC,MAAM,CAAC;QAEX,OAAO,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACnD,CAAC;IAED;;;;OAIG;IACH,YAAY,CAAC,IAAY;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,CAAC;QACrD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAChD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IACrC,CAAC;IAED;;;;OAIG;IACH,aAAa,CAAC,QAAmB;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,CAAC;QACrD,MAAM,YAAY,GAAG,QAAQ;YAC3B,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC/C,CAAC,CAAC,MAAM,CAAC;QAEX,OAAO,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC;IAED;;;;OAIG;IACH,gBAAgB,CAAC,IAAY;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,CAAC;QACrD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAChD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IACtC,CAAC;IAED;;;OAGG;IACH,aAAa,CAAC,IAAa;QACzB,IAAI,IAAI,EAAE;YACR,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACjD,IAAI,YAAY,EAAE;gBAChB,YAAY,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACrE,IAAI,OAAO,YAAY,CAAC,KAAK,KAAK,UAAU,EAAE;oBAC5C,YAAY,CAAC,KAAK,EAAE,CAAC;iBACtB;gBACD,OAAO,IAAI,CAAC;aACb;YACD,OAAO,KAAK,CAAC;SACd;QAED,gCAAgC;QAChC,OAAO,IAAI,CAAC,oBAAoB,CAAC,sBAAsB,EAAE,CAAC;IAC5D,CAAC;IAED;;;OAGG;IACG,MAAM;;YACV,IAAI;gBACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;gBAC3C,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;gBACpB,OAAO,MAAM,CAAC;aACf;YAAC,OAAO,KAAK,EAAE;gBACd,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM,KAAK,CAAC;aACb;QACH,CAAC;KAAA;IAED;;;OAGG;IACH,mBAAmB;QACjB,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,CAAC;QACrD,OAAO,MAAM;aACV,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;aAC/B,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACH,SAAS;QACP,OAAO,IAAI,CAAC,mBAAmB,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/C,CAAC;IAED;;;OAGG;IACH,YAAY;QAUV,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,CAAC;QAErD,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE;YAC3B,UAAU,EAAE,IAAI,CAAC,mBAAmB,EAAE,CAAC,MAAM;YAC7C,UAAU,EAAE,MAAM,CAAC,MAAM;YACzB,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YAC7D,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YACzD,aAAa,EAAE,IAAI,CAAC,mBAAmB,EAAE;SAC1C,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,UAAU,CAAC,OAAgB;QACzB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAEQ,MAAM;QACb,OAAO,IAAI,CAAA;;kBAEG,IAAI,CAAC,MAAM,IAAI,EAAE;kBACjB,IAAI,CAAC,MAAM,CAAC,WAAW,EAAoB;mBAC1C,IAAI,CAAC,OAAqF;kBAC3F,IAAI,CAAC,MAAM,IAAI,EAAE;;yBAEV,IAAI,CAAC,QAAQ;;;;;KAKjC,CAAC;IACJ,CAAC;CACF,CAAA;AAjnBiB,oBAAM,GAAG,MAAO,CAAA;AAIhC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;6CAQzB;AAIF;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,CAAC;uDACpC;AAIzB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC;qDACrC;AAItB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,4BAA4B,EAAE,CAAC;+DACrC;AAIhC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC;qDACpC;AAIvB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;6CACX;AAIhB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;6CACK;AAIhC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;8CACT;AAIxC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;6CACX;AAIhB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;+CAC1B;AAIjB;IADC,KAAK,EAAE;uDACqE;AAI7E;IADC,KAAK,EAAE;uDACiE;AAxD9D,aAAa;IADzB,aAAa,CAAC,SAAS,CAAC;GACZ,aAAa,CAknBzB;SAlnBY,aAAa","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\nimport { LitElement, html, PropertyValues } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { styles } from './form.style.js';\nimport {\n FormConfig,\n FormValidationState,\n FormSubmissionState,\n FormEventDetail,\n FORM_EVENTS\n} from './form.types.js';\nimport { NuralyUIBaseMixin } from '@nuralyui/common/mixins';\nimport { FormValidationController } from './controllers/validation.controller.js';\nimport { FormSubmissionController } from './controllers/submission.controller.js';\n\n/**\n * Comprehensive form component with field management and validation API\n * \n * Key Features:\n * - Coordinates validation across all form fields (does NOT validate itself)\n * - Handles form submission with built-in validation checks\n * - Provides form state management and events\n * - Integrates with existing component validation controllers\n * - Supports both programmatic and user-driven interactions\n * - Comprehensive API for field manipulation and validation\n * \n * @example Basic Usage\n * ```html\n * <nr-form @nr-form-submit-success=\"${handleSuccess}\" validate-on-change>\n * <nr-input name=\"username\" required></nr-input>\n * <nr-input name=\"email\" type=\"email\" required></nr-input>\n * <nr-button type=\"submit\">Submit</nr-button>\n * </nr-form>\n * ```\n * \n * @example Programmatic Usage\n * ```typescript\n * const form = document.querySelector('nr-form');\n * \n * // Set field values\n * form.setFieldsValue({ username: 'john', email: 'john@example.com' });\n * \n * // Get field values\n * const values = form.getFieldsValue();\n * \n * // Validate and submit\n * try {\n * const values = await form.finish();\n * console.log('Form submitted:', values);\n * } catch (errors) {\n * console.log('Validation failed:', errors);\n * }\n * \n * // Reset specific fields\n * form.resetFields(['username']);\n * ```\n * \n * @fires nr-form-validation-changed - Validation state changes\n * @fires nr-form-field-changed - Individual field changes\n * @fires nr-form-submit-attempt - Form submission attempted\n * @fires nr-form-submit-success - Form submitted successfully\n * @fires nr-form-submit-error - Form submission failed\n * @fires nr-form-reset - Form was reset\n * \n * @slot default - Form content (inputs, buttons, etc.)\n */\n@customElement('nr-form')\nexport class NrFormElement extends NuralyUIBaseMixin(LitElement) {\n static override styles = styles;\n\n /** Form configuration */\n @property({ type: Object })\n config: FormConfig = {\n validateOnChange: false, // Default to false - only validate on blur\n validateOnBlur: true,\n showErrorsImmediately: false,\n preventInvalidSubmission: true,\n resetOnSuccess: false,\n validationDelay: 300\n };\n\n /** Enable real-time validation on field changes */\n @property({ type: Boolean, attribute: 'validate-on-change' })\n validateOnChange = false; // Default to false\n\n /** Enable validation on field blur */\n @property({ type: Boolean, attribute: 'validate-on-blur' })\n validateOnBlur = true;\n\n /** Prevent form submission if validation fails */\n @property({ type: Boolean, attribute: 'prevent-invalid-submission' })\n preventInvalidSubmission = true;\n\n /** Reset form after successful submission */\n @property({ type: Boolean, attribute: 'reset-on-success' })\n resetOnSuccess = false;\n\n /** Form action URL for native submission */\n @property({ type: String })\n action?: string;\n\n /** Form method for native submission */\n @property({ type: String })\n method: 'GET' | 'POST' = 'POST';\n\n /** Form encoding type */\n @property({ type: String, attribute: 'enctype' })\n enctype: string = 'multipart/form-data';\n\n /** Target for form submission */\n @property({ type: String })\n target?: string;\n\n /** Disable the entire form */\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /** Form validation state */\n @state()\n private _validationState: FormValidationState = FormValidationState.Pristine;\n\n /** Form submission state */\n @state()\n private _submissionState: FormSubmissionState = FormSubmissionState.Idle;\n\n /** Validation controller */\n private validationController = new FormValidationController(this);\n\n /** Submission controller */\n private submissionController = new FormSubmissionController(this);\n\n /** Get current validation state */\n get validationState(): FormValidationState {\n return this._validationState;\n }\n\n /** Get current submission state */\n get submissionState(): FormSubmissionState {\n return this._submissionState;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.setupFormObserver();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.cleanupFormObserver();\n }\n\n override willUpdate(changedProperties: PropertyValues): void {\n super.willUpdate(changedProperties);\n \n // Update config when properties change\n if (changedProperties.has('validateOnChange') || \n changedProperties.has('validateOnBlur') ||\n changedProperties.has('preventInvalidSubmission') ||\n changedProperties.has('resetOnSuccess')) {\n this.config = {\n ...this.config,\n validateOnChange: this.validateOnChange,\n validateOnBlur: this.validateOnBlur,\n preventInvalidSubmission: this.preventInvalidSubmission,\n resetOnSuccess: this.resetOnSuccess\n };\n }\n }\n\n override firstUpdated(): void {\n this.registerExistingFields();\n this.setupFormEvents();\n }\n\n /**\n * Setup mutation observer to detect new form fields\n */\n private setupFormObserver(): void {\n // Implementation for observing DOM changes to register new fields\n const observer = new MutationObserver((mutations) => {\n mutations.forEach(mutation => {\n mutation.addedNodes.forEach(node => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n this.registerFieldsInElement(node as Element);\n }\n });\n });\n });\n\n observer.observe(this, { \n childList: true, \n subtree: true \n });\n\n (this as any)._formObserver = observer;\n }\n\n /**\n * Cleanup mutation observer\n */\n private cleanupFormObserver(): void {\n const observer = (this as any)._formObserver;\n if (observer) {\n observer.disconnect();\n }\n }\n\n /**\n * Register existing form fields\n */\n private registerExistingFields(): void {\n this.registerFieldsInElement(this);\n }\n\n /**\n * Register form fields in an element\n */\n private registerFieldsInElement(element: Element): void {\n const selectors = [\n 'nr-input', 'nr-select', 'nr-radio', 'nr-checkbox', \n 'nr-textarea', 'nr-timepicker', 'nr-datepicker'\n ];\n\n selectors.forEach(selector => {\n const fields = element.querySelectorAll(selector);\n fields.forEach(field => {\n if (field.getAttribute('name')) {\n this.validationController.registerField(field as any);\n }\n });\n });\n }\n\n /**\n * Setup form events\n */\n private setupFormEvents(): void {\n // Listen for form submission\n this.addEventListener('submit', this.handleFormSubmit);\n \n // Listen for form reset\n this.addEventListener('reset', this.handleFormReset);\n\n // Listen for validation events\n this.addEventListener(FORM_EVENTS.VALIDATION_CHANGED, this.handleValidationChanged as EventListener);\n }\n\n /**\n * Handle form submission\n */\n private async handleFormSubmit(event: Event): Promise<void> {\n event.preventDefault();\n\n if (this.disabled) {\n return;\n }\n\n try {\n const submissionData = await this.submissionController.submitForm();\n \n if (this.resetOnSuccess) {\n this.reset();\n }\n\n // If action is specified, perform native submission\n if (this.action) {\n this.performNativeSubmission(submissionData.formData);\n }\n\n } catch (error) {\n console.error('Form submission failed:', error);\n // Error events are already dispatched by submission controller\n }\n }\n\n /**\n * Handle form reset\n */\n private handleFormReset(event: Event): void {\n event.preventDefault();\n this.reset();\n }\n\n /**\n * Handle validation state changes\n */\n private handleValidationChanged = (event: Event): void => {\n const customEvent = event as CustomEvent<FormEventDetail>;\n const result = customEvent.detail.validationResult;\n if (result) {\n this._validationState = result.isValid ? \n FormValidationState.Valid : \n FormValidationState.Invalid;\n }\n };\n\n /**\n * Perform native form submission\n */\n private performNativeSubmission(formData: FormData): void {\n const form = document.createElement('form');\n form.action = this.action!;\n form.method = this.method;\n form.enctype = this.enctype;\n if (this.target) form.target = this.target;\n\n // Add form data as hidden inputs\n for (const [name, value] of formData.entries()) {\n const input = document.createElement('input');\n input.type = 'hidden';\n input.name = name;\n input.value = value as string;\n form.appendChild(input);\n }\n\n document.body.appendChild(form);\n form.submit();\n document.body.removeChild(form);\n }\n\n /**\n * Validate the form\n */\n async validate(): Promise<boolean> {\n const result = await this.validationController.validateForm();\n return result.isValid;\n }\n\n /**\n * Submit the form programmatically\n */\n async submit(customData?: Record<string, any>): Promise<void> {\n await this.submissionController.submitForm(customData);\n }\n\n /**\n * Reset the form\n */\n reset(): void {\n this.validationController.reset();\n this.submissionController.resetSubmission();\n this._validationState = FormValidationState.Pristine;\n this._submissionState = FormSubmissionState.Idle;\n }\n\n /**\n * Check if form is valid\n */\n get isValid(): boolean {\n return this.validationController.isValid();\n }\n\n /**\n * Check if form is submitting\n */\n get isSubmitting(): boolean {\n return this.submissionController.isSubmitting();\n }\n\n /**\n * Get form data\n */\n getFormData() {\n return this.submissionController.collectFormData();\n }\n\n /**\n * Get invalid fields\n */\n getInvalidFields() {\n return this.validationController.getInvalidFields();\n }\n\n // ============================================\n // FORM API METHODS\n // ============================================\n\n /**\n * Get values of all fields\n * @returns Object containing all field values\n */\n getFieldsValue(nameList?: string[]): Record<string, any> {\n const formData = this.getFormData();\n const values = formData.jsonData;\n \n if (nameList && nameList.length > 0) {\n const filteredValues: Record<string, any> = {};\n nameList.forEach(name => {\n if (name in values) {\n filteredValues[name] = values[name];\n }\n });\n return filteredValues;\n }\n \n return values;\n }\n\n /**\n * Get value of specific field\n * @param name Field name\n * @returns Field value\n */\n getFieldValue(name: string): any {\n const values = this.getFieldsValue();\n return values[name];\n }\n\n /**\n * Set values of fields\n * @param values Object containing field values to set\n */\n setFieldsValue(values: Record<string, any>): void {\n Object.entries(values).forEach(([name, value]) => {\n this.setFieldValue(name, value);\n });\n }\n\n /**\n * Set value of specific field\n * @param name Field name\n * @param value Field value\n */\n setFieldValue(name: string, value: any): void {\n const fields = this.validationController.getFields();\n const field = fields.find(f => f.name === name);\n \n if (field && field.element) {\n field.element.value = value;\n field.value = value;\n // Trigger change event to update validation\n field.element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n }\n\n /**\n * Validate specific fields\n * @param nameList Array of field names to validate, if empty validates all\n * @returns Promise with validation result\n */\n async validateFields(nameList?: string[]): Promise<Record<string, any>> {\n const result = await this.validationController.validateForm();\n \n if (nameList && nameList.length > 0) {\n // Filter validation errors for specific fields\n const filteredErrors: Record<string, string> = {};\n nameList.forEach(name => {\n if (result.validationErrors[name]) {\n filteredErrors[name] = result.validationErrors[name];\n }\n });\n \n if (Object.keys(filteredErrors).length > 0) {\n throw new Error(JSON.stringify(filteredErrors));\n }\n \n return this.getFieldsValue(nameList);\n }\n \n if (!result.isValid) {\n throw new Error(JSON.stringify(result.validationErrors));\n }\n \n return this.getFieldsValue();\n }\n\n /**\n * Reset specific fields\n * @param nameList Array of field names to reset, if empty resets all\n */\n resetFields(nameList?: string[]): void {\n if (!nameList || nameList.length === 0) {\n this.reset();\n return;\n }\n \n const fields = this.validationController.getFields();\n nameList.forEach(name => {\n const field = fields.find(f => f.name === name);\n if (field && field.element) {\n // Reset value\n field.element.value = '';\n field.value = '';\n field.touched = false;\n field.dirty = false;\n field.isValid = true;\n field.validationMessage = '';\n \n // Trigger change event\n field.element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n });\n }\n\n /**\n * Get field error\n * @param name Field name\n * @returns Field error message or null\n */\n getFieldError(name: string): string | null {\n const fields = this.validationController.getFields();\n const field = fields.find(f => f.name === name);\n return field && !field.isValid ? field.validationMessage : null;\n }\n\n /**\n * Get all field errors\n * @param nameList Array of field names, if empty returns all\n * @returns Object containing field errors\n */\n getFieldsError(nameList?: string[]): Record<string, string | null> {\n const fields = this.validationController.getFields();\n const errors: Record<string, string | null> = {};\n \n const targetFields = nameList \n ? fields.filter(f => nameList.includes(f.name))\n : fields;\n \n targetFields.forEach(field => {\n errors[field.name] = field.isValid ? null : field.validationMessage;\n });\n \n return errors;\n }\n\n /**\n * Check if field has been touched\n * @param name Field name\n * @returns Whether field has been touched\n */\n isFieldTouched(name: string): boolean {\n const fields = this.validationController.getFields();\n const field = fields.find(f => f.name === name);\n return field ? field.touched : false;\n }\n\n /**\n * Check if any fields have been touched\n * @param nameList Array of field names, if empty checks all\n * @returns Whether any of the specified fields have been touched\n */\n isFieldsTouched(nameList?: string[]): boolean {\n const fields = this.validationController.getFields();\n const targetFields = nameList \n ? fields.filter(f => nameList.includes(f.name))\n : fields;\n \n return targetFields.some(field => field.touched);\n }\n\n /**\n * Check if field value has been modified\n * @param name Field name\n * @returns Whether field has been modified\n */\n isFieldDirty(name: string): boolean {\n const fields = this.validationController.getFields();\n const field = fields.find(f => f.name === name);\n return field ? field.dirty : false;\n }\n\n /**\n * Check if any fields have been modified\n * @param nameList Array of field names, if empty checks all\n * @returns Whether any of the specified fields have been modified\n */\n isFieldsDirty(nameList?: string[]): boolean {\n const fields = this.validationController.getFields();\n const targetFields = nameList \n ? fields.filter(f => nameList.includes(f.name))\n : fields;\n \n return targetFields.some(field => field.dirty);\n }\n\n /**\n * Get field instance\n * @param name Field name\n * @returns Field element or null\n */\n getFieldInstance(name: string): HTMLElement | null {\n const fields = this.validationController.getFields();\n const field = fields.find(f => f.name === name);\n return field ? field.element : null;\n }\n\n /**\n * Scroll to first error field\n * @returns Whether scrolled to a field\n */\n scrollToField(name?: string): boolean {\n if (name) {\n const fieldElement = this.getFieldInstance(name);\n if (fieldElement) {\n fieldElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\n if (typeof fieldElement.focus === 'function') {\n fieldElement.focus();\n }\n return true;\n }\n return false;\n }\n \n // Scroll to first invalid field\n return this.validationController.focusFirstInvalidField();\n }\n\n /**\n * Submit form and validate\n * @returns Promise with form values\n */\n async finish(): Promise<Record<string, any>> {\n try {\n const values = await this.validateFields();\n await this.submit();\n return values;\n } catch (error) {\n this.scrollToField();\n throw error;\n }\n }\n\n /**\n * Get field names that have validation errors\n * @returns Array of field names with errors\n */\n getFieldsWithErrors(): string[] {\n const fields = this.validationController.getFields();\n return fields\n .filter(field => !field.isValid)\n .map(field => field.name);\n }\n\n /**\n * Check if form has any validation errors\n * @returns Whether form has errors\n */\n hasErrors(): boolean {\n return this.getFieldsWithErrors().length > 0;\n }\n\n /**\n * Get summary of form state\n * @returns Object with form state information\n */\n getFormState(): {\n isValid: boolean;\n isSubmitting: boolean;\n hasErrors: boolean;\n errorCount: number;\n fieldCount: number;\n touchedFields: string[];\n dirtyFields: string[];\n invalidFields: string[];\n } {\n const fields = this.validationController.getFields();\n \n return {\n isValid: this.isValid,\n isSubmitting: this.isSubmitting,\n hasErrors: this.hasErrors(),\n errorCount: this.getFieldsWithErrors().length,\n fieldCount: fields.length,\n touchedFields: fields.filter(f => f.touched).map(f => f.name),\n dirtyFields: fields.filter(f => f.dirty).map(f => f.name),\n invalidFields: this.getFieldsWithErrors()\n };\n }\n\n /**\n * Set form loading state (useful for async operations)\n * @param loading Whether form is in loading state\n */\n setLoading(loading: boolean): void {\n this.disabled = loading;\n this.requestUpdate();\n }\n\n override render() {\n return html`\n <form \n action=\"${this.action || ''}\"\n method=\"${this.method.toLowerCase() as 'get' | 'post'}\"\n enctype=\"${this.enctype as 'application/x-www-form-urlencoded' | 'multipart/form-data' | 'text/plain'}\"\n target=\"${this.target || ''}\"\n class=\"form-wrapper\"\n data-disabled=\"${this.disabled}\"\n novalidate\n >\n <slot></slot>\n </form>\n `;\n }\n}\n"]}
1
+ {"version":3,"file":"form.component.js","sourceRoot":"","sources":["../../../../src/components/form/form.component.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\nimport { LitElement, html, type PropertyValues } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { styles } from './form.style.js';\nimport {\n FormConfig,\n FormValidationState,\n FormSubmissionState,\n FormEventDetail,\n FORM_EVENTS\n} from './form.types.js';\nimport { NuralyUIBaseMixin } from '@nuralyui/common/mixins';\nimport { FormValidationController } from './controllers/validation.controller.js';\nimport { FormSubmissionController } from './controllers/submission.controller.js';\n\n/**\n * Comprehensive form component with field management and validation API\n * \n * Key Features:\n * - Coordinates validation across all form fields (does NOT validate itself)\n * - Handles form submission with built-in validation checks\n * - Provides form state management and events\n * - Integrates with existing component validation controllers\n * - Supports both programmatic and user-driven interactions\n * - Comprehensive API for field manipulation and validation\n * \n * @example Basic Usage\n * ```html\n * <nr-form @nr-form-submit-success=\"${handleSuccess}\" validate-on-change>\n * <nr-input name=\"username\" required></nr-input>\n * <nr-input name=\"email\" type=\"email\" required></nr-input>\n * <nr-button type=\"submit\">Submit</nr-button>\n * </nr-form>\n * ```\n * \n * @example Programmatic Usage\n * ```typescript\n * const form = document.querySelector('nr-form');\n * \n * // Set field values\n * form.setFieldsValue({ username: 'john', email: 'john@example.com' });\n * \n * // Get field values\n * const values = form.getFieldsValue();\n * \n * // Validate and submit\n * try {\n * const values = await form.finish();\n * console.log('Form submitted:', values);\n * } catch (errors) {\n * console.log('Validation failed:', errors);\n * }\n * \n * // Reset specific fields\n * form.resetFields(['username']);\n * ```\n * \n * @fires nr-form-validation-changed - Validation state changes\n * @fires nr-form-field-changed - Individual field changes\n * @fires nr-form-submit-attempt - Form submission attempted\n * @fires nr-form-submit-success - Form submitted successfully\n * @fires nr-form-submit-error - Form submission failed\n * @fires nr-form-reset - Form was reset\n * \n * @slot default - Form content (inputs, buttons, etc.)\n */\n@customElement('nr-form')\nexport class NrFormElement extends NuralyUIBaseMixin(LitElement) {\n static override styles = styles;\n\n /** Form configuration */\n @property({ type: Object })\n config: FormConfig = {\n validateOnChange: false, // Default to false - only validate on blur\n validateOnBlur: true,\n showErrorsImmediately: false,\n preventInvalidSubmission: true,\n resetOnSuccess: false,\n validationDelay: 300\n };\n\n /** Enable real-time validation on field changes */\n @property({ type: Boolean, attribute: 'validate-on-change' })\n validateOnChange = false; // Default to false\n\n /** Enable validation on field blur */\n @property({ type: Boolean, attribute: 'validate-on-blur' })\n validateOnBlur = true;\n\n /** Prevent form submission if validation fails */\n @property({ type: Boolean, attribute: 'prevent-invalid-submission' })\n preventInvalidSubmission = true;\n\n /** Reset form after successful submission */\n @property({ type: Boolean, attribute: 'reset-on-success' })\n resetOnSuccess = false;\n\n /** Form action URL for native submission */\n @property({ type: String })\n action?: string;\n\n /** Form method for native submission */\n @property({ type: String })\n method: 'GET' | 'POST' = 'POST';\n\n /** Form encoding type */\n @property({ type: String, attribute: 'enctype' })\n enctype: string = 'multipart/form-data';\n\n /** Target for form submission */\n @property({ type: String })\n target?: string;\n\n /** Disable the entire form */\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /** Form validation state */\n @state()\n private _validationState: FormValidationState = FormValidationState.Pristine;\n\n /** Form submission state */\n @state()\n private _submissionState: FormSubmissionState = FormSubmissionState.Idle;\n\n /** Validation controller */\n private validationController = new FormValidationController(this);\n\n /** Submission controller */\n private submissionController = new FormSubmissionController(this);\n\n /** Get current validation state */\n get validationState(): FormValidationState {\n return this._validationState;\n }\n\n /** Get current submission state */\n get submissionState(): FormSubmissionState {\n return this._submissionState;\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.setupFormObserver();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.cleanupFormObserver();\n }\n\n override willUpdate(changedProperties: PropertyValues): void {\n super.willUpdate(changedProperties);\n \n // Update config when properties change\n if (changedProperties.has('validateOnChange') || \n changedProperties.has('validateOnBlur') ||\n changedProperties.has('preventInvalidSubmission') ||\n changedProperties.has('resetOnSuccess')) {\n this.config = {\n ...this.config,\n validateOnChange: this.validateOnChange,\n validateOnBlur: this.validateOnBlur,\n preventInvalidSubmission: this.preventInvalidSubmission,\n resetOnSuccess: this.resetOnSuccess\n };\n }\n }\n\n override firstUpdated(): void {\n this.registerExistingFields();\n this.setupFormEvents();\n }\n\n /**\n * Setup mutation observer to detect new form fields\n */\n private setupFormObserver(): void {\n // Implementation for observing DOM changes to register new fields\n const observer = new MutationObserver((mutations) => {\n mutations.forEach(mutation => {\n mutation.addedNodes.forEach(node => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n this.registerFieldsInElement(node as Element);\n }\n });\n });\n });\n\n observer.observe(this, { \n childList: true, \n subtree: true \n });\n\n (this as any)._formObserver = observer;\n }\n\n /**\n * Cleanup mutation observer\n */\n private cleanupFormObserver(): void {\n const observer = (this as any)._formObserver;\n if (observer) {\n observer.disconnect();\n }\n }\n\n /**\n * Register existing form fields\n */\n private registerExistingFields(): void {\n this.registerFieldsInElement(this);\n }\n\n /**\n * Register form fields in an element\n */\n private registerFieldsInElement(element: Element): void {\n const selectors = [\n 'nr-input', 'nr-select', 'nr-radio', 'nr-checkbox', \n 'nr-textarea', 'nr-timepicker', 'nr-datepicker'\n ];\n\n selectors.forEach(selector => {\n const fields = element.querySelectorAll(selector);\n fields.forEach(field => {\n if (field.getAttribute('name')) {\n this.validationController.registerField(field as any);\n }\n });\n });\n }\n\n /**\n * Setup form events\n */\n private setupFormEvents(): void {\n // Listen for form submission\n this.addEventListener('submit', this.handleFormSubmit);\n \n // Listen for form reset\n this.addEventListener('reset', this.handleFormReset);\n\n // Listen for validation events\n this.addEventListener(FORM_EVENTS.VALIDATION_CHANGED, this.handleValidationChanged as EventListener);\n }\n\n /**\n * Handle form submission\n */\n private async handleFormSubmit(event: Event): Promise<void> {\n event.preventDefault();\n\n if (this.disabled) {\n return;\n }\n\n try {\n const submissionData = await this.submissionController.submitForm();\n \n if (this.resetOnSuccess) {\n this.reset();\n }\n\n // If action is specified, perform native submission\n if (this.action) {\n this.performNativeSubmission(submissionData.formData);\n }\n\n } catch (error) {\n console.error('Form submission failed:', error);\n // Error events are already dispatched by submission controller\n }\n }\n\n /**\n * Handle form reset\n */\n private handleFormReset(event: Event): void {\n event.preventDefault();\n this.reset();\n }\n\n /**\n * Handle validation state changes\n */\n private handleValidationChanged = (event: Event): void => {\n const customEvent = event as CustomEvent<FormEventDetail>;\n const result = customEvent.detail.validationResult;\n if (result) {\n this._validationState = result.isValid ? \n FormValidationState.Valid : \n FormValidationState.Invalid;\n }\n };\n\n /**\n * Perform native form submission\n */\n private performNativeSubmission(formData: FormData): void {\n const form = document.createElement('form');\n form.action = this.action!;\n form.method = this.method;\n form.enctype = this.enctype;\n if (this.target) form.target = this.target;\n\n // Add form data as hidden inputs\n for (const [name, value] of formData.entries()) {\n const input = document.createElement('input');\n input.type = 'hidden';\n input.name = name;\n input.value = value as string;\n form.appendChild(input);\n }\n\n document.body.appendChild(form);\n form.submit();\n document.body.removeChild(form);\n }\n\n /**\n * Validate the form\n */\n async validate(): Promise<boolean> {\n const result = await this.validationController.validateForm();\n return result.isValid;\n }\n\n /**\n * Submit the form programmatically\n */\n async submit(customData?: Record<string, any>): Promise<void> {\n await this.submissionController.submitForm(customData);\n }\n\n /**\n * Reset the form\n */\n reset(): void {\n this.validationController.reset();\n this.submissionController.resetSubmission();\n this._validationState = FormValidationState.Pristine;\n this._submissionState = FormSubmissionState.Idle;\n }\n\n /**\n * Check if form is valid\n */\n get isValid(): boolean {\n return this.validationController.isValid();\n }\n\n /**\n * Check if form is submitting\n */\n get isSubmitting(): boolean {\n return this.submissionController.isSubmitting();\n }\n\n /**\n * Get form data\n */\n getFormData() {\n return this.submissionController.collectFormData();\n }\n\n /**\n * Get invalid fields\n */\n getInvalidFields() {\n return this.validationController.getInvalidFields();\n }\n\n // ============================================\n // FORM API METHODS\n // ============================================\n\n /**\n * Get values of all fields\n * @returns Object containing all field values\n */\n getFieldsValue(nameList?: string[]): Record<string, any> {\n const formData = this.getFormData();\n const values = formData.jsonData;\n \n if (nameList && nameList.length > 0) {\n const filteredValues: Record<string, any> = {};\n nameList.forEach(name => {\n if (name in values) {\n filteredValues[name] = values[name];\n }\n });\n return filteredValues;\n }\n \n return values;\n }\n\n /**\n * Get value of specific field\n * @param name Field name\n * @returns Field value\n */\n getFieldValue(name: string): any {\n const values = this.getFieldsValue();\n return values[name];\n }\n\n /**\n * Set values of fields\n * @param values Object containing field values to set\n */\n setFieldsValue(values: Record<string, any>): void {\n Object.entries(values).forEach(([name, value]) => {\n this.setFieldValue(name, value);\n });\n }\n\n /**\n * Set value of specific field\n * @param name Field name\n * @param value Field value\n */\n setFieldValue(name: string, value: any): void {\n const fields = this.validationController.getFields();\n const field = fields.find(f => f.name === name);\n \n if (field && field.element) {\n field.element.value = value;\n field.value = value;\n // Trigger change event to update validation\n field.element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n }\n\n /**\n * Validate specific fields\n * @param nameList Array of field names to validate, if empty validates all\n * @returns Promise with validation result\n */\n async validateFields(nameList?: string[]): Promise<Record<string, any>> {\n const result = await this.validationController.validateForm();\n \n if (nameList && nameList.length > 0) {\n // Filter validation errors for specific fields\n const filteredErrors: Record<string, string> = {};\n nameList.forEach(name => {\n if (result.validationErrors[name]) {\n filteredErrors[name] = result.validationErrors[name];\n }\n });\n \n if (Object.keys(filteredErrors).length > 0) {\n throw new Error(JSON.stringify(filteredErrors));\n }\n \n return this.getFieldsValue(nameList);\n }\n \n if (!result.isValid) {\n throw new Error(JSON.stringify(result.validationErrors));\n }\n \n return this.getFieldsValue();\n }\n\n /**\n * Reset specific fields\n * @param nameList Array of field names to reset, if empty resets all\n */\n resetFields(nameList?: string[]): void {\n if (!nameList || nameList.length === 0) {\n this.reset();\n return;\n }\n \n const fields = this.validationController.getFields();\n nameList.forEach(name => {\n const field = fields.find(f => f.name === name);\n if (field && field.element) {\n // Reset value\n field.element.value = '';\n field.value = '';\n field.touched = false;\n field.dirty = false;\n field.isValid = true;\n field.validationMessage = '';\n \n // Trigger change event\n field.element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n });\n }\n\n /**\n * Get field error\n * @param name Field name\n * @returns Field error message or null\n */\n getFieldError(name: string): string | null {\n const fields = this.validationController.getFields();\n const field = fields.find(f => f.name === name);\n return field && !field.isValid ? field.validationMessage : null;\n }\n\n /**\n * Get all field errors\n * @param nameList Array of field names, if empty returns all\n * @returns Object containing field errors\n */\n getFieldsError(nameList?: string[]): Record<string, string | null> {\n const fields = this.validationController.getFields();\n const errors: Record<string, string | null> = {};\n \n const targetFields = nameList \n ? fields.filter(f => nameList.includes(f.name))\n : fields;\n \n targetFields.forEach(field => {\n errors[field.name] = field.isValid ? null : field.validationMessage;\n });\n \n return errors;\n }\n\n /**\n * Check if field has been touched\n * @param name Field name\n * @returns Whether field has been touched\n */\n isFieldTouched(name: string): boolean {\n const fields = this.validationController.getFields();\n const field = fields.find(f => f.name === name);\n return field ? field.touched : false;\n }\n\n /**\n * Check if any fields have been touched\n * @param nameList Array of field names, if empty checks all\n * @returns Whether any of the specified fields have been touched\n */\n isFieldsTouched(nameList?: string[]): boolean {\n const fields = this.validationController.getFields();\n const targetFields = nameList \n ? fields.filter(f => nameList.includes(f.name))\n : fields;\n \n return targetFields.some(field => field.touched);\n }\n\n /**\n * Check if field value has been modified\n * @param name Field name\n * @returns Whether field has been modified\n */\n isFieldDirty(name: string): boolean {\n const fields = this.validationController.getFields();\n const field = fields.find(f => f.name === name);\n return field ? field.dirty : false;\n }\n\n /**\n * Check if any fields have been modified\n * @param nameList Array of field names, if empty checks all\n * @returns Whether any of the specified fields have been modified\n */\n isFieldsDirty(nameList?: string[]): boolean {\n const fields = this.validationController.getFields();\n const targetFields = nameList \n ? fields.filter(f => nameList.includes(f.name))\n : fields;\n \n return targetFields.some(field => field.dirty);\n }\n\n /**\n * Get field instance\n * @param name Field name\n * @returns Field element or null\n */\n getFieldInstance(name: string): HTMLElement | null {\n const fields = this.validationController.getFields();\n const field = fields.find(f => f.name === name);\n return field ? field.element : null;\n }\n\n /**\n * Scroll to first error field\n * @returns Whether scrolled to a field\n */\n scrollToField(name?: string): boolean {\n if (name) {\n const fieldElement = this.getFieldInstance(name);\n if (fieldElement) {\n fieldElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\n if (typeof fieldElement.focus === 'function') {\n fieldElement.focus();\n }\n return true;\n }\n return false;\n }\n \n // Scroll to first invalid field\n return this.validationController.focusFirstInvalidField();\n }\n\n /**\n * Submit form and validate\n * @returns Promise with form values\n */\n async finish(): Promise<Record<string, any>> {\n try {\n const values = await this.validateFields();\n await this.submit();\n return values;\n } catch (error) {\n this.scrollToField();\n throw error;\n }\n }\n\n /**\n * Get field names that have validation errors\n * @returns Array of field names with errors\n */\n getFieldsWithErrors(): string[] {\n const fields = this.validationController.getFields();\n return fields\n .filter(field => !field.isValid)\n .map(field => field.name);\n }\n\n /**\n * Check if form has any validation errors\n * @returns Whether form has errors\n */\n hasErrors(): boolean {\n return this.getFieldsWithErrors().length > 0;\n }\n\n /**\n * Get summary of form state\n * @returns Object with form state information\n */\n getFormState(): {\n isValid: boolean;\n isSubmitting: boolean;\n hasErrors: boolean;\n errorCount: number;\n fieldCount: number;\n touchedFields: string[];\n dirtyFields: string[];\n invalidFields: string[];\n } {\n const fields = this.validationController.getFields();\n \n return {\n isValid: this.isValid,\n isSubmitting: this.isSubmitting,\n hasErrors: this.hasErrors(),\n errorCount: this.getFieldsWithErrors().length,\n fieldCount: fields.length,\n touchedFields: fields.filter(f => f.touched).map(f => f.name),\n dirtyFields: fields.filter(f => f.dirty).map(f => f.name),\n invalidFields: this.getFieldsWithErrors()\n };\n }\n\n /**\n * Set form loading state (useful for async operations)\n * @param loading Whether form is in loading state\n */\n setLoading(loading: boolean): void {\n this.disabled = loading;\n this.requestUpdate();\n }\n\n override render() {\n return html`\n <form \n action=\"${this.action || ''}\"\n method=\"${this.method.toLowerCase() as 'get' | 'post'}\"\n enctype=\"${this.enctype as 'application/x-www-form-urlencoded' | 'multipart/form-data' | 'text/plain'}\"\n target=\"${this.target || ''}\"\n class=\"form-wrapper\"\n data-disabled=\"${this.disabled}\"\n novalidate\n >\n <slot></slot>\n </form>\n `;\n }\n}\n"]}
package/form.style.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"form.style.js","sourceRoot":"","sources":["../../../src/components/form/form.style.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4DxB,CAAC","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\nimport { css } from 'lit';\n\nexport const styles = css`\n :host {\n display: block;\n width: 100%;\n }\n\n :host([disabled]) {\n opacity: 0.6;\n pointer-events: none;\n }\n\n .form-wrapper {\n width: 100%;\n display: flex;\n flex-direction: column;\n gap: var(--nuraly-form-gap, 16px);\n }\n\n .form-wrapper[disabled] {\n opacity: 0.6;\n pointer-events: none;\n }\n\n /* Form validation states */\n :host([data-validation-state=\"pristine\"]) {\n border-left: 3px solid transparent;\n }\n\n :host([data-validation-state=\"valid\"]) {\n border-left: 3px solid #52c41a;\n }\n\n :host([data-validation-state=\"invalid\"]) {\n border-left: 3px solid #ff4d4f;\n }\n\n :host([data-validation-state=\"pending\"]) {\n border-left: 3px solid #1890ff;\n }\n\n /* Form submission states */\n :host([data-submission-state=\"submitting\"]) {\n opacity: 0.8;\n pointer-events: none;\n }\n\n :host([data-submission-state=\"success\"]) {\n border-left: 3px solid #52c41a;\n }\n\n :host([data-submission-state=\"error\"]) {\n border-left: 3px solid #ff4d4f;\n }\n\n /* Responsive design */\n @media (max-width: 768px) {\n .form-wrapper {\n gap: var(--nuraly-form-gap-mobile, 12px);\n }\n }\n`;\n"]}
1
+ {"version":3,"file":"form.style.js","sourceRoot":"","sources":["../../../../src/components/form/form.style.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4DxB,CAAC","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\nimport { css } from 'lit';\n\nexport const styles = css`\n :host {\n display: block;\n width: 100%;\n }\n\n :host([disabled]) {\n opacity: 0.6;\n pointer-events: none;\n }\n\n .form-wrapper {\n width: 100%;\n display: flex;\n flex-direction: column;\n gap: var(--nuraly-form-gap, 16px);\n }\n\n .form-wrapper[disabled] {\n opacity: 0.6;\n pointer-events: none;\n }\n\n /* Form validation states */\n :host([data-validation-state=\"pristine\"]) {\n border-left: 3px solid transparent;\n }\n\n :host([data-validation-state=\"valid\"]) {\n border-left: 3px solid #52c41a;\n }\n\n :host([data-validation-state=\"invalid\"]) {\n border-left: 3px solid #ff4d4f;\n }\n\n :host([data-validation-state=\"pending\"]) {\n border-left: 3px solid #1890ff;\n }\n\n /* Form submission states */\n :host([data-submission-state=\"submitting\"]) {\n opacity: 0.8;\n pointer-events: none;\n }\n\n :host([data-submission-state=\"success\"]) {\n border-left: 3px solid #52c41a;\n }\n\n :host([data-submission-state=\"error\"]) {\n border-left: 3px solid #ff4d4f;\n }\n\n /* Responsive design */\n @media (max-width: 768px) {\n .form-wrapper {\n gap: var(--nuraly-form-gap-mobile, 12px);\n }\n }\n`;\n"]}
package/form.types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"form.types.js","sourceRoot":"","sources":["../../../src/components/form/form.types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;GAEG;AACH,MAAM,CAAN,IAAY,mBAMX;AAND,WAAY,mBAAmB;IAC7B,4CAAqB,CAAA;IACrB,0CAAmB,CAAA;IACnB,sCAAe,CAAA;IACf,0CAAmB,CAAA;IACnB,8CAAuB,CAAA,CAAG,0BAA0B;AACtD,CAAC,EANW,mBAAmB,KAAnB,mBAAmB,QAM9B;AAED;;GAEG;AACH,MAAM,CAAN,IAAY,mBAKX;AALD,WAAY,mBAAmB;IAC7B,oCAAa,CAAA;IACb,gDAAyB,CAAA;IACzB,0CAAmB,CAAA;IACnB,sCAAe,CAAA;AACjB,CAAC,EALW,mBAAmB,KAAnB,mBAAmB,QAK9B;AAgED;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,kBAAkB,EAAE,4BAA4B;IAChD,aAAa,EAAE,uBAAuB;IACtC,cAAc,EAAE,wBAAwB;IACxC,cAAc,EAAE,wBAAwB;IACxC,YAAY,EAAE,sBAAsB;IACpC,KAAK,EAAE,eAAe;CACd,CAAC","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\nimport { ValidatableComponent, FormFieldInfo } from '@nuralyui/common/mixins';\n\n/**\n * Form validation states that can be applied to the form and its children\n */\nexport enum FormValidationState {\n Pristine = 'pristine', // Form has not been interacted with\n Pending = 'pending', // Validation is in progress\n Valid = 'valid', // All form fields are valid\n Invalid = 'invalid', // One or more form fields are invalid\n Submitted = 'submitted' // Form has been submitted\n}\n\n/**\n * Form submission states\n */\nexport enum FormSubmissionState {\n Idle = 'idle',\n Submitting = 'submitting',\n Success = 'success',\n Error = 'error'\n}\n\n/**\n * Form configuration options\n */\nexport interface FormConfig {\n /** Enable real-time validation */\n validateOnChange?: boolean;\n /** Validate fields on blur */\n validateOnBlur?: boolean;\n /** Show validation errors immediately */\n showErrorsImmediately?: boolean;\n /** Prevent submission if invalid */\n preventInvalidSubmission?: boolean;\n /** Reset form after successful submission */\n resetOnSuccess?: boolean;\n /** Custom validation debounce delay (ms) */\n validationDelay?: number;\n}\n\n/**\n * Form field information\n */\nexport interface FormField extends FormFieldInfo {\n // FormField now extends the shared FormFieldInfo interface\n}\n\n/**\n * Form validation result\n */\nexport interface FormValidationResult {\n isValid: boolean;\n invalidFields: FormField[];\n validationErrors: Record<string, string>;\n summary: string;\n}\n\n/**\n * Form submission data\n */\nexport interface FormSubmissionData {\n formData: FormData;\n jsonData: Record<string, any>;\n fields: Record<string, any>;\n}\n\n/**\n * Interface that form field components must implement\n * @deprecated Use ValidatableComponent from shared/validation.types.js instead\n */\nexport interface FormFieldCapable extends ValidatableComponent {\n /** @deprecated This interface is replaced by ValidatableComponent */\n}\n\n/**\n * Form event details\n */\nexport interface FormEventDetail {\n formData?: FormSubmissionData;\n validationResult?: FormValidationResult;\n field?: FormField;\n error?: Error;\n}\n\n/**\n * Custom form events\n */\nexport const FORM_EVENTS = {\n VALIDATION_CHANGED: 'nr-form-validation-changed',\n FIELD_CHANGED: 'nr-form-field-changed',\n SUBMIT_ATTEMPT: 'nr-form-submit-attempt',\n SUBMIT_SUCCESS: 'nr-form-submit-success',\n SUBMIT_ERROR: 'nr-form-submit-error',\n RESET: 'nr-form-reset',\n} as const;\n\nexport type FormEventType = typeof FORM_EVENTS[keyof typeof FORM_EVENTS];\n"]}
1
+ {"version":3,"file":"form.types.js","sourceRoot":"","sources":["../../../../src/components/form/form.types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;GAEG;AACH,MAAM,CAAN,IAAY,mBAMX;AAND,WAAY,mBAAmB;IAC7B,4CAAqB,CAAA;IACrB,0CAAmB,CAAA;IACnB,sCAAe,CAAA;IACf,0CAAmB,CAAA;IACnB,8CAAuB,CAAA,CAAG,0BAA0B;AACtD,CAAC,EANW,mBAAmB,KAAnB,mBAAmB,QAM9B;AAED;;GAEG;AACH,MAAM,CAAN,IAAY,mBAKX;AALD,WAAY,mBAAmB;IAC7B,oCAAa,CAAA;IACb,gDAAyB,CAAA;IACzB,0CAAmB,CAAA;IACnB,sCAAe,CAAA;AACjB,CAAC,EALW,mBAAmB,KAAnB,mBAAmB,QAK9B;AAgED;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,kBAAkB,EAAE,4BAA4B;IAChD,aAAa,EAAE,uBAAuB;IACtC,cAAc,EAAE,wBAAwB;IACxC,cAAc,EAAE,wBAAwB;IACxC,YAAY,EAAE,sBAAsB;IACpC,KAAK,EAAE,eAAe;CACd,CAAC","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\nimport { ValidatableComponent, FormFieldInfo } from '@nuralyui/common/mixins';\n\n/**\n * Form validation states that can be applied to the form and its children\n */\nexport enum FormValidationState {\n Pristine = 'pristine', // Form has not been interacted with\n Pending = 'pending', // Validation is in progress\n Valid = 'valid', // All form fields are valid\n Invalid = 'invalid', // One or more form fields are invalid\n Submitted = 'submitted' // Form has been submitted\n}\n\n/**\n * Form submission states\n */\nexport enum FormSubmissionState {\n Idle = 'idle',\n Submitting = 'submitting',\n Success = 'success',\n Error = 'error'\n}\n\n/**\n * Form configuration options\n */\nexport interface FormConfig {\n /** Enable real-time validation */\n validateOnChange?: boolean;\n /** Validate fields on blur */\n validateOnBlur?: boolean;\n /** Show validation errors immediately */\n showErrorsImmediately?: boolean;\n /** Prevent submission if invalid */\n preventInvalidSubmission?: boolean;\n /** Reset form after successful submission */\n resetOnSuccess?: boolean;\n /** Custom validation debounce delay (ms) */\n validationDelay?: number;\n}\n\n/**\n * Form field information\n */\nexport interface FormField extends FormFieldInfo {\n // FormField now extends the shared FormFieldInfo interface\n}\n\n/**\n * Form validation result\n */\nexport interface FormValidationResult {\n isValid: boolean;\n invalidFields: FormField[];\n validationErrors: Record<string, string>;\n summary: string;\n}\n\n/**\n * Form submission data\n */\nexport interface FormSubmissionData {\n formData: FormData;\n jsonData: Record<string, any>;\n fields: Record<string, any>;\n}\n\n/**\n * Interface that form field components must implement\n * @deprecated Use ValidatableComponent from shared/validation.types.js instead\n */\nexport interface FormFieldCapable extends ValidatableComponent {\n /** @deprecated This interface is replaced by ValidatableComponent */\n}\n\n/**\n * Form event details\n */\nexport interface FormEventDetail {\n formData?: FormSubmissionData;\n validationResult?: FormValidationResult;\n field?: FormField;\n error?: Error;\n}\n\n/**\n * Custom form events\n */\nexport const FORM_EVENTS = {\n VALIDATION_CHANGED: 'nr-form-validation-changed',\n FIELD_CHANGED: 'nr-form-field-changed',\n SUBMIT_ATTEMPT: 'nr-form-submit-attempt',\n SUBMIT_SUCCESS: 'nr-form-submit-success',\n SUBMIT_ERROR: 'nr-form-submit-error',\n RESET: 'nr-form-reset',\n} as const;\n\nexport type FormEventType = typeof FORM_EVENTS[keyof typeof FORM_EVENTS];\n"]}
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/form/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,iBAAiB;AACjB,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,uBAAuB;AACvB,cAAc,iBAAiB,CAAC;AAEhC,cAAc;AACd,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAClF,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\n// Main component\nexport { NrFormElement } from './form.component.js';\n\n// Types and interfaces\nexport * from './form.types.js';\n\n// Controllers\nexport { FormValidationController } from './controllers/validation.controller.js';\nexport { FormSubmissionController } from './controllers/submission.controller.js';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/form/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,iBAAiB;AACjB,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,uBAAuB;AACvB,cAAc,iBAAiB,CAAC;AAEhC,cAAc;AACd,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAClF,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\n// Main component\nexport { NrFormElement } from './form.component.js';\n\n// Types and interfaces\nexport * from './form.types.js';\n\n// Controllers\nexport { FormValidationController } from './controllers/validation.controller.js';\nexport { FormSubmissionController } from './controllers/submission.controller.js';\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"validation.interface.d.ts","sourceRoot":"","sources":["../../../../src/components/form/interfaces/validation.interface.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,0BAA0B;IAC1B,KAAK,EAAE,GAAG,CAAC;IAEX,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,iCAAiC;IACjC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;OAEG;IACH,QAAQ,CAAC,IAAI,OAAO,CAAC;IAErB;;OAEG;IACH,aAAa,CAAC,IAAI,OAAO,CAAC;IAE1B;;OAEG;IACH,cAAc,CAAC,IAAI,OAAO,CAAC;IAE3B;;OAEG;IACH,iBAAiB,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAE1C;;OAEG;IACH,KAAK,CAAC,IAAI,IAAI,CAAC;IAEf;;OAEG;IACH,KAAK,CAAC,IAAI,IAAI,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,2BAA4B,SAAQ,mBAAmB;IACtE,+BAA+B;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB,uBAAuB;IACvB,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;IAEnC,wBAAwB;IACxB,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAC;IAErC;;OAEG;IACH,mBAAmB,CAAC,IAAI;QACtB,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;IAEF;;OAEG;IACH,iBAAiB,CAAC,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,CAAC;IAE/C;;OAEG;IACH,oBAAoB,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7C;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC;IACnC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,KAAK;QACtC,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,GAAG,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,WAAW,GAAG,mBAAmB,CAAC;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,GAAG,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;CAC1B"}
1
+ {"version":3,"file":"validation.interface.d.ts","sourceRoot":"","sources":["../../../../../src/components/form/interfaces/validation.interface.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,0BAA0B;IAC1B,KAAK,EAAE,GAAG,CAAC;IAEX,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,iCAAiC;IACjC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;OAEG;IACH,QAAQ,CAAC,IAAI,OAAO,CAAC;IAErB;;OAEG;IACH,aAAa,CAAC,IAAI,OAAO,CAAC;IAE1B;;OAEG;IACH,cAAc,CAAC,IAAI,OAAO,CAAC;IAE3B;;OAEG;IACH,iBAAiB,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAE1C;;OAEG;IACH,KAAK,CAAC,IAAI,IAAI,CAAC;IAEf;;OAEG;IACH,KAAK,CAAC,IAAI,IAAI,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,2BAA4B,SAAQ,mBAAmB;IACtE,+BAA+B;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB,uBAAuB;IACvB,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;IAEnC,wBAAwB;IACxB,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAC;IAErC;;OAEG;IACH,mBAAmB,CAAC,IAAI;QACtB,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;IAEF;;OAEG;IACH,iBAAiB,CAAC,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,CAAC;IAE/C;;OAEG;IACH,oBAAoB,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7C;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC;IACnC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,KAAK;QACtC,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,GAAG,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,WAAW,GAAG,mBAAmB,CAAC;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,GAAG,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;CAC1B"}
@@ -1 +1 @@
1
- {"version":3,"file":"validation.interface.js","sourceRoot":"","sources":["../../../../src/components/form/interfaces/validation.interface.ts"],"names":[],"mappings":"AAAA;;;;GAIG","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\n/**\n * Standard interface that all form-compatible components should implement\n * This ensures consistent validation API across all form field components\n */\nexport interface FormFieldValidation {\n /** Component name for form submission */\n name?: string;\n \n /** Current field value */\n value: any;\n \n /** Required field indicator */\n required?: boolean;\n \n /** Disabled state */\n disabled?: boolean;\n \n /** Readonly state */\n readonly?: boolean;\n \n /** Current validation message */\n validationMessage?: string;\n \n /**\n * Validate the field and return true if valid\n */\n validate?(): boolean;\n \n /**\n * Check if the field satisfies HTML5 constraints\n */\n checkValidity?(): boolean;\n \n /**\n * Report validation state (shows validation UI)\n */\n reportValidity?(): boolean;\n \n /**\n * Set custom validation message\n */\n setCustomValidity?(message: string): void;\n \n /**\n * Reset field to initial state\n */\n reset?(): void;\n \n /**\n * Focus the field\n */\n focus?(): void;\n}\n\n/**\n * Enhanced validation interface for components with advanced validation features\n */\nexport interface AdvancedFormFieldValidation extends FormFieldValidation {\n /** Validation state details */\n isValid?: boolean;\n isTouched?: boolean;\n isDirty?: boolean;\n \n /** Validation rules */\n validationRules?: ValidationRule[];\n \n /** Custom validators */\n customValidators?: CustomValidator[];\n \n /**\n * Get detailed validation result\n */\n getValidationResult?(): {\n isValid: boolean;\n errors: string[];\n warnings: string[];\n };\n \n /**\n * Add custom validation rule\n */\n addValidationRule?(rule: ValidationRule): void;\n \n /**\n * Remove validation rule\n */\n removeValidationRule?(ruleId: string): void;\n}\n\n/**\n * Validation rule definition\n */\nexport interface ValidationRule {\n id: string;\n message: string;\n validator: (value: any) => boolean;\n severity?: 'error' | 'warning';\n}\n\n/**\n * Custom validator function\n */\nexport interface CustomValidator {\n id: string;\n validate: (value: any, element: any) => {\n isValid: boolean;\n message: string;\n };\n}\n\n/**\n * Validation event details\n */\nexport interface ValidationEventDetail {\n isValid: boolean;\n value: any;\n message: string;\n errors: string[];\n warnings?: string[];\n field?: string;\n timestamp: number;\n}\n\n/**\n * Form field registration info\n */\nexport interface FormFieldRegistration {\n element: HTMLElement & FormFieldValidation;\n name: string;\n type: string;\n initialValue: any;\n registrationTime: number;\n}\n"]}
1
+ {"version":3,"file":"validation.interface.js","sourceRoot":"","sources":["../../../../../src/components/form/interfaces/validation.interface.ts"],"names":[],"mappings":"AAAA;;;;GAIG","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\n/**\n * Standard interface that all form-compatible components should implement\n * This ensures consistent validation API across all form field components\n */\nexport interface FormFieldValidation {\n /** Component name for form submission */\n name?: string;\n \n /** Current field value */\n value: any;\n \n /** Required field indicator */\n required?: boolean;\n \n /** Disabled state */\n disabled?: boolean;\n \n /** Readonly state */\n readonly?: boolean;\n \n /** Current validation message */\n validationMessage?: string;\n \n /**\n * Validate the field and return true if valid\n */\n validate?(): boolean;\n \n /**\n * Check if the field satisfies HTML5 constraints\n */\n checkValidity?(): boolean;\n \n /**\n * Report validation state (shows validation UI)\n */\n reportValidity?(): boolean;\n \n /**\n * Set custom validation message\n */\n setCustomValidity?(message: string): void;\n \n /**\n * Reset field to initial state\n */\n reset?(): void;\n \n /**\n * Focus the field\n */\n focus?(): void;\n}\n\n/**\n * Enhanced validation interface for components with advanced validation features\n */\nexport interface AdvancedFormFieldValidation extends FormFieldValidation {\n /** Validation state details */\n isValid?: boolean;\n isTouched?: boolean;\n isDirty?: boolean;\n \n /** Validation rules */\n validationRules?: ValidationRule[];\n \n /** Custom validators */\n customValidators?: CustomValidator[];\n \n /**\n * Get detailed validation result\n */\n getValidationResult?(): {\n isValid: boolean;\n errors: string[];\n warnings: string[];\n };\n \n /**\n * Add custom validation rule\n */\n addValidationRule?(rule: ValidationRule): void;\n \n /**\n * Remove validation rule\n */\n removeValidationRule?(ruleId: string): void;\n}\n\n/**\n * Validation rule definition\n */\nexport interface ValidationRule {\n id: string;\n message: string;\n validator: (value: any) => boolean;\n severity?: 'error' | 'warning';\n}\n\n/**\n * Custom validator function\n */\nexport interface CustomValidator {\n id: string;\n validate: (value: any, element: any) => {\n isValid: boolean;\n message: string;\n };\n}\n\n/**\n * Validation event details\n */\nexport interface ValidationEventDetail {\n isValid: boolean;\n value: any;\n message: string;\n errors: string[];\n warnings?: string[];\n field?: string;\n timestamp: number;\n}\n\n/**\n * Form field registration info\n */\nexport interface FormFieldRegistration {\n element: HTMLElement & FormFieldValidation;\n name: string;\n type: string;\n initialValue: any;\n registrationTime: number;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nuralyui/form",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "description": "NuralyUI Form - A comprehensive form component with validation coordination, submission handling, and state management",
5
5
  "type": "module",
6
6
  "main": "./index.js",