UNPKG

@datorama/akita

Version:

State Management Tailored-Made for JS Applications

248 lines 21.6 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { AkitaPlugin } from '../plugin'; import { debounceTime } from 'rxjs/operators'; import { getValue } from '../../getValueByString'; import { toBoolean } from '../../toBoolean'; import { isString } from '../../isString'; import { setValue } from '../../setValueByString'; import { logAction } from '../../actions'; // Todo: Return AbstractControl interface /** * @template T */ export class PersistNgFormPlugin extends AkitaPlugin { /** * @param {?} query * @param {?=} factoryFnOrPath * @param {?=} params */ constructor(query, factoryFnOrPath, params = {}) { super(query); this.query = query; this.factoryFnOrPath = factoryFnOrPath; this.params = params; this.params = Object.assign({ debounceTime: 300, formKey: 'akitaForm', emitEvent: false, arrControlFactory: (/** * @param {?} v * @return {?} */ v => this.builder.control(v)) }, params); this.isRootKeys = toBoolean(factoryFnOrPath) === false; this.isKeyBased = isString(factoryFnOrPath) || this.isRootKeys; } /** * @template THIS * @this {THIS} * @param {?} form * @param {?=} builder * @return {THIS} */ setForm(form, builder) { (/** @type {?} */ (this)).form = form; (/** @type {?} */ (this)).builder = builder; (/** @type {?} */ (this)).activate(); return (/** @type {?} */ (this)); } /** * @param {?=} initialState * @return {?} */ reset(initialState) { /** @type {?} */ let value; if (initialState) { value = initialState; } else { value = this.isKeyBased ? this.initialValue : ((/** @type {?} */ (this))).factoryFnOrPath(); } if (this.isKeyBased) { Object.keys(this.initialValue).forEach((/** * @param {?} stateKey * @return {?} */ stateKey => { /** @type {?} */ const value = this.initialValue[stateKey]; if (Array.isArray(value) && this.builder) { /** @type {?} */ const formArray = this.form.controls[stateKey]; this.cleanArray(formArray); value.forEach((/** * @param {?} v * @param {?} i * @return {?} */ (v, i) => { this.form.get(stateKey).insert(i, ((/** @type {?} */ (this.params.arrControlFactory)))(v)); })); } })); } this.form.patchValue(value, { emitEvent: this.params.emitEvent }); /** @type {?} */ const storeValue = this.isKeyBased ? setValue(this.getQuery().getValue(), `${this.getStore().storeName}.${this.factoryFnOrPath}`, value) : { [this.params.formKey]: value }; this.updateStore(storeValue); } /** * @private * @param {?} control * @return {?} */ cleanArray(control) { while (control.length !== 0) { control.removeAt(0); } } /** * @private * @param {?} formValue * @param {?} root * @return {?} */ resolveInitialValue(formValue, root) { if (!formValue) return; return Object.keys(formValue).reduce((/** * @param {?} acc * @param {?} stateKey * @return {?} */ (acc, stateKey) => { /** @type {?} */ const value = root[stateKey]; if (Array.isArray(value) && this.builder) { /** @type {?} */ const factory = this.params.arrControlFactory; this.cleanArray(this.form.get(stateKey)); value.forEach((/** * @param {?} v * @param {?} i * @return {?} */ (v, i) => { this.form.get(stateKey).insert(i, ((/** @type {?} */ (factory)))(v)); })); } acc[stateKey] = root[stateKey]; return acc; }), {}); } /** * @private * @return {?} */ activate() { /** @type {?} */ let path; if (this.isKeyBased) { if (this.isRootKeys) { this.initialValue = this.resolveInitialValue(this.form.value, this.getQuery().getValue()); this.form.patchValue(this.initialValue, { emitEvent: this.params.emitEvent }); } else { path = `${this.getStore().storeName}.${this.factoryFnOrPath}`; /** @type {?} */ const root = getValue(this.getQuery().getValue(), path); this.initialValue = this.resolveInitialValue(root, root); this.form.patchValue(this.initialValue, { emitEvent: this.params.emitEvent }); } } else { if (!((/** @type {?} */ (this.getQuery().getValue())))[this.params.formKey]) { logAction('@PersistNgFormPlugin activate'); this.updateStore({ [this.params.formKey]: ((/** @type {?} */ (this))).factoryFnOrPath() }); } /** @type {?} */ const value = this.getQuery().getValue()[this.params.formKey]; this.form.patchValue(value); } this.formChanges = this.form.valueChanges.pipe(debounceTime(this.params.debounceTime)).subscribe((/** * @param {?} value * @return {?} */ value => { logAction('@PersistForm - Update'); /** @type {?} */ let newState; if (this.isKeyBased) { if (this.isRootKeys) { newState = (/** * @param {?} state * @return {?} */ state => (Object.assign({}, state, value))); } else { newState = (/** * @param {?} state * @return {?} */ state => setValue(state, path, value)); } } else { newState = (/** * @return {?} */ () => ({ [this.params.formKey]: value })); } this.updateStore(newState(this.getQuery().getValue())); })); } /** * @return {?} */ destroy() { this.formChanges && this.formChanges.unsubscribe(); this.form = null; this.builder = null; } } if (false) { /** @type {?} */ PersistNgFormPlugin.prototype.formChanges; /** * @type {?} * @private */ PersistNgFormPlugin.prototype.isRootKeys; /** * @type {?} * @private */ PersistNgFormPlugin.prototype.form; /** * @type {?} * @private */ PersistNgFormPlugin.prototype.isKeyBased; /** * @type {?} * @private */ PersistNgFormPlugin.prototype.initialValue; /** * @type {?} * @private */ PersistNgFormPlugin.prototype.builder; /** * @type {?} * @protected */ PersistNgFormPlugin.prototype.query; /** * @type {?} * @private */ PersistNgFormPlugin.prototype.factoryFnOrPath; /** * @type {?} * @private */ PersistNgFormPlugin.prototype.params; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyc2lzdE5nRm9ybVBsdWdpbi5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BkYXRvcmFtYS9ha2l0YS8iLCJzb3VyY2VzIjpbInNyYy9wbHVnaW5zL3BlcnNpc3RGb3JtL3BlcnNpc3ROZ0Zvcm1QbHVnaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFHeEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7OztBQXdCMUMsTUFBTSxPQUFPLG1CQUE2QixTQUFRLFdBQVc7Ozs7OztJQVEzRCxZQUFzQixLQUFpQixFQUFVLGVBQW1DLEVBQVUsU0FBNEIsRUFBRTtRQUMxSCxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFETyxVQUFLLEdBQUwsS0FBSyxDQUFZO1FBQVUsb0JBQWUsR0FBZixlQUFlLENBQW9CO1FBQVUsV0FBTSxHQUFOLE1BQU0sQ0FBd0I7UUFFMUgsSUFBSSxDQUFDLE1BQU0saUJBQVEsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxpQkFBaUI7Ozs7WUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFBLEVBQUUsRUFBSyxNQUFNLENBQUUsQ0FBQztRQUMvSSxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQyxlQUFl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aW4gfSBmcm9tICcuLi9wbHVnaW4nO1xuaW1wb3J0IHsgUXVlcnkgfSBmcm9tICcuLi8uLi9xdWVyeSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGdldFZhbHVlIH0gZnJvbSAnLi4vLi4vZ2V0VmFsdWVCeVN0cmluZyc7XG5pbXBvcnQgeyB0b0Jvb2xlYW4gfSBmcm9tICcuLi8uLi90b0Jvb2xlYW4nO1xuaW1wb3J0IHsgaXNTdHJpbmcgfSBmcm9tICcuLi8uLi9pc1N0cmluZyc7XG5pbXBvcnQgeyBzZXRWYWx1ZSB9IGZyb20gJy4uLy4uL3NldFZhbHVlQnlTdHJpbmcnO1xuaW1wb3J0IHsgbG9nQWN0aW9uIH0gZnJvbSAnLi4vLi4vYWN0aW9ucyc7XG5cbmV4cG9ydCB0eXBlIEZvcm1Hcm91cExpa2UgPSB7XG4gIHBhdGNoVmFsdWU6IEZ1bmN0aW9uO1xuICBzZXRWYWx1ZTogRnVuY3Rpb247XG4gIHZhbHVlOiBhbnk7XG4gIGdldDogRnVuY3Rpb247XG4gIHZhbHVlQ2hhbmdlczogT2JzZXJ2YWJsZTxhbnk+O1xuICBjb250cm9sczogYW55O1xufTtcblxuZXhwb3J0IHR5cGUgQWtpdGFGb3JtUHJvcDxUPiA9IHtcbiAgW2tleTogc3RyaW5nXTogVDtcbn07XG5cbmV4cG9ydCB0eXBlIFBlcnNpc3RGb3JtUGFyYW1zID0ge1xuICBkZWJvdW5jZVRpbWU/OiBudW1iZXI7XG4gIGZvcm1LZXk/OiBzdHJpbmc7XG4gIGVtaXRFdmVudD86IGJvb2xlYW47XG4gIGFyckNvbnRyb2xGYWN0b3J5PzogQXJyYXlDb250cm9sRmFjdG9yeTtcbn07XG5cbmV4cG9ydCB0eXBlIEFycmF5Q29udHJvbEZhY3RvcnkgPSAodmFsdWU6IGFueSkgPT4gYW55OyAvLyBUb2RvOiBSZXR1cm4gIEFic3RyYWN0Q29udHJvbCBpbnRlcmZhY2VcblxuZXhwb3J0IGNsYXNzIFBlcnNpc3ROZ0Zvcm1QbHVnaW48VCA9IGFueT4gZXh0ZW5kcyBBa2l0YVBsdWdpbiB7XG4gIGZvcm1DaGFuZ2VzOiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgaXNSb290S2V5czogYm9vbGVhbjtcbiAgcHJpdmF0ZSBmb3JtOiBGb3JtR3JvdXBMaWtlO1xuICBwcml2YXRlIGlzS2V5QmFzZWQ6IGJvb2xlYW47XG4gIHByaXZhdGUgaW5pdGlhbFZhbHVlO1xuICBwcml2YXRlIGJ1aWxkZXI7XG5cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHF1ZXJ5OiBRdWVyeTxhbnk+LCBwcml2YXRlIGZhY3RvcnlGbk9yUGF0aD86IEZ1bmN0aW9uIHwgc3RyaW5nLCBwcml2YXRlIHBhcmFtczogUGVyc2lzdEZvcm1QYXJhbXMgPSB7fSkge1xuICAgIHN1cGVyKHF1ZXJ5KTtcbiAgICB0aGlzLnBhcmFtcyA9IHsgLi4ueyBkZWJvdW5jZVRpbWU6IDMwMCwgZm9ybUtleTogJ2FraXRhRm9ybScsIGVtaXRFdmVudDogZmFsc2UsIGFyckNvbnRyb2xGYWN0b3J5OiB2ID0+IHRoaXMuYnVpbGRlci5jb250cm9sKHYpIH0sIC4uLnBhcmFtcyB9O1xuICAgIHRoaXMuaXNSb290S2V5cyA9IHRvQm9vbGVhbihmYWN0b3J5Rm5PclBhdGgpID09PSBmYWxzZTtcbiAgICB0aGlzLmlzS2V5QmFzZWQgPSBpc1N0cmluZyhmYWN0b3J5Rm5PclBhdGgpIHx8IHRoaXMuaXNSb290S2V5cztcbiAgfVxuXG4gIHNldEZvcm0oZm9ybTogRm9ybUdyb3VwTGlrZSwgYnVpbGRlcj8pIHtcbiAgICB0aGlzLmZvcm0gPSBmb3JtO1xuICAgIHRoaXMuYnVpbGRlciA9IGJ1aWxkZXI7XG4gICAgdGhpcy5hY3RpdmF0ZSgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcmVzZXQoaW5pdGlhbFN0YXRlPzogVCkge1xuICAgIGxldCB2YWx1ZTtcbiAgICBpZiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICB2YWx1ZSA9IGluaXRpYWxTdGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgPSB0aGlzLmlzS2V5QmFzZWQgPyB0aGlzLmluaXRpYWxWYWx1ZSA6ICh0aGlzIGFzIGFueSkuZmFjdG9yeUZuT3JQYXRoKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNLZXlCYXNlZCkge1xuICAgICAgT2JqZWN0LmtleXModGhpcy5pbml0aWFsVmFsdWUpLmZvckVhY2goc3RhdGVLZXkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuaW5pdGlhbFZhbHVlW3N0YXRlS2V5XTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHRoaXMuYnVpbGRlcikge1xuICAgICAgICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuZm9ybS5jb250cm9sc1tzdGF0ZUtleV07XG4gICAgICAgICAgdGhpcy5jbGVhbkFycmF5KGZvcm1BcnJheSk7XG4gICAgICAgICAgdmFsdWUuZm9yRWFjaCgodiwgaSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5mb3JtLmdldChzdGF0ZUtleSkuaW5zZXJ0KGksICh0aGlzLnBhcmFtcy5hcnJDb250cm9sRmFjdG9yeSBhcyBGdW5jdGlvbikodikpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiB0aGlzLnBhcmFtcy5lbWl0RXZlbnQgfSk7XG5cbiAgICBjb25zdCBzdG9yZVZhbHVlID0gdGhpcy5pc0tleUJhc2VkID8gc2V0VmFsdWUodGhpcy5nZXRRdWVyeSgpLmdldFZhbHVlKCksIGAke3RoaXMuZ2V0U3RvcmUoKS5zdG9yZU5hbWV9LiR7dGhpcy5mYWN0b3J5Rm5PclBhdGh9YCwgdmFsdWUpIDogeyBbdGhpcy5wYXJhbXMuZm9ybUtleV06IHZhbHVlIH07XG4gICAgdGhpcy51cGRhdGVTdG9yZShzdG9yZVZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYW5BcnJheShjb250cm9sKSB7XG4gICAgd2hpbGUgKGNvbnRyb2wubGVuZ3RoICE9PSAwKSB7XG4gICAgICBjb250cm9sLnJlbW92ZUF0KDApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZUluaXRpYWxWYWx1ZShmb3JtVmFsdWUsIHJvb3QpIHtcbiAgICBpZiAoIWZvcm1WYWx1ZSkgcmV0dXJuO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhmb3JtVmFsdWUpLnJlZHVjZSgoYWNjLCBzdGF0ZUtleSkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSByb290W3N0YXRlS2V5XTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB0aGlzLmJ1aWxkZXIpIHtcbiAgICAgICAgY29uc3QgZmFjdG9yeSA9IHRoaXMucGFyYW1zLmFyckNvbnRyb2xGYWN0b3J5O1xuICAgICAgICB0aGlzLmNsZWFuQXJyYXkodGhpcy5mb3JtLmdldChzdGF0ZUtleSkpO1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKCh2LCBpKSA9PiB7XG4gICAgICAgICAgdGhpcy5mb3JtLmdldChzdGF0ZUtleSkuaW5zZXJ0KGksIChmYWN0b3J5IGFzIEZ1bmN0aW9uKSh2KSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgYWNjW3N0YXRlS2V5XSA9IHJvb3Rbc3RhdGVLZXldO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG4gIH1cblxuICBwcml2YXRlIGFjdGl2YXRlKCkge1xuICAgIGxldCBwYXRoO1xuXG4gICAgaWYgKHRoaXMuaXNLZXlCYXNlZCkge1xuICAgICAgaWYgKHRoaXMuaXNSb290S2V5cykge1xuICAgICAgICB0aGlzLmluaXRpYWxWYWx1ZSA9IHRoaXMucmVzb2x2ZUluaXRpYWxWYWx1ZSh0aGlzLmZvcm0udmFsdWUsIHRoaXMuZ2V0UXVlcnkoKS5nZXRWYWx1ZSgpKTtcbiAgICAgICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUodGhpcy5pbml0aWFsVmFsdWUsIHsgZW1pdEV2ZW50OiB0aGlzLnBhcmFtcy5lbWl0RXZlbnQgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXRoID0gYCR7dGhpcy5nZXRTdG9yZSgpLnN0b3JlTmFtZX0uJHt0aGlzLmZhY3RvcnlGbk9yUGF0aH1gO1xuICAgICAgICBjb25zdCByb290ID0gZ2V0VmFsdWUodGhpcy5nZXRRdWVyeSgpLmdldFZhbHVlKCksIHBhdGgpO1xuICAgICAgICB0aGlzLmluaXRpYWxWYWx1ZSA9IHRoaXMucmVzb2x2ZUluaXRpYWxWYWx1ZShyb290LCByb290KTtcbiAgICAgICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUodGhpcy5pbml0aWFsVmFsdWUsIHsgZW1pdEV2ZW50OiB0aGlzLnBhcmFtcy5lbWl0RXZlbnQgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghKHRoaXMuZ2V0UXVlcnkoKS5nZXRWYWx1ZSgpIGFzIEFraXRhRm9ybVByb3A8VD4pW3RoaXMucGFyYW1zLmZvcm1LZXldKSB7XG4gICAgICAgIGxvZ0FjdGlvbignQFBlcnNpc3ROZ0Zvcm1QbHVnaW4gYWN0aXZhdGUnKTtcbiAgICAgICAgdGhpcy51cGRhdGVTdG9yZSh7IFt0aGlzLnBhcmFtcy5mb3JtS2V5XTogKHRoaXMgYXMgYW55KS5mYWN0b3J5Rm5PclBhdGgoKSB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldFF1ZXJ5KCkuZ2V0VmFsdWUoKVt0aGlzLnBhcmFtcy5mb3JtS2V5XTtcbiAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHZhbHVlKTtcbiAgICB9XG5cbiAgICB0aGlzLmZvcm1DaGFuZ2VzID0gdGhpcy5mb3JtLnZhbHVlQ2hhbmdlcy5waXBlKGRlYm91bmNlVGltZSh0aGlzLnBhcmFtcy5kZWJvdW5jZVRpbWUpKS5zdWJzY3JpYmUodmFsdWUgPT4ge1xuICAgICAgbG9nQWN0aW9uKCdAUGVyc2lzdEZvcm0gLSBVcGRhdGUnKTtcbiAgICAgIGxldCBuZXdTdGF0ZTtcbiAgICAgIGlmICh0aGlzLmlzS2V5QmFzZWQpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNSb290S2V5cykge1xuICAgICAgICAgIG5ld1N0YXRlID0gc3RhdGUgPT4gKHsgLi4uc3RhdGUsIC4uLnZhbHVlIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld1N0YXRlID0gc3RhdGUgPT4gc2V0VmFsdWUoc3RhdGUsIHBhdGgsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3U3RhdGUgPSAoKSA9PiAoeyBbdGhpcy5wYXJhbXMuZm9ybUtleV06IHZhbHVlIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy51cGRhdGVTdG9yZShuZXdTdGF0ZSh0aGlzLmdldFF1ZXJ5KCkuZ2V0VmFsdWUoKSkpO1xuICAgIH0pO1xuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLmZvcm1DaGFuZ2VzICYmIHRoaXMuZm9ybUNoYW5nZXMudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmZvcm0gPSBudWxsO1xuICAgIHRoaXMuYnVpbGRlciA9IG51bGw7XG4gIH1cbn1cbiJdfQ==