Remove Explorer.isPreferredDocumentDB (#653)
This commit is contained in:
parent
56f430ebd8
commit
1685b34e2a
|
@ -55,7 +55,7 @@ export class ResourceTreeContextMenuButtonFactory {
|
||||||
selectedCollection: ViewModels.Collection
|
selectedCollection: ViewModels.Collection
|
||||||
): TreeNodeMenuItem[] {
|
): TreeNodeMenuItem[] {
|
||||||
const items: TreeNodeMenuItem[] = [];
|
const items: TreeNodeMenuItem[] = [];
|
||||||
if (container.isPreferredApiDocumentDB() || container.isPreferredApiGraph()) {
|
if (userContext.apiType === "SQL" || container.isPreferredApiGraph()) {
|
||||||
items.push({
|
items.push({
|
||||||
iconSrc: AddSqlQueryIcon,
|
iconSrc: AddSqlQueryIcon,
|
||||||
onClick: () => selectedCollection && selectedCollection.onNewQueryClick(selectedCollection, null),
|
onClick: () => selectedCollection && selectedCollection.onNewQueryClick(selectedCollection, null),
|
||||||
|
@ -80,7 +80,7 @@ export class ResourceTreeContextMenuButtonFactory {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (container.isPreferredApiDocumentDB() || container.isPreferredApiGraph()) {
|
if (userContext.apiType === "SQL" || container.isPreferredApiGraph()) {
|
||||||
items.push({
|
items.push({
|
||||||
iconSrc: AddStoredProcedureIcon,
|
iconSrc: AddStoredProcedureIcon,
|
||||||
onClick: () => {
|
onClick: () => {
|
||||||
|
|
|
@ -1,14 +1,12 @@
|
||||||
import { shallow } from "enzyme";
|
import { shallow } from "enzyme";
|
||||||
import React from "react";
|
|
||||||
import { SubSettingsComponent, SubSettingsComponentProps } from "./SubSettingsComponent";
|
|
||||||
import { container, collection } from "../TestUtils";
|
|
||||||
import { TtlType, GeospatialConfigType, ChangeFeedPolicyState, TtlOnNoDefault, TtlOn, TtlOff } from "../SettingsUtils";
|
|
||||||
import ko from "knockout";
|
import ko from "knockout";
|
||||||
|
import React from "react";
|
||||||
import Explorer from "../../../Explorer";
|
import Explorer from "../../../Explorer";
|
||||||
|
import { ChangeFeedPolicyState, GeospatialConfigType, TtlOff, TtlOn, TtlOnNoDefault, TtlType } from "../SettingsUtils";
|
||||||
|
import { collection, container } from "../TestUtils";
|
||||||
|
import { SubSettingsComponent, SubSettingsComponentProps } from "./SubSettingsComponent";
|
||||||
|
|
||||||
describe("SubSettingsComponent", () => {
|
describe("SubSettingsComponent", () => {
|
||||||
container.isPreferredApiDocumentDB = ko.computed(() => true);
|
|
||||||
|
|
||||||
const baseProps: SubSettingsComponentProps = {
|
const baseProps: SubSettingsComponentProps = {
|
||||||
collection: collection,
|
collection: collection,
|
||||||
container: container,
|
container: container,
|
||||||
|
|
|
@ -1,28 +1,29 @@
|
||||||
|
import { ChoiceGroup, IChoiceGroupOption, Label, MessageBar, Stack, Text, TextField } from "office-ui-fabric-react";
|
||||||
import * as React from "react";
|
import * as React from "react";
|
||||||
import * as ViewModels from "../../../../Contracts/ViewModels";
|
import * as ViewModels from "../../../../Contracts/ViewModels";
|
||||||
import {
|
import { userContext } from "../../../../UserContext";
|
||||||
GeospatialConfigType,
|
|
||||||
TtlType,
|
|
||||||
ChangeFeedPolicyState,
|
|
||||||
isDirty,
|
|
||||||
IsComponentDirtyResult,
|
|
||||||
TtlOn,
|
|
||||||
TtlOff,
|
|
||||||
TtlOnNoDefault,
|
|
||||||
getSanitizedInputValue,
|
|
||||||
} from "../SettingsUtils";
|
|
||||||
import Explorer from "../../../Explorer";
|
import Explorer from "../../../Explorer";
|
||||||
import { Int32 } from "../../../Panes/Tables/Validators/EntityPropertyValidationCommon";
|
import { Int32 } from "../../../Panes/Tables/Validators/EntityPropertyValidationCommon";
|
||||||
import { Label, Text, TextField, Stack, IChoiceGroupOption, ChoiceGroup, MessageBar } from "office-ui-fabric-react";
|
|
||||||
import {
|
import {
|
||||||
getTextFieldStyles,
|
|
||||||
changeFeedPolicyToolTip,
|
changeFeedPolicyToolTip,
|
||||||
|
getChoiceGroupStyles,
|
||||||
|
getTextFieldStyles,
|
||||||
|
messageBarStyles,
|
||||||
subComponentStackProps,
|
subComponentStackProps,
|
||||||
titleAndInputStackProps,
|
titleAndInputStackProps,
|
||||||
getChoiceGroupStyles,
|
|
||||||
ttlWarning,
|
ttlWarning,
|
||||||
messageBarStyles,
|
|
||||||
} from "../SettingsRenderUtils";
|
} from "../SettingsRenderUtils";
|
||||||
|
import {
|
||||||
|
ChangeFeedPolicyState,
|
||||||
|
GeospatialConfigType,
|
||||||
|
getSanitizedInputValue,
|
||||||
|
IsComponentDirtyResult,
|
||||||
|
isDirty,
|
||||||
|
TtlOff,
|
||||||
|
TtlOn,
|
||||||
|
TtlOnNoDefault,
|
||||||
|
TtlType,
|
||||||
|
} from "../SettingsUtils";
|
||||||
import { ToolTipLabelComponent } from "./ToolTipLabelComponent";
|
import { ToolTipLabelComponent } from "./ToolTipLabelComponent";
|
||||||
|
|
||||||
export interface SubSettingsComponentProps {
|
export interface SubSettingsComponentProps {
|
||||||
|
@ -68,7 +69,7 @@ export class SubSettingsComponent extends React.Component<SubSettingsComponentPr
|
||||||
constructor(props: SubSettingsComponentProps) {
|
constructor(props: SubSettingsComponentProps) {
|
||||||
super(props);
|
super(props);
|
||||||
this.ttlVisible = (this.props.container && !this.props.container.isPreferredApiCassandra()) || false;
|
this.ttlVisible = (this.props.container && !this.props.container.isPreferredApiCassandra()) || false;
|
||||||
this.geospatialVisible = this.props.container.isPreferredApiDocumentDB();
|
this.geospatialVisible = userContext.apiType === "SQL";
|
||||||
this.partitionKeyValue = "/" + this.props.collection.partitionKeyProperty;
|
this.partitionKeyValue = "/" + this.props.collection.partitionKeyProperty;
|
||||||
this.partitionKeyName = this.props.container.isPreferredApiMongoDB() ? "Shard key" : "Partition key";
|
this.partitionKeyName = this.props.container.isPreferredApiMongoDB() ? "Shard key" : "Partition key";
|
||||||
}
|
}
|
||||||
|
|
|
@ -648,7 +648,6 @@ exports[`SettingsComponent renders 1`] = `
|
||||||
"isNotebookEnabled": [Function],
|
"isNotebookEnabled": [Function],
|
||||||
"isNotebooksEnabledForAccount": [Function],
|
"isNotebooksEnabledForAccount": [Function],
|
||||||
"isPreferredApiCassandra": [Function],
|
"isPreferredApiCassandra": [Function],
|
||||||
"isPreferredApiDocumentDB": [Function],
|
|
||||||
"isPreferredApiGraph": [Function],
|
"isPreferredApiGraph": [Function],
|
||||||
"isPreferredApiMongoDB": [Function],
|
"isPreferredApiMongoDB": [Function],
|
||||||
"isPreferredApiTable": [Function],
|
"isPreferredApiTable": [Function],
|
||||||
|
@ -1413,7 +1412,6 @@ exports[`SettingsComponent renders 1`] = `
|
||||||
"isNotebookEnabled": [Function],
|
"isNotebookEnabled": [Function],
|
||||||
"isNotebooksEnabledForAccount": [Function],
|
"isNotebooksEnabledForAccount": [Function],
|
||||||
"isPreferredApiCassandra": [Function],
|
"isPreferredApiCassandra": [Function],
|
||||||
"isPreferredApiDocumentDB": [Function],
|
|
||||||
"isPreferredApiGraph": [Function],
|
"isPreferredApiGraph": [Function],
|
||||||
"isPreferredApiMongoDB": [Function],
|
"isPreferredApiMongoDB": [Function],
|
||||||
"isPreferredApiTable": [Function],
|
"isPreferredApiTable": [Function],
|
||||||
|
@ -2191,7 +2189,6 @@ exports[`SettingsComponent renders 1`] = `
|
||||||
"isNotebookEnabled": [Function],
|
"isNotebookEnabled": [Function],
|
||||||
"isNotebooksEnabledForAccount": [Function],
|
"isNotebooksEnabledForAccount": [Function],
|
||||||
"isPreferredApiCassandra": [Function],
|
"isPreferredApiCassandra": [Function],
|
||||||
"isPreferredApiDocumentDB": [Function],
|
|
||||||
"isPreferredApiGraph": [Function],
|
"isPreferredApiGraph": [Function],
|
||||||
"isPreferredApiMongoDB": [Function],
|
"isPreferredApiMongoDB": [Function],
|
||||||
"isPreferredApiTable": [Function],
|
"isPreferredApiTable": [Function],
|
||||||
|
@ -2956,7 +2953,6 @@ exports[`SettingsComponent renders 1`] = `
|
||||||
"isNotebookEnabled": [Function],
|
"isNotebookEnabled": [Function],
|
||||||
"isNotebooksEnabledForAccount": [Function],
|
"isNotebooksEnabledForAccount": [Function],
|
||||||
"isPreferredApiCassandra": [Function],
|
"isPreferredApiCassandra": [Function],
|
||||||
"isPreferredApiDocumentDB": [Function],
|
|
||||||
"isPreferredApiGraph": [Function],
|
"isPreferredApiGraph": [Function],
|
||||||
"isPreferredApiMongoDB": [Function],
|
"isPreferredApiMongoDB": [Function],
|
||||||
"isPreferredApiTable": [Function],
|
"isPreferredApiTable": [Function],
|
||||||
|
|
|
@ -4,6 +4,7 @@ jest.mock("../../Common/dataAccess/createDocument");
|
||||||
import * as ko from "knockout";
|
import * as ko from "knockout";
|
||||||
import Q from "q";
|
import Q from "q";
|
||||||
import { createDocument } from "../../Common/dataAccess/createDocument";
|
import { createDocument } from "../../Common/dataAccess/createDocument";
|
||||||
|
import { DatabaseAccount } from "../../Contracts/DataModels";
|
||||||
import * as ViewModels from "../../Contracts/ViewModels";
|
import * as ViewModels from "../../Contracts/ViewModels";
|
||||||
import { updateUserContext } from "../../UserContext";
|
import { updateUserContext } from "../../UserContext";
|
||||||
import Explorer from "../Explorer";
|
import Explorer from "../Explorer";
|
||||||
|
@ -15,7 +16,6 @@ describe("ContainerSampleGenerator", () => {
|
||||||
explorerStub.databases = ko.observableArray<ViewModels.Database>([database]);
|
explorerStub.databases = ko.observableArray<ViewModels.Database>([database]);
|
||||||
explorerStub.isPreferredApiGraph = ko.computed<boolean>(() => false);
|
explorerStub.isPreferredApiGraph = ko.computed<boolean>(() => false);
|
||||||
explorerStub.isPreferredApiMongoDB = ko.computed<boolean>(() => false);
|
explorerStub.isPreferredApiMongoDB = ko.computed<boolean>(() => false);
|
||||||
explorerStub.isPreferredApiDocumentDB = ko.computed<boolean>(() => false);
|
|
||||||
explorerStub.isPreferredApiTable = ko.computed<boolean>(() => false);
|
explorerStub.isPreferredApiTable = ko.computed<boolean>(() => false);
|
||||||
explorerStub.isPreferredApiCassandra = ko.computed<boolean>(() => false);
|
explorerStub.isPreferredApiCassandra = ko.computed<boolean>(() => false);
|
||||||
explorerStub.canExceedMaximumValue = ko.computed<boolean>(() => false);
|
explorerStub.canExceedMaximumValue = ko.computed<boolean>(() => false);
|
||||||
|
@ -31,7 +31,7 @@ describe("ContainerSampleGenerator", () => {
|
||||||
it("should insert documents for sql API account", async () => {
|
it("should insert documents for sql API account", async () => {
|
||||||
const sampleCollectionId = "SampleCollection";
|
const sampleCollectionId = "SampleCollection";
|
||||||
const sampleDatabaseId = "SampleDB";
|
const sampleDatabaseId = "SampleDB";
|
||||||
|
updateUserContext({});
|
||||||
const sampleData = {
|
const sampleData = {
|
||||||
databaseId: sampleDatabaseId,
|
databaseId: sampleDatabaseId,
|
||||||
offerThroughput: 400,
|
offerThroughput: 400,
|
||||||
|
@ -66,7 +66,7 @@ describe("ContainerSampleGenerator", () => {
|
||||||
database.findCollectionWithId = () => collection;
|
database.findCollectionWithId = () => collection;
|
||||||
|
|
||||||
const explorerStub = createExplorerStub(database);
|
const explorerStub = createExplorerStub(database);
|
||||||
explorerStub.isPreferredApiDocumentDB = ko.computed<boolean>(() => true);
|
|
||||||
const generator = await ContainerSampleGenerator.createSampleGeneratorAsync(explorerStub);
|
const generator = await ContainerSampleGenerator.createSampleGeneratorAsync(explorerStub);
|
||||||
generator.setData(sampleData);
|
generator.setData(sampleData);
|
||||||
|
|
||||||
|
@ -125,31 +125,46 @@ describe("ContainerSampleGenerator", () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should not create any sample for Mongo API account", async () => {
|
it("should not create any sample for Mongo API account", async () => {
|
||||||
const experience = "not supported api";
|
const experience = "Sample generation not supported for this API Mongo";
|
||||||
const explorerStub = createExplorerStub(undefined);
|
const explorerStub = createExplorerStub(undefined);
|
||||||
explorerStub.isPreferredApiMongoDB = ko.computed<boolean>(() => true);
|
updateUserContext({
|
||||||
explorerStub.defaultExperience = ko.observable<string>(experience);
|
databaseAccount: {
|
||||||
|
properties: {
|
||||||
|
capabilities: [{ name: "EnableMongo" }],
|
||||||
|
},
|
||||||
|
} as DatabaseAccount,
|
||||||
|
});
|
||||||
|
|
||||||
// Rejects with error that contains experience
|
// Rejects with error that contains experience
|
||||||
expect(ContainerSampleGenerator.createSampleGeneratorAsync(explorerStub)).rejects.toMatch(experience);
|
expect(ContainerSampleGenerator.createSampleGeneratorAsync(explorerStub)).rejects.toMatch(experience);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should not create any sample for Table API account", async () => {
|
it("should not create any sample for Table API account", async () => {
|
||||||
const experience = "not supported api";
|
const experience = "Sample generation not supported for this API Tables";
|
||||||
const explorerStub = createExplorerStub(undefined);
|
const explorerStub = createExplorerStub(undefined);
|
||||||
explorerStub.isPreferredApiTable = ko.computed<boolean>(() => true);
|
updateUserContext({
|
||||||
explorerStub.defaultExperience = ko.observable<string>(experience);
|
databaseAccount: {
|
||||||
|
properties: {
|
||||||
|
capabilities: [{ name: "EnableTable" }],
|
||||||
|
},
|
||||||
|
} as DatabaseAccount,
|
||||||
|
});
|
||||||
|
|
||||||
// Rejects with error that contains experience
|
// Rejects with error that contains experience
|
||||||
await expect(ContainerSampleGenerator.createSampleGeneratorAsync(explorerStub)).rejects.toMatch(experience);
|
await expect(ContainerSampleGenerator.createSampleGeneratorAsync(explorerStub)).rejects.toMatch(experience);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should not create any sample for Cassandra API account", async () => {
|
it("should not create any sample for Cassandra API account", async () => {
|
||||||
const experience = "not supported api";
|
const experience = "Sample generation not supported for this API Cassandra";
|
||||||
const explorerStub = createExplorerStub(undefined);
|
const explorerStub = createExplorerStub(undefined);
|
||||||
explorerStub.isPreferredApiCassandra = ko.computed<boolean>(() => true);
|
|
||||||
explorerStub.defaultExperience = ko.observable<string>(experience);
|
|
||||||
|
|
||||||
|
updateUserContext({
|
||||||
|
databaseAccount: {
|
||||||
|
properties: {
|
||||||
|
capabilities: [{ name: "EnableCassandra" }],
|
||||||
|
},
|
||||||
|
} as DatabaseAccount,
|
||||||
|
});
|
||||||
// Rejects with error that contains experience
|
// Rejects with error that contains experience
|
||||||
await expect(ContainerSampleGenerator.createSampleGeneratorAsync(explorerStub)).rejects.toMatch(experience);
|
await expect(ContainerSampleGenerator.createSampleGeneratorAsync(explorerStub)).rejects.toMatch(experience);
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
import * as DataModels from "../../Contracts/DataModels";
|
|
||||||
import * as ViewModels from "../../Contracts/ViewModels";
|
|
||||||
import GraphTab from ".././Tabs/GraphTab";
|
|
||||||
import { GremlinClient } from "../Graph/GraphExplorerComponent/GremlinClient";
|
|
||||||
import * as NotificationConsoleUtils from "../../Utils/NotificationConsoleUtils";
|
|
||||||
import Explorer from "../Explorer";
|
|
||||||
import { createCollection } from "../../Common/dataAccess/createCollection";
|
import { createCollection } from "../../Common/dataAccess/createCollection";
|
||||||
import { createDocument } from "../../Common/dataAccess/createDocument";
|
import { createDocument } from "../../Common/dataAccess/createDocument";
|
||||||
|
import * as DataModels from "../../Contracts/DataModels";
|
||||||
|
import * as ViewModels from "../../Contracts/ViewModels";
|
||||||
import { userContext } from "../../UserContext";
|
import { userContext } from "../../UserContext";
|
||||||
|
import * as NotificationConsoleUtils from "../../Utils/NotificationConsoleUtils";
|
||||||
|
import GraphTab from ".././Tabs/GraphTab";
|
||||||
|
import Explorer from "../Explorer";
|
||||||
|
import { GremlinClient } from "../Graph/GraphExplorerComponent/GremlinClient";
|
||||||
|
|
||||||
interface SampleDataFile extends DataModels.CreateCollectionParams {
|
interface SampleDataFile extends DataModels.CreateCollectionParams {
|
||||||
data: any[];
|
data: any[];
|
||||||
|
@ -23,16 +23,16 @@ export class ContainerSampleGenerator {
|
||||||
public static async createSampleGeneratorAsync(container: Explorer): Promise<ContainerSampleGenerator> {
|
public static async createSampleGeneratorAsync(container: Explorer): Promise<ContainerSampleGenerator> {
|
||||||
const generator = new ContainerSampleGenerator(container);
|
const generator = new ContainerSampleGenerator(container);
|
||||||
let dataFileContent: any;
|
let dataFileContent: any;
|
||||||
if (container.isPreferredApiGraph()) {
|
if (userContext.apiType === "Gremlin") {
|
||||||
dataFileContent = await import(
|
dataFileContent = await import(
|
||||||
/* webpackChunkName: "gremlinSampleJsonData" */ "../../../sampleData/gremlinSampleData.json"
|
/* webpackChunkName: "gremlinSampleJsonData" */ "../../../sampleData/gremlinSampleData.json"
|
||||||
);
|
);
|
||||||
} else if (container.isPreferredApiDocumentDB()) {
|
} else if (userContext.apiType === "SQL") {
|
||||||
dataFileContent = await import(
|
dataFileContent = await import(
|
||||||
/* webpackChunkName: "sqlSampleJsonData" */ "../../../sampleData/sqlSampleData.json"
|
/* webpackChunkName: "sqlSampleJsonData" */ "../../../sampleData/sqlSampleData.json"
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
return Promise.reject(`Sample generation not supported for this API ${container.defaultExperience()}`);
|
return Promise.reject(`Sample generation not supported for this API ${userContext.apiType}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
generator.setData(dataFileContent);
|
generator.setData(dataFileContent);
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import * as ViewModels from "../../Contracts/ViewModels";
|
import * as ViewModels from "../../Contracts/ViewModels";
|
||||||
|
import { userContext } from "../../UserContext";
|
||||||
import * as NotificationConsoleUtils from "../../Utils/NotificationConsoleUtils";
|
import * as NotificationConsoleUtils from "../../Utils/NotificationConsoleUtils";
|
||||||
import Explorer from "../Explorer";
|
import Explorer from "../Explorer";
|
||||||
import { ConsoleDataType } from "../Menus/NotificationConsole/NotificationConsoleComponent";
|
import { ConsoleDataType } from "../Menus/NotificationConsole/NotificationConsoleComponent";
|
||||||
|
@ -56,6 +57,6 @@ export class DataSamplesUtil {
|
||||||
}
|
}
|
||||||
|
|
||||||
public isSampleContainerCreationSupported(): boolean {
|
public isSampleContainerCreationSupported(): boolean {
|
||||||
return this.container.isPreferredApiDocumentDB() || this.container.isPreferredApiGraph();
|
return userContext.apiType === "SQL" || this.container.isPreferredApiGraph();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -116,11 +116,6 @@ export default class Explorer {
|
||||||
* Use userContext.apiType instead
|
* Use userContext.apiType instead
|
||||||
* */
|
* */
|
||||||
public defaultExperience: ko.Observable<string>;
|
public defaultExperience: ko.Observable<string>;
|
||||||
/**
|
|
||||||
* @deprecated
|
|
||||||
* Compare a string with userContext.apiType instead: userContext.apiType === "SQL"
|
|
||||||
* */
|
|
||||||
public isPreferredApiDocumentDB: ko.Computed<boolean>;
|
|
||||||
/**
|
/**
|
||||||
* @deprecated
|
* @deprecated
|
||||||
* Compare a string with userContext.apiType instead: userContext.apiType === "Cassandra"
|
* Compare a string with userContext.apiType instead: userContext.apiType === "Cassandra"
|
||||||
|
@ -419,11 +414,6 @@ export default class Explorer {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
this.isPreferredApiDocumentDB = ko.computed(() => {
|
|
||||||
const defaultExperience = (this.defaultExperience && this.defaultExperience()) || "";
|
|
||||||
return defaultExperience.toLowerCase() === Constants.DefaultAccountExperience.DocumentDB.toLowerCase();
|
|
||||||
});
|
|
||||||
|
|
||||||
this.isPreferredApiCassandra = ko.computed(() => {
|
this.isPreferredApiCassandra = ko.computed(() => {
|
||||||
const defaultExperience = (this.defaultExperience && this.defaultExperience()) || "";
|
const defaultExperience = (this.defaultExperience && this.defaultExperience()) || "";
|
||||||
return defaultExperience.toLowerCase() === Constants.DefaultAccountExperience.Cassandra.toLowerCase();
|
return defaultExperience.toLowerCase() === Constants.DefaultAccountExperience.Cassandra.toLowerCase();
|
||||||
|
|
|
@ -4,15 +4,15 @@
|
||||||
* and update any knockout observables passed from the parent.
|
* and update any knockout observables passed from the parent.
|
||||||
*/
|
*/
|
||||||
import * as ko from "knockout";
|
import * as ko from "knockout";
|
||||||
|
import { CommandBar, ICommandBarItemProps } from "office-ui-fabric-react/lib/CommandBar";
|
||||||
import * as React from "react";
|
import * as React from "react";
|
||||||
import { ReactAdapter } from "../../../Bindings/ReactBindingHandler";
|
import { ReactAdapter } from "../../../Bindings/ReactBindingHandler";
|
||||||
import * as ViewModels from "../../../Contracts/ViewModels";
|
|
||||||
import * as CommandBarComponentButtonFactory from "./CommandBarComponentButtonFactory";
|
|
||||||
import { CommandBar, ICommandBarItemProps } from "office-ui-fabric-react/lib/CommandBar";
|
|
||||||
import { StyleConstants } from "../../../Common/Constants";
|
import { StyleConstants } from "../../../Common/Constants";
|
||||||
import * as CommandBarUtil from "./CommandBarUtil";
|
import * as ViewModels from "../../../Contracts/ViewModels";
|
||||||
import Explorer from "../../Explorer";
|
|
||||||
import { CommandButtonComponentProps } from "../../Controls/CommandButton/CommandButtonComponent";
|
import { CommandButtonComponentProps } from "../../Controls/CommandButton/CommandButtonComponent";
|
||||||
|
import Explorer from "../../Explorer";
|
||||||
|
import * as CommandBarComponentButtonFactory from "./CommandBarComponentButtonFactory";
|
||||||
|
import * as CommandBarUtil from "./CommandBarUtil";
|
||||||
|
|
||||||
export class CommandBarComponentAdapter implements ReactAdapter {
|
export class CommandBarComponentAdapter implements ReactAdapter {
|
||||||
public parameters: ko.Observable<number>;
|
public parameters: ko.Observable<number>;
|
||||||
|
@ -31,7 +31,6 @@ export class CommandBarComponentAdapter implements ReactAdapter {
|
||||||
const toWatch = [
|
const toWatch = [
|
||||||
container.isPreferredApiTable,
|
container.isPreferredApiTable,
|
||||||
container.isPreferredApiMongoDB,
|
container.isPreferredApiMongoDB,
|
||||||
container.isPreferredApiDocumentDB,
|
|
||||||
container.isPreferredApiCassandra,
|
container.isPreferredApiCassandra,
|
||||||
container.isPreferredApiGraph,
|
container.isPreferredApiGraph,
|
||||||
container.deleteCollectionText,
|
container.deleteCollectionText,
|
||||||
|
|
|
@ -337,7 +337,6 @@ describe("CommandBarComponentButtonFactory tests", () => {
|
||||||
beforeAll(() => {
|
beforeAll(() => {
|
||||||
mockExplorer = {} as Explorer;
|
mockExplorer = {} as Explorer;
|
||||||
mockExplorer.addCollectionText = ko.observable("mockText");
|
mockExplorer.addCollectionText = ko.observable("mockText");
|
||||||
mockExplorer.isPreferredApiDocumentDB = ko.computed(() => true);
|
|
||||||
mockExplorer.isDatabaseNodeOrNoneSelected = () => true;
|
mockExplorer.isDatabaseNodeOrNoneSelected = () => true;
|
||||||
mockExplorer.isResourceTokenCollectionNodeSelected = ko.computed(() => true);
|
mockExplorer.isResourceTokenCollectionNodeSelected = ko.computed(() => true);
|
||||||
mockExplorer.isServerlessEnabled = ko.computed<boolean>(() => false);
|
mockExplorer.isServerlessEnabled = ko.computed<boolean>(() => false);
|
||||||
|
|
|
@ -90,15 +90,15 @@ export function createStaticCommandBarButtons(container: Explorer): CommandButto
|
||||||
buttons.push(createDivider());
|
buttons.push(createDivider());
|
||||||
}
|
}
|
||||||
|
|
||||||
const isSqlQuerySupported = container.isPreferredApiDocumentDB() || container.isPreferredApiGraph();
|
const isSqlQuerySupported = userContext.apiType === "SQL" || container.isPreferredApiGraph();
|
||||||
if (isSqlQuerySupported) {
|
if (isSqlQuerySupported) {
|
||||||
const newSqlQueryBtn = createNewSQLQueryButton(container);
|
const newSqlQueryBtn = createNewSQLQueryButton(container);
|
||||||
buttons.push(newSqlQueryBtn);
|
buttons.push(newSqlQueryBtn);
|
||||||
}
|
}
|
||||||
|
|
||||||
const isSupportedOpenQueryApi =
|
const isSupportedOpenQueryApi =
|
||||||
container.isPreferredApiDocumentDB() || container.isPreferredApiMongoDB() || container.isPreferredApiGraph();
|
userContext.apiType === "SQL" || container.isPreferredApiMongoDB() || container.isPreferredApiGraph();
|
||||||
const isSupportedOpenQueryFromDiskApi = container.isPreferredApiDocumentDB() || container.isPreferredApiGraph();
|
const isSupportedOpenQueryFromDiskApi = userContext.apiType === "SQL" || container.isPreferredApiGraph();
|
||||||
if (isSupportedOpenQueryApi && container.selectedNode() && container.findSelectedCollection()) {
|
if (isSupportedOpenQueryApi && container.selectedNode() && container.findSelectedCollection()) {
|
||||||
const openQueryBtn = createOpenQueryButton(container);
|
const openQueryBtn = createOpenQueryButton(container);
|
||||||
openQueryBtn.children = [createOpenQueryButton(container), createOpenQueryFromDiskButton(container)];
|
openQueryBtn.children = [createOpenQueryButton(container), createOpenQueryFromDiskButton(container)];
|
||||||
|
@ -217,7 +217,7 @@ export function createDivider(): CommandButtonComponentProps {
|
||||||
}
|
}
|
||||||
|
|
||||||
function areScriptsSupported(container: Explorer): boolean {
|
function areScriptsSupported(container: Explorer): boolean {
|
||||||
return container.isPreferredApiDocumentDB() || container.isPreferredApiGraph();
|
return userContext.apiType === "SQL" || container.isPreferredApiGraph();
|
||||||
}
|
}
|
||||||
|
|
||||||
function createNewCollectionGroup(container: Explorer): CommandButtonComponentProps {
|
function createNewCollectionGroup(container: Explorer): CommandButtonComponentProps {
|
||||||
|
@ -289,7 +289,7 @@ function createNewDatabase(container: Explorer): CommandButtonComponentProps {
|
||||||
}
|
}
|
||||||
|
|
||||||
function createNewSQLQueryButton(container: Explorer): CommandButtonComponentProps {
|
function createNewSQLQueryButton(container: Explorer): CommandButtonComponentProps {
|
||||||
if (container.isPreferredApiDocumentDB() || container.isPreferredApiGraph()) {
|
if (userContext.apiType === "SQL" || container.isPreferredApiGraph()) {
|
||||||
const label = "New SQL Query";
|
const label = "New SQL Query";
|
||||||
return {
|
return {
|
||||||
iconSrc: AddSqlQueryIcon,
|
iconSrc: AddSqlQueryIcon,
|
||||||
|
|
|
@ -591,7 +591,7 @@ export default class AddCollectionPane extends ContextualPaneBase {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.container.isPreferredApiDocumentDB()) {
|
if (userContext.apiType === "SQL") {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -624,7 +624,6 @@ exports[`Settings Pane should render Default properly 1`] = `
|
||||||
"isNotebookEnabled": [Function],
|
"isNotebookEnabled": [Function],
|
||||||
"isNotebooksEnabledForAccount": [Function],
|
"isNotebooksEnabledForAccount": [Function],
|
||||||
"isPreferredApiCassandra": [Function],
|
"isPreferredApiCassandra": [Function],
|
||||||
"isPreferredApiDocumentDB": [Function],
|
|
||||||
"isPreferredApiGraph": [Function],
|
"isPreferredApiGraph": [Function],
|
||||||
"isPreferredApiMongoDB": [Function],
|
"isPreferredApiMongoDB": [Function],
|
||||||
"isPreferredApiTable": [Function],
|
"isPreferredApiTable": [Function],
|
||||||
|
@ -762,6 +761,41 @@ exports[`Settings Pane should render Default properly 1`] = `
|
||||||
<div
|
<div
|
||||||
className="paneMainContent"
|
className="paneMainContent"
|
||||||
>
|
>
|
||||||
|
<div
|
||||||
|
className="settingsSection"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
className="settingsSectionPart pageOptionsPart"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
className="settingsSectionLabel"
|
||||||
|
>
|
||||||
|
Page options
|
||||||
|
<Tooltip>
|
||||||
|
Choose Custom to specify a fixed amount of query results to show, or choose Unlimited to show as many query results per page.
|
||||||
|
</Tooltip>
|
||||||
|
</div>
|
||||||
|
<StyledChoiceGroupBase
|
||||||
|
onChange={[Function]}
|
||||||
|
options={
|
||||||
|
Array [
|
||||||
|
Object {
|
||||||
|
"key": "custom",
|
||||||
|
"text": "Custom",
|
||||||
|
},
|
||||||
|
Object {
|
||||||
|
"key": "unlimited",
|
||||||
|
"text": "Unlimited",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
selectedKey="unlimited"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
className="tabs settingsSectionPart"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
<div
|
<div
|
||||||
className="settingsSection"
|
className="settingsSection"
|
||||||
>
|
>
|
||||||
|
@ -1477,7 +1511,6 @@ exports[`Settings Pane should render Gremlin properly 1`] = `
|
||||||
"isNotebookEnabled": [Function],
|
"isNotebookEnabled": [Function],
|
||||||
"isNotebooksEnabledForAccount": [Function],
|
"isNotebooksEnabledForAccount": [Function],
|
||||||
"isPreferredApiCassandra": [Function],
|
"isPreferredApiCassandra": [Function],
|
||||||
"isPreferredApiDocumentDB": [Function],
|
|
||||||
"isPreferredApiGraph": [Function],
|
"isPreferredApiGraph": [Function],
|
||||||
"isPreferredApiMongoDB": [Function],
|
"isPreferredApiMongoDB": [Function],
|
||||||
"isPreferredApiTable": [Function],
|
"isPreferredApiTable": [Function],
|
||||||
|
|
|
@ -624,7 +624,6 @@ exports[`Upload Items Pane should render Default properly 1`] = `
|
||||||
"isNotebookEnabled": [Function],
|
"isNotebookEnabled": [Function],
|
||||||
"isNotebooksEnabledForAccount": [Function],
|
"isNotebooksEnabledForAccount": [Function],
|
||||||
"isPreferredApiCassandra": [Function],
|
"isPreferredApiCassandra": [Function],
|
||||||
"isPreferredApiDocumentDB": [Function],
|
|
||||||
"isPreferredApiGraph": [Function],
|
"isPreferredApiGraph": [Function],
|
||||||
"isPreferredApiMongoDB": [Function],
|
"isPreferredApiMongoDB": [Function],
|
||||||
"isPreferredApiTable": [Function],
|
"isPreferredApiTable": [Function],
|
||||||
|
|
|
@ -627,7 +627,6 @@ exports[`Delete Database Confirmation Pane submit() Should call delete database
|
||||||
"isNotebookEnabled": [Function],
|
"isNotebookEnabled": [Function],
|
||||||
"isNotebooksEnabledForAccount": [Function],
|
"isNotebooksEnabledForAccount": [Function],
|
||||||
"isPreferredApiCassandra": [Function],
|
"isPreferredApiCassandra": [Function],
|
||||||
"isPreferredApiDocumentDB": [Function],
|
|
||||||
"isPreferredApiGraph": [Function],
|
"isPreferredApiGraph": [Function],
|
||||||
"isPreferredApiMongoDB": [Function],
|
"isPreferredApiMongoDB": [Function],
|
||||||
"isPreferredApiTable": [Function],
|
"isPreferredApiTable": [Function],
|
||||||
|
|
|
@ -227,7 +227,7 @@ export class SplashScreen extends React.Component<SplashScreenProps> {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this.container.isDatabaseNodeOrNoneSelected()) {
|
if (!this.container.isDatabaseNodeOrNoneSelected()) {
|
||||||
if (this.container.isPreferredApiDocumentDB() || this.container.isPreferredApiGraph()) {
|
if (userContext.apiType === "SQL" || this.container.isPreferredApiGraph()) {
|
||||||
items.push({
|
items.push({
|
||||||
iconSrc: NewQueryIcon,
|
iconSrc: NewQueryIcon,
|
||||||
onClick: () => {
|
onClick: () => {
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
import * as ko from "knockout";
|
import * as ko from "knockout";
|
||||||
import * as Constants from "../../Common/Constants";
|
import { DatabaseAccount } from "../../Contracts/DataModels";
|
||||||
import * as ViewModels from "../../Contracts/ViewModels";
|
import * as ViewModels from "../../Contracts/ViewModels";
|
||||||
|
import { updateUserContext } from "../../UserContext";
|
||||||
|
import { CommandButtonComponentProps } from "../Controls/CommandButton/CommandButtonComponent";
|
||||||
import Explorer from "../Explorer";
|
import Explorer from "../Explorer";
|
||||||
import QueryTab from "./QueryTab";
|
import QueryTab from "./QueryTab";
|
||||||
import { CommandButtonComponentProps } from "../Controls/CommandButton/CommandButtonComponent";
|
|
||||||
|
|
||||||
describe("Query Tab", () => {
|
describe("Query Tab", () => {
|
||||||
function getNewQueryTabForContainer(container: Explorer): QueryTab {
|
function getNewQueryTabForContainer(container: Explorer): QueryTab {
|
||||||
|
@ -52,13 +53,19 @@ describe("Query Tab", () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should be true for accounts using SQL API", () => {
|
it("should be true for accounts using SQL API", () => {
|
||||||
explorer.defaultExperience(Constants.DefaultAccountExperience.DocumentDB.toLowerCase());
|
updateUserContext({});
|
||||||
const queryTab = getNewQueryTabForContainer(explorer);
|
const queryTab = getNewQueryTabForContainer(explorer);
|
||||||
expect(queryTab.isQueryMetricsEnabled()).toBe(true);
|
expect(queryTab.isQueryMetricsEnabled()).toBe(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should be false for accounts using other APIs", () => {
|
it("should be false for accounts using other APIs", () => {
|
||||||
explorer.defaultExperience(Constants.DefaultAccountExperience.Graph.toLowerCase());
|
updateUserContext({
|
||||||
|
databaseAccount: {
|
||||||
|
properties: {
|
||||||
|
capabilities: [{ name: "EnableGremlin" }],
|
||||||
|
},
|
||||||
|
} as DatabaseAccount,
|
||||||
|
});
|
||||||
const queryTab = getNewQueryTabForContainer(explorer);
|
const queryTab = getNewQueryTabForContainer(explorer);
|
||||||
expect(queryTab.isQueryMetricsEnabled()).toBe(false);
|
expect(queryTab.isQueryMetricsEnabled()).toBe(false);
|
||||||
});
|
});
|
||||||
|
@ -72,13 +79,19 @@ describe("Query Tab", () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should be visible when using a supported API", () => {
|
it("should be visible when using a supported API", () => {
|
||||||
explorer.defaultExperience(Constants.DefaultAccountExperience.DocumentDB);
|
updateUserContext({});
|
||||||
const queryTab = getNewQueryTabForContainer(explorer);
|
const queryTab = getNewQueryTabForContainer(explorer);
|
||||||
expect(queryTab.saveQueryButton.visible()).toBe(true);
|
expect(queryTab.saveQueryButton.visible()).toBe(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should not be visible when using an unsupported API", () => {
|
it("should not be visible when using an unsupported API", () => {
|
||||||
explorer.defaultExperience(Constants.DefaultAccountExperience.MongoDB);
|
updateUserContext({
|
||||||
|
databaseAccount: {
|
||||||
|
properties: {
|
||||||
|
capabilities: [{ name: "EnableMongo" }],
|
||||||
|
},
|
||||||
|
} as DatabaseAccount,
|
||||||
|
});
|
||||||
const queryTab = getNewQueryTabForContainer(explorer);
|
const queryTab = getNewQueryTabForContainer(explorer);
|
||||||
expect(queryTab.saveQueryButton.visible()).toBe(false);
|
expect(queryTab.saveQueryButton.visible()).toBe(false);
|
||||||
});
|
});
|
||||||
|
|
|
@ -13,6 +13,7 @@ import * as DataModels from "../../Contracts/DataModels";
|
||||||
import * as ViewModels from "../../Contracts/ViewModels";
|
import * as ViewModels from "../../Contracts/ViewModels";
|
||||||
import { Action } from "../../Shared/Telemetry/TelemetryConstants";
|
import { Action } from "../../Shared/Telemetry/TelemetryConstants";
|
||||||
import * as TelemetryProcessor from "../../Shared/Telemetry/TelemetryProcessor";
|
import * as TelemetryProcessor from "../../Shared/Telemetry/TelemetryProcessor";
|
||||||
|
import { userContext } from "../../UserContext";
|
||||||
import * as QueryUtils from "../../Utils/QueryUtils";
|
import * as QueryUtils from "../../Utils/QueryUtils";
|
||||||
import { CommandButtonComponentProps } from "../Controls/CommandButton/CommandButtonComponent";
|
import { CommandButtonComponentProps } from "../Controls/CommandButton/CommandButtonComponent";
|
||||||
import template from "./QueryTab.html";
|
import template from "./QueryTab.html";
|
||||||
|
@ -95,9 +96,7 @@ export default class QueryTab extends TabsBase implements ViewModels.WaitsForTem
|
||||||
this.aggregatedQueryMetrics(this._aggregateQueryMetrics(metrics))
|
this.aggregatedQueryMetrics(this._aggregateQueryMetrics(metrics))
|
||||||
);
|
);
|
||||||
this.isQueryMetricsEnabled = ko.computed<boolean>(() => {
|
this.isQueryMetricsEnabled = ko.computed<boolean>(() => {
|
||||||
return (
|
return userContext.apiType === "SQL" || false;
|
||||||
(this.collection && this.collection.container && this.collection.container.isPreferredApiDocumentDB()) || false
|
|
||||||
);
|
|
||||||
});
|
});
|
||||||
this.activityId = ko.observable<string>();
|
this.activityId = ko.observable<string>();
|
||||||
this.roundTrips = ko.observable<number>();
|
this.roundTrips = ko.observable<number>();
|
||||||
|
@ -117,7 +116,7 @@ export default class QueryTab extends TabsBase implements ViewModels.WaitsForTem
|
||||||
|
|
||||||
this._isSaveQueriesEnabled = ko.computed<boolean>(() => {
|
this._isSaveQueriesEnabled = ko.computed<boolean>(() => {
|
||||||
const container = this.collection && this.collection.container;
|
const container = this.collection && this.collection.container;
|
||||||
return (container && (container.isPreferredApiDocumentDB() || container.isPreferredApiGraph())) || false;
|
return userContext.apiType === "SQL" || userContext.apiType === "Gremlin";
|
||||||
});
|
});
|
||||||
|
|
||||||
this.maybeSubQuery = ko.computed<boolean>(function () {
|
this.maybeSubQuery = ko.computed<boolean>(function () {
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
import * as DataModels from "../../Contracts/DataModels";
|
|
||||||
import * as ko from "knockout";
|
import * as ko from "knockout";
|
||||||
import * as ViewModels from "../../Contracts/ViewModels";
|
import * as DataModels from "../../Contracts/DataModels";
|
||||||
import Collection from "./Collection";
|
|
||||||
import Explorer from "../Explorer";
|
import Explorer from "../Explorer";
|
||||||
|
import Collection from "./Collection";
|
||||||
jest.mock("monaco-editor");
|
jest.mock("monaco-editor");
|
||||||
|
|
||||||
describe("Collection", () => {
|
describe("Collection", () => {
|
||||||
|
@ -41,12 +40,7 @@ describe("Collection", () => {
|
||||||
mockContainer.isDatabaseNodeOrNoneSelected = () => {
|
mockContainer.isDatabaseNodeOrNoneSelected = () => {
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
mockContainer.isPreferredApiDocumentDB = ko.computed(() => {
|
|
||||||
return true;
|
|
||||||
});
|
|
||||||
mockContainer.isPreferredApiGraph = ko.computed(() => {
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
mockContainer.deleteCollectionText = ko.observable<string>("delete collection");
|
mockContainer.deleteCollectionText = ko.observable<string>("delete collection");
|
||||||
|
|
||||||
return generateCollection(mockContainer, "abc", data, {} as DataModels.Offer);
|
return generateCollection(mockContainer, "abc", data, {} as DataModels.Offer);
|
||||||
|
|
|
@ -196,7 +196,7 @@ export default class Collection implements ViewModels.Collection {
|
||||||
.map((node) => <Trigger>node);
|
.map((node) => <Trigger>node);
|
||||||
});
|
});
|
||||||
|
|
||||||
const showScriptsMenus: boolean = container.isPreferredApiDocumentDB() || container.isPreferredApiGraph();
|
const showScriptsMenus: boolean = userContext.apiType === "SQL" || userContext.apiType === "Gremlin";
|
||||||
this.showStoredProcedures = ko.observable<boolean>(showScriptsMenus);
|
this.showStoredProcedures = ko.observable<boolean>(showScriptsMenus);
|
||||||
this.showTriggers = ko.observable<boolean>(showScriptsMenus);
|
this.showTriggers = ko.observable<boolean>(showScriptsMenus);
|
||||||
this.showUserDefinedFunctions = ko.observable<boolean>(showScriptsMenus);
|
this.showUserDefinedFunctions = ko.observable<boolean>(showScriptsMenus);
|
||||||
|
|
|
@ -253,7 +253,7 @@ export class ResourceTreeAdapter implements ReactAdapter {
|
||||||
* @param container
|
* @param container
|
||||||
*/
|
*/
|
||||||
private static showScriptNodes(container: Explorer): boolean {
|
private static showScriptNodes(container: Explorer): boolean {
|
||||||
return container.isPreferredApiDocumentDB() || container.isPreferredApiGraph();
|
return userContext.apiType === "SQL" || container.isPreferredApiGraph();
|
||||||
}
|
}
|
||||||
|
|
||||||
private buildCollectionNode(database: ViewModels.Database, collection: ViewModels.Collection): TreeNode {
|
private buildCollectionNode(database: ViewModels.Database, collection: ViewModels.Collection): TreeNode {
|
||||||
|
|
|
@ -5,6 +5,7 @@ import * as Constants from "../Common/Constants";
|
||||||
import * as ViewModels from "../Contracts/ViewModels";
|
import * as ViewModels from "../Contracts/ViewModels";
|
||||||
import ScriptTabBase from "../Explorer/Tabs/ScriptTabBase";
|
import ScriptTabBase from "../Explorer/Tabs/ScriptTabBase";
|
||||||
import TabsBase from "../Explorer/Tabs/TabsBase";
|
import TabsBase from "../Explorer/Tabs/TabsBase";
|
||||||
|
import { userContext } from "../UserContext";
|
||||||
|
|
||||||
export class TabRouteHandler {
|
export class TabRouteHandler {
|
||||||
private _tabRouter: any;
|
private _tabRouter: any;
|
||||||
|
@ -134,10 +135,7 @@ export class TabRouteHandler {
|
||||||
databaseId,
|
databaseId,
|
||||||
collectionId
|
collectionId
|
||||||
);
|
);
|
||||||
collection &&
|
userContext.apiType === "SQL" && collection.onDocumentDBDocumentsClick();
|
||||||
collection.container &&
|
|
||||||
collection.container.isPreferredApiDocumentDB() &&
|
|
||||||
collection.onDocumentDBDocumentsClick();
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,7 @@ const features = extractFeatures();
|
||||||
const { enableSDKoperations: useSDKOperations } = features;
|
const { enableSDKoperations: useSDKOperations } = features;
|
||||||
|
|
||||||
const userContext: UserContext = {
|
const userContext: UserContext = {
|
||||||
|
apiType: "SQL",
|
||||||
hasWriteAccess: true,
|
hasWriteAccess: true,
|
||||||
isTryCosmosDBSubscription: false,
|
isTryCosmosDBSubscription: false,
|
||||||
portalEnv: "prod",
|
portalEnv: "prod",
|
||||||
|
|
Loading…
Reference in New Issue