- Cataloguer en rafale — nouvel écran /ajout/rafale : on scanne une pile de livres à la suite dans une zone de texte, chaque code est traité (BnF puis OpenLibrary), les doublons connus sont passés automatiquement. La collecte marche même hors-ligne. Le compte rendu liste maintenant les livres créés, en lien vers leur fiche, et reste consultable en revenant sur l'écran même après une rafale entièrement réussie. Le catalogue reconnaît un ISBN dans sa barre de recherche (13 ou 10 chiffres, avec ou sans tirets) : scanner un livre en main ouvre directement sa fiche s'il n'y en a qu'un. Un bouton « Scanner » l'alimente, actif hors-ligne. - Ajouter un tome à une série accepte aussi un ISBN dans le champ manuel : le catalogue est cherché d'abord (rattachement direct si un seul exemplaire), sinon la BnF prend le relais. Séries et sagas - Numéro de tome distinct de la position de lecture : on peut indiquer « c'est le tome 7 » même si on ne possède pas les six premiers ; l'ordre de lecture reste un réglage séparé (utile pour les préquelles). - Tri par numéro en plus du tri par ordre de lecture quand des tomes en portent un. - Panneau « Ajouter » regroupé et repliable sur la fiche d'une série (manuellement / en rafale / depuis le catalogue / depuis les envies), au lieu de quatre formulaires ouverts en permanence. - Filtre catalogue « sans couverture » pour repérer les livres à illustrer. Le catalogue groupe les tomes d'une même série sous un bloc repliable, avec un décompte plus clair (affichés / possédés / total). - Corrections directes sur la fiche - Effacer un prêt saisi par erreur (bouton ✕ sur chaque ligne, avec confirmation), sans passer par « rendre ». - Corriger une couverture manquante ou cassée en cliquant dessus : le champ d'adresse s'ouvre focalisé, Entrée enregistre. Étendu aux numéros de revue dans la dernière modification. - Les thèmes déjà utilisés dans la bibliothèque sont proposés à la frappe. - La recherche d'un livre à rattacher montre des suggestions dès le focus, sans attendre de taper. - Visuel : un rendu manquant après une écriture asynchrone dans le formulaire de livre, une bascule de rôle cassée, des débordements à 320 px, et le style d'un bouton-lien qui restait souligné.
105 lines
4.4 KiB
C#
105 lines
4.4 KiB
C#
using MaBibli.Shared.Entites;
|
|
|
|
namespace MaBibli.Client.Composants;
|
|
|
|
/// <summary>Libellés français des énumérations, au même endroit pour toute l'interface.</summary>
|
|
public static class Libelles
|
|
{
|
|
public static string Format(Format format) => format switch
|
|
{
|
|
MaBibli.Shared.Entites.Format.Physique => "Physique",
|
|
MaBibli.Shared.Entites.Format.Numerique => "Numérique",
|
|
_ => format.ToString(),
|
|
};
|
|
|
|
/// <summary>
|
|
/// Libellé du type de document. <b>« Non précisé » ne s'affiche pas sur une fiche</b> :
|
|
/// c'est l'absence de choix, et l'interface ne montre que ce qui a été choisi. Le libellé
|
|
/// existe pour les boutons de saisie et de filtre, où il faut bien nommer l'option.
|
|
/// </summary>
|
|
public static string TypeDocument(TypeDocument type) => type switch
|
|
{
|
|
MaBibli.Shared.Entites.TypeDocument.NonPrecise => "Non précisé",
|
|
MaBibli.Shared.Entites.TypeDocument.Roman => "Roman",
|
|
MaBibli.Shared.Entites.TypeDocument.BandeDessinee => "BD",
|
|
_ => type.ToString(),
|
|
};
|
|
|
|
/// <summary>
|
|
/// Libellé d'un rôle d'auteur. « Non précisé » ne s'affiche jamais sur une fiche : c'est
|
|
/// l'absence de choix, pas une information.
|
|
/// </summary>
|
|
public static string RoleAuteur(RoleAuteur role) => role switch
|
|
{
|
|
MaBibli.Shared.Entites.RoleAuteur.NonPrecise => "Non précisé",
|
|
MaBibli.Shared.Entites.RoleAuteur.Scenario => "Scénario",
|
|
MaBibli.Shared.Entites.RoleAuteur.Dessin => "Dessin",
|
|
MaBibli.Shared.Entites.RoleAuteur.Couleurs => "Couleurs",
|
|
_ => role.ToString(),
|
|
};
|
|
|
|
public static string Statut(Statut statut) => statut switch
|
|
{
|
|
MaBibli.Shared.Entites.Statut.ALire => "À lire",
|
|
MaBibli.Shared.Entites.Statut.EnCours => "En cours",
|
|
MaBibli.Shared.Entites.Statut.Lu => "Lu",
|
|
_ => statut.ToString(),
|
|
};
|
|
|
|
/// <summary>Classe CSS associée au statut, pour la pastille de couleur.</summary>
|
|
public static string ClasseStatut(Statut statut) => statut switch
|
|
{
|
|
MaBibli.Shared.Entites.Statut.ALire => "statut-a-lire",
|
|
MaBibli.Shared.Entites.Statut.EnCours => "statut-en-cours",
|
|
MaBibli.Shared.Entites.Statut.Lu => "statut-lu",
|
|
_ => string.Empty,
|
|
};
|
|
|
|
/// <summary>
|
|
/// Classe CSS associée au type de document, pour la pastille de couleur (A2, CLAUDE.md) :
|
|
/// le filtre doit reprendre le même vocabulaire visuel que la carte, pas des segments neutres.
|
|
/// « Non précisé » n'a pas de couleur : ce n'est pas une valeur choisie.
|
|
/// </summary>
|
|
public static string ClasseTypeDocument(TypeDocument type) => type switch
|
|
{
|
|
MaBibli.Shared.Entites.TypeDocument.Roman => "type-roman",
|
|
MaBibli.Shared.Entites.TypeDocument.BandeDessinee => "type-bd",
|
|
_ => string.Empty,
|
|
};
|
|
|
|
/// <summary>
|
|
/// Ce qu'annonce un bloc de série au catalogue : ce qui y est affiché, ce qu'on possède, et
|
|
/// ce que la série compte de tomes.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// ⚠️ <b>Le compte d'un bloc changeait avec le filtre</b> : « 3 tomes » devenait « 1 tome »
|
|
/// dès qu'une recherche écartait les autres, et se lisait alors comme « cette série n'a qu'un
|
|
/// tome ». Le nombre affiché ne disait pas de quoi il parlait.
|
|
/// <para>
|
|
/// Trois nombres seraient du bruit quand ils coïncident : les égalités se replient donc.
|
|
/// Un fonds complet et non filtré redit simplement « 3 tomes », comme avant.
|
|
/// </para>
|
|
/// </remarks>
|
|
/// <param name="affiches">Tomes de ce bloc actuellement à l'écran, filtre appliqué.</param>
|
|
/// <param name="possedes">Tomes de cette série présents au catalogue, descendance comprise.</param>
|
|
/// <param name="total">Tomes recensés dans la série, ceux qui manquent compris.</param>
|
|
public static string CompteBloc(int affiches, int possedes, int total)
|
|
{
|
|
var tomes = total > 1 ? "tomes" : "tome";
|
|
|
|
if (affiches == possedes && possedes == total)
|
|
{
|
|
return $"{total} {tomes}";
|
|
}
|
|
|
|
if (affiches == possedes)
|
|
{
|
|
return $"{possedes} sur {total} {tomes}";
|
|
}
|
|
|
|
return possedes == total
|
|
? $"{affiches} affiché{(affiches > 1 ? "s" : "")} sur {total} {tomes}"
|
|
: $"{affiches} affiché{(affiches > 1 ? "s" : "")} · {possedes} sur {total} {tomes}";
|
|
}
|
|
}
|