[ADF-4790] [ADF-4791] - fix visibility condition for text/checkbox and variable/value (#4978)

* [ADF-4790] [ADF-4791] - fix visibility condition for empty string and checkbox - value/variable

* reset package-lock

* reset package-lock.json

* fix lint and change return type
This commit is contained in:
Silviu Popa
2019-08-09 00:51:10 +03:00
committed by Eugenio Romano
parent f04c135377
commit cb988b0145
4 changed files with 201 additions and 17 deletions

View File

@@ -413,6 +413,9 @@ export class FormFieldModel extends FormWidgetModel {
case FormFieldTypes.AMOUNT: case FormFieldTypes.AMOUNT:
this.form.values[this.id] = this.enableFractions ? parseFloat(this.value) : parseInt(this.value, 10); this.form.values[this.id] = this.enableFractions ? parseFloat(this.value) : parseInt(this.value, 10);
break; break;
case FormFieldTypes.BOOLEAN:
this.form.values[this.id] = (this.value !== null && this.value !== undefined) ? this.value : false;
break;
default: default:
if (!FormFieldTypes.isReadOnlyType(this.type) && !this.isInvalidFieldType(this.type)) { if (!FormFieldTypes.isReadOnlyType(this.type) && !this.isInvalidFieldType(this.type)) {
this.form.values[this.id] = this.value; this.form.values[this.id] = this.value;

View File

@@ -34,7 +34,8 @@ import { AlfrescoApiServiceMock } from '../../mock/alfresco-api.service.mock';
import { import {
fakeFormJson, fakeTaskProcessVariableModels, fakeFormJson, fakeTaskProcessVariableModels,
formTest, formValues, complexVisibilityJsonVisible, formTest, formValues, complexVisibilityJsonVisible,
nextConditionForm, complexVisibilityJsonNotVisible } from 'core/mock/form/widget-visibility-cloud.service.mock'; nextConditionForm, complexVisibilityJsonNotVisible,
headerVisibilityCond } from 'core/mock/form/widget-visibility-cloud.service.mock';
declare let jasmine: any; declare let jasmine: any;
@@ -398,7 +399,7 @@ describe('WidgetVisibilityCloudService', () => {
const formValue = service.searchValueInForm(stubFormWithFields, 'FIELD_MYSTERY'); const formValue = service.searchValueInForm(stubFormWithFields, 'FIELD_MYSTERY');
expect(formValue).not.toBeUndefined(); expect(formValue).not.toBeUndefined();
expect(formValue).toBe(''); expect(formValue).toEqual('');
}); });
it('should search in the form if element value is not in form values', () => { it('should search in the form if element value is not in form values', () => {
@@ -412,7 +413,7 @@ describe('WidgetVisibilityCloudService', () => {
const formValue = service.getFormValue(fakeFormWithField, 'FIELD_MYSTERY'); const formValue = service.getFormValue(fakeFormWithField, 'FIELD_MYSTERY');
expect(formValue).not.toBeUndefined(); expect(formValue).not.toBeUndefined();
expect(formValue).toBe(''); expect(formValue).toEqual('');
}); });
it('should retrieve the value for the right field when it is a value', () => { it('should retrieve the value for the right field when it is a value', () => {
@@ -480,9 +481,9 @@ describe('WidgetVisibilityCloudService', () => {
expect(leftValue).toBe('value_2'); expect(leftValue).toBe('value_2');
}); });
it('should return empty string for a value that is not on variable or form', () => { it('should return undefined for a value that is not on variable or form', () => {
const leftValue = service.getLeftValue(fakeFormWithField, visibilityObjTest); const leftValue = service.getLeftValue(fakeFormWithField, visibilityObjTest);
expect(leftValue).toBe(''); expect(leftValue).toEqual('');
}); });
it('should evaluate the visibility for the field with single visibility condition between two field values', () => { it('should evaluate the visibility for the field with single visibility condition between two field values', () => {
@@ -507,9 +508,11 @@ describe('WidgetVisibilityCloudService', () => {
}); });
it('should evaluate the visibility for the field with single visibility condition between form values', () => { it('should evaluate the visibility for the field with single visibility condition between form values', () => {
visibilityObjTest.leftType = 'LEFT_FORM_FIELD_ID'; visibilityObjTest.leftType = WidgetTypeEnum.field;
visibilityObjTest.leftValue = 'LEFT_FORM_FIELD_ID';
visibilityObjTest.operator = '!='; visibilityObjTest.operator = '!=';
visibilityObjTest.rightType = 'RIGHT_FORM_FIELD_ID'; visibilityObjTest.rightType = WidgetTypeEnum.field;
visibilityObjTest.rightValue = 'RIGHT_FORM_FIELD_ID';
const isVisible = service.isFieldVisible(fakeFormWithField, visibilityObjTest); const isVisible = service.isFieldVisible(fakeFormWithField, visibilityObjTest);
expect(isVisible).toBeTruthy(); expect(isVisible).toBeTruthy();
@@ -740,6 +743,7 @@ describe('WidgetVisibilityCloudService', () => {
visibilityObjTest.leftType = WidgetTypeEnum.field; visibilityObjTest.leftType = WidgetTypeEnum.field;
visibilityObjTest.leftValue = 'FIELD_FORM_EMPTY'; visibilityObjTest.leftValue = 'FIELD_FORM_EMPTY';
visibilityObjTest.operator = '=='; visibilityObjTest.operator = '==';
visibilityObjTest.rightType = WidgetTypeEnum.value;
visibilityObjTest.rightValue = 'PROCESS_RIGHT_FORM_FIELD_VALUE'; visibilityObjTest.rightValue = 'PROCESS_RIGHT_FORM_FIELD_VALUE';
const myForm = new FormModel({ const myForm = new FormModel({
@@ -1075,5 +1079,97 @@ describe('WidgetVisibilityCloudService', () => {
expect(isVisible).toBeTruthy(); expect(isVisible).toBeTruthy();
}); });
it('should evaluate visibility between checkbox and variable', (done) => {
visibilityObjTest.leftType = WidgetTypeEnum.field;
visibilityObjTest.leftValue = 'CheckboxTwo';
visibilityObjTest.operator = '==';
visibilityObjTest.rightType = WidgetTypeEnum.variable;
visibilityObjTest.rightValue = 'var2';
const checkboxForm = 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: '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: 'CheckboxThree',
name: 'CheckboxThree',
type: 'boolean',
required: false,
colspan: 1,
visibilityCondition: visibilityObjTest
}
]
}
}
],
variables: [
{
id: 'id',
name: 'var2',
type: 'boolean',
value: false
}
]
});
service.refreshVisibility(checkboxForm);
const fieldWithVisibilityAttached = checkboxForm.getFieldById('CheckboxThree');
expect(fieldWithVisibilityAttached.isVisible).toBeTruthy();
done();
});
it('should evaluate visibility between empty text fields', (done) => {
visibilityObjTest.leftType = WidgetTypeEnum.field;
visibilityObjTest.leftValue = 'Text1';
visibilityObjTest.operator = '==';
visibilityObjTest.rightType = WidgetTypeEnum.field;
visibilityObjTest.rightValue = 'Text2';
const checkboxForm = new FormModel(headerVisibilityCond);
checkboxForm.getFieldById('Text1').value = '1';
checkboxForm.getFieldById('Text1').value = '';
service.refreshVisibility(checkboxForm);
const fieldWithVisibilityAttached = checkboxForm.getFieldById('Header0hm6n0');
expect(fieldWithVisibilityAttached.isVisible).toBeTruthy();
done();
});
}); });
}); });

View File

@@ -98,8 +98,9 @@ export class WidgetVisibilityService {
leftValue = this.getVariableValue(form, visibilityObj.leftValue, this.processVarList); leftValue = this.getVariableValue(form, visibilityObj.leftValue, this.processVarList);
} else if (visibilityObj.leftType && visibilityObj.leftType === WidgetTypeEnum.field) { } else if (visibilityObj.leftType && visibilityObj.leftType === WidgetTypeEnum.field) {
leftValue = this.getFormValue(form, visibilityObj.leftValue); leftValue = this.getFormValue(form, visibilityObj.leftValue);
if (this.isInvalidValue(leftValue)) { if (leftValue === undefined || leftValue === '') {
leftValue = this.getVariableValue(form, visibilityObj.leftValue, this.processVarList); const variableValue = this.getVariableValue(form, visibilityObj.leftValue, this.processVarList);
leftValue = !this.isInvalidValue(variableValue) ? variableValue : leftValue;
} }
} }
return leftValue; return leftValue;
@@ -124,7 +125,7 @@ export class WidgetVisibilityService {
getFormValue(form: FormModel, fieldId: string): any { getFormValue(form: FormModel, fieldId: string): any {
let value = this.getFieldValue(form.values, fieldId); let value = this.getFieldValue(form.values, fieldId);
if (!value) { if (this.isInvalidValue(value)) {
value = this.searchValueInForm(form, fieldId); value = this.searchValueInForm(form, fieldId);
} }
return value; return value;
@@ -146,7 +147,7 @@ export class WidgetVisibilityService {
} }
private isInvalidValue(value: any): boolean { private isInvalidValue(value: any): boolean {
return value === undefined || value === ''; return value === undefined || value === null;
} }
searchValueInForm(form: FormModel, fieldId: string): string { searchValueInForm(form: FormModel, fieldId: string): string {
@@ -157,13 +158,12 @@ export class WidgetVisibilityService {
if (!fieldValue) { if (!fieldValue) {
if (formField.value && formField.value.id) { if (formField.value && formField.value.id) {
fieldValue = formField.value.id; fieldValue = formField.value.id;
} else { } else if (!this.isInvalidValue(formField.value)) {
fieldValue = formField.value; fieldValue = formField.value;
} }
} }
} }
}); });
return fieldValue; return fieldValue;
} }
@@ -195,11 +195,12 @@ export class WidgetVisibilityService {
} }
getVariableValue(form: FormModel, name: string, processVarList: TaskProcessVariableModel[]): string { getVariableValue(form: FormModel, name: string, processVarList: TaskProcessVariableModel[]): string {
return this.getFormVariableValue(form, name) || const processVariableValue = this.getProcessVariableValue(name, processVarList);
this.getProcessVariableValue(name, processVarList); const variableDefaultValue = this.getFormVariableDefaultValue(form, name);
return (processVariableValue === undefined) ? variableDefaultValue : processVariableValue;
} }
private getFormVariableValue(form: FormModel, identifier: string): string { private getFormVariableDefaultValue(form: FormModel, identifier: string): string {
const variables = this.getFormVariables(form); const variables = this.getFormVariables(form);
if (variables) { if (variables) {
const formVariable = variables.find((formVar) => { const formVariable = variables.find((formVar) => {
@@ -213,7 +214,6 @@ export class WidgetVisibilityService {
value += 'T00:00:00.000Z'; value += 'T00:00:00.000Z';
} }
} }
return value; return value;
} }
} }
@@ -229,6 +229,7 @@ export class WidgetVisibilityService {
return processVariable.value; return processVariable.value;
} }
} }
} }
evaluateLogicalOperation(logicOp, previousValue, newValue): boolean { evaluateLogicalOperation(logicOp, previousValue, newValue): boolean {

View File

@@ -954,3 +954,87 @@ export let nextConditionForm = {
} }
] ]
}; };
export let headerVisibilityCond = {
'id': 'form-f0823c05-51eb-4703-8634-75a6d5e15df5',
'name': 'text_form',
'description': '',
'version': 0,
'standAlone': true,
'formDefinition': {
'tabs': [],
'fields': [
{
'id': 'Header0hm6n0',
'name': 'Header',
'type': 'group',
'tab': null,
'params': {
'allowCollapse': false,
'collapseByDefault': false
},
'numberOfColumns': 1,
'fields': {
'1': []
},
'visibilityCondition': {
'leftType': 'field',
'leftValue': 'Text1',
'operator': '==',
'rightValue': 'Text2',
'rightType': 'field',
'nextConditionOperator': '',
'nextCondition': null
}
},
{
'id': '19c3a066-c1bf-47f1-97f2-2b9420be3566',
'name': 'Label',
'type': 'container',
'tab': null,
'numberOfColumns': 2,
'fields': {
'1': [
{
'id': 'Text1',
'name': 'Text1',
'type': 'text',
'required': false,
'colspan': 1,
'placeholder': null,
'minLength': 0,
'maxLength': 0,
'regexPattern': null,
'visibilityCondition': null,
'params': {
'existingColspan': 1,
'maxColspan': 2
}
}
],
'2': [
{
'id': 'Text2',
'name': 'Text2',
'type': 'text',
'required': false,
'colspan': 1,
'placeholder': null,
'minLength': 0,
'maxLength': 0,
'regexPattern': null,
'visibilityCondition': null,
'params': {
'existingColspan': 1,
'maxColspan': 2
}
}
]
}
}
],
'outcomes': [],
'metadata': {},
'variables': []
}
};