@@ -33,8 +33,7 @@ public partial class FinOpsContent : UserControl
3333 private DateTime _serverInventoryCacheTime ;
3434 private decimal _currentServerMonthlyCost ;
3535
36- private List < FinOpsDatabaseSizeStats > _allDatabaseSizes = new ( ) ;
37- private readonly Dictionary < string , ColumnFilterState > _dbSizeColumnFilters = new ( ) ;
36+ private DataGridFilterManager < FinOpsDatabaseSizeStats > ? _dbSizesFilterMgr ;
3837 private Popup ? _dbSizeFilterPopup ;
3938 private ColumnFilterPopup ? _dbSizeFilterPopupContent ;
4039
@@ -75,6 +74,8 @@ private void OnLoaded(object sender, RoutedEventArgs e)
7574 TabHelpers . FreezeColumns ( ExpensiveQueriesDataGrid , 1 ) ;
7675 TabHelpers . FreezeColumns ( IndexAnalysisDetailGrid , 1 ) ;
7776 TabHelpers . FreezeColumns ( HighImpactDataGrid , 1 ) ;
77+
78+ _dbSizesFilterMgr = new DataGridFilterManager < FinOpsDatabaseSizeStats > ( DatabaseSizesDataGrid ) ;
7879 }
7980
8081 /// <summary>
@@ -629,54 +630,32 @@ private async Task LoadDatabaseSizesAsync()
629630 }
630631 }
631632
632- _allDatabaseSizes = data ;
633- _dbSizeColumnFilters . Clear ( ) ;
634- ApplyDbSizeFilters ( ) ;
635- UpdateDbSizeFilterButtonStyles ( ) ;
633+ _dbSizesFilterMgr ! . UpdateData ( data ) ;
634+ UpdateDbSizeCountUI ( ) ;
636635 }
637636 catch ( Exception ex )
638637 {
639638 Logger . Error ( $ "Error loading database sizes: { ex . Message } ", ex ) ;
640639 }
641640 }
642641
643- private void ApplyDbSizeFilters ( )
642+ private void UpdateDbSizeCountUI ( )
644643 {
645- var filtered = _allDatabaseSizes . AsEnumerable ( ) ;
646-
647- if ( _dbSizeColumnFilters . Count > 0 )
648- {
649- filtered = filtered . Where ( item =>
650- {
651- foreach ( var filter in _dbSizeColumnFilters . Values )
652- {
653- if ( filter . IsActive && ! DataGridFilterService . MatchesFilter ( item , filter ) )
654- return false ;
655- }
656- return true ;
657- } ) ;
658- }
659-
660- var list = filtered . ToList ( ) ;
661- DatabaseSizesDataGrid . ItemsSource = list ;
662- DatabaseSizesNoDataMessage . Visibility = list . Count == 0 ? Visibility . Visible : Visibility . Collapsed ;
663- DbSizeCountIndicator . Text = list . Count > 0 ? $ "{ list . Count } file(s)" : "" ;
644+ var list = DatabaseSizesDataGrid . ItemsSource as System . Collections . IList ;
645+ int count = list ? . Count ?? 0 ;
646+ DatabaseSizesNoDataMessage . Visibility = count == 0 ? Visibility . Visible : Visibility . Collapsed ;
647+ DbSizeCountIndicator . Text = count > 0 ? $ "{ count } file(s)" : "" ;
664648 }
665649
666650 private void DatabaseSizesFilter_Click ( object sender , RoutedEventArgs e )
667651 {
668652 if ( sender is not Button button || button . Tag is not string columnName ) return ;
669- ShowDbSizeFilterPopup ( button , columnName ) ;
670- }
671653
672- private void ShowDbSizeFilterPopup ( Button button , string columnName )
673- {
674654 if ( _dbSizeFilterPopup == null )
675655 {
676656 _dbSizeFilterPopupContent = new ColumnFilterPopup ( ) ;
677657 _dbSizeFilterPopupContent . FilterApplied += FilterPopup_DbSizeFilterApplied ;
678658 _dbSizeFilterPopupContent . FilterCleared += FilterPopup_DbSizeFilterCleared ;
679-
680659 _dbSizeFilterPopup = new Popup
681660 {
682661 Child = _dbSizeFilterPopupContent ,
@@ -686,7 +665,7 @@ private void ShowDbSizeFilterPopup(Button button, string columnName)
686665 } ;
687666 }
688667
689- _dbSizeColumnFilters . TryGetValue ( columnName , out var existingFilter ) ;
668+ _dbSizesFilterMgr ! . Filters . TryGetValue ( columnName , out var existingFilter ) ;
690669 _dbSizeFilterPopupContent ! . Initialize ( columnName , existingFilter ) ;
691670 _dbSizeFilterPopup . PlacementTarget = button ;
692671 _dbSizeFilterPopup . IsOpen = true ;
@@ -697,13 +676,8 @@ private void FilterPopup_DbSizeFilterApplied(object? sender, FilterAppliedEventA
697676 if ( _dbSizeFilterPopup != null )
698677 _dbSizeFilterPopup . IsOpen = false ;
699678
700- if ( e . FilterState . IsActive )
701- _dbSizeColumnFilters [ e . FilterState . ColumnName ] = e . FilterState ;
702- else
703- _dbSizeColumnFilters . Remove ( e . FilterState . ColumnName ) ;
704-
705- ApplyDbSizeFilters ( ) ;
706- UpdateDbSizeFilterButtonStyles ( ) ;
679+ _dbSizesFilterMgr ! . SetFilter ( e . FilterState ) ;
680+ UpdateDbSizeCountUI ( ) ;
707681 }
708682
709683 private void FilterPopup_DbSizeFilterCleared ( object ? sender , EventArgs e )
@@ -712,34 +686,6 @@ private void FilterPopup_DbSizeFilterCleared(object? sender, EventArgs e)
712686 _dbSizeFilterPopup . IsOpen = false ;
713687 }
714688
715- private void UpdateDbSizeFilterButtonStyles ( )
716- {
717- foreach ( var column in DatabaseSizesDataGrid . Columns )
718- {
719- if ( column . Header is StackPanel stackPanel )
720- {
721- var filterButton = stackPanel . Children . OfType < Button > ( ) . FirstOrDefault ( ) ;
722- if ( filterButton != null && filterButton . Tag is string columnName )
723- {
724- bool hasActiveFilter = _dbSizeColumnFilters . TryGetValue ( columnName , out var filter ) && filter . IsActive ;
725-
726- var textBlock = new TextBlock
727- {
728- Text = "\uE71C " ,
729- FontFamily = new System . Windows . Media . FontFamily ( "Segoe MDL2 Assets" ) ,
730- Foreground = hasActiveFilter
731- ? new System . Windows . Media . SolidColorBrush ( System . Windows . Media . Color . FromRgb ( 0xFF , 0xD7 , 0x00 ) )
732- : new System . Windows . Media . SolidColorBrush ( System . Windows . Media . Color . FromRgb ( 0xFF , 0xFF , 0xFF ) )
733- } ;
734- filterButton . Content = textBlock ;
735- filterButton . ToolTip = hasActiveFilter && filter != null
736- ? $ "Filter: { filter . DisplayText } \n (Click to modify)"
737- : "Click to filter" ;
738- }
739- }
740- }
741- }
742-
743689 // ============================================
744690 // Application Connections Tab
745691 // ============================================
0 commit comments