From e939d592f8886b0b60c4846f239bf584c30ca4e9 Mon Sep 17 00:00:00 2001 From: z3n Date: Thu, 11 Jun 2026 14:50:16 +0000 Subject: [PATCH] =?UTF-8?q?feat(browse):=20modale=20de=20suppression=20+?= =?UTF-8?q?=20crayon=20d'=C3=A9dition=20sur=20le=20titre?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remplace le confirm() natif par une vraie modale de confirmation avec gestion d'erreur inline - Ajoute un bouton crayon dans le

pour éditer la catégorie courante (visible uniquement dans /browse/:id) - Signature openEdit() assouplie pour accepter Category (au lieu de CategoryWithCounts) Generated with [Claude Code](https://claude.ai/code) via [Happy](https://happy.engineering) Co-Authored-By: Claude Co-Authored-By: Happy --- .../src/app/pages/browse/browse.component.ts | 89 ++++++++++++++++--- 1 file changed, 79 insertions(+), 10 deletions(-) diff --git a/front-public/src/app/pages/browse/browse.component.ts b/front-public/src/app/pages/browse/browse.component.ts index 5581172..3dbc414 100644 --- a/front-public/src/app/pages/browse/browse.component.ts +++ b/front-public/src/app/pages/browse/browse.component.ts @@ -45,7 +45,17 @@ import { forkJoin } from 'rxjs';
-

{{ browseData()?.category?.name ?? 'Catalogue' }}

+

+ {{ browseData()?.category?.name ?? 'Catalogue' }} + @if (browseData()?.category) { + + } +

+ (click)="openDelete(cat); $event.stopPropagation()"> } @@ -229,6 +239,46 @@ import { forkJoin } from 'rxjs'; } } + + @if (showDeleteModal()) { +
+
+
+
+
+

Supprimer le dossier

+
+
+ +
+
+

+ Êtes-vous sûr de vouloir supprimer le dossier + « {{ deletingCategory()?.name }} » ? +

+

+ Cette action est irréversible. +

+ @if (deleteError()) { +
+

{{ deleteError() }}

+
+ } +
+ + +
+
+
+
+ } + @if (showFormModal()) {
| null = null; - /* Signaux pour la modale */ + /* Signaux pour la modale création / édition */ showFormModal = signal(false); formMode = signal<'create' | 'edit'>('create'); editingCategoryId = signal(null); @@ -331,6 +381,12 @@ export class BrowseComponent implements OnInit { formLoading = signal(false); allCategories = signal([]); + /* Signaux pour la modale de suppression */ + showDeleteModal = signal(false); + deletingCategory = signal(null); + deleteLoading = signal(false); + deleteError = signal(null); + /* Ancêtres = breadcrumb sans le nœud courant (déjà dans le h1) */ ancestors = computed(() => { const d = this.browseData(); @@ -416,7 +472,7 @@ export class BrowseComponent implements OnInit { }); } - openEdit(cat: CategoryWithCounts) { + openEdit(cat: Category) { this.formMode.set('edit'); this.editingCategoryId.set(cat.id); this.formName.set(cat.name); @@ -462,13 +518,26 @@ export class BrowseComponent implements OnInit { }); } - deleteCategory(cat: CategoryWithCounts) { - if (cat.apiCount > 0 || cat.subcategoryCount > 0) return; - if (!confirm(`Supprimer le dossier "${cat.name}" ?`)) return; + openDelete(cat: CategoryWithCounts) { + this.deletingCategory.set(cat); + this.deleteError.set(null); + this.showDeleteModal.set(true); + } + + confirmDelete() { + const cat = this.deletingCategory(); + if (!cat) return; + this.deleteLoading.set(true); this.categoryService.delete(cat.id).subscribe({ - next: () => this.loadBrowse(), - error: (err: { error?: { message?: string } }) => - alert(err?.error?.message ?? 'Erreur lors de la suppression.'), + next: () => { + this.deleteLoading.set(false); + this.showDeleteModal.set(false); + this.loadBrowse(); + }, + error: (err: { error?: { message?: string } }) => { + this.deleteLoading.set(false); + this.deleteError.set(err?.error?.message ?? 'Erreur lors de la suppression.'); + }, }); }