File "table045.php"
Full Path: /home/analogde/www/Dev tableau/table045.php
File size: 22.83 KB
MIME-type: text/html
Charset: utf-8
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Tableau HTML</title>
<!-- Ajoutez le lien vers Bootstrap -->
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
<style>
.table-container {
width: 100%;
overflow-x: auto;
margin-bottom: 10px;
}
.fixed-column {
position: sticky;
left: 0;
background: white;
z-index: 2;
border-left: 2px solid black;
border-right: 1px solid black;
padding-left: 10px;
padding-right: 10px;
width: 222px;
min-width: 222px;
}
.second-fixed-column {
position: sticky;
left: 222px;
background: white;
z-index: 2;
border-right: 1px solid black;
padding-left: 5px;
padding-right: 5px;
width: 1px;
min-width: 1px;
white-space: nowrap;
}
th.fixed-column, th.second-fixed-column {
top: 0;
z-index: 3;
}
td:first-child {
border-left: 2px solid black;
}
.active-cell {
background-color: green;
color: white;
}
.total-column {
background-color: #f0f0f0;
pointer-events: none;
width: 25px;
}
.week-even {
background-color: #e0f7fa;
}
.week-odd {
background-color: #ffecb3;
}
.button-container {
text-align: center;
margin-top: 10px;
}
.grayed-out {
background-color: #d3d3d3;
pointer-events: none;
}
</style>
</head>
<body>
<div class="table-container">
<table id="data-table" class="table table-bordered table-striped table-hover">
<thead>
<tr>
<th class="fixed-column">Nom</th>
<th class="second-fixed-column total-column">Total</th>
<?php
$start_date = new DateTime("2025-01-01");
$end_date = new DateTime("2025-12-31");
$holidays = [
"01/01", "01/05", "08/05", "14/07", "15/08", "01/11", "11/11", "25/12",
date("d/m", strtotime("2025-05-29")),
date("d/m", strtotime("2025-06-08"))
];
$dates = [];
while ($start_date <= $end_date) {
$dayOfWeek = $start_date->format("N");
$formattedDate = $start_date->format("d");
if ($dayOfWeek < 6 && !in_array($formattedDate, $holidays)) {
$weekNumber = $start_date->format("W");
$month = $start_date->format("m");
$dates[] = ["date" => $formattedDate, "week" => $weekNumber, "month" => $month];
}
$start_date->modify("+1 day");
}
$currentWeek = null;
$weekClass = "week-even";
$lastMonth = null;
$months = [
"01" => "Janvier", "02" => "Février", "03" => "Mars", "04" => "Avril",
"05" => "Mai", "06" => "Juin", "07" => "Juillet", "08" => "Août",
"09" => "Septembre", "10" => "Octobre", "11" => "Novembre", "12" => "Décembre"
];
foreach ($dates as $data) {
$monthName = isset($months[$data['month']]) ? $months[$data['month']] : 'Mois inconnu';
if ($currentWeek !== $data['week']) {
$currentWeek = $data['week'];
$weekClass = ($weekClass === "week-even") ? "week-odd" : "week-even";
}
echo "<th class='$weekClass'>{$data['date']}</th>";
}
?>
</tr>
</thead>
<tbody>
<tr>
<td class="fixed-column">Mois</td>
<td class="second-fixed-column"></td>
<?php
$currentMonth = null;
$count = 1;
foreach ($dates as $index => $data) {
if ($currentMonth !== $data['month']) {
if ($currentMonth !== null) {
echo "<td colspan='$count'>{$months[$currentMonth]}</td>";
}
$currentMonth = $data['month'];
$count = 1;
} else {
$count++;
}
if ($index == count($dates) - 1) {
echo "<td colspan='$count'>{$months[$currentMonth]}</td>";
}
}
?>
</tr>
<tr>
<td class="fixed-column">Semaine</td>
<td class="second-fixed-column"></td>
<?php
$currentWeek = null;
$weekCount = 1;
foreach ($dates as $index => $data) {
if ($currentWeek !== $data['week']) {
if ($currentWeek !== null) {
echo "<td colspan='$weekCount'>{$currentWeek}</td>";
}
$currentWeek = $data['week'];
$weekCount = 1;
} else {
$weekCount++;
}
if ($index == count($dates) - 1) {
echo "<td colspan='$weekCount'>{$currentWeek}</td>";
}
}
?>
</tr>
</tbody>
</table>
</div>
<div class="button-container">
<button class="btn btn-primary" onclick="addRow()">Ajouter une ligne</button>
<button class="btn btn-success" onclick="saveData()">SAUVER</button>
<button class="btn btn-info" onclick="loadData()">CHARGER</button>
</div>
<script>
//combien data-table contient de lignes.
//il faut prendre les lignes dont l'indice est supérieur à 2
//on va venir recupérer pour chacunes de ces lignes le contenu des différentes cellules.
function addRow() {
let table = document.getElementById("data-table");
let row = table.insertRow(-1);
// Première cellule - Combo Box
let cell1 = row.insertCell(0);
cell1.classList.add("fixed-column");
let select = document.createElement("select");
select.addEventListener("change", function(event) {
// Ajouter ici des actions à effectuer lors de la sélection d'un item
select.blur();
});
// Ajouter des options à la combo box
let option1 = document.createElement("option");
option1.value = "Option 1";
option1.textContent = "Option 1";
select.appendChild(option1);
let option2 = document.createElement("option");
option2.value = "Option 2";
option2.textContent = "Option 2";
select.appendChild(option2);
let option3 = document.createElement("option");
option3.value = "Option 3";
option3.textContent = "Option 3";
select.appendChild(option3);
// Ajouter le select dans la cellule
cell1.appendChild(select);
// Deuxième cellule - Total
let cell2 = row.insertCell(1);
cell2.classList.add("second-fixed-column", "total-column");
cell2.innerText = "0";
// Ajouter les autres cellules de la ligne
for (let i = 2; i < table.rows[0].cells.length; i++) {
let cell = row.insertCell(i);
cell.innerText = "0";
cell.onclick = function() {
toggleCell(cell, row);
};
}
}
function toggleCell(cell, row) {
if (cell.innerText === '0') {
cell.innerText = '1';
cell.classList.add('active-cell');
} else {
cell.innerText = '0';
cell.classList.remove('active-cell');
}
updateTotal(row);
}
function updateTotal(row) {
let total = 0;
for (let i = 2; i < row.cells.length; i++) {
let cellValue = parseInt(row.cells[i].innerText);
if (!isNaN(cellValue)) {
total += cellValue;
}
}
row.cells[1].innerText = total;
}
/*function saveData() {
alert("Les données ont été sauvegardées !");
// Logique de sauvegarde des données ici (par exemple, envoyer les données à un serveur ou les enregistrer localement)
}*/
/*
function saveData() {
let table = document.getElementById("data-table");
let rows = table.rows;
// Vérifier s'il y a plus de 2 lignes
if (rows.length <= 2) {
alert("Sauvegarde impossible : il n'y a pas suffisamment de données.");
return;
}
let allData = []; // Tableau pour stocker les sous-tableaux JSON
// Boucler à travers les lignes à partir de la 3ème ligne (index 2)
for (let i = 2; i < rows.length; i++) {
let row = rows[i];
let rowData = []; // Tableau pour stocker les données de chaque ligne
// Récupérer les données de chaque cellule de la ligne
for (let j = 0; j < row.cells.length; j++) {
let cell = row.cells[j];
// Si la cellule est la première ou la seconde colonne, ajouter l'input ou le total
if (j === 0) {
// Ajout de la valeur de l'input si présent (pour la première colonne "Nom")
let input = cell.querySelector('select') ? cell.querySelector('select').value : null;
rowData.push(input || ""); // Ajoute l'input ou une chaîne vide si absent
} else if (j === 1) {
// Ajouter le total
rowData.push(cell.innerText); // Valeur totale de la cellule
} else {
// Ajouter 0 ou 1 en fonction de l'état de la cellule
rowData.push(cell.innerText === '1' ? 1 : 0);
}
}
// Ajouter les données de la ligne au tableau principal
allData.push(rowData);
}
// Convertir le tableau allData en JSON
let jsonData = JSON.stringify(allData, null, 4); // Beautifier l'indentation pour rendre la sortie lisible
alert(jsonData);
console.log("Données sauvegardées :", jsonData);
// Pour simuler une sauvegarde, tu peux l'envoyer à un serveur ou l'enregistrer localement.
// Par exemple, afficher dans la console ou sauvegarder dans un fichier.
alert("Données sauvegardées avec succès !");
}
*/
function saveDataaaa() {
let table = document.getElementById("data-table");
let rows = table.rows;
// Vérifier s'il y a plus de 2 lignes
if (rows.length <= 2) {
alert("Sauvegarde impossible : il n'y a pas suffisamment de données.");
return;
}
let allData = []; // Tableau pour stocker les sous-tableaux JSON
// Boucler à travers les lignes à partir de la 3ème ligne (index 2)
for (let i = 2; i < rows.length; i++) {
let row = rows[i];
let rowData = []; // Tableau pour stocker les données de chaque ligne
// Récupérer les données de chaque cellule de la ligne
for (let j = 0; j < row.cells.length; j++) {
let cell = row.cells[j];
// Si la cellule est la première colonne (Nom), récupérer la valeur de l'input (select)
if (j === 0)
{
let input = cell.querySelector('select') ? cell.querySelector('select').value : "";
console.log(" +++ " + input);
rowData.push(input); // Ajoute la valeur de l'input ou une chaîne vide si absent
}
// Si la cellule est la deuxième colonne (Total), ajouter la valeur du total
else if (j === 1) {
rowData.push(cell.innerText.trim()); // Ajoute la valeur du total, retirer les espaces inutiles
console.log(" +++ " + cell.innerText.trim());
}
// Sinon, ajouter 0 ou 1 en fonction de l'état de la cellule
else {
rowData.push(cell.innerText.trim() === '1' ? 1 : 0); // Ajouter 0 ou 1
}
}
// Ajouter les données de la ligne au tableau principal
allData.push(rowData);
}
// Convertir le tableau allData en JSON
let jsonData = JSON.stringify(allData, null, 4); // Beautifier l'indentation pour rendre la sortie lisible
alert(jsonData);
console.log("Données sauvegardées :", jsonData);
}
function saveDatazzzz() {
let table = document.getElementById("data-table");
let rows = table.rows;
if (rows.length <= 2) {
alert("Sauvegarde impossible : il n'y a pas suffisamment de données.");
return;
}
let allData = [];
for (let i = 2; i < rows.length; i++) { // Commence à partir de la troisième ligne
let row = rows[i];
let rowData = [];
let firstCell = row.cells[0]; // Première cellule de la ligne
let input = firstCell.querySelector('select') ? firstCell.querySelector('select').value : "";
if (input === "") continue; // Ignore les lignes vides (sans valeur dans la première cellule)
rowData.push(input);
for (let j = 1; j < row.cells.length; j++) {
let cell = row.cells[j];
let cellValue = cell.innerText.trim();
rowData.push(j === 1 ? cellValue : (cellValue === '1' ? 1 : 0));
}
allData.push(rowData);
}
let jsonData = JSON.stringify(allData, null, 4);
console.log("Données sauvegardées :", jsonData);
alert(jsonData);
}
/*
function saveData() {
let table = document.getElementById("data-table");
let rows = table.rows;
if (rows.length <= 2) {
alert("Sauvegarde impossible : il n'y a pas suffisamment de données.");
return;
}
let allData = [];
for (let i = 2; i < rows.length; i++) { // Commence à la 3ème ligne (évite les entêtes)
let row = rows[i];
let rowData = [];
let firstCell = row.cells[0];
let input = firstCell.querySelector('select') ? firstCell.querySelector('select').value : "";
if (input === "") continue; // Ignore les lignes vides
rowData.push(input);
for (let j = 1; j < row.cells.length; j++) {
let cell = row.cells[j];
let cellValue = cell.innerText.trim();
rowData.push(j === 1 ? cellValue : (cellValue === '1' ? 1 : 0));
}
allData.push(rowData);
}
let jsonData = JSON.stringify(allData);
// Envoi des données en AJAX avec XMLHttpRequest
let xhr = new XMLHttpRequest();
xhr.open("POST", "saveData.php", true);
xhr.setRequestHeader("Content-Type", "application/json");
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
alert("Données enregistrées avec succès !");
console.log("Réponse du serveur :", xhr.responseText);
} else {
alert("Erreur lors de l'enregistrement.");
}
}
};
xhr.send(jsonData); // Envoi du JSON
}
*/
function saveData()
{
const rows = document.querySelectorAll('#data-table tr'); // Récupérer toutes les lignes du tableau
let allData = [];
// Ignorer les 2 premières lignes (en-têtes du tableau)
for (let i = 3; i < rows.length; i++)
{
let row = rows[i];
let rowData = [];
// Sélectionner la première cellule (Nom)
let firstCell = row.cells[0];
let input = firstCell.querySelector('select') ? firstCell.querySelector('select').value : "";
rowData.push(input);
// Récupérer les autres cellules
for (let j = 1; j < row.cells.length; j++)
{
let cell = row.cells[j];
let cellValue = cell.innerText.trim();
rowData.push(j === 1 ? cellValue : (cellValue === '1' ? 1 : 0));
}
allData.push(rowData);
}
let jsonData = JSON.stringify(allData, null, 4);
console.log("Données sauvegardées :", jsonData);
// Envoi des données à PHP via POST
fetch('save_data01.php', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: jsonData
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Erreur lors de l\'envoi des données :', error));
/*
// Envoi des données au script PHP via Fetch API
fetch("save_data01.php", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({ data: [["val1", "val2", "val3"], ["val4", "val5", "val6"]] })
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error("Erreur:", error));
*/
}
function saveData_initial() {
let table = document.getElementById("data-table");
let rows = table.rows;
if (rows.length <= 2) {
alert("Sauvegarde impossible : il n'y a pas suffisamment de données.");
return;
}
let allData = [];
for (let i = 2; i < rows.length; i++) { // Commence à la 3ème ligne (évite les entêtes)
let row = rows[i];
let rowData = [];
let firstCell = row.cells[0];
let input = firstCell.querySelector('select') ? firstCell.querySelector('select').value : "";
if (input === "") continue; // Ignore les lignes vides
rowData.push(input);
for (let j = 1; j < row.cells.length; j++) {
let cell = row.cells[j];
let cellValue = cell.innerText.trim();
rowData.push(j === 1 ? cellValue : (cellValue === '1' ? 1 : 0));
}
allData.push(rowData);
}
let jsonData = JSON.stringify(allData);
// Envoi des données en AJAX avec XMLHttpRequest
let xhr = new XMLHttpRequest();
xhr.open("POST", "saveData.php", true);
xhr.setRequestHeader("Content-Type", "application/json");
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
alert("Données enregistrées avec succès !");
console.log("Réponse du serveur :", xhr.responseText);
} else {
alert("Erreur lors de l'enregistrement.");
}
}
};
xhr.send(jsonData); // Envoi du JSON
}
/****************************************/
function loadData() {
let xhr = new XMLHttpRequest();
xhr.open("GET", "recuperation.php", true);
xhr.setRequestHeader("Content-Type", "application/json");
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
let response = JSON.parse(xhr.responseText);
if (response.success)
{
alert("Youpi");
populateTable(response.data);
} else {
alert("Aucune donnée trouvée.");
}
}
};
xhr.send();
}
/****************************************/
function populateTable(data) {
let table = document.getElementById("data-table");
// Supprimer les anciennes lignes (sauf l'en-tête et les premières lignes fixes)
while (table.rows.length > 2) {
table.deleteRow(2);
}
data.forEach(rowData => {
let row = table.insertRow(-1);
// Première colonne : Select
let cell1 = row.insertCell(0);
cell1.classList.add("fixed-column");
let select = document.createElement("select");
["Option 1", "Option 2", "Option 3"].forEach(optionValue => {
let option = document.createElement("option");
option.value = optionValue;
option.textContent = optionValue;
if (optionValue === rowData[0]) option.selected = true;
select.appendChild(option);
});
cell1.appendChild(select);
// Deuxième colonne : Total
let cell2 = row.insertCell(1);
cell2.classList.add("second-fixed-column", "total-column");
cell2.innerText = rowData[1];
// Autres cellules
for (let i = 2; i < rowData.length; i++) {
let cell = row.insertCell(i);
cell.innerText = rowData[i] === 1 ? '1' : '0';
if (rowData[i] === 1) cell.classList.add('active-cell');
cell.onclick = function () {
toggleCell(cell, row);
};
}
});
}
</script>
<!-- Lien vers Bootstrap JS et dépendances -->
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.0.6/dist/umd/popper.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
</body>
</html>