Skip to content

Commit 3234f0a

Browse files
authored
Move db item expanded state to workspace storage (#1904)
1 parent ae0dfd8 commit 3234f0a

13 files changed

Lines changed: 95 additions & 162 deletions

File tree

extensions/ql-vscode/src/databases/config/db-config-store.ts

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,6 @@
11
import { pathExists, outputJSON, readJSON, readJSONSync } from "fs-extra";
22
import { join } from "path";
3-
import {
4-
cloneDbConfig,
5-
DbConfig,
6-
ExpandedDbItem,
7-
SelectedDbItem,
8-
} from "./db-config";
3+
import { cloneDbConfig, DbConfig, SelectedDbItem } from "./db-config";
94
import * as chokidar from "chokidar";
105
import { DisposableObject, DisposeHandler } from "../../pure/disposable-object";
116
import { DbConfigValidator } from "./db-config-validator";
@@ -81,19 +76,6 @@ export class DbConfigStore extends DisposableObject {
8176
await this.writeConfig(config);
8277
}
8378

84-
public async updateExpandedState(expandedItems: ExpandedDbItem[]) {
85-
if (!this.config) {
86-
throw Error("Cannot update expansion state if config is not loaded");
87-
}
88-
89-
const config: DbConfig = {
90-
...this.config,
91-
expanded: expandedItems,
92-
};
93-
94-
await this.writeConfig(config);
95-
}
96-
9779
public async addRemoteRepo(
9880
repoNwo: string,
9981
parentList?: string,
@@ -330,7 +312,6 @@ export class DbConfigStore extends DisposableObject {
330312
databases: [],
331313
},
332314
},
333-
expanded: [],
334315
};
335316
}
336317
}

extensions/ql-vscode/src/databases/config/db-config.ts

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
export interface DbConfig {
44
databases: DbConfigDatabases;
5-
expanded: ExpandedDbItem[];
65
selected?: SelectedDbItem;
76
}
87

@@ -140,7 +139,6 @@ export function cloneDbConfig(config: DbConfig): DbConfig {
140139
databases: config.databases.local.databases.map((db) => ({ ...db })),
141140
},
142141
},
143-
expanded: config.expanded.map(cloneDbConfigExpandedItem),
144142
selected: config.selected
145143
? cloneDbConfigSelectedItem(config.selected)
146144
: undefined,
@@ -183,17 +181,3 @@ function cloneDbConfigSelectedItem(selected: SelectedDbItem): SelectedDbItem {
183181
};
184182
}
185183
}
186-
187-
function cloneDbConfigExpandedItem(item: ExpandedDbItem): ExpandedDbItem {
188-
switch (item.kind) {
189-
case ExpandedDbItemKind.RootLocal:
190-
case ExpandedDbItemKind.RootRemote:
191-
return { kind: item.kind };
192-
case ExpandedDbItemKind.LocalUserDefinedList:
193-
case ExpandedDbItemKind.RemoteUserDefinedList:
194-
return {
195-
kind: item.kind,
196-
listName: item.listName,
197-
};
198-
}
199-
}

extensions/ql-vscode/src/databases/db-manager.ts

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { App } from "../common/app";
22
import { AppEvent, AppEventEmitter } from "../common/events";
33
import { ValueResult } from "../common/value-result";
4+
import { ExpandedDbItem } from "./config/db-config";
45
import { DbConfigStore } from "./config/db-config-store";
56
import { DbItem, DbListKind } from "./db-item";
67
import { calculateNewExpandedState } from "./db-item-expansion";
@@ -14,8 +15,12 @@ import { DbConfigValidationError } from "./db-validation-errors";
1415
export class DbManager {
1516
public readonly onDbItemsChanged: AppEvent<void>;
1617
private readonly onDbItemsChangesEventEmitter: AppEventEmitter<void>;
18+
private static readonly DB_EXPANDED_STATE_KEY = "db_expanded";
1719

18-
constructor(app: App, private readonly dbConfigStore: DbConfigStore) {
20+
constructor(
21+
private readonly app: App,
22+
private readonly dbConfigStore: DbConfigStore,
23+
) {
1924
this.onDbItemsChangesEventEmitter = app.createEventEmitter<void>();
2025
this.onDbItemsChanged = this.onDbItemsChangesEventEmitter.event;
2126

@@ -40,9 +45,11 @@ export class DbManager {
4045
return ValueResult.fail(configResult.errors);
4146
}
4247

48+
const expandedItems = this.getCurrentExpandedItems();
49+
4350
return ValueResult.ok([
44-
createRemoteTree(configResult.value),
45-
createLocalTree(configResult.value),
51+
createRemoteTree(configResult.value, expandedItems),
52+
createLocalTree(configResult.value, expandedItems),
4653
]);
4754
}
4855

@@ -66,13 +73,18 @@ export class DbManager {
6673
throw Error("Cannot update expanded state if config is not loaded");
6774
}
6875

76+
const currentExpandedItems = this.getCurrentExpandedItems();
77+
6978
const newExpandedItems = calculateNewExpandedState(
70-
configResult.value.expanded,
79+
currentExpandedItems,
7180
dbItem,
7281
itemExpanded,
7382
);
7483

75-
await this.dbConfigStore.updateExpandedState(newExpandedItems);
84+
await this.app.workspaceState.update(
85+
DbManager.DB_EXPANDED_STATE_KEY,
86+
newExpandedItems,
87+
);
7688
}
7789

7890
public async addNewRemoteRepo(
@@ -120,4 +132,12 @@ export class DbManager {
120132
public doesRemoteRepoExist(nwo: string, listName?: string): boolean {
121133
return this.dbConfigStore.doesRemoteDbExist(nwo, listName);
122134
}
135+
136+
private getCurrentExpandedItems(): ExpandedDbItem[] {
137+
const items = this.app.workspaceState.get<ExpandedDbItem[]>(
138+
DbManager.DB_EXPANDED_STATE_KEY,
139+
);
140+
141+
return items || [];
142+
}
123143
}

extensions/ql-vscode/src/databases/db-tree-creator.ts

Lines changed: 33 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import {
22
DbConfig,
3+
ExpandedDbItem,
34
ExpandedDbItemKind,
45
LocalDatabase,
56
LocalList,
@@ -18,15 +19,18 @@ import {
1819
RootRemoteDbItem,
1920
} from "./db-item";
2021

21-
export function createRemoteTree(dbConfig: DbConfig): RootRemoteDbItem {
22+
export function createRemoteTree(
23+
dbConfig: DbConfig,
24+
expandedItems: ExpandedDbItem[],
25+
): RootRemoteDbItem {
2226
const systemDefinedLists = [
2327
createSystemDefinedList(10, dbConfig),
2428
createSystemDefinedList(100, dbConfig),
2529
createSystemDefinedList(1000, dbConfig),
2630
];
2731

2832
const userDefinedRepoLists = dbConfig.databases.remote.repositoryLists.map(
29-
(r) => createRemoteUserDefinedList(r, dbConfig),
33+
(r) => createRemoteUserDefinedList(r, dbConfig, expandedItems),
3034
);
3135
const owners = dbConfig.databases.remote.owners.map((o) =>
3236
createOwnerItem(o, dbConfig),
@@ -35,9 +39,9 @@ export function createRemoteTree(dbConfig: DbConfig): RootRemoteDbItem {
3539
createRepoItem(r, dbConfig),
3640
);
3741

38-
const expanded =
39-
dbConfig.expanded &&
40-
dbConfig.expanded.some((e) => e.kind === ExpandedDbItemKind.RootRemote);
42+
const expanded = expandedItems.some(
43+
(e) => e.kind === ExpandedDbItemKind.RootRemote,
44+
);
4145

4246
return {
4347
kind: DbItemKind.RootRemote,
@@ -51,17 +55,20 @@ export function createRemoteTree(dbConfig: DbConfig): RootRemoteDbItem {
5155
};
5256
}
5357

54-
export function createLocalTree(dbConfig: DbConfig): RootLocalDbItem {
58+
export function createLocalTree(
59+
dbConfig: DbConfig,
60+
expandedItems: ExpandedDbItem[],
61+
): RootLocalDbItem {
5562
const localLists = dbConfig.databases.local.lists.map((l) =>
56-
createLocalList(l, dbConfig),
63+
createLocalList(l, dbConfig, expandedItems),
5764
);
5865
const localDbs = dbConfig.databases.local.databases.map((l) =>
5966
createLocalDb(l, dbConfig),
6067
);
6168

62-
const expanded =
63-
dbConfig.expanded &&
64-
dbConfig.expanded.some((e) => e.kind === ExpandedDbItemKind.RootLocal);
69+
const expanded = expandedItems.some(
70+
(e) => e.kind === ExpandedDbItemKind.RootLocal,
71+
);
6572

6673
return {
6774
kind: DbItemKind.RootLocal,
@@ -93,19 +100,18 @@ function createSystemDefinedList(
93100
function createRemoteUserDefinedList(
94101
list: RemoteRepositoryList,
95102
dbConfig: DbConfig,
103+
expandedItems: ExpandedDbItem[],
96104
): RemoteUserDefinedListDbItem {
97105
const selected =
98106
dbConfig.selected &&
99107
dbConfig.selected.kind === SelectedDbItemKind.RemoteUserDefinedList &&
100108
dbConfig.selected.listName === list.name;
101109

102-
const expanded =
103-
dbConfig.expanded &&
104-
dbConfig.expanded.some(
105-
(e) =>
106-
e.kind === ExpandedDbItemKind.RemoteUserDefinedList &&
107-
e.listName === list.name,
108-
);
110+
const expanded = expandedItems.some(
111+
(e) =>
112+
e.kind === ExpandedDbItemKind.RemoteUserDefinedList &&
113+
e.listName === list.name,
114+
);
109115

110116
return {
111117
kind: DbItemKind.RemoteUserDefinedList,
@@ -148,19 +154,21 @@ function createRepoItem(
148154
};
149155
}
150156

151-
function createLocalList(list: LocalList, dbConfig: DbConfig): LocalListDbItem {
157+
function createLocalList(
158+
list: LocalList,
159+
dbConfig: DbConfig,
160+
expandedItems: ExpandedDbItem[],
161+
): LocalListDbItem {
152162
const selected =
153163
dbConfig.selected &&
154164
dbConfig.selected.kind === SelectedDbItemKind.LocalUserDefinedList &&
155165
dbConfig.selected.listName === list.name;
156166

157-
const expanded =
158-
dbConfig.expanded &&
159-
dbConfig.expanded.some(
160-
(e) =>
161-
e.kind === ExpandedDbItemKind.LocalUserDefinedList &&
162-
e.listName === list.name,
163-
);
167+
const expanded = expandedItems.some(
168+
(e) =>
169+
e.kind === ExpandedDbItemKind.LocalUserDefinedList &&
170+
e.listName === list.name,
171+
);
164172

165173
return {
166174
kind: DbItemKind.LocalList,

extensions/ql-vscode/src/vscode-tests/factories/db-config-factories.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { faker } from "@faker-js/faker";
22
import {
33
DbConfig,
4-
ExpandedDbItem,
54
LocalDatabase,
65
LocalList,
76
RemoteRepositoryList,
@@ -15,15 +14,13 @@ export function createDbConfig({
1514
localLists = [],
1615
localDbs = [],
1716
selected = undefined,
18-
expanded = [],
1917
}: {
2018
remoteLists?: RemoteRepositoryList[];
2119
remoteOwners?: string[];
2220
remoteRepos?: string[];
2321
localLists?: LocalList[];
2422
localDbs?: LocalDatabase[];
2523
selected?: SelectedDbItem;
26-
expanded?: ExpandedDbItem[];
2724
} = {}): DbConfig {
2825
return {
2926
databases: {
@@ -37,7 +34,6 @@ export function createDbConfig({
3734
databases: localDbs,
3835
},
3936
},
40-
expanded,
4137
selected,
4238
};
4339
}

extensions/ql-vscode/src/vscode-tests/factories/extension-context.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import * as vscode from "vscode";
2+
import { createMockMemento } from "../mock-memento";
23

34
/**
45
* Creates a partially implemented mock of vscode.ExtensionContext.
@@ -11,10 +12,12 @@ export function createMockExtensionContext({
1112
extensionPath?: string;
1213
workspaceStoragePath?: string;
1314
globalStoragePath?: string;
15+
workspaceState?: vscode.Memento;
1416
}): vscode.ExtensionContext {
1517
return {
1618
extensionPath,
1719
globalStorageUri: vscode.Uri.file(globalStoragePath),
1820
storageUri: vscode.Uri.file(workspaceStoragePath),
21+
workspaceState: createMockMemento(),
1922
} as any as vscode.ExtensionContext;
2023
}

extensions/ql-vscode/test/__mocks__/mementoMock.ts renamed to extensions/ql-vscode/src/vscode-tests/mock-memento.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Memento } from "../../src/common/memento";
1+
import { Memento } from "../common/memento";
22

33
export function createMockMemento(): Memento {
44
return new MockMemento();

extensions/ql-vscode/test/__mocks__/appMock.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { AppEvent, AppEventEmitter } from "../../src/common/events";
33
import { Memento } from "../../src/common/memento";
44
import { Disposable } from "../../src/pure/disposable-object";
55
import { createMockLogger } from "./loggerMock";
6-
import { createMockMemento } from "./mementoMock";
6+
import { createMockMemento } from "../../src/vscode-tests/mock-memento";
77

88
export function createMockApp({
99
extensionPath = "/mock/extension/path",

extensions/ql-vscode/test/pure-tests/databases/config/data/without-selected/workspace-databases.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,5 @@
99
"lists": [],
1010
"databases": []
1111
}
12-
},
13-
"expanded": []
12+
}
1413
}

extensions/ql-vscode/test/pure-tests/databases/config/data/workspace-databases.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@
4545
]
4646
}
4747
},
48-
"expanded": [],
4948
"selected": {
5049
"kind": "remoteUserDefinedList",
5150
"listName": "repoList1"

0 commit comments

Comments
 (0)