mirror of https://github.com/Squidex/squidex.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
2.5 KiB
85 lines
2.5 KiB
/*
|
|
* Squidex Headless CMS
|
|
*
|
|
* @license
|
|
* Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved.
|
|
*/
|
|
|
|
import { AbstractControl, AbstractControlOptions, AsyncValidatorFn, FormGroup, ValidatorFn } from '@angular/forms';
|
|
import { Types } from '@app/framework/internal';
|
|
|
|
export class ExtendedFormGroup extends FormGroup {
|
|
constructor(controls: { [key: string]: AbstractControl }, validatorOrOpts?: ValidatorFn | ValidatorFn[] | AbstractControlOptions | null, asyncValidator?: AsyncValidatorFn | AsyncValidatorFn[] | null) {
|
|
super(controls, validatorOrOpts, asyncValidator);
|
|
|
|
this['_reduceValue'] = () => {
|
|
const result = {};
|
|
|
|
for (const [key, control] of Object.entries(this.controls)) {
|
|
result[key] = control.value;
|
|
}
|
|
|
|
return result;
|
|
};
|
|
|
|
this['_updateValue'] = () => {
|
|
(this as { value: any }).value = this['_reduceValue']();
|
|
};
|
|
}
|
|
}
|
|
|
|
export class UndefinableFormGroup extends ExtendedFormGroup {
|
|
private isUndefined = false;
|
|
|
|
constructor(controls: { [key: string]: AbstractControl }, validatorOrOpts?: ValidatorFn | ValidatorFn[] | AbstractControlOptions | null, asyncValidator?: AsyncValidatorFn | AsyncValidatorFn[] | null) {
|
|
super(controls, validatorOrOpts, asyncValidator);
|
|
|
|
const reduce = this['_reduceValue'];
|
|
|
|
this['_reduceValue'] = () => {
|
|
if (this.isUndefined) {
|
|
return undefined;
|
|
} else {
|
|
return reduce.apply(this);
|
|
}
|
|
};
|
|
}
|
|
|
|
public getRawValue() {
|
|
if (this.isUndefined) {
|
|
return undefined as any;
|
|
} else {
|
|
return super.getRawValue();
|
|
}
|
|
}
|
|
|
|
public setValue(value?: {}, options?: { onlySelf?: boolean; emitEvent?: boolean }) {
|
|
this.checkUndefined(value);
|
|
|
|
if (this.isUndefined) {
|
|
super.reset({}, options);
|
|
} else {
|
|
super.setValue(value!, options);
|
|
}
|
|
}
|
|
|
|
public patchValue(value?: {}, options?: { onlySelf?: boolean; emitEvent?: boolean }) {
|
|
this.checkUndefined(value);
|
|
|
|
if (this.isUndefined) {
|
|
super.reset({}, options);
|
|
} else {
|
|
super.patchValue(value!, options);
|
|
}
|
|
}
|
|
|
|
public reset(value?: {}, options: { onlySelf?: boolean; emitEvent?: boolean } = {}) {
|
|
this.checkUndefined(value);
|
|
|
|
super.reset(value || {}, options);
|
|
}
|
|
|
|
private checkUndefined(value?: {}) {
|
|
this.isUndefined = Types.isUndefined(value);
|
|
}
|
|
}
|
|
|