parent
6b35ab03f2
commit
59655eed5f
|
@ -199,9 +199,6 @@ src/ResourceProvider/IResourceProviderClient.test.ts
|
||||||
src/ResourceProvider/IResourceProviderClient.ts
|
src/ResourceProvider/IResourceProviderClient.ts
|
||||||
src/ResourceProvider/ResourceProviderClient.ts
|
src/ResourceProvider/ResourceProviderClient.ts
|
||||||
src/ResourceProvider/ResourceProviderClientFactory.ts
|
src/ResourceProvider/ResourceProviderClientFactory.ts
|
||||||
src/RouteHandlers/RouteHandler.ts
|
|
||||||
src/RouteHandlers/TabRouteHandler.test.ts
|
|
||||||
src/RouteHandlers/TabRouteHandler.ts
|
|
||||||
src/Shared/Constants.ts
|
src/Shared/Constants.ts
|
||||||
src/Shared/DefaultExperienceUtility.test.ts
|
src/Shared/DefaultExperienceUtility.test.ts
|
||||||
src/Shared/DefaultExperienceUtility.ts
|
src/Shared/DefaultExperienceUtility.ts
|
||||||
|
|
|
@ -275,7 +275,6 @@ export interface TabOptions {
|
||||||
tabKind: CollectionTabKind;
|
tabKind: CollectionTabKind;
|
||||||
title: string;
|
title: string;
|
||||||
tabPath: string;
|
tabPath: string;
|
||||||
hashLocation: string;
|
|
||||||
isTabsContentExpanded?: ko.Observable<boolean>;
|
isTabsContentExpanded?: ko.Observable<boolean>;
|
||||||
onLoadStartKey?: number;
|
onLoadStartKey?: number;
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,6 @@ describe("SettingsComponent", () => {
|
||||||
title: "Scale & Settings",
|
title: "Scale & Settings",
|
||||||
tabPath: "",
|
tabPath: "",
|
||||||
node: undefined,
|
node: undefined,
|
||||||
hashLocation: "settings",
|
|
||||||
}),
|
}),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,6 @@ import * as ViewModels from "../Contracts/ViewModels";
|
||||||
import { GitHubOAuthService } from "../GitHub/GitHubOAuthService";
|
import { GitHubOAuthService } from "../GitHub/GitHubOAuthService";
|
||||||
import { useSidePanel } from "../hooks/useSidePanel";
|
import { useSidePanel } from "../hooks/useSidePanel";
|
||||||
import { IGalleryItem, JunoClient } from "../Juno/JunoClient";
|
import { IGalleryItem, JunoClient } from "../Juno/JunoClient";
|
||||||
import { RouteHandler } from "../RouteHandlers/RouteHandler";
|
|
||||||
import { ExplorerSettings } from "../Shared/ExplorerSettings";
|
import { ExplorerSettings } from "../Shared/ExplorerSettings";
|
||||||
import { Action, ActionModifiers } from "../Shared/Telemetry/TelemetryConstants";
|
import { Action, ActionModifiers } from "../Shared/Telemetry/TelemetryConstants";
|
||||||
import * as TelemetryProcessor from "../Shared/Telemetry/TelemetryProcessor";
|
import * as TelemetryProcessor from "../Shared/Telemetry/TelemetryProcessor";
|
||||||
|
@ -138,7 +137,6 @@ export default class Explorer {
|
||||||
userContext.authType === AuthType.ResourceToken
|
userContext.authType === AuthType.ResourceToken
|
||||||
? this.refreshDatabaseForResourceToken()
|
? this.refreshDatabaseForResourceToken()
|
||||||
: this.refreshAllDatabases(true);
|
: this.refreshAllDatabases(true);
|
||||||
RouteHandler.getInstance().initHandler();
|
|
||||||
await this._refreshNotebooksEnabledStateForAccount();
|
await this._refreshNotebooksEnabledStateForAccount();
|
||||||
this.isNotebookEnabled(
|
this.isNotebookEnabled(
|
||||||
userContext.authType !== AuthType.ResourceToken &&
|
userContext.authType !== AuthType.ResourceToken &&
|
||||||
|
@ -899,7 +897,6 @@ export default class Explorer {
|
||||||
tabPath: notebookContentItem.path,
|
tabPath: notebookContentItem.path,
|
||||||
collection: null,
|
collection: null,
|
||||||
masterKey: userContext.masterKey || "",
|
masterKey: userContext.masterKey || "",
|
||||||
hashLocation: "notebooks",
|
|
||||||
isTabsContentExpanded: ko.observable(true),
|
isTabsContentExpanded: ko.observable(true),
|
||||||
onLoadStartKey: null,
|
onLoadStartKey: null,
|
||||||
container: this,
|
container: this,
|
||||||
|
@ -1199,30 +1196,27 @@ export default class Explorer {
|
||||||
|
|
||||||
public openNotebookTerminal(kind: ViewModels.TerminalKind) {
|
public openNotebookTerminal(kind: ViewModels.TerminalKind) {
|
||||||
let title: string;
|
let title: string;
|
||||||
let hashLocation: string;
|
|
||||||
|
|
||||||
switch (kind) {
|
switch (kind) {
|
||||||
case ViewModels.TerminalKind.Default:
|
case ViewModels.TerminalKind.Default:
|
||||||
title = "Terminal";
|
title = "Terminal";
|
||||||
hashLocation = "terminal";
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ViewModels.TerminalKind.Mongo:
|
case ViewModels.TerminalKind.Mongo:
|
||||||
title = "Mongo Shell";
|
title = "Mongo Shell";
|
||||||
hashLocation = "mongo-shell";
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ViewModels.TerminalKind.Cassandra:
|
case ViewModels.TerminalKind.Cassandra:
|
||||||
title = "Cassandra Shell";
|
title = "Cassandra Shell";
|
||||||
hashLocation = "cassandra-shell";
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw new Error("Terminal kind: ${kind} not supported");
|
throw new Error("Terminal kind: ${kind} not supported");
|
||||||
}
|
}
|
||||||
|
|
||||||
const terminalTabs: TerminalTab[] = this.tabsManager.getTabs(ViewModels.CollectionTabKind.Terminal, (tab) =>
|
const terminalTabs: TerminalTab[] = this.tabsManager.getTabs(
|
||||||
tab.hashLocation().startsWith(hashLocation)
|
ViewModels.CollectionTabKind.Terminal,
|
||||||
|
(tab) => tab.tabTitle() === title
|
||||||
) as TerminalTab[];
|
) as TerminalTab[];
|
||||||
|
|
||||||
let index = 1;
|
let index = 1;
|
||||||
|
@ -1237,7 +1231,6 @@ export default class Explorer {
|
||||||
title: `${title} ${index}`,
|
title: `${title} ${index}`,
|
||||||
tabPath: `${title} ${index}`,
|
tabPath: `${title} ${index}`,
|
||||||
collection: null,
|
collection: null,
|
||||||
hashLocation: `${hashLocation} ${index}`,
|
|
||||||
isTabsContentExpanded: ko.observable(true),
|
isTabsContentExpanded: ko.observable(true),
|
||||||
onLoadStartKey: null,
|
onLoadStartKey: null,
|
||||||
container: this,
|
container: this,
|
||||||
|
@ -1255,11 +1248,10 @@ export default class Explorer {
|
||||||
isFavorite?: boolean
|
isFavorite?: boolean
|
||||||
) {
|
) {
|
||||||
const title = "Gallery";
|
const title = "Gallery";
|
||||||
const hashLocation = "gallery";
|
|
||||||
const GalleryTab = await (await import(/* webpackChunkName: "GalleryTab" */ "./Tabs/GalleryTab")).default;
|
const GalleryTab = await (await import(/* webpackChunkName: "GalleryTab" */ "./Tabs/GalleryTab")).default;
|
||||||
const galleryTab = this.tabsManager
|
const galleryTab = this.tabsManager
|
||||||
.getTabs(ViewModels.CollectionTabKind.Gallery)
|
.getTabs(ViewModels.CollectionTabKind.Gallery)
|
||||||
.find((tab) => tab.hashLocation() == hashLocation);
|
.find((tab) => tab.tabTitle() == title);
|
||||||
|
|
||||||
if (galleryTab instanceof GalleryTab) {
|
if (galleryTab instanceof GalleryTab) {
|
||||||
this.tabsManager.activateTab(galleryTab);
|
this.tabsManager.activateTab(galleryTab);
|
||||||
|
@ -1268,9 +1260,8 @@ export default class Explorer {
|
||||||
new GalleryTab(
|
new GalleryTab(
|
||||||
{
|
{
|
||||||
tabKind: ViewModels.CollectionTabKind.Gallery,
|
tabKind: ViewModels.CollectionTabKind.Gallery,
|
||||||
title: title,
|
title,
|
||||||
tabPath: title,
|
tabPath: title,
|
||||||
hashLocation: hashLocation,
|
|
||||||
onLoadStartKey: null,
|
onLoadStartKey: null,
|
||||||
isTabsContentExpanded: ko.observable(true),
|
isTabsContentExpanded: ko.observable(true),
|
||||||
},
|
},
|
||||||
|
|
|
@ -15,7 +15,6 @@ describe("Documents tab", () => {
|
||||||
tabKind: ViewModels.CollectionTabKind.Documents,
|
tabKind: ViewModels.CollectionTabKind.Documents,
|
||||||
title: "",
|
title: "",
|
||||||
tabPath: "",
|
tabPath: "",
|
||||||
hashLocation: "",
|
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(documentsTab.buildQuery("")).toContain("select");
|
expect(documentsTab.buildQuery("")).toContain("select");
|
||||||
|
@ -90,7 +89,6 @@ describe("Documents tab", () => {
|
||||||
tabKind: ViewModels.CollectionTabKind.Documents,
|
tabKind: ViewModels.CollectionTabKind.Documents,
|
||||||
title: "",
|
title: "",
|
||||||
tabPath: "",
|
tabPath: "",
|
||||||
hashLocation: "",
|
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(documentsTab.showPartitionKey).toBe(false);
|
expect(documentsTab.showPartitionKey).toBe(false);
|
||||||
|
@ -104,7 +102,6 @@ describe("Documents tab", () => {
|
||||||
tabKind: ViewModels.CollectionTabKind.Documents,
|
tabKind: ViewModels.CollectionTabKind.Documents,
|
||||||
title: "",
|
title: "",
|
||||||
tabPath: "",
|
tabPath: "",
|
||||||
hashLocation: "",
|
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(documentsTab.showPartitionKey).toBe(false);
|
expect(documentsTab.showPartitionKey).toBe(false);
|
||||||
|
@ -118,7 +115,6 @@ describe("Documents tab", () => {
|
||||||
tabKind: ViewModels.CollectionTabKind.Documents,
|
tabKind: ViewModels.CollectionTabKind.Documents,
|
||||||
title: "",
|
title: "",
|
||||||
tabPath: "",
|
tabPath: "",
|
||||||
hashLocation: "",
|
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(documentsTab.showPartitionKey).toBe(true);
|
expect(documentsTab.showPartitionKey).toBe(true);
|
||||||
|
@ -135,7 +131,6 @@ describe("Documents tab", () => {
|
||||||
tabKind: ViewModels.CollectionTabKind.Documents,
|
tabKind: ViewModels.CollectionTabKind.Documents,
|
||||||
title: "",
|
title: "",
|
||||||
tabPath: "",
|
tabPath: "",
|
||||||
hashLocation: "",
|
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(documentsTab.showPartitionKey).toBe(false);
|
expect(documentsTab.showPartitionKey).toBe(false);
|
||||||
|
@ -149,7 +144,6 @@ describe("Documents tab", () => {
|
||||||
tabKind: ViewModels.CollectionTabKind.Documents,
|
tabKind: ViewModels.CollectionTabKind.Documents,
|
||||||
title: "",
|
title: "",
|
||||||
tabPath: "",
|
tabPath: "",
|
||||||
hashLocation: "",
|
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(documentsTab.showPartitionKey).toBe(true);
|
expect(documentsTab.showPartitionKey).toBe(true);
|
||||||
|
|
|
@ -37,7 +37,6 @@ export class NewStoredProcedureTab extends ScriptTabBase {
|
||||||
tabPath: options.tabPath,
|
tabPath: options.tabPath,
|
||||||
collectionBase: options.collection,
|
collectionBase: options.collection,
|
||||||
node: options.node,
|
node: options.node,
|
||||||
hasLocation: options.hashLocation,
|
|
||||||
scriptTabBaseInstance: this,
|
scriptTabBaseInstance: this,
|
||||||
collection: props.collection,
|
collection: props.collection,
|
||||||
iStorProcTabComponentAccessor: (instance: IStorProcTabComponentAccessor) => {
|
iStorProcTabComponentAccessor: (instance: IStorProcTabComponentAccessor) => {
|
||||||
|
|
|
@ -4,7 +4,6 @@ import React from "react";
|
||||||
import DiscardIcon from "../../../../images/discard.svg";
|
import DiscardIcon from "../../../../images/discard.svg";
|
||||||
import ExecuteQueryIcon from "../../../../images/ExecuteQuery.svg";
|
import ExecuteQueryIcon from "../../../../images/ExecuteQuery.svg";
|
||||||
import SaveIcon from "../../../../images/save-cosmos.svg";
|
import SaveIcon from "../../../../images/save-cosmos.svg";
|
||||||
import * as Constants from "../../../Common/Constants";
|
|
||||||
import { NormalizedEventKey } from "../../../Common/Constants";
|
import { NormalizedEventKey } from "../../../Common/Constants";
|
||||||
import { createStoredProcedure } from "../../../Common/dataAccess/createStoredProcedure";
|
import { createStoredProcedure } from "../../../Common/dataAccess/createStoredProcedure";
|
||||||
import { ExecuteSprocResult } from "../../../Common/dataAccess/executeStoredProcedure";
|
import { ExecuteSprocResult } from "../../../Common/dataAccess/executeStoredProcedure";
|
||||||
|
@ -55,7 +54,6 @@ export interface IStoredProcTabComponentProps {
|
||||||
collectionBase: ViewModels.CollectionBase;
|
collectionBase: ViewModels.CollectionBase;
|
||||||
//eslint-disable-next-line
|
//eslint-disable-next-line
|
||||||
node?: any;
|
node?: any;
|
||||||
hasLocation: string;
|
|
||||||
scriptTabBaseInstance: ScriptTabBase;
|
scriptTabBaseInstance: ScriptTabBase;
|
||||||
collection: ViewModels.Collection;
|
collection: ViewModels.Collection;
|
||||||
iStorProcTabComponentAccessor: (instance: IStorProcTabComponentAccessor) => void;
|
iStorProcTabComponentAccessor: (instance: IStorProcTabComponentAccessor) => void;
|
||||||
|
@ -389,12 +387,6 @@ export default class StoredProcedureTabComponent extends React.Component<
|
||||||
this.props.scriptTabBaseInstance.tabTitle(createdResource.id);
|
this.props.scriptTabBaseInstance.tabTitle(createdResource.id);
|
||||||
this.props.scriptTabBaseInstance.isNew(false);
|
this.props.scriptTabBaseInstance.isNew(false);
|
||||||
this.props.scriptTabBaseInstance.resource(createdResource);
|
this.props.scriptTabBaseInstance.resource(createdResource);
|
||||||
this.props.scriptTabBaseInstance.hashLocation(
|
|
||||||
`${Constants.HashRoutePrefixes.collectionsWithIds(
|
|
||||||
this.props.collectionBase.databaseId,
|
|
||||||
this.props.collectionBase.id()
|
|
||||||
)}/sprocs/${createdResource.id}`
|
|
||||||
);
|
|
||||||
this.props.scriptTabBaseInstance.setBaselines();
|
this.props.scriptTabBaseInstance.setBaselines();
|
||||||
|
|
||||||
const editorModel =
|
const editorModel =
|
||||||
|
|
|
@ -4,7 +4,6 @@ import * as ThemeUtility from "../../Common/ThemeUtility";
|
||||||
import * as DataModels from "../../Contracts/DataModels";
|
import * as DataModels from "../../Contracts/DataModels";
|
||||||
import * as ViewModels from "../../Contracts/ViewModels";
|
import * as ViewModels from "../../Contracts/ViewModels";
|
||||||
import { useNotificationConsole } from "../../hooks/useNotificationConsole";
|
import { useNotificationConsole } from "../../hooks/useNotificationConsole";
|
||||||
import { RouteHandler } from "../../RouteHandlers/RouteHandler";
|
|
||||||
import { Action, ActionModifiers } from "../../Shared/Telemetry/TelemetryConstants";
|
import { Action, ActionModifiers } from "../../Shared/Telemetry/TelemetryConstants";
|
||||||
import * as TelemetryProcessor from "../../Shared/Telemetry/TelemetryProcessor";
|
import * as TelemetryProcessor from "../../Shared/Telemetry/TelemetryProcessor";
|
||||||
import { CommandButtonComponentProps } from "../Controls/CommandButton/CommandButtonComponent";
|
import { CommandButtonComponentProps } from "../Controls/CommandButton/CommandButtonComponent";
|
||||||
|
@ -25,7 +24,6 @@ export default class TabsBase extends WaitsForTemplateViewModel {
|
||||||
public tabKind: ViewModels.CollectionTabKind;
|
public tabKind: ViewModels.CollectionTabKind;
|
||||||
public tabTitle: ko.Observable<string>;
|
public tabTitle: ko.Observable<string>;
|
||||||
public tabPath: ko.Observable<string>;
|
public tabPath: ko.Observable<string>;
|
||||||
public hashLocation: ko.Observable<string>;
|
|
||||||
public isExecutionError = ko.observable(false);
|
public isExecutionError = ko.observable(false);
|
||||||
public isExecuting = ko.observable(false);
|
public isExecuting = ko.observable(false);
|
||||||
public pendingNotification?: ko.Observable<DataModels.Notification>;
|
public pendingNotification?: ko.Observable<DataModels.Notification>;
|
||||||
|
@ -49,8 +47,6 @@ export default class TabsBase extends WaitsForTemplateViewModel {
|
||||||
ko.observable<string>(`${this.collection.databaseId}>${this.collection.id()}>${this.tabTitle()}`));
|
ko.observable<string>(`${this.collection.databaseId}>${this.collection.id()}>${this.tabTitle()}`));
|
||||||
this.pendingNotification = ko.observable<DataModels.Notification>(undefined);
|
this.pendingNotification = ko.observable<DataModels.Notification>(undefined);
|
||||||
this.onLoadStartKey = options.onLoadStartKey;
|
this.onLoadStartKey = options.onLoadStartKey;
|
||||||
this.hashLocation = ko.observable<string>(options.hashLocation || "");
|
|
||||||
this.hashLocation.subscribe((newLocation: string) => this.updateGlobalHash(newLocation));
|
|
||||||
this.closeTabButton = {
|
this.closeTabButton = {
|
||||||
enabled: ko.computed<boolean>(() => {
|
enabled: ko.computed<boolean>(() => {
|
||||||
return true;
|
return true;
|
||||||
|
@ -114,7 +110,6 @@ export default class TabsBase extends WaitsForTemplateViewModel {
|
||||||
this.updateSelectedNode();
|
this.updateSelectedNode();
|
||||||
this.collection?.selectedSubnodeKind(this.tabKind);
|
this.collection?.selectedSubnodeKind(this.tabKind);
|
||||||
this.database?.selectedSubnodeKind(this.tabKind);
|
this.database?.selectedSubnodeKind(this.tabKind);
|
||||||
this.updateGlobalHash(this.hashLocation());
|
|
||||||
this.updateNavbarWithTabsButtons();
|
this.updateNavbarWithTabsButtons();
|
||||||
TelemetryProcessor.trace(Action.Tab, ActionModifiers.Open, {
|
TelemetryProcessor.trace(Action.Tab, ActionModifiers.Open, {
|
||||||
tabName: this.constructor.name,
|
tabName: this.constructor.name,
|
||||||
|
@ -152,10 +147,6 @@ export default class TabsBase extends WaitsForTemplateViewModel {
|
||||||
return JSON.stringify(value, replacer, space);
|
return JSON.stringify(value, replacer, space);
|
||||||
}
|
}
|
||||||
|
|
||||||
private updateGlobalHash(newHash: string): void {
|
|
||||||
RouteHandler.getInstance().updateRouteHashLocation(newHash);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return buttons that are displayed in the navbar
|
* @return buttons that are displayed in the navbar
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -53,7 +53,6 @@ describe("Tabs manager tests", () => {
|
||||||
database,
|
database,
|
||||||
title: "",
|
title: "",
|
||||||
tabPath: "",
|
tabPath: "",
|
||||||
hashLocation: "",
|
|
||||||
queryText: "",
|
queryText: "",
|
||||||
partitionKey: collection.partitionKey,
|
partitionKey: collection.partitionKey,
|
||||||
onLoadStartKey: 1,
|
onLoadStartKey: 1,
|
||||||
|
@ -70,7 +69,6 @@ describe("Tabs manager tests", () => {
|
||||||
collection,
|
collection,
|
||||||
title: "",
|
title: "",
|
||||||
tabPath: "",
|
tabPath: "",
|
||||||
hashLocation: "",
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// make sure tabs have different tabId
|
// make sure tabs have different tabId
|
||||||
|
|
|
@ -100,12 +100,6 @@ export class TriggerTabContent extends Component<TriggerTab, ITriggerTabContentS
|
||||||
this.props.tabTitle(createdResource.id);
|
this.props.tabTitle(createdResource.id);
|
||||||
this.props.isNew(false);
|
this.props.isNew(false);
|
||||||
this.props.resource(createdResource);
|
this.props.resource(createdResource);
|
||||||
this.props.hashLocation(
|
|
||||||
`${Constants.HashRoutePrefixes.collectionsWithIds(
|
|
||||||
this.props.collection.databaseId,
|
|
||||||
this.props.collection.id()
|
|
||||||
)}/triggers/${createdResource.id}`
|
|
||||||
);
|
|
||||||
this.props.editorContent.setBaseline(createdResource.body as string);
|
this.props.editorContent.setBaseline(createdResource.body as string);
|
||||||
this.props.addNodeInCollection(createdResource);
|
this.props.addNodeInCollection(createdResource);
|
||||||
this.saveButton.visible = false;
|
this.saveButton.visible = false;
|
||||||
|
|
|
@ -145,12 +145,6 @@ export default class UserDefinedFunctionTabContent extends Component<
|
||||||
this.updateButton.visible = true;
|
this.updateButton.visible = true;
|
||||||
this.saveButton.visible = false;
|
this.saveButton.visible = false;
|
||||||
this.props.resource(createdResource);
|
this.props.resource(createdResource);
|
||||||
this.props.hashLocation(
|
|
||||||
`${Constants.HashRoutePrefixes.collectionsWithIds(
|
|
||||||
this.props.collection.databaseId,
|
|
||||||
this.props.collection.id()
|
|
||||||
)}/udfs/${createdResource.id}`
|
|
||||||
);
|
|
||||||
this.props.addNodeInCollection(createdResource);
|
this.props.addNodeInCollection(createdResource);
|
||||||
this.setState({ isUdfIdEditable: false });
|
this.setState({ isUdfIdEditable: false });
|
||||||
this.props.isExecuting(false);
|
this.props.isExecuting(false);
|
||||||
|
|
|
@ -313,7 +313,6 @@ export default class Collection implements ViewModels.Collection {
|
||||||
collection: this,
|
collection: this,
|
||||||
node: this,
|
node: this,
|
||||||
tabPath: `${this.databaseId}>${this.id()}>Documents`,
|
tabPath: `${this.databaseId}>${this.id()}>Documents`,
|
||||||
hashLocation: `${Constants.HashRoutePrefixes.collectionsWithIds(this.databaseId, this.id())}/documents`,
|
|
||||||
onLoadStartKey: startKey,
|
onLoadStartKey: startKey,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -359,7 +358,6 @@ export default class Collection implements ViewModels.Collection {
|
||||||
collection: this,
|
collection: this,
|
||||||
node: this,
|
node: this,
|
||||||
tabPath: `${this.databaseId}>${this.id()}>Conflicts`,
|
tabPath: `${this.databaseId}>${this.id()}>Conflicts`,
|
||||||
hashLocation: `${Constants.HashRoutePrefixes.collectionsWithIds(this.databaseId, this.id())}/conflicts`,
|
|
||||||
onLoadStartKey: startKey,
|
onLoadStartKey: startKey,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -413,7 +411,6 @@ export default class Collection implements ViewModels.Collection {
|
||||||
tabPath: "",
|
tabPath: "",
|
||||||
collection: this,
|
collection: this,
|
||||||
node: this,
|
node: this,
|
||||||
hashLocation: `${Constants.HashRoutePrefixes.collectionsWithIds(this.databaseId, this.id())}/entities`,
|
|
||||||
onLoadStartKey: startKey,
|
onLoadStartKey: startKey,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -462,7 +459,6 @@ export default class Collection implements ViewModels.Collection {
|
||||||
collection: this,
|
collection: this,
|
||||||
masterKey: userContext.masterKey || "",
|
masterKey: userContext.masterKey || "",
|
||||||
collectionPartitionKeyProperty: this.partitionKeyProperty,
|
collectionPartitionKeyProperty: this.partitionKeyProperty,
|
||||||
hashLocation: `${Constants.HashRoutePrefixes.collectionsWithIds(this.databaseId, this.id())}/graphs`,
|
|
||||||
collectionId: this.id(),
|
collectionId: this.id(),
|
||||||
databaseId: this.databaseId,
|
databaseId: this.databaseId,
|
||||||
isTabsContentExpanded: this.container.isTabsContentExpanded,
|
isTabsContentExpanded: this.container.isTabsContentExpanded,
|
||||||
|
@ -511,7 +507,6 @@ export default class Collection implements ViewModels.Collection {
|
||||||
tabPath: "",
|
tabPath: "",
|
||||||
collection: this,
|
collection: this,
|
||||||
node: this,
|
node: this,
|
||||||
hashLocation: `${Constants.HashRoutePrefixes.collectionsWithIds(this.databaseId, this.id())}/mongoDocuments`,
|
|
||||||
onLoadStartKey: startKey,
|
onLoadStartKey: startKey,
|
||||||
});
|
});
|
||||||
this.container.tabsManager.activateNewTab(mongoDocumentsTab);
|
this.container.tabsManager.activateNewTab(mongoDocumentsTab);
|
||||||
|
@ -556,7 +551,6 @@ export default class Collection implements ViewModels.Collection {
|
||||||
tabPath: "",
|
tabPath: "",
|
||||||
collection: this,
|
collection: this,
|
||||||
node: this,
|
node: this,
|
||||||
hashLocation: `${Constants.HashRoutePrefixes.collectionsWithIds(this.databaseId, this.id())}/schemaAnalyzer`,
|
|
||||||
onLoadStartKey: startKey,
|
onLoadStartKey: startKey,
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
@ -596,7 +590,6 @@ export default class Collection implements ViewModels.Collection {
|
||||||
tabPath: "",
|
tabPath: "",
|
||||||
collection: this,
|
collection: this,
|
||||||
node: this,
|
node: this,
|
||||||
hashLocation: `${Constants.HashRoutePrefixes.collectionsWithIds(this.databaseId, this.id())}/settings`,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
let settingsTabV2 = matchingTabs && (matchingTabs[0] as CollectionSettingsTabV2);
|
let settingsTabV2 = matchingTabs && (matchingTabs[0] as CollectionSettingsTabV2);
|
||||||
|
@ -639,7 +632,6 @@ export default class Collection implements ViewModels.Collection {
|
||||||
tabPath: "",
|
tabPath: "",
|
||||||
collection: this,
|
collection: this,
|
||||||
node: this,
|
node: this,
|
||||||
hashLocation: `${Constants.HashRoutePrefixes.collectionsWithIds(this.databaseId, this.id())}/query`,
|
|
||||||
queryText: queryText,
|
queryText: queryText,
|
||||||
partitionKey: collection.partitionKey,
|
partitionKey: collection.partitionKey,
|
||||||
onLoadStartKey: startKey,
|
onLoadStartKey: startKey,
|
||||||
|
@ -669,7 +661,6 @@ export default class Collection implements ViewModels.Collection {
|
||||||
tabPath: "",
|
tabPath: "",
|
||||||
collection: this,
|
collection: this,
|
||||||
node: this,
|
node: this,
|
||||||
hashLocation: `${Constants.HashRoutePrefixes.collectionsWithIds(this.databaseId, this.id())}/mongoQuery`,
|
|
||||||
partitionKey: collection.partitionKey,
|
partitionKey: collection.partitionKey,
|
||||||
onLoadStartKey: startKey,
|
onLoadStartKey: startKey,
|
||||||
},
|
},
|
||||||
|
@ -703,7 +694,6 @@ export default class Collection implements ViewModels.Collection {
|
||||||
collection: this,
|
collection: this,
|
||||||
masterKey: userContext.masterKey || "",
|
masterKey: userContext.masterKey || "",
|
||||||
collectionPartitionKeyProperty: this.partitionKeyProperty,
|
collectionPartitionKeyProperty: this.partitionKeyProperty,
|
||||||
hashLocation: `${Constants.HashRoutePrefixes.collectionsWithIds(this.databaseId, this.id())}/graphs`,
|
|
||||||
collectionId: this.id(),
|
collectionId: this.id(),
|
||||||
databaseId: this.databaseId,
|
databaseId: this.databaseId,
|
||||||
isTabsContentExpanded: this.container.isTabsContentExpanded,
|
isTabsContentExpanded: this.container.isTabsContentExpanded,
|
||||||
|
@ -730,7 +720,6 @@ export default class Collection implements ViewModels.Collection {
|
||||||
tabPath: "",
|
tabPath: "",
|
||||||
collection: this,
|
collection: this,
|
||||||
node: this,
|
node: this,
|
||||||
hashLocation: `${Constants.HashRoutePrefixes.collectionsWithIds(this.databaseId, this.id())}/mongoShell`,
|
|
||||||
index: index,
|
index: index,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
@ -82,7 +82,6 @@ export default class Database implements ViewModels.Database {
|
||||||
node: this,
|
node: this,
|
||||||
rid: this.rid,
|
rid: this.rid,
|
||||||
database: this,
|
database: this,
|
||||||
hashLocation: `${Constants.HashRoutePrefixes.databasesWithId(this.id())}/settings`,
|
|
||||||
onLoadStartKey: startKey,
|
onLoadStartKey: startKey,
|
||||||
};
|
};
|
||||||
settingsTab = new DatabaseSettingsTabV2(tabOptions);
|
settingsTab = new DatabaseSettingsTabV2(tabOptions);
|
||||||
|
|
|
@ -94,7 +94,6 @@ export default class ResourceTokenCollection implements ViewModels.CollectionBas
|
||||||
tabPath: "",
|
tabPath: "",
|
||||||
collection: this,
|
collection: this,
|
||||||
node: this,
|
node: this,
|
||||||
hashLocation: `${Constants.HashRoutePrefixes.collectionsWithIds(this.databaseId, this.id())}/query`,
|
|
||||||
queryText: queryText,
|
queryText: queryText,
|
||||||
partitionKey: collection.partitionKey,
|
partitionKey: collection.partitionKey,
|
||||||
onLoadStartKey: startKey,
|
onLoadStartKey: startKey,
|
||||||
|
@ -143,7 +142,6 @@ export default class ResourceTokenCollection implements ViewModels.CollectionBas
|
||||||
collection: this,
|
collection: this,
|
||||||
node: this,
|
node: this,
|
||||||
tabPath: `${this.databaseId}>${this.id()}>Documents`,
|
tabPath: `${this.databaseId}>${this.id()}>Documents`,
|
||||||
hashLocation: `${Constants.HashRoutePrefixes.collectionsWithIds(this.databaseId, this.id())}/documents`,
|
|
||||||
onLoadStartKey: startKey,
|
onLoadStartKey: startKey,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -76,7 +76,6 @@ export default class StoredProcedure {
|
||||||
tabPath: `${source.databaseId}>${source.id()}>New Stored Procedure ${id}`,
|
tabPath: `${source.databaseId}>${source.id()}>New Stored Procedure ${id}`,
|
||||||
collection: source,
|
collection: source,
|
||||||
node: source,
|
node: source,
|
||||||
hashLocation: `${Constants.HashRoutePrefixes.collectionsWithIds(source.databaseId, source.id())}/sproc`,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
collection: source,
|
collection: source,
|
||||||
|
@ -124,10 +123,6 @@ export default class StoredProcedure {
|
||||||
tabPath: `${this.collection.databaseId}>${this.collection.id()}>${storedProcedureData.id}`,
|
tabPath: `${this.collection.databaseId}>${this.collection.id()}>${storedProcedureData.id}`,
|
||||||
collection: this.collection,
|
collection: this.collection,
|
||||||
node: this,
|
node: this,
|
||||||
hashLocation: `${Constants.HashRoutePrefixes.collectionsWithIds(
|
|
||||||
this.collection.databaseId,
|
|
||||||
this.collection.id()
|
|
||||||
)}/sprocs/${this.id()}`,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
collection: this.collection,
|
collection: this.collection,
|
||||||
|
|
|
@ -57,7 +57,6 @@ export default class Trigger {
|
||||||
tabPath: "",
|
tabPath: "",
|
||||||
collection: source,
|
collection: source,
|
||||||
node: source,
|
node: source,
|
||||||
hashLocation: `${Constants.HashRoutePrefixes.collectionsWithIds(source.databaseId, source.id())}/trigger`,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
source.container.tabsManager.activateNewTab(triggerTab);
|
source.container.tabsManager.activateNewTab(triggerTab);
|
||||||
|
@ -92,10 +91,6 @@ export default class Trigger {
|
||||||
tabPath: "",
|
tabPath: "",
|
||||||
collection: this.collection,
|
collection: this.collection,
|
||||||
node: this,
|
node: this,
|
||||||
hashLocation: `${Constants.HashRoutePrefixes.collectionsWithIds(
|
|
||||||
this.collection.databaseId,
|
|
||||||
this.collection.id()
|
|
||||||
)}/triggers/${this.id()}`,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
this.container.tabsManager.activateNewTab(triggerTab);
|
this.container.tabsManager.activateNewTab(triggerTab);
|
||||||
|
|
|
@ -43,7 +43,6 @@ export default class UserDefinedFunction {
|
||||||
tabPath: "",
|
tabPath: "",
|
||||||
collection: source,
|
collection: source,
|
||||||
node: source,
|
node: source,
|
||||||
hashLocation: `${Constants.HashRoutePrefixes.collectionsWithIds(source.databaseId, source.id())}/udf`,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
source.container.tabsManager.activateNewTab(userDefinedFunctionTab);
|
source.container.tabsManager.activateNewTab(userDefinedFunctionTab);
|
||||||
|
@ -76,10 +75,6 @@ export default class UserDefinedFunction {
|
||||||
tabPath: "",
|
tabPath: "",
|
||||||
collection: this.collection,
|
collection: this.collection,
|
||||||
node: this,
|
node: this,
|
||||||
hashLocation: `${Constants.HashRoutePrefixes.collectionsWithIds(
|
|
||||||
this.collection.databaseId,
|
|
||||||
this.collection.id()
|
|
||||||
)}/udfs/${this.id()}`,
|
|
||||||
});
|
});
|
||||||
|
|
||||||
this.container.tabsManager.activateNewTab(userDefinedFunctionTab);
|
this.container.tabsManager.activateNewTab(userDefinedFunctionTab);
|
||||||
|
|
|
@ -1,35 +0,0 @@
|
||||||
import { MessageTypes } from "../Contracts/ExplorerContracts";
|
|
||||||
import { sendMessage } from "../Common/MessageHandler";
|
|
||||||
import { TabRouteHandler } from "./TabRouteHandler";
|
|
||||||
|
|
||||||
export class RouteHandler {
|
|
||||||
private static _instance: RouteHandler;
|
|
||||||
private _tabRouteHandler: TabRouteHandler;
|
|
||||||
|
|
||||||
private constructor() {
|
|
||||||
this._tabRouteHandler = new TabRouteHandler();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static getInstance(): RouteHandler {
|
|
||||||
if (!RouteHandler._instance) {
|
|
||||||
RouteHandler._instance = new RouteHandler();
|
|
||||||
}
|
|
||||||
|
|
||||||
return RouteHandler._instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
public initHandler(): void {
|
|
||||||
this._tabRouteHandler.initRouteHandler();
|
|
||||||
}
|
|
||||||
|
|
||||||
public parseHash(hash: string): void {
|
|
||||||
this._tabRouteHandler.parseHash(hash);
|
|
||||||
}
|
|
||||||
|
|
||||||
public updateRouteHashLocation(hash: string): void {
|
|
||||||
sendMessage({
|
|
||||||
type: MessageTypes.UpdateLocationHash,
|
|
||||||
locationHash: hash,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,102 +0,0 @@
|
||||||
import crossroads from "crossroads";
|
|
||||||
import hasher from "hasher";
|
|
||||||
|
|
||||||
import * as Constants from "../Common/Constants";
|
|
||||||
import Explorer from "../Explorer/Explorer";
|
|
||||||
import { TabRouteHandler } from "./TabRouteHandler";
|
|
||||||
|
|
||||||
describe("TabRouteHandler", () => {
|
|
||||||
let tabRouteHandler: TabRouteHandler;
|
|
||||||
|
|
||||||
beforeAll(() => {
|
|
||||||
(<any>window).dataExplorer = new Explorer(); // create a mock to avoid null refs
|
|
||||||
});
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
tabRouteHandler = new TabRouteHandler();
|
|
||||||
});
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
crossroads.removeAllRoutes();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("Route Handling", () => {
|
|
||||||
let routedSpy: jasmine.Spy;
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
routedSpy = jasmine.createSpy("Routed spy");
|
|
||||||
const onMatch = (request: string, data: { route: any; params: string[]; isFirst: boolean }) => {
|
|
||||||
routedSpy(request, data);
|
|
||||||
};
|
|
||||||
tabRouteHandler.initRouteHandler(onMatch);
|
|
||||||
});
|
|
||||||
|
|
||||||
function validateRouteWithParams(route: string, routeParams: string[]): void {
|
|
||||||
hasher.setHash(route);
|
|
||||||
expect(routedSpy).toHaveBeenCalledWith(
|
|
||||||
route,
|
|
||||||
jasmine.objectContaining({ params: jasmine.arrayContaining(routeParams) })
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
it("should include a route for documents tab", () => {
|
|
||||||
validateRouteWithParams(`${Constants.HashRoutePrefixes.collectionsWithIds("1", "2")}/documents`, ["1", "2"]);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("should include a route for entities tab", () => {
|
|
||||||
validateRouteWithParams(`${Constants.HashRoutePrefixes.collectionsWithIds("1", "2")}/entities`, ["1", "2"]);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("should include a route for graphs tab", () => {
|
|
||||||
validateRouteWithParams(`${Constants.HashRoutePrefixes.collectionsWithIds("1", "2")}/graphs`, ["1", "2"]);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("should include a route for mongo documents tab", () => {
|
|
||||||
validateRouteWithParams(`${Constants.HashRoutePrefixes.collectionsWithIds("1", "2")}/mongoDocuments`, ["1", "2"]);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("should include a route for mongo shell", () => {
|
|
||||||
validateRouteWithParams(`${Constants.HashRoutePrefixes.collectionsWithIds("1", "2")}/mongoShell`, ["1", "2"]);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("should include a route for query tab", () => {
|
|
||||||
validateRouteWithParams(`${Constants.HashRoutePrefixes.collectionsWithIds("1", "2")}/query`, ["1", "2"]);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("should include a route for database settings tab", () => {
|
|
||||||
validateRouteWithParams(`${Constants.HashRoutePrefixes.databasesWithId("1")}/settings`, ["1"]);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("should include a route for settings tab", () => {
|
|
||||||
validateRouteWithParams(`${Constants.HashRoutePrefixes.collectionsWithIds("1", "2")}/settings`, ["1", "2"]);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("should include a route for new stored procedure tab", () => {
|
|
||||||
validateRouteWithParams(`${Constants.HashRoutePrefixes.collectionsWithIds("1", "2")}/sproc`, ["1", "2"]);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("should include a route for stored procedure tab", () => {
|
|
||||||
validateRouteWithParams(`${Constants.HashRoutePrefixes.collectionsWithIds("1", "2")}/sprocs/3`, ["1", "2", "3"]);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("should include a route for new trigger tab", () => {
|
|
||||||
validateRouteWithParams(`${Constants.HashRoutePrefixes.collectionsWithIds("1", "2")}/trigger`, ["1", "2"]);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("should include a route for trigger tab", () => {
|
|
||||||
validateRouteWithParams(`${Constants.HashRoutePrefixes.collectionsWithIds("1", "2")}/triggers/3`, [
|
|
||||||
"1",
|
|
||||||
"2",
|
|
||||||
"3",
|
|
||||||
]);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("should include a route for new UDF tab", () => {
|
|
||||||
validateRouteWithParams(`${Constants.HashRoutePrefixes.collectionsWithIds("1", "2")}/udf`, ["1", "2"]);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("should include a route for UDF tab", () => {
|
|
||||||
validateRouteWithParams(`${Constants.HashRoutePrefixes.collectionsWithIds("1", "2")}/udfs/3`, ["1", "2", "3"]);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,407 +0,0 @@
|
||||||
import crossroads from "crossroads";
|
|
||||||
import hasher from "hasher";
|
|
||||||
import * as _ from "underscore";
|
|
||||||
import * as Constants from "../Common/Constants";
|
|
||||||
import * as ViewModels from "../Contracts/ViewModels";
|
|
||||||
import ScriptTabBase from "../Explorer/Tabs/ScriptTabBase";
|
|
||||||
import TabsBase from "../Explorer/Tabs/TabsBase";
|
|
||||||
import { useDatabases } from "../Explorer/useDatabases";
|
|
||||||
import { userContext } from "../UserContext";
|
|
||||||
|
|
||||||
export class TabRouteHandler {
|
|
||||||
private _tabRouter: any;
|
|
||||||
|
|
||||||
constructor() {}
|
|
||||||
|
|
||||||
public initRouteHandler(
|
|
||||||
onMatch?: (request: string, data: { route: any; params: string[]; isFirst: boolean }) => void
|
|
||||||
): void {
|
|
||||||
this._initRouter();
|
|
||||||
const parseHash = (newHash: string, oldHash: string) => this._tabRouter.parse(newHash);
|
|
||||||
const defaultRoutedCallback = (request: string, data: { route: any; params: string[]; isFirst: boolean }) => {};
|
|
||||||
this._tabRouter.routed.add(onMatch || defaultRoutedCallback);
|
|
||||||
hasher.initialized.add(parseHash);
|
|
||||||
hasher.changed.add(parseHash);
|
|
||||||
hasher.init();
|
|
||||||
}
|
|
||||||
|
|
||||||
public parseHash(hash: string): void {
|
|
||||||
this._tabRouter.parse(hash);
|
|
||||||
}
|
|
||||||
|
|
||||||
private _initRouter() {
|
|
||||||
this._tabRouter = crossroads.create();
|
|
||||||
this._setupTabRoutesForRouter();
|
|
||||||
}
|
|
||||||
|
|
||||||
private _setupTabRoutesForRouter(): void {
|
|
||||||
this._tabRouter.addRoute(
|
|
||||||
`${Constants.HashRoutePrefixes.collections}/documents`,
|
|
||||||
(db_id: string, coll_id: string) => {
|
|
||||||
this._openDocumentsTabForResource(db_id, coll_id);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
this._tabRouter.addRoute(
|
|
||||||
`${Constants.HashRoutePrefixes.collections}/entities`,
|
|
||||||
(db_id: string, coll_id: string) => {
|
|
||||||
this._openEntitiesTabForResource(db_id, coll_id);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
this._tabRouter.addRoute(`${Constants.HashRoutePrefixes.collections}/graphs`, (db_id: string, coll_id: string) => {
|
|
||||||
this._openGraphTabForResource(db_id, coll_id);
|
|
||||||
});
|
|
||||||
|
|
||||||
this._tabRouter.addRoute(
|
|
||||||
`${Constants.HashRoutePrefixes.collections}/mongoDocuments`,
|
|
||||||
(db_id: string, coll_id: string) => {
|
|
||||||
this._openMongoDocumentsTabForResource(db_id, coll_id);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
this._tabRouter.addRoute(
|
|
||||||
`${Constants.HashRoutePrefixes.collections}/schemaAnalyzer`,
|
|
||||||
(db_id: string, coll_id: string) => {
|
|
||||||
this._openSchemaAnalyzerTabForResource(db_id, coll_id);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
this._tabRouter.addRoute(
|
|
||||||
`${Constants.HashRoutePrefixes.collections}/mongoQuery`,
|
|
||||||
(db_id: string, coll_id: string) => {
|
|
||||||
this._openMongoQueryTabForResource(db_id, coll_id);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
this._tabRouter.addRoute(
|
|
||||||
`${Constants.HashRoutePrefixes.collections}/mongoShell`,
|
|
||||||
(db_id: string, coll_id: string) => {
|
|
||||||
this._openMongoShellTabForResource(db_id, coll_id);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
this._tabRouter.addRoute(`${Constants.HashRoutePrefixes.collections}/query`, (db_id: string, coll_id: string) => {
|
|
||||||
this._openQueryTabForResource(db_id, coll_id);
|
|
||||||
});
|
|
||||||
|
|
||||||
this._tabRouter.addRoute(`${Constants.HashRoutePrefixes.databases}/settings`, (db_id: string) => {
|
|
||||||
this._openDatabaseSettingsTabForResource(db_id);
|
|
||||||
});
|
|
||||||
|
|
||||||
this._tabRouter.addRoute(
|
|
||||||
`${Constants.HashRoutePrefixes.collections}/settings`,
|
|
||||||
(db_id: string, coll_id: string) => {
|
|
||||||
this._openSettingsTabForResource(db_id, coll_id);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
this._tabRouter.addRoute(`${Constants.HashRoutePrefixes.collections}/sproc`, (db_id: string, coll_id: string) => {
|
|
||||||
this._openNewSprocTabForResource(db_id, coll_id);
|
|
||||||
});
|
|
||||||
|
|
||||||
this._tabRouter.addRoute(
|
|
||||||
`${Constants.HashRoutePrefixes.collections}/sprocs/{sproc_id}`,
|
|
||||||
(db_id: string, coll_id: string, sproc_id: string) => {
|
|
||||||
this._openSprocTabForResource(db_id, coll_id, sproc_id);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
this._tabRouter.addRoute(`${Constants.HashRoutePrefixes.collections}/trigger`, (db_id: string, coll_id: string) => {
|
|
||||||
this._openNewTriggerTabForResource(db_id, coll_id);
|
|
||||||
});
|
|
||||||
|
|
||||||
this._tabRouter.addRoute(
|
|
||||||
`${Constants.HashRoutePrefixes.collections}/triggers/{trigger_id}`,
|
|
||||||
(db_id: string, coll_id: string, trigger_id: string) => {
|
|
||||||
this._openTriggerTabForResource(db_id, coll_id, trigger_id);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
this._tabRouter.addRoute(`${Constants.HashRoutePrefixes.collections}/udf`, (db_id: string, coll_id: string) => {
|
|
||||||
this._openNewUserDefinedFunctionTabForResource(db_id, coll_id);
|
|
||||||
});
|
|
||||||
|
|
||||||
this._tabRouter.addRoute(
|
|
||||||
`${Constants.HashRoutePrefixes.collections}/udfs/{udf_id}`,
|
|
||||||
(db_id: string, coll_id: string, udf_id: string) => {
|
|
||||||
this._openUserDefinedFunctionTabForResource(db_id, coll_id, udf_id);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
this._tabRouter.addRoute(
|
|
||||||
`${Constants.HashRoutePrefixes.collections}/conflicts`,
|
|
||||||
(db_id: string, coll_id: string) => {
|
|
||||||
this._openConflictsTabForResource(db_id, coll_id);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
private _openDocumentsTabForResource(databaseId: string, collectionId: string): void {
|
|
||||||
this._executeActionHelper(() => {
|
|
||||||
const collection: ViewModels.Collection = this._findAndExpandMatchingCollectionForResource(
|
|
||||||
databaseId,
|
|
||||||
collectionId
|
|
||||||
);
|
|
||||||
userContext.apiType === "SQL" && collection?.onDocumentDBDocumentsClick();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private _openEntitiesTabForResource(databaseId: string, collectionId: string): void {
|
|
||||||
this._executeActionHelper(() => {
|
|
||||||
const collection: ViewModels.Collection = this._findAndExpandMatchingCollectionForResource(
|
|
||||||
databaseId,
|
|
||||||
collectionId
|
|
||||||
);
|
|
||||||
collection &&
|
|
||||||
collection.container &&
|
|
||||||
(userContext.apiType === "Tables" || userContext.apiType === "Cassandra") &&
|
|
||||||
collection.onTableEntitiesClick();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private _openGraphTabForResource(databaseId: string, collectionId: string): void {
|
|
||||||
this._executeActionHelper(() => {
|
|
||||||
const collection: ViewModels.Collection = this._findAndExpandMatchingCollectionForResource(
|
|
||||||
databaseId,
|
|
||||||
collectionId
|
|
||||||
);
|
|
||||||
userContext.apiType === "Gremlin" && collection.onGraphDocumentsClick();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private _openMongoDocumentsTabForResource(databaseId: string, collectionId: string): void {
|
|
||||||
this._executeActionHelper(() => {
|
|
||||||
const collection: ViewModels.Collection = this._findAndExpandMatchingCollectionForResource(
|
|
||||||
databaseId,
|
|
||||||
collectionId
|
|
||||||
);
|
|
||||||
userContext.apiType === "Mongo" && collection.onMongoDBDocumentsClick();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private _openSchemaAnalyzerTabForResource(databaseId: string, collectionId: string): void {
|
|
||||||
this._executeActionHelper(() => {
|
|
||||||
const collection: ViewModels.Collection = this._findAndExpandMatchingCollectionForResource(
|
|
||||||
databaseId,
|
|
||||||
collectionId
|
|
||||||
);
|
|
||||||
collection && userContext.apiType === "Mongo" && collection.onSchemaAnalyzerClick();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private _openQueryTabForResource(databaseId: string, collectionId: string): void {
|
|
||||||
this._executeActionHelper(() => {
|
|
||||||
const collection: ViewModels.Collection = this._findAndExpandMatchingCollectionForResource(
|
|
||||||
databaseId,
|
|
||||||
collectionId
|
|
||||||
);
|
|
||||||
const matchingTab: TabsBase = this._findMatchingTabByTabKind(
|
|
||||||
databaseId,
|
|
||||||
collectionId,
|
|
||||||
ViewModels.CollectionTabKind.Query
|
|
||||||
);
|
|
||||||
if (!!matchingTab) {
|
|
||||||
matchingTab.onTabClick();
|
|
||||||
} else {
|
|
||||||
collection && collection.onNewQueryClick(collection, null);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private _openMongoQueryTabForResource(databaseId: string, collectionId: string): void {
|
|
||||||
this._executeActionHelper(() => {
|
|
||||||
const collection: ViewModels.Collection = this._findAndExpandMatchingCollectionForResource(
|
|
||||||
databaseId,
|
|
||||||
collectionId
|
|
||||||
);
|
|
||||||
const matchingTab: TabsBase = this._findMatchingTabByTabKind(
|
|
||||||
databaseId,
|
|
||||||
collectionId,
|
|
||||||
ViewModels.CollectionTabKind.Query
|
|
||||||
);
|
|
||||||
if (!!matchingTab) {
|
|
||||||
matchingTab.onTabClick();
|
|
||||||
} else {
|
|
||||||
userContext.apiType === "Mongo" && collection.onNewMongoQueryClick(collection, null);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private _openMongoShellTabForResource(databaseId: string, collectionId: string): void {
|
|
||||||
this._executeActionHelper(() => {
|
|
||||||
const collection: ViewModels.Collection = this._findAndExpandMatchingCollectionForResource(
|
|
||||||
databaseId,
|
|
||||||
collectionId
|
|
||||||
);
|
|
||||||
const matchingTab: TabsBase = this._findMatchingTabByTabKind(
|
|
||||||
databaseId,
|
|
||||||
collectionId,
|
|
||||||
ViewModels.CollectionTabKind.MongoShell
|
|
||||||
);
|
|
||||||
if (!!matchingTab) {
|
|
||||||
matchingTab.onTabClick();
|
|
||||||
} else {
|
|
||||||
userContext.apiType === "Mongo" && collection.onNewMongoShellClick();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private _openDatabaseSettingsTabForResource(databaseId: string): void {
|
|
||||||
this._executeActionHelper(() => {
|
|
||||||
const database: ViewModels.Database = _.find(
|
|
||||||
useDatabases.getState().databases,
|
|
||||||
(database: ViewModels.Database) => database.id() === databaseId
|
|
||||||
);
|
|
||||||
database?.onSettingsClick();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private _openSettingsTabForResource(databaseId: string, collectionId: string): void {
|
|
||||||
this._executeActionHelper(() => {
|
|
||||||
const collection: ViewModels.Collection = this._findAndExpandMatchingCollectionForResource(
|
|
||||||
databaseId,
|
|
||||||
collectionId
|
|
||||||
);
|
|
||||||
collection && collection.onSettingsClick();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private _openNewSprocTabForResource(databaseId: string, collectionId: string): void {
|
|
||||||
this._executeActionHelper(() => {
|
|
||||||
const collection: ViewModels.Collection = this._findAndExpandMatchingCollectionForResource(
|
|
||||||
databaseId,
|
|
||||||
collectionId
|
|
||||||
);
|
|
||||||
const matchingTab: TabsBase = this._findMatchingTabByTabKind(
|
|
||||||
databaseId,
|
|
||||||
collectionId,
|
|
||||||
ViewModels.CollectionTabKind.StoredProcedures,
|
|
||||||
true
|
|
||||||
);
|
|
||||||
if (!!matchingTab) {
|
|
||||||
matchingTab.onTabClick();
|
|
||||||
} else {
|
|
||||||
collection && collection.onNewStoredProcedureClick(collection, null);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private _openSprocTabForResource(databaseId: string, collectionId: string, sprocId: string): void {
|
|
||||||
this._executeActionHelper(() => {
|
|
||||||
const collection: ViewModels.Collection = this._findMatchingCollectionForResource(databaseId, collectionId);
|
|
||||||
collection && collection.expandCollection();
|
|
||||||
const storedProcedure = collection && collection.findStoredProcedureWithId(sprocId);
|
|
||||||
storedProcedure && storedProcedure.open();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private _openNewTriggerTabForResource(databaseId: string, collectionId: string): void {
|
|
||||||
this._executeActionHelper(() => {
|
|
||||||
const collection: ViewModels.Collection = this._findAndExpandMatchingCollectionForResource(
|
|
||||||
databaseId,
|
|
||||||
collectionId
|
|
||||||
);
|
|
||||||
const matchingTab: TabsBase = this._findMatchingTabByTabKind(
|
|
||||||
databaseId,
|
|
||||||
collectionId,
|
|
||||||
ViewModels.CollectionTabKind.Triggers,
|
|
||||||
true
|
|
||||||
);
|
|
||||||
if (!!matchingTab) {
|
|
||||||
matchingTab.onTabClick();
|
|
||||||
} else {
|
|
||||||
collection && collection.onNewTriggerClick(collection, null);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private _openTriggerTabForResource(databaseId: string, collectionId: string, triggerId: string): void {
|
|
||||||
this._executeActionHelper(() => {
|
|
||||||
const collection: ViewModels.Collection = this._findMatchingCollectionForResource(databaseId, collectionId);
|
|
||||||
collection && collection.expandCollection();
|
|
||||||
const trigger = collection && collection.findTriggerWithId(triggerId);
|
|
||||||
trigger && trigger.open();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private _openNewUserDefinedFunctionTabForResource(databaseId: string, collectionId: string): void {
|
|
||||||
this._executeActionHelper(() => {
|
|
||||||
const collection: ViewModels.Collection = this._findAndExpandMatchingCollectionForResource(
|
|
||||||
databaseId,
|
|
||||||
collectionId
|
|
||||||
);
|
|
||||||
const matchingTab: TabsBase = this._findMatchingTabByTabKind(
|
|
||||||
databaseId,
|
|
||||||
collectionId,
|
|
||||||
ViewModels.CollectionTabKind.UserDefinedFunctions,
|
|
||||||
true
|
|
||||||
);
|
|
||||||
if (!!matchingTab) {
|
|
||||||
matchingTab.onTabClick();
|
|
||||||
} else {
|
|
||||||
collection && collection.onNewUserDefinedFunctionClick(collection, null);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private _openUserDefinedFunctionTabForResource(databaseId: string, collectionId: string, udfId: string): void {
|
|
||||||
this._executeActionHelper(() => {
|
|
||||||
const collection: ViewModels.Collection = this._findMatchingCollectionForResource(databaseId, collectionId);
|
|
||||||
collection && collection.expandCollection();
|
|
||||||
const userDefinedFunction = collection && collection.findUserDefinedFunctionWithId(udfId);
|
|
||||||
userDefinedFunction && userDefinedFunction.open();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private _openConflictsTabForResource(databaseId: string, collectionId: string): void {
|
|
||||||
this._executeActionHelper(() => {
|
|
||||||
const collection: ViewModels.Collection = this._findAndExpandMatchingCollectionForResource(
|
|
||||||
databaseId,
|
|
||||||
collectionId
|
|
||||||
);
|
|
||||||
collection && collection.container && collection.onConflictsClick();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private _findAndExpandMatchingCollectionForResource(databaseId: string, collectionId: string): ViewModels.Collection {
|
|
||||||
const matchedCollection: ViewModels.Collection = this._findMatchingCollectionForResource(databaseId, collectionId);
|
|
||||||
matchedCollection && matchedCollection.expandCollection();
|
|
||||||
|
|
||||||
return matchedCollection;
|
|
||||||
}
|
|
||||||
|
|
||||||
private _findMatchingTabByTabKind(
|
|
||||||
databaseId: string,
|
|
||||||
collectionId: string,
|
|
||||||
tabKind: ViewModels.CollectionTabKind,
|
|
||||||
isNewScriptTab?: boolean
|
|
||||||
): TabsBase {
|
|
||||||
const explorer = window.dataExplorer;
|
|
||||||
const matchingTabs: TabsBase[] = explorer.tabsManager.getTabs(
|
|
||||||
tabKind,
|
|
||||||
(tab: TabsBase) =>
|
|
||||||
tab.collection &&
|
|
||||||
tab.collection.databaseId === databaseId &&
|
|
||||||
tab.collection.id() === collectionId &&
|
|
||||||
(!isNewScriptTab || (tab as ScriptTabBase).isNew())
|
|
||||||
);
|
|
||||||
return matchingTabs && matchingTabs[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
private _findMatchingCollectionForResource(databaseId: string, collectionId: string): ViewModels.Collection {
|
|
||||||
const explorer = window.dataExplorer;
|
|
||||||
const matchedDatabase: ViewModels.Database = useDatabases.getState().findDatabaseWithId(databaseId);
|
|
||||||
const matchedCollection: ViewModels.Collection =
|
|
||||||
matchedDatabase && matchedDatabase.findCollectionWithId(collectionId);
|
|
||||||
|
|
||||||
return matchedCollection;
|
|
||||||
}
|
|
||||||
|
|
||||||
private _executeActionHelper(action: () => void): void {
|
|
||||||
const explorer = window.dataExplorer;
|
|
||||||
if (explorer && explorer.isAccountReady()) {
|
|
||||||
action();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue