330 lines
14 KiB
PHP
330 lines
14 KiB
PHP
<?php
|
|
include('include/headscript.php');
|
|
|
|
// Controlla se è stato passato un ID valido
|
|
if (!isset($_GET['id']) || !is_numeric($_GET['id'])) {
|
|
header("Location: xlstemplates_grid.php?status=error&message=" . urlencode("Invalid ID"));
|
|
exit;
|
|
}
|
|
|
|
$id = intval($_GET['id']); // Sanifica l'ID
|
|
|
|
// Recupera il template dal database
|
|
$db = DBHandlerSelect::getInstance();
|
|
$pdo = $db->getConnection();
|
|
$stmt = $pdo->prepare("SELECT * FROM excel_templates WHERE id = ?");
|
|
$stmt->execute([$id]);
|
|
$template = $stmt->fetch(PDO::FETCH_ASSOC);
|
|
|
|
if (!$template) {
|
|
header("Location: template_dashboard.php?status=error&message=" . urlencode("Template not found"));
|
|
exit;
|
|
}
|
|
|
|
// Debug del template
|
|
error_log("Loaded template: " . print_r($template, true));
|
|
?>
|
|
|
|
<!doctype html>
|
|
<html lang="en">
|
|
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<link rel="icon" href="assets/images/favicon-32x32.png" type="image/png" />
|
|
<?php include('cssinclude.php'); ?>
|
|
<style>
|
|
.table-container {
|
|
overflow-x: auto;
|
|
max-width: 100%;
|
|
margin-bottom: 20px;
|
|
}
|
|
|
|
.table {
|
|
width: 100%;
|
|
border-collapse: collapse;
|
|
}
|
|
|
|
.table th,
|
|
.table td {
|
|
padding: 10px;
|
|
text-align: left;
|
|
border: 1px solid #dee2e6;
|
|
min-width: 100px;
|
|
max-width: 200px;
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
white-space: nowrap;
|
|
}
|
|
|
|
.table th:first-child,
|
|
.table td:first-child {
|
|
min-width: 50px;
|
|
max-width: 50px;
|
|
}
|
|
|
|
.table th {
|
|
background-color: #f8f9fa;
|
|
position: relative;
|
|
cursor: col-resize;
|
|
user-select: none;
|
|
}
|
|
|
|
.table th .resize-handle {
|
|
position: absolute;
|
|
top: 0;
|
|
right: 0;
|
|
width: 5px;
|
|
height: 100%;
|
|
cursor: col-resize;
|
|
background: transparent;
|
|
}
|
|
|
|
.table th .resize-handle:hover {
|
|
background: #007bff;
|
|
}
|
|
|
|
.search-container {
|
|
margin-bottom: 20px;
|
|
}
|
|
|
|
.search-container input {
|
|
width: 300px;
|
|
padding: 8px;
|
|
border: 1px solid #ced4da;
|
|
border-radius: 5px;
|
|
}
|
|
|
|
.loader {
|
|
display: none;
|
|
border: 4px solid #f3f3f3;
|
|
border-top: 4px solid #3498db;
|
|
border-radius: 50%;
|
|
width: 30px;
|
|
height: 30px;
|
|
animation: spin 1s linear infinite;
|
|
margin: 10px auto;
|
|
}
|
|
|
|
@keyframes spin {
|
|
0% {
|
|
transform: rotate(0deg);
|
|
}
|
|
|
|
100% {
|
|
transform: rotate(360deg);
|
|
}
|
|
}
|
|
</style>
|
|
<title><?= htmlspecialchars($template['name']) ?> - <?= htmlspecialchars($titlewebsite, ENT_QUOTES, 'UTF-8'); ?></title>
|
|
</head>
|
|
|
|
<body>
|
|
<div class="wrapper">
|
|
<?php include('include/navbar.php'); ?>
|
|
<?php include('include/topbar.php'); ?>
|
|
<div class="page-wrapper">
|
|
<div class="page-content">
|
|
<?php include('top_stat_widget.php'); ?>
|
|
|
|
<div class="card radius-10">
|
|
<div class="card-header">
|
|
<div class="d-flex align-items-center">
|
|
<div>
|
|
<h6 class="mb-0"><?= htmlspecialchars($template['name']) ?></h6>
|
|
<small>Template ID: <?= $id ?>, Start Row: <?= $template['header_row'] ?>, Start Column: <?= $template['start_column'] ?></small>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="card-body">
|
|
<!-- Form per caricare il file -->
|
|
<form id="uploadForm" enctype="multipart/form-data" class="mb-4">
|
|
<div class="mb-3">
|
|
<label for="excel_file" class="form-label">Upload XLS File</label>
|
|
<input type="file" class="form-control" id="excel_file" name="excel_file" accept=".xls,.xlsx" required>
|
|
</div>
|
|
<button type="submit" class="btn btn-primary">Upload</button>
|
|
<div class="loader" id="loader"></div>
|
|
</form>
|
|
|
|
<!-- Contenitore per messaggi di errore -->
|
|
<div id="errorContainer" class="alert alert-danger mt-3" style="display: none;"></div>
|
|
|
|
<!-- Contenitore per la tabella -->
|
|
<div id="tableContainer"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<!--end page wrapper -->
|
|
<div class="overlay toggle-icon"></div>
|
|
<a href="javaScript:;" class="back-to-top"><i class='bx bxs-up-arrow-alt'></i></a>
|
|
<?php include('include/footer.php'); ?>
|
|
</div>
|
|
<!--end wrapper-->
|
|
|
|
<!-- search modal -->
|
|
<?php //include('include/searchmodal.php');
|
|
?>
|
|
<!-- end search modal -->
|
|
|
|
<!--start switcher-->
|
|
<?php //include('include/themeswitcher.php');
|
|
?>
|
|
<!--end switcher-->
|
|
<?php include('jsinclude.php'); ?>
|
|
<script>
|
|
document.addEventListener("DOMContentLoaded", function() {
|
|
const form = document.getElementById('uploadForm');
|
|
const loader = document.getElementById('loader');
|
|
const errorContainer = document.getElementById('errorContainer');
|
|
const tableContainer = document.getElementById('tableContainer');
|
|
|
|
form.addEventListener('submit', function(e) {
|
|
e.preventDefault();
|
|
loader.style.display = 'block';
|
|
errorContainer.style.display = 'none';
|
|
tableContainer.innerHTML = '';
|
|
|
|
const formData = new FormData(this);
|
|
const templateId = <?= $id ?>;
|
|
console.log('Template ID passed to formData:', templateId);
|
|
formData.append('template_id', templateId);
|
|
formData.append('header_row', <?= $template['header_row'] ?>);
|
|
formData.append('start_column', <?= $template['start_column'] ?>);
|
|
|
|
fetch('process_import_xls2.php', {
|
|
method: 'POST',
|
|
body: formData
|
|
})
|
|
.then(response => response.json())
|
|
.then(data => {
|
|
loader.style.display = 'none';
|
|
if (data.error) {
|
|
errorContainer.textContent = data.error;
|
|
errorContainer.style.display = 'block';
|
|
} else {
|
|
let html = `
|
|
<form id="selectRowsForm" action="import_insert.php" method="POST">
|
|
<input type="hidden" name="template_id" value="${data.template_id}">
|
|
<input type="hidden" name="columns" value='${JSON.stringify(data.columns)}'>
|
|
<input type="hidden" name="rows" value='${JSON.stringify(data.rows)}'>
|
|
<input type="hidden" name="filename" value="${data.filename}">
|
|
<div class="search-container">
|
|
<input type="text" id="searchInput" class="form-control" placeholder="Cerca nelle righe...">
|
|
</div>
|
|
<div class="table-container">
|
|
<table class="table table-striped table-bordered">
|
|
<thead>
|
|
<tr>
|
|
<th><input type="checkbox" id="selectAll"> Seleziona</th>
|
|
${data.columns.map(col => `<th>${col || 'Colonna senza nome'}<div class="resize-handle"></div></th>`).join('')}
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
${data.rows.map((row, index) => `
|
|
<tr>
|
|
<td><input type="checkbox" class="row-checkbox" name="selected_rows[]" value="${index}"></td>
|
|
${row.map(cell => `<td>${cell}</td>`).join('')}
|
|
</tr>
|
|
`).join('')}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<button type="submit" class="btn btn-primary mt-3" id="proceedButton" disabled>Prosegui</button>
|
|
</form>
|
|
`;
|
|
tableContainer.innerHTML = html;
|
|
|
|
// Inizializza le variabili dopo aver inserito la tabella
|
|
const proceedButton = document.getElementById('proceedButton');
|
|
const selectAllCheckbox = document.getElementById('selectAll');
|
|
const checkboxes = document.querySelectorAll('.row-checkbox');
|
|
|
|
// Funzione per aggiornare lo stato del pulsante Prosegui
|
|
function updateProceedButton() {
|
|
proceedButton.disabled = !Array.from(checkboxes).some(cb => cb.checked);
|
|
}
|
|
|
|
// Event listener per il checkbox "Seleziona tutto"
|
|
selectAllCheckbox.addEventListener('change', function() {
|
|
checkboxes.forEach(checkbox => {
|
|
checkbox.checked = this.checked;
|
|
});
|
|
updateProceedButton();
|
|
});
|
|
|
|
// Event listener per i checkbox delle righe
|
|
checkboxes.forEach(checkbox => {
|
|
checkbox.addEventListener('change', function() {
|
|
console.log('Checkbox changed, checked: ', this.checked); // Debug
|
|
// Aggiorna lo stato del checkbox "Seleziona tutto"
|
|
selectAllCheckbox.checked = Array.from(checkboxes).every(cb => cb.checked);
|
|
updateProceedButton();
|
|
});
|
|
});
|
|
|
|
// Aggiungi logica per il ridimensionamento delle colonne
|
|
const thElements = document.querySelectorAll('.table th');
|
|
thElements.forEach((th, index) => {
|
|
if (index === 0) return;
|
|
const resizeHandle = th.querySelector('.resize-handle');
|
|
if (resizeHandle) {
|
|
resizeHandle.addEventListener('mousedown', (e) => {
|
|
e.preventDefault();
|
|
const startX = e.clientX;
|
|
const startWidth = th.offsetWidth;
|
|
|
|
const onMouseMove = (e) => {
|
|
const newWidth = Math.max(50, startWidth + (e.clientX - startX));
|
|
th.style.width = `${newWidth}px`;
|
|
th.style.minWidth = `${newWidth}px`;
|
|
th.style.maxWidth = `${newWidth}px`;
|
|
|
|
const cells = document.querySelectorAll(`.table td:nth-child(${index + 1})`);
|
|
cells.forEach(cell => {
|
|
cell.style.width = `${newWidth}px`;
|
|
cell.style.minWidth = `${newWidth}px`;
|
|
cell.style.maxWidth = `${newWidth}px`;
|
|
});
|
|
};
|
|
|
|
const onMouseUp = () => {
|
|
document.removeEventListener('mousemove', onMouseMove);
|
|
document.removeEventListener('mouseup', onMouseUp);
|
|
};
|
|
|
|
document.addEventListener('mousemove', onMouseMove);
|
|
document.addEventListener('mouseup', onMouseUp);
|
|
});
|
|
}
|
|
});
|
|
|
|
// Aggiungi event listener per la ricerca
|
|
const searchInput = document.getElementById('searchInput');
|
|
const rows = document.querySelectorAll('.table tbody tr');
|
|
|
|
searchInput.addEventListener('input', function() {
|
|
const searchTerm = this.value.toLowerCase();
|
|
rows.forEach(row => {
|
|
const text = Array.from(row.cells).slice(1).map(cell => cell.textContent.toLowerCase()).join(' ');
|
|
row.style.display = text.includes(searchTerm) ? '' : 'none';
|
|
});
|
|
});
|
|
|
|
// Abilita il pulsante se ci sono checkbox selezionate all'inizio
|
|
updateProceedButton();
|
|
}
|
|
})
|
|
.catch(error => {
|
|
loader.style.display = 'none';
|
|
errorContainer.textContent = 'Errore durante il caricamento del file: ' + error.message;
|
|
errorContainer.style.display = 'block';
|
|
});
|
|
});
|
|
});
|
|
</script>
|
|
</body>
|
|
|
|
</html>
|