8000 Merge pull request #2197 from github/fixes/2187-unify-repository-list… · github/VisualStudio@86bb524 · GitHub
[go: up one dir, main page]

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

Commit 86bb524

Browse files
authored
Merge pull request #2197 from github/fixes/2187-unify-repository-list-tabs
Unify the repository list and URL tabs
2 parents 467d5b2 + 761e780 commit 86bb524

File tree

12 files changed

+217
-194
lines changed

12 files changed

+217
-194
lines changed

src/GitHub.App/SampleData/Dialog/Clone/RepositoryCloneViewModelDesigner.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Reactive;
33
using System.Threading.Tasks;
44
using GitHub.Models;
5+
using GitHub.Primitives;
56
using GitHub.ViewModels;
67
using GitHub.ViewModels.Dialog.Clone;
78
using ReactiveUI;
@@ -17,13 +18,13 @@ public RepositoryCloneViewModelDesigner()
1718
}
1819

1920
public string Path { get; set; }
21+
public UriString Url { get; set; }
2022
public string PathWarning { get; set; }
2123
public int SelectedTabIndex { get; set; }
2224
public string Title => null;
2325
public IObservable<object> Done => null;
2426
public IRepositorySelectViewModel GitHubTab { get; }
2527
public IRepositorySelectViewModel EnterpriseTab { get; }
26-
public IRepositoryUrlViewModel UrlTab { get; }
2728
public ReactiveCommand<Unit, Unit> Browse { get; }
2829
public ReactiveCommand<Unit, CloneDialogResult> Clone { get; }
2930

src/GitHub.App/Services/DialogService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public async Task<CloneDialogResult> ShowCloneDialog(IConnection connection, str
5151
var viewModel = factory.CreateViewModel<IRepositoryCloneViewModel>();
5252
if (url != null)
5353
{
54-
viewModel.UrlTab.Url = url;
54+
viewModel.Url = url;
5555
}
5656

5757
if (connection != null)

src/GitHub.App/ViewModels/Dialog/Clone/RepositoryCloneViewModel.cs

Lines changed: 22 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using GitHub.Extensions;
1010
using GitHub.Logging;
1111
using GitHub.Models;
12+
using GitHub.Primitives;
1213
using GitHub.Services;
1314
using ReactiveUI;
1415
using Rothko;
@@ -20,15 +21,14 @@ namespace GitHub.ViewModels.Dialog.Clone
2021
[PartCreationPolicy(CreationPolicy.NonShared)]
2122
public class RepositoryCloneViewModel : ViewModelBase, IRepositoryCloneViewModel
2223
{
23-
static readonly ILogger log = LogManager.ForContext<RepositoryCloneViewModel>();
2424
readonly IOperatingSystem os;
2525
readonly IConnectionManager connectionManager;
2626
readonly IRepositoryCloneService service;
2727
readonly IGitService gitService;
28-
readonly IUsageService usageService;
2928
readonly IUsageTracker usageTracker;
3029
readonly IReadOnlyList<IRepositoryCloneTabViewModel> tabs;
3130
string path;
31+
UriString url;
3232
RepositoryModel previousRepository;
3333
ObservableAsPropertyHelper<string> pathWarning;
3434
int selectedTabIndex;
@@ -39,23 +39,19 @@ public RepositoryCloneViewModel(
3939
IConnectionManager connectionManager,
4040
IRepositoryCloneService service,
4141
IGitService gitService,
42-
IUsageService usageService,
4342
IUsageTracker usageTracker,
4443
IRepositorySelectViewModel gitHubTab,
45-
IRepositorySelectViewModel enterpriseTab,
46-
IRepositoryUrlViewModel urlTab)
44+
IRepositorySelectViewModel enterpriseTab)
4745
{
4846
this.os = os;
4947
this.connectionManager = connectionManager;
5048
this.service = service;
5149
this.gitService = gitService;
52-
this.usageService = usageService;
5350
this.usageTracker = usageTracker;
5451

5552
GitHubTab = gitHubTab;
5653
EnterpriseTab = enterpriseTab;
57-
UrlTab = urlTab;
58-
tabs = new IRepositoryCloneTabViewModel[] { GitHubTab, EnterpriseTab, UrlTab };
54+
tabs = new IRepositoryCloneTabViewModel[] { GitHubTab, EnterpriseTab };
5955

6056
var repository = this.WhenAnyValue(x => x.SelectedTabIndex)
6157
.SelectMany(x => tabs[x].WhenAnyValue(tab => tab.Repository));
@@ -88,14 +84,19 @@ public RepositoryCloneViewModel(
8884

8985
public IRepositorySelectViewModel GitHubTab { get; }
9086
public IRepositorySelectViewModel EnterpriseTab { get; }
91-
public IRepositoryUrlViewModel UrlTab { get; }
9287

9388
public string Path
9489
{
9590
get => path;
9691
set => this.RaiseAndSetIfChanged(ref path, value);
9792
}
9893

94+
public UriString Url
95+
{
96+
get => url;
97+
set => this.RaiseAndSetIfChanged(ref url, value);
98+
}
99+
99100
public string PathWarning => pathWarning.Value;
100101

101102
public int SelectedTabIndex
@@ -135,26 +136,21 @@ public async Task InitializeAsync(IConnection connection)
135136
SelectedTabIndex = 1;
136137
}
137138

138-
this.WhenAnyValue(x => x.SelectedTabIndex).Subscribe(x => tabs[x].Activate().Forget());
139-
140-
// When a clipboard URL has been set, show the URL tab by default
141-
if (!string.IsNullOrEmpty(UrlTab.Url))
139+
if (Url?.Host is string host && HostAddress.Create(host) is HostAddress hostAddress)
142140
{
143-
SelectedTabIndex = 2;
141+
if (hostAddress == gitHubConnection?.HostAddress)
142+
{
143+
GitHubTab.Filter = Url;
144+
SelectedTabIndex = 0;
145+
}
146+
else if (hostAddress == enterpriseConnection?.HostAddress)
147+
{
148+
EnterpriseTab.Filter = Url;
149+
SelectedTabIndex = 1;
150+
}
144151
}
145152

146-
switch (SelectedTabIndex)
147-
{
148-
case 0:
149-
usageTracker.IncrementCounter(model => model.NumberOfCloneViewGitHubTab).Forget();
150-
break;
151-
case 1:
152-
usageTracker.IncrementCounter(model => model.NumberOfCloneViewEnterpriseTab).Forget();
153-
break;
154-
case 2:
155-
usageTracker.IncrementCounter(model => model.NumberOfCloneViewUrlTab).Forget();
156-
break;
157-
}
153+
this.WhenAnyValue(x => x.SelectedTabIndex).Subscribe(x => tabs[x].Activate().Forget());
158154
}
159155

160156
void BrowseForDirectory()

src/GitHub.App/ViewModels/Dialog/Clone/RepositorySelectViewModel.cs

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using System.Reactive.Linq;
88
using System.Threading.Tasks;
99
using System.Windows.Data;
10+
using GitHub.Exports;
1011
using GitHub.Extensions;
1112
using GitHub.Logging;
1213
using GitHub.Models;
@@ -23,6 +24,7 @@ public class RepositorySelectViewModel : ViewModelBase, IRepositorySelectViewMod
2324
{
2425
static readonly ILogger log = LogManager.ForContext<RepositorySelectViewModel>();
2526
readonly IRepositoryCloneService service;
27+
readonly IGitHubContextService gitHubContextService;
2628
IConnection connection;
2729
Exception error;
2830
string filter;
@@ -35,15 +37,26 @@ public class RepositorySelectViewModel : ViewModelBase, IRepositorySelectViewMod
3537
IRepositoryItemViewModel selectedItem;
3638

3739
[ImportingConstructor]
38-
public RepositorySelectViewModel(IRepositoryCloneService service)
40+
public RepositorySelectViewModel(IRepositoryCloneService service, IGitHubContextService gitHubContextService)
3941
{
4042
Guard.ArgumentNotNull(service, nameof(service));
43+
Guard.ArgumentNotNull(service, nameof(gitHubContextService));
4144

4245
this.service = service;
46+
this.gitHubContextService = gitHubContextService;
4347

44-
repository = this.WhenAnyValue(x => x.SelectedItem)
45-
.Select(CreateRepository)
48+
var selectedRepository = this.WhenAnyValue(x => x.SelectedItem)
49+
.Select(CreateRepository);
50+
51+
var filterRepository = this.WhenAnyValue(x => x.Filter)
52+
.Select(f => gitHubContextService.FindContextFromUrl(f))
53+
.Where(c => c?.LinkType == LinkType.Repository)
54+
.Select(c => new RepositoryModel(c.RepositoryName, c.Url));
55+
56+
repository = selectedRepository
57+
.Merge(filterRepository)
4658
.ToProperty(this, x => x.Repository);
59+
4760
this.WhenAnyValue(x => x.Filter).Subscribe(_ => ItemsView?.Refresh());
4861
}
4962

@@ -166,7 +179,14 @@ bool FilterItem(object obj)
166179
{
167180
if (obj is IRepositoryItemViewModel item && !string.IsNullOrWhiteSpace(Filter))
168181
{
169-
return item.Caption.Contains(Filter, StringComparison.CurrentCultureIgnoreCase);
182+
var urlString = item.Url.ToString();
183+
var urlStringWithGit = urlString + ".git";
184+
var urlStringWithSlash = urlString + "/";
185+
return
186+
item.Caption.Contains(Filter, StringComparison.CurrentCultureIgnoreCase) ||
187+
urlString.Contains(Filter, StringComparison.OrdinalIgnoreCase) ||
188+
urlStringWithGit.Contains(Filter, StringComparison.OrdinalIgnoreCase) ||
189+
urlStringWithSlash.Contains(Filter, StringComparison.OrdinalIgnoreCase);
170190
}
171191

172192
return true;

src/GitHub.App/ViewModels/Dialog/Clone/RepositoryUrlViewModel.cs

Lines changed: 0 additions & 65 deletions
This file was deleted.

src/GitHub.Exports.Reactive/ViewModels/Dialog/Clone/IRepositoryCloneViewModel.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Reactive;
33
using GitHub.Models;
4+
using GitHub.Primitives;
45
using ReactiveUI;
56

67
namespace GitHub.ViewModels.Dialog.Clone
@@ -21,9 +22,9 @@ public interface IRepositoryCloneViewModel : IDialogContentViewModel, IConnectio
2122
IRepositorySelectViewModel EnterpriseTab { get; }
2223

2324
/// <summary>
24-
/// Gets the view model for the URL tab.
25+
/// Initial URL for the dialog.
2526
/// </summary>
26-
IRepositoryUrlViewModel UrlTab { get; }
27+
UriString Url { get; set; }
2728

2829
/// <summary>
2930
/// Gets the path to clone the repository to.

src/GitHub.Exports.Reactive/ViewModels/Dialog/Clone/IRepositoryUrlViewModel.cs

Lines changed: 0 additions & 9 deletions
This file was deleted.

src/GitHub.Exports/Models/UsageModel.cs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,6 @@ public class MeasuresModel
9090
public int ExecuteToggleInlineCommentMarginCommand { get; set; }
9191
public int NumberOfPullRequestFileMarginToggleInlineCommentMargin { get; set; }
9292
public int NumberOfPullRequestFileMarginViewChanges { get; set; }
93-
public int NumberOfCloneViewGitHubTab { get; set; }
94-
public int NumberOfCloneViewEnterpriseTab { get; set; }
95-
public int NumberOfCloneViewUrlTab { get; set; }
9693
public int NumberOfGitHubClones { get; set; }
9794
public int NumberOfEnterpriseClones { get; set; }
9895
public int NumberOfGitHubOpens { get; set; }

src/GitHub.VisualStudio.UI/Views/Dialog/Clone/RepositoryCloneView.xaml

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
<d:DesignData.DataContext>
1111
<ghfvs:RepositoryCloneViewModelDesigner/>
1212
</d:DesignData.DataContext>
13-
13+
1414
<UserControl.Resources>
1515
<ResourceDictionary>
1616
<ResourceDictionary.MergedDictionaries>
@@ -70,21 +70,6 @@
7070
Visibility="{Binding EnterpriseTab.IsEnabled, Converter={ghfvs:BooleanToVisibilityConverter}}">
7171
<local:SelectPageView DataContext="{Binding EnterpriseTab}"/>
7272
</TabItem>
73-
<TabItem Header="URL" Style="{DynamicResource LightModalViewTabItem}">
74-
<DockPanel DataContext="{Binding UrlTab}"
75-
LastChildFill="False"
76-
Margin="8">
77-
<TextBlock DockPanel.Dock="Top">
78-
Repository URL or GitHub username and repository
79-
<LineBreak/>
80-
(<Run Background="#66d3d3d3" FontFamily="Consolas">hubot/cool-repo</Run>)
81-
</TextBlock>
82-
<ghfvs:PromptTextBox DockPanel.Dock="Top"
83-
Margin="0 4"
84-
PromptText="URL or username/repository"
85-
Text="{Binding Url, UpdateSourceTrigger=PropertyChanged}"/>
86-
</DockPanel>
87-
</TabItem>
8873
</TabControl>
8974
</DockPanel>
9075
</UserControl>

src/GitHub.VisualStudio.UI/Views/Dialog/Clone/SelectPageView.xaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
<DockPanel>
2424
<ghfvs:PromptTextBox DockPanel.Dock="Top"
2525
Margin="0,4"
26-
PromptText="Filter"
26+
PromptText="Search or enter a URL"
2727
Text="{Binding Filter, UpdateSourceTrigger=PropertyChanged, Delay=300}"/>
2828

2929
<Grid>

0 commit comments

Comments
 (0)
0