diff --git a/backend/.idea/workspace.xml b/backend/.idea/workspace.xml index dce221f..29241ee 100644 --- a/backend/.idea/workspace.xml +++ b/backend/.idea/workspace.xml @@ -6,8 +6,17 @@ - + + + + + + + + + + diff --git a/backend/src/main/java/core/api/controller/ScheduleController.java b/backend/src/main/java/core/api/controller/ScheduleController.java index ce6a0a2..f5fe890 100644 --- a/backend/src/main/java/core/api/controller/ScheduleController.java +++ b/backend/src/main/java/core/api/controller/ScheduleController.java @@ -53,10 +53,19 @@ public class ScheduleController { return ResponseEntity.ok(taskSchedules.stream().map(AbstractSchedule::toScheduleInfo).toList()); } - @PutMapping("/schedules/{taskID}") - public ResponseEntity createSchedule(@PathVariable long taskID, @RequestBody @Valid ScheduleFieldInfo scheduleFieldInfo) { + @PutMapping("/schedules/{taskID}/basic") + public ResponseEntity createBasicSchedule(@PathVariable long taskID, @RequestBody @Valid BasicScheduleFieldInfo scheduleFieldInfo) { + return createAbstractSchedule(taskID, scheduleFieldInfo); + } + + @PutMapping("/schedules/{taskID}/advanced") + public ResponseEntity createAdsvancedSchedule(@PathVariable long taskID, @RequestBody @Valid AdvancedScheduleFieldInfo scheduleFieldInfo) { + return createAbstractSchedule(taskID, scheduleFieldInfo); + } + + private ResponseEntity createAbstractSchedule(long taskID, ScheduleFieldInfo scheduleFieldInfo) { PermissionResult permissionResult = taskService.getTaskPermissions(taskID, SecurityContextHolder.getContext().getAuthentication().getName()); - if(permissionResult.isHasPermissions()) { + if(!permissionResult.isHasPermissions()) { return ResponseEntity.status(403).body(new SimpleStatusResponse("failed")); } @@ -75,10 +84,19 @@ public class ScheduleController { } } - @PostMapping("/schedules/{scheduleID}") - public ResponseEntity editSchedule(@PathVariable long scheduleID, @RequestBody @Valid ScheduleFieldInfo scheduleFieldInfo) { + @PostMapping("/schedules/{scheduleID}/basic") + public ResponseEntity editBasicSchedule(@PathVariable long scheduleID, @RequestBody @Valid BasicScheduleFieldInfo scheduleFieldInfo) { + return editAbstractSchedule(scheduleID, scheduleFieldInfo); + } + + @PostMapping("/schedules/{scheduleID}/advanced") + public ResponseEntity editAdvancedSchedule(@PathVariable long scheduleID, @RequestBody @Valid AdvancedScheduleFieldInfo scheduleFieldInfo) { + return editAbstractSchedule(scheduleID, scheduleFieldInfo); + } + + private ResponseEntity editAbstractSchedule(long scheduleID, ScheduleFieldInfo scheduleFieldInfo) { PermissionResult permissionResult = taskScheduleService.getSchedulePermissions(scheduleID, SecurityContextHolder.getContext().getAuthentication().getName()); - if(permissionResult.isHasPermissions()) { + if(!permissionResult.isHasPermissions()) { return ResponseEntity.status(403).body(new SimpleStatusResponse("failed")); } diff --git a/backend/src/main/java/core/api/models/timemanager/taskSchedule/scheduleInfos/AdvancedScheduleFieldInfo.java b/backend/src/main/java/core/api/models/timemanager/taskSchedule/scheduleInfos/AdvancedScheduleFieldInfo.java index 6b45422..d70250d 100644 --- a/backend/src/main/java/core/api/models/timemanager/taskSchedule/scheduleInfos/AdvancedScheduleFieldInfo.java +++ b/backend/src/main/java/core/api/models/timemanager/taskSchedule/scheduleInfos/AdvancedScheduleFieldInfo.java @@ -1,13 +1,18 @@ package core.api.models.timemanager.taskSchedule.scheduleInfos; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonProperty; + import javax.validation.constraints.NotNull; import java.time.LocalDateTime; public class AdvancedScheduleFieldInfo extends ScheduleFieldInfo { @NotNull + @JsonProperty private LocalDateTime scheduleStartTime; @NotNull + @JsonProperty private LocalDateTime scheduleStopTime; public AdvancedScheduleFieldInfo(LocalDateTime scheduleStartTime, LocalDateTime scheduleStopTime) { diff --git a/backend/src/main/java/core/api/models/timemanager/taskSchedule/scheduleInfos/BasicScheduleFieldInfo.java b/backend/src/main/java/core/api/models/timemanager/taskSchedule/scheduleInfos/BasicScheduleFieldInfo.java index 5f9c438..636b381 100644 --- a/backend/src/main/java/core/api/models/timemanager/taskSchedule/scheduleInfos/BasicScheduleFieldInfo.java +++ b/backend/src/main/java/core/api/models/timemanager/taskSchedule/scheduleInfos/BasicScheduleFieldInfo.java @@ -1,5 +1,7 @@ package core.api.models.timemanager.taskSchedule.scheduleInfos; +import com.fasterxml.jackson.annotation.JsonFormat; + import javax.validation.constraints.NotNull; import java.time.LocalDate; diff --git a/frontend/src/api/api/schedule.service.ts b/frontend/src/api/api/schedule.service.ts index e32f6e4..1f37c4f 100644 --- a/frontend/src/api/api/schedule.service.ts +++ b/frontend/src/api/api/schedule.service.ts @@ -18,7 +18,7 @@ import { HttpClient, HttpHeaders, HttpParams, import { CustomHttpParameterCodec } from '../encoder'; import { Observable } from 'rxjs'; -import { AdvancedScheduleInfo } from '../model/models'; +import { AdvancedScheduleFieldInfo } from '../model/models'; import { BasicScheduleFieldInfo } from '../model/models'; import { ForgottenActivityRequest } from '../model/models'; import { ScheduleActivateInfo } from '../model/models'; @@ -379,6 +379,146 @@ export class ScheduleService { ); } + /** + * reschedules task + * reschedules a task + * @param scheduleID internal id of schedule + * @param advancedScheduleFieldInfo + * @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 schedulesScheduleIDAdvancedPost(scheduleID: number, advancedScheduleFieldInfo?: AdvancedScheduleFieldInfo, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable; + public schedulesScheduleIDAdvancedPost(scheduleID: number, advancedScheduleFieldInfo?: AdvancedScheduleFieldInfo, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public schedulesScheduleIDAdvancedPost(scheduleID: number, advancedScheduleFieldInfo?: AdvancedScheduleFieldInfo, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public schedulesScheduleIDAdvancedPost(scheduleID: number, advancedScheduleFieldInfo?: AdvancedScheduleFieldInfo, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable { + if (scheduleID === null || scheduleID === undefined) { + throw new Error('Required parameter scheduleID was null or undefined when calling schedulesScheduleIDAdvancedPost.'); + } + + let localVarHeaders = this.defaultHeaders; + + let localVarCredential: string | undefined; + // authentication (API_TOKEN) required + localVarCredential = this.configuration.lookupCredential('API_TOKEN'); + if (localVarCredential) { + localVarHeaders = localVarHeaders.set('Authorization', 'Bearer ' + localVarCredential); + } + + let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (localVarHttpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (localVarHttpHeaderAcceptSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected); + } + + let localVarHttpContext: HttpContext | undefined = options && options.context; + if (localVarHttpContext === undefined) { + localVarHttpContext = new HttpContext(); + } + + + // to determine the Content-Type header + const consumes: string[] = [ + 'application/json' + ]; + const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes); + if (httpContentTypeSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected); + } + + let responseType_: 'text' | 'json' = 'json'; + if(localVarHttpHeaderAcceptSelected && localVarHttpHeaderAcceptSelected.startsWith('text')) { + responseType_ = 'text'; + } + + return this.httpClient.post(`${this.configuration.basePath}/schedules/${encodeURIComponent(String(scheduleID))}/advanced`, + advancedScheduleFieldInfo, + { + context: localVarHttpContext, + responseType: responseType_, + withCredentials: this.configuration.withCredentials, + headers: localVarHeaders, + observe: observe, + reportProgress: reportProgress + } + ); + } + + /** + * reschedules task + * reschedules a task + * @param scheduleID internal id of schedule + * @param basicScheduleFieldInfo + * @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 schedulesScheduleIDBasicPost(scheduleID: number, basicScheduleFieldInfo?: BasicScheduleFieldInfo, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable; + public schedulesScheduleIDBasicPost(scheduleID: number, basicScheduleFieldInfo?: BasicScheduleFieldInfo, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public schedulesScheduleIDBasicPost(scheduleID: number, basicScheduleFieldInfo?: BasicScheduleFieldInfo, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public schedulesScheduleIDBasicPost(scheduleID: number, basicScheduleFieldInfo?: BasicScheduleFieldInfo, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable { + if (scheduleID === null || scheduleID === undefined) { + throw new Error('Required parameter scheduleID was null or undefined when calling schedulesScheduleIDBasicPost.'); + } + + let localVarHeaders = this.defaultHeaders; + + let localVarCredential: string | undefined; + // authentication (API_TOKEN) required + localVarCredential = this.configuration.lookupCredential('API_TOKEN'); + if (localVarCredential) { + localVarHeaders = localVarHeaders.set('Authorization', 'Bearer ' + localVarCredential); + } + + let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (localVarHttpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (localVarHttpHeaderAcceptSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected); + } + + let localVarHttpContext: HttpContext | undefined = options && options.context; + if (localVarHttpContext === undefined) { + localVarHttpContext = new HttpContext(); + } + + + // to determine the Content-Type header + const consumes: string[] = [ + 'application/json' + ]; + const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes); + if (httpContentTypeSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected); + } + + let responseType_: 'text' | 'json' = 'json'; + if(localVarHttpHeaderAcceptSelected && localVarHttpHeaderAcceptSelected.startsWith('text')) { + responseType_ = 'text'; + } + + return this.httpClient.post(`${this.configuration.basePath}/schedules/${encodeURIComponent(String(scheduleID))}/basic`, + basicScheduleFieldInfo, + { + context: localVarHttpContext, + responseType: responseType_, + withCredentials: this.configuration.withCredentials, + headers: localVarHeaders, + observe: observe, + reportProgress: reportProgress + } + ); + } + /** * deletes schedule * deletes a schedule @@ -438,76 +578,6 @@ export class ScheduleService { ); } - /** - * reschedules task - * reschedules a task - * @param scheduleID internal id of schedule - * @param basicScheduleFieldInfoAdvancedScheduleInfo - * @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 schedulesScheduleIDPost(scheduleID: number, basicScheduleFieldInfoAdvancedScheduleInfo?: BasicScheduleFieldInfo | AdvancedScheduleInfo, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable; - public schedulesScheduleIDPost(scheduleID: number, basicScheduleFieldInfoAdvancedScheduleInfo?: BasicScheduleFieldInfo | AdvancedScheduleInfo, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; - public schedulesScheduleIDPost(scheduleID: number, basicScheduleFieldInfoAdvancedScheduleInfo?: BasicScheduleFieldInfo | AdvancedScheduleInfo, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; - public schedulesScheduleIDPost(scheduleID: number, basicScheduleFieldInfoAdvancedScheduleInfo?: BasicScheduleFieldInfo | AdvancedScheduleInfo, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable { - if (scheduleID === null || scheduleID === undefined) { - throw new Error('Required parameter scheduleID was null or undefined when calling schedulesScheduleIDPost.'); - } - - let localVarHeaders = this.defaultHeaders; - - let localVarCredential: string | undefined; - // authentication (API_TOKEN) required - localVarCredential = this.configuration.lookupCredential('API_TOKEN'); - if (localVarCredential) { - localVarHeaders = localVarHeaders.set('Authorization', 'Bearer ' + localVarCredential); - } - - let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; - if (localVarHttpHeaderAcceptSelected === undefined) { - // to determine the Accept header - const httpHeaderAccepts: string[] = [ - 'application/json' - ]; - localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); - } - if (localVarHttpHeaderAcceptSelected !== undefined) { - localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected); - } - - let localVarHttpContext: HttpContext | undefined = options && options.context; - if (localVarHttpContext === undefined) { - localVarHttpContext = new HttpContext(); - } - - - // to determine the Content-Type header - const consumes: string[] = [ - 'application/json' - ]; - const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes); - if (httpContentTypeSelected !== undefined) { - localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected); - } - - let responseType_: 'text' | 'json' = 'json'; - if(localVarHttpHeaderAcceptSelected && localVarHttpHeaderAcceptSelected.startsWith('text')) { - responseType_ = 'text'; - } - - return this.httpClient.post(`${this.configuration.basePath}/schedules/${encodeURIComponent(String(scheduleID))}`, - basicScheduleFieldInfoAdvancedScheduleInfo, - { - context: localVarHttpContext, - responseType: responseType_, - withCredentials: this.configuration.withCredentials, - headers: localVarHeaders, - observe: observe, - reportProgress: reportProgress - } - ); - } - /** * @param scheduleID internal id of schedule * @param finish internal id of schedule @@ -629,6 +699,146 @@ export class ScheduleService { ); } + /** + * creates advanced schedule for task + * creates a advanced schedule for a task + * @param taskID internal id of task + * @param advancedScheduleFieldInfo + * @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 schedulesTaskIDAdvancedPut(taskID: number, advancedScheduleFieldInfo?: AdvancedScheduleFieldInfo, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable; + public schedulesTaskIDAdvancedPut(taskID: number, advancedScheduleFieldInfo?: AdvancedScheduleFieldInfo, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public schedulesTaskIDAdvancedPut(taskID: number, advancedScheduleFieldInfo?: AdvancedScheduleFieldInfo, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public schedulesTaskIDAdvancedPut(taskID: number, advancedScheduleFieldInfo?: AdvancedScheduleFieldInfo, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable { + if (taskID === null || taskID === undefined) { + throw new Error('Required parameter taskID was null or undefined when calling schedulesTaskIDAdvancedPut.'); + } + + let localVarHeaders = this.defaultHeaders; + + let localVarCredential: string | undefined; + // authentication (API_TOKEN) required + localVarCredential = this.configuration.lookupCredential('API_TOKEN'); + if (localVarCredential) { + localVarHeaders = localVarHeaders.set('Authorization', 'Bearer ' + localVarCredential); + } + + let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (localVarHttpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (localVarHttpHeaderAcceptSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected); + } + + let localVarHttpContext: HttpContext | undefined = options && options.context; + if (localVarHttpContext === undefined) { + localVarHttpContext = new HttpContext(); + } + + + // to determine the Content-Type header + const consumes: string[] = [ + 'application/json' + ]; + const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes); + if (httpContentTypeSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected); + } + + let responseType_: 'text' | 'json' = 'json'; + if(localVarHttpHeaderAcceptSelected && localVarHttpHeaderAcceptSelected.startsWith('text')) { + responseType_ = 'text'; + } + + return this.httpClient.put(`${this.configuration.basePath}/schedules/${encodeURIComponent(String(taskID))}/advanced`, + advancedScheduleFieldInfo, + { + context: localVarHttpContext, + responseType: responseType_, + withCredentials: this.configuration.withCredentials, + headers: localVarHeaders, + observe: observe, + reportProgress: reportProgress + } + ); + } + + /** + * creates basic schedule for task + * creates a basic schedule for a task + * @param taskID internal id of task + * @param basicScheduleFieldInfo + * @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 schedulesTaskIDBasicPut(taskID: number, basicScheduleFieldInfo?: BasicScheduleFieldInfo, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable; + public schedulesTaskIDBasicPut(taskID: number, basicScheduleFieldInfo?: BasicScheduleFieldInfo, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public schedulesTaskIDBasicPut(taskID: number, basicScheduleFieldInfo?: BasicScheduleFieldInfo, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; + public schedulesTaskIDBasicPut(taskID: number, basicScheduleFieldInfo?: BasicScheduleFieldInfo, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable { + if (taskID === null || taskID === undefined) { + throw new Error('Required parameter taskID was null or undefined when calling schedulesTaskIDBasicPut.'); + } + + let localVarHeaders = this.defaultHeaders; + + let localVarCredential: string | undefined; + // authentication (API_TOKEN) required + localVarCredential = this.configuration.lookupCredential('API_TOKEN'); + if (localVarCredential) { + localVarHeaders = localVarHeaders.set('Authorization', 'Bearer ' + localVarCredential); + } + + let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; + if (localVarHttpHeaderAcceptSelected === undefined) { + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); + } + if (localVarHttpHeaderAcceptSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected); + } + + let localVarHttpContext: HttpContext | undefined = options && options.context; + if (localVarHttpContext === undefined) { + localVarHttpContext = new HttpContext(); + } + + + // to determine the Content-Type header + const consumes: string[] = [ + 'application/json' + ]; + const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes); + if (httpContentTypeSelected !== undefined) { + localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected); + } + + let responseType_: 'text' | 'json' = 'json'; + if(localVarHttpHeaderAcceptSelected && localVarHttpHeaderAcceptSelected.startsWith('text')) { + responseType_ = 'text'; + } + + return this.httpClient.put(`${this.configuration.basePath}/schedules/${encodeURIComponent(String(taskID))}/basic`, + basicScheduleFieldInfo, + { + context: localVarHttpContext, + responseType: responseType_, + withCredentials: this.configuration.withCredentials, + headers: localVarHeaders, + observe: observe, + reportProgress: reportProgress + } + ); + } + /** * registers forgotten schedule * Registers forgotten schedule @@ -818,74 +1028,4 @@ export class ScheduleService { ); } - /** - * creates basic schedule for task - * creates a basic schedule for a task - * @param taskID internal id of task - * @param basicScheduleFieldInfoAdvancedScheduleInfo - * @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 schedulesTaskIDPut(taskID: number, basicScheduleFieldInfoAdvancedScheduleInfo?: BasicScheduleFieldInfo | AdvancedScheduleInfo, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable; - public schedulesTaskIDPut(taskID: number, basicScheduleFieldInfoAdvancedScheduleInfo?: BasicScheduleFieldInfo | AdvancedScheduleInfo, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; - public schedulesTaskIDPut(taskID: number, basicScheduleFieldInfoAdvancedScheduleInfo?: BasicScheduleFieldInfo | AdvancedScheduleInfo, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable>; - public schedulesTaskIDPut(taskID: number, basicScheduleFieldInfoAdvancedScheduleInfo?: BasicScheduleFieldInfo | AdvancedScheduleInfo, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable { - if (taskID === null || taskID === undefined) { - throw new Error('Required parameter taskID was null or undefined when calling schedulesTaskIDPut.'); - } - - let localVarHeaders = this.defaultHeaders; - - let localVarCredential: string | undefined; - // authentication (API_TOKEN) required - localVarCredential = this.configuration.lookupCredential('API_TOKEN'); - if (localVarCredential) { - localVarHeaders = localVarHeaders.set('Authorization', 'Bearer ' + localVarCredential); - } - - let localVarHttpHeaderAcceptSelected: string | undefined = options && options.httpHeaderAccept; - if (localVarHttpHeaderAcceptSelected === undefined) { - // to determine the Accept header - const httpHeaderAccepts: string[] = [ - 'application/json' - ]; - localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts); - } - if (localVarHttpHeaderAcceptSelected !== undefined) { - localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected); - } - - let localVarHttpContext: HttpContext | undefined = options && options.context; - if (localVarHttpContext === undefined) { - localVarHttpContext = new HttpContext(); - } - - - // to determine the Content-Type header - const consumes: string[] = [ - 'application/json' - ]; - const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes); - if (httpContentTypeSelected !== undefined) { - localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected); - } - - let responseType_: 'text' | 'json' = 'json'; - if(localVarHttpHeaderAcceptSelected && localVarHttpHeaderAcceptSelected.startsWith('text')) { - responseType_ = 'text'; - } - - return this.httpClient.put(`${this.configuration.basePath}/schedules/${encodeURIComponent(String(taskID))}`, - basicScheduleFieldInfoAdvancedScheduleInfo, - { - context: localVarHttpContext, - responseType: responseType_, - withCredentials: this.configuration.withCredentials, - headers: localVarHeaders, - observe: observe, - reportProgress: reportProgress - } - ); - } - } diff --git a/frontend/src/app/app.module.ts b/frontend/src/app/app.module.ts index 4016609..f68fa17 100644 --- a/frontend/src/app/app.module.ts +++ b/frontend/src/app/app.module.ts @@ -77,6 +77,8 @@ import { ActiveTaskOverviewComponent } from './active-task-overview/active-task- import { AdvancedSchedulerComponent } from './schedules/advanced-scheduler/advanced-scheduler.component'; import {NgxMaterialTimepickerModule} from "ngx-material-timepicker"; import { DateTimePickerComponent } from './date-time-picker/date-time-picker.component'; +import {MatSliderModule} from "@angular/material/slider"; +import {MatLegacySliderModule} from "@angular/material/legacy-slider"; @NgModule({ declarations: [ AppComponent, @@ -153,7 +155,8 @@ import { DateTimePickerComponent } from './date-time-picker/date-time-picker.com MatSelectModule, MatTreeModule, MatAutocompleteModule, - NgxMaterialTimepickerModule + NgxMaterialTimepickerModule, + MatSliderModule ], providers: [ HttpClientModule, diff --git a/frontend/src/app/schedules/advanced-scheduler/advanced-scheduler.component.css b/frontend/src/app/schedules/advanced-scheduler/advanced-scheduler.component.css index 9dbfc9e..ce29a22 100644 --- a/frontend/src/app/schedules/advanced-scheduler/advanced-scheduler.component.css +++ b/frontend/src/app/schedules/advanced-scheduler/advanced-scheduler.component.css @@ -1,3 +1,14 @@ app-date-time-picker { margin-right: 20px; } + +.example-label-container { + display: flex; + justify-content: space-between; + margin: 0; +} + + +.scheduleBtn { + margin-top: 20px; +} diff --git a/frontend/src/app/schedules/advanced-scheduler/advanced-scheduler.component.html b/frontend/src/app/schedules/advanced-scheduler/advanced-scheduler.component.html index cfda2b6..7626ac8 100644 --- a/frontend/src/app/schedules/advanced-scheduler/advanced-scheduler.component.html +++ b/frontend/src/app/schedules/advanced-scheduler/advanced-scheduler.component.html @@ -7,6 +7,19 @@ +
+
+
+ + +
+ + + +
+ +
+
{{currentProgress}}
@@ -17,6 +30,6 @@
- +
diff --git a/frontend/src/app/schedules/advanced-scheduler/advanced-scheduler.component.ts b/frontend/src/app/schedules/advanced-scheduler/advanced-scheduler.component.ts index 6e0af56..c59afac 100644 --- a/frontend/src/app/schedules/advanced-scheduler/advanced-scheduler.component.ts +++ b/frontend/src/app/schedules/advanced-scheduler/advanced-scheduler.component.ts @@ -1,5 +1,11 @@ import {Component, EventEmitter, Input, OnInit, Output, ViewChild} from '@angular/core'; -import {TaskEntityInfo, TaskgroupEntityInfo} from "../../../api"; +import { + AdvancedScheduleFieldInfo, AdvancedScheduleInfo, + ScheduleInfo, + ScheduleService, + TaskEntityInfo, + TaskgroupEntityInfo +} from "../../../api"; import {DateTimePickerComponent} from "../../date-time-picker/date-time-picker.component"; @Component({ @@ -10,18 +16,24 @@ import {DateTimePickerComponent} from "../../date-time-picker/date-time-picker.c export class AdvancedSchedulerComponent implements OnInit{ @Input() task: TaskEntityInfo | undefined; @Input() taskgroup: TaskgroupEntityInfo | undefined + @Input() scheduleInfo: ScheduleInfo | undefined @ViewChild('startTimePicker') startTimePicker?: DateTimePickerComponent; @ViewChild('stopTimePicker') stopTimePicker?: DateTimePickerComponent; @Output('onStartTimeSet') startTimeEmitter : EventEmitter = new EventEmitter(); @Output('onEndTimeSet') endTimeEmitter : EventEmitter = new EventEmitter(); + @Output('onSchedule') onSchedule: EventEmitter = new EventEmitter(); selectedStartTime: Date | undefined selectedStopTime: Date | undefined currentProgress: string = "30%"; futureProgress: string = "60%" + constructor(private scheduleService: ScheduleService) { + + } + ngOnInit() { this.calcFutureProgress(); this.calcCurrentProgress(); @@ -92,7 +104,17 @@ export class AdvancedSchedulerComponent implements OnInit{ return Math.floor((diffMs / 1000) / 60); } - - + schedule() { + if(this.scheduleInfo == undefined) { + this.scheduleService.schedulesTaskIDAdvancedPut(this.task!.taskID, { + scheduleStartTime: this.selectedStartTime!.toISOString(), + scheduleStopTime: this.selectedStopTime!.toISOString() + }).subscribe({ + next: resp => { + this.onSchedule.emit(resp as AdvancedScheduleInfo); + } + }) + } + } } diff --git a/frontend/src/app/schedules/basic-scheduler/basic-scheduler.component.ts b/frontend/src/app/schedules/basic-scheduler/basic-scheduler.component.ts index cfe4d0d..e13bef8 100644 --- a/frontend/src/app/schedules/basic-scheduler/basic-scheduler.component.ts +++ b/frontend/src/app/schedules/basic-scheduler/basic-scheduler.component.ts @@ -35,7 +35,7 @@ export class BasicSchedulerComponent implements OnChanges{ schedule() { if(this.task != undefined) { if(this.scheduleEntityInfo == undefined) { - this.scheduleService.schedulesTaskIDPut(this.task.taskID, { + this.scheduleService.schedulesTaskIDBasicPut(this.task.taskID, { scheduleDate: this.dateCtrl.value }).subscribe({ next: resp => { @@ -43,7 +43,7 @@ export class BasicSchedulerComponent implements OnChanges{ } }) } else { - this.scheduleService.schedulesScheduleIDPost(this.scheduleEntityInfo!.scheduleID, { + this.scheduleService.schedulesScheduleIDBasicPost(this.scheduleEntityInfo!.scheduleID, { scheduleDate: this.dateCtrl.value }).subscribe({ next: resp => { diff --git a/frontend/src/app/schedules/scheduler/scheduler.component.css b/frontend/src/app/schedules/scheduler/scheduler.component.css index c59e314..8793269 100644 --- a/frontend/src/app/schedules/scheduler/scheduler.component.css +++ b/frontend/src/app/schedules/scheduler/scheduler.component.css @@ -25,3 +25,4 @@ .long-form { width: 100%; } + diff --git a/frontend/src/app/schedules/scheduler/scheduler.component.html b/frontend/src/app/schedules/scheduler/scheduler.component.html index 41b9109..f85e18b 100644 --- a/frontend/src/app/schedules/scheduler/scheduler.component.html +++ b/frontend/src/app/schedules/scheduler/scheduler.component.html @@ -23,5 +23,6 @@ diff --git a/frontend/src/app/schedules/scheduler/scheduler.component.ts b/frontend/src/app/schedules/scheduler/scheduler.component.ts index f68b9f0..ce6c4a3 100644 --- a/frontend/src/app/schedules/scheduler/scheduler.component.ts +++ b/frontend/src/app/schedules/scheduler/scheduler.component.ts @@ -1,7 +1,8 @@ import {Component, OnInit, ViewChild} from '@angular/core'; import {NavigationLink, NavigationLinkListComponent} from "../../navigation-link-list/navigation-link-list.component"; import { - BasicScheduleEntityInfo, BasicScheduleInfo, ScheduleService, + AdvancedScheduleInfo, + BasicScheduleEntityInfo, BasicScheduleInfo, ScheduleInfo, ScheduleService, TaskEntityInfo, TaskgroupEntityInfo, TaskgroupService, @@ -255,4 +256,29 @@ export class SchedulerComponent implements OnInit{ this.refresh.next(); } + + onAdvancedSchedule(schedule: AdvancedScheduleInfo) { + const event: CalendarEvent| undefined = this.findEventByTaskPath(this.computeTaskPath(schedule.taskgroupPath, schedule.task)); + if(event == undefined) { + this.events.push({ + title: this.computeTaskPath(schedule.taskgroupPath, schedule.task), + start: new Date(schedule.scheduleStartTime), + end: new Date(schedule.scheduleStopTime), + color: colors['red'], + resizable: { + beforeStart: false, + afterEnd: false + } + }) + + this.refresh.next(); + } else { + event.color = colors['red']; + event.resizable = { + beforeStart: false, + afterEnd: false + } + } + + } } diff --git a/openapi.yaml b/openapi.yaml index c7ff51e..77319bb 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -1309,6 +1309,7 @@ paths: schema: type: object $ref: "#/components/schemas/SimpleStatusResponse" + /schedules/{taskID}/basic: put: security: - API_TOKEN: [] @@ -1328,9 +1329,8 @@ paths: content: application/json: schema: - oneOf: - - $ref: '#/components/schemas/BasicScheduleFieldInfo' - - $ref: '#/components/schemas/AdvancedScheduleInfo' + $ref: '#/components/schemas/BasicScheduleFieldInfo' + responses: 200: description: operation successfull @@ -1353,7 +1353,50 @@ paths: schema: type: object $ref: "#/components/schemas/SimpleStatusResponse" - /schedules/{scheduleID}: + /schedules/{taskID}/advanced: + put: + security: + - API_TOKEN: [] + tags: + - schedule + description: creates a advanced schedule for a task + summary: creates advanced schedule for task + 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/AdvancedScheduleFieldInfo' + responses: + 200: + description: operation successfull + content: + application/json: + schema: + type: object + $ref: '#/components/schemas/ScheduleInfo' + 403: + description: No permission + content: + 'application/json': + schema: + type: object + $ref: "#/components/schemas/SimpleStatusResponse" + 404: + description: Taskgroup does not exist + content: + 'application/json': + schema: + type: object + $ref: "#/components/schemas/SimpleStatusResponse" + /schedules/{scheduleID}/basic: post: security: - API_TOKEN: [] @@ -1373,9 +1416,8 @@ paths: content: application/json: schema: - oneOf: - - $ref: '#/components/schemas/BasicScheduleFieldInfo' - - $ref: '#/components/schemas/AdvancedScheduleInfo' + $ref: '#/components/schemas/BasicScheduleFieldInfo' + responses: 200: @@ -1399,6 +1441,52 @@ paths: schema: type: object $ref: "#/components/schemas/SimpleStatusResponse" + /schedules/{scheduleID}/advanced: + post: + security: + - API_TOKEN: [] + tags: + - schedule + description: reschedules a task + summary: reschedules task + parameters: + - name: scheduleID + in: path + description: internal id of schedule + required: true + schema: + type: number + example: 1 + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/AdvancedScheduleFieldInfo' + + + responses: + 200: + description: operation successfull + content: + application/json: + schema: + type: object + $ref: '#/components/schemas/ScheduleInfo' + 403: + description: No permission + content: + 'application/json': + schema: + type: object + $ref: "#/components/schemas/SimpleStatusResponse" + 404: + description: Taskgroup does not exist + content: + 'application/json': + schema: + type: object + $ref: "#/components/schemas/SimpleStatusResponse" + /schedules/{scheduleID}: delete: security: - API_TOKEN: []