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:
@@ -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", "/")]
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user