@inject ISiteDiscoveryService SiteDiscovery
@if (!string.IsNullOrEmpty(_error)) {
@_error
} @if (_all.Count > 0) {
@if (!Single) { } @SelectedSites.Count selected
@foreach (var s in Filtered) { } @if (!Filtered.Any()) {
No sites match the filter.
}
} else if (!_loading) {
Click “Load sites” to list the tenant’s SharePoint sites, then @(Single ? "pick one." : "tick the ones to scan.")
}
@code { [Parameter] public TenantProfile Profile { get; set; } = default!; [Parameter] public List SelectedSites { get; set; } = new(); [Parameter] public EventCallback> SelectedSitesChanged { get; set; } [Parameter] public bool Disabled { get; set; } [Parameter] public bool Single { get; set; } private readonly string _radioName = "sp-" + Guid.NewGuid().ToString("N"); private List _all = new(); private string _filter = string.Empty; private bool _loading; private string _error = string.Empty; private IEnumerable Filtered => string.IsNullOrWhiteSpace(_filter) ? _all : _all.Where(s => s.Title.Contains(_filter, StringComparison.OrdinalIgnoreCase) || s.Url.Contains(_filter, StringComparison.OrdinalIgnoreCase)); private bool IsSelected(SiteInfo s) => SelectedSites.Any(x => string.Equals(x.Url, s.Url, StringComparison.OrdinalIgnoreCase)); private async Task LoadSites() { _loading = true; _error = string.Empty; try { _all = (await SiteDiscovery.SearchSitesAsync(Profile)).ToList(); if (_all.Count == 0) _error = "No sites returned. The account may lack Sites.Read.All."; } catch (Exception ex) { _error = ex.Message; } finally { _loading = false; } } private async Task Toggle(SiteInfo s, bool on) { if (on) { if (!IsSelected(s)) SelectedSites.Add(s); } else { SelectedSites.RemoveAll(x => string.Equals(x.Url, s.Url, StringComparison.OrdinalIgnoreCase)); } await SelectedSitesChanged.InvokeAsync(SelectedSites); } private async Task SelectSingle(SiteInfo s) { SelectedSites = new List { s }; await SelectedSitesChanged.InvokeAsync(SelectedSites); } private async Task SelectAllFiltered() { foreach (var s in Filtered) if (!IsSelected(s)) SelectedSites.Add(s); await SelectedSitesChanged.InvokeAsync(SelectedSites); } private async Task ClearSelection() { SelectedSites.Clear(); await SelectedSitesChanged.InvokeAsync(SelectedSites); } }