Skip to content

Commit 51844bb

Browse files
Merge pull request #2705 from github/robertbrignull/details-multiple-editors
Allow the details view to handle multiple open data extensions editors
2 parents acb9669 + 87754a9 commit 51844bb

2 files changed

Lines changed: 57 additions & 6 deletions

File tree

extensions/ql-vscode/src/data-extensions-editor/data-extensions-editor-module.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ export class DataExtensionsEditorModule extends DisposableObject {
3232
private readonly queryStorageDir: string;
3333
private readonly modelDetailsPanel: ModelDetailsPanel;
3434

35+
private mostRecentlyActiveView: DataExtensionsEditorView | undefined =
36+
undefined;
37+
3538
private constructor(
3639
private readonly ctx: ExtensionContext,
3740
private readonly app: App,
@@ -48,6 +51,20 @@ export class DataExtensionsEditorModule extends DisposableObject {
4851
this.modelDetailsPanel = this.push(new ModelDetailsPanel(cliServer));
4952
}
5053

54+
private handleViewBecameActive(view: DataExtensionsEditorView): void {
55+
this.mostRecentlyActiveView = view;
56+
}
57+
58+
private handleViewWasDisposed(view: DataExtensionsEditorView): void {
59+
if (this.mostRecentlyActiveView === view) {
60+
this.mostRecentlyActiveView = undefined;
61+
}
62+
}
63+
64+
private isMostRecentlyActiveView(view: DataExtensionsEditorView): boolean {
65+
return this.mostRecentlyActiveView === view;
66+
}
67+
5168
public static async initialize(
5269
ctx: ExtensionContext,
5370
app: App,
@@ -149,6 +166,9 @@ export class DataExtensionsEditorModule extends DisposableObject {
149166
Mode.Application,
150167
this.modelDetailsPanel.setState.bind(this.modelDetailsPanel),
151168
this.modelDetailsPanel.revealItem.bind(this.modelDetailsPanel),
169+
this.handleViewBecameActive.bind(this),
170+
this.handleViewWasDisposed.bind(this),
171+
this.isMostRecentlyActiveView.bind(this),
152172
);
153173
await view.openView();
154174
},

extensions/ql-vscode/src/data-extensions-editor/data-extensions-editor-view.ts

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ export class DataExtensionsEditorView extends AbstractWebview<
5050
> {
5151
private readonly autoModeler: AutoModeler;
5252

53+
private externalApiUsages: ExternalApiUsage[];
54+
5355
public constructor(
5456
ctx: ExtensionContext,
5557
private readonly app: App,
@@ -66,6 +68,15 @@ export class DataExtensionsEditorView extends AbstractWebview<
6668
databaseItem: DatabaseItem,
6769
) => Promise<void>,
6870
private readonly revealItemInDetailsPanel: (usage: Usage) => Promise<void>,
71+
private readonly handleViewBecameActive: (
72+
view: DataExtensionsEditorView,
73+
) => void,
74+
private readonly handleViewWasDisposed: (
75+
view: DataExtensionsEditorView,
76+
) => void,
77+
private readonly isMostRecentlyActiveView: (
78+
view: DataExtensionsEditorView,
79+
) => boolean,
6980
) {
7081
super(ctx);
7182

@@ -86,12 +97,27 @@ export class DataExtensionsEditorView extends AbstractWebview<
8697
await this.postMessage({ t: "addModeledMethods", modeledMethods });
8798
},
8899
);
100+
this.externalApiUsages = [];
89101
}
90102

91103
public async openView() {
92104
const panel = await this.getPanel();
93105
panel.reveal(undefined, true);
94106

107+
panel.onDidChangeViewState(async () => {
108+
if (panel.active) {
109+
this.handleViewBecameActive(this);
110+
await this.updateModelDetailsPanelState(
111+
this.externalApiUsages,
112+
this.databaseItem,
113+
);
114+
}
115+
});
116+
117+
panel.onDidDispose(async () => {
118+
this.handleViewWasDisposed(this);
119+
});
120+
95121
await this.waitForPanelLoaded();
96122
}
97123

@@ -280,16 +306,18 @@ export class DataExtensionsEditorView extends AbstractWebview<
280306
maxStep: 1500,
281307
});
282308

283-
const externalApiUsages = decodeBqrsToExternalApiUsages(bqrsChunk);
309+
this.externalApiUsages = decodeBqrsToExternalApiUsages(bqrsChunk);
284310

285311
await this.postMessage({
286312
t: "setExternalApiUsages",
287-
externalApiUsages,
313+
externalApiUsages: this.externalApiUsages,
288314
});
289-
await this.updateModelDetailsPanelState(
290-
externalApiUsages,
291-
this.databaseItem,
292-
);
315+
if (this.isMostRecentlyActiveView(this)) {
316+
await this.updateModelDetailsPanelState(
317+
this.externalApiUsages,
318+
this.databaseItem,
319+
);
320+
}
293321
} catch (err) {
294322
void showAndLogExceptionWithTelemetry(
295323
this.app.logger,
@@ -409,6 +437,9 @@ export class DataExtensionsEditorView extends AbstractWebview<
409437
Mode.Framework,
410438
this.updateModelDetailsPanelState,
411439
this.revealItemInDetailsPanel,
440+
this.handleViewBecameActive,
441+
this.handleViewWasDisposed,
442+
this.isMostRecentlyActiveView,
412443
);
413444
await view.openView();
414445
});

0 commit comments

Comments
 (0)