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

Commit f59a513

Browse files
committed
Clear user filter when item selected.
And add tests for `UserFilterViewModel`.
1 parent 809ebca commit f59a513

File tree

5 files changed

+121
-5
lines changed

5 files changed

+121
-5
lines changed

src/GitHub.App/ViewModels/UserFilterViewModel.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,11 @@ public class UserFilterViewModel : ViewModelBase, IUserFilterViewModel
2525

2626
public UserFilterViewModel(LoadPageDelegate load)
2727
{
28+
Guard.ArgumentNotNull(load, nameof(load));
29+
2830
this.load = load;
2931
this.WhenAnyValue(x => x.Filter).Subscribe(FilterChanged);
32+
this.WhenAnyValue(x => x.Selected).Subscribe(_ => Filter = null);
3033
ClearSelection = ReactiveCommand.Create(
3134
this.WhenAnyValue(x => x.Selected).Select(x => x != null))
3235
.OnExecuteCompleted(_ => Selected = null);
@@ -96,7 +99,7 @@ void FilterChanged(string filter)
9699
}
97100
}
98101

99-
usersView.Refresh();
102+
UsersView.Refresh();
100103
}
101104

102105
bool FilterUsers(object obj)

src/GitHub.VisualStudio/Views/UserFilterView.xaml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,12 @@
3131
<ListBox Background="Transparent"
3232
BorderThickness="0"
3333
ItemsSource="{Binding UsersView}"
34-
SelectedItem="{Binding Selected}"
3534
ScrollViewer.HorizontalScrollBarVisibility="Disabled">
35+
<ListBox.ItemContainerStyle>
36+
<Style TargetType="ListBoxItem">
37+
<EventSetter Event="MouseLeftButtonUp" Handler="ListBoxItem_MouseLeftButtonUp"/>
38+
</Style>
39+
</ListBox.ItemContainerStyle>
3640
<ListBox.ItemTemplate>
3741
<DataTemplate>
3842
<DockPanel>
Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
using System;
2+
using System.Windows;
23
using System.Windows.Controls;
4+
using System.Windows.Input;
5+
using GitHub.ViewModels;
36

47
namespace GitHub.VisualStudio.Views
58
{
6-
/// <summary>
7-
/// Interaction logic for UserFilterView.xaml
8-
/// </summary>
99
public partial class UserFilterView : UserControl
1010
{
1111
public UserFilterView()
@@ -14,5 +14,15 @@ public UserFilterView()
1414
}
1515

1616
public void FocusSearchBox() => searchBox.Focus();
17+
18+
private void ListBoxItem_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
19+
{
20+
var fe = e.Source as FrameworkElement;
21+
22+
if (fe?.DataContext is IActorViewModel vm)
23+
{
24+
((IUserFilterViewModel)DataContext).Selected = vm;
25+
}
26+
}
1727
}
1828
}

test/GitHub.App.UnitTests/GitHub.App.UnitTests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@
190190
<Compile Include="ViewModels\GitHubPane\PullRequestUserReviewsViewModelTests.cs" />
191191
<Compile Include="ViewModels\TeamExplorer\RepositoryPublishViewModelTests.cs" />
192192
<Compile Include="Substitutes.cs" />
193+
<Compile Include="ViewModels\UserFilterViewModelTests.cs" />
193194
</ItemGroup>
194195
<ItemGroup>
195196
<ProjectReference Include="..\..\submodules\akavache\Akavache\Akavache_Net45.csproj">
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
using System;
2+
using System.Linq;
3+
using System.Threading.Tasks;
4+
using System.Windows.Data;
5+
using GitHub.Models;
6+
using GitHub.ViewModels;
7+
using NUnit.Framework;
8+
9+
namespace GitHub.App.UnitTests.ViewModels
10+
{
11+
public class UserFilterViewModelTests
12+
{
13+
[Test]
14+
public void Accessing_Users_Load_Users()
15+
{
16+
var target = CreateTarget();
17+
18+
Assert.That(target.Users.Count, Is.EqualTo(5));
19+
}
20+
21+
[Test]
22+
public void Setting_Filter_Adds_Ersatz_User()
23+
{
24+
var target = CreateTarget();
25+
var view = (ListCollectionView)target.UsersView;
26+
27+
target.Filter = "grok";
28+
29+
Assert.That(target.Users.Count, Is.EqualTo(6));
30+
Assert.That(target.Users.Last().Login, Is.EqualTo("grok"));
31+
Assert.That(((IActorViewModel)view.GetItemAt(0)).Login, Is.EqualTo("grok"));
32+
}
33+
34+
[Test]
35+
public void Changing_Filter_Updates_Ersatz_User()
36+
{
37+
var target = CreateTarget();
38+
var view = (ListCollectionView)target.UsersView;
39+
40+
target.Filter = "grok";
41+
42+
Assert.That(target.Users.Count, Is.EqualTo(6));
43+
Assert.That(target.Users.Last().Login, Is.EqualTo("grok"));
44+
45+
target.Filter = "shan";
46+
47+
Assert.That(target.Users.Count, Is.EqualTo(6));
48+
Assert.That(target.Users.Last().Login, Is.EqualTo("shan"));
49+
}
50+
51+
[Test]
52+
public void Changing_Filter_To_Existing_User_Removes_Ersatz_User()
53+
{
54+
var target = CreateTarget();
55+
var view = (ListCollectionView)target.UsersView;
56+
57+
target.Filter = "grok";
58+
59+
Assert.That(target.Users.Count, Is.EqualTo(6));
60+
Assert.That(target.Users.Last().Login, Is.EqualTo("grok"));
61+
62+
target.Filter = "shana";
63+
64+
Assert.That(target.Users.Count, Is.EqualTo(5));
65+
}
66+
67+
[Test]
68+
public void Selecting_User_Clears_Filter()
69+
{
70+
var target = CreateTarget();
71+
72+
target.Filter = "grok";
73+
target.Selected = target.Users[1];
74+
75+
Assert.Null(target.Filter);
76+
}
77+
78+
static UserFilterViewModel CreateTarget(UserFilterViewModel.LoadPageDelegate load = null)
79+
{
80+
Task<Page<ActorModel>> LoadPage(string after) => Task.FromResult(new Page<ActorModel>
81+
{
82+
TotalCount = 5,
83+
Items = new[]
84+
{
85+
new ActorModel { Login = "grokys" },
86+
new ActorModel { Login = "jcansdale" },
87+
new ActorModel { Login = "meaghanlewis" },
88+
new ActorModel { Login = "shana" },
89+
new ActorModel { Login = "StanleyGoldman" },
90+
},
91+
});
92+
93+
load = load ?? LoadPage;
94+
95+
return new UserFilterViewModel(load);
96+
}
97+
}
98+
}

0 commit comments

Comments
 (0)