From ab702d7ce64efb6d5fc6136fa2903524635d2d14 Mon Sep 17 00:00:00 2001
From: "thibault.capt" <thibault.capt@etu.hesge.ch>
Date: Wed, 19 Feb 2025 16:05:52 +0100
Subject: [PATCH] (feat): form for add a new todo

---
 Documents/JournalDeBord.md                    |  1 +
 todo-workspace/frontend/src/app/app.config.ts |  6 +++---
 .../core/adapters/in-memory-todo.service.ts   | 12 ++++++++---
 .../frontend/src/app/core/models/todo.ts      |  2 +-
 .../src/app/core/ports/todo.service.ts        |  3 ++-
 .../todo-list/todo-list.component.html        | 21 ++++++++++++-------
 .../features/todo-list/todo-list.component.ts | 21 +++++++++++++++++--
 7 files changed, 49 insertions(+), 17 deletions(-)

diff --git a/Documents/JournalDeBord.md b/Documents/JournalDeBord.md
index 7b8d2c3..bf800c9 100644
--- a/Documents/JournalDeBord.md
+++ b/Documents/JournalDeBord.md
@@ -20,3 +20,4 @@
 | 28.01.2025              | Avancement d'un petit projet (garage de voiture)             | -                                                                         | -                                       | Début du frontend angular                                                                                         |
 | 01.02.2025              | Reformulation de quelques parties de l'introduction          | -                                                                         | -                                       | -                                                                                                                 |
 | 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                  | -                                                                         | -                                       | -                                                                                                                 |
diff --git a/todo-workspace/frontend/src/app/app.config.ts b/todo-workspace/frontend/src/app/app.config.ts
index 0a0318a..4735ffe 100644
--- a/todo-workspace/frontend/src/app/app.config.ts
+++ b/todo-workspace/frontend/src/app/app.config.ts
@@ -15,9 +15,9 @@ export const appConfig: ApplicationConfig = {
       provide: TodoService,
       useFactory: () =>
         new InMemoryTodoService().withTodos([
-          { id: 1, title: 'Apprendre Angular 19', completed: false },
-          { id: 1, title: 'Apprendre Java Spring Boot', completed: false },
-          { id: 1, title: 'Apprendre PostgreSQL', completed: false },
+          { id: 1, name: 'Apprendre Angular 19', completed: false },
+          { id: 1, name: 'Apprendre Java Spring Boot', completed: true },
+          { id: 1, name: 'Apprendre PostgreSQL', completed: false },
         ]),
     },
   ],
diff --git a/todo-workspace/frontend/src/app/core/adapters/in-memory-todo.service.ts b/todo-workspace/frontend/src/app/core/adapters/in-memory-todo.service.ts
index 7152499..fe8fe48 100644
--- a/todo-workspace/frontend/src/app/core/adapters/in-memory-todo.service.ts
+++ b/todo-workspace/frontend/src/app/core/adapters/in-memory-todo.service.ts
@@ -1,6 +1,6 @@
-import { of } from 'rxjs';
+import { Observable, of } from 'rxjs';
 import { TodoService } from '@core/ports/todo.service';
-import { Todos } from '@core/models/todo';
+import { Todo, Todos } from '@core/models/todo';
 
 export class InMemoryTodoService extends TodoService {
   private todos: Todos = [];
@@ -10,7 +10,13 @@ export class InMemoryTodoService extends TodoService {
     return this;
   }
 
-  getAll() {
+  override getAll() {
     return of(this.todos);
   }
+
+  override add(todoName: string): Observable<Todo> {
+    const todo: Todo = { id: this.todos.length + 1, name: todoName, completed: false };
+    this.todos = [...this.todos, todo];
+    return of(todo);
+  }
 }
diff --git a/todo-workspace/frontend/src/app/core/models/todo.ts b/todo-workspace/frontend/src/app/core/models/todo.ts
index c36bcc5..232af03 100644
--- a/todo-workspace/frontend/src/app/core/models/todo.ts
+++ b/todo-workspace/frontend/src/app/core/models/todo.ts
@@ -1,6 +1,6 @@
 export interface Todo {
   id: number;
-  title: string;
+  name: string;
   completed: boolean;
 }
 
diff --git a/todo-workspace/frontend/src/app/core/ports/todo.service.ts b/todo-workspace/frontend/src/app/core/ports/todo.service.ts
index 81c4c8d..7663e92 100644
--- a/todo-workspace/frontend/src/app/core/ports/todo.service.ts
+++ b/todo-workspace/frontend/src/app/core/ports/todo.service.ts
@@ -1,6 +1,7 @@
 import { Observable } from 'rxjs';
-import { Todos } from '@core/models/todo';
+import { Todo, Todos } from '@core/models/todo';
 
 export abstract class TodoService {
   abstract getAll(): Observable<Todos>;
+  abstract add(todoName: string): Observable<Todo>;
 }
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 82ebc3f..96cb86c 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
@@ -2,14 +2,21 @@
   <div class="w-full max-w-md bg-white p-6 rounded-lg shadow-lg">
     <h1 class="text-center text-3xl font-bold mb-4">Check-list</h1>
     <!-- Input et bouton -->
-    <div class="flex space-x-2">
-      <input class="input input-bordered w-full" placeholder="Ex : Tourner une vidéo sur Angular" type="text" />
-      <button class="btn btn-neutral">Ajouter</button>
-    </div>
-
+    <form (ngSubmit)="addTodo(todoInput.value); todoInput.value = ''">
+      <div class="flex space-x-2">
+        <input
+          #todoInput
+          class="input input-bordered w-full"
+          name="add todo"
+          placeholder="Ex : Tourner une vidéo sur Angular"
+          type="text"
+        />
+        <button class="btn btn-neutral" type="submit">Ajouter</button>
+      </div>
+    </form>
     <!-- Texte centré -->
     <div class="flex-grow flex items-center justify-center py-5">
-      @if (todos()?.length == 0) {
+      @if (!todos()?.length) {
         <p class="text-gray-600 text-lg">Ajoute ta première tâche 👆</p>
       } @else {
         <ul class="list text-gray-600 text-lg">
@@ -17,7 +24,7 @@
             <li class="py-2 w-full">
               <label class="fieldset-label">
                 <input type="checkbox" [checked]="todo.completed" class="checkbox" />
-                {{ todo.title }}
+                <span [ngClass]="{ 'line-through': todo.completed }">{{ todo.name }}</span>
               </label>
             </li>
           }
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 2c2d6f1..d757965 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,14 +1,31 @@
 import { Component, inject } from '@angular/core';
 import { TodoService } from '@core/ports/todo.service';
 import { toSignal } from '@angular/core/rxjs-interop';
+import { NgClass } from '@angular/common';
+import { BehaviorSubject, switchMap, tap } from 'rxjs';
+import { FormsModule } from '@angular/forms';
 
 @Component({
   selector: 'app-todo-list',
-  imports: [],
+  imports: [NgClass, FormsModule],
   templateUrl: './todo-list.component.html',
   styleUrl: './todo-list.component.scss',
 })
 export class TodoListComponent {
+  private reload$$ = new BehaviorSubject<void>(void 0);
   private readonly todoService = inject(TodoService);
-  todos = toSignal(this.todoService.getAll());
+  todos = toSignal(
+    this.reload$$.pipe(
+      switchMap(() => this.todoService.getAll()),
+      tap((t) => console.log('Tâches mises à jour:', t))
+    )
+  );
+
+  addTodo(todoName: string) {
+    if (!todoName) return;
+    this.todoService
+      .add(todoName)
+      .pipe(tap(() => this.reload$$.next()))
+      .subscribe();
+  }
 }
-- 
GitLab