import "./workspaces.scss"; import React, { Fragment } from "react"; import { observer } from "mobx-react"; import { computed, observable, toJS } from "mobx"; import { t, Trans } from "@lingui/macro"; import { WizardLayout } from "../layout/wizard-layout"; import { Workspace, WorkspaceId, workspaceStore } from "../../../common/workspace-store"; import { v4 as uuid } from "uuid"; import { _i18n } from "../../i18n"; import { ConfirmDialog } from "../confirm-dialog"; import { Icon } from "../icon"; import { Input } from "../input"; import { cssNames, prevDefault } from "../../utils"; import { Button } from "../button"; import { isRequired, InputValidator } from "../input/input_validators"; import { clusterStore } from "../../../common/cluster-store"; @observer export class Workspaces extends React.Component { @observable editingWorkspaces = observable.map(); @computed get workspaces(): Workspace[] { const currentWorkspaces: Map = new Map(); workspaceStore.workspacesList.forEach((w) => { currentWorkspaces.set(w.id, w); }); const allWorkspaces = new Map([ ...currentWorkspaces, ...this.editingWorkspaces, ]); return Array.from(allWorkspaces.values()); } renderInfo() { return (

What is a Workspace?

Workspaces are used to organize number of clusters into logical groups.

A single workspaces contains a list of clusters and their full configuration.

); } saveWorkspace = (id: WorkspaceId) => { const workspace = new Workspace(this.editingWorkspaces.get(id)); if (workspaceStore.getById(id)) { workspaceStore.updateWorkspace(workspace); this.clearEditing(id); return; } if (workspaceStore.addWorkspace(workspace)) { this.clearEditing(id); } }; addWorkspace = () => { const workspaceId = uuid(); this.editingWorkspaces.set(workspaceId, new Workspace({ id: workspaceId, name: "", description: "" })); }; editWorkspace = (id: WorkspaceId) => { const workspace = workspaceStore.getById(id); this.editingWorkspaces.set(id, toJS(workspace)); }; activateWorkspace = (id: WorkspaceId) => { const clusterId = workspaceStore.getById(id).lastActiveClusterId; workspaceStore.setActive(id); clusterStore.setActive(clusterId); }; clearEditing = (id: WorkspaceId) => { this.editingWorkspaces.delete(id); }; removeWorkspace = (id: WorkspaceId) => { const workspace = workspaceStore.getById(id); ConfirmDialog.open({ okButtonProps: { label: _i18n._(t`Remove Workspace`), primary: false, accent: true, }, ok: () => { this.clearEditing(id); workspaceStore.removeWorkspace(workspace); }, message: (

Are you sure you want remove workspace {workspace.name}?

All clusters within workspace will be cleared as well

), }); }; onInputKeypress = (evt: React.KeyboardEvent, workspaceId: WorkspaceId) => { if (evt.key == "Enter") { // Trigget input validation evt.currentTarget.blur(); evt.currentTarget.focus(); this.saveWorkspace(workspaceId); } }; render() { return (

Workspaces

{this.workspaces.map(({ id: workspaceId, name, description, ownerRef }) => { const isActive = workspaceStore.currentWorkspaceId === workspaceId; const isDefault = workspaceStore.isDefault(workspaceId); const isEditing = this.editingWorkspaces.has(workspaceId); const editingWorkspace = this.editingWorkspaces.get(workspaceId); const managed = !!ownerRef; const className = cssNames("workspace flex gaps align-center", { active: isActive, editing: isEditing, default: isDefault, }); const existenceValidator: InputValidator = { message: () => `Workspace '${name}' already exists`, validate: value => !workspaceStore.getByName(value.trim()) }; return (
{!isEditing && ( this.activateWorkspace(workspaceId))}>{name} {isActive && (current)} {description} {!isDefault && !managed && ( Edit} onClick={() => this.editWorkspace(workspaceId)} /> Delete} onClick={() => this.removeWorkspace(workspaceId)} /> )} )} {isEditing && ( editingWorkspace.name = v} onKeyPress={(e) => this.onInputKeypress(e, workspaceId)} validators={[isRequired, existenceValidator]} autoFocus /> editingWorkspace.description = v} onKeyPress={(e) => this.onInputKeypress(e, workspaceId)} /> Save} onClick={() => this.saveWorkspace(workspaceId)} /> Cancel} onClick={() => this.clearEditing(workspaceId)} /> )}
); })}