diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index 5f35219..2c5b91b 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -7220,9 +7220,9 @@
"dev": true
},
"node_modules/follow-redirects": {
- "version": "1.15.3",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz",
- "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==",
+ "version": "1.15.6",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
+ "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
"dev": true,
"funding": [
{
@@ -8103,9 +8103,9 @@
}
},
"node_modules/ip": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz",
- "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.1.tgz",
+ "integrity": "sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==",
"dev": true
},
"node_modules/ipaddr.js": {
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 1a7294c..d8d33bc 100644
--- a/frontend/src/app/tasks/task-dashboard/task-dashboard.component.html
+++ b/frontend/src/app/tasks/task-dashboard/task-dashboard.component.html
@@ -29,7 +29,7 @@
Finished |
-
+
|
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 4429134..df32cb8 100644
--- a/frontend/src/app/tasks/task-dashboard/task-dashboard.component.ts
+++ b/frontend/src/app/tasks/task-dashboard/task-dashboard.component.ts
@@ -9,6 +9,7 @@ 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";
+import {TaskStatus, TaskStatusService} from "../task-status.service";
@Component({
selector: 'app-task-dashboard',
@@ -39,7 +40,8 @@ export class TaskDashboardComponent implements OnChanges{
constructor(private taskService: TaskService,
private dialog: MatDialog,
- private snackbar: MatSnackBar) {
+ private snackbar: MatSnackBar,
+ public taskStatusService: TaskStatusService) {
}
@@ -53,13 +55,8 @@ export class TaskDashboardComponent implements OnChanges{
}
getStatusOfTask(task: TaskEntityInfo) {
- if(moment(task.deadline, 'YYYY-MM-DDTHH:mm:ss.SSSZ').isBefore(moment())) {
- return "🔴";
- } else if(task.finishable && !task.hasPlannedSchedules){
- return "🟠";
- } else {
- return "🟢";
- }
+ const taskStatus = this.taskStatusService.computeTaskStatus(task);
+ return this.taskStatusService.convertTaskStatusToColor(taskStatus);
}
deleteTask(deletedTask: TaskEntityInfo) {
@@ -108,4 +105,6 @@ export class TaskDashboardComponent implements OnChanges{
data.push(task)
this.datasource.data = data;
}
+
+ protected readonly TaskStatus = TaskStatus;
}
diff --git a/frontend/src/app/tasks/task-status.service.spec.ts b/frontend/src/app/tasks/task-status.service.spec.ts
new file mode 100644
index 0000000..82e6a85
--- /dev/null
+++ b/frontend/src/app/tasks/task-status.service.spec.ts
@@ -0,0 +1,16 @@
+import { TestBed } from '@angular/core/testing';
+
+import { TaskStatusService } from './task-status.service';
+
+describe('TaskStatusService', () => {
+ let service: TaskStatusService;
+
+ beforeEach(() => {
+ TestBed.configureTestingModule({});
+ service = TestBed.inject(TaskStatusService);
+ });
+
+ it('should be created', () => {
+ expect(service).toBeTruthy();
+ });
+});
diff --git a/frontend/src/app/tasks/task-status.service.ts b/frontend/src/app/tasks/task-status.service.ts
new file mode 100644
index 0000000..ed10fe7
--- /dev/null
+++ b/frontend/src/app/tasks/task-status.service.ts
@@ -0,0 +1,38 @@
+import { Injectable } from '@angular/core';
+import {TaskEntityInfo} from "../../api";
+import * as moment from "moment";
+
+export enum TaskStatus {
+ OK,
+ WARNING,
+ ATTENTION,
+ DEAD
+}
+@Injectable({
+ providedIn: 'root'
+})
+export class TaskStatusService {
+
+ constructor() { }
+
+ computeTaskStatus(task: TaskEntityInfo): TaskStatus {
+ if(!task.finished && task.deadline != null && moment(task.deadline, 'YYYY-MM-DDTHH:mm:ss.SSSZ').isBefore(moment())) {
+ return TaskStatus.DEAD;
+ } else if(!task.finished && task.deadline != null && !task.hasPlannedSchedules) {
+ return TaskStatus.ATTENTION
+ } else if(!task.finished && !task.hasPlannedSchedules) {
+ return TaskStatus.WARNING
+ } else {
+ return TaskStatus.OK;
+ }
+ }
+
+ convertTaskStatusToColor(taskStatus: TaskStatus) {
+ switch (taskStatus) {
+ case TaskStatus.OK: return "🟢";
+ case TaskStatus.WARNING: return "🟠";
+ case TaskStatus.ATTENTION: return "🔴";
+ case TaskStatus.DEAD: return "âš«";
+ }
+ }
+}