Gestiti allegati nel form

This commit is contained in:
2026-02-20 15:29:32 +01:00
parent eef5055bfa
commit b39b7ba751
26 changed files with 512 additions and 263 deletions

View File

@@ -0,0 +1,6 @@
@page "/not-found"
@using SteUp.Shared.Components.Layout
@layout MainLayout
<h3>Not Found</h3>
<p>Sorry, the content you are looking for does not exist.</p>

View File

@@ -4,7 +4,7 @@
<ErrorBoundary @ref="ErrorBoundary">
<ChildContent>
<CascadingAuthenticationState>
<Router AppAssembly="@typeof(Routes).Assembly">
<Router AppAssembly="@typeof(Routes).Assembly" NotFoundPage="typeof(Pages.NotFound)">
<Found Context="routeData">
<AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(Layout.MainLayout)">
<Authorizing>
@@ -23,12 +23,6 @@
</AuthorizeRouteView>
<FocusOnNavigate RouteData="@routeData" Selector="h1"/>
</Found>
<NotFound>
<PageTitle>Not found</PageTitle>
<LayoutView>
<p role="alert">Sorry, there's nothing at this address.</p>
</LayoutView>
</NotFound>
</Router>
</CascadingAuthenticationState>
</ChildContent>
@@ -44,7 +38,7 @@
@code {
private ErrorBoundary? ErrorBoundary { get; set; }
private ExceptionModal ExceptionModal { get; set; }
private ExceptionModal ExceptionModal { get; set; } = null!;
protected override async Task OnInitializedAsync()
{

View File

@@ -92,7 +92,7 @@
var puntoVendita = SteupDataService.PuntiVenditaList.Find(x =>
x.CodMdep != null && x.CodMdep.EqualsIgnoreCase(Ispezione.CodMdep)
);
await Task.Delay(500);
await Task.Delay(250);
PuntoVendita = puntoVendita ?? throw new Exception("Punto vendita non trovato");
OnLoading = false;

View File

@@ -0,0 +1,21 @@
<MudMessageBox @ref="_confirmSave" Title="Attenzione!" CancelText="Non salvare">
<MessageContent>
Sono state apportate delle modifiche. Vuoi salvarle prima di continuare?
</MessageContent>
<YesButton>
<MudButton Size="Size.Small" Variant="Variant.Filled" Color="Color.Primary">
Salva
</MudButton>
</YesButton>
</MudMessageBox>
@code
{
private MudMessageBox? _confirmSave;
public async Task<bool?> ShowAsync()
{
if (_confirmSave == null) return null;
return await _confirmSave.ShowAsync();
}
}

View File

@@ -5,117 +5,47 @@
<MudDialog Class="disable-safe-area">
<DialogContent>
<HeaderLayout SmallHeader="true" Cancel="true" OnCancel="@(() => MudDialog.Cancel())" Title="@TitleModal"/>
<HeaderLayout SmallHeader="true" Cancel="true" OnCancel="@(() => MudDialog.Cancel())" Title="Aggiungi allegati"/>
@if (RequireNewName)
{
<MudTextField @bind-Value="NewName" Class="px-3" Variant="Variant.Outlined"/>
}
else
{
<div style="margin-bottom: 1rem;" class="content attached">
<MudFab Size="Size.Small" Color="Color.Primary"
StartIcon="@Icons.Material.Rounded.CameraAlt"
Label="Camera" OnClick="@OnCamera"/>
<div style="margin-bottom: 1rem;" class="content attached">
<MudFab Size="Size.Small" Color="Color.Primary"
StartIcon="@Icons.Material.Rounded.CameraAlt"
Label="Camera" OnClick="@OnCamera"/>
<MudFab Size="Size.Small" Color="Color.Primary"
StartIcon="@Icons.Material.Rounded.Image"
Label="Galleria" OnClick="@OnGallery"/>
</div>
}
<MudFab Size="Size.Small" Color="Color.Primary"
StartIcon="@Icons.Material.Rounded.Image"
Label="Galleria" OnClick="@OnGallery"/>
</div>
</DialogContent>
<DialogActions>
@if (RequireNewName)
{
<MudButton Disabled="NewName.IsNullOrEmpty()" Class="my-3" Size="Size.Small" Variant="Variant.Filled"
Color="Color.Primary"
StartIcon="@Icons.Material.Rounded.Check" OnClick="@OnNewName">
Salva
</MudButton>
}
</DialogActions>
</MudDialog>
@code {
[CascadingParameter] private IMudDialogInstance MudDialog { get; set; } = null!;
[Parameter] public bool CanAddPosition { get; set; }
private AttachedDto? Attached { get; set; }
private bool _requireNewName;
private bool RequireNewName
{
get => _requireNewName;
set
{
_requireNewName = value;
TitleModal = _requireNewName ? "Nome allegato" : "Aggiungi allegati";
StateHasChanged();
}
}
private string TitleModal { get; set; } = "Aggiungi allegati";
private string? _newName;
private string? NewName
{
get => _newName;
set
{
_newName = value;
StateHasChanged();
}
}
private List<AttachedDto>? Attached { get; set; }
protected override void OnInitialized()
{
RequireNewName = false;
Snackbar.Configuration.PositionClass = Defaults.Classes.Position.TopCenter;
}
private async Task OnCamera()
{
Attached = await AttachedService.SelectImageFromCamera();
if (Attached != null)
var selectImageFromCamera = await AttachedService.SelectImageFromCamera();
if (selectImageFromCamera != null)
{
RequireNewName = true;
StateHasChanged();
Attached ??= [];
Attached.Add(selectImageFromCamera);
MudDialog.Close(Attached);
}
}
private async Task OnGallery()
{
Attached = await AttachedService.SelectImageFromGallery();
if (Attached != null)
{
RequireNewName = true;
StateHasChanged();
}
if (Attached != null) MudDialog.Close(Attached);
}
private void OnNewName()
{
if (Attached != null)
{
switch (Attached.Type)
{
case AttachedDto.TypeAttached.Image:
{
var extension = Path.GetExtension(Attached.Name);
Attached.Name = NewName! + extension;
break;
}
default:
throw new ArgumentOutOfRangeException();
}
}
MudDialog.Close(Attached);
}
}

View File

@@ -1,135 +1,126 @@
@using SteUp.Shared.Components.Layout
@using SteUp.Shared.Components.Layout.Overlay
@using SteUp.Shared.Components.Layout.Spinner
@using SteUp.Shared.Components.SingleElements.Card.ModalForm
@using SteUp.Shared.Components.SingleElements.MessageBox
@using SteUp.Shared.Core.Dto
@using SteUp.Shared.Core.Entities
@using SteUp.Shared.Core.Interface.IntegryApi
@using SteUp.Shared.Core.Interface.System
@using SteUp.Shared.Core.Interface.System.Network
@inject INetworkService NetworkService
@inject IDialogService Dialog
@inject IIntegryApiService IntegryApiService
@inject IAttachedService AttachedService
<MudDialog Class="customDialog-form">
<DialogContent>
<HeaderLayout Cancel="true" OnCancel="@(() => MudDialog.Cancel())" LabelSave="@LabelSave"
OnSave="Save" Title="Scheda"/>
<MudForm @ref="_form">
<HeaderLayout Cancel="true" OnCancel="@Cancel" LabelSave="@LabelSave"
OnSave="Save" Title="Scheda"/>
<div class="content">
<div class="content">
<CardFormModal Title="Reparto" Loading="SteupDataService.Reparti.IsNullOrEmpty()">
<MudSelectExtended ReadOnly="IsView" T="JtbFasiDto?" Variant="Variant.Text"
@bind-Value="Scheda.Reparto" ToStringFunc="@(x => x?.Descrizione)"
@bind-Value:after="OnAfterChangeValue">
@foreach (var fasi in SteupDataService.Reparti)
{
<MudSelectItemExtended Class="custom-item-select" Value="@fasi">
@fasi.Descrizione
</MudSelectItemExtended>
}
</MudSelectExtended>
</CardFormModal>
<CardFormModal Title="Reparto" Loading="SteupDataService.Reparti.IsNullOrEmpty()">
<MudSelectExtended ReadOnly="IsView" T="JtbFasiDto?" Variant="Variant.Text"
@bind-Value="Scheda.Reparto" ToStringFunc="@(x => x?.Descrizione)"
@bind-Value:after="OnAfterChangeValue" Required="true"
RequiredError="Reparto obbligatorio">
@foreach (var fasi in SteupDataService.Reparti)
{
<MudSelectItemExtended Class="custom-item-select" Value="@fasi">
@fasi.Descrizione
</MudSelectItemExtended>
}
</MudSelectExtended>
</CardFormModal>
<CardFormModal Title="Motivo" Loading="SteupDataService.TipiAttività.IsNullOrEmpty()">
<MudSelectExtended ReadOnly="IsView" T="string?" Variant="Variant.Text"
@bind-Value="Scheda.ActivityTypeId" @bind-Value:after="OnAfterChangeValue">
@foreach (var type in SteupDataService.TipiAttività)
{
<MudSelectItemExtended Class="custom-item-select"
Value="@type.ActivityTypeId">@type.ActivityTypeId</MudSelectItemExtended>
}
</MudSelectExtended>
</CardFormModal>
<CardFormModal Title="Motivo" Loading="SteupDataService.TipiAttività.IsNullOrEmpty()">
<MudSelectExtended ReadOnly="@(IsView || Scheda.CodJfas.IsNullOrEmpty())" T="string?"
Variant="Variant.Text"
@bind-Value="Scheda.ActivityTypeId" @bind-Value:after="OnAfterChangeValue"
Required="true" RequiredError="Motivo obbligatorio">
@foreach (var type in SteupDataService.TipiAttività.Where(x => x.CodJfas.EqualsIgnoreCase(Scheda.CodJfas!)))
{
<MudSelectItemExtended Class="custom-item-select"
Value="@type.ActivityTypeId">@type.ActivityTypeId</MudSelectItemExtended>
}
</MudSelectExtended>
</CardFormModal>
@* <div class="container-chip-attached"> *@
@* @if (!AttachedList.IsNullOrEmpty()) *@
@* { *@
@* foreach (var item in AttachedList!.Select((p, index) => new { p, index })) *@
@* { *@
@* 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))"> *@
@* @item.p.Description *@
@* </MudChip> *@
@* } *@
@* else *@
@* { *@
@* <MudChip T="string" Color="Color.Default" OnClick="@(() => OpenAttached(item.p))" *@
@* OnClose="@(() => OnRemoveAttached(item.index))"> *@
@* @item.p.Name *@
@* </MudChip> *@
@* } *@
@* } *@
@* } *@
@* *@
@* @if (!IsLoading) *@
@* { *@
@* if (ActivityFileList != null) *@
@* { *@
@* foreach (var file in ActivityFileList) *@
@* { *@
@* <MudChip T="string" OnClick="@(() => OpenAttached(file.FileName))" *@
@* OnClose="@(() => DeleteAttach(file))" Color="Color.Default"> *@
@* @file.FileName *@
@* </MudChip> *@
@* } *@
@* } *@
@* } *@
@* else *@
@* { *@
@* <MudProgressLinear Color="Color.Primary" Indeterminate="true" Class="my-7"/> *@
@* } *@
@* </div> *@
@if (!AttachedList.IsNullOrEmpty())
{
<div class="container-attached">
<div class="scroll-attached">
@foreach (var item in AttachedList!.Select((p, index) => new { p, index }))
{
<MudCard>
@if (!item.p.ThumbPath.IsNullOrEmpty())
{
<MudCardMedia Image="@item.p.ThumbPath" Height="100"/>
}
<MudCardContent Class="image_card">
<MudText Typo="Typo.subtitle1"><b>@item.p.Name</b></MudText>
<MudIconButton Variant="Variant.Outlined" Icon="@Icons.Material.Rounded.Close"
Size="Size.Small" Color="Color.Error"
OnClick="@(() => OnRemoveAttached(item.index))"/>
</MudCardContent>
</MudCard>
}
</div>
</div>
}
@if (!IsView)
{
<div class="container-button">
<MudButton Class="button-settings green-icon"
FullWidth="true"
StartIcon="@Icons.Material.Rounded.AttachFile"
Size="Size.Medium"
OnClick="@OpenAddAttached"
Variant="Variant.Outlined">
Aggiungi foto
</MudButton>
</div>
}
<CardFormModal Title="Scadenza">
<MudSelectExtended FullWidth="true" ReadOnly="@IsView" T="int" Variant="Variant.Text"
@bind-Value="@Scheda.Scadenza" @bind-Value:after="OnAfterChangeValue">
<MudSelectItemExtended Class="custom-item-select" Text="24H" Value="24"/>
<MudSelectItemExtended Class="custom-item-select" Text="1 Settimana" Value="168"/>
<MudSelectItemExtended Class="custom-item-select" Text="1 Mese" Value="730"/>
<MudSelectItemExtended Class="custom-item-select" Text="2 Mesi" Value="1460"/>
</MudSelectExtended>
</CardFormModal>
<CardFormModal Title="Responsabile">
<MudTextField FullWidth="true" ReadOnly="IsView" T="string?" Variant="Variant.Text"
@bind-Value="Scheda.Responsabile" @bind-Value:after="OnAfterChangeValue"
DebounceInterval="500" OnDebounceIntervalElapsed="OnAfterChangeValue"/>
</CardFormModal>
<CardFormModal Title="Note">
<MudTextField ReadOnly="IsView" T="string?" Variant="Variant.Text" Lines="3"
@bind-Value="Scheda.Note" @bind-Value:after="OnAfterChangeValue"
DebounceInterval="500" OnDebounceIntervalElapsed="OnAfterChangeValue"/>
</CardFormModal>
@if (!IsView)
{
<div class="container-button">
<MudButton Class="button-settings green-icon"
<MudButton Class="button-settings blue-icon"
FullWidth="true"
StartIcon="@Icons.Material.Rounded.AttachFile"
StartIcon="@Icons.Material.Rounded.Description"
Size="Size.Medium"
OnClick="@OpenAddAttached"
OnClick="@SuggestActivityDescription"
Variant="Variant.Outlined">
Aggiungi foto
Suggerisci note descrittive
</MudButton>
</div>
}
<CardFormModal Title="Scadenza">
<MudSelectExtended FullWidth="true" ReadOnly="@IsView" T="int" Variant="Variant.Text"
@bind-Value="@Scheda.Scadenza" @bind-Value:after="OnAfterChangeValue">
<MudSelectItemExtended Class="custom-item-select" Text="24H" Value="24"/>
<MudSelectItemExtended Class="custom-item-select" Text="1 Settimana" Value="168"/>
<MudSelectItemExtended Class="custom-item-select" Text="1 Mese" Value="730"/>
<MudSelectItemExtended Class="custom-item-select" Text="2 Mesi" Value="1460"/>
</MudSelectExtended>
</CardFormModal>
<CardFormModal Title="Responsabile">
<MudTextField FullWidth="true" ReadOnly="IsView" T="string?" Variant="Variant.Text"
@bind-Value="Scheda.Responsabile" @bind-Value:after="OnAfterChangeValue"
DebounceInterval="500" OnDebounceIntervalElapsed="OnAfterChangeValue"/>
</CardFormModal>
<CardFormModal Title="Note">
<MudTextField ReadOnly="IsView" T="string?" Variant="Variant.Text" Lines="3"
@bind-Value="Scheda.Note" @bind-Value:after="OnAfterChangeValue"
DebounceInterval="500" OnDebounceIntervalElapsed="OnAfterChangeValue"/>
</CardFormModal>
<div class="container-button">
<MudButton Class="button-settings blue-icon"
FullWidth="true"
StartIcon="@Icons.Material.Rounded.Description"
Size="Size.Medium"
OnClick="@SuggestActivityDescription"
Variant="Variant.Outlined">
Suggerisci note descrittive
</MudButton>
</div>
</div>
</MudForm>
<ConfirmUpdateActivity @ref="_confirmUpdateMessage"/>
</DialogContent>
</MudDialog>
@@ -148,10 +139,17 @@
private bool VisibleOverlay { get; set; }
private bool SuccessAnimation { get; set; }
private string? LabelSave { get; set; }
private ConfirmUpdateActivity _confirmUpdateMessage = null!;
private MudForm _form = null!;
protected override async Task OnInitializedAsync()
private string? LabelSave { get; set; }
private bool IsDirty { get; set; }
private Scheda _originalScheda = null!;
private List<AttachedDto>? AttachedList { get; set; }
protected override void OnInitialized()
{
_originalScheda = Scheda.Clone();
Snackbar.Configuration.PositionClass = Defaults.Classes.Position.TopCenter;
}
@@ -159,30 +157,129 @@
{
}
private async Task OpenAddAttached()
private async Task Cancel()
{
var result = await ModalHelper.OpenAddAttached(Dialog);
// if (result is { Canceled: false, Data: not null } && result.Data.GetType() == typeof(AttachedDTO))
// {
// var attached = (AttachedDTO)result.Data;
//
// if (attached.Type == AttachedDTO.TypeAttached.Position)
// CanAddPosition = false;
//
// AttachedList ??= [];
// AttachedList.Add(attached);
// }
if (await CheckSavePreAction())
{
await AttachedService.CleanTempStorageAsync();
MudDialog.Cancel();
}
}
#region Form
private void OnAfterChangeValue()
{
if (!IsNew)
LabelSave = "Aggiorna";
RecalcDirty();
StateHasChanged();
}
private void RecalcDirty()
{
IsDirty = !ValueComparer.AreEqual(Scheda, _originalScheda);
if (IsDirty) LabelSave = !IsNew ? "Aggiorna" : "Salva";
else LabelSave = null;
}
private static class ValueComparer
{
public static bool AreEqual(Scheda? a, Scheda? b)
{
if (a is null || b is null) return a == b;
return
a.CodJfas == b.CodJfas &&
a.DescrizioneReparto == b.DescrizioneReparto &&
a.ActivityTypeId == b.ActivityTypeId &&
a.Note == b.Note &&
a.Responsabile == b.Responsabile &&
a.Scadenza == b.Scadenza;
}
}
private async Task<bool> CheckSavePreAction()
{
if (!IsDirty) return true;
var resul = await _confirmUpdateMessage.ShowAsync();
if (resul is not true) return true;
VisibleOverlay = true;
StateHasChanged();
await Submit();
VisibleOverlay = false;
StateHasChanged();
return false;
}
private async Task Submit()
{
await _form.Validate();
if (_form.IsValid) await Save();
}
#endregion
#region File
private async Task OpenAddAttached()
{
var result = await ModalHelper.OpenAddAttached(Dialog);
if (result is not { Canceled: false, Data: List<AttachedDto> attachedList }) return;
VisibleOverlay = true;
await InvokeAsync(StateHasChanged);
await Task.Yield();
// prepara placeholder in UI subito (così vedi le card con spinner)
AttachedList ??= [];
foreach (var a in attachedList)
AttachedList.Add(new AttachedDto { Name = a.Name, MimeType = a.MimeType, FileBytes = a.FileBytes });
await InvokeAsync(StateHasChanged);
// Processa in background e aggiorna UI man mano (o a blocchi)
_ = Task.Run(async () =>
{
for (var i = 0; i < attachedList.Count; i++)
{
var a = attachedList[i];
if (a.FileBytes is null || a.Name is null) continue;
var (origUrl, thumbUrl) = await AttachedService.SaveAndCreateThumbAsync(a.FileBytes, a.Name);
await InvokeAsync(() =>
{
var target = AttachedList![AttachedList.Count - attachedList.Count + i];
target.TempPath = origUrl;
target.ThumbPath = thumbUrl;
StateHasChanged();
});
}
await InvokeAsync(() =>
{
VisibleOverlay = false;
StateHasChanged();
});
});
}
private void OnRemoveAttached(int index)
{
if (AttachedList is null || index < 0 || index >= AttachedList.Count)
return;
AttachedList.RemoveAt(index);
StateHasChanged();
}
#endregion
private void SuggestActivityDescription()
{
if (Scheda.ActivityTypeId == null)

View File

@@ -1,6 +1,21 @@
.container-chip-attached {
.container-attached {
width: 100%;
margin-bottom: 1rem;
}
.scroll-attached {
max-height: 185px;
overflow: auto;
display: flex;
gap: 1rem;
flex-direction: column;
padding: .5rem;
}
.container-attached ::deep .image_card {
display: flex;
align-items: center;
justify-content: space-between;
padding: 14px;
}
.container-button {

View File

@@ -11,5 +11,5 @@ public interface ISteupDataService
List<PuntoVenditaDto> PuntiVenditaList { get; }
InspectionPageState InspectionPageState { get; set; }
List<JtbFasiDto> Reparti { get; }
List<StbActivityTypeDto> TipiAttività { get; }
List<ActivityTypeDto> TipiAttività { get; }
}

View File

@@ -42,5 +42,5 @@ public class SteupDataService(
public InspectionPageState InspectionPageState { get; set; } = new();
public List<PuntoVenditaDto> PuntiVenditaList { get; private set; } = [];
public List<JtbFasiDto> Reparti { get; private set; } = [];
public List<StbActivityTypeDto> TipiAttività { get; private set; } = [];
public List<ActivityTypeDto> TipiAttività { get; private set; } = [];
}

View File

@@ -0,0 +1,12 @@
using System.Text.Json.Serialization;
namespace SteUp.Shared.Core.Dto;
public class ActivityTypeDto
{
[JsonPropertyName("activityTypeId")]
public string ActivityTypeId { get; set; } = string.Empty;
[JsonPropertyName("codJfas")]
public string CodJfas { get; set; } = string.Empty;
}

View File

@@ -10,6 +10,9 @@ public class AttachedDto
public string? Path { get; set; }
public byte[]? FileBytes { get; set; }
public string? TempPath { get; set; }
public string? ThumbPath { get; set; }
public Stream? FileContent =>
FileBytes is null ? null : new MemoryStream(FileBytes);

View File

@@ -1,9 +0,0 @@
using System.Text.Json.Serialization;
namespace SteUp.Shared.Core.Dto;
public class StbActivityTypeDto
{
[JsonPropertyName("activityTypeId")]
public string? ActivityTypeId { get; set; }
}

View File

@@ -0,0 +1,9 @@
namespace SteUp.Shared.Core.Entities;
public class EntityBase<T>
{
public T Clone()
{
return (T)MemberwiseClone();
}
}

View File

@@ -3,7 +3,7 @@ using SteUp.Shared.Core.Enum;
namespace SteUp.Shared.Core.Entities;
public class Ispezione
public class Ispezione : EntityBase<Ispezione>
{
[Required]
public string CodMdep { get; set; } = string.Empty;

View File

@@ -4,7 +4,7 @@ using SteUp.Shared.Core.Dto;
namespace SteUp.Shared.Core.Entities;
public class Scheda
public class Scheda : EntityBase<Scheda>
{
[Key]
public int Id { get; set; }
@@ -28,24 +28,24 @@ public class Scheda
{
get
{
if (_reparto == null && CodJfas != null)
if (field == null && CodJfas != null)
{
_reparto = new JtbFasiDto
field = new JtbFasiDto
{
CodJfas = CodJfas,
Descrizione = DescrizioneReparto
};
}
return _reparto;
return field;
}
set
{
_reparto = value;
field = value;
if (value == null) return;
CodJfas = value.CodJfas;
DescrizioneReparto = value.Descrizione;
}
}
private JtbFasiDto? _reparto;
}

View File

@@ -4,7 +4,7 @@ using SteUp.Shared.Core.Dto;
namespace SteUp.Shared.Core.Helpers;
public class ModalHelper
public abstract class ModalHelper
{
public static async Task<DialogResult?> OpenSelectShop(IDialogService dialog)
{

View File

@@ -7,5 +7,5 @@ public interface IIntegrySteupService
//Retrieve
Task<List<PuntoVenditaDto>> RetrievePuntiVendita();
Task<List<JtbFasiDto>> RetrieveReparti();
Task<List<StbActivityTypeDto>> RetrieveActivityType();
Task<List<ActivityTypeDto>> RetrieveActivityType();
}

View File

@@ -5,8 +5,11 @@ namespace SteUp.Shared.Core.Interface.System;
public interface IAttachedService
{
Task<AttachedDto?> SelectImageFromCamera();
Task<AttachedDto?> SelectImageFromGallery();
Task<List<AttachedDto>?> SelectImageFromGallery();
Task<string> SaveToTempStorage(Stream file, string fileName, CancellationToken ct = default);
Task CleanTempStorageAsync(CancellationToken ct = default);
Task OpenFile(string fileName, string filePath);
Task<(string originalUrl, string thumbUrl)> SaveAndCreateThumbAsync(byte[] bytes, string fileName, CancellationToken ct = default);
}

View File

@@ -16,8 +16,8 @@ public class IntegrySteupService(IIntegryApiRestClient integryApiRestClient) : I
public Task<List<JtbFasiDto>> RetrieveReparti() =>
integryApiRestClient.AuthorizedGet<List<JtbFasiDto>>($"{BaseRequest}/retrieveReparti")!;
public Task<List<StbActivityTypeDto>> RetrieveActivityType() =>
integryApiRestClient.AuthorizedGet<List<StbActivityTypeDto>>($"{BaseRequest}/retrieveActivityType")!;
public Task<List<ActivityTypeDto>> RetrieveActivityType() =>
integryApiRestClient.AuthorizedGet<List<ActivityTypeDto>>($"{BaseRequest}/retrieveActivityType")!;
#endregion
}

View File

@@ -21,7 +21,10 @@
height: calc(100vh - (.6rem + 40px));
overflow: auto;
gap: 1.5rem;
padding: 0 .75rem 2rem 75rem !important;
padding-top: unset !important;
padding-bottom: 2rem !important;
padding-left: .75rem !important;
padding-right: .75rem !important;
}
@supports (-webkit-touch-callout: none) {