From dfbf08e3a892ce723612dab38f325cfc4a3c685d Mon Sep 17 00:00:00 2001 From: Bartosz Sekula Date: Mon, 30 Sep 2024 14:13:32 -0400 Subject: [PATCH] AAE-24992 Form rules for fields (#10245) * AAE-24992 Add an ability to call a process on a form event * extract filter events * tmp * add unit --- .../src/lib/form/services/form.service.ts | 3 +++ .../dropdown/dropdown-cloud.widget.spec.ts | 19 ++++++++++++++++ .../widgets/dropdown/dropdown-cloud.widget.ts | 22 ++++++++++++++----- 3 files changed, 38 insertions(+), 6 deletions(-) diff --git a/lib/core/src/lib/form/services/form.service.ts b/lib/core/src/lib/form/services/form.service.ts index d3bbc5c4c2..5e4bf9c49f 100644 --- a/lib/core/src/lib/form/services/form.service.ts +++ b/lib/core/src/lib/form/services/form.service.ts @@ -30,6 +30,7 @@ import { ValidateFormFieldEvent } from '../events/validate-form-field.event'; import { FormValidationService } from './form-validation-service.interface'; import { FormRulesEvent } from '../events/form-rules.event'; import { FormSpinnerEvent } from '../events'; +import { FormFieldModel } from '../components/widgets'; @Injectable({ providedIn: 'root' @@ -46,6 +47,8 @@ export class FormService implements FormValidationService { formContentClicked = new Subject(); toggleFormSpinner = new Subject(); + onFormVariableChanged = new Subject<{ field: FormFieldModel; data?: any }>(); + validateForm = new Subject(); validateFormField = new Subject(); validateDynamicTableRow = new Subject(); diff --git a/lib/process-services-cloud/src/lib/form/components/widgets/dropdown/dropdown-cloud.widget.spec.ts b/lib/process-services-cloud/src/lib/form/components/widgets/dropdown/dropdown-cloud.widget.spec.ts index 7f1718491d..1f76645c0b 100644 --- a/lib/process-services-cloud/src/lib/form/components/widgets/dropdown/dropdown-cloud.widget.spec.ts +++ b/lib/process-services-cloud/src/lib/form/components/widgets/dropdown/dropdown-cloud.widget.spec.ts @@ -1056,5 +1056,24 @@ describe('DropdownCloudWidgetComponent', () => { const failedErrorMsgElement = fixture.debugElement.query(By.css('.adf-dropdown-failed-message')); expect(failedErrorMsgElement).toBeNull(); }); + + it('should update options when form variable changes', async () => { + const field = getVariableDropdownWidget('json-form-variable', 'countries', 'id', 'name', undefined, mockFormVariableWithJson); + + widget.field = field; + fixture.detectChanges(); + + field.form.variables[0]['value']['countries'] = [{ id: 'NEW', name: 'New Country' }]; + + formService.onFormVariableChanged.next({ field }); + + const dropdown = await loader.getHarness(MatSelectHarness.with({ selector: '.adf-select' })); + await dropdown.open(); + + expect(widget.field.options.length).toEqual(1); + const allOptions = await dropdown.getOptions(); + expect(await allOptions[0].getText()).toEqual('New Country'); + expect(allOptions.length).toEqual(1); + }); }); }); diff --git a/lib/process-services-cloud/src/lib/form/components/widgets/dropdown/dropdown-cloud.widget.ts b/lib/process-services-cloud/src/lib/form/components/widgets/dropdown/dropdown-cloud.widget.ts index 4aa36f6e53..018ee94176 100644 --- a/lib/process-services-cloud/src/lib/form/components/widgets/dropdown/dropdown-cloud.widget.ts +++ b/lib/process-services-cloud/src/lib/form/components/widgets/dropdown/dropdown-cloud.widget.ts @@ -124,13 +124,13 @@ export class DropdownCloudWidgetComponent extends WidgetComponent implements OnI } ngOnInit() { - this.setPreviewState(); + this.setupDropdown(); - this.checkFieldOptionsSource(); - this.updateOptions(); - - this.initFormControl(); - this.initFilter(); + this.formService.onFormVariableChanged.subscribe(({ field }) => { + if (field.id === this.field.id) { + this.setupDropdown(); + } + }); } ngOnDestroy() { @@ -164,6 +164,16 @@ export class DropdownCloudWidgetComponent extends WidgetComponent implements OnI this.onFieldChanged(field); } + private setupDropdown(): void { + this.setPreviewState(); + + this.checkFieldOptionsSource(); + this.updateOptions(); + + this.initFormControl(); + this.initFilter(); + } + private initFormControl(): void { if (this.field?.required) { this.dropdownControl.addValidators([Validators.required]);