From ab6cfb02188e201b8667184a4ba3697ffafb37d1 Mon Sep 17 00:00:00 2001 From: Thorsten Sommer Date: Fri, 5 Jun 2026 11:05:25 +0200 Subject: [PATCH] Refactor workspace creation logic and update UI for new workspace functionality --- .../Assistants/I18N/allTexts.lua | 6 +-- .../Components/Workspaces.razor.cs | 3 +- .../Dialogs/WorkspaceSelectionDialog.razor | 46 +++++++++++-------- .../Dialogs/WorkspaceSelectionDialog.razor.cs | 18 ++++++-- .../plugin.lua | 6 +-- .../plugin.lua | 6 +-- .../Tools/WorkspaceBehaviour.cs | 10 ++-- 7 files changed, 57 insertions(+), 38 deletions(-) diff --git a/app/MindWork AI Studio/Assistants/I18N/allTexts.lua b/app/MindWork AI Studio/Assistants/I18N/allTexts.lua index 6bc9e4df..6d2a30e1 100644 --- a/app/MindWork AI Studio/Assistants/I18N/allTexts.lua +++ b/app/MindWork AI Studio/Assistants/I18N/allTexts.lua @@ -5797,6 +5797,9 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::UPDATEDIALOG::T25417398"] = "Update from v{0 -- Install later UI_TEXT_CONTENT["AISTUDIO::DIALOGS::UPDATEDIALOG::T2936430090"] = "Install later" +-- Create new workspace +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::WORKSPACESELECTIONDIALOG::T1541251414"] = "Create new workspace" + -- Add workspace UI_TEXT_CONTENT["AISTUDIO::DIALOGS::WORKSPACESELECTIONDIALOG::T1586005241"] = "Add workspace" @@ -5809,9 +5812,6 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::WORKSPACESELECTIONDIALOG::T3249036008"] = "T -- Please enter a workspace name. UI_TEXT_CONTENT["AISTUDIO::DIALOGS::WORKSPACESELECTIONDIALOG::T3288132732"] = "Please enter a workspace name." --- Create a new workspace -UI_TEXT_CONTENT["AISTUDIO::DIALOGS::WORKSPACESELECTIONDIALOG::T591103325"] = "Create a new workspace" - -- Cancel UI_TEXT_CONTENT["AISTUDIO::DIALOGS::WORKSPACESELECTIONDIALOG::T900713019"] = "Cancel" diff --git a/app/MindWork AI Studio/Components/Workspaces.razor.cs b/app/MindWork AI Studio/Components/Workspaces.razor.cs index c7bd7e35..49b99b2d 100644 --- a/app/MindWork AI Studio/Components/Workspaces.razor.cs +++ b/app/MindWork AI Studio/Components/Workspaces.razor.cs @@ -775,7 +775,8 @@ public partial class Workspaces : MSGComponentBase return; var workspaceName = (dialogResult.Data as string)!; - if (await WorkspaceBehaviour.CreateWorkspaceAsync(workspaceName) is null) + var result = await WorkspaceBehaviour.TryCreateWorkspaceAsync(workspaceName); + if (!result.Success) return; await this.LoadTreeItemsAsync(startPrefetch: false); diff --git a/app/MindWork AI Studio/Dialogs/WorkspaceSelectionDialog.razor b/app/MindWork AI Studio/Dialogs/WorkspaceSelectionDialog.razor index 9d4be74d..736305c9 100644 --- a/app/MindWork AI Studio/Dialogs/WorkspaceSelectionDialog.razor +++ b/app/MindWork AI Studio/Dialogs/WorkspaceSelectionDialog.razor @@ -11,26 +11,32 @@ } - - @T("Create a new workspace") - - - - - - - - - + @if (this.showCreateWorkspaceForm) + { + + + + + + + + + } + else + { + + @T("Create new workspace") + + } diff --git a/app/MindWork AI Studio/Dialogs/WorkspaceSelectionDialog.razor.cs b/app/MindWork AI Studio/Dialogs/WorkspaceSelectionDialog.razor.cs index b6edb43f..54de7c21 100644 --- a/app/MindWork AI Studio/Dialogs/WorkspaceSelectionDialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/WorkspaceSelectionDialog.razor.cs @@ -26,6 +26,7 @@ public partial class WorkspaceSelectionDialog : MSGComponentBase private Guid selectedWorkspace; private string newWorkspaceName = string.Empty; private bool isCreatingWorkspace; + private bool showCreateWorkspaceForm; private string? createWorkspaceError; private string? createWorkspaceErrorName; @@ -79,6 +80,14 @@ public partial class WorkspaceSelectionDialog : MSGComponentBase await this.CreateWorkspaceAsync(); } + private void ShowCreateWorkspaceForm() + { + this.createWorkspaceError = null; + this.createWorkspaceErrorName = null; + this.newWorkspaceName = string.Empty; + this.showCreateWorkspaceForm = true; + } + private async Task CreateWorkspaceAsync() { this.createWorkspaceError = null; @@ -90,8 +99,8 @@ public partial class WorkspaceSelectionDialog : MSGComponentBase this.isCreatingWorkspace = true; try { - var workspace = await WorkspaceBehaviour.CreateWorkspaceAsync(this.newWorkspaceName); - if (workspace is null) + var result = await WorkspaceBehaviour.TryCreateWorkspaceAsync(this.newWorkspaceName); + if (!result.Success) { this.createWorkspaceError = T("There is already a workspace with this name. Please choose a different name."); this.createWorkspaceErrorName = WorkspaceBehaviour.NormalizeWorkspaceName(this.newWorkspaceName); @@ -99,10 +108,11 @@ public partial class WorkspaceSelectionDialog : MSGComponentBase return; } - this.workspaces.Add(new(workspace.Value.WorkspaceId, workspace.Value.Name)); - this.selectedWorkspace = workspace.Value.WorkspaceId; + this.workspaces.Add(new(result.Workspace.WorkspaceId, result.Workspace.Name)); + this.selectedWorkspace = result.Workspace.WorkspaceId; this.newWorkspaceName = string.Empty; this.createWorkspaceForm.ResetValidation(); + this.showCreateWorkspaceForm = false; } finally { diff --git a/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua b/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua index 1147167d..8367e109 100644 --- a/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua +++ b/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua @@ -5799,6 +5799,9 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::UPDATEDIALOG::T25417398"] = "Aktualisieren v -- Install later UI_TEXT_CONTENT["AISTUDIO::DIALOGS::UPDATEDIALOG::T2936430090"] = "Später installieren" +-- Create new workspace +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::WORKSPACESELECTIONDIALOG::T1541251414"] = "Neuen Arbeitsbereich erstellen" + -- Add workspace UI_TEXT_CONTENT["AISTUDIO::DIALOGS::WORKSPACESELECTIONDIALOG::T1586005241"] = "Arbeitsbereich hinzufügen" @@ -5811,9 +5814,6 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::WORKSPACESELECTIONDIALOG::T3249036008"] = "E -- Please enter a workspace name. UI_TEXT_CONTENT["AISTUDIO::DIALOGS::WORKSPACESELECTIONDIALOG::T3288132732"] = "Bitte geben Sie einen Namen für diesen Arbeitsbereich ein." --- Create a new workspace -UI_TEXT_CONTENT["AISTUDIO::DIALOGS::WORKSPACESELECTIONDIALOG::T591103325"] = "Neuen Arbeitsbereich erstellen" - -- Cancel UI_TEXT_CONTENT["AISTUDIO::DIALOGS::WORKSPACESELECTIONDIALOG::T900713019"] = "Abbrechen" diff --git a/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua b/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua index 498df5c3..c1104280 100644 --- a/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua +++ b/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua @@ -5799,6 +5799,9 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::UPDATEDIALOG::T25417398"] = "Update from v{0 -- Install later UI_TEXT_CONTENT["AISTUDIO::DIALOGS::UPDATEDIALOG::T2936430090"] = "Install later" +-- Create new workspace +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::WORKSPACESELECTIONDIALOG::T1541251414"] = "Create new workspace" + -- Add workspace UI_TEXT_CONTENT["AISTUDIO::DIALOGS::WORKSPACESELECTIONDIALOG::T1586005241"] = "Add workspace" @@ -5811,9 +5814,6 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::WORKSPACESELECTIONDIALOG::T3249036008"] = "T -- Please enter a workspace name. UI_TEXT_CONTENT["AISTUDIO::DIALOGS::WORKSPACESELECTIONDIALOG::T3288132732"] = "Please enter a workspace name." --- Create a new workspace -UI_TEXT_CONTENT["AISTUDIO::DIALOGS::WORKSPACESELECTIONDIALOG::T591103325"] = "Create a new workspace" - -- Cancel UI_TEXT_CONTENT["AISTUDIO::DIALOGS::WORKSPACESELECTIONDIALOG::T900713019"] = "Cancel" diff --git a/app/MindWork AI Studio/Tools/WorkspaceBehaviour.cs b/app/MindWork AI Studio/Tools/WorkspaceBehaviour.cs index 7305d715..aaa5bb04 100644 --- a/app/MindWork AI Studio/Tools/WorkspaceBehaviour.cs +++ b/app/MindWork AI Studio/Tools/WorkspaceBehaviour.cs @@ -12,6 +12,8 @@ namespace AIStudio.Tools; public static class WorkspaceBehaviour { + public readonly record struct TryCreateWorkspaceResult(bool Success, WorkspaceTreeWorkspace Workspace); + private sealed class WorkspaceChatCacheEntry { public Guid WorkspaceId { get; init; } @@ -615,18 +617,18 @@ public static class WorkspaceBehaviour } } - public static async Task CreateWorkspaceAsync(string workspaceName) + public static async Task TryCreateWorkspaceAsync(string workspaceName) { var normalizedWorkspaceName = NormalizeWorkspaceName(workspaceName); if (string.IsNullOrWhiteSpace(normalizedWorkspaceName)) - return null; + return new(false, default); await WORKSPACE_TREE_CACHE_SEMAPHORE.WaitAsync(); try { await EnsureTreeShellLoadedCoreAsync(); if (WorkspaceNameExistsCore(normalizedWorkspaceName)) - return null; + return new(false, default); var workspaceId = Guid.NewGuid(); var workspacePath = Path.Join(WORKSPACE_ROOT_DIRECTORY, workspaceId.ToString()); @@ -646,7 +648,7 @@ public static class WorkspaceBehaviour WORKSPACE_TREE_CACHE.Workspaces[workspaceId] = workspace; WORKSPACE_TREE_CACHE.WorkspaceOrder.Add(workspaceId); - return ToPublicWorkspace(workspace); + return new(true, ToPublicWorkspace(workspace)); } finally {