Skip to content
This repository was archived by the owner on Jun 21, 2023. It is now read-only.

Commit 6a0d221

Browse files
authored
Merge pull request #1665 from github/ui/fork-polish
Polish fork repo view
2 parents 7f65a95 + 7a9d377 commit 6a0d221

File tree

10 files changed

+158
-98
lines changed

10 files changed

+158
-98
lines changed

src/GitHub.App/Models/Account.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ public Account(Octokit.Account account, IObservable<BitmapSource> bitmapSource)
8080

8181
public long PrivateReposInPlan { get; private set; }
8282

83-
public string AvatarUrl { get; private set; }
83+
public string AvatarUrl { get; set; }
8484

8585
public BitmapSource Avatar
8686
{

src/GitHub.App/SampleData/ForkRepositoryExecuteViewModelDesigner.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ public ForkRepositoryExecuteViewModelDesigner()
3030

3131
public IObservable<object> Done => null;
3232

33+
public IObservable<object> Back => null;
34+
3335
public string Title => null;
3436

3537
public IRepositoryModel SourceRepository { get; set; }
@@ -40,6 +42,8 @@ public ForkRepositoryExecuteViewModelDesigner()
4042

4143
public IReactiveCommand<Repository> CreateFork => null;
4244

45+
public IReactiveCommand<object> BackCommand => null;
46+
4347
public bool ResetMasterTracking { get; set; } = true;
4448

4549
public bool AddUpstream { get; set; } = true;

src/GitHub.App/SampleData/ForkRepositorySelectViewModelDesigner.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@ public ForkRepositorySelectViewModelDesigner()
1414
{
1515
Accounts = new[]
1616
{
17-
new AccountDesigner { Login = "Myself" },
18-
new AccountDesigner { Login = "MyOrg1" },
19-
new AccountDesigner { Login = "MyOrg2" },
20-
new AccountDesigner { Login = "MyOrg3" },
21-
new AccountDesigner { Login = "a-long-org-name" },
17+
new AccountDesigner { Login = "Myself", AvatarUrl = "https://identicons.github.com/myself.png" },
18+
new AccountDesigner { Login = "MyOrg1", AvatarUrl = "https://identicons.github.com/myorg1.png" },
19+
new AccountDesigner { Login = "MyOrg2", AvatarUrl = "https://identicons.github.com/myorg2.png" },
20+
new AccountDesigner { Login = "MyOrg3", AvatarUrl = "https://identicons.github.com/myorg3.png" },
21+
new AccountDesigner { Login = "a-long-org-name", AvatarUrl = "https://identicons.github.com/a-long-org-name.png" },
2222
};
2323

2424
ExistingForks = new[]

src/GitHub.App/ViewModels/Dialog/ForkRepositoryExecuteViewModel.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ IRepositoryForkService repositoryForkService
4545
.Subscribe(tuple => CanResetMasterTracking = tuple.Item1 && tuple.Item2);
4646

4747
CreateFork = ReactiveCommand.CreateAsyncObservable(OnCreateFork);
48+
BackCommand = ReactiveCommand.Create();
4849
}
4950

5051
public IRepositoryModel SourceRepository { get; private set; }
@@ -55,10 +56,14 @@ IRepositoryForkService repositoryForkService
5556

5657
public IReactiveCommand<Repository> CreateFork { get; }
5758

59+
public IReactiveCommand<object> BackCommand { get; }
60+
5861
public string Title => Resources.ForkRepositoryTitle;
5962

6063
public IObservable<object> Done => CreateFork.Where(repository => repository != null);
6164

65+
public IObservable<object> Back => BackCommand.AsObservable();
66+
6267
public async Task InitializeAsync(ILocalRepositoryModel sourceRepository, IAccount destinationAccount, IConnection connection)
6368
{
6469
var modelService = await modelServiceFactory.CreateAsync(connection);
@@ -140,6 +145,7 @@ public bool ResetMasterTracking
140145
}
141146

142147
string error = null;
148+
143149
public string Error
144150
{
145151
get { return error; }

src/GitHub.App/ViewModels/Dialog/ForkRepositorySelectViewModel.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,14 @@ void BuildAccounts(IReadOnlyList<IAccount> accessibleAccounts, ILocalRepositoryM
108108

109109
Accounts = readOnlyList.Where(arg => arg.Fork == null).Select(arg => arg.Account).ToList();
110110
ExistingForks = readOnlyList.Where(arg => arg.Fork != null).Select(arg => arg.Fork).ToList();
111+
112+
// HACK: Our avatar cache only provides avatars in a very small size, but we want to
113+
// display them 100x100 in the Fork view. For now, wse the AvatarUrl directly to get
114+
// the avatar, appending "s=100" to the URL to get the correct size.
115+
foreach (Account account in Accounts)
116+
{
117+
account.AvatarUrl += "&s=100";
118+
}
111119
}
112120
}
113121
}

src/GitHub.App/ViewModels/Dialog/ForkRepositoryViewModel.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ public ForkRepositoryViewModel(
3333

3434
selectPage.SwitchOrigin.Subscribe(x => ShowSwitchRepositoryPath((IRemoteRepositoryModel)x));
3535
selectPage.Done.Subscribe(x => ShowExecutePage((IAccount)x).Forget());
36+
executePage.Back.Subscribe(x => ShowSelectPage().Forget());
3637
}
3738

3839
public ILocalRepositoryModel Repository { get; private set; }
@@ -47,7 +48,12 @@ public async Task InitializeAsync(ILocalRepositoryModel repository, IConnection
4748
{
4849
Repository = repository;
4950
Connection = connection;
50-
await selectPage.InitializeAsync(repository, connection);
51+
await ShowSelectPage();
52+
}
53+
54+
async Task ShowSelectPage()
55+
{
56+
await selectPage.InitializeAsync(Repository, Connection);
5157
Content = selectPage;
5258
}
5359

src/GitHub.Exports.Reactive/ViewModels/Dialog/IForkRepositoryExecuteViewModel.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ public interface IForkRepositoryExecuteViewModel : IDialogContentViewModel
2323
/// </summary>
2424
IReactiveCommand<Repository> CreateFork { get; }
2525

26+
IReactiveCommand<object> BackCommand { get; }
27+
2628
bool ResetMasterTracking { get; set; }
2729

2830
bool AddUpstream { get; set; }
@@ -34,6 +36,7 @@ public interface IForkRepositoryExecuteViewModel : IDialogContentViewModel
3436
bool CanResetMasterTracking { get; }
3537

3638
string Error { get; }
39+
IObservable<object> Back { get; }
3740

3841
/// <summary>
3942
/// Initializes the view model.

src/GitHub.VisualStudio/Views/Dialog/ForkRepositoryExecuteView.xaml

Lines changed: 67 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -6,72 +6,89 @@
66
xmlns:markdig="clr-namespace:Markdig.Wpf;assembly=Markdig.Wpf"
77
xmlns:sampleData="clr-namespace:GitHub.SampleData;assembly=GitHub.App"
88
xmlns:ui="https://github.com/github/VisualStudio"
9+
VerticalAlignment="Top"
910
Margin="8"
11+
xmlns:cache="clr-namespace:GitHub.UI.Helpers;assembly=GitHub.UI"
1012
mc:Ignorable="d" d:DesignWidth="300" Height="315.179">
1113

14+
<Control.Resources>
15+
<ResourceDictionary>
16+
<ResourceDictionary.MergedDictionaries>
17+
<cache:SharedDictionaryManager Source="pack://application:,,,/GitHub.UI;component/SharedDictionary.xaml" />
18+
<cache:SharedDictionaryManager Source="pack://application:,,,/GitHub.UI.Reactive;component/SharedDictionary.xaml" />
19+
</ResourceDictionary.MergedDictionaries>
20+
</ResourceDictionary>
21+
</Control.Resources>
22+
1223
<d:DesignProperties.DataContext>
1324
<sampleData:ForkRepositoryExecuteViewModelDesigner/>
1425
</d:DesignProperties.DataContext>
1526

16-
<StackPanel>
17-
<TextBlock TextWrapping="Wrap">
27+
<StackPanel Margin="0 8 0 0">
28+
<TextBlock FontSize="16" TextWrapping="Wrap">
1829
You're about to fork the
1930
<Hyperlink>
2031
<Run Text="{Binding SourceRepository.Owner, Mode=OneWay}"/>/<Run Text="{Binding SourceRepository.Name, Mode=OneWay}"/>
2132
</Hyperlink>
2233
repository to
2334
<Hyperlink>
2435
<Run Text="{Binding DestinationRepository.Owner, Mode=OneWay}"/>/<Run Text="{Binding DestinationRepository.Name, Mode=OneWay}"/>
25-
</Hyperlink>. This operation will:
36+
</Hyperlink>.
2637
</TextBlock>
2738

28-
<ItemsControl Margin="8,16,8,8">
29-
<ItemsControl.Resources>
30-
<Style x:Key="ItemBorder" TargetType="Border">
31-
<Setter Property="Background" Value="#10000000"/>
32-
<Setter Property="CornerRadius" Value="3"/>
33-
<Setter Property="Margin" Value="4"/>
34-
<Setter Property="Padding" Value="4,8"/>
35-
</Style>
36-
<Style TargetType="CheckBox">
37-
<Setter Property="Margin" Value="0,1,6,0"/>
38-
<Setter Property="VerticalAlignment" Value="Center"/>
39-
</Style>
40-
</ItemsControl.Resources>
41-
<Border Style="{StaticResource ItemBorder}">
42-
<DockPanel>
43-
<CheckBox IsChecked="True" IsEnabled="False"/>
44-
<TextBlock>Fork the repository</TextBlock>
45-
</DockPanel>
46-
</Border>
47-
<Border Style="{StaticResource ItemBorder}">
48-
<DockPanel>
49-
<CheckBox IsChecked="{Binding UpdateOrigin}" IsEnabled="False" />
50-
<TextBlock TextWrapping="Wrap">
51-
Update your local repository's <Run Style="{DynamicResource {x:Static markdig:Styles.CodeStyleKey}}">origin</Run> to point to
52-
<Hyperlink><Run Text="{Binding DestinationRepository.CloneUrl, Mode=OneWay}"/></Hyperlink>
53-
</TextBlock>
54-
</DockPanel>
55-
</Border>
56-
<Border Style="{StaticResource ItemBorder}">
57-
<DockPanel>
58-
<CheckBox IsChecked="{Binding AddUpstream}" IsEnabled="False" />
59-
<TextBlock TextWrapping="Wrap">
60-
Add an <Run Style="{DynamicResource {x:Static markdig:Styles.CodeStyleKey}}">upstream</Run> remote pointing to
61-
<Hyperlink><Run Text="{Binding SourceRepository.CloneUrl, Mode=OneWay}"/></Hyperlink>
62-
</TextBlock>
63-
</DockPanel>
64-
</Border>
65-
<Border Style="{StaticResource ItemBorder}">
66-
<StackPanel >
67-
<Button Click="repoForkButton_OnClick">Fork Repo</Button>
68-
<TextBlock TextWrapping="Wrap"
69-
Foreground="Red"
70-
Text="{Binding Error, Mode=OneWay}"
71-
HorizontalAlignment="Center"
72-
Visibility="{Binding Error, Converter={ui:NullToVisibilityConverter}}"/>
39+
<TextBlock Margin="0 16 0 0" FontSize="14">This operation will:</TextBlock>
40+
41+
<StackPanel Orientation="Vertical">
42+
<Border Margin="0 8 0 4" CornerRadius="2" Background="#ffeff1f5" Padding="8 16">
43+
<StackPanel>
44+
<Grid Margin="0 0 0 0">
45+
<Grid.ColumnDefinitions>
46+
<ColumnDefinition Width="Auto" />
47+
<ColumnDefinition Width="*" />
48+
</Grid.ColumnDefinitions>
49+
50+
<ui:OcticonImage Grid.Column="0" Icon="repo_forked" Background="Red" Height="16" Width="16" />
51+
<TextBlock Margin="8 0 0 0" Grid.Column="1" TextWrapping="Wrap">Fork the repository</TextBlock>
52+
</Grid>
53+
54+
<Grid Margin="0 16 0 0">
55+
<Grid.ColumnDefinitions>
56+
<ColumnDefinition Width="Auto" />
57+
<ColumnDefinition Width="*" />
58+
</Grid.ColumnDefinitions>
59+
<ui:OcticonImage Grid.Column="0" Icon="home" Height="16" Width="16" />
60+
61+
<TextBlock Margin="8 0 0 0" Grid.Column="1" TextWrapping="Wrap">
62+
Update your local repository's <Run Style="{DynamicResource {x:Static markdig:Styles.CodeStyleKey}}">origin</Run> to point to
63+
<Hyperlink><Run Text="{Binding DestinationRepository.CloneUrl, Mode=OneWay}"/></Hyperlink>
64+
</TextBlock>
65+
</Grid>
66+
67+
<Grid Margin="0 16 0 0" >
68+
<Grid.ColumnDefinitions>
69+
<ColumnDefinition Width="Auto" />
70+
<ColumnDefinition Width="*" />
71+
</Grid.ColumnDefinitions>
72+
73+
<ui:OcticonImage Grid.Column="0" Icon="globe" Height="16" Width="16" />
74+
<TextBlock Margin="8 0 0 0" Grid.Column="1" TextWrapping="Wrap">
75+
Add an <Run Style="{DynamicResource {x:Static markdig:Styles.CodeStyleKey}}">upstream</Run> remote pointing to
76+
<Hyperlink><Run Text="{Binding SourceRepository.CloneUrl, Mode=OneWay}"/></Hyperlink>
77+
</TextBlock>
78+
</Grid>
79+
</StackPanel>
80+
</Border>
81+
82+
<TextBlock TextWrapping="Wrap"
83+
Margin="0 4"
84+
Foreground="Red"
85+
Text="{Binding Error, Mode=OneWay}"
86+
Visibility="{Binding Error, Converter={ui:NullToVisibilityConverter}}"
87+
HorizontalAlignment="Left" />
88+
<StackPanel Margin="0 8" Orientation="Horizontal" HorizontalAlignment="Right">
89+
<Button HorizontalAlignment="Right" Padding="16 4" BorderThickness="0" Margin="0 0 4 0" Click="backButton_OnClick">Back</Button>
90+
<Button HorizontalAlignment="Right" Padding="16 4" BorderThickness="0" Click="repoForkButton_OnClick">Fork Repository</Button>
7391
</StackPanel>
74-
</Border>
75-
</ItemsControl>
92+
</StackPanel>
7693
</StackPanel>
7794
</UserControl>

src/GitHub.VisualStudio/Views/Dialog/ForkRepositoryExecuteView.xaml.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,10 @@ private void repoForkButton_OnClick(object sender, RoutedEventArgs e)
1919
{
2020
((IForkRepositoryExecuteViewModel)DataContext).CreateFork.Execute(new object());
2121
}
22+
23+
private void backButton_OnClick(object sender, RoutedEventArgs e)
24+
{
25+
((IForkRepositoryExecuteViewModel)DataContext).BackCommand.Execute(new object());
26+
}
2227
}
2328
}

0 commit comments

Comments
 (0)