From 969b2eb3dc2657fdbfd0d12c25a0edd94c5cd235 Mon Sep 17 00:00:00 2001 From: Will Gordon Date: Tue, 25 Aug 2026 14:44:18 -0400 Subject: [PATCH 1/3] fix(jira): inline reorder arrows, fix first/last disabled reactivity The custom-order reorder controls stacked the up/down arrows vertically, forcing each row taller than its content and leaving the Assigned tab far sparser than the non-reorder view. Lay the arrows out inline (side by side) so row height is content-driven again. Also make the first/last boundary state reactive: it was snapshotted into a plain object when each row first rendered, but the keyed moves cached row nodes on reorder without re-running the callback, so the originally-first row kept its up arrow disabled after moving and whatever landed on top never got disabled. Passing isFirst/isLast as accessors re-tracks the row's live index on every reorder. --- src/app/components/dashboard/JiraAssignedTab.tsx | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/app/components/dashboard/JiraAssignedTab.tsx b/src/app/components/dashboard/JiraAssignedTab.tsx index 04f46af7..793a6b29 100644 --- a/src/app/components/dashboard/JiraAssignedTab.tsx +++ b/src/app/components/dashboard/JiraAssignedTab.tsx @@ -423,7 +423,11 @@ export default function JiraAssignedTab(props: JiraAssignedTabProps) { reorderTimeoutId = setTimeout(() => setReordering(false), 200); } - function renderIssueRow(issue: JiraItem, boundary?: { isFirst: boolean; isLast: boolean }) { + // boundary.isFirst/isLast are accessors (not plain booleans) so the disabled + // state re-tracks the row's live position: keyed moves cached row nodes + // on reorder without re-running the callback, so a snapshotted index() would + // freeze the first/last state to where the row was originally rendered. + function renderIssueRow(issue: JiraItem, boundary?: { isFirst: () => boolean; isLast: () => boolean }) { const isPinned = () => pinnedJiraKeys().has(issue.key); const browseUrl = () => isSafeJiraSiteUrl(props.siteUrl) ? `${props.siteUrl}/browse/${issue.key}` : "#"; const isIssueExpanded = () => expandByDefault() ? !toggledIssues().has(issue.key) : toggledIssues().has(issue.key); @@ -436,11 +440,11 @@ export default function JiraAssignedTab(props: JiraAssignedTabProps) { ref={(el) => { if (isCustomMode()) itemRefs.set(issue.key, el); }} > -
+