diff --git a/backend/src/main/java/core/api/models/timemanager/tasks/TaskEntityInfo.java b/backend/src/main/java/core/api/models/timemanager/tasks/TaskEntityInfo.java index 1d271c3..4785251 100644 --- a/backend/src/main/java/core/api/models/timemanager/tasks/TaskEntityInfo.java +++ b/backend/src/main/java/core/api/models/timemanager/tasks/TaskEntityInfo.java @@ -24,6 +24,8 @@ public class TaskEntityInfo { private boolean finishable; + private boolean hasActiveSchedules; + public TaskEntityInfo(Task task) { this.taskID = task.getTaskID(); this.taskName = task.getTaskName(); @@ -36,6 +38,7 @@ public class TaskEntityInfo { this.finished = task.isFinished(); this.workTime = task.getWorkTime(); this.finishable = task.isFinishable(); + this.hasActiveSchedules = task.hasActiveSchedule(); } public long getTaskID() { @@ -109,4 +112,12 @@ public class TaskEntityInfo { public void setFinishable(boolean finishable) { this.finishable = finishable; } + + public boolean isHasActiveSchedules() { + return hasActiveSchedules; + } + + public void setHasActiveSchedules(boolean hasActiveSchedules) { + this.hasActiveSchedules = hasActiveSchedules; + } } diff --git a/frontend/src/api/model/taskEntityInfo.ts b/frontend/src/api/model/taskEntityInfo.ts index cfc6022..6948125 100644 --- a/frontend/src/api/model/taskEntityInfo.ts +++ b/frontend/src/api/model/taskEntityInfo.ts @@ -48,5 +48,9 @@ export interface TaskEntityInfo { * determines whether the task can be finished */ finishable: boolean; + /** + * determines whether the task has active schedules + */ + hasActiveSchedules: boolean; } diff --git a/frontend/src/app/schedules/schedule-dashboard/schedule-dashboard.component.ts b/frontend/src/app/schedules/schedule-dashboard/schedule-dashboard.component.ts index 1e825f0..b9bd4a4 100644 --- a/frontend/src/app/schedules/schedule-dashboard/schedule-dashboard.component.ts +++ b/frontend/src/app/schedules/schedule-dashboard/schedule-dashboard.component.ts @@ -19,8 +19,9 @@ export class ScheduleDashboardComponent implements OnInit{ @Input('taskgroup') taskgroup: TaskgroupEntityInfo | undefined @Input('task') task: TaskEntityInfo | undefined + @Input('schedules') schedules: ScheduleInfo[] = [] + - schedules: ScheduleInfo[] = [] constructor(private scheduleService: ScheduleService, private snackbar: MatSnackBar) { @@ -28,11 +29,7 @@ export class ScheduleDashboardComponent implements OnInit{ } ngOnInit() { - this.scheduleService.schedulesTaskIDGet(this.task!.taskID).subscribe({ - next: resp => { - this.schedules = resp; - } - }) + } reschedule() { diff --git a/frontend/src/app/tasks/task-dashboard/task-dashboard.component.html b/frontend/src/app/tasks/task-dashboard/task-dashboard.component.html index 0fc9f75..1a7294c 100644 --- a/frontend/src/app/tasks/task-dashboard/task-dashboard.component.html +++ b/frontend/src/app/tasks/task-dashboard/task-dashboard.component.html @@ -35,7 +35,7 @@ Status -
+

{{getStatusOfTask(task)}}

diff --git a/frontend/src/app/tasks/task-dashboard/task-dashboard.component.ts b/frontend/src/app/tasks/task-dashboard/task-dashboard.component.ts index 57357f7..b4cb10f 100644 --- a/frontend/src/app/tasks/task-dashboard/task-dashboard.component.ts +++ b/frontend/src/app/tasks/task-dashboard/task-dashboard.component.ts @@ -8,6 +8,7 @@ import {TaskEditorData} from "../task-editor/TaskEditorData"; import {MatDialog} from "@angular/material/dialog"; import {MatSnackBar} from "@angular/material/snack-bar"; import {ClearTaskDialogComponent, ClearTaskDialogData} from "../clear-task-dialog/clear-task-dialog.component"; +import * as moment from "moment/moment"; @Component({ selector: 'app-task-dashboard', @@ -52,7 +53,13 @@ export class TaskDashboardComponent implements OnChanges{ } getStatusOfTask(task: TaskEntityInfo) { - return "green"; + if(moment(task.deadline, 'YYYY-MM-DDTHH:mm:ss.SSSZ').isBefore(moment())) { + return "🔴"; + } else if(task.finishable){ + return "🟠"; + } else { + return "🟢"; + } } deleteTask(deletedTask: TaskEntityInfo) { diff --git a/frontend/src/app/tasks/task-detail-overview/task-detail-overview.component.html b/frontend/src/app/tasks/task-detail-overview/task-detail-overview.component.html index 223e99c..43cae92 100644 --- a/frontend/src/app/tasks/task-detail-overview/task-detail-overview.component.html +++ b/frontend/src/app/tasks/task-detail-overview/task-detail-overview.component.html @@ -5,7 +5,7 @@
-
🟢 {{task!.taskName}}
+
{{taskStatus + " " + task!.taskName}}
@@ -39,7 +39,7 @@ Schedules
- +
diff --git a/frontend/src/app/tasks/task-detail-overview/task-detail-overview.component.ts b/frontend/src/app/tasks/task-detail-overview/task-detail-overview.component.ts index d9460b0..3309a1a 100644 --- a/frontend/src/app/tasks/task-detail-overview/task-detail-overview.component.ts +++ b/frontend/src/app/tasks/task-detail-overview/task-detail-overview.component.ts @@ -1,11 +1,20 @@ 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 {ScheduleService, TaskEntityInfo, TaskgroupEntityInfo, TaskgroupService, TaskService} from "../../../api"; +import { + 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"; @Component({ selector: 'app-task-detail-overview', @@ -31,6 +40,9 @@ export class TaskDetailOverviewComponent implements OnInit { @ViewChild('navLinkList') navLinkListComponent: NavigationLinkListComponent | undefined task: TaskEntityInfo | undefined + schedules: ScheduleInfo[] = [] + + taskStatus: string = "🟢" constructor(private activatedRoute: ActivatedRoute, private taskgroupService: TaskgroupService, @@ -70,15 +82,26 @@ export class TaskDetailOverviewComponent implements OnInit { this.taskService.tasksTaskIDGet(Number(params.get('taskID'))).subscribe({ next: resp => { this.task = resp; + this.taskStatus = this.getStatusOfTask(resp) + } + }); + this.scheduleService.schedulesTaskIDGet(Number(params.get('taskID'))).subscribe({ + next: resp => { + this.schedules = resp; } }) } }); } - getStatusOfTask(task: TaskEntityInfo | undefined) { - return "green"; - + getStatusOfTask(task: TaskEntityInfo ) { + if(moment(task.deadline, 'YYYY-MM-DDTHH:mm:ss.SSSZ').isBefore(moment())) { + return "🔴"; + } else if(this.schedules.length == 0){ + return "🟠"; + } else { + return "🟢"; + } } openTaskEditor() { diff --git a/frontend/src/app/tasks/task-editor/TaskEditorData.ts b/frontend/src/app/tasks/task-editor/TaskEditorData.ts index 4f315b8..f1140e2 100644 --- a/frontend/src/app/tasks/task-editor/TaskEditorData.ts +++ b/frontend/src/app/tasks/task-editor/TaskEditorData.ts @@ -1,6 +1,6 @@ -import {TaskEntityInfo} from "../../../api"; +import {TaskEntityInfo, TaskTaskgroupInfo} from "../../../api"; export interface TaskEditorData { taskgroupID: number; - task: TaskEntityInfo | undefined + task: TaskTaskgroupInfo | TaskEntityInfo | undefined } diff --git a/frontend/src/app/tasks/task-editor/task-editor.component.ts b/frontend/src/app/tasks/task-editor/task-editor.component.ts index 954b88e..d6573dd 100644 --- a/frontend/src/app/tasks/task-editor/task-editor.component.ts +++ b/frontend/src/app/tasks/task-editor/task-editor.component.ts @@ -53,11 +53,11 @@ export class TaskEditorComponent implements OnInit { createTask() { let endDate_formatted: string|undefined = undefined; let startDate_formatted: string|undefined = undefined; - if(this.endDate.value.length > 0) { + if(this.endDate.value !== "") { endDate_formatted = moment(this.endDate.value).format('YYYY-MM-DDTHH:mm:ss.SSSZ'); } - if(this.startDate.value.length > 0) { + if(this.startDate.value !== "") { startDate_formatted = moment(this.startDate.value).format('YYYY-MM-DDTHH:mm:ss.SSSZ'); } this.taskService.tasksTaskgroupIDPut(this.editorData.taskgroupID, { @@ -65,7 +65,7 @@ export class TaskEditorComponent implements OnInit { eta: this.etaCtrl.value, startDate: startDate_formatted, deadline: endDate_formatted, - finishable: this.finishable + finishable: this.finishable, }).subscribe({ next: resp => { this.dialog.close(resp); @@ -85,13 +85,20 @@ export class TaskEditorComponent implements OnInit { } editTask() { - const startingDate = this.startDate.value.length == 0? null:this.startDate.value - const deadline = this.endDate.value.length == 0? null:this.endDate.value + let endDate_formatted: string|undefined = undefined; + let startDate_formatted: string|undefined = undefined; + if(this.endDate.value !== "") { + endDate_formatted = moment(this.endDate.value).format('YYYY-MM-DDTHH:mm:ss.SSSZ'); + } + + if(this.startDate.value !== "") { + startDate_formatted = moment(this.startDate.value).format('YYYY-MM-DDTHH:mm:ss.SSSZ'); + } this.taskService.tasksTaskIDPost(this.editorData.task!.taskID, { taskName: this.nameCtrl.value, eta: this.etaCtrl.value, - startDate: startingDate, - deadline: deadline, + startDate: startDate_formatted, + deadline: endDate_formatted, finishable: this.finishable }).subscribe({ next: resp => { diff --git a/openapi.yaml b/openapi.yaml index a424554..13559c7 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -2148,6 +2148,7 @@ components: - finished - workTime - finishable + - hasActiveSchedules additionalProperties: false properties: taskID: @@ -2186,6 +2187,9 @@ components: finishable: type: boolean description: determines whether the task can be finished + hasActiveSchedules: + type: boolean + description: determines whether the task has active schedules TaskTaskgroupInfo: required: - taskID