From 5fd31247da8462389adafb925dc9eb750cafe2d8 Mon Sep 17 00:00:00 2001 From: Jeroen Schweitzer Date: Thu, 23 Apr 2026 17:23:08 +0200 Subject: [PATCH] re-contribute detail tabs with initialId on each selection MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Both tickets and decisions extensions now uncontribute and re-contribute the detail tab on every selection, passing the selected ID via initialId. This guarantees the view loads immediately — no first-click miss from the widget not being built when the message fires. Co-Authored-By: Claude Opus 4.6 (1M context) --- lib/builtin/decisions/src/extension.dart | 12 +++++++++++- lib/builtin/tickets/src/extension.dart | 12 +++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/lib/builtin/decisions/src/extension.dart b/lib/builtin/decisions/src/extension.dart index dcd4e778..087e8d88 100644 --- a/lib/builtin/decisions/src/extension.dart +++ b/lib/builtin/decisions/src/extension.dart @@ -21,7 +21,17 @@ class DecisionsExtension extends ClideExtension { @override Future activate(ClideExtensionContext ctx) async { - _sub = ctx.messages.subscribe(publisher: id, channel: 'selection').listen((_) { + _sub = ctx.messages.subscribe(publisher: id, channel: 'selection').listen((msg) { + final selectedId = msg.data['id'] as String?; + if (selectedId == null) return; + ctx.panels.uncontribute('decisions.detail'); + ctx.panels.contribute(TabContribution( + id: 'decisions.detail', + slot: Slots.contextPanel, + title: 'Decision', + icon: PhosphorIcons.lightbulb, + build: (_) => DecisionDetailView(initialId: selectedId), + )); ctx.panels.activateTab(Slots.contextPanel, 'decisions.detail'); }); } diff --git a/lib/builtin/tickets/src/extension.dart b/lib/builtin/tickets/src/extension.dart index d63f29b6..ce048d85 100644 --- a/lib/builtin/tickets/src/extension.dart +++ b/lib/builtin/tickets/src/extension.dart @@ -21,7 +21,17 @@ class TicketsExtension extends ClideExtension { @override Future activate(ClideExtensionContext ctx) async { - _sub = ctx.messages.subscribe(publisher: id, channel: 'selection').listen((_) { + _sub = ctx.messages.subscribe(publisher: id, channel: 'selection').listen((msg) { + final selectedId = msg.data['id'] as String?; + if (selectedId == null) return; + ctx.panels.uncontribute('tickets.detail'); + ctx.panels.contribute(TabContribution( + id: 'tickets.detail', + slot: Slots.contextPanel, + title: 'Ticket', + icon: PhosphorIcons.ticket, + build: (_) => TicketDetailView(initialId: selectedId), + )); ctx.panels.activateTab(Slots.contextPanel, 'tickets.detail'); }); }