{"version":3,"file":"/Users/anthonygubler/development/dojo-org/widgets/src/form/middleware.ts","sourceRoot":"","sources":["middleware.ts"],"names":[],"mappings":"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","sourcesContent":["import { create } from '@dojo/framework/core/vdom';\nimport { createICacheMiddleware } from '@dojo/framework/core/middleware/icache';\n\nexport type Validity = true | { valid: false | undefined; message: string };\nexport type FormValue = Record<string, any>;\n\ninterface Callbacks<S> {\n\tonValue?: (values: Partial<S>) => void;\n}\n\nexport interface FormMiddlewareApi<S> {\n\tvalue: {\n\t\t(): Partial<S>;\n\t\t(values: S): S;\n\t\t(values: Partial<S>): Partial<S>;\n\t};\n\tsubmit: {\n\t\t(callback: (values: Partial<S>) => void): void;\n\t\t(callback: (values: S) => void, defaults: S): void;\n\t};\n\tonValue(callback: (values: Partial<S>) => void): void;\n\tdisabled(disabled?: boolean): boolean;\n\tvalid(): boolean;\n\treset(): void;\n\tfield<K extends keyof S>(name: K, required?: boolean): Field<S, K>;\n}\n\nexport interface FormMiddleware<S> extends FormMiddlewareApi<S> {\n\t<S>(): FormMiddlewareApi<S>;\n}\n\nexport interface Field<S, K extends keyof S> {\n\tvalue: {\n\t\t(newValue: S[K]): S[K];\n\t\t(): S[K] | undefined;\n\t};\n\tvalid(valid?: boolean, message?: string): Validity;\n\trequired(required?: boolean): boolean;\n\tdisabled(required?: boolean): boolean;\n\tname: string;\n}\n\nfunction compareValidity(a: Validity, b: Validity) {\n\tif (typeof a === 'boolean' && typeof b === 'boolean') {\n\t\treturn true;\n\t}\n\tif (typeof a === 'boolean' || typeof b === 'boolean') {\n\t\treturn false;\n\t}\n\tif (b.valid === undefined) {\n\t\treturn false;\n\t}\n\treturn a.message === b.message;\n}\n\nexport interface State<S> {\n\tcallbacks: Callbacks<S>;\n\trequired: Record<string, boolean>;\n\tvalues: Partial<S>;\n\tvalid: Record<string, Validity>;\n\tdisabled: Record<string, boolean>;\n\tformDisabled: boolean;\n}\n\nexport const createFormMiddleware = <S extends FormValue = any>() => {\n\tconst icache = createICacheMiddleware<State<S>>();\n\tconst factory = create({ icache });\n\n\tconst formMiddleware = factory(function Form({ middleware: { icache } }): FormMiddleware<S> {\n\t\tconst api = {\n\t\t\tvalue(values?: any): any {\n\t\t\t\tconst currentValues = icache.getOrSet('values', {});\n\t\t\t\tif (values !== undefined) {\n\t\t\t\t\ticache.set('values', values);\n\t\t\t\t\tconst newValues = { ...currentValues, ...values };\n\t\t\t\t\tconst callbacks = icache.get('callbacks');\n\t\t\t\t\tcallbacks && callbacks.onValue && callbacks.onValue(newValues);\n\t\t\t\t\treturn newValues;\n\t\t\t\t}\n\t\t\t\treturn currentValues;\n\t\t\t},\n\t\t\tsubmit<T = void>(callback: (values: any) => T, defaults?: S) {\n\t\t\t\tif (!this.valid()) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (defaults) {\n\t\t\t\t\treturn callback({ ...defaults, ...this.value() } as S);\n\t\t\t\t}\n\t\t\t\treturn callback(this.value());\n\t\t\t},\n\t\t\tonValue<T = void>(callback: (values: Partial<S>) => T) {\n\t\t\t\ticache.set('callbacks', { onValue: callback }, false);\n\t\t\t},\n\t\t\tdisabled(disabled?: boolean) {\n\t\t\t\tif (disabled !== undefined) {\n\t\t\t\t\ticache.set('formDisabled', disabled);\n\t\t\t\t\treturn disabled;\n\t\t\t\t}\n\t\t\t\treturn icache.getOrSet('formDisabled', false);\n\t\t\t},\n\t\t\tvalid() {\n\t\t\t\tconst values = icache.getOrSet('valid', {});\n\t\t\t\tconst requiredValues = icache.getOrSet('required', {});\n\t\t\t\treturn Object.keys({ ...values, ...requiredValues }).every((key) => {\n\t\t\t\t\tconst valid = values[key];\n\t\t\t\t\tconst value =\n\t\t\t\t\t\ttypeof valid === 'boolean' || valid === undefined ? valid : valid.valid;\n\t\t\t\t\treturn (value === undefined && !requiredValues[key]) || Boolean(value);\n\t\t\t\t});\n\t\t\t},\n\t\t\treset() {\n\t\t\t\ticache.set('values', {});\n\t\t\t\tlet valid: Record<string, Validity> = {};\n\t\t\t\tconst values = icache.getOrSet('valid', {});\n\t\t\t\tObject.keys(values).map((key) => {\n\t\t\t\t\tvalid[key] = { valid: undefined, message: '' };\n\t\t\t\t});\n\t\t\t\ticache.set('valid', valid);\n\t\t\t\ticache.set('required', {});\n\t\t\t\ticache.set('formDisabled', false);\n\t\t\t\ticache.set('disabled', {});\n\t\t\t},\n\t\t\tfield(name: any, required = false): Field<S, any> {\n\t\t\t\tconst requiredValues = icache.getOrSet('required', {});\n\t\t\t\tif (requiredValues[name] === undefined) {\n\t\t\t\t\ticache.set('required', {\n\t\t\t\t\t\t...requiredValues,\n\t\t\t\t\t\t[name]: required\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tconst values = icache.getOrSet('values', {}) as S;\n\t\t\t\tif (!values.hasOwnProperty(name)) {\n\t\t\t\t\ticache.set('values', {\n\t\t\t\t\t\t...values,\n\t\t\t\t\t\t[name]: undefined\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tname,\n\t\t\t\t\tvalue: (newValue?: any): any => {\n\t\t\t\t\t\tconst values = icache.getOrSet('values', {}) as S;\n\t\t\t\t\t\tif (newValue !== undefined && values[name] !== newValue) {\n\t\t\t\t\t\t\ticache.set('values', { ...values, [name]: newValue });\n\t\t\t\t\t\t\tconst callbacks = icache.get('callbacks');\n\t\t\t\t\t\t\tcallbacks &&\n\t\t\t\t\t\t\t\tcallbacks.onValue &&\n\t\t\t\t\t\t\t\tcallbacks.onValue({ [name]: newValue } as Partial<S>);\n\t\t\t\t\t\t\treturn newValue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn values[name];\n\t\t\t\t\t},\n\t\t\t\t\tvalid: (valid?: boolean, message?: string): Validity => {\n\t\t\t\t\t\tlet newValue = valid || {\n\t\t\t\t\t\t\tvalid,\n\t\t\t\t\t\t\tmessage: message || ''\n\t\t\t\t\t\t};\n\t\t\t\t\t\tconst values = icache.getOrSet('valid', {});\n\t\t\t\t\t\tif (!values.hasOwnProperty(name)) {\n\t\t\t\t\t\t\ticache.set('valid', {\n\t\t\t\t\t\t\t\t...values,\n\t\t\t\t\t\t\t\t[name]: newValue\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\treturn newValue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (valid !== undefined) {\n\t\t\t\t\t\t\tif (!compareValidity(newValue, values[name])) {\n\t\t\t\t\t\t\t\ticache.set('valid', {\n\t\t\t\t\t\t\t\t\t...values,\n\t\t\t\t\t\t\t\t\t[name]: newValue\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\treturn newValue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn values[name];\n\t\t\t\t\t},\n\t\t\t\t\trequired: (required?: boolean) => {\n\t\t\t\t\t\tconst values = icache.getOrSet('required', {});\n\t\t\t\t\t\tif (required !== undefined && values[name] !== required) {\n\t\t\t\t\t\t\ticache.set('required', {\n\t\t\t\t\t\t\t\t...values,\n\t\t\t\t\t\t\t\t[name]: required\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\treturn required;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn Boolean(values[name]);\n\t\t\t\t\t},\n\t\t\t\t\tdisabled: (disabled?: boolean) => {\n\t\t\t\t\t\tconst formValue = icache.getOrSet('formDisabled', false);\n\t\t\t\t\t\tconst values = icache.getOrSet('disabled', {});\n\t\t\t\t\t\tif (disabled !== undefined && values[name] !== disabled) {\n\t\t\t\t\t\t\ticache.set('disabled', {\n\t\t\t\t\t\t\t\t...values,\n\t\t\t\t\t\t\t\t[name]: disabled\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\treturn formValue || disabled;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn formValue || Boolean(values[name]);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t}\n\t\t};\n\t\tconst apiFactory: any = () => {\n\t\t\treturn api;\n\t\t};\n\n\t\tapiFactory.value = api.value;\n\t\tapiFactory.submit = api.submit;\n\t\tapiFactory.onValue = api.onValue;\n\t\tapiFactory.disabled = api.disabled;\n\t\tapiFactory.valid = api.valid;\n\t\tapiFactory.reset = api.reset;\n\t\tapiFactory.field = api.field;\n\t\treturn apiFactory;\n\t});\n\treturn formMiddleware;\n};\n\nexport default createFormMiddleware;\n"]}