TSK-355: now displaying taskStatusReport in taskana monitor
This commit is contained in:
parent
22ee9e96f9
commit
aeb7bc49ee
|
@ -11,12 +11,19 @@ import { AngularSvgIconModule } from 'angular-svg-icon';
|
||||||
import { AppComponent } from './app.component';
|
import { AppComponent } from './app.component';
|
||||||
import { TasksComponent } from './tasks/tasks.component';
|
import { TasksComponent } from './tasks/tasks.component';
|
||||||
import { WorkbasketComponent } from './workbasket/workbasket.component';
|
import { WorkbasketComponent } from './workbasket/workbasket.component';
|
||||||
|
import { Report } from "./report/report.component";
|
||||||
|
import { MapToIterable } from "./pipes/mapToIterable";
|
||||||
|
import { OrderBy } from "./pipes/orderBy";
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
declarations: [
|
declarations: [
|
||||||
AppComponent,
|
AppComponent,
|
||||||
TasksComponent,
|
TasksComponent,
|
||||||
WorkbasketComponent,
|
WorkbasketComponent,
|
||||||
|
Report,
|
||||||
|
MapToIterable,
|
||||||
|
OrderBy
|
||||||
|
|
||||||
],
|
],
|
||||||
imports: [
|
imports: [
|
||||||
BrowserModule,
|
BrowserModule,
|
||||||
|
@ -31,4 +38,5 @@ import { WorkbasketComponent } from './workbasket/workbasket.component';
|
||||||
providers: [HttpClientModule],
|
providers: [HttpClientModule],
|
||||||
bootstrap: [AppComponent]
|
bootstrap: [AppComponent]
|
||||||
})
|
})
|
||||||
export class AppModule { }
|
export class AppModule {
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
export class ReportMeta {
|
||||||
|
name: string;
|
||||||
|
date: string;
|
||||||
|
header: Array<string>;
|
||||||
|
rowDesc: string;
|
||||||
|
totalDesc: string;
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
import { ReportMeta } from "./report-meta";
|
||||||
|
|
||||||
|
export class ReportModel {
|
||||||
|
meta: ReportMeta;
|
||||||
|
// The keys of the rows object are unknown. They represent the name of that specific row.
|
||||||
|
// Each row (value of rows Object) has two keys: 'cells:Object' and 'total:number'.
|
||||||
|
// The keys of 'cells' are the same as 'meta.header:number'.
|
||||||
|
// This also applies to sumRow.
|
||||||
|
rows: Object;
|
||||||
|
sumRow: Object;
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
import { Pipe, PipeTransform } from '@angular/core';
|
||||||
|
|
||||||
|
@Pipe({
|
||||||
|
name: 'mapToIterable'
|
||||||
|
})
|
||||||
|
export class MapToIterable implements PipeTransform {
|
||||||
|
transform(dict: Object) {
|
||||||
|
let a = [];
|
||||||
|
for (let key in dict) {
|
||||||
|
if (dict.hasOwnProperty(key)) {
|
||||||
|
a.push({key: key, val: dict[key]});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
import { Pipe, PipeTransform } from "@angular/core";
|
||||||
|
|
||||||
|
@Pipe({name: 'orderBy'})
|
||||||
|
|
||||||
|
export class OrderBy implements PipeTransform {
|
||||||
|
transform(records: Array<Object>, sortKeys?: string[]): any {
|
||||||
|
return records.sort(function (a, b) {
|
||||||
|
for (let i = 0; i < sortKeys.length; i++) {
|
||||||
|
let sortKey = sortKeys[i];
|
||||||
|
let direction = 1;
|
||||||
|
if (sortKey.charAt(0) == "-") {
|
||||||
|
direction = -1;
|
||||||
|
sortKey = sortKey.substr(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (a[sortKey] < b[sortKey]) {
|
||||||
|
return -1 * direction;
|
||||||
|
} else if (a[sortKey] > b[sortKey]) {
|
||||||
|
return direction;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
<div class="row" *ngIf="model">
|
||||||
|
<div class="col-sm-12" style="margin-bottom: 10px">
|
||||||
|
<h4>{{model.meta.name}} ({{model.meta.date | date : 'dd.MM.yyyy HH:mm:ss'}})</h4>
|
||||||
|
<table class="table table-responsive table-condensed">
|
||||||
|
<tr>
|
||||||
|
<th>{{model.meta.rowDesc}}</th>
|
||||||
|
<th *ngFor="let header of model.meta.header">{{header}}</th>
|
||||||
|
<th>{{model.meta.totalDesc}}</th>
|
||||||
|
</tr>
|
||||||
|
<tr *ngFor="let row of model.rows | mapToIterable | orderBy:['key']">
|
||||||
|
<td>{{row.key}}</td>
|
||||||
|
<td *ngFor="let header of model.meta.header">{{row.val.cells[header]}}</td>
|
||||||
|
<th>{{row.val.total}}</th>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th>{{model.meta.totalDesc}}</th>
|
||||||
|
<th *ngFor="let header of model.meta.header">{{model.sumRow.cells[header]}}</th>
|
||||||
|
<th>{{model.sumRow.total}}</th>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
|
@ -0,0 +1,21 @@
|
||||||
|
import { Component, Input, OnInit } from "@angular/core";
|
||||||
|
import { ReportModel } from "../model/report";
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'report',
|
||||||
|
templateUrl: './report.component.html'
|
||||||
|
})
|
||||||
|
export class Report implements OnInit {
|
||||||
|
|
||||||
|
@Input()
|
||||||
|
model: ReportModel;
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnInit(): void {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -1,14 +1,16 @@
|
||||||
import { Injectable } from '@angular/core';
|
import { Injectable } from '@angular/core';
|
||||||
import { RequestOptions, Headers, Http, Response } from '@angular/http';
|
import { Headers, Http, RequestOptions } from '@angular/http';
|
||||||
import { environment } from '../../environments/environment';
|
import { environment } from '../../environments/environment';
|
||||||
import { Observable } from 'rxjs/Observable';
|
import { Observable } from 'rxjs/Observable';
|
||||||
import { State } from '../model/state';
|
import { State } from '../model/state';
|
||||||
import { WorkbasketCounter } from '../model/workbasket-counter';
|
import { WorkbasketCounter } from '../model/workbasket-counter';
|
||||||
|
import { ReportModel } from "../model/report";
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class RestConnectorService {
|
export class RestConnectorService {
|
||||||
|
|
||||||
constructor(private http: Http) { }
|
constructor(private http: Http) {
|
||||||
|
}
|
||||||
|
|
||||||
getTaskStatistics(): Observable<State[]> {
|
getTaskStatistics(): Observable<State[]> {
|
||||||
return this.http.get(environment.taskanaRestUrl + "/v1/monitor/countByState?states=READY,CLAIMED,COMPLETED", this.createAuthorizationHeader())
|
return this.http.get(environment.taskanaRestUrl + "/v1/monitor/countByState?states=READY,CLAIMED,COMPLETED", this.createAuthorizationHeader())
|
||||||
|
@ -21,6 +23,11 @@ export class RestConnectorService {
|
||||||
.map(res => res.json());
|
.map(res => res.json());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getTaskStatusReport(): Observable<ReportModel> {
|
||||||
|
return this.http.get(environment.taskanaRestUrl + "/v1/monitor/taskStatusReport", this.createAuthorizationHeader())
|
||||||
|
.map(res => res.json());
|
||||||
|
}
|
||||||
|
|
||||||
private createAuthorizationHeader() {
|
private createAuthorizationHeader() {
|
||||||
let headers: Headers = new Headers();
|
let headers: Headers = new Headers();
|
||||||
headers.append("Authorization", "Basic dXNlcl8xXzE6dXNlcl8xXzE=");
|
headers.append("Authorization", "Basic dXNlcl8xXzE6dXNlcl8xXzE=");
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
<div style="display: block" *ngIf="isDataAvailable">
|
<div style="display: block" *ngIf="isDataAvailable">
|
||||||
<canvas baseChart [data]="pieChartData" [labels]="pieChartLabels" [chartType]="pieChartType"></canvas>
|
<canvas baseChart [data]="pieChartData" [labels]="pieChartLabels" [chartType]="pieChartType"></canvas>
|
||||||
</div>
|
</div>
|
||||||
|
<report *ngIf="isDataAvailable" [model]="taskStatusReport"></report>
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import { Component, OnInit } from '@angular/core';
|
import { Component, OnInit } from '@angular/core';
|
||||||
import { RestConnectorService } from '../service/rest-connector.service';
|
import { RestConnectorService } from '../service/rest-connector.service';
|
||||||
import { State } from '../model/state';
|
import { Report } from "../report/report.component";
|
||||||
|
import { ReportModel } from "../model/report";
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'tasks',
|
selector: 'tasks',
|
||||||
|
@ -15,8 +16,11 @@ export class TasksComponent implements OnInit {
|
||||||
pieChartData: number[] = [];
|
pieChartData: number[] = [];
|
||||||
pieChartType: string = 'pie';
|
pieChartType: string = 'pie';
|
||||||
isDataAvailable: boolean = false;
|
isDataAvailable: boolean = false;
|
||||||
|
report: Report;
|
||||||
|
taskStatusReport: ReportModel;
|
||||||
|
|
||||||
constructor(private restConnectorService: RestConnectorService) { }
|
constructor(private restConnectorService: RestConnectorService) {
|
||||||
|
}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
this.restConnectorService.getTaskStatistics().subscribe(data => {
|
this.restConnectorService.getTaskStatistics().subscribe(data => {
|
||||||
|
@ -35,7 +39,10 @@ export class TasksComponent implements OnInit {
|
||||||
} else {
|
} else {
|
||||||
this.pieChartData.push(0);
|
this.pieChartData.push(0);
|
||||||
}
|
}
|
||||||
this.isDataAvailable = true;
|
|
||||||
});
|
});
|
||||||
|
this.restConnectorService.getTaskStatusReport().subscribe(report => {
|
||||||
|
this.taskStatusReport = report;
|
||||||
|
this.isDataAvailable = true;
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue