@page "/Users" @attribute [Authorize] @using salesbook.Shared.Components.Layout @using salesbook.Shared.Core.Dto @using salesbook.Shared.Core.Interface @using salesbook.Shared.Components.SingleElements.BottomSheet @using salesbook.Shared.Components.Layout.Spinner @using salesbook.Shared.Components.SingleElements @using salesbook.Shared.Core.Entity @inject IManageDataService ManageData
@if (IsLoading) { } else if (GroupedUserList?.Count > 0) { @if (item.ShowHeader) {
@item.HeaderLetter
}
} else { }
@code { private List GroupedUserList { get; set; } = []; private List FilteredGroupedUserList { get; set; } = []; private bool IsLoading { get; set; } //Filtri private string? TextToFilter { get; set; } private bool OpenFilter { get; set; } private FilterUserDTO Filter { get; set; } = new(); private string TypeUser { get; set; } = "all"; protected override async Task OnAfterRenderAsync(bool firstRender) { if (firstRender) { await LoadData(); } } private async Task LoadData() { IsLoading = true; StateHasChanged(); var loggedUser = (await ManageData.GetTable(x => x.UserName.Equals(UserSession.User.Username))).Last(); if (loggedUser.UserCode != null) Filter.Agenti = [loggedUser.UserCode]; var users = await ManageData.GetContact(); var sortedUsers = users .Where(u => !string.IsNullOrWhiteSpace(u.RagSoc)) .OrderBy(u => { var firstChar = char.ToUpper(u.RagSoc[0]); return char.IsLetter(firstChar) ? firstChar.ToString() : "ZZZ"; }) .ThenBy(u => u.RagSoc) .ToList(); GroupedUserList = []; string? lastHeader = null; foreach (var user in sortedUsers) { var firstChar = char.ToUpper(user.RagSoc[0]); var currentLetter = char.IsLetter(firstChar) ? firstChar.ToString() : "#"; var showHeader = currentLetter != lastHeader; lastHeader = currentLetter; GroupedUserList.Add(new UserDisplayItem { User = user, ShowHeader = showHeader, HeaderLetter = currentLetter }); } FilterUsers(); IsLoading = false; StateHasChanged(); } private class UserDisplayItem { public required ContactDTO User { get; set; } public bool ShowHeader { get; set; } public string? HeaderLetter { get; set; } } private void FilterUsers() => FilterUsers(false); private void FilterUsers(bool clearFilter) { if (clearFilter || string.IsNullOrWhiteSpace(TextToFilter)) { TextToFilter = null; } var result = new List(); foreach (var item in GroupedUserList) { var user = item.User; switch (TypeUser) { case "contact" when !user.IsContact: case "prospect" when user.IsContact: continue; } var matchesFilter = (Filter.Prov.IsNullOrEmpty() || user.Prov.Equals(Filter.Prov, StringComparison.OrdinalIgnoreCase)) && (Filter.Citta.IsNullOrEmpty() || user.Citta.Contains(Filter.Citta!, StringComparison.OrdinalIgnoreCase)) && (Filter.Nazione.IsNullOrEmpty() || user.Nazione.Contains(Filter.Nazione!, StringComparison.OrdinalIgnoreCase)) && (Filter.Indirizzo.IsNullOrEmpty() || user.Indirizzo.Contains(Filter.Indirizzo!, StringComparison.OrdinalIgnoreCase)) && (!Filter.ConAgente || user.CodVage is not null) && (!Filter.SenzaAgente || user.CodVage is null) && (Filter.Agenti.IsNullOrEmpty() || (user.CodVage != null && Filter.Agenti!.Contains(user.CodVage))); if (!matchesFilter) continue; if (!string.IsNullOrWhiteSpace(TextToFilter)) { var filter = TextToFilter.Trim(); var matchesText = (!string.IsNullOrEmpty(user.RagSoc) && user.RagSoc.Contains(filter, StringComparison.OrdinalIgnoreCase)) || (!string.IsNullOrEmpty(user.Indirizzo) && user.Indirizzo.Contains(filter, StringComparison.OrdinalIgnoreCase)) || (!string.IsNullOrEmpty(user.Telefono) && user.Telefono.Contains(filter, StringComparison.OrdinalIgnoreCase)) || (!string.IsNullOrEmpty(user.EMail) && user.EMail.Contains(filter, StringComparison.OrdinalIgnoreCase)) || (!string.IsNullOrEmpty(user.PartIva) && user.PartIva.Contains(filter, StringComparison.OrdinalIgnoreCase)); if (matchesText) { result.Add(item); } } else { result.Add(item); } } FilteredGroupedUserList = result; } private void ToggleFilter() { OpenFilter = !OpenFilter; StateHasChanged(); } }