@inject ISiteDiscoveryService SiteDiscovery @inject TranslationSource T
@if (!string.IsNullOrEmpty(_error)) {
@_error
} @if (_all.Count > 0) {
@if (!Single) { } @string.Format(T["sitepicker.status.selectedCount"], SelectedSites.Count)
@foreach (var s in Filtered) { } @if (!Filtered.Any()) {
@T["sitepicker.empty.noMatch"]
}
} else if (!_loading) {
@(Single ? T["sitepicker.hint.loadSingle"] : T["sitepicker.hint.loadMulti"])
}
@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 = T["sitepicker.err.noSites"]; } 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); } }