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, Validator } from "../input/input.validators"; @observer export class Workspaces extends React.Component { @observable editingWorkspaces = observable.map(); @computed get workspaces(): Workspace[] { const allWorkspaces = new Map([ ...workspaceStore.workspaces, ...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 draft = toJS(this.editingWorkspaces.get(id)); const workspace = workspaceStore.saveWorkspace(draft); if (workspace) { this.clearEditing(id); } } addWorkspace = () => { const workspaceId = uuid(); this.editingWorkspaces.set(workspaceId, { id: workspaceId, name: "", description: "", }) } editWorkspace = (id: WorkspaceId) => { const workspace = workspaceStore.getById(id); this.editingWorkspaces.set(id, toJS(workspace)); } 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(id); }, 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 }) => { const isActive = workspaceStore.currentWorkspaceId === workspaceId; const isDefault = workspaceStore.isDefault(workspaceId); const isEditing = this.editingWorkspaces.has(workspaceId); const editingWorkspace = this.editingWorkspaces.get(workspaceId); const className = cssNames("workspace flex gaps", { active: isActive, editing: isEditing, default: isDefault, }); const existenceValidator: Validator = { message: () => `Workspace '${name}' already exists`, validate: value => !workspaceStore.getByName(value.trim()) } return (
{!isEditing && ( workspaceStore.setActive(workspaceId))}>{name} {isActive && (current)} {description} {!isDefault && ( 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)} /> )}
) })}