Add selected method and usage state to modeling store (#2869)

This commit is contained in:
Charis Kyriakou
2023-09-27 08:15:51 +01:00
committed by GitHub
parent c6996771ab
commit a98b998e5f
4 changed files with 55 additions and 16 deletions

View File

@@ -15,11 +15,11 @@ import { isQueryLanguage } from "../common/query-language";
import { DisposableObject } from "../common/disposable-object";
import { MethodsUsagePanel } from "./methods-usage/methods-usage-panel";
import { Mode } from "./shared/mode";
import { showResolvableLocation } from "../databases/local-databases/locations";
import { Method, Usage } from "./method";
import { setUpPack } from "./model-editor-queries";
import { MethodModelingPanel } from "./method-modeling/method-modeling-panel";
import { ModelingStore } from "./modeling-store";
import { showResolvableLocation } from "../databases/local-databases/locations";
const SUPPORTED_LANGUAGES: string[] = ["java", "csharp"];
@@ -43,6 +43,8 @@ export class ModelEditorModule extends DisposableObject {
new MethodsUsagePanel(this.modelingStore, cliServer),
);
this.methodModelingPanel = this.push(new MethodModelingPanel(app));
this.registerToModelingStoreEvents();
}
public static async initialize(
@@ -151,7 +153,6 @@ export class ModelEditorModule extends DisposableObject {
db,
modelFile,
Mode.Application,
this.showMethod.bind(this),
);
this.modelingStore.onDbClosed(async (dbUri) => {
@@ -179,8 +180,7 @@ export class ModelEditorModule extends DisposableObject {
usage: Usage,
databaseItem: DatabaseItem,
) => {
await this.methodModelingPanel.setMethod(method);
await showResolvableLocation(usage.url, databaseItem, this.app.logger);
this.modelingStore.setSelectedMethod(databaseItem, method, usage);
},
};
}
@@ -189,8 +189,21 @@ export class ModelEditorModule extends DisposableObject {
await ensureDir(this.queryStorageDir);
}
private async showMethod(method: Method, usage: Usage): Promise<void> {
private registerToModelingStoreEvents(): void {
this.push(
this.modelingStore.onSelectedMethodChanged(async (event) => {
await this.showMethod(event.databaseItem, event.method, event.usage);
}),
);
}
private async showMethod(
databaseItem: DatabaseItem,
method: Method,
usage: Usage,
): Promise<void> {
await this.methodsUsagePanel.revealItem(usage);
await this.methodModelingPanel.setMethod(method);
await showResolvableLocation(usage.url, databaseItem, this.app.logger);
}
}

View File

@@ -26,7 +26,6 @@ import { asError, assertNever, getErrorMessage } from "../common/helpers-pure";
import { runFlowModelQueries } from "./flow-model-queries";
import { promptImportGithubDatabase } from "../databases/database-fetcher";
import { App } from "../common/app";
import { showResolvableLocation } from "../databases/local-databases/locations";
import { redactableError } from "../common/errors";
import {
externalApiQueriesProgressMaxStep,
@@ -61,10 +60,6 @@ export class ModelEditorView extends AbstractWebview<
private readonly databaseItem: DatabaseItem,
private readonly extensionPack: ExtensionPack,
private mode: Mode,
private readonly showMethod: (
method: Method,
usage: Usage,
) => Promise<void>,
) {
super(app);
@@ -359,8 +354,7 @@ export class ModelEditorView extends AbstractWebview<
}
protected async handleJumpToUsage(method: Method, usage: Usage) {
await this.showMethod(method, usage);
await showResolvableLocation(usage.url, this.databaseItem, this.app.logger);
this.modelingStore.setSelectedMethod(this.databaseItem, method, usage);
}
protected async loadExistingModeledMethods(): Promise<void> {
@@ -511,7 +505,6 @@ export class ModelEditorView extends AbstractWebview<
addedDatabase,
modelFile,
Mode.Framework,
this.showMethod,
);
await view.openView();
});

View File

@@ -2,7 +2,7 @@ import { App } from "../common/app";
import { DisposableObject } from "../common/disposable-object";
import { AppEvent, AppEventEmitter } from "../common/events";
import { DatabaseItem } from "../databases/local-databases";
import { Method } from "./method";
import { Method, Usage } from "./method";
import { ModeledMethod } from "./modeled-method";
import { INITIAL_HIDE_MODELED_METHODS_VALUE } from "./shared/hide-modeled-methods";
@@ -12,6 +12,8 @@ interface DbModelingState {
hideModeledMethods: boolean;
modeledMethods: Record<string, ModeledMethod>;
modifiedMethodSignatures: Set<string>;
selectedMethod: Method | undefined;
selectedUsage: Usage | undefined;
}
interface MethodsChangedEvent {
@@ -37,6 +39,14 @@ interface ModifiedMethodsChangedEvent {
isActiveDb: boolean;
}
interface SelectedMethodChangedEvent {
databaseItem: DatabaseItem;
method: Method;
usage: Usage;
modeledMethod: ModeledMethod | undefined;
isModified: boolean;
}
export class ModelingStore extends DisposableObject {
public readonly onActiveDbChanged: AppEvent<void>;
public readonly onDbClosed: AppEvent<string>;
@@ -44,6 +54,7 @@ export class ModelingStore extends DisposableObject {
public readonly onHideModeledMethodsChanged: AppEvent<HideModeledMethodsChangedEvent>;
public readonly onModeledMethodsChanged: AppEvent<ModeledMethodsChangedEvent>;
public readonly onModifiedMethodsChanged: AppEvent<ModifiedMethodsChangedEvent>;
public readonly onSelectedMethodChanged: AppEvent<SelectedMethodChangedEvent>;
private readonly state: Map<string, DbModelingState>;
private activeDb: string | undefined;
@@ -54,6 +65,7 @@ export class ModelingStore extends DisposableObject {
private readonly onHideModeledMethodsChangedEventEmitter: AppEventEmitter<HideModeledMethodsChangedEvent>;
private readonly onModeledMethodsChangedEventEmitter: AppEventEmitter<ModeledMethodsChangedEvent>;
private readonly onModifiedMethodsChangedEventEmitter: AppEventEmitter<ModifiedMethodsChangedEvent>;
private readonly onSelectedMethodChangedEventEmitter: AppEventEmitter<SelectedMethodChangedEvent>;
constructor(app: App) {
super();
@@ -92,6 +104,12 @@ export class ModelingStore extends DisposableObject {
);
this.onModifiedMethodsChanged =
this.onModifiedMethodsChangedEventEmitter.event;
this.onSelectedMethodChangedEventEmitter = this.push(
app.createEventEmitter<SelectedMethodChangedEvent>(),
);
this.onSelectedMethodChanged =
this.onSelectedMethodChangedEventEmitter.event;
}
public initializeStateForDb(databaseItem: DatabaseItem) {
@@ -102,6 +120,8 @@ export class ModelingStore extends DisposableObject {
hideModeledMethods: INITIAL_HIDE_MODELED_METHODS_VALUE,
modeledMethods: {},
modifiedMethodSignatures: new Set(),
selectedMethod: undefined,
selectedUsage: undefined,
});
}
@@ -229,6 +249,21 @@ export class ModelingStore extends DisposableObject {
});
}
public setSelectedMethod(dbItem: DatabaseItem, method: Method, usage: Usage) {
const dbState = this.getState(dbItem);
dbState.selectedMethod = method;
dbState.selectedUsage = usage;
this.onSelectedMethodChangedEventEmitter.fire({
databaseItem: dbItem,
method,
usage,
modeledMethod: dbState.modeledMethods[method.signature],
isModified: dbState.modifiedMethodSignatures.has(method.signature),
});
}
private getState(databaseItem: DatabaseItem): DbModelingState {
if (!this.state.has(databaseItem.databaseUri.toString())) {
throw Error(

View File

@@ -31,7 +31,6 @@ describe("ModelEditorView", () => {
dataExtensions: ["models/**/*.yml"],
};
const mode = Mode.Application;
const showMethod = jest.fn();
let view: ModelEditorView;
@@ -47,7 +46,6 @@ describe("ModelEditorView", () => {
databaseItem,
extensionPack,
mode,
showMethod,
);
});