@mobx-ecosystem/mobx-form
Version:
provides the ability to use forms with validation in MobX stores
2 lines (1 loc) • 15.3 kB
JavaScript
import{makeAutoObservable as e}from"mobx";function i(e,t){if(e===t)return!0;if(null===e||null===t||"object"!=typeof e||"object"!=typeof t)return!1;if(e instanceof Date&&t instanceof Date)return e.getTime()===t.getTime();if(e instanceof RegExp&&t instanceof RegExp)return e.toString()===t.toString();if(e instanceof Map&&t instanceof Map){if(e.size!==t.size)return!1;for(const[l,r]of e)if(!t.has(l)||!i(r,t.get(l)))return!1;return!0}if(e instanceof Set&&t instanceof Set){if(e.size!==t.size)return!1;for(const i of e)if(!t.has(i))return!1;return!0}if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let l=0;l<e.length;l++)if(!i(e[l],t[l]))return!1;return!0}const l=Object.keys(e),r=Object.keys(t);if(l.length!==r.length)return!1;for(const r of l)if(!Object.hasOwnProperty.call(t,r)||!i(e[r],t[r]))return!1;return!0}class t{constructor(i,t){Object.defineProperty(this,"validate",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_serviceType",{enumerable:!0,configurable:!0,writable:!0,value:"field-service"}),Object.defineProperty(this,"_initValue",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_value",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_error",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_disabled",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"_isBlurred",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"options",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"setOptions",{enumerable:!0,configurable:!0,writable:!0,value:e=>{this.options=e}}),Object.defineProperty(this,"setValue",{enumerable:!0,configurable:!0,writable:!0,value:(e,{validate:i}={})=>{var t;this.value=e,i&&(null===(t=this.validate)||void 0===t||t.call(this))}}),Object.defineProperty(this,"onChange",{enumerable:!0,configurable:!0,writable:!0,value:(e,i)=>{var t;this.value=i,null===(t=this.validate)||void 0===t||t.call(this)}}),Object.defineProperty(this,"onBlur",{enumerable:!0,configurable:!0,writable:!0,value:e=>{var i;this.isBlurred=!0,null===(i=this.validate)||void 0===i||i.call(this)}}),Object.defineProperty(this,"reset",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.value=this.initValue,this.isBlurred=!1}}),Object.defineProperty(this,"setAsInit",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.initValue=this.value,this.isBlurred=!1}}),Object.defineProperty(this,"touch",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.isBlurred=!0}}),Object.defineProperty(this,"disable",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.disabled=!0}}),Object.defineProperty(this,"enable",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.disabled=!1}}),e(this),this.initValue=i,this.options=t}get initValue(){return this._initValue}set initValue(e){var i;this._initValue=e,this._value=e,null===(i=this.validate)||void 0===i||i.call(this)}get value(){return this._value}set value(e){var i,t,l,r;if("abort"===(null===(t=null===(i=this.options)||void 0===i?void 0:i.beforeOnChange)||void 0===t?void 0:t.call(i,e)))return;const a=this._value;this._value=e,a!==e&&(null===(r=null===(l=this.options)||void 0===l?void 0:l.onChange)||void 0===r||r.call(l,e))}get error(){return this._error}set error(e){this._error=e}get disabled(){var e,i;return this._disabled||Boolean(null===(i=null===(e=this.options)||void 0===e?void 0:e.disabledFn)||void 0===i?void 0:i.call(e))}set disabled(e){this._disabled=e}get isValid(){return!this._error}get isInit(){return null!==(e=this.value)&&"object"==typeof e?i(this.value,this._initValue):this._value===this._initValue;var e}get isBlurred(){return this._isBlurred}set isBlurred(e){this._isBlurred=e}get isTouched(){return!this.isInit||this.isBlurred}get props(){var e;let i={value:this.value,error:this.error,disabled:this.disabled};return(null===(e=this.options)||void 0===e?void 0:e.onError)&&(i=Object.assign(Object.assign({},i),{onError:e=>{this.error=this.error||(null==e?void 0:e.toString())}})),Object.assign(Object.assign({},i),{onChange:this.onChange,onBlur:this.onBlur})}}function l(e,i,t,l){return new(t||(t=Promise))((function(r,a){function s(e){try{u(l.next(e))}catch(e){a(e)}}function n(e){try{u(l.throw(e))}catch(e){a(e)}}function u(e){var i;e.done?r(e.value):(i=e.value,i instanceof t?i:new t((function(e){e(i)}))).then(s,n)}u((l=l.apply(e,i||[])).next())}))}let r,a;const s=e=>{r=e.validation.validate,a=e.validation.preSubmitValidationError},n=()=>{if(!r||!a)throw new Error("You must define configureForm to configure mobx-form")};class u{constructor(i){Object.defineProperty(this,"_touched",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"_disabled",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"_error",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"_initValue",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"_value",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"_validate",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"setTouched",{enumerable:!0,configurable:!0,writable:!0,value:e=>{this._touched=e}}),Object.defineProperty(this,"add",{enumerable:!0,configurable:!0,writable:!0,value:e=>{var i;this.value.push(e),this.setTouched(!0),null===(i=this.validate)||void 0===i||i.call(this,"only-touched")}}),Object.defineProperty(this,"removeByIndex",{enumerable:!0,configurable:!0,writable:!0,value:e=>{var i;this.value.splice(e,1),this.setTouched(!0),null===(i=this.validate)||void 0===i||i.call(this,"only-touched")}}),Object.defineProperty(this,"reset",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this._value=this.initValue.slice(0),this._value.forEach((e=>e.formService.reset())),this.setTouched(!1)}}),Object.defineProperty(this,"setAsInit",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.initValue=this.value,this._value.forEach((e=>e.formService.setValuesAsInit())),this.setTouched(!1)}}),Object.defineProperty(this,"getValues",{enumerable:!0,configurable:!0,writable:!0,value:()=>this.value.map((e=>e.formService.getValues()))}),Object.defineProperty(this,"touch",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.value.forEach((e=>e.formService.touch())),this.setTouched(!0)}}),Object.defineProperty(this,"validateFields",{enumerable:!0,configurable:!0,writable:!0,value:(e="everything")=>Promise.all(this.value.map((i=>i.formService.validate(e))))}),Object.defineProperty(this,"validate",{enumerable:!0,configurable:!0,writable:!0,value:(e="everything")=>l(this,void 0,void 0,(function*(){var i;return Promise.all([null===(i=this._validate)||void 0===i?void 0:i.call(this),this.validateFields(e)])}))}),Object.defineProperty(this,"disable",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.disabled=!0}}),Object.defineProperty(this,"enable",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.disabled=!1}}),e(this),this.initValue=i||[]}get initValue(){return this._initValue}set initValue(e){var i;this._initValue=e,this._value=e.slice(0),this.setTouched(!1),null===(i=this.validate)||void 0===i||i.call(this,"only-touched")}get value(){return this._value}set value(e){this._value=e,this.setTouched(!0)}get disabled(){return this._disabled}set disabled(e){this._disabled=e,e?this.value.forEach((e=>e.formService.disable())):this.value.forEach((e=>e.formService.enable()))}get error(){return this._error}set error(e){this._error=e}get isValid(){return!this._error&&this.value.every((e=>e.formService.isValid))}get isTouched(){return this._touched||this.value.some((e=>e.formService.isTouched))}get isInit(){return!this.isTouched}get hasItems(){return Boolean(this.value.length)}}class o{constructor(i,l){Object.defineProperty(this,"field",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"inputField",{enumerable:!0,configurable:!0,writable:!0,value:new t("")}),Object.defineProperty(this,"options",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"setValue",{enumerable:!0,configurable:!0,writable:!0,value:(e,{inputValue:i="",withNotification:t=!0,withBlur:l=!0})=>{var r,a,s,n;if(t?(this.field.value=e,this.inputField.value=i):(this.field.value=e,this.inputField.value=i,null===(a=(r=this.field).validate)||void 0===a||a.call(r),null===(n=(s=this.inputField).validate)||void 0===n||n.call(s)),l)return this.field.isBlurred=!0}}),Object.defineProperty(this,"reset",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.field.reset()}}),Object.defineProperty(this,"setAsInit",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.field.setAsInit()}}),Object.defineProperty(this,"onInputChange",{enumerable:!0,configurable:!0,writable:!0,value:(e,i)=>{var t,l,r,a;if("abort"===(null===(l=null===(t=this.options)||void 0===t?void 0:t.onInputBeforeChange)||void 0===l?void 0:l.call(t,i)))return;const s=this.inputField.value;this.inputField.value=i,s!==i&&(null===(a=null===(r=this.options)||void 0===r?void 0:r.onInputChange)||void 0===a||a.call(r,i))}}),Object.defineProperty(this,"touch",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.field.touch()}}),Object.defineProperty(this,"disable",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.field.disabled=!0}}),Object.defineProperty(this,"enable",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.field.disabled=!1}}),e(this),this.options=l,this.field=new t(null,{onChange:null==l?void 0:l.onChange,beforeOnChange:null==l?void 0:l.beforeOnChange}),this.field.initValue=i}get validate(){return this.field.validate}set validate(e){this.field.validate=e}get value(){return this.field.value}set value(e){this.field.value=e}get error(){return this.field.error}set error(e){this.field.error=e}get disabled(){return this.field.disabled}set disabled(e){this.field.disabled=e}get isValid(){return this.field.isValid}get isInit(){return this.field.isInit}set initValue(e){this.field.initValue=e}get isTouched(){return this.field.isTouched}get initValue(){return this.field.initValue}get props(){return Object.assign(Object.assign({},this.field.props),{onSearchChange:this.onInputChange})}}class d{constructor(i,s){Object.defineProperty(this,"fields",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"validationSchema",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"onSubmit",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"setOnSubmit",{enumerable:!0,configurable:!0,writable:!0,value:e=>{this.onSubmit=e}}),Object.defineProperty(this,"submit",{enumerable:!0,configurable:!0,writable:!0,value:()=>l(this,void 0,void 0,(function*(){var e;if(yield this.validate("everything"),this.canBeSubmitted)return null===(e=this.onSubmit)||void 0===e?void 0:e.call(this);null==a||a()}))}),Object.defineProperty(this,"validate",{enumerable:!0,configurable:!0,writable:!0,value:(e="only-touched")=>l(this,void 0,void 0,(function*(){const i=this.getValues();yield this.bypassFields(this.fields,(i=>l(this,void 0,void 0,(function*(){var t;if(i instanceof u)return yield null===(t=i.validateFields)||void 0===t?void 0:t.call(i,e)}))));const t=yield null==r?void 0:r(i,this.validationSchema);t&&0!=Object.keys(t||[]).length?this.setErrors(t,e):this.resetErrors()}))}),Object.defineProperty(this,"setValidationSchema",{enumerable:!0,configurable:!0,writable:!0,value:e=>{this.validationSchema=e,this.setValidationToFields()}}),Object.defineProperty(this,"getValues",{enumerable:!0,configurable:!0,writable:!0,value:()=>{const e={};for(const i of this.keys)e[i]=this.getValue(this.fields[i]);return e}}),Object.defineProperty(this,"getValue",{enumerable:!0,configurable:!0,writable:!0,value:e=>{if(e instanceof t||e instanceof u||e instanceof o)return null==e?void 0:e.value;if("object"==typeof e){const i={};for(const t of Object.keys(e))i[t]=this.getValue(null==e?void 0:e[t]);return i}return e}}),Object.defineProperty(this,"setFieldsByThis",{enumerable:!0,configurable:!0,writable:!0,value:e=>{const i={};Object.keys(e).forEach((l=>{(e[l]&&e[l]instanceof t||e[l]instanceof u||e[l]instanceof o)&&(i[l]=e[l])})),this.fields=i,this.setValidationToFields()}}),Object.defineProperty(this,"bypassFields",{enumerable:!0,configurable:!0,writable:!0,value:(e,i,l)=>e instanceof t||e instanceof u||e instanceof o?i(e,l):"object"==typeof e?Promise.all(Object.keys(e||{}).map((t=>this.bypassFields(null==e?void 0:e[t],i,null==l?void 0:l[t])))):void 0}),Object.defineProperty(this,"setValidationToFields",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.bypassFields(this.fields,(e=>{e instanceof u?e._validate=this.validate:e.validate=this.validate}))}}),Object.defineProperty(this,"setInitValues",{enumerable:!0,configurable:!0,writable:!0,value:(e,{validate:i}={})=>{this.bypassFields(this.fields,((e,i)=>e.initValue=i),e),i&&this.validate()}}),Object.defineProperty(this,"setValues",{enumerable:!0,configurable:!0,writable:!0,value:(e,{validate:i}={})=>{this.bypassFields(this.fields,((e,i)=>e.value=i),e),i&&this.validate("everything")}}),Object.defineProperty(this,"resetErrors",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.bypassFields(this.fields,(e=>e.error=void 0))}}),Object.defineProperty(this,"setValuesAsInit",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.bypassFields(this.fields,(e=>{e.setAsInit()}))}}),Object.defineProperty(this,"getKeys",{enumerable:!0,configurable:!0,writable:!0,value:({keyType:e="include",keys:i=[]})=>"include"===e?i:Object.keys(this.fields).filter((e=>!i.includes(e)))}),Object.defineProperty(this,"reset",{enumerable:!0,configurable:!0,writable:!0,value:e=>{if(null==e?void 0:e.keys){this.getKeys(e).forEach((e=>{this.fields[e].reset()}))}else this.bypassFields(this.fields,(e=>{e.reset()}));this.validate()}}),Object.defineProperty(this,"disable",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.bypassFields(this.fields,(e=>e.disable()))}}),Object.defineProperty(this,"enable",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.bypassFields(this.fields,(e=>e.enable()))}}),Object.defineProperty(this,"touch",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.bypassFields(this.fields,(e=>e.touch()))}}),n(),e(this),this.fields=i,this.validationSchema=s,this.setValidationToFields()}get keys(){return Object.keys(this.fields)}get isValid(){let e=!0;return this.bypassFields(this.fields,(i=>{i.isValid||(e=!1)})),e}get isTouched(){let e=!1;return this.bypassFields(this.fields,(i=>{i.isTouched&&(e=!0)})),e}get canBeSubmitted(){return this.isTouched&&this.isValid}get disabled(){let e=!0;return this.bypassFields(this.fields,(i=>{i.disabled||(e=!1)})),e}setErrors(e,i="only-touched"){this.bypassFields(this.fields,((e,t)=>{(e.isTouched||"everything"===i)&&(e.error=t)}),e)}}export{o as AutocompleteFieldService,u as CombinedFormFieldService,t as FieldService,d as FormService,n as _checkConfiguration,s as configureForm,a as preSubmitValidationError,r as validate};