Skip to content

Commit 01a05f5

Browse files
committed
Adding view Service and Account activities feature
1 parent 338fdef commit 01a05f5

11 files changed

Lines changed: 131 additions & 64 deletions

GUI/WPF/ViewModels/Controls/ActivityViewModel.cs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,14 @@ protected virtual void OnPropertyChanged(string propertyName)
3333
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
3434
}
3535

36-
public bool MeetsConditions(DateTime fromDateFilter, DateTime toDateFilter, ActivityEventType eventType, string message, bool needsReview)
36+
public bool MeetsConditions(string itemId, DateTime fromDateFilter, DateTime toDateFilter, ActivityEventType eventType, string message, bool needsReview)
3737
{
38-
return (fromDateFilter > System.DateTime.Now.Date
39-
|| Activity.DateTime.Date >= fromDateFilter) && (toDateFilter > System.DateTime.Now.Date
40-
|| Activity.DateTime.Date <= toDateFilter) && (eventType == ActivityEventType.None
41-
|| Activity.EventType == eventType) && (!needsReview
42-
|| Activity.NeedsReview) && Activity.Message.Contains(message, StringComparison.CurrentCultureIgnoreCase);
38+
return (string.IsNullOrEmpty(itemId) || Activity.ItemId == itemId)
39+
&& (fromDateFilter > System.DateTime.Now.Date
40+
|| Activity.DateTime.Date >= fromDateFilter) && (toDateFilter > System.DateTime.Now.Date
41+
|| Activity.DateTime.Date <= toDateFilter) && (eventType == ActivityEventType.None
42+
|| Activity.EventType == eventType) && (!needsReview
43+
|| Activity.NeedsReview) && Activity.Message.Contains(message, StringComparison.CurrentCultureIgnoreCase);
4344
}
4445
}
4546
}

GUI/WPF/ViewModels/MainViewModel.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using Upsilon.Apps.Passkey.Core.Utils;
44
using Upsilon.Apps.Passkey.GUI.WPF.Helper;
55
using Upsilon.Apps.Passkey.GUI.WPF.OSSpecific;
6+
using Upsilon.Apps.Passkey.GUI.WPF.Views;
67
using Upsilon.Apps.Passkey.Interfaces.Models;
78
using Upsilon.Apps.Passkey.Interfaces.Utils;
89

@@ -30,6 +31,11 @@ public static string AppTitle
3031

3132
public static IUser User => Database is null || Database.User is null ? throw new NullReferenceException(nameof(User)) : Database.User;
3233

34+
public static AccountPasswordsWarningView? AccountPasswordsWarningView;
35+
public static DuplicatedPasswordsWarningView? DuplicatedPasswordsWarningView;
36+
public static UserActivitiesView? UserActivitiesView;
37+
public static Action<string>? GoToItem;
38+
3339
public string DatabaseFile
3440
{
3541
get;

GUI/WPF/ViewModels/UserActivitiesViewModel.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,15 +101,23 @@ public UserActivitiesViewModel()
101101
RefreshFilters();
102102
}
103103

104-
public void RefreshFilters()
104+
public void ClearFilters()
105+
{
106+
FromDateFilter = ToDateFilter = DateTime.Now.Date.AddDays(1);
107+
EventType = ActivityEventType.None;
108+
Message = string.Empty;
109+
NeedsReview = false;
110+
}
111+
112+
public void RefreshFilters(string itemId = "")
105113
{
106114
Activities.Clear();
107115

108116
if (MainViewModel.Database?.Activities is null) return;
109117

110118
ActivityViewModel[] activities = [.. MainViewModel.Database.Activities
111119
.Select(x => new ActivityViewModel(x))
112-
.Where(x => x.MeetsConditions(FromDateFilter, ToDateFilter, EventType, Message, NeedsReview))
120+
.Where(x => x.MeetsConditions(itemId, FromDateFilter, ToDateFilter, EventType, Message, NeedsReview))
113121
.OrderByDescending(x => x.DateTime)];
114122

115123
foreach (ActivityViewModel activity in activities)

GUI/WPF/Views/AccountPasswordsWarningView.xaml.cs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,8 @@ namespace Upsilon.Apps.Passkey.GUI.WPF.Views
1313
public partial class AccountPasswordsWarningView : Window
1414
{
1515
private readonly AccountPasswordsWarningViewModel _viewModel;
16-
private readonly Action<string> _goToItem;
1716

18-
internal AccountPasswordsWarningView(WarningType warningType, Action<string> goToItem)
17+
internal AccountPasswordsWarningView(WarningType warningType)
1918
{
2019
InitializeComponent();
2120

@@ -24,8 +23,6 @@ internal AccountPasswordsWarningView(WarningType warningType, Action<string> goT
2423
WarningType = warningType,
2524
};
2625

27-
_goToItem = goToItem;
28-
2926
_ = _warningType_CB.Items.Add((WarningType.PasswordUpdateReminderWarning | WarningType.PasswordLeakedWarning).ToReadableString());
3027
_ = _warningType_CB.Items.Add(WarningType.PasswordLeakedWarning.ToReadableString());
3128
_ = _warningType_CB.Items.Add(WarningType.PasswordUpdateReminderWarning.ToReadableString());
@@ -43,7 +40,7 @@ private void _filterClear_Button_Click(object sender, RoutedEventArgs e)
4340

4441
private void _viewItemButton_Click(object sender, RoutedEventArgs e)
4542
{
46-
_goToItem(_viewModel.Warnings[_warnings_DGV.SelectedIndex].Account.ItemId);
43+
MainViewModel.GoToItem?.Invoke(_viewModel.Warnings[_warnings_DGV.SelectedIndex].Account.ItemId);
4744
}
4845
}
4946
}

GUI/WPF/Views/Controls/AccountView.xaml

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,22 @@
2020
<Grid.ColumnDefinitions>
2121
<ColumnDefinition Width="Auto"/>
2222
<ColumnDefinition Width="*"/>
23+
<ColumnDefinition Width="Auto"/>
2324
</Grid.ColumnDefinitions>
2425
<Label Grid.Row="0"
2526
Grid.Column="0"
2627
Content="Label : "/>
28+
<Button Grid.Row="0"
29+
Grid.Column="2"
30+
Content="👓"
31+
Click="_viewActivities_Button_Click"/>
2732
<TextBox Grid.Row="0"
2833
Grid.Column="1"
2934
Text="{Binding Label, Mode=TwoWay}"
3035
Background="{Binding LabelBackground}"/>
3136
<Grid Grid.Row="1"
3237
Grid.Column="0"
33-
Grid.ColumnSpan="2">
38+
Grid.ColumnSpan="3">
3439
<Grid.ColumnDefinitions>
3540
<ColumnDefinition Width="2*"/>
3641
<ColumnDefinition Width="3*"/>
@@ -156,6 +161,7 @@
156161
Content="Notes : "/>
157162
<TextBox Grid.Row="2"
158163
Grid.Column="1"
164+
Grid.ColumnSpan="2"
159165
Text="{Binding Notes, Mode=TwoWay}"
160166
Background="{Binding NotesBackground}"
161167
MaxHeight="75"
@@ -165,7 +171,7 @@
165171
<GroupBox Header="Options"
166172
Grid.Row="3"
167173
Grid.Column="0"
168-
Grid.ColumnSpan="2">
174+
Grid.ColumnSpan="3">
169175
<StackPanel>
170176
<StackPanel Orientation="Horizontal">
171177
<CheckBox IsChecked="{Binding RemindPasswordUpdate}"

GUI/WPF/Views/Controls/AccountView.xaml.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,5 +231,30 @@ private void _showQrCodePasswords_Clicked(object sender, RoutedEventArgs e)
231231
((PasswordViewModel)((ContentPresenter)button.TemplatedParent).Content).Password,
232232
MainViewModel.User.ShowPasswordDelay);
233233
}
234+
235+
private void _viewActivities_Button_Click(object sender, RoutedEventArgs e)
236+
{
237+
if (this.GetIsBusy()
238+
|| _viewModel is null)
239+
{
240+
return;
241+
}
242+
243+
if (this.GetIsBusy()) return;
244+
245+
if (MainViewModel.UserActivitiesView is not null
246+
&& MainViewModel.UserActivitiesView.IsLoaded)
247+
{
248+
UserActivitiesViewModel? vm = MainViewModel.UserActivitiesView.DataContext as UserActivitiesViewModel;
249+
MainViewModel.UserActivitiesView.ViewModel.RefreshFilters(_viewModel.Account.ItemId);
250+
MainViewModel.UserActivitiesView.Activate();
251+
return;
252+
}
253+
254+
MainViewModel.UserActivitiesView = new(needsReviewFilter: false);
255+
MainViewModel.UserActivitiesView.ViewModel.ClearFilters();
256+
MainViewModel.UserActivitiesView.ViewModel.RefreshFilters(_viewModel.Account.ItemId);
257+
MainViewModel.UserActivitiesView.Show();
258+
}
234259
}
235260
}

GUI/WPF/Views/Controls/ServiceView.xaml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,12 @@
3131
Content="Service name : "/>
3232
<TextBox Grid.Row="0"
3333
Grid.Column="1"
34-
Grid.ColumnSpan="2"
3534
Text="{Binding ServiceName, Mode=TwoWay}"
3635
Background="{Binding ServiceNameBackground}"/>
36+
<Button Grid.Row="0"
37+
Grid.Column="2"
38+
Content="👓"
39+
Click="_viewActivities_Button_Click"/>
3740
<Label Grid.Row="1"
3841
Grid.Column="0"
3942
Content="Url : "/>

GUI/WPF/Views/Controls/ServiceView.xaml.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,5 +106,30 @@ public bool SelectAccount(string itemId)
106106

107107
return true;
108108
}
109+
110+
private void _viewActivities_Button_Click(object sender, RoutedEventArgs e)
111+
{
112+
if (this.GetIsBusy()
113+
|| _viewModel is null)
114+
{
115+
return;
116+
}
117+
118+
if (this.GetIsBusy()) return;
119+
120+
if (MainViewModel.UserActivitiesView is not null
121+
&& MainViewModel.UserActivitiesView.IsLoaded)
122+
{
123+
UserActivitiesViewModel? vm = MainViewModel.UserActivitiesView.DataContext as UserActivitiesViewModel;
124+
MainViewModel.UserActivitiesView.ViewModel.RefreshFilters(_viewModel.Service.ItemId);
125+
MainViewModel.UserActivitiesView.Activate();
126+
return;
127+
}
128+
129+
MainViewModel.UserActivitiesView = new(needsReviewFilter: false);
130+
MainViewModel.UserActivitiesView.ViewModel.ClearFilters();
131+
MainViewModel.UserActivitiesView.ViewModel.RefreshFilters(_viewModel.Service.ItemId);
132+
MainViewModel.UserActivitiesView.Show();
133+
}
109134
}
110135
}

GUI/WPF/Views/DuplicatedPasswordsWarningView.xaml.cs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,13 @@ namespace Upsilon.Apps.Passkey.GUI.WPF.Views
1313
public partial class DuplicatedPasswordsWarningView : Window
1414
{
1515
private readonly DuplicatedPasswordsWarningViewModel _viewModel;
16-
private readonly Action<string> _goToItem;
1716

18-
internal DuplicatedPasswordsWarningView(Action<string> goToItem)
17+
internal DuplicatedPasswordsWarningView()
1918
{
2019
InitializeComponent();
2120

2221
DataContext = _viewModel = new();
2322

24-
_goToItem = goToItem;
25-
2623
_warnings_LB.ItemsSource = _viewModel.Warnings;
2724
_warnings_LB.SelectionChanged += _warnings_LB_SelectionChanged;
2825

@@ -40,7 +37,7 @@ private void _warnings_LB_SelectionChanged(object sender, SelectionChangedEventA
4037

4138
private void _viewItemButton_Click(object sender, RoutedEventArgs e)
4239
{
43-
_goToItem(_viewModel.Warnings[_warnings_LB.SelectedIndex].Accounts[_warnings_DGV.SelectedIndex].Account.ItemId);
40+
MainViewModel.GoToItem?.Invoke(_viewModel.Warnings[_warnings_LB.SelectedIndex].Accounts[_warnings_DGV.SelectedIndex].Account.ItemId);
4441
}
4542
}
4643
}

GUI/WPF/Views/UserActivitiesView.xaml.cs

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,41 +11,35 @@ namespace Upsilon.Apps.Passkey.GUI.WPF.Views
1111
/// </summary>
1212
public partial class UserActivitiesView : Window
1313
{
14-
private readonly UserActivitiesViewModel _viewModel;
15-
private readonly Action<string> _goToItem;
14+
internal readonly UserActivitiesViewModel ViewModel;
1615

17-
internal UserActivitiesView(bool needsReviewFilter, Action<string> goToItem)
16+
internal UserActivitiesView(bool needsReviewFilter)
1817
{
1918
InitializeComponent();
2019

21-
DataContext = _viewModel = new()
20+
DataContext = ViewModel = new()
2221
{
2322
NeedsReview = needsReviewFilter,
2423
};
25-
26-
_goToItem = goToItem;
2724

2825
_eventType_CB.ItemsSource = Enum.GetValues<ActivityEventType>()
2926
.Cast<ActivityEventType>()
3027
.Select(x => x.ToReadableString());
3128
_eventType_CB.SelectedIndex = 0;
3229

33-
_activities_DGV.ItemsSource = _viewModel.Activities;
30+
_activities_DGV.ItemsSource = ViewModel.Activities;
3431

3532
Loaded += (s, e) => DarkMode.SetDarkMode(this);
3633
}
3734

3835
private void _filterClear_Button_Click(object sender, RoutedEventArgs e)
3936
{
40-
_viewModel.FromDateFilter = _viewModel.ToDateFilter = DateTime.Now.Date.AddDays(1);
41-
_viewModel.EventType = ActivityEventType.None;
42-
_viewModel.Message = string.Empty;
43-
_viewModel.NeedsReview = false;
37+
ViewModel.ClearFilters();
4438
}
4539

4640
private void _viewItemButton_Click(object sender, RoutedEventArgs e)
4741
{
48-
_goToItem(_viewModel.Activities[_activities_DGV.SelectedIndex].Activity.ItemId);
42+
MainViewModel.GoToItem?.Invoke(ViewModel.Activities[_activities_DGV.SelectedIndex].Activity.ItemId);
4943
}
5044
}
5145
}

0 commit comments

Comments
 (0)