From 23f0f727311554bf2b36f3eb5815c01ebabaf07e Mon Sep 17 00:00:00 2001 From: louispaulb Date: Sun, 19 Jul 2026 15:35:33 -0400 Subject: [PATCH] =?UTF-8?q?feat(ops):=20=C2=AB=20/=20=C2=BB=20=3D=20accuei?= =?UTF-8?q?l=20universel=20adapt=C3=A9=20au=20r=C3=B4le=20(step=203/3)=20+?= =?UTF-8?q?=20consolidation=20Th=C3=A8me/=C3=89quipe=E2=86=92Param=C3=A8tr?= =?UTF-8?q?es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Step 3/3. Avant : '/' = « Tableau de bord » réservé (requires view_dashboard_kpi) → un agent de service n'avait pas d'accueil pertinent. Maintenant '/' = « Accueil » visible par tous ; l'accueil PERSONNEL (MonAujourdhui) s'affiche pour chacun, et les sections GESTION sont gated dans la page : - KPI (stats) + Administration + Activité récente → can('view_dashboard_kpi') - Charge 2 semaines (occupation) → can('view_all_jobs') Résultat : un CSR voit un accueil épuré (sa boîte / ses tickets) ; un gestionnaire garde le tableau complet. Embarque aussi la consolidation déjà déployée que ces fichiers portaient : Équipe + Thème → Paramètres (nav retirée + routes redirigées vers /settings). Vérifié en dev : nav « Accueil » (plus « Tableau de bord »), sections gestion rendues pour superuser, MonAujourdhui présent, 0 erreur console. Build OK, leak-clean, déployé. Co-Authored-By: Claude Fable 5 --- apps/ops/src/config/nav.js | 6 ++---- apps/ops/src/pages/DashboardPage.vue | 14 ++++++++------ apps/ops/src/router/index.js | 4 ++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/apps/ops/src/config/nav.js b/apps/ops/src/config/nav.js index aa29bc7..03d5bd0 100644 --- a/apps/ops/src/config/nav.js +++ b/apps/ops/src/config/nav.js @@ -9,7 +9,7 @@ export const navSections = [ ] export const navItems = [ // ── Épinglés (haut, toujours visibles) ── - { path: '/', icon: 'LayoutDashboard', label: 'Tableau de bord', requires: 'view_dashboard_kpi' }, + { path: '/', icon: 'LayoutDashboard', label: 'Accueil', requires: null }, // accueil universel adapté au rôle (MonAujourdhui) ; sections gestion gated dans la page { path: '/rapports', icon: 'BarChart3', label: 'Rapports', requires: 'view_dashboard_kpi' }, // ── Service client ── { path: '/communications', icon: 'MessagesSquare', label: 'Communications', requires: 'view_clients', section: 'service' }, @@ -24,8 +24,7 @@ export const navItems = [ { path: '/historique', icon: 'History', label: 'Historique', requires: 'view_all_jobs', section: 'terrain' }, { path: '/taches-pilote', icon: 'Workflow', label: 'Orchestration (tâches)', requires: 'view_all_jobs', section: 'terrain' }, { path: '/network', icon: 'Network', label: 'Réseau (GPON)', requires: 'view_settings', section: 'terrain' }, - // ── Administration ── - { path: '/equipe', icon: 'UsersRound', label: 'Équipe', requires: 'manage_users', section: 'admin' }, + // ── Administration ── (« Équipe » consolidé dans Paramètres → /settings) { path: '/campaigns', icon: 'Gift', label: 'Campagnes', requires: 'manage_users', section: 'admin' }, { path: '/campaigns/pool', icon: 'Award', label: 'Récompenses', requires: 'manage_users', section: 'admin' }, { path: '/evenements', icon: 'PartyPopper', label: 'Événements', requires: 'manage_users', section: 'admin' }, @@ -37,7 +36,6 @@ export const navItems = [ { path: '/factures-fournisseurs', icon: 'ReceiptText', label: 'Factures fournisseurs', requires: 'view_settings', section: 'admin' }, { path: '/sous-traitants', icon: 'HardHat', label: 'Sous-traitants', requires: 'view_settings', section: 'admin' }, { path: '/facturation/approbations', icon: 'ClipboardCheck', label: 'Approb. facturation', requires: 'view_all_jobs', section: 'admin' }, - { path: '/theme', icon: 'Palette', label: 'Thème & couleurs', requires: 'view_settings', section: 'admin' }, { path: '/settings', icon: 'Settings', label: 'Paramètres', requires: 'view_settings', section: 'admin' }, ] diff --git a/apps/ops/src/pages/DashboardPage.vue b/apps/ops/src/pages/DashboardPage.vue index 0eb59e8..cdec926 100644 --- a/apps/ops/src/pages/DashboardPage.vue +++ b/apps/ops/src/pages/DashboardPage.vue @@ -7,8 +7,8 @@ - -
+ +
@@ -25,7 +25,7 @@
-
+
Charge 2 semaines
@@ -52,7 +52,7 @@
- +
@@ -146,8 +146,8 @@
- -
+ +
Tickets ouverts
@@ -212,6 +212,7 @@ import { ref, onMounted, onUnmounted } from 'vue' import { useQuasar } from 'quasar' import { useRouter } from 'vue-router' +import { usePermissions } from 'src/composables/usePermissions' import { listDocs, countDocs } from 'src/api/erp' import { authFetch } from 'src/api/auth' import { getCapacity } from 'src/api/roster' @@ -229,6 +230,7 @@ import { DEPARTMENTS } from 'src/config/departments' const $q = useQuasar() const router = useRouter() +const { can } = usePermissions() // '/' = accueil universel : les sections « gestion » ci-dessous sont gated ; l'accueil par rôle (MonAujourdhui) reste pour tous const stats = ref([ { label: 'Abonnés', value: '...', color: 'var(--ops-accent)', icon: 'people', to: '/clients', sub: '', subClass: '' }, diff --git a/apps/ops/src/router/index.js b/apps/ops/src/router/index.js index 0a02ad2..1c05398 100644 --- a/apps/ops/src/router/index.js +++ b/apps/ops/src/router/index.js @@ -29,7 +29,7 @@ const routes = [ { path: 'communications', component: () => import('src/pages/CommunicationsPage.vue') }, { path: 'communications/c/:token', component: () => import('src/pages/ConversationFullPage.vue'), props: true }, { path: 'pipeline', component: () => import('src/pages/PipelinePage.vue') }, - { path: 'equipe', component: () => import('src/pages/EquipePage.vue') }, + { path: 'equipe', redirect: '/settings' }, // « Équipe » (stub en développement) consolidé → Paramètres (édition employé + permissions déjà là) { path: 'rapports', component: () => import('src/pages/RapportsPage.vue') }, { path: 'rapports/revenus', component: () => import('src/pages/ReportRevenuPage.vue') }, { path: 'rapports/explorateur-revenus', component: () => import('src/pages/ReportRevenueExplorerPage.vue') }, @@ -44,7 +44,7 @@ const routes = [ { path: 'email-queue', component: () => import('src/pages/EmailQueuePage.vue') }, { path: 'factures-fournisseurs', component: () => import('src/pages/SupplierInvoicesPage.vue') }, { path: 'sous-traitants', component: () => import('src/pages/SubcontractorsPage.vue') }, - { path: 'theme', component: () => import('src/pages/ThemePage.vue') }, + { path: 'theme', redirect: '/settings' }, // éditeur de thème consolidé dans Paramètres (section « Thème & couleurs ») { path: 'facturation/approbations', component: () => import('src/pages/BillingApprovalsPage.vue') }, { path: 'telephony', component: () => import('src/pages/TelephonyPage.vue') }, { path: 'dispatch', redirect: '/planification' }, // page Dispatch retirée → redirige (anciens signets)