diff --git a/src/Explorer/Quickstart/QuickstartGuide.tsx b/src/Explorer/Quickstart/QuickstartGuide.tsx index 9df39de0f..48a7a9a79 100644 --- a/src/Explorer/Quickstart/QuickstartGuide.tsx +++ b/src/Explorer/Quickstart/QuickstartGuide.tsx @@ -96,12 +96,18 @@ export const QuickstartGuide: React.FC = (): JSX.Element => { Quick start guide {currentStep < 5 && ( - + setCurrentStep(Object.values(GuideSteps).indexOf(item.props.itemKey))} + > customPivotHeaderRenderer(props, defaultRenderer, 0)} itemKey={GuideSteps[0]} - onClick={() => setCurrentStep(0)} + onClick={() => { + setCurrentStep(0); + }} > diff --git a/src/Explorer/Tabs/QuickstartTab.tsx b/src/Explorer/Tabs/QuickstartTab.tsx index 5a3aac58c..b077c8273 100644 --- a/src/Explorer/Tabs/QuickstartTab.tsx +++ b/src/Explorer/Tabs/QuickstartTab.tsx @@ -1,4 +1,4 @@ -import { Spinner, SpinnerSize, Stack } from "@fluentui/react"; +import { Spinner, SpinnerSize, Stack, Text } from "@fluentui/react"; import { configContext } from "ConfigContext"; import { NotebookWorkspaceConnectionInfo, PostgresFirewallRule } from "Contracts/DataModels"; import { NotebookTerminalComponent } from "Explorer/Controls/Notebook/NotebookTerminalComponent"; @@ -69,7 +69,15 @@ export const QuickstartTab: React.FC = ({ explorer }: Quicks /> )} {isAllPublicIPAddressEnabled && !notebookServerInfo?.notebookServerEndpoint && ( - + + + Connecting to the PostgreSQL shell. + + + If the cluster was just created, this could take up to a minute. + + + )} diff --git a/src/Phoenix/PhoenixClient.ts b/src/Phoenix/PhoenixClient.ts index aea03f8aa..ddc4d563a 100644 --- a/src/Phoenix/PhoenixClient.ts +++ b/src/Phoenix/PhoenixClient.ts @@ -45,7 +45,11 @@ export class PhoenixClient { } public async allocateContainer(provisionData: IProvisionData): Promise> { - return this.executeContainerAssignmentOperation(provisionData, "allocate"); + return promiseRetry(() => this.executeContainerAssignmentOperation(provisionData, "allocate"), { + retries: 4, + maxTimeout: 20000, + minTimeout: 20000, + }); } public async resetContainer(provisionData: IProvisionData): Promise> { @@ -80,9 +84,12 @@ export class PhoenixClient { } const phoenixError = responseJson as IPhoenixError; if (response.status === HttpStatusCodes.Forbidden) { - throw new Error(this.ConvertToForbiddenErrorString(phoenixError)); + if (phoenixError.message === "Sequence contains no elements") { + throw Error("Phoenix container allocation failed, please try again later."); + } + throw new AbortError(this.ConvertToForbiddenErrorString(phoenixError)); } - throw new Error(phoenixError.message); + throw new AbortError(phoenixError.message); } catch (error) { error.status = response?.status; throw error; diff --git a/src/Terminal/JupyterLabAppFactory.ts b/src/Terminal/JupyterLabAppFactory.ts index 6d85c9e7b..f6698d58d 100644 --- a/src/Terminal/JupyterLabAppFactory.ts +++ b/src/Terminal/JupyterLabAppFactory.ts @@ -81,6 +81,9 @@ export class JupyterLabAppFactory { // Attach the widget to the dom. Widget.attach(panel, document.body); + // Switch focus to the terminal + term.activate(); + // Handle resize events. window.addEventListener("resize", () => { panel.update();