Aggiunta possibilità che dalla commessa viene selezionato il cliente

This commit is contained in:
2025-10-30 09:33:48 +01:00
parent 3609749a26
commit a593141185
2 changed files with 115 additions and 73 deletions

View File

@@ -20,17 +20,21 @@
<MudDialog Class="customDialog-form">
<DialogContent>
<HeaderLayout ShowProfile="false" Cancel="true" OnCancel="() => MudDialog.Cancel()" LabelSave="@LabelSave" OnSave="Save" Title="@(IsNew ? "Nuova" : $"{ActivityModel.ActivityId}")"/>
<HeaderLayout ShowProfile="false" Cancel="true" OnCancel="() => MudDialog.Cancel()" LabelSave="@LabelSave"
OnSave="Save" Title="@(IsNew ? "Nuova" : $"{ActivityModel.ActivityId}")"/>
<div class="content">
<div class="input-card">
<MudTextField ReadOnly="IsView" T="string?" Placeholder="Descrizione" Variant="Variant.Text" Lines="3" @bind-Value="ActivityModel.ActivityDescription" @bind-Value:after="OnAfterChangeValue" DebounceInterval="500" OnDebounceIntervalElapsed="OnAfterChangeValue"/>
<MudTextField ReadOnly="IsView" T="string?" Placeholder="Descrizione" Variant="Variant.Text" Lines="3"
@bind-Value="ActivityModel.ActivityDescription" @bind-Value:after="OnAfterChangeValue"
DebounceInterval="500" OnDebounceIntervalElapsed="OnAfterChangeValue"/>
</div>
<div class="input-card">
<div class="form-container">
<MudAutocomplete ReadOnly="IsView" T="string?" Placeholder="Cliente"
SearchFunc="@SearchCliente" @bind-Value="ActivityModel.Cliente" @bind-Value:after="OnClienteChanged"
SearchFunc="@SearchCliente" @bind-Value="ActivityModel.Cliente"
@bind-Value:after="OnClienteChanged"
CoerceValue="true"/>
</div>
@@ -46,7 +50,6 @@
else
{
<MudAutocomplete
Disabled="ActivityModel.Cliente.IsNullOrEmpty()"
T="JtbComt?" ReadOnly="IsView"
@bind-Value="SelectedComessa"
@bind-Value:after="OnCommessaSelectedAfter"
@@ -66,7 +69,10 @@
<div class="form-container">
<span>Inizio</span>
<MudTextField ReadOnly="IsView" T="DateTime?" Format="s" Culture="CultureInfo.CurrentUICulture" InputType="InputType.DateTimeLocal" @bind-Value="ActivityModel.EstimatedTime" @bind-Value:after="OnAfterChangeValue" DebounceInterval="500" OnDebounceIntervalElapsed="OnAfterChangeValue"/>
<MudTextField ReadOnly="IsView" T="DateTime?" Format="s" Culture="CultureInfo.CurrentUICulture"
InputType="InputType.DateTimeLocal" @bind-Value="ActivityModel.EstimatedTime"
@bind-Value:after="OnAfterChangeValue" DebounceInterval="500"
OnDebounceIntervalElapsed="OnAfterChangeValue"/>
</div>
<div class="divider"></div>
@@ -74,7 +80,10 @@
<div class="form-container">
<span>Fine</span>
<MudTextField ReadOnly="IsView" T="DateTime?" Format="s" Culture="CultureInfo.CurrentUICulture" InputType="InputType.DateTimeLocal" @bind-Value="ActivityModel.EstimatedEndtime" @bind-Value:after="OnAfterChangeValue" DebounceInterval="500" OnDebounceIntervalElapsed="OnAfterChangeValue"/>
<MudTextField ReadOnly="IsView" T="DateTime?" Format="s" Culture="CultureInfo.CurrentUICulture"
InputType="InputType.DateTimeLocal" @bind-Value="ActivityModel.EstimatedEndtime"
@bind-Value:after="OnAfterChangeValue" DebounceInterval="500"
OnDebounceIntervalElapsed="OnAfterChangeValue"/>
</div>
<div class="divider"></div>
@@ -82,14 +91,31 @@
<div class="form-container">
<span class="disable-full-width">Avviso</span>
<MudSelectExtended FullWidth="true" ReadOnly="@(IsView || ActivityModel.EstimatedTime == null)" T="int" Variant="Variant.Text" @bind-Value="ActivityModel.MinuteBefore" @bind-Value:after="OnAfterChangeTimeBefore" Class="customIcon-select" AdornmentIcon="@Icons.Material.Filled.Code">
<MudSelectItemExtended Class="custom-item-select" Text="Nessuno" Value="-1">Nessuno</MudSelectItemExtended>
<MudSelectItemExtended Class="custom-item-select" Text="All'ora pianificata" Value="0">All'ora pianificata</MudSelectItemExtended>
<MudSelectItemExtended Class="custom-item-select" Text="30 minuti prima" Value="30">30 minuti prima</MudSelectItemExtended>
<MudSelectItemExtended Class="custom-item-select" Text="1 ora prima" Value="60">1 ora prima</MudSelectItemExtended>
<MudSelectItemExtended Class="custom-item-select" Text="2 ore prima" Value="120">2 ore prima</MudSelectItemExtended>
<MudSelectItemExtended Class="custom-item-select" Text="1 giorno prima" Value="1440">1 giorno prima</MudSelectItemExtended>
<MudSelectItemExtended Class="custom-item-select" Text="1 settimana prima" Value="10080">1 settimana prima</MudSelectItemExtended>
<MudSelectExtended FullWidth="true" ReadOnly="@(IsView || ActivityModel.EstimatedTime == null)"
T="int" Variant="Variant.Text" @bind-Value="ActivityModel.MinuteBefore"
@bind-Value:after="OnAfterChangeTimeBefore" Class="customIcon-select"
AdornmentIcon="@Icons.Material.Filled.Code">
<MudSelectItemExtended Class="custom-item-select" Text="Nessuno" Value="-1">
Nessuno
</MudSelectItemExtended>
<MudSelectItemExtended Class="custom-item-select" Text="All'ora pianificata" Value="0">All'ora
pianificata
</MudSelectItemExtended>
<MudSelectItemExtended Class="custom-item-select" Text="30 minuti prima" Value="30">
30 minuti prima
</MudSelectItemExtended>
<MudSelectItemExtended Class="custom-item-select" Text="1 ora prima" Value="60">
1 ora prima
</MudSelectItemExtended>
<MudSelectItemExtended Class="custom-item-select" Text="2 ore prima" Value="120">
2 ore prima
</MudSelectItemExtended>
<MudSelectItemExtended Class="custom-item-select" Text="1 giorno prima" Value="1440">
1 giorno prima
</MudSelectItemExtended>
<MudSelectItemExtended Class="custom-item-select" Text="1 settimana prima" Value="10080">
1 settimana prima
</MudSelectItemExtended>
</MudSelectExtended>
</div>
</div>
@@ -132,10 +158,14 @@
}
else
{
<MudSelectExtended ReadOnly="IsView" FullWidth="true" T="string?" Variant="Variant.Text" @bind-Value="ActivityModel.ActivityTypeId" @bind-Value:after="OnAfterChangeValue" Class="customIcon-select" AdornmentIcon="@Icons.Material.Filled.Code">
<MudSelectExtended ReadOnly="IsView" FullWidth="true" T="string?" Variant="Variant.Text"
@bind-Value="ActivityModel.ActivityTypeId"
@bind-Value:after="OnAfterChangeValue" Class="customIcon-select"
AdornmentIcon="@Icons.Material.Filled.Code">
@foreach (var type in ActivityType)
{
<MudSelectItemExtended Class="custom-item-select" Value="@type.ActivityTypeId">@type.ActivityTypeId</MudSelectItemExtended>
<MudSelectItemExtended Class="custom-item-select"
Value="@type.ActivityTypeId">@type.ActivityTypeId</MudSelectItemExtended>
}
</MudSelectExtended>
}
@@ -146,17 +176,23 @@
<div class="form-container" @onclick="OpenSelectEsito">
<span class="disable-full-width">Esito</span>
<MudSelectExtended ReadOnly="true" FullWidth="true" T="string?" Variant="Variant.Text" @bind-Value="ActivityModel.ActivityResultId" @bind-Value:after="OnAfterChangeValue" Class="customIcon-select" AdornmentIcon="@Icons.Material.Filled.Code">
<MudSelectExtended ReadOnly="true" FullWidth="true" T="string?" Variant="Variant.Text"
@bind-Value="ActivityModel.ActivityResultId"
@bind-Value:after="OnAfterChangeValue" Class="customIcon-select"
AdornmentIcon="@Icons.Material.Filled.Code">
@foreach (var result in ActivityResult)
{
<MudSelectItemExtended Class="custom-item-select" Value="@result.ActivityResultId">@result.ActivityResultId</MudSelectItemExtended>
<MudSelectItemExtended Class="custom-item-select"
Value="@result.ActivityResultId">@result.ActivityResultId</MudSelectItemExtended>
}
</MudSelectExtended>
</div>
</div>
<div class="input-card">
<MudTextField ReadOnly="IsView" T="string?" Placeholder="Note" Variant="Variant.Text" Lines="4" @bind-Value="ActivityModel.Note" @bind-Value:after="OnAfterChangeValue" DebounceInterval="500" OnDebounceIntervalElapsed="OnAfterChangeValue"/>
<MudTextField ReadOnly="IsView" T="string?" Placeholder="Note" Variant="Variant.Text" Lines="4"
@bind-Value="ActivityModel.Note" @bind-Value:after="OnAfterChangeValue"
DebounceInterval="500" OnDebounceIntervalElapsed="OnAfterChangeValue"/>
</div>
<div class="container-chip-attached">
@@ -166,13 +202,15 @@
{
@if (item.p.Type == AttachedDTO.TypeAttached.Position)
{
<MudChip T="string" Icon="@Icons.Material.Rounded.LocationOn" Color="Color.Success" OnClick="() => OpenPosition(item.p)" OnClose="() => OnRemoveAttached(item.index)">
<MudChip T="string" Icon="@Icons.Material.Rounded.LocationOn" Color="Color.Success"
OnClick="() => OpenPosition(item.p)" OnClose="() => OnRemoveAttached(item.index)">
@item.p.Description
</MudChip>
}
else
{
<MudChip T="string" Color="Color.Default" OnClick="() => OpenAttached(item.p)" OnClose="() => OnRemoveAttached(item.index)">
<MudChip T="string" Color="Color.Default" OnClick="() => OpenAttached(item.p)"
OnClose="() => OnRemoveAttached(item.index)">
@item.p.Name
</MudChip>
}
@@ -183,7 +221,7 @@
{
foreach (var file in ActivityFileList)
{
<MudChip T="string" OnClick="() => OpenAttached(file.Id, file.FileName)" OnClose="() => DeleteAttach(file)" Color="Color.Default">
<MudChip T="string" OnClick="() => OpenAttached(file.Id, file.FileName)" Color="Color.Default">
@file.FileName
</MudChip>
}
@@ -246,7 +284,8 @@
<SaveOverlay VisibleOverlay="VisibleOverlay" SuccessAnimation="SuccessAnimation"/>
<SelectEsito @bind-IsSheetVisible="OpenEsito" @bind-ActivityModel="ActivityModel" @bind-ActivityModel:after="OnAfterChangeEsito"/>
<SelectEsito @bind-IsSheetVisible="OpenEsito" @bind-ActivityModel="ActivityModel"
@bind-ActivityModel:after="OnAfterChangeEsito"/>
<AddMemo @bind-IsSheetVisible="OpenAddMemo"/>
@@ -400,25 +439,7 @@
SelectedUser = Users.FindLast(x => x.UserName.Equals(ActivityModel.UserName));
if (!IsNew && Id != null)
{
ActivityFileList = await IntegryApiService.GetActivityFile(Id);
if (ActivityModel.IdPosizione != null)
{
ActivityModel.Position = await IntegryApiService.RetrievePosition(ActivityModel.IdPosizione.Value);
CanAddPosition = false;
AttachedList ??= [];
AttachedList.Add(
new AttachedDTO
{
Name = ActivityModel.Position.Description!,
Lat = ActivityModel.Position.Lat,
Lng = ActivityModel.Position.Lng,
Type = AttachedDTO.TypeAttached.Position
}
);
}
}
ActivityResult = await ManageData.GetTable<StbActivityResult>();
Clienti = await ManageData.GetClienti(new WhereCondContact { FlagStato = "A" });
@@ -440,18 +461,29 @@
);
}
private async Task LoadCommesse()
private async Task LoadCommesse(string searchValue)
{
if (_lastLoadedCodAnag == ActivityModel.CodAnag) return;
if (_lastLoadedCodAnag == ActivityModel.CodAnag && searchValue.IsNullOrEmpty()) return;
if (ActivityModel.CodAnag == null)
{
Commesse = await ManageData.GetTable<JtbComt>(x =>
x.CodJcom.Contains(searchValue) ||
x.Descrizione.Contains(searchValue)
);
}
else
{
Commesse = await ManageData.GetTable<JtbComt>(x => x.CodAnag == ActivityModel.CodAnag);
}
Commesse = Commesse.OrderByDescending(x => x.CodJcom).ToList();
_lastLoadedCodAnag = ActivityModel.CodAnag;
}
private async Task<IEnumerable<JtbComt>> SearchCommesseAsync(string value, CancellationToken token)
{
await LoadCommesse();
await LoadCommesse(value);
if (Commesse.IsNullOrEmpty()) return [];
IEnumerable<JtbComt> list;
@@ -527,18 +559,37 @@
return Task.CompletedTask;
}
private async Task OnCommessaSelectedAfter()
private void OnCommessaSelectedAfter()
{
var com = SelectedComessa;
if (com != null)
{
ActivityModel.CodJcom = com.CodJcom;
ActivityModel.Commessa = com;
if (com.CodAnag != null)
{
ActivityModel.CodAnag = com.CodAnag;
ActivityModel.Cliente = Clienti
.Where(x => x.CodAnag != null && x.CodAnag.Equals(com.CodAnag))
.Select(x => x.RagSoc)
.FirstOrDefault() ?? Pros
.Where(x => x.CodPpro != null && x.CodPpro.Equals(com.CodAnag))
.Select(x => x.RagSoc)
.FirstOrDefault();
}
else
{
ActivityModel.CodAnag = null;
ActivityModel.Cliente = null;
}
}
else
{
ActivityModel.CodJcom = null;
ActivityModel.Commessa = null;
ActivityModel.CodAnag = null;
ActivityModel.Cliente = null;
}
OnAfterChangeValue();
@@ -700,33 +751,6 @@
}
}
private async Task DeleteAttach(ActivityFileDto file)
{
Snackbar.Clear();
if (ActivityFileList == null) return;
try
{
ActivityFileList.Remove(file);
StateHasChanged();
await IntegryApiService.DeleteFile(ActivityModel.ActivityId!, file.FileName);
}
catch (Exception ex)
{
ActivityFileList.Add(file);
StateHasChanged();
Snackbar.Add("Impossibile eliminare il file", Severity.Error);
Console.WriteLine($"Impossibile eliminare il file: {ex.Message}");
}
finally
{
Snackbar.Add($"{file.FileName} eliminato con successo", Severity.Info);
}
}
private async Task OpenAttached(AttachedDTO attached)
{
if (attached is { FileContent: not null, MimeType: not null })

View File

@@ -0,0 +1,18 @@
using System.Text.Json.Serialization;
namespace salesbook.Shared.Core.Entity;
public class StbActivityTyper
{
[JsonPropertyName("activityTypeId")]
public string? ActivityTypeId { get; set; }
[JsonPropertyName("activityTypeDescription")]
public string? ActivityTypeDescription { get; set; }
[JsonPropertyName("flagTipologia")]
public string? FlagTipologia { get; set; }
[JsonPropertyName("idRiga")]
public int IdRiga { get; set; }
}