update layout table import edit 2 and fix address photos in env
This commit is contained in:
parent
efee12740d
commit
712042b8d8
4
.env
4
.env
@ -42,4 +42,6 @@ MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
|
|||||||
# Credenziali API VisualLims
|
# Credenziali API VisualLims
|
||||||
API_BASE_URL=https://93.43.5.102/limsapi
|
API_BASE_URL=https://93.43.5.102/limsapi
|
||||||
API_USERNAME=WebApiUser
|
API_USERNAME=WebApiUser
|
||||||
API_PASSWORD=webapiuser01
|
API_PASSWORD=webapiuser01
|
||||||
|
|
||||||
|
BASE_URL=http://localhost:8000/userarea/
|
||||||
@ -58,71 +58,6 @@ foreach ($allMappings as $mapping) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//// Inserisci le righe selezionate in datadb (solo campi generici con templateid)
|
|
||||||
//$insertedIds = [];
|
|
||||||
//foreach ($selected_rows as $rowIndex) {
|
|
||||||
// $row = $rows[$rowIndex];
|
|
||||||
// $values = [
|
|
||||||
// $template_id, // templateid
|
|
||||||
// $importReferenceCode, // importreferencecode
|
|
||||||
// $newFilename, // filename_import
|
|
||||||
// 'i', // status
|
|
||||||
// $user_id, // user_id
|
|
||||||
// null, // limscode
|
|
||||||
// date('Y-m-d') // importdate
|
|
||||||
// ];
|
|
||||||
// $sql = "INSERT INTO datadb (templateid, importreferencecode, filename_import, status, user_id, limscode, importdate) VALUES (?, ?, ?, ?, ?, ?, ?)";
|
|
||||||
// $stmt = $pdo->prepare($sql);
|
|
||||||
// $stmt->execute($values);
|
|
||||||
//
|
|
||||||
// $iddatadb = $pdo->lastInsertId();
|
|
||||||
// $insertedIds[] = $iddatadb;
|
|
||||||
//
|
|
||||||
// // Inserisci tutti i campi (automatici e manuali) in import_data_details
|
|
||||||
// foreach ($allMappings as $mapping) {
|
|
||||||
// $fieldValue = null;
|
|
||||||
// if (!$mapping['is_manual']) { // Campi automatici dall'XLS
|
|
||||||
// $excelColumn = trim($mapping['excel_column']);
|
|
||||||
// $excelColumnIndex = array_search($excelColumn, array_map('trim', $columns));
|
|
||||||
// if ($excelColumnIndex !== false && isset($row[$excelColumnIndex]) && $row[$excelColumnIndex] !== '') {
|
|
||||||
// $fieldValue = $row[$excelColumnIndex];
|
|
||||||
// error_log("Found Excel column '$excelColumn' at index $excelColumnIndex, value: " . var_export($fieldValue, true));
|
|
||||||
// } else {
|
|
||||||
// $fieldValue = $mapping['manual_default'] ?? '';
|
|
||||||
// error_log("Excel column '$excelColumn' not found or empty, using default: " . var_export($fieldValue, true));
|
|
||||||
// }
|
|
||||||
// switch ($mapping['data_type']) {
|
|
||||||
// case 'INT':
|
|
||||||
// $fieldValue = is_numeric($fieldValue) ? (int)$fieldValue : ($mapping['manual_default'] ?? 0);
|
|
||||||
// break;
|
|
||||||
// case 'DATE':
|
|
||||||
// $fieldValue = !empty($fieldValue) ? date('Y-m-d', strtotime($fieldValue)) : ($mapping['manual_default'] === 'today' ? date('Y-m-d') : ($mapping['manual_default'] ?? ''));
|
|
||||||
// break;
|
|
||||||
// case 'CHAR':
|
|
||||||
// $fieldValue = !empty($fieldValue) ? substr((string)$fieldValue, 0, 1) : ($mapping['manual_default'] ?? '');
|
|
||||||
// break;
|
|
||||||
// case 'Testo':
|
|
||||||
// case 'VARCHAR':
|
|
||||||
// default:
|
|
||||||
// $fieldValue = !empty($fieldValue) ? htmlspecialchars((string)$fieldValue) : ($mapping['manual_default'] ?? '');
|
|
||||||
// break;
|
|
||||||
// }
|
|
||||||
// } else { // Campi manuali
|
|
||||||
// $fieldValue = $mapping['manual_default'] ?? '';
|
|
||||||
// if ($mapping['data_type'] === 'DATE' && $mapping['manual_default'] === 'today') {
|
|
||||||
// $fieldValue = date('Y-m-d');
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// if ($mapping['is_required'] && (is_null($fieldValue) || $fieldValue === '')) {
|
|
||||||
// error_log("Required field missing for mapping ID: " . $mapping['id'] . ", field: " . $mapping['field_label']);
|
|
||||||
// }
|
|
||||||
// error_log("Inserting into import_data_details - Mapping ID: " . $mapping['id'] . ", Field Value: " . var_export($fieldValue, true) . ", Is Manual: " . $mapping['is_manual'] . ", Excel Column: " . ($mapping['excel_column'] ?? 'N/A') . ", Manual Default: " . ($mapping['manual_default'] ?? 'N/A'));
|
|
||||||
// $stmt = $pdo->prepare("INSERT INTO import_data_details (id, mapping_id, field_value) VALUES (?, ?, ?)");
|
|
||||||
// $stmt->execute([$iddatadb, $mapping['id'], $fieldValue]);
|
|
||||||
// error_log("Inserted into import_data_details for ID $iddatadb, Mapping ID: " . $mapping['id'] . ", Field Value: " . var_export($fieldValue, true));
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
|
|
||||||
$insertedIds = $_POST['inserted_ids'] ?? $_SESSION['inserted_ids'];
|
$insertedIds = $_POST['inserted_ids'] ?? $_SESSION['inserted_ids'];
|
||||||
|
|
||||||
// Recupera i dati appena inseriti con i nomi degli utenti
|
// Recupera i dati appena inseriti con i nomi degli utenti
|
||||||
@ -200,6 +135,32 @@ foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
|
|||||||
/* Colore scuro per contrasto */
|
/* Colore scuro per contrasto */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Stili per i badge di stato */
|
||||||
|
.status-badge {
|
||||||
|
display: inline-block;
|
||||||
|
padding: 2px 8px;
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: 500;
|
||||||
|
border-radius: 12px;
|
||||||
|
text-align: center;
|
||||||
|
min-width: 60px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.status-i {
|
||||||
|
background-color: #ffc107;
|
||||||
|
color: #212529;
|
||||||
|
}
|
||||||
|
|
||||||
|
.status-P {
|
||||||
|
background-color: #007bff;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.status-l {
|
||||||
|
background-color: #28a745;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
/* Stili esistenti rimangono invariati */
|
/* Stili esistenti rimangono invariati */
|
||||||
.grid-container {
|
.grid-container {
|
||||||
overflow-x: auto;
|
overflow-x: auto;
|
||||||
@ -233,7 +194,6 @@ foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
|
|||||||
.grid-cell {
|
.grid-cell {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
min-width: 70px;
|
min-width: 70px;
|
||||||
/* Ridotto da 100px per compatibilità con pulsanti */
|
|
||||||
padding: 12px 15px;
|
padding: 12px 15px;
|
||||||
border-right: 1px solid #dee2e6;
|
border-right: 1px solid #dee2e6;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
@ -410,23 +370,21 @@ foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
|
|||||||
box-shadow: 0 0 5px rgba(0, 123, 255, 0.5);
|
box-shadow: 0 0 5px rgba(0, 123, 255, 0.5);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Sovrascrivi min-width per le celle dei pulsanti */
|
/* Stile per l'header dei pulsanti combinati */
|
||||||
.grid-cell.button-cell,
|
.grid-cell.button-cell,
|
||||||
.grid-header.button-header {
|
.grid-header.button-header {
|
||||||
min-width: 70px !important;
|
min-width: 210px !important;
|
||||||
flex: 0 0 70px !important;
|
flex: 0 0 210px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Stile per l'header dei pulsanti */
|
.action-btn {
|
||||||
.button-header {
|
padding: 6px 8px;
|
||||||
min-height: 48px;
|
margin-right: 5px;
|
||||||
/* Altezza minima per uniformare */
|
border: none;
|
||||||
padding: 12px 0;
|
border-radius: 5px;
|
||||||
/* Centra verticalmente, no padding orizzontale */
|
cursor: pointer;
|
||||||
background-color: #e9ecef !important;
|
width: 50px;
|
||||||
/* Grigio uniforme */
|
box-sizing: border-box;
|
||||||
border-right: 1px solid #dee2e6 !important;
|
|
||||||
/* Bordo destro coerente */
|
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<title>Edit Imported Data - <?= htmlspecialchars($titlewebsite, ENT_QUOTES, 'UTF-8'); ?></title>
|
<title>Edit Imported Data - <?= htmlspecialchars($titlewebsite, ENT_QUOTES, 'UTF-8'); ?></title>
|
||||||
@ -438,8 +396,6 @@ foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
|
|||||||
<?php include('include/topbar.php'); ?>
|
<?php include('include/topbar.php'); ?>
|
||||||
<div class="page-wrapper">
|
<div class="page-wrapper">
|
||||||
<div class="page-content">
|
<div class="page-content">
|
||||||
<?php //include('top_stat_widget.php');
|
|
||||||
?>
|
|
||||||
<div class="mb-3 text">
|
<div class="mb-3 text">
|
||||||
<a href="historical_trf.php?id=<?= $template_id ?>&status=i" class="btn btn-warning me-2">Imported (i)</a>
|
<a href="historical_trf.php?id=<?= $template_id ?>&status=i" class="btn btn-warning me-2">Imported (i)</a>
|
||||||
<a href="historical_trf.php?id=<?= $template_id ?>&status=P" class="btn btn-primary me-2">In Progress (P)</a>
|
<a href="historical_trf.php?id=<?= $template_id ?>&status=P" class="btn btn-primary me-2">In Progress (P)</a>
|
||||||
@ -461,9 +417,7 @@ foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
|
|||||||
<div class="grid-container">
|
<div class="grid-container">
|
||||||
<!-- Riga superiore per gli input dei campi manuali -->
|
<!-- Riga superiore per gli input dei campi manuali -->
|
||||||
<div class="grid-top">
|
<div class="grid-top">
|
||||||
<div class="grid-cell button-cell" style="flex: 0 0 70px;"></div> <!-- Save -->
|
<div class="grid-cell button-cell" style="flex: 0 0 210px;"></div> <!-- Actions -->
|
||||||
<div class="grid-cell button-cell" style="flex: 0 0 70px;"></div> <!-- Photos -->
|
|
||||||
<div class="grid-cell button-cell" style="flex: 0 0 70px;"></div> <!-- Parts -->
|
|
||||||
<?php if ($mainFieldMapping): ?>
|
<?php if ($mainFieldMapping): ?>
|
||||||
<div class="grid-cell" style="flex: 0 0 150px;">
|
<div class="grid-cell" style="flex: 0 0 150px;">
|
||||||
<?php
|
<?php
|
||||||
@ -491,12 +445,8 @@ foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
|
|||||||
?>
|
?>
|
||||||
</div>
|
</div>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
<div class="grid-cell" style="flex: 0 0 150px;"></div> <!-- importreferencecode -->
|
<div class="grid-cell" style="flex: 0 0 150px;"></div> <!-- status -->
|
||||||
<?php
|
<?php
|
||||||
$fixedColumns = ['filename_import', 'status', 'importdate'];
|
|
||||||
foreach ($fixedColumns as $col) {
|
|
||||||
echo "<div class='grid-cell' style='flex: 0 0 150px;'></div>";
|
|
||||||
}
|
|
||||||
// Campi automatici (is_manual = 0) escluso main_field
|
// Campi automatici (is_manual = 0) escluso main_field
|
||||||
$autoIndex = 0;
|
$autoIndex = 0;
|
||||||
foreach ($allMappings as $mapping) {
|
foreach ($allMappings as $mapping) {
|
||||||
@ -545,29 +495,25 @@ foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
|
|||||||
}
|
}
|
||||||
echo "<div class='grid-cell' style='flex: 0 0 200px;'></div>"; // AWB
|
echo "<div class='grid-cell' style='flex: 0 0 200px;'></div>"; // AWB
|
||||||
echo "<div class='grid-cell' style='flex: 0 0 250px;'></div>"; // Tracking Info
|
echo "<div class='grid-cell' style='flex: 0 0 250px;'></div>"; // Tracking Info
|
||||||
|
echo "<div class='grid-cell' style='flex: 0 0 150px;'></div>"; // importreferencecode
|
||||||
|
echo "<div class='grid-cell' style='flex: 0 0 150px;'></div>"; // filename_import
|
||||||
|
echo "<div class='grid-cell' style='flex: 0 0 150px;'></div>"; // importdate
|
||||||
?>
|
?>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Header della tabella -->
|
<!-- Header della tabella -->
|
||||||
<div class="grid-row">
|
<div class="grid-row">
|
||||||
<div class="grid-header button-header" style="flex: 0 0 70px;"></div> <!-- Save -->
|
<div class="grid-header button-header" style="flex: 0 0 210px;">Actions</div>
|
||||||
<div class="grid-header button-header" style="flex: 0 0 70px;"></div> <!-- Photos -->
|
|
||||||
<div class="grid-header button-header" style="flex: 0 0 70px;"></div> <!-- Parts -->
|
|
||||||
<?php if ($mainFieldMapping): ?>
|
<?php if ($mainFieldMapping): ?>
|
||||||
<div class="grid-header" data-index="3" style="flex: 0 0 150px; position: relative;">
|
<div class="grid-header" data-index="1" style="flex: 0 0 150px; position: relative;">
|
||||||
<?= htmlspecialchars($mainFieldMapping['field_label']) ?>
|
<?= htmlspecialchars($mainFieldMapping['field_label']) ?>
|
||||||
<div class="resizer"></div>
|
<div class="resizer"></div>
|
||||||
</div>
|
</div>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
<div class="grid-header" data-index="<?= $mainFieldMapping ? 4 : 3 ?>" style="flex: 0 0 150px; position: relative;">Import Reference Code<div class="resizer"></div>
|
<div class="grid-header" data-index="<?= $mainFieldMapping ? 2 : 1 ?>" style="flex: 0 0 150px; position: relative;">Status<div class="resizer"></div>
|
||||||
</div>
|
</div>
|
||||||
<?php
|
<?php
|
||||||
$headerIndex = $mainFieldMapping ? 5 : 4;
|
$headerIndex = $mainFieldMapping ? 3 : 2;
|
||||||
foreach ($fixedColumns as $col) {
|
|
||||||
$displayName = $slugMapping[$col] ?? $col;
|
|
||||||
echo "<div class='grid-header' data-index='$headerIndex' style='flex: 0 0 150px; position: relative;'>$displayName<div class='resizer'></div></div>";
|
|
||||||
$headerIndex++;
|
|
||||||
}
|
|
||||||
foreach ($allMappings as $mapping) {
|
foreach ($allMappings as $mapping) {
|
||||||
if (!$mapping['is_manual'] && $mapping['main_field'] != 1) {
|
if (!$mapping['is_manual'] && $mapping['main_field'] != 1) {
|
||||||
echo "<div class='grid-header' data-index='$headerIndex' style='flex: 0 0 150px; position: relative;'>" . htmlspecialchars($mapping['field_label']) . "<div class='resizer'></div></div>";
|
echo "<div class='grid-header' data-index='$headerIndex' style='flex: 0 0 150px; position: relative;'>" . htmlspecialchars($mapping['field_label']) . "<div class='resizer'></div></div>";
|
||||||
@ -581,21 +527,24 @@ foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
echo "<div class='grid-header' data-index='$headerIndex' style='flex: 0 0 200px; position: relative;'>AWB Number<div class='resizer'></div></div>";
|
echo "<div class='grid-header' data-index='$headerIndex' style='flex: 0 0 200px; position: relative;'>AWB Number<div class='resizer'></div></div>";
|
||||||
echo "<div class='grid-header' data-index='" . ($headerIndex + 1) . "' style='flex: 0 0 250px; position: relative;'>Tracking Info<div class='resizer'></div></div>";
|
$headerIndex++;
|
||||||
|
echo "<div class='grid-header' data-index='$headerIndex' style='flex: 0 0 250px; position: relative;'>Tracking Info<div class='resizer'></div></div>";
|
||||||
|
$headerIndex++;
|
||||||
|
echo "<div class='grid-header' data-index='$headerIndex' style='flex: 0 0 150px; position: relative;'>Import Reference Code<div class='resizer'></div></div>";
|
||||||
|
$headerIndex++;
|
||||||
|
echo "<div class='grid-header' data-index='$headerIndex' style='flex: 0 0 150px; position: relative;'>" . ($slugMapping['filename_import'] ?? 'filename_import') . "<div class='resizer'></div></div>";
|
||||||
|
$headerIndex++;
|
||||||
|
echo "<div class='grid-header' data-index='$headerIndex' style='flex: 0 0 150px; position: relative;'>" . ($slugMapping['importdate'] ?? 'importdate') . "<div class='resizer'></div></div>";
|
||||||
?>
|
?>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Righe della tabella -->
|
<!-- Righe della tabella -->
|
||||||
<?php foreach ($importedData as $index => $row): ?>
|
<?php foreach ($importedData as $index => $row): ?>
|
||||||
<div class="grid-row" data-id="<?= $row['iddatadb'] ?>">
|
<div class="grid-row" data-id="<?= $row['iddatadb'] ?>">
|
||||||
<div class="grid-cell button-cell" style="flex: 0 0 70px; position: relative;">
|
<div class="grid-cell button-cell" style="flex: 0 0 210px; position: relative;">
|
||||||
<button type="button" class="save-btn action-btn" data-row="<?= $index ?>" title="Save" style="background: #28a745; color: white; border: none; padding: 6px 8px; border-radius: 5px; cursor: pointer; width: 100%; box-sizing: border-box;"><i class="fas fa-save"></i></button>
|
<button type="button" class="save-btn action-btn" data-row="<?= $index ?>" title="Save" style="background: #28a745; color: white; border: none; border-radius: 5px; cursor: pointer;"><i class="fas fa-save"></i></button>
|
||||||
</div>
|
<button type="button" class="photos-btn action-btn" data-row="<?= $index ?>" data-iddatadb="<?= $row['iddatadb'] ?>" title="Photos" style="background: #007bff; color: white; border: none; border-radius: 5px; cursor: pointer;"><i class="fas fa-camera"></i></button>
|
||||||
<div class="grid-cell button-cell" style="flex: 0 0 70px; position: relative;">
|
<button type="button" class="parts-btn action-btn" data-row="<?= $index ?>" data-iddatadb="<?= $row['iddatadb'] ?>" title="Parts" style="background: #ffc107; color: white; border: none; border-radius: 5px; cursor: pointer;"><i class="fas fa-puzzle-piece"></i></button>
|
||||||
<button type="button" class="photos-btn action-btn" data-row="<?= $index ?>" data-iddatadb="<?= $row['iddatadb'] ?>" title="Photos" style="background: #007bff; color: white; border: none; padding: 6px 8px; border-radius: 5px; cursor: pointer; width: 100%; box-sizing: border-box;"><i class="fas fa-camera"></i></button>
|
|
||||||
</div>
|
|
||||||
<div class="grid-cell button-cell" style="flex: 0 0 70px; position: relative;">
|
|
||||||
<button type="button" class="parts-btn action-btn" data-row="<?= $index ?>" data-iddatadb="<?= $row['iddatadb'] ?>" title="Parts" style="background: #ffc107; color: white; border: none; padding: 6px 8px; border-radius: 5px; cursor: pointer; width: 100%; box-sizing: border-box;"><i class="fas fa-puzzle-piece"></i></button>
|
|
||||||
</div>
|
</div>
|
||||||
<?php if ($mainFieldMapping): ?>
|
<?php if ($mainFieldMapping): ?>
|
||||||
<?php
|
<?php
|
||||||
@ -609,7 +558,7 @@ foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
|
|||||||
$inputClass = $mainFieldMapping['is_manual'] ? 'manual-input' : 'auto-input';
|
$inputClass = $mainFieldMapping['is_manual'] ? 'manual-input' : 'auto-input';
|
||||||
if ($mainFieldMapping['is_required']) $inputClass .= ' required-input';
|
if ($mainFieldMapping['is_required']) $inputClass .= ' required-input';
|
||||||
?>
|
?>
|
||||||
<div class="grid-cell editable-cell <?= $requiredClass ?>" data-col="main_field" data-row="<?= $index ?>" data-index="3" style="flex: 0 0 150px;">
|
<div class="grid-cell editable-cell <?= $requiredClass ?>" data-col="main_field" data-row="<?= $index ?>" data-index="1" style="flex: 0 0 150px;">
|
||||||
<?php if ($mainFieldMapping['data_type'] === 'SceltaMultipla'): ?>
|
<?php if ($mainFieldMapping['data_type'] === 'SceltaMultipla'): ?>
|
||||||
<select name="rows[<?= $index ?>][details][<?= $mainFieldMapping['id'] ?>][field_value]" class="cell-input dropdown-select <?= $inputClass ?>" data-mapping-id="<?= $mainFieldMapping['id'] ?>" data-field-id="<?= $mainFieldMapping['field_id'] ?>" <?= $mainFieldMapping['is_required'] ? 'required' : '' ?>>
|
<select name="rows[<?= $index ?>][details][<?= $mainFieldMapping['id'] ?>][field_value]" class="cell-input dropdown-select <?= $inputClass ?>" data-mapping-id="<?= $mainFieldMapping['id'] ?>" data-field-id="<?= $mainFieldMapping['field_id'] ?>" <?= $mainFieldMapping['is_required'] ? 'required' : '' ?>>
|
||||||
<option value="">Seleziona...</option>
|
<option value="">Seleziona...</option>
|
||||||
@ -623,28 +572,14 @@ foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
|
|||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
</div>
|
</div>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
<div class="grid-cell" data-col="importreferencecode" data-row="<?= $index ?>" data-index="<?= $mainFieldMapping ? 4 : 3 ?>" style="flex: 0 0 150px;">
|
<div class="grid-cell editable-cell" data-col="status" data-row="<?= $index ?>" data-index="<?= $mainFieldMapping ? 2 : 1 ?>" style="flex: 0 0 150px;">
|
||||||
<span><?= htmlspecialchars($row['importreferencecode']) ?></span>
|
<span class="status-badge status-<?= htmlspecialchars($row['status'] ?? 'i') ?>">
|
||||||
<input type="hidden" name="rows[<?= $index ?>][importreferencecode]" value="<?= htmlspecialchars($row['importreferencecode']) ?>">
|
<?= htmlspecialchars($row['status'] === 'i' ? 'Imported' : ($row['status'] === 'P' ? 'In Progress' : 'To LIMS')) ?>
|
||||||
|
</span>
|
||||||
|
<input type="hidden" name="rows[<?= $index ?>][status]" value="<?= htmlspecialchars($row['status'] ?? 'i') ?>">
|
||||||
</div>
|
</div>
|
||||||
<?php
|
<?php
|
||||||
$cellIndex = $mainFieldMapping ? 5 : 4;
|
$cellIndex = $mainFieldMapping ? 3 : 2;
|
||||||
foreach ($fixedColumns as $col) {
|
|
||||||
$value = $row[$col] ?? '';
|
|
||||||
echo "<div class='grid-cell editable-cell' data-col='$col' data-row='$index' data-index='$cellIndex' style='flex: 0 0 150px;'>";
|
|
||||||
if ($col === 'importdate') {
|
|
||||||
echo "<span>" . htmlspecialchars($value) . "</span>";
|
|
||||||
echo "<input type='hidden' name='rows[$index][$col]' value='" . htmlspecialchars($value) . "'>";
|
|
||||||
} elseif ($col === 'filename_import') {
|
|
||||||
echo "<a href='imported_trf/" . htmlspecialchars($value) . "' target='_blank'>File</a>";
|
|
||||||
echo "<input type='hidden' name='rows[$index][$col]' value='" . htmlspecialchars($value) . "'>";
|
|
||||||
} elseif ($col === 'status') {
|
|
||||||
echo "<span class='status-display status-" . htmlspecialchars($value ?? 'i') . "'>" . htmlspecialchars($value === 'i' ? 'Imported' : ($value === 'P' ? 'Progress' : 'LIMS')) . "</span>";
|
|
||||||
echo "<input type='hidden' name='rows[$index][$col]' value='" . htmlspecialchars($value ?? 'i') . "'>";
|
|
||||||
}
|
|
||||||
echo "</div>";
|
|
||||||
$cellIndex++;
|
|
||||||
}
|
|
||||||
$rowDetails = array_filter($manualDetails, fn($d) => $d['datadb_id'] == $row['iddatadb']);
|
$rowDetails = array_filter($manualDetails, fn($d) => $d['datadb_id'] == $row['iddatadb']);
|
||||||
$autoIndex = 0;
|
$autoIndex = 0;
|
||||||
foreach ($allMappings as $mapping) {
|
foreach ($allMappings as $mapping) {
|
||||||
@ -717,6 +652,24 @@ foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
|
|||||||
<span class="tracking-result">Shipment Info</span>
|
<span class="tracking-result">Shipment Info</span>
|
||||||
<input type="hidden" name="rows[<?= $index ?>][tracking_info]" class="tracking-hidden">
|
<input type="hidden" name="rows[<?= $index ?>][tracking_info]" class="tracking-hidden">
|
||||||
</div>
|
</div>
|
||||||
|
<div class="grid-cell" data-col="importreferencecode" data-row="<?= $index ?>" data-index="<?= $cellIndex ?>" style="flex: 0 0 150px;">
|
||||||
|
<span><?= htmlspecialchars($row['importreferencecode']) ?></span>
|
||||||
|
<input type="hidden" name="rows[<?= $index ?>][importreferencecode]" value="<?= htmlspecialchars($row['importreferencecode']) ?>">
|
||||||
|
</div>
|
||||||
|
<?php
|
||||||
|
$cellIndex++;
|
||||||
|
?>
|
||||||
|
<div class="grid-cell editable-cell" data-col="filename_import" data-row="<?= $index ?>" data-index="<?= $cellIndex ?>" style="flex: 0 0 150px;">
|
||||||
|
<a href="imported_trf/<?= htmlspecialchars($row['filename_import']) ?>" target="_blank">File</a>
|
||||||
|
<input type="hidden" name="rows[<?= $index ?>][filename_import]" value="<?= htmlspecialchars($row['filename_import']) ?>">
|
||||||
|
</div>
|
||||||
|
<?php
|
||||||
|
$cellIndex++;
|
||||||
|
?>
|
||||||
|
<div class="grid-cell editable-cell" data-col="importdate" data-row="<?= $index ?>" data-index="<?= $cellIndex ?>" style="flex: 0 0 150px;">
|
||||||
|
<span><?= htmlspecialchars($row['importdate']) ?></span>
|
||||||
|
<input type="hidden" name="rows[<?= $index ?>][importdate]" value="<?= htmlspecialchars($row['importdate']) ?>">
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
</div>
|
</div>
|
||||||
@ -742,7 +695,6 @@ foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
|
|||||||
const unsavedDiv = document.getElementById("unsavedChanges");
|
const unsavedDiv = document.getElementById("unsavedChanges");
|
||||||
let hasChanges = false;
|
let hasChanges = false;
|
||||||
|
|
||||||
// როცა მნიშვნელობა შეიცვლება
|
|
||||||
inputs.forEach(el => {
|
inputs.forEach(el => {
|
||||||
el.addEventListener("change", () => {
|
el.addEventListener("change", () => {
|
||||||
hasChanges = true;
|
hasChanges = true;
|
||||||
@ -750,7 +702,6 @@ foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// როცა save ღილაკს დააჭერს
|
|
||||||
document.querySelectorAll(".save-btn").forEach(btn => {
|
document.querySelectorAll(".save-btn").forEach(btn => {
|
||||||
btn.addEventListener("click", () => {
|
btn.addEventListener("click", () => {
|
||||||
hasChanges = false;
|
hasChanges = false;
|
||||||
@ -758,8 +709,36 @@ foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// სურვილისამებრ: გაფრთხილება გვერდიდან გასვლისას
|
window.addEventListener("beforeunload", function(e) {
|
||||||
window.addEventListener("beforeunload", function (e) {
|
if (hasChanges) {
|
||||||
|
e.preventDefault();
|
||||||
|
e.returnValue = "";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
document.addEventListener("DOMContentLoaded", function() {
|
||||||
|
const inputs = document.querySelectorAll('.cell-input');
|
||||||
|
inputs.forEach(input => {
|
||||||
|
input.addEventListener('focus', function() {
|
||||||
|
this.closest('.grid-cell').classList.add('expanded');
|
||||||
|
});
|
||||||
|
input.addEventListener('blur', function() {
|
||||||
|
this.closest('.grid-cell').classList.remove('expanded');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
const saveButtons = document.querySelectorAll('.save-btn');
|
||||||
|
saveButtons.forEach(button => {
|
||||||
|
btn.addEventListener('click', function() {
|
||||||
|
hasChanges = false;
|
||||||
|
unsavedDiv.style.display = "none";
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
window.addEventListener("beforeunload", function(e) {
|
||||||
if (hasChanges) {
|
if (hasChanges) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
e.returnValue = "";
|
e.returnValue = "";
|
||||||
@ -826,7 +805,6 @@ foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
|
|||||||
const input = this.previousElementSibling;
|
const input = this.previousElementSibling;
|
||||||
const value = input.value;
|
const value = input.value;
|
||||||
|
|
||||||
// Trova la colonna target nella griglia superiore e propaga solo verticalmente
|
|
||||||
const gridTopCells = document.querySelector('.grid-top').querySelectorAll('.grid-cell');
|
const gridTopCells = document.querySelector('.grid-top').querySelectorAll('.grid-cell');
|
||||||
const targetTopIndex = Array.from(gridTopCells).findIndex(cell =>
|
const targetTopIndex = Array.from(gridTopCells).findIndex(cell =>
|
||||||
cell.querySelector('.propagate-btn[data-column="' + column + '"]')
|
cell.querySelector('.propagate-btn[data-column="' + column + '"]')
|
||||||
@ -886,17 +864,14 @@ foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
<!-- script dropdown senza overlay -->
|
|
||||||
<script>
|
<script>
|
||||||
document.addEventListener("DOMContentLoaded", function() {
|
document.addEventListener("DOMContentLoaded", function() {
|
||||||
// Oggetto per memorizzare i dati delle tendine recuperati
|
|
||||||
const dropdownData = {};
|
const dropdownData = {};
|
||||||
|
|
||||||
async function populateDropdowns() {
|
async function populateDropdowns() {
|
||||||
const dropdowns = document.querySelectorAll('.dropdown-select');
|
const dropdowns = document.querySelectorAll('.dropdown-select');
|
||||||
if (dropdowns.length === 0) return;
|
if (dropdowns.length === 0) return;
|
||||||
|
|
||||||
// Recupera i dati solo per i field_id univoci
|
|
||||||
const uniqueFieldIds = [
|
const uniqueFieldIds = [
|
||||||
...new Set(Array.from(dropdowns).map(d => d.getAttribute('data-field-id')))
|
...new Set(Array.from(dropdowns).map(d => d.getAttribute('data-field-id')))
|
||||||
].filter(fieldId => fieldId);
|
].filter(fieldId => fieldId);
|
||||||
@ -922,8 +897,6 @@ foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Popola tutti i dropdown con i dati recuperati
|
|
||||||
dropdowns.forEach(dropdown => {
|
dropdowns.forEach(dropdown => {
|
||||||
const fieldId = dropdown.getAttribute('data-field-id');
|
const fieldId = dropdown.getAttribute('data-field-id');
|
||||||
if (!fieldId || !dropdownData[fieldId]) {
|
if (!fieldId || !dropdownData[fieldId]) {
|
||||||
@ -931,7 +904,6 @@ foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pulisci opzioni esistenti
|
|
||||||
dropdown.innerHTML = '<option value="">Seleziona...</option>';
|
dropdown.innerHTML = '<option value="">Seleziona...</option>';
|
||||||
dropdownData[fieldId].forEach(value => {
|
dropdownData[fieldId].forEach(value => {
|
||||||
const option = document.createElement('option');
|
const option = document.createElement('option');
|
||||||
@ -943,17 +915,14 @@ foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Esegui al caricamento della pagina
|
|
||||||
populateDropdowns();
|
populateDropdowns();
|
||||||
|
|
||||||
// Rielabora i dropdown quando si aggiunge una nuova riga (se applicabile)
|
|
||||||
document.querySelectorAll('.save-btn').forEach(btn => {
|
document.querySelectorAll('.save-btn').forEach(btn => {
|
||||||
btn.addEventListener('click', function() {
|
btn.addEventListener('click', function() {
|
||||||
setTimeout(populateDropdowns, 100); // Ritardo per garantire che il DOM sia aggiornato
|
setTimeout(populateDropdowns, 100);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// Gestione della propagazione per mantenere i valori sincronizzati
|
|
||||||
const propagateButtons = document.querySelectorAll('.propagate-btn');
|
const propagateButtons = document.querySelectorAll('.propagate-btn');
|
||||||
propagateButtons.forEach(button => {
|
propagateButtons.forEach(button => {
|
||||||
button.addEventListener('click', function() {
|
button.addEventListener('click', function() {
|
||||||
@ -986,132 +955,6 @@ foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
<!-- dropdown with overlay -->
|
|
||||||
<!-- <script>
|
|
||||||
document.addEventListener("DOMContentLoaded", function() {
|
|
||||||
// Crea un overlay di caricamento
|
|
||||||
const loadingOverlay = document.createElement('div');
|
|
||||||
loadingOverlay.id = 'loading-overlay';
|
|
||||||
loadingOverlay.style.cssText = `
|
|
||||||
display: none;
|
|
||||||
position: fixed;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
background: rgba(0, 0, 0, 0.7);
|
|
||||||
z-index: 9999;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
`;
|
|
||||||
const loadingMessage = document.createElement('div');
|
|
||||||
loadingMessage.style.cssText = `
|
|
||||||
color: white;
|
|
||||||
font-size: 24px;
|
|
||||||
padding: 20px;
|
|
||||||
background: #333;
|
|
||||||
border-radius: 10px;
|
|
||||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);
|
|
||||||
`;
|
|
||||||
loadingMessage.textContent = 'Loading Dropdown Options...';
|
|
||||||
loadingOverlay.appendChild(loadingMessage);
|
|
||||||
document.body.appendChild(loadingOverlay);
|
|
||||||
|
|
||||||
// Funzione originale populateDropdowns
|
|
||||||
async function populateDropdowns() {
|
|
||||||
const dropdowns = document.querySelectorAll('.dropdown-select');
|
|
||||||
if (dropdowns.length === 0) return;
|
|
||||||
|
|
||||||
const dropdownData = {};
|
|
||||||
|
|
||||||
// Recupera i dati solo per i field_id univoci
|
|
||||||
const uniqueFieldIds = [...new Set(Array.from(dropdowns).map(d => d.getAttribute('data-field-id')))].filter(fieldId => fieldId);
|
|
||||||
for (const fieldId of uniqueFieldIds) {
|
|
||||||
if (!dropdownData[fieldId]) {
|
|
||||||
try {
|
|
||||||
const response = await fetch(`get_customfield_values.php?field_id=${fieldId}`);
|
|
||||||
const data = await response.json();
|
|
||||||
if (data.error) {
|
|
||||||
console.error('Errore per field_id', fieldId, ':', data.error);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
dropdownData[fieldId] = data.CustomFieldsValues || [];
|
|
||||||
} catch (error) {
|
|
||||||
console.error('Errore nel fetch per field_id', fieldId, ':', error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Popola tutti i dropdown con i dati recuperati
|
|
||||||
dropdowns.forEach(dropdown => {
|
|
||||||
const fieldId = dropdown.getAttribute('data-field-id');
|
|
||||||
if (!fieldId || !dropdownData[fieldId]) {
|
|
||||||
dropdown.innerHTML = '<option value="">Errore nel caricamento</option>';
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
dropdown.innerHTML = '<option value="">Seleziona...</option>';
|
|
||||||
dropdownData[fieldId].forEach(value => {
|
|
||||||
const option = document.createElement('option');
|
|
||||||
option.value = value.IdCustomFieldsValue;
|
|
||||||
option.textContent = value.Valore;
|
|
||||||
if (dropdown.value === option.value) option.selected = true;
|
|
||||||
dropdown.appendChild(option);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// Esegui al caricamento della pagina con l'overlay
|
|
||||||
async function loadDropdownsWithOverlay() {
|
|
||||||
console.log('Inizio caricamento tendine');
|
|
||||||
loadingOverlay.style.display = 'flex';
|
|
||||||
await new Promise(resolve => setTimeout(resolve, 500)); // Minimo 500ms di visibilità
|
|
||||||
await populateDropdowns();
|
|
||||||
console.log('Caricamento tendine completato');
|
|
||||||
loadingOverlay.style.display = 'none';
|
|
||||||
}
|
|
||||||
|
|
||||||
// Esegui il caricamento iniziale
|
|
||||||
loadDropdownsWithOverlay();
|
|
||||||
|
|
||||||
// Rielabora i dropdown quando si aggiunge una nuova riga
|
|
||||||
document.querySelectorAll('.save-btn').forEach(btn => {
|
|
||||||
btn.addEventListener('click', function() {
|
|
||||||
setTimeout(loadDropdownsWithOverlay, 100);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
// Gestione della propagazione
|
|
||||||
const propagateButtons = document.querySelectorAll('.propagate-btn');
|
|
||||||
propagateButtons.forEach(button => {
|
|
||||||
button.addEventListener('click', function() {
|
|
||||||
const columnIndex = this.getAttribute('data-column').replace('manual_', '');
|
|
||||||
const input = this.previousElementSibling;
|
|
||||||
const value = input.value;
|
|
||||||
|
|
||||||
const gridTopCells = document.querySelector('.grid-top').querySelectorAll('.grid-cell');
|
|
||||||
const targetTopIndex = Array.from(gridTopCells).findIndex(cell =>
|
|
||||||
cell.querySelector('.propagate-btn') === button
|
|
||||||
);
|
|
||||||
|
|
||||||
if (targetTopIndex !== -1) {
|
|
||||||
const rows = document.querySelectorAll('.grid-row');
|
|
||||||
rows.forEach(row => {
|
|
||||||
const cells = row.querySelectorAll('.grid-cell');
|
|
||||||
if (cells.length > targetTopIndex) {
|
|
||||||
const targetInput = cells[targetTopIndex].querySelector('select.dropdown-select');
|
|
||||||
if (targetInput) {
|
|
||||||
targetInput.value = value;
|
|
||||||
const event = new Event('change');
|
|
||||||
targetInput.dispatchEvent(event);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script> -->
|
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
@ -11,6 +11,24 @@ use Endroid\QrCode\QrCode;
|
|||||||
use Endroid\QrCode\RoundBlockSizeMode;
|
use Endroid\QrCode\RoundBlockSizeMode;
|
||||||
use Endroid\QrCode\Writer\PngWriter;
|
use Endroid\QrCode\Writer\PngWriter;
|
||||||
|
|
||||||
|
// Carica le variabili d'ambiente
|
||||||
|
try {
|
||||||
|
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__ . '/../../');
|
||||||
|
$dotenv->load();
|
||||||
|
error_log("File .env caricato correttamente da " . __DIR__ . '/../../.env');
|
||||||
|
} catch (Exception $e) {
|
||||||
|
error_log("Errore nel caricamento del file .env: " . $e->getMessage());
|
||||||
|
echo json_encode(['error' => 'Errore nel caricamento del file di configurazione']);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verifica che BASE_URL sia definito
|
||||||
|
if (!isset($_ENV['BASE_URL'])) {
|
||||||
|
error_log("Errore: la variabile BASE_URL non è definita nel file .env");
|
||||||
|
echo json_encode(['error' => 'Variabile BASE_URL non definita']);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
$db = DBHandlerSelect::getInstance();
|
$db = DBHandlerSelect::getInstance();
|
||||||
$pdo = $db->getConnection();
|
$pdo = $db->getConnection();
|
||||||
|
|
||||||
@ -43,9 +61,9 @@ $photos = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|||||||
// Definisci il percorso base per le foto
|
// Definisci il percorso base per le foto
|
||||||
$photoBasePath = '../photostrf/';
|
$photoBasePath = '../photostrf/';
|
||||||
|
|
||||||
// Genera l'URL per il QR code
|
// Usa la variabile d'ambiente BASE_URL
|
||||||
$baseUrl = "http://localhost:8000/userarea/"; // Sostituisci con il tuo dominio
|
$baseUrl = rtrim($_ENV['BASE_URL'], '/'); // Rimuove eventuali slash finali
|
||||||
$uploadUrl = $baseUrl . "upload_photos_mobile.php?iddatadb=" . $iddatadb;
|
$uploadUrl = $baseUrl . "/upload_photos_mobile.php?iddatadb=" . $iddatadb;
|
||||||
|
|
||||||
// Genera il QR code con endroid/qr-code 6.0.6
|
// Genera il QR code con endroid/qr-code 6.0.6
|
||||||
$qrCodeDir = '../photostrf/qrcodes/';
|
$qrCodeDir = '../photostrf/qrcodes/';
|
||||||
@ -159,7 +177,6 @@ $result->saveToFile($qrCodeFile);
|
|||||||
background-color: #e9ecef;
|
background-color: #e9ecef;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Stile per il modale dell'immagine ingrandita */
|
|
||||||
.image-modal {
|
.image-modal {
|
||||||
display: none;
|
display: none;
|
||||||
position: fixed;
|
position: fixed;
|
||||||
@ -199,7 +216,6 @@ $result->saveToFile($qrCodeFile);
|
|||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Stili per il loader */
|
|
||||||
.loader {
|
.loader {
|
||||||
display: none;
|
display: none;
|
||||||
position: fixed;
|
position: fixed;
|
||||||
@ -224,4 +240,4 @@ $result->saveToFile($qrCodeFile);
|
|||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
color: white;
|
color: white;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
Loading…
x
Reference in New Issue
Block a user