fix-statistics #110
@ -39,7 +39,7 @@ public class StatisticController {
|
||||
return ResponseEntity.ok(new WorkingStatus(missedSchedules, activeTime));
|
||||
}
|
||||
|
||||
@GetMapping("/statistics/{startingDate}/{endingDate}/{includeSubTaskgroups}")
|
||||
@GetMapping("/statistics/{startingDate}/{endingDate}")
|
||||
public ResponseEntity<?> getTaskgroupActivity(@PathVariable String startingDate, @PathVariable String endingDate){
|
||||
LocalDate starting = LocalDate.parse(startingDate, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
|
||||
LocalDate ending = LocalDate.parse(endingDate, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
|
||||
|
@ -5,11 +5,11 @@ import java.time.LocalDate;
|
||||
public class ActivityInfo {
|
||||
|
||||
private LocalDate scheduleDate;
|
||||
private int workedMinutes;
|
||||
private int activeMinutes;
|
||||
|
||||
public ActivityInfo(LocalDate scheduleDate, int workedMinutes) {
|
||||
this.scheduleDate = scheduleDate;
|
||||
this.workedMinutes = workedMinutes;
|
||||
this.activeMinutes = workedMinutes;
|
||||
}
|
||||
|
||||
public LocalDate getScheduleDate() {
|
||||
@ -20,11 +20,11 @@ public class ActivityInfo {
|
||||
this.scheduleDate = scheduleDate;
|
||||
}
|
||||
|
||||
public int getWorkedMinutes() {
|
||||
return workedMinutes;
|
||||
public int getActiveMinutes() {
|
||||
return activeMinutes;
|
||||
}
|
||||
|
||||
public void setWorkedMinutes(int workedMinutes) {
|
||||
this.workedMinutes = workedMinutes;
|
||||
public void setActiveMinutes(int activeMinutes) {
|
||||
this.activeMinutes = activeMinutes;
|
||||
}
|
||||
}
|
||||
|
@ -17,6 +17,7 @@ encoder.ts
|
||||
git_push.sh
|
||||
index.ts
|
||||
model/accountDeleteRequest.ts
|
||||
model/activityInfo.ts
|
||||
model/advancedScheduleFieldInfo.ts
|
||||
model/advancedScheduleInfo.ts
|
||||
model/advancedScheduleInfoAllOf.ts
|
||||
|
@ -203,28 +203,20 @@ export class HistoryService {
|
||||
}
|
||||
|
||||
/**
|
||||
* @param taskgroupID internal id of taskgroup
|
||||
* @param startingDate starting date
|
||||
* @param endingDate starting date
|
||||
* @param includeSubTaskgroups determines whether to include subtaskgroups or not
|
||||
* @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
|
||||
* @param reportProgress flag to report request and response progress.
|
||||
*/
|
||||
public statisticsTaskgroupActivityTaskgroupIDStartingDateEndingDateIncludeSubTaskgroupsGet(taskgroupID: number, startingDate: string, endingDate: string, includeSubTaskgroups: boolean, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable<Array<TaskgroupActivityInfo>>;
|
||||
public statisticsTaskgroupActivityTaskgroupIDStartingDateEndingDateIncludeSubTaskgroupsGet(taskgroupID: number, startingDate: string, endingDate: string, includeSubTaskgroups: boolean, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable<HttpResponse<Array<TaskgroupActivityInfo>>>;
|
||||
public statisticsTaskgroupActivityTaskgroupIDStartingDateEndingDateIncludeSubTaskgroupsGet(taskgroupID: number, startingDate: string, endingDate: string, includeSubTaskgroups: boolean, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable<HttpEvent<Array<TaskgroupActivityInfo>>>;
|
||||
public statisticsTaskgroupActivityTaskgroupIDStartingDateEndingDateIncludeSubTaskgroupsGet(taskgroupID: number, startingDate: string, endingDate: string, includeSubTaskgroups: boolean, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable<any> {
|
||||
if (taskgroupID === null || taskgroupID === undefined) {
|
||||
throw new Error('Required parameter taskgroupID was null or undefined when calling statisticsTaskgroupActivityTaskgroupIDStartingDateEndingDateIncludeSubTaskgroupsGet.');
|
||||
}
|
||||
public statisticsStartingDateEndingDateGet(startingDate: string, endingDate: string, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable<Array<TaskgroupActivityInfo>>;
|
||||
public statisticsStartingDateEndingDateGet(startingDate: string, endingDate: string, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable<HttpResponse<Array<TaskgroupActivityInfo>>>;
|
||||
public statisticsStartingDateEndingDateGet(startingDate: string, endingDate: string, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable<HttpEvent<Array<TaskgroupActivityInfo>>>;
|
||||
public statisticsStartingDateEndingDateGet(startingDate: string, endingDate: string, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable<any> {
|
||||
if (startingDate === null || startingDate === undefined) {
|
||||
throw new Error('Required parameter startingDate was null or undefined when calling statisticsTaskgroupActivityTaskgroupIDStartingDateEndingDateIncludeSubTaskgroupsGet.');
|
||||
throw new Error('Required parameter startingDate was null or undefined when calling statisticsStartingDateEndingDateGet.');
|
||||
}
|
||||
if (endingDate === null || endingDate === undefined) {
|
||||
throw new Error('Required parameter endingDate was null or undefined when calling statisticsTaskgroupActivityTaskgroupIDStartingDateEndingDateIncludeSubTaskgroupsGet.');
|
||||
}
|
||||
if (includeSubTaskgroups === null || includeSubTaskgroups === undefined) {
|
||||
throw new Error('Required parameter includeSubTaskgroups was null or undefined when calling statisticsTaskgroupActivityTaskgroupIDStartingDateEndingDateIncludeSubTaskgroupsGet.');
|
||||
throw new Error('Required parameter endingDate was null or undefined when calling statisticsStartingDateEndingDateGet.');
|
||||
}
|
||||
|
||||
let localVarHeaders = this.defaultHeaders;
|
||||
@ -259,7 +251,7 @@ export class HistoryService {
|
||||
responseType_ = 'text';
|
||||
}
|
||||
|
||||
return this.httpClient.get<Array<TaskgroupActivityInfo>>(`${this.configuration.basePath}/statistics/taskgroup-activity/${encodeURIComponent(String(taskgroupID))}/${encodeURIComponent(String(startingDate))}/${encodeURIComponent(String(endingDate))}/${encodeURIComponent(String(includeSubTaskgroups))}`,
|
||||
return this.httpClient.get<Array<TaskgroupActivityInfo>>(`${this.configuration.basePath}/statistics/${encodeURIComponent(String(startingDate))}/${encodeURIComponent(String(endingDate))}`,
|
||||
{
|
||||
context: localVarHttpContext,
|
||||
responseType: <any>responseType_,
|
||||
|
21
frontend/src/api/model/activityInfo.ts
Normal file
21
frontend/src/api/model/activityInfo.ts
Normal file
@ -0,0 +1,21 @@
|
||||
/**
|
||||
* API Title
|
||||
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
|
||||
*
|
||||
* The version of the OpenAPI document: 1.0
|
||||
*
|
||||
*
|
||||
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||
* https://openapi-generator.tech
|
||||
* Do not edit the class manually.
|
||||
*/
|
||||
|
||||
|
||||
export interface ActivityInfo {
|
||||
date: string;
|
||||
/**
|
||||
* Number of minutes the task was active
|
||||
*/
|
||||
activeMinutes: number;
|
||||
}
|
||||
|
@ -1,4 +1,5 @@
|
||||
export * from './accountDeleteRequest';
|
||||
export * from './activityInfo';
|
||||
export * from './advancedScheduleFieldInfo';
|
||||
export * from './advancedScheduleInfo';
|
||||
export * from './advancedScheduleInfoAllOf';
|
||||
|
@ -9,13 +9,12 @@
|
||||
* https://openapi-generator.tech
|
||||
* Do not edit the class manually.
|
||||
*/
|
||||
import { ActivityInfo } from './activityInfo';
|
||||
import { TaskgroupEntityInfo } from './taskgroupEntityInfo';
|
||||
|
||||
|
||||
export interface TaskgroupActivityInfo {
|
||||
date: string;
|
||||
/**
|
||||
* Number of minutes the task was active
|
||||
*/
|
||||
activeMinutes: number;
|
||||
taskgroup: TaskgroupEntityInfo;
|
||||
activityInfos: Array<ActivityInfo>;
|
||||
}
|
||||
|
||||
|
@ -40,7 +40,7 @@ export class HeatmapActivityComponent implements OnChanges{
|
||||
|
||||
ngOnChanges() {
|
||||
if(this.selectedTaskgroupPath != undefined) {
|
||||
this.historyService.statisticsTaskgroupActivityTaskgroupIDStartingDateEndingDateIncludeSubTaskgroupsGet(
|
||||
/*this.historyService.statisticsTaskgroupActivityTaskgroupIDStartingDateEndingDateIncludeSubTaskgroupsGet(
|
||||
this.selectedTaskgroupPath!.rootTasktroup.taskgroupID,
|
||||
moment().startOf('year').format("YYYY-MM-DD"),
|
||||
moment().endOf("year").format("YYYY-MM-DD"),
|
||||
@ -149,7 +149,7 @@ export class HeatmapActivityComponent implements OnChanges{
|
||||
}
|
||||
};
|
||||
}
|
||||
})
|
||||
})*/
|
||||
}
|
||||
}
|
||||
|
||||
@ -175,6 +175,6 @@ export class HeatmapActivityComponent implements OnChanges{
|
||||
}
|
||||
|
||||
private findTaskgroupActivityInfoByDate(date: moment.Moment, data: TaskgroupActivityInfo[]) {
|
||||
return data.find(taskActivity => moment(taskActivity.date).isSame(date))
|
||||
//return data.find(taskActivity => moment(taskActivity.date).isSame(date))
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
<div style="text-align:center">
|
||||
<apx-chart
|
||||
<apx-chart #chart *ngIf="chartOptions != undefined"
|
||||
[series]="chartOptions.series!"
|
||||
[chart]="chartOptions.chart!"
|
||||
[xaxis]="chartOptions.xaxis!"
|
||||
|
@ -1,4 +1,4 @@
|
||||
import {Component, Input, ViewChild} from '@angular/core';
|
||||
import {Component, Input, OnChanges, OnInit, SimpleChanges, ViewChild} from '@angular/core';
|
||||
import {FormControl} from "@angular/forms";
|
||||
import {ChangeContext, LabelType, Options} from "ngx-slider-v2";
|
||||
import {ApexAxisChartSeries, ChartComponent, ChartType} from "ng-apexcharts";
|
||||
@ -11,8 +11,8 @@ import {ChartOptions} from "../taskgroup-activity.component";
|
||||
templateUrl: './simple-activity-diagram.component.html',
|
||||
styleUrls: ['./simple-activity-diagram.component.css']
|
||||
})
|
||||
export class SimpleActivityDiagramComponent {
|
||||
@Input('selectedChartype') selectedChartype: string = "bar";
|
||||
export class SimpleActivityDiagramComponent implements OnChanges {
|
||||
@Input('selectedChartype') selectedChartype: string | undefined
|
||||
@Input() selectedTaskgroupPath: TaskgroupPathInfo | undefined;
|
||||
|
||||
sliderControl: FormControl = new FormControl()
|
||||
@ -31,11 +31,53 @@ export class SimpleActivityDiagramComponent {
|
||||
};
|
||||
|
||||
@ViewChild("chart") chart?: ChartComponent;
|
||||
public chartOptions: Partial<ChartOptions> = this.generateChartOptions()
|
||||
|
||||
series: ApexAxisChartSeries = []
|
||||
chartOptions: Partial<ChartOptions> | undefined;
|
||||
|
||||
constructor(private taskgroupService: TaskgroupService,
|
||||
private historyService: HistoryService) {
|
||||
}
|
||||
ngOnChanges() {
|
||||
this.series = [];
|
||||
const startingDate = moment(this.dateRange[0]).format("yyyy-MM-DD");
|
||||
const endingDate = moment(this.dateRange[this.dateRange.length-1]).format("yyyy-MM-DD");
|
||||
this.historyService.statisticsStartingDateEndingDateGet(startingDate, endingDate).subscribe({
|
||||
next: resp => {
|
||||
resp.forEach(taskgroupActivityInfo => {
|
||||
const data: any[] = [];
|
||||
this.dateRange.map(date => {
|
||||
const selectedActivity = taskgroupActivityInfo.activityInfos.find(activity => moment(date).isSame(moment(activity.date), "day"))
|
||||
if(selectedActivity != undefined) {
|
||||
data.push(selectedActivity.activeMinutes)
|
||||
} else {
|
||||
data.push(0)
|
||||
}
|
||||
})
|
||||
|
||||
this.series.push({
|
||||
name: taskgroupActivityInfo.taskgroup.taskgroupName,
|
||||
data: data
|
||||
})
|
||||
})
|
||||
|
||||
this.chartOptions = {
|
||||
series: this.series,
|
||||
chart: {
|
||||
height: 350,
|
||||
type: this.selectedChartype as ChartType,
|
||||
stacked: true
|
||||
},
|
||||
title: {
|
||||
text: ""
|
||||
},
|
||||
xaxis: {
|
||||
categories: this.selectedDateRange.map(date => date.toDateString())
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
createDateRange(): Date[] {
|
||||
const dates: Date[] = [];
|
||||
@ -63,84 +105,10 @@ export class SimpleActivityDiagramComponent {
|
||||
console.log("min " + moment(changeContext.value).format("YYYY-MM-DD"));
|
||||
console.log("max " + moment(changeContext.highValue!).format("YYYY-MM-DD"))
|
||||
this.selectedDateRange = this.createDateRangeBetween(moment(changeContext.value), moment(changeContext.highValue!))
|
||||
this.chartOptions = this.generateChartOptions()
|
||||
}
|
||||
|
||||
generateChartOptions(): Partial<ChartOptions> {
|
||||
return {
|
||||
series: this.generateSeries(),
|
||||
chart: {
|
||||
height: 350,
|
||||
type: this.selectedChartype as ChartType,
|
||||
stacked: true
|
||||
},
|
||||
title: {
|
||||
text: ""
|
||||
},
|
||||
xaxis: {
|
||||
categories: this.selectedDateRange.map(date => date.toDateString())
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
generateSeries() : ApexAxisChartSeries {
|
||||
const series: ApexAxisChartSeries = []
|
||||
|
||||
if(this.selectedTaskgroupPath != undefined) {
|
||||
this.historyService.statisticsTaskgroupActivityTaskgroupIDStartingDateEndingDateIncludeSubTaskgroupsGet(
|
||||
this.selectedTaskgroupPath!.rootTasktroup.taskgroupID,
|
||||
moment(this.selectedDateRange[0]).format("YYYY-MM-DD"),
|
||||
moment(this.selectedDateRange[this.selectedDateRange.length-1]).format("YYYY-MM-DD"),
|
||||
false
|
||||
).subscribe({
|
||||
next: resp => {
|
||||
series.push(
|
||||
{
|
||||
name: this.selectedTaskgroupPath!.rootTasktroup.taskgroupName,
|
||||
data: resp.map(dailyActivityInfo => dailyActivityInfo.activeMinutes)
|
||||
}
|
||||
);
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
this.selectedTaskgroupPath?.directChildren.forEach(taskgroup => {
|
||||
|
||||
this.historyService.statisticsTaskgroupActivityTaskgroupIDStartingDateEndingDateIncludeSubTaskgroupsGet(
|
||||
taskgroup.taskgroupID,
|
||||
moment(this.selectedDateRange[0]).format("YYYY-MM-DD"),
|
||||
moment(this.selectedDateRange[this.selectedDateRange.length-1]).format("YYYY-MM-DD"), true
|
||||
).subscribe({
|
||||
next: resp => {
|
||||
series.push(
|
||||
{
|
||||
name: taskgroup.taskgroupName,
|
||||
data: resp.map(dailyActivityInfo => dailyActivityInfo.activeMinutes)
|
||||
}
|
||||
)
|
||||
}
|
||||
})
|
||||
|
||||
})
|
||||
console.log(series);
|
||||
return series;
|
||||
|
||||
}
|
||||
|
||||
updateSerieSelection() {
|
||||
this.chartOptions = this.generateChartOptions()
|
||||
}
|
||||
|
||||
setSelectedChartType(selectedChartype: string) {
|
||||
this.selectedChartype = selectedChartype;
|
||||
this.updateSerieSelection();
|
||||
}
|
||||
//this.selectedChartype = selectedChartype;
|
||||
|
||||
setSelectedTaskgroupPath(selectedTaskgroupPath: TaskgroupPathInfo) {
|
||||
this.selectedTaskgroupPath = selectedTaskgroupPath;
|
||||
this.updateSerieSelection();
|
||||
}
|
||||
}
|
||||
|
@ -2,7 +2,7 @@
|
||||
<app-navigation-link-list #navLinkList [navigationLinks]="defaultNavigationLinkPath"></app-navigation-link-list>
|
||||
<mat-form-field style="width: 90%">
|
||||
<mat-label>Taskgroup</mat-label>
|
||||
<mat-select [(ngModel)]="selectedTaskgroupPath" (ngModelChange)="onSelectTaskgroupPath()">
|
||||
<mat-select [(ngModel)]="selectedTaskgroupPath">
|
||||
<mat-option *ngFor="let topping of taskgroupPaths" [value]="topping">{{topping.taskgroupPath}}</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
@ -65,14 +65,6 @@ export class TaskgroupActivityComponent implements OnInit{
|
||||
|
||||
}
|
||||
|
||||
onSelectTaskgroupPath() {
|
||||
if(this.simpleActivityDiagram != undefined) {
|
||||
this.simpleActivityDiagram.setSelectedTaskgroupPath(this.selectedTaskgroupPath!);
|
||||
}
|
||||
|
||||
//this.heatMap?.setSelectedTaskgroupPath(this.selectedTaskgroupPath!);
|
||||
}
|
||||
|
||||
onSelectChartType() {
|
||||
if(this.simpleActivityDiagram != undefined) {
|
||||
this.simpleActivityDiagram.setSelectedChartType(this.selectedChartype);
|
||||
|
Loading…
Reference in New Issue
Block a user