fixed view and multi

This commit is contained in:
Claudio 2025-12-03 09:55:42 +01:00
parent dd9d109dee
commit 77e5820dcc
8 changed files with 201 additions and 60 deletions

View File

@ -3,22 +3,31 @@ require_once("include/headscript.php");
$db = DBHandlerSelect::getInstance(); $db = DBHandlerSelect::getInstance();
$pdo = $db->getConnection(); $pdo = $db->getConnection();
$programmati = json_decode($_POST["programmati"], true); $programmati = json_decode($_POST["programmati"] ?? '[]', true);
$daProgrammare = json_decode($_POST["daProgrammare"], true); $daProgrammare = json_decode($_POST["daProgrammare"] ?? '[]', true);
$pdo->beginTransaction(); $pdo->beginTransaction();
foreach ($programmati as $p) { foreach ($programmati as $p) {
$stmt = $pdo->prepare("UPDATE productiondata SET id_status=6, priority=? WHERE id=?"); if (empty($p['id'])) {
$stmt->execute([$p["priority"], $p["id"]]); continue;
}
$stmt = $pdo->prepare(
"UPDATE productiondata SET id_status=6, priority=? WHERE id=?"
);
$stmt->execute([(int)$p["priority"], (int)$p["id"]]);
} }
foreach ($daProgrammare as $p) { foreach ($daProgrammare as $p) {
$stmt = $pdo->prepare("UPDATE productiondata SET id_status=1, priority=? WHERE id=?"); if (empty($p['id'])) {
$stmt->execute([$p["priority"], $p["id"]]); continue;
}
$stmt = $pdo->prepare(
"UPDATE productiondata SET id_status=1, priority=? WHERE id=?"
);
$stmt->execute([(int)$p["priority"], (int)$p["id"]]);
} }
$pdo->commit(); $pdo->commit();
echo json_encode(["success" => true]); echo json_encode(["success" => true]);

View File

@ -37,6 +37,16 @@ $(function () {
}, },
)); ));
}), }),
// NEW: se la pagina parte già con .wrapper.toggled, abilita subito l'hover
$(".wrapper").hasClass("toggled") &&
$(".sidebar-wrapper").hover(
function () {
$(".wrapper").addClass("sidebar-hovered");
},
function () {
$(".wrapper").removeClass("sidebar-hovered");
},
),
$(document).ready(function () { $(document).ready(function () {
$(window).on("scroll", function () { $(window).on("scroll", function () {
$(this).scrollTop() > 300 $(this).scrollTop() > 300

View File

@ -167,7 +167,7 @@ $rows_special = array_filter($rows, function ($r) {
</head> </head>
<body> <body>
<div class="wrapper"> <div class="wrapper toggled">
<?php include('include/navbar.php'); ?> <?php include('include/navbar.php'); ?>
<?php include('include/topbar.php'); ?> <?php include('include/topbar.php'); ?>
@ -191,6 +191,7 @@ $rows_special = array_filter($rows, function ($r) {
<table id="tabSpecialManager" class="table table-hover align-middle mb-0"> <table id="tabSpecialManager" class="table table-hover align-middle mb-0">
<thead> <thead>
<tr> <tr>
<th>Conf. Ord.</th>
<th>Matrice</th> <th>Matrice</th>
<th>Mescola</th> <th>Mescola</th>
<th>Linea</th> <th>Linea</th>
@ -220,6 +221,7 @@ $rows_special = array_filter($rows, function ($r) {
data-id="<?= (int)$r['id'] ?>" data-id="<?= (int)$r['id'] ?>"
data-seconds="<?= $sec ?>" data-seconds="<?= $sec ?>"
style="--rowcolor: <?= htmlspecialchars($r['line_color']) ?>;"> style="--rowcolor: <?= htmlspecialchars($r['line_color']) ?>;">
<td><?= htmlspecialchars($r['conferma_ordine'] ?? '') ?></td>
<td><?= htmlspecialchars($r['matrice']) ?></td> <td><?= htmlspecialchars($r['matrice']) ?></td>
<?php <?php
$mescRaw = $r['mescole_list'] ?? ''; $mescRaw = $r['mescole_list'] ?? '';
@ -306,6 +308,7 @@ $rows_special = array_filter($rows, function ($r) {
<table id="tabManager" class="table table-hover align-middle" style="width:100%"> <table id="tabManager" class="table table-hover align-middle" style="width:100%">
<thead> <thead>
<tr> <tr>
<th>Conf. Ord.</th>
<th>Matrice</th> <th>Matrice</th>
<th>Mescola</th> <th>Mescola</th>
<th>Linea</th> <th>Linea</th>
@ -334,6 +337,7 @@ $rows_special = array_filter($rows, function ($r) {
<tr data-id="<?= (int)$r['id'] ?>" <tr data-id="<?= (int)$r['id'] ?>"
data-status="<?= (int)$r['id_status'] ?>" data-status="<?= (int)$r['id_status'] ?>"
style="background-color: <?= htmlspecialchars($r['line_color']) ?>;"> style="background-color: <?= htmlspecialchars($r['line_color']) ?>;">
<td><?= htmlspecialchars($r['conferma_ordine'] ?? '') ?></td>
<td><?= htmlspecialchars($r['matrice']) ?></td> <td><?= htmlspecialchars($r['matrice']) ?></td>
<?php <?php
$mescRaw = $r['mescole_list'] ?? ''; $mescRaw = $r['mescole_list'] ?? '';
@ -615,7 +619,54 @@ $rows_special = array_filter($rows, function ($r) {
$("#imagePreviewModal").hide(); $("#imagePreviewModal").hide();
} }
}); });
// ===== MODALE MESCOLE (Multi) =====
$(document).on("click", ".showMescole", function(e) {
e.preventDefault();
e.stopPropagation();
// prendo la stringa grezza dallattributo, NON .data()
const raw = $(this).attr("data-list") || "[]";
let list = [];
try {
list = JSON.parse(raw);
} catch (err) {
console.error("Errore parsing mescole:", err, raw);
list = [];
}
let html = "";
list.forEach(m => {
html += `<li style="margin:4px 0;">${m}</li>`;
});
$("#mescoleList").html(html || '<li style="margin:4px 0;">Nessuna mescola</li>');
const modalEl = document.getElementById('mescoleModal');
const modal = bootstrap.Modal.getOrCreateInstance(modalEl);
modal.show();
});
</script> </script>
<!-- MODALE MESCOLE -->
<div class="modal fade" id="mescoleModal" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Mescole utilizzate</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Chiudi"></button>
</div>
<div class="modal-body">
<ul id="mescoleList" style="padding-left:1rem;"></ul>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary btn-sm" data-bs-dismiss="modal">Chiudi</button>
</div>
</div>
</div>
</div>
</body> </body>
</html> </html>

View File

@ -220,7 +220,7 @@
</head> </head>
<body> <body>
<div class="wrapper"> <div class="wrapper toggled">
<?php include('include/navbar.php'); ?> <?php include('include/navbar.php'); ?>
<?php include('include/topbar.php'); ?> <?php include('include/topbar.php'); ?>

View File

@ -895,7 +895,7 @@ if (!empty($_GET['ajax'])) {
</head> </head>
<body> <body>
<div class="wrapper"> <div class="wrapper toggled">
<?php include('include/navbar.php'); ?> <?php include('include/navbar.php'); ?>
<?php include('include/topbar.php'); ?> <?php include('include/topbar.php'); ?>

View File

@ -24,21 +24,6 @@ function selectOptions($arr, $sel = null, $val = 'id', $txt = 'nome')
if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['action'])) { if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['action'])) {
$action = $_POST['action']; $action = $_POST['action'];
$data = [
'idmatrice' => $_POST['idmatrice'],
'id_linea' => $_POST['id_linea'],
'id_cliente' => $_POST['id_cliente'] ?: null,
'data_zibo' => $_POST['data_zibo'] ?: null,
'data_cliente' => $_POST['data_cliente'] ?: null,
'metri' => $_POST['metri'] ?: 0,
'kg_sp' => $_POST['kg_sp'] ?: 0,
'kg_p' => $_POST['kg_p'] ?: 0,
'ore_previste' => $_POST['ore_previste'] ?: 0,
'note_extra' => $_POST['note_extra'] ?: null,
'id_status' => $_POST['id_status'] ?? 1
];
try { try {
// ============================ // ============================
@ -46,24 +31,42 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['action'])) {
// ============================ // ============================
if ($action === 'insert') { if ($action === 'insert') {
$dataInsert = [
'Data' => $_POST['Data'],
'data_produzione' => $_POST['data_produzione'],
'idmatrice' => $_POST['idmatrice'],
'id_linea' => $_POST['id_linea'],
'id_cliente' => $_POST['id_cliente'] ?: null,
'data_zibo' => $_POST['data_zibo'] ?: null,
'data_cliente' => $_POST['data_cliente'] ?: null,
'metri' => $_POST['metri'] ?: 0,
'kg_sp' => $_POST['kg_sp'] ?: 0,
'kg_p' => $_POST['kg_p'] ?: 0,
'ore_previste' => $_POST['ore_previste'] ?: 0,
'note_extra' => $_POST['note_extra'] ?: null,
'id_status' => $_POST['id_status'] ?? 1,
'conferma_ordine' => $_POST['conferma_ordine'] ?: null,
];
$sql = "INSERT INTO productiondata $sql = "INSERT INTO productiondata
(Data, idmatrice, id_linea, id_cliente, data_zibo, data_cliente, (Data, data_produzione, conferma_ordine,
metri, kg_sp, kg_p, ore_previste, note_extra, data_produzione, id_status) idmatrice, id_linea, id_cliente, data_zibo, data_cliente,
metri, kg_sp, kg_p, ore_previste, note_extra, id_status)
VALUES VALUES
(:Data, :idmatrice, :id_linea, :id_cliente, :data_zibo, :data_cliente, (:Data, :data_produzione, :conferma_ordine,
:metri, :kg_sp, :kg_p, :ore_previste, :note_extra, :data_produzione, :id_status)"; :idmatrice, :id_linea, :id_cliente, :data_zibo, :data_cliente,
:metri, :kg_sp, :kg_p, :ore_previste, :note_extra, :id_status)";
$stmt = $pdo->prepare($sql); $stmt = $pdo->prepare($sql);
$stmt->execute($data); $stmt->execute($dataInsert);
// QUI devi prendere il nuovo ID // nuovo ID
$idProd = $pdo->lastInsertId(); $idProd = $pdo->lastInsertId();
// cancella vecchie associazioni (non serve ma per sicurezza) // reset associazioni mescole
$pdo->prepare("DELETE FROM productiondata_mescole WHERE id_productiondata=?") $pdo->prepare("DELETE FROM productiondata_mescole WHERE id_productiondata=?")
->execute([$idProd]); ->execute([$idProd]);
// aggiungi nuove
if (!empty($_POST['mescole'])) { if (!empty($_POST['mescole'])) {
$ins = $pdo->prepare("INSERT INTO productiondata_mescole (id_productiondata, id_mescola) VALUES (?, ?)"); $ins = $pdo->prepare("INSERT INTO productiondata_mescole (id_productiondata, id_mescola) VALUES (?, ?)");
foreach ($_POST['mescole'] as $m) { foreach ($_POST['mescole'] as $m) {
@ -79,27 +82,41 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['action'])) {
// ============================ // ============================
elseif ($action === 'update' && !empty($_POST['id'])) { elseif ($action === 'update' && !empty($_POST['id'])) {
$data['id'] = $_POST['id']; $dataUpdate = [
'id' => $_POST['id'],
'idmatrice' => $_POST['idmatrice'],
'id_linea' => $_POST['id_linea'],
'id_cliente' => $_POST['id_cliente'] ?: null,
'data_zibo' => $_POST['data_zibo'] ?: null,
'data_cliente' => $_POST['data_cliente'] ?: null,
'metri' => $_POST['metri'] ?: 0,
'kg_sp' => $_POST['kg_sp'] ?: 0,
'kg_p' => $_POST['kg_p'] ?: 0,
'ore_previste' => $_POST['ore_previste'] ?: 0,
'note_extra' => $_POST['note_extra'] ?: null,
'id_status' => $_POST['id_status'] ?? 1,
'conferma_ordine' => $_POST['conferma_ordine'] ?: null,
];
$sql = "UPDATE productiondata SET $sql = "UPDATE productiondata SET
idmatrice=:idmatrice, idmatrice = :idmatrice,
id_linea=:id_linea, id_linea = :id_linea,
id_cliente=:id_cliente, id_cliente = :id_cliente,
data_zibo=:data_zibo, data_zibo = :data_zibo,
data_cliente=:data_cliente, data_cliente = :data_cliente,
metri=:metri, metri = :metri,
kg_sp=:kg_sp, kg_sp = :kg_sp,
kg_p=:kg_p, kg_p = :kg_p,
ore_previste=:ore_previste, ore_previste = :ore_previste,
note_extra=:note_extra, note_extra = :note_extra,
id_status=:id_status id_status = :id_status,
WHERE id = :id conferma_ordine = :conferma_ordine
"; WHERE id = :id";
$stmt = $pdo->prepare($sql); $stmt = $pdo->prepare($sql);
$stmt->execute($data); $stmt->execute($dataUpdate);
// QUI devi usare L'ID ESISTENTE ! // ID esistente
$idProd = $_POST['id']; $idProd = $_POST['id'];
$pdo->prepare("DELETE FROM productiondata_mescole WHERE id_productiondata=?") $pdo->prepare("DELETE FROM productiondata_mescole WHERE id_productiondata=?")
@ -122,6 +139,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['action'])) {
} }
} }
?> ?>
<!doctype html> <!doctype html>
<html lang="it"> <html lang="it">
@ -337,7 +355,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['action'])) {
</head> </head>
<body> <body>
<div class="wrapper"> <div class="wrapper toggled">
<?php include('include/navbar.php'); <?php include('include/navbar.php');
include('include/topbar.php'); ?> include('include/topbar.php'); ?>
<div class="page-wrapper"> <div class="page-wrapper">
@ -371,6 +389,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['action'])) {
GROUP_CONCAT(ms.id SEPARATOR ',') AS mescole_ids, GROUP_CONCAT(ms.id SEPARATOR ',') AS mescole_ids,
l.name AS linea, l.name AS linea,
c.nome AS cliente, c.nome AS cliente,
p.conferma_ordine,
s.nome AS status_nome, s.nome AS status_nome,
COALESCE(s.badge_color, '#6c757d') AS badge_color, COALESCE(s.badge_color, '#6c757d') AS badge_color,
COALESCE(s.line_color, '#ffffff') AS line_color COALESCE(s.line_color, '#ffffff') AS line_color
@ -402,6 +421,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['action'])) {
<table id="tabSpecial" class="table table-hover align-middle" style="width:100%"> <table id="tabSpecial" class="table table-hover align-middle" style="width:100%">
<thead> <thead>
<tr> <tr>
<th>Conf. Ord.</th>
<th>Matrice</th> <th>Matrice</th>
<th>Mescola</th> <th>Mescola</th>
<th>Linea</th> <th>Linea</th>
@ -433,7 +453,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['action'])) {
<td><?= htmlspecialchars($r['conferma_ordine']) ?></td>
<td><?= htmlspecialchars($r['matrice']) ?></td> <td><?= htmlspecialchars($r['matrice']) ?></td>
<td><?= htmlspecialchars($r['mescola']) ?></td> <td><?= htmlspecialchars($r['mescola']) ?></td>
<td data-line-id="<?= $r['id_linea'] ?>"><?= htmlspecialchars($r['linea']) ?></td> <td data-line-id="<?= $r['id_linea'] ?>"><?= htmlspecialchars($r['linea']) ?></td>
@ -494,6 +514,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['action'])) {
<tr> <tr>
<th style="width:30px;"></th> <th style="width:30px;"></th>
<th>Priority</th> <th>Priority</th>
<th>Conf. Ord.</th>
<th>Matrice</th> <th>Matrice</th>
<th>Mescola</th> <th>Mescola</th>
<th>Linea</th> <th>Linea</th>
@ -535,6 +556,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['action'])) {
<tr> <tr>
<th style="width:30px;"></th> <th style="width:30px;"></th>
<th></th> <th></th>
<th>Conf. Ord.</th>
<th>Matrice</th> <th>Matrice</th>
<th>Mescola</th> <th>Mescola</th>
<th>Linea</th> <th>Linea</th>
@ -804,17 +826,32 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['action'])) {
document.addEventListener("DOMContentLoaded", function() { document.addEventListener("DOMContentLoaded", function() {
let sortProgrammati = Sortable.create(document.getElementById("programmatiBlock"), { let sortProgrammati = Sortable.create(document.getElementById("programmatiBlock"), {
group: "prod", group: {
name: "prod",
pull: true,
put: true
},
forceFallback: true,
fallbackOnBody: true,
fallbackTolerance: 3,
animation: 150, animation: 150,
onEnd: updatePriority onEnd: updatePriority
}); });
let sortDaProgrammare = Sortable.create(document.getElementById("daProgrammareBlock"), { let sortDaProgrammare = Sortable.create(document.getElementById("daProgrammareBlock"), {
group: "prod", group: {
name: "prod",
pull: true,
put: true
},
forceFallback: true,
fallbackOnBody: true,
fallbackTolerance: 3,
animation: 150, animation: 150,
onEnd: updatePriority onEnd: updatePriority
}); });
// disabilito sortable sulla tabella special (è sola lettura) // disabilito sortable sulla tabella special (è sola lettura)
const specialTbody = document.querySelector("#tabSpecial tbody"); const specialTbody = document.querySelector("#tabSpecial tbody");
if (specialTbody) { if (specialTbody) {
@ -830,24 +867,36 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['action'])) {
let programmati = []; let programmati = [];
let daProgrammare = []; let daProgrammare = [];
// → Righe nella tabella PROGRAMMATI (status deve diventare 6) // → PROGRAMMATI (status 6)
$("#programmatiBlock tr").each(function(index) { $("#programmatiBlock tr").each(function(index) {
const id = $(this).data("id");
// se il TR non ha data-id (es. riga child DataTables) lo salto
if (typeof id === "undefined" || id === null || id === "") {
return; // continue
}
programmati.push({ programmati.push({
id: $(this).data("id"), id: id,
priority: index + 1, priority: index + 1,
status: 6 status: 6
}); });
}); });
// → Righe nella tabella DA PROGRAMMARE (status deve diventare 1) // → DA PROGRAMMARE (status 1)
$("#daProgrammareBlock tr").each(function(index) { $("#daProgrammareBlock tr").each(function(index) {
const id = $(this).data("id");
if (typeof id === "undefined" || id === null || id === "") {
return; // continue
}
daProgrammare.push({ daProgrammare.push({
id: $(this).data("id"), id: id,
priority: index + 1 priority: index + 1
}); });
}); });
$.post("ajax_update_priority.php", { $.post("ajax_update_priority.php", {
programmati: JSON.stringify(programmati), programmati: JSON.stringify(programmati),
daProgrammare: JSON.stringify(daProgrammare) daProgrammare: JSON.stringify(daProgrammare)
@ -861,6 +910,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['action'])) {
} }
}); });
</script> </script>
@ -875,6 +925,11 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['action'])) {
</div> </div>
<div class="modal-body"> <div class="modal-body">
<div class="row g-3"> <div class="row g-3">
<div class="col-md-6">
<label class="form-label">Conferma d'ordine</label>
<input type="text" class="form-control" name="conferma_ordine">
</div>
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label">Data</label> <label class="form-label">Data</label>
<input type="date" class="form-control" name="Data" required> <input type="date" class="form-control" name="Data" required>

View File

@ -49,11 +49,19 @@ $statusNome = $r['status_nome'];
<!-- RIGA VISIBILE --> <!-- RIGA VISIBILE -->
<div class="record-summary"> <div class="record-summary">
<div class="summary-grid"> <div class="summary-grid">
<div>
<strong>Conf. Ord.</strong>
<span data-field="conferma_ordine">
<?= htmlspecialchars($r['conferma_ordine'] ?? '') ?>
</span>
</div>
<div><strong>Linea</strong> <span><?= htmlspecialchars($r['linea']) ?></span></div> <div><strong>Linea</strong> <span><?= htmlspecialchars($r['linea']) ?></span></div>
<div><strong>Matrice</strong> <span><?= htmlspecialchars($r['matrice']) ?></span></div> <div><strong>Matrice</strong> <span><?= htmlspecialchars($r['matrice']) ?></span></div>
<?php <?php
// Ricostruzione mescole con nuova struttura // Ricostruzione mescole con nuova struttura
$mescRaw = $r['mescole_list'] ?? ''; // il campo viene da GROUP_CONCAT $mescRaw = $r['mescole_list'] ?? ''; // il campo viene da GROUP_CONCAT
$mescArray = $mescRaw !== '' ? explode(' | ', $mescRaw) : []; $mescArray = $mescRaw !== '' ? explode(' | ', $mescRaw) : [];
$mescCount = count($mescArray); $mescCount = count($mescArray);
?> ?>
@ -76,6 +84,7 @@ $statusNome = $r['status_nome'];
</button> </button>
<?php endif; ?> <?php endif; ?>
</div> </div>
<div><strong>Cliente</strong> <span><?= htmlspecialchars($r['cliente'] ?? '-') ?></span></div> <div><strong>Cliente</strong> <span><?= htmlspecialchars($r['cliente'] ?? '-') ?></span></div>
<div><strong>Zibo</strong> <span><?= $dataZibo ?></span></div> <div><strong>Zibo</strong> <span><?= $dataZibo ?></span></div>
<div><strong>Data Cl.</strong> <span><?= $dataCliente ?></span></div> <div><strong>Data Cl.</strong> <span><?= $dataCliente ?></span></div>
@ -91,6 +100,7 @@ $statusNome = $r['status_nome'];
</div> </div>
</div> </div>
<!-- RIGA ESPANSA --> <!-- RIGA ESPANSA -->
<div class="record-expanded"> <div class="record-expanded">
<?php if ($isInProduction || $isPaused): ?> <?php if ($isInProduction || $isPaused): ?>

View File

@ -14,7 +14,13 @@
<td></td> <td></td>
<?php endif; ?> <?php endif; ?>
<td>
<span class="view"><?= htmlspecialchars($r['conferma_ordine']) ?></span>
<input class="inline-edit form-control form-control-sm"
type="text"
name="conferma_ordine"
value="<?= htmlspecialchars($r['conferma_ordine']) ?>">
</td>
<td> <td>
<span class='view'><?= $r['matrice'] ?></span> <span class='view'><?= $r['matrice'] ?></span>