@ng-flexy/form
Version:
Flexy components and tools to build Angular 8+ applications
113 lines • 16.5 kB
JavaScript
import { FlexyLayout } from '@ng-flexy/layout';
import { cloneDeep, merge } from 'lodash';
import { BehaviorSubject } from 'rxjs';
import { HIDDEN_CALC_GROUP_NAME } from '../services/json-mapper.utils';
import { calculate, clearEmptyArrayAndObjects, findErrors, findRemoved, findSchema, FlexyFormDataMode, getSchemaData } from './form.utils';
export class FlexyForm extends FlexyLayout {
constructor(formGroup, schema, data) {
super(schema);
this.isStarted = false;
this._calculatedRefs = {};
this._currentDataSubject = new BehaviorSubject(data);
this.currentData$ = this._currentDataSubject.asObservable();
this.formGroup = formGroup;
this.schema = schema;
this._initCalculatedRefs(schema);
this._originalData = cloneDeep(data);
this._setCurrentData();
// refresh attributes
this._setCurrentData();
// jump to next tick
// setTimeout(() => {
this._subscribeChangesAndCalculate();
// });
}
get valid() {
return !this.getAllErrors();
}
getAllData() {
const data = cloneDeep(getSchemaData(this.schema, this.currentData));
this._clearHiddenData(data);
return data;
}
// @deprecated
getDirtyData() {
const data = cloneDeep(getSchemaData(this.schema, this.currentData, FlexyFormDataMode.Dirty));
this._clearHiddenData(data);
clearEmptyArrayAndObjects(data);
const allData = this.getAllData();
const removed = findRemoved(allData, this._originalData);
clearEmptyArrayAndObjects(removed);
return merge(data, removed);
}
getAllErrors() {
return this._lastErrors;
}
containsFieldSchema(fieldName) {
return !!findSchema(fieldName, this.schema);
}
getFieldSchema(fieldName) {
return findSchema(fieldName, this.schema);
}
getFieldInstance(fieldName) {
const schema = findSchema(fieldName, this.schema);
if (schema && schema.componentRef) {
return schema.componentRef.instance;
}
return null;
}
_subscribeChangesAndCalculate() {
this._setCurrentData();
this.isStarted = true;
// this._setCurrentData();
this._changesSubscription = this.formGroup.valueChanges.subscribe(data => {
const hash = this.currentDataHash;
this._setCurrentData();
if (hash !== this.currentDataHash) {
this._currentDataSubject.next(this.currentData);
}
});
this._currentDataSubject.next(this.currentData);
}
_setCurrentData() {
this.currentData = getSchemaData(this.schema, this.currentData);
this.currentDataHash = JSON.stringify(this.currentData);
this._calculate();
this.currentData = getSchemaData(this.schema, this.currentData);
this.currentDataHash = JSON.stringify(this.currentData);
const errors = findErrors(this.schema, this.currentData);
this._lastErrors = errors && Object.keys(errors).length ? errors : null;
}
_initCalculatedRefs(schema) {
if (schema) {
schema.forEach((schemaItem) => {
if (schemaItem.formName && schemaItem.formControl && schemaItem.calc) {
this._calculatedRefs[schemaItem.formName] = {
calc: schemaItem.calc,
control: schemaItem.formControl
};
}
if (schemaItem.children) {
this._initCalculatedRefs(schemaItem.children);
}
});
}
}
_calculate() {
if (this._calculatedRefs) {
Object.values(this._calculatedRefs).forEach(calc => {
const value = calculate(calc.calc, this.currentData);
if (value !== calc.control.value) {
calc.control.setValue(value);
calc.control.markAsDirty();
}
});
}
}
_clearHiddenData(data) {
if (data[HIDDEN_CALC_GROUP_NAME]) {
delete data[HIDDEN_CALC_GROUP_NAME];
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Zvcm0vc3JjL2xpYi9tb2RlbHMvZm9ybS5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFHL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDMUMsT0FBTyxFQUFFLGVBQWUsRUFBNEIsTUFBTSxNQUFNLENBQUM7QUFDakUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDdkUsT0FBTyxFQUFFLFNBQVMsRUFBRSx5QkFBeUIsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFnQjNJLE1BQU0sT0FBTyxTQUFVLFNBQVEsV0FBVztJQXlCeEMsWUFBWSxTQUFvQixFQUFFLE1BQStCLEVBQUUsSUFBbUI7UUFDcEYsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBaEJoQixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBU2xCLG9CQUFlLEdBQWEsRUFBRSxDQUFDO1FBUzdCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUU1RCxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUVyQixJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLGVBQWUsRUFB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QUN4QixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ2pELE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDckQsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUU7b0JBQ2hDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUM3QixJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO2lCQUM1QjtZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsSUFBSTtRQUMzQixJQUFJLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFO1lBQ2hDLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7U0FDckM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRmxleHlMYXlvdXQgfSBmcm9tICdAbmctZmxleHkvbGF5b3V0JztcbmltcG9ydCB7IEZsZXh5Rm9ybUZpZWxkTGF5b3V0U2NoZW1hLCBGbGV4eUZvcm1MYXlvdXRTY2hlbWEgfSBmcm9tICcuL2xheW91dC1zY2hlbWEubW9kZWwnO1xuaW1wb3J0IHsgRmxleHlGb3JtRGF0YSB9IGZyb20gJy4vZm9ybS5kYXRhJztcbmltcG9ydCB7IGNsb25lRGVlcCwgbWVyZ2UgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEhJRERFTl9DQUxDX0dST1VQX05BTUUgfSBmcm9tICcuLi9zZXJ2aWNlcy9qc29uLW1hcHBlci51dGlscyc7XG5pbXBvcnQgeyBjYWxjdWxhdGUsIGNsZWFyRW1wdHlBcnJheUFuZE9iamVjdHMsIGZpbmRFcnJvcnMsIGZpbmRSZW1vdmVkLCBmaW5kU2NoZW1hLCBGbGV4eUZvcm1EYXRhTW9kZSwgZ2V0U2NoZW1hRGF0YSB9IGZyb20gJy4vZm9ybS51dGlscyc7XG5cbmludGVyZmFjZSBDYWxjUmVmcyB7XG4gIFtuYW1lOiBzdHJpbmddOiB7XG4gICAgY2FsYzogc3RyaW5nO1xuICAgIGNvbnRyb2w6IEZvcm1Db250cm9sO1xuICAgIGlmQ29udHJvbD86IEZvcm1Hcm91cDtcbiAgfTtcbn1cblxuaW50ZXJmYWNlIElmUmVmcyB7XG4gIGlmOiBzdHJpbmc7XG4gIHN0YXRlOiBib29sZWFuO1xuICBpZkNvbnRyb2w/OiBGb3JtR3JvdXA7XG59XG5cbmV4cG9ydCBjbGFzcyBGbGV4eUZvcm0gZXh0ZW5kcyBGbGV4eUxheW91dCB7XG4gIGN1cnJlbnREYXRhOiBGbGV4eUZvcm1EYXRhO1xuICBjdXJyZW50RGF0YUhhc2g6IHN0cmluZztcblxuICByZWFkb25seSBjdXJyZW50RGF0YSQ6IE9ic2VydmFibGU8RmxleHlGb3JtRGF0YT47XG5cbiAgZ2V0IHZhbGlkKCkge1xuICAgIHJldHVybiAhdGhpcy5nZXRBbGxFcnJvcnMoKTtcbiAgfVxuXG4gIGlzU3RhcnRlZCA9IGZhbHNlO1xuXG4gIC8vIFRPRE8gdG8gdGhpbmsgY2hhbmdlIHRvIHByaXZhdGVcbiAgcmVhZG9ubHkgc2NoZW1hOiBGbGV4eUZvcm1MYXlvdXRTY2hlbWFbXTtcbiAgcmVhZG9ubHkgZm9ybUdyb3VwOiBGb3JtR3JvdXA7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb3JpZ2luYWxEYXRhOiBGbGV4eUZvcm1EYXRhO1xuICBwcml2YXRlIHJlYWRvbmx5IF9jdXJyZW50RGF0YVN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxGbGV4eUZvcm1EYXRhPjtcblxuICBfY2FsY3VsYXRlZFJlZnM6IENhbGNSZWZzID0ge307XG5cbiAgX2xhc3RFcnJvcnM6IHsgW2tleTogc3RyaW5nXTogYW55IH07XG5cbiAgcHJpdmF0ZSBfY2hhbmdlc1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKGZvcm1Hcm91cDogRm9ybUdyb3VwLCBzY2hlbWE6IEZsZXh5Rm9ybUxheW91dFNjaGVtYVtdLCBkYXRhOiBGbGV4eUZvcm1EYXRhKSB7XG4gICAgc3VwZXIoc2NoZW1hKTtcblxuICAgIHRoaXMuX2N1cnJlbnREYXRhU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZGF0YSk7XG4gICAgdGhpcy5jdXJyZW50RGF0YSQgPSB0aGlzLl9jdXJyZW50RGF0YVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgICB0aGlzLmZvcm1Hcm91cCA9IGZvcm1Hcm91cDtcbiAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTtcblxuICAgIHRoaXMuX2luaXRDYWxjdWxhdGVkUmVmcyhzY2hlbWEpO1xuICAgIHRoaXMuX29yaWdpbmFsRGF0YSA9IGNsb25lRGVlcChkYXRhKTtcbiAgICB0aGlzLl9zZXRDdXJyZW50RGF0YSgpO1xuICAgIC8vIHJlZnJlc2ggYXR0cmlidXRlc1xuICAgIHRoaXMuX3NldEN1cnJlbnREYXRhKCk7XG5cbiAgICAvLyBqdW1wIHRvIG5leHQgdGlja1xuICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIHRoaXMuX3N1YnNjcmliZUNoYW5nZXNBbmRDYWxjdWxhdGUoKTtcbiAgICAvLyB9KTtcbiAgfVxuXG4gIGdldEFsbERhdGEoKTogRmxleHlGb3JtRGF0YSB7XG4gICAgY29uc3QgZGF0YSA9IGNsb25lRGVlcChnZXRTY2hlbWFEYXRhKHRoaXMuc2NoZW1hLCB0aGlzLmN1cnJlbnREYXRhKSk7XG4gICAgdGhpcy5fY2xlYXJIaWRkZW5EYXRhKGRhdGEpO1xuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgLy8gQGRlcHJlY2F0ZWRcbiAgZ2V0RGlydHlEYXRhKCk6IEZsZXh5Rm9ybURhdGEge1xuICAgIGNvbnN0IGRhdGEgPSBjbG9uZURlZXAoZ2V0U2NoZW1hRGF0YSh0aGlzLnNjaGVtYSwgdGhpcy5jdXJyZW50RGF0YSwgRmxleHlGb3JtRGF0YU1vZGUuRGlydHkpKTtcbiAgICB0aGlzLl9jbGVhckhpZGRlbkRhdGEoZGF0YSk7XG4gICAgY2xlYXJFbXB0eUFycmF5QW5kT2JqZWN0cyhkYXRhKTtcbiAgICBjb25zdCBhbGxEYXRhID0gdGhpcy5nZXRBbGxEYXRhKCk7XG4gICAgY29uc3QgcmVtb3ZlZCA9IGZpbmRSZW1vdmVkKGFsbERhdGEsIHRoaXMuX29yaWdpbmFsRGF0YSk7XG4gICAgY2xlYXJFbXB0eUFycmF5QW5kT2JqZWN0cyhyZW1vdmVkKTtcbiAgICByZXR1cm4gbWVyZ2UoZGF0YSwgcmVtb3ZlZCk7XG4gIH1cblxuICBnZXRBbGxFcnJvcnMoKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB7XG4gICAgcmV0dXJuIHRoaXMuX2xhc3RFcnJvcnM7XG4gIH1cblxuICBjb250YWluc0ZpZWxkU2NoZW1hKGZpZWxkTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhZmluZFNjaGVtYShmaWVsZE5hbWUsIHRoaXMuc2NoZW1hKTtcbiAgfVxuICBnZXRGaWVsZFNjaGVtYShmaWVsZE5hbWU6IHN0cmluZyk6IEZsZXh5Rm9ybUZpZWxkTGF5b3V0U2NoZW1hIHtcbiAgICByZXR1cm4gZmluZFNjaGVtYShmaWVsZE5hbWUsIHRoaXMuc2NoZW1hKTtcbiAgfVxuICBnZXRGaWVsZEluc3RhbmNlPFQ+KGZpZWxkTmFtZTogc3RyaW5nKTogVCB7XG4gICAgY29uc3Qgc2NoZW1hOiBGbGV4eUZvcm1GaWVsZExheW91dFNjaGVtYSA9IGZpbmRTY2hlbWEoZmllbGROYW1lLCB0aGlzLnNjaGVtYSk7XG4gICAgaWYgKHNjaGVtYSAmJiBzY2hlbWEuY29tcG9uZW50UmVmKSB7XG4gICAgICByZXR1cm4gc2NoZW1hLmNvbXBvbmVudFJlZi5pbnN0YW5jZTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIF9zdWJzY3JpYmVDaGFuZ2VzQW5kQ2FsY3VsYXRlKCkge1xuICAgIHRoaXMuX3NldEN1cnJlbnREYXRhKCk7XG4gICAgdGhpcy5pc1N0YXJ0ZWQgPSB0cnVlO1xuICAgIC8vIHRoaXMuX3NldEN1cnJlbnREYXRhKCk7XG4gICAgdGhpcy5fY2hhbmdlc1N1YnNjcmlwdGlvbiA9IHRoaXMuZm9ybUdyb3VwLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICBjb25zdCBoYXNoID0gdGhpcy5jdXJyZW50RGF0YUhhc2g7XG4gICAgICB0aGlzLl9zZXRDdXJyZW50RGF0YSgpO1xuICAgICAgaWYgKGhhc2ggIT09IHRoaXMuY3VycmVudERhdGFIYXNoKSB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnREYXRhU3ViamVjdC5uZXh0KHRoaXMuY3VycmVudERhdGEpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuX2N1cnJlbnREYXRhU3ViamVjdC5uZXh0KHRoaXMuY3VycmVudERhdGEpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0Q3VycmVudERhdGEoKSB7XG4gICAgdGhpcy5jdXJyZW50RGF0YSA9IGdldFNjaGVtYURhdGEodGhpcy5zY2hlbWEsIHRoaXMuY3VycmVudERhdGEpO1xuICAgIHRoaXMuY3VycmVudERhdGFIYXNoID0gSlNPTi5zdHJpbmdpZnkodGhpcy5jdXJyZW50RGF0YSk7XG4gICAgdGhpcy5fY2FsY3VsYXRlKCk7XG4gICAgdGhpcy5jdXJyZW50RGF0YSA9IGdldFNjaGVtYURhdGEodGhpcy5zY2hlbWEsIHRoaXMuY3VycmVudERhdGEpO1xuICAgIHRoaXMuY3VycmVudERhdGFIYXNoID0gSlNPTi5zdHJpbmdpZnkodGhpcy5jdXJyZW50RGF0YSk7XG4gICAgY29uc3QgZXJyb3JzID0gZmluZEVycm9ycyh0aGlzLnNjaGVtYSwgdGhpcy5jdXJyZW50RGF0YSk7XG4gICAgdGhpcy5fbGFzdEVycm9ycyA9IGVycm9ycyAmJiBPYmplY3Qua2V5cyhlcnJvcnMpLmxlbmd0aCA/IGVycm9ycyA6IG51bGw7XG4gIH1cblxuICBwcml2YXRlIF9pbml0Q2FsY3VsYXRlZFJlZnMoc2NoZW1hOiBGbGV4eUZvcm1MYXlvdXRTY2hlbWFbXSkge1xuICAgIGlmIChzY2hlbWEpIHtcbiAgICAgIHNjaGVtYS5mb3JFYWNoKChzY2hlbWFJdGVtOiBGbGV4eUZvcm1GaWVsZExheW91dFNjaGVtYSkgPT4ge1xuICAgICAgICBpZiAoc2NoZW1hSXRlbS5mb3JtTmFtZSAmJiBzY2hlbWFJdGVtLmZvcm1Db250cm9sICYmIHNjaGVtYUl0ZW0uY2FsYykge1xuICAgICAgICAgIHRoaXMuX2NhbGN1bGF0ZWRSZWZzW3NjaGVtYUl0ZW0uZm9ybU5hbWVdID0ge1xuICAgICAgICAgICAgY2FsYzogc2NoZW1hSXRlbS5jYWxjLFxuICAgICAgICAgICAgY29udHJvbDogc2NoZW1hSXRlbS5mb3JtQ29udHJvbCBhcyBGb3JtQ29udHJvbFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNjaGVtYUl0ZW0uY2hpbGRyZW4pIHtcbiAgICAgICAgICB0aGlzLl9pbml0Q2FsY3VsYXRlZFJlZnMoc2NoZW1hSXRlbS5jaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2NhbGN1bGF0ZSgpIHtcbiAgICBpZiAodGhpcy5fY2FsY3VsYXRlZFJlZnMpIHtcbiAgICAgIE9iamVjdC52YWx1ZXModGhpcy5fY2FsY3VsYXRlZFJlZnMpLmZvckVhY2goY2FsYyA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gY2FsY3VsYXRlKGNhbGMuY2FsYywgdGhpcy5jdXJyZW50RGF0YSk7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gY2FsYy5jb250cm9sLnZhbHVlKSB7XG4gICAgICAgICAgY2FsYy5jb250cm9sLnNldFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICBjYWxjLmNvbnRyb2wubWFya0FzRGlydHkoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfY2xlYXJIaWRkZW5EYXRhKGRhdGEpIHtcbiAgICBpZiAoZGF0YVtISURERU5fQ0FMQ19HUk9VUF9OQU1FXSkge1xuICAgICAgZGVsZXRlIGRhdGFbSElEREVOX0NBTENfR1JPVVBfTkFNRV07XG4gICAgfVxuICB9XG59XG4iXX0=