11using CommunityToolkit . Mvvm . ComponentModel ;
22using CommunityToolkit . Mvvm . Input ;
33using DeveloperBalance . Models ;
4+ using System . Collections . ObjectModel ;
5+ using System . Windows . Input ;
46
57namespace DeveloperBalance . PageModels ;
68
@@ -34,14 +36,16 @@ public partial class ProjectDetailPageModel : ObservableObject, IQueryAttributab
3436 [ ObservableProperty ]
3537 private List < Tag > _allTags = [ ] ;
3638
39+ public IList < object > SelectedTags { get ; set ; } = new List < object > ( ) ;
40+
3741 [ ObservableProperty ]
3842 private IconData _icon ;
3943
4044 [ ObservableProperty ]
4145 bool _isBusy ;
4246
4347 [ ObservableProperty ]
44- private List < IconData > _icons = new List < IconData >
48+ private List < IconData > _icons = new List < IconData >
4549 {
4650 new IconData { Icon = FluentUI . ribbon_24_regular , Description = "Ribbon Icon" } ,
4751 new IconData { Icon = FluentUI . ribbon_star_24_regular , Description = "Ribbon Star Icon" } ,
@@ -135,6 +139,10 @@ private async Task LoadData(int id)
135139 foreach ( var tag in allTags )
136140 {
137141 tag . IsSelected = _project . Tags . Any ( t => t . ID == tag . ID ) ;
142+ if ( tag . IsSelected )
143+ {
144+ SelectedTags . Add ( tag ) ;
145+ }
138146 }
139147 AllTags = new ( allTags ) ;
140148 }
@@ -173,14 +181,11 @@ private async Task Save()
173181 _project . Icon = Icon . Icon ?? FluentUI . ribbon_24_regular ;
174182 await _projectRepository . SaveItemAsync ( _project ) ;
175183
176- if ( _project . IsNullOrNew ( ) )
184+ foreach ( var tag in AllTags )
177185 {
178- foreach ( var tag in AllTags )
186+ if ( tag . IsSelected )
179187 {
180- if ( tag . IsSelected )
181- {
182- await _tagRepository . SaveItemAsync ( tag , _project . ID ) ;
183- }
188+ await _tagRepository . SaveItemAsync ( tag , _project . ID ) ;
184189 }
185190 }
186191
@@ -235,7 +240,7 @@ private Task NavigateToTask(ProjectTask task) =>
235240 Shell . Current . GoToAsync ( $ "task?id={ task . ID } ") ;
236241
237242 [ RelayCommand ]
238- private async Task ToggleTag ( Tag tag )
243+ internal async Task ToggleTag ( Tag tag )
239244 {
240245 tag . IsSelected = ! tag . IsSelected ;
241246
@@ -244,20 +249,15 @@ private async Task ToggleTag(Tag tag)
244249 if ( tag . IsSelected )
245250 {
246251 await _tagRepository . SaveItemAsync ( tag , _project . ID ) ;
247- AllTags = new ( AllTags ) ;
248- await AnnouncementHelper . Announce ( $ "{ tag . Title } selected") ;
249252 }
250253 else
251254 {
252255 await _tagRepository . DeleteItemAsync ( tag , _project . ID ) ;
253- AllTags = new ( AllTags ) ;
254- await AnnouncementHelper . Announce ( $ "{ tag . Title } unselected") ;
255256 }
256257 }
257- else
258- {
259- AllTags = new ( AllTags ) ;
260- }
258+
259+ AllTags = new ( AllTags ) ;
260+ await AnnouncementHelper . Announce ( $ "{ tag . Title } { ( tag . IsSelected ? "selected" : "unselected" ) } ") ;
261261 }
262262
263263 [ RelayCommand ]
@@ -280,4 +280,19 @@ private async Task CleanTasks()
280280 OnPropertyChanged ( nameof ( HasCompletedTasks ) ) ;
281281 await AppShell . DisplayToastAsync ( "All cleaned up!" ) ;
282282 }
283- }
283+
284+ [ RelayCommand ]
285+ private async Task SelectionChanged ( object parameter )
286+ {
287+ if ( parameter is IEnumerable < object > enumerableParameter )
288+ {
289+ var changed = enumerableParameter . OfType < Tag > ( ) . ToList ( ) ;
290+
291+ if ( changed . Count == 0 && SelectedTags is not null )
292+ changed = SelectedTags . OfType < Tag > ( ) . Except ( enumerableParameter . OfType < Tag > ( ) ) . ToList ( ) ;
293+
294+ if ( changed . Count == 1 )
295+ await ToggleTag ( changed [ 0 ] ) ;
296+ }
297+ }
298+ }
0 commit comments