feat(ui): add RepoImportModalView
This commit is contained in:
73
src/ClaudeDo.Ui/Views/Modals/RepoImportModalView.axaml
Normal file
73
src/ClaudeDo.Ui/Views/Modals/RepoImportModalView.axaml
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
<Window xmlns="https://github.com/avaloniaui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:vm="using:ClaudeDo.Ui.ViewModels.Modals"
|
||||||
|
x:Class="ClaudeDo.Ui.Views.Modals.RepoImportModalView"
|
||||||
|
x:DataType="vm:RepoImportModalViewModel"
|
||||||
|
Title="Add repos as lists"
|
||||||
|
Width="560" Height="480"
|
||||||
|
WindowDecorations="None"
|
||||||
|
ExtendClientAreaToDecorationsHint="True"
|
||||||
|
WindowStartupLocation="CenterOwner"
|
||||||
|
Background="{DynamicResource SurfaceBrush}">
|
||||||
|
<Window.KeyBindings>
|
||||||
|
<KeyBinding Gesture="Escape" Command="{Binding CancelCommand}"/>
|
||||||
|
</Window.KeyBindings>
|
||||||
|
<Border BorderBrush="{DynamicResource LineBrush}" BorderThickness="1">
|
||||||
|
<Grid RowDefinitions="36,Auto,*,52">
|
||||||
|
|
||||||
|
<!-- Header -->
|
||||||
|
<Border Grid.Row="0" Background="{DynamicResource DeepBrush}"
|
||||||
|
BorderBrush="{DynamicResource LineBrush}" BorderThickness="0,0,0,1">
|
||||||
|
<Grid ColumnDefinitions="*,Auto" Margin="14,0">
|
||||||
|
<TextBlock Text="ADD REPOS AS LISTS" FontFamily="{DynamicResource MonoFont}" FontSize="11"
|
||||||
|
LetterSpacing="1.4" Foreground="{DynamicResource TextBrush}" VerticalAlignment="Center"/>
|
||||||
|
<Button Grid.Column="1" Classes="icon-btn" Content="✕" FontSize="12"
|
||||||
|
Command="{Binding CancelCommand}" VerticalAlignment="Center"/>
|
||||||
|
</Grid>
|
||||||
|
</Border>
|
||||||
|
|
||||||
|
<!-- Add folder row -->
|
||||||
|
<Border Grid.Row="1" Padding="16,12,16,4">
|
||||||
|
<Button Content="Add folder…" Click="AddFolderClicked" HorizontalAlignment="Left"/>
|
||||||
|
</Border>
|
||||||
|
|
||||||
|
<!-- Repo checklist -->
|
||||||
|
<ScrollViewer Grid.Row="2" Padding="16,4,16,8">
|
||||||
|
<ItemsControl ItemsSource="{Binding Repos}">
|
||||||
|
<ItemsControl.ItemTemplate>
|
||||||
|
<DataTemplate DataType="vm:RepoImportItemViewModel">
|
||||||
|
<Grid ColumnDefinitions="Auto,*,Auto" Margin="0,4">
|
||||||
|
<CheckBox Grid.Column="0"
|
||||||
|
IsChecked="{Binding IsChecked, Mode=TwoWay}"
|
||||||
|
IsEnabled="{Binding CanToggle}"
|
||||||
|
VerticalAlignment="Center"/>
|
||||||
|
<StackPanel Grid.Column="1" Margin="6,0" VerticalAlignment="Center">
|
||||||
|
<TextBlock Text="{Binding Name}" Foreground="{DynamicResource TextBrush}" FontSize="13"/>
|
||||||
|
<TextBlock Text="{Binding FullPath}" Foreground="{DynamicResource TextFaintBrush}"
|
||||||
|
FontFamily="{DynamicResource MonoFont}" FontSize="10"
|
||||||
|
TextTrimming="CharacterEllipsis"/>
|
||||||
|
</StackPanel>
|
||||||
|
<TextBlock Grid.Column="2" Text="(already added)"
|
||||||
|
Foreground="{DynamicResource TextFaintBrush}" FontSize="11"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
IsVisible="{Binding AlreadyAdded}"/>
|
||||||
|
</Grid>
|
||||||
|
</DataTemplate>
|
||||||
|
</ItemsControl.ItemTemplate>
|
||||||
|
</ItemsControl>
|
||||||
|
</ScrollViewer>
|
||||||
|
|
||||||
|
<!-- Footer -->
|
||||||
|
<Border Grid.Row="3" Background="{DynamicResource DeepBrush}"
|
||||||
|
BorderBrush="{DynamicResource LineBrush}" BorderThickness="0,1,0,0">
|
||||||
|
<StackPanel Orientation="Horizontal" Spacing="8" HorizontalAlignment="Right"
|
||||||
|
VerticalAlignment="Center" Margin="16,0">
|
||||||
|
<Button Content="Cancel" Command="{Binding CancelCommand}" MinWidth="90"/>
|
||||||
|
<Button Content="{Binding CreateButtonText}" Command="{Binding CreateCommand}"
|
||||||
|
IsEnabled="{Binding CanCreate}" MinWidth="120" Classes="primary"/>
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
|
||||||
|
</Grid>
|
||||||
|
</Border>
|
||||||
|
</Window>
|
||||||
30
src/ClaudeDo.Ui/Views/Modals/RepoImportModalView.axaml.cs
Normal file
30
src/ClaudeDo.Ui/Views/Modals/RepoImportModalView.axaml.cs
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
using Avalonia.Controls;
|
||||||
|
using Avalonia.Interactivity;
|
||||||
|
using Avalonia.Platform.Storage;
|
||||||
|
using ClaudeDo.Ui.ViewModels.Modals;
|
||||||
|
|
||||||
|
namespace ClaudeDo.Ui.Views.Modals;
|
||||||
|
|
||||||
|
public partial class RepoImportModalView : Window
|
||||||
|
{
|
||||||
|
public RepoImportModalView()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void AddFolderClicked(object? sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
if (DataContext is not RepoImportModalViewModel vm) return;
|
||||||
|
var top = TopLevel.GetTopLevel(this);
|
||||||
|
if (top is null) return;
|
||||||
|
|
||||||
|
var folders = await top.StorageProvider.OpenFolderPickerAsync(new FolderPickerOpenOptions
|
||||||
|
{
|
||||||
|
Title = "Choose folders containing repos",
|
||||||
|
AllowMultiple = true,
|
||||||
|
});
|
||||||
|
if (folders.Count == 0) return;
|
||||||
|
|
||||||
|
vm.AddFolders(folders.Select(f => f.Path.LocalPath));
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user