export calendar - modifica impostazioni

This commit is contained in:
2026-05-26 14:10:04 +02:00
parent 60ebd3b652
commit 982d754857
26 changed files with 1609 additions and 289 deletions
@@ -15,7 +15,7 @@
<h3 class="card-title">Dati Utente</h3>
</div>
<div class="card-body">
<form method="POST" action="<?php echo e(url('/admin/utenti/' . $user->id)); ?>">
<form method="POST" action="/admin/utenti/<?php echo e($user->id); ?>">
<?php echo csrf_field(); ?> <?php echo method_field('PUT'); ?>
<div class="form-group">
<label>Nome *</label>
@@ -36,9 +36,9 @@
<div class="form-group">
<label>Stato</label>
<select name="status" class="form-control" required>
<option value="active" <?php echo e($user->status === 'active' ? 'selected' : ''); ?>>Attivo</option>
<option value="suspended" <?php echo e($user->status === 'suspended' ? 'selected' : ''); ?>>Sospeso</option>
<option value="pending" <?php echo e($user->status === 'pending' ? 'selected' : ''); ?>>In attesa</option>
<option value="active" <?php echo e(old('status', $user->status) === 'active' ? 'selected' : ''); ?>>Attivo</option>
<option value="suspended" <?php echo e(old('status', $user->status) === 'suspended' ? 'selected' : ''); ?>>Sospeso</option>
<option value="pending" <?php echo e(old('status', $user->status) === 'pending' ? 'selected' : ''); ?>>In attesa</option>
</select>
</div>
<div class="form-group">
@@ -46,16 +46,17 @@
<select name="role_preset_id" class="form-control" id="rolePresetSelect">
<option value="">Personalizzato</option>
<?php $__currentLoopData = $rolePresets; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $preset): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<option value="<?php echo e($preset->id); ?>" <?php echo e($user->role_preset_id == $preset->id ? 'selected' : ''); ?>>
<option value="<?php echo e($preset->id); ?>" <?php echo e(old('role_preset_id', $user->role_preset_id) == $preset->id ? 'selected' : ''); ?>>
<?php echo e($preset->name); ?> - <?php echo e($preset->description); ?>
</option>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
</select>
</div>
<input type="hidden" name="is_admin" value="0">
<div class="form-group">
<div class="custom-control custom-switch">
<input type="checkbox" class="custom-control-input" id="isAdmin" name="is_admin" value="1" <?php echo e($user->isSuperAdmin() ? 'checked' : ''); ?>>
<input type="checkbox" class="custom-control-input" id="isAdmin" name="is_admin" value="1" <?php echo e(old('is_admin', $user->isSuperAdmin() ? '1' : '0') === '1' ? 'checked' : ''); ?>>
<label class="custom-control-label" for="isAdmin">Superadmin (bypass ACL)</label>
</div>
</div>
@@ -72,7 +73,7 @@
</tr>
</thead>
<tbody>
<?php $__currentLoopData = ['individui', 'gruppi', 'eventi', 'documenti', 'mailing', 'viste']; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $module): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<?php $__currentLoopData = \App\Models\User::MODULES; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $module): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<tr>
<td><strong><?php echo e(ucfirst($module)); ?></strong></td>
<td><input type="radio" name="permissions[<?php echo e($module); ?>]" value="0" <?php echo e(($user->permissions[$module] ?? 0) == 0 ? 'checked' : ''); ?>></td>
@@ -311,6 +311,9 @@
<i class="fas fa-trash mr-1"></i> Elimina
</button>
</form>
<a href="/eventi/<?php echo e($evento->id); ?>/export-ics" class="btn btn-success">
<i class="fas fa-calendar-plus mr-1"></i> Esporta ICS
</a>
<a href="/eventi" class="btn btn-secondary">
<i class="fas fa-arrow-left mr-1"></i> Torna all'elenco
</a>
@@ -1,44 +0,0 @@
<?php if($paginator->hasPages()): ?>
<ul class="pagination justify-content-center" role="navigation">
<?php if($paginator->onFirstPage()): ?>
<li class="page-item disabled" aria-disabled="true" aria-label="<?php echo app('translator')->get('pagination.previous'); ?>">
<span class="page-link" aria-hidden="true">&lsaquo;</span>
</li>
<?php else: ?>
<li class="page-item">
<a class="page-link" href="<?php echo e($paginator->previousPageUrl()); ?>" rel="prev" aria-label="<?php echo app('translator')->get('pagination.previous'); ?>">&lsaquo;</a>
</li>
<?php endif; ?>
<?php $__currentLoopData = $elements; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $element): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<?php if(is_string($element)): ?>
<li class="page-item disabled" aria-disabled="true"><span class="page-link"><?php echo e($element); ?></span></li>
<?php endif; ?>
<?php if(is_array($element)): ?>
<?php $__currentLoopData = $element; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $page => $url): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<?php if($page == $paginator->currentPage()): ?>
<li class="page-item active" aria-current="page"><span class="page-link"><?php echo e($page); ?></span></li>
<?php elseif($page >= $paginator->currentPage() - 2 && $page <= $paginator->currentPage() + 2): ?>
<li class="page-item"><a class="page-link" href="<?php echo e($url); ?>"><?php echo e($page); ?></a></li>
<?php endif; ?>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
<?php endif; ?>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
<?php if($paginator->hasMorePages()): ?>
<li class="page-item">
<a class="page-link" href="<?php echo e($paginator->nextPageUrl()); ?>" rel="next" aria-label="<?php echo app('translator')->get('pagination.next'); ?>">&rsaquo;</a>
</li>
<?php else: ?>
<li class="page-item disabled" aria-disabled="true" aria-label="<?php echo app('translator')->get('pagination.next'); ?>">
<span class="page-link" aria-hidden="true">&rsaquo;</span>
</li>
<?php endif; ?>
</ul>
<?php endif; ?><?php /**PATH /var/www/html/glastree/resources/views/vendor/pagination/simple-bootstrap-4.blade.php ENDPATH**/ ?>
@@ -16,6 +16,12 @@
<a href="<?php echo e(route('eventi.create')); ?>" class="btn btn-success btn-sm">
<i class="fas fa-plus mr-1"></i> Nuovo Evento
</a>
<form action="<?php echo e(route('eventi.export-selected-ics')); ?>" method="POST" class="d-inline">
<?php echo csrf_field(); ?>
<button type="submit" class="btn btn-success btn-sm">
<i class="fas fa-calendar-plus mr-1"></i> Esporta ICS
</button>
</form>
</div>
</div>
<div class="card-body">
@@ -21,20 +21,27 @@
<a href="#logo" class="list-group-item list-group-item-action" data-toggle="tab">
<i class="nav-icon fas fa-image mr-2"></i> Logo
</a>
<a href="#email" class="list-group-item list-group-item-action" data-toggle="tab">
<i class="nav-icon fas fa-envelope mr-2"></i> Email
</a>
<a href="#calendario" class="list-group-item list-group-item-action" data-toggle="tab">
<i class="nav-icon fas fa-calendar-alt mr-2"></i> Calendario
</a>
<a href="#tipologie" class="list-group-item list-group-item-action" data-toggle="tab">
<i class="nav-icon fas fa-file mr-2"></i> Tipologie Documenti
</a>
<a href="#ruoli" class="list-group-item list-group-item-action" data-toggle="tab">
<i class="nav-icon fas fa-users-cog mr-2"></i> Tipi di Ruolo
</a>
<a href="#tipologie-eventi" class="list-group-item list-group-item-action" data-toggle="tab">
<i class="nav-icon fas fa-calendar mr-2"></i> Tipologie Eventi
</a>
<a href="#ruoli" class="list-group-item list-group-item-action" data-toggle="tab">
<i class="nav-icon fas fa-users-cog mr-2"></i> Tipi di Ruolo
</a>
</div>
</div>
</div>
<div class="col-md-9">
<div class="tab-content">
<div class="tab-pane" id="applicazione">
<div class="card card-primary">
<div class="card-header">
@@ -49,12 +56,11 @@
<form method="POST" action="<?php echo e(route('impostazioni.app-settings.save')); ?>">
<?php echo csrf_field(); ?>
<?php echo method_field('POST'); ?>
<div class="row">
<div class="col-md-6">
<div class="form-group">
<label for="nome_applicazione">Nome Applicazione</label>
<input type="text" name="nome_applicazione" id="nome_applicazione" class="form-control"
<input type="text" name="nome_applicazione" id="nome_applicazione" class="form-control"
value="<?php echo e(old('nome_applicazione', $appSettings->nome_applicazione ?? '')); ?>"
placeholder="es. Glastree">
<small class="text-muted">Nome mostrato nel titolo, sidebar e login</small>
@@ -63,7 +69,7 @@
<div class="col-md-6">
<div class="form-group">
<label for="nome_organizzazione">Nome Organizzazione</label>
<input type="text" name="nome_organizzazione" id="nome_organizzazione" class="form-control"
<input type="text" name="nome_organizzazione" id="nome_organizzazione" class="form-control"
value="<?php echo e(old('nome_organizzazione', $appSettings->nome_organizzazione ?? '')); ?>"
placeholder="es. Parrocchia Santa Maria">
<small class="text-muted">Nome organizzazione mostrato sotto il logo nel login</small>
@@ -73,7 +79,7 @@
<div class="form-group">
<label for="footer_text">Testo Footer</label>
<input type="text" name="footer_text" id="footer_text" class="form-control"
<input type="text" name="footer_text" id="footer_text" class="form-control"
value="<?php echo e(old('footer_text', $appSettings->footer_text ?? '')); ?>"
placeholder="es. © 2026 Parrocchia Santa Maria">
<small class="text-muted">Lascia vuoto per usare il formato predefinito: © {anno} {nome_applicazione}</small>
@@ -83,7 +89,7 @@
<div class="col-md-6">
<div class="form-group">
<label for="app_version">Versione Applicazione</label>
<input type="text" name="app_version" id="app_version" class="form-control"
<input type="text" name="app_version" id="app_version" class="form-control"
value="<?php echo e(old('app_version', $appSettings->app_version ?? '')); ?>"
placeholder="es. 1.0.0">
<small class="text-muted">Versione mostrata nel footer</small>
@@ -116,6 +122,7 @@
</div>
</div>
<div class="tab-pane" id="logo">
<div class="card card-primary">
<div class="card-header">
@@ -168,6 +175,298 @@
</div>
</div>
<div class="tab-pane" id="email">
<div class="card card-secondary">
<div class="card-header">
<h3 class="card-title">Sezioni Email</h3>
</div>
<div class="card-body p-0">
<ul class="nav nav-pills p-2">
<li class="nav-item"><a href="#email-imap" class="nav-link active" data-toggle="tab">Server IMAP</a></li>
<li class="nav-item"><a href="#email-smtp" class="nav-link" data-toggle="tab">Server SMTP</a></li>
<li class="nav-item"><a href="#email-account" class="nav-link" data-toggle="tab">Account</a></li>
<li class="nav-item"><a href="#email-sync" class="nav-link" data-toggle="tab">Sincronizzazione</a></li>
<li class="nav-item"><a href="#email-firma" class="nav-link" data-toggle="tab">Firma</a></li>
</ul>
</div>
</div>
<form method="POST" action="<?php echo e(route('impostazioni.email.save')); ?>">
<?php echo csrf_field(); ?>
<input type="hidden" name="id" value="<?php echo e($emailSettings->id ?? 1); ?>">
<div class="tab-content">
<div class="tab-pane active" id="email-imap">
<div class="card card-primary">
<div class="card-header">
<h3 class="card-title">Configurazione Server IMAP</h3>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6">
<div class="form-group">
<label for="imap_host">Host IMAP</label>
<input type="text" name="imap_host" id="imap_host" class="form-control"
value="<?php echo e($emailSettings->imap_host ?? 'imap.gmail.com'); ?>"
placeholder="es. imap.gmail.com">
<small class="text-muted">Gmail: imap.gmail.com | Outlook: outlook.office365.com</small>
</div>
</div>
<div class="col-md-3">
<div class="form-group">
<label for="imap_port">Porta</label>
<input type="number" name="imap_port" id="imap_port" class="form-control"
value="<?php echo e($emailSettings->imap_port ?? 993); ?>">
</div>
</div>
<div class="col-md-3">
<div class="form-group">
<label for="imap_encryption">Crittografia</label>
<select name="imap_encryption" id="imap_encryption" class="form-control">
<option value="ssl" <?php echo e(($emailSettings->imap_encryption ?? 'ssl') == 'ssl' ? 'selected' : ''); ?>>SSL</option>
<option value="tls" <?php echo e(($emailSettings->imap_encryption ?? '') == 'tls' ? 'selected' : ''); ?>>TLS</option>
<option value="none" <?php echo e(($emailSettings->imap_encryption ?? '') == 'none' ? 'selected' : ''); ?>>Nessuna</option>
</select>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="tab-pane" id="email-smtp">
<div class="card card-primary">
<div class="card-header">
<h3 class="card-title">Configurazione Server SMTP (per invio email)</h3>
</div>
<div class="card-body">
<div class="alert alert-info">
<i class="fas fa-info-circle"></i>
<strong>Nota:</strong> Per inviare email devi configurare il server SMTP.
Per Gmail, usa <code>smtp.gmail.com</code> sulla porta <code>587</code> con TLS
e genera una <a href="https://support.google.com/accounts/answer/185833" target="_blank">App Password</a>.
</div>
<div class="row">
<div class="col-md-6">
<div class="form-group">
<label for="smtp_host">Host SMTP</label>
<input type="text" name="smtp_host" id="smtp_host" class="form-control"
value="<?php echo e($emailSettings->smtp_host ?? 'smtp.gmail.com'); ?>"
placeholder="es. smtp.gmail.com">
</div>
</div>
<div class="col-md-3">
<div class="form-group">
<label for="smtp_port">Porta</label>
<input type="number" name="smtp_port" id="smtp_port" class="form-control"
value="<?php echo e($emailSettings->smtp_port ?? 587); ?>">
</div>
</div>
<div class="col-md-3">
<div class="form-group">
<label for="smtp_encryption">Crittografia</label>
<select name="smtp_encryption" id="smtp_encryption" class="form-control">
<option value="tls" <?php echo e(($emailSettings->smtp_encryption ?? 'tls') == 'tls' ? 'selected' : ''); ?>>TLS</option>
<option value="ssl" <?php echo e(($emailSettings->smtp_encryption ?? '') == 'ssl' ? 'selected' : ''); ?>>SSL</option>
<option value="none" <?php echo e(($emailSettings->smtp_encryption ?? '') == 'none' ? 'selected' : ''); ?>>Nessuna</option>
</select>
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="form-group">
<label for="smtp_username">Username SMTP</label>
<input type="text" name="smtp_username" id="smtp_username" class="form-control"
value="<?php echo e($emailSettings->smtp_username ?? ''); ?>"
placeholder="lascia vuoto per usare l'account IMAP">
<small class="text-muted">Generalmente uguale all'account email</small>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label for="smtp_password">Password SMTP / App Password</label>
<input type="password" name="smtp_password" id="smtp_password" class="form-control"
placeholder="<?php echo e($emailSettings->smtp_password ? '••••••••' : ''); ?>">
<small class="text-muted">Lascia vuoto per usare la password IMAP</small>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="tab-pane" id="email-account">
<div class="card card-primary">
<div class="card-header">
<h3 class="card-title">Credenziali Account</h3>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6">
<div class="form-group">
<label for="imap_username">Username/Email</label>
<input type="text" name="imap_username" id="imap_username" class="form-control"
value="<?php echo e($emailSettings->imap_username ?? ''); ?>"
placeholder="es. tuo@gmail.com">
<small class="text-muted">Per Gmail usa l'indirizzo completo</small>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label for="imap_password">Password / App Password</label>
<input type="password" name="imap_password" id="imap_password" class="form-control" placeholder="">
<small class="text-muted">
<a href="https://support.google.com/accounts/answer/185833" target="_blank">Per Gmail: genera una App Password</a>
</small>
</div>
</div>
</div>
<hr>
<div class="row">
<div class="col-md-6">
<div class="form-group">
<label for="email_address">Email Indirizzo</label>
<input type="email" name="email_address" id="email_address" class="form-control"
value="<?php echo e($emailSettings->email_address ?? ''); ?>">
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label for="email_name">Nome Visualizzato</label>
<input type="text" name="email_name" id="email_name" class="form-control"
value="<?php echo e($emailSettings->email_name ?? ''); ?>"
placeholder="es. Nome Cognome">
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="form-group">
<label for="reply_to">Email Risposta (Reply-To)</label>
<input type="email" name="reply_to" id="reply_to" class="form-control"
value="<?php echo e($emailSettings->reply_to ?? ''); ?>">
</div>
</div>
</div>
</div>
</div>
</div>
<div class="tab-pane" id="email-sync">
<div class="card card-primary">
<div class="card-header">
<h3 class="card-title">Sincronizzazione</h3>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6">
<div class="form-group">
<label for="sync_interval_minutes">Intervallo Sync (minuti)</label>
<select name="sync_interval_minutes" id="sync_interval_minutes" class="form-control">
<option value="1" <?php echo e(($emailSettings->sync_interval_minutes ?? 5) == 1 ? 'selected' : ''); ?>>1 minuto</option>
<option value="5" <?php echo e(($emailSettings->sync_interval_minutes ?? 5) == 5 ? 'selected' : ''); ?>>5 minuti</option>
<option value="15" <?php echo e(($emailSettings->sync_interval_minutes ?? 5) == 15 ? 'selected' : ''); ?>>15 minuti</option>
<option value="30" <?php echo e(($emailSettings->sync_interval_minutes ?? 5) == 30 ? 'selected' : ''); ?>>30 minuti</option>
<option value="60" <?php echo e(($emailSettings->sync_interval_minutes ?? 5) == 60 ? 'selected' : ''); ?>>1 ora</option>
</select>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label>Stato Connessione</label>
<div class="mt-2">
<?php if($emailSettings->last_sync_at): ?>
<span class="badge badge-success">
<i class="fas fa-check-circle"></i> Ultimo sync: <?php echo e($emailSettings->last_sync_at->format('d/m/Y H:i')); ?>
</span>
<?php else: ?>
<span class="badge badge-secondary">
<i class="fas fa-clock"></i> Mai sincronizzato
</span>
<?php endif; ?>
</div>
</div>
</div>
</div>
<div class="form-group">
<div class="custom-control custom-switch">
<input type="checkbox" class="custom-control-input" id="is_active"
name="is_active" value="1" <?php echo e(($emailSettings->is_active ?? false) ? 'checked' : ''); ?>>
<label class="custom-control-label" for="is_active">Account Email Attivo</label>
</div>
</div>
</div>
</div>
</div>
<div class="tab-pane" id="email-firma">
<div class="card card-primary">
<div class="card-header">
<h3 class="card-title">Firma Email</h3>
</div>
<div class="card-body">
<div class="form-group">
<div class="custom-control custom-switch">
<input type="checkbox" class="custom-control-input" id="signature_enabled"
name="signature_enabled" value="1" <?php echo e(($emailSettings->signature_enabled ?? true) ? 'checked' : ''); ?>>
<label class="custom-control-label" for="signature_enabled">Attiva firma automatica</label>
</div>
<small class="text-muted">Quando attivo, la firma verrà aggiunta in fondo a ogni email inviata</small>
</div>
<hr>
<div class="form-group">
<label for="signature">Testo Firma (formato HTML)</label>
<div id="signature-editor" style="height: 200px;"></div>
<input type="hidden" name="signature" id="signature_input" value="<?php echo e($emailSettings->signature ?? ''); ?>">
<small class="text-muted">Usa il riquadro sopra per comporre la tua firma. HTML supportato.</small>
</div>
</div>
</div>
</div>
</div>
<div class="card-footer">
<button type="submit" class="btn btn-primary">
<i class="fas fa-save mr-1"></i> Salva Impostazioni Email
</button>
<button type="button" class="btn btn-info ml-2" onclick="testConnection()">
<i class="fas fa-plug mr-1"></i> Test Connessione IMAP
</button>
<button type="button" class="btn btn-success ml-2" onclick="testSmtp()">
<i class="fas fa-paper-plane mr-1"></i> Test Invio Email (SMTP)
</button>
<a href="<?php echo e(route('impostazioni.email.sync')); ?>" class="btn btn-warning ml-2">
<i class="fas fa-sync mr-1"></i> Sincronizza Ora
</a>
</div>
</form>
</div>
<div class="tab-pane" id="calendario">
<div class="card card-primary">
<div class="card-header">
<h3 class="card-title">Calendari Remoti</h3>
</div>
<div class="card-body">
<p class="text-muted">Configura la sincronizzazione con calendari esterni (Google Calendar, CalDAV, ecc.).</p>
<div class="alert alert-info">
<i class="fas fa-info-circle"></i>
<strong>Prossimamente:</strong> Potrai collegare calendari Google, Infomaniak o altri provider CalDAV per sincronizzare gli eventi del calendario.
</div>
<div class="text-center p-5 bg-light rounded">
<i class="fas fa-calendar-plus fa-4x text-muted mb-3"></i>
<p class="text-muted">Nessun calendario remoto configurato.</p>
<p class="text-muted small">La funzionalità sarà disponibile in un prossimo aggiornamento.</p>
</div>
</div>
</div>
</div>
<div class="tab-pane active" id="tipologie">
<div class="card card-primary">
<div class="card-header">
@@ -242,6 +541,82 @@
</div>
</div>
<div class="tab-pane" id="tipologie-eventi">
<div class="card card-primary">
<div class="card-header">
<h3 class="card-title">Tipologie Eventi</h3>
</div>
<div class="card-body">
<p class="text-muted">Gestisci le tipologie disponibili per gli eventi del calendario.</p>
<?php if(session('success')): ?>
<div class="alert alert-success"><?php echo e(session('success')); ?></div>
<?php endif; ?>
<?php if(session('error')): ?>
<div class="alert alert-danger"><?php echo e(session('error')); ?></div>
<?php endif; ?>
<div class="mb-3">
<button type="button" class="btn btn-success btn-sm" data-toggle="modal" data-target="#addTipologiaEventoModal">
<i class="fas fa-plus"></i> Nuova Tipologia
</button>
</div>
<table class="table table-bordered table-striped" id="tipologie-eventi-table">
<thead>
<tr>
<th style="width: 40px;">Ordine</th>
<th>Nome</th>
<th>Descrizione</th>
<th style="width: 100px;">Stato</th>
<th style="width: 150px;">Azioni</th>
</tr>
</thead>
<tbody id="tipologie-eventi-sortable">
<?php $__currentLoopData = $tipologieEventi; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $tipologia): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<tr data-id="<?php echo e($tipologia->id); ?>">
<td class="text-center">
<i class="fas fa-arrows-alt handle" style="cursor: grab;"></i>
</td>
<td>
<span class="tipologia-evento-nome"><?php echo e($tipologia->nome); ?></span>
</td>
<td><?php echo e($tipologia->descrizione ?? '-'); ?></td>
<td>
<?php if($tipologia->attiva): ?>
<span class="badge badge-success">Attiva</span>
<?php else: ?>
<span class="badge badge-secondary">Disattivata</span>
<?php endif; ?>
</td>
<td>
<button type="button" class="btn btn-xs btn-warning" onclick="editTipologiaEvento(<?php echo e($tipologia->id); ?>, '<?php echo e(addslashes($tipologia->nome)); ?>', '<?php echo e(addslashes($tipologia->descrizione ?? '')); ?>', <?php echo e($tipologia->attiva ? 'true' : 'false'); ?>)">
<i class="fas fa-edit"></i>
</button>
<?php if($tipologia->eventi()->count() == 0): ?>
<form method="POST" action="<?php echo e(route('impostazioni.tipologie-eventi.destroy', $tipologia->id)); ?>" style="display: inline;">
<?php echo csrf_field(); ?>
<?php echo method_field('DELETE'); ?>
<button type="submit" class="btn btn-xs btn-danger" onclick="return confirm('Eliminare questa tipologia?')">
<i class="fas fa-trash"></i>
</button>
</form>
<?php else: ?>
<button type="button" class="btn btn-xs btn-danger" disabled title="Eventi associati: <?php echo e($tipologia->eventi()->count()); ?>">
<i class="fas fa-trash"></i>
</button>
<?php endif; ?>
</td>
</tr>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
</tbody>
</table>
</div>
</div>
</div>
<div class="tab-pane" id="ruoli">
<div class="card card-primary">
<div class="card-header">
@@ -316,84 +691,11 @@
</div>
</div>
</div>
<div class="tab-pane" id="tipologie-eventi">
<div class="card card-primary">
<div class="card-header">
<h3 class="card-title">Tipologie Eventi</h3>
</div>
<div class="card-body">
<p class="text-muted">Gestisci le tipologie disponibili per gli eventi del calendario.</p>
<?php if(session('success')): ?>
<div class="alert alert-success"><?php echo e(session('success')); ?></div>
<?php endif; ?>
<?php if(session('error')): ?>
<div class="alert alert-danger"><?php echo e(session('error')); ?></div>
<?php endif; ?>
<div class="mb-3">
<button type="button" class="btn btn-success btn-sm" data-toggle="modal" data-target="#addTipologiaEventoModal">
<i class="fas fa-plus"></i> Nuova Tipologia
</button>
</div>
<table class="table table-bordered table-striped" id="tipologie-eventi-table">
<thead>
<tr>
<th style="width: 40px;">Ordine</th>
<th>Nome</th>
<th>Descrizione</th>
<th style="width: 100px;">Stato</th>
<th style="width: 150px;">Azioni</th>
</tr>
</thead>
<tbody id="tipologie-eventi-sortable">
<?php $__currentLoopData = $tipologieEventi; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $tipologia): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<tr data-id="<?php echo e($tipologia->id); ?>">
<td class="text-center">
<i class="fas fa-arrows-alt handle" style="cursor: grab;"></i>
</td>
<td>
<span class="tipologia-evento-nome"><?php echo e($tipologia->nome); ?></span>
</td>
<td><?php echo e($tipologia->descrizione ?? '-'); ?></td>
<td>
<?php if($tipologia->attiva): ?>
<span class="badge badge-success">Attiva</span>
<?php else: ?>
<span class="badge badge-secondary">Disattivata</span>
<?php endif; ?>
</td>
<td>
<button type="button" class="btn btn-xs btn-warning" onclick="editTipologiaEvento(<?php echo e($tipologia->id); ?>, '<?php echo e(addslashes($tipologia->nome)); ?>', '<?php echo e(addslashes($tipologia->descrizione ?? '')); ?>', <?php echo e($tipologia->attiva ? 'true' : 'false'); ?>)">
<i class="fas fa-edit"></i>
</button>
<?php if($tipologia->eventi()->count() == 0): ?>
<form method="POST" action="<?php echo e(route('impostazioni.tipologie-eventi.destroy', $tipologia->id)); ?>" style="display: inline;">
<?php echo csrf_field(); ?>
<?php echo method_field('DELETE'); ?>
<button type="submit" class="btn btn-xs btn-danger" onclick="return confirm('Eliminare questa tipologia?')">
<i class="fas fa-trash"></i>
</button>
</form>
<?php else: ?>
<button type="button" class="btn btn-xs btn-danger" disabled title="Eventi associati: <?php echo e($tipologia->eventi()->count()); ?>">
<i class="fas fa-trash"></i>
</button>
<?php endif; ?>
</td>
</tr>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="modal fade" id="addTipologiaModal">
<div class="modal-dialog">
<div class="modal-content">
@@ -458,6 +760,7 @@
</div>
</div>
<div class="modal fade" id="addRuoloModal">
<div class="modal-dialog">
<div class="modal-content">
@@ -522,6 +825,7 @@
</div>
</div>
<div class="modal fade" id="addTipologiaEventoModal">
<div class="modal-dialog">
<div class="modal-content">
@@ -643,7 +947,6 @@ var sortableTipologie = Sortable.create(document.getElementById('tipologie-sorta
$('#tipologie-sortable tr').each(function() {
order.push($(this).data('id'));
});
fetch('<?php echo e(route('impostazioni.tipologie.reorder')); ?>', {
method: 'POST',
headers: {
@@ -663,7 +966,6 @@ var sortableRuoli = Sortable.create(document.getElementById('ruoli-sortable'), {
$('#ruoli-sortable tr').each(function() {
order.push($(this).data('id'));
});
fetch('<?php echo e(route('impostazioni.ruoli.reorder')); ?>', {
method: 'POST',
headers: {
@@ -683,7 +985,6 @@ var sortableTipologieEventi = Sortable.create(document.getElementById('tipologie
$('#tipologie-eventi-sortable tr').each(function() {
order.push($(this).data('id'));
});
fetch('<?php echo e(route('impostazioni.tipologie-eventi.reorder')); ?>', {
method: 'POST',
headers: {
@@ -704,6 +1005,150 @@ $('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
sortableTipologieEventi.refresh();
}
});
// ===== EMAIL FUNCTIONS =====
function testConnection() {
$.ajax({
url: '<?php echo e(route('impostazioni.email.test')); ?>',
method: 'POST',
headers: { 'X-CSRF-TOKEN': '<?php echo e(csrf_token()); ?>' },
success: function(response) {
if (response.success) {
alert('✅ ' + response.message);
} else {
alert('❌ ' + response.message);
}
},
error: function() {
alert('❌ Errore nella richiesta');
}
});
}
function testSmtp() {
var email = prompt('Inserisci l\'indirizzo email a cui inviare il test:');
if (!email) return;
if (!email.includes('@')) {
alert('⚠️ Indirizzo email non valido');
return;
}
var btn = event.target;
btn.disabled = true;
btn.innerHTML = '<i class="fas fa-spinner fa-spin"></i> Invio...';
$.ajax({
url: '<?php echo e(route('impostazioni.email.testSmtp')); ?>',
method: 'POST',
headers: { 'X-CSRF-TOKEN': '<?php echo e(csrf_token()); ?>' },
data: { email: email },
timeout: 30000,
success: function(response) {
btn.disabled = false;
btn.innerHTML = '<i class="fas fa-paper-plane mr-1"></i> Test Invio Email (SMTP)';
if (response.success) {
alert('✅ ' + response.message);
} else {
alert('❌ ' + response.message);
}
},
error: function(xhr, status, error) {
btn.disabled = false;
btn.innerHTML = '<i class="fas fa-paper-plane mr-1"></i> Test Invio Email (SMTP)';
if (xhr.responseJSON && xhr.responseJSON.message) {
alert('❌ ' + xhr.responseJSON.message);
} else {
alert('❌ Errore: ' + status + ' - ' + error);
}
}
});
}
function createEditor() {
var container = document.querySelector('#signature-editor');
if (!container || container.querySelector('.ql-toolbar')) return;
var quill = new Quill('#signature-editor', {
theme: 'snow',
modules: {
toolbar: [
['bold', 'italic', 'underline'],
[{ 'color': [] }, { 'background': [] }],
[{ 'header': 1 }, { 'header': 2 }, { 'header': 3 }],
[{ 'align': [] }],
[{ 'list': 'ordered'}, { 'list': 'bullet' }],
['link', 'image'],
['clean', 'code']
]
}
});
var signatureInput = document.getElementById('signature_input');
var isEditingHtml = false;
quill.getModule('toolbar').addHandler('code', function() {
if (!isEditingHtml) {
var textarea = document.createElement('textarea');
textarea.className = 'ql-editor';
textarea.style.cssText = 'font-family: monospace; min-height: 150px; width: 100%;';
textarea.value = signatureInput.value;
quill.root.innerHTML = '';
quill.root.appendChild(textarea);
textarea.focus();
isEditingHtml = true;
} else {
var textarea = quill.root.querySelector('textarea');
if (textarea) {
signatureInput.value = textarea.value;
quill.root.innerHTML = textarea.value;
}
isEditingHtml = false;
}
});
if (signatureInput.value) {
quill.root.innerHTML = signatureInput.value;
}
quill.on('text-change', function() {
if (!isEditingHtml) {
signatureInput.value = quill.root.innerHTML;
}
});
}
function initSignatureEditor() {
if (document.querySelector('#signature-editor .ql-toolbar')) return;
if (typeof Quill === 'undefined') {
var script = document.createElement('script');
script.src = 'https://cdn.quilljs.com/1.3.7/quill.min.js';
script.onload = createEditor;
document.head.appendChild(script);
var link = document.createElement('link');
link.rel = 'stylesheet';
link.href = 'https://cdn.quilljs.com/1.3.7/quill.snow.css';
document.head.appendChild(link);
} else {
createEditor();
}
}
$('a[data-toggle="tab"]').on('shown.bs.tab', function(e) {
var target = $(e.target).attr('href');
if (target === '#email-firma' || target === '#email') {
setTimeout(initSignatureEditor, 100);
}
});
if (window.location.hash === '#email') {
$(document).ready(function() {
setTimeout(initSignatureEditor, 300);
});
}
</script>
<?php $__env->stopSection(); ?>
<?php echo $__env->make('layouts.adminlte', array_diff_key(get_defined_vars(), ['__data' => 1, '__path' => 1]))->render(); ?><?php /**PATH /var/www/html/glastree/resources/views/impostazioni/index.blade.php ENDPATH**/ ?>
@@ -42,9 +42,10 @@
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
</select>
</div>
<input type="hidden" name="is_admin" value="0">
<div class="form-group">
<div class="custom-control custom-switch">
<input type="checkbox" class="custom-control-input" id="isAdmin" name="is_admin" value="1">
<input type="checkbox" class="custom-control-input" id="isAdmin" name="is_admin" value="1" <?php echo e(old('is_admin') === '1' ? 'checked' : ''); ?>>
<label class="custom-control-label" for="isAdmin">Superadmin (bypass ACL)</label>
</div>
</div>
@@ -61,12 +62,12 @@
</tr>
</thead>
<tbody>
<?php $__currentLoopData = ['individui', 'gruppi', 'eventi', 'documenti', 'mailing', 'viste']; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $module): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<?php $__currentLoopData = \App\Models\User::MODULES; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $module): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<tr>
<td><strong><?php echo e(ucfirst($module)); ?></strong></td>
<td><input type="radio" name="permissions[<?php echo e($module); ?>]" value="0" <?php echo e(old('permissions.' . $module, '1') == '0' ? 'checked' : ''); ?>></td>
<td><input type="radio" name="permissions[<?php echo e($module); ?>]" value="1" <?php echo e(old('permissions.' . $module, '1') == '1' ? 'checked' : ''); ?>></td>
<td><input type="radio" name="permissions[<?php echo e($module); ?>]" value="2" <?php echo e(old('permissions.' . $module, '1') == '2' ? 'checked' : ''); ?>></td>
<td><input type="radio" name="permissions[<?php echo e($module); ?>]" value="0" <?php echo e(old('permissions.' . $module, $module === 'settings' ? '0' : '1') == '0' ? 'checked' : ''); ?>></td>
<td><input type="radio" name="permissions[<?php echo e($module); ?>]" value="1" <?php echo e(old('permissions.' . $module, $module === 'settings' ? '0' : '1') == '1' ? 'checked' : ''); ?>></td>
<td><input type="radio" name="permissions[<?php echo e($module); ?>]" value="2" <?php echo e(old('permissions.' . $module, $module === 'settings' ? '0' : '1') == '2' ? 'checked' : ''); ?>></td>
</tr>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
</tbody>
@@ -23,6 +23,9 @@ $canDeleteEventi = Auth::user()->canDelete('eventi');
<a href="/eventi/calendar" class="btn btn-sm btn-outline-primary mr-2">
<i class="fas fa-calendar-alt mr-1"></i> Calendario
</a>
<button type="button" class="btn btn-sm btn-success mr-2" onclick="exportSelectedIcs()">
<i class="fas fa-calendar-plus mr-1"></i> Esporta ICS
</button>
<?php if($canDeleteEventi): ?>
<div class="btn-group mr-2">
<button type="button" class="btn btn-sm btn-danger" onclick="deleteSelected()">
@@ -313,6 +316,34 @@ function deleteSelected() {
$('#deleteModal').modal('show');
}
function exportSelectedIcs() {
const selectedIds = getSelectedIds();
const form = document.createElement('form');
form.method = 'POST';
form.action = '/eventi/export-ics';
const csrfToken = document.querySelector('meta[name="csrf-token"]')?.content || '<?php echo e(csrf_token()); ?>';
let html = `<input type="hidden" name="_token" value="${csrfToken}">`;
if (selectedIds.length > 0) {
selectedIds.forEach(function(id) {
html += `<input type="hidden" name="ids[]" value="${id}">`;
});
} else {
const params = new URLSearchParams(window.location.search);
params.forEach(function(value, key) {
if (key === 'search') html += `<input type="hidden" name="search" value="${value}">`;
if (key === 'gruppo_id') html += `<input type="hidden" name="gruppo_id" value="${value}">`;
if (key === 'tipo') html += `<input type="hidden" name="tipo" value="${value}">`;
});
}
form.innerHTML = html;
document.body.appendChild(form);
form.submit();
}
</script>
<?php $__env->stopSection(); ?>
<?php echo $__env->make('layouts.adminlte', array_diff_key(get_defined_vars(), ['__data' => 1, '__path' => 1]))->render(); ?><?php /**PATH /var/www/html/glastree/resources/views/eventi/index.blade.php ENDPATH**/ ?>
@@ -203,23 +203,15 @@ $appName = \App\Models\AppSetting::getAppName() ?? 'Glastree';
</a>
</li>
<?php endif; ?>
<?php if(Auth::user()->isSuperAdmin()): ?>
<li class="nav-item has-treeview">
<a href="/impostazioni" class="nav-link">
<?php if(Auth::user()->canManage('settings')): ?>
<li class="nav-item">
<a href="/impostazioni" class="nav-link <?php echo e(request()->is('impostazioni*') ? 'active' : ''); ?>">
<i class="nav-icon fas fa-cog"></i>
<p>Impostazioni <i class="right fas fa-angle-left"></i></p>
<p>Impostazioni</p>
</a>
<ul class="nav nav-treeview">
<li class="nav-item">
<a href="/impostazioni/email" class="nav-link">
<i class="nav-icon fas fa-envelope"></i>
<p>Impostazione Email</p>
</a>
</li>
</ul>
</li>
<li class="nav-item">
<a href="/admin/utenti" class="nav-link">
<a href="/admin/utenti" class="nav-link <?php echo e(request()->is('admin*') ? 'active' : ''); ?>">
<i class="nav-icon fas fa-users-cog"></i>
<p>Admin</p>
</a>