Frontend Form for generating repeating tasks weekly
This commit is contained in:
parent
7d24ed1229
commit
aafb5886db
@ -6,19 +6,9 @@ import core.entities.timemanager.Task;
|
|||||||
import java.time.DayOfWeek;
|
import java.time.DayOfWeek;
|
||||||
|
|
||||||
public class TaskRepeatWeekDayInfo {
|
public class TaskRepeatWeekDayInfo {
|
||||||
|
|
||||||
private DayOfWeek dayOfWeek;
|
|
||||||
private int offset;
|
private int offset;
|
||||||
private long taskID;
|
private long taskID;
|
||||||
|
|
||||||
public DayOfWeek getDayOfWeek() {
|
|
||||||
return dayOfWeek;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setDayOfWeek(DayOfWeek dayOfWeek) {
|
|
||||||
this.dayOfWeek = dayOfWeek;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getOffset() {
|
public int getOffset() {
|
||||||
return offset;
|
return offset;
|
||||||
}
|
}
|
||||||
|
@ -3,18 +3,17 @@ package core.api.models.timemanager.tasks.repeatinginfo;
|
|||||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
import org.hibernate.validator.constraints.Length;
|
import org.hibernate.validator.constraints.Length;
|
||||||
|
|
||||||
|
import javax.validation.constraints.Size;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class TaskRepeatWeekInfo {
|
public class TaskRepeatWeekInfo {
|
||||||
|
|
||||||
@Length(min = 1, max = 7)
|
@Size(min = 1, max = 7)
|
||||||
private List<TaskRepeatWeekDayInfo> weekDayInfos;
|
private List<TaskRepeatWeekDayInfo> weekDayInfos;
|
||||||
private DeadlineStrategy deadlineStrategy;
|
private DeadlineStrategy deadlineStrategy;
|
||||||
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
|
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
|
||||||
private LocalDate endDate;
|
private LocalDate endDate;
|
||||||
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
|
|
||||||
private LocalDate startDate;
|
|
||||||
|
|
||||||
public List<TaskRepeatWeekDayInfo> getWeekDayInfos() {
|
public List<TaskRepeatWeekDayInfo> getWeekDayInfos() {
|
||||||
return weekDayInfos;
|
return weekDayInfos;
|
||||||
|
@ -36,6 +36,9 @@ public class TaskSeriesService {
|
|||||||
Optional<Task> task = taskRepository.findById(taskRepeatDayInfo.getTaskID());
|
Optional<Task> task = taskRepository.findById(taskRepeatDayInfo.getTaskID());
|
||||||
if(task.isEmpty()) return ServiceExitCode.MISSING_ENTITY;
|
if(task.isEmpty()) return ServiceExitCode.MISSING_ENTITY;
|
||||||
|
|
||||||
|
TaskSerieItem rootItem = taskSerie.addTask(task.get());
|
||||||
|
task.get().setTaskSerieItem(rootItem);
|
||||||
|
|
||||||
LocalDate currentTaskDate = task.get().getStartDate().plusDays(taskRepeatDayInfo.getOffset());
|
LocalDate currentTaskDate = task.get().getStartDate().plusDays(taskRepeatDayInfo.getOffset());
|
||||||
while(currentTaskDate.isBefore(taskRepeatInfo.getEndDate())) {
|
while(currentTaskDate.isBefore(taskRepeatInfo.getEndDate())) {
|
||||||
Task clonedTask = Task.cloneTask(task.get());
|
Task clonedTask = Task.cloneTask(task.get());
|
||||||
@ -44,12 +47,14 @@ public class TaskSeriesService {
|
|||||||
TaskSerieItem taskSerieItem = taskSerie.addTask(clonedTask);
|
TaskSerieItem taskSerieItem = taskSerie.addTask(clonedTask);
|
||||||
clonedTask.setTaskSerieItem(taskSerieItem);
|
clonedTask.setTaskSerieItem(taskSerieItem);
|
||||||
createdTasks.add(clonedTask);
|
createdTasks.add(clonedTask);
|
||||||
|
|
||||||
|
currentTaskDate = currentTaskDate.plusDays(taskRepeatDayInfo.getOffset());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
taskSerie.getTasks().sort(Comparator.comparing(o -> o.getTask().getStartDate()));
|
taskSerie.getTasks().sort(Comparator.comparing(o -> o.getTask().getStartDate()));
|
||||||
for(int i=0; i<taskSerie.getTasks().size(); i++) {
|
for(int i=0; i<taskSerie.getTasks().size(); i++) {
|
||||||
taskSerie.getTasks().get(i).setSeriesIndex(i);
|
taskSerie.getTasks().get(i).setSeriesIndex(i+1);
|
||||||
if(taskRepeatInfo.getDeadlineStrategy() == DeadlineStrategy.DEADLINE_EQUAL_START) {
|
if(taskRepeatInfo.getDeadlineStrategy() == DeadlineStrategy.DEADLINE_EQUAL_START) {
|
||||||
taskSerie.getTasks().get(i).getTask().setDeadline(taskSerie.getTasks().get(i).getTask().getStartDate());
|
taskSerie.getTasks().get(i).getTask().setDeadline(taskSerie.getTasks().get(i).getTask().getStartDate());
|
||||||
} else {
|
} else {
|
||||||
|
@ -36,10 +36,6 @@ public class TaskService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public ServiceResult<Task> createTask(Taskgroup taskgroup, TaskFieldInfo taskFieldInfo) {
|
public ServiceResult<Task> createTask(Taskgroup taskgroup, TaskFieldInfo taskFieldInfo) {
|
||||||
if(existTaskByName(taskgroup.getTasks(), taskFieldInfo.getTaskName())) {
|
|
||||||
return new ServiceResult<>(ServiceExitCode.ENTITY_ALREADY_EXIST);
|
|
||||||
}
|
|
||||||
|
|
||||||
//Check for invalid date (deadline before start
|
//Check for invalid date (deadline before start
|
||||||
if(taskFieldInfo.getStartDate() != null && taskFieldInfo.getDeadline() != null &&
|
if(taskFieldInfo.getStartDate() != null && taskFieldInfo.getDeadline() != null &&
|
||||||
taskFieldInfo.getDeadline().isBefore(taskFieldInfo.getStartDate())) {
|
taskFieldInfo.getDeadline().isBefore(taskFieldInfo.getStartDate())) {
|
||||||
|
@ -49,6 +49,8 @@ model/taskEntityInfo.ts
|
|||||||
model/taskFieldInfo.ts
|
model/taskFieldInfo.ts
|
||||||
model/taskOverviewInfo.ts
|
model/taskOverviewInfo.ts
|
||||||
model/taskRepeatDayInfo.ts
|
model/taskRepeatDayInfo.ts
|
||||||
|
model/taskRepeatWeekDayInfo.ts
|
||||||
|
model/taskRepeatWeekInfo.ts
|
||||||
model/taskScheduleStopResponse.ts
|
model/taskScheduleStopResponse.ts
|
||||||
model/taskShortInfo.ts
|
model/taskShortInfo.ts
|
||||||
model/taskTaskgroupInfo.ts
|
model/taskTaskgroupInfo.ts
|
||||||
|
@ -20,6 +20,7 @@ import { Observable } from 'rxjs';
|
|||||||
|
|
||||||
import { SimpleStatusResponse } from '../model/models';
|
import { SimpleStatusResponse } from '../model/models';
|
||||||
import { TaskRepeatDayInfo } from '../model/models';
|
import { TaskRepeatDayInfo } from '../model/models';
|
||||||
|
import { TaskRepeatWeekInfo } from '../model/models';
|
||||||
|
|
||||||
import { BASE_PATH, COLLECTION_FORMATS } from '../variables';
|
import { BASE_PATH, COLLECTION_FORMATS } from '../variables';
|
||||||
import { Configuration } from '../configuration';
|
import { Configuration } from '../configuration';
|
||||||
@ -156,4 +157,70 @@ export class TaskseriesService {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* daily repeating task creation
|
||||||
|
* Creates a daily repeating task
|
||||||
|
* @param taskRepeatWeekInfo
|
||||||
|
* @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 tasksTaskseriesWeeklyPost(taskRepeatWeekInfo?: TaskRepeatWeekInfo, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable<SimpleStatusResponse>;
|
||||||
|
public tasksTaskseriesWeeklyPost(taskRepeatWeekInfo?: TaskRepeatWeekInfo, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable<HttpResponse<SimpleStatusResponse>>;
|
||||||
|
public tasksTaskseriesWeeklyPost(taskRepeatWeekInfo?: TaskRepeatWeekInfo, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable<HttpEvent<SimpleStatusResponse>>;
|
||||||
|
public tasksTaskseriesWeeklyPost(taskRepeatWeekInfo?: TaskRepeatWeekInfo, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext}): Observable<any> {
|
||||||
|
|
||||||
|
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<SimpleStatusResponse>(`${this.configuration.basePath}/tasks/taskseries/weekly`,
|
||||||
|
taskRepeatWeekInfo,
|
||||||
|
{
|
||||||
|
context: localVarHttpContext,
|
||||||
|
responseType: <any>responseType_,
|
||||||
|
withCredentials: this.configuration.withCredentials,
|
||||||
|
headers: localVarHeaders,
|
||||||
|
observe: observe,
|
||||||
|
reportProgress: reportProgress
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -30,6 +30,8 @@ export * from './taskEntityInfo';
|
|||||||
export * from './taskFieldInfo';
|
export * from './taskFieldInfo';
|
||||||
export * from './taskOverviewInfo';
|
export * from './taskOverviewInfo';
|
||||||
export * from './taskRepeatDayInfo';
|
export * from './taskRepeatDayInfo';
|
||||||
|
export * from './taskRepeatWeekDayInfo';
|
||||||
|
export * from './taskRepeatWeekInfo';
|
||||||
export * from './taskScheduleStopResponse';
|
export * from './taskScheduleStopResponse';
|
||||||
export * from './taskShortInfo';
|
export * from './taskShortInfo';
|
||||||
export * from './taskTaskgroupInfo';
|
export * from './taskTaskgroupInfo';
|
||||||
|
@ -93,6 +93,7 @@ import { ConnectionSettingsComponent } from './user-settings/connection-settings
|
|||||||
import { NtfySettingsComponent } from './user-settings/connection-settings/ntfy-settings/ntfy-settings.component';
|
import { NtfySettingsComponent } from './user-settings/connection-settings/ntfy-settings/ntfy-settings.component';
|
||||||
import { TaskSeriesCreatorComponent } from './tasks/task-series-creator/task-series-creator.component';
|
import { TaskSeriesCreatorComponent } from './tasks/task-series-creator/task-series-creator.component';
|
||||||
import {MatStepperModule} from "@angular/material/stepper";
|
import {MatStepperModule} from "@angular/material/stepper";
|
||||||
|
import { TaskWeeklySeriesCreatorComponent } from './tasks/task-weekly-series-creator/task-weekly-series-creator.component';
|
||||||
@NgModule({
|
@NgModule({
|
||||||
declarations: [
|
declarations: [
|
||||||
AppComponent,
|
AppComponent,
|
||||||
@ -141,6 +142,7 @@ import {MatStepperModule} from "@angular/material/stepper";
|
|||||||
ConnectionSettingsComponent,
|
ConnectionSettingsComponent,
|
||||||
NtfySettingsComponent,
|
NtfySettingsComponent,
|
||||||
TaskSeriesCreatorComponent,
|
TaskSeriesCreatorComponent,
|
||||||
|
TaskWeeklySeriesCreatorComponent,
|
||||||
],
|
],
|
||||||
imports: [
|
imports: [
|
||||||
BrowserModule,
|
BrowserModule,
|
||||||
|
@ -20,7 +20,7 @@ td, th {
|
|||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.mat-column-status, .mat-column-eta {
|
.mat-column-status, .mat-column-eta, .mat-column-select {
|
||||||
width: 32px;
|
width: 32px;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,22 @@
|
|||||||
|
|
||||||
<div class="mat-elevation-z8">
|
<div class="mat-elevation-z8">
|
||||||
<table mat-table [dataSource]="datasource" matSort>
|
<table mat-table [dataSource]="datasource" matSort>
|
||||||
|
<!-- Checkbox Column -->
|
||||||
|
<ng-container matColumnDef="select">
|
||||||
|
<th mat-header-cell *matHeaderCellDef>
|
||||||
|
<mat-checkbox (change)="$event ? toggleAllRows() : null"
|
||||||
|
[checked]="selection.hasValue() && isAllSelected()"
|
||||||
|
[indeterminate]="selection.hasValue() && !isAllSelected()">
|
||||||
|
</mat-checkbox>
|
||||||
|
</th>
|
||||||
|
<td mat-cell *matCellDef="let row">
|
||||||
|
<mat-checkbox (click)="$event.stopPropagation()"
|
||||||
|
(change)="$event ? selection.toggle(row) : null"
|
||||||
|
[checked]="selection.isSelected(row)">
|
||||||
|
</mat-checkbox>
|
||||||
|
</td>
|
||||||
|
</ng-container>
|
||||||
|
|
||||||
<ng-container matColumnDef="name">
|
<ng-container matColumnDef="name">
|
||||||
<th mat-header-cell *matHeaderCellDef mat-sort-header> Name </th>
|
<th mat-header-cell *matHeaderCellDef mat-sort-header> Name </th>
|
||||||
<td mat-cell *matCellDef="let task">
|
<td mat-cell *matCellDef="let task">
|
||||||
@ -45,7 +61,9 @@
|
|||||||
</td>
|
</td>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
<ng-container matColumnDef="delete">
|
<ng-container matColumnDef="delete">
|
||||||
<th mat-header-cell *matHeaderCellDef mat-sort-header></th>
|
<th mat-header-cell *matHeaderCellDef mat-sort-header>
|
||||||
|
<button mat-icon-button color="primary" (click)="repeatSelectedTasks()"><mat-icon>event_repeat</mat-icon></button>
|
||||||
|
</th>
|
||||||
<td mat-cell *matCellDef="let task">
|
<td mat-cell *matCellDef="let task">
|
||||||
<button mat-icon-button color="warn" (click)="deleteTask(task)"><mat-icon>delete</mat-icon></button>
|
<button mat-icon-button color="warn" (click)="deleteTask(task)"><mat-icon>delete</mat-icon></button>
|
||||||
</td>
|
</td>
|
||||||
|
@ -10,6 +10,8 @@ import {MatSnackBar} from "@angular/material/snack-bar";
|
|||||||
import {ClearTaskDialogComponent, ClearTaskDialogData} from "../clear-task-dialog/clear-task-dialog.component";
|
import {ClearTaskDialogComponent, ClearTaskDialogData} from "../clear-task-dialog/clear-task-dialog.component";
|
||||||
import * as moment from "moment/moment";
|
import * as moment from "moment/moment";
|
||||||
import {TaskStatus, TaskStatusService} from "../task-status.service";
|
import {TaskStatus, TaskStatusService} from "../task-status.service";
|
||||||
|
import {SelectionModel} from "@angular/cdk/collections";
|
||||||
|
import {TaskWeeklySeriesCreatorComponent} from "../task-weekly-series-creator/task-weekly-series-creator.component";
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-task-dashboard',
|
selector: 'app-task-dashboard',
|
||||||
@ -19,15 +21,7 @@ import {TaskStatus, TaskStatusService} from "../task-status.service";
|
|||||||
export class TaskDashboardComponent implements OnChanges{
|
export class TaskDashboardComponent implements OnChanges{
|
||||||
ngOnChanges(): void {
|
ngOnChanges(): void {
|
||||||
if(this.taskgroupID != undefined) {
|
if(this.taskgroupID != undefined) {
|
||||||
this.taskService.tasksTaskgroupIDStatusGet(this.taskgroupID!, "all").subscribe({
|
this.fetchTasks()
|
||||||
next: resp => {
|
|
||||||
this.datasource = new MatTableDataSource<TaskEntityInfo>(resp);
|
|
||||||
this.datasource.paginator = this.paginator!;
|
|
||||||
this.datasource.sort = this.sort!;
|
|
||||||
|
|
||||||
resp.forEach(task => console.log(task))
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -35,9 +29,29 @@ export class TaskDashboardComponent implements OnChanges{
|
|||||||
@ViewChild(MatPaginator) paginator: MatPaginator | undefined
|
@ViewChild(MatPaginator) paginator: MatPaginator | undefined
|
||||||
@ViewChild(MatSort) sort: MatSort | undefined
|
@ViewChild(MatSort) sort: MatSort | undefined
|
||||||
|
|
||||||
displayedColumns: string[] = ['status', 'name', 'eta', 'start', 'deadline', 'finished', 'edit', 'delete'];
|
displayedColumns: string[] = ['select', 'status', 'name', 'eta', 'start', 'deadline', 'finished', 'edit', 'delete'];
|
||||||
datasource: MatTableDataSource<TaskEntityInfo> = new MatTableDataSource<TaskEntityInfo>();
|
datasource: MatTableDataSource<TaskEntityInfo> = new MatTableDataSource<TaskEntityInfo>();
|
||||||
|
|
||||||
|
selection = new SelectionModel<TaskEntityInfo>(true, []);
|
||||||
|
|
||||||
|
/** Whether the number of selected elements matches the total number of rows. */
|
||||||
|
isAllSelected() {
|
||||||
|
const numSelected = this.selection.selected.length;
|
||||||
|
const numRows = this.datasource.data.length;
|
||||||
|
return numSelected === numRows;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Selects all rows if they are not all selected; otherwise clear selection. */
|
||||||
|
toggleAllRows() {
|
||||||
|
if (this.isAllSelected()) {
|
||||||
|
this.selection.clear();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.selection.select(...this.datasource.data);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
constructor(private taskService: TaskService,
|
constructor(private taskService: TaskService,
|
||||||
private dialog: MatDialog,
|
private dialog: MatDialog,
|
||||||
private snackbar: MatSnackBar,
|
private snackbar: MatSnackBar,
|
||||||
@ -107,4 +121,30 @@ export class TaskDashboardComponent implements OnChanges{
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected readonly TaskStatus = TaskStatus;
|
protected readonly TaskStatus = TaskStatus;
|
||||||
|
|
||||||
|
repeatSelectedTasks() {
|
||||||
|
const selectedTasks = this.selection.selected;
|
||||||
|
const dialogRef = this.dialog.open(TaskWeeklySeriesCreatorComponent, {
|
||||||
|
data: selectedTasks,
|
||||||
|
minWidth: "400px"
|
||||||
|
});
|
||||||
|
dialogRef.afterClosed().subscribe(res => {
|
||||||
|
if(res) {
|
||||||
|
this.fetchTasks()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
fetchTasks() {
|
||||||
|
this.taskService.tasksTaskgroupIDStatusGet(this.taskgroupID!, "all").subscribe({
|
||||||
|
next: resp => {
|
||||||
|
this.datasource = new MatTableDataSource<TaskEntityInfo>(resp);
|
||||||
|
this.datasource.paginator = this.paginator!;
|
||||||
|
this.datasource.sort = this.sort!;
|
||||||
|
|
||||||
|
resp.forEach(task => console.log(task))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,22 +1,7 @@
|
|||||||
<h1 mat-dialog-title>Create Task-Series</h1>
|
<h1 mat-dialog-title>Create Task-Series</h1>
|
||||||
<mat-stepper linear="linear" #stepper orientation="vertical">
|
<mat-stepper linear="linear" #stepper orientation="vertical">
|
||||||
<mat-step [stepControl]="firstFormGroup">
|
<mat-step [stepControl]="dailyFormGroup">
|
||||||
<form [formGroup]="firstFormGroup">
|
<form [formGroup]="dailyFormGroup">
|
||||||
<ng-template matStepLabel>Select Task Repeating Strategy</ng-template>
|
|
||||||
<mat-form-field appearance="outline" class="long-form">
|
|
||||||
<mat-label>Repeating Strategy</mat-label>
|
|
||||||
<mat-select formControlName="repeatingStrategyCtrl">
|
|
||||||
<mat-option value="DAILY">Daily</mat-option>
|
|
||||||
<mat-option value="WEEKLY">Weekly</mat-option>
|
|
||||||
</mat-select>
|
|
||||||
</mat-form-field>
|
|
||||||
<div>
|
|
||||||
<button mat-raised-button color="primary" matStepperNext (click)="onSelectRepeatingStrategy()">Next</button>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</mat-step>
|
|
||||||
<mat-step [stepControl]="repeatingStrategy ? dailyFormGroup : weeklyFormGroup">
|
|
||||||
<form [formGroup]="dailyFormGroup" *ngIf="repeatingStrategy=='DAILY'">
|
|
||||||
<ng-template matStepLabel>Define Repeating Information</ng-template>
|
<ng-template matStepLabel>Define Repeating Information</ng-template>
|
||||||
<mat-form-field appearance="outline" class="long-form">
|
<mat-form-field appearance="outline" class="long-form">
|
||||||
<mat-label>Offset</mat-label>
|
<mat-label>Offset</mat-label>
|
||||||
|
@ -13,25 +13,15 @@ import * as moment from "moment";
|
|||||||
})
|
})
|
||||||
export class TaskSeriesCreatorComponent {
|
export class TaskSeriesCreatorComponent {
|
||||||
|
|
||||||
firstFormGroup = this._formBuilder.group({
|
|
||||||
repeatingStrategyCtrl: ['', Validators.required]
|
|
||||||
})
|
|
||||||
|
|
||||||
dailyFormGroup = this._formBuilder.group({
|
dailyFormGroup = this._formBuilder.group({
|
||||||
offsetCtrl: ['', Validators.required],
|
offsetCtrl: ['', Validators.required],
|
||||||
deadlineStrategyCtrl: ['', Validators.required]
|
deadlineStrategyCtrl: ['', Validators.required]
|
||||||
})
|
})
|
||||||
|
|
||||||
weeklyFormGroup = this._formBuilder.group({
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
endDateFormGroup = this._formBuilder.group({
|
endDateFormGroup = this._formBuilder.group({
|
||||||
endDateCtrl: ['', Validators.required]
|
endDateCtrl: ['', Validators.required]
|
||||||
})
|
})
|
||||||
|
|
||||||
repeatingStrategy: "DAILY"|"WEEKLY"|undefined = undefined
|
|
||||||
|
|
||||||
constructor(private _formBuilder: FormBuilder,
|
constructor(private _formBuilder: FormBuilder,
|
||||||
private taskSeriesService: TaskseriesService,
|
private taskSeriesService: TaskseriesService,
|
||||||
@Inject(MAT_DIALOG_DATA) public task: TaskEntityInfo,
|
@Inject(MAT_DIALOG_DATA) public task: TaskEntityInfo,
|
||||||
@ -39,23 +29,7 @@ export class TaskSeriesCreatorComponent {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
onSelectRepeatingStrategy() {
|
|
||||||
const selectedStrategy = this.firstFormGroup.get("repeatingStrategyCtrl")!.value!
|
|
||||||
if(selectedStrategy === "DAILY") {
|
|
||||||
this.repeatingStrategy = "DAILY";
|
|
||||||
} else {
|
|
||||||
this.repeatingStrategy = "WEEKLY";
|
|
||||||
}
|
|
||||||
console.log(this.repeatingStrategy)
|
|
||||||
}
|
|
||||||
|
|
||||||
save() {
|
save() {
|
||||||
if(this.repeatingStrategy === 'DAILY') {
|
|
||||||
this.saveDailyRepeating()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
saveDailyRepeating() {
|
|
||||||
this.taskSeriesService.tasksTaskIDTaskseriesDailyPost(this.task.taskID,{
|
this.taskSeriesService.tasksTaskIDTaskseriesDailyPost(this.task.taskID,{
|
||||||
offset: Number(this.dailyFormGroup.get('offsetCtrl')!.value!),
|
offset: Number(this.dailyFormGroup.get('offsetCtrl')!.value!),
|
||||||
deadlineStrategy: this.convertDeadlineStrategyCtrlToDeadlineEnum(),
|
deadlineStrategy: this.convertDeadlineStrategyCtrlToDeadlineEnum(),
|
||||||
|
70
openapi.yaml
70
openapi.yaml
@ -2119,6 +2119,38 @@ paths:
|
|||||||
application/json:
|
application/json:
|
||||||
schema:
|
schema:
|
||||||
$ref: '#/components/schemas/SimpleStatusResponse'
|
$ref: '#/components/schemas/SimpleStatusResponse'
|
||||||
|
/tasks/taskseries/weekly:
|
||||||
|
post:
|
||||||
|
security:
|
||||||
|
- API_TOKEN: []
|
||||||
|
tags:
|
||||||
|
- taskseries
|
||||||
|
description: Creates a daily repeating task
|
||||||
|
summary: daily repeating task creation
|
||||||
|
requestBody:
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/TaskRepeatWeekInfo'
|
||||||
|
responses:
|
||||||
|
200:
|
||||||
|
description: Operation successfull
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/SimpleStatusResponse'
|
||||||
|
403:
|
||||||
|
description: No permission
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/SimpleStatusResponse'
|
||||||
|
404:
|
||||||
|
description: Task not found
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/SimpleStatusResponse'
|
||||||
|
|
||||||
|
|
||||||
components:
|
components:
|
||||||
@ -2847,3 +2879,41 @@ components:
|
|||||||
type: string
|
type: string
|
||||||
format: date
|
format: date
|
||||||
description: Date until the tasks repeat
|
description: Date until the tasks repeat
|
||||||
|
TaskRepeatWeekDayInfo:
|
||||||
|
required:
|
||||||
|
- offset
|
||||||
|
- taskID
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
offset:
|
||||||
|
type: number
|
||||||
|
description: number repeating days
|
||||||
|
example: 7
|
||||||
|
minimum: 1
|
||||||
|
taskID:
|
||||||
|
type: number
|
||||||
|
description: internal identifier of task
|
||||||
|
example: 1
|
||||||
|
TaskRepeatWeekInfo:
|
||||||
|
required:
|
||||||
|
- weekDayInfos
|
||||||
|
- deadlineStrategy
|
||||||
|
- endDate
|
||||||
|
additionalProperties: false
|
||||||
|
properties:
|
||||||
|
deadlineStrategy:
|
||||||
|
type: string
|
||||||
|
enum:
|
||||||
|
- DEADLINE_EQUAL_START
|
||||||
|
- DEADLINE_FIT_START
|
||||||
|
endDate:
|
||||||
|
type: string
|
||||||
|
format: date
|
||||||
|
description: Date until the tasks repeat
|
||||||
|
weekDayInfos:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
$ref: '#/components/schemas/TaskRepeatWeekDayInfo'
|
||||||
|
maxLength: 7
|
||||||
|
minLength: 1
|
||||||
|
|
Loading…
Reference in New Issue
Block a user