-
+
diff --git a/frontend/app/framework/angular/forms/editors/dropdown.component.ts b/frontend/app/framework/angular/forms/editors/dropdown.component.ts
index 5382b164a..fd32c8b8c 100644
--- a/frontend/app/framework/angular/forms/editors/dropdown.component.ts
+++ b/frontend/app/framework/angular/forms/editors/dropdown.component.ts
@@ -34,6 +34,8 @@ interface State {
query?: RegExp;
}
+const NO_EMIT = { emitEvent: false };
+
@Component({
selector: 'sqx-dropdown',
styleUrls: ['./dropdown.component.scss'],
@@ -134,6 +136,16 @@ export class DropdownComponent extends StatefulControlComponent ({ ...s, selectedIndex, selectedItem: value }));
}
-
}
}
\ No newline at end of file
diff --git a/frontend/app/framework/angular/forms/editors/tag-editor.component.ts b/frontend/app/framework/angular/forms/editors/tag-editor.component.ts
index f373a0b18..0a12cfb86 100644
--- a/frontend/app/framework/angular/forms/editors/tag-editor.component.ts
+++ b/frontend/app/framework/angular/forms/editors/tag-editor.component.ts
@@ -139,6 +139,8 @@ interface State {
items: ReadonlyArray;
}
+const NO_EMIT = { emitEvent: false };
+
@Component({
selector: 'sqx-tag-editor',
styleUrls: ['./tag-editor.component.scss'],
@@ -302,9 +304,9 @@ export class TagEditorComponent extends StatefulControlComponent {
+ describe('value$', () => {
+ it('should provide change values', () => {
+ const form = new FormControl('1', Validators.required);
+
+ const values: any[] = [];
+
+ value$(form).subscribe(x => {
+ values.push(x);
+ });
+
+ form.setValue('2');
+ form.setValue('3');
+
+ expect(values).toEqual(['1', '2', '3']);
+ });
+
+ it('should not trigger on disable', () => {
+ const form = new FormControl('1', Validators.required);
+
+ const values: any[] = [];
+
+ value$(form).subscribe(x => {
+ values.push(x);
+ });
+
+ form.setValue('2');
+ form.enable();
+ form.setValue('3');
+ form.disable();
+
+ expect(values).toEqual(['1', '2', '3']);
+ });
+ });
+});
\ No newline at end of file
diff --git a/frontend/app/framework/angular/forms/forms-helper.ts b/frontend/app/framework/angular/forms/forms-helper.ts
index fb752c147..b431fc0ee 100644
--- a/frontend/app/framework/angular/forms/forms-helper.ts
+++ b/frontend/app/framework/angular/forms/forms-helper.ts
@@ -7,7 +7,7 @@
import { AbstractControl, FormArray, FormGroup } from '@angular/forms';
import { Observable } from 'rxjs';
-import { distinctUntilChanged, map, startWith } from 'rxjs/operators';
+import { distinctUntilChanged, filter, map, startWith } from 'rxjs/operators';
import { Types } from './../../utils/types';
@@ -26,7 +26,7 @@ export function invalid$(form: AbstractControl): Observable {
}
export function value$(form: AbstractControl): Observable {
- return form.valueChanges.pipe(startWith(form.value));
+ return form.valueChanges.pipe(startWith(form.value), filter(_ => form.enabled), distinctUntilChanged());
}
export function hasValue$(form: AbstractControl): Observable {
diff --git a/frontend/app/shared/components/forms/references-dropdown.component.ts b/frontend/app/shared/components/forms/references-dropdown.component.ts
index 60d6a9122..524bc216d 100644
--- a/frontend/app/shared/components/forms/references-dropdown.component.ts
+++ b/frontend/app/shared/components/forms/references-dropdown.component.ts
@@ -16,7 +16,8 @@ import {
LanguageDto,
StatefulControlComponent,
Types,
- UIOptions
+ UIOptions,
+ value$
} from '@app/shared/internal';
export const SQX_REFERENCES_DROPDOWN_CONTROL_VALUE_ACCESSOR: any = {
@@ -83,7 +84,7 @@ export class ReferencesDropdownComponent extends StatefulControlComponent {
if (value && value.id) {
this.callTouched();
@@ -119,19 +120,19 @@ export class ReferencesDropdownComponent extends StatefulControlComponent {
- this.selectionControl.disable();
+ this.selectionControl.disable(NO_EMIT);
});
} else {
- this.selectionControl.disable();
+ this.selectionControl.disable(NO_EMIT);
}
}
}
public setDisabledState(isDisabled: boolean) {
if (isDisabled) {
- this.selectionControl.disable();
+ this.selectionControl.disable(NO_EMIT);
} else if (this.isValid) {
- this.selectionControl.enable();
+ this.selectionControl.enable(NO_EMIT);
}
super.setDisabledState(isDisabled);
diff --git a/frontend/app/shared/components/forms/references-tags.component.ts b/frontend/app/shared/components/forms/references-tags.component.ts
index 8bab938a4..c3cdf5afc 100644
--- a/frontend/app/shared/components/forms/references-tags.component.ts
+++ b/frontend/app/shared/components/forms/references-tags.component.ts
@@ -24,8 +24,6 @@ export const SQX_REFERENCES_TAGS_CONTROL_VALUE_ACCESSOR: any = {
provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ReferencesTagsComponent), multi: true
};
-const NO_EMIT = { emitEvent: false };
-
class TagsConverter implements Converter {
public suggestions: ReadonlyArray = [];
@@ -70,6 +68,8 @@ interface State {
converter: TagsConverter;
}
+const NO_EMIT = { emitEvent: false };
+
@Component({
selector: 'sqx-references-tags',
styleUrls: ['./references-tags.component.scss'],
@@ -141,9 +141,9 @@ export class ReferencesTagsComponent extends StatefulControlComponent 0) {
converter = new TagsConverter(this.language, this.contentItems);
- this.selectionControl.enable();
+ this.selectionControl.enable(NO_EMIT);
} else {
converter = new TagsConverter(null!, []);
- this.selectionControl.disable();
+ this.selectionControl.disable(NO_EMIT);
}
this.next({ converter });
diff --git a/frontend/app/shared/state/contents.forms.ts b/frontend/app/shared/state/contents.forms.ts
index 20995de45..a698e2902 100644
--- a/frontend/app/shared/state/contents.forms.ts
+++ b/frontend/app/shared/state/contents.forms.ts
@@ -15,7 +15,8 @@ import {
Form,
formControls,
Types,
- ValidatorsEx
+ ValidatorsEx,
+ value$
} from '@app/framework';
import { AppLanguageDto } from './../services/app-languages.service';
@@ -468,7 +469,7 @@ export class EditContentForm extends Form {
) {
super(new FormGroup({}));
- this.form.valueChanges.subscribe(value => {
+ value$(this.form).subscribe(value => {
this.value.next(value);
});