v2026.5.47 — Vue « échelle de temps exacte » : aide à la saisie, erreurs mises en évidence, corrections de fiabilité

- Retour visuel au survol d'un créneau libre (zone surlignée + heure choisie qui suit la souris ; bulle fixe plage libre + durée disponible, jamais par-dessus un rendez-vous).
- Rendez-vous en erreur (début = fin) affiché en rouge et visible en échelle exacte ; avertissement + blocage à la création par-dessus. Interventions courtes visibles.
- Zone du nom du technicien pleine hauteur ; barre des heures collée sous la banderole.
- Fiabilité : navigation rapide entre dates, technicien retiré, deadlock de synchro du dossier, jour lu depuis le dossier d'emblée, doublon d'absence, réservations multiples le même jour, barre de progression et message de reconnexion.
- Synchro : bouton « Tester la communication », panneau réorganisé, script du poste 2026.1.8 (verrou d'index, icône persistante).
This commit is contained in:
2026-07-18 23:17:58 +02:00
parent 975a907f2b
commit 5f6802a3ab
8 changed files with 870 additions and 183 deletions
+1 -1
View File
@@ -1,7 +1,7 @@
{
"manifest_version": 3,
"name": "Planification",
"version": "2026.5.46",
"version": "2026.5.47",
"description": "Vue claire et rapide du planning des techniciens EasyVista. Développé par Quentin Rouiller — DGNSI, Canton de Vaud.",
"key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAl/El4I9gxcZkp5bnheg4ZBCKxckRLt9xQ5x+i6phEPYlydl6NapWlkbOyycUaeTZcpoEh/tKQnpMpoEc5jY8zCoRTwh/vfejVBZE6ANDG/dc3iix/1Z8OhRI4zMaRYQ+DQTjS5Q6l6wkcwzbQB85HZNhke/k1qIW6RCuBjeJYmES5WVDwzfCNVvaF6uQvdOCpLjrA3+LI6vUBEwaMg1hM42mC3dU0z9p7qzAby/dH3XpZD9HTFXLJL9/1zryN9rXNDpvZwYWnJ0hLTu5tfmURkvgKOwquX1KJy9vupmhUALRtS08Fplx/e3kUH3LD+coS1ExLwoOZ+1ORBUE9JCB8wIDAQAB",
"permissions": [
+155 -14
View File
@@ -1130,6 +1130,18 @@ html.view-classic .error-box.error-box-centered {
box-shadow: var(--shadow);
text-align: center;
}
/* v2026.5.47 — message de reconnexion EasyVista (#session-needed /
#ev-unreachable) CENTRÉ dans la zone de contenu en vue horizontale (avant :
posé en haut, comme un item flex de main#main). main#main est
position:relative en horizontal ; on centre dans le contenu (à droite de la
sidebar) via left = 50% + --sidebar-w/2. */
html.view-horizontal .session-needed {
position: absolute !important;
top: 50% !important;
left: calc(50% + var(--sidebar-w, 200px) / 2) !important;
transform: translate(-50%, -50%) !important;
margin: 0 !important;
}
.session-needed h2 {
margin: 0 0 12px 0;
color: var(--text);
@@ -1549,6 +1561,35 @@ html.view-horizontal .timeline-noon {
background: #c44040 !important;
}
/* v2026.5.47 — intervention à DURÉE NULLE (début == fin, ex. 10:00→10:00 :
erreur de saisie EV). Même rouge plein que les conflits ci-dessus, pour la
repérer d'un coup d'oeil dans toutes les vues. */
.iv-mini-card.iv-zero-duration {
background: #b03030 !important;
color: #ffffff !important;
border-color: #7a1f1f !important;
}
.iv-mini-card.iv-zero-duration .iv-mini-card-bar,
.iv-mini-card.iv-zero-duration .iv-mini-time-vertical,
.iv-mini-card.iv-zero-duration .iv-mini-card-text {
color: #ffffff !important;
background: transparent !important;
}
/* Vue exacte : la bulle est très fine (min-width) → le bord gauche (poignée)
doit être rouge lui aussi, sinon on ne verrait que sa couleur de catégorie. */
html.view-horizontal .iv-exact-card.iv-zero-duration .iv-exact-handle {
background-color: #7a1f1f !important;
background-image: none !important;
}
/* v2026.5.47 — durée nulle PLUS VISIBLE en vue exacte : un peu plus large
que les interventions courtes (11 px vs 6 px) + hachures rouges pour attirer
l'oeil sur l'erreur. */
html.view-horizontal .iv-exact-card.iv-zero-duration {
min-width: 11px !important;
background-image: repeating-linear-gradient(
45deg, #b03030 0 4px, #7a1f1f 4px 8px) !important;
}
/* ==========================================================================
Interventions — layout v2 (heures verticales)
========================================================================== */
@@ -4352,6 +4393,16 @@ html.theme-dark .card.absence-cat-recurring {
background: linear-gradient(to bottom, rgba(6, 182, 212, 0.12) 0%, var(--bg-elevated) 40%);
}
/* v2026.5.46 — vue horizontale : en échelle exacte, la carte d'un tech
absent est HAUTE (elle s'étire sur toute la frise) alors que son contenu est
court. Le dégradé « couleur → neutre à 40 % » (pensé pour les cartes courtes
de la vue classique) laissait tout le bas de la carte en neutre. En vue
horizontale on remplit donc TOUTE la carte de la couleur douce (theme-aware
via --c-*-soft) ; la vue classique garde le dégradé. */
html.view-horizontal .card.absence-cat-maladie { background: var(--c-maladie-soft); }
html.view-horizontal .card.absence-cat-conge,
html.view-horizontal .card.absence-cat-recurring { background: var(--c-conge-soft); }
/* Message "Absent le vendredi" (ou autre récurrence) en cyan.
Règle UNIQUE — les bordures haut/bas (qui venaient d'un 2e bloc plus
haut, v4.1.20) sont repliées ici ; le bloc dupliqué a été retiré. */
@@ -4521,6 +4572,14 @@ html.view-horizontal .card-header {
padding: 6px 10px !important;
gap: 3px !important;
flex: 0 0 auto;
/* v2026.5.47 — le fond de la zone nom remplit TOUTE la hauteur de la
ligne (nom toujours centré via justify-content:center). En mode normal le
parent .card est déjà align-items:stretch, mais en mode heure exacte il
passe à align-items:center (pour centrer les bulles du corps), ce qui
laissait le header en bandeau fixe plus court que la ligne, avec du fond de
carte visible au-dessus/en dessous. align-self:stretch force le header à
s'étirer dans les deux modes ; le corps garde son propre centrage. */
align-self: stretch !important;
}
/* v2026.5.40 : nom du tech complet (jusqu'à 3 lignes). Si vraiment
trop long, .card-tech-name-tight est appliqué dynamiquement par le JS
@@ -5199,23 +5258,29 @@ html.view-horizontal .horizontal-sidebar .date-custom {
justify-content: center !important;
}
/* 13. Barre de rafraîchissement en vue horizontale : overlay par-dessus
user-badge + titre (zone haut de sidebar). */
/* 13. Barre de rafraîchissement en vue horizontale.
v2026.5.47 — Quentin : la barre doit RESTER dans la barre de gauche,
AU-DESSUS des initiales — pas dans le contenu où elle couvrait
les heures du mode « échelle exacte ». Elle repasse donc en overlay sur la
SIDEBAR (left:0, width = --sidebar-w) ; top suit --stack-top (sous la
banderole de session/reco si présente). Pour NE PAS recouvrir les
initiales, le contenu de la sidebar est poussé vers le bas pendant le
rafraîchissement (classe .planif-refreshing sur <html>, cf. showProgressBar). */
html.view-horizontal #progress-bar {
position: fixed !important;
top: 0 !important;
top: var(--stack-top, 0px) !important;
left: 0 !important;
width: 200px !important; /* largeur de la sidebar */
width: var(--sidebar-w, 200px) !important;
right: auto !important;
z-index: 9999 !important;
border-radius: 0 !important;
margin: 0 !important;
pointer-events: none;
}
/* Sur breakpoint étroit (sidebar 170px) */
@media (max-width: 1400px) {
html.view-horizontal #progress-bar {
width: 170px !important;
}
/* Réserve la hauteur de la barre en haut de la sidebar pendant un
rafraîchissement → les initiales / le titre passent SOUS la barre. */
html.planif-refreshing.view-horizontal .horizontal-sidebar {
padding-top: 34px !important;
}
/* v2026.5.40 : banderole "En pompier du..." en vue HORIZONTALE
@@ -7017,6 +7082,76 @@ html.view-horizontal .iv-exact-lane + .iv-exact-lane {
outline-offset: -2px;
}
/* v2026.5.47 — surbrillance de survol : la ZONE (1 h par défaut) qu'un clic
droit poserait en rendez-vous/absence, calée sous la souris à l'heure snappée
(créneau libre, mode heure exacte). Plus marquée que le survol gris du trou,
pour qu'on VOIE clairement la zone visée. Purement visuelle. */
.iv-exact-selpreview {
position: absolute;
top: 0;
bottom: 0;
pointer-events: none;
z-index: 0;
box-sizing: border-box;
border-radius: 4px;
border: 2px solid var(--accent, #3b82f6);
background: rgba(94, 168, 232, 0.28);
background: color-mix(in srgb, var(--accent, #3b82f6) 28%, transparent);
}
/* v2026.5.47 — bulle « temps disponible » FIXE en haut de la bande (elle ne
suit PLUS la souris) : plage libre du créneau survolé, ou avertissement rouge
si erreur. Seule la zone de sélection (.iv-exact-selpreview) suit le curseur. */
.iv-exact-selinfo {
position: absolute;
top: 3px;
left: 50%;
transform: translateX(-50%);
white-space: nowrap;
text-align: center;
line-height: 1.25;
font-size: calc(11px * var(--text-scale, 1));
padding: 3px 10px;
border-radius: 6px;
background: var(--bg-elevated, #21242b);
color: var(--text, #e8eaed);
border: 1px solid var(--accent, #3b82f6);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.35);
pointer-events: none;
z-index: 3;
}
.iv-exact-selinfo-main { font-weight: 700; }
.iv-exact-selinfo-sub { font-size: 0.9em; opacity: 0.8; font-weight: 500; }
.iv-exact-selinfo.danger .iv-exact-selinfo-sub { opacity: 0.95; }
/* v2026.5.47 — heure choisie (débutfin) affichée DANS le rectangle de
sélection mobile ; suit le curseur, lisible sur le fond translucide.
v2026.5.47 — placée EN BAS du rectangle (la bulle fixe est en haut) → la
bulle ne cache jamais l'heure quand la souris passe dessous. */
.iv-exact-selpreview-hour {
position: absolute;
bottom: 3px;
left: 50%;
transform: translateX(-50%);
white-space: nowrap;
font-size: calc(10.5px * var(--text-scale, 1));
font-weight: 700;
color: #ffffff;
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.75);
pointer-events: none;
}
/* v2026.5.47 — un rendez-vous en ERREUR (début == fin) tombe dans la zone
qu'on créerait : surbrillance ET bulle passent en rouge (le clic droit est
par ailleurs bloqué, cf. disabledReason). */
.iv-exact-selpreview.danger {
border-color: #b03030;
background: rgba(176, 48, 48, 0.30);
background: color-mix(in srgb, #b03030 32%, transparent);
}
.iv-exact-selinfo.danger {
background: #b03030;
color: #ffffff;
border-color: #7a1f1f;
}
/* ── Les cartes posées (héritent de .iv-mini-card : anatomie, conflits
rouges !important, liseré clos/résolu, tooltips, reschedule) ────────── */
html.view-horizontal .iv-exact-card {
@@ -7035,7 +7170,11 @@ html.view-horizontal .iv-exact-card {
height: auto !important;
pointer-events: auto;
flex: none;
min-width: 0;
/* v2026.5.47 — largeur MINIMALE visible : une intervention très courte
(1-5 min) ou à durée nulle (10:00→10:00) a une largeur proportionnelle
quasi nulle → elle disparaissait. Ce plancher la garde visible (très fine),
sans élargir les bulles normales (plus larges que ce plancher). */
min-width: 6px;
z-index: 1;
container-type: inline-size;
border-radius: 4px;
@@ -7155,10 +7294,12 @@ html.view-horizontal .iv-exact-card .iv-mini-card-text-mini .iv-mini-mini-ville
html.view-horizontal.horizontal-exact .exact-hours-ruler {
display: block;
position: sticky;
/* v2026.5.46 — top:0 : en vue horizontale la barre du haut est
masquée, donc --stack-top (calé sur elle) envoyait la règle hors écran.
La sidebar utilise déjà top:0 dans la même structure et tient. */
top: 0;
/* v2026.5.47 — top suit --stack-top : la règle des heures reste collée en
haut au scroll, ET passe SOUS la banderole de session/reconnexion quand il y
en a une (au lieu de disparaître derrière), 0 sinon. (--stack-top = topbar
masquée en horizontal + hauteur des banderoles visibles ; corrigé depuis
des ajustements précédents, il ne sort plus la règle de l'écran.) */
top: var(--stack-top, 0px);
z-index: 20;
background: var(--bg);
/* v2026.5.46 — l'alignement n'est PLUS un calcul théorique (faux au
+610 -154
View File
File diff suppressed because it is too large Load Diff