mirror of
https://github.com/Azure/cosmos-explorer.git
synced 2025-02-18 10:17:16 +00:00
Merge branch 'master' of https://github.com/MokireddySampath/cosmos-explorer
This commit is contained in:
commit
40755e297d
8
.github/workflows/ci.yml
vendored
8
.github/workflows/ci.yml
vendored
@ -92,11 +92,11 @@ jobs:
|
|||||||
name: dist
|
name: dist
|
||||||
path: dist/
|
path: dist/
|
||||||
- name: Upload build to preview blob storage
|
- name: Upload build to preview blob storage
|
||||||
run: az storage blob upload-batch -d '$web' -s 'dist' --account-name cosmosexplorerpreview --destination-path "${{github.event.pull_request.head.sha || github.sha}}" --account-key="${PREVIEW_STORAGE_KEY}"
|
run: az storage blob upload-batch -d '$web' -s 'dist' --account-name cosmosexplorerpreview --destination-path "${{github.event.pull_request.head.sha || github.sha}}" --account-key="${PREVIEW_STORAGE_KEY}" --overwrite true
|
||||||
env:
|
env:
|
||||||
PREVIEW_STORAGE_KEY: ${{ secrets.PREVIEW_STORAGE_KEY }}
|
PREVIEW_STORAGE_KEY: ${{ secrets.PREVIEW_STORAGE_KEY }}
|
||||||
- name: Upload preview config to blob storage
|
- name: Upload preview config to blob storage
|
||||||
run: az storage blob upload -c '$web' -f ./preview/config.json --account-name cosmosexplorerpreview --name "${{github.event.pull_request.head.sha || github.sha}}/config.json" --account-key="${PREVIEW_STORAGE_KEY}"
|
run: az storage blob upload -c '$web' -f ./preview/config.json --account-name cosmosexplorerpreview --name "${{github.event.pull_request.head.sha || github.sha}}/config.json" --account-key="${PREVIEW_STORAGE_KEY}" --overwrite true
|
||||||
env:
|
env:
|
||||||
PREVIEW_STORAGE_KEY: ${{ secrets.PREVIEW_STORAGE_KEY }}
|
PREVIEW_STORAGE_KEY: ${{ secrets.PREVIEW_STORAGE_KEY }}
|
||||||
endtoendemulator:
|
endtoendemulator:
|
||||||
@ -182,7 +182,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
name: dist
|
name: dist
|
||||||
- run: cp ./configs/prod.json config.json
|
- run: cp ./configs/prod.json config.json
|
||||||
- run: nuget sources add -Name "ADO" -Source "$NUGET_SOURCE" -UserName "vimeng@microsoft.com" -Password "$AZURE_DEVOPS_PAT"
|
- run: nuget sources add -Name "ADO" -Source "$NUGET_SOURCE" -UserName "jawelton@microsoft.com" -Password "$AZURE_DEVOPS_PAT"
|
||||||
- run: nuget pack -Version "2.0.0-github-${GITHUB_SHA}"
|
- run: nuget pack -Version "2.0.0-github-${GITHUB_SHA}"
|
||||||
- run: nuget push -SkipDuplicate -Source "$NUGET_SOURCE" -ApiKey Az *.nupkg
|
- run: nuget push -SkipDuplicate -Source "$NUGET_SOURCE" -ApiKey Az *.nupkg
|
||||||
- uses: actions/upload-artifact@v2
|
- uses: actions/upload-artifact@v2
|
||||||
@ -207,7 +207,7 @@ jobs:
|
|||||||
name: dist
|
name: dist
|
||||||
- run: cp ./configs/mpac.json config.json
|
- run: cp ./configs/mpac.json config.json
|
||||||
- run: sed -i 's/Azure.Cosmos.DB.Data.Explorer/Azure.Cosmos.DB.Data.Explorer.MPAC/g' DataExplorer.nuspec
|
- run: sed -i 's/Azure.Cosmos.DB.Data.Explorer/Azure.Cosmos.DB.Data.Explorer.MPAC/g' DataExplorer.nuspec
|
||||||
- run: nuget sources add -Name "ADO" -Source "$NUGET_SOURCE" -UserName "vimeng@microsoft.com" -Password "$AZURE_DEVOPS_PAT"
|
- run: nuget sources add -Name "ADO" -Source "$NUGET_SOURCE" -UserName "jawelton@microsoft.com" -Password "$AZURE_DEVOPS_PAT"
|
||||||
- run: nuget pack -Version "2.0.0-github-${GITHUB_SHA}"
|
- run: nuget pack -Version "2.0.0-github-${GITHUB_SHA}"
|
||||||
- run: nuget push -SkipDuplicate -Source "$NUGET_SOURCE" -ApiKey Az *.nupkg
|
- run: nuget push -SkipDuplicate -Source "$NUGET_SOURCE" -ApiKey Az *.nupkg
|
||||||
- uses: actions/upload-artifact@v2
|
- uses: actions/upload-artifact@v2
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -989,7 +989,7 @@ export class AddCollectionPanel extends React.Component<AddCollectionPanelProps,
|
|||||||
private getPartitionKeyPlaceHolder(index?: number): string {
|
private getPartitionKeyPlaceHolder(index?: number): string {
|
||||||
switch (userContext.apiType) {
|
switch (userContext.apiType) {
|
||||||
case "Mongo":
|
case "Mongo":
|
||||||
return "e.g., address.zipCode";
|
return "e.g., categoryId";
|
||||||
case "Gremlin":
|
case "Gremlin":
|
||||||
return "e.g., /address";
|
return "e.g., /address";
|
||||||
case "SQL":
|
case "SQL":
|
||||||
@ -1121,7 +1121,7 @@ export class AddCollectionPanel extends React.Component<AddCollectionPanelProps,
|
|||||||
return userContext.apiType === "SQL" ? "/pk" : "pk";
|
return userContext.apiType === "SQL" ? "/pk" : "pk";
|
||||||
}
|
}
|
||||||
if (this.props.isQuickstart) {
|
if (this.props.isQuickstart) {
|
||||||
return userContext.apiType === "SQL" ? "/address" : "address";
|
return userContext.apiType === "SQL" ? "/categoryId" : "categoryId";
|
||||||
}
|
}
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
@ -565,7 +565,17 @@ export class SplashScreen extends React.Component<SplashScreenProps> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private getLearningResourceItems(): JSX.Element {
|
private getLearningResourceItems(): JSX.Element {
|
||||||
let items: { link: string; title: string; description: string }[];
|
interface item {
|
||||||
|
link: string;
|
||||||
|
title: string;
|
||||||
|
description: string;
|
||||||
|
}
|
||||||
|
const cdbLiveTv: item = {
|
||||||
|
link: "https://developer.azurecosmosdb.com/tv",
|
||||||
|
title: "Learn the Fundamentals",
|
||||||
|
description: "Watch Azure Cosmos DB Live TV show introductory and how to videos.",
|
||||||
|
};
|
||||||
|
let items: item[];
|
||||||
switch (userContext.apiType) {
|
switch (userContext.apiType) {
|
||||||
case "SQL":
|
case "SQL":
|
||||||
case "Postgres":
|
case "Postgres":
|
||||||
@ -575,11 +585,7 @@ export class SplashScreen extends React.Component<SplashScreenProps> {
|
|||||||
title: "Get Started using an SDK",
|
title: "Get Started using an SDK",
|
||||||
description: "Learn about the Azure Cosmos DB SDK.",
|
description: "Learn about the Azure Cosmos DB SDK.",
|
||||||
},
|
},
|
||||||
{
|
cdbLiveTv,
|
||||||
link: "https://aka.ms/msl-complex-queries",
|
|
||||||
title: "Master Complex Queries",
|
|
||||||
description: "Learn how to author complex queries.",
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
link: "https://aka.ms/msl-move-data",
|
link: "https://aka.ms/msl-move-data",
|
||||||
title: "Migrate Your Data",
|
title: "Migrate Your Data",
|
||||||
@ -599,11 +605,7 @@ export class SplashScreen extends React.Component<SplashScreenProps> {
|
|||||||
title: "Getting Started Guide",
|
title: "Getting Started Guide",
|
||||||
description: "Learn the basics to get started.",
|
description: "Learn the basics to get started.",
|
||||||
},
|
},
|
||||||
{
|
cdbLiveTv,
|
||||||
link: "http://aka.ms/mongodotnet",
|
|
||||||
title: "Build a web API",
|
|
||||||
description: "Create a web API with the.NET SDK.",
|
|
||||||
},
|
|
||||||
];
|
];
|
||||||
break;
|
break;
|
||||||
case "Cassandra":
|
case "Cassandra":
|
||||||
@ -613,11 +615,7 @@ export class SplashScreen extends React.Component<SplashScreenProps> {
|
|||||||
title: "Create a Container",
|
title: "Create a Container",
|
||||||
description: "Get to know the create a container options.",
|
description: "Get to know the create a container options.",
|
||||||
},
|
},
|
||||||
{
|
cdbLiveTv,
|
||||||
link: "https://aka.ms/cassandraserverdiagnostics",
|
|
||||||
title: "Run Server Diagnostics",
|
|
||||||
description: "Learn how to run server diagnostics.",
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
link: "https://aka.ms/Cassandrathroughput",
|
link: "https://aka.ms/Cassandrathroughput",
|
||||||
title: "Provision Throughput",
|
title: "Provision Throughput",
|
||||||
@ -637,11 +635,7 @@ export class SplashScreen extends React.Component<SplashScreenProps> {
|
|||||||
title: "Import Graph Data",
|
title: "Import Graph Data",
|
||||||
description: "Learn Bulk ingestion data using BulkExecutor",
|
description: "Learn Bulk ingestion data using BulkExecutor",
|
||||||
},
|
},
|
||||||
{
|
cdbLiveTv,
|
||||||
link: "https://aka.ms/graphoptimize",
|
|
||||||
title: "Optimize your Queries",
|
|
||||||
description: "Learn how to evaluate your Gremlin queries",
|
|
||||||
},
|
|
||||||
];
|
];
|
||||||
break;
|
break;
|
||||||
case "Tables":
|
case "Tables":
|
||||||
@ -656,11 +650,7 @@ export class SplashScreen extends React.Component<SplashScreenProps> {
|
|||||||
title: "Build a Java App",
|
title: "Build a Java App",
|
||||||
description: "Create a Azure Cosmos DB for Table app with Java SDK ",
|
description: "Create a Azure Cosmos DB for Table app with Java SDK ",
|
||||||
},
|
},
|
||||||
{
|
cdbLiveTv,
|
||||||
link: "https://aka.ms/tablenodejs",
|
|
||||||
title: "Build a Node.js App",
|
|
||||||
description: "Create a Azure Cosmos DB for Table app with Node.js SDK",
|
|
||||||
},
|
|
||||||
];
|
];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,23 @@ function isValidOrigin(allowedOrigins: ReadonlyArray<string>, event: MessageEven
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function shouldProcessMessage(event: MessageEvent): boolean {
|
||||||
|
if (typeof event.data !== "object") {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (event.data["signature"] !== "pcIframe") {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!("data" in event.data)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (typeof event.data["data"] !== "object") {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
export function isReadyMessage(event: MessageEvent): boolean {
|
export function isReadyMessage(event: MessageEvent): boolean {
|
||||||
if (!event?.data?.kind && !event?.data?.data) {
|
if (!event?.data?.kind && !event?.data?.data) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -10,7 +10,7 @@ const PortalIPs: { [key: string]: string[] } = {
|
|||||||
usnat: ["7.28.202.68"],
|
usnat: ["7.28.202.68"],
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getNetworkSettingsWarningMessage = (clientIpAddress: string): string => {
|
export const getNetworkSettingsWarningMessage = (): string => {
|
||||||
const accountProperties = userContext.databaseAccount?.properties;
|
const accountProperties = userContext.databaseAccount?.properties;
|
||||||
|
|
||||||
if (!accountProperties) {
|
if (!accountProperties) {
|
||||||
@ -40,13 +40,7 @@ export const getNetworkSettingsWarningMessage = (clientIpAddress: string): strin
|
|||||||
if (numberOfMatches !== portalIPs.length) {
|
if (numberOfMatches !== portalIPs.length) {
|
||||||
return "The Network settings for this account are preventing access from Data Explorer. Please allow access from Azure Portal to proceed.";
|
return "The Network settings for this account are preventing access from Data Explorer. Please allow access from Azure Portal to proceed.";
|
||||||
}
|
}
|
||||||
|
|
||||||
return "";
|
|
||||||
} else {
|
|
||||||
if (!clientIpAddress || ipRules.some((ipRule) => ipRule.ipAddressOrRange === clientIpAddress)) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
return "The Network settings for this account are preventing access from Data Explorer. Please add your current IP to the firewall rules to proceed.";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return "";
|
||||||
};
|
};
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
import Explorer from "Explorer/Explorer";
|
||||||
import { ReactTabKind, useTabs } from "hooks/useTabs";
|
import { ReactTabKind, useTabs } from "hooks/useTabs";
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import { getNetworkSettingsWarningMessage } from "Utils/NetworkUtility";
|
import { getNetworkSettingsWarningMessage } from "Utils/NetworkUtility";
|
||||||
@ -10,7 +11,6 @@ import { configContext, Platform, updateConfigContext } from "../ConfigContext";
|
|||||||
import { ActionType, DataExplorerAction } from "../Contracts/ActionContracts";
|
import { ActionType, DataExplorerAction } from "../Contracts/ActionContracts";
|
||||||
import { MessageTypes } from "../Contracts/ExplorerContracts";
|
import { MessageTypes } from "../Contracts/ExplorerContracts";
|
||||||
import { DataExplorerInputsFrame } from "../Contracts/ViewModels";
|
import { DataExplorerInputsFrame } from "../Contracts/ViewModels";
|
||||||
import Explorer from "../Explorer/Explorer";
|
|
||||||
import { handleOpenAction } from "../Explorer/OpenActions/OpenActions";
|
import { handleOpenAction } from "../Explorer/OpenActions/OpenActions";
|
||||||
import { useDatabases } from "../Explorer/useDatabases";
|
import { useDatabases } from "../Explorer/useDatabases";
|
||||||
import {
|
import {
|
||||||
@ -33,7 +33,7 @@ import { Node, PortalEnv, updateUserContext, userContext } from "../UserContext"
|
|||||||
import { listKeys } from "../Utils/arm/generatedClients/cosmos/databaseAccounts";
|
import { listKeys } from "../Utils/arm/generatedClients/cosmos/databaseAccounts";
|
||||||
import { DatabaseAccountListKeysResult } from "../Utils/arm/generatedClients/cosmos/types";
|
import { DatabaseAccountListKeysResult } from "../Utils/arm/generatedClients/cosmos/types";
|
||||||
import { getMsalInstance } from "../Utils/AuthorizationUtils";
|
import { getMsalInstance } from "../Utils/AuthorizationUtils";
|
||||||
import { isInvalidParentFrameOrigin } from "../Utils/MessageValidation";
|
import { isInvalidParentFrameOrigin, shouldProcessMessage } from "../Utils/MessageValidation";
|
||||||
|
|
||||||
// This hook will create a new instance of Explorer.ts and bind it to the DOM
|
// This hook will create a new instance of Explorer.ts and bind it to the DOM
|
||||||
// This hook has a LOT of magic, but ideally we can delete it once we have removed KO and switched entirely to React
|
// This hook has a LOT of magic, but ideally we can delete it once we have removed KO and switched entirely to React
|
||||||
@ -239,6 +239,7 @@ async function configurePortal(): Promise<Explorer> {
|
|||||||
updateUserContext({
|
updateUserContext({
|
||||||
authType: AuthType.AAD,
|
authType: AuthType.AAD,
|
||||||
});
|
});
|
||||||
|
let explorer: Explorer;
|
||||||
return new Promise((resolve) => {
|
return new Promise((resolve) => {
|
||||||
// In development mode, try to load the iframe message from session storage.
|
// In development mode, try to load the iframe message from session storage.
|
||||||
// This allows webpack hot reload to function properly in the portal
|
// This allows webpack hot reload to function properly in the portal
|
||||||
@ -251,7 +252,7 @@ async function configurePortal(): Promise<Explorer> {
|
|||||||
);
|
);
|
||||||
console.dir(message);
|
console.dir(message);
|
||||||
updateContextsFromPortalMessage(message);
|
updateContextsFromPortalMessage(message);
|
||||||
const explorer = new Explorer();
|
explorer = new Explorer();
|
||||||
// In development mode, save the iframe message from the portal in session storage.
|
// In development mode, save the iframe message from the portal in session storage.
|
||||||
// This allows webpack hot reload to funciton properly
|
// This allows webpack hot reload to funciton properly
|
||||||
if (process.env.NODE_ENV === "development") {
|
if (process.env.NODE_ENV === "development") {
|
||||||
@ -287,7 +288,7 @@ async function configurePortal(): Promise<Explorer> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
updateContextsFromPortalMessage(inputs);
|
updateContextsFromPortalMessage(inputs);
|
||||||
const explorer = new Explorer();
|
explorer = new Explorer();
|
||||||
resolve(explorer);
|
resolve(explorer);
|
||||||
if (openAction) {
|
if (openAction) {
|
||||||
handleOpenAction(openAction, useDatabases.getState().databases, explorer);
|
handleOpenAction(openAction, useDatabases.getState().databases, explorer);
|
||||||
@ -300,6 +301,8 @@ async function configurePortal(): Promise<Explorer> {
|
|||||||
} else {
|
} else {
|
||||||
useTabs.getState().closeTabsByComparator((tab) => tab.tabId === event.data?.data?.tabId);
|
useTabs.getState().closeTabsByComparator((tab) => tab.tabId === event.data?.data?.tabId);
|
||||||
}
|
}
|
||||||
|
} else if (message?.type === MessageTypes.RefreshResources) {
|
||||||
|
explorer.onRefreshResourcesClick();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
false
|
false
|
||||||
@ -314,23 +317,6 @@ function shouldForwardMessage(message: PortalMessage, messageOrigin: string) {
|
|||||||
return messageOrigin === window.document.location.origin && message.type === MessageTypes.TelemetryInfo;
|
return messageOrigin === window.document.location.origin && message.type === MessageTypes.TelemetryInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
function shouldProcessMessage(event: MessageEvent): boolean {
|
|
||||||
if (typeof event.data !== "object") {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (event.data["signature"] !== "pcIframe") {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!("data" in event.data)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (typeof event.data["data"] !== "object") {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function updateContextsFromPortalMessage(inputs: DataExplorerInputsFrame) {
|
function updateContextsFromPortalMessage(inputs: DataExplorerInputsFrame) {
|
||||||
if (
|
if (
|
||||||
configContext.BACKEND_ENDPOINT &&
|
configContext.BACKEND_ENDPOINT &&
|
||||||
@ -382,7 +368,7 @@ function updateContextsFromPortalMessage(inputs: DataExplorerInputsFrame) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const warningMessage = getNetworkSettingsWarningMessage(inputs.clientIpAddress);
|
const warningMessage = getNetworkSettingsWarningMessage();
|
||||||
useTabs.getState().setNetworkSettingsWarning(warningMessage);
|
useTabs.getState().setNetworkSettingsWarning(warningMessage);
|
||||||
|
|
||||||
if (inputs.features) {
|
if (inputs.features) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user