221 lines
7.8 KiB
TypeScript
221 lines
7.8 KiB
TypeScript
import {Component, OnDestroy, OnInit} from '@angular/core';
|
|
import {Subscription} from 'rxjs';
|
|
import {ActivatedRoute, Router} from '@angular/router';
|
|
|
|
import {TaskService} from 'app/workplace/services/task.service';
|
|
import {RemoveConfirmationService} from 'app/services/remove-confirmation/remove-confirmation.service';
|
|
|
|
import {Task} from 'app/workplace/models/task';
|
|
import {MessageModal} from 'app/models/message-modal';
|
|
import {GeneralModalService} from 'app/services/general-modal/general-modal.service';
|
|
import {RequestInProgressService} from 'app/services/requestInProgress/request-in-progress.service';
|
|
import {AlertService} from 'app/services/alert/alert.service';
|
|
import {AlertModel, AlertType} from 'app/models/alert';
|
|
import {TaskanaDate} from 'app/shared/util/taskana.date';
|
|
import {ObjectReference} from 'app/workplace/models/object-reference';
|
|
import {Workbasket} from 'app/models/workbasket';
|
|
import {WorkplaceService} from 'app/workplace/services/workplace.service';
|
|
import {MasterAndDetailService} from 'app/services/masterAndDetail/master-and-detail.service';
|
|
|
|
@Component({
|
|
selector: 'taskana-task-details',
|
|
templateUrl: './taskdetails.component.html',
|
|
styleUrls: ['./taskdetails.component.scss']
|
|
})
|
|
export class TaskdetailsComponent implements OnInit, OnDestroy {
|
|
task: Task = undefined;
|
|
taskClone: Task = undefined;
|
|
requestInProgress = false;
|
|
tabSelected = 'general';
|
|
currentWorkbasket: Workbasket = undefined;
|
|
currentId: string = undefined;
|
|
showDetail = false;
|
|
|
|
private routeSubscription: Subscription;
|
|
private workbasketSubscription: Subscription;
|
|
private masterAndDetailSubscription: Subscription;
|
|
private deleteTaskSubscription: Subscription;
|
|
|
|
constructor(private route: ActivatedRoute,
|
|
private taskService: TaskService,
|
|
private workplaceService: WorkplaceService,
|
|
private router: Router,
|
|
private removeConfirmationService: RemoveConfirmationService,
|
|
private requestInProgressService: RequestInProgressService,
|
|
private alertService: AlertService,
|
|
private generalModalService: GeneralModalService,
|
|
private masterAndDetailService: MasterAndDetailService) {
|
|
}
|
|
|
|
ngOnInit() {
|
|
this.currentWorkbasket = this.workplaceService.currentWorkbasket;
|
|
this.workbasketSubscription = this.workplaceService.getSelectedWorkbasket().subscribe(workbasket => {
|
|
this.currentWorkbasket = workbasket;
|
|
});
|
|
this.routeSubscription = this.route.params.subscribe(params => {
|
|
this.currentId = params['id'];
|
|
// redirect if user enters through a deep-link
|
|
if (!this.currentWorkbasket && this.currentId === 'new-task') {
|
|
this.router.navigate(['']);
|
|
}
|
|
this.getTask();
|
|
});
|
|
this.masterAndDetailSubscription = this.masterAndDetailService.getShowDetail().subscribe(showDetail => {
|
|
this.showDetail = showDetail;
|
|
});
|
|
}
|
|
|
|
resetTask(): void {
|
|
this.task = {...this.taskClone};
|
|
this.task.customAttributes = this.taskClone.customAttributes.slice(0);
|
|
this.task.callbackInfo = this.taskClone.callbackInfo.slice(0);
|
|
this.task.primaryObjRef = {...this.taskClone.primaryObjRef};
|
|
this.alertService.triggerAlert(new AlertModel(AlertType.INFO, 'Reset edited fields'));
|
|
}
|
|
|
|
getTask(): void {
|
|
this.requestInProgress = true;
|
|
if (this.currentId === 'new-task') {
|
|
this.requestInProgress = false;
|
|
this.task = new Task(undefined, new ObjectReference(), this.currentWorkbasket);
|
|
} else {
|
|
this.taskService.getTask(this.currentId).subscribe(task => {
|
|
this.requestInProgress = false;
|
|
this.task = task;
|
|
this.cloneTask();
|
|
this.taskService.selectTask(task);
|
|
}, err => {
|
|
this.generalModalService.triggerMessage(
|
|
new MessageModal('An error occurred while fetching the task', err));
|
|
});
|
|
}
|
|
}
|
|
|
|
onSubmit() {
|
|
this.onSave();
|
|
}
|
|
|
|
|
|
openTask() {
|
|
this.router.navigate([{outlets: {detail: `task/${this.currentId}`}}], {relativeTo: this.route.parent});
|
|
}
|
|
|
|
workOnTaskDisabled(): boolean {
|
|
return this.task ? this.task.state === 'COMPLETED' : false;
|
|
}
|
|
|
|
deleteTask(): void {
|
|
this.removeConfirmationService.setRemoveConfirmation(this.deleteTaskConfirmation.bind(this),
|
|
`You are going to delete Task: ${this.currentId}. Can you confirm this action?`);
|
|
}
|
|
|
|
deleteTaskConfirmation(): void {
|
|
this.deleteTaskSubscription = this.taskService.deleteTask(this.task).subscribe(() => {
|
|
this.taskService.publishUpdatedTask();
|
|
this.task = null;
|
|
this.router.navigate([`/workplace/tasks`]);
|
|
}, err => {
|
|
this.generalModalService.triggerMessage(
|
|
new MessageModal('An error occurred while deleting the task ', err));
|
|
});
|
|
}
|
|
|
|
selectTab(tab: string): void {
|
|
this.tabSelected = tab;
|
|
}
|
|
|
|
|
|
backClicked(): void {
|
|
this.task = undefined;
|
|
this.taskService.selectTask(this.task);
|
|
this.router.navigate(['./'], {relativeTo: this.route.parent});
|
|
}
|
|
|
|
|
|
private applyTaskDatesTimeZone(task: Task): Task {
|
|
if (task.due) {
|
|
task.due = TaskanaDate.applyTimeZone(task.due);
|
|
}
|
|
if (task.modified) {
|
|
task.modified = TaskanaDate.applyTimeZone(task.modified);
|
|
}
|
|
if (task.completed) {
|
|
task.completed = TaskanaDate.applyTimeZone(task.completed);
|
|
}
|
|
if (task.planned) {
|
|
task.planned = TaskanaDate.applyTimeZone(task.planned);
|
|
}
|
|
if (task.claimed) {
|
|
task.claimed = TaskanaDate.applyTimeZone(task.claimed);
|
|
}
|
|
if (task.created) {
|
|
task.created = TaskanaDate.applyTimeZone(task.created);
|
|
}
|
|
return task;
|
|
}
|
|
|
|
private onSave() {
|
|
this.currentId === 'new-task' ? this.createTask() : this.updateTask();
|
|
}
|
|
|
|
private updateTask() {
|
|
this.requestInProgressService.setRequestInProgress(true);
|
|
this.taskService.updateTask(this.task).subscribe(task => {
|
|
this.requestInProgressService.setRequestInProgress(false);
|
|
this.task = task;
|
|
this.cloneTask();
|
|
this.taskService.publishUpdatedTask(task);
|
|
this.alertService.triggerAlert(new AlertModel(AlertType.SUCCESS, 'Updating was successful.'))
|
|
}, err => {
|
|
this.requestInProgressService.setRequestInProgress(false);
|
|
this.alertService.triggerAlert(new AlertModel(AlertType.DANGER, 'There was an error while updating.'))
|
|
});
|
|
}
|
|
|
|
private createTask() {
|
|
this.requestInProgressService.setRequestInProgress(true);
|
|
this.addDateToTask();
|
|
this.taskService.createTask(this.task).subscribe(task => {
|
|
this.requestInProgressService.setRequestInProgress(false);
|
|
this.alertService.triggerAlert(new AlertModel(AlertType.SUCCESS, `Task ${this.currentId} was created successfully.`));
|
|
this.task = task;
|
|
this.taskService.selectTask(this.task);
|
|
this.taskService.publishUpdatedTask(task);
|
|
this.router.navigate(['../' + task.taskId], {relativeTo: this.route});
|
|
}, err => {
|
|
this.requestInProgressService.setRequestInProgress(false);
|
|
this.alertService.triggerAlert(new AlertModel(AlertType.DANGER, 'There was an error while creating a new task.'))
|
|
});
|
|
}
|
|
|
|
private addDateToTask() {
|
|
const date = TaskanaDate.getDate();
|
|
this.task.created = date;
|
|
this.task.modified = date;
|
|
}
|
|
|
|
private cloneTask() {
|
|
this.taskClone = {...this.task};
|
|
this.taskClone.customAttributes = this.task.customAttributes.slice(0);
|
|
this.taskClone.callbackInfo = this.task.callbackInfo.slice(0);
|
|
this.taskClone.primaryObjRef = {...this.task.primaryObjRef};
|
|
this.taskClone = this.applyTaskDatesTimeZone(this.taskClone);
|
|
|
|
}
|
|
|
|
ngOnDestroy(): void {
|
|
if (this.routeSubscription) {
|
|
this.routeSubscription.unsubscribe();
|
|
}
|
|
if (this.workbasketSubscription) {
|
|
this.workbasketSubscription.unsubscribe();
|
|
}
|
|
if (this.masterAndDetailSubscription) {
|
|
this.masterAndDetailSubscription.unsubscribe();
|
|
}
|
|
if (this.deleteTaskSubscription) {
|
|
this.deleteTaskSubscription.unsubscribe();
|
|
}
|
|
}
|
|
}
|