File "base_table001.html"

Full Path: /home/analogde/www/WORDPRESS/Dev tableau/base_table001.html
File size: 21.82 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 Dynamique</title>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
    <style>
        table {
            width: auto;
            min-width: 1200px;
            border-collapse: separate;
            border-spacing: 0;
        }
        th, td {
            border: 1px solid black;
            padding: 8px;
            text-align: center;
            white-space: nowrap;
            box-sizing: border-box;
        }
        thead th {
            background: #f8f8f8;
            position: sticky;
            top: 0;
            z-index: 2;
        }
        .table-container {
            width: 100%;
            overflow-x: auto;
            position: relative;
            margin-top: 20px;
            border: 1px solid #ddd;
        }
        th:nth-child(n+1):nth-child(-n+3), td:nth-child(n+1):nth-child(-n+3) {
            position: sticky;
            z-index: 4;
            background: white;
            border-right: 2px solid black;
        }
        th:nth-child(1), td:nth-child(1) {
            left: 0;
            width: 210px;
            min-width: 210px;
            max-width: 210px;
        }
        th:nth-child(2), td:nth-child(2) {
            left: 210px;
            width: 80px;
            min-width: 80px;
            max-width: 80px;
        }
        th:nth-child(3), td:nth-child(3) {
            left: 290px;
            width: 100px;
            min-width: 100px;
            max-width: 100px;
        }
        td:first-child {
            display: flex;
            justify-content: center;
            align-items: center;
        }
        select {
            width: 100%;
            max-width: 80px;
        }
        input[type="text"] {
            width: calc(100% - 20px);
            box-sizing: border-box;
        }
        button {
            margin-top: 20px;
            padding: 10px;
            font-size: 16px;
        }
        .cell-active {
            background-color: green;
        }
        th:nth-child(n+4), td:nth-child(n+4) {
            width: 50px;
            min-width: 50px;
            max-width: 50px;
        }
        .unused-cell {
            background-color: #cccccc;
        }
        .dragging {
            opacity: 0.5;
        }
        .collapse-cell {
            background-color: orange;
        }
        .special-cell {
            display: flex;
            justify-content: space-between;
            align-items: center;
            position: relative;
            padding: 0;
        }
        .special-cell input {
            width: calc(100% - 30px);
            margin-right: 10px;
            height: 20px;
        }
        .special-cell button {
            width: 20px;
            height: 20px;
            background-color: orange;
            border: none;
            cursor: pointer;
            display: flex;
            justify-content: center;
            align-items: center;
            margin: 0;
        }
        .context-menu {
            display: none;
            position: absolute;
            background-color: white;
            border: 1px solid #ccc;
            box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
            z-index: 1000;
        }
        .context-menu ul {
            list-style: none;
            padding: 0;
            margin: 0;
        }
        .context-menu ul li {
            padding: 8px 12px;
            cursor: pointer;
            display: flex;
            align-items: center;
        }
        .context-menu ul li:hover {
            background-color: #f0f0f0;
        }
        .context-menu ul li .color-box {
            width: 15px;
            height: 15px;
            margin-right: 10px;
        }
    </style>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.4.0/jspdf.umd.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf-autotable/3.5.23/jspdf.plugin.autotable.min.js"></script>
    <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
</head>
<body>
<div class="table-container">
    <table>
        <thead>
<!--
            <tr id="header-row">
                <th colspan="3" style="position: sticky; left: 0; background: white; z-index: 5;">En-tête fusionné</th>
            </tr>
            <tr id="month-row">
                <th colspan="3" style="position: sticky; left: 0; background: white; z-index: 5;">AAA</th>               
            </tr>
            <tr id="day-row">
                <th colspan="3" style="position: sticky; left: 0; background: white; z-index: 5;">BBB</th>      
            </tr>
            <tr id="numero-row">
                <th colspan="3" style="position: sticky; left: 0; background: white; z-index: 5;">CCC</th>                      
            </tr>
        -->           

<!--
            <tr id="header-row">
                <th colspan="3" style="position: sticky; left: 0; background: white; z-index: 5;">En-tête fusionné</th>
            </tr>
            <tr id="month-row">
                <th class="unused-cell">Non utilisé</th>
                <th>Mois</th>
                <th class="unused-cell">Non utilisé</th>
            </tr>
            <tr id="day-row">
                <th class="unused-cell">Non utilisé</th>
                <th>Jours</th>
                <th class="unused-cell">Non utilisé</th>
            </tr>
            <tr id="numero-row">
                <th class="unused-cell">Non utilisé</th>
                <th>Semaine</th>
                <th class="unused-cell">Non utilisé</th>
            </tr>
        -->


            <tr id="header-row">
                <th>plouf</th>
                <th>Nom</th>
                <th>Total</th>
            </tr>
            <tr id="month-row">
                <th class="unused-cell">Non utilisé</th>
                <th>Mois</th>
                <th class="unused-cell">Non utilisé</th>
            </tr>
            <tr id="day-row">
                <th class="unused-cell">Non utilisé</th>
                <th>Jours</th>
                <th class="unused-cell">Non utilisé</th>
            </tr>
            <tr id="numero-row">
                <th class="unused-cell">Non utilisé</th>
                <th>Semaine</th>
                <th class="unused-cell">Non utilisé</th>
            </tr>
       
        </thead>
        <tbody id="table-body"></tbody>
    </table>
</div>
<button id="getDataButton">Récupérer les données du tableau</button>
<button id="sendDataButton">Envoyer les données</button>
<button id="readDataButton">Lire les données</button>
<button id="addRowButton">Ajouter une ligne</button>
<button id="addSpecialRowButton">Ajouter une ligne spéciale</button>
<button id="generatePDFButton">PDF</button>

<div id="contextMenu" class="context-menu">
    <ul>
        <li id="deleteRow">Supprimer</li>
        <li id="addRowContext">Ajouter une ligne</li>
        <li id="changeColorRed">Changer la couleur en rouge</li>
        <li id="changeColorGreen">Changer la couleur en vert</li>
        <li id="changeColorBlue">Changer la couleur en bleu</li>
        <li id="changeColorNone">Pas de couleur</li>
        <li id="changeValues">Changer</li>
    </ul>
</div>

<div id="specialRowContextMenu" class="context-menu">
    <ul>
        <li id="deleteSpecialRow">Supprimer</li>
        <li id="addRowAfterSpecial">Ajouter une ligne</li>
    </ul>
</div>

<div id="cellContextMenu" class="context-menu">
    <ul>
        <li id="cellColorRed"><span class="color-box" style="background-color: red;"></span> Rouge</li>
        <li id="cellColorGreen"><span class="color-box" style="background-color: green;"></span> Vert</li>
        <li id="cellColorBlue"><span class="color-box" style="background-color: blue;"></span> Bleu</li>
        <li id="cellColorYellow"><span class="color-box" style="background-color: yellow;"></span> Jaune</li>
        <li id="cellColorPurple"><span class="color-box" style="background-color: purple;"></span> Violet</li>
    </ul>
</div>

<!-- Modal de confirmation -->
<div class="modal fade" id="confirmationModal" tabindex="-1" role="dialog" aria-labelledby="confirmationModalLabel" aria-hidden="true">
    <div class="modal-dialog" role="document">
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title" id="confirmationModalLabel">Confirmation</h5>
                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                    <span aria-hidden="true">&times;</span>
                </button>
            </div>
            <div class="modal-body">
                Êtes-vous sûr de vouloir supprimer cette ligne ?
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-secondary" data-dismiss="modal">Annuler</button>
                <button type="button" class="btn btn-danger" id="confirmDeleteButton">Supprimer</button>
            </div>
        </div>
    </div>
</div>

<script>
    const numCols = 100;
    const holidays = [
        '2025-01-01',
        '2025-04-21',
        '2025-05-01',
        '2025-05-08',
        '2025-05-29',
        '2025-06-09',
        '2025-07-14',
        '2025-08-15',
    ];
    let targetRow = null;
    let targetCell = null;
    let currentContextRow = null;

    function createTable() {
        const theadRow = document.getElementById("header-row");
        const monthRow = document.getElementById("month-row");
        const dayRow = document.getElementById("day-row");
        const numeroWeekRow = document.getElementById("numero-row");
        let currentDate = new Date('2024-06-01');
        const endDate = new Date('2025-06-30');
        let lastMonth = "";
        let currentColor = "#E0E0E0";
        let weekNumber = getISOWeekNumber(currentDate);
        let lastThMonth = null;
        let colSpanMonth = 0;
        let lastWeekNumber = null;
        let weekTh = null;
        let colSpanWeek = 0;

        function getISOWeekNumber(date) {
            const dateCopy = new Date(date.getTime());
            dateCopy.setHours(0, 0, 0, 0);
            dateCopy.setDate(dateCopy.getDate() + 3 - (dateCopy.getDay() + 6) % 7);
            const firstThursday = new Date(dateCopy.getFullYear(), 0, 1);
            return Math.ceil(((dateCopy - firstThursday) / 86400000 + 1) / 7);
        }

        while (currentDate <= endDate) {
            const dayOfWeek = currentDate.getDay();
            const dateString = currentDate.toISOString().split('T')[0];

            if (dayOfWeek !== 0 && dayOfWeek !== 6 && !holidays.includes(dateString)) {
                let th = document.createElement("th");
                th.textContent = currentDate.getDate();
                theadRow.appendChild(th);

                let currentWeekNumber = getISOWeekNumber(currentDate);

                let monthShort = currentDate.toLocaleString('default', { month: 'long' });
                monthShort = monthShort.charAt(0).toUpperCase() + monthShort.slice(1);
                if (monthShort === lastMonth) {
                    colSpanMonth++;
                    lastThMonth.colSpan = colSpanMonth;
                } else {
                    lastMonth = monthShort;
                    colSpanMonth = 1;
                    lastThMonth = document.createElement("th");
                    lastThMonth.textContent = monthShort + " " + currentDate.getFullYear();
                    monthRow.appendChild(lastThMonth);

                    if (parseInt(currentDate.toLocaleString('default', { month: 'numeric' })) % 2 === 0) {
                        lastThMonth.style.backgroundColor = "#E0E0E0";
                    } else {
                        lastThMonth.style.backgroundColor = "#B0C4DE";
                    }
                }

                th.style.backgroundColor = (currentDate.getMonth() % 2 === 0) ? "#FFA500" : "#0000FF";

                let dayTh = document.createElement("th");
                dayTh.textContent = currentDate.toLocaleString('default', { weekday: 'short' }).charAt(0).toUpperCase();
                dayRow.appendChild(dayTh);

                if (dayOfWeek === 1) {
                    currentColor = (currentColor === "#E0E0E0") ? "#B0C4DE" : "#E0E0E0";
                    weekNumber = getISOWeekNumber(currentDate);
                }
                dayTh.style.backgroundColor = currentColor;

                if (currentWeekNumber === lastWeekNumber) {
                    colSpanWeek++;
                    weekTh.colSpan = colSpanWeek;
                } else {
                    weekTh = document.createElement("th");
                    weekTh.textContent = currentWeekNumber;
                    weekTh.colSpan = 1;
                    numeroWeekRow.appendChild(weekTh);

                    lastWeekNumber = currentWeekNumber;
                    colSpanWeek = 1;
                }
            }
            currentDate.setDate(currentDate.getDate() + 1);
        }
    }

    function addRow(event) 
    {
       

        
    }

    function addSpecialRow() 
    {
        

      
    }

    function toggleCollapse(row) 
    {
       
    }

    function handleDragStart(event) 
    {
       
    }

    function handleDragOver(event) 
    {
       
    }

    function handleDrop(event) 
    {
        
    }

    function handleCellClick(event) 
    {
        
    }

    function showContextMenu(event) 
    {
        
    }

    function showCellContextMenu(event) 
    {
       
    }

    function hideContextMenus() 
    {
      
    }

    function changeCellValues(row) 
    {
      
    }

    function generatePDF() 
    {
      
    }

    function showDeleteConfirmationModal() {
        $('#confirmationModal').modal('show');
    }

    function deleteRow() {
        if (currentContextRow) {
            currentContextRow.remove();
            hideContextMenus();
        }
    }

    window.onload = function() {
        createTable();

        const addRowButton = document.getElementById('addRowButton');
        addRowButton.addEventListener('click', addRow);

        const addRowContextButton = document.getElementById('addRowContext');
        addRowContextButton.addEventListener('click', function() {
            addRow({ target: currentContextRow });
            contextMenu.style.display = 'none';
        });

        const deleteRowButton = document.getElementById('deleteRow');
        deleteRowButton.addEventListener('click', showDeleteConfirmationModal);

        const deleteSpecialRowButton = document.getElementById('deleteSpecialRow');
        deleteSpecialRowButton.addEventListener('click', showDeleteConfirmationModal);

        const addRowAfterSpecialButton = document.getElementById('addRowAfterSpecial');
        addRowAfterSpecialButton.addEventListener('click', function() {
            addRow({ target: currentContextRow });
            specialRowContextMenu.style.display = 'none';
        });

        const changeColorRedButton = document.getElementById('changeColorRed');
        changeColorRedButton.addEventListener('click', function() {
            if (currentContextRow) {
                currentContextRow.style.backgroundColor = 'red';
                contextMenu.style.display = 'none';
            }
        });

        const changeColorGreenButton = document.getElementById('changeColorGreen');
        changeColorGreenButton.addEventListener('click', function() {
            if (currentContextRow) {
                currentContextRow.style.backgroundColor = 'green';
                contextMenu.style.display = 'none';
            }
        });

        const changeColorBlueButton = document.getElementById('changeColorBlue');
        changeColorBlueButton.addEventListener('click', function() {
            if (currentContextRow) {
                currentContextRow.style.backgroundColor = 'blue';
                contextMenu.style.display = 'none';
            }
        });

        const changeColorNoneButton = document.getElementById('changeColorNone');
        changeColorNoneButton.addEventListener('click', function() {
            if (currentContextRow) {
                currentContextRow.style.backgroundColor = '';
                contextMenu.style.display = 'none';
            }
        });

        const changeValuesButton = document.getElementById('changeValues');
        changeValuesButton.addEventListener('click', function() {
            if (currentContextRow) {
                changeCellValues(currentContextRow);
                contextMenu.style.display = 'none';
            }
        });

        const cellColorRedButton = document.getElementById('cellColorRed');
        cellColorRedButton.addEventListener('click', function() {
            if (targetCell && targetCell.textContent === "1") {
                targetCell.style.backgroundColor = 'red';
                cellContextMenu.style.display = 'none';
            }
        });

        const cellColorGreenButton = document.getElementById('cellColorGreen');
        cellColorGreenButton.addEventListener('click', function() {
            if (targetCell && targetCell.textContent === "1") {
                targetCell.style.backgroundColor = 'green';
                cellContextMenu.style.display = 'none';
            }
        });

        const cellColorBlueButton = document.getElementById('cellColorBlue');
        cellColorBlueButton.addEventListener('click', function() {
            if (targetCell && targetCell.textContent === "1") {
                targetCell.style.backgroundColor = 'blue';
                cellContextMenu.style.display = 'none';
            }
        });

        const cellColorYellowButton = document.getElementById('cellColorYellow');
        cellColorYellowButton.addEventListener('click', function() {
            if (targetCell && targetCell.textContent === "1") {
                targetCell.style.backgroundColor = 'yellow';
                cellContextMenu.style.display = 'none';
            }
        });

        const cellColorPurpleButton = document.getElementById('cellColorPurple');
        cellColorPurpleButton.addEventListener('click', function() {
            if (targetCell && targetCell.textContent === "1") {
                targetCell.style.backgroundColor = 'purple';
                cellContextMenu.style.display = 'none';
            }
        });

        document.getElementById('getDataButton').addEventListener('click', logTableData);
        document.getElementById('sendDataButton').addEventListener('click', sendTableData);
        document.getElementById('readDataButton').addEventListener('click', readTableData);
        document.getElementById('addSpecialRowButton').addEventListener('click', addSpecialRow);
        document.getElementById('generatePDFButton').addEventListener('click', generatePDF);

        // Add event listener for the Escape key
        document.addEventListener('keydown', function(event) {
            if (event.key === 'Escape') {
                hideContextMenus();
            }
        });

        // Add event listener for the confirmation button in the modal
        document.getElementById('confirmDeleteButton').addEventListener('click', function() {
            deleteRow();
            $('#confirmationModal').modal('hide');
        });
    };

    function getTableData() {
        let rows = document.querySelectorAll('tbody tr');
        let tableData = [];
        rows.forEach(function(row) {
            let rowData = [];
            let cells = row.querySelectorAll('td');
            cells.forEach(function(cell) {
                if (cell.querySelector('select')) {
                    rowData.push(cell.querySelector('select').value);
                } else if (cell.querySelector('input')) {
                    rowData.push(cell.querySelector('input').value);
                } else {
                    rowData.push(cell.innerText);
                }
            });
            tableData.push(rowData);
        });
        return tableData;
    }

    function logTableData() {
        let data = getTableData();
        console.log(data);
        console.log(JSON.stringify(data, null, 2));
    }

    function sendTableData() {
        let data = getTableData();
        let jsonData = JSON.stringify(data);
        fetch('insert.php', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json'
            },
            body: jsonData
        })
        .then(response => response.json())
        .then(data => {
            alert(data.message);
        })
        .catch(error => {
            console.error('Erreur:', error);
        });
    }

    function readTableData() {
        fetch('lecture.php', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json'
            }
        })
        .then(response => response.json())
        .then(data => {
            if (data.success) {
                updateTable(data.data_json);
            } else {
                alert('Erreur lors de la récupération des données.');
            }
        })
        .catch(error => {
            console.error('Erreur:', error);
        });
    }

    function updateTable(data) 
    {
        
    }
</script>
</body>
</html>