File "code_0013.php"

Full Path: /home/analogde/www/Softs/New folder/code_0013.php
File size: 10.25 KB
MIME-type: text/x-php
Charset: utf-8

<?php
// Fonction pour récupérer les jours fériés
function getHolidays($year)
{
    $holidays = [
        "$year-01-01", // Jour de l'An
        "$year-05-01", // Fête du Travail
        "$year-05-08", // Victoire 1945
        "$year-07-14", // Fête Nationale
        "$year-08-15", // Assomption
        "$year-11-01", // Toussaint
        "$year-11-11", // Armistice
        "$year-12-25", // Noël
    ];

    $easterDate = easter_date($year);
    $ascension = date('Y-m-d', strtotime('+39 days', $easterDate));
    $pentecost = date('Y-m-d', strtotime('+49 days', $easterDate));

    $holidays[] = $ascension;
    $holidays[] = $pentecost;

    return $holidays;
}

// Vérifier si c'est un jour ouvré
function isBusinessDay($date, $holidays)
{
    $dayOfWeek = date('N', $date); // 1 (lundi) à 7 (dimanche)
    return $dayOfWeek < 6 && !in_array(date('Y-m-d', $date), $holidays);
}

// Fonction pour générer le tableau dynamique
function generateTable($startDate, $endDate)
{
    setlocale(LC_TIME, 'fr_FR.UTF-8');
    $currentDate = strtotime($startDate);
    $endDate = strtotime($endDate);
    $holidays = getHolidays(date('Y', $currentDate));
    $monthColors = [
        "#FFCCCC", "#FFE5CC", "#FFFFCC", "#E5FFCC", "#CCFFCC", "#CCFFE5",
        "#CCFFFF", "#CCE5FF", "#CCCCFF", "#E5CCFF", "#FFCCFF", "#FFCCE5",
    ];
    $weekOddColor = "#D6EAF8";
    $weekEvenColor = "#AED6F1";

    echo '<div class="table-responsive">';
    echo '<table class="table table-bordered text-center" id="dynamicTable">';

    // Première ligne : en-têtes
    echo '<thead><tr><th>Date</th>';
    while ($currentDate <= $endDate) {
        if (isBusinessDay($currentDate, $holidays)) {
            $formattedDate = date('d/m/Y', $currentDate);
            echo '<th style="background-color: ' . $monthColors[date('n', $currentDate) - 1] . ';">' . $formattedDate . '</th>';
        }
        $currentDate = strtotime('+1 day', $currentDate);
    }
    echo '</tr>';

    // Réinitialiser la date pour la deuxième ligne (numéros de semaine)
    $currentDate = strtotime($startDate);
    echo '<tr><td>Semaine</td>';
    $lastWeekNumber = null;
    $weekCellCount = 0;
    while ($currentDate <= $endDate) {
        if (isBusinessDay($currentDate, $holidays)) {
            $weekNumber = date('W', $currentDate);
            if ($weekNumber === $lastWeekNumber) {
                $weekCellCount++;
            } else {
                if ($lastWeekNumber !== null) {
                    $color = ($lastWeekNumber % 2 === 0) ? $weekEvenColor : $weekOddColor;
                    echo '<td colspan="' . $weekCellCount . '" style="background-color: ' . $color . ';">' . $lastWeekNumber . '</td>';
                }
                $lastWeekNumber = $weekNumber;
                $weekCellCount = 1;
            }
        }
        $currentDate = strtotime('+1 day', $currentDate);
    }
    if ($lastWeekNumber !== null) {
        $color = ($lastWeekNumber % 2 === 0) ? $weekEvenColor : $weekOddColor;
        echo '<td colspan="' . $weekCellCount . '" style="background-color: ' . $color . ';">' . $lastWeekNumber . '</td>';
    }
    echo '</tr>';

    // Réinitialiser la date pour la troisième ligne (jours de la semaine)
    $currentDate = strtotime($startDate);
    echo '<tr><td>Jours</td>';
    while ($currentDate <= $endDate) {
        if (isBusinessDay($currentDate, $holidays)) {
            $dayName = mb_substr(ucfirst(strftime('%A', $currentDate)), 0, 3) . '.';
            echo '<td>' . $dayName . '</td>';
        }
        $currentDate = strtotime('+1 day', $currentDate);
    }
    echo '</tr></thead>';

    // Ajout d'une ligne vide au corps du tableau
    echo '<tbody id="dataBody"></tbody>';

    echo '</table>';
    echo '<button id="addRowBtn" class="btn btn-primary mt-3">Ajouter</button>';
    echo '<button id="saveBtn" class="btn btn-success mt-3" style="display: none;">Sauver</button>';
    echo '<input type="file" id="loadFileBtn" class="btn btn-secondary mt-3" style="display: inline-block;" accept=".json" />';  // Bouton de chargement du fichier
    echo '</div>';
}
?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Tableau Dynamique</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
    <style>
        .table_date[data-status="1"] {
            background-color: #007BFF;
            color: #fff;
        }
        .titre_nom[contenteditable="true"] {
            border: 1px dashed #000;
            padding: 5px;
        }
    </style>
</head>
<body>
<div class="container my-5">
    <h1 class="text-center mb-4">Tableau Dynamique</h1>
    <?php generateTable('2025-01-01', '2025-12-31'); ?>
</div>

<script>
    document.addEventListener('DOMContentLoaded', () => {
        const tableBody = document.getElementById('dataBody');
        const addRowBtn = document.getElementById('addRowBtn');
        const saveButton = document.getElementById('saveBtn');
        const loadFileBtn = document.getElementById('loadFileBtn');

        // Ajout de ligne
        addRowBtn.addEventListener('click', () => {
            const newRow = document.createElement('tr');
            const firstCell = document.createElement('td');
            firstCell.classList.add('titre_nom');
            firstCell.setAttribute('contenteditable', 'true');
            firstCell.textContent = 'Not define';
            newRow.appendChild(firstCell);

            // Ajouter des cellules vides avec un contenu initial de 0
            document.querySelectorAll('th').forEach(() => {
                const cell = document.createElement('td');
                cell.classList.add('table_date');
                cell.textContent = '0'; // Valeur initiale de la cellule
                cell.dataset.status = '0'; // Statut initial
                cell.setAttribute('onclick', 'toggleCellValue(event)'); // Permet le changement de valeur de la cellule
                newRow.appendChild(cell);
            });

            // Ajouter la nouvelle ligne au tableau
            tableBody.appendChild(newRow);

            // Montrer le bouton Sauver
            saveButton.style.display = 'inline-block';
        });

        // Fonction pour changer la valeur des cellules
        window.toggleCellValue = function(e) {
            if (e.target.dataset.status === '0') {
                e.target.dataset.status = '1';
                e.target.textContent = '1';
            } else {
                e.target.dataset.status = '0';
                e.target.textContent = '0';
            }
        };

        // Sauvegarde des données
        saveButton.addEventListener('click', () => {
            const rows = tableBody.getElementsByTagName('tr');
            const dataToSave = [];

            Array.from(rows).forEach(row => {
                const rowData = [];
                const cells = row.getElementsByTagName('td');
                
                // Ajouter la première cellule (nom de la ligne) à l'array rowData
                const firstCell = cells[0].textContent.trim(); // La première cellule contient le nom
                rowData.push(firstCell);

                // Ajouter les cellules de la ligne qui contiennent 0 ou 1
                Array.from(cells).forEach((cell, index) => {
                    if (cell.classList.contains('table_date') && (cell.dataset.status === '0' || cell.dataset.status === '1')) {
                        rowData.push(cell.dataset.status);
                    }
                });
                
                if (rowData.length > 1) { // Si la ligne contient des données (la première cellule + valeurs 0/1)
                    dataToSave.push(rowData);
                }
            });

            // Envoi des données au script PHP
            fetch('save_data.php', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json',
                },
                body: JSON.stringify(dataToSave)
            })
            .then(response => response.json())
            .then(data => {
                alert("Données sauvegardées !");
            })
            .catch(error => {
                console.error("Erreur de sauvegarde:", error);
            });
        });

        // Chargement des données depuis un fichier JSON
        loadFileBtn.addEventListener('change', (e) => {
            const file = e.target.files[0];
            if (file && file.type === 'application/json') {
                const reader = new FileReader();
                reader.onload = function(event) {
                    const data = JSON.parse(event.target.result);

                    // Effacer les lignes existantes
                    tableBody.innerHTML = '';

                    // Remplir le tableau avec les données chargées
                    data.forEach(rowData => {
                        const newRow = document.createElement('tr');
                        rowData.forEach((cellData, index) => {
                            const newCell = document.createElement('td');
                            if (index === 0) {
                                newCell.classList.add('titre_nom');
                                newCell.setAttribute('contenteditable', 'true');
                            } else {
                                newCell.classList.add('table_date');
                                newCell.setAttribute('onclick', 'toggleCellValue(event)');
                            }
                            newCell.textContent = cellData === '1' ? '1' : '0';
                            newCell.dataset.status = cellData;
                            newRow.appendChild(newCell);
                        });
                        tableBody.appendChild(newRow);
                    });

                    // Montrer le bouton Sauver
                    saveButton.style.display = 'inline-block';
                };
                reader.readAsText(file);
            } else {
                alert("Veuillez choisir un fichier JSON.");
            }
        });
    });
</script>
</body>
</html>