feat: timeline UI overhaul with project/resource panel redesign, quick filters, and API improvements

Redesigned timeline project and resource panels with expanded detail views,
added quick filter toolbar, improved drag handling, and enhanced vacation/entitlement
router logic. Includes e2e test updates and minor API fixes.

Co-Authored-By: claude-flow <ruv@ruv.net>
This commit is contained in:
2026-03-15 09:28:59 +01:00
parent fa2019f521
commit a83edb2f9d
23 changed files with 2464 additions and 734 deletions
@@ -3,6 +3,7 @@
import { clsx } from "clsx";
import { useRef } from "react";
import { TimelineFilter, type TimelineFilters } from "./TimelineFilter.js";
import { TimelineQuickFilters } from "./TimelineQuickFilters.js";
interface TimelineToolbarProps {
viewMode: "resource" | "project";
@@ -42,9 +43,22 @@ export function TimelineToolbar({
onRedo,
}: TimelineToolbarProps) {
const activeFilterCount =
filters.chapters.length + filters.eids.length + filters.projectIds.length;
filters.clientIds.length +
filters.chapters.length +
filters.eids.length +
filters.projectIds.length;
const filterAnchorRef = useRef<HTMLDivElement | null>(null);
function clearQuickFilters() {
onFiltersChange({
...filters,
clientIds: [],
chapters: [],
eids: [],
projectIds: [],
});
}
return (
<div className="app-toolbar flex flex-wrap items-center justify-between gap-3">
<div className="text-sm text-gray-500 dark:text-gray-400">
@@ -54,6 +68,17 @@ export function TimelineToolbar({
</div>
<div className="flex flex-wrap items-center justify-end gap-2">
<TimelineQuickFilters filters={filters} onChange={onFiltersChange} />
{activeFilterCount > 0 && (
<button
type="button"
onClick={clearQuickFilters}
className="rounded-xl border border-gray-300 bg-white px-3 py-2 text-sm text-gray-600 transition hover:border-gray-400 hover:bg-gray-50 hover:text-gray-900 dark:border-gray-600 dark:bg-gray-900 dark:text-gray-300 dark:hover:bg-gray-800 dark:hover:text-gray-100"
>
Clear filters
</button>
)}
{/* Timeline navigation */}
<div className="flex items-center gap-1">
<button