setup viste
This commit is contained in:
@@ -16,6 +16,7 @@ $allColumnsJson = json_encode($allColumns);
|
||||
$visibleColumnsJson = json_encode($visibleColumns);
|
||||
$canWriteIndividui = Auth::user()->canManage('individui');
|
||||
$canDeleteIndividui = Auth::user()->canDelete('individui');
|
||||
$entityType = $entityType ?? 'individui';
|
||||
@endphp
|
||||
|
||||
@section('content')
|
||||
@@ -23,6 +24,9 @@ $canDeleteIndividui = Auth::user()->canDelete('individui');
|
||||
<div class="card-header">
|
||||
<h3 class="card-title"><i class="fas fa-users mr-2"></i>Lista Individui</h3>
|
||||
<div class="card-tools">
|
||||
<button type="button" class="btn btn-secondary btn-sm mr-1" onclick="$('#table-settings-modal').modal('show')" title="Impostazioni tabella">
|
||||
<i class="fas fa-cog"></i>
|
||||
</button>
|
||||
<button type="button" class="btn btn-info btn-sm mr-1" onclick="toggleSearchPanel()">
|
||||
<i class="fas fa-search mr-1"></i> Ricerca/Filtri
|
||||
</button>
|
||||
@@ -61,9 +65,6 @@ $canDeleteIndividui = Auth::user()->canDelete('individui');
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
<button type="button" class="btn btn-primary btn-sm" onclick="showSaveVistaModal()">
|
||||
<i class="fas fa-save mr-1"></i> Salva Vista
|
||||
</button>
|
||||
@if($canWriteIndividui)
|
||||
<a href="{{ route('individui.import') }}" class="btn btn-warning btn-sm ml-2">
|
||||
<i class="fas fa-file-import mr-1"></i> Importa
|
||||
@@ -133,12 +134,16 @@ $canDeleteIndividui = Auth::user()->canDelete('individui');
|
||||
|
||||
@include('partials._tag-filter-bar', ['filterTags' => $allTags])
|
||||
|
||||
@include('partials.table-settings')
|
||||
|
||||
<div id="vista-data" style="display:none;">{{ $vistaDefaultJson }}</div>
|
||||
|
||||
<div class="card-body p-0">
|
||||
@if($individui->count() > 0)
|
||||
<table class="table table-bordered table-hover table-striped mb-0" id="individui-table">
|
||||
<thead class="thead-light">
|
||||
<tr>
|
||||
<th style="width: 40px;">
|
||||
<th style="width: 40px;" data-column="select">
|
||||
<div class="custom-control custom-checkbox">
|
||||
<input type="checkbox" class="custom-control-input" id="select-all" onchange="toggleSelectAll(this)">
|
||||
<label class="custom-control-label" for="select-all"></label>
|
||||
@@ -153,6 +158,39 @@ $canDeleteIndividui = Auth::user()->canDelete('individui');
|
||||
@if(in_array('nome', $visibleColumns))
|
||||
<th data-sortable="true" data-column="nome" onclick="sortTable('nome')">Nome <i class="fas fa-sort float-right"></i></th>
|
||||
@endif
|
||||
@if(in_array('data_nascita', $visibleColumns))
|
||||
<th data-column="data_nascita">Data Nascita</th>
|
||||
@endif
|
||||
@if(in_array('genere', $visibleColumns))
|
||||
<th data-column="genere">Genere</th>
|
||||
@endif
|
||||
@if(in_array('indirizzo', $visibleColumns))
|
||||
<th data-column="indirizzo">Indirizzo</th>
|
||||
@endif
|
||||
@if(in_array('cap', $visibleColumns))
|
||||
<th data-column="cap">CAP</th>
|
||||
@endif
|
||||
@if(in_array('citta', $visibleColumns))
|
||||
<th data-column="citta">Città</th>
|
||||
@endif
|
||||
@if(in_array('provincia', $visibleColumns))
|
||||
<th data-column="provincia">Prov.</th>
|
||||
@endif
|
||||
@if(in_array('tipo_documento', $visibleColumns))
|
||||
<th data-column="tipo_documento">Tipo Doc.</th>
|
||||
@endif
|
||||
@if(in_array('numero_documento', $visibleColumns))
|
||||
<th data-column="numero_documento">N. Documento</th>
|
||||
@endif
|
||||
@if(in_array('scadenza_documento', $visibleColumns))
|
||||
<th data-column="scadenza_documento">Scad. Doc.</th>
|
||||
@endif
|
||||
@if(in_array('note', $visibleColumns))
|
||||
<th data-column="note">Note</th>
|
||||
@endif
|
||||
@if(in_array('created_at', $visibleColumns))
|
||||
<th data-column="created_at">Creato il</th>
|
||||
@endif
|
||||
@if(in_array('email', $visibleColumns))
|
||||
<th data-sortable="true" data-column="email" onclick="sortTable('email')">Email <i class="fas fa-sort float-right"></i></th>
|
||||
@endif
|
||||
@@ -160,9 +198,9 @@ $canDeleteIndividui = Auth::user()->canDelete('individui');
|
||||
<th data-sortable="true" data-column="telefono" onclick="sortTable('telefono')">Telefono <i class="fas fa-sort float-right"></i></th>
|
||||
@endif
|
||||
@if(in_array('tag', $visibleColumns))
|
||||
<th>Tag</th>
|
||||
<th data-column="tag">Tag</th>
|
||||
@endif
|
||||
<th style="width: 120px;">Azioni</th>
|
||||
<th style="width: 120px;" data-column="azioni">Azioni</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="table-body">
|
||||
@@ -187,6 +225,39 @@ $canDeleteIndividui = Auth::user()->canDelete('individui');
|
||||
<a href="{{ url('/individui/' . $ind->id . '/edit') }}">{{ $ind->nome }}</a>
|
||||
</td>
|
||||
@endif
|
||||
@if(in_array('data_nascita', $visibleColumns))
|
||||
<td>{{ $ind->data_nascita ? $ind->data_nascita->format('d/m/Y') : '-' }}</td>
|
||||
@endif
|
||||
@if(in_array('genere', $visibleColumns))
|
||||
<td>{{ $ind->genere ?? '-' }}</td>
|
||||
@endif
|
||||
@if(in_array('indirizzo', $visibleColumns))
|
||||
<td>{{ $ind->indirizzo ?? '-' }}</td>
|
||||
@endif
|
||||
@if(in_array('cap', $visibleColumns))
|
||||
<td>{{ $ind->cap ?? '-' }}</td>
|
||||
@endif
|
||||
@if(in_array('citta', $visibleColumns))
|
||||
<td>{{ $ind->città ?? '-' }}</td>
|
||||
@endif
|
||||
@if(in_array('provincia', $visibleColumns))
|
||||
<td>{{ $ind->sigla_provincia ?? '-' }}</td>
|
||||
@endif
|
||||
@if(in_array('tipo_documento', $visibleColumns))
|
||||
<td>{{ $ind->tipo_documento ? str_replace(['carta_identita', 'patente'], ['C.I.', 'Patente'], $ind->tipo_documento) : '-' }}</td>
|
||||
@endif
|
||||
@if(in_array('numero_documento', $visibleColumns))
|
||||
<td>{{ $ind->numero_documento ?? '-' }}</td>
|
||||
@endif
|
||||
@if(in_array('scadenza_documento', $visibleColumns))
|
||||
<td>{{ $ind->scadenza_documento ? $ind->scadenza_documento->format('d/m/Y') : '-' }}</td>
|
||||
@endif
|
||||
@if(in_array('note', $visibleColumns))
|
||||
<td class="text-truncate" style="max-width: 200px;">{{ $ind->note ? Str::limit($ind->note, 50) : '-' }}</td>
|
||||
@endif
|
||||
@if(in_array('created_at', $visibleColumns))
|
||||
<td>{{ $ind->created_at ? $ind->created_at->format('d/m/Y') : '-' }}</td>
|
||||
@endif
|
||||
@if(in_array('email', $visibleColumns))
|
||||
<td>{{ $ind->getEmailPrimariaAttribute() ?: '-' }}</td>
|
||||
@endif
|
||||
@@ -266,75 +337,7 @@ $canDeleteIndividui = Auth::user()->canDelete('individui');
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<div class="modal fade" id="saveVistaModal" tabindex="-1" role="dialog">
|
||||
<div class="modal-dialog" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title"><i class="fas fa-save mr-2"></i>Salva Vista</h5>
|
||||
<button type="button" class="close" data-dismiss="modal">
|
||||
<span>×</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="form-group">
|
||||
<label>Nome Vista *</label>
|
||||
<input type="text" id="vista-nome" class="form-control" placeholder="Es. Elenco soci attivi">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>Colonne visibili</label>
|
||||
<div class="row" id="colonne-checkboxes">
|
||||
@foreach($allColumns as $col)
|
||||
<div class="col-md-6">
|
||||
<div class="custom-control custom-checkbox">
|
||||
<input type="checkbox" class="custom-control-input col-visibile" id="col-vis-{{ $col['key'] }}" value="{{ $col['key'] }}" {{ in_array($col['key'], $visibleColumns) ? 'checked' : '' }}>
|
||||
<label class="custom-control-label" for="col-vis-{{ $col['key'] }}">{{ $col['label'] }}</label>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="custom-control custom-checkbox">
|
||||
<input type="checkbox" class="custom-control-input" id="vista-default" value="true">
|
||||
<label class="custom-control-label" for="vista-default">Imposta come vista predefinita</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-secondary" data-dismiss="modal">Annulla</button>
|
||||
<button type="button" class="btn btn-primary" onclick="saveVista()">Salva</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="modal fade" id="colonneModal" tabindex="-1" role="dialog">
|
||||
<div class="modal-dialog" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title"><i class="fas fa-columns mr-2"></i>Colonne Visibili</h5>
|
||||
<button type="button" class="close" data-dismiss="modal">
|
||||
<span>×</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="row">
|
||||
@foreach($allColumns as $col)
|
||||
<div class="col-md-6">
|
||||
<div class="custom-control custom-checkbox">
|
||||
<input type="checkbox" class="custom-control-input col-toggle" id="col-toggle-{{ $col['key'] }}" value="{{ $col['key'] }}" {{ in_array($col['key'], $visibleColumns) ? 'checked' : '' }} onchange="toggleColumn('{{ $col['key'] }}', this.checked)">
|
||||
<label class="custom-control-label" for="col-toggle-{{ $col['key'] }}">{{ $col['label'] }}</label>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-secondary" data-dismiss="modal">Chiudi</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="modal fade" id="deleteModal" tabindex="-1" role="dialog">
|
||||
@if($canDeleteIndividui)
|
||||
@@ -519,6 +522,7 @@ $canDeleteIndividui = Auth::user()->canDelete('individui');
|
||||
@endsection
|
||||
|
||||
@section('scripts')
|
||||
<script src="{{ asset('js/column-manager.js') }}"></script>
|
||||
<script>
|
||||
let currentSort = { column: null, direction: 'asc' };
|
||||
let columnVisibility = {!! json_encode(array_column($allColumns, 'key')) !!};
|
||||
@@ -537,6 +541,16 @@ function applyGlobalSearch(value) {
|
||||
});
|
||||
}
|
||||
|
||||
function getColumnIndex(colKey) {
|
||||
const ths = document.querySelectorAll('#individui-table thead th');
|
||||
let idx = 0;
|
||||
for (const th of ths) {
|
||||
if (th.dataset.column === colKey) return idx;
|
||||
idx++;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
function applyColumnFilter() {
|
||||
const col = document.getElementById('filter-column').value;
|
||||
const op = document.getElementById('filter-operator').value;
|
||||
@@ -545,7 +559,8 @@ function applyColumnFilter() {
|
||||
if (!col || !val) return;
|
||||
|
||||
const rows = document.querySelectorAll('#table-body tr');
|
||||
const colIndex = { codice: 1, cognome: 2, nome: 3, email: 4, telefono: 5, tag: 6, azioni: 7 }[col];
|
||||
const colIndex = getColumnIndex(col);
|
||||
if (colIndex < 0) return;
|
||||
|
||||
rows.forEach(row => {
|
||||
const cells = row.querySelectorAll('td');
|
||||
@@ -577,7 +592,7 @@ function sortTable(column) {
|
||||
currentSort = { column: column, direction: 'asc' };
|
||||
}
|
||||
|
||||
const colIndex = { codice: 1, cognome: 2, nome: 3, email: 4, telefono: 5, tag: 6, azioni: 7 }[column];
|
||||
const colIndex = getColumnIndex(column);
|
||||
const tbody = document.getElementById('table-body');
|
||||
const rows = Array.from(tbody.querySelectorAll('tr'));
|
||||
|
||||
@@ -600,63 +615,7 @@ function sortTable(column) {
|
||||
});
|
||||
}
|
||||
|
||||
function toggleColumn(column, visible) {
|
||||
const colIndex = { codice: 1, cognome: 2, nome: 3, email: 4, telefono: 5, tag: 6, azioni: 7 }[column];
|
||||
const ths = document.querySelectorAll('#individui-table thead th');
|
||||
const rows = document.querySelectorAll('#table-body tr');
|
||||
|
||||
if (visible) {
|
||||
ths[colIndex].style.display = '';
|
||||
rows.forEach(row => {
|
||||
row.querySelectorAll('td')[colIndex].style.display = '';
|
||||
});
|
||||
} else {
|
||||
ths[colIndex].style.display = 'none';
|
||||
rows.forEach(row => {
|
||||
row.querySelectorAll('td')[colIndex].style.display = 'none';
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
async function saveVista() {
|
||||
let nome = document.getElementById('vista-nome').value.trim();
|
||||
if (!nome) {
|
||||
const now = new Date();
|
||||
nome = 'Vista ' + now.toLocaleDateString('it-IT') + ' ' + now.toLocaleTimeString('it-IT', { hour: '2-digit', minute: '2-digit' });
|
||||
}
|
||||
|
||||
const colonneVisibili = Array.from(document.querySelectorAll('#colonne-checkboxes input:checked')).map(i => i.value);
|
||||
const isDefault = document.getElementById('vista-default').checked;
|
||||
|
||||
const data = {
|
||||
nome: nome,
|
||||
tipo: 'individui',
|
||||
colonne_visibili: colonneVisibili,
|
||||
colonne_ordinamento: currentSort.column ? [[currentSort.column, currentSort.direction]] : [],
|
||||
ricerca: document.getElementById('global-search').value,
|
||||
is_default: isDefault
|
||||
};
|
||||
|
||||
try {
|
||||
const response = await fetch('/viste', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]')?.content || ''
|
||||
},
|
||||
body: JSON.stringify(data)
|
||||
});
|
||||
|
||||
if (response.ok) {
|
||||
alert('Vista salvata!');
|
||||
$('#saveVistaModal').modal('hide');
|
||||
} else {
|
||||
alert('Errore salvataggio');
|
||||
}
|
||||
} catch(e) {
|
||||
alert('Errore: ' + e.message);
|
||||
}
|
||||
}
|
||||
|
||||
function toggleSelectAll(source) {
|
||||
const checkboxes = document.querySelectorAll('.row-checkbox');
|
||||
@@ -863,24 +822,30 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||
document.head.appendChild(meta);
|
||||
}
|
||||
|
||||
const visibleCols = {!! $visibleColumnsJson !!};
|
||||
const allCols = {!! $allColumnsJson !!};
|
||||
|
||||
allCols.forEach(function(col) {
|
||||
const visibile = visibleCols.includes(col.key);
|
||||
const saveCheckbox = document.querySelector(`#col-vis-${col.key}`);
|
||||
const toggleCheckbox = document.querySelector(`#col-toggle-${col.key}`);
|
||||
if (saveCheckbox) saveCheckbox.checked = visibile;
|
||||
if (toggleCheckbox) toggleCheckbox.checked = visibile;
|
||||
});
|
||||
|
||||
const vistaDefault = {!! $vistaDefaultJson !!};
|
||||
if (vistaDefault && vistaDefault.ricerca) {
|
||||
document.getElementById('global-search').value = vistaDefault.ricerca;
|
||||
applyGlobalSearch(vistaDefault.ricerca);
|
||||
}
|
||||
|
||||
const table = document.getElementById('individui-table');
|
||||
if (table) {
|
||||
window.columnManager = new ColumnManager('individui-table', {
|
||||
entityType: 'individui',
|
||||
storageKey: 'cm_individui',
|
||||
resizable: true,
|
||||
reorderable: true,
|
||||
});
|
||||
initTableSettings();
|
||||
}
|
||||
});
|
||||
|
||||
window.printWithCurrentSettings = function () {
|
||||
if (window.columnManager) {
|
||||
window.columnManager.printWithSettings();
|
||||
}
|
||||
};
|
||||
|
||||
function showCreateMailingListModal() {
|
||||
document.getElementById('ml-nome').value = '';
|
||||
document.getElementById('ml-descrizione').value = '';
|
||||
|
||||
Reference in New Issue
Block a user