File "T_0010.php"

Full Path: /home/analogde/www/Freebox/Improve/T_0010.php
File size: 9.7 KB
MIME-type: text/html
Charset: utf-8

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>Table Interactif</title>

    

    <!-- Lien vers le fichier CSS de Bootstrap -->

    <link href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.2/dist/css/bootstrap.min.css" rel="stylesheet">



    <style>

        table {

            border-collapse: collapse;

            margin: 20px 0;

            width: 100%;

            max-width: 600px;

        }



        th, td {

            border: 1px solid #000;

            text-align: center;

            padding: 8px;

            cursor: pointer;

        }



        .active {

            background-color: #4caf50;

            color: white;

        }



        button {

            margin-top: 20px;

            padding: 10px 20px;

            font-size: 16px;

            cursor: pointer;

        }



        .editable {

            cursor: text;

        }

    </style>

</head>

<body>



    <table id="interactiveTable">

        <thead>

            <tr>

                <th>pipo</th>

                <th>1</th>

                <th>2</th>

                <th>3</th>

                <th>4</th>

                <th>5</th>

                <th>6</th>

                <th>7</th>

                <th>8</th>

                <th>9</th>

                <th>10</th>

            </tr>

        </thead>

        <tbody>

            <tr>

                <td>pipo1</td>

                <td>0</td>

                <td>0</td>

                <td>0</td>

                <td>0</td>

                <td>0</td>

                <td>0</td>

                <td>0</td>

                <td>0</td>

                <td>0</td>

                <td>0</td>

            </tr>

        </tbody>

    </table>



    <!-- Bouton Sauvegarder -->

    <button id="saveButton" class="btn btn-primary">Sauvegarder</button>



    <!-- Bouton Charger -->

    <button id="loadButton" class="btn btn-secondary">Charger</button>



    <!-- Bouton Réinitialiser -->

    <button id="resetButton" class="btn btn-danger">Réinitialiser</button>



    <!-- Modal Bootstrap pour la confirmation de réinitialisation -->

    <div class="modal fade" id="resetModal" tabindex="-1" aria-labelledby="resetModalLabel" aria-hidden="true">

        <div class="modal-dialog">

            <div class="modal-content">

                <div class="modal-header">

                    <h5 class="modal-title" id="resetModalLabel">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">

                    Voulez-vous vraiment réinitialiser toutes les cellules ?

                </div>

                <div class="modal-footer">

                    <button type="button" class="btn btn-secondary" data-dismiss="modal">Annuler</button>

                    <button type="button" class="btn btn-primary" id="confirmResetButton">OK</button>

                </div>

            </div>

        </div>

    </div>



    <!-- Lien vers jQuery, Popper.js et Bootstrap JS -->

    <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>

    <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>

    <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.5.2/dist/js/bootstrap.min.js"></script>



    <script>

        const table = document.getElementById('interactiveTable');



        // Fonction pour rendre une cellule éditable

        function makeCellEditable(cell) {

            const currentValue = cell.textContent;



            // Créer un champ input pour l'édition de la cellule

            const input = document.createElement('input');

            input.type = 'text';

            input.value = currentValue;

            input.className = 'form-control';

            input.style.width = '100%';



            // Remplacer le contenu de la cellule par l'input

            cell.innerHTML = '';

            cell.appendChild(input);

            input.focus();



            // Ajouter un événement pour sauvegarder la valeur modifiée quand l'utilisateur appuie sur "Enter"

            input.addEventListener('blur', () => {

                const newValue = input.value;



                // Si c'est la première colonne, on vérifie les caractères

                if (cell.cellIndex === 0 && !/^[a-zA-Z0-9]*$/.test(newValue)) {

                    alert("Les caractères spéciaux ne sont pas autorisés.");

                    return;

                }



                // Si la valeur est valide, mettre à jour la cellule

                cell.textContent = newValue;

            });



            // Ajouter un événement pour annuler l'édition si l'utilisateur appuie sur "Escape"

            input.addEventListener('keydown', (e) => {

                if (e.key === 'Escape') {

                    cell.textContent = currentValue;

                }

            });

        }



        // Gestion du clic sur les cellules

        table.addEventListener('click', (event) => {

            const cell = event.target;



            // Vérifier si l'élément cliqué est une cellule (td) et non un header (th)

            if (cell.tagName === 'TD') {

                // Si c'est la première colonne, on permet l'édition du texte alphanumérique

                if (cell.cellIndex === 0) {

                    makeCellEditable(cell);

                } else {

                    // Si ce n'est pas la première colonne, basculer entre 0 et 1

                    if (cell.textContent === '0') {

                        cell.textContent = '1';

                        cell.classList.add('active');

                    } else if (cell.textContent === '1') {

                        cell.textContent = '0';

                        cell.classList.remove('active');

                    }

                }

            }

        });



        // Sauvegarde des données via XMLHttpRequest

        document.getElementById('saveButton').addEventListener('click', () => {

            const rows = table.querySelectorAll('tbody tr');

            const data = [];



            rows.forEach(row => {

                const rowData = [];

                const cells = row.querySelectorAll('td');

                cells.forEach(cell => {

                    rowData.push(cell.textContent);

                });

                data.push(rowData);

            });



            const xhr = new XMLHttpRequest();

            xhr.open("POST", "saveToDB.php", true);

            xhr.setRequestHeader("Content-Type", "application/json");



            xhr.onload = function() {

                if (xhr.status === 200) {

                    alert(xhr.responseText);  // Affiche la réponse du serveur

                } else {

                    alert("Erreur de sauvegarde des données");

                }

            };



            xhr.send(JSON.stringify(data));

        });



        // Charger les données depuis la base de données via XMLHttpRequest

        document.getElementById('loadButton').addEventListener('click', () => {

            const xhr = new XMLHttpRequest();

            xhr.open("GET", "loadFromDB.php", true);



            xhr.onload = function() {

                if (xhr.status === 200) {

                    const rowData = JSON.parse(xhr.responseText);  // Parse la réponse JSON



                    const rows = table.querySelectorAll('tbody tr');

                    rowData.forEach((dataRow, rowIndex) => {

                        const row = rows[rowIndex] || table.insertRow();

                        dataRow.forEach((cellData, cellIndex) => {

                            let cell = row.cells[cellIndex];



                            if (!cell) {

                                cell = row.insertCell(cellIndex);  // Insérer la cellule si elle n'existe pas

                            }



                            cell.textContent = cellData;

                            cell.classList.remove('active');  // Réinitialiser la classe active

                            if (cellData === '1') {

                                cell.classList.add('active');

                            }

                        });

                    });

                } else {

                    alert("Erreur de chargement des données");

                }

            };



            xhr.send();

        });



        // Bouton Réinitialiser pour ouvrir la boîte de dialogue de confirmation

        document.getElementById('resetButton').addEventListener('click', () => {

            $('#resetModal').modal('show');  // Ouvrir la modal Bootstrap

        });



        // Bouton OK pour réinitialiser les cellules

        document.getElementById('confirmResetButton').addEventListener('click', () => {

            // Réinitialiser toutes les cellules à '0'

            const rows = table.querySelectorAll('tbody tr');

            rows.forEach(row => {

                const cells = row.querySelectorAll('td');

                cells.forEach(cell => {

                    cell.textContent = '0';

                    cell.classList.remove('active');  // Supprimer la classe active

                });

            });



            $('#resetModal').modal('hide');  // Fermer la modal

        });

    </script>

</body>

</html>