Re Added visibility feature

This commit is contained in:
Vito Albano 2016-08-20 12:55:59 +01:00
parent c4f6276b69
commit de62e8181e
20 changed files with 150 additions and 64 deletions

View File

@ -4,7 +4,7 @@ module.exports = function (config) {
var configuration = { var configuration = {
basePath: '.', basePath: '.',
frameworks: [/*'jasmine-ajax',*/ 'jasmine'], frameworks: ['jasmine-ajax', 'jasmine'],
files: [ files: [
// paths loaded by Karma // paths loaded by Karma
@ -63,7 +63,7 @@ module.exports = function (config) {
plugins: [ plugins: [
'karma-jasmine', 'karma-jasmine',
'karma-coverage', 'karma-coverage',
//'karma-jasmine-ajax', 'karma-jasmine-ajax',
'karma-chrome-launcher', 'karma-chrome-launcher',
'karma-mocha-reporter', 'karma-mocha-reporter',
'karma-jasmine-html-reporter' 'karma-jasmine-html-reporter'

View File

@ -81,6 +81,7 @@
"karma-coveralls": "1.1.2", "karma-coveralls": "1.1.2",
"karma-jasmine": "1.0.2", "karma-jasmine": "1.0.2",
"karma-jasmine-html-reporter": "0.2.0", "karma-jasmine-html-reporter": "0.2.0",
"karma-jasmine-ajax": "0.1.13",
"karma-mocha-reporter": "2.0.3", "karma-mocha-reporter": "2.0.3",
"license-check": "1.1.5", "license-check": "1.1.5",
"remap-istanbul": "0.6.3", "remap-istanbul": "0.6.3",

View File

@ -13,7 +13,7 @@
</div> </div>
<div *ngIf="!form.hasTabs() && form.hasFields()"> <div *ngIf="!form.hasTabs() && form.hasFields()">
<container-widget *ngFor="let field of form.fields" [content]="field"></container-widget> <container-widget *ngFor="let field of form.fields" [content]="field" (formValueChanged)="checkVisibility($event);"></container-widget>
</div> </div>
</div> </div>
<div *ngIf="form.hasOutcomes()" class="mdl-card__actions mdl-card--border"> <div *ngIf="form.hasOutcomes()" class="mdl-card__actions mdl-card--border">

View File

@ -35,7 +35,7 @@ describe('ActivitiForm', () => {
window['componentHandler'] = componentHandler; window['componentHandler'] = componentHandler;
formService = new FormService(null, null, null); formService = new FormService(null, null, null);
formComponent = new ActivitiForm(formService); formComponent = new ActivitiForm(formService, null);
}); });
it('should upgrade MDL content on view checked', () => { it('should upgrade MDL content on view checked', () => {

View File

@ -26,7 +26,7 @@ import {
import { MATERIAL_DESIGN_DIRECTIVES } from 'ng2-alfresco-core'; import { MATERIAL_DESIGN_DIRECTIVES } from 'ng2-alfresco-core';
import { FormService } from './../services/form.service'; import { FormService } from './../services/form.service';
import { FormModel, FormOutcomeModel, FormValues } from './widgets/core/index'; import { FormModel, FormOutcomeModel, FormValues, FormFieldModel } from './widgets/core/index';
import { TabsWidget } from './widgets/tabs/tabs.widget'; import { TabsWidget } from './widgets/tabs/tabs.widget';
import { ContainerWidget } from './widgets/container/container.widget'; import { ContainerWidget } from './widgets/container/container.widget';
@ -34,6 +34,8 @@ import { ContainerWidget } from './widgets/container/container.widget';
declare let __moduleName: string; declare let __moduleName: string;
declare var componentHandler; declare var componentHandler;
import { WidgetVisibilityService } from './../services/widget-visibility.service';
/** /**
* @Input * @Input
* ActivitiForm can show 3 forms searching by 3 type of params: * ActivitiForm can show 3 forms searching by 3 type of params:
@ -70,7 +72,7 @@ declare var componentHandler;
templateUrl: './activiti-form.component.html', templateUrl: './activiti-form.component.html',
styleUrls: ['./activiti-form.component.css'], styleUrls: ['./activiti-form.component.css'],
directives: [MATERIAL_DESIGN_DIRECTIVES, ContainerWidget, TabsWidget], directives: [MATERIAL_DESIGN_DIRECTIVES, ContainerWidget, TabsWidget],
providers: [FormService] providers: [FormService, WidgetVisibilityService]
}) })
export class ActivitiForm implements OnInit, AfterViewChecked, OnChanges { export class ActivitiForm implements OnInit, AfterViewChecked, OnChanges {
@ -118,7 +120,8 @@ export class ActivitiForm implements OnInit, AfterViewChecked, OnChanges {
debugMode: boolean = false; debugMode: boolean = false;
constructor(private formService: FormService) { constructor(private formService: FormService,
private visibilityService: WidgetVisibilityService) {
} }
hasForm(): boolean { hasForm(): boolean {
@ -220,6 +223,7 @@ export class ActivitiForm implements OnInit, AfterViewChecked, OnChanges {
loadForm() { loadForm() {
if (this.taskId) { if (this.taskId) {
this.getFormByTaskId(this.taskId); this.getFormByTaskId(this.taskId);
this.visibilityService.getTaskProcessVariableModelsForTask(this.taskId);
return; return;
} }
@ -334,4 +338,8 @@ export class ActivitiForm implements OnInit, AfterViewChecked, OnChanges {
new FormOutcomeModel(form, { id: '$custom', name: FormOutcomeModel.SAVE_ACTION, isSystem: true }) new FormOutcomeModel(form, { id: '$custom', name: FormOutcomeModel.SAVE_ACTION, isSystem: true })
]; ];
} }
checkVisibility(field: FormFieldModel) {
this.visibilityService.updateVisibilityForForm(field.form);
}
} }

View File

@ -0,0 +1 @@
/widget.model.ts

View File

@ -3,6 +3,7 @@
[attr.id]="field.id" [attr.id]="field.id"
class="mdl-checkbox__input" class="mdl-checkbox__input"
[(ngModel)]="field.value" [(ngModel)]="field.value"
(ngModelChange)="checkVisibility(field)"
[disabled]="field.readOnly"> [disabled]="field.readOnly">
<span class="mdl-checkbox__label">{{field.name}}</span> <span class="mdl-checkbox__label">{{field.name}}</span>
</label> </label>

View File

@ -15,33 +15,33 @@
<div *ngFor="let col of content.columns" class="mdl-cell mdl-cell--{{col.size}}-col"> <div *ngFor="let col of content.columns" class="mdl-cell mdl-cell--{{col.size}}-col">
<div class="mdl-grid" *ngIf="col.hasFields()"> <div class="mdl-grid" *ngIf="col.hasFields()">
<div *ngFor="let field of col.fields" class="mdl-cell mdl-cell--12-col"> <div *ngFor="let field of col.fields" class="mdl-cell mdl-cell--12-col">
<div [ngSwitch]="field.type"> <div [ngSwitch]="field.type" [hidden]="!field.isVisible">
<div *ngSwitchCase="'integer'"> <div *ngSwitchCase="'integer'">
<number-widget [field]="field"></number-widget> <number-widget [field]="field" (fieldChanged)="fieldChanged($event);"></number-widget>
</div> </div>
<div *ngSwitchCase="'text'"> <div *ngSwitchCase="'text'">
<text-widget [field]="field"></text-widget> <text-widget [field]="field" (fieldChanged)="fieldChanged($event);"></text-widget>
</div> </div>
<div *ngSwitchCase="'multi-line-text'"> <div *ngSwitchCase="'multi-line-text'">
<multiline-text-widget [field]="field"></multiline-text-widget> <multiline-text-widget [field]="field" (fieldChanged)="fieldChanged($event);"></multiline-text-widget>
</div> </div>
<div *ngSwitchCase="'boolean'"> <div *ngSwitchCase="'boolean'">
<checkbox-widget [field]="field"></checkbox-widget> <checkbox-widget [field]="field" (fieldChanged)="fieldChanged($event);"></checkbox-widget>
</div> </div>
<div *ngSwitchCase="'dropdown'"> <div *ngSwitchCase="'dropdown'">
<dropdown-widget [field]="field"></dropdown-widget> <dropdown-widget [field]="field" (fieldChanged)="fieldChanged($event);"></dropdown-widget>
</div> </div>
<div *ngSwitchCase="'hyperlink'"> <div *ngSwitchCase="'hyperlink'">
<hyperlink-widget [field]="field"></hyperlink-widget> <hyperlink-widget [field]="field" (fieldChanged)="fieldChanged($event);"></hyperlink-widget>
</div> </div>
<div *ngSwitchCase="'radio-buttons'"> <div *ngSwitchCase="'radio-buttons'">
<radio-buttons-widget [field]="field"></radio-buttons-widget> <radio-buttons-widget [field]="field" (fieldChanged)="fieldChanged($event);"></radio-buttons-widget>
</div> </div>
<div *ngSwitchCase="'readonly'"> <div *ngSwitchCase="'readonly'">
<display-value-widget [field]="field"></display-value-widget> <display-value-widget [field]="field" (fieldChanged)="fieldChanged($event);"></display-value-widget>
</div> </div>
<div *ngSwitchCase="'readonly-text'"> <div *ngSwitchCase="'readonly-text'">
<display-text-widget [field]="field"></display-text-widget> <display-text-widget [field]="field" (fieldChanged)="fieldChanged($event);"></display-text-widget>
</div> </div>
<div *ngSwitchDefault> <div *ngSwitchDefault>
<span>UNKNOWN WIDGET TYPE: {{field.type}}</span> <span>UNKNOWN WIDGET TYPE: {{field.type}}</span>

View File

@ -15,11 +15,12 @@
* limitations under the License. * limitations under the License.
*/ */
import { Component, Input, AfterViewInit } from '@angular/core'; import { Component, Input, AfterViewInit, Output, EventEmitter } from '@angular/core';
import { ContainerModel } from './../core/index'; import { ContainerModel } from './../core/index';
import { MATERIAL_DESIGN_DIRECTIVES } from 'ng2-alfresco-core'; import { MATERIAL_DESIGN_DIRECTIVES } from 'ng2-alfresco-core';
import { PRIMITIVE_WIDGET_DIRECTIVES } from './../index'; import { PRIMITIVE_WIDGET_DIRECTIVES } from './../index';
import { FormFieldModel } from '../core/index';
declare let __moduleName: string; declare let __moduleName: string;
declare var componentHandler; declare var componentHandler;
@ -39,6 +40,9 @@ export class ContainerWidget implements AfterViewInit {
@Input() @Input()
content: ContainerModel; content: ContainerModel;
@Output()
formValueChanged: EventEmitter<FormFieldModel> = new EventEmitter<FormFieldModel>();
onExpanderClicked() { onExpanderClicked() {
if (this.content && this.content.isCollapsible()) { if (this.content && this.content.isCollapsible()) {
this.content.isExpanded = !this.content.isExpanded; this.content.isExpanded = !this.content.isExpanded;
@ -58,4 +62,8 @@ export class ContainerWidget implements AfterViewInit {
return false; return false;
} }
fieldChanged(field: FormFieldModel) {
this.formValueChanged.emit(field);
}
} }

View File

@ -20,6 +20,7 @@ import { FormFieldOption } from './form-field-option';
import { FormFieldTypes } from './form-field-types'; import { FormFieldTypes } from './form-field-types';
import { FormFieldMetadata } from './form-field-metadata'; import { FormFieldMetadata } from './form-field-metadata';
import { FormModel } from './form.model'; import { FormModel } from './form.model';
import { WidgetVisibilityModel } from '../../../models/widget-visibility.model';
export class FormFieldModel extends FormWidgetModel { export class FormFieldModel extends FormWidgetModel {
@ -45,6 +46,8 @@ export class FormFieldModel extends FormWidgetModel {
params: FormFieldMetadata = {}; params: FormFieldMetadata = {};
hyperlinkUrl: string; hyperlinkUrl: string;
displayText: string; displayText: string;
isVisible: boolean = true;
visibilityCondition: WidgetVisibilityModel = null;
get value(): any { get value(): any {
return this._value; return this._value;
@ -86,6 +89,7 @@ export class FormFieldModel extends FormWidgetModel {
this.params = <FormFieldMetadata> json.params || {}; this.params = <FormFieldMetadata> json.params || {};
this.hyperlinkUrl = json.hyperlinkUrl; this.hyperlinkUrl = json.hyperlinkUrl;
this.displayText = json.displayText; this.displayText = json.displayText;
this.visibilityCondition = <WidgetVisibilityModel> json.visibilityCondition;
this._value = this.parseValue(json); this._value = this.parseValue(json);
this.updateForm(); this.updateForm();

View File

@ -3,6 +3,7 @@
type="text" type="text"
[attr.id]="field.id" [attr.id]="field.id"
[(ngModel)]="field.value" [(ngModel)]="field.value"
(ngModelChange)="checkVisibility(field)"
disabled> disabled>
<label class="mdl-textfield__label" [attr.for]="field.id">{{field.name}}</label> <label class="mdl-textfield__label" [attr.for]="field.id">{{field.name}}</label>
</div> </div>

View File

@ -1,5 +1,5 @@
<div class="dropdown-widget"> <div class="dropdown-widget">
<select [(ngModel)]="field.value"> <select [(ngModel)]="field.value" (ngModelChange)="checkVisibility(field)">
<option *ngFor="let opt of field.options" [value]="opt.id">{{opt.name}}</option> <option *ngFor="let opt of field.options" [value]="opt.id">{{opt.name}}</option>
</select> </select>
</div> </div>

View File

@ -4,6 +4,7 @@
rows= "3" rows= "3"
[attr.id]="field.id" [attr.id]="field.id"
[(ngModel)]="field.value" [(ngModel)]="field.value"
(ngModelChange)="checkVisibility(field)"
[disabled]="field.readOnly"> [disabled]="field.readOnly">
</textarea> </textarea>
<label class="mdl-textfield__label" [attr.for]="field.id">{{field.name}}</label> <label class="mdl-textfield__label" [attr.for]="field.id">{{field.name}}</label>

View File

@ -4,6 +4,7 @@
pattern="-?[0-9]*(\.[0-9]+)?" pattern="-?[0-9]*(\.[0-9]+)?"
[attr.id]="field.id" [attr.id]="field.id"
[(ngModel)]="field.value" [(ngModel)]="field.value"
(ngModelChange)="checkVisibility(field)"
[disabled]="field.readOnly"> [disabled]="field.readOnly">
<label class="mdl-textfield__label" [attr.for]="field.id">{{field.name}}</label> <label class="mdl-textfield__label" [attr.for]="field.id">{{field.name}}</label>
<span class="mdl-textfield__error">Input is not a number!</span> <span class="mdl-textfield__error">Input is not a number!</span>

View File

@ -3,6 +3,7 @@
type="text" type="text"
[attr.id]="field.id" [attr.id]="field.id"
[(ngModel)]="field.value" [(ngModel)]="field.value"
(ngModelChange)="checkVisibility(field)"
[disabled]="field.readOnly"> [disabled]="field.readOnly">
<label class="mdl-textfield__label" [attr.for]="field.id">{{field.name}}</label> <label class="mdl-textfield__label" [attr.for]="field.id">{{field.name}}</label>
</div> </div>

View File

@ -15,7 +15,7 @@
* limitations under the License. * limitations under the License.
*/ */
import { Input, AfterViewInit } from '@angular/core'; import { Input, AfterViewInit, Output, EventEmitter } from '@angular/core';
import { FormFieldModel } from './core/index'; import { FormFieldModel } from './core/index';
declare let __moduleName: string; declare let __moduleName: string;
@ -29,6 +29,9 @@ export class WidgetComponent implements AfterViewInit {
@Input() @Input()
field: FormFieldModel; field: FormFieldModel;
@Output()
fieldChanged: EventEmitter<FormFieldModel> = new EventEmitter<FormFieldModel>();
hasField() { hasField() {
return this.field ? true : false; return this.field ? true : false;
} }
@ -46,4 +49,8 @@ export class WidgetComponent implements AfterViewInit {
return false; return false;
} }
checkVisibility(field: FormFieldModel) {
this.fieldChanged.emit(field);
}
} }

View File

@ -0,0 +1,22 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
export class TaskProcessVariableModel {
id: string;
type: string;
value: string;
}

View File

@ -0,0 +1,28 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
export class WidgetVisibilityModel {
leftFormFieldId: string;
leftRestResponseId: string;
nextCondition: WidgetVisibilityModel;
nextConditionOperator: string;
operator: string;
rightFormFieldId: string;
rightRestResponseId: string;
rightType: string;
rightValue: string;
}

View File

@ -19,8 +19,9 @@ import { it, describe, inject, beforeEach, beforeEachProviders } from '@angular/
import { WidgetVisibilityService } from './widget-visibility.service'; import { WidgetVisibilityService } from './widget-visibility.service';
import { AlfrescoSettingsService, AlfrescoAuthenticationService } from 'ng2-alfresco-core'; import { AlfrescoSettingsService, AlfrescoAuthenticationService } from 'ng2-alfresco-core';
import { HTTP_PROVIDERS } from '@angular/http'; import { HTTP_PROVIDERS } from '@angular/http';
import { VisibilityFormWidget, IProcessVariable } from '../components/widgets/widget-visibility.model'; import { WidgetVisibilityModel } from '../models/widget-visibility.model';
import { FormModel, FormValues, FormFieldModel } from './../components/widgets/widget.model'; import { TaskProcessVariableModel } from '../models/task-process-variable.model';
import { FormModel, FormFieldModel, FormValues } from '../components/widgets/core/index';
declare let AlfrescoApi: any; declare let AlfrescoApi: any;
declare let jasmine: any; declare let jasmine: any;
@ -28,7 +29,7 @@ declare let jasmine: any;
describe('WidgetVisibilityService', () => { describe('WidgetVisibilityService', () => {
let service; let service;
let fakeProcessVariables = [ let fakeTaskProcessVariableModels = [
{id: 'TEST_VAR_1', type: 'string', value: 'test_value_1'}, {id: 'TEST_VAR_1', type: 'string', value: 'test_value_1'},
{id: 'TEST_VAR_2', type: 'string', value: 'test_value_2'}, {id: 'TEST_VAR_2', type: 'string', value: 'test_value_2'},
{id: 'TEST_VAR_3', type: 'string', value: 'test_value_3'} {id: 'TEST_VAR_3', type: 'string', value: 'test_value_3'}
@ -122,7 +123,7 @@ describe('WidgetVisibilityService', () => {
let formValues: FormValues = { 'test_1': 'value_1', 'test_2': 'value_2', 'test_3': 'value_1' }; let formValues: FormValues = { 'test_1': 'value_1', 'test_2': 'value_2', 'test_3': 'value_1' };
let visibilityObjTest: VisibilityFormWidget = { let visibilityObjTest: WidgetVisibilityModel = {
leftFormFieldId : '', leftFormFieldId : '',
leftRestResponseId : '', leftRestResponseId : '',
nextCondition : null, nextCondition : null,
@ -134,7 +135,7 @@ describe('WidgetVisibilityService', () => {
rightValue : null rightValue : null
}; };
let chainedVisibilityObj: VisibilityFormWidget = { let chainedVisibilityObj: WidgetVisibilityModel = {
leftFormFieldId : '', leftFormFieldId : '',
leftRestResponseId : '', leftRestResponseId : '',
nextCondition : null, nextCondition : null,
@ -167,8 +168,8 @@ describe('WidgetVisibilityService', () => {
}); });
it('should return the process variables for task', (done) => { it('should return the process variables for task', (done) => {
service.getProcessVariablesForTask(9999).subscribe( service.getTaskProcessVariableModelsForTask(9999).subscribe(
(res: IProcessVariable[]) => { (res: TaskProcessVariableModel[]) => {
expect(res).toBeDefined(); expect(res).toBeDefined();
expect(res.length).toEqual(3); expect(res.length).toEqual(3);
expect(res[0].id).toEqual('TEST_VAR_1'); expect(res[0].id).toEqual('TEST_VAR_1');
@ -181,7 +182,7 @@ describe('WidgetVisibilityService', () => {
jasmine.Ajax.requests.mostRecent().respondWith({ jasmine.Ajax.requests.mostRecent().respondWith({
'status': 200, 'status': 200,
contentType: 'application/json', contentType: 'application/json',
responseText: JSON.stringify(fakeProcessVariables) responseText: JSON.stringify(fakeTaskProcessVariableModels)
}); });
}); });
@ -266,15 +267,15 @@ describe('WidgetVisibilityService', () => {
}); });
it('should be able to retrieve the value of a process variable', (done) => { it('should be able to retrieve the value of a process variable', (done) => {
service.getProcessVariablesForTask(9999).subscribe( service.getTaskProcessVariableModelsForTask(9999).subscribe(
(res: IProcessVariable[]) => { (res: TaskProcessVariableModel[]) => {
done(); done();
} }
); );
jasmine.Ajax.requests.mostRecent().respondWith({ jasmine.Ajax.requests.mostRecent().respondWith({
'status': 200, 'status': 200,
contentType: 'application/json', contentType: 'application/json',
responseText: JSON.stringify(fakeProcessVariables) responseText: JSON.stringify(fakeTaskProcessVariableModels)
}); });
let formTest = new FormModel(fakeFormJson); let formTest = new FormModel(fakeFormJson);
@ -285,15 +286,15 @@ describe('WidgetVisibilityService', () => {
}); });
it('should be able to retrieve the value of a form variable', (done) => { it('should be able to retrieve the value of a form variable', (done) => {
service.getProcessVariablesForTask(9999).subscribe( service.getTaskProcessVariableModelsForTask(9999).subscribe(
(res: IProcessVariable[]) => { (res: TaskProcessVariableModel[]) => {
done(); done();
} }
); );
jasmine.Ajax.requests.mostRecent().respondWith({ jasmine.Ajax.requests.mostRecent().respondWith({
'status': 200, 'status': 200,
contentType: 'application/json', contentType: 'application/json',
responseText: JSON.stringify(fakeProcessVariables) responseText: JSON.stringify(fakeTaskProcessVariableModels)
}); });
let formTest = new FormModel(fakeFormJson); let formTest = new FormModel(fakeFormJson);
@ -304,15 +305,15 @@ describe('WidgetVisibilityService', () => {
}); });
it('should return null if the variable does not exist', (done) => { it('should return null if the variable does not exist', (done) => {
service.getProcessVariablesForTask(9999).subscribe( service.getTaskProcessVariableModelsForTask(9999).subscribe(
(res: IProcessVariable[]) => { (res: TaskProcessVariableModel[]) => {
done(); done();
} }
); );
jasmine.Ajax.requests.mostRecent().respondWith({ jasmine.Ajax.requests.mostRecent().respondWith({
'status': 200, 'status': 200,
contentType: 'application/json', contentType: 'application/json',
responseText: JSON.stringify(fakeProcessVariables) responseText: JSON.stringify(fakeTaskProcessVariableModels)
}); });
let formTest = new FormModel(fakeFormJson); let formTest = new FormModel(fakeFormJson);
@ -385,15 +386,15 @@ describe('WidgetVisibilityService', () => {
}); });
it('should retrieve the value for the right field when it is a process variable', (done) => { it('should retrieve the value for the right field when it is a process variable', (done) => {
service.getProcessVariablesForTask(9999).subscribe( service.getTaskProcessVariableModelsForTask(9999).subscribe(
(res: IProcessVariable[]) => { (res: TaskProcessVariableModel[]) => {
done(); done();
} }
); );
jasmine.Ajax.requests.mostRecent().respondWith({ jasmine.Ajax.requests.mostRecent().respondWith({
'status': 200, 'status': 200,
contentType: 'application/json', contentType: 'application/json',
responseText: JSON.stringify(fakeProcessVariables) responseText: JSON.stringify(fakeTaskProcessVariableModels)
}); });
let formTest = new FormModel(fakeFormJson); let formTest = new FormModel(fakeFormJson);
visibilityObjTest.rightRestResponseId = 'TEST_VAR_2'; visibilityObjTest.rightRestResponseId = 'TEST_VAR_2';
@ -463,15 +464,15 @@ describe('WidgetVisibilityService', () => {
}); });
it('should retrieve the value for the left field when it is a process variable', (done) => { it('should retrieve the value for the left field when it is a process variable', (done) => {
service.getProcessVariablesForTask(9999).subscribe( service.getTaskProcessVariableModelsForTask(9999).subscribe(
(res: IProcessVariable[]) => { (res: TaskProcessVariableModel[]) => {
done(); done();
} }
); );
jasmine.Ajax.requests.mostRecent().respondWith({ jasmine.Ajax.requests.mostRecent().respondWith({
'status': 200, 'status': 200,
contentType: 'application/json', contentType: 'application/json',
responseText: JSON.stringify(fakeProcessVariables) responseText: JSON.stringify(fakeTaskProcessVariableModels)
}); });
let formTest = new FormModel(fakeFormJson); let formTest = new FormModel(fakeFormJson);
visibilityObjTest.leftRestResponseId = 'TEST_VAR_2'; visibilityObjTest.leftRestResponseId = 'TEST_VAR_2';
@ -589,15 +590,15 @@ describe('WidgetVisibilityService', () => {
}); });
it('should evaluate the visibility for the field with single visibility condition between form value and process var', (done) => { it('should evaluate the visibility for the field with single visibility condition between form value and process var', (done) => {
service.getProcessVariablesForTask(9999).subscribe( service.getTaskProcessVariableModelsForTask(9999).subscribe(
(res: IProcessVariable[]) => { (res: TaskProcessVariableModel[]) => {
done(); done();
} }
); );
jasmine.Ajax.requests.mostRecent().respondWith({ jasmine.Ajax.requests.mostRecent().respondWith({
'status': 200, 'status': 200,
contentType: 'application/json', contentType: 'application/json',
responseText: JSON.stringify(fakeProcessVariables) responseText: JSON.stringify(fakeTaskProcessVariableModels)
}); });
let formTest = new FormModel(fakeFormJson); let formTest = new FormModel(fakeFormJson);
visibilityObjTest.leftFormFieldId = 'LEFT_FORM_FIELD_ID'; visibilityObjTest.leftFormFieldId = 'LEFT_FORM_FIELD_ID';
@ -612,15 +613,15 @@ describe('WidgetVisibilityService', () => {
}); });
it('should evaluate visibility with multiple conditions', (done) => { it('should evaluate visibility with multiple conditions', (done) => {
service.getProcessVariablesForTask(9999).subscribe( service.getTaskProcessVariableModelsForTask(9999).subscribe(
(res: IProcessVariable[]) => { (res: TaskProcessVariableModel[]) => {
done(); done();
} }
); );
jasmine.Ajax.requests.mostRecent().respondWith({ jasmine.Ajax.requests.mostRecent().respondWith({
'status': 200, 'status': 200,
contentType: 'application/json', contentType: 'application/json',
responseText: JSON.stringify(fakeProcessVariables) responseText: JSON.stringify(fakeTaskProcessVariableModels)
}); });
let formTest = new FormModel(fakeFormJson); let formTest = new FormModel(fakeFormJson);
visibilityObjTest.leftFormFieldId = 'LEFT_FORM_FIELD_ID'; visibilityObjTest.leftFormFieldId = 'LEFT_FORM_FIELD_ID';
@ -639,15 +640,15 @@ describe('WidgetVisibilityService', () => {
}); });
it('should return true evaluating a proper condition for a field', (done) => { it('should return true evaluating a proper condition for a field', (done) => {
service.getProcessVariablesForTask(9999).subscribe( service.getTaskProcessVariableModelsForTask(9999).subscribe(
(res: IProcessVariable[]) => { (res: TaskProcessVariableModel[]) => {
done(); done();
} }
); );
jasmine.Ajax.requests.mostRecent().respondWith({ jasmine.Ajax.requests.mostRecent().respondWith({
'status': 200, 'status': 200,
contentType: 'application/json', contentType: 'application/json',
responseText: JSON.stringify(fakeProcessVariables) responseText: JSON.stringify(fakeTaskProcessVariableModels)
}); });
let formTest = new FormModel(fakeFormJson); let formTest = new FormModel(fakeFormJson);
visibilityObjTest.leftFormFieldId = 'LEFT_FORM_FIELD_ID'; visibilityObjTest.leftFormFieldId = 'LEFT_FORM_FIELD_ID';

View File

@ -19,13 +19,14 @@ import { Injectable } from '@angular/core';
import { Response, Http, Headers, RequestOptions } from '@angular/http'; import { Response, Http, Headers, RequestOptions } from '@angular/http';
import { Observable } from 'rxjs/Rx'; import { Observable } from 'rxjs/Rx';
import { AlfrescoSettingsService } from 'ng2-alfresco-core'; import { AlfrescoSettingsService } from 'ng2-alfresco-core';
import { FormModel, FormFieldModel } from './../components/widgets/widget.model'; import { FormModel, FormFieldModel } from '../components/widgets/core/index';
import { VisibilityFormWidget, IProcessVariable } from './../components/widgets/widget-visibility.model'; import { WidgetVisibilityModel } from '../models/widget-visibility.model';
import { TaskProcessVariableModel } from '../models/task-process-variable.model';
@Injectable() @Injectable()
export class WidgetVisibilityService { export class WidgetVisibilityService {
private processVarList: IProcessVariable[]; private processVarList: TaskProcessVariableModel[];
constructor(private http: Http, constructor(private http: Http,
private alfrescoSettingsService: AlfrescoSettingsService) { private alfrescoSettingsService: AlfrescoSettingsService) {
@ -54,7 +55,7 @@ export class WidgetVisibilityService {
} }
} }
public getVisiblityForField(form: FormModel, visibilityObj: VisibilityFormWidget): boolean { public getVisiblityForField(form: FormModel, visibilityObj: WidgetVisibilityModel): boolean {
let isLeftFieldPresent = visibilityObj.leftFormFieldId || visibilityObj.leftRestResponseId; let isLeftFieldPresent = visibilityObj.leftFormFieldId || visibilityObj.leftRestResponseId;
if ( !isLeftFieldPresent ) { if ( !isLeftFieldPresent ) {
return true; return true;
@ -63,7 +64,7 @@ export class WidgetVisibilityService {
} }
} }
private evaluateVisibilityForField(form: FormModel, visibilityObj: VisibilityFormWidget): boolean { private evaluateVisibilityForField(form: FormModel, visibilityObj: WidgetVisibilityModel): boolean {
let leftValue = this.getLeftValue(form, visibilityObj); let leftValue = this.getLeftValue(form, visibilityObj);
let rightValue = this.getRightValue(form, visibilityObj); let rightValue = this.getRightValue(form, visibilityObj);
let actualResult = this.evaluateCondition(leftValue, rightValue, visibilityObj.operator); let actualResult = this.evaluateCondition(leftValue, rightValue, visibilityObj.operator);
@ -78,14 +79,14 @@ export class WidgetVisibilityService {
} }
} }
private getLeftValue(form: FormModel, visibilityObj: VisibilityFormWidget) { private getLeftValue(form: FormModel, visibilityObj: WidgetVisibilityModel) {
if ( visibilityObj.leftRestResponseId ) { if ( visibilityObj.leftRestResponseId ) {
return this.getValueFromVariable(form, visibilityObj.leftRestResponseId); return this.getValueFromVariable(form, visibilityObj.leftRestResponseId);
} }
return this.getValueOField(form, visibilityObj.leftFormFieldId); return this.getValueOField(form, visibilityObj.leftFormFieldId);
} }
private getRightValue(form: FormModel, visibilityObj: VisibilityFormWidget) { private getRightValue(form: FormModel, visibilityObj: WidgetVisibilityModel) {
let valueFound = null; let valueFound = null;
if ( visibilityObj.rightRestResponseId ) { if ( visibilityObj.rightRestResponseId ) {
valueFound = this.getValueFromVariable(form, visibilityObj.rightRestResponseId); valueFound = this.getValueFromVariable(form, visibilityObj.rightRestResponseId);
@ -170,19 +171,19 @@ export class WidgetVisibilityService {
return null; return null;
} }
getProcessVariablesForTask(taskId: string): Observable<IProcessVariable[]> { getTaskProcessVariableModelsForTask(taskId: string): Observable<TaskProcessVariableModel[]> {
let url = `${this.alfrescoSettingsService.getBPMApiBaseUrl()}/app/rest/task-forms/${taskId}/variables`; let url = `${this.alfrescoSettingsService.getBPMApiBaseUrl()}/app/rest/task-forms/${taskId}/variables`;
let options = this.getRequestOptions(); let options = this.getRequestOptions();
return this.http return this.http
.get(url, options) .get(url, options)
.map( (response: Response) => this.processVarList = <IProcessVariable[]> response.json()) .map( (response: Response) => this.processVarList = <TaskProcessVariableModel[]> response.json())
.catch(this.handleError); .catch(this.handleError);
} }
getProcessVariableForTaskByName(taskId: string, processVarName: string): Observable<IProcessVariable> { getTaskProcessVariableModelForTaskByName(taskId: string, processVarName: string): Observable<TaskProcessVariableModel> {
return this.getProcessVariablesForTask(taskId) return this.getTaskProcessVariableModelsForTask(taskId)
.map( .map(
(variables: IProcessVariable[]) => (variables: TaskProcessVariableModel[]) =>
variables.find(variable => variable.id === processVarName)); variables.find(variable => variable.id === processVarName));
} }