From 6a2e4d1d891c6a1ae80dc3ecf63c7d5b7f59b59d Mon Sep 17 00:00:00 2001 From: Dev Date: Tue, 7 Apr 2026 10:08:19 +0200 Subject: [PATCH] feat(06-04): update single-site tab VMs for global site consumption - StorageViewModel: add OnGlobalSitesChanged, OnSiteUrlChanged, _hasLocalSiteOverride - SearchViewModel: add OnGlobalSitesChanged, OnSiteUrlChanged, _hasLocalSiteOverride - DuplicatesViewModel: add OnGlobalSitesChanged, OnSiteUrlChanged, _hasLocalSiteOverride - FolderStructureViewModel: add OnGlobalSitesChanged, OnSiteUrlChanged, _hasLocalSiteOverride - All four VMs pre-fill SiteUrl from first global site; local typing sets override flag - Tenant switch resets _hasLocalSiteOverride in all four VMs --- .../ViewModels/Tabs/DuplicatesViewModel.cs | 22 +++++++++++++++++++ .../Tabs/FolderStructureViewModel.cs | 22 +++++++++++++++++++ .../ViewModels/Tabs/SearchViewModel.cs | 22 +++++++++++++++++++ .../ViewModels/Tabs/StorageViewModel.cs | 22 +++++++++++++++++++ 4 files changed, 88 insertions(+) diff --git a/SharepointToolbox/ViewModels/Tabs/DuplicatesViewModel.cs b/SharepointToolbox/ViewModels/Tabs/DuplicatesViewModel.cs index 4d40b15..9fa3353 100644 --- a/SharepointToolbox/ViewModels/Tabs/DuplicatesViewModel.cs +++ b/SharepointToolbox/ViewModels/Tabs/DuplicatesViewModel.cs @@ -33,6 +33,7 @@ public partial class DuplicatesViewModel : FeatureViewModelBase private readonly DuplicatesHtmlExportService _htmlExportService; private readonly ILogger _logger; private TenantProfile? _currentProfile; + private bool _hasLocalSiteOverride; private IReadOnlyList _lastGroups = Array.Empty(); [ObservableProperty] private string _siteUrl = string.Empty; @@ -76,6 +77,26 @@ public partial class DuplicatesViewModel : FeatureViewModelBase ExportHtmlCommand = new AsyncRelayCommand(ExportHtmlAsync, CanExport); } + protected override void OnGlobalSitesChanged(IReadOnlyList sites) + { + if (_hasLocalSiteOverride) return; + SiteUrl = sites.Count > 0 ? sites[0].Url : string.Empty; + } + + partial void OnSiteUrlChanged(string value) + { + if (string.IsNullOrWhiteSpace(value)) + { + _hasLocalSiteOverride = false; + if (GlobalSites.Count > 0) + SiteUrl = GlobalSites[0].Url; + } + else if (GlobalSites.Count == 0 || value != GlobalSites[0].Url) + { + _hasLocalSiteOverride = true; + } + } + protected override async Task RunOperationAsync(CancellationToken ct, IProgress progress) { if (_currentProfile == null) @@ -137,6 +158,7 @@ public partial class DuplicatesViewModel : FeatureViewModelBase protected override void OnTenantSwitched(Core.Models.TenantProfile profile) { _currentProfile = profile; + _hasLocalSiteOverride = false; Results = new ObservableCollection(); _lastGroups = Array.Empty(); SiteUrl = string.Empty; diff --git a/SharepointToolbox/ViewModels/Tabs/FolderStructureViewModel.cs b/SharepointToolbox/ViewModels/Tabs/FolderStructureViewModel.cs index 10dde3c..49cba5f 100644 --- a/SharepointToolbox/ViewModels/Tabs/FolderStructureViewModel.cs +++ b/SharepointToolbox/ViewModels/Tabs/FolderStructureViewModel.cs @@ -22,6 +22,7 @@ public partial class FolderStructureViewModel : FeatureViewModelBase private readonly BulkResultCsvExportService _exportService; private readonly ILogger _logger; private TenantProfile? _currentProfile; + private bool _hasLocalSiteOverride; private List? _validRows; private BulkOperationSummary? _lastResult; @@ -65,6 +66,26 @@ public partial class FolderStructureViewModel : FeatureViewModelBase ExportFailedCommand = new AsyncRelayCommand(ExportFailedAsync, () => HasFailures); } + protected override void OnGlobalSitesChanged(IReadOnlyList sites) + { + if (_hasLocalSiteOverride) return; + SiteUrl = sites.Count > 0 ? sites[0].Url : string.Empty; + } + + partial void OnSiteUrlChanged(string value) + { + if (string.IsNullOrWhiteSpace(value)) + { + _hasLocalSiteOverride = false; + if (GlobalSites.Count > 0) + SiteUrl = GlobalSites[0].Url; + } + else if (GlobalSites.Count == 0 || value != GlobalSites[0].Url) + { + _hasLocalSiteOverride = true; + } + } + private void ImportCsv() { var dlg = new OpenFileDialog @@ -154,6 +175,7 @@ public partial class FolderStructureViewModel : FeatureViewModelBase protected override void OnTenantSwitched(TenantProfile profile) { _currentProfile = profile; + _hasLocalSiteOverride = false; SiteUrl = string.Empty; LibraryTitle = string.Empty; PreviewRows = new(); diff --git a/SharepointToolbox/ViewModels/Tabs/SearchViewModel.cs b/SharepointToolbox/ViewModels/Tabs/SearchViewModel.cs index fa73283..f1f6520 100644 --- a/SharepointToolbox/ViewModels/Tabs/SearchViewModel.cs +++ b/SharepointToolbox/ViewModels/Tabs/SearchViewModel.cs @@ -19,6 +19,7 @@ public partial class SearchViewModel : FeatureViewModelBase private readonly SearchHtmlExportService _htmlExportService; private readonly ILogger _logger; private TenantProfile? _currentProfile; + private bool _hasLocalSiteOverride; // ── Filter observable properties ───────────────────────────────────────── @@ -73,6 +74,26 @@ public partial class SearchViewModel : FeatureViewModelBase ExportHtmlCommand = new AsyncRelayCommand(ExportHtmlAsync, CanExport); } + protected override void OnGlobalSitesChanged(IReadOnlyList sites) + { + if (_hasLocalSiteOverride) return; + SiteUrl = sites.Count > 0 ? sites[0].Url : string.Empty; + } + + partial void OnSiteUrlChanged(string value) + { + if (string.IsNullOrWhiteSpace(value)) + { + _hasLocalSiteOverride = false; + if (GlobalSites.Count > 0) + SiteUrl = GlobalSites[0].Url; + } + else if (GlobalSites.Count == 0 || value != GlobalSites[0].Url) + { + _hasLocalSiteOverride = true; + } + } + protected override async Task RunOperationAsync(CancellationToken ct, IProgress progress) { if (_currentProfile == null) @@ -119,6 +140,7 @@ public partial class SearchViewModel : FeatureViewModelBase protected override void OnTenantSwitched(Core.Models.TenantProfile profile) { _currentProfile = profile; + _hasLocalSiteOverride = false; Results = new ObservableCollection(); SiteUrl = string.Empty; OnPropertyChanged(nameof(CurrentProfile)); diff --git a/SharepointToolbox/ViewModels/Tabs/StorageViewModel.cs b/SharepointToolbox/ViewModels/Tabs/StorageViewModel.cs index b4dc584..5a30abc 100644 --- a/SharepointToolbox/ViewModels/Tabs/StorageViewModel.cs +++ b/SharepointToolbox/ViewModels/Tabs/StorageViewModel.cs @@ -19,6 +19,7 @@ public partial class StorageViewModel : FeatureViewModelBase private readonly StorageHtmlExportService _htmlExportService; private readonly ILogger _logger; private TenantProfile? _currentProfile; + private bool _hasLocalSiteOverride; [ObservableProperty] private string _siteUrl = string.Empty; @@ -96,6 +97,26 @@ public partial class StorageViewModel : FeatureViewModelBase ExportHtmlCommand = new AsyncRelayCommand(ExportHtmlAsync, CanExport); } + protected override void OnGlobalSitesChanged(IReadOnlyList sites) + { + if (_hasLocalSiteOverride) return; + SiteUrl = sites.Count > 0 ? sites[0].Url : string.Empty; + } + + partial void OnSiteUrlChanged(string value) + { + if (string.IsNullOrWhiteSpace(value)) + { + _hasLocalSiteOverride = false; + if (GlobalSites.Count > 0) + SiteUrl = GlobalSites[0].Url; + } + else if (GlobalSites.Count == 0 || value != GlobalSites[0].Url) + { + _hasLocalSiteOverride = true; + } + } + protected override async Task RunOperationAsync(CancellationToken ct, IProgress progress) { if (_currentProfile == null) @@ -147,6 +168,7 @@ public partial class StorageViewModel : FeatureViewModelBase protected override void OnTenantSwitched(TenantProfile profile) { _currentProfile = profile; + _hasLocalSiteOverride = false; Results = new ObservableCollection(); SiteUrl = string.Empty; OnPropertyChanged(nameof(CurrentProfile));