issue-77 #105
24
frontend/src/api/model/taskRepeatWeekDayInfo.ts
Normal file
24
frontend/src/api/model/taskRepeatWeekDayInfo.ts
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
/**
|
||||||
|
* API Title
|
||||||
|
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
|
||||||
|
*
|
||||||
|
* The version of the OpenAPI document: 1.0
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||||
|
* https://openapi-generator.tech
|
||||||
|
* Do not edit the class manually.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
export interface TaskRepeatWeekDayInfo {
|
||||||
|
/**
|
||||||
|
* number repeating days
|
||||||
|
*/
|
||||||
|
offset: number;
|
||||||
|
/**
|
||||||
|
* internal identifier of task
|
||||||
|
*/
|
||||||
|
taskID: number;
|
||||||
|
}
|
||||||
|
|
31
frontend/src/api/model/taskRepeatWeekInfo.ts
Normal file
31
frontend/src/api/model/taskRepeatWeekInfo.ts
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/**
|
||||||
|
* API Title
|
||||||
|
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
|
||||||
|
*
|
||||||
|
* The version of the OpenAPI document: 1.0
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
||||||
|
* https://openapi-generator.tech
|
||||||
|
* Do not edit the class manually.
|
||||||
|
*/
|
||||||
|
import { TaskRepeatWeekDayInfo } from './taskRepeatWeekDayInfo';
|
||||||
|
|
||||||
|
|
||||||
|
export interface TaskRepeatWeekInfo {
|
||||||
|
deadlineStrategy: TaskRepeatWeekInfo.DeadlineStrategyEnum;
|
||||||
|
/**
|
||||||
|
* Date until the tasks repeat
|
||||||
|
*/
|
||||||
|
endDate: string;
|
||||||
|
weekDayInfos: Array<TaskRepeatWeekDayInfo>;
|
||||||
|
}
|
||||||
|
export namespace TaskRepeatWeekInfo {
|
||||||
|
export type DeadlineStrategyEnum = 'DEADLINE_EQUAL_START' | 'DEADLINE_FIT_START';
|
||||||
|
export const DeadlineStrategyEnum = {
|
||||||
|
EqualStart: 'DEADLINE_EQUAL_START' as DeadlineStrategyEnum,
|
||||||
|
FitStart: 'DEADLINE_FIT_START' as DeadlineStrategyEnum
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,10 @@
|
|||||||
|
#deadline-strategy-form {
|
||||||
|
margin-top: 10px;
|
||||||
|
padding-left: 10px;
|
||||||
|
padding-right: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endDate-form {
|
||||||
|
padding-left: 10px;
|
||||||
|
padding-right: 10px;
|
||||||
|
}
|
@ -0,0 +1,50 @@
|
|||||||
|
<h1 mat-dialog-title>Configure Weekly Repeating Tasks</h1>
|
||||||
|
<form [formGroup]="repeatingOffsetForm" *ngIf="repeatingOffsetForm != undefined">
|
||||||
|
<div formArrayName="offsets">
|
||||||
|
<mat-accordion>
|
||||||
|
<div *ngFor="let task of offsets.controls; let i = index" [formGroupName]="i">
|
||||||
|
<mat-expansion-panel hideToggle>
|
||||||
|
<mat-expansion-panel-header>
|
||||||
|
<mat-panel-title>{{getDayOfWeek(tasks[i].startDate)}}</mat-panel-title>
|
||||||
|
<mat-panel-description>{{formatDate(tasks[i].startDate)}}</mat-panel-description>
|
||||||
|
</mat-expansion-panel-header>
|
||||||
|
<p>Taskname: {{tasks[i].taskName}}</p>
|
||||||
|
<p>Eta: {{tasks[i].eta}} Minutes</p>
|
||||||
|
<p>Startdate: {{formatDate(tasks[i].startDate)}}</p>
|
||||||
|
<p>Deadline: {{formatDate(tasks[i].deadline)}}</p>
|
||||||
|
<mat-form-field appearance="outline" class="long-form">
|
||||||
|
<mat-label>Repeating-Offset</mat-label>
|
||||||
|
<input matInput formControlName="offsetCtrl">
|
||||||
|
<mat-hint>Number of weeks until the task is to be repeated</mat-hint>
|
||||||
|
</mat-form-field>
|
||||||
|
<mat-action-row>
|
||||||
|
<button mat-icon-button color="warn" (click)="removeTaskFromRepeatingList(tasks[i], i)"><mat-icon>delete</mat-icon></button>
|
||||||
|
</mat-action-row>
|
||||||
|
</mat-expansion-panel>
|
||||||
|
</div>
|
||||||
|
</mat-accordion>
|
||||||
|
</div>
|
||||||
|
<mat-form-field appearance="outline" class="long-form" id="deadline-strategy-form">
|
||||||
|
<mat-label>Deadline-Strategy</mat-label>
|
||||||
|
<mat-select formControlName="deadlineStrategyCtrl">
|
||||||
|
<mat-option *ngFor="let deadlineStrategy of availableDeadlineStrategys" [value]="deadlineStrategy">
|
||||||
|
{{deadlineStrategy}}
|
||||||
|
</mat-option>
|
||||||
|
</mat-select>
|
||||||
|
</mat-form-field>
|
||||||
|
|
||||||
|
<mat-form-field appearance="outline" class="long-form" id="endDate-form">
|
||||||
|
<mat-label>Ending Date</mat-label>
|
||||||
|
<input matInput [matDatepicker]="picker" formControlName="endingDateCtrl">
|
||||||
|
<mat-hint>MM/DD/YYYY</mat-hint>
|
||||||
|
<mat-datepicker-toggle matIconSuffix [for]="picker"></mat-datepicker-toggle>
|
||||||
|
<mat-datepicker #picker></mat-datepicker>
|
||||||
|
</mat-form-field>
|
||||||
|
|
||||||
|
<div mat-dialog-actions align="end">
|
||||||
|
<button mat-raised-button (click)="cancel()">Cancel</button>
|
||||||
|
<button mat-raised-button color="primary" [disabled]="repeatingOffsetForm.invalid" (click)="saveRepeatingTask()">Save</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
|
@ -0,0 +1,21 @@
|
|||||||
|
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
|
|
||||||
|
import { TaskWeeklySeriesCreatorComponent } from './task-weekly-series-creator.component';
|
||||||
|
|
||||||
|
describe('TaskWeeklySeriesCreatorComponent', () => {
|
||||||
|
let component: TaskWeeklySeriesCreatorComponent;
|
||||||
|
let fixture: ComponentFixture<TaskWeeklySeriesCreatorComponent>;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
TestBed.configureTestingModule({
|
||||||
|
declarations: [TaskWeeklySeriesCreatorComponent]
|
||||||
|
});
|
||||||
|
fixture = TestBed.createComponent(TaskWeeklySeriesCreatorComponent);
|
||||||
|
component = fixture.componentInstance;
|
||||||
|
fixture.detectChanges();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create', () => {
|
||||||
|
expect(component).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,83 @@
|
|||||||
|
import {Component, Inject, OnInit} from '@angular/core';
|
||||||
|
import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material/dialog";
|
||||||
|
import {TaskEntityInfo, TaskRepeatDayInfo, TaskRepeatWeekDayInfo, TaskseriesService} from "../../../api";
|
||||||
|
import * as moment from "moment";
|
||||||
|
import {FormArray, FormBuilder, FormGroup, Validators} from "@angular/forms";
|
||||||
|
import DeadlineStrategyEnum = TaskRepeatDayInfo.DeadlineStrategyEnum;
|
||||||
|
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-task-weekly-series-creator',
|
||||||
|
templateUrl: './task-weekly-series-creator.component.html',
|
||||||
|
styleUrls: ['./task-weekly-series-creator.component.css']
|
||||||
|
})
|
||||||
|
export class TaskWeeklySeriesCreatorComponent implements OnInit{
|
||||||
|
|
||||||
|
repeatingOffsetForm: FormGroup | undefined
|
||||||
|
availableDeadlineStrategys: DeadlineStrategyEnum[] = ["DEADLINE_EQUAL_START", "DEADLINE_FIT_START"]
|
||||||
|
|
||||||
|
constructor(private dialogRef: MatDialogRef<TaskWeeklySeriesCreatorComponent>,
|
||||||
|
private taskRepeatingService: TaskseriesService,
|
||||||
|
@Inject(MAT_DIALOG_DATA) public tasks: TaskEntityInfo[],
|
||||||
|
private formbuilder: FormBuilder) {
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnInit(): void {
|
||||||
|
this.repeatingOffsetForm = this.formbuilder.group({
|
||||||
|
offsets: this.formbuilder.array(this.tasks.map(task => this.formbuilder.group({
|
||||||
|
offsetCtrl: ['', [Validators.required, Validators.min(1)]]
|
||||||
|
}))),
|
||||||
|
deadlineStrategyCtrl: ['', Validators.required],
|
||||||
|
endingDateCtrl: ['', Validators.required]
|
||||||
|
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
getDayOfWeek(date: string) {
|
||||||
|
return moment(date).format("dddd")
|
||||||
|
}
|
||||||
|
|
||||||
|
formatDate(date: string): string {
|
||||||
|
return moment(date).format("dd, DD. MMMM YYYY")
|
||||||
|
}
|
||||||
|
|
||||||
|
removeTaskFromRepeatingList(task: TaskEntityInfo, formIndex: number) {
|
||||||
|
this.tasks = this.tasks.filter(t => t.taskID !== task.taskID);
|
||||||
|
this.deleteOffset(formIndex)
|
||||||
|
}
|
||||||
|
|
||||||
|
get offsets() {
|
||||||
|
return this.repeatingOffsetForm!.controls["offsets"] as FormArray
|
||||||
|
}
|
||||||
|
|
||||||
|
deleteOffset(taskIndex: number) {
|
||||||
|
this.offsets.removeAt(taskIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
saveRepeatingTask() {
|
||||||
|
const weekDayInfos: TaskRepeatWeekDayInfo[] = []
|
||||||
|
const formArrayValues: {offsetCtrl: string}[] = this.offsets.value
|
||||||
|
for(let i=0; i<formArrayValues.length; i++) {
|
||||||
|
weekDayInfos.push({
|
||||||
|
taskID: this.tasks[i].taskID,
|
||||||
|
offset: Number(formArrayValues[i].offsetCtrl) * 7
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
this.taskRepeatingService.tasksTaskseriesWeeklyPost({
|
||||||
|
deadlineStrategy: this.repeatingOffsetForm!.controls['deadlineStrategyCtrl']!.value!,
|
||||||
|
endDate: moment(this.repeatingOffsetForm!.controls['endingDateCtrl']!.value!).format('YYYY-MM-DDTHH:mm:ss.SSSZ'),
|
||||||
|
weekDayInfos: weekDayInfos
|
||||||
|
}).subscribe({
|
||||||
|
next: resp => {
|
||||||
|
this.dialogRef.close(true)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
cancel() {
|
||||||
|
this.dialogRef.close(false);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user