Compare commits

..

2 Commits

14 changed files with 255 additions and 150 deletions

View File

@@ -1,4 +1,5 @@
using Microsoft.EntityFrameworkCore;
using System.Linq.Expressions;
using Microsoft.EntityFrameworkCore;
using SteUp.Shared.Core.Entities;
using SteUp.Shared.Core.Enum;
using SteUp.Shared.Core.Helpers;
@@ -17,6 +18,11 @@ public class IspezioniService(AppDbContext db) : IIspezioniService
x.Data == data &&
x.Rilevatore == rilevatore);
public Task<List<Ispezione>> GetAllIspezioni() =>
db.Ispezioni
.AsNoTracking()
.ToListAsync();
public Task<List<Ispezione>> GetAllIspezioniWithSchedeAsync() =>
db.Ispezioni
.Include(x => x.Schede)
@@ -68,7 +74,8 @@ public class IspezioniService(AppDbContext db) : IIspezioniService
return true;
}
public async Task<bool> UpdateStatoIspezioneAsync(string codMdep, DateTime data, string rilevatore, StatusEnum stato)
public async Task<bool> UpdateStatoIspezioneAsync(string codMdep, DateTime data, string rilevatore,
StatusEnum stato)
{
var ispezione = await db.Ispezioni
.FirstOrDefaultAsync(x =>

View File

@@ -1,7 +1,5 @@
@using CommunityToolkit.Mvvm.Messaging
@using SteUp.Shared.Core.Entities
@using SteUp.Shared.Core.Interface.IntegryApi
@using SteUp.Shared.Core.Interface.System.Network
@using SteUp.Shared.Components.SingleElements.MessageBox
@using SteUp.Shared.Core.Messages.Ispezione
@using SteUp.Shared.Core.Messages.Scheda
@inject INetworkService NetworkService
@@ -40,18 +38,18 @@
Size="Size.Medium" IconSize="Size.Medium">
@if (SchedaVisible)
{
<MudFabMenuItem Disabled="!NetworkService.IsNetworkAvailable()" OnClick="@NewScheda"
Label="Nuova scheda" Color="Color.Surface"/>
if (ShowCompleteInspection)
{
<MudFabMenuItem Disabled="!NetworkService.IsNetworkAvailable()" OnClick="@CompleteInspection"
Label="Concludi ispezione" Color="Color.Surface"/>
}
<MudFabMenuItem Disabled="!NetworkService.IsNetworkAvailable()" OnClick="@NewScheda"
Label="Nuova scheda" Color="Color.Surface"/>
}
else
{
<MudFabMenuItem Disabled="!NetworkService.IsNetworkAvailable()" OnClick="@NewActivity"
<MudFabMenuItem Disabled="!NetworkService.IsNetworkAvailable()" OnClick="@NewInspection"
Label="Nuova ispezione" Color="Color.Surface"/>
}
</MudFabMenu>
@@ -59,6 +57,9 @@
</nav>
</div>
<ConfirmMessageBox @ref="_messageBox" NoText="No" YesText="Si" YesColor="Color.Primary"
Message="Completando l'ispezione non sarà più possibile editarla o aggiungere ulteriori segnalazioni. Procedere?"/>
@code
{
private bool IsVisible { get; set; } = true;
@@ -66,6 +67,8 @@
private bool ShowCompleteInspection { get; set; }
private bool SchedaVisible { get; set; }
private ConfirmMessageBox _messageBox = null!;
protected override Task OnInitializedAsync()
{
NavigationManager.LocationChanged += (_, args) =>
@@ -87,18 +90,30 @@
return Task.CompletedTask;
}
private void NewActivity()
private async Task NewInspection()
{
_ = ModalHelper.OpenSelectShop(Dialog);
if (await SteupDataService.CanOpenNewInspection())
{
_ = Dialog.OpenSelectShop();
}
else
{
await Dialog.ShowWarning("Per aprire una nuova ispezione è necessario concludere prima tutte le ispezioni aperte più vecchie di 20 giorni!");
}
}
private void CompleteInspection() =>
private async Task CompleteInspection()
{
var result = await _messageBox.ShowAsync();
if (result is true)
Messenger.Send(new CompleteInspectionMessage());
}
private async Task NewScheda()
{
var ispezione = SteupDataService.InspectionPageState.Ispezione;
var modal = await ModalHelper.OpenFormScheda(Dialog, ispezione.CodMdep, ispezione.Data, true);
var modal = await Dialog.OpenFormScheda(ispezione.CodMdep, ispezione.Data, true);
if (modal is { Canceled: false })
Messenger.Send(new NewSchedaMessage());

View File

@@ -173,8 +173,7 @@
private async Task CreateNewScheda(JtbFasiDto jtbFasi)
{
var modal = await ModalHelper.OpenFormScheda(
Dialog,
var modal = await Dialog.OpenFormScheda(
SteupDataService.InspectionPageState.Ispezione.CodMdep,
SteupDataService.InspectionPageState.Ispezione.Data,
true,
@@ -244,7 +243,7 @@
{
if (errorMessage == null) return;
_ = ModalHelper.ShowError(Dialog, errorMessage);
_ = Dialog.ShowError(errorMessage);
}
void IDisposable.Dispose()

View File

@@ -49,7 +49,8 @@
</div>
<SpinnerOverlay VisibleOverlay="VisibleOverlay"/>
<ConfirmDeleteMessageBox @ref="_deleteMessageBox" Message="Confermi la cancellazione della scheda corrente?"/>
<ConfirmMessageBox @ref="_messageBox" YesText="Cancella" YesColor="Color.Error"
Message="Confermi la cancellazione della scheda corrente?"/>
@code{
[Parameter] public string CodMdep { get; set; } = string.Empty;
@@ -60,22 +61,31 @@
private bool VisibleOverlay { get; set; }
private ConfirmDeleteMessageBox _deleteMessageBox = null!;
private ConfirmMessageBox _messageBox = null!;
private async Task UpdateScheda()
{
var modal = await ModalHelper.OpenFormScheda(Dialog, CodMdep, Data, false, Scheda);
var modal = await Dialog.OpenFormScheda(CodMdep, Data, false, Scheda);
if (modal is { Canceled: false, Data: Scheda scheda }) await OnSchedaModified.InvokeAsync(scheda);
}
private async Task DeleteScheda()
{
var result = await _deleteMessageBox.ShowAsync();
var result = await _messageBox.ShowAsync();
if (result is true)
{
VisibleOverlay = true;
StateHasChanged();
if (Scheda.ActivityId != null)
await IntegrySteupService.DeleteScheda(Scheda.ActivityId);
var deleteScheda = await IspezioniService.DeleteSchedaAsync(Scheda.Id);
if (deleteScheda) await OnSchedaDeleted.InvokeAsync(Scheda);
VisibleOverlay = false;
StateHasChanged();
}
}

View File

@@ -1,10 +1,10 @@
<MudMessageBox @ref="_confirmDelete" Title="Attenzione!" CancelText="Annulla">
<MudMessageBox @ref="_confirmDelete" Title="Attenzione!" CancelText="@NoText">
<MessageContent>
@Message
</MessageContent>
<YesButton>
<MudButton Size="Size.Small" Variant="Variant.Filled" Color="Color.Error">
Cancella
<MudButton Size="Size.Small" Variant="Variant.Filled" Color="YesColor">
@YesText
</MudButton>
</YesButton>
</MudMessageBox>
@@ -12,6 +12,9 @@
@code
{
[Parameter] public string Message { get; set; } = string.Empty;
[Parameter] public string YesText { get; set; } = string.Empty;
[Parameter] public string NoText { get; set; } = "Annulla";
[Parameter] public Color YesColor { get; set; } = Color.Primary;
private MudMessageBox? _confirmDelete;

View File

@@ -1,9 +1,19 @@
<MudDialog OnBackdropClick="Cancel">
<DialogContent>
@if (IsWarning)
{
<div class="exception-header mb-2">
<i class="ri-error-warning-line"></i>
<span>Attenzione</span>
</div>
}
else
{
<div class="exception-header mb-2">
<i class="ri-emotion-unhappy-line"></i>
<span>Ops</span>
</div>
}
<div class="text">
<code>@ErrorMessage</code>
</div>
@@ -18,6 +28,7 @@
@code {
[CascadingParameter] private IMudDialogInstance MudDialog { get; set; } = null!;
[Parameter] public string ErrorMessage { get; set; } = string.Empty;
[Parameter] public bool IsWarning { get; set; }
private void Cancel() => MudDialog.Cancel();
}

View File

@@ -8,9 +8,16 @@
.exception-header > i {
font-size: 3rem;
line-height: normal;
}
.error-icon {
color: var(--bs-danger);
}
.warning-icon {
color: var(--bs-warning);
}
.exception-header > span {
font-size: x-large;
font-weight: 700;

View File

@@ -285,7 +285,7 @@
{
Console.WriteLine(e.Message);
await ModalHelper.ShowError(Dialog, e.Message);
await Dialog.ShowError(e.Message);
}
if (IsNew) await NewSave(apiResponse);
@@ -474,7 +474,7 @@
private async Task OpenAddAttached()
{
var result = await ModalHelper.OpenAddAttached(Dialog);
var result = await Dialog.OpenAddAttached();
if (result is not { Canceled: false, Data: List<AttachedDto> attachedList }) return;
OnLoading = true;
@@ -561,7 +561,7 @@
return;
}
var modal = await ModalHelper.OpenSelectArt(Dialog, articoli);
var modal = await Dialog.OpenSelectArt(articoli);
await InvokeAsync(() =>
{
@@ -614,7 +614,7 @@
{
var activityDescriptions = await IntegryApiService.SuggestActivityDescription(Scheda.ActivityTypeId);
var modal = await ModalHelper.OpenSuggestActivityDescription(Dialog, activityDescriptions);
var modal = await Dialog.OpenSuggestActivityDescription(activityDescriptions);
if (modal is { Canceled: false, Data: not null })
Scheda.Note = modal.Data!.ToString();
@@ -694,7 +694,7 @@
{
if (errorMessage == null) return;
_ = ModalHelper.ShowError(Dialog, errorMessage);
_ = Dialog.ShowError(errorMessage);
}
private void RemoveArt(string barcode)

View File

@@ -6,6 +6,7 @@ namespace SteUp.Shared.Core.Data.Contracts;
public interface ISteupDataService
{
Task Init();
Task<bool> CanOpenNewInspection();
void RegisterAppVersion();
List<PuntoVenditaDto> PuntiVenditaList { get; }

View File

@@ -3,11 +3,11 @@ using IntegryApiClient.Core.Domain.Abstraction.Contracts.Device;
using SteUp.Shared.Core.Data.Contracts;
using SteUp.Shared.Core.Dto;
using SteUp.Shared.Core.Dto.PageState;
using SteUp.Shared.Core.Enum;
using SteUp.Shared.Core.Helpers;
using SteUp.Shared.Core.Interface.IntegryApi;
using SteUp.Shared.Core.Interface.LocalDb;
using SteUp.Shared.Core.Interface.System;
using SteUp.Shared.Core.Interface.System.Network;
namespace SteUp.Shared.Core.Data;
@@ -76,6 +76,20 @@ public class SteupDataService(
}
}
public async Task<bool> CanOpenNewInspection()
{
var completedInspection = await ispezioniService.GetAllIspezioni();
if (completedInspection.IsNullOrEmpty()) return true;
//Controllo se sono presenti attività più vecchie di 20 giorni non chiuse
//Se presenti non si possono aprire nuove ispezioni
return !completedInspection.Any(x =>
x.Stato != StatusEnum.Completata &&
x.Data < DateTime.Now.AddDays(-20)
);
}
private async Task LoadDataAsync()
{
if (!await userSession.IsLoggedIn()) return;

View File

@@ -6,9 +6,11 @@ using SteUp.Shared.Core.Entities;
namespace SteUp.Shared.Core.Helpers;
public abstract class ModalHelper
public static class ModalHelper
{
public static async Task<DialogResult?> OpenSelectShop(IDialogService dialog)
extension(IDialogService dialog)
{
public async Task<DialogResult?> OpenSelectShop()
{
var modal = await dialog.ShowAsync<ModalSelectShop>(
"ModalSelectShop",
@@ -25,7 +27,7 @@ public abstract class ModalHelper
return await modal.Result;
}
public static async Task<DialogResult?> OpenFormScheda(IDialogService dialog, string codMdep, DateTime data,
public async Task<DialogResult?> OpenFormScheda(string codMdep, DateTime data,
bool isNew = false, Scheda? scheda = null)
{
scheda = isNew && scheda == null ? new Scheda() : scheda;
@@ -50,7 +52,7 @@ public abstract class ModalHelper
return await modal.Result;
}
public static async Task<DialogResult?> OpenAddAttached(IDialogService dialog)
public async Task<DialogResult?> OpenAddAttached()
{
var modal = await dialog.ShowAsync<ModalAddAttached>(
"Add attached",
@@ -67,8 +69,7 @@ public abstract class ModalHelper
return await modal.Result;
}
public static async Task<DialogResult?> OpenSuggestActivityDescription(IDialogService dialog,
List<StbActivityTyperDto>? activityTypers)
public async Task<DialogResult?> OpenSuggestActivityDescription(List<StbActivityTyperDto>? activityTypers)
{
var modal = await dialog.ShowAsync<ModalSuggestDescription>(
"Suggest activity description",
@@ -88,7 +89,7 @@ public abstract class ModalHelper
return await modal.Result;
}
public static async Task<DialogResult?> OpenSelectArt(IDialogService dialog, List<ArticoliInGrigliaDto>? articoli)
public async Task<DialogResult?> OpenSelectArt(List<ArticoliInGrigliaDto>? articoli)
{
var modal = await dialog.ShowAsync<ModalSelectArt>(
"ModalSelectArt",
@@ -110,7 +111,7 @@ public abstract class ModalHelper
return await modal.Result;
}
public static async Task ShowError(IDialogService dialog, string message)
public async Task ShowError(string message)
{
var modal = await dialog.ShowAsync<ModalError>(
"ModalError",
@@ -131,4 +132,28 @@ public abstract class ModalHelper
await modal.Result;
}
public async Task ShowWarning(string message)
{
var modal = await dialog.ShowAsync<ModalError>(
"ModalError",
new DialogParameters<ModalError>
{
{ x => x.ErrorMessage, message },
{ x => x.IsWarning, true }
},
new DialogOptions
{
FullScreen = false,
CloseButton = false,
NoHeader = true,
BackdropClick = true,
FullWidth = true,
MaxWidth = MaxWidth.ExtraLarge
}
);
await modal.Result;
}
}
}

View File

@@ -17,4 +17,6 @@ public interface IIntegrySteupService
Task<SaveSchedaResponseDto?> SaveMultipleSchede(List<SaveRequestDto> request);
Task CompleteInspection(string activityId);
Task UploadFile(string activityId, byte[] file, string fileName);
Task DeleteScheda(string activityId);
}

View File

@@ -1,4 +1,5 @@
using SteUp.Shared.Core.Entities;
using System.Linq.Expressions;
using SteUp.Shared.Core.Entities;
using SteUp.Shared.Core.Enum;
namespace SteUp.Shared.Core.Interface.LocalDb;
@@ -7,6 +8,7 @@ public interface IIspezioniService
{
// ISPEZIONI
Task<Ispezione?> GetIspezioneAsync(string codMdep, DateTime data, string rilevatore);
Task<List<Ispezione>> GetAllIspezioni();
Task<List<Ispezione>> GetAllIspezioniWithSchedeAsync();
Task AddIspezioneAsync(Ispezione ispezione);
Task<Ispezione> GetOrCreateIspezioneAsync(string codMdep, DateTime data, string rilevatore);

View File

@@ -67,4 +67,13 @@ public class IntegrySteupService(IIntegryApiRestClient integryApiRestClient) : I
return integryApiRestClient.Post<object>($"{BaseRequest}/uploadAttachment", content, queryParams!);
}
public Task DeleteScheda(string activityId) =>
integryApiRestClient.AuthorizedGet<object>(
$"{BaseRequest}/deleteScheda",
new Dictionary<string, object>
{
{ "activityId", activityId }
}
);
}