mirror of
https://github.com/Azure/cosmos-explorer.git
synced 2025-12-23 19:01:28 +00:00
Compare commits
1 Commits
fixed-inpu
...
resolve_Sh
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2f6a89142d |
@@ -21,8 +21,16 @@ src/Common/MongoUtility.ts
|
||||
src/Common/NotificationsClientBase.ts
|
||||
src/Common/QueriesClient.ts
|
||||
src/Common/Splitter.ts
|
||||
src/Config.ts
|
||||
src/Contracts/ActionContracts.ts
|
||||
src/Contracts/DataModels.ts
|
||||
src/Contracts/Diagnostics.ts
|
||||
src/Contracts/ExplorerContracts.ts
|
||||
src/Contracts/Versions.ts
|
||||
src/Contracts/ViewModels.ts
|
||||
src/Controls/Heatmap/Heatmap.test.ts
|
||||
src/Controls/Heatmap/Heatmap.ts
|
||||
src/Controls/Heatmap/HeatmapDatatypes.ts
|
||||
src/Definitions/datatables.d.ts
|
||||
src/Definitions/gif.d.ts
|
||||
src/Definitions/globals.d.ts
|
||||
@@ -36,10 +44,29 @@ src/Definitions/png.d.ts
|
||||
src/Definitions/svg.d.ts
|
||||
src/Explorer/ComponentRegisterer.test.ts
|
||||
src/Explorer/ComponentRegisterer.ts
|
||||
src/Explorer/Controls/CollapsiblePanel/CollapsiblePanelComponent.ts
|
||||
src/Explorer/Controls/DiffEditor/DiffEditorComponent.ts
|
||||
|
||||
src/Explorer/Controls/DynamicList/DynamicList.test.ts
|
||||
src/Explorer/Controls/DynamicList/DynamicListComponent.ts
|
||||
src/Explorer/Controls/Editor/EditorComponent.ts
|
||||
src/Explorer/Controls/ErrorDisplayComponent/ErrorDisplayComponent.ts
|
||||
src/Explorer/Controls/InputTypeahead/InputTypeahead.ts
|
||||
src/Explorer/Controls/JsonEditor/JsonEditorComponent.ts
|
||||
src/Explorer/Controls/Notebook/NotebookAppMessageHandler.ts
|
||||
src/Explorer/Controls/ThroughputInput/ThroughputInputComponent.ts
|
||||
src/Explorer/Controls/ThroughputInput/ThroughputInputComponentAutoPilotV3.ts
|
||||
src/Explorer/Controls/Toolbar/IToolbarAction.ts
|
||||
src/Explorer/Controls/Toolbar/IToolbarDisplayable.ts
|
||||
src/Explorer/Controls/Toolbar/IToolbarDropDown.ts
|
||||
src/Explorer/Controls/Toolbar/IToolbarItem.ts
|
||||
src/Explorer/Controls/Toolbar/IToolbarSeperator.ts
|
||||
src/Explorer/Controls/Toolbar/IToolbarToggle.ts
|
||||
src/Explorer/Controls/Toolbar/KeyCodes.ts
|
||||
src/Explorer/Controls/Toolbar/Toolbar.ts
|
||||
src/Explorer/Controls/Toolbar/ToolbarAction.ts
|
||||
src/Explorer/Controls/Toolbar/ToolbarDropDown.ts
|
||||
src/Explorer/Controls/Toolbar/ToolbarToggle.ts
|
||||
src/Explorer/Controls/Toolbar/Utilities.ts
|
||||
src/Explorer/DataSamples/ContainerSampleGenerator.test.ts
|
||||
src/Explorer/DataSamples/ContainerSampleGenerator.ts
|
||||
src/Explorer/DataSamples/DataSamplesUtil.test.ts
|
||||
@@ -126,7 +153,6 @@ src/Juno/JunoClient.test.ts
|
||||
src/Juno/JunoClient.ts
|
||||
src/Platform/Hosted/Authorization.ts
|
||||
src/ReactDevTools.ts
|
||||
src/Shared/Constants.ts
|
||||
src/Shared/DefaultExperienceUtility.test.ts
|
||||
src/Shared/DefaultExperienceUtility.ts
|
||||
src/Shared/appInsights.ts
|
||||
|
||||
@@ -22,8 +22,8 @@ describe("The Heatmap Control", () => {
|
||||
};
|
||||
|
||||
let heatmap: Heatmap;
|
||||
const theme: PortalTheme = 1;
|
||||
const divElement = `<div id="${Heatmap.elementId}"></div>`;
|
||||
let theme: PortalTheme = 1;
|
||||
const divElement: string = `<div id="${Heatmap.elementId}"></div>`;
|
||||
|
||||
describe("drawHeatmap rendering", () => {
|
||||
beforeEach(() => {
|
||||
@@ -100,7 +100,7 @@ describe("iframe rendering when there is no data", () => {
|
||||
});
|
||||
|
||||
it("should show a no data message with a dark theme", () => {
|
||||
const data = {
|
||||
let data = {
|
||||
data: {
|
||||
signature: "pcIframe",
|
||||
data: {
|
||||
@@ -111,7 +111,7 @@ describe("iframe rendering when there is no data", () => {
|
||||
},
|
||||
};
|
||||
|
||||
const divElement = `<div id="${Heatmap.elementId}"></div>`;
|
||||
const divElement: string = `<div id="${Heatmap.elementId}"></div>`;
|
||||
document.body.innerHTML = divElement;
|
||||
|
||||
handleMessage(data as MessageEvent);
|
||||
@@ -120,7 +120,7 @@ describe("iframe rendering when there is no data", () => {
|
||||
});
|
||||
|
||||
it("should show a no data message with a white theme", () => {
|
||||
const data = {
|
||||
let data = {
|
||||
data: {
|
||||
signature: "pcIframe",
|
||||
data: {
|
||||
@@ -131,7 +131,7 @@ describe("iframe rendering when there is no data", () => {
|
||||
},
|
||||
};
|
||||
|
||||
const divElement = `<div id="${Heatmap.elementId}"></div>`;
|
||||
const divElement: string = `<div id="${Heatmap.elementId}"></div>`;
|
||||
document.body.innerHTML = divElement;
|
||||
|
||||
handleMessage(data as MessageEvent);
|
||||
|
||||
@@ -39,7 +39,7 @@ export class Heatmap {
|
||||
}
|
||||
}
|
||||
|
||||
private _getFontStyles(size: number = StyleConstants.MediumFontSize, color = "#838383"): FontSettings {
|
||||
private _getFontStyles(size: number = StyleConstants.MediumFontSize, color: string = "#838383"): FontSettings {
|
||||
return {
|
||||
family: StyleConstants.DataExplorerFont,
|
||||
size,
|
||||
@@ -78,9 +78,9 @@ export class Heatmap {
|
||||
// go thru all rows and create 2d matrix for heatmap...
|
||||
for (let i = 0; i < rows.length; i++) {
|
||||
output.yAxisPoints.push(rows[i]);
|
||||
const dataPoints: number[] = [];
|
||||
let dataPoints: number[] = [];
|
||||
for (let a = 0; a < output.xAxisPoints.length; a++) {
|
||||
const row: PartitionTimeStampToData = data[rows[i]];
|
||||
let row: PartitionTimeStampToData = data[rows[i]];
|
||||
dataPoints.push(row[output.xAxisPoints[a]]["Normalized Throughput"]);
|
||||
}
|
||||
output.dataPoints.push(dataPoints);
|
||||
@@ -193,7 +193,7 @@ export class Heatmap {
|
||||
this._getLayoutSettings(),
|
||||
this._getChartDisplaySettings()
|
||||
);
|
||||
const plotDiv: any = document.getElementById(Heatmap.elementId);
|
||||
let plotDiv: any = document.getElementById(Heatmap.elementId);
|
||||
plotDiv.on("plotly_click", (data: any) => {
|
||||
let timeSelected: string = data.points[0].x;
|
||||
timeSelected = timeSelected.replace(" ", "T");
|
||||
@@ -205,7 +205,7 @@ export class Heatmap {
|
||||
break;
|
||||
}
|
||||
}
|
||||
const output = [];
|
||||
let output = [];
|
||||
for (let i = 0; i < this._chartData.dataPoints.length; i++) {
|
||||
output.push(this._chartData.dataPoints[i][xAxisIndex]);
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { shallow } from "enzyme";
|
||||
import React from "react";
|
||||
import "../../../../externals/jquery.typeahead.min.js";
|
||||
import { shallow } from "enzyme";
|
||||
import { InputTypeaheadComponent, InputTypeaheadComponentProps } from "./InputTypeaheadComponent";
|
||||
import "../../../../externals/jquery.typeahead.min.js";
|
||||
|
||||
describe("inputTypeahead", () => {
|
||||
it("renders <input />", () => {
|
||||
@@ -12,12 +12,6 @@ describe("inputTypeahead", () => {
|
||||
],
|
||||
placeholder: "placeholder",
|
||||
useTextarea: false,
|
||||
onNewValue: () => {
|
||||
("");
|
||||
},
|
||||
submitFct: () => {
|
||||
("");
|
||||
},
|
||||
};
|
||||
|
||||
const wrapper = shallow(<InputTypeaheadComponent {...props} />);
|
||||
@@ -32,12 +26,6 @@ describe("inputTypeahead", () => {
|
||||
],
|
||||
placeholder: "placeholder",
|
||||
useTextarea: true,
|
||||
onNewValue: () => {
|
||||
("");
|
||||
},
|
||||
submitFct: () => {
|
||||
("");
|
||||
},
|
||||
};
|
||||
|
||||
const wrapper = shallow(<InputTypeaheadComponent {...props} />);
|
||||
|
||||
@@ -33,7 +33,7 @@ export interface InputTypeaheadComponentProps {
|
||||
/**
|
||||
* The current string value of <input>
|
||||
*/
|
||||
onNewValue: (newValue?: string) => void;
|
||||
onNewValue?: (newValue: string) => void;
|
||||
// inputValue?:ko.Observable<string>;
|
||||
|
||||
/**
|
||||
@@ -55,7 +55,7 @@ export interface InputTypeaheadComponentProps {
|
||||
/**
|
||||
* This function gets called when pressing ENTER on the input box
|
||||
*/
|
||||
submitFct?: (inputValue?: string, selection?: Item) => void;
|
||||
submitFct?: (inputValue: string, selection: Item) => void;
|
||||
|
||||
/**
|
||||
* Typehead comes with a Search button that we normally remove.
|
||||
@@ -76,7 +76,7 @@ export interface InputTypeaheadComponentProps {
|
||||
|
||||
interface InputTypeaheadComponentState {
|
||||
isSuggestionVisible: boolean;
|
||||
selectedChoice?: Item;
|
||||
selectedChoice: Item;
|
||||
filteredChoices: Item[];
|
||||
}
|
||||
|
||||
@@ -96,21 +96,21 @@ export class InputTypeaheadComponent extends React.Component<
|
||||
};
|
||||
}
|
||||
|
||||
private onRenderCell = (item?: Item): JSX.Element => {
|
||||
private onRenderCell = (item: Item): JSX.Element => {
|
||||
return (
|
||||
<div className="input-typeahead-chocies-container" onClick={() => this.onChoiceClick(item)}>
|
||||
<p className="choice-caption">{item?.caption}</p>
|
||||
<span>{item?.value}</span>
|
||||
<p className="choice-caption">{item.caption}</p>
|
||||
<span>{item.value}</span>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
private onChoiceClick = (item?: Item): void => {
|
||||
this.props.onNewValue(item?.caption);
|
||||
private onChoiceClick = (item: Item): void => {
|
||||
this.props.onNewValue(item.caption);
|
||||
this.setState({ isSuggestionVisible: false, selectedChoice: item });
|
||||
};
|
||||
|
||||
private handleChange = (value?: string): void => {
|
||||
private handleChange = (value: string): void => {
|
||||
if (!value) {
|
||||
this.setState({ isSuggestionVisible: true });
|
||||
}
|
||||
@@ -130,7 +130,7 @@ export class InputTypeaheadComponent extends React.Component<
|
||||
}
|
||||
};
|
||||
|
||||
private filterChoiceByValue = (choices: Item[], searchKeyword?: string): Item[] => {
|
||||
private filterChoiceByValue = (choices: Item[], searchKeyword: string): Item[] => {
|
||||
return choices.filter((choice) =>
|
||||
// @ts-ignore
|
||||
Object.keys(choice).some((key) => choice[key].toLowerCase().includes(searchKeyword.toLowerCase()))
|
||||
@@ -138,7 +138,7 @@ export class InputTypeaheadComponent extends React.Component<
|
||||
};
|
||||
|
||||
public render(): JSX.Element {
|
||||
const { defaultValue, useTextarea, placeholder, onNewValue, submitFct } = this.props;
|
||||
const { defaultValue, useTextarea, placeholder, onNewValue } = this.props;
|
||||
const { isSuggestionVisible, selectedChoice, filteredChoices } = this.state;
|
||||
const theme = getTheme();
|
||||
|
||||
@@ -185,7 +185,7 @@ export class InputTypeaheadComponent extends React.Component<
|
||||
styles={iconButtonStyles}
|
||||
iconProps={searchIcon}
|
||||
ariaLabel="Search Button"
|
||||
onClick={() => submitFct && submitFct(defaultValue, selectedChoice)}
|
||||
onClick={() => this.props.submitFct(defaultValue, selectedChoice)}
|
||||
/>
|
||||
)}
|
||||
</Stack>
|
||||
|
||||
@@ -550,72 +550,6 @@ export class AddCollectionPanel extends React.Component<AddCollectionPanelProps,
|
||||
</Stack>
|
||||
)}
|
||||
|
||||
{this.shouldShowAnalyticalStoreOptions() && (
|
||||
<Stack className="panelGroupSpacing">
|
||||
<Stack horizontal>
|
||||
<Text className="panelTextBold" variant="small">
|
||||
Analytical store
|
||||
</Text>
|
||||
<TooltipHost
|
||||
directionalHint={DirectionalHint.bottomLeftEdge}
|
||||
content={this.getAnalyticalStorageTooltipContent()}
|
||||
>
|
||||
<Icon iconName="Info" className="panelInfoIcon" />
|
||||
</TooltipHost>
|
||||
</Stack>
|
||||
|
||||
<Stack horizontal verticalAlign="center">
|
||||
<input
|
||||
className="panelRadioBtn"
|
||||
checked={this.state.enableAnalyticalStore}
|
||||
disabled={!this.isSynapseLinkEnabled()}
|
||||
aria-label="Enable analytical store"
|
||||
aria-checked={this.state.enableAnalyticalStore}
|
||||
name="analyticalStore"
|
||||
type="radio"
|
||||
role="radio"
|
||||
id="enableAnalyticalStoreBtn"
|
||||
tabIndex={0}
|
||||
onChange={this.onEnableAnalyticalStoreRadioBtnChange.bind(this)}
|
||||
/>
|
||||
<span className="panelRadioBtnLabel">On</span>
|
||||
|
||||
<input
|
||||
className="panelRadioBtn"
|
||||
checked={!this.state.enableAnalyticalStore}
|
||||
disabled={!this.isSynapseLinkEnabled()}
|
||||
aria-label="Disable analytical store"
|
||||
aria-checked={!this.state.enableAnalyticalStore}
|
||||
name="analyticalStore"
|
||||
type="radio"
|
||||
role="radio"
|
||||
id="disableAnalyticalStoreBtn"
|
||||
tabIndex={0}
|
||||
onChange={this.onDisableAnalyticalStoreRadioBtnChange.bind(this)}
|
||||
/>
|
||||
<span className="panelRadioBtnLabel">Off</span>
|
||||
</Stack>
|
||||
|
||||
{!this.isSynapseLinkEnabled() && (
|
||||
<Stack className="panelGroupSpacing">
|
||||
<Text variant="small">
|
||||
Azure Synapse Link is required for creating an analytical store{" "}
|
||||
{getCollectionName().toLocaleLowerCase()}. Enable Synapse Link for this Cosmos DB account.{" "}
|
||||
<Link href="https://aka.ms/cosmosdb-synapselink" target="_blank">
|
||||
Learn more
|
||||
</Link>
|
||||
</Text>
|
||||
<DefaultButton
|
||||
text="Enable"
|
||||
onClick={() => this.props.explorer.openEnableSynapseLinkDialog()}
|
||||
style={{ height: 27, width: 80 }}
|
||||
styles={{ label: { fontSize: 12 } }}
|
||||
/>
|
||||
</Stack>
|
||||
)}
|
||||
</Stack>
|
||||
)}
|
||||
|
||||
{userContext.apiType !== "Tables" && (
|
||||
<CollapsibleSectionComponent
|
||||
title="Advanced"
|
||||
@@ -670,6 +604,72 @@ export class AddCollectionPanel extends React.Component<AddCollectionPanelProps,
|
||||
}
|
||||
/>
|
||||
)}
|
||||
|
||||
{this.shouldShowAnalyticalStoreOptions() && (
|
||||
<Stack className="panelGroupSpacing">
|
||||
<Stack horizontal>
|
||||
<Text className="panelTextBold" variant="small">
|
||||
Analytical store
|
||||
</Text>
|
||||
<TooltipHost
|
||||
directionalHint={DirectionalHint.bottomLeftEdge}
|
||||
content={this.getAnalyticalStorageTooltipContent()}
|
||||
>
|
||||
<Icon iconName="Info" className="panelInfoIcon" />
|
||||
</TooltipHost>
|
||||
</Stack>
|
||||
|
||||
<Stack horizontal verticalAlign="center">
|
||||
<input
|
||||
className="panelRadioBtn"
|
||||
checked={this.state.enableAnalyticalStore}
|
||||
disabled={!this.isSynapseLinkEnabled()}
|
||||
aria-label="Enable analytical store"
|
||||
aria-checked={this.state.enableAnalyticalStore}
|
||||
name="analyticalStore"
|
||||
type="radio"
|
||||
role="radio"
|
||||
id="enableAnalyticalStoreBtn"
|
||||
tabIndex={0}
|
||||
onChange={this.onEnableAnalyticalStoreRadioBtnChange.bind(this)}
|
||||
/>
|
||||
<span className="panelRadioBtnLabel">On</span>
|
||||
|
||||
<input
|
||||
className="panelRadioBtn"
|
||||
checked={!this.state.enableAnalyticalStore}
|
||||
disabled={!this.isSynapseLinkEnabled()}
|
||||
aria-label="Disable analytical store"
|
||||
aria-checked={!this.state.enableAnalyticalStore}
|
||||
name="analyticalStore"
|
||||
type="radio"
|
||||
role="radio"
|
||||
id="disableAnalyticalStoreBtn"
|
||||
tabIndex={0}
|
||||
onChange={this.onDisableAnalyticalStoreRadioBtnChange.bind(this)}
|
||||
/>
|
||||
<span className="panelRadioBtnLabel">Off</span>
|
||||
</Stack>
|
||||
|
||||
{!this.isSynapseLinkEnabled() && (
|
||||
<Stack className="panelGroupSpacing">
|
||||
<Text variant="small">
|
||||
Azure Synapse Link is required for creating an analytical store{" "}
|
||||
{getCollectionName().toLocaleLowerCase()}. Enable Synapse Link for this Cosmos DB account.{" "}
|
||||
<Link href="https://aka.ms/cosmosdb-synapselink" target="_blank">
|
||||
Learn more
|
||||
</Link>
|
||||
</Text>
|
||||
<DefaultButton
|
||||
text="Enable"
|
||||
onClick={() => this.props.explorer.openEnableSynapseLinkDialog()}
|
||||
style={{ height: 27, width: 80 }}
|
||||
styles={{ label: { fontSize: 12 } }}
|
||||
/>
|
||||
</Stack>
|
||||
)}
|
||||
</Stack>
|
||||
)}
|
||||
</Stack>
|
||||
</CollapsibleSectionComponent>
|
||||
)}
|
||||
|
||||
@@ -1,208 +0,0 @@
|
||||
import { SubscriptionType } from "../Contracts/SubscriptionType";
|
||||
|
||||
export const hoursInAMonth = 730;
|
||||
export class AutoscalePricing {
|
||||
public static MonthlyPricing = {
|
||||
default: {
|
||||
singleMaster: {
|
||||
Currency: "USD",
|
||||
CurrencySign: "$",
|
||||
Standard: {
|
||||
StartingPrice: 24,
|
||||
PricePerRU: 0.09,
|
||||
PricePerGB: 0.25,
|
||||
},
|
||||
},
|
||||
multiMaster: {
|
||||
Currency: "USD",
|
||||
CurrencySign: "$",
|
||||
Standard: {
|
||||
StartingPrice: 24,
|
||||
PricePerRU: 0.12,
|
||||
PricePerGB: 0.25,
|
||||
},
|
||||
},
|
||||
},
|
||||
mooncake: {
|
||||
singleMaster: {
|
||||
Currency: "RMB",
|
||||
CurrencySign: "¥",
|
||||
Standard: {
|
||||
StartingPrice: 152,
|
||||
PricePerRU: 0.57,
|
||||
PricePerGB: 2.576,
|
||||
},
|
||||
},
|
||||
multiMaster: {
|
||||
Currency: "RMB",
|
||||
CurrencySign: "¥",
|
||||
Standard: {
|
||||
StartingPrice: 152,
|
||||
PricePerRU: 0.76,
|
||||
PricePerGB: 2.576,
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
public static HourlyPricing = {
|
||||
default: {
|
||||
singleMaster: {
|
||||
Currency: "USD",
|
||||
CurrencySign: "$",
|
||||
Standard: {
|
||||
StartingPrice: 24 / hoursInAMonth,
|
||||
PricePerRU: 0.00012,
|
||||
PricePerGB: 0.25 / hoursInAMonth,
|
||||
},
|
||||
},
|
||||
multiMaster: {
|
||||
Currency: "USD",
|
||||
CurrencySign: "$",
|
||||
Standard: {
|
||||
StartingPrice: 24 / hoursInAMonth,
|
||||
PricePerRU: 0.00016,
|
||||
PricePerGB: 0.25 / hoursInAMonth,
|
||||
},
|
||||
},
|
||||
},
|
||||
mooncake: {
|
||||
singleMaster: {
|
||||
Currency: "RMB",
|
||||
CurrencySign: "¥",
|
||||
Standard: {
|
||||
StartingPrice: AutoscalePricing.MonthlyPricing.mooncake.singleMaster.Standard.StartingPrice / hoursInAMonth, // per hour
|
||||
PricePerRU: 0.000765,
|
||||
PricePerGB: AutoscalePricing.MonthlyPricing.mooncake.singleMaster.Standard.PricePerGB / hoursInAMonth,
|
||||
},
|
||||
},
|
||||
multiMaster: {
|
||||
Currency: "RMB",
|
||||
CurrencySign: "¥",
|
||||
Standard: {
|
||||
StartingPrice: AutoscalePricing.MonthlyPricing.mooncake.multiMaster.Standard.StartingPrice / hoursInAMonth, // per hour
|
||||
PricePerRU: 0.00102,
|
||||
PricePerGB: AutoscalePricing.MonthlyPricing.mooncake.multiMaster.Standard.PricePerGB / hoursInAMonth,
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
export class OfferPricing {
|
||||
public static MonthlyPricing = {
|
||||
default: {
|
||||
Currency: "USD",
|
||||
CurrencySign: "$",
|
||||
S1Price: 25,
|
||||
S2Price: 50,
|
||||
S3Price: 100,
|
||||
Standard: {
|
||||
StartingPrice: 24,
|
||||
PricePerRU: 0.06,
|
||||
PricePerGB: 0.25,
|
||||
},
|
||||
},
|
||||
mooncake: {
|
||||
Currency: "RMB",
|
||||
CurrencySign: "¥",
|
||||
S1Price: 110.3,
|
||||
S2Price: 220.6,
|
||||
S3Price: 441.2,
|
||||
Standard: {
|
||||
StartingPrice: 152,
|
||||
PricePerRU: 0.3794,
|
||||
PricePerGB: 2.576,
|
||||
},
|
||||
},
|
||||
};
|
||||
public static HourlyPricing = {
|
||||
default: {
|
||||
Currency: "USD",
|
||||
CurrencySign: "$",
|
||||
S1Price: 0.0336,
|
||||
S2Price: 0.0672,
|
||||
S3Price: 0.1344,
|
||||
Standard: {
|
||||
StartingPrice: 24 / hoursInAMonth, // per hour
|
||||
PricePerRU: 0.00008,
|
||||
PricePerGB: 0.25 / hoursInAMonth,
|
||||
},
|
||||
},
|
||||
mooncake: {
|
||||
Currency: "RMB",
|
||||
CurrencySign: "¥",
|
||||
S1Price: 0.15,
|
||||
S2Price: 0.3,
|
||||
S3Price: 0.6,
|
||||
Standard: {
|
||||
StartingPrice: OfferPricing.MonthlyPricing.mooncake.Standard.StartingPrice / hoursInAMonth, // per hour
|
||||
PricePerRU: 0.00051,
|
||||
PricePerGB: OfferPricing.MonthlyPricing.mooncake.Standard.PricePerGB / hoursInAMonth,
|
||||
},
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
export class CollectionCreation {
|
||||
// TODO generate these values based on Product\Services\Documents\ImageStore\GatewayApplication\Settings.xml
|
||||
public static readonly MinRUPerPartitionBelow7Partitions: number = 400;
|
||||
public static readonly MinRU7PartitionsTo25Partitions: number = 2500;
|
||||
public static readonly MinRUPerPartitionAbove25Partitions: number = 100;
|
||||
public static readonly MaxRUPerPartition: number = 10000;
|
||||
public static readonly MinPartitionedCollectionRUs: number = 2500;
|
||||
|
||||
public static readonly NumberOfPartitionsInFixedCollection: number = 1;
|
||||
public static readonly NumberOfPartitionsInUnlimitedCollection: number = 10;
|
||||
|
||||
public static storage10Gb: string = "10";
|
||||
public static storage100Gb: string = "100";
|
||||
|
||||
public static readonly DefaultCollectionRUs1000: number = 1000;
|
||||
public static readonly DefaultCollectionRUs10K: number = 10000;
|
||||
public static readonly DefaultCollectionRUs400: number = 400;
|
||||
public static readonly DefaultCollectionRUs2000: number = 2000;
|
||||
public static readonly DefaultCollectionRUs2500: number = 2500;
|
||||
public static readonly DefaultCollectionRUs5000: number = 5000;
|
||||
public static readonly DefaultCollectionRUs15000: number = 15000;
|
||||
public static readonly DefaultCollectionRUs20000: number = 20000;
|
||||
public static readonly DefaultCollectionRUs25000: number = 25000;
|
||||
public static readonly DefaultCollectionRUs100K: number = 100000;
|
||||
public static readonly DefaultCollectionRUs1Million: number = 1000000;
|
||||
|
||||
public static readonly DefaultAddCollectionDefaultFlight: string = "0";
|
||||
public static readonly DefaultSubscriptionType: SubscriptionType = SubscriptionType.Free;
|
||||
|
||||
public static readonly TablesAPIDefaultDatabase: string = "TablesDB";
|
||||
}
|
||||
|
||||
export const CollectionCreationDefaults = {
|
||||
storage: CollectionCreation.storage100Gb,
|
||||
throughput: {
|
||||
fixed: CollectionCreation.DefaultCollectionRUs400,
|
||||
unlimited: CollectionCreation.DefaultCollectionRUs400,
|
||||
unlimitedmax: CollectionCreation.DefaultCollectionRUs1Million,
|
||||
unlimitedmin: CollectionCreation.DefaultCollectionRUs400,
|
||||
shared: CollectionCreation.DefaultCollectionRUs400,
|
||||
},
|
||||
} as const;
|
||||
|
||||
export class SubscriptionUtilMappings {
|
||||
public static FreeTierSubscriptionIds: string[] = [
|
||||
"b8f2ff04-0a81-4cf9-95ef-5828d16981d2",
|
||||
"39b1fdff-e5b2-4f83-adb4-33cb3aabf5ea",
|
||||
"41f6d14d-ece1-46e4-942c-02c00d67f7d6",
|
||||
"11dc62e3-77dc-4ef5-a46b-480ec6caa8fe",
|
||||
"199d0919-60bd-448e-b64d-8461a0fe9747",
|
||||
"a57b6849-d443-44cf-a3b7-7dd07ead9401",
|
||||
];
|
||||
}
|
||||
|
||||
export class AutopilotDocumentation {
|
||||
public static Url: string = "https://aka.ms/cosmos-autoscale-info";
|
||||
}
|
||||
|
||||
export class FreeTierLimits {
|
||||
public static RU: number = 1000;
|
||||
public static Storage: number = 25;
|
||||
}
|
||||
87
src/Shared/Constants/AutoscalePricing.ts
Normal file
87
src/Shared/Constants/AutoscalePricing.ts
Normal file
@@ -0,0 +1,87 @@
|
||||
import { hoursInAMonth } from "./";
|
||||
|
||||
export const MonthlyPricing = {
|
||||
default: {
|
||||
singleMaster: {
|
||||
Currency: "USD",
|
||||
CurrencySign: "$",
|
||||
Standard: {
|
||||
StartingPrice: 24,
|
||||
PricePerRU: 0.09,
|
||||
PricePerGB: 0.25,
|
||||
},
|
||||
},
|
||||
multiMaster: {
|
||||
Currency: "USD",
|
||||
CurrencySign: "$",
|
||||
Standard: {
|
||||
StartingPrice: 24,
|
||||
PricePerRU: 0.12,
|
||||
PricePerGB: 0.25,
|
||||
},
|
||||
},
|
||||
},
|
||||
mooncake: {
|
||||
singleMaster: {
|
||||
Currency: "RMB",
|
||||
CurrencySign: "¥",
|
||||
Standard: {
|
||||
StartingPrice: 152,
|
||||
PricePerRU: 0.57,
|
||||
PricePerGB: 2.576,
|
||||
},
|
||||
},
|
||||
multiMaster: {
|
||||
Currency: "RMB",
|
||||
CurrencySign: "¥",
|
||||
Standard: {
|
||||
StartingPrice: 152,
|
||||
PricePerRU: 0.76,
|
||||
PricePerGB: 2.576,
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export const HourlyPricing = {
|
||||
default: {
|
||||
singleMaster: {
|
||||
Currency: "USD",
|
||||
CurrencySign: "$",
|
||||
Standard: {
|
||||
StartingPrice: 24 / hoursInAMonth,
|
||||
PricePerRU: 0.00012,
|
||||
PricePerGB: 0.25 / hoursInAMonth,
|
||||
},
|
||||
},
|
||||
multiMaster: {
|
||||
Currency: "USD",
|
||||
CurrencySign: "$",
|
||||
Standard: {
|
||||
StartingPrice: 24 / hoursInAMonth,
|
||||
PricePerRU: 0.00016,
|
||||
PricePerGB: 0.25 / hoursInAMonth,
|
||||
},
|
||||
},
|
||||
},
|
||||
mooncake: {
|
||||
singleMaster: {
|
||||
Currency: "RMB",
|
||||
CurrencySign: "¥",
|
||||
Standard: {
|
||||
StartingPrice: MonthlyPricing.mooncake.singleMaster.Standard.StartingPrice / hoursInAMonth, // per hour
|
||||
PricePerRU: 0.000765,
|
||||
PricePerGB: MonthlyPricing.mooncake.singleMaster.Standard.PricePerGB / hoursInAMonth,
|
||||
},
|
||||
},
|
||||
multiMaster: {
|
||||
Currency: "RMB",
|
||||
CurrencySign: "¥",
|
||||
Standard: {
|
||||
StartingPrice: MonthlyPricing.mooncake.multiMaster.Standard.StartingPrice / hoursInAMonth, // per hour
|
||||
PricePerRU: 0.00102,
|
||||
PricePerGB: MonthlyPricing.mooncake.multiMaster.Standard.PricePerGB / hoursInAMonth,
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
53
src/Shared/Constants/OfferPricing.ts
Normal file
53
src/Shared/Constants/OfferPricing.ts
Normal file
@@ -0,0 +1,53 @@
|
||||
import { hoursInAMonth } from "./";
|
||||
export const MonthlyPricing = {
|
||||
default: {
|
||||
Currency: "USD",
|
||||
CurrencySign: "$",
|
||||
S1Price: 25,
|
||||
S2Price: 50,
|
||||
S3Price: 100,
|
||||
Standard: {
|
||||
StartingPrice: 24,
|
||||
PricePerRU: 0.06,
|
||||
PricePerGB: 0.25,
|
||||
},
|
||||
},
|
||||
mooncake: {
|
||||
Currency: "RMB",
|
||||
CurrencySign: "¥",
|
||||
S1Price: 110.3,
|
||||
S2Price: 220.6,
|
||||
S3Price: 441.2,
|
||||
Standard: {
|
||||
StartingPrice: 152,
|
||||
PricePerRU: 0.3794,
|
||||
PricePerGB: 2.576,
|
||||
},
|
||||
},
|
||||
};
|
||||
export const HourlyPricing = {
|
||||
default: {
|
||||
Currency: "USD",
|
||||
CurrencySign: "$",
|
||||
S1Price: 0.0336,
|
||||
S2Price: 0.0672,
|
||||
S3Price: 0.1344,
|
||||
Standard: {
|
||||
StartingPrice: 24 / hoursInAMonth, // per hour
|
||||
PricePerRU: 0.00008,
|
||||
PricePerGB: 0.25 / hoursInAMonth,
|
||||
},
|
||||
},
|
||||
mooncake: {
|
||||
Currency: "RMB",
|
||||
CurrencySign: "¥",
|
||||
S1Price: 0.15,
|
||||
S2Price: 0.3,
|
||||
S3Price: 0.6,
|
||||
Standard: {
|
||||
StartingPrice: MonthlyPricing.mooncake.Standard.StartingPrice / hoursInAMonth, // per hour
|
||||
PricePerRU: 0.00051,
|
||||
PricePerGB: MonthlyPricing.mooncake.Standard.PricePerGB / hoursInAMonth,
|
||||
},
|
||||
},
|
||||
};
|
||||
69
src/Shared/Constants/index.ts
Normal file
69
src/Shared/Constants/index.ts
Normal file
@@ -0,0 +1,69 @@
|
||||
import { SubscriptionType } from "../../Contracts/SubscriptionType";
|
||||
import * as AutoscalePricing from "./AutoscalePricing";
|
||||
import * as OfferPricing from "./OfferPricing";
|
||||
|
||||
export const hoursInAMonth = 730;
|
||||
export { AutoscalePricing, OfferPricing };
|
||||
|
||||
export const CollectionCreation = {
|
||||
// TODO generate these values based on Product\Services\Documents\ImageStore\GatewayApplication\Settings.xml
|
||||
MinRUPerPartitionBelow7Partitions: 400,
|
||||
MinRU7PartitionsTo25Partitions: 2500,
|
||||
MinRUPerPartitionAbove25Partitions: 100,
|
||||
MaxRUPerPartition: 10000,
|
||||
MinPartitionedCollectionRUs: 2500,
|
||||
|
||||
NumberOfPartitionsInFixedCollection: 1,
|
||||
NumberOfPartitionsInUnlimitedCollection: 10,
|
||||
|
||||
storage10Gb: "10",
|
||||
storage100Gb: "100",
|
||||
|
||||
DefaultCollectionRUs1000: 1000,
|
||||
DefaultCollectionRUs10K: 10000,
|
||||
DefaultCollectionRUs400: 400,
|
||||
DefaultCollectionRUs2000: 2000,
|
||||
DefaultCollectionRUs2500: 2500,
|
||||
DefaultCollectionRUs5000: 5000,
|
||||
DefaultCollectionRUs15000: 15000,
|
||||
DefaultCollectionRUs20000: 20000,
|
||||
DefaultCollectionRUs25000: 25000,
|
||||
DefaultCollectionRUs100K: 100000,
|
||||
DefaultCollectionRUs1Million: 1000000,
|
||||
|
||||
DefaultAddCollectionDefaultFlight: "0",
|
||||
DefaultSubscriptionType: SubscriptionType.Free,
|
||||
|
||||
TablesAPIDefaultDatabase: "TablesDB",
|
||||
};
|
||||
|
||||
export const CollectionCreationDefaults = {
|
||||
storage: CollectionCreation.storage100Gb,
|
||||
throughput: {
|
||||
fixed: CollectionCreation.DefaultCollectionRUs400,
|
||||
unlimited: CollectionCreation.DefaultCollectionRUs400,
|
||||
unlimitedmax: CollectionCreation.DefaultCollectionRUs1Million,
|
||||
unlimitedmin: CollectionCreation.DefaultCollectionRUs400,
|
||||
shared: CollectionCreation.DefaultCollectionRUs400,
|
||||
},
|
||||
};
|
||||
|
||||
export const SubscriptionUtilMappings = {
|
||||
FreeTierSubscriptionIds: [
|
||||
"b8f2ff04-0a81-4cf9-95ef-5828d16981d2",
|
||||
"39b1fdff-e5b2-4f83-adb4-33cb3aabf5ea",
|
||||
"41f6d14d-ece1-46e4-942c-02c00d67f7d6",
|
||||
"11dc62e3-77dc-4ef5-a46b-480ec6caa8fe",
|
||||
"199d0919-60bd-448e-b64d-8461a0fe9747",
|
||||
"a57b6849-d443-44cf-a3b7-7dd07ead9401",
|
||||
],
|
||||
};
|
||||
|
||||
export const AutopilotDocumentation = {
|
||||
Url: "https://aka.ms/cosmos-autoscale-info",
|
||||
};
|
||||
|
||||
export const FreeTierLimits = {
|
||||
RU: 1000,
|
||||
Storage: 25,
|
||||
};
|
||||
@@ -8,8 +8,6 @@
|
||||
"noUnusedParameters": true
|
||||
},
|
||||
"files": [
|
||||
"./src/Explorer/Controls/InputTypeahead/InputTypeaheadComponent.tsx",
|
||||
"./src/Explorer/Controls/InputTypeahead/InputTypeaheadComponent.test.tsx",
|
||||
"./src/AuthType.ts",
|
||||
"./src/Bindings/ReactBindingHandler.ts",
|
||||
"./src/Common/ArrayHashMap.ts",
|
||||
@@ -167,4 +165,4 @@
|
||||
"src/Terminal/**/*",
|
||||
"src/Utils/arm/**/*"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -113,7 +113,6 @@ module.exports = function (_env = {}, argv = {}) {
|
||||
new CleanWebpackPlugin(),
|
||||
new webpack.ProvidePlugin({
|
||||
process: "process/browser",
|
||||
Buffer: ["buffer", "Buffer"],
|
||||
}),
|
||||
new CreateFileWebpack({
|
||||
path: "./dist",
|
||||
@@ -230,7 +229,6 @@ module.exports = function (_env = {}, argv = {}) {
|
||||
alias: {
|
||||
process: "process/browser",
|
||||
},
|
||||
|
||||
fallback: {
|
||||
crypto: false,
|
||||
fs: false,
|
||||
|
||||
Reference in New Issue
Block a user