diff --git a/frontend/src/app/dashboard/dashboard.component.ts b/frontend/src/app/dashboard/dashboard.component.ts
index f09a3d8..a012bd1 100644
--- a/frontend/src/app/dashboard/dashboard.component.ts
+++ b/frontend/src/app/dashboard/dashboard.component.ts
@@ -1,5 +1,11 @@
import {Component, OnInit, ViewChild} from '@angular/core';
-import {BasicScheduleEntityInfo, ScheduleInfo, ScheduleService, TaskOverviewInfo} from "../../api";
+import {
+ BasicScheduleEntityInfo,
+ ScheduleInfo,
+ ScheduleService,
+ TaskOverviewInfo,
+ TaskScheduleStopResponse
+} from "../../api";
import {ActiveScheduleComponent} from "./active-schedule/active-schedule.component";
import {StopActiveScheduleInfo} from "./active-schedule/StopActiveScheduleInfo";
import {TaskOverviewComponent} from "./task-overview/task-overview.component";
@@ -72,4 +78,8 @@ export class DashboardComponent implements OnInit{
this.schedules = this.schedules.filter(schedule => schedule.task.taskID !== task.taskID)
}
+
+ registerForgotten(taskScheduleStopResponse: TaskScheduleStopResponse) {
+ this.workedMinutesToday += taskScheduleStopResponse.workTime
+ }
}
diff --git a/frontend/src/app/dashboard/forgotten-task-start-dialog/forgotten-task-start-dialog.component.css b/frontend/src/app/dashboard/forgotten-task-start-dialog/forgotten-task-start-dialog.component.css
new file mode 100644
index 0000000..ad2c300
--- /dev/null
+++ b/frontend/src/app/dashboard/forgotten-task-start-dialog/forgotten-task-start-dialog.component.css
@@ -0,0 +1,4 @@
+.example-full-width {
+ width: 100%;
+ margin-left: 10px;
+}
diff --git a/frontend/src/app/dashboard/forgotten-task-start-dialog/forgotten-task-start-dialog.component.html b/frontend/src/app/dashboard/forgotten-task-start-dialog/forgotten-task-start-dialog.component.html
new file mode 100644
index 0000000..f2b9df2
--- /dev/null
+++ b/frontend/src/app/dashboard/forgotten-task-start-dialog/forgotten-task-start-dialog.component.html
@@ -0,0 +1,31 @@
+Register forgotten activity
+
+
+ Number
+
+
+
+ {{option}}
+
+
+
+
+ Automatic starttime based on last schedule
+ Automatic starttime based on planned schedule
+
+
+ Minutes spent
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/app/dashboard/forgotten-task-start-dialog/forgotten-task-start-dialog.component.spec.ts b/frontend/src/app/dashboard/forgotten-task-start-dialog/forgotten-task-start-dialog.component.spec.ts
new file mode 100644
index 0000000..756a4e9
--- /dev/null
+++ b/frontend/src/app/dashboard/forgotten-task-start-dialog/forgotten-task-start-dialog.component.spec.ts
@@ -0,0 +1,21 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { ForgottenTaskStartDialogComponent } from './forgotten-task-start-dialog.component';
+
+describe('ForgottenTaskStartDialogComponent', () => {
+ let component: ForgottenTaskStartDialogComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(() => {
+ TestBed.configureTestingModule({
+ declarations: [ForgottenTaskStartDialogComponent]
+ });
+ fixture = TestBed.createComponent(ForgottenTaskStartDialogComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/frontend/src/app/dashboard/forgotten-task-start-dialog/forgotten-task-start-dialog.component.ts b/frontend/src/app/dashboard/forgotten-task-start-dialog/forgotten-task-start-dialog.component.ts
new file mode 100644
index 0000000..5cc7abf
--- /dev/null
+++ b/frontend/src/app/dashboard/forgotten-task-start-dialog/forgotten-task-start-dialog.component.ts
@@ -0,0 +1,87 @@
+import {Component, OnInit} from '@angular/core';
+import {ForgottenActivityRequest, ScheduleService, TaskService, TaskShortInfo} from "../../../api";
+import {MatSnackBar} from "@angular/material/snack-bar";
+import {DialogRef} from "@angular/cdk/dialog";
+import {MatDialogRef} from "@angular/material/dialog";
+import {filter, map, Observable, startWith} from "rxjs";
+import {FormControl} from "@angular/forms";
+import ModeEnum = ForgottenActivityRequest.ModeEnum;
+
+@Component({
+ selector: 'app-forgotten-task-start-dialog',
+ templateUrl: './forgotten-task-start-dialog.component.html',
+ styleUrls: ['./forgotten-task-start-dialog.component.css']
+})
+export class ForgottenTaskStartDialogComponent implements OnInit{
+
+ tasks: TaskShortInfo[] = []
+ myControl: FormControl = new FormControl('');
+ filteredOptions: Observable | undefined;
+
+ lastSchedule: boolean = false
+ plannedSchedule: boolean = false
+ minutesSpentControl: FormControl = new FormControl();
+
+
+ constructor(private taskService: TaskService,
+ private snackbar: MatSnackBar,
+ private dialogRef: MatDialogRef,
+ private scheduleService: ScheduleService) {
+ }
+
+ ngOnInit() {
+ this.taskService.tasksAllFinishedGet(false).subscribe({
+ next: resp => {
+ this.tasks = resp;
+ this.filteredOptions = this.myControl.valueChanges.pipe(
+ startWith(''),
+ map(value => this._filter(value || '')),
+ );
+ },
+ error: err => {
+ this.snackbar.open("Unexpected error", "", {duration: 2000});
+ }
+ })
+ }
+
+ private _filter(value: string): string[] {
+ const filterValue = value.toLowerCase();
+
+ return this.tasks.map(x => x.taskName).filter(option => option.toLowerCase().includes(filterValue))
+ }
+
+ registerActivity() {
+ const task = this.tasks.find(task => task.taskName === this.myControl.value);
+ if(task != undefined) {
+ this.scheduleService.schedulesTaskIDForgottenPost(task.taskID, {
+ mode: this.determineRegisterMode(),
+ minutesSpent: this.minutesSpentControl.value
+ }).subscribe({
+ next: resp => {
+ this.dialogRef.close(resp);
+ },
+ error: err => {
+ if(err.status == 400) {
+ this.snackbar.open("Invalid Operation", "", {duration: 2000});
+ } else if(err.status == 403) {
+ this.snackbar.open("No permission", "", {duration: 2000});
+ } else if(err.status == 404) {
+ this.snackbar.open("Task not found", "", {duration: 2000});
+ } else {
+ this.snackbar.open("Unexpected error", "", {duration: 2000});
+ }
+ }
+ })
+ }
+ }
+
+ private determineRegisterMode(): ModeEnum {
+ if(this.lastSchedule) {
+ return "LAST";
+ } else if(this.plannedSchedule) {
+ return "PLANNED";
+ } else {
+ return "MANUAL";
+ }
+ }
+}
diff --git a/openapi.yaml b/openapi.yaml
index 19ab60b..06c21fd 100644
--- a/openapi.yaml
+++ b/openapi.yaml
@@ -883,6 +883,32 @@ paths:
schema:
type: object
$ref: "#/components/schemas/SimpleStatusResponse"
+ /tasks/all/{finished}:
+ get:
+ security:
+ - API_TOKEN: []
+ tags:
+ - task
+ summary: edits an existing task
+ description: edits an existing task
+ parameters:
+ - name: finished
+ in: path
+ description: fetches either finished or unfinished tasks
+ required: true
+ schema:
+ type: boolean
+ example: true
+ responses:
+ 200:
+ description: Operation successfull
+ content:
+ application/json:
+ schema:
+ type: array
+ items:
+ $ref: '#/components/schemas/TaskShortInfo'
+
/tasks/{taskgroupID}/{status}:
get:
security:
@@ -1619,7 +1645,55 @@ paths:
schema:
type: object
$ref: "#/components/schemas/SimpleStatusResponse"
-
+ /schedules/{taskID}/forgotten:
+ post:
+ security:
+ - API_TOKEN: []
+ tags:
+ - schedule
+ description: Registers forgotten schedule
+ summary: registers forgotten schedule
+ parameters:
+ - name: taskID
+ in: path
+ description: internal id of task
+ required: true
+ schema:
+ type: number
+ example: 1
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ForgottenActivityRequest'
+ responses:
+ 200:
+ description: Operation successfull
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/TaskScheduleStopResponse'
+ 403:
+ description: No permission
+ content:
+ 'application/json':
+ schema:
+ type: object
+ $ref: "#/components/schemas/SimpleStatusResponse"
+ 404:
+ description: Schedule does not exist
+ content:
+ 'application/json':
+ schema:
+ type: object
+ $ref: "#/components/schemas/SimpleStatusResponse"
+ 400:
+ description: Operation not valid
+ content:
+ 'application/json':
+ schema:
+ type: object
+ $ref: "#/components/schemas/SimpleStatusResponse"
@@ -2140,4 +2214,21 @@ components:
missedSchedules:
type: boolean
description: states whether a schedule was missed or not
- example: true
\ No newline at end of file
+ example: true
+ ForgottenActivityRequest:
+ required:
+ - mode
+ additionalProperties: false
+ properties:
+ mode:
+ type: string
+ description: mode of register forgotten activity
+ example: MANUAL
+ enum:
+ - MANUAL
+ - LAST
+ - PLANNED
+ minutesSpent:
+ type: number
+ description: number of minutes spent on task
+ example: 10
\ No newline at end of file