From 53e480867aa8c64a59598030e4ccaaadeae06ef1 Mon Sep 17 00:00:00 2001 From: "thibault.capt" <thibault.capt@etu.hesge.ch> Date: Wed, 19 Feb 2025 17:11:01 +0100 Subject: [PATCH] (feat): refactor code --- .../frontend/src/app/app.component.html | 2 +- .../frontend/src/app/app.component.ts | 2 +- .../components/add-todo-form.component.ts | 24 +++++++++++++ .../todo-list/components/todo-list-item.ts | 25 +++++++++++++ .../todo-list/todo-list.component.html | 36 +++++-------------- .../features/todo-list/todo-list.component.ts | 8 ++--- todo-workspace/frontend/src/main.ts | 6 ++-- 7 files changed, 67 insertions(+), 36 deletions(-) create mode 100644 todo-workspace/frontend/src/app/features/todo-list/components/add-todo-form.component.ts create mode 100644 todo-workspace/frontend/src/app/features/todo-list/components/todo-list-item.ts diff --git a/todo-workspace/frontend/src/app/app.component.html b/todo-workspace/frontend/src/app/app.component.html index 98f3b93..25331c8 100644 --- a/todo-workspace/frontend/src/app/app.component.html +++ b/todo-workspace/frontend/src/app/app.component.html @@ -1 +1 @@ -<app-todo-list /> \ No newline at end of file +<app-todo-list /> diff --git a/todo-workspace/frontend/src/app/app.component.ts b/todo-workspace/frontend/src/app/app.component.ts index 131bd9e..4374dbb 100644 --- a/todo-workspace/frontend/src/app/app.component.ts +++ b/todo-workspace/frontend/src/app/app.component.ts @@ -1,5 +1,5 @@ import { Component, inject } from '@angular/core'; -import { TodoListComponent } from '@features/todo-list/todo-list.component'; +import TodoListComponent from '@features/todo-list/todo-list.component'; import { FaIconLibrary } from '@fortawesome/angular-fontawesome'; import { faIcons } from '@shared/fa-icons'; diff --git a/todo-workspace/frontend/src/app/features/todo-list/components/add-todo-form.component.ts b/todo-workspace/frontend/src/app/features/todo-list/components/add-todo-form.component.ts new file mode 100644 index 0000000..eb54bc7 --- /dev/null +++ b/todo-workspace/frontend/src/app/features/todo-list/components/add-todo-form.component.ts @@ -0,0 +1,24 @@ +import { Component, output } from '@angular/core'; +import { FormsModule } from '@angular/forms'; + +@Component({ + selector: 'app-add-todo-form', + template: ` + <form (ngSubmit)="this.add.emit(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> + `, + imports: [FormsModule], +}) +export class AddTodoFormComponent { + add = output<string>(); +} diff --git a/todo-workspace/frontend/src/app/features/todo-list/components/todo-list-item.ts b/todo-workspace/frontend/src/app/features/todo-list/components/todo-list-item.ts new file mode 100644 index 0000000..4e0fbd9 --- /dev/null +++ b/todo-workspace/frontend/src/app/features/todo-list/components/todo-list-item.ts @@ -0,0 +1,25 @@ +import { Component, input, output } from '@angular/core'; +import { Todo } from '@core/models/todo'; +import { FaIconComponent } from '@fortawesome/angular-fontawesome'; +import { NgClass } from '@angular/common'; + +@Component({ + selector: 'app-todo-list-item', + template: ` + <li class="py-2 w-full"> + <label class="fieldset-label"> + <input type="checkbox" [checked]="todo().completed" class="checkbox" (change)="toggleCompleted.emit(todo())" /> + <span [ngClass]="{ 'line-through': todo().completed }">{{ todo().name }}</span> + <button class="btn btn-ghost btn-error" (click)="remove.emit(todo())"> + <fa-icon [icon]="['fas', 'trash']"></fa-icon> + </button> + </label> + </li> + `, + imports: [FaIconComponent, NgClass], +}) +export class TodoListItemComponent { + todo = input.required<Todo>(); + toggleCompleted = output<Todo>(); + remove = output<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 a9933ea..40f14a2 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,36 +2,18 @@ <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 --> - <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é --> + <app-add-todo-form (add)="addTodo($event)" /> + + <!-- 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 (!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"> - @for (todo of todos(); track todo.id) { - <li class="py-2 w-full"> - <label class="fieldset-label"> - <input type="checkbox" [checked]="todo.completed" class="checkbox" (change)="toggleCompleted(todo)" /> - <span [ngClass]="{ 'line-through': todo.completed }">{{ todo.name }}</span> - <button class="btn btn-ghost btn-error" (click)="remove(todo)"> - <fa-icon [icon]="['fas', 'trash']"></fa-icon> - </button> - </label> - </li> - } - </ul> } </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 e77a171..3af9ca6 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,19 +1,19 @@ 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'; import { Todo } from '@core/models/todo'; -import { FaIconComponent } from '@fortawesome/angular-fontawesome'; +import { AddTodoFormComponent } from '@features/todo-list/components/add-todo-form.component'; +import { TodoListItemComponent } from '@features/todo-list/components/todo-list-item'; @Component({ selector: 'app-todo-list', - imports: [NgClass, FormsModule, FaIconComponent], + imports: [FormsModule, AddTodoFormComponent, TodoListItemComponent, TodoListItemComponent], templateUrl: './todo-list.component.html', styleUrl: './todo-list.component.scss', }) -export class TodoListComponent { +export default class TodoListComponent { private reload$$ = new BehaviorSubject<void>(void 0); private readonly todoService = inject(TodoService); todos = toSignal( diff --git a/todo-workspace/frontend/src/main.ts b/todo-workspace/frontend/src/main.ts index 2876990..ab30ab0 100644 --- a/todo-workspace/frontend/src/main.ts +++ b/todo-workspace/frontend/src/main.ts @@ -1,5 +1,5 @@ -import {bootstrapApplication} from '@angular/platform-browser'; -import {appConfig} from '@app/app.config'; -import {AppComponent} from '@app/app.component'; +import { bootstrapApplication } from '@angular/platform-browser'; +import { appConfig } from '@app/app.config'; +import { AppComponent } from '@app/app.component'; bootstrapApplication(AppComponent, appConfig).catch((err) => console.error(err)); -- GitLab