Mise en place de la possibilité de supprimer des lores / campagnes d'un seul coup

This commit is contained in:
2026-04-23 11:51:03 +02:00
parent 5f5b2ecb87
commit 5121e2d2e3
15 changed files with 585 additions and 54 deletions

View File

@@ -12,8 +12,7 @@
<button
type="button"
class="btn-danger"
[disabled]="!canDelete"
[title]="canDelete ? 'Supprimer le dossier' : 'Impossible : le dossier contient des éléments'"
title="Supprimer le dossier et tout son contenu"
(click)="delete()">
Supprimer
</button>
@@ -57,11 +56,6 @@
</div>
</div>
<div class="info-box" *ngIf="!canDelete">
⚠️ Pour supprimer ce dossier, videz-le d'abord : déplacez ou supprimez ses
{{ childFolderCount }} sous-dossier(s) et ses {{ pageCount }} page(s).
</div>
</form>
</div>

View File

@@ -134,16 +134,35 @@ export class LoreNodeEditComponent implements OnInit, OnDestroy {
});
}
get canDelete(): boolean {
return this.childFolderCount === 0 && this.pageCount === 0;
}
/**
* Suppression en cascade : on va chercher le compte exact de sous-dossiers et
* de pages (qui tombent avec le dossier), on l'annonce dans la confirmation,
* puis on délègue au backend — l'atomicité est garantie côté transaction.
*/
delete(): void {
if (!this.canDelete || !this.node) return;
if (!confirm(`Supprimer le dossier "${this.node.name}" ?`)) return;
this.loreService.deleteLoreNode(this.folderId).subscribe({
next: () => this.router.navigate(['/lore', this.loreId]),
error: () => console.error('Erreur lors de la suppression du dossier')
if (!this.node) return;
const node = this.node;
this.loreService.getLoreNodeDeletionImpact(this.folderId).subscribe({
next: impact => {
const parts: string[] = [];
if (impact.folders > 0) parts.push(`${impact.folders} sous-dossier${impact.folders > 1 ? 's' : ''}`);
if (impact.pages > 0) parts.push(`${impact.pages} page${impact.pages > 1 ? 's' : ''}`);
const lines = [`Supprimer le dossier "${node.name}" ?`];
if (parts.length) {
lines.push('');
lines.push(`Cette action supprimera aussi : ${parts.join(', ')}.`);
}
lines.push('');
lines.push('Cette action est irréversible.');
if (!confirm(lines.join('\n'))) return;
this.loreService.deleteLoreNode(this.folderId).subscribe({
next: () => this.router.navigate(['/lore', this.loreId]),
error: () => console.error('Erreur lors de la suppression du dossier')
});
},
error: () => console.error('Impossible de récupérer les dépendances du dossier')
});
}