ultisuite-client/components/agenda/agenda-header.tsx
R3D347HR4Y 2a0958b70d
Some checks are pending
E2E / Playwright e2e (push) Waiting to run
feat: update agenda references to use ULTICAL_APP_NAME and enhance AI usage sections
- Replaced hardcoded "Agenda" labels with dynamic ULTICAL_APP_NAME in various components for consistency.
- Introduced new AiUsageSection and CompteAiUsageSection components to track AI usage and costs.
- Updated settings and metadata to reflect changes in AI cost policies and usage limits.
- Enhanced user interface elements for better accessibility and user experience across admin settings.
2026-06-16 10:46:31 +02:00

158 lines
5.0 KiB
TypeScript

"use client"
import Link from "next/link"
import { AgendaMark } from "@/components/suite/agenda-mark"
import { ChevronDown, ChevronLeft, ChevronRight, Menu } from "lucide-react"
import { HeaderAccountActions } from "@/components/suite/header-account-actions"
import { Button } from "@/components/ui/button"
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuShortcut,
DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu"
import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"
import { viewTitle, type WeekStartsOn } from "@/lib/agenda/agenda-date"
import type { AgendaWeekStart } from "@/lib/agenda/agenda-settings-types"
import {
AGENDA_VIEW_LABELS,
AGENDA_VIEWS,
type AgendaView,
} from "@/lib/agenda/agenda-url"
import { useAgendaSettingsStore, useAgendaUIStore } from "@/lib/agenda/agenda-store"
import { useIsMobile } from "@/hooks/use-mobile"
import { ULTICAL_APP_NAME } from "@/lib/suite/page-metadata"
import {
SUITE_APP_LOGO_LOCKUP_CLASS,
SUITE_APP_LOGO_MARK_CLASS,
SUITE_APP_LOGO_TEXT_CLASS,
} from "@/lib/suite/suite-chrome-classes"
import { cn } from "@/lib/utils"
const VIEW_SHORTCUTS: Record<AgendaView, string> = {
day: "J",
week: "S",
month: "M",
}
export function AgendaHeader({
view,
date,
weekStart = "auto",
weekStartsOn,
onToday,
onStep,
onViewChange,
}: {
view: AgendaView
date: Date
weekStart?: AgendaWeekStart
weekStartsOn?: WeekStartsOn
onToday: () => void
onStep: (delta: 1 | -1) => void
onViewChange: (view: AgendaView) => void
}) {
const isMobile = useIsMobile()
const sidebarCollapsed = useAgendaUIStore((s) => s.sidebarCollapsed)
const setSidebarCollapsed = useAgendaUIStore((s) => s.setSidebarCollapsed)
const openQuickSettings = useAgendaSettingsStore((s) => s.setQuickSettingsOpen)
return (
<header className="flex h-16 shrink-0 items-center gap-2 bg-app-canvas px-2 sm:px-4">
<Button
variant="ghost"
size="icon"
className="size-10 shrink-0 rounded-full text-muted-foreground hover:bg-mail-nav-hover"
aria-label={sidebarCollapsed ? "Ouvrir le menu" : "Fermer le menu"}
onClick={() => setSidebarCollapsed(!sidebarCollapsed)}
>
<Menu className="size-5" />
</Button>
<Link
href="/agenda"
className={cn("mr-1 hidden sm:flex", SUITE_APP_LOGO_LOCKUP_CLASS)}
>
<AgendaMark className={SUITE_APP_LOGO_MARK_CLASS} />
<span className={cn("hidden md:block", SUITE_APP_LOGO_TEXT_CLASS)}>{ULTICAL_APP_NAME}</span>
</Link>
<Button
variant="outline"
className="ml-1 h-9 rounded-full px-4 text-sm font-medium sm:ml-4"
onClick={onToday}
>
Aujourd&apos;hui
</Button>
<div className="flex items-center">
<Tooltip>
<TooltipTrigger asChild>
<Button
variant="ghost"
size="icon"
className="size-9 rounded-full text-muted-foreground hover:bg-mail-nav-hover"
aria-label="Période précédente"
onClick={() => onStep(-1)}
>
<ChevronLeft className="size-5" />
</Button>
</TooltipTrigger>
<TooltipContent>Période précédente</TooltipContent>
</Tooltip>
<Tooltip>
<TooltipTrigger asChild>
<Button
variant="ghost"
size="icon"
className="size-9 rounded-full text-muted-foreground hover:bg-mail-nav-hover"
aria-label="Période suivante"
onClick={() => onStep(1)}
>
<ChevronRight className="size-5" />
</Button>
</TooltipTrigger>
<TooltipContent>Période suivante</TooltipContent>
</Tooltip>
</div>
<h1
className={cn(
"min-w-0 truncate text-[1.05rem] font-normal text-foreground/90 sm:text-[1.35rem]",
)}
>
{viewTitle(view, date, weekStart, weekStartsOn)}
</h1>
<div className="ml-auto flex items-center gap-1">
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button
variant="outline"
className="h-9 gap-1.5 rounded-full px-3 text-sm sm:px-4"
>
{isMobile
? AGENDA_VIEW_LABELS[view].slice(0, 1)
: AGENDA_VIEW_LABELS[view]}
<ChevronDown className="size-4 opacity-70" />
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent align="end" className="w-44">
{AGENDA_VIEWS.map((v) => (
<DropdownMenuItem key={v} onSelect={() => onViewChange(v)}>
{AGENDA_VIEW_LABELS[v]}
<DropdownMenuShortcut>{VIEW_SHORTCUTS[v]}</DropdownMenuShortcut>
</DropdownMenuItem>
))}
</DropdownMenuContent>
</DropdownMenu>
<HeaderAccountActions
className="pl-1"
onSettingsClick={() => openQuickSettings(true)}
/>
</div>
</header>
)
}