File "table0037.php"

Full Path: /home/analogde/www/Dev tableau/table0037.php
File size: 8.99 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>
    <style>
        .table-container {
            width: 100%;
            overflow-x: auto;
            margin-bottom: 10px;
        }
        table {
            border-collapse: separate;
            border-spacing: 0;
            width: 100%;
            table-layout: auto;
        }
        th, td {
            padding: 5px;
            text-align: center;
            border: 1px solid black;
            box-sizing: border-box;
        }
        .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: 10px;
            padding-right: 10px;
            width: 100px;
            min-width: 100px;
        }
        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;
        }
        .week-even {
            background-color: #e0f7fa;
        }
        .week-odd {
            background-color: #ffecb3;
        }
        .button-container {
            text-align: center;
            margin-top: 5px;
        }
        .grayed-out {
            background-color: #d3d3d3;
            pointer-events: none;
        }
    </style>
</head>
<body>
    <div class="table-container">
        <table id="data-table">
            <tr>
                <th class="fixed-column">Nom</th>
                <th class="second-fixed-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"); // Format changé pour afficher uniquement le jour
                        if ($dayOfWeek < 6 && !in_array($formattedDate, $holidays)) {
                            $weekNumber = $start_date->format("W");
                            $month = $start_date->format("m");  // Récupérer le mois au format numérique
                            $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"
                    ];

                    // Affichage des dates dans la ligne 1 (utilisation du format "jour" uniquement)
                    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>"; // Affichage du numéro du jour uniquement
                    }
                ?>
            </tr>
            <tr>
                <td class="fixed-column">Mois</td>
                <td class="second-fixed-column"></td>
                <?php 
                    $currentMonth = null;
                    $count = 1; // Compteur pour savoir combien de dates partagent le même mois
                    foreach ($dates as $index => $data) {
                        if ($currentMonth !== $data['month']) {
                            if ($currentMonth !== null) {
                                // Fusionner les cellules du mois précédent
                                echo "<td colspan='$count'>{$months[$currentMonth]}</td>";
                            }
                            $currentMonth = $data['month'];
                            $count = 1; // Réinitialiser le compteur pour le mois suivant
                        } else {
                            $count++; // Incrémenter le compteur si c'est le même mois
                        }
                        if ($index == count($dates) - 1) {
                            // Afficher la dernière cellule du mois
                            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; // Compteur pour savoir combien de dates partagent la même semaine
                    foreach ($dates as $index => $data) {
                        if ($currentWeek !== $data['week']) {
                            if ($currentWeek !== null) {
                                // Fusionner les cellules de la semaine précédente
                                echo "<td colspan='$weekCount'>{$currentWeek}</td>";
                            }
                            $currentWeek = $data['week'];
                            $weekCount = 1; // Réinitialiser le compteur pour la semaine suivante
                        } else {
                            $weekCount++; // Incrémenter le compteur si c'est la même semaine
                        }
                        if ($index == count($dates) - 1) {
                            // Afficher la dernière cellule de la semaine
                            echo "<td colspan='$weekCount'>{$currentWeek}</td>";
                        }
                    }
                ?>
            </tr>
        </table>
    </div>

    <div class="button-container">
        <button onclick="addRow()">Ajouter une ligne</button>
    </div>

    <script>
        function addRow() {
            let table = document.getElementById("data-table");
            let row = table.insertRow(-1);
            
            let cell1 = row.insertCell(0);
            cell1.classList.add("fixed-column");
            let input = document.createElement("input");
            input.type = "text";
            input.addEventListener("keydown", function(event) {
                if (event.key === "Enter") {
                    input.blur();
                }
            });
            cell1.appendChild(input);
            
            let cell2 = row.insertCell(1);
            cell2.classList.add("second-fixed-column", "total-column");
            cell2.innerText = "0";
            
            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;
        }
    </script>
</body>
</html>