From 6a02a3fc8cf751a57f38d0632766f4561144e28c Mon Sep 17 00:00:00 2001 From: "thibault.capt" <thibault.capt@etu.hesge.ch> Date: Sat, 22 Feb 2025 18:48:43 +0100 Subject: [PATCH] (feat): add store --- Documents/JournalDeBord.md | 1 + .../backend/controller/TodoController.java | 10 ++++++-- todo-workspace/frontend/angular.json | 4 +--- .../todo-list/todo-list.component.html | 19 +++++++++------ .../features/todo-list/todo-list.component.ts | 23 ++++--------------- 5 files changed, 26 insertions(+), 31 deletions(-) diff --git a/Documents/JournalDeBord.md b/Documents/JournalDeBord.md index 9ebab1e..244184e 100644 --- a/Documents/JournalDeBord.md +++ b/Documents/JournalDeBord.md @@ -22,3 +22,4 @@ | 18.02.2025 | Modal pour ajouter une voiture | - | - | Angular garage -> Je me rends compte que c'est trop gros pour un "petit projet". Je recommence pour une TODO list | | 19.02.2025 | Essayer de finir le front de la TODO's list | - | - | - | | 20.02.2025 | Finir de back + lier front et back | - | - | - | +| 22.02.2025 | Utiliser un store pour les données front | - | - | loading infini => voir pourquoi | diff --git a/todo-workspace/backend/src/main/java/com/hepia/backend/controller/TodoController.java b/todo-workspace/backend/src/main/java/com/hepia/backend/controller/TodoController.java index cfc41a9..30ee4d0 100644 --- a/todo-workspace/backend/src/main/java/com/hepia/backend/controller/TodoController.java +++ b/todo-workspace/backend/src/main/java/com/hepia/backend/controller/TodoController.java @@ -31,13 +31,19 @@ public class TodoController { } @DeleteMapping("/{id}") - public ResponseEntity<Void> delete(@PathVariable Long id) { + public ResponseEntity<Long> delete(@PathVariable Long id) { + if (!todoRepository.existsById(id)){ + return ResponseEntity.notFound().build(); + } todoRepository.deleteById(id); - return ResponseEntity.noContent().build(); + return ResponseEntity.ok(id); } @PatchMapping("/{id}") public ResponseEntity<Todo> toggleCompleted(@PathVariable Long id) { + if (!todoRepository.existsById(id)){ + return ResponseEntity.notFound().build(); + } Todo todo = todoRepository.findById(id).orElseThrow(); todo.setCompleted(!todo.isCompleted()); Todo updated = todoRepository.save(todo); diff --git a/todo-workspace/frontend/angular.json b/todo-workspace/frontend/angular.json index 21d3913..2a1de19 100644 --- a/todo-workspace/frontend/angular.json +++ b/todo-workspace/frontend/angular.json @@ -3,9 +3,7 @@ "version": 1, "cli": { "packageManager": "pnpm", - "schematicCollections": [ - "angular-eslint" - ], + "schematicCollections": ["angular-eslint"], "analytics": false }, "newProjectRoot": "projects", diff --git a/todo-workspace/frontend/src/app/features/todo-list/todo-list.component.html b/todo-workspace/frontend/src/app/features/todo-list/todo-list.component.html index 40f14a2..e3b7c93 100644 --- a/todo-workspace/frontend/src/app/features/todo-list/todo-list.component.html +++ b/todo-workspace/frontend/src/app/features/todo-list/todo-list.component.html @@ -6,14 +6,19 @@ <!-- Liste des tâches --> <div class="flex-grow flex items-center justify-center py-5"> - <ul class="list text-gray-600 text-lg"> - @for (todo of todos(); track todo.id) { - <app-todo-list-item [todo]="todo" (toggleCompleted)="toggleCompleted($event)" (remove)="remove($event)" /> - } - </ul> + @if (store.isLoading()) { + <span class="loading loading-spinner loading-xl"></span> + } @else { + <ul class="list text-gray-600 text-lg"> + @let todos = store.todos(); + @for (todo of todos; track todo.id) { + <app-todo-list-item [todo]="todo" (toggleCompleted)="toggleCompleted($event)" (remove)="remove($event)" /> + } + </ul> - @if (!todos()?.length) { - <p class="text-gray-600 text-lg">Ajoute ta première tâche 👆</p> + @if (!todos?.length) { + <p class="text-gray-600 text-lg">Ajoute ta première tâche 👆</p> + } } </div> </div> diff --git a/todo-workspace/frontend/src/app/features/todo-list/todo-list.component.ts b/todo-workspace/frontend/src/app/features/todo-list/todo-list.component.ts index 812ebcc..1c9e337 100644 --- a/todo-workspace/frontend/src/app/features/todo-list/todo-list.component.ts +++ b/todo-workspace/frontend/src/app/features/todo-list/todo-list.component.ts @@ -1,7 +1,4 @@ import { ChangeDetectionStrategy, Component, inject } from '@angular/core'; -import { TodoService } from '@core/ports/todo.service'; -import { toSignal } from '@angular/core/rxjs-interop'; -import { BehaviorSubject, switchMap, tap } from 'rxjs'; import { FormsModule } from '@angular/forms'; import { Todo } from '@core/models/todo'; import { AddTodoFormComponent } from '@features/todo-list/components/add-todo-form.component'; @@ -16,30 +13,18 @@ import { TodoStore } from '@core/todo.store'; providers: [TodoStore], }) export default class TodoListComponent { - // TODO: Implement the logic with TodoStore - private reload$$ = new BehaviorSubject<void>(void 0); - private readonly todoService = inject(TodoService); - todos = toSignal(this.reload$$.pipe(switchMap(() => this.todoService.getAll()))); + protected readonly store = inject(TodoStore); addTodo(todoName: string) { if (!todoName) return; - this.todoService - .add(todoName) - .pipe(tap(() => this.reload$$.next())) - .subscribe(); + this.store.add(todoName); } toggleCompleted(todo: Todo) { - this.todoService - .toggleCompleted(todo.id) - .pipe(tap(() => this.reload$$.next())) - .subscribe(); + this.store.toggleCompleted(todo.id); } remove(todo: Todo) { - this.todoService - .remove(todo.id) - .pipe(tap(() => this.reload$$.next())) - .subscribe(); + this.store.remove(todo.id); } } -- GitLab