Sors du chemin de la consultation d'une revue ce qui la modifie

La fiche d'une revue portait tout à la fois : ses numéros, le formulaire
d'ajout, les champs de la revue et sa suppression. Elle prend la forme
déjà tenue par la fiche d'un livre et par celle d'une série — une route
pour regarder, une route pour changer.

« Ajouter un numéro » et « Modifier la revue » remontent à droite du
titre, dans le bloc d'en-tête partagé avec la fiche d'une série : les
deux actions sont visibles sans descendre au bas d'une collection de
trente numéros.

⚠️ Modifier et retirer un numéro n'existent plus QUE dans
/revues/{id}/edition. En consultation, ces deux boutons se déclenchaient
sous le pouce en faisant défiler la liste — même raison que les flèches
d'ordre d'une série, reléguées sur leur propre écran.

⚠️ Ajouter un numéro, lui, RESTE en consultation, et ce n'est pas une
entorse : le geste ne touche pas à la fiche de la revue, il range un
objet de plus, comme noter un prêt depuis la fiche d'un livre. Le
formulaire se replie derrière son bouton, et s'ouvre de lui-même quand
on arrive du scanner avec un numéro lu sur l'add-on EAN-2 : demander un
clic de plus pour saisir ce qu'on tient en main serait un détour.

Un retrait de numéro se confirme désormais, comme la suppression d'un
livre ou d'une revue : il ne se défait pas, et la liste s'égrène sous le
pouce.

⚠️ Les deux routes partagent le paramètre {id} : le routeur ne
redessine rien en passant de l'une à l'autre, d'où l'abonnement à
LocationChanged — piège déjà rencontré sur la fiche livre. Quitter
l'édition referme au passage ce qui n'a de sens que là : formulaire de
numéro ouvert, retrait ou suppression en attente de confirmation.

/revues/{id}/edition entre dans la table de RemonteeRoutes : elle
retombait jusqu'ici sur le repli de branche, donc sur la liste des
revues au lieu de la fiche qu'on venait de quitter.

Deux tests de service viennent avec, sur ce dont l'écran dépend sans le
recalculer : la revue rendue par la modification d'un numéro revient
déjà rangée (corriger une parution déplace le numéro, les numéros sans
date fermant toujours la liste), et un retrait ne touche qu'au numéro
visé. 605 tests au vert.

Pas de vérification en navigateur : le rendu repose sur la relecture.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
mathieu
2026-08-21 14:07:51 +02:00
co-authored by Claude Opus 5
parent 94f0ef15c0
commit 0976da90be
4 changed files with 287 additions and 102 deletions
+2 -1
View File
@@ -29,6 +29,7 @@ public class RemonteeRoutesTests
[InlineData("/ajout/manuel", "/")]
// Revues
[InlineData("/revues/ajout", "/revues")]
[InlineData("/revues/12/edition", "/revues/12")]
[InlineData("/revues/12", "/revues")]
[InlineData("/revues", "/")]
// Auteurs
@@ -74,7 +75,7 @@ public class RemonteeRoutesTests
/// deviné, et jamais rien d'externe.
/// </summary>
[Theory]
[InlineData("/revues/12/edition", "/revues")]
[InlineData("/revues/12/inconnu", "/revues")]
[InlineData("/series/7/inconnu", "/series")]
[InlineData("/inconnu/total", "/")]
[InlineData("/livres", "/")]
+59
View File
@@ -307,6 +307,65 @@ public class ServiceRevuesTests : IDisposable
Assert.Equal(2, (await _db.ArticlesUne.ToListAsync()).Count);
}
/// <summary>
/// L'écran d'édition (lot W) affiche <b>telle quelle</b> la revue rendue par la
/// modification d'un numéro : elle doit donc revenir déjà rangée.
/// </summary>
/// <remarks>
/// ⚠️ C'est ce qui empêche de croire qu'on a mal saisi une date : corriger la parution d'un
/// numéro le déplace dans la liste, et l'écran ne recharge rien de son côté. Les numéros
/// sans date ferment la liste, ici comme partout — une date inconnue n'est pas une date
/// ancienne.
/// </remarks>
[Fact]
public async Task Corriger_la_parution_range_le_numero_a_sa_place()
{
var revue = await RevueAsync();
await _revues.AjouterNumeroAsync(revue.Id, new AjoutNumeroRevue
{
Numero = "43",
DateParution = new DateTime(2024, 6, 1, 0, 0, 0, DateTimeKind.Utc),
});
var cree = (await _revues.AjouterNumeroAsync(revue.Id, new AjoutNumeroRevue
{
Numero = "hors-série 1",
})).Revue!;
Assert.Equal(["43", "hors-série 1"], cree.Numeros.Select(n => n.Numero));
var horsSerie = cree.Numeros.First(n => n.Numero == "hors-série 1").Id;
var apres = await _revues.ModifierNumeroAsync(horsSerie, new AjoutNumeroRevue
{
Numero = "hors-série 1",
DateParution = new DateTime(2025, 3, 1, 0, 0, 0, DateTimeKind.Utc),
});
Assert.Equal(["hors-série 1", "43"], apres.Revue!.Numeros.Select(n => n.Numero));
}
/// <summary>
/// Retirer un numéro depuis l'écran d'édition ne touche qu'à lui : les autres parutions et
/// la fiche de la revue restent en place.
/// </summary>
[Fact]
public async Task Retirer_un_numero_laisse_la_revue_et_ses_autres_numeros()
{
var revue = await RevueAsync();
await _revues.AjouterNumeroAsync(revue.Id, new AjoutNumeroRevue { Numero = "43" });
var cree = (await _revues.AjouterNumeroAsync(
revue.Id, new AjoutNumeroRevue { Numero = "44" })).Revue!;
Assert.True(await _revues.RetirerNumeroAsync(cree.Numeros.First(n => n.Numero == "44").Id));
var restantes = await _revues.ListerAsync();
Assert.Equal(["43"], Assert.Single(restantes).Numeros.Select(n => n.Numero));
}
public void Dispose()
{
_db.Dispose();