diff --git a/src/common/workspace-store.ts b/src/common/workspace-store.ts index 752a53f41b..5aeb40eba8 100644 --- a/src/common/workspace-store.ts +++ b/src/common/workspace-store.ts @@ -3,8 +3,10 @@ import { BaseStore } from "./base-store"; import { clusterStore } from "./cluster-store" import { landingURL } from "../renderer/components/+landing-page/landing-page.route"; import { navigate } from "../renderer/navigation"; +import { clusterViewURL } from "../renderer/components/cluster-manager/cluster-view.route"; export type WorkspaceId = string; +export type ClusterId = string; export interface WorkspaceStoreModel { currentWorkspace?: WorkspaceId; @@ -15,6 +17,7 @@ export interface Workspace { id: WorkspaceId; name: string; description?: string; + lastActiveClusterId?: ClusterId; } export class WorkspaceStore extends BaseStore { @@ -31,7 +34,8 @@ export class WorkspaceStore extends BaseStore { @observable workspaces = observable.map({ [WorkspaceStore.defaultId]: { id: WorkspaceStore.defaultId, - name: "default" + name: "default", + lastActiveClusterId: "" } }); @@ -55,18 +59,36 @@ export class WorkspaceStore extends BaseStore { return this.workspacesList.find(workspace => workspace.name === name); } + @action + setLastActiveClusterId(id: WorkspaceId, clusterId: ClusterId) { + if (clusterId != null) { + this.getById(id).lastActiveClusterId = clusterId; + } + } + @action setActive(id = WorkspaceStore.defaultId, { redirectToLanding = true, resetActiveCluster = true } = {}) { + this.setLastActiveClusterId(this.currentWorkspaceId, clusterStore.activeClusterId) + if (id === this.currentWorkspaceId) return; - if (!this.getById(id)) { + const workspaceToUse = this.getById(id); + + if (!workspaceToUse) { throw new Error(`workspace ${id} doesn't exist`); } - this.currentWorkspaceId = id; + + this.currentWorkspaceId = workspaceToUse.id; + const clusterId = workspaceToUse.lastActiveClusterId; if (resetActiveCluster) { - clusterStore.setActive(null) - } - if (redirectToLanding) { - navigate(landingURL()) + if (clusterId) { + clusterStore.setActive(clusterId) + navigate(clusterViewURL({ params: { clusterId } })); + } else { + clusterStore.setActive(null) + if (redirectToLanding) { + navigate(landingURL()) + } + } } } diff --git a/src/renderer/components/+add-cluster/add-cluster.tsx b/src/renderer/components/+add-cluster/add-cluster.tsx index a0414541d8..90a5372c8d 100644 --- a/src/renderer/components/+add-cluster/add-cluster.tsx +++ b/src/renderer/components/+add-cluster/add-cluster.tsx @@ -146,7 +146,9 @@ export class AddCluster extends React.Component { clusterStore.addCluster(...newClusters); if (newClusters.length === 1) { const clusterId = newClusters[0].id; + const wsId = workspaceStore.currentWorkspace.id; clusterStore.setActive(clusterId); + workspaceStore.setLastActiveClusterId(wsId, clusterStore.activeClusterId); navigate(clusterViewURL({ params: { clusterId } })); } else { Notifications.ok( diff --git a/src/renderer/components/+workspaces/workspace-menu.tsx b/src/renderer/components/+workspaces/workspace-menu.tsx index bcf9c3a74d..7b2406a5bb 100644 --- a/src/renderer/components/+workspaces/workspace-menu.tsx +++ b/src/renderer/components/+workspaces/workspace-menu.tsx @@ -7,8 +7,9 @@ import { Trans } from "@lingui/macro"; import { Menu, MenuItem, MenuProps } from "../menu"; import { Icon } from "../icon"; import { observable } from "mobx"; -import { workspaceStore } from "../../../common/workspace-store"; +import { workspaceStore, WorkspaceId } from "../../../common/workspace-store"; import { cssNames } from "../../utils"; +import { clusterStore } from "../../../common/cluster-store"; interface Props extends Partial { } @@ -17,6 +18,13 @@ interface Props extends Partial { export class WorkspaceMenu extends React.Component { @observable menuVisible = false; + activateWorkspace = (id: WorkspaceId) => { + if (clusterStore.activeClusterId) { + workspaceStore.setLastActiveClusterId(workspaceStore.currentWorkspace.id, clusterStore.activeClusterId); + } + workspaceStore.setActive(id); + } + render() { const { className, ...menuProps } = this.props; const { workspacesList, currentWorkspace } = workspaceStore; @@ -38,7 +46,7 @@ export class WorkspaceMenu extends React.Component { key={workspaceId} title={description} active={workspaceId === currentWorkspace.id} - onClick={() => workspaceStore.setActive(workspaceId)} + onClick={() => this.activateWorkspace(workspaceId)} > {name} diff --git a/src/renderer/components/+workspaces/workspaces.tsx b/src/renderer/components/+workspaces/workspaces.tsx index 3cd5e71f82..8500550555 100644 --- a/src/renderer/components/+workspaces/workspaces.tsx +++ b/src/renderer/components/+workspaces/workspaces.tsx @@ -54,6 +54,7 @@ export class Workspaces extends React.Component { id: workspaceId, name: "", description: "", + lastActiveClusterId: "" }) } diff --git a/src/renderer/components/cluster-manager/clusters-menu.tsx b/src/renderer/components/cluster-manager/clusters-menu.tsx index 323c28dd18..1f15ccb0e2 100644 --- a/src/renderer/components/cluster-manager/clusters-menu.tsx +++ b/src/renderer/components/cluster-manager/clusters-menu.tsx @@ -29,6 +29,10 @@ interface Props { @observer export class ClustersMenu extends React.Component { showCluster = (clusterId: ClusterId) => { + const wsId = workspaceStore.currentWorkspace.id; + if(clusterId) { + workspaceStore.setLastActiveClusterId(wsId, clusterId); + } clusterStore.setActive(clusterId); navigate(clusterViewURL({ params: { clusterId } })); } @@ -57,7 +61,12 @@ export class ClustersMenu extends React.Component { menu.append(new MenuItem({ label: _i18n._(t`Disconnect`), click: async () => { + const wsId = workspaceStore.currentWorkspace.id; + const wsLastActiveClusterId = workspaceStore.currentWorkspace.lastActiveClusterId if (clusterStore.isActive(cluster.id)) { + if (wsLastActiveClusterId === cluster.id) { + workspaceStore.setLastActiveClusterId(wsId, ""); + } navigate(landingURL()); clusterStore.setActive(null); } @@ -75,6 +84,12 @@ export class ClustersMenu extends React.Component { label: _i18n._(t`Remove`), }, ok: () => { + const wsId = workspaceStore.currentWorkspace.id; + const wsLastActiveClusterId = workspaceStore.currentWorkspace.lastActiveClusterId + + if (wsLastActiveClusterId === cluster.id) { + workspaceStore.setLastActiveClusterId(wsId, ""); + } if (clusterStore.activeClusterId === cluster.id) { navigate(landingURL()); }