Gestito aggiornamento elenco contatti in caso di aggiunta o modifica del prospect / cliente

This commit is contained in:
2025-07-25 14:52:00 +02:00
parent 9c69884cc9
commit 8ebc6e3b8f
17 changed files with 229 additions and 20 deletions

View File

@@ -3,12 +3,13 @@
@using salesbook.Shared.Core.Entity
@using salesbook.Shared.Core.Messages.Activity.Copy
@using salesbook.Shared.Core.Messages.Activity.New
@using salesbook.Shared.Core.Messages.Contact
@inject IDialogService Dialog
@inject IMessenger Messenger
@inject CopyActivityService CopyActivityService
<div class="container animated-navbar @(IsVisible ? "show-nav" : "hide-nav") @(IsVisible? PlusVisible ? "with-plus" : "without-plus" : "with-plus")">
<nav class="navbar @(IsVisible? PlusVisible ? "with-plus" : "without-plus" : "with-plus")">
<div class="container animated-navbar @(IsVisible ? "show-nav" : "hide-nav") @(IsVisible ? PlusVisible ? "with-plus" : "without-plus" : "with-plus")">
<nav class="navbar @(IsVisible ? PlusVisible ? "with-plus" : "without-plus" : "with-plus")">
<div class="container-navbar">
<ul class="navbar-nav flex-row nav-justified align-items-center w-100 text-center">
<li class="nav-item">
@@ -42,7 +43,7 @@
{
<MudMenu PopoverClass="custom_popover" AnchorOrigin="Origin.TopLeft" TransformOrigin="Origin.BottomRight">
<ActivatorContent>
<MudFab Class="custom-plus-button" Color="Color.Surface" Size="Size.Medium" IconSize="Size.Medium" IconColor="Color.Primary" StartIcon="@Icons.Material.Filled.Add" />
<MudFab Class="custom-plus-button" Color="Color.Surface" Size="Size.Medium" IconSize="Size.Medium" IconColor="Color.Primary" StartIcon="@Icons.Material.Filled.Add"/>
</ActivatorContent>
<ChildContent>
<MudMenuItem OnClick="() => CreateUser()">Nuovo contatto</MudMenuItem>
@@ -96,6 +97,10 @@
private async Task CreateUser()
{
var result = await ModalHelpers.OpenUserForm(Dialog, null);
}
}
if (result is { Canceled: false, Data: not null } && result.Data.GetType() == typeof(CRMCreateContactResponseDTO))
{
Messenger.Send(new NewContactMessage((CRMCreateContactResponseDTO)result.Data));
}
}
}

View File

@@ -5,7 +5,6 @@
@using salesbook.Shared.Components.SingleElements
@using salesbook.Shared.Components.Layout.Spinner
@using salesbook.Shared.Components.SingleElements.BottomSheet
@using salesbook.Shared.Core.Entity
@using salesbook.Shared.Core.Messages.Activity.New
@inject IManageDataService ManageData
@inject IJSRuntime JS

View File

@@ -10,6 +10,7 @@
@inject IManageDataService ManageData
@inject IMapper Mapper
@inject IDialogService Dialog
@inject INetworkService NetworkService
<HeaderLayout BackTo="Indietro" LabelSave="Modifica" OnSave="() => OpenUserForm(Anag)" Back="true" BackOnTop="true" Title="" ShowProfile="false" />

View File

@@ -7,7 +7,9 @@
@using salesbook.Shared.Components.Layout.Spinner
@using salesbook.Shared.Components.SingleElements
@using salesbook.Shared.Core.Entity
@using salesbook.Shared.Core.Messages.Contact
@inject IManageDataService ManageData
@inject NewContactService NewContact
<HeaderLayout Title="Contatti"/>
@@ -65,6 +67,11 @@
private FilterUserDTO Filter { get; set; } = new();
private string TypeUser { get; set; } = "all";
protected override void OnInitialized()
{
NewContact.OnContactCreated += async activityId => await OnActivityCreated(activityId);
}
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
@@ -186,6 +193,91 @@
FilteredGroupedUserList = result;
}
private async Task OnActivityCreated(CRMCreateContactResponseDTO response)
{
IsLoading = true;
string codAnag;
bool isContact;
switch (response)
{
case null:
return;
case { AnagClie: null, PtbPros: not null }:
await ManageData.InsertOrUpdate(response.PtbPros);
isContact = false;
codAnag = response.PtbPros.CodPpro!;
break;
case { AnagClie: not null, PtbPros: null }:
await ManageData.InsertOrUpdate(response.AnagClie);
isContact = true;
codAnag = response.AnagClie.CodAnag!;
break;
default:
return;
}
var contact = await ManageData.GetSpecificContact(codAnag, isContact);
if (contact == null)
{
IsLoading = false;
return;
}
var firstChar = char.ToUpper(contact.RagSoc![0]);
var currentLetter = char.IsLetter(firstChar) ? firstChar.ToString() : "#";
var insertIndex = -1;
var foundHeader = false;
for (var i = 0; i < GroupedUserList.Count; i++)
{
var current = GroupedUserList[i];
if (!current.ShowHeader || current.HeaderLetter != currentLetter) continue;
foundHeader = true;
insertIndex = i + 1;
while (insertIndex < GroupedUserList.Count &&
GroupedUserList[insertIndex].HeaderLetter == currentLetter &&
string.Compare(contact.RagSoc, GroupedUserList[insertIndex].User.RagSoc, StringComparison.OrdinalIgnoreCase) > 0)
{
insertIndex++;
}
break;
}
if (!foundHeader)
{
var headerItem = new UserDisplayItem
{
HeaderLetter = currentLetter,
ShowHeader = true,
User = contact
};
GroupedUserList.Add(headerItem);
}
else
{
var newItem = new UserDisplayItem
{
HeaderLetter = currentLetter,
ShowHeader = false,
User = contact
};
GroupedUserList.Insert(insertIndex, newItem);
}
FilterUsers();
IsLoading = false;
}
private void ToggleFilter()
{
OpenFilter = !OpenFilter;

View File

@@ -102,9 +102,15 @@
@if (!IsView)
{
<div class="search-address" @onclick="() => OpenSearchAddress = !OpenSearchAddress">
<span>Cerca indirizzo</span>
<MudIcon Size="Size.Small" Icon="@Icons.Material.Rounded.Search"/>
<div class="container-button mb-3">
<MudButton Class="button-settings blue-icon"
FullWidth="true"
StartIcon="@Icons.Material.Rounded.Search"
Size="Size.Medium"
OnClick="() => OpenSearchAddress = !OpenSearchAddress"
Variant="Variant.Outlined">
Cerca indirizzo
</MudButton>
</div>
}
@@ -242,8 +248,11 @@
}
}
</div>
<div class="container-button">
}
<div class="container-button">
@if (IsNew)
{
<MudButton Class="button-settings gray-icon"
FullWidth="true"
StartIcon="@Icons.Material.Filled.PersonAddAlt1"
@@ -252,8 +261,22 @@
Variant="Variant.Outlined">
Persona di riferimento
</MudButton>
</div>
}
}
else
{
@if (NetworkService.IsNetworkAvailable() && !ContactModel.IsContact)
{
<MudButton Class="button-settings blue-icon"
FullWidth="true"
StartIcon="@Icons.Material.Rounded.Sync"
Size="Size.Medium"
OnClick="ConvertProspectToContact"
Variant="Variant.Outlined">
Converti in cliente
</MudButton>
}
}
</div>
</div>
<MudMessageBox MarkupMessage="new MarkupString(VatMessage)" @ref="CheckVat" Class="c-messageBox" Title="Verifica partita iva" CancelText="@(VatAlreadyRegistered ? "" : "Annulla")">
@@ -330,14 +353,32 @@
PersRif = PersRifList
};
await IntegryApiService.SaveContact(requestDto);
var response = await IntegryApiService.SaveContact(requestDto);
switch (response)
{
case null:
VisibleOverlay = false;
StateHasChanged();
return;
case {AnagClie: null, PtbPros: not null}:
await ManageData.InsertOrUpdate(response.PtbPros);
break;
case { AnagClie: not null, PtbPros: null }:
await ManageData.InsertOrUpdate(response.AnagClie);
break;
default:
VisibleOverlay = false;
StateHasChanged();
return;
}
SuccessAnimation = true;
StateHasChanged();
await Task.Delay(1250);
MudDialog.Close();
MudDialog.Close(response);
}
private async Task LoadData()
@@ -492,4 +533,9 @@
ContactModel.Prov = Address.Prov;
ContactModel.Cap = Address.Cap;
}
private async Task ConvertProspectToContact()
{
}
}