@datorama/akita
Version:
State Management Tailored-Made for JS Applications
248 lines • 21.6 kB
JavaScript
/**
* @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==