"use client"; import { clsx } from "clsx"; import { useRef, useState } from "react"; import { trpc } from "~/lib/trpc/client.js"; import { ProjectCombobox } from "~/components/ui/ProjectCombobox.js"; import { ResourceCombobox } from "~/components/ui/ResourceCombobox.js"; import { TimelineFilter, type TimelineFilters } from "./TimelineFilter.js"; import { TimelineQuickFilters } from "./TimelineQuickFilters.js"; interface TimelineToolbarProps { viewMode: "resource" | "project"; onViewModeChange: (mode: "resource" | "project") => void; filters: TimelineFilters; onFiltersChange: (f: TimelineFilters) => void; filterOpen: boolean; onFilterOpenChange: (open: boolean) => void; resourceCount: number; projectCount: number; totalAllocCount: number; onNavigateBack: () => void; onNavigateToday: () => void; onNavigateForward: () => void; canUndo?: boolean; canRedo?: boolean; onUndo?: () => void; onRedo?: () => void; } export function TimelineToolbar({ viewMode, onViewModeChange, filters, onFiltersChange, filterOpen, onFilterOpenChange, resourceCount, projectCount, totalAllocCount, onNavigateBack, onNavigateToday, onNavigateForward, canUndo, canRedo, onUndo, onRedo, }: TimelineToolbarProps) { const activeFilterCount = filters.clientIds.length + filters.chapters.length + filters.eids.length + filters.projectIds.length + filters.countryCodes.length; const filterAnchorRef = useRef(null); // Track selected resource ID for the combobox (separate from the EID-based filter) const [selectedResourceId, setSelectedResourceId] = useState(null); // Look up resource to get EID when selected const { data: resourceLookup } = trpc.resource.directory.useQuery( { limit: 500 }, { staleTime: 60_000 }, ); function handleProjectChange(id: string | null) { onFiltersChange({ ...filters, projectIds: id ? [id] : [] }); } function handleResourceChange(id: string | null) { setSelectedResourceId(id); if (!id) { onFiltersChange({ ...filters, eids: [] }); return; } const resources = (resourceLookup?.resources ?? []) as Array<{ id: string; eid: string }>; const resource = resources.find((r) => r.id === id); if (resource?.eid) { onFiltersChange({ ...filters, eids: [resource.eid] }); } } function clearQuickFilters() { onFiltersChange({ ...filters, clientIds: [], chapters: [], eids: [], projectIds: [], }); } return (
{viewMode === "resource" ? `${resourceCount} resources \u00B7 ${totalAllocCount} allocations` : `${projectCount} projects`}
{activeFilterCount > 0 && ( )} {/* Timeline navigation */}
{/* Undo / Redo */} {(onUndo ?? onRedo) && (
)} {/* View mode toggle */}
{/* Filter */}
onFilterOpenChange(false)} />
); }