diff --git a/ng2-components/ng2-activiti-analytics/karma-test-shim.js b/ng2-components/ng2-activiti-analytics/karma-test-shim.js
index c9d37f3aa2..e109df798c 100644
--- a/ng2-components/ng2-activiti-analytics/karma-test-shim.js
+++ b/ng2-components/ng2-activiti-analytics/karma-test-shim.js
@@ -53,6 +53,7 @@ var map = {
'rxjs': 'npm:rxjs',
'ng2-translate': 'npm:ng2-translate',
'ng2-charts' : 'npm:ng2-charts',
+ 'md-date-time-picker' : 'npm:md-date-time-picker',
'moment' : 'npm:moment/min/moment.min.js',
'alfresco-js-api': 'npm:alfresco-js-api/dist',
@@ -65,6 +66,7 @@ var packages = {
'rxjs': { defaultExtension: 'js' },
'ng2-translate': { defaultExtension: 'js' },
'ng2-charts': { defaultExtension: 'js' },
+ 'md-date-time-picker': { defaultExtension: 'js' },
'moment': { defaultExtension: 'js' },
'alfresco-js-api': { main: './alfresco-js-api.js', defaultExtension: 'js'},
diff --git a/ng2-components/ng2-activiti-analytics/karma.conf.js b/ng2-components/ng2-activiti-analytics/karma.conf.js
index 49636788ba..db5a72000c 100644
--- a/ng2-components/ng2-activiti-analytics/karma.conf.js
+++ b/ng2-components/ng2-activiti-analytics/karma.conf.js
@@ -33,6 +33,9 @@ module.exports = function (config) {
{pattern: 'node_modules/@angular/**/*.js.map', included: false, watched: false},
'node_modules/alfresco-js-api/dist/alfresco-js-api.js',
+ 'node_modules/moment/min/moment.min.js',
+ 'node_modules/md-date-time-picker/dist/js/mdDateTimePicker.js',
+ 'node_modules/chart.js/dist/Chart.bundle.min.js',
{pattern: 'node_modules/ng2-translate/**/*.js', included: false, watched: false},
'karma-test-shim.js',
@@ -45,6 +48,7 @@ module.exports = function (config) {
// ng2-components
{ pattern: 'node_modules/ng2-alfresco-core/dist/**/*.*', included: false, served: true, watched: false },
{ pattern: 'node_modules/ng2-charts/**/*.js', included: false, served: true, watched: false },
+ { pattern: 'node_modules/md-date-time-picker/**/*.js', included: false, served: true, watched: false },
{ pattern: 'node_modules/moment/**/*.js', included: false, served: true, watched: false },
// paths to support debugging with source maps in dev tools
diff --git a/ng2-components/ng2-activiti-analytics/src/assets/analyticsComponent.mock.ts b/ng2-components/ng2-activiti-analytics/src/assets/analyticsComponent.mock.ts
new file mode 100644
index 0000000000..6994e2e761
--- /dev/null
+++ b/ng2-components/ng2-activiti-analytics/src/assets/analyticsComponent.mock.ts
@@ -0,0 +1,238 @@
+/*!
+ * @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.
+ */
+
+import { ReportParameterModel } from '../models/report.model';
+
+export var reportDefParamStatus = {
+ 'id': 2005,
+ 'name': 'Fake Task overview status',
+ 'created': '2016-10-05T15:39:40.222+0000',
+ 'definition': '{ "parameters" :[{"id":"status","name":null,"nameKey":null,"type":"status","value":null,"dependsOn":null}]}'
+};
+
+export var reportDefParamNumber = {
+ 'id': 2005,
+ 'name': 'Fake Process instances overview',
+ 'created': '2016-10-05T15:39:40.222+0000',
+ 'definition': '{ "parameters"' +
+ ' :[{"id":"slowProcessInstanceInteger","name":null,"nameKey":null,"type":"integer","value":10,"dependsOn":null}]}'
+};
+
+export var reportDefParamDuration = {
+ 'id': 2005,
+ 'name': 'Fake Task service level agreement',
+ 'created': '2016-10-05T15:39:40.222+0000',
+ 'definition': '{ "parameters"' +
+ ' :[{"id":"duration","name":null,"nameKey":null,"type":"duration","value":null,"dependsOn":null}]}'
+};
+
+export var reportDefParamCheck = {
+ 'id': 2005,
+ 'name': 'Fake Task service level agreement',
+ 'created': '2016-10-05T15:39:40.222+0000',
+ 'definition': '{ "parameters"' +
+ ' :[{"id":"typeFiltering","name":null,"nameKey":null,"type":"boolean","value":true,"dependsOn":null}]}'
+};
+
+export var reportDefParamDateRange = {
+ 'id': 2005,
+ 'name': 'Fake Process instances overview',
+ 'created': '2016-10-05T15:39:40.222+0000',
+ 'definition': '{ "parameters" :[{"id":"dateRange","name":null,"nameKey":null,"type":"dateRange","value":null,"dependsOn":null}]}'
+};
+
+export var reportDefParamRangeInterval = {
+ 'id': 2006,
+ 'name': 'Fake Task overview RangeInterval',
+ 'created': '2016-10-05T15:39:40.222+0000',
+ 'definition': '{ "parameters" :[{"id":"dateRangeInterval","name":null,"nameKey":null,"type":"dateInterval","value":null,"dependsOn":null}]}'
+};
+
+export var reportDefParamProcessDef = {
+ 'id': 2006,
+ 'name': 'Fake Task overview ProcessDefinition',
+ 'created': '2016-10-05T15:39:40.222+0000',
+ 'definition': '{ "parameters" :[{"id":"processDefinitionId","name":null,"nameKey":null,"type":"processDefinition","value":null,"dependsOn":null}]}'
+};
+
+export var reportDefParamProcessDefOptions = [
+ {
+ 'id': 'FakeProcessTest 1:1:1',
+ 'name': 'Fake Process Test 1 Name ',
+ 'version': 1
+ },
+ {
+ 'id': 'FakeProcessTest 1:2:1',
+ 'name': 'Fake Process Test 1 Name ',
+ 'version': 2
+ },
+ {
+ 'id': 'FakeProcessTest 2:1:1',
+ 'name': 'Fake Process Test 2 Name ',
+ 'version': 1
+ },
+ {
+ 'id': 'FakeProcessTest 3:1:1',
+ 'name': 'Fake Process Test 3 Name ',
+ 'version': 1
+ }
+];
+
+export var reportDefParamTask = {
+ 'id': 2006,
+ 'name': 'Fake Task service level agreement',
+ 'created': '2016-10-05T15:39:40.222+0000',
+ 'definition': '{ "parameters" :[{"id":"taskName","name":null,"nameKey":null,"type":"task","value":null,"dependsOn":"processDefinitionId"}]}'
+};
+
+export var reportDefParamTaskOptions = ['Fake task name 1', 'Fake task name 2'];
+
+export var chartProcessDefOverview = {
+ 'elements': [{
+ 'id': 'id1585876275153',
+ 'type': 'table',
+ 'rows': [
+ ['__KEY_REPORTING.DEFAULT-REPORTS.PROCESS-DEFINITION-OVERVIEW.GENERAL-TABLE-TOTAL-PROCESS-DEFINITIONS', '9'],
+ ['__KEY_REPORTING.DEFAULT-REPORTS.PROCESS-DEFINITION-OVERVIEW.GENERAL-TABLE-TOTAL-PROCESS-INSTANCES', '41'],
+ ['__KEY_REPORTING.DEFAULT-REPORTS.PROCESS-DEFINITION-OVERVIEW.GENERAL-TABLE-ACTIVE-PROCESS-INSTANCES', '3'],
+ ['__KEY_REPORTING.DEFAULT-REPORTS.PROCESS-DEFINITION-OVERVIEW.GENERAL-TABLE-COMPLETED-PROCESS-INSTANCES', '38']
+ ]
+ }, {
+ 'id': 'id1585876413072',
+ 'type': 'pieChart',
+ 'title': 'Total process instances overview',
+ 'titleKey': 'REPORTING.DEFAULT-REPORTS.PROCESS-DEFINITION-OVERVIEW.PROC-INST-CHART-TITLE',
+ 'values': [{
+ 'key': 'Second Process',
+ 'y': 4,
+ 'keyAndValue': ['Second Process', '4']
+ }, {
+ 'key': 'Simple process',
+ 'y': 30,
+ 'keyAndValue': ['Simple process', '30']
+ }, {
+ 'key': 'Third Process',
+ 'y': 7,
+ 'keyAndValue': ['Third Process', '7']
+ }]
+ }, {
+ 'id': 'id1585877659181',
+ 'type': 'table',
+ 'title': 'Process definition details',
+ 'titleKey': 'REPORTING.DEFAULT-REPORTS.PROCESS-DEFINITION-OVERVIEW.DETAIL-TABLE',
+ 'columnNames': ['Process definition', 'Total', 'Active', 'Completed'],
+ 'columnNameKeys': ['REPORTING.DEFAULT-REPORTS.PROCESS-DEFINITION-OVERVIEW.DETAIL-TABLE-PROCESS',
+ 'REPORTING.DEFAULT-REPORTS.PROCESS-DEFINITION-OVERVIEW.DETAIL-TABLE-TOTAL',
+ 'REPORTING.DEFAULT-REPORTS.PROCESS-DEFINITION-OVERVIEW.DETAIL-TABLE-ACTIVE',
+ 'REPORTING.DEFAULT-REPORTS.PROCESS-DEFINITION-OVERVIEW.DETAIL-TABLE-COMPLETED'],
+ 'columnsCentered': [false, false, false, false],
+ 'rows': [
+ ['Second Process', '4', '0', '4'],
+ ['Simple process', '30', '3', '27'],
+ ['Third Process', '7', '0', '7']
+ ]
+ }]
+};
+
+export var chartTaskOverview = {
+ 'elements': [{
+ 'id': 'id792351752194',
+ 'type': 'barChart',
+ 'title': 'title',
+ 'titleKey': 'REPORTING.DEFAULT-REPORTS.TASK-OVERVIEW.TASK-HISTOGRAM-TITLE',
+ 'values': [{
+ 'key': 'series1',
+ 'values': [['2016-09-30T00:00:00.000+0000', 3], ['2016-10-04T00:00:00.000+0000', 1]]
+ }],
+ 'xAxisType': 'date_month',
+ 'yAxisType': 'count'
+ }, {
+ 'id': 'id792349721129',
+ 'type': 'masterDetailTable',
+ 'title': 'Detailed task statistics',
+ 'titleKey': 'REPORTING.DEFAULT-REPORTS.TASK-OVERVIEW.DETAILED-TASK-STATS-TITLE',
+ 'columnNames': ['Task', 'Count', 'Sum', 'Min duration', 'Max duration', 'Average duration', 'Stddev duration'],
+ 'columnNameKeys': [
+ 'REPORTING.DEFAULT-REPORTS.TASK-OVERVIEW.DETAILED-TASK-STATS-TASK',
+ 'REPORTING.DEFAULT-REPORTS.TASK-OVERVIEW.COUNT',
+ 'REPORTING.DEFAULT-REPORTS.TASK-OVERVIEW.SUM',
+ 'REPORTING.DEFAULT-REPORTS.TASK-OVERVIEW.MIN-DURATION',
+ 'REPORTING.DEFAULT-REPORTS.TASK-OVERVIEW.MAX-DURATION',
+ 'REPORTING.DEFAULT-REPORTS.TASK-OVERVIEW.AVERAGE',
+ 'REPORTING.DEFAULT-REPORTS.TASK-OVERVIEW.STDDE'],
+ 'columnsCentered': [false, false, false, false],
+ 'rows': [
+ ['fake 1 user task', '1', '2.0', '3.0', '4.0', '5.0', '6.0'],
+ ['fake 2 user task', '1', '2.0', '3.0', '4.0', '5.0', '6.0']
+ ]
+ }]
+};
+
+export var fieldNumber = new ReportParameterModel(
+ {
+ id: 'slowProcessInstanceInteger',
+ type: 'integer',
+ value: '102'
+ }
+);
+
+export var fieldStatus = new ReportParameterModel(
+ {
+ id: 'status',
+ type: 'status',
+ value: 'fake-value'
+ }
+);
+
+export var fieldTypeFiltering = new ReportParameterModel(
+ {
+ id: 'typeFiltering',
+ type: 'boolean',
+ value: false
+ }
+);
+
+export var fieldTask = new ReportParameterModel(
+ {
+ id: 'taskName',
+ type: 'task',
+ value: 'fake-task-name'
+ }
+);
+
+export var fieldDateRange = {
+ startDate: '2016-10-12T00:00:00.000Z',
+ endDate: '2016-10-14T00:00:00.000Z'
+};
+
+export var fieldDateRangeInterval = new ReportParameterModel(
+ {
+ id: 'dateRangeInterval',
+ type: 'dateInterval',
+ value: 'fake-date-interval'
+ }
+);
+
+export var fieldProcessDef = new ReportParameterModel(
+ {
+ id: 'processDefinitionId',
+ type: 'processDefinition',
+ value: 'fake-process-name:1:15027'
+ }
+);
+
+export var fieldDuration = {value: 30};
diff --git a/ng2-components/ng2-activiti-analytics/src/components/analytics.component.html b/ng2-components/ng2-activiti-analytics/src/components/analytics.component.html
index aa810d1716..93f958d5e5 100644
--- a/ng2-components/ng2-activiti-analytics/src/components/analytics.component.html
+++ b/ng2-components/ng2-activiti-analytics/src/components/analytics.component.html
@@ -54,7 +54,6 @@
refresh
-
ReportForm : {{ reportForm.value | json }}
ReportForm valid : {{ reportForm.valid }}
ReportForm status : {{ reportForm.errors | json }}
ReportForm FormGroup valid : {{ reportForm.controls.dateRange.valid | json }}
@@ -70,11 +69,11 @@
[data]="report.data"
[datasets]="report.datasets"
[labels]="report.labels"
- [chartType]="report.type"
- (chartClick)="chartClicked($event)">
+ [chartType]="report.type">
+
{{label | translate}} |
@@ -83,6 +82,7 @@
{{row | translate }} |
+
@@ -100,8 +100,7 @@
[datasets]="report.datasets"
[labels]="report.labels"
[options]="report.options"
- [chartType]="report.type"
- (chartClick)="chartClicked($event)">
+ [chartType]="report.type">
diff --git a/ng2-components/ng2-activiti-analytics/src/components/analytics.component.spec.ts b/ng2-components/ng2-activiti-analytics/src/components/analytics.component.spec.ts
index d95f64ed2d..ee662468e9 100644
--- a/ng2-components/ng2-activiti-analytics/src/components/analytics.component.spec.ts
+++ b/ng2-components/ng2-activiti-analytics/src/components/analytics.component.spec.ts
@@ -26,8 +26,16 @@ import { WIDGET_DIRECTIVES } from '../components/widgets/index';
import { CHART_DIRECTIVES } from 'ng2-charts/ng2-charts';
import { AnalyticsService } from '../services/analytics.service';
-
-import { DebugElement, SimpleChange } from '@angular/core';
+import { ReportModel, ReportQuery } from '../models/report.model';
+import { Chart } from '../models/chart.model';
+import * as moment from 'moment';
+import { DebugElement, SimpleChange } from '@angular/core';
+import {
+ reportDefParamCheck, reportDefParamDateRange, chartProcessDefOverview, chartTaskOverview, fieldDateRange,
+ fieldDateRangeInterval, fieldDuration, fieldNumber, fieldProcessDef, fieldStatus, fieldTask, fieldTypeFiltering,
+ reportDefParamDuration, reportDefParamNumber, reportDefParamTaskOptions, reportDefParamStatus,
+ reportDefParamRangeInterval, reportDefParamProcessDef, reportDefParamProcessDefOptions, reportDefParamTask
+} from '../assets/analyticsComponent.mock';
export const ANALYTICS_DIRECTIVES: any[] = [
AnalyticsComponent,
@@ -39,30 +47,10 @@ export const ANALYTICS_PROVIDERS: any[] = [
];
declare let jasmine: any;
+declare let mdDateTimePicker: any;
describe('Test ng2-activiti-analytics Report ', () => {
- let reportDefParamStatus = {
- 'id': 2005,
- 'name': 'Fake Task overview status',
- 'created': '2016-10-05T15:39:40.222+0000',
- 'definition': '{ "parameters" :[{"id":"status","name":null,"nameKey":null,"type":"status","value":null,"dependsOn":null}]}'
- };
-
- let reportDefParamRangeInterval = {
- 'id': 2006,
- 'name': 'Fake Task overview RangeInterval',
- 'created': '2016-10-05T15:39:40.222+0000',
- 'definition': '{ "parameters" :[{"id":"dateRangeInterval","name":null,"nameKey":null,"type":"dateInterval","value":null,"dependsOn":null}]}'
- };
-
- let reportDefParamProcessDef = {
- 'id': 2006,
- 'name': 'Fake Task overview ProcessDefinition',
- 'created': '2016-10-05T15:39:40.222+0000',
- 'definition': '{ "parameters" :[{"id":"processDefinitionId","name":null,"nameKey":null,"type":"processDefinition","value":null,"dependsOn":null}]}'
- };
-
let component: any;
let fixture: ComponentFixture
;
let debug: DebugElement;
@@ -118,7 +106,7 @@ describe('Test ng2-activiti-analytics Report ', () => {
it('Should render a dropdown with all the status when the definition parameter type is \'status\' ', (done) => {
fixture.detectChanges();
- component.onSuccess.subscribe(() => {
+ component.onSuccessParamsReport.subscribe(() => {
fixture.detectChanges();
let dropDown: any = element.querySelector('#select-status');
expect(element.querySelector('h1').innerHTML).toEqual('Fake Task overview status');
@@ -142,10 +130,108 @@ describe('Test ng2-activiti-analytics Report ', () => {
});
});
+ it('Should render a number with the default value when the definition parameter type is \'integer\' ', (done) => {
+ fixture.detectChanges();
+
+ component.onSuccessParamsReport.subscribe(() => {
+ fixture.detectChanges();
+ let numberElement: any = element.querySelector('#slowProcessInstanceInteger');
+ expect(numberElement.value).toEqual('10');
+
+ done();
+ });
+
+ let reportId = 1;
+ let change = new SimpleChange(null, reportId);
+ component.ngOnChanges({ 'reportId': change });
+
+ jasmine.Ajax.requests.mostRecent().respondWith({
+ status: 200,
+ contentType: 'json',
+ responseText: reportDefParamNumber
+ });
+ });
+
+ it('Should render a duration component when the definition parameter type is \'duration\' ', (done) => {
+ fixture.detectChanges();
+
+ component.onSuccessParamsReport.subscribe(() => {
+ fixture.detectChanges();
+ let numberElement: any = element.querySelector('#duration');
+ expect(numberElement.value).toEqual('0');
+
+ let dropDown: any = element.querySelector('#select-duration');
+ expect(dropDown).toBeDefined();
+ expect(dropDown.length).toEqual(4);
+ expect(dropDown[0].innerHTML).toEqual('Seconds');
+ expect(dropDown[1].innerHTML).toEqual('Minutes');
+ expect(dropDown[2].innerHTML).toEqual('Hours');
+ expect(dropDown[3].innerHTML).toEqual('Days');
+ done();
+ });
+
+ let reportId = 1;
+ let change = new SimpleChange(null, reportId);
+ component.ngOnChanges({ 'reportId': change });
+
+ jasmine.Ajax.requests.mostRecent().respondWith({
+ status: 200,
+ contentType: 'json',
+ responseText: reportDefParamDuration
+ });
+ });
+
+ it('Should render a checkbox with the value true when the definition parameter type is \'boolean\' ', (done) => {
+ fixture.detectChanges();
+
+ component.onSuccessParamsReport.subscribe(() => {
+ fixture.detectChanges();
+ let checkElement: any = element.querySelector('#typeFiltering');
+ expect(checkElement.checked).toBeTruthy();
+ done();
+ });
+
+ let reportId = 1;
+ let change = new SimpleChange(null, reportId);
+ component.ngOnChanges({ 'reportId': change });
+
+ jasmine.Ajax.requests.mostRecent().respondWith({
+ status: 200,
+ contentType: 'json',
+ responseText: reportDefParamCheck
+ });
+ });
+
+ it('Should render a date range components when the definition parameter type is \'dateRange\' ', (done) => {
+ fixture.detectChanges();
+
+ component.onSuccessParamsReport.subscribe(() => {
+ fixture.detectChanges();
+ let today = moment().format('YYYY-MM-DD');
+
+ const startDate: any = element.querySelector('#startDateInput');
+ const endDate: any = element.querySelector('#endDateInput');
+
+ expect(startDate.value).toEqual(today);
+ expect(endDate.value).toEqual(today);
+ done();
+ });
+
+ let reportId = 1;
+ let change = new SimpleChange(null, reportId);
+ component.ngOnChanges({ 'reportId': change });
+
+ jasmine.Ajax.requests.mostRecent().respondWith({
+ status: 200,
+ contentType: 'json',
+ responseText: reportDefParamDateRange
+ });
+ });
+
it('Should render a dropdown with all the RangeInterval when the definition parameter type is \'dateRangeInterval\' ', (done) => {
fixture.detectChanges();
- component.onSuccess.subscribe(() => {
+ component.onSuccessParamsReport.subscribe(() => {
fixture.detectChanges();
let dropDown: any = element.querySelector('#select-dateRangeInterval');
expect(dropDown).toBeDefined();
@@ -172,16 +258,16 @@ describe('Test ng2-activiti-analytics Report ', () => {
it('Should render a dropdown with all the process definition when the definition parameter type is \'processDefinition\' ', (done) => {
fixture.detectChanges();
- component.onSuccess.subscribe(() => {
+ component.onSuccessParamOpt.subscribe(() => {
fixture.detectChanges();
- let dropDown: any = element.querySelector('#select-processDefinition');
+ let dropDown: any = element.querySelector('#select-processDefinitionId');
expect(dropDown).toBeDefined();
expect(dropDown.length).toEqual(5);
- expect(dropDown[0].innerHTML).toEqual('By hour');
- expect(dropDown[1].innerHTML).toEqual('By day');
- expect(dropDown[2].innerHTML).toEqual('By week');
- expect(dropDown[3].innerHTML).toEqual('By month');
- expect(dropDown[4].innerHTML).toEqual('By year');
+ expect(dropDown[0].innerHTML).toEqual('Choose One');
+ expect(dropDown[1].innerHTML).toEqual('Fake Process Test 1 Name (v 1) ');
+ expect(dropDown[2].innerHTML).toEqual('Fake Process Test 1 Name (v 2) ');
+ expect(dropDown[3].innerHTML).toEqual('Fake Process Test 2 Name (v 1) ');
+ expect(dropDown[4].innerHTML).toEqual('Fake Process Test 3 Name (v 1) ');
done();
});
@@ -189,14 +275,274 @@ describe('Test ng2-activiti-analytics Report ', () => {
let change = new SimpleChange(null, reportId);
component.ngOnChanges({ 'reportId': change });
- jasmine.Ajax.requests.mostRecent().respondWith({
+ jasmine.Ajax.requests.first().respondWith({
status: 200,
contentType: 'json',
responseText: reportDefParamProcessDef
});
+
+ jasmine.Ajax.requests.mostRecent().respondWith({
+ status: 200,
+ contentType: 'json',
+ responseText: reportDefParamProcessDefOptions
+ });
+
});
- it('Should emit an error with a 404 response', (done) => {
+ it('Should render the Process definition overview report ', (done) => {
+ fixture.detectChanges();
+
+ component.onShowReport.subscribe((res) => {
+ // fixture.detectChanges();
+
+ expect(res).toBeDefined();
+ expect(res.length).toEqual(3);
+
+ expect(res[0]).toBeDefined();
+ expect(res[0].type).toEqual('table');
+ expect(res[0].datasets).toBeDefined();
+ expect(res[0].datasets.length).toEqual(4);
+ expect(res[0].datasets[0][0]).toEqual('__KEY_REPORTING.DEFAULT-REPORTS.PROCESS-DEFINITION-OVERVIEW.GENERAL-TABLE-TOTAL-PROCESS-DEFINITIONS');
+ expect(res[0].datasets[0][1]).toEqual('9');
+ expect(res[0].datasets[1][0]).toEqual('__KEY_REPORTING.DEFAULT-REPORTS.PROCESS-DEFINITION-OVERVIEW.GENERAL-TABLE-TOTAL-PROCESS-INSTANCES');
+ expect(res[0].datasets[1][1]).toEqual('41');
+ expect(res[0].datasets[2][0]).toEqual('__KEY_REPORTING.DEFAULT-REPORTS.PROCESS-DEFINITION-OVERVIEW.GENERAL-TABLE-ACTIVE-PROCESS-INSTANCES');
+ expect(res[0].datasets[2][1]).toEqual('3');
+ expect(res[0].datasets[3][0]).toEqual('__KEY_REPORTING.DEFAULT-REPORTS.PROCESS-DEFINITION-OVERVIEW.GENERAL-TABLE-COMPLETED-PROCESS-INSTANCES');
+ expect(res[0].datasets[3][1]).toEqual('38');
+
+ expect(res[1]).toBeDefined();
+ expect(res[1].type).toEqual('pie');
+
+ expect(res[2]).toBeDefined();
+ expect(res[2].type).toEqual('table');
+
+ done();
+ });
+
+ component.reportDetails = new ReportModel({
+ id: 1,
+ definition:
+ '{ "parameters" :[{"id":"status","type":"status", "options": [{"id": "all", "name" :"all"}],"value":null}]}'
+ });
+
+ component.reportParamQuery = new ReportQuery({status: 'All'});
+ component.showReport();
+
+ jasmine.Ajax.requests.mostRecent().respondWith({
+ status: 200,
+ contentType: 'json',
+ responseText: chartProcessDefOverview
+ });
+ });
+
+ it('Should render the Task overview report ', (done) => {
+ fixture.detectChanges();
+
+ component.onShowReport.subscribe((res) => {
+ // fixture.detectChanges();
+
+ expect(res).toBeDefined();
+ expect(res.length).toEqual(2);
+
+ expect(res[0]).toBeDefined();
+ expect(res[0].type).toEqual('bar');
+ expect(res[0].labels).toBeDefined();
+ expect(res[0].labels.length).toEqual(2);
+ expect(res[0].labels[0]).toEqual('2016-09-30T00:00:00.000+0000');
+ expect(res[0].labels[1]).toEqual('2016-10-04T00:00:00.000+0000');
+ expect(res[0].datasets[0].label).toEqual('series1');
+ expect(res[0].datasets[0].data[0]).toEqual(3);
+ expect(res[0].datasets[0].data[1]).toEqual(1);
+
+ expect(res[1]).toBeDefined();
+ expect(res[1].type).toEqual('table');
+ expect(res[1].datasets).toBeDefined();
+ expect(res[1].datasets.length).toEqual(2);
+ expect(res[1].datasets[0][0]).toEqual('fake 1 user task');
+ expect(res[1].datasets[0][1]).toEqual('1');
+ expect(res[1].datasets[0][2]).toEqual('2.0');
+ expect(res[1].datasets[0][3]).toEqual('3.0');
+ expect(res[1].datasets[0][4]).toEqual('4.0');
+ expect(res[1].datasets[0][5]).toEqual('5.0');
+ expect(res[1].datasets[0][6]).toEqual('6.0');
+ expect(res[1].datasets[1][0]).toEqual('fake 2 user task');
+ expect(res[1].datasets[1][1]).toEqual('1');
+ expect(res[1].datasets[1][2]).toEqual('2.0');
+ expect(res[1].datasets[1][3]).toEqual('3.0');
+ expect(res[1].datasets[1][4]).toEqual('4.0');
+ expect(res[1].datasets[1][5]).toEqual('5.0');
+ expect(res[1].datasets[1][6]).toEqual('6.0');
+
+ done();
+ });
+
+ component.reportDetails = new ReportModel({
+ id: 1,
+ definition:
+ '{ "parameters" :[{"id":"status","type":"status", "options": [{"id": "all", "name" :"all"}],"value":null}]}'
+ });
+
+ component.reportParamQuery = new ReportQuery({status: 'All'});
+ component.showReport();
+
+ jasmine.Ajax.requests.mostRecent().respondWith({
+ status: 200,
+ contentType: 'json',
+ responseText: chartTaskOverview
+ });
+ });
+
+ it('Should reset the report and save the number value onNumberChanges method', () => {
+ component.reports = [ new Chart({id: 'fake', type: 'fake-type'})];
+ component.onNumberChanges(fieldNumber);
+
+ expect(component.reports).toBeNull();
+ expect(component.reportParamQuery.slowProcessInstanceInteger).toEqual(102);
+ });
+
+ it('Should reset the report and save the duration value onDurationChanges method', () => {
+ component.reports = [ new Chart({id: 'fake', type: 'fake-type'})];
+ component.onDurationChanges(fieldDuration);
+
+ expect(component.reports).toBeNull();
+ expect(component.reportParamQuery.duration).toEqual(30);
+ });
+
+ it('Should reset the report and save the status value onStatusChanges method', () => {
+ component.reports = [ new Chart({id: 'fake', type: 'fake-type'})];
+ component.onStatusChanges(fieldStatus);
+
+ expect(component.reports).toBeNull();
+ expect(component.reportParamQuery.status).toEqual('fake-value');
+ });
+
+ it('Should reset the report and save the typeFiltering value onTypeFilteringChanges method', () => {
+ component.reports = [ new Chart({id: 'fake', type: 'fake-type'})];
+ component.onTypeFilteringChanges(fieldTypeFiltering);
+
+ expect(component.reports).toBeNull();
+ expect(component.reportParamQuery.typeFiltering).toBeFalsy();
+ });
+
+ it('Should reset the report and save the taskName value onTaskChanges method', () => {
+ component.reports = [ new Chart({id: 'fake', type: 'fake-type'})];
+ component.onTaskChanges(fieldTask);
+
+ expect(component.reports).toBeNull();
+ expect(component.reportParamQuery.taskName).toEqual('fake-task-name');
+ });
+
+ it('Should reset the report and save the dateRange value onDateRangeChange method', () => {
+ component.reports = [ new Chart({id: 'fake', type: 'fake-type'})];
+ component.onDateRangeChange(fieldDateRange);
+
+ expect(component.reports).toBeNull();
+ expect(component.reportParamQuery.dateRange.startDate).toEqual('2016-10-12T00:00:00.000Z');
+ expect(component.reportParamQuery.dateRange.endDate).toEqual('2016-10-14T00:00:00.000Z');
+ });
+
+ it('Should reset the report and save the dateRangeInterval value onDateRangeIntervalChange method', () => {
+ component.reports = [ new Chart({id: 'fake', type: 'fake-type'})];
+ component.onDateRangeIntervalChange(fieldDateRangeInterval);
+
+ expect(component.reports).toBeNull();
+ expect(component.reportParamQuery.dateRangeInterval).toEqual('fake-date-interval');
+ });
+
+ it('Should reset the report and save the processDefinitionId value onProcessDefinitionChanges method', () => {
+ component.reports = [ new Chart({id: 'fake', type: 'fake-type'})];
+ component.reportDetails = new ReportModel({
+ id: 1,
+ definition:
+ '{ "parameters" :[{"id":"processDefinitionId","type":"processDefinition","value":null}]}'
+ });
+ component.onProcessDefinitionChanges(fieldProcessDef);
+
+ expect(component.reports).toBeNull();
+ expect(component.reportParamQuery.processDefinitionId).toEqual('fake-process-name:1:15027');
+ });
+
+ it('Should load the task list when a process definition is selected', () => {
+
+ component.onSuccessParamsReport.subscribe((res) => {
+
+ expect(res).toBeDefined();
+ expect(res.length).toEqual(2);
+ expect(res[0].id).toEqual('Fake task name 1');
+ expect(res[0].name).toEqual('Fake task name 1');
+ expect(res[1].id).toEqual('Fake task name 2');
+ expect(res[1].name).toEqual('Fake task name 2');
+ });
+
+ component.reportId = 100;
+ component.reports = [ new Chart({id: 'fake', type: 'fake-type'})];
+ component.reportDetails = new ReportModel(reportDefParamTask);
+ component.onProcessDefinitionChanges(fieldProcessDef);
+
+ jasmine.Ajax.requests.mostRecent().respondWith({
+ status: 200,
+ contentType: 'json',
+ responseText: reportDefParamTaskOptions
+ });
+ });
+
+ it('Should convert a string in number', () => {
+ let numberConvert = component.convertNumber('2');
+ expect(numberConvert).toEqual(2);
+ });
+
+ it('Should emit an error with a 404 response when the options response is not found', (done) => {
+ fixture.detectChanges();
+
+ component.onError.subscribe((err) => {
+ expect(err).toBeDefined();
+ done();
+ });
+
+ let reportId = 1;
+ let change = new SimpleChange(null, reportId);
+ component.ngOnChanges({ 'reportId': change });
+
+ jasmine.Ajax.requests.first().respondWith({
+ status: 200,
+ contentType: 'json',
+ responseText: reportDefParamProcessDef
+ });
+
+ jasmine.Ajax.requests.mostRecent().respondWith({
+ status: 404,
+ contentType: 'json',
+ responseText: []
+ });
+ });
+
+ it('Should emit an error with a 404 response when the Process definition overview response is not found ', (done) => {
+ fixture.detectChanges();
+
+ component.onError.subscribe((err) => {
+ expect(err).toBeDefined();
+ done();
+ });
+
+ component.reportDetails = new ReportModel({
+ id: 1,
+ definition:
+ '{ "parameters" :[{"id":"status","type":"status", "options": [{"id": "all", "name" :"all"}],"value":null}]}'
+ });
+
+ component.reportParamQuery = new ReportQuery({status: 'All'});
+ component.showReport();
+
+ jasmine.Ajax.requests.mostRecent().respondWith({
+ status: 404,
+ contentType: 'json',
+ responseText: []
+ });
+
+ });
+
+ it('Should emit an error with a 404 response when the report parameters response is not found', (done) => {
fixture.detectChanges();
component.onError.subscribe((err) => {
diff --git a/ng2-components/ng2-activiti-analytics/src/components/analytics.component.ts b/ng2-components/ng2-activiti-analytics/src/components/analytics.component.ts
index 859ccffa7f..2363677531 100644
--- a/ng2-components/ng2-activiti-analytics/src/components/analytics.component.ts
+++ b/ng2-components/ng2-activiti-analytics/src/components/analytics.component.ts
@@ -42,6 +42,18 @@ export class AnalyticsComponent implements OnInit, OnChanges {
@Output()
onError = new EventEmitter();
+ @Output()
+ onDropdownChanged = new EventEmitter();
+
+ @Output()
+ onShowReport = new EventEmitter();
+
+ @Output()
+ onSuccessParamsReport = new EventEmitter();
+
+ @Output()
+ onSuccessParamOpt = new EventEmitter();
+
reportDetails: ReportModel;
reportParamQuery = new ReportQuery();
@@ -50,7 +62,11 @@ export class AnalyticsComponent implements OnInit, OnChanges {
reportForm: FormGroup;
- debug: boolean = true;
+ debug: boolean = false;
+
+ private dropDownSub;
+ private paramsReportSub;
+ private paramOpts;
constructor(private translate: AlfrescoTranslationService,
private analyticsService: AnalyticsService,
@@ -65,6 +81,19 @@ export class AnalyticsComponent implements OnInit, OnChanges {
this.reportForm = this.formBuilder.group({
dateRange: new FormGroup({})
});
+
+ this.dropDownSub = this.onDropdownChanged.subscribe((field) => {
+ let paramDependOn: ReportParameterModel = this.reportDetails.definition.parameters.find(p => p.dependsOn === field.id);
+ if (paramDependOn) {
+ this.retrieveParameterOptions(this.reportDetails.definition.parameters, this.reportId, field.value);
+ }
+ });
+
+ this.paramOpts = this.onSuccessParamsReport.subscribe((report: ReportModel) => {
+ if (report.hasParameters()) {
+ this.retrieveParameterOptions(report.definition.parameters);
+ }
+ });
}
ngOnChanges(changes: SimpleChanges) {
@@ -77,14 +106,10 @@ export class AnalyticsComponent implements OnInit, OnChanges {
public getParamsReports(reportId: string) {
this.reset();
- this.analyticsService.getParamsReports(reportId).subscribe(
+ this.paramsReportSub = this.analyticsService.getParamsReports(reportId).subscribe(
(res: ReportModel) => {
this.reportDetails = res;
- if (this.reportDetails.hasParameters()) {
- this.retrieveParameterOptions(this.reportDetails.definition.parameters);
- } else {
- this.onSuccess.emit(res);
- }
+ this.onSuccessParamsReport.emit(res);
},
(err: any) => {
console.log(err);
@@ -94,12 +119,12 @@ export class AnalyticsComponent implements OnInit, OnChanges {
);
}
- private retrieveParameterOptions(parameters: ReportParameterModel[]) {
+ private retrieveParameterOptions(parameters: ReportParameterModel[], reportId?: string, processDefinitionId?: string) {
parameters.forEach((param) => {
- this.analyticsService.getParamValuesByType(param.type).subscribe(
+ this.analyticsService.getParamValuesByType(param.type, this.reportId, processDefinitionId).subscribe(
(opts: ParameterValueModel[]) => {
param.options = opts;
- this.onSuccess.emit(this.reportDetails);
+ this.onSuccessParamOpt.emit(opts);
},
(err: any) => {
console.log(err);
@@ -114,7 +139,7 @@ export class AnalyticsComponent implements OnInit, OnChanges {
this.analyticsService.getReportsByParams(this.reportDetails.id, this.reportParamQuery).subscribe(
(res: Chart[]) => {
this.reports = res;
- this.onSuccess.emit(res);
+ this.onShowReport.emit(res);
},
(err: any) => {
this.onError.emit(err);
@@ -150,13 +175,7 @@ export class AnalyticsComponent implements OnInit, OnChanges {
this.reset();
if (field.value) {
this.reportParamQuery.processDefinitionId = field.value;
- this.analyticsService.getTasksByProcessDefinitionId(this.reportId, this.reportParamQuery.processDefinitionId).subscribe(
- (res: any) => {
- let paramTask: ReportParameterModel = this.reportDetails.definition.parameters.find(p => p.type === 'task');
- if (paramTask) {
- paramTask.options = res;
- }
- });
+ this.onDropdownChanged.emit(field);
}
}
@@ -180,15 +199,15 @@ export class AnalyticsComponent implements OnInit, OnChanges {
this.reports = null;
}
- public chartClicked(e: any): void {
- console.log(e);
- }
-
- public chartHovered(e: any): void {
- console.log(e);
- }
-
public convertNumber(value: string): number {
return parseInt(value, 10);
}
+
+ ngOnDestroy() {
+ this.dropDownSub.unsubscribe();
+ this.paramOpts.unsubscribe();
+ if (this.paramsReportSub) {
+ this.paramsReportSub.unsubscribe();
+ }
+ }
}
diff --git a/ng2-components/ng2-activiti-analytics/src/components/widgets/date-range/date-range.widget.ts b/ng2-components/ng2-activiti-analytics/src/components/widgets/date-range/date-range.widget.ts
index 0ab665df4b..6dcbcf9513 100644
--- a/ng2-components/ng2-activiti-analytics/src/components/widgets/date-range/date-range.widget.ts
+++ b/ng2-components/ng2-activiti-analytics/src/components/widgets/date-range/date-range.widget.ts
@@ -54,7 +54,7 @@ export class DateRangeWidget extends WidgetComponent {
@Output()
dateRangeChanged: EventEmitter = new EventEmitter();
- debug: boolean = true;
+ debug: boolean = false;
dialogStart: any = new mdDateTimePicker.default({
type: 'date',
diff --git a/ng2-components/ng2-activiti-analytics/src/components/widgets/date/date.widget.css b/ng2-components/ng2-activiti-analytics/src/components/widgets/date/date.widget.css
deleted file mode 100644
index 48a6b82b45..0000000000
--- a/ng2-components/ng2-activiti-analytics/src/components/widgets/date/date.widget.css
+++ /dev/null
@@ -1,19 +0,0 @@
-.date-widget {
- width: 100%;
-}
-
-.date-widget__invalid .mdl-textfield__input {
- border-color: #d50000;
-}
-
-.date-widget__invalid .mdl-textfield__label {
- color: #d50000;
-}
-
-.date-widget__invalid .mdl-textfield__label:after {
- background-color: #d50000;
-}
-
-.date-widget__invalid .mdl-textfield__error {
- visibility: visible !important;
-}
diff --git a/ng2-components/ng2-activiti-analytics/src/components/widgets/date/date.widget.html b/ng2-components/ng2-activiti-analytics/src/components/widgets/date/date.widget.html
deleted file mode 100644
index 1312f7ebc8..0000000000
--- a/ng2-components/ng2-activiti-analytics/src/components/widgets/date/date.widget.html
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
- {{field.validationSummary}}
-
diff --git a/ng2-components/ng2-activiti-analytics/src/components/widgets/date/date.widget.ts b/ng2-components/ng2-activiti-analytics/src/components/widgets/date/date.widget.ts
deleted file mode 100644
index 78bf35a398..0000000000
--- a/ng2-components/ng2-activiti-analytics/src/components/widgets/date/date.widget.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-/*!
- * @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.
- */
-
-import { Component, ElementRef } from '@angular/core';
-import { WidgetComponent } from './../widget.component';
-
-@Component({
- moduleId: module.id,
- selector: 'date-widget',
- templateUrl: './date.widget.html',
- styleUrls: ['./date.widget.css']
-})
-export class DateWidget extends WidgetComponent {
-
- constructor(private elementRef: ElementRef) {
- super();
- }
-
- setupMaterialComponents(componentHandler: any): boolean {
- // workaround for MDL issues with dynamic components
- if (componentHandler) {
- componentHandler.upgradeAllRegistered();
- if (this.elementRef && this.hasValue()) {
- let el = this.elementRef.nativeElement;
- let container = el.querySelector('.mdl-textfield');
- if (container) {
- container.MaterialTextfield.change(this.field.value);
- }
- }
-
- return true;
- }
- return false;
- }
-
-}
diff --git a/ng2-components/ng2-activiti-analytics/src/components/widgets/duration/duration.widget.html b/ng2-components/ng2-activiti-analytics/src/components/widgets/duration/duration.widget.html
index 2db7992288..629574bd09 100644
--- a/ng2-components/ng2-activiti-analytics/src/components/widgets/duration/duration.widget.html
+++ b/ng2-components/ng2-activiti-analytics/src/components/widgets/duration/duration.widget.html
@@ -5,6 +5,7 @@
type="text"
pattern="-?[0-9]*(\.[0-9]+)?"
[attr.id]="field.id"
+ [value]="field.value"
[(ngModel)]="field.value"
(ngModelChange)="calculateDuration()">
diff --git a/ng2-components/ng2-activiti-analytics/src/components/widgets/index.ts b/ng2-components/ng2-activiti-analytics/src/components/widgets/index.ts
index efc2d86d5f..c044bc245b 100644
--- a/ng2-components/ng2-activiti-analytics/src/components/widgets/index.ts
+++ b/ng2-components/ng2-activiti-analytics/src/components/widgets/index.ts
@@ -19,7 +19,6 @@ import { DropdownWidget } from './dropdown/dropdown.widget';
import { NumberWidget } from './number/number.widget';
import { DurationWidget } from './duration/duration.widget';
import { CheckboxWidget } from './checkbox/checkbox.widget';
-import { DateWidget } from './date/date.widget';
import { DateRangeWidget } from './date-range/date-range.widget';
// primitives
@@ -27,7 +26,6 @@ export * from './dropdown/dropdown.widget';
export * from './number/number.widget';
export * from './duration/duration.widget';
export * from './checkbox/checkbox.widget';
-export * from './date/date.widget';
export * from './date-range/date-range.widget';
export const WIDGET_DIRECTIVES: any[] = [
@@ -35,6 +33,5 @@ export const WIDGET_DIRECTIVES: any[] = [
NumberWidget,
DurationWidget,
CheckboxWidget,
- DateWidget,
DateRangeWidget
];
diff --git a/ng2-components/ng2-activiti-analytics/src/components/widgets/number/number.widget.html b/ng2-components/ng2-activiti-analytics/src/components/widgets/number/number.widget.html
index 64acbf818e..babd53fc39 100644
--- a/ng2-components/ng2-activiti-analytics/src/components/widgets/number/number.widget.html
+++ b/ng2-components/ng2-activiti-analytics/src/components/widgets/number/number.widget.html
@@ -3,6 +3,7 @@
type="text"
pattern="-?[0-9]*(\.[0-9]+)?"
[attr.id]="field.id"
+ [value]="field.value"
[(ngModel)]="field.value"
(ngModelChange)="changeValue(field)">
diff --git a/ng2-components/ng2-activiti-analytics/src/components/widgets/number/number.widget.ts b/ng2-components/ng2-activiti-analytics/src/components/widgets/number/number.widget.ts
index d5ef372c94..cfe12f51af 100644
--- a/ng2-components/ng2-activiti-analytics/src/components/widgets/number/number.widget.ts
+++ b/ng2-components/ng2-activiti-analytics/src/components/widgets/number/number.widget.ts
@@ -36,7 +36,7 @@ export class NumberWidget extends WidgetComponent {
handler.upgradeAllRegistered();
if (this.elementRef && this.hasValue()) {
let container = this.elementRef.nativeElement.querySelector('.mdl-textfield');
- if (container) {
+ if (container && container.MaterialTextfield) {
container.MaterialTextfield.change(this.field.value.toString());
}
}
diff --git a/ng2-components/ng2-activiti-analytics/src/services/analytics.service.ts b/ng2-components/ng2-activiti-analytics/src/services/analytics.service.ts
index 8e87303a80..b51182e18d 100644
--- a/ng2-components/ng2-activiti-analytics/src/services/analytics.service.ts
+++ b/ng2-components/ng2-activiti-analytics/src/services/analytics.service.ts
@@ -130,7 +130,7 @@ export class AnalyticsService {
}
getTasksByProcessDefinitionId(reportId: string, processDefinitionId: string): Observable {
- if (processDefinitionId) {
+ if (reportId && processDefinitionId) {
let url = `${this.alfrescoSettingsService.getBPMApiBaseUrl()}/app/rest/reporting/report-params/${reportId}/tasks`;
let params: URLSearchParams;
if (processDefinitionId) {