diff --git a/configs/mpac.json b/configs/mpac.json index ea8f902d8..9e26dfeeb 100644 --- a/configs/mpac.json +++ b/configs/mpac.json @@ -1,4 +1 @@ -{ - "JUNO_ENDPOINT": "https://tools.cosmos.azure.com", - "isPhoenixEnabled": true -} \ No newline at end of file +{} \ No newline at end of file diff --git a/configs/prod.json b/configs/prod.json index 12d7e289b..9e26dfeeb 100644 --- a/configs/prod.json +++ b/configs/prod.json @@ -1,4 +1 @@ -{ - "JUNO_ENDPOINT": "https://tools.cosmos.azure.com", - "isPhoenixEnabled": false -} \ No newline at end of file +{} \ No newline at end of file diff --git a/docs/remove-notebooks-plan.md b/docs/remove-notebooks-plan.md index 6ff123c93..398056032 100644 --- a/docs/remove-notebooks-plan.md +++ b/docs/remove-notebooks-plan.md @@ -276,15 +276,39 @@ engine deleted there. No separate work remains for this phase. - Remove notebook initialization from `useKnockoutExplorer.ts` and notebook tab handling in `useTabs.ts`. -### Phase 6 — Remove residual clients, config, contracts, telemetry & strings +### Phase 6 — Remove residual clients, config, contracts, telemetry & strings ✅ COMPLETED +> **Status:** Implemented on branch `users/jawelton/remove-phoenix-phase6-082726`. +> The final verification sweep is green: `npm run build` completed the format check, +> lint, normal and strict TypeScript compilation, production webpack build, and consumer +> copy; `npm test` passed 1946 tests with 5 skipped across 192 passing suites. +> +> **Implementation notes / deviations:** +> - Deleting `JunoClient` also removed the remaining Juno-backed analytical-storage +> schema request/polling and resource-tree nodes, plus the now-unused `enableSchema` +> hosted feature. This was the only surviving Juno consumer. +> - Notebook/Phoenix telemetry `Action` members remain as explicitly documented +> compatibility tombstones, following the safety precedent in `a36467f4`; removing +> them would renumber later implicit enum values. The unused `Areas.Notebook` value +> was removed. +> - `ActionContracts.TabKind.SchemaAnalyzer` was removed while explicit numeric values +> were assigned to all surviving tab kinds, preserving the host-facing wire contract. +> - Removed stale notebook terminology and dead UI artifacts from the feature panel, +> SQL/Mongo quickstart tours, recent-item handling, upload control, and CloudShell +> terminal entry-point/adapter names. +> - Removed notebook resource keys from all 19 locales and deleted 52 notebook-only +> image assets. +> - `@nteract/markdown` remains intentionally: the container-copy migration-type +> selector and change-partition-key pane use it to render localized Markdown help and +> documentation links. + - Delete `src/Juno/` and `src/Utils/arm/generatedClients/cosmosNotebooks/`. - Remove notebook fields from `ConfigContext.ts`, `Constants.ts` (Notebook namespace), `DataModels.ts` (notebook/Phoenix/container interfaces), `ViewModels.ts`, `ActionContracts.ts`, and notebook feature flags from `extractFeatures.ts` (+ update test). -- Remove notebook/Phoenix telemetry actions/areas from `TelemetryConstants.ts` (preserve - enum numbering if other systems depend on it — mirror the cautious approach in - `a36467f4`). +- Remove notebook/Phoenix telemetry areas from `TelemetryConstants.ts`; retain obsolete + `Action` members as documented compatibility tombstones to preserve enum numbering, + mirroring the cautious approach in `a36467f4`. - Remove remaining notebook strings from **all** locale `Resources.json` files (`en` + every non-English locale) and any notebook images (e.g. `images/notebook/`). - Final full build + test sweep; update `EndpointUtils.ts` (`allowedNotebookServerUrls`) diff --git a/images/Hero-new-notebook.svg b/images/Hero-new-notebook.svg deleted file mode 100644 index 9c26f9a3f..000000000 --- a/images/Hero-new-notebook.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/images/Notebooks.svg b/images/Notebooks.svg deleted file mode 100644 index 96de71b63..000000000 --- a/images/Notebooks.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/images/notebook/Apache-spark-disabled.svg b/images/notebook/Apache-spark-disabled.svg deleted file mode 100644 index 20200ab8b..000000000 --- a/images/notebook/Apache-spark-disabled.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/images/notebook/Apache-spark.svg b/images/notebook/Apache-spark.svg deleted file mode 100644 index d9137da89..000000000 --- a/images/notebook/Apache-spark.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/images/notebook/Notebook resource-disabled.svg b/images/notebook/Notebook resource-disabled.svg deleted file mode 100644 index d667c1a2f..000000000 --- a/images/notebook/Notebook resource-disabled.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/images/notebook/Notebook resource.svg b/images/notebook/Notebook resource.svg deleted file mode 100644 index adc9b9ff2..000000000 --- a/images/notebook/Notebook resource.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/images/notebook/Notebook-clear-all-outputs-disabled.svg b/images/notebook/Notebook-clear-all-outputs-disabled.svg deleted file mode 100644 index c21c80940..000000000 --- a/images/notebook/Notebook-clear-all-outputs-disabled.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/images/notebook/Notebook-clear-all-outputs.svg b/images/notebook/Notebook-clear-all-outputs.svg deleted file mode 100644 index 157757a51..000000000 --- a/images/notebook/Notebook-clear-all-outputs.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/images/notebook/Notebook-copy-disabled.svg b/images/notebook/Notebook-copy-disabled.svg deleted file mode 100644 index b39537d3a..000000000 --- a/images/notebook/Notebook-copy-disabled.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/images/notebook/Notebook-copy.svg b/images/notebook/Notebook-copy.svg deleted file mode 100644 index 887dec6b7..000000000 --- a/images/notebook/Notebook-copy.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/images/notebook/Notebook-cut-disabled.svg b/images/notebook/Notebook-cut-disabled.svg deleted file mode 100644 index 0c99e55ef..000000000 --- a/images/notebook/Notebook-cut-disabled.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/images/notebook/Notebook-cut.svg b/images/notebook/Notebook-cut.svg deleted file mode 100644 index 6e6f218b7..000000000 --- a/images/notebook/Notebook-cut.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/images/notebook/Notebook-enable-disabled.svg b/images/notebook/Notebook-enable-disabled.svg deleted file mode 100644 index b29db1ff7..000000000 --- a/images/notebook/Notebook-enable-disabled.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/images/notebook/Notebook-enable.svg b/images/notebook/Notebook-enable.svg deleted file mode 100644 index 81d341762..000000000 --- a/images/notebook/Notebook-enable.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/images/notebook/Notebook-insert-cell-disabled.svg b/images/notebook/Notebook-insert-cell-disabled.svg deleted file mode 100644 index 390aad5c2..000000000 --- a/images/notebook/Notebook-insert-cell-disabled.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/images/notebook/Notebook-insert-cell.svg b/images/notebook/Notebook-insert-cell.svg deleted file mode 100644 index a57bce9f7..000000000 --- a/images/notebook/Notebook-insert-cell.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/images/notebook/Notebook-move cell down-disabled.svg b/images/notebook/Notebook-move cell down-disabled.svg deleted file mode 100644 index 2e37662cc..000000000 --- a/images/notebook/Notebook-move cell down-disabled.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/images/notebook/Notebook-move cell down.svg b/images/notebook/Notebook-move cell down.svg deleted file mode 100644 index 070f6b184..000000000 --- a/images/notebook/Notebook-move cell down.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/images/notebook/Notebook-move cell up-disabled.svg b/images/notebook/Notebook-move cell up-disabled.svg deleted file mode 100644 index 40094db69..000000000 --- a/images/notebook/Notebook-move cell up-disabled.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/images/notebook/Notebook-move cell up.svg b/images/notebook/Notebook-move cell up.svg deleted file mode 100644 index 8386f9ad0..000000000 --- a/images/notebook/Notebook-move cell up.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/images/notebook/Notebook-new-disabled.svg b/images/notebook/Notebook-new-disabled.svg deleted file mode 100644 index 429312a09..000000000 --- a/images/notebook/Notebook-new-disabled.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/images/notebook/Notebook-new.svg b/images/notebook/Notebook-new.svg deleted file mode 100644 index 55e38a391..000000000 --- a/images/notebook/Notebook-new.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/images/notebook/Notebook-paste-disabled.svg b/images/notebook/Notebook-paste-disabled.svg deleted file mode 100644 index 0f3cc7a38..000000000 --- a/images/notebook/Notebook-paste-disabled.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/images/notebook/Notebook-paste.svg b/images/notebook/Notebook-paste.svg deleted file mode 100644 index 0f3cc7a38..000000000 --- a/images/notebook/Notebook-paste.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/images/notebook/Notebook-redo-disabled.svg b/images/notebook/Notebook-redo-disabled.svg deleted file mode 100644 index 843087219..000000000 --- a/images/notebook/Notebook-redo-disabled.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/images/notebook/Notebook-redo.svg b/images/notebook/Notebook-redo.svg deleted file mode 100644 index 0c740f24c..000000000 --- a/images/notebook/Notebook-redo.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/images/notebook/Notebook-reset-workspace-disabled.svg b/images/notebook/Notebook-reset-workspace-disabled.svg deleted file mode 100644 index a29b33f02..000000000 --- a/images/notebook/Notebook-reset-workspace-disabled.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/images/notebook/Notebook-reset-workspace.svg b/images/notebook/Notebook-reset-workspace.svg deleted file mode 100644 index 678b303e1..000000000 --- a/images/notebook/Notebook-reset-workspace.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/images/notebook/Notebook-resource-disabled.svg b/images/notebook/Notebook-resource-disabled.svg deleted file mode 100644 index b29db1ff7..000000000 --- a/images/notebook/Notebook-resource-disabled.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/images/notebook/Notebook-resource.svg b/images/notebook/Notebook-resource.svg deleted file mode 100644 index 81d341762..000000000 --- a/images/notebook/Notebook-resource.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/images/notebook/Notebook-restart & rerun-disabled.svg b/images/notebook/Notebook-restart & rerun-disabled.svg deleted file mode 100644 index 0be07ae2d..000000000 --- a/images/notebook/Notebook-restart & rerun-disabled.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/images/notebook/Notebook-restart & rerun.svg b/images/notebook/Notebook-restart & rerun.svg deleted file mode 100644 index 67ab37feb..000000000 --- a/images/notebook/Notebook-restart & rerun.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/images/notebook/Notebook-restart-disabled.svg b/images/notebook/Notebook-restart-disabled.svg deleted file mode 100644 index 1348e99d4..000000000 --- a/images/notebook/Notebook-restart-disabled.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/images/notebook/Notebook-restart.svg b/images/notebook/Notebook-restart.svg deleted file mode 100644 index cd87e142f..000000000 --- a/images/notebook/Notebook-restart.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/images/notebook/Notebook-run-all-disabled.svg b/images/notebook/Notebook-run-all-disabled.svg deleted file mode 100644 index 2f14e1e06..000000000 --- a/images/notebook/Notebook-run-all-disabled.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/images/notebook/Notebook-run-all.svg b/images/notebook/Notebook-run-all.svg deleted file mode 100644 index b2f7bca8c..000000000 --- a/images/notebook/Notebook-run-all.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/images/notebook/Notebook-run-disabled.svg b/images/notebook/Notebook-run-disabled.svg deleted file mode 100644 index 7756ba965..000000000 --- a/images/notebook/Notebook-run-disabled.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/images/notebook/Notebook-run.svg b/images/notebook/Notebook-run.svg deleted file mode 100644 index 27a272a5d..000000000 --- a/images/notebook/Notebook-run.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/images/notebook/Notebook-stop-disabled.svg b/images/notebook/Notebook-stop-disabled.svg deleted file mode 100644 index 05c784fb6..000000000 --- a/images/notebook/Notebook-stop-disabled.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/images/notebook/Notebook-stop.svg b/images/notebook/Notebook-stop.svg deleted file mode 100644 index 16108b183..000000000 --- a/images/notebook/Notebook-stop.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/images/notebook/Notebook-undo-disabled.svg b/images/notebook/Notebook-undo-disabled.svg deleted file mode 100644 index c7fb0344f..000000000 --- a/images/notebook/Notebook-undo-disabled.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/images/notebook/Notebook-undo.svg b/images/notebook/Notebook-undo.svg deleted file mode 100644 index e57c60527..000000000 --- a/images/notebook/Notebook-undo.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/images/notebook/Spark-library-manage-disabled.svg b/images/notebook/Spark-library-manage-disabled.svg deleted file mode 100644 index c69e33fcc..000000000 --- a/images/notebook/Spark-library-manage-disabled.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/images/notebook/Spark-library-manage.svg b/images/notebook/Spark-library-manage.svg deleted file mode 100644 index 5b75cda4c..000000000 --- a/images/notebook/Spark-library-manage.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/images/notebook/Spark-query-new-disabled.svg b/images/notebook/Spark-query-new-disabled.svg deleted file mode 100644 index 215c641de..000000000 --- a/images/notebook/Spark-query-new-disabled.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/images/notebook/Spark-query-new.svg b/images/notebook/Spark-query-new.svg deleted file mode 100644 index ab8cb18ef..000000000 --- a/images/notebook/Spark-query-new.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/images/notebook/add-code-cell.svg b/images/notebook/add-code-cell.svg deleted file mode 100644 index 18daefe8e..000000000 --- a/images/notebook/add-code-cell.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/images/notebook/add-text-cell.svg b/images/notebook/add-text-cell.svg deleted file mode 100644 index 137559115..000000000 --- a/images/notebook/add-text-cell.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/images/notebook/file-cosmos.svg b/images/notebook/file-cosmos.svg deleted file mode 100644 index 2797e1a45..000000000 --- a/images/notebook/file-cosmos.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/images/notebook/file-disabled.svg b/images/notebook/file-disabled.svg deleted file mode 100644 index 4fc2d6d17..000000000 --- a/images/notebook/file-disabled.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/images/notebook/publish_content.svg b/images/notebook/publish_content.svg deleted file mode 100644 index a6f1bbcd1..000000000 --- a/images/notebook/publish_content.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/images/tree-notebook.svg b/images/tree-notebook.svg deleted file mode 100644 index 7769acdb7..000000000 --- a/images/tree-notebook.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/Common/Constants.ts b/src/Common/Constants.ts index c4d0e1cd5..e1b142645 100644 --- a/src/Common/Constants.ts +++ b/src/Common/Constants.ts @@ -33,7 +33,6 @@ export class ArmApiVersions { } export class ArmResourceTypes { - public static readonly notebookWorkspaces = "Microsoft.DocumentDB/databaseAccounts/notebookWorkspaces"; public static readonly synapseWorkspaces = "Microsoft.Synapse/workspaces"; } @@ -78,7 +77,6 @@ export class CapabilityNames { public static EnableGremlin: string = "EnableGremlin"; public static EnableCassandra: string = "EnableCassandra"; public static EnableAutoScale: string = "EnableAutoScale"; - public static readonly EnableNotebooks: string = "EnableNotebooks"; public static readonly EnableStorageAnalytics: string = "EnableStorageAnalytics"; public static readonly EnableMongo: string = "EnableMongo"; public static readonly EnableServerless: string = "EnableServerless"; @@ -109,14 +107,10 @@ export class Flights { public static readonly AutoscaleTest = "autoscaletest"; public static readonly PartitionKeyTest = "partitionkeytest"; public static readonly PKPartitionKeyTest = "pkpartitionkeytest"; - public static readonly PhoenixNotebooks = "phoenixnotebooks"; - public static readonly PhoenixFeatures = "phoenixfeatures"; - public static readonly NotebooksDownBanner = "notebooksdownbanner"; } export class AfecFeatures { public static readonly Spark = "spark-public-preview"; - public static readonly Notebooks = "sparknotebooks-public-preview"; public static readonly StorageAnalytics = "storageanalytics-public-preview"; } @@ -251,7 +245,6 @@ export class Areas { public static ContextualPane: string = "Contextual Pane"; public static Tab: string = "Tab"; public static ShareDialog: string = "Share Access Dialog"; - public static Notebook: string = "Notebook"; public static CloudShell: string = "Cloud Shell"; } @@ -433,62 +426,10 @@ export enum ConflictOperationType { Delete = "delete", } -export enum ConnectionStatusType { - Connect = "Connect", - Connecting = "Connecting", - Connected = "Connected", - Failed = "Connection Failed", - Reconnect = "Reconnect", -} - -export enum ContainerStatusType { - Active = "Active", - Disconnected = "Disconnected", -} - -export enum PoolIdType { - DefaultPoolId = "default", -} - export const EmulatorMasterKey = //[SuppressMessage("Microsoft.Security", "CS002:SecretInNextLine", Justification="Well known public masterKey for emulator")] "C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw=="; -export class Notebook { - public static readonly defaultBasePath = "./notebooks"; - public static readonly heartbeatDelayMs = 60000; - public static readonly containerStatusHeartbeatDelayMs = 30000; - public static readonly kernelRestartInitialDelayMs = 1000; - public static readonly kernelRestartMaxDelayMs = 20000; - public static readonly autoSaveIntervalMs = 300000; - public static readonly memoryGuageToGB = 1048576; - public static readonly lowMemoryThreshold = 0.8; - public static readonly remainingTimeForAlert = 10; - public static readonly retryAttempts = 3; - public static readonly retryAttemptDelayMs = 5000; - public static readonly temporarilyDownMsg = "Notebooks is currently not available. We are working on it."; - public static readonly mongoShellTemporarilyDownMsg = - "We have identified an issue with the Mongo Shell and it is unavailable right now. We are actively working on the mitigation."; - public static readonly cassandraShellTemporarilyDownMsg = - "We have identified an issue with the Cassandra Shell and it is unavailable right now. We are actively working on the mitigation."; - public static saveNotebookModalTitle = "Save notebook in temporary workspace"; - public static saveNotebookModalContent = - "This notebook will be saved in the temporary workspace and will be removed when the session expires."; - public static newNotebookModalTitle = "Create notebook in temporary workspace"; - public static newNotebookUploadModalTitle = "Upload notebook to temporary workspace"; - public static newNotebookModalContent1 = - "A temporary workspace will be created to enable you to work with notebooks. When the session expires, any notebooks in the workspace will be removed."; - public static newNotebookModalContent2 = - "To save your work permanently, save your notebooks to a GitHub repository or download the notebooks to your local machine before the session ends. "; - public static galleryNotebookDownloadContent1 = - "To download, run, and make changes to this sample notebook, a temporary workspace will be created. When the session expires, any notebooks in the workspace will be removed."; - public static galleryNotebookDownloadContent2 = - "To save your work permanently, save your notebooks to a GitHub repository or download the Notebooks to your local machine before the session ends. "; - public static cosmosNotebookHomePageUrl = "https://aka.ms/cosmos-notebooks-limits"; - public static cosmosNotebookGitDocumentationUrl = "https://aka.ms/cosmos-notebooks-github"; - public static learnMore = "Learn more."; -} - export class SparkLibrary { public static readonly nameMinLength = 3; public static readonly nameMaxLength = 63; @@ -508,14 +449,6 @@ export class TerminalQueryParams { public static readonly TerminalEndpoint = "terminalEndpoint"; } -export class JunoEndpoints { - public static readonly Test = "https://juno-test.documents-dev.windows-int.net"; - public static readonly Test2 = "https://juno-test2.documents-dev.windows-int.net"; - public static readonly Test3 = "https://juno-test3.documents-dev.windows-int.net"; - public static readonly Prod = "https://tools.cosmos.azure.com"; - public static readonly Stage = "https://tools-staging.cosmos.azure.com"; -} - export class PriorityLevel { public static readonly High = "high"; public static readonly Low = "low"; diff --git a/src/Common/Upload/Upload.tsx b/src/Common/Upload/Upload.tsx index 90b9e7add..4694d2671 100644 --- a/src/Common/Upload/Upload.tsx +++ b/src/Common/Upload/Upload.tsx @@ -89,7 +89,7 @@ export const Upload: FunctionComponent = ({ onChange={onUpload} role="button" /> - + {title} diff --git a/src/ConfigContext.ts b/src/ConfigContext.ts index 76574a117..2a899ebc8 100644 --- a/src/ConfigContext.ts +++ b/src/ConfigContext.ts @@ -1,9 +1,8 @@ -import { CassandraProxyEndpoints, JunoEndpoints, MongoProxyEndpoints, PortalBackendEndpoints } from "Common/Constants"; +import { CassandraProxyEndpoints, MongoProxyEndpoints, PortalBackendEndpoints } from "Common/Constants"; import { allowedArcadiaEndpoints, allowedEmulatorEndpoints, allowedHostedExplorerEndpoints, - allowedJunoOrigins, allowedMsalRedirectEndpoints, defaultAllowedAadEndpoints, defaultAllowedArmEndpoints, @@ -47,8 +46,6 @@ export interface ConfigContext { MONGO_PROXY_ENDPOINT: string; CASSANDRA_PROXY_ENDPOINT: string; PROXY_PATH?: string; - JUNO_ENDPOINT: string; - isPhoenixEnabled: boolean; hostedExplorerURL: string; armAPIVersion?: string; msalRedirectURI?: string; @@ -92,11 +89,9 @@ let configContext: Readonly = { CATALOG_API_KEY: "", ARCADIA_ENDPOINT: "https://workspaceartifacts.projectarcadia.net", ARCADIA_LIVY_ENDPOINT_DNS_ZONE: "dev.azuresynapse.net", - JUNO_ENDPOINT: JunoEndpoints.Prod, PORTAL_BACKEND_ENDPOINT: PortalBackendEndpoints.Prod, MONGO_PROXY_ENDPOINT: MongoProxyEndpoints.Prod, CASSANDRA_PROXY_ENDPOINT: CassandraProxyEndpoints.Prod, - isPhoenixEnabled: false, }; export function resetConfigContext(): void { @@ -162,10 +157,6 @@ export function updateConfigContext(newContext: Partial): void { delete newContext.CASSANDRA_PROXY_ENDPOINT; } - if (!validateEndpoint(newContext.JUNO_ENDPOINT, allowedJunoOrigins)) { - delete newContext.JUNO_ENDPOINT; - } - if (!validateEndpoint(newContext.hostedExplorerURL, allowedHostedExplorerEndpoints)) { delete newContext.hostedExplorerURL; } diff --git a/src/Contracts/ActionContracts.ts b/src/Contracts/ActionContracts.ts index aa58da20e..7b6375968 100644 --- a/src/Contracts/ActionContracts.ts +++ b/src/Contracts/ActionContracts.ts @@ -2,14 +2,13 @@ * Data Explorer tab kinds */ export enum TabKind { - SQLDocuments, - MongoDocuments, - SchemaAnalyzer, - TableEntities, - Graph, - SQLQuery, - ScaleSettings, - MongoQuery, + SQLDocuments = 0, + MongoDocuments = 1, + TableEntities = 3, + Graph = 4, + SQLQuery = 5, + ScaleSettings = 6, + MongoQuery = 7, } /** @@ -72,10 +71,6 @@ export interface OpenPane extends DataExplorerAction { paneKind: PaneKind | string; } -export interface OpenSampleNotebook extends DataExplorerAction { - path: string; -} - /** * The types of actions that the DataExplorer supports performing upon opening. */ @@ -84,5 +79,4 @@ export enum ActionType { OpenCollectionTab, OpenPane, TransmitCachedData, - OpenSampleNotebook, } diff --git a/src/Contracts/DataModels.ts b/src/Contracts/DataModels.ts index 770ee7948..01ca85057 100644 --- a/src/Contracts/DataModels.ts +++ b/src/Contracts/DataModels.ts @@ -1,4 +1,4 @@ -import { CapacityMode, ConnectionStatusType, ContainerStatusType } from "../Common/Constants"; +import { CapacityMode } from "../Common/Constants"; export interface ArmEntity { id: string; @@ -155,38 +155,6 @@ export interface Resource { id: string; } -export interface IType { - name: string; - code: number; -} - -export interface IDataField { - dataType: IType; - hasNulls: boolean; - isArray: boolean; - schemaType: IType; - name: string; - path: string; - maxRepetitionLevel: number; - maxDefinitionLevel: number; -} - -export interface ISchema { - id: string; - accountName: string; - resource: string; - fields: IDataField[]; -} - -export interface ISchemaRequest { - id: string; - subscriptionId: string; - resourceGroup: string; - accountName: string; - resource: string; - status: string; -} - export interface Collection extends Resource { // Only in Mongo collections loaded via ARM shardKey?: { @@ -204,8 +172,6 @@ export interface Collection extends Resource { vectorEmbeddingPolicy?: VectorEmbeddingPolicy; fullTextPolicy?: FullTextPolicy; dataMaskingPolicy?: DataMaskingPolicy; - schema?: ISchema; - requestSchema?: () => void; computedProperties?: ComputedProperties; materializedViews?: MaterializedView[]; materializedViewDefinition?: MaterializedViewDefinition; @@ -588,89 +554,6 @@ export interface OperationStatus { error?: { code: string; message: string }; } -export interface NotebookWorkspaceConnectionInfo { - authToken: string; - notebookServerEndpoint: string; - forwardingId: string; -} - -export interface ContainerInfo { - durationLeftInMinutes: number; - phoenixServerInfo: NotebookWorkspaceConnectionInfo; - status: ContainerStatusType; -} - -export interface IProvisionData { - cosmosEndpoint?: string; - poolId: string; - databaseId?: string; - containerId?: string; - mode?: string; -} - -export interface IContainerData { - forwardingId: string; -} - -export interface IResponse { - status: number; - data: T; -} - -export interface IPhoenixError { - message: string; - type: string; -} - -export interface IMaxAllocationTimeExceeded extends IPhoenixError { - earliestAllocationTimestamp: string; - maxAllocationTimePerDayPerUserInMinutes: string; -} - -export interface IMaxDbAccountsPerUserExceeded extends IPhoenixError { - maxSimultaneousConnectionsPerUser: string; -} - -export interface IMaxUsersPerDbAccountExceeded extends IPhoenixError { - maxSimultaneousUsersPerDbAccount: string; -} - -export interface IPhoenixConnectionInfoResult { - readonly phoenixServiceInfo?: IPhoenixServiceInfo; -} - -export interface IPhoenixServiceInfo { - readonly authToken?: string; - readonly phoenixServiceUrl?: string; - readonly forwardingId?: string; -} - -export interface NotebookWorkspaceFeedResponse { - value: NotebookWorkspace[]; -} - -export interface NotebookWorkspace { - id: string; - name: string; - properties: { - status: string; - notebookServerEndpoint: string; - }; -} - -export interface NotebookConfigurationEndpoints { - path: string; - endpoints: NotebookConfigurationEndpointInfo[]; -} - -export interface NotebookConfigurationEndpointInfo { - type: string; - endpoint: string; - username: string; - password: string; - token: string; -} - export interface SparkClusterConnectionInfo { userName: string; password: string; @@ -711,16 +594,6 @@ export interface MongoParameters extends RpParameters { analyticalStorageTtl?: number; } -export interface MemoryUsageInfo { - freeKB: number; - totalKB: number; -} - -export interface ContainerConnectionInfo { - status: ConnectionStatusType; - //need to add ram and rom info -} - export interface FirewallRule { id: string; name: string; @@ -731,18 +604,6 @@ export interface FirewallRule { }; } -export enum PhoenixErrorType { - MaxAllocationTimeExceeded = "MaxAllocationTimeExceeded", - MaxDbAccountsPerUserExceeded = "MaxDbAccountsPerUserExceeded", - MaxUsersPerDbAccountExceeded = "MaxUsersPerDbAccountExceeded", - AllocationValidationResult = "AllocationValidationResult", - RegionNotServicable = "RegionNotServicable", - SubscriptionNotAllowed = "SubscriptionNotAllowed", - UnknownError = "UnknownError", - PhoenixFlightFallback = "PhoenixFlightFallback", - UserMissingPermissionsError = "UserMissingPermissionsError", -} - export interface FeatureRegistration { name: string; properties: { diff --git a/src/Contracts/ViewModels.ts b/src/Contracts/ViewModels.ts index dcb19f1a8..807a6414c 100644 --- a/src/Contracts/ViewModels.ts +++ b/src/Contracts/ViewModels.ts @@ -136,8 +136,6 @@ export interface CollectionBase extends TreeNode { export interface Collection extends CollectionBase { defaultTtl: ko.Observable; analyticalStorageTtl: ko.Observable; - schema?: DataModels.ISchema; - requestSchema?: () => void; vectorEmbeddingPolicy: ko.Observable; fullTextPolicy: ko.Observable; dataMaskingPolicy: ko.Observable; @@ -388,16 +386,10 @@ export enum CollectionTabKind { MongoShell = 10, DatabaseSettings = 11, Conflicts = 12, - Notebook = 13 /* Deprecated */, Terminal = 14, - NotebookV2 = 15, SparkMasterTab = 16 /* Deprecated */, - Gallery = 17 /* Deprecated */, - NotebookViewer = 18, - Schema = 19, CollectionSettingsV2 = 20, DatabaseSettingsV2 = 21, - SchemaAnalyzer = 22, } export enum TerminalKind { diff --git a/src/Explorer/ContextMenuButtonFactory.tsx b/src/Explorer/ContextMenuButtonFactory.tsx index f1e85d6cd..33178b221 100644 --- a/src/Explorer/ContextMenuButtonFactory.tsx +++ b/src/Explorer/ContextMenuButtonFactory.tsx @@ -120,7 +120,7 @@ export const createCollectionContextMenuButton = ( onClick: () => { const selectedCollection: ViewModels.Collection = useSelectedNode.getState().findSelectedCollection(); if (userContext.features.enableCloudShell) { - container.openNotebookTerminal(ViewModels.TerminalKind.Mongo); + container.openTerminal(ViewModels.TerminalKind.Mongo); } else { selectedCollection && selectedCollection.onNewMongoShellClick(); } @@ -133,7 +133,7 @@ export const createCollectionContextMenuButton = ( items.push({ iconSrc: HostedTerminalIcon, onClick: () => { - container.openNotebookTerminal(ViewModels.TerminalKind.Cassandra); + container.openTerminal(ViewModels.TerminalKind.Cassandra); }, label: t(Keys.contextMenu.openCassandraShell), }); diff --git a/src/Explorer/Controls/FeaturePanel/FeaturePanelComponent.tsx b/src/Explorer/Controls/FeaturePanel/FeaturePanelComponent.tsx index 5f8968d86..78e13a5e8 100644 --- a/src/Explorer/Controls/FeaturePanel/FeaturePanelComponent.tsx +++ b/src/Explorer/Controls/FeaturePanel/FeaturePanelComponent.tsx @@ -60,7 +60,6 @@ export const FeaturePanelComponent: React.FunctionComponent = () => { value: "true", }, { key: "feature.ttl90days", label: "TTL 90 days", value: "true" }, - { key: "feature.enablenotebooks", label: "Enable notebooks", value: "true" }, { key: "feature.customportal", label: "Force Production portal (portal only)", @@ -79,9 +78,6 @@ export const FeaturePanelComponent: React.FunctionComponent = () => { reactState?: [string, React.Dispatch>]; onChange?: (_: React.FormEvent, newValue?: string) => void; }[] = [ - { key: "feature.notebookserverurl", label: "Notebook server URL", placeholder: "https://notebookserver" }, - { key: "feature.notebookservertoken", label: "Notebook server token", placeholder: "" }, - { key: "feature.notebookbasepath", label: "Notebook base path", placeholder: "" }, { key: "key", label: "Auth key", placeholder: "" }, { key: "dataExplorerSource", @@ -131,16 +127,6 @@ export const FeaturePanelComponent: React.FunctionComponent = () => { }), ); - const onNotebookShortcut = (): void => { - booleanFeatures.find((f) => f.key === "feature.enablenotebooks").reactState[1](true); - stringFeatures - .find((f) => f.key === "feature.notebookserverurl") - .reactState[1]("https://localhost:10001/12345/notebook/"); - stringFeatures.find((f) => f.key === "feature.notebookservertoken").reactState[1]("token"); - stringFeatures.find((f) => f.key === "feature.notebookbasepath").reactState[1]("./notebooks"); - setPlatform(platformOptions.find((o) => o.key === "Hosted")); - }; - const onPortalLocalDEShortcut = (): void => { setBaseUrl(baseUrlOptions.find((o) => o.key === "https://portal.azure.com")); setPlatform(platformOptions.find((o) => o.key === "Portal")); @@ -178,7 +164,6 @@ export const FeaturePanelComponent: React.FunctionComponent = () => { - Notebooks on localhost Portal points to local DE Reset diff --git a/src/Explorer/Controls/FeaturePanel/__snapshots__/FeaturePanelComponent.test.tsx.snap b/src/Explorer/Controls/FeaturePanel/__snapshots__/FeaturePanelComponent.test.tsx.snap index a68e5dd0f..f1dca1ec1 100644 --- a/src/Explorer/Controls/FeaturePanel/__snapshots__/FeaturePanelComponent.test.tsx.snap +++ b/src/Explorer/Controls/FeaturePanel/__snapshots__/FeaturePanelComponent.test.tsx.snap @@ -32,11 +32,6 @@ exports[`Feature panel renders all flags 1`] = ` } } > - - Notebooks on localhost - @@ -178,12 +173,6 @@ exports[`Feature panel renders all flags 1`] = ` label="TTL 90 days" onChange={[Function]} /> - - - - - - @@ -286,6 +232,10 @@ exports[`Feature panel renders all flags 1`] = ` } } /> + + { const selectedCollection: ViewModels.Collection = selectedNodeState.findSelectedCollection(); if (userContext.features.enableCloudShell) { - container.openNotebookTerminal(ViewModels.TerminalKind.Mongo); + container.openTerminal(ViewModels.TerminalKind.Mongo); } else { selectedCollection && selectedCollection.onNewMongoShellClick(); } @@ -165,7 +165,7 @@ export function createContextCommandBarButtons( iconSrc: HostedTerminalIcon, iconAlt: label, onCommandClick: () => { - container.openNotebookTerminal(ViewModels.TerminalKind.Cassandra); + container.openTerminal(ViewModels.TerminalKind.Cassandra); }, commandButtonLabel: label, ariaLabel: label, @@ -531,7 +531,7 @@ function createOpenTerminalButtonByKind( return; } if (userContext.features.enableCloudShell) { - container.openNotebookTerminal(terminalKind); + container.openTerminal(terminalKind); } }, commandButtonLabel: label, diff --git a/src/Explorer/MostRecentActivity/MostRecentActivity.ts b/src/Explorer/MostRecentActivity/MostRecentActivity.ts index a5f6ab6d6..ebb92db5a 100644 --- a/src/Explorer/MostRecentActivity/MostRecentActivity.ts +++ b/src/Explorer/MostRecentActivity/MostRecentActivity.ts @@ -35,14 +35,12 @@ const migrateOldData = () => { componentName: AppStateComponentNames.MostRecentActivity, globalAccountName: accountName, }, - itemsMap[accountId] - .filter((item) => (item.type as unknown as number) !== 1 && (item.type as string) !== "OpenNotebook") - .map((item) => { - if ((item.type as unknown as number) === 0) { - item.type = Type.OpenCollection; - } - return item; - }), + itemsMap[accountId].map((item) => { + if ((item.type as unknown as number) === 0) { + item.type = Type.OpenCollection; + } + return item; + }), ); } }); diff --git a/src/Explorer/Quickstart/Tutorials/MongoQuickstartTutorial.tsx b/src/Explorer/Quickstart/Tutorials/MongoQuickstartTutorial.tsx index aa9c5e300..cd918d4aa 100644 --- a/src/Explorer/Quickstart/Tutorials/MongoQuickstartTutorial.tsx +++ b/src/Explorer/Quickstart/Tutorials/MongoQuickstartTutorial.tsx @@ -18,9 +18,9 @@ export const MongoQuickstartTutorial: React.FC = (): JSX.Element => { return <>; } - let totalSteps = 9; + let totalSteps = 8; if (userContext.isTryCosmosDBSubscription) { - totalSteps = 10; + totalSteps = 9; } switch (step) { @@ -153,12 +153,12 @@ export const MongoQuickstartTutorial: React.FC = (): JSX.Element => { case 7: return ( setStep(8), + onClick: () => (userContext.isTryCosmosDBSubscription ? setStep(8) : setStep(9)), }} secondaryButtonProps={{ text: "Previous", @@ -166,32 +166,12 @@ export const MongoQuickstartTutorial: React.FC = (): JSX.Element => { }} onDismiss={() => onDimissTeachingBubble()} footerContent={"Step 7 of " + totalSteps} - > - Visualize your data, store queries in an interactive document - - ); - case 8: - return ( - (userContext.isTryCosmosDBSubscription ? setStep(9) : setStep(10)), - }} - secondaryButtonProps={{ - text: "Previous", - onClick: () => setStep(7), - }} - onDismiss={() => onDimissTeachingBubble()} - footerContent={"Step 8 of " + totalSteps} > This will open a new tab in your browser to use Cosmos DB Explorer. Using the provided URLs you can share read-write or read-only access with other people. ); - case 9: + case 8: return ( { hasCloseButton primaryButtonProps={{ text: "Next", - onClick: () => setStep(10), + onClick: () => setStep(9), }} secondaryButtonProps={{ text: "Previous", - onClick: () => setStep(8), + onClick: () => setStep(7), }} calloutProps={{ directionalHint: DirectionalHint.leftCenter }} onDismiss={() => onDimissTeachingBubble()} - footerContent={"Step 9 of " + totalSteps} + footerContent={"Step 8 of " + totalSteps} > Unlock everything Azure Cosmos DB has to offer When you're ready, upgrade to production. ); - case 10: + case 9: return ( { }} secondaryButtonProps={{ text: "Previous", - onClick: () => (userContext.isTryCosmosDBSubscription ? setStep(9) : setStep(8)), + onClick: () => (userContext.isTryCosmosDBSubscription ? setStep(8) : setStep(7)), }} onDismiss={() => onDimissTeachingBubble()} footerContent={"Step " + totalSteps + " of " + totalSteps} diff --git a/src/Explorer/Quickstart/Tutorials/QuickstartTutorials.test.tsx b/src/Explorer/Quickstart/Tutorials/QuickstartTutorials.test.tsx new file mode 100644 index 000000000..46dcf7f29 --- /dev/null +++ b/src/Explorer/Quickstart/Tutorials/QuickstartTutorials.test.tsx @@ -0,0 +1,52 @@ +import { fireEvent, render, screen } from "@testing-library/react"; +import "@testing-library/jest-dom"; +import { useTeachingBubble } from "hooks/useTeachingBubble"; +import React from "react"; +import { updateUserContext } from "UserContext"; +import { MongoQuickstartTutorial } from "./MongoQuickstartTutorial"; +import { SQLQuickstartTutorial } from "./SQLQuickstartTutorial"; + +describe("quickstart tutorials", () => { + beforeEach(() => { + const target = document.createElement("div"); + target.id = "openFullScreenBtn"; + document.body.appendChild(target); + useTeachingBubble.setState({ step: 1 }); + }); + + afterEach(() => { + document.body.innerHTML = ""; + }); + + it("continues the SQL tour from full screen to the final step", () => { + updateUserContext({ apiType: "SQL", isTryCosmosDBSubscription: false }); + useTeachingBubble.setState({ step: 6 }); + + const { rerender } = render(); + + expect(screen.getByText("Launch full screen")).toBeInTheDocument(); + expect(screen.getByText("Step 6 of 7")).toBeInTheDocument(); + + fireEvent.click(screen.getByRole("button", { name: "Next" })); + rerender(); + + expect(screen.getByText("Congratulations!")).toBeInTheDocument(); + expect(screen.getByText("Step 7 of 7")).toBeInTheDocument(); + }); + + it("continues the Mongo tour from full screen to the final step", () => { + updateUserContext({ apiType: "Mongo", isTryCosmosDBSubscription: false }); + useTeachingBubble.setState({ step: 7 }); + + const { rerender } = render(); + + expect(screen.getByText("Launch full screen")).toBeInTheDocument(); + expect(screen.getByText("Step 7 of 8")).toBeInTheDocument(); + + fireEvent.click(screen.getByRole("button", { name: "Next" })); + rerender(); + + expect(screen.getByText("Congratulations!")).toBeInTheDocument(); + expect(screen.getByText("Step 8 of 8")).toBeInTheDocument(); + }); +}); diff --git a/src/Explorer/Quickstart/Tutorials/SQLQuickstartTutorial.tsx b/src/Explorer/Quickstart/Tutorials/SQLQuickstartTutorial.tsx index ddb35aa5e..6e8b44887 100644 --- a/src/Explorer/Quickstart/Tutorials/SQLQuickstartTutorial.tsx +++ b/src/Explorer/Quickstart/Tutorials/SQLQuickstartTutorial.tsx @@ -17,9 +17,9 @@ export const SQLQuickstartTutorial: React.FC = (): JSX.Element => { if (userContext.apiType !== "SQL") { return <>; } - let totalSteps = 8; + let totalSteps = 7; if (userContext.isTryCosmosDBSubscription) { - totalSteps = 9; + totalSteps = 8; } switch (step) { @@ -130,12 +130,12 @@ export const SQLQuickstartTutorial: React.FC = (): JSX.Element => { case 6: return ( setStep(7), + onClick: () => (userContext.isTryCosmosDBSubscription ? setStep(7) : setStep(8)), }} secondaryButtonProps={{ text: "Previous", @@ -143,32 +143,12 @@ export const SQLQuickstartTutorial: React.FC = (): JSX.Element => { }} onDismiss={() => onDimissTeachingBubble()} footerContent={"Step 6 of " + totalSteps} - > - Visualize your data, store queries in an interactive document - - ); - case 7: - return ( - (userContext.isTryCosmosDBSubscription ? setStep(8) : setStep(9)), - }} - secondaryButtonProps={{ - text: "Previous", - onClick: () => setStep(6), - }} - onDismiss={() => onDimissTeachingBubble()} - footerContent={"Step 7 of " + totalSteps} > This will open a new tab in your browser to use Cosmos DB Explorer. Using the provided URLs you can share read-write or read-only access with other people. ); - case 8: + case 7: return ( { hasCloseButton primaryButtonProps={{ text: "Next", - onClick: () => setStep(9), + onClick: () => setStep(8), }} secondaryButtonProps={{ text: "Previous", - onClick: () => setStep(7), + onClick: () => setStep(6), }} calloutProps={{ directionalHint: DirectionalHint.leftCenter }} onDismiss={() => onDimissTeachingBubble()} - footerContent={"Step 8 of " + totalSteps} + footerContent={"Step 7 of " + totalSteps} > Unlock everything Azure Cosmos DB has to offer When you're ready, upgrade to production. ); - case 9: + case 8: return ( { }} secondaryButtonProps={{ text: "Previous", - onClick: () => (userContext.isTryCosmosDBSubscription ? setStep(8) : setStep(7)), + onClick: () => (userContext.isTryCosmosDBSubscription ? setStep(7) : setStep(6)), }} onDismiss={() => onDimissTeachingBubble()} footerContent={"Step " + totalSteps + " of " + totalSteps} diff --git a/src/Explorer/SplashScreen/SplashScreen.tsx b/src/Explorer/SplashScreen/SplashScreen.tsx index ce2a6cbb2..228ef1a61 100644 --- a/src/Explorer/SplashScreen/SplashScreen.tsx +++ b/src/Explorer/SplashScreen/SplashScreen.tsx @@ -407,7 +407,7 @@ export const SplashScreen: React.FC = ({ explorer }) => { iconSrc: PowerShellIcon, title: t(Keys.splashScreen.shell.postgres.title), description: t(Keys.splashScreen.shell.postgres.description), - onClick: () => container.openNotebookTerminal(TerminalKind.Postgres), + onClick: () => container.openTerminal(TerminalKind.Postgres), }; } @@ -426,7 +426,7 @@ export const SplashScreen: React.FC = ({ explorer }) => { linkUrl: VCoreMongoNativeAuthLearnMoreUrl, }); } else { - container.openNotebookTerminal(TerminalKind.VCoreMongo); + container.openTerminal(TerminalKind.VCoreMongo); } }, }; @@ -620,7 +620,7 @@ export const SplashScreen: React.FC = ({ explorer }) => { }; const getRecentItems = (): JSX.Element => { - const recentItems = createRecentItems()?.filter((item) => item.description !== "Notebook"); + const recentItems = createRecentItems() ?? []; return ( diff --git a/src/Explorer/Tabs/TerminalTab.tsx b/src/Explorer/Tabs/TerminalTab.tsx index aba2b1680..caa3c2186 100644 --- a/src/Explorer/Tabs/TerminalTab.tsx +++ b/src/Explorer/Tabs/TerminalTab.tsx @@ -17,9 +17,9 @@ export interface TerminalTabOptions extends ViewModels.TabOptions { } export default class TerminalTab extends TabsBase { - public readonly html = '
'; + public readonly html = '
'; private container: Explorer; - private notebookTerminalComponentAdapter: ReactAdapter; + private cloudShellTerminalComponentAdapter: ReactAdapter; private isAllPublicIPAddressesEnabled: ko.Observable; constructor(options: TerminalTabOptions) { @@ -27,7 +27,7 @@ export default class TerminalTab extends TabsBase { this.container = options.container; this.isAllPublicIPAddressesEnabled = ko.observable(true); - this.notebookTerminalComponentAdapter = new CloudShellTerminalComponentAdapter( + this.cloudShellTerminalComponentAdapter = new CloudShellTerminalComponentAdapter( () => userContext?.databaseAccount, () => this.tabId, () => this.getUsername(), @@ -35,7 +35,7 @@ export default class TerminalTab extends TabsBase { options.kind, ); - this.notebookTerminalComponentAdapter.parameters = ko.computed(() => { + this.cloudShellTerminalComponentAdapter.parameters = ko.computed(() => { return this.isTemplateReady() && this.isAllPublicIPAddressesEnabled(); }); diff --git a/src/Explorer/Tree/Collection.ts b/src/Explorer/Tree/Collection.ts index 78faf849c..f5332a1fa 100644 --- a/src/Explorer/Tree/Collection.ts +++ b/src/Explorer/Tree/Collection.ts @@ -75,8 +75,6 @@ export default class Collection implements ViewModels.Collection { public throughput: ko.Computed; public rawDataModel: DataModels.Collection; public analyticalStorageTtl: ko.Observable; - public schema: DataModels.ISchema; - public requestSchema: () => void; public geospatialConfig: ko.Observable; // TODO move this to API customization class @@ -129,8 +127,6 @@ export default class Collection implements ViewModels.Collection { this.conflictResolutionPolicy = ko.observable(data.conflictResolutionPolicy); this.changeFeedPolicy = ko.observable(data.changeFeedPolicy); this.analyticalStorageTtl = ko.observable(data.analyticalStorageTtl); - this.schema = data.schema; - this.requestSchema = data.requestSchema; this.geospatialConfig = ko.observable(data.geospatialConfig); this.computedProperties = ko.observable(data.computedProperties); this.materializedViews = ko.observable(data.materializedViews); diff --git a/src/Explorer/Tree/Database.test.tsx b/src/Explorer/Tree/Database.test.tsx deleted file mode 100644 index 4bd8f087a..000000000 --- a/src/Explorer/Tree/Database.test.tsx +++ /dev/null @@ -1,86 +0,0 @@ -import { HttpStatusCodes } from "../../Common/Constants"; -import * as DataModels from "../../Contracts/DataModels"; -import { JunoClient } from "../../Juno/JunoClient"; -import { Features } from "../../Platform/Hosted/extractFeatures"; -import { updateUserContext, userContext } from "../../UserContext"; -import Explorer from "../Explorer"; -import Database from "./Database"; - -const createMockContainer = (): Explorer => { - const mockContainer = new Explorer(); - return mockContainer; -}; - -updateUserContext({ - subscriptionId: "fakeSubscriptionId", - resourceGroup: "fakeResourceGroup", - databaseAccount: { - id: "id", - name: "fakeName", - location: "fakeLocation", - type: "fakeType", - kind: "fakeKind", - properties: { - documentEndpoint: "fakeEndpoint", - tableEndpoint: "fakeEndpoint", - gremlinEndpoint: "fakeEndpoint", - cassandraEndpoint: "fakeEndpoint", - }, - }, -}); - -describe("Add Schema", () => { - it("should not call requestSchema or getSchema if analyticalStorageTtl is undefined", () => { - const collection: DataModels.Collection = { id: "fakeId" } as DataModels.Collection; - collection.analyticalStorageTtl = undefined; - const database = new Database(createMockContainer(), collection); - database.container = createMockContainer(); - - database.junoClient = new JunoClient(); - database.junoClient.requestSchema = jest.fn(); - database.junoClient.getSchema = jest.fn(); - - database.addSchema(collection); - - expect(database.junoClient.requestSchema).toHaveBeenCalledTimes(0); - }); - - it("should call requestSchema or getSchema if analyticalStorageTtl is not undefined", () => { - const collection: DataModels.Collection = {} as DataModels.Collection; - collection.analyticalStorageTtl = 0; - - const database = new Database(createMockContainer(), collection); - database.container = createMockContainer(); - updateUserContext({ - features: { - enableSchema: true, - } as Features, - }); - - database.junoClient = new JunoClient(); - database.junoClient.requestSchema = jest.fn(); - database.junoClient.getSchema = jest.fn().mockResolvedValue({ status: HttpStatusCodes.OK, data: {} }); - - jest.useFakeTimers(); - const interval = 5000; - const checkForSchema: NodeJS.Timeout = database.addSchema(collection, interval); - jest.advanceTimersByTime(interval + 1000); - - expect(database.junoClient.requestSchema).toHaveBeenCalledWith({ - id: undefined, - subscriptionId: userContext.subscriptionId, - resourceGroup: userContext.resourceGroup, - accountName: userContext.databaseAccount.name, - resource: `dbs/${database.id()}/colls/${collection.id}`, - status: "new", - }); - expect(checkForSchema).not.toBeNull(); - expect(database.junoClient.getSchema).toHaveBeenCalledWith( - userContext.subscriptionId, - userContext.resourceGroup, - userContext.databaseAccount.name, - database.id(), - collection.id, - ); - }); -}); diff --git a/src/Explorer/Tree/Database.tsx b/src/Explorer/Tree/Database.tsx index 753c991b7..ad0c1f5e9 100644 --- a/src/Explorer/Tree/Database.tsx +++ b/src/Explorer/Tree/Database.tsx @@ -8,7 +8,6 @@ import { readCollections, readCollectionsWithPagination } from "../../Common/dat import { readDatabaseOffer } from "../../Common/dataAccess/readDatabaseOffer"; import * as DataModels from "../../Contracts/DataModels"; import * as ViewModels from "../../Contracts/ViewModels"; -import { IJunoResponse, JunoClient } from "../../Juno/JunoClient"; import * as StorageUtility from "../../Shared/StorageUtility"; import { Action, ActionModifiers } from "../../Shared/Telemetry/TelemetryConstants"; import * as TelemetryProcessor from "../../Shared/Telemetry/TelemetryProcessor"; @@ -35,7 +34,6 @@ export default class Database implements ViewModels.Database { public isDatabaseExpanded: ko.Observable; public isDatabaseShared: ko.Computed; public selectedSubnodeKind: ko.Observable; - public junoClient: JunoClient; public isSampleDB: boolean; public collectionsContinuationToken?: string; private isOfferRead: boolean; @@ -55,7 +53,6 @@ export default class Database implements ViewModels.Database { this.isDatabaseShared = ko.pureComputed(() => { return this.offer && !!this.offer(); }); - this.junoClient = new JunoClient(); this.isSampleDB = false; this.isOfferRead = false; } @@ -205,10 +202,6 @@ export default class Database implements ViewModels.Database { } const deltaCollections = this.getDeltaCollections(collections); - collections.forEach((collection: DataModels.Collection) => { - this.addSchema(collection); - }); - deltaCollections.toAdd.forEach((collection: DataModels.Collection) => { const collectionVM: Collection = new Collection(this.container, this.id(), collection); collectionVMs.push(collectionVM); @@ -314,44 +307,4 @@ export default class Database implements ViewModels.Database { this.collections(collectionsToKeep); } - - public addSchema(collection: DataModels.Collection, interval?: number): NodeJS.Timeout { - let checkForSchema: NodeJS.Timeout; - interval = interval || 5000; - - if (collection.analyticalStorageTtl !== undefined && userContext.features.enableSchema) { - collection.requestSchema = () => { - this.junoClient.requestSchema({ - id: undefined, - subscriptionId: userContext.subscriptionId, - resourceGroup: userContext.resourceGroup, - accountName: userContext.databaseAccount.name, - resource: `dbs/${this.id()}/colls/${collection.id}`, - status: "new", - }); - checkForSchema = setInterval(async () => { - const response: IJunoResponse = await this.junoClient.getSchema( - userContext.subscriptionId, - userContext.resourceGroup, - userContext.databaseAccount.name, - this.id(), - collection.id, - ); - - if (response.status >= 404) { - clearInterval(checkForSchema); - } - - if (response.data !== undefined) { - clearInterval(checkForSchema); - collection.schema = response.data; - } - }, interval); - }; - - collection.requestSchema(); - } - - return checkForSchema; - } } diff --git a/src/Explorer/Tree/ResourceTreeAdapter.test.tsx b/src/Explorer/Tree/ResourceTreeAdapter.test.tsx deleted file mode 100644 index 13e1137be..000000000 --- a/src/Explorer/Tree/ResourceTreeAdapter.test.tsx +++ /dev/null @@ -1,240 +0,0 @@ -import { shallow } from "enzyme"; -import React from "react"; -import * as DataModels from "../../Contracts/DataModels"; -import * as ViewModels from "../../Contracts/ViewModels"; -import { - LegacyTreeComponent, - LegacyTreeComponentProps, - LegacyTreeNode, -} from "../Controls/TreeComponent/LegacyTreeComponent"; -import Explorer from "../Explorer"; -import Collection from "./Collection"; -import { ResourceTreeAdapter } from "./ResourceTreeAdapter"; - -const schema: DataModels.ISchema = { - id: "fakeSchemaId", - accountName: "fakeAccountName", - resource: "dbs/FakeDbName/colls/FakeCollectionName", - fields: [ - { - dataType: { - code: 15, - name: "String", - }, - hasNulls: true, - isArray: false, - schemaType: { - code: 0, - name: "Data", - }, - name: "_rid", - path: "_rid", - maxRepetitionLevel: 0, - maxDefinitionLevel: 1, - }, - { - dataType: { - code: 11, - name: "Int64", - }, - hasNulls: true, - isArray: false, - schemaType: { - code: 0, - name: "Data", - }, - name: "_ts", - path: "_ts", - maxRepetitionLevel: 0, - maxDefinitionLevel: 1, - }, - { - dataType: { - code: 15, - name: "String", - }, - hasNulls: true, - isArray: false, - schemaType: { - code: 0, - name: "Data", - }, - name: "id", - path: "id", - maxRepetitionLevel: 0, - maxDefinitionLevel: 1, - }, - { - dataType: { - code: 15, - name: "String", - }, - hasNulls: true, - isArray: false, - schemaType: { - code: 0, - name: "Data", - }, - name: "pk", - path: "pk", - maxRepetitionLevel: 0, - maxDefinitionLevel: 1, - }, - { - dataType: { - code: 15, - name: "String", - }, - hasNulls: true, - isArray: false, - schemaType: { - code: 0, - name: "Data", - }, - name: "other", - path: "other", - maxRepetitionLevel: 0, - maxDefinitionLevel: 1, - }, - { - dataType: { - code: 15, - name: "String", - }, - hasNulls: true, - isArray: false, - schemaType: { - code: 0, - name: "Data", - }, - name: "name", - path: "nested.name", - maxRepetitionLevel: 0, - maxDefinitionLevel: 1, - }, - { - dataType: { - code: 11, - name: "Int64", - }, - hasNulls: true, - isArray: false, - schemaType: { - code: 0, - name: "Data", - }, - name: "someNumber", - path: "nested.someNumber", - maxRepetitionLevel: 0, - maxDefinitionLevel: 1, - }, - { - dataType: { - code: 17, - name: "Double", - }, - hasNulls: true, - isArray: false, - schemaType: { - code: 0, - name: "Data", - }, - name: "anotherNumber", - path: "nested.anotherNumber", - maxRepetitionLevel: 0, - maxDefinitionLevel: 1, - }, - { - dataType: { - code: 15, - name: "String", - }, - hasNulls: true, - isArray: false, - schemaType: { - code: 0, - name: "Data", - }, - name: "name", - path: "items.list.items.name", - maxRepetitionLevel: 1, - maxDefinitionLevel: 3, - }, - { - dataType: { - code: 11, - name: "Int64", - }, - hasNulls: true, - isArray: false, - schemaType: { - code: 0, - name: "Data", - }, - name: "someNumber", - path: "items.list.items.someNumber", - maxRepetitionLevel: 1, - maxDefinitionLevel: 3, - }, - { - dataType: { - code: 17, - name: "Double", - }, - hasNulls: true, - isArray: false, - schemaType: { - code: 0, - name: "Data", - }, - name: "anotherNumber", - path: "items.list.items.anotherNumber", - maxRepetitionLevel: 1, - maxDefinitionLevel: 3, - }, - { - dataType: { - code: 15, - name: "String", - }, - hasNulls: true, - isArray: false, - schemaType: { - code: 0, - name: "Data", - }, - name: "_etag", - path: "_etag", - maxRepetitionLevel: 0, - maxDefinitionLevel: 1, - }, - ], -}; - -const createMockCollection = (): ViewModels.Collection => { - const mockCollection = {} as DataModels.Collection; - mockCollection._rid = "fakeRid"; - mockCollection._self = "fakeSelf"; - mockCollection.id = "fakeId"; - mockCollection.analyticalStorageTtl = 0; - mockCollection.schema = schema; - - const mockCollectionVM: ViewModels.Collection = new Collection(new Explorer(), "fakeDatabaseId", mockCollection); - - return mockCollectionVM; -}; - -describe("Resource tree for schema", () => { - const mockContainer = new Explorer(); - const resourceTree = new ResourceTreeAdapter(mockContainer); - - it("should render", () => { - const rootNode: LegacyTreeNode = resourceTree.buildSchemaNode(createMockCollection()); - const props: LegacyTreeComponentProps = { - rootNode, - className: "dataResourceTree", - }; - const wrapper = shallow(); - expect(wrapper).toMatchSnapshot(); - }); -}); diff --git a/src/Explorer/Tree/ResourceTreeAdapter.tsx b/src/Explorer/Tree/ResourceTreeAdapter.tsx index f2f2af369..ff627d27d 100644 --- a/src/Explorer/Tree/ResourceTreeAdapter.tsx +++ b/src/Explorer/Tree/ResourceTreeAdapter.tsx @@ -6,7 +6,6 @@ import * as React from "react"; import CosmosDBIcon from "../../../images/Azure-Cosmos-DB.svg"; import CollectionIcon from "../../../images/tree-collection.svg"; import { ReactAdapter } from "../../Bindings/ReactBindingHandler"; -import * as DataModels from "../../Contracts/DataModels"; import * as ViewModels from "../../Contracts/ViewModels"; import { userContext } from "../../UserContext"; import { isServerlessAccount } from "../../Utils/CapabilityUtils"; @@ -138,11 +137,6 @@ export class ResourceTreeAdapter implements ReactAdapter { }); } - const schemaNode: LegacyTreeNode = this.buildSchemaNode(collection); - if (schemaNode) { - children.push(schemaNode); - } - if (shouldShowScriptNodes()) { children.push(this.buildStoredProcedureNode(collection)); children.push(this.buildUserDefinedFunctionsNode(collection)); @@ -275,73 +269,6 @@ export class ResourceTreeAdapter implements ReactAdapter { }; } - public buildSchemaNode(collection: ViewModels.Collection): LegacyTreeNode { - if (collection.analyticalStorageTtl() == undefined) { - return undefined; - } - - if (!collection.schema || !collection.schema.fields) { - return undefined; - } - - return { - label: "Schema", - children: this.getSchemaNodes(collection.schema.fields), - onClick: () => { - collection.selectedSubnodeKind(ViewModels.CollectionTabKind.Schema); - useTabs.getState().refreshActiveTab((tab: TabsBase) => tab.collection && tab.collection.rid === collection.rid); - }, - }; - } - - private getSchemaNodes(fields: DataModels.IDataField[]): LegacyTreeNode[] { - const schema: any = {}; - - //unflatten - fields.forEach((field: DataModels.IDataField, fieldIndex: number) => { - const path: string[] = field.path.split("."); - const fieldProperties = [field.dataType.name, `HasNulls: ${field.hasNulls}`]; - let current: any = {}; - path.forEach((name: string, pathIndex: number) => { - if (pathIndex === 0) { - if (schema[name] === undefined) { - if (pathIndex === path.length - 1) { - schema[name] = fieldProperties; - } else { - schema[name] = {}; - } - } - current = schema[name]; - } else { - if (current[name] === undefined) { - if (pathIndex === path.length - 1) { - current[name] = fieldProperties; - } else { - current[name] = {}; - } - } - current = current[name]; - } - }); - }); - - const traverse = (obj: any): LegacyTreeNode[] => { - const children: LegacyTreeNode[] = []; - - if (obj !== null && !Array.isArray(obj) && typeof obj === "object") { - Object.entries(obj).forEach(([key, value]) => { - children.push({ label: key, children: traverse(value) }); - }); - } else if (Array.isArray(obj)) { - return [{ label: obj[0] }, { label: obj[1] }]; - } - - return children; - }; - - return traverse(schema); - } - public triggerRender() { window.requestAnimationFrame(() => this.parameters(Date.now())); } diff --git a/src/Explorer/Tree/__snapshots__/ResourceTreeAdapter.test.tsx.snap b/src/Explorer/Tree/__snapshots__/ResourceTreeAdapter.test.tsx.snap deleted file mode 100644 index f184ea29f..000000000 --- a/src/Explorer/Tree/__snapshots__/ResourceTreeAdapter.test.tsx.snap +++ /dev/null @@ -1,173 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Resource tree for schema should render 1`] = ` -
- -
-`; diff --git a/src/Explorer/Tree/__snapshots__/treeNodeUtil.test.ts.snap b/src/Explorer/Tree/__snapshots__/treeNodeUtil.test.ts.snap index 53c49c24f..5fefe708a 100644 --- a/src/Explorer/Tree/__snapshots__/treeNodeUtil.test.ts.snap +++ b/src/Explorer/Tree/__snapshots__/treeNodeUtil.test.ts.snap @@ -25,61 +25,6 @@ exports[`createDatabaseTreeNodes generates the correct tree structure for the Ca "label": "Rows", "onClick": [Function], }, - { - "children": [ - { - "children": [ - { - "children": [ - { - "label": "string", - }, - { - "label": "HasNulls: false", - }, - ], - "label": "street", - }, - { - "children": [ - { - "label": "string", - }, - { - "label": "HasNulls: true", - }, - ], - "label": "line2", - }, - { - "children": [ - { - "label": "number", - }, - { - "label": "HasNulls: false", - }, - ], - "label": "zip", - }, - ], - "label": "address", - }, - { - "children": [ - { - "label": "string", - }, - { - "label": "HasNulls: false", - }, - ], - "label": "orderId", - }, - ], - "label": "Schema", - "onClick": [Function], - }, ], "className": "collectionNode", "contextMenu": [ @@ -399,61 +344,6 @@ exports[`createDatabaseTreeNodes generates the correct tree structure for the Mo "label": "Scale & Settings", "onClick": [Function], }, - { - "children": [ - { - "children": [ - { - "children": [ - { - "label": "string", - }, - { - "label": "HasNulls: false", - }, - ], - "label": "street", - }, - { - "children": [ - { - "label": "string", - }, - { - "label": "HasNulls: true", - }, - ], - "label": "line2", - }, - { - "children": [ - { - "label": "number", - }, - { - "label": "HasNulls: false", - }, - ], - "label": "zip", - }, - ], - "label": "address", - }, - { - "children": [ - { - "label": "string", - }, - { - "label": "HasNulls: false", - }, - ], - "label": "orderId", - }, - ], - "label": "Schema", - "onClick": [Function], - }, ], "className": "collectionNode", "contextMenu": [ @@ -821,61 +711,6 @@ exports[`createDatabaseTreeNodes generates the correct tree structure for the SQ "label": "Settings", "onClick": [Function], }, - { - "children": [ - { - "children": [ - { - "children": [ - { - "label": "string", - }, - { - "label": "HasNulls: false", - }, - ], - "label": "street", - }, - { - "children": [ - { - "label": "string", - }, - { - "label": "HasNulls: true", - }, - ], - "label": "line2", - }, - { - "children": [ - { - "label": "number", - }, - { - "label": "HasNulls: false", - }, - ], - "label": "zip", - }, - ], - "label": "address", - }, - { - "children": [ - { - "label": "string", - }, - { - "label": "HasNulls: false", - }, - ], - "label": "orderId", - }, - ], - "label": "Schema", - "onClick": [Function], - }, ], "className": "collectionNode", "contextMenu": [ @@ -1335,61 +1170,6 @@ exports[`createDatabaseTreeNodes generates the correct tree structure for the SQ "label": "Scale & Settings", "onClick": [Function], }, - { - "children": [ - { - "children": [ - { - "children": [ - { - "label": "string", - }, - { - "label": "HasNulls: false", - }, - ], - "label": "street", - }, - { - "children": [ - { - "label": "string", - }, - { - "label": "HasNulls: true", - }, - ], - "label": "line2", - }, - { - "children": [ - { - "label": "number", - }, - { - "label": "HasNulls: false", - }, - ], - "label": "zip", - }, - ], - "label": "address", - }, - { - "children": [ - { - "label": "string", - }, - { - "label": "HasNulls: false", - }, - ], - "label": "orderId", - }, - ], - "label": "Schema", - "onClick": [Function], - }, { "children": [], "label": "Stored Procedures", @@ -1941,61 +1721,6 @@ exports[`createDatabaseTreeNodes using NoSQL API on Hosted Platform creates expe "label": "Scale & Settings", "onClick": [Function], }, - { - "children": [ - { - "children": [ - { - "children": [ - { - "label": "string", - }, - { - "label": "HasNulls: false", - }, - ], - "label": "street", - }, - { - "children": [ - { - "label": "string", - }, - { - "label": "HasNulls: true", - }, - ], - "label": "line2", - }, - { - "children": [ - { - "label": "number", - }, - { - "label": "HasNulls: false", - }, - ], - "label": "zip", - }, - ], - "label": "address", - }, - { - "children": [ - { - "label": "string", - }, - { - "label": "HasNulls: false", - }, - ], - "label": "orderId", - }, - ], - "label": "Schema", - "onClick": [Function], - }, { "children": [], "label": "Stored Procedures", diff --git a/src/Explorer/Tree/treeNodeUtil.test.ts b/src/Explorer/Tree/treeNodeUtil.test.ts index f30c3e166..7dc0f835c 100644 --- a/src/Explorer/Tree/treeNodeUtil.test.ts +++ b/src/Explorer/Tree/treeNodeUtil.test.ts @@ -153,7 +153,6 @@ const baseCollection = { onDocumentDBDocumentsClick: jest.fn(), onNewQueryClick: jest.fn(), onConflictsClick: jest.fn(), - onSchemaAnalyzerClick: jest.fn(), } as unknown as ViewModels.Collection; /** A basic test database that can be expanded on in tests */ @@ -297,31 +296,6 @@ describe("createDatabaseTreeNodes", () => { id: ko.observable("schemaCollection"), container: explorer, databaseId: sharedDb.id(), - analyticalStorageTtl: ko.observable(5), - schema: { - fields: [ - { - path: "address.street", - dataType: { name: "string" }, - hasNulls: false, - }, - { - path: "address.line2", - dataType: { name: "string" }, - hasNulls: true, - }, - { - path: "address.zip", - dataType: { name: "number" }, - hasNulls: false, - }, - { - path: "orderId", - dataType: { name: "string" }, - hasNulls: false, - }, - ], - } as unknown, } as ViewModels.Collection; conflictsCollection = { diff --git a/src/Explorer/Tree/treeNodeUtil.tsx b/src/Explorer/Tree/treeNodeUtil.tsx index d784080cb..2c09646da 100644 --- a/src/Explorer/Tree/treeNodeUtil.tsx +++ b/src/Explorer/Tree/treeNodeUtil.tsx @@ -18,7 +18,6 @@ import { isServerlessAccount } from "Utils/CapabilityUtils"; import { useTabs } from "hooks/useTabs"; import React from "react"; import { Platform, configContext } from "../../ConfigContext"; -import * as DataModels from "../../Contracts/DataModels"; import * as ViewModels from "../../Contracts/ViewModels"; import { userContext } from "../../UserContext"; import * as ResourceTreeContextMenuButtonFactory from "../ContextMenuButtonFactory"; @@ -347,11 +346,6 @@ const buildCollectionNodeChildren = ( }); } - const schemaNode: TreeNode = buildSchemaNode(collection, container, refreshActiveTab); - if (schemaNode) { - children.push(schemaNode); - } - const onUpdateDatabase = () => useDatabases.getState().updateDatabase(database); if (shouldShowScriptNodes()) { @@ -468,77 +462,3 @@ const buildTriggerNode = ( }, }; }; - -const buildSchemaNode = ( - collection: ViewModels.Collection, - container: Explorer, - refreshActiveTab: (comparator: (tab: TabsBase) => boolean) => void, -): TreeNode => { - if (collection.analyticalStorageTtl() === undefined) { - return undefined; - } - - if (!collection.schema || !collection.schema.fields) { - return undefined; - } - - return { - label: "Schema", - children: getSchemaNodes(collection.schema.fields), - onClick: () => { - collection.selectedSubnodeKind(ViewModels.CollectionTabKind.Schema); - refreshActiveTab((tab: TabsBase) => tab.collection && tab.collection.rid === collection.rid); - }, - }; -}; - -const getSchemaNodes = (fields: DataModels.IDataField[]): TreeNode[] => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const schema: any = {}; - - //unflatten - fields.forEach((field: DataModels.IDataField) => { - const path: string[] = field.path.split("."); - const fieldProperties = [field.dataType.name, `HasNulls: ${field.hasNulls}`]; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - let current: any = {}; - path.forEach((name: string, pathIndex: number) => { - if (pathIndex === 0) { - if (schema[name] === undefined) { - if (pathIndex === path.length - 1) { - schema[name] = fieldProperties; - } else { - schema[name] = {}; - } - } - current = schema[name]; - } else { - if (current[name] === undefined) { - if (pathIndex === path.length - 1) { - current[name] = fieldProperties; - } else { - current[name] = {}; - } - } - current = current[name]; - } - }); - }); - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const traverse = (obj: any): TreeNode[] => { - const children: TreeNode[] = []; - - if (obj !== undefined && !Array.isArray(obj) && typeof obj === "object") { - Object.entries(obj).forEach(([key, value]) => { - children.push({ label: key, children: traverse(value) }); - }); - } else if (Array.isArray(obj)) { - return [{ label: obj[0] }, { label: obj[1] }]; - } - - return children; - }; - - return traverse(schema); -}; diff --git a/src/Juno/JunoClient.ts b/src/Juno/JunoClient.ts deleted file mode 100644 index 839ba22f9..000000000 --- a/src/Juno/JunoClient.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { allowedJunoOrigins, validateEndpoint } from "Utils/EndpointUtils"; -import { HttpHeaders, HttpStatusCodes } from "../Common/Constants"; -import { configContext } from "../ConfigContext"; -import * as DataModels from "../Contracts/DataModels"; -import { userContext } from "../UserContext"; -import { getAuthorizationHeader } from "../Utils/AuthorizationUtils"; - -export interface IJunoResponse { - status: number; - data: T; -} - -export interface IGalleryItem { - id: string; - name: string; - description: string; - gitSha: string; - tags: string[]; - author: string; - thumbnailUrl: string; - created: string; - isSample: boolean; - downloads: number; - favorites: number; - views: number; - newCellId: string; - policyViolations: string[]; - pendingScanJobIds: string[]; -} - -export class JunoClient { - public async increaseNotebookViews(id: string): Promise> { - const response = await window.fetch(`${this.getNotebooksUrl()}/gallery/${id}/views`, { - method: "PATCH", - }); - - let data: IGalleryItem; - if (response.status === HttpStatusCodes.OK) { - data = await response.json(); - } - - return { - status: response.status, - data, - }; - } - - public async requestSchema( - schemaRequest: DataModels.ISchemaRequest, - ): Promise> { - const response = await window.fetch(`${this.getAnalyticsUrl()}/schema/request`, { - method: "POST", - body: JSON.stringify(schemaRequest), - headers: JunoClient.getHeaders(), - }); - - let data: DataModels.ISchemaRequest; - if (response.status === HttpStatusCodes.OK) { - data = await response.json(); - } - - return { - status: response.status, - data, - }; - } - - public async getSchema( - subscriptionId: string, - resourceGroup: string, - accountName: string, - databaseName: string, - containerName: string, - ): Promise> { - const response = await window.fetch( - `${this.getAnalyticsUrl()}/subscriptions/${subscriptionId}/resourceGroups/${resourceGroup}/databaseAccounts/${accountName}/schema/${databaseName}/${containerName}`, - { - method: "GET", - headers: JunoClient.getHeaders(), - }, - ); - - let data: DataModels.ISchema; - - if (response.status === HttpStatusCodes.OK) { - data = await response.json(); - } - - return { - status: response.status, - data, - }; - } - - private async getNotebooks(input: RequestInfo, init?: RequestInit): Promise> { - const response = await window.fetch(input, init); - - let data: IGalleryItem[]; - if (response.status === HttpStatusCodes.OK) { - data = await response.json(); - } - - return { - status: response.status, - data, - }; - } - - // public for tests - public static getJunoEndpoint(): string { - const junoEndpoint = userContext.features.junoEndpoint ?? configContext.JUNO_ENDPOINT; - if (!validateEndpoint(junoEndpoint, allowedJunoOrigins)) { - const error = `${junoEndpoint} not allowed as juno endpoint`; - console.error(error); - throw new Error(error); - } - - return junoEndpoint; - } - - private getNotebooksUrl(): string { - return `${JunoClient.getJunoEndpoint()}/api/notebooks`; - } - - private getAnalyticsUrl(): string { - return `${JunoClient.getJunoEndpoint()}/api/analytics`; - } - - private static getHeaders(): HeadersInit { - const authorizationHeader = getAuthorizationHeader(); - return { - [authorizationHeader.header]: authorizationHeader.token, - [HttpHeaders.contentType]: "application/json", - }; - } -} diff --git a/src/Localization/cs/Resources.json b/src/Localization/cs/Resources.json index 5797c9366..0cc4779ba 100644 --- a/src/Localization/cs/Resources.json +++ b/src/Localization/cs/Resources.json @@ -103,7 +103,6 @@ "learningResources": "Studijní materiály", "nextSteps": "Další kroky", "tipsAndLearnMore": "Tipy a další informace", - "notebook": "Poznámkový blok", "needHelp": "Potřebujete pomoc?" }, "top3Items": { @@ -664,34 +663,6 @@ "uploadStatus": "Vytvořeno: {{numSucceeded}}, omezeno: {{numThrottled}}, počet chyb: {{numFailed}}", "uploadedFiles": "Nahrané soubory" }, - "copyNotebook": { - "copyFailedError": "Nepovedlo se zkopírovat {{name}} do {{destination}}", - "uploadFailedError": "Nepodařilo se nahrát {{name}}", - "location": "Umístění", - "locationAriaLabel": "Umístění", - "selectLocation": "Vyberte umístění poznámkového bloku ke kopírování.", - "name": "Název" - }, - "publishNotebook": { - "publishFailedError": "Publikování do galerie se {{notebookName}} nezdařilo.", - "publishDescription": "Po publikování se tento poznámkový blok zobrazí ve veřejné galerii poznámkových bloků Azure Cosmos DB. Před publikováním se ujistěte, že jste odebrali všechna citlivá data nebo výstup.", - "publishPrompt": "Chcete {{name}} publikovat a nasdílet do galerie?", - "coverImage": "Titulní obrázek", - "coverImageUrl": "Adresa URL titulního obrázku", - "name": "Název", - "description": "Popis", - "tags": "Značky", - "tagsPlaceholder": "Volitelná značka 1, volitelná značka 2", - "preview": "Náhled", - "urlType": "Adresa URL", - "customImage": "Vlastní image", - "takeScreenshot": "Pořídit snímek obrazovky", - "useFirstDisplayOutput": "Použít první zobrazený výstup", - "failedToCaptureOutput": "Nepovedlo se zachytit první výstup.", - "outputDoesNotExist": "Pro žádnou z buněk neexistuje výstup.", - "failedToConvertError": "Nepovedlo se převést {{fileName}} do formátu base64", - "failedToUploadError": "Nepodařilo se nahrát {{fileName}}." - }, "changePartitionKey": { "failedToStartError": "Nepovedlo se spustit úlohu přenosu dat.", "suboptimalPartitionKeyError": "Upozornění: Systém zjistil, že vaše kolekce pravděpodobně používá neoptimální klíč oddílu.", diff --git a/src/Localization/de/Resources.json b/src/Localization/de/Resources.json index 23ebc9bb6..0f99cdacc 100644 --- a/src/Localization/de/Resources.json +++ b/src/Localization/de/Resources.json @@ -103,7 +103,6 @@ "learningResources": "Lernressourcen", "nextSteps": "Nächste Schritte", "tipsAndLearnMore": "Tipps und weitere Informationen", - "notebook": "Notebook", "needHelp": "Benötigen Sie Hilfe?" }, "top3Items": { @@ -664,34 +663,6 @@ "uploadStatus": "{{numSucceeded}} erstellt, {{numThrottled}} gedrosselt, {{numFailed}} Fehler", "uploadedFiles": "Hochgeladene Dateien" }, - "copyNotebook": { - "copyFailedError": "Fehler beim Kopieren von {{name}} nach {{destination}}", - "uploadFailedError": "Fehler beim Hochladen von „{{name}}“", - "location": "Speicherort", - "locationAriaLabel": "Speicherort", - "selectLocation": "Notizbuchspeicherort zum Kopieren auswählen", - "name": "Name" - }, - "publishNotebook": { - "publishFailedError": "Fehler beim Veröffentlichen von {{notebookName}} im Katalog", - "publishDescription": "Nach der Veröffentlichung wird dieses Notebook im öffentlichen Katalog Azure Cosmos DB Notebooks angezeigt. Stellen Sie sicher, dass Sie alle vertraulichen Daten oder Ausgaben vor der Veröffentlichung entfernt haben.", - "publishPrompt": "Möchten Sie „{{name}}“ im Katalog veröffentlichen und freigeben?", - "coverImage": "Titelbild", - "coverImageUrl": "Titelbild-URL", - "name": "Name", - "description": "Beschreibung", - "tags": "Kategorien", - "tagsPlaceholder": "Optionales Tag 1, optionales Tag 2", - "preview": "Vorschau", - "urlType": "URL", - "customImage": "Benutzerdefiniertes Image", - "takeScreenshot": "Screenshot erstellen", - "useFirstDisplayOutput": "Erste Anzeigeausgabe verwenden", - "failedToCaptureOutput": "Fehler beim Erfassen der ersten Ausgabe", - "outputDoesNotExist": "Für keine der Zellen ist eine Ausgabe vorhanden.", - "failedToConvertError": "Fehler beim Konvertieren von {{fileName}} in das Base64-Format", - "failedToUploadError": "Fehler beim Hochladen von „{{fileName}}“" - }, "changePartitionKey": { "failedToStartError": "Fehler beim Starten des Datenübertragungsauftrags", "suboptimalPartitionKeyError": "Warnung: Das System hat festgestellt, dass Ihre Sammlung möglicherweise keinen optimalen Partitionsschlüssel verwendet.", diff --git a/src/Localization/en/Resources.json b/src/Localization/en/Resources.json index f0301eb47..df6b85bd0 100644 --- a/src/Localization/en/Resources.json +++ b/src/Localization/en/Resources.json @@ -103,7 +103,6 @@ "learningResources": "Learning Resources", "nextSteps": "Next steps", "tipsAndLearnMore": "Tips & learn more", - "notebook": "Notebook", "needHelp": "Need help?" }, "top3Items": { @@ -668,34 +667,6 @@ "uploadStatus": "{{numSucceeded}} created, {{numThrottled}} throttled, {{numFailed}} errors", "uploadedFiles": "Uploaded files" }, - "copyNotebook": { - "copyFailedError": "Failed to copy {{name}} to {{destination}}", - "uploadFailedError": "Failed to upload {{name}}", - "location": "Location", - "locationAriaLabel": "Location", - "selectLocation": "Select a notebook location to copy", - "name": "Name" - }, - "publishNotebook": { - "publishFailedError": "Failed to publish {{notebookName}} to gallery", - "publishDescription": "When published, this notebook will appear in the Azure Cosmos DB notebooks public gallery. Make sure you have removed any sensitive data or output before publishing.", - "publishPrompt": "Would you like to publish and share \"{{name}}\" to the gallery?", - "coverImage": "Cover image", - "coverImageUrl": "Cover image url", - "name": "Name", - "description": "Description", - "tags": "Tags", - "tagsPlaceholder": "Optional tag 1, Optional tag 2", - "preview": "Preview", - "urlType": "URL", - "customImage": "Custom Image", - "takeScreenshot": "Take Screenshot", - "useFirstDisplayOutput": "Use First Display Output", - "failedToCaptureOutput": "Failed to capture first output", - "outputDoesNotExist": "Output does not exist for any of the cells.", - "failedToConvertError": "Failed to convert {{fileName}} to base64 format", - "failedToUploadError": "Failed to upload {{fileName}}" - }, "changePartitionKey": { "failedToStartError": "Failed to start data transfer job", "suboptimalPartitionKeyError": "Warning: The system has detected that your collection may be using a suboptimal partition key", diff --git a/src/Localization/es/Resources.json b/src/Localization/es/Resources.json index 6015a13c2..029fe3234 100644 --- a/src/Localization/es/Resources.json +++ b/src/Localization/es/Resources.json @@ -103,7 +103,6 @@ "learningResources": "Recursos de aprendizaje", "nextSteps": "Siguientes pasos", "tipsAndLearnMore": "Sugerencias y más información", - "notebook": "Notebook", "needHelp": "¿Necesita ayuda?" }, "top3Items": { @@ -664,34 +663,6 @@ "uploadStatus": "{{numSucceeded}} creado, {{numThrottled}} limitado, {{numFailed}} errores", "uploadedFiles": "Archivos cargados" }, - "copyNotebook": { - "copyFailedError": "No se pudo copiar {{name}} en {{destination}}", - "uploadFailedError": "Error al cargar {{name}}.", - "location": "Ubicación", - "locationAriaLabel": "Ubicación", - "selectLocation": "Seleccionar una ubicación de bloc de notas para copiar", - "name": "Nombre" - }, - "publishNotebook": { - "publishFailedError": "No se pudo publicar {{notebookName}} en la galería", - "publishDescription": "Cuando se publique, este bloc de notas aparecerá en la galería pública de blocs de notas de Azure Cosmos DB. Asegúrese de que ha quitado los datos confidenciales o la salida antes de la publicación.", - "publishPrompt": "¿Desea publicar y compartir \"{{name}}\" en la galería?", - "coverImage": "Imagen de portada", - "coverImageUrl": "Dirección URL de la imagen de portada", - "name": "Nombre", - "description": "Descripción", - "tags": "Etiquetas", - "tagsPlaceholder": "Etiqueta opcional 1, etiqueta opcional 2", - "preview": "Versión preliminar", - "urlType": "URL", - "customImage": "Imagen personalizada", - "takeScreenshot": "Obtener recorte de pantalla", - "useFirstDisplayOutput": "Usar la primera salida de pantalla", - "failedToCaptureOutput": "No se pudo capturar la primera salida", - "outputDoesNotExist": "La salida no existe para ninguna de las celdas.", - "failedToConvertError": "No se pudo convertir {{fileName}} al formato base64", - "failedToUploadError": "No se pudo cargar {{fileName}}" - }, "changePartitionKey": { "failedToStartError": "No se pudo iniciar el trabajo de transferencia de datos", "suboptimalPartitionKeyError": "Advertencia: el sistema ha detectado que la colección puede estar usando una clave de partición poco óptima", diff --git a/src/Localization/fr/Resources.json b/src/Localization/fr/Resources.json index d28813c23..b392f4e25 100644 --- a/src/Localization/fr/Resources.json +++ b/src/Localization/fr/Resources.json @@ -103,7 +103,6 @@ "learningResources": "Ressources pédagogiques", "nextSteps": "Étapes suivantes", "tipsAndLearnMore": "Conseils et plus d’informations", - "notebook": "Bloc-notes", "needHelp": "Avez-vous besoin d’aide ?" }, "top3Items": { @@ -664,34 +663,6 @@ "uploadStatus": "{{numSucceeded}} créé(s), {{numThrottled}} limité(s), {{numFailed}} erreur(s)", "uploadedFiles": "Fichiers chargés" }, - "copyNotebook": { - "copyFailedError": "Nous n’avons pas pu copier {{name}} vers {{destination}}", - "uploadFailedError": "Nous n’avons pas pu charger {{name}}", - "location": "Emplacement", - "locationAriaLabel": "Emplacement", - "selectLocation": "Sélectionner un emplacement de bloc-notes vers lequel effectuer une copie", - "name": "Nom" - }, - "publishNotebook": { - "publishFailedError": "Nous n’avons pas pu publier {{notebookName}} dans la galerie", - "publishDescription": "Une fois publié, ce bloc-notes apparaîtra dans la galerie publique de bloc-notes d’Azure Cosmos DB. Veillez à bien supprimer toutes les données sensibles et tout résultat avant la publication.", - "publishPrompt": "Voulez-vous publier et partager « {{name}} » dans la galerie ?", - "coverImage": "Image de couverture", - "coverImageUrl": "URL d’image de couverture", - "name": "Nom", - "description": "Description", - "tags": "Balises", - "tagsPlaceholder": "Balise facultative 1, Balise facultative 2", - "preview": "Aperçu", - "urlType": "URL", - "customImage": "Image personnalisée", - "takeScreenshot": "Prendre une capture d’écran", - "useFirstDisplayOutput": "Utiliser le résultat du premier affichage", - "failedToCaptureOutput": "Nous n’avons pas pu capturer le premier résultat", - "outputDoesNotExist": "Aucune des cellules ne présente de résultats.", - "failedToConvertError": "Nous n’avons pas pu convertir {{fileName}} au format base64", - "failedToUploadError": "Nous n’avons pas pu charger {{fileName}}" - }, "changePartitionKey": { "failedToStartError": "Nous n’avons pas pu démarrer la tâche de transfert de données", "suboptimalPartitionKeyError": "Avertissement : Le système a détecté que votre collection utilise peut-être une clé de partition sous-optimale", diff --git a/src/Localization/hu/Resources.json b/src/Localization/hu/Resources.json index 621fe16bc..23a52edd8 100644 --- a/src/Localization/hu/Resources.json +++ b/src/Localization/hu/Resources.json @@ -103,7 +103,6 @@ "learningResources": "Tanulási források", "nextSteps": "Következő lépések", "tipsAndLearnMore": "Tippek és további információ", - "notebook": "Jegyzetfüzet", "needHelp": "Segítségre van szüksége?" }, "top3Items": { @@ -664,34 +663,6 @@ "uploadStatus": "{{numSucceeded}} létrehozva, {{numThrottled}} szabályozva, {{numFailed}} hiba", "uploadedFiles": "Feltöltött fájlok" }, - "copyNotebook": { - "copyFailedError": "Nem sikerült a(z) {{name}} másolása ide: {{destination}}", - "uploadFailedError": "Nem sikerült a(z) {{name}} feltöltése", - "location": "Hely", - "locationAriaLabel": "Hely", - "selectLocation": "Jegyzetfüzet másolási helyének kiválasztása", - "name": "Név" - }, - "publishNotebook": { - "publishFailedError": "Nem sikerült a(z) {{notebookName}} közzététele a katalógusban", - "publishDescription": "Közzétételkor ez a jegyzetfüzet megjelenik a Azure Cosmos DB jegyzetfüzetek nyilvános katalógusában. A közzététel előtt győződjön meg arról, hogy eltávolította a bizalmas adatokat vagy kimeneteket.", - "publishPrompt": "Közzéteszi és megosztja a(z) {{name}} dokumentumot a katalógusban?", - "coverImage": "Borítókép", - "coverImageUrl": "Borítókép URL-címe", - "name": "Név", - "description": "Leírás", - "tags": "Címkék", - "tagsPlaceholder": "Nem kötelező címke 1, nem kötelező címke 2", - "preview": "Előzetes verzió", - "urlType": "URL-cím", - "customImage": "Egyéni rendszerkép", - "takeScreenshot": "Képernyőkép készítése", - "useFirstDisplayOutput": "Első megjelenítési kimenet használata", - "failedToCaptureOutput": "Nem sikerült rögzíteni az első kimenetet", - "outputDoesNotExist": "A kimenet nem létezik egyik cellához sem.", - "failedToConvertError": "Nem sikerült a(z) {{fileName}} base64 formátumra való konvertálása", - "failedToUploadError": "Nem sikerült a(z) {{fileName}} feltöltése" - }, "changePartitionKey": { "failedToStartError": "Nem sikerült elindítani az adatátviteli feladatot", "suboptimalPartitionKeyError": "Figyelmeztetés: A rendszer úgy észlelte, hogy a gyűjtemény valószínűleg nem optimális partíciókulcsot használ", diff --git a/src/Localization/id/Resources.json b/src/Localization/id/Resources.json index bb381aac6..da92378b3 100644 --- a/src/Localization/id/Resources.json +++ b/src/Localization/id/Resources.json @@ -103,7 +103,6 @@ "learningResources": "Sumber Daya Pembelajaran", "nextSteps": "Langkah berikutnya", "tipsAndLearnMore": "Tips & pelajari selengkapnya", - "notebook": "Buku catatan", "needHelp": "Perlu bantuan?" }, "top3Items": { @@ -664,34 +663,6 @@ "uploadStatus": "{{numSucceeded}} dibuat, {{numThrottled}} dibatasi, {{numFailed}} kesalahan", "uploadedFiles": "File yang diunggah" }, - "copyNotebook": { - "copyFailedError": "Gagal menyalin {{name}} ke {{destination}}", - "uploadFailedError": "Gagal mengunggah {{name}}", - "location": "Lokasi", - "locationAriaLabel": "Lokasi", - "selectLocation": "Pilih lokasi buku catatan untuk disalin", - "name": "Nama" - }, - "publishNotebook": { - "publishFailedError": "Gagal menerbitkan {{notebookName}} ke galeri", - "publishDescription": "Saat diterbitkan, buku catatan ini akan muncul di galeri publik buku catatan Azure Cosmos DB. Pastikan Anda telah menghapus data atau output sensitif sebelum menerbitkan.", - "publishPrompt": "Apakah Anda ingin menerbitkan dan membagikan \"{{name}}\" ke galeri?", - "coverImage": "Gambar sampul", - "coverImageUrl": "Url gambar sampul", - "name": "Nama", - "description": "Deskripsi", - "tags": "Tag", - "tagsPlaceholder": "Tag opsional 1, Tag opsional 2", - "preview": "Pratinjau", - "urlType": "URL", - "customImage": "Gambar Kustom", - "takeScreenshot": "Ambil Cuplikan Layar", - "useFirstDisplayOutput": "Gunakan Output Tampilan Pertama", - "failedToCaptureOutput": "Gagal mengambil output pertama", - "outputDoesNotExist": "Output tidak ada untuk sel mana pun.", - "failedToConvertError": "Gagal mengonversi {{fileName}} ke format base64", - "failedToUploadError": "Gagal mengunggah {{fileName}}" - }, "changePartitionKey": { "failedToStartError": "Gagal memulai tugas transfer data", "suboptimalPartitionKeyError": "Peringatan: Sistem mendeteksi bahwa koleksi Anda mungkin menggunakan kunci partisi yang kurang optimal", diff --git a/src/Localization/it/Resources.json b/src/Localization/it/Resources.json index 83d0725e4..580a920da 100644 --- a/src/Localization/it/Resources.json +++ b/src/Localization/it/Resources.json @@ -103,7 +103,6 @@ "learningResources": "Risorse di formazione", "nextSteps": "Passaggi successivi", "tipsAndLearnMore": "Suggerimenti e altre informazioni", - "notebook": "Notebook", "needHelp": "Serve aiuto?" }, "top3Items": { @@ -664,34 +663,6 @@ "uploadStatus": "{{numSucceeded}} creati, {{numThrottled}} con limitazione, {{numFailed}} errori", "uploadedFiles": "File caricati" }, - "copyNotebook": { - "copyFailedError": "Non è stato possibile copiare {{name}} in {{destination}}", - "uploadFailedError": "Non è possibile caricare {{name}}", - "location": "Posizione", - "locationAriaLabel": "Posizione", - "selectLocation": "Selezionare una posizione del notebook in cui copiare", - "name": "Nome" - }, - "publishNotebook": { - "publishFailedError": "Non è stato possibile pubblicare {{notebookName}} nella raccolta", - "publishDescription": "Quando viene pubblicato, questo notebook sarà visualizzato nella raccolta pubblica di Azure Cosmos DB. Assicurarsi di aver rimosso dati o output sensibili prima della pubblicazione.", - "publishPrompt": "Pubblicare e condividere \"{{name}}\" nella raccolta?", - "coverImage": "Immagine di copertina", - "coverImageUrl": "URL immagine di copertina", - "name": "Nome", - "description": "Descrizione", - "tags": "Tag", - "tagsPlaceholder": "Tag facoltativo 1, tag facoltativo 2", - "preview": "Anteprima", - "urlType": "URL", - "customImage": "Immagine personalizzata", - "takeScreenshot": "Crea screenshot", - "useFirstDisplayOutput": "Usa output prima visualizzazione", - "failedToCaptureOutput": "Non è stato possibile acquisire il primo output", - "outputDoesNotExist": "L'output non esiste per nessuna delle celle.", - "failedToConvertError": "Non è stato possibile convertire {{fileName}} nel formato base64", - "failedToUploadError": "Non è possibile caricare {{fileName}}" - }, "changePartitionKey": { "failedToStartError": "Non è stato possibile avviare il processo di trasferimento dati", "suboptimalPartitionKeyError": "Avviso: il sistema ha rilevato che la raccolta potrebbe usare una chiave di partizione non ottimale", diff --git a/src/Localization/ja/Resources.json b/src/Localization/ja/Resources.json index c2dec9990..5b3f34332 100644 --- a/src/Localization/ja/Resources.json +++ b/src/Localization/ja/Resources.json @@ -103,7 +103,6 @@ "learningResources": "学習リソース", "nextSteps": "次の手順", "tipsAndLearnMore": "ヒントと詳細の確認", - "notebook": "ノートブック", "needHelp": "ヘルプが必要ですか?" }, "top3Items": { @@ -664,34 +663,6 @@ "uploadStatus": "{{numSucceeded}} 件作成済み、{{numThrottled}} 件調整済み、{{numFailed}} 件のエラー", "uploadedFiles": "ファイルをアップロードしました" }, - "copyNotebook": { - "copyFailedError": "{{name}} を {{destination}} にコピーできませんでした", - "uploadFailedError": "{{name}} をアップロードできませんでした", - "location": "場所", - "locationAriaLabel": "場所", - "selectLocation": "コピーするノートブックの場所を選択する", - "name": "名前" - }, - "publishNotebook": { - "publishFailedError": "{{notebookName}} をギャラリーに発行できませんでした", - "publishDescription": "公開すると、このノートブックは Azure Cosmos DB ノートブックのパブリック ギャラリーに表示されます。公開前に機密データや出力が削除されていることを確認してください。", - "publishPrompt": "\"{{name}}\" をギャラリーに公開して共有しますか?", - "coverImage": "カバー画像", - "coverImageUrl": "カバー画像の URL", - "name": "名前", - "description": "説明", - "tags": "タグ", - "tagsPlaceholder": "オプションのタグ 1、オプションのタグ 2", - "preview": "プレビュー", - "urlType": "URL", - "customImage": "カスタム イメージ", - "takeScreenshot": "スクリーンショットを撮る", - "useFirstDisplayOutput": "最初のディスプレイ出力を使用する", - "failedToCaptureOutput": "最初の出力をキャプチャできませんでした", - "outputDoesNotExist": "どのセルにも出力が存在しません。", - "failedToConvertError": "{{fileName}} を base64 形式に変換できませんでした", - "failedToUploadError": "{{fileName}} をアップロードできませんでした" - }, "changePartitionKey": { "failedToStartError": "データ転送ジョブの開始に失敗しました", "suboptimalPartitionKeyError": "警告: システムはコレクションが最適でないパーティション キーを使用している可能性を検出しました", diff --git a/src/Localization/ko/Resources.json b/src/Localization/ko/Resources.json index ed774fe50..0fef9ccca 100644 --- a/src/Localization/ko/Resources.json +++ b/src/Localization/ko/Resources.json @@ -103,7 +103,6 @@ "learningResources": "학습 리소스", "nextSteps": "다음 단계", "tipsAndLearnMore": "팁 및 자세한 정보", - "notebook": "Notebook", "needHelp": "도움이 필요하세요?" }, "top3Items": { @@ -664,34 +663,6 @@ "uploadStatus": "{{numSucceeded}} 생성됨, {{numThrottled}} 제한됨, {{numFailed}} 오류 발생", "uploadedFiles": "업로드된 파일" }, - "copyNotebook": { - "copyFailedError": "{{name}}을(를) {{destination}}(으)로 복사 실패", - "uploadFailedError": "'{{name}}' 업로드 실패", - "location": "위치", - "locationAriaLabel": "위치", - "selectLocation": "복사할 노트북 위치 선택", - "name": "이름" - }, - "publishNotebook": { - "publishFailedError": "{{notebookName}}을(를) 갤러리에 게시하지 못했습니다.", - "publishDescription": "게시하면 이 노트북이 Azure Cosmos DB 노트북 공개 갤러리에 표시됩니다. 게시 전에 민감한 데이터나 출력이 제거되었는지 확인하세요.", - "publishPrompt": "\"{{name}}\"을(를) 게시하고 갤러리에 공유하시겠습니까?", - "coverImage": "커버 이미지", - "coverImageUrl": "표지 이미지 URL", - "name": "이름", - "description": "설명", - "tags": "태그", - "tagsPlaceholder": "선택 태그 1, 선택 태그 2", - "preview": "미리 보기", - "urlType": "URL", - "customImage": "사용자 지정 이미지", - "takeScreenshot": "화면 캡처", - "useFirstDisplayOutput": "첫 번째 디스플레이 출력 사용", - "failedToCaptureOutput": "첫 번째 출력을 캡처하지 못했습니다.", - "outputDoesNotExist": "셀에 대한 출력이 없습니다.", - "failedToConvertError": "{{fileName}}을(를) base64 형식으로 변환하지 못했습니다.", - "failedToUploadError": "{{fileName}} 업로드 실패" - }, "changePartitionKey": { "failedToStartError": "데이터 전송 작업을 시작하지 못했습니다.", "suboptimalPartitionKeyError": "경고: 컬렉션이 최적이 아닌 파티션 키를 사용하고 있을 수 있습니다.", diff --git a/src/Localization/nl/Resources.json b/src/Localization/nl/Resources.json index 3f1125b6e..673e644a0 100644 --- a/src/Localization/nl/Resources.json +++ b/src/Localization/nl/Resources.json @@ -103,7 +103,6 @@ "learningResources": "Trainingsresources", "nextSteps": "Volgende stappen", "tipsAndLearnMore": "Tips & meer informatie", - "notebook": "Notitieboek", "needHelp": "Hulp nodig?" }, "top3Items": { @@ -664,34 +663,6 @@ "uploadStatus": "{{numSucceeded}} gemaakt, {{numThrottled}} beperkt, {{numFailed}} fouten", "uploadedFiles": "Geüploade bestanden" }, - "copyNotebook": { - "copyFailedError": "{{name}} kopiëren naar {{destination}} is mislukt", - "uploadFailedError": "Kan {{name}} niet uploaden", - "location": "Locatie", - "locationAriaLabel": "Locatie", - "selectLocation": "Notebooklocatie selecteren om te kopiëren", - "name": "Naam" - }, - "publishNotebook": { - "publishFailedError": "{{notebookName}} publiceren naar galerie is mislukt", - "publishDescription": "Wanneer deze notebook wordt gepubliceerd, wordt het weergegeven in de Azure Cosmos DB notebooks openbaar galerie. Zorg ervoor dat u gevoelige gegevens of uitvoer hebt verwijderd voordat u publiceert.", - "publishPrompt": "Wilt u {{name}} publiceren en delen in de galerie?", - "coverImage": "Omslagafbeelding", - "coverImageUrl": "URL van omslagafbeelding", - "name": "Naam", - "description": "Beschrijving", - "tags": "Tags", - "tagsPlaceholder": "Optionele tag 1, optionele tag 2", - "preview": "Preview", - "urlType": "URL", - "customImage": "Aangepaste installatiekopie", - "takeScreenshot": "Schermopname maken", - "useFirstDisplayOutput": "Gebruik uitvoer van eerste weergave", - "failedToCaptureOutput": "Kan de eerste uitvoer niet vastleggen", - "outputDoesNotExist": "Uitvoer bestaat niet voor alle cellen.", - "failedToConvertError": "{{fileName}} converteren naar base64-indeling is mislukt", - "failedToUploadError": "Kan {{fileName}} niet uploaden" - }, "changePartitionKey": { "failedToStartError": "Kan de taak voor gegevensoverdracht niet starten", "suboptimalPartitionKeyError": "Waarschuwing: het systeem heeft gedetecteerd dat uw verzameling mogelijk een suboptimale partitiesleutel gebruikt", diff --git a/src/Localization/pl/Resources.json b/src/Localization/pl/Resources.json index b5d502ff3..f462c3b40 100644 --- a/src/Localization/pl/Resources.json +++ b/src/Localization/pl/Resources.json @@ -103,7 +103,6 @@ "learningResources": "Zasoby szkoleniowe", "nextSteps": "Następne kroki", "tipsAndLearnMore": "Porady i dowiedz się więcej", - "notebook": "Notes", "needHelp": "Potrzebujesz pomocy?" }, "top3Items": { @@ -664,34 +663,6 @@ "uploadStatus": "Utworzono: {{numSucceeded}}, ograniczono: {{numThrottled}}, błędy: {{numFailed}}", "uploadedFiles": "Przekazywane pliki" }, - "copyNotebook": { - "copyFailedError": "Nie można skopiować {{name}} do {{destination}}", - "uploadFailedError": "Nie można przekazać {{name}}", - "location": "Lokalizacja", - "locationAriaLabel": "Lokalizacja", - "selectLocation": "Wybierz lokalizację notesu do skopiowania", - "name": "Nazwa" - }, - "publishNotebook": { - "publishFailedError": "Nie można opublikować {{notebookName}} w galerii", - "publishDescription": "Po opublikowaniu ten notes pojawi się w publicznej galerii notesów Azure Cosmos DB. Przed opublikowaniem upewnij się, że usunięto poufne dane lub dane wyjściowe.", - "publishPrompt": "Czy chcesz opublikować i udostępnić „{{name}}” w galerii?", - "coverImage": "Obraz okładki", - "coverImageUrl": "Adres URL obrazu tytułowego", - "name": "Nazwa", - "description": "Opis", - "tags": "Tagi", - "tagsPlaceholder": "Opcjonalny tag 1, opcjonalny tag 2", - "preview": "Podgląd", - "urlType": "Adres URL", - "customImage": "Obraz niestandardowy", - "takeScreenshot": "Zrób zrzut ekranu", - "useFirstDisplayOutput": "Użyj pierwszego wyświetlania danych wyjściowych", - "failedToCaptureOutput": "Nie można przechwycić pierwszych danych wyjściowych", - "outputDoesNotExist": "Dane wyjściowe nie istnieją dla żadnej komórki.", - "failedToConvertError": "Nie można przekonwertować {{fileName}} na format base64", - "failedToUploadError": "Nie można przekazać {{fileName}}" - }, "changePartitionKey": { "failedToStartError": "Nie udało się uruchomić zadania transferu danych", "suboptimalPartitionKeyError": "Ostrzeżenie: system wykrył, że kolekcja może używać nieoptymalnego klucza partycji", diff --git a/src/Localization/pt-BR/Resources.json b/src/Localization/pt-BR/Resources.json index 23bc14da7..5531a8644 100644 --- a/src/Localization/pt-BR/Resources.json +++ b/src/Localization/pt-BR/Resources.json @@ -103,7 +103,6 @@ "learningResources": "Recursos de aprendizado", "nextSteps": "Próximas etapas", "tipsAndLearnMore": "Dicas e saiba mais", - "notebook": "Notebook", "needHelp": "Precisa de ajuda?" }, "top3Items": { @@ -664,34 +663,6 @@ "uploadStatus": "{{numSucceeded}} criado(s), {{numThrottled}} limitado(s), {{numFailed}} erro(s)", "uploadedFiles": "Arquivos carregados" }, - "copyNotebook": { - "copyFailedError": "Falha ao copiar {{name}} para {{destination}}", - "uploadFailedError": "Falha ao carregar {{name}}", - "location": "Localização", - "locationAriaLabel": "Localização", - "selectLocation": "Selecione um local do notebook para copiar", - "name": "Nome" - }, - "publishNotebook": { - "publishFailedError": "Falha ao publicar {{notebookName}} na galeria", - "publishDescription": "Quando publicado, esse notebook aparecerá na galeria pública de notebooks do Azure Cosmos DB. Verifique se você removeu os dados confidenciais ou a saída antes de publicar.", - "publishPrompt": "Deseja publicar e compartilhar \"{{name}}\" na galeria?", - "coverImage": "Imagem de capa", - "coverImageUrl": "URL da imagem de capa", - "name": "Nome", - "description": "Descrição", - "tags": "Rótulos", - "tagsPlaceholder": "Marca opcional 1, marca opcional 2", - "preview": "Visualizar", - "urlType": "URL", - "customImage": "Imagem Personalizada", - "takeScreenshot": "Capturar Tela", - "useFirstDisplayOutput": "Usar a Primeira Saída de Exibição", - "failedToCaptureOutput": "Falha ao capturar a primeira saída", - "outputDoesNotExist": "A saída não existe para nenhuma das células.", - "failedToConvertError": "Falha ao converter {{fileName}} no formato base64", - "failedToUploadError": "Falha ao carregar {{fileName}}" - }, "changePartitionKey": { "failedToStartError": "Falha ao iniciar o trabalho de transferência de dados", "suboptimalPartitionKeyError": "Aviso: o sistema detectou que sua coleção pode estar usando uma chave de partição abaixo do ideal", diff --git a/src/Localization/pt-PT/Resources.json b/src/Localization/pt-PT/Resources.json index dad4222dc..515a7731a 100644 --- a/src/Localization/pt-PT/Resources.json +++ b/src/Localization/pt-PT/Resources.json @@ -103,7 +103,6 @@ "learningResources": "Recursos de Aprendizagem", "nextSteps": "Passos seguintes", "tipsAndLearnMore": "Sugestões e saiba mais", - "notebook": "Bloco de notas", "needHelp": "Precisa de ajuda?" }, "top3Items": { @@ -664,34 +663,6 @@ "uploadStatus": "{{numSucceeded}} criados, {{numThrottled}} limitados, {{numFailed}} erros", "uploadedFiles": "Ficheiros carregados" }, - "copyNotebook": { - "copyFailedError": "Falha ao copiar {{name}} para {{destination}}", - "uploadFailedError": "Não foi possível carregar {{name}}", - "location": "Localização", - "locationAriaLabel": "Localização", - "selectLocation": "Selecione uma localização de bloco de notas para copiar", - "name": "Nome" - }, - "publishNotebook": { - "publishFailedError": "Falha ao publicar {{notebookName}} na galeria", - "publishDescription": "Quando publicado, este bloco de notas será apresentado na galeria pública de blocos de notas do Azure Cosmos DB. Certifique-se de que removeu quaisquer dados confidenciais ou resultados antes de publicar.", - "publishPrompt": "Pretende publicar e partilhar \"{{name}}\" na galeria?", - "coverImage": "Imagem de capa", - "coverImageUrl": "URL da imagem de capa", - "name": "Nome", - "description": "Descrição", - "tags": "Sinalizadores", - "tagsPlaceholder": "Etiqueta opcional 1, Etiqueta opcional 2", - "preview": "Pré-visualização", - "urlType": "URL", - "customImage": "Imagem Personalizada", - "takeScreenshot": "Tirar Captura de Ecrã", - "useFirstDisplayOutput": "Utilizar Saída do Primeiro Ecrã", - "failedToCaptureOutput": "Falha ao capturar a primeira saída", - "outputDoesNotExist": "A saída não existe para nenhuma das células.", - "failedToConvertError": "Falha ao converter {{fileName}} para o formato base64", - "failedToUploadError": "Não foi possível carregar {{fileName}}" - }, "changePartitionKey": { "failedToStartError": "Falha ao iniciar a tarefa de transferência de dados", "suboptimalPartitionKeyError": "Aviso: O sistema detetou que a sua coleção pode estar a utilizar uma chave de partição não ideal.", diff --git a/src/Localization/ru/Resources.json b/src/Localization/ru/Resources.json index 6f7ba298e..fde015a1a 100644 --- a/src/Localization/ru/Resources.json +++ b/src/Localization/ru/Resources.json @@ -103,7 +103,6 @@ "learningResources": "Учебные материалы", "nextSteps": "Дальнейшие действия", "tipsAndLearnMore": "Советы и дополнительная информация", - "notebook": "Записная книжка", "needHelp": "Нужна помощь?" }, "top3Items": { @@ -664,34 +663,6 @@ "uploadStatus": "Создано: {{numSucceeded}}, отклонено в результате регулирования: {{numThrottled}}, ошибок: {{numFailed}}", "uploadedFiles": "Отправленные файлы" }, - "copyNotebook": { - "copyFailedError": "Не удалось скопировать {{name}} в {{destination}}", - "uploadFailedError": "Не удалось отправить {{name}}", - "location": "Расположение", - "locationAriaLabel": "Расположение", - "selectLocation": "Выберите место для копирования записной книжки", - "name": "Имя" - }, - "publishNotebook": { - "publishFailedError": "Не удалось опубликовать {{notebookName}} в галерее", - "publishDescription": "После публикации эта записная книжка появится в общедоступной галерее записных книжек Azure Cosmos DB. Перед публикацией убедитесь, что удалили все конфиденциальные данные и результаты.", - "publishPrompt": "Хотите опубликовать \"{{name}}\" и поделиться ею в галерее?", - "coverImage": "Изображение обложки", - "coverImageUrl": "URL-адрес изображения обложки", - "name": "Имя", - "description": "Описание", - "tags": "Теги", - "tagsPlaceholder": "Необязательный тег 1, необязательный тег 2", - "preview": "Предварительный просмотр", - "urlType": "URL-адрес", - "customImage": "Пользовательское изображение", - "takeScreenshot": "Сделать снимок экрана", - "useFirstDisplayOutput": "Использовать вывод первого дисплея", - "failedToCaptureOutput": "Не удалось зафиксировать первый выданный результат", - "outputDoesNotExist": "Выданный результат отсутствует для всех ячеек.", - "failedToConvertError": "Не удалось преобразовать {{fileName}} в формат base64", - "failedToUploadError": "Не удалось отправить {{fileName}}" - }, "changePartitionKey": { "failedToStartError": "Не удалось запустить задание передачи данных", "suboptimalPartitionKeyError": "Внимание! Система обнаружила, что в вашей коллекции используется неоптимальный ключ секционирования", diff --git a/src/Localization/sv/Resources.json b/src/Localization/sv/Resources.json index f7a27bff1..3fd978dd0 100644 --- a/src/Localization/sv/Resources.json +++ b/src/Localization/sv/Resources.json @@ -103,7 +103,6 @@ "learningResources": "Utbildningsresurser", "nextSteps": "Nästa steg", "tipsAndLearnMore": "Tips och läs mer", - "notebook": "Anteckningsbok", "needHelp": "Behöver du hjälp?" }, "top3Items": { @@ -664,34 +663,6 @@ "uploadStatus": "{{numSucceeded}} skapades, {{numThrottled}} begränsades, {{numFailed}} fel", "uploadedFiles": "Uppladdade filer" }, - "copyNotebook": { - "copyFailedError": "Det gick inte att kopiera {{name}} till {{destination}}", - "uploadFailedError": "Det gick inte att ladda upp {{name}}", - "location": "Plats", - "locationAriaLabel": "Plats", - "selectLocation": "Välj en plats för anteckningsbok att kopiera", - "name": "Namn" - }, - "publishNotebook": { - "publishFailedError": "Det gick inte att publicera {{notebookName}} till galleriet", - "publishDescription": "När den här anteckningsboken publiceras visas den i det offentliga galleriet för Azure Cosmos DB notebook-filer. Kontrollera att du har tagit bort känsliga data eller utdata innan du publicerar.", - "publishPrompt": "Vill du publicera och dela {{name}} till galleriet?", - "coverImage": "Omslagsbild", - "coverImageUrl": "URL för omslagsbild", - "name": "Namn", - "description": "Beskrivning", - "tags": "Taggar", - "tagsPlaceholder": "Valfri tagg 1, valfri tagg 2", - "preview": "Förhandsversion", - "urlType": "Webbadress", - "customImage": "Anpassad avbildning", - "takeScreenshot": "Ta skärmbild", - "useFirstDisplayOutput": "Använd första visningsutdata", - "failedToCaptureOutput": "Det gick inte att samla in första utdata", - "outputDoesNotExist": "Utdata finns inte för någon av cellerna.", - "failedToConvertError": "Det gick inte att konvertera {{fileName}} till base64-format", - "failedToUploadError": "Det gick inte att ladda upp {{fileName}}" - }, "changePartitionKey": { "failedToStartError": "Det gick inte att starta dataöverföringsjobbet", "suboptimalPartitionKeyError": "Varning! Systemet har upptäckt att din samling kanske använder en suboptimal partitionsnyckel", diff --git a/src/Localization/tr/Resources.json b/src/Localization/tr/Resources.json index 3baa34132..25994ce66 100644 --- a/src/Localization/tr/Resources.json +++ b/src/Localization/tr/Resources.json @@ -103,7 +103,6 @@ "learningResources": "Öğrenme Kaynakları", "nextSteps": "Sonraki adımlar", "tipsAndLearnMore": "İpuçları & daha fazla bilgi edinin", - "notebook": "Not Defteri", "needHelp": "Yardıma mı ihtiyacınız var?" }, "top3Items": { @@ -664,34 +663,6 @@ "uploadStatus": "{{numSucceeded}} oluşturuldu, {{numThrottled}} kısıtlandı, {{numFailed}} hata", "uploadedFiles": "Karşıya yüklenen dosyalar" }, - "copyNotebook": { - "copyFailedError": "{{name}} öğesi {{destination}} hedefine kopyalanamadı", - "uploadFailedError": "{{name}} karşıya yüklenemedi", - "location": "Konum", - "locationAriaLabel": "Konum", - "selectLocation": "Kopyalamak için bir defter konumu seçin", - "name": "Ad" - }, - "publishNotebook": { - "publishFailedError": "{{notebookName}} galeride yayımlanamadı", - "publishDescription": "Yayımlandığında, bu not defteri Azure Cosmos DB not defterleri genel galerisinde görünür. Yayımlamadan önce hassas verileri veya çıktıları kaldırdığınızdan emin olun.", - "publishPrompt": "“{{name}}” öğesini galeride yayımlamak ve paylaşmak istiyor musunuz?", - "coverImage": "Kapak resmi", - "coverImageUrl": "Kapak resmi URL’si", - "name": "Ad", - "description": "Açıklama", - "tags": "Etiketler", - "tagsPlaceholder": "İsteğe bağlı etiket 1, İsteğe bağlı etiket 2", - "preview": "Önizleme", - "urlType": "URL", - "customImage": "Özel Görüntü", - "takeScreenshot": "Ekran Görüntüsü Al", - "useFirstDisplayOutput": "İlk Görüntü Çıkışını Kullan", - "failedToCaptureOutput": "İlk çıkış yakalanamadı", - "outputDoesNotExist": "Hiçbir hücre için çıkış yok.", - "failedToConvertError": "{{fileName}} base64 biçimine dönüştürülemedi", - "failedToUploadError": "{{fileName}} karşıya yüklenemedi" - }, "changePartitionKey": { "failedToStartError": "Veri aktarım işi başlatılamadı", "suboptimalPartitionKeyError": "Uyarı: Sistem, koleksiyonunuzun optimal olmayan bir bölüm anahtarı kullanıyor olabileceğini algıladı", diff --git a/src/Localization/zh-Hans/Resources.json b/src/Localization/zh-Hans/Resources.json index 389e0b179..460f4970e 100644 --- a/src/Localization/zh-Hans/Resources.json +++ b/src/Localization/zh-Hans/Resources.json @@ -103,7 +103,6 @@ "learningResources": "学习资源", "nextSteps": "后续步骤", "tipsAndLearnMore": "提示和详细信息", - "notebook": "笔记本", "needHelp": "需要帮助?" }, "top3Items": { @@ -664,34 +663,6 @@ "uploadStatus": "{{numSucceeded}} 已创建,{{numThrottled}} 受限,{{numFailed}} 个错误", "uploadedFiles": "已上传的文件" }, - "copyNotebook": { - "copyFailedError": "未能将 {{name}} 复制到 {{destination}}", - "uploadFailedError": "未能上传 {{name}}", - "location": "位置", - "locationAriaLabel": "位置", - "selectLocation": "选择要复制的笔记本位置", - "name": "名称" - }, - "publishNotebook": { - "publishFailedError": "未能将 {{notebookName}} 发布到库", - "publishDescription": "发布后,此笔记本将显示在 Azure Cosmos DB 笔记本公共库中。在发布之前,请确保已移除任何敏感数据或输出。", - "publishPrompt": "是否要发布“{{name}}”并共享到库?", - "coverImage": "封面图像", - "coverImageUrl": "封面图像 URL", - "name": "名称", - "description": "说明", - "tags": "标记", - "tagsPlaceholder": "可选标记 1,可选标记 2", - "preview": "预览", - "urlType": "URL", - "customImage": "自定义映像", - "takeScreenshot": "生成屏幕快照", - "useFirstDisplayOutput": "使用第一个显示输出", - "failedToCaptureOutput": "未能捕获第一个输出", - "outputDoesNotExist": "任何单元格都不存在输出。", - "failedToConvertError": "未能将 {{fileName}} 转换为 base64 格式", - "failedToUploadError": "未能上传 {{fileName}}" - }, "changePartitionKey": { "failedToStartError": "未能启动数据传输作业", "suboptimalPartitionKeyError": "警告: 系统检测到集合使用的分区键可能不理想", diff --git a/src/Localization/zh-Hant/Resources.json b/src/Localization/zh-Hant/Resources.json index 2a93a3ffc..37c653c32 100644 --- a/src/Localization/zh-Hant/Resources.json +++ b/src/Localization/zh-Hant/Resources.json @@ -103,7 +103,6 @@ "learningResources": "學習資源", "nextSteps": "後續步驟", "tipsAndLearnMore": "提示與深入了解", - "notebook": "筆記本", "needHelp": "是否需要協助?" }, "top3Items": { @@ -664,34 +663,6 @@ "uploadStatus": "{{numSucceeded}} 個已建立,{{numThrottled}} 個已節流,{{numFailed}} 個錯誤", "uploadedFiles": "上傳的檔案" }, - "copyNotebook": { - "copyFailedError": "無法將 {{name}} 複製到 {{destination}}", - "uploadFailedError": "無法上傳 {{name}}", - "location": "位置", - "locationAriaLabel": "位置", - "selectLocation": "選取要複製的筆記本位置", - "name": "名稱" - }, - "publishNotebook": { - "publishFailedError": "無法將 {{notebookName}} 發佈至資源庫", - "publishDescription": "發佈後,此筆記本會出現在 Azure Cosmos DB 筆記本公用資源庫中。發佈前,請確定已移除任何敏感性資料或輸出。", - "publishPrompt": "您是否要發佈並共用 \"{{name}}\" 至資源庫?", - "coverImage": "封面影像", - "coverImageUrl": "封面影像 URL", - "name": "名稱", - "description": "描述", - "tags": "標籤", - "tagsPlaceholder": "選用標記 1,選用標記 2", - "preview": "預覽", - "urlType": "URL", - "customImage": "自訂映像", - "takeScreenshot": "擷取螢幕擷取畫面", - "useFirstDisplayOutput": "使用第一個顯示輸出", - "failedToCaptureOutput": "無法擷取第一個輸出", - "outputDoesNotExist": "任何儲存格的輸出都不存在。", - "failedToConvertError": "無法將 {{fileName}} 轉換為 base64 格式", - "failedToUploadError": "無法上傳 {{fileName}}" - }, "changePartitionKey": { "failedToStartError": "無法啟動資料傳輸工作", "suboptimalPartitionKeyError": "警告: 系統偵測到您的集合可能在使用次佳的資料分割索引鍵", diff --git a/src/Platform/Hosted/extractFeatures.test.ts b/src/Platform/Hosted/extractFeatures.test.ts index 98fc8ebd7..23764ee31 100644 --- a/src/Platform/Hosted/extractFeatures.test.ts +++ b/src/Platform/Hosted/extractFeatures.test.ts @@ -2,21 +2,18 @@ import { extractFeatures, hasFlag } from "./extractFeatures"; describe("extractFeatures", () => { it("correctly detects feature flags in a case insensitive manner", () => { - const url = "https://localhost:10001/12345/notebook"; - const token = "super secret"; - const notebooksEnabled = false; + const endpoint = "https://localhost:1234"; + const ttlEnabled = false; const params = new URLSearchParams({ platform: "Hosted", - "feature.NOTEBOOKSERVERURL": url, - "feature.NoTeBooKServerToken": token, + "feature.MONGOPROXYENDPOINT": endpoint, "feature.NotAFeature": "nope", - "feature.ENABLEnotebooks": notebooksEnabled.toString(), + "feature.ENABLEttl": ttlEnabled.toString(), }); const features = extractFeatures(params); - expect(features.notebookServerUrl).toBe(url); - expect(features.notebookServerToken).toBe(token); - expect(features.enableNotebooks).toBe(notebooksEnabled); + expect(features.mongoProxyEndpoint).toBe(endpoint); + expect(features.enableTtl).toBe(ttlEnabled); }); }); diff --git a/src/Platform/Hosted/extractFeatures.ts b/src/Platform/Hosted/extractFeatures.ts index d8ccecae0..fb6a4bc45 100644 --- a/src/Platform/Hosted/extractFeatures.ts +++ b/src/Platform/Hosted/extractFeatures.ts @@ -5,10 +5,8 @@ export type Features = { readonly enableChangeFeedPolicy: boolean; readonly enableFixedCollectionWithSharedThroughput: boolean; readonly enableKOPanel: boolean; - readonly enableNotebooks: boolean; readonly enableReactPane: boolean; readonly enableRightPanelV2: boolean; - readonly enableSchema: boolean; readonly enableSDKoperations: boolean; readonly enableSpark: boolean; readonly enableTtl: boolean; @@ -18,12 +16,6 @@ export type Features = { readonly enableKoResourceTree: boolean; readonly enableThroughputBuckets: boolean; readonly hostedDataExplorer: boolean; - readonly junoEndpoint?: string; - readonly phoenixEndpoint?: string; - readonly notebookBasePath?: string; - readonly notebookServerToken?: string; - readonly notebookServerUrl?: string; - readonly sandboxNotebookOutputs: boolean; readonly selfServeType?: string; readonly showMinRUSurvey: boolean; readonly ttl90Days: boolean; @@ -43,9 +35,6 @@ export type Features = { autoscaleDefault: boolean; partitionKeyDefault: boolean; partitionKeyDefault2: boolean; - phoenixNotebooks?: boolean; - phoenixFeatures?: boolean; - notebooksDownBanner: boolean; }; export function extractFeatures(given = new URLSearchParams(window.location.search)): Features { @@ -72,10 +61,8 @@ export function extractFeatures(given = new URLSearchParams(window.location.sear enableChangeFeedPolicy: "true" === get("enablechangefeedpolicy"), enableFixedCollectionWithSharedThroughput: "true" === get("enablefixedcollectionwithsharedthroughput"), enableKOPanel: "true" === get("enablekopanel"), - enableNotebooks: "true" === get("enablenotebooks"), enableReactPane: "true" === get("enablereactpane"), enableRightPanelV2: "true" === get("enablerightpanelv2"), - enableSchema: "true" === get("enableschema"), enableSDKoperations: "true" === get("enablesdkoperations"), enableSpark: "true" === get("enablespark"), enableTtl: "true" === get("enablettl"), @@ -85,19 +72,12 @@ export function extractFeatures(given = new URLSearchParams(window.location.sear hostedDataExplorer: "true" === get("hosteddataexplorerenabled"), mongoProxyEndpoint: get("mongoproxyendpoint"), mongoProxyAPIs: get("mongoproxyapis"), - junoEndpoint: get("junoendpoint"), - phoenixEndpoint: get("phoenixendpoint"), - notebookBasePath: get("notebookbasepath"), - notebookServerToken: get("notebookservertoken"), - notebookServerUrl: get("notebookserverurl"), - sandboxNotebookOutputs: true, selfServeType: get("selfservetype"), showMinRUSurvey: "true" === get("showminrusurvey"), ttl90Days: "true" === get("ttl90days"), autoscaleDefault: "true" === get("autoscaledefault"), partitionKeyDefault: "true" === get("partitionkeytest"), partitionKeyDefault2: "true" === get("pkpartitionkeytest"), - notebooksDownBanner: "true" === get("notebooksDownBanner"), enableThroughputCap: "true" === get("enablethroughputcap"), enableHierarchicalKeys: "true" === get("enablehierarchicalkeys"), enablePriorityBasedExecution: "true" === get("enableprioritybasedexecution"), diff --git a/src/Shared/Telemetry/TelemetryConstants.ts b/src/Shared/Telemetry/TelemetryConstants.ts index 5270b4e24..3ff67b593 100644 --- a/src/Shared/Telemetry/TelemetryConstants.ts +++ b/src/Shared/Telemetry/TelemetryConstants.ts @@ -53,6 +53,7 @@ export enum Action { SubscriptionSwitch, TenantSwitch, DefaultTenantSwitch, + // Deprecated notebook telemetry tombstones. Keep these members to preserve all later numeric values. CreateNotebookWorkspace, NotebookErrorNotification, CreateSparkCluster, @@ -62,6 +63,7 @@ export enum Action { ClusterLibraryManage, ModifyOptionForThroughputWithSharedDatabase, EnableAzureSynapseLink, + // Deprecated notebook and Phoenix telemetry tombstones. CreateNewNotebook, OpenSampleNotebook, ExecuteCell, @@ -93,12 +95,14 @@ export enum Action { OpenCloudShellTerminal, CreateMongoCollectionWithWildcardIndex, ClickCommandBarButton, + // Deprecated notebook telemetry tombstone. RefreshResourceTreeMyNotebooks, ClickResourceTreeNodeContextMenuItem, DiscardSettings, SettingsV2Updated, SettingsV2Discarded, MongoIndexUpdated, + // Deprecated notebook gallery telemetry tombstones. NotebooksGalleryPublish, NotebooksGalleryReportAbuse, NotebooksGalleryClickReportAbuse, @@ -124,6 +128,7 @@ export enum Action { SelfServe, ExpandAddCollectionPaneAdvancedSection, ExpandAddGlobalSecondaryIndexPaneAdvancedSection, + // Deprecated Schema Analyzer telemetry tombstone. SchemaAnalyzerClickAnalyze, SelfServeComponent, LaunchQuickstart, @@ -154,6 +159,7 @@ export enum Action { ReadDatabases, ReadCollections, LoadCollectionsPerDatabase, + // Deprecated notebook and Phoenix telemetry tombstones. RefreshNotebooksEnabled, CheckPhoenixStatus, CheckFeatureRegistration, diff --git a/src/Utils/AuthorizationUtils.test.ts b/src/Utils/AuthorizationUtils.test.ts index fd361ac22..0055d0804 100644 --- a/src/Utils/AuthorizationUtils.test.ts +++ b/src/Utils/AuthorizationUtils.test.ts @@ -24,10 +24,8 @@ describe("AuthorizationUtils", () => { enableChangeFeedPolicy: false, enableFixedCollectionWithSharedThroughput: false, enableKOPanel: false, - enableNotebooks: false, enableReactPane: false, enableRightPanelV2: false, - enableSchema: false, enableSDKoperations: false, enableSpark: false, enableTtl: false, @@ -36,7 +34,6 @@ describe("AuthorizationUtils", () => { enableKoResourceTree: false, enableThroughputBuckets: false, hostedDataExplorer: false, - sandboxNotebookOutputs: true, showMinRUSurvey: false, ttl90Days: false, enableThroughputCap: false, @@ -47,7 +44,6 @@ describe("AuthorizationUtils", () => { autoscaleDefault: false, partitionKeyDefault: false, partitionKeyDefault2: false, - notebooksDownBanner: false, enableRestoreContainer: false, mongoDisableNativeAuth: false, }, diff --git a/src/Utils/EndpointUtils.ts b/src/Utils/EndpointUtils.ts index 9f716fcb2..633e0c7ae 100644 --- a/src/Utils/EndpointUtils.ts +++ b/src/Utils/EndpointUtils.ts @@ -1,4 +1,4 @@ -import { CassandraProxyEndpoints, JunoEndpoints, MongoProxyEndpoints, PortalBackendEndpoints } from "Common/Constants"; +import { CassandraProxyEndpoints, MongoProxyEndpoints, PortalBackendEndpoints } from "Common/Constants"; import * as Logger from "../Common/Logger"; export function validateEndpoint( @@ -89,14 +89,3 @@ export const allowedHostedExplorerEndpoints: ReadonlyArray = [ ]; export const allowedMsalRedirectEndpoints: ReadonlyArray = ["https://dataexplorer-preview.azurewebsites.net/"]; - -export const allowedJunoOrigins: ReadonlyArray = [ - JunoEndpoints.Test, - JunoEndpoints.Test2, - JunoEndpoints.Test3, - JunoEndpoints.Prod, - JunoEndpoints.Stage, - "https://localhost", -]; - -export const allowedNotebookServerUrls: ReadonlyArray = []; diff --git a/src/Utils/arm/generatedClients/cosmosNotebooks/notebookWorkspaces.ts b/src/Utils/arm/generatedClients/cosmosNotebooks/notebookWorkspaces.ts deleted file mode 100644 index 68ab5a2b2..000000000 --- a/src/Utils/arm/generatedClients/cosmosNotebooks/notebookWorkspaces.ts +++ /dev/null @@ -1,88 +0,0 @@ -/* - AUTOGENERATED FILE - Run "npm run generateARMClients" to regenerate - Edting this file directly should be done with extreme caution as not to diverge from ARM REST specs - - Generated from: https://raw.githubusercontent.com/Azure/azure-rest-api-specs/master/specification/cosmos-db/resource-manager/Microsoft.DocumentDB/stable/2021-04-15/notebook.json -*/ - -import { configContext } from "../../../../ConfigContext"; -import { armRequest } from "../../request"; -import * as Types from "./types"; -const apiVersion = "2021-04-15"; - -/* Gets the notebook workspace resources of an existing Cosmos DB account. */ -export async function listByDatabaseAccount( - subscriptionId: string, - resourceGroupName: string, - accountName: string, -): Promise { - const path = `/subscriptions/${subscriptionId}/resourceGroups/${resourceGroupName}/providers/Microsoft.DocumentDB/databaseAccounts/${accountName}/notebookWorkspaces`; - return armRequest({ host: configContext.ARM_ENDPOINT, path, method: "GET", apiVersion }); -} - -/* Gets the notebook workspace for a Cosmos DB account. */ -export async function get( - subscriptionId: string, - resourceGroupName: string, - accountName: string, - notebookWorkspaceName: string, -): Promise { - const path = `/subscriptions/${subscriptionId}/resourceGroups/${resourceGroupName}/providers/Microsoft.DocumentDB/databaseAccounts/${accountName}/notebookWorkspaces/${notebookWorkspaceName}`; - return armRequest({ host: configContext.ARM_ENDPOINT, path, method: "GET", apiVersion }); -} - -/* Creates the notebook workspace for a Cosmos DB account. */ -export async function createOrUpdate( - subscriptionId: string, - resourceGroupName: string, - accountName: string, - notebookWorkspaceName: string, -): Promise { - const path = `/subscriptions/${subscriptionId}/resourceGroups/${resourceGroupName}/providers/Microsoft.DocumentDB/databaseAccounts/${accountName}/notebookWorkspaces/${notebookWorkspaceName}`; - return armRequest({ host: configContext.ARM_ENDPOINT, path, method: "PUT", apiVersion, body: {} }); -} - -/* Deletes the notebook workspace for a Cosmos DB account. */ -export async function destroy( - subscriptionId: string, - resourceGroupName: string, - accountName: string, - notebookWorkspaceName: string, -): Promise { - const path = `/subscriptions/${subscriptionId}/resourceGroups/${resourceGroupName}/providers/Microsoft.DocumentDB/databaseAccounts/${accountName}/notebookWorkspaces/${notebookWorkspaceName}`; - return armRequest({ host: configContext.ARM_ENDPOINT, path, method: "DELETE", apiVersion }); -} - -/* Retrieves the connection info for the notebook workspace */ -export async function listConnectionInfo( - subscriptionId: string, - resourceGroupName: string, - accountName: string, - notebookWorkspaceName: string, -): Promise { - const path = `/subscriptions/${subscriptionId}/resourceGroups/${resourceGroupName}/providers/Microsoft.DocumentDB/databaseAccounts/${accountName}/notebookWorkspaces/${notebookWorkspaceName}/listConnectionInfo`; - return armRequest({ host: configContext.ARM_ENDPOINT, path, method: "POST", apiVersion }); -} - -/* Regenerates the auth token for the notebook workspace */ -export async function regenerateAuthToken( - subscriptionId: string, - resourceGroupName: string, - accountName: string, - notebookWorkspaceName: string, -): Promise { - const path = `/subscriptions/${subscriptionId}/resourceGroups/${resourceGroupName}/providers/Microsoft.DocumentDB/databaseAccounts/${accountName}/notebookWorkspaces/${notebookWorkspaceName}/regenerateAuthToken`; - return armRequest({ host: configContext.ARM_ENDPOINT, path, method: "POST", apiVersion }); -} - -/* Starts the notebook workspace */ -export async function start( - subscriptionId: string, - resourceGroupName: string, - accountName: string, - notebookWorkspaceName: string, -): Promise { - const path = `/subscriptions/${subscriptionId}/resourceGroups/${resourceGroupName}/providers/Microsoft.DocumentDB/databaseAccounts/${accountName}/notebookWorkspaces/${notebookWorkspaceName}/start`; - return armRequest({ host: configContext.ARM_ENDPOINT, path, method: "POST", apiVersion }); -} diff --git a/src/Utils/arm/generatedClients/cosmosNotebooks/types.ts b/src/Utils/arm/generatedClients/cosmosNotebooks/types.ts deleted file mode 100644 index 9704f399a..000000000 --- a/src/Utils/arm/generatedClients/cosmosNotebooks/types.ts +++ /dev/null @@ -1,40 +0,0 @@ -/* - AUTOGENERATED FILE - Run "npm run generateARMClients" to regenerate - Edting this file directly should be done with extreme caution as not to diverge from ARM REST specs - - Generated from: https://raw.githubusercontent.com/Azure/azure-rest-api-specs/master/specification/cosmos-db/resource-manager/Microsoft.DocumentDB/stable/2021-04-15/notebook.json -*/ - -import { ARMResourceProperties } from "../cosmos/types"; - -/* Parameters to create a notebook workspace resource */ -export type NotebookWorkspaceCreateUpdateParameters = unknown; - -/* A list of notebook workspace resources */ -export interface NotebookWorkspaceListResult { - /* Array of notebook workspace resources */ - value?: NotebookWorkspace[]; -} - -/* A notebook workspace resource */ -export type NotebookWorkspace = ARMResourceProperties & { - /* Resource properties. */ - properties?: NotebookWorkspaceProperties; -}; - -/* Properties of a notebook workspace resource. */ -export interface NotebookWorkspaceProperties { - /* Specifies the endpoint of Notebook server. */ - readonly notebookServerEndpoint?: string; - /* Status of the notebook workspace. Possible values are: Creating, Online, Deleting, Failed, Updating. */ - readonly status?: string; -} - -/* The connection info for the given notebook workspace */ -export interface NotebookWorkspaceConnectionInfoResult { - /* Specifies auth token used for connecting to Notebook server (uses token-based auth). */ - readonly authToken?: string; - /* Specifies the endpoint of Notebook server. */ - readonly notebookServerEndpoint?: string; -}