feat(r3.4): corrections de recette (8 écarts) + recherche globale ⌘K

Arbitrage du référent sur la revue pixel : tout corriger, activer la
recherche.

- Stock : filtre fournisseur, sous-seuil en tête, « Entrée de stock »
  depuis la liste ; fiche pièce : fournisseur → lien Tiers.
- Statistiques : période 3/6/12 mois (paramètre months au contrat).
- Tiers : rattachements syndic→site (migration r3_recette_fixes,
  Location.partnerId gardé CLIENT), éditable sur la fiche site, seedé.
- Bibliothèque : filtre « Rattaché à » + glisser-déposer (modale
  préremplie, rattachement toujours requis).
- Recherche globale : GET /search (73 opérations) — familles OT/
  ascenseurs/sites filtrées par la matrice, « voir autre » respecté ;
  topbar ⌘K, debounce, résultats groupés, navigation clavier.

74 tests API (8 nouveaux sur le scoping de la recherche), 14/14
Playwright dont un parcours « recette corrigée », 18/18 contrôles en
navigateur réel, zéro erreur console.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
pr-daaif
2026-07-17 02:14:43 +01:00
parent c46a97ed08
commit 460ef4a80e
38 changed files with 1318 additions and 65 deletions

View File

@@ -187,7 +187,38 @@ table {
.recherche svg {
width: 15px;
height: 15px;
flex: none;
}
.recherche[data-active] { position: relative; color: var(--encre-3); }
.recherche input {
flex: 1; min-width: 0; border: 0; background: transparent; outline: none;
color: var(--encre); font-size: 13px; font-family: inherit;
}
.recherche input::placeholder { color: var(--encre-3); }
.recherche kbd {
font-family: inherit; font-size: 11px; color: var(--encre-3);
border: 1px solid var(--bordure); border-radius: 5px; padding: 1px 5px;
background: var(--surface);
}
.recherche .resultats {
position: absolute; top: calc(100% + 6px); left: 0; right: 0; z-index: 50;
background: var(--surface); border: 1px solid var(--bordure);
border-radius: var(--rayon); box-shadow: 0 12px 32px rgb(15 23 42 / .14);
padding: 6px; max-height: 420px; overflow-y: auto;
}
.groupe-resultats {
font-size: 10.5px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase;
color: var(--encre-3); padding: 8px 10px 4px;
}
.resultat {
display: flex; align-items: center; gap: 10px; width: 100%;
padding: 8px 10px; border-radius: 8px; text-align: left;
color: var(--encre); font-size: 13px; cursor: pointer;
}
.resultat[data-actif] { background: var(--primaire-doux); }
.resultat .ref { color: var(--primaire); font-weight: 700; flex: none; }
.resultat .titre { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.resultat .fin { flex: none; color: var(--encre-2); font-size: 12px; display: inline-flex; }
.compte {
margin-left: auto;
display: flex;
@@ -896,6 +927,15 @@ table {
.total { display: flex; justify-content: space-between; font-weight: 700; padding-top: 10px; font-size: 14px; }
/* Bibliothèque */
.zone-depot {
width: 100%; border: 1.5px dashed var(--bordure-forte, var(--bordure));
border-radius: var(--rayon); background: var(--surface);
padding: 16px; color: var(--encre-2); font-size: 13px; text-align: center;
cursor: pointer; transition: border-color .15s, background-color .15s;
}
.zone-depot:hover, .zone-depot[data-survol] {
border-color: var(--primaire); background: var(--primaire-doux); color: var(--encre);
}
.docs { display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px; }
@media (max-width: 1100px) { .docs { grid-template-columns: repeat(2, 1fr); } }
.doc {