From cd0b95ef9a9e07199ea07cedd4762c49518e80ff Mon Sep 17 00:00:00 2001 From: Mika Kuns Date: Wed, 22 Apr 2026 13:20:42 +0200 Subject: [PATCH] feat(ui): add ListSettingsModalViewModel --- src/ClaudeDo.App/Program.cs | 1 + .../Modals/ListSettingsModalViewModel.cs | 96 +++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 src/ClaudeDo.Ui/ViewModels/Modals/ListSettingsModalViewModel.cs diff --git a/src/ClaudeDo.App/Program.cs b/src/ClaudeDo.App/Program.cs index dd65ebd..16ff568 100644 --- a/src/ClaudeDo.App/Program.cs +++ b/src/ClaudeDo.App/Program.cs @@ -79,6 +79,7 @@ sealed class Program sc.AddTransient(); sc.AddTransient(); sc.AddTransient(); + sc.AddTransient(); // Islands shell VMs sc.AddSingleton(sp => diff --git a/src/ClaudeDo.Ui/ViewModels/Modals/ListSettingsModalViewModel.cs b/src/ClaudeDo.Ui/ViewModels/Modals/ListSettingsModalViewModel.cs new file mode 100644 index 0000000..6434025 --- /dev/null +++ b/src/ClaudeDo.Ui/ViewModels/Modals/ListSettingsModalViewModel.cs @@ -0,0 +1,96 @@ +using System.Collections.ObjectModel; +using ClaudeDo.Data.Models; +using ClaudeDo.Ui.Services; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; + +namespace ClaudeDo.Ui.ViewModels.Modals; + +public sealed partial class ListSettingsModalViewModel : ViewModelBase +{ + private readonly WorkerClient _worker; + + public string ListId { get; set; } = ""; + + [ObservableProperty] private string _name = ""; + [ObservableProperty] private string _workingDir = ""; + [ObservableProperty] private string _defaultCommitType = "chore"; + + [ObservableProperty] private string _selectedModel = "(default)"; + [ObservableProperty] private string _systemPrompt = ""; + [ObservableProperty] private AgentInfo? _selectedAgent; + + public ObservableCollection ModelOptions { get; } = new() + { + "(default)", "sonnet", "opus", "haiku", + }; + + public ObservableCollection CommitTypeOptions { get; } = new() + { + "chore", "feat", "fix", "refactor", "docs", "test", "ci", "perf", "style", "build", + }; + + public ObservableCollection Agents { get; } = new(); + + public Action? CloseAction { get; set; } + + public ListSettingsModalViewModel(WorkerClient worker) + { + _worker = worker; + } + + public async Task LoadAsync( + string listId, + string name, + string? workingDir, + string defaultCommitType, + CancellationToken ct = default) + { + ListId = listId; + Name = name; + WorkingDir = workingDir ?? ""; + DefaultCommitType = string.IsNullOrWhiteSpace(defaultCommitType) ? "chore" : defaultCommitType; + + Agents.Clear(); + Agents.Add(new AgentInfo("(none)", "", "")); + var agents = await _worker.GetAgentsAsync(); + foreach (var a in agents) Agents.Add(a); + + var config = await _worker.GetListConfigAsync(listId); + SelectedModel = string.IsNullOrWhiteSpace(config?.Model) ? "(default)" : config!.Model!; + SystemPrompt = config?.SystemPrompt ?? ""; + SelectedAgent = string.IsNullOrWhiteSpace(config?.AgentPath) + ? Agents[0] + : (Agents.FirstOrDefault(a => a.Path == config!.AgentPath) ?? Agents[0]); + } + + [RelayCommand] + private async Task SaveAsync() + { + var model = SelectedModel == "(default)" ? null : SelectedModel; + var sp = string.IsNullOrWhiteSpace(SystemPrompt) ? null : SystemPrompt; + var ap = SelectedAgent is null || string.IsNullOrWhiteSpace(SelectedAgent.Path) ? null : SelectedAgent.Path; + + await _worker.UpdateListAsync(new UpdateListDto( + ListId, + string.IsNullOrWhiteSpace(Name) ? "Untitled" : Name, + string.IsNullOrWhiteSpace(WorkingDir) ? null : WorkingDir, + DefaultCommitType)); + + await _worker.UpdateListConfigAsync(new UpdateListConfigDto( + ListId, model, sp, ap)); + + CloseAction?.Invoke(); + } + + [RelayCommand] + private void Cancel() => CloseAction?.Invoke(); + + [RelayCommand] + private void ResetAgentSettings() + { + SelectedModel = "(default)"; + SystemPrompt = ""; + SelectedAgent = Agents.Count > 0 ? Agents[0] : null; + } +}