Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 6x 1x 1x 1x 1x 8x 6x 3x 3x 2x 2x 2x 1x 1x 2x 2x 1x 1x 1x 2x 2x 2x 2x | import { HttpClient, HttpErrorResponse } from "@angular/common/http";
import { inject, Injectable, signal } from "@angular/core";
import { TaskDetailsValidationService } from "./task.details.validation";
import { environment } from "../../../environments/environment";
import { TaskCard } from "./task.interfaces";
import { catchError, map, Observable, throwError } from "rxjs";
import { TaskService } from "./task.service";
@Injectable({ providedIn: 'root' })
export class TaskDetailsService {
readonly taskDetailsValidationService = inject(TaskDetailsValidationService)
readonly taskService = inject(TaskService)
private readonly isDetailsPanelOpenSignal = signal(false);
private readonly isLoadingSignal = signal(false);
private readonly isEditModeSignal = signal(false);
private readonly isModalOpenSignal = signal(false);
private readonly apiBase = environment.authApiBaseUrl;
readonly isDetailsPanelOpen = this.isDetailsPanelOpenSignal.asReadonly();
readonly isLoading = this.isLoadingSignal.asReadonly();
readonly isEditMode = this.isEditModeSignal.asReadonly();
readonly isModalOpen = this.isModalOpenSignal.asReadonly();
constructor(private http: HttpClient) { }
openDetailsPanel(task: TaskCard) {
const restTask = {
...task,
dueDate: this.toInputDate(task.dueDate),
isSubtask: task.parentTaskId !== "" ? true : false
}
this.taskDetailsValidationService.setTaskDetailsModel(restTask)
this.isDetailsPanelOpenSignal.set(true)
}
closeDetailsPanel() {
this.isDetailsPanelOpenSignal.set(false)
}
setLoading(state: boolean) {
this.isLoadingSignal.set(state)
}
setEditMode(state: boolean) {
this.isEditModeSignal.set(state)
}
setModalOpen(state: boolean) {
this.isModalOpenSignal.set(state)
}
getSubTasks(parentTaskId: string): TaskCard[] {
const directSubtasks = this.taskService.getAllTask().filter(t => t.parentTaskId === parentTaskId);
if (directSubtasks.length === 0) return [];
const nestedSubtasks = directSubtasks.flatMap(t => this.getSubTasks(t.id));
return [...directSubtasks, ...nestedSubtasks];
}
updateTask(task: TaskCard): Observable<string> {
const task2 = { ...task,
parentTaskId: task.isSubtask ? task.parentTaskId : "",
};
const { isSubtask, id, ...rest} = task2;
return this.http.put<TaskCard>(this.apiBase + '/api/v1/task/' + task.id, rest, {
withCredentials: true
})
.pipe(
map((res) => {
this.taskService.updateTaskInSignal(res.projectId,res);
return "Tarea actualizada correctamente";
}),
catchError(this.handleError)
);
}
deletedTask(projectId: string, taskId: string): Observable<string> {
const setTask = this.getSubTasks(taskId).map(t => t.id).concat(taskId)
return this.taskService.removeSetTasks(setTask).pipe(
map((res) => {
this.taskService.deleteTasksInSignal(projectId, setTask)
return "Tareas eliminadas exitosamente";
}),
catchError(this.handleError)
)
}
private toInputDate(value: string): string {
// Si viene como ISO: "2024-03-15T00:00:00.000Z"
return new Date(value).toISOString().split('T')[0];
}
private handleError(error: HttpErrorResponse) {
let errorMessage = 'Error desconocido';
Iif (error.error instanceof ErrorEvent) {
// Error del lado del cliente
errorMessage = `Error: ${error.error.message}`;
} else {
// Error del lado del servidor
errorMessage = `Código: ${error.status} - Mensaje: ${error.message}`;
}
return throwError(() => new Error(errorMessage));
}
} |