Pagina iscrizione

This commit is contained in:
2026-01-20 14:49:59 +01:00
parent f861351a27
commit a5fe908034
25 changed files with 1815 additions and 99 deletions

View File

@ -54,5 +54,4 @@ public enum RuoloTipo
Dipendente = 10,
[Description("Libera Professione")]
LiberaProfessione = 100,
}

View File

@ -0,0 +1,10 @@
using StandManager.Domain.Entita.Base;
namespace StandManager.Domain.Entita;
public class IscrizioneEventoPerMail : EntitaBase
{
public string Mail { get; set; }
public bool Processata { get; set; }
public bool Inviata { get; set; }
}

View File

@ -17,6 +17,7 @@ public class StandManagerDbContext : OAServiceContext
public DbSet<Evento> Evento { get; set; }
public DbSet<InvitoEvento> InvitoEvento { get; set; }
public DbSet<IscrizioneEvento> IscrizioneEvento { get; set; }
public DbSet<IscrizioneEventoPerMail> IscrizioneEventoPerMail { get; set; }
public DbSet<MailQueue> MailQueue { get; set; }
public DbSet<Permission> Permission { get; set; }
public DbSet<ProvinciaIstat> Province { get; set; }

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,61 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace StandManager.Infrastructure.Migrations
{
/// <inheritdoc />
public partial class IscrizioneEventoPerMail : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "IscrizioneEventoPerMail",
columns: table => new
{
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
Mail = table.Column<string>(type: "nvarchar(max)", nullable: false),
Processata = table.Column<bool>(type: "bit", nullable: false),
Inviata = table.Column<bool>(type: "bit", nullable: false),
DataCreazione = table.Column<DateTime>(type: "datetime2", nullable: false),
DataModifica = table.Column<DateTime>(type: "datetime2", nullable: true),
Eliminato = table.Column<bool>(type: "bit", nullable: false),
IdUtenteCreazione = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
IdUtenteModifica = table.Column<Guid>(type: "uniqueidentifier", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_IscrizioneEventoPerMail", x => x.Id);
table.ForeignKey(
name: "FK_IscrizioneEventoPerMail_Utente_IdUtenteCreazione",
column: x => x.IdUtenteCreazione,
principalTable: "Utente",
principalColumn: "Id");
table.ForeignKey(
name: "FK_IscrizioneEventoPerMail_Utente_IdUtenteModifica",
column: x => x.IdUtenteModifica,
principalTable: "Utente",
principalColumn: "Id");
});
migrationBuilder.CreateIndex(
name: "IX_IscrizioneEventoPerMail_IdUtenteCreazione",
table: "IscrizioneEventoPerMail",
column: "IdUtenteCreazione");
migrationBuilder.CreateIndex(
name: "IX_IscrizioneEventoPerMail_IdUtenteModifica",
table: "IscrizioneEventoPerMail",
column: "IdUtenteModifica");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "IscrizioneEventoPerMail");
}
}
}

View File

@ -508,6 +508,46 @@ namespace StandManager.Infrastructure.Migrations
b.ToTable("IscrizioneEvento");
});
modelBuilder.Entity("StandManager.Domain.Entita.IscrizioneEventoPerMail", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uniqueidentifier");
b.Property<DateTime>("DataCreazione")
.HasColumnType("datetime2");
b.Property<DateTime?>("DataModifica")
.HasColumnType("datetime2");
b.Property<bool>("Eliminato")
.HasColumnType("bit");
b.Property<Guid?>("IdUtenteCreazione")
.HasColumnType("uniqueidentifier");
b.Property<Guid?>("IdUtenteModifica")
.HasColumnType("uniqueidentifier");
b.Property<bool>("Inviata")
.HasColumnType("bit");
b.Property<string>("Mail")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<bool>("Processata")
.HasColumnType("bit");
b.HasKey("Id");
b.HasIndex("IdUtenteCreazione");
b.HasIndex("IdUtenteModifica");
b.ToTable("IscrizioneEventoPerMail");
});
modelBuilder.Entity("StandManager.Domain.Entita.MailQueue", b =>
{
b.Property<Guid>("Id")
@ -1084,6 +1124,21 @@ namespace StandManager.Infrastructure.Migrations
b.Navigation("UtenteModifica");
});
modelBuilder.Entity("StandManager.Domain.Entita.IscrizioneEventoPerMail", b =>
{
b.HasOne("StandManager.Domain.Entita.Utente", "UtenteCreazione")
.WithMany()
.HasForeignKey("IdUtenteCreazione");
b.HasOne("StandManager.Domain.Entita.Utente", "UtenteModifica")
.WithMany()
.HasForeignKey("IdUtenteModifica");
b.Navigation("UtenteCreazione");
b.Navigation("UtenteModifica");
});
modelBuilder.Entity("StandManager.Domain.Entita.MailQueue", b =>
{
b.HasOne("StandManager.Domain.Entita.Utente", "UtenteCreazione")

View File

@ -10,8 +10,8 @@
},
"AllowedHosts": "*",
"EmailConfig": {
"From": "",
"ServerAddress": "",
"From": "registrazioni@gruppodac.eu",
"ServerAddress": "https://mailbridge.gruppodac.eu/api/graph/NewMessageHtml",
"MailSplitChar": "#"
}
}

View File

@ -0,0 +1,9 @@
using OAService.Service.Repository;
using OAService.Service.Servizi.Interfacce;
using StandManager.Domain.Entita;
namespace StandManager.Service.Interfaces;
public interface IIscrizioneEventoPerMailService : ITService<IscrizioneEventoPerMail>{
Task<IscrizioneEventoPerMail> Salva(IscrizioneEventoPerMail entita);
}

View File

@ -9,6 +9,7 @@
public IFeatureService FeatureService{ get; set; }
public IInvitoEventoService InvitoEventoService{ get; set; }
public IIscrizioneEventoService IscrizioneEventoService{ get; set; }
public IIscrizioneEventoPerMailService IscrizioneEventoPerMailService{ get; set; }
public IMailQueueService MailQueueService{ get; set; }
public IPermissionService PermissionService{ get; set; }
public IProvinciaIstatService ProvinciaIstatService{ get; set; }

View File

@ -0,0 +1,33 @@
using OAService.Service.Servizi.Implementazioni;
using StandManager.Domain.Entita;
using StandManager.Service.Interfaces;
using StandManager.Service.Repository;
namespace StandManager.Service;
public class IscrizioneEventoPerMailService : TService<IscrizioneEventoPerMail>, IIscrizioneEventoPerMailService
{
private readonly IStandManagerUnitOfWork _unitOfWork;
public IscrizioneEventoPerMailService(IStandManagerUnitOfWork unitOfWork) : base(unitOfWork)
{
_unitOfWork = unitOfWork;
}
public async Task<IscrizioneEventoPerMail> Salva(IscrizioneEventoPerMail entita)
{
bool isNuovaEntita = entita.Id == Guid.Empty;
entita.DataCreazione = isNuovaEntita ? DateTime.Now : entita.DataCreazione;
entita.DataModifica = isNuovaEntita == false ? DateTime.Now : null;
entita.IdUtenteCreazione = isNuovaEntita ? null : entita.IdUtenteCreazione;
entita.IdUtenteModifica = isNuovaEntita == false ? null : null;
if (isNuovaEntita)
await _unitOfWork.GetRepository<IscrizioneEventoPerMail>().Put(entita);
int result = await _unitOfWork.Salva();
return entita;
}
}

View File

@ -7,7 +7,7 @@ public class ManagerService : IManagerService
public ManagerService(IUtenteService utenteService, IClienteService clienteService, IComuneIstatService comuneIstatService, IDestinazioneService destinazioneService,
IEventoService eventoService, IInvitoEventoService invitoEventoService, IIscrizioneEventoService iscrizioneEventoService, IReferenteService referenteService,
ITipologiaClienteService tipologiaClienteService, IFeatureService featureService, IPermissionService permissionService, IRuoloService ruoloService,
ISezioneService sezioneService, IProvinciaIstatService provinciaIstatService, IMailQueueService mailQueueService)
ISezioneService sezioneService, IProvinciaIstatService provinciaIstatService, IMailQueueService mailQueueService, IIscrizioneEventoPerMailService iscrizioneEventoPerMailService)
{
UtenteService = utenteService;
ClienteService = clienteService;
@ -24,6 +24,7 @@ public class ManagerService : IManagerService
SezioneService = sezioneService;
ProvinciaIstatService = provinciaIstatService;
MailQueueService = mailQueueService;
IscrizioneEventoPerMailService = iscrizioneEventoPerMailService;
}
public IUtenteService UtenteService { get; set; }
@ -33,6 +34,7 @@ public class ManagerService : IManagerService
public IFeatureService FeatureService { get; set; }
public IInvitoEventoService InvitoEventoService{ get; set; }
public IIscrizioneEventoService IscrizioneEventoService { get; set; }
public IIscrizioneEventoPerMailService IscrizioneEventoPerMailService { get; set; }
public IMailQueueService MailQueueService { get; set; }
public IPermissionService PermissionService { get; set; }
public IProvinciaIstatService ProvinciaIstatService { get; set; }

View File

@ -41,5 +41,6 @@
<script src="/Plugin/Select2/js/select2.full.min.js"></script>
<script src="_content/Radzen.Blazor/Radzen.Blazor.js?v=@(typeof(Radzen.Colors).Assembly.GetName().Version)"></script>
<script src="/js/BodyClass.js"></script>
<script src="/js/site.js"></script>
</body>
</html>

View File

@ -9,6 +9,8 @@
<span class="navbar-toggler-icon"></span>
</button>
@if (ShowNavigation)
{
<div class="collapse navbar-collapse" id="navbarContent">
<nav class="navbar-nav ms-auto mb-2 mb-lg-0 text-end pe-lg-4">
@ -38,5 +40,11 @@
</nav>
</div>
}
</div>
</header>
@code {
[Parameter] public bool ShowNavigation { get; set; } = true;
}

View File

@ -1,5 +1,5 @@
@inherits LayoutComponentBase
<RadzenComponents @rendermode="InteractiveAuto" />
@Body
<script src="https://cdn.jsdelivr.net/npm/jsqr@1.4.0/dist/jsQR.js"></script>

View File

@ -99,12 +99,6 @@
</RadzenFormField>
<ValidationMessage For="@(() => iscrizione.GiornoPresenza)" />
</div>
<div class="col-6 mb-3">
<RadzenFormField Text="Numero di partecipanti" Variant="Variant.Flat" Style="width: 100%;">
<RadzenNumeric ShowUpDown="false" TValue="int" TextAlign="TextAlign.Right" Style="width: 100%" aria-label="Partecipanti" @bind-Value="@iscrizione.Partecipanti" />
</RadzenFormField>
<ValidationMessage For="@(() => iscrizione.Partecipanti)" />
</div>
</div>
<div class="row">
@ -208,11 +202,11 @@
TipologiaClienteId = iscrizione.TipologiaClienteId
};
if (invito.EventoId != Guid.Empty && iscrizione.DestinazioneId == Guid.Empty)
/*if (invito.EventoId != Guid.Empty && iscrizione.DestinazioneId == Guid.Empty)
{
_dialogService.Alert("Selezionare una destinazione valida.", "Attenzione");
return;
}
}*/
model = iscrizione.Map(model);
@ -236,7 +230,7 @@
public void NoCliente()
{
destinazioniList = new List<DestinazioneViewModel>() { new DestinazioneViewModel() { RagioneSociale = "--Nessuna" } };
destinazioniList = new List<DestinazioneViewModel>() { new() { RagioneSociale = "--Nessuna" } };
hasCliente = false;
iscrizione.EsperienzaConDAC = "No";
}
@ -249,7 +243,7 @@
private async Task onProvinciaChanged(object args)
{
Guid parsed;
var guidId = Guid.TryParse(args.ToString(), out parsed);
Guid.TryParse(args.ToString(), out parsed);
var prov = await _managerService.ProvinciaIstatService.RicercaPer(x => x.Id == parsed);
if (prov == null)

View File

@ -1,5 +1,6 @@
@page "/Grazie"
@using StandManager.Components.Layout
@using StandManager.Components.Widget
@layout PublicLayout
@ -8,6 +9,7 @@
@rendermode InteractiveServer
<PageTitle>Grazie</PageTitle>
<AppHeader ShowNavigation="false" />
<div class="page page-center">
<div class="container container-tight py-4">
@ -22,9 +24,9 @@
</svg>
</div>
</div>
<h1 class="mt-2">Ti aspettiamo!</h1>
<h1 class="mt-2">Grazie</h1>
<p class="text-secondary">
Controlla la tua email per verificare di aver ricevuto il QR code di invito.
Operazione completata. La tua richiesta di ingresso è stata inoltrata al team DAC. Riceverai presto il tuo invito.
</p>
</div>
<div class="hr-text hr-text-center hr-text-spaceless"></div>
@ -40,6 +42,12 @@
</div>
</div>
<div class="container">
<ShareLink Messaggio="Invita anche i tuoi collaboratori a partecipare: condividi questo link e ricordati che la registrazione è obbligatoria per ottenere lingresso omaggio nominale."/>
</div>
<DacFooter />
<style>
:root {
--tblr-primary: #D63939;
@ -55,6 +63,6 @@
@code {
private void goToHome()
{
_navManager.NavigateTo("/");
_navManager.NavigateTo("/registrazione");
}
}

View File

@ -1,6 +1,5 @@
@using Microsoft.EntityFrameworkCore
@using StandManager.Components.Layout
@using System.Threading.Tasks
@using StandManager.Components.Layout
@using StandManager.Components.Widget
@using StandManager.Model
@page "/Registrazione"
@ -9,68 +8,86 @@
@rendermode InteractiveServer
<PageTitle>Iscrizione Evento</PageTitle>
<AppHeader />
<AppHeader ShowNavigation="false" />
<div class="container my-5 py-3">
<ClienteToggle ValueChanged="onClienteToggleChanged" />
@if (showCodiceCliente)
{
<EditForm Model="iscrizione" OnValidSubmit="OnIscrizioneSave" FormName="iscrizioneForm">
<DataAnnotationsValidator />
<div class="col-12">
<div class="row">
<div class="col-12 mb-3">
<RadzenFormField Text="Codice cliente o Partita IVA" Variant="Variant.Flat" Style="width: 100%;">
<RadzenTextBox Style="width: 100%" aria-label="Codice cliente o Partita IVA" Change="(args => onCodiceFornitoChanged(args))" />
<div class="col-12 mb-3 text-center">
<h1>Ricevi il tuo ingresso in fiera</h1>
<p class="text-secondary fs-3 lh-3">
Inserisci il tuo indirizzo email per richiedere il biglietto digitale.
</p>
</div>
</div>
<div class="row">
<div class="col-3"></div>
<div class="col-6 mb-3">
<RadzenFormField Text="Email" Variant="Variant.Flat" Style="width: 100%;">
<RadzenTextBox Style="width: 100%" aria-label="Nome" Placeholder="es. nome@azienda.com" @bind-Value="@iscrizione.Mail"/>
</RadzenFormField>
<ValidationMessage For="@(() => iscrizione.Mail)"/>
</div>
</div>
</div>
}
@if (showForm)
{
<Component_Registrazione invito="invito" @ref="registrazione" />
}
<div class="row">
<div class="col-3"></div>
<div class="col-6 mb-3">
<div class="d-flex align-items-center mb-2">
<RadzenCheckBox class="form-check-input" @bind-Value="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="PresaVisioneDatiPersonali" Name="presaVisioneDatiPersonali" TValue="bool"/>
<label class="rz-ms-2" for="presaVisioneDatiPersonali" style="cursor: pointer;">
Autorizzazione al trattamento dati*<br/>
I dati forniti saranno utilizzati esclusivamente per linvio del biglietto. (<a href="/" target="_blank">leggi</a>)
</label>
</div>
</div>
</div>
<div class="row">
<div class="col-3"></div>
<div class="col-6 mb-3">
<button type="submit" class="btn btn-danger w-100" disabled="@(!PresaVisionePrivacy || !PresaVisioneDatiPersonali)">
Invia richiesta
</button>
</div>
</div>
</div>
</EditForm>
<ShareLink Messaggio="Condividi questo link con i collaboratori interessati a partecipare alla fiera: la registrazione è obbligatoria per ciascun partecipante al fine di ottenere lingresso omaggio nominale."/>
</div>
<Footer />
<DacFooter />
@code {
private bool showCodiceCliente { get; set; } = false;
private bool showForm { get; set; } = false;
private InvitoEventoViewModel invito { get; set; } = new InvitoEventoViewModel();
private Component_Registrazione registrazione { get; set; } = new();
private IscrizioneEventoPerMailViewModel iscrizione { get; set; } = new();
private string codiceFornito { get; set; }
private bool PresaVisionePrivacy { get; set; }
private bool PresaVisioneDatiPersonali { get; set; }
private void onClienteToggleChanged(bool value)
private async Task OnIscrizioneSave()
{
if (!value)
registrazione.NoCliente();
else
registrazione.HasCliente();
showCodiceCliente = value;
showForm = true;
var exist = await _managerService.IscrizioneEventoPerMailService.RicercaPer(x => x.Mail == iscrizione.Mail && !x.Eliminato);
if (exist != null && exist?.Id != Guid.Empty)
{
await _dialogService.Alert("L'indirizzo mail indicato è già stato utilizzato", "Errore", new ConfirmOptions() { OkButtonText = "Ok" });
return;
}
private async Task onCodiceFornitoChanged(string text)
var model = new IscrizioneEventoPerMail()
{
codiceFornito = text;
invito.CodiceFornito = codiceFornito;
var destinazione = (await _managerService.DestinazioneService.RicercaPer(
x => x.PartitaIva == codiceFornito || x.CodiceFiscale == codiceFornito || x.Rid == codiceFornito || x.Cliente.Rid == codiceFornito,
includi: x => x.Include(y => y.Cliente)));
if (destinazione != null)
{
invito.ClienteId = destinazione.ClienteId;
invito.DestinazioneId = destinazione.Id;
invito.CodiceFornito = codiceFornito;
invito.RagioneSociale = destinazione.Cliente?.RagioneSociale ?? string.Empty;
await registrazione.SetDatiCliente();
}
showForm = true;
Mail = iscrizione.Mail
};
await _managerService.IscrizioneEventoPerMailService.Salva(model);
_navManager.NavigateTo("/Grazie");
}
}

View File

@ -0,0 +1,76 @@
@using Microsoft.EntityFrameworkCore
@using StandManager.Components.Layout
@using System.Threading.Tasks
@using StandManager.Model
@page "/RegistrazioneInFiera"
@layout PublicLayout
@rendermode InteractiveServer
<PageTitle>Iscrizione Evento</PageTitle>
<AppHeader />
<div class="container my-5 py-3">
<ClienteToggle ValueChanged="onClienteToggleChanged" />
@if (showCodiceCliente)
{
<div class="col-12">
<div class="row">
<div class="col-12 mb-3">
<RadzenFormField Text="Codice cliente o Partita IVA" Variant="Variant.Flat" Style="width: 100%;">
<RadzenTextBox Style="width: 100%" aria-label="Codice cliente o Partita IVA" Change="(args => onCodiceFornitoChanged(args))" />
</RadzenFormField>
</div>
</div>
</div>
}
@if (showForm)
{
<Component_Registrazione invito="invito" @ref="registrazione" />
}
</div>
<DacFooter />
@code {
private bool showCodiceCliente { get; set; } = false;
private bool showForm { get; set; } = false;
private InvitoEventoViewModel invito { get; set; } = new InvitoEventoViewModel();
private Component_Registrazione registrazione { get; set; } = new();
private string codiceFornito { get; set; }
private void onClienteToggleChanged(bool value)
{
if (!value)
registrazione.NoCliente();
else
registrazione.HasCliente();
showCodiceCliente = value;
showForm = true;
}
private async Task onCodiceFornitoChanged(string text)
{
codiceFornito = text;
invito.CodiceFornito = codiceFornito;
var destinazione = (await _managerService.DestinazioneService.RicercaPer(
x => x.PartitaIva == codiceFornito || x.CodiceFiscale == codiceFornito || x.Rid == codiceFornito || x.Cliente.Rid == codiceFornito,
includi: x => x.Include(y => y.Cliente)));
if (destinazione != null)
{
invito.ClienteId = destinazione.ClienteId;
invito.DestinazioneId = destinazione.Id;
invito.CodiceFornito = codiceFornito;
invito.RagioneSociale = destinazione.Cliente?.RagioneSociale ?? string.Empty;
await registrazione.SetDatiCliente();
}
showForm = true;
}
}

View File

@ -40,7 +40,7 @@
<strong>Errore:</strong> @errorMessage
</div>
}
<Footer />
<DacFooter />
@code {
private ElementReference videoRef;
private DotNetObjectReference<Scan>? objRef;

View File

@ -0,0 +1,75 @@
@inject IJSRuntime JS
<div class="col-12">
<div class="row">
<div class="col-4"></div>
<div class="col-4 mb-3 text-center">
<div class="card card-sm">
<div class="card-body d-flex align-items-center gap-3">
<div class="flex-fill">
<div class="fw-bold">Condividi questo link</div>
<div class="text-muted small">
@Messaggio
</div>
</div>
<button class="btn btn-icon @ButtonCss"
title="@_label"
disabled="@_copied"
@onclick="CopyLink">
@if (_copied)
{
<!-- check -->
<svg xmlns="http://www.w3.org/2000/svg" class="icon"
width="24" height="24" viewBox="0 0 24 24"
stroke-width="2" stroke="currentColor"
fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z"/>
<path d="M5 12l5 5l10 -10"/>
</svg>
}
else
{
<!-- share -->
<svg xmlns="http://www.w3.org/2000/svg" class="icon"
width="24" height="24" viewBox="0 0 24 24"
stroke-width="2" stroke="currentColor"
fill="none" stroke-linecap="round" stroke-linejoin="round">
<circle cx="6" cy="12" r="3"/>
<circle cx="18" cy="6" r="3"/>
<circle cx="18" cy="18" r="3"/>
<path d="M8.7 10.7l6.6 -3.4"/>
<path d="M8.7 13.3l6.6 3.4"/>
</svg>
}
</button>
</div>
</div>
</div>
</div>
</div>
@code {
[Parameter] public string Messaggio { get; set; } = string.Empty;
private string _label = "Copia link";
private bool _copied;
private string ButtonCss =>
_copied ? "btn-success" : "btn-outline-primary";
private async Task CopyLink()
{
await JS.InvokeVoidAsync(
"navigator.clipboard.writeText",
"https://registrazioni.gruppodac.eu:666/registrazione"
);
_copied = true;
StateHasChanged();
await Task.Delay(3000);
_copied = false;
StateHasChanged();
}
}

View File

@ -0,0 +1,23 @@
using StandManager.Domain.Entita;
namespace StandManager.Model;
public class IscrizioneEventoPerMailViewModel
{
public Guid Id { get; set; }
public string Mail { get; set; }
public bool Processata { get; set; }
public bool Inviata { get; set; }
public static implicit operator IscrizioneEventoPerMailViewModel(IscrizioneEventoPerMail model)
{
return model == null
? null
: new IscrizioneEventoPerMailViewModel()
{
Mail = model.Mail,
Id = model.Id,
Inviata = model.Inviata,
Processata = model.Processata
};
}
}

View File

@ -11,7 +11,7 @@ public class IscrizioneEventoViewModel
public ClienteViewModel Cliente { get; set; }
public Guid? ClienteId { get; set; }
public Guid? DestinazioneId { get; set; }
[Range(1, int.MaxValue, ErrorMessage = "Inserire un numero di partecipanti valido")]
/*[Range(1, int.MaxValue, ErrorMessage = "Inserire un numero di partecipanti valido")]*/
public int Partecipanti { get; set; }
public string? Note { get; set; }
@ -95,5 +95,4 @@ public class IscrizioneEventoViewModel
GiornoPresenza = model.GiornoPresenza,
};
}
}

View File

@ -146,3 +146,14 @@ function swalErrorMsg(msg) {
return;
}
window.TablerToast = function (message) {
if (window.Tabler?.toast) {
Tabler.toast.show({
message: message,
type: 'success'
});
} else {
alert(message);
}
};