feat(ui): show child tasks as children in the merge-helper picker

MergeHelperSelectionModalViewModel now loads ParentTaskId and orders
rows hierarchy-aware (parent immediately followed by its children,
mirroring TasksIslandViewModel.Regroup). Children render indented with
the same indent-track visual as the main task list; ticking a parent
cascades selection to its children, while a child can still be
deselected on its own. A child whose parent got filtered out (e.g.
already Done) renders top-level with an explicit hint instead of
disappearing. Confirm keeps returning parents ahead of their children.
This commit is contained in:
mika kuns
2026-08-10 13:47:55 +02:00
parent 6a2a19cc9e
commit 659bf3e743
5 changed files with 190 additions and 15 deletions
@@ -38,10 +38,10 @@
</Grid>
<!-- Column headers -->
<Grid DockPanel.Dock="Top" ColumnDefinitions="32,*,120" Margin="20,0,20,4"
<Grid DockPanel.Dock="Top" ColumnDefinitions="24,32,*,120" Margin="20,0,20,4"
IsVisible="{Binding HasTasks}">
<TextBlock Grid.Column="1" Classes="eyebrow" Text="{loc:Tr modals.mergeHelper.columnTask}"/>
<TextBlock Grid.Column="2" Classes="eyebrow" Text="{loc:Tr modals.mergeHelper.columnStatus}"/>
<TextBlock Grid.Column="2" Classes="eyebrow" Text="{loc:Tr modals.mergeHelper.columnTask}"/>
<TextBlock Grid.Column="3" Classes="eyebrow" Text="{loc:Tr modals.mergeHelper.columnStatus}"/>
</Grid>
<ScrollViewer Padding="20,2,20,8">
@@ -52,14 +52,27 @@
<ItemsControl ItemsSource="{Binding Tasks}">
<ItemsControl.ItemTemplate>
<DataTemplate DataType="vm:MergeHelperTaskRowViewModel">
<Grid ColumnDefinitions="32,*,120" Margin="0,1">
<CheckBox Grid.Column="0" MinWidth="0"
<Grid ColumnDefinitions="24,32,*,120" Margin="0,1">
<!-- Indent track for children, matching the task list's parent/child rendering -->
<Border Grid.Column="0" Width="24" IsVisible="{Binding IsChild}" VerticalAlignment="Stretch">
<Rectangle Width="1" Fill="{DynamicResource LineBrush}"
HorizontalAlignment="Right" Margin="0,4"/>
</Border>
<CheckBox Grid.Column="1" MinWidth="0"
IsChecked="{Binding IsSelected, Mode=TwoWay}"
VerticalAlignment="Center"/>
<TextBlock Classes="body" Grid.Column="1" Text="{Binding Title}"
VerticalAlignment="Center" Margin="4,0,0,0"
TextTrimming="CharacterEllipsis"/>
<Border Grid.Column="2" Classes="chip"
<StackPanel Grid.Column="2" Orientation="Horizontal" Spacing="4"
VerticalAlignment="Center">
<TextBlock Classes="body" Text="{Binding Title}"
VerticalAlignment="Center" Margin="4,0,0,0"
TextTrimming="CharacterEllipsis"/>
<Border Classes="badge manual" VerticalAlignment="Center"
IsVisible="{Binding IsOrphanChild}"
ToolTip.Tip="{loc:Tr modals.mergeHelper.orphanHintTip}">
<TextBlock Text="{loc:Tr modals.mergeHelper.orphanHint}"/>
</Border>
</StackPanel>
<Border Grid.Column="3" Classes="chip"
HorizontalAlignment="Left" VerticalAlignment="Center">
<TextBlock Text="{Binding StatusText}"/>
</Border>