Replace subscriptions in resource tree with useDatabases hook (#904)
This commit is contained in:
parent
b392bed1b0
commit
738a02a0f3
|
@ -53,9 +53,6 @@ exports[`SettingsComponent renders 1`] = `
|
||||||
"resourceTree": ResourceTreeAdapter {
|
"resourceTree": ResourceTreeAdapter {
|
||||||
"container": [Circular],
|
"container": [Circular],
|
||||||
"copyNotebook": [Function],
|
"copyNotebook": [Function],
|
||||||
"databaseCollectionIdMap": Map {},
|
|
||||||
"koSubsCollectionIdMap": Map {},
|
|
||||||
"koSubsDatabaseIdMap": Map {},
|
|
||||||
"parameters": [Function],
|
"parameters": [Function],
|
||||||
},
|
},
|
||||||
"resourceTreeForResourceToken": ResourceTreeAdapterForResourceToken {
|
"resourceTreeForResourceToken": ResourceTreeAdapterForResourceToken {
|
||||||
|
@ -145,9 +142,6 @@ exports[`SettingsComponent renders 1`] = `
|
||||||
"resourceTree": ResourceTreeAdapter {
|
"resourceTree": ResourceTreeAdapter {
|
||||||
"container": [Circular],
|
"container": [Circular],
|
||||||
"copyNotebook": [Function],
|
"copyNotebook": [Function],
|
||||||
"databaseCollectionIdMap": Map {},
|
|
||||||
"koSubsCollectionIdMap": Map {},
|
|
||||||
"koSubsDatabaseIdMap": Map {},
|
|
||||||
"parameters": [Function],
|
"parameters": [Function],
|
||||||
},
|
},
|
||||||
"resourceTreeForResourceToken": ResourceTreeAdapterForResourceToken {
|
"resourceTreeForResourceToken": ResourceTreeAdapterForResourceToken {
|
||||||
|
|
|
@ -42,9 +42,6 @@ exports[`GitHub Repos Panel should render Default properly 1`] = `
|
||||||
"resourceTree": ResourceTreeAdapter {
|
"resourceTree": ResourceTreeAdapter {
|
||||||
"container": [Circular],
|
"container": [Circular],
|
||||||
"copyNotebook": [Function],
|
"copyNotebook": [Function],
|
||||||
"databaseCollectionIdMap": Map {},
|
|
||||||
"koSubsCollectionIdMap": Map {},
|
|
||||||
"koSubsDatabaseIdMap": Map {},
|
|
||||||
"parameters": [Function],
|
"parameters": [Function],
|
||||||
},
|
},
|
||||||
"resourceTreeForResourceToken": ResourceTreeAdapterForResourceToken {
|
"resourceTreeForResourceToken": ResourceTreeAdapterForResourceToken {
|
||||||
|
|
|
@ -32,9 +32,6 @@ exports[`StringInput Pane should render Create new directory properly 1`] = `
|
||||||
"resourceTree": ResourceTreeAdapter {
|
"resourceTree": ResourceTreeAdapter {
|
||||||
"container": [Circular],
|
"container": [Circular],
|
||||||
"copyNotebook": [Function],
|
"copyNotebook": [Function],
|
||||||
"databaseCollectionIdMap": Map {},
|
|
||||||
"koSubsCollectionIdMap": Map {},
|
|
||||||
"koSubsDatabaseIdMap": Map {},
|
|
||||||
"parameters": [Function],
|
"parameters": [Function],
|
||||||
},
|
},
|
||||||
"resourceTreeForResourceToken": ResourceTreeAdapterForResourceToken {
|
"resourceTreeForResourceToken": ResourceTreeAdapterForResourceToken {
|
||||||
|
|
|
@ -175,6 +175,19 @@ export default class Collection implements ViewModels.Collection {
|
||||||
});
|
});
|
||||||
|
|
||||||
this.children = ko.observableArray<ViewModels.TreeNode>([]);
|
this.children = ko.observableArray<ViewModels.TreeNode>([]);
|
||||||
|
this.children.subscribe(() => {
|
||||||
|
// update the database in zustand store
|
||||||
|
const database = this.getDatabase();
|
||||||
|
database.collections(
|
||||||
|
database.collections()?.map((collection) => {
|
||||||
|
if (collection.id() === this.id()) {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
return collection;
|
||||||
|
})
|
||||||
|
);
|
||||||
|
useDatabases.getState().updateDatabase(database);
|
||||||
|
});
|
||||||
|
|
||||||
this.storedProcedures = ko.computed(() => {
|
this.storedProcedures = ko.computed(() => {
|
||||||
return this.children()
|
return this.children()
|
||||||
|
|
|
@ -17,6 +17,7 @@ import { isServerlessAccount } from "../../Utils/CapabilityUtils";
|
||||||
import { logConsoleError } from "../../Utils/NotificationConsoleUtils";
|
import { logConsoleError } from "../../Utils/NotificationConsoleUtils";
|
||||||
import Explorer from "../Explorer";
|
import Explorer from "../Explorer";
|
||||||
import { DatabaseSettingsTabV2 } from "../Tabs/SettingsTabV2";
|
import { DatabaseSettingsTabV2 } from "../Tabs/SettingsTabV2";
|
||||||
|
import { useDatabases } from "../useDatabases";
|
||||||
import Collection from "./Collection";
|
import Collection from "./Collection";
|
||||||
|
|
||||||
export default class Database implements ViewModels.Database {
|
export default class Database implements ViewModels.Database {
|
||||||
|
@ -41,6 +42,7 @@ export default class Database implements ViewModels.Database {
|
||||||
this.id = ko.observable(data.id);
|
this.id = ko.observable(data.id);
|
||||||
this.offer = ko.observable();
|
this.offer = ko.observable();
|
||||||
this.collections = ko.observableArray<Collection>();
|
this.collections = ko.observableArray<Collection>();
|
||||||
|
this.collections.subscribe(() => useDatabases.getState().updateDatabase(this));
|
||||||
this.isDatabaseExpanded = ko.observable<boolean>(false);
|
this.isDatabaseExpanded = ko.observable<boolean>(false);
|
||||||
this.selectedSubnodeKind = ko.observable<ViewModels.CollectionTabKind>();
|
this.selectedSubnodeKind = ko.observable<ViewModels.CollectionTabKind>();
|
||||||
this.isDatabaseShared = ko.pureComputed(() => {
|
this.isDatabaseShared = ko.pureComputed(() => {
|
||||||
|
|
|
@ -12,7 +12,6 @@ import PublishIcon from "../../../images/notebook/publish_content.svg";
|
||||||
import RefreshIcon from "../../../images/refresh-cosmos.svg";
|
import RefreshIcon from "../../../images/refresh-cosmos.svg";
|
||||||
import CollectionIcon from "../../../images/tree-collection.svg";
|
import CollectionIcon from "../../../images/tree-collection.svg";
|
||||||
import { ReactAdapter } from "../../Bindings/ReactBindingHandler";
|
import { ReactAdapter } from "../../Bindings/ReactBindingHandler";
|
||||||
import { ArrayHashMap } from "../../Common/ArrayHashMap";
|
|
||||||
import { Areas } from "../../Common/Constants";
|
import { Areas } from "../../Common/Constants";
|
||||||
import { isPublicInternetAccessAllowed } from "../../Common/DatabaseAccountUtility";
|
import { isPublicInternetAccessAllowed } from "../../Common/DatabaseAccountUtility";
|
||||||
import * as DataModels from "../../Contracts/DataModels";
|
import * as DataModels from "../../Contracts/DataModels";
|
||||||
|
@ -52,10 +51,6 @@ export class ResourceTreeAdapter implements ReactAdapter {
|
||||||
public myNotebooksContentRoot: NotebookContentItem;
|
public myNotebooksContentRoot: NotebookContentItem;
|
||||||
public gitHubNotebooksContentRoot: NotebookContentItem;
|
public gitHubNotebooksContentRoot: NotebookContentItem;
|
||||||
|
|
||||||
private koSubsDatabaseIdMap: ArrayHashMap<ko.Subscription>; // database id -> ko subs
|
|
||||||
private koSubsCollectionIdMap: ArrayHashMap<ko.Subscription>; // collection id -> ko subs
|
|
||||||
private databaseCollectionIdMap: ArrayHashMap<string>; // database id -> collection ids
|
|
||||||
|
|
||||||
public constructor(private container: Explorer) {
|
public constructor(private container: Explorer) {
|
||||||
this.parameters = ko.observable(Date.now());
|
this.parameters = ko.observable(Date.now());
|
||||||
|
|
||||||
|
@ -63,22 +58,7 @@ export class ResourceTreeAdapter implements ReactAdapter {
|
||||||
this.container.tabsManager.activeTab.subscribe((newValue: TabsBase) => this.triggerRender());
|
this.container.tabsManager.activeTab.subscribe((newValue: TabsBase) => this.triggerRender());
|
||||||
this.container.isNotebookEnabled.subscribe((newValue) => this.triggerRender());
|
this.container.isNotebookEnabled.subscribe((newValue) => this.triggerRender());
|
||||||
|
|
||||||
this.koSubsDatabaseIdMap = new ArrayHashMap();
|
useDatabases.subscribe(() => this.triggerRender());
|
||||||
this.koSubsCollectionIdMap = new ArrayHashMap();
|
|
||||||
this.databaseCollectionIdMap = new ArrayHashMap();
|
|
||||||
|
|
||||||
useDatabases.subscribe(
|
|
||||||
(databases: ViewModels.Database[]) => {
|
|
||||||
// Clean up old databases
|
|
||||||
this.cleanupDatabasesKoSubs();
|
|
||||||
|
|
||||||
databases.forEach((database: ViewModels.Database) => this.watchDatabase(database));
|
|
||||||
this.triggerRender();
|
|
||||||
},
|
|
||||||
(state) => state.databases
|
|
||||||
);
|
|
||||||
|
|
||||||
useDatabases.getState().databases.forEach((database: ViewModels.Database) => this.watchDatabase(database));
|
|
||||||
this.triggerRender();
|
this.triggerRender();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -878,93 +858,4 @@ export class ResourceTreeAdapter implements ReactAdapter {
|
||||||
subnodeKinds.includes(selectedSubnodeKind)
|
subnodeKinds.includes(selectedSubnodeKind)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// *************** watch all nested ko's inside database
|
|
||||||
// TODO Simplify so we don't have to do this
|
|
||||||
|
|
||||||
private watchCollection(databaseId: string, collection: ViewModels.Collection) {
|
|
||||||
this.addKoSubToCollectionId(
|
|
||||||
databaseId,
|
|
||||||
collection.id(),
|
|
||||||
collection.storedProcedures?.subscribe(() => {
|
|
||||||
this.triggerRender();
|
|
||||||
})
|
|
||||||
);
|
|
||||||
|
|
||||||
this.addKoSubToCollectionId(
|
|
||||||
databaseId,
|
|
||||||
collection.id(),
|
|
||||||
collection.isCollectionExpanded?.subscribe(() => {
|
|
||||||
this.triggerRender();
|
|
||||||
})
|
|
||||||
);
|
|
||||||
|
|
||||||
this.addKoSubToCollectionId(
|
|
||||||
databaseId,
|
|
||||||
collection.id(),
|
|
||||||
collection.isStoredProceduresExpanded?.subscribe(() => {
|
|
||||||
this.triggerRender();
|
|
||||||
})
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
private watchDatabase(database: ViewModels.Database) {
|
|
||||||
const databaseId = database.id();
|
|
||||||
const koSub = database.collections.subscribe((collections: ViewModels.Collection[]) => {
|
|
||||||
this.cleanupCollectionsKoSubs(
|
|
||||||
databaseId,
|
|
||||||
collections.map((collection: ViewModels.Collection) => collection.id())
|
|
||||||
);
|
|
||||||
|
|
||||||
collections.forEach((collection: ViewModels.Collection) => this.watchCollection(databaseId, collection));
|
|
||||||
this.triggerRender();
|
|
||||||
});
|
|
||||||
this.addKoSubToDatabaseId(databaseId, koSub);
|
|
||||||
|
|
||||||
database.collections().forEach((collection: ViewModels.Collection) => this.watchCollection(databaseId, collection));
|
|
||||||
}
|
|
||||||
|
|
||||||
private addKoSubToDatabaseId(databaseId: string, sub: ko.Subscription): void {
|
|
||||||
this.koSubsDatabaseIdMap.push(databaseId, sub);
|
|
||||||
}
|
|
||||||
|
|
||||||
private addKoSubToCollectionId(databaseId: string, collectionId: string, sub: ko.Subscription): void {
|
|
||||||
this.databaseCollectionIdMap.push(databaseId, collectionId);
|
|
||||||
this.koSubsCollectionIdMap.push(collectionId, sub);
|
|
||||||
}
|
|
||||||
|
|
||||||
private cleanupDatabasesKoSubs(): void {
|
|
||||||
for (const databaseId of this.koSubsDatabaseIdMap.keys()) {
|
|
||||||
this.koSubsDatabaseIdMap.get(databaseId).forEach((sub: ko.Subscription) => sub.dispose());
|
|
||||||
this.koSubsDatabaseIdMap.delete(databaseId);
|
|
||||||
|
|
||||||
if (this.databaseCollectionIdMap.has(databaseId)) {
|
|
||||||
this.databaseCollectionIdMap
|
|
||||||
.get(databaseId)
|
|
||||||
.forEach((collectionId: string) => this.cleanupKoSubsForCollection(databaseId, collectionId));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private cleanupCollectionsKoSubs(databaseId: string, existingCollectionIds: string[]): void {
|
|
||||||
if (!this.databaseCollectionIdMap.has(databaseId)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const collectionIdsToRemove = this.databaseCollectionIdMap
|
|
||||||
.get(databaseId)
|
|
||||||
.filter((id: string) => existingCollectionIds.indexOf(id) === -1);
|
|
||||||
|
|
||||||
collectionIdsToRemove.forEach((id: string) => this.cleanupKoSubsForCollection(databaseId, id));
|
|
||||||
}
|
|
||||||
|
|
||||||
private cleanupKoSubsForCollection(databaseId: string, collectionId: string) {
|
|
||||||
if (!this.koSubsCollectionIdMap.has(collectionId)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.koSubsCollectionIdMap.get(collectionId).forEach((sub: ko.Subscription) => sub.dispose());
|
|
||||||
this.koSubsCollectionIdMap.delete(collectionId);
|
|
||||||
this.databaseCollectionIdMap.remove(databaseId, collectionId);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue