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, Dipendente = 10,
[Description("Libera Professione")] [Description("Libera Professione")]
LiberaProfessione = 100, 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<Evento> Evento { get; set; }
public DbSet<InvitoEvento> InvitoEvento { get; set; } public DbSet<InvitoEvento> InvitoEvento { get; set; }
public DbSet<IscrizioneEvento> IscrizioneEvento { get; set; } public DbSet<IscrizioneEvento> IscrizioneEvento { get; set; }
public DbSet<IscrizioneEventoPerMail> IscrizioneEventoPerMail { get; set; }
public DbSet<MailQueue> MailQueue { get; set; } public DbSet<MailQueue> MailQueue { get; set; }
public DbSet<Permission> Permission { get; set; } public DbSet<Permission> Permission { get; set; }
public DbSet<ProvinciaIstat> Province { 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"); 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 => modelBuilder.Entity("StandManager.Domain.Entita.MailQueue", b =>
{ {
b.Property<Guid>("Id") b.Property<Guid>("Id")
@ -1084,6 +1124,21 @@ namespace StandManager.Infrastructure.Migrations
b.Navigation("UtenteModifica"); 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 => modelBuilder.Entity("StandManager.Domain.Entita.MailQueue", b =>
{ {
b.HasOne("StandManager.Domain.Entita.Utente", "UtenteCreazione") b.HasOne("StandManager.Domain.Entita.Utente", "UtenteCreazione")

View File

@ -10,8 +10,8 @@
}, },
"AllowedHosts": "*", "AllowedHosts": "*",
"EmailConfig": { "EmailConfig": {
"From": "", "From": "registrazioni@gruppodac.eu",
"ServerAddress": "", "ServerAddress": "https://mailbridge.gruppodac.eu/api/graph/NewMessageHtml",
"MailSplitChar": "#" "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 IFeatureService FeatureService{ get; set; }
public IInvitoEventoService InvitoEventoService{ get; set; } public IInvitoEventoService InvitoEventoService{ get; set; }
public IIscrizioneEventoService IscrizioneEventoService{ get; set; } public IIscrizioneEventoService IscrizioneEventoService{ get; set; }
public IIscrizioneEventoPerMailService IscrizioneEventoPerMailService{ get; set; }
public IMailQueueService MailQueueService{ get; set; } public IMailQueueService MailQueueService{ get; set; }
public IPermissionService PermissionService{ get; set; } public IPermissionService PermissionService{ get; set; }
public IProvinciaIstatService ProvinciaIstatService{ 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, public ManagerService(IUtenteService utenteService, IClienteService clienteService, IComuneIstatService comuneIstatService, IDestinazioneService destinazioneService,
IEventoService eventoService, IInvitoEventoService invitoEventoService, IIscrizioneEventoService iscrizioneEventoService, IReferenteService referenteService, IEventoService eventoService, IInvitoEventoService invitoEventoService, IIscrizioneEventoService iscrizioneEventoService, IReferenteService referenteService,
ITipologiaClienteService tipologiaClienteService, IFeatureService featureService, IPermissionService permissionService, IRuoloService ruoloService, ITipologiaClienteService tipologiaClienteService, IFeatureService featureService, IPermissionService permissionService, IRuoloService ruoloService,
ISezioneService sezioneService, IProvinciaIstatService provinciaIstatService, IMailQueueService mailQueueService) ISezioneService sezioneService, IProvinciaIstatService provinciaIstatService, IMailQueueService mailQueueService, IIscrizioneEventoPerMailService iscrizioneEventoPerMailService)
{ {
UtenteService = utenteService; UtenteService = utenteService;
ClienteService = clienteService; ClienteService = clienteService;
@ -24,6 +24,7 @@ public class ManagerService : IManagerService
SezioneService = sezioneService; SezioneService = sezioneService;
ProvinciaIstatService = provinciaIstatService; ProvinciaIstatService = provinciaIstatService;
MailQueueService = mailQueueService; MailQueueService = mailQueueService;
IscrizioneEventoPerMailService = iscrizioneEventoPerMailService;
} }
public IUtenteService UtenteService { get; set; } public IUtenteService UtenteService { get; set; }
@ -33,6 +34,7 @@ public class ManagerService : IManagerService
public IFeatureService FeatureService { get; set; } public IFeatureService FeatureService { get; set; }
public IInvitoEventoService InvitoEventoService{ get; set; } public IInvitoEventoService InvitoEventoService{ get; set; }
public IIscrizioneEventoService IscrizioneEventoService { get; set; } public IIscrizioneEventoService IscrizioneEventoService { get; set; }
public IIscrizioneEventoPerMailService IscrizioneEventoPerMailService { get; set; }
public IMailQueueService MailQueueService { get; set; } public IMailQueueService MailQueueService { get; set; }
public IPermissionService PermissionService { get; set; } public IPermissionService PermissionService { get; set; }
public IProvinciaIstatService ProvinciaIstatService { 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="/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="_content/Radzen.Blazor/Radzen.Blazor.js?v=@(typeof(Radzen.Colors).Assembly.GetName().Version)"></script>
<script src="/js/BodyClass.js"></script> <script src="/js/BodyClass.js"></script>
<script src="/js/site.js"></script>
</body> </body>
</html> </html>

View File

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

View File

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

View File

@ -99,12 +99,6 @@
</RadzenFormField> </RadzenFormField>
<ValidationMessage For="@(() => iscrizione.GiornoPresenza)" /> <ValidationMessage For="@(() => iscrizione.GiornoPresenza)" />
</div> </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>
<div class="row"> <div class="row">
@ -208,11 +202,11 @@
TipologiaClienteId = iscrizione.TipologiaClienteId 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"); _dialogService.Alert("Selezionare una destinazione valida.", "Attenzione");
return; return;
} }*/
model = iscrizione.Map(model); model = iscrizione.Map(model);
@ -236,7 +230,7 @@
public void NoCliente() public void NoCliente()
{ {
destinazioniList = new List<DestinazioneViewModel>() { new DestinazioneViewModel() { RagioneSociale = "--Nessuna" } }; destinazioniList = new List<DestinazioneViewModel>() { new() { RagioneSociale = "--Nessuna" } };
hasCliente = false; hasCliente = false;
iscrizione.EsperienzaConDAC = "No"; iscrizione.EsperienzaConDAC = "No";
} }
@ -249,7 +243,7 @@
private async Task onProvinciaChanged(object args) private async Task onProvinciaChanged(object args)
{ {
Guid parsed; 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); var prov = await _managerService.ProvinciaIstatService.RicercaPer(x => x.Id == parsed);
if (prov == null) if (prov == null)

View File

@ -1,5 +1,6 @@
@page "/Grazie" @page "/Grazie"
@using StandManager.Components.Layout @using StandManager.Components.Layout
@using StandManager.Components.Widget
@layout PublicLayout @layout PublicLayout
@ -8,6 +9,7 @@
@rendermode InteractiveServer @rendermode InteractiveServer
<PageTitle>Grazie</PageTitle> <PageTitle>Grazie</PageTitle>
<AppHeader ShowNavigation="false" />
<div class="page page-center"> <div class="page page-center">
<div class="container container-tight py-4"> <div class="container container-tight py-4">
@ -22,9 +24,9 @@
</svg> </svg>
</div> </div>
</div> </div>
<h1 class="mt-2">Ti aspettiamo!</h1> <h1 class="mt-2">Grazie</h1>
<p class="text-secondary"> <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> </p>
</div> </div>
<div class="hr-text hr-text-center hr-text-spaceless"></div> <div class="hr-text hr-text-center hr-text-spaceless"></div>
@ -40,6 +42,12 @@
</div> </div>
</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> <style>
:root { :root {
--tblr-primary: #D63939; --tblr-primary: #D63939;
@ -55,6 +63,6 @@
@code { @code {
private void goToHome() private void goToHome()
{ {
_navManager.NavigateTo("/"); _navManager.NavigateTo("/registrazione");
} }
} }

View File

@ -1,6 +1,5 @@
@using Microsoft.EntityFrameworkCore @using StandManager.Components.Layout
@using StandManager.Components.Layout @using StandManager.Components.Widget
@using System.Threading.Tasks
@using StandManager.Model @using StandManager.Model
@page "/Registrazione" @page "/Registrazione"
@ -9,68 +8,86 @@
@rendermode InteractiveServer @rendermode InteractiveServer
<PageTitle>Iscrizione Evento</PageTitle> <PageTitle>Iscrizione Evento</PageTitle>
<AppHeader /> <AppHeader ShowNavigation="false" />
<div class="container my-5 py-3"> <div class="container my-5 py-3">
<ClienteToggle ValueChanged="onClienteToggleChanged" /> <EditForm Model="iscrizione" OnValidSubmit="OnIscrizioneSave" FormName="iscrizioneForm">
@if (showCodiceCliente) <DataAnnotationsValidator />
{
<div class="col-12"> <div class="col-12">
<div class="row"> <div class="row">
<div class="col-12 mb-3"> <div class="col-12 mb-3 text-center">
<RadzenFormField Text="Codice cliente o Partita IVA" Variant="Variant.Flat" Style="width: 100%;"> <h1>Ricevi il tuo ingresso in fiera</h1>
<RadzenTextBox Style="width: 100%" aria-label="Codice cliente o Partita IVA" Change="(args => onCodiceFornitoChanged(args))" /> <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> </RadzenFormField>
<ValidationMessage For="@(() => iscrizione.Mail)"/>
</div> </div>
</div> </div>
</div>
}
@if (showForm)
{
<Component_Registrazione invito="invito" @ref="registrazione" />
}
</div>
<Footer /> <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>
<DacFooter />
@code { @code {
private bool showCodiceCliente { get; set; } = false; private IscrizioneEventoPerMailViewModel iscrizione { get; set; } = new();
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 bool PresaVisionePrivacy { get; set; }
private bool PresaVisioneDatiPersonali { get; set; }
private void onClienteToggleChanged(bool value) private async Task OnIscrizioneSave()
{ {
if (!value) var exist = await _managerService.IscrizioneEventoPerMailService.RicercaPer(x => x.Mail == iscrizione.Mail && !x.Eliminato);
registrazione.NoCliente(); if (exist != null && exist?.Id != Guid.Empty)
else
registrazione.HasCliente();
showCodiceCliente = value;
showForm = true;
}
private async Task onCodiceFornitoChanged(string text)
{ {
codiceFornito = text; await _dialogService.Alert("L'indirizzo mail indicato è già stato utilizzato", "Errore", new ConfirmOptions() { OkButtonText = "Ok" });
invito.CodiceFornito = codiceFornito; return;
}
var destinazione = (await _managerService.DestinazioneService.RicercaPer( var model = new IscrizioneEventoPerMail()
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; Mail = iscrizione.Mail
invito.DestinazioneId = destinazione.Id; };
invito.CodiceFornito = codiceFornito; await _managerService.IscrizioneEventoPerMailService.Salva(model);
invito.RagioneSociale = destinazione.Cliente?.RagioneSociale ?? string.Empty; _navManager.NavigateTo("/Grazie");
await registrazione.SetDatiCliente();
}
showForm = true;
} }
} }

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 <strong>Errore:</strong> @errorMessage
</div> </div>
} }
<Footer /> <DacFooter />
@code { @code {
private ElementReference videoRef; private ElementReference videoRef;
private DotNetObjectReference<Scan>? objRef; 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 ClienteViewModel Cliente { get; set; }
public Guid? ClienteId { get; set; } public Guid? ClienteId { get; set; }
public Guid? DestinazioneId { 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 int Partecipanti { get; set; }
public string? Note { get; set; } public string? Note { get; set; }
@ -95,5 +95,4 @@ public class IscrizioneEventoViewModel
GiornoPresenza = model.GiornoPresenza, GiornoPresenza = model.GiornoPresenza,
}; };
} }
} }

View File

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