From 012f9246836fbc5312f4889d8498dcb6ed3b38c1 Mon Sep 17 00:00:00 2001 From: louispaulb Date: Sat, 4 Jul 2026 09:47:42 -0400 Subject: [PATCH] =?UTF-8?q?feat(planif):=20simplification=20barre=20du=20h?= =?UTF-8?q?aut=20=E2=80=94=20Sugg=C3=A9rer=20(jour=20s=C3=A9lectionn=C3=A9?= =?UTF-8?q?),=20fix=20recherche=20X,=20retrait=20=C3=89quipe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Bouton « Générer » (haut) → « Suggérer » (openSuggest) basé sur le jour de la vue ACTIVE (strip Tournées / Jour kanban / bande mobile). Le solveur de quarts est déplacé dans Outils (« Générer l'horaire (semaine) », doGenerate conservé). - Fix recherche tech : le X (clearable) mettait search=null → `search.value.trim()` plantait le computed visibleTechs → le champ « ne se vidait pas ». Rendu null-safe. - Retrait du sélecteur « Équipe » (groupOptions vide : aucun tech n'a de `group` ; le filtre par compétence suffit). Vérifié préview (desktop 1400px) : X vide le champ sans planter, Suggérer ouvre le dispatch auto, « Équipe » absent, grille rendue. Co-Authored-By: Claude Opus 4.8 --- apps/ops/src/pages/PlanificationPage.vue | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/apps/ops/src/pages/PlanificationPage.vue b/apps/ops/src/pages/PlanificationPage.vue index f11ed06..f3b464a 100644 --- a/apps/ops/src/pages/PlanificationPage.vue +++ b/apps/ops/src/pages/PlanificationPage.vue @@ -96,6 +96,7 @@ + Générer l'horaire (semaine)solveur de quarts — la semaine affichée Générer les horaires (lot)modèle → plusieurs techs, N semaines Rotation de garde @@ -109,7 +110,7 @@ Appliquer le modèle par défaut (consciente des absences) - + Répartition automatique des jobs du jour sélectionné (distance · compétence · priorité · taux d'occupation) — revue avant d'appliquer Notifier les techs par SMS à la publication Réassigne les tickets aux techniciens DANS le système legacy (osTicket) selon l'assignation Ops — aperçu avant d'écrire. @@ -119,7 +120,6 @@
- {{ visibleTechs.length }} / {{ techs.length }} techs {{ cellClipboard.length }} copié(s) @@ -3760,7 +3760,7 @@ const priorityScores = computed(() => { function techScore (t) { const v = priorityScores.value[t.id]; return v == null ? 0 : v } function techRank (t) { if (!skillFilter.value.length) return null; const i = visibleTechs.value.findIndex(x => x.id === t.id); return i >= 0 ? i + 1 : null } const visibleTechs = computed(() => { - const q = search.value.trim().toLowerCase() + const q = (search.value || '').trim().toLowerCase() // clearable (X) met search=null → null-safe (sinon le computed plante et le champ « ne se vide pas ») const list = techs.value.filter(t => (showHidden.value || !isHidden(t.id)) && (!groupFilter.value || t.group === groupFilter.value) && techHasSkill(t) && (!q || (t.name || '').toLowerCase().includes(q) || (t.group || '').toLowerCase().includes(q))) // Filtre par compétence actif → on TRIE par priorité (meilleur score d'abord) ; sinon ordre équipe/nom. if (skillFilter.value.length) return list.slice().sort((a, b) => techScore(a) - techScore(b) || (a.name || '').localeCompare(b.name || '')) @@ -4389,7 +4389,8 @@ function buildSuggestion () { suggestDlg.plan = plan } function openSuggest () { - suggestDay.value = mobileSelIso.value || kbSelIso.value || todayISO() // repli si aucun chip coché + // Jour de base = la sélection de la vue active (strip Tournées, Jour kanban, ou bande mobile) → « Suggérer se base sur la journée sélectionnée » + suggestDay.value = (boardView.value === 'routes' && routesDay.value) || (boardView.value === 'kanban' && kbSelIso.value) || mobileSelIso.value || routesDay.value || kbSelIso.value || todayISO() suggestDlg.fromSel = selectedNames.value.length > 0 // Étape « disponibilité » d'abord : défaut = techs AVEC un quart sur un des jours de la fenêtre (= disponibles) ; sinon tous les visibles. const win = suggestWindow.value // fenêtre = chips de date cochés, sinon le jour du sélecteur