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,6 +36,8 @@ 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
@@ -147,6 +151,10 @@ private async Task LoadData(int id)
147151 foreach ( var tag in allTags )
148152 {
149153 tag . IsSelected = _project . Tags . Any ( t => t . ID == tag . ID ) ;
154+ if ( tag . IsSelected )
155+ {
156+ SelectedTags . Add ( tag ) ;
157+ }
150158 }
151159 AllTags = new ( allTags ) ;
152160 }
@@ -186,14 +194,11 @@ private async Task Save()
186194 _project . Icon = Icon . Icon ?? FluentUI . ribbon_24_regular ;
187195 await _projectRepository . SaveItemAsync ( _project ) ;
188196
189- if ( _project . IsNullOrNew ( ) )
197+ foreach ( var tag in AllTags )
190198 {
191- foreach ( var tag in AllTags )
199+ if ( tag . IsSelected )
192200 {
193- if ( tag . IsSelected )
194- {
195- await _tagRepository . SaveItemAsync ( tag , _project . ID ) ;
196- }
201+ await _tagRepository . SaveItemAsync ( tag , _project . ID ) ;
197202 }
198203 }
199204
@@ -248,7 +253,7 @@ private Task NavigateToTask(ProjectTask task) =>
248253 Shell . Current . GoToAsync ( $ "task?id={ task . ID } ") ;
249254
250255 [ RelayCommand ]
251- private async Task ToggleTag ( Tag tag )
256+ internal async Task ToggleTag ( Tag tag )
252257 {
253258 tag . IsSelected = ! tag . IsSelected ;
254259
@@ -257,20 +262,15 @@ private async Task ToggleTag(Tag tag)
257262 if ( tag . IsSelected )
258263 {
259264 await _tagRepository . SaveItemAsync ( tag , _project . ID ) ;
260- AllTags = new ( AllTags ) ;
261- SemanticScreenReader . Announce ( $ "{ tag . Title } selected") ;
262265 }
263266 else
264267 {
265268 await _tagRepository . DeleteItemAsync ( tag , _project . ID ) ;
266- AllTags = new ( AllTags ) ;
267- SemanticScreenReader . Announce ( $ "{ tag . Title } unselected") ;
268269 }
269270 }
270- else
271- {
272- AllTags = new ( AllTags ) ;
273- }
271+
272+ AllTags = new ( AllTags ) ;
273+ await AnnouncementHelper . Announce ( $ "{ tag . Title } { ( tag . IsSelected ? "selected" : "unselected" ) } ") ;
274274 }
275275
276276 [ RelayCommand ]
@@ -293,4 +293,19 @@ private async Task CleanTasks()
293293 OnPropertyChanged ( nameof ( HasCompletedTasks ) ) ;
294294 await AppShell . DisplayToastAsync ( "All cleaned up!" ) ;
295295 }
296+
297+ [ RelayCommand ]
298+ private async Task SelectionChanged ( object parameter )
299+ {
300+ if ( parameter is IEnumerable < object > enumerableParameter )
301+ {
302+ var changed = enumerableParameter . OfType < Tag > ( ) . ToList ( ) ;
303+
304+ if ( changed . Count == 0 && SelectedTags is not null )
305+ changed = SelectedTags . OfType < Tag > ( ) . Except ( enumerableParameter . OfType < Tag > ( ) ) . ToList ( ) ;
306+
307+ if ( changed . Count == 1 )
308+ await ToggleTag ( changed [ 0 ] ) ;
309+ }
310+ }
296311}
0 commit comments