diff --git a/client/src/App.tsx b/client/src/App.tsx index 4ea2c0f..a75f062 100644 --- a/client/src/App.tsx +++ b/client/src/App.tsx @@ -18,6 +18,7 @@ import DsiOpex from "./pages/DsiOpex"; import Santinova from "./pages/Santinova"; import SoinsSante from "./pages/SoinsSante"; import StExupery from "./pages/StExupery"; +import TableauBordFinance from "./pages/TableauBordFinance"; import { useAuth } from "./_core/hooks/useAuth"; import { DashboardLayoutSkeleton } from "./components/DashboardLayoutSkeleton"; @@ -70,6 +71,9 @@ function Router() { + + + diff --git a/client/src/components/AppSidebar.tsx b/client/src/components/AppSidebar.tsx index deccee2..04ae93f 100644 --- a/client/src/components/AppSidebar.tsx +++ b/client/src/components/AppSidebar.tsx @@ -32,6 +32,7 @@ import { PanelLeftOpen, TableProperties, Upload, + LayoutDashboard, } from 'lucide-react'; // Palette de couleurs par section principale @@ -123,6 +124,7 @@ const NAV_SECTIONS: NavSection[] = [ { id: 'budget2027', label: 'CAPEX - Construction', icon: FileText, path: '/budget2027' }, { id: 'dsi-capex', label: 'CAPEX - Synthèse', icon: TableProperties, path: '/dsi-capex' }, { id: 'dsi-opex', label: 'OPEX (Charges)', icon: TrendingDown, path: '/dsi-opex' }, + { id: 'tableau-bord-finance', label: 'Tableau de bord Finance', icon: LayoutDashboard, path: '/tableau-bord-finance' }, ], }, { @@ -339,32 +341,6 @@ export function AppSidebar({ collapsed = false, onToggle }: AppSidebarProps) { )} - {/* Utilisateur connecté + déconnexion */} - {user && ( -
-
- -
- {!collapsed && ( - <> -
-

- {user.firstName ? `${user.firstName} ${user.lastName || ''}`.trim() : user.login} -

-

{user.role}

-
- - - )} -
- )} - + + {/* Espace libre avant le nom de connexion */} +
+ + {/* Utilisateur connecté + déconnexion — toujours en dernier */} + {user && ( +
+
+ +
+ {!collapsed && ( + <> +
+

+ {user.firstName ? `${user.firstName} ${user.lastName || ''}`.trim() : user.login} +

+

{user.role}

+
+ + + )} +
+ )}
); diff --git a/client/src/pages/TableauBordFinance.tsx b/client/src/pages/TableauBordFinance.tsx new file mode 100644 index 0000000..a51df9c --- /dev/null +++ b/client/src/pages/TableauBordFinance.tsx @@ -0,0 +1,180 @@ +// TableauBordFinance.tsx — Tableau de bord Finance +// Permet d'accéder au dossier d'analyse budget sur le poste de l'utilisateur + +import { useState } from 'react'; +import { AppSidebar } from '../components/AppSidebar'; +import { + LayoutDashboard, + FolderOpen, + Copy, + CheckCheck, + ExternalLink, + Info, + FolderSearch, +} from 'lucide-react'; + +const DEFAULT_PATH = 'C:\\Users\\o.pareige\\OneDrive - ITINOVA\\@ITINOVA\\Pilotage\\Budget\\Analyse budget de mon poste'; + +export default function TableauBordFinance() { + const [sidebarCollapsed, setSidebarCollapsed] = useState(false); + const [copied, setCopied] = useState(false); + const [customPath, setCustomPath] = useState(DEFAULT_PATH); + const [editingPath, setEditingPath] = useState(false); + + const handleCopy = async () => { + try { + await navigator.clipboard.writeText(customPath); + setCopied(true); + setTimeout(() => setCopied(false), 2000); + } catch { + // fallback + const el = document.createElement('textarea'); + el.value = customPath; + document.body.appendChild(el); + el.select(); + document.execCommand('copy'); + document.body.removeChild(el); + setCopied(true); + setTimeout(() => setCopied(false), 2000); + } + }; + + // Construire l'URL file:// pour tenter l'ouverture directe + // Remplace les backslashes par des slashes et encode les espaces + const fileUrl = 'file:///' + customPath.replace(/\\/g, '/'); + + return ( +
+ setSidebarCollapsed(c => !c)} /> + +
+ {/* En-tête */} +
+
+
+ +
+
+

+ Tableau de bord Finance +

+

+ Accès aux dossiers d'analyse budgétaire +

+
+
+
+ + {/* Contenu */} +
+
+ + {/* Carte principale — dossier OneDrive */} +
+
+ +
+

Analyse budget de mon poste

+

Dossier OneDrive — Pilotage Budget

+
+
+ +
+ {/* Chemin du dossier */} +
+ + {editingPath ? ( +
+ setCustomPath(e.target.value)} + className="flex-1 text-sm font-mono bg-muted/50 border border-border rounded-lg px-3 py-2 focus:outline-none focus:ring-2 focus:ring-primary/30 focus:border-primary" + autoFocus + /> + +
+ ) : ( +
setEditingPath(true)} + title="Cliquer pour modifier le chemin" + > + + {customPath} + modifier +
+ )} +
+ + {/* Actions */} +
+ {/* Bouton copier le chemin */} + + + {/* Bouton ouvrir dans l'explorateur */} + + + Ouvrir le dossier + +
+ + {/* Instructions */} +
+ +
+

Comment accéder au dossier

+

+ Option 1 : Cliquez sur "Ouvrir le dossier" — fonctionne sur certains navigateurs (Edge, Firefox) si le dossier est synchronisé localement. +

+

+ Option 2 : Copiez le chemin puis collez-le dans la barre d'adresse de l'Explorateur Windows (Win + E, puis collez dans la barre d'adresse). +

+

+ Option 3 : Ouvrez directement OneDrive et naviguez vers @ITINOVA → Pilotage → Budget → Analyse budget de mon poste. +

+
+
+
+
+ + {/* Note de personnalisation */} +

+ Le chemin peut être modifié en cliquant dessus — il sera conservé pour cette session. +

+
+
+
+
+ ); +} diff --git a/todo.md b/todo.md index 28efef0..c8dd9e6 100644 --- a/todo.md +++ b/todo.md @@ -65,3 +65,15 @@ ## Corrections (post-checkpoint eb1684f0) - [x] Bug : lignes parasites (catégories Infogérance, Sécurité, TOTAL, etc.) dans la vue Établissements OPEX — suppression en BDD + filtre anti-parasites dans l'import + +## Améliorations (post-checkpoint 60fd2b89) + +- [x] Mode tout manuel : cellules des postes automatiques rendues éditables pour les établissements en mode manuel +- [x] Pré-remplissage des montants précalculés lors du passage en mode tout manuel (batchSetMontantsEtab) +- [x] Tri par code établissement dans la vue Établissements OPEX (colonne Code cliquable, tri par défaut) + +## Évolutions menu et navigation (12/06/2026) +- [x] Menu latéral : afficher le nom de l'utilisateur connecté en dernier (tout en bas) +- [x] Menu latéral : ajouter un espace libre entre "Paramètres" et le nom de connexion +- [x] Menu latéral : ajouter "Tableau de bord Finance" sous "OPEX (charges)" +- [x] Créer la page Tableau de bord Finance avec accès au dossier Windows OneDrive