199 lines
6.2 KiB
TypeScript
199 lines
6.2 KiB
TypeScript
import {Component, OnInit, ViewChild} from '@angular/core';
|
|
import {NavigationLink, NavigationLinkListComponent} from "../../navigation-link-list/navigation-link-list.component";
|
|
import {ActivatedRoute, Router} from "@angular/router";
|
|
import {
|
|
AdvancedScheduleInfo,
|
|
ScheduleInfo,
|
|
ScheduleService,
|
|
TaskEntityInfo,
|
|
TaskgroupEntityInfo,
|
|
TaskgroupService,
|
|
TaskService
|
|
} from "../../../api";
|
|
import {TaskDashboardComponent} from "../task-dashboard/task-dashboard.component";
|
|
import {MatDialog} from "@angular/material/dialog";
|
|
import {TaskEditorComponent} from "../task-editor/task-editor.component";
|
|
import {TaskEditorData} from "../task-editor/TaskEditorData";
|
|
import * as moment from "moment";
|
|
import {ScheduleDashboardComponent} from "../../schedules/schedule-dashboard/schedule-dashboard.component";
|
|
import {TaskStatusService} from "../task-status.service";
|
|
import {TaskSeriesCreatorComponent} from "../task-series-creator/task-series-creator.component";
|
|
|
|
@Component({
|
|
selector: 'app-task-detail-overview',
|
|
templateUrl: './task-detail-overview.component.html',
|
|
styleUrls: ['./task-detail-overview.component.css']
|
|
})
|
|
export class TaskDetailOverviewComponent implements OnInit {
|
|
|
|
defaultNavigationLinkPath: NavigationLink[] = [
|
|
{
|
|
linkText: "Dashboard",
|
|
routerLink: ['/']
|
|
},
|
|
{
|
|
linkText: "Taskgroups",
|
|
routerLink: ["/taskgroups"]
|
|
}
|
|
]
|
|
taskgroups: TaskgroupEntityInfo[] = []
|
|
taskgroup: TaskgroupEntityInfo | undefined
|
|
taskgroupPath: TaskgroupEntityInfo[] = []
|
|
taskgroupID: number = -1;
|
|
@ViewChild('navLinkList') navLinkListComponent: NavigationLinkListComponent | undefined
|
|
|
|
task: TaskEntityInfo | undefined
|
|
schedules: ScheduleInfo[] = []
|
|
schedulesLoaded: boolean = false;
|
|
|
|
taskStatus: string = "🟢"
|
|
currentProgress: string = "0";
|
|
futureProgress: string = "0";
|
|
|
|
subTasks: TaskEntityInfo[] = [];
|
|
|
|
constructor(private activatedRoute: ActivatedRoute,
|
|
private taskgroupService: TaskgroupService,
|
|
private taskService: TaskService,
|
|
private dialog: MatDialog,
|
|
private scheduleService: ScheduleService,
|
|
private router: Router,
|
|
private taskStatusService: TaskStatusService) {
|
|
}
|
|
|
|
ngOnInit(): void {
|
|
this.activatedRoute.paramMap.subscribe(params => {
|
|
if (params.has('taskgroupID')) {
|
|
this.taskgroupID = Number(params.get('taskgroupID'));
|
|
this.taskgroupService.taskgroupsTaskgroupIDGet(this.taskgroupID).subscribe({
|
|
next: resp => {
|
|
this.taskgroups = resp.children
|
|
this.taskgroupPath = resp.ancestors
|
|
this.taskgroup = resp.taskgroupInfo;
|
|
this.navLinkListComponent!.resetComponent([
|
|
{
|
|
linkText: "Dashboard",
|
|
routerLink: ['/']
|
|
},
|
|
{
|
|
linkText: "Taskgroups",
|
|
routerLink: ["/taskgroups"]
|
|
}
|
|
]);
|
|
this.taskgroupPath.forEach(taskgroupEntity => {
|
|
this.navLinkListComponent!.addNavigationLink(taskgroupEntity.taskgroupName, ['/taskgroups', taskgroupEntity.taskgroupID.toString()]);
|
|
})
|
|
}
|
|
})
|
|
}
|
|
|
|
if(params.has('taskID')) {
|
|
this.taskService.tasksTaskIDGet(Number(params.get('taskID'))).subscribe({
|
|
next: resp => {
|
|
this.task = resp;
|
|
this.taskStatus = this.getStatusOfTask(resp)
|
|
this.calcProgress();
|
|
}
|
|
});
|
|
this.scheduleService.schedulesTaskIDGet(Number(params.get('taskID'))).subscribe({
|
|
next: resp => {
|
|
this.schedules = resp;
|
|
this.schedulesLoaded = true;
|
|
this.calcProgress();
|
|
}
|
|
})
|
|
|
|
this.taskService.tasksTaskIDSubtasksGet(Number(params.get('taskID'))).subscribe({
|
|
next: resp => {
|
|
this.subTasks = resp;
|
|
}
|
|
})
|
|
}
|
|
});
|
|
}
|
|
|
|
getStatusOfTask(task: TaskEntityInfo ) {
|
|
const taskStatus = this.taskStatusService.computeTaskStatus(task);
|
|
return this.taskStatusService.convertTaskStatusToColor(taskStatus);
|
|
}
|
|
|
|
calcProgress() {
|
|
if(this.task != undefined && this.task!.eta > 0) {
|
|
const currentProgress = this.task!.workTime / this.task!.eta * 100;
|
|
|
|
let futureProgress = 0;
|
|
this.schedules.forEach(schedule => {
|
|
if(schedule.scheduleType == "ADVANCED" && schedule.startTime == null) {
|
|
let advancedSchedule: AdvancedScheduleInfo = schedule as AdvancedScheduleInfo;
|
|
if(moment(advancedSchedule.scheduleStartTime).isBefore(moment())) {
|
|
const duration = moment.duration(moment(advancedSchedule.scheduleStopTime).diff(moment(advancedSchedule.scheduleStartTime)));
|
|
const plannedMinutes = duration.asMinutes();
|
|
futureProgress += plannedMinutes;
|
|
}
|
|
}
|
|
})
|
|
|
|
this.futureProgress = (futureProgress) / this.task!.eta *100 + "%";
|
|
this.currentProgress = currentProgress + "%";
|
|
}
|
|
|
|
}
|
|
|
|
openTaskEditor() {
|
|
if(this.task != undefined) {
|
|
const taskEditorInfo: TaskEditorData = {
|
|
task: this.task!,
|
|
taskgroupID: this.taskgroupID!,
|
|
parentTask: undefined
|
|
};
|
|
this.dialog.open(TaskEditorComponent, {data: taskEditorInfo, width: "600px"})
|
|
}
|
|
|
|
}
|
|
|
|
startTaskNow() {
|
|
if(this.task != undefined) {
|
|
this.scheduleService.schedulesTaskIDNowPost(this.task.taskID).subscribe({
|
|
next: resp => {
|
|
this.router.navigateByUrl('/');
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
finishTask() {
|
|
this.taskService.tasksTaskIDFinishPost(this.task!.taskID).subscribe({
|
|
next: resp => {
|
|
this.task!.finished = !this.task!.finished;
|
|
}
|
|
})
|
|
}
|
|
|
|
openRepeatingTaskEditor() {
|
|
const dialogRef = this.dialog.open(TaskSeriesCreatorComponent, {
|
|
data: this.task!,
|
|
minWidth: "400px"
|
|
})
|
|
}
|
|
|
|
addSubtask() {
|
|
const editorData: TaskEditorData = {
|
|
task: undefined,
|
|
taskgroupID: this.taskgroupID,
|
|
parentTask: this.task
|
|
}
|
|
const dialogRef = this.dialog.open(TaskEditorComponent, {
|
|
data: editorData,
|
|
minWidth: "400px"
|
|
})
|
|
}
|
|
|
|
deleteTask() {
|
|
this.taskService.tasksTaskIDDelete(this.task!.taskID).subscribe({
|
|
next: resp => {
|
|
this.router.navigateByUrl("/")
|
|
}
|
|
})
|
|
}
|
|
}
|