Skip to content

Commit debfb04

Browse files
committed
fix: persist Source filter across panel close/reopen (closes #6)
Save the active remoteFilter in a static field on dispose; apply it on the first getLog and echo it back in logData so the webview syncs its filter display without any timing dependency.
1 parent 72eab31 commit debfb04

3 files changed

Lines changed: 14 additions & 2 deletions

File tree

src/git/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ export interface CommitGraphData {
6363
commitLeftMargin?: number[];
6464
hasMore?: boolean;
6565
currentLimit?: number;
66+
remoteFilter?: string[];
6667
}
6768

6869
export interface BranchInfo {

src/panels/MainPanel.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import type { WebviewMessage } from '../utils/message-bus';
1010
export class MainPanel {
1111
public static currentPanel: MainPanel | undefined;
1212
private static readonly viewType = 'gitGraphPlus';
13+
private static savedRemoteFilter: string[] | undefined = undefined;
1314

1415
private readonly panel: vscode.WebviewPanel;
1516
private readonly extensionUri: vscode.Uri;
@@ -20,6 +21,7 @@ export class MainPanel {
2021
private allConflictFiles: string[] = [];
2122
private currentLimit = 1000;
2223
private currentRemoteFilter: string[] | undefined = undefined;
24+
private isFirstGetLog = true;
2325
public static onSidebarRefresh: (() => void) | null = null;
2426

2527
private constructor(
@@ -147,8 +149,13 @@ export class MainPanel {
147149
const sortOrder = cfg.get<'author-date' | 'date' | 'topological'>('graphSortOrder', 'topological');
148150
const requestedLimit = message.payload.limit ?? 1000;
149151
this.currentLimit = requestedLimit;
150-
this.currentRemoteFilter = message.payload.remoteFilter;
151-
const logPayload = { ...message.payload, limit: requestedLimit + 1, sortOrder };
152+
// On first load, apply saved filter if the webview didn't specify one.
153+
const effectiveFilter = this.isFirstGetLog && message.payload.remoteFilter === undefined
154+
? MainPanel.savedRemoteFilter
155+
: message.payload.remoteFilter;
156+
this.isFirstGetLog = false;
157+
this.currentRemoteFilter = effectiveFilter;
158+
const logPayload = { ...message.payload, remoteFilter: effectiveFilter, limit: requestedLimit + 1, sortOrder };
152159
const [allFetched, logBranches] = await Promise.all([
153160
this.gitService.log(logPayload),
154161
this.gitService.branches(),
@@ -168,6 +175,7 @@ export class MainPanel {
168175
links: fullGraph.links,
169176
dots: fullGraph.dots,
170177
commitLeftMargin: fullGraph.commitLeftMargin,
178+
remoteFilter: effectiveFilter,
171179
},
172180
});
173181
break;
@@ -1158,6 +1166,7 @@ export class MainPanel {
11581166
}
11591167

11601168
private dispose(): void {
1169+
MainPanel.savedRemoteFilter = this.currentRemoteFilter;
11611170
MainPanel.currentPanel = undefined;
11621171
this.panel.dispose();
11631172
while (this.disposables.length) {

webview-ui/src/App.svelte

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,15 @@
5555
let stashSaveKeepIndex = $state(false);
5656
let deleteWorktreeBranch = $state(false);
5757
let tagDetailsModal = $state<{ name: string; hash: string; message?: string; isAnnotated: boolean } | null>(null);
58+
5859
onMount(() => {
5960
uiStore.bottomPanelHeight = Math.round(window.innerHeight * BOTTOM_PANEL_DEFAULT_RATIO);
6061
6162
function handleMessage(event: MessageEvent) {
6263
const msg = event.data;
6364
switch (msg.type) {
6465
case 'logData':
66+
if (msg.payload.remoteFilter !== undefined) remoteFilter = msg.payload.remoteFilter;
6567
commitStore.setData(msg.payload);
6668
break;
6769
case 'branchData':

0 commit comments

Comments
 (0)