UNPKG

@ngneat/reactive-forms

Version:

(Angular Reactive) Forms with Benefits

75 lines 12.7 kB
import { UntypedFormArray } from "@angular/forms"; import { from, isObservable, of } from "rxjs"; import { debounceTime, switchMap, take, tap } from "rxjs/operators"; export function persistControl(control, key, { debounceTime, manager, arrControlFactory, persistDisabledControls }) { const persistManager = manager || new LocalStorageManager(); return restoreControl(control, key, persistManager, arrControlFactory).pipe(switchMap(() => persistValue$(control, key, { debounceTime: debounceTime || 250, manager: persistManager, persistDisabledControls }))); } function persistValue$(control, key, options) { return control.valueChanges.pipe( // eslint-disable-next-line @typescript-eslint/no-non-null-assertion debounceTime(options.debounceTime), switchMap(value => // eslint-disable-next-line @typescript-eslint/no-non-null-assertion wrapIntoObservable(options.manager.setValue(key, options.persistDisabledControls ? control.getRawValue() : value)))); } export function restoreControl(control, key, manager, arrControlFactory) { return wrapIntoObservable(manager.getValue(key)).pipe(take(1), tap(value => { if (!value) return; if (arrControlFactory) { handleFormArrays(control, value, arrControlFactory); } control.patchValue(value, { emitEvent: false }); })); } function handleFormArrays(control, formValue, arrControlFactory) { Object.keys(formValue).forEach(controlName => { const value = formValue[controlName]; if (Array.isArray(value) && control.get(controlName) instanceof UntypedFormArray) { if (!arrControlFactory || (arrControlFactory && !(controlName in arrControlFactory))) { throw new Error(`Please provide arrControlFactory for ${controlName}`); } const current = control.get(controlName); const fc = arrControlFactory[controlName]; clearFormArray(current); value.forEach((v, i) => current.insert(i, fc(v))); } }); } export function clearFormArray(control) { while (control.length !== 0) { control.removeAt(0); } } export function wrapIntoObservable(value) { if (isObservable(value) || isPromise(value)) { return from(value); } return of(value); } function isPromise(value) { return typeof value?.then === 'function'; } export class LocalStorageManager { setValue(key, data) { localStorage.setItem(key, JSON.stringify(data)); return data; } getValue(key) { return JSON.parse(localStorage.getItem(key) || '{}'); } } export class SessionStorageManager { setValue(key, data) { sessionStorage.setItem(key, JSON.stringify(data)); return data; } getValue(key) { return JSON.parse(sessionStorage.getItem(key) || '{}'); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyc2lzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcmVhY3RpdmUtZm9ybXMvc3JjL2xpYi9wZXJzaXN0L3BlcnNpc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFtQixnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxRCxPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFTcEUsTUFBTSxVQUFVLGNBQWMsQ0FDNUIsT0FBd0IsRUFDeEIsR0FBVyxFQUNYLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSx1QkFBdUIsRUFBcUI7SUFFeEYsTUFBTSxjQUFjLEdBQUcsT0FBTyxJQUFJLElBQUksbUJBQW1CLEVBQUUsQ0FBQztJQUU1RCxPQUFPLGNBQWMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLGNBQWMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FDekUsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUNiLGFBQWEsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFO1FBQzFCLFlBQVksRUFBRSxZQUFZLElBQUksR0FBRztRQUNqQyxPQUFPLEVBQUUsY0FBYztRQUN2Qix1QkFBdUI7S0FDeEIsQ0FBQyxDQUNILENBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBSSxPQUF3QixFQUFFLEdBQVcsRUFBRSxPQUEwQjtJQUN6RixPQUFPLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSTtJQUM5QixvRUFBb0U7SUFDcEUsWUFBWSxDQUFDLE9BQU8sQ0FBQyxZQUFhLENBQUMsRUFDbkMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFO0lBQ2hCLG9FQUFvRTtJQUNwRSxr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QU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELFFBQVEsQ0FBQyxHQUFXO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDO0lBQ3ZELENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxxQkFBcUI7SUFDaEMsUUFBUSxDQUFDLEdBQVcsRUFBRSxJQUFPO1FBQzNCLGNBQWMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNsRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxRQUFRLENBQUMsR0FBVztRQUNsQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztJQUN6RCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgVW50eXBlZEZvcm1BcnJheSB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuaW1wb3J0IHsgZnJvbSwgaXNPYnNlcnZhYmxlLCBPYnNlcnZhYmxlLCBvZiB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIHN3aXRjaE1hcCwgdGFrZSwgdGFwIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGVyc2lzdE9wdGlvbnM8VD4ge1xuICBkZWJvdW5jZVRpbWU/OiBudW1iZXI7XG4gIG1hbmFnZXI/OiBQZXJzaXN0TWFuYWdlcjxUPjtcbiAgYXJyQ29udHJvbEZhY3Rvcnk/OiBDb250cm9sRmFjdG9yeU1hcDxUPjtcbiAgcGVyc2lzdERpc2FibGVkQ29udHJvbHM/OiBib29sZWFuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGVyc2lzdENvbnRyb2w8VD4oXG4gIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCxcbiAga2V5OiBzdHJpbmcsXG4gIHsgZGVib3VuY2VUaW1lLCBtYW5hZ2VyLCBhcnJDb250cm9sRmFjdG9yeSwgcGVyc2lzdERpc2FibGVkQ29udHJvbHMgfTogUGVyc2lzdE9wdGlvbnM8VD5cbik6IE9ic2VydmFibGU8dW5rbm93bj4ge1xuICBjb25zdCBwZXJzaXN0TWFuYWdlciA9IG1hbmFnZXIgfHwgbmV3IExvY2FsU3RvcmFnZU1hbmFnZXIoKTtcblxuICByZXR1cm4gcmVzdG9yZUNvbnRyb2woY29udHJvbCwga2V5LCBwZXJzaXN0TWFuYWdlciwgYXJyQ29udHJvbEZhY3RvcnkpLnBpcGUoXG4gICAgc3dpdGNoTWFwKCgpID0+XG4gICAgICBwZXJzaXN0VmFsdWUkKGNvbnRyb2wsIGtleSwge1xuICAgICAgICBkZWJvdW5jZVRpbWU6IGRlYm91bmNlVGltZSB8fCAyNTAsXG4gICAgICAgIG1hbmFnZXI6IHBlcnNpc3RNYW5hZ2VyLFxuICAgICAgICBwZXJzaXN0RGlzYWJsZWRDb250cm9sc1xuICAgICAgfSlcbiAgICApXG4gICk7XG59XG5cbmZ1bmN0aW9uIHBlcnNpc3RWYWx1ZSQ8VD4oY29udHJvbDogQWJzdHJhY3RDb250cm9sLCBrZXk6IHN0cmluZywgb3B0aW9uczogUGVyc2lzdE9wdGlvbnM8VD4pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgcmV0dXJuIGNvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICBkZWJvdW5jZVRpbWUob3B0aW9ucy5kZWJvdW5jZVRpbWUhKSxcbiAgICBzd2l0Y2hNYXAodmFsdWUgPT5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgICB3cmFwSW50b09ic2VydmFibGUob3B0aW9ucy5tYW5hZ2VyIS5zZXRWYWx1ZShrZXksIG9wdGlvbnMucGVyc2lzdERpc2FibGVkQ29udHJvbHMgPyAoY29udHJvbCBhcyBhbnkpLmdldFJhd1ZhbHVlKCkgOiB2YWx1ZSkpXG4gICAgKVxuICApO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiByZXN0b3JlQ29udHJvbDxUPihjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsIGtleTogc3RyaW5nLCBtYW5hZ2VyOiBQZXJzaXN0TWFuYWdlcjxUPiwgYXJyQ29udHJvbEZhY3Rvcnk6IENvbnRyb2xGYWN0b3J5TWFwPFQ+IHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxUPiB7XG4gIHJldHVybiB3cmFwSW50b09ic2VydmFibGUobWFuYWdlci5nZXRWYWx1ZShrZXkpKS5waXBlKFxuICAgIHRha2UoMSksXG4gICAgdGFwKHZhbHVlID0+IHtcbiAgICAgIGlmICghdmFsdWUpIHJldHVybjtcblxuICAgICAgaWYgKGFyckNvbnRyb2xGYWN0b3J5KSB7XG4gICAgICAgIGhhbmRsZUZvcm1BcnJheXMoY29udHJvbCwgdmFsdWUsIGFyckNvbnRyb2xGYWN0b3J5KTtcbiAgICAgIH1cblxuICAgICAgY29udHJvbC5wYXRjaFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfSlcbiAgKTtcbn1cblxuXG5mdW5jdGlvbiBoYW5kbGVGb3JtQXJyYXlzPFQ+KFxuICBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsXG4gIGZvcm1WYWx1ZTogVCxcbiAgYXJyQ29udHJvbEZhY3Rvcnk6IENvbnRyb2xGYWN0b3J5TWFwPFQ+XG4pIHtcbiAgT2JqZWN0LmtleXMoZm9ybVZhbHVlKS5mb3JFYWNoKGNvbnRyb2xOYW1lID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IChmb3JtVmFsdWUgYXMgYW55KVtjb250cm9sTmFtZV07XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgY29udHJvbC5nZXQoY29udHJvbE5hbWUpIGluc3RhbmNlb2YgVW50eXBlZEZvcm1BcnJheSkge1xuICAgICAgaWYgKCFhcnJDb250cm9sRmFjdG9yeSB8fCAoYXJyQ29udHJvbEZhY3RvcnkgJiYgIShjb250cm9sTmFtZSBpbiBhcnJDb250cm9sRmFjdG9yeSkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUGxlYXNlIHByb3ZpZGUgYXJyQ29udHJvbEZhY3RvcnkgZm9yICR7Y29udHJvbE5hbWV9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBjdXJyZW50ID0gY29udHJvbC5nZXQoY29udHJvbE5hbWUpIGFzIFVudHlwZWRGb3JtQXJyYXk7XG4gICAgICBjb25zdCBmYyA9IChhcnJDb250cm9sRmFjdG9yeSBhcyBhbnkpW2NvbnRyb2xOYW1lXVxuICAgICAgY2xlYXJGb3JtQXJyYXkoY3VycmVudCk7XG4gICAgICB2YWx1ZS5mb3JFYWNoKCh2LCBpKSA9PiBjdXJyZW50Lmluc2VydChpLCBmYyh2KSkpO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckZvcm1BcnJheShjb250cm9sOiBVbnR5cGVkRm9ybUFycmF5KSB7XG4gIHdoaWxlIChjb250cm9sLmxlbmd0aCAhPT0gMCkge1xuICAgIGNvbnRyb2wucmVtb3ZlQXQoMCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyYXBJbnRvT2JzZXJ2YWJsZTxUPih2YWx1ZTogVCB8IFByb21pc2U8VD4gfCBPYnNlcnZhYmxlPFQ+KTogT2JzZXJ2YWJsZTxUPiB7XG4gIGlmIChpc09ic2VydmFibGUodmFsdWUpIHx8IGlzUHJvbWlzZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZnJvbSh2YWx1ZSk7XG4gIH1cblxuICByZXR1cm4gb2YodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBpc1Byb21pc2UodmFsdWU6IGFueSk6IHZhbHVlIGlzIFByb21pc2U8dW5rbm93bj4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlPy50aGVuID09PSAnZnVuY3Rpb24nO1xufVxuXG5leHBvcnQgdHlwZSBBcnJheUtleXM8VD4gPSB7IFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgYW55W10gPyBLIDogbmV2ZXIgfVtrZXlvZiBUXTtcbmV4cG9ydCB0eXBlIENvbnRyb2xGYWN0b3J5PFQ+ID0gKHZhbHVlOiBUKSA9PiBBYnN0cmFjdENvbnRyb2w7XG5leHBvcnQgdHlwZSBDb250cm9sRmFjdG9yeU1hcDxUPiA9IHtcbiAgW0sgaW4gQXJyYXlLZXlzPFQ+XT86IENvbnRyb2xGYWN0b3J5PEFycmF5VHlwZTxUW0tdPj47XG59O1xudHlwZSBBcnJheVR5cGU8VD4gPSBUIGV4dGVuZHMgQXJyYXk8aW5mZXIgUj4gPyBSIDogYW55O1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgUGVyc2lzdE1hbmFnZXI8VD4ge1xuICBzZXRWYWx1ZShrZXk6IHN0cmluZywgZGF0YTogVCk6IFQgfCBQcm9taXNlPFQ+IHwgT2JzZXJ2YWJsZTxUPjtcbiAgZ2V0VmFsdWUoa2V5OiBzdHJpbmcpOiBUIHwgUHJvbWlzZTxUPiB8IE9ic2VydmFibGU8VD47XG59XG5cblxuZXhwb3J0IGNsYXNzIExvY2FsU3RvcmFnZU1hbmFnZXI8VD4gaW1wbGVtZW50cyBQZXJzaXN0TWFuYWdlcjxUPiB7XG4gIHNldFZhbHVlKGtleTogc3RyaW5nLCBkYXRhOiBUKTogVCB7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBnZXRWYWx1ZShrZXk6IHN0cmluZyk6IFQge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSkgfHwgJ3t9Jyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNlc3Npb25TdG9yYWdlTWFuYWdlcjxUPiBpbXBsZW1lbnRzIFBlcnNpc3RNYW5hZ2VyPFQ+IHtcbiAgc2V0VmFsdWUoa2V5OiBzdHJpbmcsIGRhdGE6IFQpOiBUIHtcbiAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgZ2V0VmFsdWUoa2V5OiBzdHJpbmcpOiBUIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGtleSkgfHwgJ3t9Jyk7XG4gIH1cbn0iXX0=