From f9527b384b5d59a8623c10d2454eec7426841522 Mon Sep 17 00:00:00 2001 From: hugo Date: Fri, 27 Feb 2026 15:05:00 +0100 Subject: [PATCH] fix: transform handlers don't auto-open bottom panel unnecessarily --- src/renderer/App.tsx | 11 +++-- .../navigation/blogmarkTransformOutput.ts | 6 +++ .../blogmarkTransformOutput.test.ts | 40 +++++++++++++++++++ 3 files changed, 53 insertions(+), 4 deletions(-) diff --git a/src/renderer/App.tsx b/src/renderer/App.tsx index 38bd4ea..53af98c 100644 --- a/src/renderer/App.tsx +++ b/src/renderer/App.tsx @@ -10,6 +10,7 @@ import { buildBlogmarkTransformOutputEntries, buildBlogmarkTransformToastNotifications, parseBlogmarkCreatedEventPayload, + shouldAutoOpenPanelForOutputEntries, } from './navigation/blogmarkTransformOutput'; import { createDeferredEventGate } from './navigation/deferredEventGate'; import { createAndFocusPost } from './navigation/postCreation'; @@ -288,10 +289,12 @@ const App: React.FC = () => { }); }); - useAppStore.setState({ - panelVisible: true, - panelActiveTab: 'output', - }); + if (shouldAutoOpenPanelForOutputEntries(outputEntries)) { + useAppStore.setState({ + panelVisible: true, + panelActiveTab: 'output', + }); + } } blogmarkEventGateRef.current.push(created, processBlogmarkCreated); diff --git a/src/renderer/navigation/blogmarkTransformOutput.ts b/src/renderer/navigation/blogmarkTransformOutput.ts index 82297e7..9625efb 100644 --- a/src/renderer/navigation/blogmarkTransformOutput.ts +++ b/src/renderer/navigation/blogmarkTransformOutput.ts @@ -142,6 +142,12 @@ export function buildBlogmarkTransformOutputEntries( return entries; } +export function shouldAutoOpenPanelForOutputEntries( + entries: Array>, +): boolean { + return entries.some((entry) => entry.kind === 'error' || entry.kind === 'stdout'); +} + export function buildBlogmarkTransformToastNotifications( transform: BlogmarkTransformDebugInfo | undefined, t: (key: string, values?: Record) => string, diff --git a/tests/renderer/navigation/blogmarkTransformOutput.test.ts b/tests/renderer/navigation/blogmarkTransformOutput.test.ts index 96b975f..ce6b036 100644 --- a/tests/renderer/navigation/blogmarkTransformOutput.test.ts +++ b/tests/renderer/navigation/blogmarkTransformOutput.test.ts @@ -3,6 +3,7 @@ import { buildBlogmarkTransformOutputEntries, buildBlogmarkTransformToastNotifications, parseBlogmarkCreatedEventPayload, + shouldAutoOpenPanelForOutputEntries, } from '../../../src/renderer/navigation/blogmarkTransformOutput'; describe('parseBlogmarkCreatedEventPayload', () => { @@ -123,3 +124,42 @@ describe('buildBlogmarkTransformToastNotifications', () => { ]); }); }); + +describe('shouldAutoOpenPanelForOutputEntries', () => { + it('returns false for empty entries', () => { + expect(shouldAutoOpenPanelForOutputEntries([])).toBe(false); + }); + + it('returns false when all entries are result kind', () => { + expect(shouldAutoOpenPanelForOutputEntries([ + { kind: 'result', message: 'summary:2:0' }, + { kind: 'result', message: 'applied:alpha, beta' }, + ])).toBe(false); + }); + + it('returns true when entries contain an error', () => { + expect(shouldAutoOpenPanelForOutputEntries([ + { kind: 'result', message: 'summary:1:1' }, + { kind: 'error', message: 'failed:broken:boom' }, + ])).toBe(true); + }); + + it('returns true when entries contain stdout', () => { + expect(shouldAutoOpenPanelForOutputEntries([ + { kind: 'result', message: 'summary:1:0' }, + { kind: 'stdout', message: 'hello from python' }, + ])).toBe(true); + }); + + it('returns true when entries contain only errors', () => { + expect(shouldAutoOpenPanelForOutputEntries([ + { kind: 'error', message: 'uncaught exception' }, + ])).toBe(true); + }); + + it('returns true when entries contain only stdout', () => { + expect(shouldAutoOpenPanelForOutputEntries([ + { kind: 'stdout', message: 'debug output' }, + ])).toBe(true); + }); +});