From e2c94bf6d1f17348d022c7944f0494fbb21882d2 Mon Sep 17 00:00:00 2001 From: Dev Date: Tue, 7 Apr 2026 14:09:57 +0200 Subject: [PATCH] feat(08-02): add simplified mode properties to PermissionsViewModel - IsSimplifiedMode toggle switches between raw and simplified labels - IsDetailView toggle controls individual vs summary row display - SimplifiedResults and Summaries computed from cached Results - ActiveItemsSource provides correct collection for DataGrid binding - Mode toggles rebuild from cache without re-running scan - OnTenantSwitched resets simplified state Co-Authored-By: Claude Opus 4.6 (1M context) --- .../ViewModels/Tabs/PermissionsViewModel.cs | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/SharepointToolbox/ViewModels/Tabs/PermissionsViewModel.cs b/SharepointToolbox/ViewModels/Tabs/PermissionsViewModel.cs index 0f42775..29d31d3 100644 --- a/SharepointToolbox/ViewModels/Tabs/PermissionsViewModel.cs +++ b/SharepointToolbox/ViewModels/Tabs/PermissionsViewModel.cs @@ -9,6 +9,7 @@ using Microsoft.Win32; using SharepointToolbox.Core.Messages; using SharepointToolbox.Core.Models; using SharepointToolbox.Services; +using SharepointToolbox.Core.Helpers; using SharepointToolbox.Services.Export; namespace SharepointToolbox.ViewModels.Tabs; @@ -63,6 +64,51 @@ public partial class PermissionsViewModel : FeatureViewModelBase [ObservableProperty] private ObservableCollection _results = new(); + /// + /// When true, displays simplified plain-language labels instead of raw SharePoint role names. + /// Toggling does not re-run the scan. + /// + [ObservableProperty] + private bool _isSimplifiedMode; + + /// + /// When true, shows individual item-level rows (detailed view). + /// When false, shows only summary rows grouped by risk level (simple view). + /// Only meaningful when IsSimplifiedMode is true. + /// + [ObservableProperty] + private bool _isDetailView = true; + + /// + /// Simplified wrappers computed from Results. Rebuilt when Results changes. + /// + private IReadOnlyList _simplifiedResults = Array.Empty(); + public IReadOnlyList SimplifiedResults + { + get => _simplifiedResults; + private set => SetProperty(ref _simplifiedResults, value); + } + + /// + /// Summary counts grouped by risk level. Rebuilt when SimplifiedResults changes. + /// + private IReadOnlyList _summaries = Array.Empty(); + public IReadOnlyList Summaries + { + get => _summaries; + private set => SetProperty(ref _summaries, value); + } + + /// + /// The collection the DataGrid actually binds to. Returns: + /// - Results (raw) when simplified mode is OFF + /// - SimplifiedResults when simplified mode is ON and detail view is ON + /// - (View handles summary display separately via Summaries property) + /// + public object ActiveItemsSource => IsSimplifiedMode + ? (object)SimplifiedResults + : Results; + partial void OnFolderDepthChanged(int value) => OnPropertyChanged(nameof(IsMaxDepth)); // ── Commands ──────────────────────────────────────────────────────────── @@ -167,6 +213,28 @@ public partial class PermissionsViewModel : FeatureViewModelBase SelectedSites.Add(site); } + partial void OnIsSimplifiedModeChanged(bool value) + { + if (value && Results.Count > 0) + RebuildSimplifiedData(); + OnPropertyChanged(nameof(ActiveItemsSource)); + } + + partial void OnIsDetailViewChanged(bool value) + { + OnPropertyChanged(nameof(ActiveItemsSource)); + } + + /// + /// Recomputes SimplifiedResults and Summaries from the current Results collection. + /// Called when Results changes or when simplified mode is toggled on. + /// + private void RebuildSimplifiedData() + { + SimplifiedResults = SimplifiedPermissionEntry.WrapAll(Results); + Summaries = PermissionSummaryBuilder.Build(SimplifiedResults); + } + protected override async Task RunOperationAsync(CancellationToken ct, IProgress progress) { var urls = SelectedSites.Count > 0 @@ -213,11 +281,17 @@ public partial class PermissionsViewModel : FeatureViewModelBase await dispatcher.InvokeAsync(() => { Results = new ObservableCollection(allEntries); + if (IsSimplifiedMode) + RebuildSimplifiedData(); + OnPropertyChanged(nameof(ActiveItemsSource)); }); } else { Results = new ObservableCollection(allEntries); + if (IsSimplifiedMode) + RebuildSimplifiedData(); + OnPropertyChanged(nameof(ActiveItemsSource)); } ExportCsvCommand.NotifyCanExecuteChanged(); @@ -231,6 +305,9 @@ public partial class PermissionsViewModel : FeatureViewModelBase _currentProfile = profile; _hasLocalSiteOverride = false; Results = new ObservableCollection(); + SimplifiedResults = Array.Empty(); + Summaries = Array.Empty(); + OnPropertyChanged(nameof(ActiveItemsSource)); SiteUrl = string.Empty; SelectedSites.Clear(); OnPropertyChanged(nameof(SitesSelectedLabel));