Sistemati filtri

This commit is contained in:
2025-07-31 15:24:45 +02:00
parent 068723f31f
commit 8dfb163cfa
8 changed files with 63 additions and 32 deletions

View File

@@ -8,6 +8,7 @@ using MudBlazor.Services;
using MudExtensions.Services;
using salesbook.Maui.Core.Services;
using salesbook.Shared;
using salesbook.Shared.Core.Dto;
using salesbook.Shared.Core.Helpers;
using salesbook.Shared.Core.Interface;
using salesbook.Shared.Core.Messages.Activity.Copy;
@@ -72,6 +73,7 @@ namespace salesbook.Maui
builder.Services.AddSingleton<IFormFactor, FormFactor>();
builder.Services.AddSingleton<IAttachedService, AttachedService>();
builder.Services.AddSingleton<LocalDbService>();
builder.Services.AddSingleton<FilterUserDTO>();
return builder.Build();
}

View File

@@ -1,22 +1,24 @@
@page "/"
@using salesbook.Shared.Core.Interface
@attribute [Authorize]
@using salesbook.Shared.Core.Interface
@using salesbook.Shared.Components.Layout.Spinner
@inject IFormFactor FormFactor
@inject INetworkService NetworkService
<SpinnerLayout FullScreen="true" />
@code
{
protected override Task OnInitializedAsync()
protected override async Task OnInitializedAsync()
{
var lastSyncDate = LocalStorage.Get<DateTime>("last-sync");
if (!FormFactor.IsWeb() && NetworkService.IsNetworkAvailable() && lastSyncDate.Equals(DateTime.MinValue))
{
NavigationManager.NavigateTo("/sync");
return base.OnInitializedAsync();
return;
}
NavigationManager.NavigateTo("/Calendar");
return base.OnInitializedAsync();
}
}

View File

@@ -29,9 +29,12 @@ else
<div class="personal-info">
<span class="info-nome">@Anag.RagSoc</span>
@if (UserSession.User.KeyGroup is not null)
@if (Anag.Indirizzo != null)
{
<span class="info-section">@Anag.Indirizzo</span>
}
@if (Anag is { Citta: not null, Cap: not null, Prov: not null })
{
<span class="info-section">@($"{Anag.Cap} - {Anag.Citta} ({Anag.Prov})")</span>
}
</div>

View File

@@ -10,6 +10,7 @@
@using salesbook.Shared.Core.Messages.Contact
@inject IManageDataService ManageData
@inject NewContactService NewContact
@inject FilterUserDTO Filter
<HeaderLayout Title="Contatti"/>
@@ -27,7 +28,7 @@
<MudChipSet Class="mt-2" T="string" @bind-SelectedValue="TypeUser" @bind-SelectedValue:after="FilterUsers" SelectionMode="SelectionMode.SingleSelection">
<MudChip Color="Color.Primary" Variant="Variant.Text" Value="@("all")">Tutti</MudChip>
<MudChip Color="Color.Primary" Variant="Variant.Text" Value="@("contact")">Contatti</MudChip>
<MudChip Color="Color.Primary" Variant="Variant.Text" Value="@("contact")">Clienti</MudChip>
<MudChip Color="Color.Primary" Variant="Variant.Text" Value="@("prospect")">Prospect</MudChip>
</MudChipSet>
</div>
@@ -64,12 +65,12 @@
//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 void OnInitialized()
{
NewContact.OnContactCreated += async activityId => await OnActivityCreated(activityId);
NewContact.OnContactCreated += async response => await OnUserCreated(response);
Console.WriteLine($"Filter HashCode: {Filter.GetHashCode()} - IsInitialized: {Filter.IsInitialized}");
}
protected override async Task OnAfterRenderAsync(bool firstRender)
@@ -85,10 +86,15 @@
IsLoading = true;
StateHasChanged();
var loggedUser = (await ManageData.GetTable<StbUser>(x => x.UserName.Equals(UserSession.User.Username))).Last();
if (!Filter.IsInitialized)
{
var loggedUser = (await ManageData.GetTable<StbUser>(x => x.UserName.Equals(UserSession.User.Username))).Last();
if (loggedUser.UserCode != null)
Filter.Agenti = [loggedUser.UserCode];
if (loggedUser.UserCode != null)
Filter.Agenti = [loggedUser.UserCode];
Filter.IsInitialized = true;
}
var users = await ManageData.GetContact();
@@ -105,7 +111,6 @@
GroupedUserList = [];
string? lastHeader = null;
foreach (var user in sortedUsers)
{
var firstChar = char.ToUpper(user.RagSoc[0]);
@@ -128,6 +133,7 @@
StateHasChanged();
}
private class UserDisplayItem
{
public required ContactDTO User { get; set; }
@@ -158,10 +164,18 @@
}
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.Prov.IsNullOrEmpty() ||
(!string.IsNullOrEmpty(user.Prov) &&
user.Prov.Trim().Contains(Filter.Prov!.Trim(), StringComparison.OrdinalIgnoreCase))) &&
(Filter.Citta.IsNullOrEmpty() ||
(!string.IsNullOrEmpty(user.Citta) &&
user.Citta.Trim().Contains(Filter.Citta!.Trim(), StringComparison.OrdinalIgnoreCase))) &&
(Filter.Nazione.IsNullOrEmpty() ||
(!string.IsNullOrEmpty(user.Nazione) &&
user.Nazione.Trim().Contains(Filter.Nazione!.Trim(), StringComparison.OrdinalIgnoreCase))) &&
(Filter.Indirizzo.IsNullOrEmpty() ||
(!string.IsNullOrEmpty(user.Indirizzo) &&
user.Indirizzo.Trim().Contains(Filter.Indirizzo!.Trim(), 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)));
@@ -193,7 +207,7 @@
FilteredGroupedUserList = result;
}
private async Task OnActivityCreated(CRMCreateContactResponseDTO response)
private async Task OnUserCreated(CRMCreateContactResponseDTO response)
{
IsLoading = true;

View File

@@ -1,5 +1,4 @@
@using salesbook.Shared.Components.Pages
@using salesbook.Shared.Core.Dto
@using salesbook.Shared.Core.Dto
@using salesbook.Shared.Core.Entity
@using salesbook.Shared.Core.Interface
@inject IManageDataService manageData
@@ -19,7 +18,7 @@
<div class="form-container">
<span class="disable-full-width">Con agente</span>
<MudCheckBox @bind-Value="Filter.ConAgente" Color="Color.Primary" @bind-Value:after="OnAfterChangeAgente"/>
<MudCheckBox @bind-Value="Filter.ConAgente" Color="Color.Primary" @bind-Value:after="OnAfterChangeConAgente"/>
</div>
<div class="divider"></div>
@@ -27,7 +26,7 @@
<div class="form-container">
<span class="disable-full-width">Senza agente</span>
<MudCheckBox @bind-Value="Filter.SenzaAgente" Color="Color.Primary" @bind-Value:after="OnAfterChangeAgente"/>
<MudCheckBox @bind-Value="Filter.SenzaAgente" Color="Color.Primary" @bind-Value:after="OnAfterChangeSenzaAgente"/>
</div>
<div class="divider"></div>
@@ -89,7 +88,7 @@
</div>
<div class="button-section">
<MudButton OnClick="() => Filter = new FilterUserDTO()" Variant="Variant.Outlined" Color="Color.Error">Pulisci</MudButton>
<MudButton OnClick="ClearFilters" Variant="Variant.Outlined" Color="Color.Error">Pulisci</MudButton>
<MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="OnFilterButton">Filtra</MudButton>
</div>
</div>
@@ -140,16 +139,19 @@
Filter.SenzaAgente = false;
}
private void OnAfterChangeAgente()
private void ClearFilters()
{
if (Filter.SenzaAgente)
{
Filter.ConAgente = false;
}
else if (Filter.ConAgente)
{
Filter.SenzaAgente = false;
}
Filter.ConAgente = false;
Filter.SenzaAgente = false;
Filter.Agenti = [];
Filter.Indirizzo = null;
Filter.Citta = null;
Filter.Nazione = null;
Filter.Prov = null;
}
private void OnAfterChangeConAgente() => Filter.SenzaAgente = false;
private void OnAfterChangeSenzaAgente() => Filter.ConAgente = false;
}

View File

@@ -10,4 +10,6 @@ public class FilterUserDTO
public string? Citta { get; set; }
public string? Nazione { get; set; }
public string? Prov { get; set; }
public bool IsInitialized { get; set; }
}

View File

@@ -4,7 +4,6 @@ using salesbook.Shared.Core.Dto;
using salesbook.Shared.Core.Entity;
using salesbook.Shared.Core.Interface;
using System.Net.Http.Headers;
using System.Reflection.Metadata.Ecma335;
namespace salesbook.Shared.Core.Services;

View File

@@ -26,6 +26,7 @@
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.4.0" />
<PackageReference Include="IntegryApiClient.Core" Version="1.1.6" />
<PackageReference Include="Microsoft.AspNetCore.Components.Authorization" Version="9.0.6" />
<PackageReference Include="Microsoft.Maui.Essentials" Version="9.0.81" />
<PackageReference Include="sqlite-net-pcl" Version="1.9.172" />
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="8.12.1" />
<PackageReference Include="Microsoft.AspNetCore.Components.Web" Version="9.0.6" />
@@ -38,4 +39,10 @@
<Folder Include="wwwroot\js\bootstrap\" />
</ItemGroup>
<ItemGroup>
<Reference Include="Mono.Android">
<HintPath>..\..\..\..\Program Files\dotnet\packs\Microsoft.Android.Ref.35\35.0.78\ref\net9.0\Mono.Android.dll</HintPath>
</Reference>
</ItemGroup>
</Project>