diff --git a/workspaces/frontend/src/app/pages/Workspaces/WorkspaceConnectAction.tsx b/workspaces/frontend/src/app/pages/Workspaces/WorkspaceConnectAction.tsx new file mode 100644 index 00000000..9240a7d4 --- /dev/null +++ b/workspaces/frontend/src/app/pages/Workspaces/WorkspaceConnectAction.tsx @@ -0,0 +1,78 @@ +import React from 'react'; +import { + Dropdown, + DropdownItem, + DropdownList, + MenuToggle, + MenuToggleElement, + MenuToggleAction, +} from '@patternfly/react-core'; +import { Workspace, WorkspaceState } from '~/shared/types'; + +type WorkspaceConnectActionProps = { + workspace: Workspace; +}; + +export const WorkspaceConnectAction: React.FunctionComponent = ({ + workspace, +}) => { + const [open, setIsOpen] = React.useState(false); + + const onToggleClick = () => { + setIsOpen(!open); + }; + + const onSelect = ( + _event: React.MouseEvent | undefined, + value: string | number | undefined, + ) => { + setIsOpen(false); + if (typeof value === 'string') { + openEndpoint(value); + } + }; + + const onClickConnect = () => { + openEndpoint(workspace.podTemplate.endpoints[0].port); + }; + + const openEndpoint = (port: string) => { + window.open(`workspace/${workspace.namespace}/${workspace.name}/${port}`, '_blank'); + }; + + return ( + setIsOpen(isOpen)} + toggle={(toggleRef: React.Ref) => ( + + Connect + , + ]} + /> + )} + ouiaId="BasicDropdown" + shouldFocusToggleOnSelect + > + + {workspace.podTemplate.endpoints.map((endpoint) => ( + + {endpoint.displayName} + + ))} + + + ); +}; diff --git a/workspaces/frontend/src/app/pages/Workspaces/Workspaces.tsx b/workspaces/frontend/src/app/pages/Workspaces/Workspaces.tsx index fbf54b8d..f1d20e14 100644 --- a/workspaces/frontend/src/app/pages/Workspaces/Workspaces.tsx +++ b/workspaces/frontend/src/app/pages/Workspaces/Workspaces.tsx @@ -33,6 +33,7 @@ import { ExpandedWorkspaceRow } from '~/app/pages/Workspaces/ExpandedWorkspaceRo import DeleteModal from '~/shared/components/DeleteModal'; import { buildKindLogoDictionary } from '~/app/actions/WorkspaceKindsActions'; import useWorkspaceKinds from '~/app/hooks/useWorkspaceKinds'; +import { WorkspaceConnectAction } from '~/app/pages/Workspaces/WorkspaceConnectAction'; import Filter, { FilteredColumn } from 'shared/components/Filter'; import { formatRam } from 'shared/utilities/WorkspaceResources'; @@ -67,6 +68,12 @@ export const Workspaces: React.FunctionComponent = () => { }, ], }, + endpoints: [ + { + displayName: 'JupyterLab', + port: '7777', + }, + ], }, options: { imageConfig: 'jupyterlab_scipy_180', @@ -112,6 +119,16 @@ export const Workspaces: React.FunctionComponent = () => { }, ], }, + endpoints: [ + { + displayName: 'JupyterLab', + port: '8888', + }, + { + displayName: 'Spark Master', + port: '9999', + }, + ], }, options: { imageConfig: 'jupyterlab_scipy_180', @@ -461,6 +478,9 @@ export const Workspaces: React.FunctionComponent = () => { 1 hour ago + + + ({ diff --git a/workspaces/frontend/src/shared/types.ts b/workspaces/frontend/src/shared/types.ts index d7857ced..af2f8124 100644 --- a/workspaces/frontend/src/shared/types.ts +++ b/workspaces/frontend/src/shared/types.ts @@ -116,6 +116,10 @@ export interface Workspace { readOnly: boolean; }[]; }; + endpoints: { + displayName: string; + port: string; + }[]; }; options: { imageConfig: string;