fix mailing an email

This commit is contained in:
2026-06-23 08:05:51 +02:00
parent c5127da750
commit def8d22544
2479 changed files with 325393 additions and 781 deletions
@@ -46,9 +46,20 @@
<td>{{ $backup['size_formatted'] }}</td>
<td>
@if($backup['manifest'])
@php $components = $backup['manifest']['included_components'] ?? ['database']; @endphp
<span class="badge badge-info" title="PHP {{ $backup['manifest']['php_version'] ?? '?' }}, Laravel {{ $backup['manifest']['laravel_version'] ?? '?' }}">
<i class="fas fa-database mr-1"></i>DB
</span>
@if(in_array('env', $components))
<span class="badge badge-secondary" title="Configurazione .env">
<i class="fas fa-cog mr-1"></i>.env
</span>
@endif
@if(in_array('files', $components))
<span class="badge badge-warning" title="File caricati">
<i class="fas fa-file mr-1"></i>Files
</span>
@endif
@if(isset($backup['manifest']['db_name']))
<small class="text-muted">{{ $backup['manifest']['db_name'] }}</small>
@endif
@@ -31,6 +31,9 @@
<a href="#signature" class="list-group-item list-group-item-action" data-toggle="tab">
<i class="nav-icon fas fa-signature"></i> Firma
</a>
<a href="#firme" class="list-group-item list-group-item-action" data-toggle="tab">
<i class="nav-icon fas fa-pen-fancy"></i> Firme Multiple
</a>
<a href="#mittenti" class="list-group-item list-group-item-action" data-toggle="tab">
<i class="nav-icon fas fa-user-plus"></i> Mittenti Aggiuntivi
</a>
@@ -197,12 +200,32 @@
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="form-group">
<label for="from_email">Email Mittente Ufficiale <small class="text-muted">(se diversa dall'indirizzo IMAP)</small></label>
<input type="email" name="from_email" id="from_email" class="form-control"
value="{{ $settings->from_email ?? '' }}"
placeholder="es. ufficiale@esempio.it">
<small class="text-muted">Se impostata, viene usata come mittente e Reply-To nelle email in uscita</small>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label for="from_name">Nome Mittente Ufficiale</label>
<input type="text" name="from_name" id="from_name" class="form-control"
value="{{ $settings->from_name ?? '' }}"
placeholder="es. Nome Ufficiale">
</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="{{ $settings->reply_to ?? '' }}">
<small class="text-muted">Usato solo se "Email Mittente Ufficiale" non è impostata</small>
</div>
</div>
</div>
@@ -284,6 +307,64 @@
</div>
</div>
<div class="tab-pane" id="firme">
<div class="card card-primary">
<div class="card-header">
<h3 class="card-title">Firme Multiple</h3>
<div class="card-tools">
<button type="button" class="btn btn-sm btn-success" data-toggle="modal" data-target="#firmaModal" onclick="resetFirmaForm()">
<i class="fas fa-plus mr-1"></i> Nuova Firma
</button>
</div>
</div>
<div class="card-body">
@if($firme->count() > 0)
<div class="table-responsive">
<table class="table table-bordered table-hover table-sm">
<thead>
<tr>
<th>Nome</th>
<th>Anteprima</th>
<th>Predefinita</th>
<th style="width: 140px;">Azioni</th>
</tr>
</thead>
<tbody>
@foreach($firme as $firma)
<tr>
<td><strong>{{ $firma->nome }}</strong></td>
<td><small class="text-muted">{!! Str::limit(strip_tags($firma->contenuto_html), 80) !!}</small></td>
<td>
@if($firma->is_default)
<span class="badge badge-success"><i class="fas fa-check"></i> Default</span>
@else
<form action="{{ route('impostazioni.firma.default', $firma->id) }}" method="POST" class="d-inline" onsubmit="return confirm('Impostare questa firma come predefinita?')">
@csrf @method('PUT')
<button type="submit" class="btn btn-xs btn-outline-secondary">Imposta default</button>
</form>
@endif
</td>
<td>
<button type="button" class="btn btn-xs btn-info" onclick="editFirma({{ $firma->id }}, '{{ addslashes($firma->nome) }}', '{{ addslashes($firma->contenuto_html ?? '') }}')">
<i class="fas fa-edit"></i>
</button>
<form action="{{ route('impostazioni.firma.destroy', $firma->id) }}" method="POST" class="d-inline" onsubmit="return confirm('Eliminare questa firma?')">
@csrf @method('DELETE')
<button type="submit" class="btn btn-xs btn-danger"><i class="fas fa-trash"></i></button>
</form>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
@else
<p class="text-muted">Nessuna firma multipla configurata. La firma predefinita nella scheda "Firma" verrà usata come fallback.</p>
@endif
</div>
</div>
</div>
<div class="tab-pane" id="mittenti">
<div class="card card-primary">
<div class="card-header">
@@ -513,9 +594,47 @@
</div>
</div>
<div class="modal fade" id="firmaModal" tabindex="-1" role="dialog">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content">
<form id="firmaForm" method="POST" action="{{ route('impostazioni.firma.store') }}">
@csrf
<input type="hidden" name="_method" id="firmaMethod" value="POST">
<input type="hidden" name="id" id="firmaId" value="">
<div class="modal-header bg-primary">
<h5 class="modal-title" id="firmaModalTitle"><i class="fas fa-pen-fancy mr-2"></i>Nuova Firma</h5>
<button type="button" class="close text-white" data-dismiss="modal">&times;</button>
</div>
<div class="modal-body">
<div class="form-group">
<label for="firma_nome">Nome *</label>
<input type="text" name="nome" id="firma_nome" class="form-control" required placeholder="Es: Default, Personale, Ufficio">
</div>
<div class="form-group">
<label>Contenuto Firma (HTML)</label>
<div id="firma-quill-editor" style="height: 200px;"></div>
<input type="hidden" name="contenuto_html" id="firma_contenuto_input" value="">
</div>
<div class="form-group">
<div class="custom-control custom-checkbox">
<input type="checkbox" class="custom-control-input" id="firma_is_default" name="is_default" value="1">
<label class="custom-control-label" for="firma_is_default">Imposta come predefinita</label>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Annulla</button>
<button type="submit" class="btn btn-primary"><i class="fas fa-save mr-1"></i> Salva Firma</button>
</div>
</form>
</div>
</div>
</div>
@section('scripts')
<script>
let senderAccounts = @json($senderAccounts);
let firmaQuillInstance = null;
function resetSenderForm() {
document.getElementById('senderForm').action = '{{ route('impostazioni.sender.store') }}';
@@ -696,13 +815,89 @@ function createEditor() {
quillEditorInstance = quill;
}
function resetFirmaForm() {
document.getElementById('firmaForm').action = '{{ route('impostazioni.firma.store') }}';
document.getElementById('firmaMethod').value = 'POST';
document.getElementById('firmaModalTitle').textContent = 'Nuova Firma';
document.getElementById('firmaForm').reset();
document.getElementById('firmaId').value = '';
if (firmaQuillInstance) {
firmaQuillInstance.root.innerHTML = '';
}
document.getElementById('firma_contenuto_input').value = '';
}
function editFirma(id, nome, contenuto) {
document.getElementById('firmaForm').action = '{{ route('impostazioni.firma.update', '__ID__') }}'.replace('__ID__', id);
document.getElementById('firmaMethod').value = 'PUT';
document.getElementById('firmaModalTitle').textContent = 'Modifica Firma - ' + nome;
document.getElementById('firmaId').value = id;
document.getElementById('firma_nome').value = nome;
if (firmaQuillInstance && contenuto) {
firmaQuillInstance.root.innerHTML = contenuto;
document.getElementById('firma_contenuto_input').value = contenuto;
}
$('#firmaModal').modal('show');
}
function initFirmaQuill() {
var container = document.querySelector('#firma-quill-editor');
if (!container || firmaQuillInstance) return;
var quill = new Quill('#firma-quill-editor', {
theme: 'snow',
modules: {
toolbar: [
['bold', 'italic', 'underline'],
[{ 'color': [] }, { 'background': [] }],
[{ 'header': 1 }, { 'header': 2 }, { 'header': 3 }],
[{ 'align': [] }],
[{ 'list': 'ordered'}, { 'list': 'bullet' }],
['link', 'image'],
['clean']
]
}
});
var input = document.getElementById('firma_contenuto_input');
quill.on('text-change', function() {
input.value = quill.root.innerHTML;
});
firmaQuillInstance = quill;
}
$('#firmaModal').on('shown.bs.modal', function () {
if (typeof Quill === 'undefined') {
var script = document.createElement('script');
script.src = 'https://cdn.quilljs.com/1.3.7/quill.min.js';
script.onload = function() {
var link = document.createElement('link');
link.rel = 'stylesheet';
link.href = 'https://cdn.quilljs.com/1.3.7/quill.snow.css';
document.head.appendChild(link);
setTimeout(initFirmaQuill, 200);
};
document.head.appendChild(script);
} else {
setTimeout(initFirmaQuill, 100);
}
});
function initSignatureEditor() {
if (quillEditorInstance) 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;
script.onload = function() {
var link = document.createElement('link');
link.rel = 'stylesheet';
link.href = 'https://cdn.quilljs.com/1.3.7/quill.snow.css';
document.head.appendChild(link);
setTimeout(createEditor, 200);
};
document.head.appendChild(script);
var link = document.createElement('link');
+15 -2
View File
@@ -17,7 +17,7 @@
<div class="form-group">
<label for="mittente_id">Da (mittente)</label>
<select name="mittente_id" id="mittente_id" class="form-control">
<option value="0">Sistema {{ optional(\App\Models\EmailSetting::getActive())->email_address ?? 'Configura email' }}</option>
<option value="0">Sistema {{ optional(\App\Models\EmailSetting::getActive())->getEffectiveFromAddress() ?? 'Configura email' }}</option>
@foreach($senderAccounts as $sender)
<option value="{{ $sender->id }}">{{ $sender->email_name ?: $sender->email_address }} &lt;{{ $sender->email_address }}&gt;</option>
@endforeach
@@ -45,7 +45,7 @@
<div id="individui-input" class="destinatari-section" style="display: none;">
<select name="individui[]" id="individui-select" class="form-control" multiple size="5">
@foreach($individui as $ind)
<option value="{{ $ind->id }}">{{ $ind->cognito }} {{ $ind->nome }} ({{ $ind->email_primaria ?? 'senza email' }})</option>
<option value="{{ $ind->id }}">{{ $ind->nome }} {{ $ind->cognome }} ({{ $ind->email_primaria ?? 'senza email' }})</option>
@endforeach
</select>
<small class="text-muted">Tieni premuto Ctrl per selezionare più individui</small>
@@ -84,6 +84,19 @@
<textarea name="body" id="body" class="form-control" rows="15" required>{{ $prefill['body'] ?? '' }}</textarea>
</div>
@if($firme->count() > 0)
<div class="form-group">
<label for="firma_id">Firma</label>
<select name="firma_id" id="firma_id" class="form-control">
<option value="">Nessuna</option>
@foreach($firme as $firma)
<option value="{{ $firma->id }}">{{ $firma->nome }}</option>
@endforeach
</select>
<small class="text-muted">Seleziona la firma da appender al messaggio.</small>
</div>
@endif
<div class="form-group">
<label>Allegati</label>
<div class="border rounded p-3 bg-light">
+108 -3
View File
@@ -2,6 +2,26 @@
@section('title', 'Nuovo Gruppo')
@section('page_title', 'Nuovo Gruppo')
@push('styles')
<link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" />
<link href="https://cdn.jsdelivr.net/npm/select2-bootstrap4-theme@1.0.0/dist/select2-bootstrap4.min.css" rel="stylesheet" />
<style>
.select2-container--bootstrap4 .select2-selection--multiple .select2-selection__choice {
color: #333;
}
.select2-container--bootstrap4 .select2-selection--multiple .select2-search__field {
height: 28px !important;
min-height: 28px !important;
width: auto !important;
min-width: 30px;
border: none !important;
background: transparent !important;
margin: 0;
padding: 0 4px;
}
</style>
@endpush
@section('content')
<form action="/gruppi" method="POST">
@csrf
@@ -37,10 +57,9 @@
</div>
<div class="form-group">
<label>Diocesi</label>
<select name="diocesi_id" class="form-control">
<option value="">Seleziona...</option>
<select name="diocesi_ids[]" class="form-control select2-multi" multiple style="width: 100%;">
@foreach($diocesi as $d)
<option value="{{ $d->id }}" {{ old('diocesi_id') == $d->id ? 'selected' : '' }}>{{ $d->nome }}</option>
<option value="{{ $d->id }}" {{ in_array($d->id, old('diocesi_ids', [])) ? 'selected' : '' }}>{{ $d->nome }}</option>
@endforeach
</select>
</div>
@@ -89,6 +108,33 @@
</div>
</div>
<div class="card mt-3">
<div class="card-header">
<h3 class="card-title"><i class="fas fa-address-book mr-2"></i>Contatti del Gruppo</h3>
<button type="button" class="btn btn-xs btn-success float-right" onclick="aggiungiContatto()">
<i class="fas fa-plus mr-1"></i> Aggiungi Contatto
</button>
</div>
<div class="card-body p-0">
<table class="table table-bordered mb-0" id="contatti-table">
<thead class="thead-light">
<tr>
<th style="width: 20%;">Tipo</th>
<th style="width: 40%;">Valore</th>
<th style="width: 25%;">Etichetta</th>
<th style="width: 80px;">Primario</th>
<th style="width: 50px;"></th>
</tr>
</thead>
<tbody id="contatti-tbody">
</tbody>
</table>
<div id="no-contatti-msg" class="text-center text-muted py-4">
<p class="mb-0">Nessun contatto. Clicca su "Aggiungi Contatto" per iniziare.</p>
</div>
</div>
</div>
<div class="card mt-3">
<div class="card-header">
<h3 class="card-title"><i class="fas fa-users mr-2"></i>Membri</h3>
@@ -138,10 +184,69 @@
@endsection
@section('scripts')
<script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>
<script>
$(document).ready(function() {
$('.select2-multi').select2({
theme: 'bootstrap4',
placeholder: 'Cerca diocesi...',
width: '100%',
sorter: function(data) {
return data.sort(function(a, b) {
if (a.selected && !b.selected) return -1;
if (!a.selected && b.selected) return 1;
return a.text.localeCompare(b.text, 'it');
});
},
language: {
noResults: function() { return 'Nessuna diocesi trovata'; },
searching: function() { return 'Ricerca...'; }
}
});
});
let contattiIndex = 0;
let membriIndex = 0;
const membriResponsabiliMap = new Map();
function aggiungiContatto() {
const tbody = document.getElementById('contatti-tbody');
const noMsg = document.getElementById('no-contatti-msg');
if (noMsg) noMsg.style.display = 'none';
const row = document.createElement('tr');
const idx = contattiIndex;
row.innerHTML = `
<td>
<select name="contatti[${idx}][tipo]" class="form-control" required>
<option value="">Seleziona...</option>
<option value="email">Email</option>
<option value="telefono">Telefono</option>
<option value="cellulare">Cellulare</option>
</select>
</td>
<td><input type="text" name="contatti[${idx}][valore]" class="form-control" placeholder="Es. info@example.com" required></td>
<td><input type="text" name="contatti[${idx}][etichetta]" class="form-control" placeholder="Es. Ufficio"></td>
<td class="text-center">
<div class="custom-control custom-checkbox">
<input type="checkbox" class="custom-control-input" id="contatto-primary-${idx}" name="contatti[${idx}][is_primary]" value="1">
<label class="custom-control-label" for="contatto-primary-${idx}"></label>
</div>
</td>
<td><button type="button" class="btn btn-danger btn-xs" onclick="rimuoviContatto(this)"><i class="fas fa-trash"></i></button></td>
`;
tbody.appendChild(row);
contattiIndex++;
}
function rimuoviContatto(btn) {
const row = btn.closest('tr');
row.remove();
if (document.getElementById('contatti-tbody').children.length === 0) {
document.getElementById('no-contatti-msg').style.display = 'block';
}
}
function aggiungiMembro() {
const tbody = document.getElementById('membri-tbody');
const noMsg = document.getElementById('no-membri-msg');
+131 -3
View File
@@ -2,6 +2,26 @@
@section('title', 'Modifica Gruppo')
@section('page_title', 'Modifica Gruppo')
@push('styles')
<link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" />
<link href="https://cdn.jsdelivr.net/npm/select2-bootstrap4-theme@1.0.0/dist/select2-bootstrap4.min.css" rel="stylesheet" />
<style>
.select2-container--bootstrap4 .select2-selection--multiple .select2-selection__choice {
color: #333;
}
.select2-container--bootstrap4 .select2-selection--multiple .select2-search__field {
height: 28px !important;
min-height: 28px !important;
width: auto !important;
min-width: 30px;
border: none !important;
background: transparent !important;
margin: 0;
padding: 0 4px;
}
</style>
@endpush
@section('content')
<form action="/gruppi/{{ $gruppo->id }}" method="POST">
@csrf @method('PUT')
@@ -31,10 +51,9 @@
</div>
<div class="form-group">
<label>Diocesi</label>
<select name="diocesi_id" class="form-control">
<option value="">Seleziona...</option>
<select name="diocesi_ids[]" class="form-control select2-multi" multiple style="width: 100%;">
@foreach($diocesi as $d)
<option value="{{ $d->id }}" {{ old('diocesi_id', $gruppo->diocesi_id) == $d->id ? 'selected' : '' }}>{{ $d->nome }}</option>
<option value="{{ $d->id }}" {{ in_array($d->id, old('diocesi_ids', $selectedDiocesiIds ?? [])) ? 'selected' : '' }}>{{ $d->nome }}</option>
@endforeach
</select>
</div>
@@ -91,6 +110,55 @@
</div>
</div>
<div class="card mt-3">
<div class="card-header">
<h3 class="card-title"><i class="fas fa-address-book mr-2"></i>Contatti del Gruppo</h3>
<button type="button" class="btn btn-xs btn-success float-right" onclick="aggiungiContatto()">
<i class="fas fa-plus mr-1"></i> Aggiungi Contatto
</button>
</div>
<div class="card-body p-0">
<table class="table table-bordered mb-0" id="contatti-table">
<thead class="thead-light">
<tr>
<th style="width: 20%;">Tipo</th>
<th style="width: 40%;">Valore</th>
<th style="width: 25%;">Etichetta</th>
<th style="width: 80px;">Primario</th>
<th style="width: 50px;"></th>
</tr>
</thead>
<tbody id="contatti-tbody">
@forelse(old('contatti', $gruppo->gruppoContatti) as $idx => $contatto)
@php $contattoVal = is_array($contatto) ? $contatto : $contatto->toArray(); @endphp
<tr>
<td>
<select name="contatti[{{ $idx }}][tipo]" class="form-control" required>
<option value="email" {{ ($contattoVal['tipo'] ?? '') === 'email' ? 'selected' : '' }}>Email</option>
<option value="telefono" {{ ($contattoVal['tipo'] ?? '') === 'telefono' ? 'selected' : '' }}>Telefono</option>
<option value="cellulare" {{ ($contattoVal['tipo'] ?? '') === 'cellulare' ? 'selected' : '' }}>Cellulare</option>
</select>
</td>
<td><input type="text" name="contatti[{{ $idx }}][valore]" class="form-control" value="{{ $contattoVal['valore'] ?? '' }}" required></td>
<td><input type="text" name="contatti[{{ $idx }}][etichetta]" class="form-control" value="{{ $contattoVal['etichetta'] ?? '' }}" placeholder="Es. Ufficio"></td>
<td class="text-center">
<div class="custom-control custom-checkbox">
<input type="checkbox" class="custom-control-input" id="contatto-primary-{{ $idx }}" name="contatti[{{ $idx }}][is_primary]" value="1" {{ !empty($contattoVal['is_primary']) ? 'checked' : '' }}>
<label class="custom-control-label" for="contatto-primary-{{ $idx }}"></label>
</div>
</td>
<td><button type="button" class="btn btn-danger btn-xs" onclick="rimuoviContatto(this)"><i class="fas fa-trash"></i></button></td>
</tr>
@empty
@endforelse
</tbody>
</table>
<div id="no-contatti-msg" class="text-center text-muted py-4" style="{{ $gruppo->gruppoContatti->count() > 0 ? 'display:none;' : '' }}">
<p class="mb-0">Nessun contatto. Clicca su "Aggiungi Contatto" per iniziare.</p>
</div>
</div>
</div>
<div class="card mt-3">
<div class="card-header">
<h3 class="card-title"><i class="fas fa-users mr-2"></i>Membri</h3>
@@ -352,7 +420,67 @@
@endsection
@section('scripts')
<script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>
<script>
$(document).ready(function() {
$('.select2-multi').select2({
theme: 'bootstrap4',
placeholder: 'Cerca diocesi...',
width: '100%',
sorter: function(data) {
return data.sort(function(a, b) {
if (a.selected && !b.selected) return -1;
if (!a.selected && b.selected) return 1;
return a.text.localeCompare(b.text, 'it');
});
},
language: {
noResults: function() { return 'Nessuna diocesi trovata'; },
searching: function() { return 'Ricerca...'; }
}
});
});
let contattiIndex = {{ old('contatti') ? count(old('contatti')) : $gruppo->gruppoContatti->count() }};
function aggiungiContatto() {
const tbody = document.getElementById('contatti-tbody');
const noMsg = document.getElementById('no-contatti-msg');
if (noMsg) noMsg.style.display = 'none';
const row = document.createElement('tr');
const idx = contattiIndex;
row.innerHTML = `
<td>
<select name="contatti[${idx}][tipo]" class="form-control" required>
<option value="">Seleziona...</option>
<option value="email">Email</option>
<option value="telefono">Telefono</option>
<option value="cellulare">Cellulare</option>
</select>
</td>
<td><input type="text" name="contatti[${idx}][valore]" class="form-control" placeholder="Es. info@example.com" required></td>
<td><input type="text" name="contatti[${idx}][etichetta]" class="form-control" placeholder="Es. Ufficio"></td>
<td class="text-center">
<div class="custom-control custom-checkbox">
<input type="checkbox" class="custom-control-input" id="contatto-primary-${idx}" name="contatti[${idx}][is_primary]" value="1">
<label class="custom-control-label" for="contatto-primary-${idx}"></label>
</div>
</td>
<td><button type="button" class="btn btn-danger btn-xs" onclick="rimuoviContatto(this)"><i class="fas fa-trash"></i></button></td>
`;
tbody.appendChild(row);
contattiIndex++;
}
function rimuoviContatto(btn) {
const row = btn.closest('tr');
row.remove();
if (document.getElementById('contatti-tbody').children.length === 0) {
document.getElementById('no-contatti-msg').style.display = 'block';
}
}
function showMembroForm() {
console.log('showMembroForm called');
var card = document.getElementById('membro-card');
+4 -4
View File
@@ -161,7 +161,7 @@ $entityType = $entityType ?? 'gruppi';
<td>{{ Str::limit($gruppo->descrizione, 50) ?: '-' }}</td>
@endif
@if(in_array('diocesi', $visibleColumns))
<td>{{ $gruppo->diocesi?->nome ?? '-' }}</td>
<td>{{ $gruppo->diocesi->count() > 0 ? $gruppo->diocesi->pluck('nome')->implode(', ') : '-' }}</td>
@endif
@if(in_array('livello', $visibleColumns))
<td><span class="badge badge-{{ ($gruppo->depth ?? 0) == 0 ? 'primary' : 'secondary' }}">{{ $gruppo->depth ?? 0 }}</span></td>
@@ -176,7 +176,7 @@ $entityType = $entityType ?? 'gruppi';
<td>
@php $resp = $gruppo->getResponsabili() @endphp
@if($resp->count() > 0)
{{ $resp->pluck('cognome')->implode(', ') }}
{{ $resp->map(fn($r) => $r->nome . ' ' . $r->cognome)->implode(', ') }}
@else
-
@endif
@@ -189,10 +189,10 @@ $entityType = $entityType ?? 'gruppi';
<td>{{ $gruppo->città_incontro ?: '-' }}</td>
@endif
@if(in_array('telefono', $visibleColumns))
<td>-</td>
<td>{{ $gruppo->telefono_primario ?? '-' }}</td>
@endif
@if(in_array('email', $visibleColumns))
<td>-</td>
<td>{{ $gruppo->email_primaria ?? '-' }}</td>
@endif
@if(in_array('tag', $visibleColumns))
<td>
@@ -20,7 +20,7 @@ $responsabili = $gruppo->getResponsabili();
</a>
<span class="badge badge-{{ ($gruppo->depth ?? 0) == 0 ? 'primary' : 'secondary' }} badge-level">{{ $gruppo->depth ?? 0 }}</span>
<small class="text-muted ml-2">
{{ $gruppo->diocesi?->nome ?? '' }}
{{ $gruppo->diocesi->count() > 0 ? $gruppo->diocesi->pluck('nome')->implode(', ') : '' }}
@if($responsabili->count() > 0)
· <i class="fas fa-user text-info"></i> {{ $responsabili->pluck('cognome')->implode(', ') }}
@endif
+172 -142
View File
@@ -26,7 +26,7 @@ $canDeleteGruppi = Auth::user()->canDelete('gruppi');
</div>
@endif
<div class="row">
<div class="col-md-4">
<div class="col-md-12">
<div class="card card-success">
<div class="card-header">
<h3 class="card-title">
@@ -35,52 +35,113 @@ $canDeleteGruppi = Auth::user()->canDelete('gruppi');
</h3>
</div>
<div class="card-body">
<table class="table table-sm table-borderless">
<tr>
<td style="width: 130px;"><strong>Path:</strong></td>
<td class="text-muted small">{{ $gruppo->full_path }}</td>
</tr>
<tr>
<td><strong>Gruppo Padre:</strong></td>
<td>
@if($gruppo->parent)
<a href="{{ route('gruppi.show', $gruppo->parent->id) }}">{{ $gruppo->parent->nome }}</a>
@else
<span class="badge badge-success">Gruppo radice</span>
<div class="row">
<div class="col-md-6">
<table class="table table-sm table-borderless mb-0">
<tr>
<td style="width: 130px;"><strong>Path:</strong></td>
<td class="text-muted small">{{ $gruppo->full_path }}</td>
</tr>
<tr>
<td><strong>Gruppo Padre:</strong></td>
<td>
@if($gruppo->parent)
<a href="{{ route('gruppi.show', $gruppo->parent->id) }}">{{ $gruppo->parent->nome }}</a>
@else
<span class="badge badge-success">Gruppo radice</span>
@endif
</td>
</tr>
<tr>
<td><strong>Diocesi:</strong></td>
<td>
@if($gruppo->diocesi->count() > 0)
@foreach($gruppo->diocesi as $diocesi)
<span class="badge badge-secondary mr-1">{{ $diocesi->nome }}</span>
@endforeach
@else
<span class="text-muted">-</span>
@endif
</td>
</tr>
</table>
</div>
<div class="col-md-6">
<table class="table table-sm table-borderless mb-0">
<tr>
<td style="width: 130px;"><strong>Responsabili:</strong></td>
<td>
@php $responsabili = $gruppo->getResponsabili() @endphp
@if($responsabili->count() > 0)
@foreach($responsabili as $resp)
<a href="{{ route('individui.show', $resp->id) }}">
<i class="fas fa-user text-info mr-1"></i>
{{ $resp->nome_completo }}
</a><br>
@endforeach
@else
<span class="text-muted">-</span>
@endif
</td>
</tr>
<tr>
<td><strong>Email:</strong></td>
<td>{{ $gruppo->email_primaria ?? '-' }}</td>
</tr>
<tr>
<td><strong>Telefono:</strong></td>
<td>{{ $gruppo->telefono_primario ?? '-' }}</td>
</tr>
@if($gruppo->gruppoContatti->count() > 0)
<tr>
<td><strong>Altri Contatti:</strong></td>
<td>
@foreach($gruppo->gruppoContatti as $contatto)
@if(!$contatto->is_primary || ($contatto->tipo !== 'email' && $contatto->tipo !== 'telefono' && $contatto->tipo !== 'cellulare'))
<div>
@if($contatto->etichetta)<small class="text-muted">{{ $contatto->etichetta }}:</small>@endif
<span>{{ $contatto->valore }}</span>
</div>
@endif
@endforeach
</td>
</tr>
@endif
</td>
</tr>
<tr>
<td><strong>Diocesi:</strong></td>
<td>{{ $gruppo->diocesi?->nome ?? '-' }}</td>
</tr>
<tr>
<td><strong>Responsabili:</strong></td>
<td>
@php $responsabili = $gruppo->getResponsabili() @endphp
@if($responsabili->count() > 0)
@foreach($responsabili as $resp)
<a href="{{ route('individui.show', $resp->id) }}">
<i class="fas fa-user text-info mr-1"></i>
{{ $resp->nome_completo }}
</a><br>
@endforeach
@else
<span class="text-muted">-</span>
@endif
</td>
</tr>
</table>
</table>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card">
</div>
@php $incontroEvento = $gruppo->eventi->where('is_incontro_gruppo', true)->first(); @endphp
<div class="row mt-3">
<div class="col-md-3">
<div class="card h-100">
<div class="card-header"><h3 class="card-title"><i class="fas fa-chart-pie mr-2"></i>Statistiche</h3></div>
<div class="card-body d-flex align-items-center">
<div class="row text-center w-100">
<div class="col-6">
<h2 class="mb-0 text-primary">{{ $gruppo->individui->count() }}</h2>
<small class="text-muted">Membri</small>
</div>
<div class="col-6">
<h2 class="mb-0 text-warning">{{ $gruppo->children->count() }}</h2>
<small class="text-muted">Sottogruppi</small>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-3">
<div class="card h-100">
<div class="card-header"><h3 class="card-title"><i class="fas fa-map-marker-alt mr-2"></i>Luogo Incontro</h3></div>
<div class="card-body">
<table class="table table-sm table-borderless mb-0">
<tr>
<td style="width: 100px;"><strong>Indirizzo:</strong></td>
<td style="width: 80px;"><strong>Indirizzo:</strong></td>
<td>{{ $gruppo->indirizzo_incontro ?: '-' }}</td>
</tr>
<tr>
@@ -94,34 +155,78 @@ $canDeleteGruppi = Auth::user()->canDelete('gruppi');
</table>
@if($gruppo->mappa_posizione)
<a href="{{ $gruppo->mappa_posizione }}" target="_blank" class="btn btn-sm btn-outline-primary mt-2">
<i class="fas fa-external-link-alt mr-1"></i> Visualizza su mappa
<i class="fas fa-external-link-alt mr-1"></i> Mappa
</a>
@endif
</div>
</div>
</div>
<div class="col-md-4">
<div class="card">
<div class="card-header"><h3 class="card-title"><i class="fas fa-chart-pie mr-2"></i>Statistiche</h3></div>
@if($incontroEvento)
<div class="col-md-3">
<div class="card card-success h-100">
<div class="card-header">
<h3 class="card-title">
<i class="fas fa-calendar-check mr-2"></i>
Giorno di Incontro
</h3>
</div>
<div class="card-body">
<div class="row text-center">
<div class="col-6">
<div class="border-right">
<h2 class="mb-0 text-primary">{{ $gruppo->individui->count() }}</h2>
<small class="text-muted">Membri</small>
</div>
<table class="table table-sm table-borderless mb-0">
<tr>
<td style="width: 70px;"><strong>Evento:</strong></td>
<td>{{ $incontroEvento->nome_evento }}</td>
</tr>
<tr>
<td><strong>Quando:</strong></td>
<td>
@if($incontroEvento->tipo_recorrenza === 'settimanale')
{{ $incontroEvento->giorno_settimana_label }}
<span class="badge badge-info ml-1">Sett.</span>
@elseif($incontroEvento->tipo_recorrenza === 'mensile')
{{ $incontroEvento->occorrenza_mensile_label }}
<span class="badge badge-info ml-1">Mens.</span>
@elseif($incontroEvento->tipo_recorrenza === 'annuale')
{{ $incontroEvento->mese_annuale_label }}
<span class="badge badge-info ml-1">Ann.</span>
@elseif($incontroEvento->tipo_recorrenza === 'altro')
{{ $incontroEvento->giorno_settimana_label }}
<span class="badge badge-info ml-1">Altro</span>
@else
{{ $incontroEvento->data_specifica?->format('d/m/Y') ?: '-' }}
@endif
</td>
</tr>
@if($incontroEvento->ora_inizio)
<tr>
<td><strong>Ora:</strong></td>
<td>ore {{ $incontroEvento->ora_inizio->format('H:i') }}</td>
</tr>
@endif
</table>
@if($incontroEvento->responsabili->count() > 0)
<hr>
<small class="text-muted"><strong>Resp.:</strong></small>
@foreach($incontroEvento->responsabili as $resp)
<div class="mt-1">
<i class="fas fa-user text-info mr-1"></i>
<a href="/individui/{{ $resp->id }}">{{ $resp->cognome }} {{ $resp->nome }}</a>
@if($resp->telefono_primario)
<br><small class="text-success ml-3">{{ $resp->telefono_primario }}</small>
@endif
</div>
<div class="col-6">
<h2 class="mb-0 text-warning">{{ $gruppo->children->count() }}</h2>
<small class="text-muted">Sottogruppi</small>
</div>
</div>
@endforeach
@endif
<div class="mt-2">
<a href="/eventi/{{ $incontroEvento->id }}" class="btn btn-xs btn-outline-primary">
<i class="fas fa-eye mr-1"></i> Vedi
</a>
</div>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card">
@endif
<div class="col-md-3">
<div class="card h-100">
<div class="card-header">
<h3 class="card-title"><i class="fas fa-camera mr-2"></i>Avatar</h3>
</div>
@@ -130,113 +235,38 @@ $canDeleteGruppi = Auth::user()->canDelete('gruppi');
<img src="{{ $gruppo->avatar_url }}"
alt="{{ $gruppo->nome }}"
class="img-thumbnail mb-2"
style="max-width: 120px; max-height: 120px; object-fit: cover; border-radius: 50%;">
style="max-width: 100px; max-height: 100px; object-fit: cover; border-radius: 50%;">
<br>
<form id="remove-avatar-form" class="d-inline">
<button type="button" class="btn btn-danger btn-sm" onclick="removeAvatar()">
<i class="fas fa-trash mr-1"></i>Rimuovi
<i class="fas fa-trash mr-1"></i>
</button>
</form>
@else
<div class="bg-secondary d-flex align-items-center justify-content-center mb-3"
style="width: 120px; height: 120px; margin: 0 auto; border-radius: 50%;">
<i class="fas fa-folder fa-4x text-white"></i>
<div class="bg-secondary d-flex align-items-center justify-content-center mx-auto mb-3"
style="width: 100px; height: 100px; border-radius: 50%;">
<i class="fas fa-folder fa-3x text-white"></i>
</div>
@endif
<form id="avatar-upload-form" enctype="multipart/form-data">
@csrf
<div class="custom-file mb-2">
<input type="file" class="custom-file-input" id="avatar-input" name="avatar" accept="image/jpeg,image/png,image/gif,image/webp">
<label class="custom-file-label" for="avatar-input">Scegli immagine...</label>
<label class="custom-file-label" for="avatar-input">Scegli...</label>
</div>
<button type="button" class="btn btn-primary btn-sm" onclick="uploadAvatar()">
<i class="fas fa-upload mr-1"></i>Carica
<i class="fas fa-upload mr-1"></i> Carica
</button>
</form>
<div id="avatar-message" class="mt-2"></div>
</div>
</div>
</div>
</div>
@php
$incontroEvento = $gruppo->eventi->where('is_incontro_gruppo', true)->first();
@endphp
@if($incontroEvento)
<div class="row">
<div class="col-md-4">
<div class="card card-success">
<div class="card-header">
<h3 class="card-title">
<i class="fas fa-calendar-check mr-2"></i>
Giorno di Incontro
</h3>
</div>
<div class="card-body">
<table class="table table-sm table-borderless mb-0">
<tr>
<td style="width: 100px;"><strong>Evento:</strong></td>
<td>{{ $incontroEvento->nome_evento }}</td>
</tr>
<tr>
<td><strong>Quando:</strong></td>
<td>
@if($incontroEvento->tipo_recorrenza === 'settimanale')
{{ $incontroEvento->giorno_settimana_label }}
<span class="badge badge-info ml-1">Settimanale</span>
@elseif($incontroEvento->tipo_recorrenza === 'mensile')
{{ $incontroEvento->occorrenza_mensile_label }}
@if($incontroEvento->mesi_recorrenza)
<small class="text-muted">({{ $incontroEvento->mesi_recorrenza_label }})</small>
@endif
<span class="badge badge-info ml-1">Mensile</span>
@elseif($incontroEvento->tipo_recorrenza === 'annuale')
{{ $incontroEvento->mese_annuale_label }}
@if($incontroEvento->giorno_mese)
, giorno {{ $incontroEvento->giorno_mese }}
@endif
<span class="badge badge-info ml-1">Annuale</span>
@elseif($incontroEvento->tipo_recorrenza === 'altro')
{{ $incontroEvento->giorno_settimana_label }}
<span class="badge badge-info ml-1">Altro</span>
@else
{{ $incontroEvento->data_specifica?->format('d/m/Y') ?: '-' }}
@endif
</td>
</tr>
@if($incontroEvento->ora_inizio)
<tr>
<td><strong>Ora:</strong></td>
<td>ore {{ $incontroEvento->ora_inizio->format('H:i') }}</td>
</tr>
@endif
</table>
@if($incontroEvento->responsabili->count() > 0)
<hr>
<small class="text-muted"><strong>Responsabili:</strong></small>
@foreach($incontroEvento->responsabili as $resp)
<div class="mt-1">
<i class="fas fa-user text-info mr-1"></i>
<a href="/individui/{{ $resp->id }}">{{ $resp->cognome }} {{ $resp->nome }}</a>
@if($resp->telefono_primario)
<br><small class="text-success ml-3">{{ $resp->telefono_primario }}</small>
@endif
</div>
@endforeach
@endif
<div class="mt-2">
<a href="/eventi/{{ $incontroEvento->id }}" class="btn btn-xs btn-outline-primary">
<i class="fas fa-eye mr-1"></i> Vedi evento
</a>
</div>
</div>
</div>
</div>
</div>
@endif
@if($gruppo->descrizione)
@if($gruppo->descrizione)
<div class="row mt-3">
<div class="col-md-8">
<div class="col-md-12">
<div class="card">
<div class="card-header"><h3 class="card-title"><i class="fas fa-align-left mr-2"></i>Descrizione</h3></div>
<div class="card-body">
@@ -413,7 +443,7 @@ $canDeleteGruppi = Auth::user()->canDelete('gruppi');
{{ $child->nome }}
</a>
</td>
<td>{{ $child->diocesi?->nome ?? '-' }}</td>
<td>@if($child->diocesi->count() > 0)@foreach($child->diocesi as $dio)<span class="badge badge-secondary mr-1">{{ $dio->nome }}</span>@endforeach @else <span class="text-muted">-</span>@endif</td>
<td>{{ $child->getResponsabili()->isNotEmpty() ? $child->getResponsabili()->first()->nome_completo : '-' }}</td>
<td class="text-center">
@if($child->individui()->count() > 0)
@@ -384,6 +384,7 @@
<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>
<li class="nav-item"><a href="#email-firme" class="nav-link" data-toggle="tab">Firme Multiple</a></li>
<li class="nav-item"><a href="#email-mittenti" class="nav-link" data-toggle="tab">Mittenti Aggiuntivi</a></li>
</ul>
</div>
@@ -538,12 +539,32 @@
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="form-group">
<label for="from_email">Email Mittente Ufficiale <small class="text-muted">(se diversa dall'indirizzo IMAP)</small></label>
<input type="email" name="from_email" id="from_email" class="form-control"
value="{{ $emailSettings->from_email ?? '' }}"
placeholder="es. ufficiale@esempio.it">
<small class="text-muted">Se impostata, viene usata come mittente e Reply-To nelle email in uscita</small>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label for="from_name">Nome Mittente Ufficiale</label>
<input type="text" name="from_name" id="from_name" class="form-control"
value="{{ $emailSettings->from_name ?? '' }}"
placeholder="es. Nome Ufficiale">
</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="{{ $emailSettings->reply_to ?? '' }}">
<small class="text-muted">Usato solo se "Email Mittente Ufficiale" non è impostata</small>
</div>
</div>
</div>
@@ -625,6 +646,47 @@
</div>
</div>
<div class="tab-pane" id="email-firme">
<div class="card card-primary">
<div class="card-header">
<h3 class="card-title">Firme Multiple</h3>
<div class="card-tools">
<button type="button" class="btn btn-sm btn-success" onclick="window.location.href='/impostazioni/email#firme'">
<i class="fas fa-plus mr-1"></i> Gestisci Firme
</button>
</div>
</div>
<div class="card-body">
@php $firme = optional(\App\Models\EmailSetting::getActive())->firme ?? collect(); @endphp
@if($firme->count() > 0)
<div class="table-responsive">
<table class="table table-bordered table-hover table-sm">
<thead>
<tr>
<th>Nome</th>
<th>Anteprima</th>
<th>Predefinita</th>
</tr>
</thead>
<tbody>
@foreach($firme as $firma)
<tr>
<td><strong>{{ $firma->nome }}</strong></td>
<td><small class="text-muted">{!! Str::limit(strip_tags($firma->contenuto_html), 80) !!}</small></td>
<td>@if($firma->is_default)<span class="badge badge-success"><i class="fas fa-check"></i> Default</span>@endif</td>
</tr>
@endforeach
</tbody>
</table>
</div>
@else
<p class="text-muted">Nessuna firma multipla configurata. <a href="/impostazioni/email#firme">Gestisci firme nelle impostazioni avanzate.</a></p>
@endif
<p class="mt-2"><a href="/impostazioni/email#firme" class="btn btn-sm btn-primary"><i class="fas fa-cog mr-1"></i> Gestione completa firme</a></p>
</div>
</div>
</div>
<div class="tab-pane" id="email-mittenti">
<div class="card card-primary">
<div class="card-header">
+1 -1
View File
@@ -226,7 +226,7 @@
<i class="fas fa-folder text-warning mr-1"></i>
<a href="/gruppi/{{ $gruppo->id }}">{{ $gruppo->nome }}</a>
</td>
<td>{{ $gruppo->diocesi?->nome ?: '-' }}</td>
<td>{{ $gruppo->diocesi->count() > 0 ? $gruppo->diocesi->pluck('nome')->implode(', ') : '-' }}</td>
<td>
@php $ruoliIndividuo = $individuo->getRuoliForGruppo($gruppo->id) @endphp
@if($ruoliIndividuo->count() > 0)
+1 -1
View File
@@ -256,7 +256,7 @@ if (in_array($contatto->tipo, ['web', 'telegram'])) {
<i class="fas fa-folder text-warning mr-1"></i>
<a href="{{ url('/gruppi/' . $gruppo->id) }}">{{ $gruppo->nome }}</a>
</td>
<td>{{ $gruppo->diocesi?->nome ?: '-' }}</td>
<td>{{ $gruppo->diocesi->count() > 0 ? $gruppo->diocesi->pluck('nome')->implode(', ') : '-' }}</td>
<td>{{ $gruppo->getResponsabili()->isNotEmpty() ? $gruppo->getResponsabili()->first()->nome_completo : '-' }}</td>
<td>
@php
@@ -34,6 +34,32 @@
<hr>
@include('partials._tag-selector', ['allTags' => $tags ?? collect(), 'selectedTags' => old('tags', []), 'label' => 'Tag'])
@if(isset($firme) && $firme->count() > 0)
<div class="form-group">
<label for="firma_id">Firma predefinita</label>
<select name="firma_id" id="firma_id" class="form-control">
<option value="">Nessuna</option>
@foreach($firme as $firma)
<option value="{{ $firma->id }}">{{ $firma->nome }}</option>
@endforeach
</select>
<small class="text-muted">Firma da appender automaticamente quando invii email da questa lista.</small>
</div>
@endif
@if(isset($senderAccounts) && $senderAccounts->count() > 0)
<div class="form-group">
<label for="sender_account_id">Mittente predefinito</label>
<select name="sender_account_id" id="sender_account_id" class="form-control">
<option value="">Sistema predefinito</option>
@foreach($senderAccounts as $sender)
<option value="{{ $sender->id }}">{{ $sender->email_name ?: $sender->email_address }} &lt;{{ $sender->email_address }}&gt;</option>
@endforeach
</select>
<small class="text-muted">Mittente da usare automaticamente quando invii email da questa lista.</small>
</div>
@endif
<div class="alert alert-info">
<i class="fas fa-info-circle mr-1"></i>
<strong>Come aggiungere contatti:</strong> vai su <em>Individui</em>, seleziona le righe desired, e usa il menu <em>Azioni &gt; Crea Mailing List</em> per creare una lista dai contatti selezionati.
+49 -3
View File
@@ -34,6 +34,32 @@
@include('partials._tag-selector', ['allTags' => $tags ?? collect(), 'selectedTags' => $selectedTags ?? [], 'label' => 'Tag'])
@if(isset($firme) && $firme->count() > 0)
<div class="form-group">
<label for="firma_id">Firma predefinita</label>
<select name="firma_id" id="firma_id" class="form-control">
<option value="">Nessuna</option>
@foreach($firme as $firma)
<option value="{{ $firma->id }}" {{ $mailingList->firma_id == $firma->id ? 'selected' : '' }}>{{ $firma->nome }}</option>
@endforeach
</select>
<small class="text-muted">Firma da appender automaticamente quando invii email da questa lista.</small>
</div>
@endif
@if(isset($senderAccounts) && $senderAccounts->count() > 0)
<div class="form-group">
<label for="sender_account_id">Mittente predefinito</label>
<select name="sender_account_id" id="sender_account_id" class="form-control">
<option value="">Sistema predefinito</option>
@foreach($senderAccounts as $sender)
<option value="{{ $sender->id }}" {{ $mailingList->sender_account_id == $sender->id ? 'selected' : '' }}>{{ $sender->email_name ?: $sender->email_address }} &lt;{{ $sender->email_address }}&gt;</option>
@endforeach
</select>
<small class="text-muted">Mittente da usare automaticamente quando invii email da questa lista.</small>
</div>
@endif
<hr>
<div class="row">
@@ -65,6 +91,9 @@
<button type="button" class="btn btn-warning" onclick="deselezionaTutti()">
<i class="fas fa-square mr-1"></i> Deseleziona tutti
</button>
<button type="button" class="btn btn-danger" onclick="rimuoviSelezionati()">
<i class="fas fa-trash mr-1"></i> Rimuovi selezionati
</button>
</div>
<div id="no-email-warning" class="alert alert-warning alert-dismissible" role="alert" style="display:none;">
@@ -313,9 +342,26 @@ function renderContattiTable() {
}
function rimuoviContatto(btn) {
btn.closest('tr').remove();
const count = document.querySelectorAll('.contatto-checkbox').length;
document.getElementById('contatti-count').textContent = count;
const row = btn.closest('tr');
const cb = row.querySelector('.contatto-checkbox');
const id = parseInt(cb.value);
contattiCaricati = contattiCaricati.filter(function(c) { return c.individuo_id !== id; });
row.remove();
document.getElementById('contatti-count').textContent = contattiCaricati.length;
}
function rimuoviSelezionati() {
const checkboxes = document.querySelectorAll('.contatto-checkbox:checked');
if (checkboxes.length === 0) {
alert('Seleziona almeno un contatto da rimuovere.');
return;
}
checkboxes.forEach(function(cb) {
const id = parseInt(cb.value);
contattiCaricati = contattiCaricati.filter(function(c) { return c.individuo_id !== id; });
cb.closest('tr').remove();
});
document.getElementById('contatti-count').textContent = contattiCaricati.length;
}
function toggleSelectAll(source) {
+13
View File
@@ -26,6 +26,19 @@
</div>
@endif
@if(isset($firme) && $firme->count() > 0)
<div class="form-group">
<label for="firma_id">Firma</label>
<select name="firma_id" id="firma_id" class="form-control">
<option value="">Nessuna</option>
@foreach($firme as $firma)
<option value="{{ $firma->id }}">{{ $firma->nome }}</option>
@endforeach
</select>
<small class="text-muted">Seleziona la firma da appender al messaggio.</small>
</div>
@endif
<div class="form-group">
<label>Liste Destinatari *</label>
<select name="liste[]" id="liste" class="form-control" multiple required size="4">
+13
View File
@@ -27,6 +27,19 @@
</div>
@endif
@if(isset($firme) && $firme->count() > 0)
<div class="form-group">
<label for="firma_id">Firma</label>
<select name="firma_id" id="firma_id" class="form-control">
<option value="">Nessuna</option>
@foreach($firme as $firma)
<option value="{{ $firma->id }}">{{ $firma->nome }}</option>
@endforeach
</select>
<small class="text-muted">Seleziona la firma da appender al messaggio.</small>
</div>
@endif
@if($individui->count() > 0)
<div class="form-group" id="destinatari-form-group">
<label>Destinatari selezionati</label>