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 @@
-
+
+
+
+
+
+
+
+
+
+
@@ -219,6 +228,7 @@
+
@@ -566,6 +576,11 @@
57
+
+ file://$PROJECT_DIR$/src/main/java/core/api/controller/ScheduleController.java
+ 68
+
+
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: []