[AAE-612] Support for Form Outcome Visibility Conditions (#5934)

This commit is contained in:
davidcanonieto
2020-07-30 17:05:10 +01:00
committed by GitHub
parent 0afbe36787
commit 1e692252a5
8 changed files with 101 additions and 12 deletions

View File

@@ -23,11 +23,30 @@ describe('FormOutcomeModel', () => {
it('should setup with json config', () => {
const json = {
id: '<id>',
name: '<name>'
name: '<name>',
visibilityCondition: {
leftType: 'field',
leftValue: 'TextOne',
operator: '==',
rightValue: 'showTab',
rightType: 'value',
nextConditionOperator: '',
nextCondition: null
}
};
const model = new FormOutcomeModel(null, json);
expect(model.id).toBe(json.id);
expect(model.name).toBe(json.name);
expect(model.visibilityCondition).toBeDefined();
});
it('should not setup with null json config', () => {
const model = new FormOutcomeModel(null, null);
expect(model.id).toBeUndefined();
expect(model.name).toBeUndefined();
expect(model.isVisible).toBeDefined();
expect(model.isVisible).toBe(true);
expect(model.visibilityCondition).toBeUndefined();
});
it('should store the form reference', () => {

View File

@@ -19,6 +19,7 @@
import { FormWidgetModel } from './form-widget.model';
import { FormModel } from './form.model';
import { WidgetVisibilityModel } from './../../../models/widget-visibility.model';
export class FormOutcomeModel extends FormWidgetModel {
@@ -28,6 +29,8 @@ export class FormOutcomeModel extends FormWidgetModel {
isSystem: boolean = false;
isSelected: boolean = false;
isVisible: boolean = true;
visibilityCondition: WidgetVisibilityModel;
constructor(form: FormModel, json?: any) {
super(form, json);
@@ -35,6 +38,7 @@ export class FormOutcomeModel extends FormWidgetModel {
if (json) {
this.isSystem = json.isSystem ? true : false;
this.isSelected = form && json.name === form.selectedOutcome ? true : false;
this.visibilityCondition = new WidgetVisibilityModel(json.visibilityCondition);
}
}
}

View File

@@ -35,7 +35,7 @@ describe('TabModel', () => {
expect(model.isVisible).toBe(true);
});
it('should not setup with json config', () => {
it('should not setup with null json config', () => {
const model = new TabModel(null, null);
expect(model.id).toBeUndefined();
expect(model.title).toBeUndefined();

View File

@@ -21,7 +21,8 @@ import {
FormFieldModel,
FormFieldTypes,
FormModel,
TabModel
TabModel,
FormOutcomeModel
} from './../components/widgets/core/index';
import { TaskProcessVariableModel } from './../models/task-process-variable.model';
import { WidgetVisibilityModel, WidgetTypeEnum } from './../models/widget-visibility.model';
@@ -31,7 +32,7 @@ import {
fakeFormJson, fakeTaskProcessVariableModels,
formTest, formValues, complexVisibilityJsonVisible,
nextConditionForm, complexVisibilityJsonNotVisible,
headerVisibilityCond } from 'core/mock/form/widget-visibility-cloud.service.mock';
headerVisibilityCond } from '../../mock/form/widget-visibility-cloud.service.mock';
import { CoreTestingModule } from '../../testing/core.testing.module';
import { TranslateModule } from '@ngx-translate/core';
@@ -672,6 +673,24 @@ describe('WidgetVisibilityCloudService', () => {
expect(fakeFormWithField.tabs[0].isVisible).toBeFalsy();
});
it('should refresh the visibility for Outcomes in forms', () => {
visibilityObjTest.leftType = WidgetTypeEnum.field;
visibilityObjTest.leftValue = 'FIELD_TEST';
visibilityObjTest.operator = '!=';
visibilityObjTest.rightValue = 'RIGHT_FORM_FIELD_VALUE';
const outcome = new FormOutcomeModel(fakeFormWithField, {
isSystem: false,
isSelected: false,
isVisible: true
});
outcome.visibilityCondition = visibilityObjTest;
fakeFormWithField.outcomes.push(outcome);
service.refreshVisibility(fakeFormWithField);
const outcomeIndex = fakeFormWithField.outcomes.length - 1;
expect(fakeFormWithField.outcomes[outcomeIndex].isVisible).toBeFalsy();
});
it('should use the form value to evaluate the visibility condition if the form value is defined', (done) => {
service.getTaskProcessVariable('9999').subscribe(
(res: TaskProcessVariableModel[]) => {

View File

@@ -20,7 +20,7 @@ import { LogService } from '../../services/log.service';
import { Injectable } from '@angular/core';
import moment from 'moment-es6';
import { Observable, from, throwError } from 'rxjs';
import { FormFieldModel, FormModel, TabModel, ContainerModel } from '../components/widgets/core/index';
import { FormFieldModel, FormModel, TabModel, ContainerModel, FormOutcomeModel } from '../components/widgets/core/index';
import { TaskProcessVariableModel } from '../models/task-process-variable.model';
import { WidgetVisibilityModel, WidgetTypeEnum } from '../models/widget-visibility.model';
import { map, catchError } from 'rxjs/operators';
@@ -43,6 +43,10 @@ export class WidgetVisibilityService {
form.tabs.map((tabModel) => this.refreshEntityVisibility(tabModel));
}
if (form && form.outcomes && form.outcomes.length > 0) {
form.outcomes.map((outcomeModel) => this.refreshOutcomeVisibility(outcomeModel));
}
if (form) {
form.getFormFields().map((field) => this.refreshEntityVisibility(field));
}
@@ -53,6 +57,10 @@ export class WidgetVisibilityService {
element.isVisible = visible && this.isParentTabVisible(this.form, element);
}
refreshOutcomeVisibility(element: FormOutcomeModel) {
element.isVisible = this.evaluateVisibility(element.form, element.visibilityCondition);
}
evaluateVisibility(form: FormModel, visibilityObj: WidgetVisibilityModel): boolean {
const isLeftFieldPresent = visibilityObj && (visibilityObj.leftType || visibilityObj.leftValue);
if (!isLeftFieldPresent || isLeftFieldPresent === 'null') {