Files
Fixiy/Fixiy.Shared/Components/SingleElements/ChiusuraModal.razor
T

259 lines
12 KiB
Plaintext

<MudDialog Visible="@(Attivita is not null && Visible)" VisibleChanged="OnVisibleChanged"
Options="BottomSheetOptions" Class="bottom-sheet">
<TitleContent>
@if (Attivita is not null)
{
<div class="sheet-grabber"></div>
<div class="sheet-header">
<span class="sheet-title">
<MudIcon Icon="@Icons.Material.Outlined.Build" Size="Size.Small" />
@Attivita.PuntoVendita
</span>
<MudIconButton Icon="@Icons.Material.Filled.Close" Size="Size.Small"
Class="sheet-close" OnClick="Annulla" />
</div>
}
</TitleContent>
<DialogContent>
@if (Attivita is not null)
{
<div class="tab-bar">
<button class="tab-btn @(_tab == "chiudi" ? "active" : "")" @onclick='() => _tab = "chiudi"'>
<MudIcon Icon="@Icons.Material.Filled.CheckCircle" Size="Size.Small" /> Chiudi
</button>
<button class="tab-btn @(_tab == "rimanda" ? "active" : "")" @onclick='() => _tab = "rimanda"'>
<MudIcon Icon="@Icons.Material.Filled.Schedule" Size="Size.Small" /> Rimanda
</button>
</div>
<div class="sheet-body">
@if (_tab == "chiudi")
{
<div class="form-row">
<MudTimePicker Label="Ora ingresso" @bind-Time="_oraIngresso"
Variant="Variant.Outlined" Margin="Margin.Dense" />
<MudTimePicker Label="Ora fine lavori" @bind-Time="_oraFine"
Variant="Variant.Outlined" Margin="Margin.Dense" />
</div>
<div class="form-group">
<MudText Typo="Typo.caption" Class="form-label">Operatori</MudText>
<div class="operatori-list">
@for (int i = 0; i < _operatori.Count; i++)
{
int idx = i;
<div class="operatore-row">
<MudTextField T="string" Value="_operatori[idx]"
ValueChanged="v => _operatori[idx] = v"
Placeholder="Nome operatore"
Variant="Variant.Outlined" Margin="Margin.Dense" />
@if (_operatori.Count > 1)
{
<MudIconButton Icon="@Icons.Material.Filled.Remove"
Color="Color.Error" Size="Size.Small"
OnClick="() => _operatori.RemoveAt(idx)" />
}
</div>
}
<MudButton StartIcon="@Icons.Material.Filled.Add" Variant="Variant.Text"
Color="Color.Primary" Size="Size.Small"
OnClick="() => _operatori.Add(string.Empty)">
Aggiungi operatore
</MudButton>
</div>
</div>
<MudTextField T="string" Label="Descrizione intervento"
@bind-Value="_descrizioneIntervento"
Lines="3" Placeholder="Descrivi l intervento eseguito..."
Variant="Variant.Outlined" Margin="Margin.Dense"
Required="true"
Error="@(_validato && string.IsNullOrWhiteSpace(_descrizioneIntervento))"
ErrorText="Campo obbligatorio" />
<div class="form-group">
<MudText Typo="Typo.caption" Class="form-label">
Firma Capo Negozio <span class="required">*</span>
</MudText>
<SignaturePad OnFirmaCambiata="f => _firma = f" />
@if (_validato && string.IsNullOrWhiteSpace(_firma))
{
<MudText Typo="Typo.caption" Color="Color.Error">Firma obbligatoria</MudText>
}
</div>
<div class="form-group">
<MudText Typo="Typo.caption" Class="form-label">Foto lavoro svolto</MudText>
<InputFile class="form-input-file" accept="image/*" multiple
OnChange="OnFotoChiusura" />
@if (_fotoNomi.Any())
{
<div class="foto-preview-list">
@foreach (var nome in _fotoNomi)
{
<MudChip T="string" Icon="@Icons.Material.Outlined.Image"
Size="Size.Small" Color="Color.Primary">@nome</MudChip>
}
</div>
}
<MudTextField T="string" Label="Commento foto (opzionale)"
@bind-Value="_commentoFoto" Lines="2"
Variant="Variant.Outlined" Margin="Margin.Dense"
Class="mt-2" />
</div>
<MudButton FullWidth="true" Variant="Variant.Filled" Color="Color.Primary"
Size="Size.Large" StartIcon="@Icons.Material.Filled.CheckCircleOutline"
OnClick="ConfermaChiusura">
Chiudi Attivita
</MudButton>
}
else
{
<MudTextField T="string" Label="Motivo del rimando"
@bind-Value="_motivoRimando" Lines="3"
Placeholder="Es. Non di competenza ufficio tecnico..."
Variant="Variant.Outlined" Margin="Margin.Dense"
Required="true"
Error="@(_validato && string.IsNullOrWhiteSpace(_motivoRimando))"
ErrorText="Campo obbligatorio" />
<MudSelect T="string" Label="Azienda terza (se di competenza)"
@bind-Value="_aziendaTerza"
Variant="Variant.Outlined" Margin="Margin.Dense">
<MudSelectItem T="string" Value='""'>Nessuna</MudSelectItem>
@foreach (var az in _aziendeTerme)
{
<MudSelectItem T="string" Value="@az">@az</MudSelectItem>
}
</MudSelect>
@if (_aziendaTerza == "Altro")
{
<MudTextField T="string" Label="Specifica azienda"
@bind-Value="_aziendaAltra"
Variant="Variant.Outlined" Margin="Margin.Dense" />
}
<div class="form-group">
<MudText Typo="Typo.caption" Class="form-label">
Foto KO <span class="required">*</span>
</MudText>
<InputFile class="form-input-file" accept="image/*" multiple
OnChange="OnFotoRimando" />
@if (_fotoRimandoNomi.Any())
{
<div class="foto-preview-list">
@foreach (var nome in _fotoRimandoNomi)
{
<MudChip T="string" Icon="@Icons.Material.Outlined.Image"
Size="Size.Small" Color="Color.Warning">@nome</MudChip>
}
</div>
}
@if (_validato && !_fotoRimandoNomi.Any())
{
<MudText Typo="Typo.caption" Color="Color.Error">Almeno una foto e obbligatoria</MudText>
}
</div>
<MudButton FullWidth="true" Variant="Variant.Filled" Color="Color.Warning"
Size="Size.Large" StartIcon="@Icons.Material.Filled.ArrowForward"
OnClick="ConfermaRimando">
Rimanda Attivita
</MudButton>
}
</div>
}
</DialogContent>
</MudDialog>
@code {
[Parameter] public AttivitaItem? Attivita { get; set; }
[Parameter] public bool Visible { get; set; }
[Parameter] public EventCallback OnClosed { get; set; }
[Parameter] public EventCallback<(AttivitaItem, StatoAttivita)> OnConferma { get; set; }
string _tab = "chiudi";
bool _validato;
static readonly DialogOptions BottomSheetOptions = new()
{
Position = DialogPosition.BottomCenter,
FullWidth = true,
MaxWidth = MaxWidth.Medium,
CloseButton = false,
BackdropClick = true,
CloseOnEscapeKey = true
};
async Task OnVisibleChanged(bool visible)
{
if (!visible)
await Annulla();
}
TimeSpan? _oraIngresso = DateTime.Now.TimeOfDay;
TimeSpan? _oraFine = DateTime.Now.TimeOfDay;
List<string> _operatori = ["Marco Esposito"];
string _descrizioneIntervento = string.Empty;
string _firma = string.Empty;
string _commentoFoto = string.Empty;
List<string> _fotoNomi = [];
string _motivoRimando = string.Empty;
string _aziendaTerza = string.Empty;
string _aziendaAltra = string.Empty;
List<string> _fotoRimandoNomi = [];
readonly List<string> _aziendeTerme = ["Arneg", "Desich", "Idracol", "Carrier", "Danfoss", "Alfa Laval", "Altro"];
void OnFotoChiusura(InputFileChangeEventArgs e) =>
_fotoNomi = e.GetMultipleFiles().Select(f => f.Name).ToList();
void OnFotoRimando(InputFileChangeEventArgs e) =>
_fotoRimandoNomi = e.GetMultipleFiles().Select(f => f.Name).ToList();
async Task ConfermaChiusura()
{
_validato = true;
if (string.IsNullOrWhiteSpace(_descrizioneIntervento) || string.IsNullOrWhiteSpace(_firma))
return;
if (Attivita is not null)
await OnConferma.InvokeAsync((Attivita, StatoAttivita.Chiusa));
Reset();
}
async Task ConfermaRimando()
{
_validato = true;
if (string.IsNullOrWhiteSpace(_motivoRimando) || !_fotoRimandoNomi.Any())
return;
if (Attivita is not null)
await OnConferma.InvokeAsync((Attivita, StatoAttivita.Rimandata));
Reset();
}
Task Annulla()
{
Reset();
return OnClosed.InvokeAsync();
}
void Reset()
{
_validato = false;
_tab = "chiudi";
_descrizioneIntervento = string.Empty;
_firma = string.Empty;
_commentoFoto = string.Empty;
_fotoNomi = [];
_motivoRimando = string.Empty;
_aziendaTerza = string.Empty;
_aziendaAltra = string.Empty;
_fotoRimandoNomi = [];
_operatori = ["Marco Esposito"];
}
}