// CSS Dependencies import "bootstrap/dist/css/bootstrap.css"; import "../less/documentDB.less"; import "../less/tree.less"; import "../less/forms.less"; import "../less/menus.less"; import "../less/infobox.less"; import "../less/messagebox.less"; import "./Explorer/Controls/ErrorDisplayComponent/ErrorDisplayComponent.less"; import "./Explorer/Menus/NotificationConsole/NotificationConsole.less"; import "./Explorer/Menus/CommandBar/CommandBarComponent.less"; import "./Explorer/Menus/CommandBar/MemoryTrackerComponent.less"; import "./Explorer/Controls/CollapsiblePanel/CollapsiblePanelComponent.less"; import "./Explorer/Controls/DynamicList/DynamicListComponent.less"; import "./Explorer/Controls/JsonEditor/JsonEditorComponent.less"; import "./Explorer/Graph/GraphExplorerComponent/graphExplorer.less"; import "../less/TableStyles/queryBuilder.less"; import "../externals/jquery.dataTables.min.css"; import "../less/TableStyles/fulldatatables.less"; import "../less/TableStyles/EntityEditor.less"; import "../less/TableStyles/CustomizeColumns.less"; import "../less/resourceTree.less"; import "../externals/jquery.typeahead.min.css"; import "../externals/jquery-ui.min.css"; import "../externals/jquery-ui.structure.min.css"; import "../externals/jquery-ui.theme.min.css"; import "./Explorer/Graph/NewVertexComponent/newVertexComponent.less"; import "./Explorer/Panes/GraphNewVertexPane.less"; import "./Explorer/Tabs/QueryTab.less"; import "./Explorer/Controls/TreeComponent/treeComponent.less"; import "./Explorer/Controls/Accordion/AccordionComponent.less"; import "./Explorer/SplashScreen/SplashScreenComponent.less"; import "./Explorer/Controls/Notebook/NotebookTerminalComponent.less"; // Image Dependencies import "../images/CosmosDB_rgb_ui_lighttheme.ico"; import "../images/favicon.ico"; import "./Shared/appInsights"; import "babel-polyfill"; import "es6-symbol/implement"; import "webcrypto-liner/build/webcrypto-liner.shim.min"; import "./Libs/jquery"; import "bootstrap/dist/js/npm"; import "../externals/jquery.typeahead.min.js"; import "../externals/jquery-ui.min.js"; import "promise-polyfill/src/polyfill"; import "abort-controller/polyfill"; import "whatwg-fetch"; import "es6-object-assign/auto"; import "promise.prototype.finally/auto"; import "object.entries/auto"; import "./Libs/is-integer-polyfill"; import "url-polyfill/url-polyfill.min"; initializeIcons(); import { AuthType } from "./AuthType"; import { initializeIcons } from "office-ui-fabric-react/lib/Icons"; import { applyExplorerBindings } from "./applyExplorerBindings"; import { configContext, initializeConfiguration, Platform } from "./ConfigContext"; import Explorer from "./Explorer/Explorer"; import React, { useEffect } from "react"; import ReactDOM from "react-dom"; import copyImage from "../images/Copy.svg"; import hdeConnectImage from "../images/HdeConnectCosmosDB.svg"; import refreshImg from "../images/refresh-cosmos.svg"; import arrowLeftImg from "../images/imgarrowlefticon.svg"; import { KOCommentEnd, KOCommentIfStart } from "./koComment"; import { updateUserContext } from "./UserContext"; import { CollectionCreation } from "./Shared/Constants"; import { extractFeatures } from "./Platform/Hosted/extractFeatures"; import { emulatorAccount } from "./Platform/Emulator/emulatorAccount"; import { HostedExplorerChildFrame } from "./HostedExplorerChildFrame"; import { getDatabaseAccountKindFromExperience, getDatabaseAccountPropertiesFromMetadata, } from "./Platform/Hosted/HostedUtils"; import { DefaultExperienceUtility } from "./Shared/DefaultExperienceUtility"; import { parseResourceTokenConnectionString } from "./Platform/Hosted/Helpers/ResourceTokenUtils"; import { AccountKind, DefaultAccountExperience, ServerIds } from "./Common/Constants"; import { listKeys } from "./Utils/arm/generatedClients/2020-04-01/databaseAccounts"; import { SelfServeType } from "./SelfServe/SelfServeUtils"; const App: React.FunctionComponent = () => { useEffect(() => { initializeConfiguration().then(async (config) => { let explorer: Explorer; if (config.platform === Platform.Hosted) { const win = (window as unknown) as HostedExplorerChildFrame; explorer = new Explorer(); explorer.selfServeType(SelfServeType.none); if (win.hostedConfig.authType === AuthType.EncryptedToken) { // TODO: Remove window.authType window.authType = AuthType.EncryptedToken; // Impossible to tell if this is a try cosmos sub using an encrypted token explorer.isTryCosmosDBSubscription(false); updateUserContext({ accessToken: encodeURIComponent(win.hostedConfig.encryptedToken), }); const apiExperience: string = DefaultExperienceUtility.getDefaultExperienceFromApiKind( win.hostedConfig.encryptedTokenMetadata.apiKind ); explorer.initDataExplorerWithFrameInputs({ databaseAccount: { id: "", // id: Main._databaseAccountId, name: win.hostedConfig.encryptedTokenMetadata.accountName, kind: getDatabaseAccountKindFromExperience(apiExperience), properties: getDatabaseAccountPropertiesFromMetadata(win.hostedConfig.encryptedTokenMetadata), tags: [], }, subscriptionId: undefined, resourceGroup: undefined, masterKey: undefined, hasWriteAccess: true, // TODO: we should embed this information in the token ideally authorizationToken: undefined, features: extractFeatures(), csmEndpoint: undefined, dnsSuffix: undefined, serverId: ServerIds.productionPortal, extensionEndpoint: configContext.BACKEND_ENDPOINT, subscriptionType: CollectionCreation.DefaultSubscriptionType, quotaId: undefined, addCollectionDefaultFlight: explorer.flight(), isTryCosmosDBSubscription: explorer.isTryCosmosDBSubscription(), }); explorer.isAccountReady(true); } else if (win.hostedConfig.authType === AuthType.ResourceToken) { window.authType = AuthType.ResourceToken; // Resource tokens can only be used with SQL API const apiExperience: string = DefaultAccountExperience.DocumentDB; const parsedResourceToken = parseResourceTokenConnectionString(win.hostedConfig.resourceToken); updateUserContext({ resourceToken: parsedResourceToken.resourceToken, endpoint: parsedResourceToken.accountEndpoint, }); explorer.resourceTokenDatabaseId(parsedResourceToken.databaseId); explorer.resourceTokenCollectionId(parsedResourceToken.collectionId); if (parsedResourceToken.partitionKey) { explorer.resourceTokenPartitionKey(parsedResourceToken.partitionKey); } explorer.initDataExplorerWithFrameInputs({ databaseAccount: { id: "", name: parsedResourceToken.accountEndpoint, kind: AccountKind.GlobalDocumentDB, properties: { documentEndpoint: parsedResourceToken.accountEndpoint }, tags: { defaultExperience: apiExperience }, }, subscriptionId: undefined, resourceGroup: undefined, masterKey: undefined, hasWriteAccess: true, // TODO: we should embed this information in the token ideally authorizationToken: undefined, features: extractFeatures(), csmEndpoint: undefined, dnsSuffix: undefined, serverId: ServerIds.productionPortal, extensionEndpoint: configContext.BACKEND_ENDPOINT, subscriptionType: CollectionCreation.DefaultSubscriptionType, quotaId: undefined, addCollectionDefaultFlight: explorer.flight(), isTryCosmosDBSubscription: explorer.isTryCosmosDBSubscription(), isAuthWithresourceToken: true, }); explorer.isAccountReady(true); explorer.isRefreshingExplorer(false); } else if (win.hostedConfig.authType === AuthType.ConnectionString) { // For legacy reasons lots of code expects a connection string login to look and act like an encrypted token login window.authType = AuthType.EncryptedToken; // Impossible to tell if this is a try cosmos sub using an encrypted token explorer.isTryCosmosDBSubscription(false); updateUserContext({ accessToken: encodeURIComponent(win.hostedConfig.encryptedToken), }); const apiExperience: string = DefaultExperienceUtility.getDefaultExperienceFromApiKind( win.hostedConfig.encryptedTokenMetadata.apiKind ); explorer.initDataExplorerWithFrameInputs({ databaseAccount: { id: "", // id: Main._databaseAccountId, name: win.hostedConfig.encryptedTokenMetadata.accountName, kind: getDatabaseAccountKindFromExperience(apiExperience), properties: getDatabaseAccountPropertiesFromMetadata(win.hostedConfig.encryptedTokenMetadata), tags: [], }, subscriptionId: undefined, resourceGroup: undefined, masterKey: win.hostedConfig.masterKey, hasWriteAccess: true, // TODO: we should embed this information in the token ideally authorizationToken: undefined, features: extractFeatures(), csmEndpoint: undefined, dnsSuffix: undefined, serverId: ServerIds.productionPortal, extensionEndpoint: configContext.BACKEND_ENDPOINT, subscriptionType: CollectionCreation.DefaultSubscriptionType, quotaId: undefined, addCollectionDefaultFlight: explorer.flight(), isTryCosmosDBSubscription: explorer.isTryCosmosDBSubscription(), }); explorer.isAccountReady(true); } else if (win.hostedConfig.authType === AuthType.AAD) { window.authType = AuthType.AAD; const account = win.hostedConfig.databaseAccount; const accountResourceId = account.id; const subscriptionId = accountResourceId && accountResourceId.split("subscriptions/")[1].split("/")[0]; const resourceGroup = accountResourceId && accountResourceId.split("resourceGroups/")[1].split("/")[0]; updateUserContext({ authorizationToken: `Bearer ${win.hostedConfig.authorizationToken}`, databaseAccount: win.hostedConfig.databaseAccount, }); const keys = await listKeys(subscriptionId, resourceGroup, account.name); explorer.initDataExplorerWithFrameInputs({ databaseAccount: account, subscriptionId, resourceGroup, masterKey: keys.primaryMasterKey, hasWriteAccess: true, //TODO: 425017 - support read access authorizationToken: `Bearer ${win.hostedConfig.authorizationToken}`, features: extractFeatures(), csmEndpoint: undefined, dnsSuffix: undefined, serverId: ServerIds.productionPortal, extensionEndpoint: configContext.BACKEND_ENDPOINT, subscriptionType: CollectionCreation.DefaultSubscriptionType, quotaId: undefined, addCollectionDefaultFlight: explorer.flight(), isTryCosmosDBSubscription: explorer.isTryCosmosDBSubscription(), }); explorer.isAccountReady(true); } } else if (config.platform === Platform.Emulator) { window.authType = AuthType.MasterKey; explorer = new Explorer(); explorer.selfServeType(SelfServeType.none); explorer.databaseAccount(emulatorAccount); explorer.isAccountReady(true); } else if (config.platform === Platform.Portal) { explorer = new Explorer(); // In development mode, try to load the iframe message from session storage. // This allows webpack hot reload to funciton properly if (process.env.NODE_ENV === "development") { const initMessage = sessionStorage.getItem("portalDataExplorerInitMessage"); if (initMessage) { const message = JSON.parse(initMessage); console.warn("Loaded cached portal iframe message from session storage"); console.dir(message); explorer.initDataExplorerWithFrameInputs(message); } } window.addEventListener("message", explorer.handleMessage.bind(explorer), false); } applyExplorerBindings(explorer); }); }, []); return (
Welcome to Azure Cosmos DB
Connecting...
Please reconnect to the account using the connection string.
Please save your work before you switch! When you switch to a different Azure Cosmos DB account, current Data Explorer tabs will be closed.
Proceed anyway?