- Catalogage rapide (douchette, code-barres)
- 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é.
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
namespace MaBibli.Shared.Isbn;
|
||||
|
||||
/// <summary>
|
||||
/// Reconnaît qu'un terme de recherche est un <b>code</b> et non des mots, et donne les formes
|
||||
/// sous lesquelles le chercher dans le catalogue.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// <para>
|
||||
/// Le geste visé : scanner un livre qu'on tient en main pour retrouver sa fiche. La douchette
|
||||
/// « tape » l'EAN-13 dans le champ de recherche, la caméra le pose de la même façon — mais la
|
||||
/// recherche du catalogue ne portait que sur le titre et les auteurs, donc ne rendait rien.
|
||||
/// </para>
|
||||
/// <para>
|
||||
/// ⚠️ <b>Les deux formes d'ISBN sont indispensables</b>, ici comme partout ailleurs dans le
|
||||
/// projet : un livre paru avant 2007 porte un ISBN-10 en base, alors qu'un code-barres se lit
|
||||
/// toujours en 13. Ne chercher qu'une forme ferait répondre « vous ne l'avez pas » à propos d'un
|
||||
/// livre posé sur l'étagère.
|
||||
/// </para>
|
||||
/// <para>
|
||||
/// ⚠️ <b>Le seuil de huit chiffres n'est pas décoratif.</b> Sans lui, chercher « 1984 » — un
|
||||
/// titre — remonterait tous les livres dont l'ISBN contient ces quatre chiffres, c'est-à-dire du
|
||||
/// bruit à la place d'une réponse. Aucun titre ne s'écrit avec huit chiffres d'affilée.
|
||||
/// </para>
|
||||
/// </remarks>
|
||||
public static class RechercheIsbn
|
||||
{
|
||||
/// <summary>En deçà, un terme numérique est un titre bien plus probablement qu'un code.</summary>
|
||||
private const int ChiffresMinimum = 8;
|
||||
|
||||
/// <summary>
|
||||
/// Les formes à confronter à <c>Livre.Isbn</c>, ou <c>null</c> si le terme n'est pas un code.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Un terme n'est un code que s'il ne contient <b>rien d'autre</b> que des chiffres, la
|
||||
/// ponctuation d'un ISBN (tirets, espaces, points) et l'éventuel <c>X</c> final : « Zola 1984 »
|
||||
/// reste une recherche de mots.
|
||||
/// </remarks>
|
||||
public static IReadOnlyList<string>? Formes(string? recherche)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(recherche) || !QueDuCode(recherche))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var chiffres = IsbnUtils.Normaliser(recherche);
|
||||
if (chiffres is null || chiffres.Length < ChiffresMinimum)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
// La conversion 13 → 10 ne vaut que pour un ISBN-13 complet et valide ; sur un fragment,
|
||||
// elle n'a pas de sens et on s'en passe — la forme longue suffit alors.
|
||||
return IsbnUtils.TryConvertirEnIsbn10(chiffres, out var court) && court is not null
|
||||
? [chiffres, court]
|
||||
: [chiffres];
|
||||
}
|
||||
|
||||
/// <summary>Vrai si le terme est un ISBN complet et valide — donc s'il désigne UNE édition.</summary>
|
||||
/// <remarks>
|
||||
/// C'est ce qui autorise le catalogue à ouvrir directement la fiche quand un seul livre
|
||||
/// correspond : sur un fragment, le même résultat unique serait un hasard de frappe.
|
||||
/// </remarks>
|
||||
public static bool EstCodeComplet(string? recherche) =>
|
||||
QueDuCode(recherche) && IsbnUtils.EstValide(IsbnUtils.Normaliser(recherche));
|
||||
|
||||
private static bool QueDuCode(string? recherche)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(recherche))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
foreach (var c in recherche)
|
||||
{
|
||||
if (!char.IsDigit(c) && c is not ('-' or ' ' or '.' or 'x' or 'X'))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user