diff --git a/src/common/workspace-store.ts b/src/common/workspace-store.ts index eec8e8b7e2..752a53f41b 100644 --- a/src/common/workspace-store.ts +++ b/src/common/workspace-store.ts @@ -71,20 +71,17 @@ export class WorkspaceStore extends BaseStore { } @action - saveWorkspace(workspace: Workspace): { workspace?: Workspace, error?: string} { + saveWorkspace(workspace: Workspace) { const { id, name } = workspace; const existingWorkspace = this.getById(id); - if (!name) { - return { error: "Workspace should has a name." }; - } - if (this.getByName(name)) { - return { error: `Workspace '${name}' already exist.` }; + if (!name.trim() || this.getByName(name.trim())) { + return; } if (existingWorkspace) { - return { workspace: Object.assign(existingWorkspace, workspace) }; + Object.assign(existingWorkspace, workspace); } this.workspaces.set(id, workspace); - return { workspace }; + return workspace; } @action diff --git a/src/common/workspace-store_test.ts b/src/common/workspace-store_test.ts index b80d22c148..232f0b013a 100644 --- a/src/common/workspace-store_test.ts +++ b/src/common/workspace-store_test.ts @@ -93,7 +93,7 @@ describe("workspace store tests", () => { expect(ws.workspaces.size).toBe(2); }) - it("cannot create namespace with existent name", () => { + it("cannot create workspace with existent name", () => { const ws = WorkspaceStore.getInstance(); ws.saveWorkspace({ @@ -104,7 +104,7 @@ describe("workspace store tests", () => { expect(ws.workspacesList.length).toBe(1); // default workspace only }) - it("cannot create namespace with empty name", () => { + it("cannot create workspace with empty name", () => { const ws = WorkspaceStore.getInstance(); ws.saveWorkspace({ @@ -114,6 +114,28 @@ describe("workspace store tests", () => { expect(ws.workspacesList.length).toBe(1); // default workspace only }) + + it("cannot create workspace with ' ' name", () => { + const ws = WorkspaceStore.getInstance(); + + ws.saveWorkspace({ + id: "random", + name: " ", + }); + + expect(ws.workspacesList.length).toBe(1); // default workspace only + }) + + it("trim workspace name", () => { + const ws = WorkspaceStore.getInstance(); + + ws.saveWorkspace({ + id: "random", + name: "default ", + }); + + expect(ws.workspacesList.length).toBe(1); // default workspace only + }) }) describe("for a non-empty config", () => { diff --git a/src/renderer/components/+workspaces/workspaces.tsx b/src/renderer/components/+workspaces/workspaces.tsx index 8efa4a1306..a2e7dbf74f 100644 --- a/src/renderer/components/+workspaces/workspaces.tsx +++ b/src/renderer/components/+workspaces/workspaces.tsx @@ -12,7 +12,7 @@ import { Icon } from "../icon"; import { Input } from "../input"; import { cssNames, prevDefault } from "../../utils"; import { Button } from "../button"; -import { Notifications } from "../notifications"; +import { isRequired, Validator } from "../input/input.validators"; @observer export class Workspaces extends React.Component { @@ -42,12 +42,10 @@ export class Workspaces extends React.Component { saveWorkspace = (id: WorkspaceId) => { const draft = toJS(this.editingWorkspaces.get(id)); - const { error } = workspaceStore.saveWorkspace(draft); - if (!error) { + const workspace = workspaceStore.saveWorkspace(draft); + if (workspace) { this.clearEditing(id); - return; } - Notifications.error(error); } addWorkspace = () => { @@ -95,6 +93,9 @@ export class Workspaces extends React.Component { onInputKeypress = (evt: React.KeyboardEvent, workspaceId: WorkspaceId) => { if (evt.key == 'Enter') { + // Trigget input validation + evt.currentTarget.blur(); + evt.currentTarget.focus(); this.saveWorkspace(workspaceId); } } @@ -111,11 +112,15 @@ export class Workspaces extends React.Component { const isDefault = workspaceStore.isDefault(workspaceId); const isEditing = this.editingWorkspaces.has(workspaceId); const editingWorkspace = this.editingWorkspaces.get(workspaceId); - const className = cssNames("workspace flex gaps align-center", { + 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 && ( @@ -149,6 +154,7 @@ export class Workspaces extends React.Component { value={editingWorkspace.name} onChange={v => editingWorkspace.name = v} onKeyPress={(e) => this.onInputKeypress(e, workspaceId)} + validators={[isRequired, existenceValidator]} autoFocus />