diff --git a/lib/core/form/components/widgets/core/form-field.model.ts b/lib/core/form/components/widgets/core/form-field.model.ts index 897c83d8a6..9290e04800 100644 --- a/lib/core/form/components/widgets/core/form-field.model.ts +++ b/lib/core/form/components/widgets/core/form-field.model.ts @@ -227,7 +227,7 @@ export class FormFieldModel extends FormWidgetModel { } private getFieldNameWithLabel(name: string): string { - return name += '_LABEL'; + return name + '_LABEL'; } private getProcessVariableValue(field: any, form: FormModel): any { diff --git a/lib/core/form/services/widget-visibility-cloud.service.spec.ts b/lib/core/form/services/widget-visibility-cloud.service.spec.ts index 5985ece2b7..9c69ab7d43 100644 --- a/lib/core/form/services/widget-visibility-cloud.service.spec.ts +++ b/lib/core/form/services/widget-visibility-cloud.service.spec.ts @@ -32,7 +32,8 @@ import { fakeFormJson, fakeTaskProcessVariableModels, formTest, formValues, complexVisibilityJsonVisible, nextConditionForm, complexVisibilityJsonNotVisible, - headerVisibilityCond } from '../../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'; @@ -945,14 +946,18 @@ describe('WidgetVisibilityCloudService', () => { expect(contModel.isVisible).toBeFalsy(); }); - it('should evaluate checkbox condition', (done) => { - visibilityObjTest.leftType = WidgetTypeEnum.field; - visibilityObjTest.leftValue = 'CheckboxOne'; + it('should evaluate radio box LABEL condition', (done) => { + visibilityObjTest.leftFormFieldId = 'radioBoxField_LABEL'; + visibilityObjTest.leftRestResponseId = null; visibilityObjTest.operator = '=='; - visibilityObjTest.rightType = WidgetTypeEnum.field; - visibilityObjTest.rightValue = 'CheckboxTwo'; + visibilityObjTest.rightValue = 'No'; + visibilityObjTest.rightType = null; + visibilityObjTest.rightFormFieldId = ''; + visibilityObjTest.rightRestResponseId = ''; + visibilityObjTest.nextConditionOperator = ''; + visibilityObjTest.nextCondition = null; - const checkboxForm = new FormModel({ + const radioBoxForm = new FormModel({ id: '9999', name: 'CHECKBOX_VISIBILITY', processDefinitionId: 'PROCESS_TEST:9:9999', @@ -971,31 +976,23 @@ describe('WidgetVisibilityCloudService', () => { fields: { 1: [ { - id: 'CheckboxOne', - name: 'CheckboxOne', - type: 'boolean', - required: false, - value: false, - colspan: 1, - visibilityCondition: null - }, - { - id: 'CheckboxTwo', - name: 'CheckboxTwo', - type: 'boolean', - required: false, - value: false, - colspan: 1, - visibilityCondition: null - } - ], - 2: [ - { - id: 'CheckboxNotReq', - name: 'CheckboxNotReq', - type: 'boolean', - required: false, - colspan: 1, + id: 'radioboxField', + name: 'radioboxField test', + type: 'radio-buttons', + options: [ + { + 'id': 'radioBoxYes', + 'name': 'Yes' + }, + { + 'id': 'radioBoxNo', + 'name': 'No' + } + ] + }, { + id: 'textBoxTest', + name: 'textbox test', + type: 'people', visibilityCondition: visibilityObjTest } ] @@ -1004,10 +1001,17 @@ describe('WidgetVisibilityCloudService', () => { ] }); - service.refreshVisibility(checkboxForm); + const fieldWithVisibilityAttached = radioBoxForm.getFieldById('textBoxTest'); + const radioBox = radioBoxForm.getFieldById('radioboxField'); - const fieldWithVisibilityAttached = checkboxForm.getFieldById('CheckboxNotReq'); + radioBox.value = 'Yes'; + service.refreshVisibility(radioBoxForm); + expect(fieldWithVisibilityAttached.isVisible).toBeFalsy(); + + radioBox.value = 'No'; + service.refreshVisibility(radioBoxForm); expect(fieldWithVisibilityAttached.isVisible).toBeTruthy(); + done(); }); }); diff --git a/lib/core/form/services/widget-visibility.service.spec.ts b/lib/core/form/services/widget-visibility.service.spec.ts index 3785b75420..954e8429c0 100644 --- a/lib/core/form/services/widget-visibility.service.spec.ts +++ b/lib/core/form/services/widget-visibility.service.spec.ts @@ -27,11 +27,13 @@ import { TaskProcessVariableModel } from './../models/task-process-variable.mode import { WidgetVisibilityModel } from './../models/widget-visibility.model'; import { WidgetVisibilityService } from './widget-visibility.service'; import { setupTestBed } from '../../testing/setup-test-bed'; -import { fakeTaskProcessVariableModels, - fakeFormJson, formTest, - formValues, complexVisibilityJsonVisible, - complexVisibilityJsonNotVisible, tabVisibilityJsonMock, - tabInvalidFormVisibility } from 'core/mock/form/widget-visibility.service.mock'; +import { + fakeTaskProcessVariableModels, + fakeFormJson, formTest, + formValues, complexVisibilityJsonVisible, + complexVisibilityJsonNotVisible, tabVisibilityJsonMock, + tabInvalidFormVisibility +} from 'core/mock/form/widget-visibility.service.mock'; import { CoreTestingModule } from '../../testing/core.testing.module'; import { TranslateModule } from '@ngx-translate/core'; @@ -931,6 +933,75 @@ describe('WidgetVisibilityService', () => { expect(fakeFormField.isVisible).toBeFalsy(); expect(fakeFormField.value).toEqual('FAKE_FORM_FIELD_VALUE'); }); + + it('should evaluate radio box LABEL condition', (done) => { + visibilityObjTest.leftFormFieldId = 'radioBoxField_LABEL'; + visibilityObjTest.leftRestResponseId = null; + visibilityObjTest.operator = '=='; + visibilityObjTest.rightValue = 'No'; + visibilityObjTest.rightType = null; + visibilityObjTest.rightFormFieldId = ''; + visibilityObjTest.rightRestResponseId = ''; + visibilityObjTest.nextConditionOperator = ''; + visibilityObjTest.nextCondition = null; + + const radioBoxForm = new FormModel({ + id: '9999', + name: 'CHECKBOX_VISIBILITY', + processDefinitionId: 'PROCESS_TEST:9:9999', + processDefinitionName: 'PROCESS_TEST', + processDefinitionKey: 'PROCESS_TEST', + taskId: '999', + taskName: 'TEST', + fields: [ + { + fieldType: 'ContainerRepresentation', + id: '000000000000000000', + name: 'Label', + type: 'container', + value: null, + numberOfColumns: 2, + fields: { + 1: [ + { + id: 'radioboxField', + name: 'radioboxField test', + type: 'radio-buttons', + options: [ + { + 'id': 'radioBoxYes', + 'name': 'Yes' + }, + { + 'id': 'radioBoxNo', + 'name': 'No' + } + ] + }, { + id: 'textBoxTest', + name: 'textbox test', + type: 'people', + visibilityCondition: visibilityObjTest + } + ] + } + } + ] + }); + + const fieldWithVisibilityAttached = radioBoxForm.getFieldById('textBoxTest'); + const radioBox = radioBoxForm.getFieldById('radioboxField'); + + radioBox.value = 'Yes'; + service.refreshVisibility(radioBoxForm); + expect(fieldWithVisibilityAttached.isVisible).toBeFalsy(); + + radioBox.value = 'No'; + service.refreshVisibility(radioBoxForm); + expect(fieldWithVisibilityAttached.isVisible).toBeTruthy(); + + done(); + }); }); describe('Visibility based on form variables', () => { diff --git a/lib/core/form/services/widget-visibility.service.ts b/lib/core/form/services/widget-visibility.service.ts index cf785bbab8..86aca5042c 100644 --- a/lib/core/form/services/widget-visibility.service.ts +++ b/lib/core/form/services/widget-visibility.service.ts @@ -20,7 +20,13 @@ 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, FormOutcomeModel } 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'; @@ -148,11 +154,11 @@ export class WidgetVisibilityService { } getFieldValue(valueList: any, fieldId: string): any { - let dropDownFilterByName, valueFound; + let labelFilterByName, valueFound; if (fieldId && fieldId.indexOf('_LABEL') > 0) { - dropDownFilterByName = fieldId.substring(0, fieldId.length - 6); - if (valueList[dropDownFilterByName]) { - valueFound = valueList[dropDownFilterByName].name; + labelFilterByName = fieldId.substring(0, fieldId.length - 6); + if (valueList[labelFilterByName]) { + valueFound = valueList[labelFilterByName].name; } } else if (valueList[fieldId] && valueList[fieldId].id) { valueFound = valueList[fieldId].id; @@ -167,8 +173,7 @@ export class WidgetVisibilityService { } getFormFieldById(form: FormModel, fieldId: string): FormFieldModel { - return form.getFormFields(). - find( (formField: FormFieldModel) => this.isSearchedField(formField, fieldId)); + return form.getFormFields().find((formField: FormFieldModel) => this.isSearchedField(formField, fieldId)); } searchValueInForm(formField: FormFieldModel, fieldId: string): string { @@ -191,9 +196,9 @@ export class WidgetVisibilityService { isParentTabVisible(form: FormModel, currentFormField: FormFieldModel | TabModel): boolean { const containers = this.getFormTabContainers(form); let isVisible: boolean = true; - containers.map( (container: ContainerModel) => { - if ( !!this.getCurrentFieldFromTabById(container, currentFormField.id) ) { - const currentTab = form.tabs.find( (tab: TabModel) => tab.id === container.tab ); + containers.map((container: ContainerModel) => { + if (!!this.getCurrentFieldFromTabById(container, currentFormField.id)) { + const currentTab = form.tabs.find((tab: TabModel) => tab.id === container.tab); if (!!currentTab) { isVisible = currentTab.isVisible; } @@ -203,11 +208,11 @@ export class WidgetVisibilityService { } private getCurrentFieldFromTabById(container: ContainerModel, fieldId: string): FormFieldModel { - const tabFields: FormFieldModel[][] = Object.keys(container.field.fields).map( key => container.field.fields[key]); + const tabFields: FormFieldModel[][] = Object.keys(container.field.fields).map(key => container.field.fields[key]); let currentField: FormFieldModel; for (const tabField of tabFields) { - currentField = tabField.find( (tab: FormFieldModel) => tab.id === fieldId ); + currentField = tabField.find((tab: FormFieldModel) => tab.id === fieldId); if (currentField) { return currentField; } @@ -245,7 +250,8 @@ export class WidgetVisibilityService { return optionValue; } - private isSearchedField(field: FormFieldModel, fieldToFind: string): boolean { + private isSearchedField(field: FormFieldModel, fieldId: string): boolean { + const fieldToFind = fieldId?.indexOf('_LABEL') > 0 ? fieldId.replace('_LABEL', '') : fieldId; return (field.id && fieldToFind) ? field.id.toUpperCase() === fieldToFind.toUpperCase() : false; }