diff --git a/src/App.tsx b/src/App.tsx index 644a187..50e3bd9 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -8,7 +8,10 @@ import { ProjectsPage } from "@/pages/Projects"; import { ProjectDetailPage } from "@/pages/ProjectDetail"; import { IncentivePage } from "@/pages/Incentive"; import { ProfilePage } from "@/pages/Profile"; +import { InboxPage } from "@/pages/Inbox"; import { ApprovalsPage } from "@/pages/admin/Approvals"; +import { AttendanceAdminPage } from "@/pages/admin/AttendanceAdmin"; +import { ProjectsAdminPage } from "@/pages/admin/ProjectsAdmin"; import { IncentiveAdminPage } from "@/pages/admin/IncentiveAdmin"; import { AccountingPage } from "@/pages/admin/Accounting"; import { MembersPage } from "@/pages/admin/Members"; @@ -38,7 +41,10 @@ function Shell() { } /> } /> } /> + } /> } /> + } /> + } /> } /> } /> } /> diff --git a/src/components/AppShell.tsx b/src/components/AppShell.tsx index b44fdc7..bc6ac16 100644 --- a/src/components/AppShell.tsx +++ b/src/components/AppShell.tsx @@ -1,13 +1,26 @@ +import { useState } from "react"; import { Outlet } from "react-router-dom"; import { Sidebar } from "./Sidebar"; import { Topbar } from "./Topbar"; export function AppShell() { + // Sidebar collapse state, persisted so it survives reloads. + const [collapsed, setCollapsed] = useState( + () => localStorage.getItem("spin.sidebarCollapsed") === "1" + ); + const toggle = () => { + setCollapsed((c) => { + const next = !c; + localStorage.setItem("spin.sidebarCollapsed", next ? "1" : "0"); + return next; + }); + }; + return (
- +
- +
diff --git a/src/components/Gantt.tsx b/src/components/Gantt.tsx index 37479f8..f7280ac 100644 --- a/src/components/Gantt.tsx +++ b/src/components/Gantt.tsx @@ -61,7 +61,7 @@ export function Gantt({ tasks }: { tasks: ProjectTask[] }) { const s = parse(t.start), e = parse(t.end) || s + DAY; const left = ((s - min) / span) * 100; const width = Math.max(1.5, ((e - s) / span) * 100); - const color = LANE_COLOR[t.lane] ?? "#11224F"; + const color = LANE_COLOR[t.lane] ?? "#03143F"; return (
{t.title}
diff --git a/src/components/Sidebar.tsx b/src/components/Sidebar.tsx index f0368df..7c2cf60 100644 --- a/src/components/Sidebar.tsx +++ b/src/components/Sidebar.tsx @@ -1,20 +1,23 @@ import { NavLink } from "react-router-dom"; import { LayoutDashboard, Clock, FolderKanban, Coins, CheckSquare, Calculator, - Wallet, Users, Settings, type LucideIcon, + Wallet, Users, Settings, FolderCog, Inbox, UserCircle, ClipboardList, + type LucideIcon, } from "lucide-react"; import { useQuery } from "@tanstack/react-query"; import { getNav, getApprovals } from "@/lib/api"; import { useAuth } from "@/context/Auth"; import { SpinLogo } from "./SpinLogo"; +import { WorkStatusMenu } from "./WorkStatusMenu"; import { classNames } from "@/lib/format"; import type { NavItem } from "@/types"; const ICONS: Record = { - LayoutDashboard, Clock, FolderKanban, Coins, CheckSquare, Calculator, Wallet, Users, Settings, + LayoutDashboard, Clock, FolderKanban, Coins, CheckSquare, Calculator, Wallet, Users, Settings, FolderCog, + Inbox, UserCircle, ClipboardList, }; -export function Sidebar() { +export function Sidebar({ collapsed = false }: { collapsed?: boolean }) { const { isAdmin } = useAuth(); const navQ = useQuery({ queryKey: ["nav"], queryFn: getNav, staleTime: 5 * 60_000 }); const apprQ = useQuery({ queryKey: ["approvals-count"], queryFn: getApprovals, enabled: isAdmin, staleTime: 60_000 }); @@ -24,15 +27,27 @@ export function Sidebar() { const sections = Array.from(new Set(items.map((i) => i.section))); return ( -