feat(planif): sélecteur de jour « Tournées » = 2 semaines par défaut
routeStripDays passe de 7 → 14 jours (depuis le lundi affiché), données via /roster/capacity (14 j, découplé de la fenêtre de charge 7 j du grid → barres réelles en semaine 2). Chargé à l'entrée de la vue Tournées + au changement de semaine (watch [boardView, start]). Bande pleine largeur + défilement horizontal ; jour courant marqué. Vérifié préview : 14 cellules (29/06→12/07), today marqué, scroll. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
5491aa8abe
commit
b7c24f58b2
|
|
@ -482,7 +482,7 @@
|
||||||
<div v-if="boardView === 'routes'" class="routes-wrap q-pa-sm">
|
<div v-if="boardView === 'routes'" class="routes-wrap q-pa-sm">
|
||||||
<div class="row items-center q-mb-sm" style="gap:6px;flex-wrap:wrap">
|
<div class="row items-center q-mb-sm" style="gap:6px;flex-wrap:wrap">
|
||||||
<span class="text-caption text-grey-7">Journée :</span>
|
<span class="text-caption text-grey-7">Journée :</span>
|
||||||
<OccupancyStrip :days="routeStripDays" :selected="routesDay" style="max-width:420px" @select="routesDay = $event" />
|
<OccupancyStrip :days="routeStripDays" :selected="routesDay" style="flex:1 1 100%;min-width:0" @select="routesDay = $event" />
|
||||||
<q-space />
|
<q-space />
|
||||||
<q-btn dense unelevated no-caps size="sm" :color="showLivePos ? 'teal-6' : 'grey-4'" :text-color="showLivePos ? 'white' : 'grey-8'" icon="my_location" :label="'GPS live' + (dayLivePositions.length ? ' (' + dayLivePositions.length + ')' : '')" @click="showLivePos = !showLivePos"><q-tooltip>Positions GPS des techs (Traccar), rafraîchies ~25 s. Cliquer pour {{ showLivePos ? 'masquer' : 'afficher' }}.</q-tooltip></q-btn>
|
<q-btn dense unelevated no-caps size="sm" :color="showLivePos ? 'teal-6' : 'grey-4'" :text-color="showLivePos ? 'white' : 'grey-8'" icon="my_location" :label="'GPS live' + (dayLivePositions.length ? ' (' + dayLivePositions.length + ')' : '')" @click="showLivePos = !showLivePos"><q-tooltip>Positions GPS des techs (Traccar), rafraîchies ~25 s. Cliquer pour {{ showLivePos ? 'masquer' : 'afficher' }}.</q-tooltip></q-btn>
|
||||||
<span class="text-caption text-grey-6">{{ dayRoutes.length }} tournée(s) · clic tech = zoom · clic arrêt = détail</span>
|
<span class="text-caption text-grey-6">{{ dayRoutes.length }} tournée(s) · clic tech = zoom · clic arrêt = détail</span>
|
||||||
|
|
@ -4682,11 +4682,20 @@ const suggestRoutes = computed(() => {
|
||||||
watch(() => suggestDlg.view, (v) => { if (v === 'map' && !suggestMapDay.value) suggestMapDay.value = suggestWindow.value[0] || '' })
|
watch(() => suggestDlg.view, (v) => { if (v === 'map' && !suggestMapDay.value) suggestMapDay.value = suggestWindow.value[0] || '' })
|
||||||
// ── P3 — Onglet « Tournées » : tournées RÉELLES (jobs assignés, occupation) de la journée choisie, 1 couleur/tech, tracés OSRM (RouteMap). ──
|
// ── P3 — Onglet « Tournées » : tournées RÉELLES (jobs assignés, occupation) de la journée choisie, 1 couleur/tech, tracés OSRM (RouteMap). ──
|
||||||
const routesDay = ref(null)
|
const routesDay = ref(null)
|
||||||
// Sélecteur de jour (Tournées) enrichi : bande d'occupation (barres de charge) au lieu de simples chips « lun 29/06 ».
|
// Sélecteur de jour (Tournées) = bande d'occupation sur 2 SEMAINES (14 j depuis le lundi affiché) par défaut.
|
||||||
const routeStripDays = computed(() => dayList.value.slice(0, 7).map(d => {
|
// Données via /roster/capacity (14 j) — DÉCOUPLÉ de la fenêtre de charge du grid (7 j) → barres réelles même en semaine 2.
|
||||||
const load = estLoad(d.iso) || 0; const cap = visStat(d.iso).hours || 0
|
const routeCapacity = ref({})
|
||||||
return { iso: d.iso, dow: d.dow, dnum: d.dnum, weekend: d.weekend, holiday: isHoliday(d.iso), h: load, cap, ratio: hdrRatio(d.iso), over: cap > 0 && load > cap, today: d.iso === todayISO() }
|
async function loadRouteCapacity () { try { const r = await roster.getCapacity(start.value, 14); routeCapacity.value = r.capacity || {} } catch (e) { routeCapacity.value = {} } }
|
||||||
}))
|
watch([boardView, start], () => { if (boardView.value === 'routes') loadRouteCapacity() }, { immediate: true })
|
||||||
|
const routeStripDays = computed(() => {
|
||||||
|
const out = []
|
||||||
|
for (let i = 0; i < 14; i++) {
|
||||||
|
const iso = addDaysISO(start.value, i); const c = routeCapacity.value[iso] || {}
|
||||||
|
const h = +c.due_h || 0; const cap = +c.cap_h || 0; const dw = dowOf(iso)
|
||||||
|
out.push({ iso, dow: FR_DOW[dw], dnum: iso.slice(8) + '/' + iso.slice(5, 7), weekend: dw === 0 || dw === 6, holiday: isHoliday(iso), h, cap, ratio: cap > 0 ? h / cap : (h > 0 ? 1 : 0), over: !!c.overbooked, today: iso === todayISO() })
|
||||||
|
}
|
||||||
|
return out
|
||||||
|
})
|
||||||
|
|
||||||
// ── Deep-link (?day=YYYY-MM-DD & ?skill=…) + action « planifier des quarts » du slot-finder ──
|
// ── Deep-link (?day=YYYY-MM-DD & ?skill=…) + action « planifier des quarts » du slot-finder ──
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user