From 0d4b62b0b4037dc9692a6db12b56310f7916a7d0 Mon Sep 17 00:00:00 2001 From: Dave Date: Thu, 17 Sep 2026 12:31:59 +0200 Subject: [PATCH] fix(plan): pass ALL cards to RoadmapBuilder so dated bars survive MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Timeline tab was filtering cards to !targetDate before handing them to RoadmapBuilder. The builder then computed its dated subset from that pre-filtered list, so the timeline always received zero dated cards regardless of what was in the database — the timeline always rendered the empty-state hint even when the user had cards dated weeks ago. The bands view (Now/Next/Later) still does its own per-view filter above the builder, so the builder receives the full set. Pass cards through unfiltered and let the builder split them internally — the tray gets the !targetDate subset, the timeline gets the rest. --- src/components/roadmap/roadmap-tabs.tsx | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/components/roadmap/roadmap-tabs.tsx b/src/components/roadmap/roadmap-tabs.tsx index b67ce81..ca34d5c 100644 --- a/src/components/roadmap/roadmap-tabs.tsx +++ b/src/components/roadmap/roadmap-tabs.tsx @@ -24,13 +24,6 @@ export function RoadmapTabs({ // Bands exclude Inbox and Done; the builder shows everything else. const banded = cards.filter((card) => card.band !== null); - // The tray shows cards with no target date. Done cards never reach this - // list — they have a target date set — so the band filter is defensive - // only and the type checker is happy with `card.band !== null` for the - // "still pending triage" case. - const unscheduled = cards.filter( - (card) => !card.targetDate - ); return (
@@ -61,8 +54,11 @@ export function RoadmapTabs({ {tab === "bands" ? ( ) : ( + // Pass ALL cards (not just unscheduled). The builder splits them into + // tray vs timeline internally — the timeline needs to see the dated + // cards that the tabs page itself filters out of the bands view. )}