upgrade matrice with files
This commit is contained in:
+115
-28
@@ -121,9 +121,16 @@
|
||||
max-width: 260px;
|
||||
}
|
||||
|
||||
/* Azioni */
|
||||
/* Stato */
|
||||
#tabellaMescole th:nth-child(5),
|
||||
#tabellaMescole td:nth-child(5) {
|
||||
width: 140px;
|
||||
max-width: 140px;
|
||||
}
|
||||
|
||||
/* Azioni */
|
||||
#tabellaMescole th:nth-child(6),
|
||||
#tabellaMescole td:nth-child(6) {
|
||||
width: 330px;
|
||||
max-width: 330px;
|
||||
}
|
||||
@@ -147,7 +154,16 @@
|
||||
|
||||
<div class="card-body">
|
||||
<div class="d-flex justify-content-between align-items-center mb-3">
|
||||
<h6 class="fw-semibold mb-0">Elenco Completo</h6>
|
||||
<div class="d-flex align-items-center gap-3">
|
||||
<h6 class="fw-semibold mb-0">Elenco Completo</h6>
|
||||
|
||||
<select id="filterActive" class="form-select form-select-sm" style="width:220px;">
|
||||
<option value="all">Tutte</option>
|
||||
<option value="1" selected>Solo Attive</option>
|
||||
<option value="0">Solo Inattive</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<button class="btn btn-add" data-bs-toggle="modal" data-bs-target="#addMescolaModal">➕ Aggiungi Mescola</button>
|
||||
</div>
|
||||
|
||||
@@ -160,19 +176,36 @@
|
||||
<th>Nome Uscita</th>
|
||||
<th>Q.tà Totale</th>
|
||||
<th>Linee Associate</th>
|
||||
<th>Stato</th>
|
||||
<th>Azioni</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody>
|
||||
<?php
|
||||
$db = DBHandlerSelect::getInstance();
|
||||
$pdo = $db->getConnection();
|
||||
|
||||
// filtro: all / 1 / 0
|
||||
$activeFilter = $_GET['active'] ?? '1';
|
||||
if (!in_array($activeFilter, ['all', '0', '1'], true)) {
|
||||
$activeFilter = '1';
|
||||
}
|
||||
|
||||
$where = "";
|
||||
$params = [];
|
||||
|
||||
if ($activeFilter !== 'all') {
|
||||
$where = "WHERE m.is_active = ?";
|
||||
$params[] = (int)$activeFilter;
|
||||
}
|
||||
|
||||
// QTY IN SUBQUERY per evitare raddoppi dovuti alle linee
|
||||
$sql = "
|
||||
SELECT
|
||||
m.id,
|
||||
m.nomeuscita,
|
||||
m.is_active,
|
||||
IFNULL(q.qty_totale, 0) AS qty_totale,
|
||||
GROUP_CONCAT(DISTINCT pl.name SEPARATOR ', ') AS linee
|
||||
FROM mescole m
|
||||
@@ -183,50 +216,67 @@
|
||||
) q ON q.idmescola = m.id
|
||||
LEFT JOIN mescole_lines ml ON m.id = ml.idmescola
|
||||
LEFT JOIN production_lines pl ON ml.idlinea = pl.id
|
||||
$where
|
||||
GROUP BY m.id
|
||||
ORDER BY m.id DESC
|
||||
";
|
||||
|
||||
$stmt = $pdo->query($sql);
|
||||
$stmt = $pdo->prepare($sql);
|
||||
$stmt->execute($params);
|
||||
|
||||
if ($stmt->rowCount() === 0) {
|
||||
// DataTables-friendly: 5 TD reali
|
||||
// DataTables-friendly: 6 TD reali
|
||||
echo "<tr>
|
||||
<td class='text-muted'>-</td>
|
||||
<td class='text-muted'>Nessuna mescola presente</td>
|
||||
<td class='text-muted'>-</td>
|
||||
<td class='text-muted'>-</td>
|
||||
<td class='text-muted'>-</td>
|
||||
<td class='text-muted'>-</td>
|
||||
</tr>";
|
||||
} else {
|
||||
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
|
||||
$linee = $row['linee'] ? htmlspecialchars($row['linee']) : '<span class="text-muted">Nessuna</span>';
|
||||
$qtyTot = number_format((float)$row['qty_totale'], 3, ',', '.');
|
||||
|
||||
echo "<tr>
|
||||
<td>{$row['id']}</td>
|
||||
<td>" . htmlspecialchars($row['nomeuscita']) . "</td>
|
||||
<td><span class='fw-semibold'>{$qtyTot}</span></td>
|
||||
<td>{$linee}</td>
|
||||
<td>
|
||||
<button class='btn btn-sm btn-outline-dark associa-fornitori'
|
||||
data-id='{$row['id']}'
|
||||
data-nomeuscita='" . htmlspecialchars($row['nomeuscita'], ENT_QUOTES) . "'>
|
||||
🧾 Fornitori/Lotti
|
||||
</button>
|
||||
$isActive = (int)$row['is_active'] === 1;
|
||||
$badge = $isActive
|
||||
? "<span class='badge bg-success'>Attiva</span>"
|
||||
: "<span class='badge bg-secondary'>Inattiva</span>";
|
||||
|
||||
<button class='btn btn-sm btn-outline-primary associa-linee'
|
||||
data-id='{$row['id']}'>
|
||||
⚙️ Linee
|
||||
</button>
|
||||
$toggleText = $isActive ? "Disattiva" : "Attiva";
|
||||
$toggleClass = $isActive ? "btn-outline-warning" : "btn-outline-success";
|
||||
|
||||
<button class='btn btn-sm btn-outline-secondary edit-mescola'
|
||||
data-id='{$row['id']}'
|
||||
data-nomeuscita='" . htmlspecialchars($row['nomeuscita'], ENT_QUOTES) . "'>
|
||||
✏️ Modifica
|
||||
</button>
|
||||
</td>
|
||||
</tr>";
|
||||
echo "<tr data-mescola-id='{$row['id']}'>
|
||||
<td>{$row['id']}</td>
|
||||
<td>" . htmlspecialchars($row['nomeuscita']) . "</td>
|
||||
<td><span class='fw-semibold'>{$qtyTot}</span></td>
|
||||
<td>{$linee}</td>
|
||||
<td>{$badge}</td>
|
||||
<td>
|
||||
<button class='btn btn-sm btn-outline-dark associa-fornitori'
|
||||
data-id='{$row['id']}'
|
||||
data-nomeuscita='" . htmlspecialchars($row['nomeuscita'], ENT_QUOTES) . "'>
|
||||
🧾 Fornitori
|
||||
</button>
|
||||
|
||||
<button class='btn btn-sm btn-outline-primary associa-linee'
|
||||
data-id='{$row['id']}'>
|
||||
⚙️ Linee
|
||||
</button>
|
||||
|
||||
<button class='btn btn-sm {$toggleClass} toggle-active'
|
||||
data-id='{$row['id']}'>
|
||||
🔁 {$toggleText}
|
||||
</button>
|
||||
|
||||
<button class='btn btn-sm btn-outline-secondary edit-mescola'
|
||||
data-id='{$row['id']}'
|
||||
data-nomeuscita='" . htmlspecialchars($row['nomeuscita'], ENT_QUOTES) . "'>
|
||||
✏️ Modifica
|
||||
</button>
|
||||
</td>
|
||||
</tr>";
|
||||
}
|
||||
}
|
||||
?>
|
||||
@@ -400,6 +450,12 @@
|
||||
<script>
|
||||
/* ----------------- DATATABLE ----------------- */
|
||||
$(document).ready(function() {
|
||||
// init dropdown from URL
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
const activeParam = urlParams.get('active') || '1';
|
||||
$('#filterActive').val(activeParam);
|
||||
|
||||
// datatable
|
||||
$('#tabellaMescole').DataTable({
|
||||
order: [
|
||||
[0, 'desc']
|
||||
@@ -409,6 +465,39 @@
|
||||
url: 'https://cdn.datatables.net/plug-ins/1.13.6/i18n/it-IT.json'
|
||||
}
|
||||
});
|
||||
|
||||
// filter reload
|
||||
$('#filterActive').on('change', function() {
|
||||
const v = $(this).val();
|
||||
const url = new URL(window.location.href);
|
||||
url.searchParams.set('active', v);
|
||||
window.location.href = url.toString();
|
||||
});
|
||||
});
|
||||
|
||||
/* -------- TOGGLE ACTIVE -------- */
|
||||
$(document).on('click', '.toggle-active', function() {
|
||||
const id = $(this).data('id');
|
||||
|
||||
fetch('toggle_mescola_active.php', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/x-www-form-urlencoded'
|
||||
},
|
||||
body: `id=${encodeURIComponent(id)}`
|
||||
})
|
||||
.then(r => r.json())
|
||||
.then(data => {
|
||||
if (data.success) {
|
||||
location.reload();
|
||||
} else {
|
||||
Swal.fire({
|
||||
icon: "error",
|
||||
title: "Errore",
|
||||
text: data.message || "Operazione non riuscita"
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
/* -------- AGGIUNTA MESCOLA -------- */
|
||||
@@ -448,7 +537,6 @@
|
||||
$(document).on("click", ".edit-mescola", function() {
|
||||
$("#editIdMescola").val($(this).data("id"));
|
||||
$("#editNomeUscita").val($(this).data("nomeuscita"));
|
||||
// nome interno non lo abbiamo in tabella: lo lasciamo vuoto o lo recuperi se vuoi via endpoint
|
||||
$("#editNomeMescola").val("");
|
||||
$("#editMescolaModal").modal("show");
|
||||
});
|
||||
@@ -707,7 +795,6 @@
|
||||
if (data.success) {
|
||||
afResetForm();
|
||||
afLoadRows(idmescola);
|
||||
// se vuoi aggiornare anche la Q.tà Totale live senza reload: lo facciamo dopo
|
||||
} else {
|
||||
Swal.fire({
|
||||
icon: "error",
|
||||
|
||||
Reference in New Issue
Block a user