fix(ui): Aktions- und Bestätigungs-Konsistenz (UX-Audit #3)
Sechs Konsistenz-Fixes: Delete-Task ins Zeilen-Kontextmenü (routet über den Worker wie DetailsIslandViewModel.DeleteTaskAsync, damit ein gelöschtes Child den WaitingForChildren-Parent korrekt weiterschaltet); EnqueueCommand als "Send to queue"-Button im Detail-Pane verdrahtet; Settings-Eintrag im Listen-Kontextmenü ergänzt; Worktree-Discard und Reset-All laufen jetzt über das jeweils vorhandene Confirm-Hook (ConfirmAction / neuer ConfirmAsync-Hook auf WorktreesSettingsTabViewModel) statt ohne Rückfrage bzw. über ein Inline-Reveal-Banner; killSessionTip/closeSession und die deutschen Queue-Strings im usageMonitor vereinheitlicht. Kein zweiter Dialog-Mechanismus eingeführt — überall die vorhandenen Hooks wiederverwendet.
This commit is contained in:
@@ -414,6 +414,17 @@
|
||||
Command="{Binding ResetReviewCommand}" />
|
||||
</StackPanel>
|
||||
|
||||
<!-- Send an Idle task to the queue for Claude to pick up on the next run. -->
|
||||
<StackPanel Spacing="8">
|
||||
<Border Height="1" Background="{DynamicResource LineBrush}" />
|
||||
<StackPanel Orientation="Horizontal" Spacing="{StaticResource SpaceSm}">
|
||||
<Button Classes="btn" Content="{loc:Tr details.sendToQueue}"
|
||||
ToolTip.Tip="{loc:Tr details.sendToQueueTip}"
|
||||
ToolTip.ShowOnDisabled="True"
|
||||
Command="{Binding EnqueueCommand}" />
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
|
||||
<!-- Submit an interactive (ConPTY) session for review: an Idle/Failed task that
|
||||
still has a worktree. Commits the worktree, then moves it to WaitingForReview. -->
|
||||
<StackPanel Spacing="8" IsVisible="{Binding CanSubmitForReview}">
|
||||
|
||||
@@ -139,6 +139,10 @@
|
||||
IsVisible="{Binding WorkingDir, Converter={x:Static StringConverters.IsNotNullOrEmpty}}"
|
||||
Command="{Binding $parent[UserControl].((vm:ListsIslandViewModel)DataContext).OpenInTerminalCommand}"
|
||||
CommandParameter="{Binding}"/>
|
||||
<Separator/>
|
||||
<MenuItem Header="{loc:Tr lists.contextSettings}"
|
||||
Command="{Binding $parent[UserControl].((vm:ListsIslandViewModel)DataContext).OpenListSettingsCommand}"
|
||||
CommandParameter="{Binding}"/>
|
||||
</ContextMenu>
|
||||
</Border.ContextMenu>
|
||||
<Grid ColumnDefinitions="20,*,Auto">
|
||||
|
||||
@@ -67,6 +67,8 @@ public partial class TaskRowView : UserControl
|
||||
menu.Items.Add(MakeItem("tasks.ctxClearSchedule", OnClearScheduleClick, row.HasSchedule));
|
||||
menu.Items.Add(MakeItem("tasks.ctxAddToMyDay", OnAddToMyDayClick, row.CanAddToMyDay));
|
||||
menu.Items.Add(MakeItem("tasks.ctxRemoveFromMyDay", OnRemoveFromMyDayClick, row.IsMyDay));
|
||||
menu.Items.Add(new Separator());
|
||||
menu.Items.Add(MakeItem("tasks.ctxDeleteTask", OnDeleteTaskClick));
|
||||
|
||||
menu.Open(border);
|
||||
e.Handled = true;
|
||||
@@ -114,6 +116,12 @@ public partial class TaskRowView : UserControl
|
||||
await vm.RemoveFromMyDayCommand.ExecuteAsync(row);
|
||||
}
|
||||
|
||||
private async void OnDeleteTaskClick(object? sender, RoutedEventArgs e)
|
||||
{
|
||||
if (DataContext is TaskRowViewModel row && FindTasksVm() is { } vm)
|
||||
await vm.DeleteTaskCommand.ExecuteAsync(row);
|
||||
}
|
||||
|
||||
private void OnOpenPlanningSessionClick(object? sender, RoutedEventArgs e)
|
||||
{
|
||||
if (DataContext is TaskRowViewModel row && FindTasksVm() is { } vm)
|
||||
|
||||
@@ -244,25 +244,12 @@
|
||||
<Button Classes="btn" Content="{loc:Tr settings.worktrees.cleanupFinished}"
|
||||
Command="{Binding Worktrees.CleanupWorktreesCommand}"
|
||||
HorizontalAlignment="Left"/>
|
||||
<StackPanel>
|
||||
<StackPanel Orientation="Horizontal" Spacing="8">
|
||||
<Button Content="{loc:Tr settings.worktrees.forceRemoveAll}" Classes="danger"
|
||||
Command="{Binding Worktrees.RequestResetConfirmCommand}"
|
||||
Command="{Binding Worktrees.ConfirmResetAllCommand}"
|
||||
HorizontalAlignment="Left"
|
||||
IsVisible="{Binding !Worktrees.ShowResetConfirm}"/>
|
||||
<Border Classes="danger-box"
|
||||
IsVisible="{Binding Worktrees.ShowResetConfirm}">
|
||||
<StackPanel Spacing="8">
|
||||
<TextBlock Text="{loc:Tr settings.worktrees.confirmRemoveAll}"
|
||||
Foreground="{DynamicResource TextBrush}" TextWrapping="Wrap"/>
|
||||
<StackPanel Orientation="Horizontal" Spacing="8">
|
||||
<Button Classes="btn" Content="{loc:Tr settings.cancel}" Command="{Binding Worktrees.CancelResetConfirmCommand}"/>
|
||||
<Button Content="{loc:Tr settings.worktrees.removeAll}" Classes="danger"
|
||||
Command="{Binding Worktrees.ConfirmResetAllCommand}"
|
||||
IsEnabled="{Binding !Worktrees.ResetStatus.IsRunning}"/>
|
||||
<ctl:OperationIndicator Status="{Binding Worktrees.ResetStatus}"/>
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
IsEnabled="{Binding !Worktrees.ResetStatus.IsRunning}"/>
|
||||
<ctl:OperationIndicator Status="{Binding Worktrees.ResetStatus}"/>
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
<TextBlock Classes="meta" Text="{Binding Worktrees.StatusMessage}"
|
||||
|
||||
@@ -70,6 +70,7 @@ public sealed class WindowDialogService : IDialogService
|
||||
|
||||
public async Task ShowSettingsAsync(SettingsModalViewModel vm)
|
||||
{
|
||||
vm.Worktrees.ConfirmAsync = ConfirmAsync;
|
||||
var dlg = new SettingsModalView { DataContext = vm };
|
||||
await dlg.ShowDialog(ActiveOwner());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user