Files
StandManager/StandManager/Components/Pages/Home.razor
2025-12-15 11:01:14 +01:00

306 lines
16 KiB
Plaintext

@page "/"
@page "/Home"
@page "/{invitationId:guid}"
@layout PublicLayout
@using Microsoft.EntityFrameworkCore
@using StandManager.Components.Layout
@using StandManager.Model
@inject AuthenticationStateProvider auth
@inject BodyClassService BodyClass
@rendermode InteractiveServer
<PageTitle>Iscrizioni Evento</PageTitle>
<AuthorizeView>
<Authorized>
<header class="navbar navbar-expand-lg navbar-transparent bg-red py-3" data-bs-theme="dark">
<div class="container position-relative">
<img src="/Logo_dac.png" alt="Logo DAC" class="d-block mx-auto" style="height: 80px;" />
<div class="collapse navbar-collapse position-absolute end-0 top-50 translate-middle-y pe-3">
<nav class="navbar-nav ms-auto">
<div class="nav-item">
<a class="nav-link text-white" href="/management"><span class="nav-link-title">Management</span></a>
</div>
<div class="nav-item">
<a class="nav-link text-white" href="/scan"><span class="nav-link-title">Scansione</span></a>
</div>
</nav>
</div>
</div>
</header>
</Authorized>
<NotAuthorized>
<header class="navbar navbar-expand-lg navbar-transparent bg-red py-3" data-bs-theme="dark">
<div class="container position-relative">
<img src="/Logo_dac.png" alt="Logo DAC" class="d-block mx-auto" style="height: 80px;" />
<div class="collapse navbar-collapse position-absolute end-0 top-50 translate-middle-y pe-3">
<nav class="navbar-nav ms-auto">
<div class="nav-item">
<a class="nav-link text-white" href="/management"><span class="nav-link-title">Management</span></a>
</div>
</nav>
</div>
</div>
</header>
</NotAuthorized>
</AuthorizeView>
<div class="container my-5 py-3">
@if (invitationId.HasValue && invito != null)
{
@if (destinazioniList.Count() > 0)
{
<div class="row g-5 mb-3">
<EditForm Model="iscrizione" OnValidSubmit="onIscrizioneSave" FormName="iscrizioneForm">
<DataAnnotationsValidator />
<div class="col-12">
<div class="row">
<div class="col-6 mb-3">
<RadzenText TextStyle="TextStyle.Subtitle2" TagName="TagName.H3">Nome</RadzenText>
<RadzenTextBox Style="width: 100%" aria-label="Nome" @bind-Value="@iscrizione.Nome" />
<ValidationMessage For="@(() => iscrizione.Nome)" />
</div>
<div class="col-6 mb-3">
<RadzenText TextStyle="TextStyle.Subtitle2" TagName="TagName.H3">Cognome</RadzenText>
<RadzenTextBox Style="width: 100%" aria-label="Cognome" @bind-Value="@iscrizione.Cognome" />
<ValidationMessage For="@(() => iscrizione.Cognome)" />
</div>
</div>
<div class="row">
<div class="col-6 mb-3">
<RadzenText TextStyle="TextStyle.Subtitle2" TagName="TagName.H3">E-mail</RadzenText>
<RadzenTextBox Style="width: 100%" aria-label="Email" @bind-Value="@iscrizione.Email" />
<ValidationMessage For="@(() => iscrizione.Email)" />
</div>
<div class="col-6 mb-3">
<RadzenText TextStyle="TextStyle.Subtitle2" TagName="TagName.H3">Telefono</RadzenText>
<RadzenTextBox Style="width: 100%" aria-label="NumeroTelefono" @bind-Value="@iscrizione.NumeroTelefono" />
<ValidationMessage For="@(() => iscrizione.NumeroTelefono)" />
</div>
</div>
<div class="row">
<div class="col-4 mb-3">
<RadzenText TextStyle="TextStyle.Subtitle2" TagName="TagName.H3">Comune</RadzenText>
<RadzenDropDown @bind-Value="@iscrizione.Comune" Style="width: 100%" TextProperty="" Placeholder="Seleziona il comune"
Data="@comuneList" Size="ButtonSize.Small" />
<ValidationMessage For="@(() => iscrizione.Comune)" />
</div>
<div class="col-4 mb-3">
<RadzenText TextStyle="TextStyle.Subtitle2" TagName="TagName.H3">Cap</RadzenText>
<RadzenTextBox Style="width: 100%" aria-label="Cap" @bind-Value="@iscrizione.Cap" />
<ValidationMessage For="@(() => iscrizione.Cap)" />
</div>
<div class="col-4 mb-3">
<RadzenText TextStyle="TextStyle.Subtitle2" TagName="TagName.H3">Provincia</RadzenText>
<RadzenDropDown @bind-Value="@iscrizione.Provincia" Style="width: 100%" TextProperty="" Placeholder="Seleziona la provincia"
Data="@provinciaList" Size="ButtonSize.Small" />
<ValidationMessage For="@(() => iscrizione.Provincia)" />
</div>
</div>
<div class="row">
<div class="col-6 mb-3">
<RadzenText TextStyle="TextStyle.Subtitle2" TagName="TagName.H3">Ragione Sociale</RadzenText>
<RadzenTextBox Style="width: 100%" aria-label="Nome" @bind-Value="@iscrizione.RagioneSociale" />
<ValidationMessage For="@(() => iscrizione.RagioneSociale)" />
</div>
<div class="col-6 mb-3">
<RadzenText TextStyle="TextStyle.Subtitle2" TagName="TagName.H3">Tipologia</RadzenText>
<RadzenDropDown @bind-Value="@iscrizione.TipologiaClienteId" TValue="Guid" Style="width: 100%" TextProperty="Description" ValueProperty="Key" Placeholder="Seleziona la tipologia"
Data="@tipologiaList" Size="ButtonSize.Small" />
<ValidationMessage For="@(() => iscrizione.TipologiaClienteId)" />
</div>
</div>
<div class="row">
<div class="col-6 mb-3">
<RadzenText TextStyle="TextStyle.Subtitle2" TagName="TagName.H3">Hai già avuto un'esperienza con DAC?</RadzenText>
<RadzenDropDown @bind-Value="@iscrizione.EsperienzaConDAC" Style="width: 100%" TextProperty="" Placeholder="Scegli dal menù"
Data="@esperienzaList" Size="ButtonSize.Small" />
<ValidationMessage For="@(() => iscrizione.EsperienzaConDAC)" />
</div>
<div class="col-6 mb-3">
<RadzenText TextStyle="TextStyle.Subtitle2" TagName="TagName.H3">Ruolo</RadzenText>
<RadzenDropDown @bind-Value="@iscrizione.RuoloInt" TValue="int?" Style="width: 100%" TextProperty="Description" ValueProperty="Key" Placeholder="Seleziona il ruolo"
Data="@ruoloList" Size="ButtonSize.Small" />
<ValidationMessage For="@(() => iscrizione.RuoloInt)" />
</div>
</div>
<div class="row">
<div class="col-6 mb-3">
<RadzenText TextStyle="TextStyle.Subtitle2" TagName="TagName.H3">Destinazione</RadzenText>
<RadzenDropDown @bind-Value="@iscrizione.DestinazioneId" Style="width: 100%" ValueProperty="Id" TextProperty="RagioneSociale" Placeholder="Seleziona la destinazione"
Data="@destinazioniList" Size="ButtonSize.Small" />
<ValidationMessage For="@(() => iscrizione.DestinazioneId)" />
</div>
<div class="col-6 mb-3">
<RadzenText TextStyle="TextStyle.Subtitle2" TagName="TagName.H3">Numero di partecipanti</RadzenText>
<RadzenNumeric ShowUpDown="false" TValue="int" TextAlign="TextAlign.Right" Style="width: 100%" aria-label="Partecipanti" @bind-Value="@iscrizione.Partecipanti" />
<ValidationMessage For="@(() => iscrizione.Partecipanti)" />
</div>
</div>
<div class="row">
<div class="col-12 mb-3">
<RadzenText TextStyle="TextStyle.Subtitle2" TagName="TagName.H3">Note</RadzenText>
<RadzenTextArea @bind-Value="@iscrizione.Note" Style="width: 100%;" Rows="3" />
<ValidationMessage For="@(() => iscrizione.Note)" />
</div>
</div>
<div class="row">
<div class="col-6 mb-3">
<div class="d-flex align-items-center mb-2">
<RadzenCheckBox class="form-check-input" @bind-Value=@iscrizione.PresaVisionePrivacy Name="PresaVisionePrivacy" TValue="bool" />
<label class="rz-ms-2" for="PresaVisionePrivacy" style="cursor: pointer;">
Presa visione dell'informativa Privacy* (<a href="/" target="_blank">leggi</a>)
</label>
</div>
<div class="d-flex align-items-center">
<RadzenCheckBox class="form-check-input" @bind-Value=@iscrizione.PresaVisioneDatiPersonali Name="PresaVisioneDatiPersonali" TValue="bool" />
<label class="rz-ms-2" for="PresaVisioneDatiPersonali" style="cursor: pointer;">
Autorizzazione al trattamento dati* (<a href="/" target="_blank">leggi</a>)
</label>
</div>
</div>
<div class="col-3 mb-3">
<button type="button" class="btn btn-default w-100" @onclick="backToHome">
Torna all'inserimento codice
</button>
</div>
<div class="col-3 mb-3">
<button type="submit" class="btn btn-danger w-100" disabled="@(!iscrizione.PresaVisionePrivacy || !iscrizione.PresaVisioneDatiPersonali)">
Invia
</button>
</div>
</div>
</div>
</EditForm>
</div>
}
else
{
<div class="text-danger mt-1">Non sono presenti destinazioni da compilare per questo evento!</div>
}
}
else
{
<div class="mb-2">
<h1 class="hero-title">Iscriviti ad un evento, inserisci il tuo codice di invito</h1>
</div>
<div class="col-12">
<div class="row">
<div class="col-9 mb-3">
<RadzenTextBox @bind-Value="@invitationCode" Placeholder="Inserirci il codice invito" Style="width: 100%;" />
@if (!string.IsNullOrEmpty(invalidCode))
{
<div class="text-danger mt-1">@invalidCode</div>
}
</div>
<div class="col-3 mb-3">
<button type="button" class="btn btn-danger w-100" @onclick="reloadWithCode">
Invia
</button>
</div>
</div>
</div>
}
</div>
@code {
[Parameter]
public Guid? invitationId { get; set; }
private InvitoEvento invito { get; set; }
[SupplyParameterFromForm]
private IscrizioneEventoViewModel iscrizione { get; set; } = new();
private IEnumerable<string> comuneList { get; set; }
private IEnumerable<string> provinciaList { get; set; }
private IEnumerable<DestinazioneViewModel> destinazioniList { get; set; }
private IEnumerable<LookupViewModel<Guid>> tipologiaList { get; set; }
private IEnumerable<string> esperienzaList { get; set; }
private IEnumerable<LookupViewModel<int>> ruoloList { get; set; }
public string invitationCode { get; set; } = string.Empty;
private string invalidCode = string.Empty;
protected override async Task OnInitializedAsync()
{
base.OnInitializedAsync();
invito = invitationId.GetValueOrDefault() != Guid.Empty
? await _managerService.InvitoEventoService.RicercaPer(x => x.Id == invitationId && x.Eliminato == false,
includi: x => x.Include(y => y.Evento).Include(y => y.Cliente).ThenInclude(y => y.Destinazioni).Include(y => y.IscrizioniEvento))
: new();
if (invito == null)
invalidCode = "Il codice inserito non risulta corretto";
else
{
iscrizione.RagioneSociale = invito?.Cliente?.RagioneSociale ?? "";
var destinazioniIds = invito.IscrizioniEvento?.Select(x => x.DestinazioneId).ToList() ?? new List<Guid?>();
destinazioniList = (await _managerService.DestinazioneService.RicercaQueryable(filtro: x => x.ClienteId == invito.ClienteId && !destinazioniIds.Any(y => y == x.Id))).Select(x => (DestinazioneViewModel)x).ToList();
comuneList = new List<string>() { "Brescia" };
provinciaList = new List<string>() { "BS" };
esperienzaList = new List<string>() { "Si", "No" };
var eUtils = new EnumUtils();
tipologiaList = (await _managerService.TipologiaClienteService.RicercaQueryable(x => x.Eliminato == false))
.Select(x => new LookupViewModel<Guid>(x.Id, x.Nome)).ToList();
ruoloList = eUtils.GetEnumList<RuoloTipo>();
}
}
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
await BodyClass.SetBodyClass("body-marketing body-gradient");
}
private void reloadWithCode()
{
if (Guid.TryParse(invitationCode, out Guid invitationCodeParsed))
{
_navManager.NavigateTo($"/{invitationCodeParsed}");
}
else
{
invalidCode = "Il codice inserito non risulta corretto";
}
}
private void backToHome()
{
_navManager.NavigateTo($"/");
}
private async Task onIscrizioneSave()
{
var model = new IscrizioneEvento() {
EventoId = invito.EventoId,
InvitoEventoId = invito.Id,
ClienteId = invito.ClienteId,
DestinazioneId = iscrizione.DestinazioneId };
model = iscrizione.Map(model);
model.TipologiaCliente = await _managerService.TipologiaClienteService.RicercaPer(x => x.Id == iscrizione.TipologiaClienteId && x.Eliminato == false);
await _managerService.IscrizioneEventoService.Salva(model);
_navManager.NavigateTo($"/");
}
}