fix(timeline): harden project view interactions

This commit is contained in:
2026-04-01 14:10:28 +02:00
parent e103174d39
commit fa5e654739
3 changed files with 457 additions and 35 deletions
@@ -11,6 +11,7 @@ import { TimelineQuickFilters } from "./TimelineQuickFilters.js";
interface TimelineToolbarProps {
viewMode: "resource" | "project";
onViewModeChange: (mode: "resource" | "project") => void;
isViewModeSwitchDisabled?: boolean;
filters: TimelineFilters;
onFiltersChange: (f: TimelineFilters) => void;
filterOpen: boolean;
@@ -30,6 +31,7 @@ interface TimelineToolbarProps {
export function TimelineToolbar({
viewMode,
onViewModeChange,
isViewModeSwitchDisabled = false,
filters,
onFiltersChange,
filterOpen,
@@ -179,8 +181,11 @@ export function TimelineToolbar({
<button
type="button"
onClick={() => onViewModeChange("resource")}
aria-pressed={viewMode === "resource"}
disabled={isViewModeSwitchDisabled}
title={isViewModeSwitchDisabled ? "Timeline is still loading" : undefined}
className={clsx(
"px-3 py-2 transition-colors",
"px-3 py-2 transition-colors disabled:cursor-wait disabled:opacity-60",
viewMode === "resource"
? "bg-brand-600 text-white"
: "text-gray-700 hover:bg-gray-50 dark:text-gray-200 dark:hover:bg-gray-800",
@@ -191,8 +196,11 @@ export function TimelineToolbar({
<button
type="button"
onClick={() => onViewModeChange("project")}
aria-pressed={viewMode === "project"}
disabled={isViewModeSwitchDisabled}
title={isViewModeSwitchDisabled ? "Timeline is still loading" : undefined}
className={clsx(
"border-l border-gray-300 px-3 py-2 transition-colors dark:border-gray-600",
"border-l border-gray-300 px-3 py-2 transition-colors disabled:cursor-wait disabled:opacity-60 dark:border-gray-600",
viewMode === "project"
? "bg-brand-600 text-white"
: "text-gray-700 hover:bg-gray-50 dark:text-gray-200 dark:hover:bg-gray-800",
@@ -657,6 +657,7 @@ function TimelineViewContent({
<TimelineToolbar
viewMode={viewMode}
onViewModeChange={setViewMode}
isViewModeSwitchDisabled={isInitialLoading}
filters={filters}
onFiltersChange={setFilters}
filterOpen={filterOpen}