From 71ee3605d4c0b104a92ee812052ce3f957cfb75b Mon Sep 17 00:00:00 2001 From: Pierre MARTIN Date: Tue, 3 Nov 2026 20:24:24 +0100 Subject: [PATCH] =?UTF-8?q?Mes=20parties=20:=20suppression=20en=20deux=20t?= =?UTF-8?q?ouchers,=20sans=20bo=C3=AEte=20du=20navigateur?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- app/src/ui/app.ts | 1 - app/src/ui/games-texts.ts | 2 +- app/src/ui/games-view.ts | 15 +++++++++++---- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/app/src/ui/app.ts b/app/src/ui/app.ts index b5917c8..1ec137a 100644 --- a/app/src/ui/app.ts +++ b/app/src/ui/app.ts @@ -822,7 +822,6 @@ export function startApp(options: AppOptions): void { }, remove: options.games.remove, exportSgf: options.games.exportSgf, - confirm: (question) => window.confirm(question), }); /** Joue un demi-coup du joueur ; le coup attend ensuite sa suite ou sa diff --git a/app/src/ui/games-texts.ts b/app/src/ui/games-texts.ts index 8525884..973f794 100644 --- a/app/src/ui/games-texts.ts +++ b/app/src/ui/games-texts.ts @@ -31,7 +31,7 @@ export const GAMES_TEXTS = { resumeBranch: "Reprendre cette branche", exportSgf: "Exporter (SGF)", remove: "Supprimer", - confirmRemove: "Supprimer définitivement cette partie et toutes ses branches ?", + confirmRemove: "Supprimer pour de bon (branches comprises)", shown: "partie affichée", busy: "Attendez la fin du coup en cours.", failed: (message: string) => `Erreur : ${message}`, diff --git a/app/src/ui/games-view.ts b/app/src/ui/games-view.ts index 2d180ab..6b83f4f 100644 --- a/app/src/ui/games-view.ts +++ b/app/src/ui/games-view.ts @@ -28,7 +28,6 @@ export interface GamesViewOptions { readonly remove: (id: string) => Promise; /** Le fichier SGF d'une partie : son nom et son contenu. */ readonly exportSgf: (id: string) => Promise<{ fileName: string; text: string }>; - readonly confirm: (question: string) => boolean; } export interface GamesView { @@ -132,13 +131,21 @@ export function createGamesView(options: GamesViewOptions): GamesView { "secondary", "export", ), + // Supprimer se fait en deux touchers, sans boîte du navigateur : + // le premier change le bouton en demande de confirmation. button( GAMES_TEXTS.remove, run(async () => { - if (options.confirm(GAMES_TEXTS.confirmRemove)) { - await options.remove(game.id); - await render(); + const remove = item.querySelector('[data-action="remove"]'); + if (remove?.dataset.armed !== "true") { + if (remove !== null) { + remove.dataset.armed = "true"; + remove.textContent = GAMES_TEXTS.confirmRemove; + } + return; } + await options.remove(game.id); + await render(); }), "secondary", "remove",