File "inserer_tache_planning0010.php"
Full Path: /home/analogde/www/Chart burndown/inserer_tache_planning0010.php
File size: 22.35 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>Gestion des Tâches</title>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
<link href="https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css" rel="stylesheet">
<style>
.sortable-helper {
opacity: 0.7;
background-color: #f0f0f0;
border: 1px solid #ccc;
}
#taskTableBody tr {
cursor: move;
}
#taskTableBody tr td {
padding: 8px;
border: 1px solid #ddd;
}
/* Ajuster la largeur des colonnes */
#dataTable th:nth-child(1), #dataTable td:nth-child(1) {
width: 10%;
}
#dataTable th:nth-child(2), #dataTable td:nth-child(2) {
width: 35%;
}
#dataTable th:nth-child(3), #dataTable td:nth-child(3) {
width: 20%;
}
#dataTable th:nth-child(4), #dataTable td:nth-child(4) {
width: 35%;
}
</style>
</head>
<body>
<div class="container mt-5">
<h1>Gestion des Tâches</h1>
<table id="dataTable" class="table">
<thead>
<tr>
<th scope="col">Indice</th>
<th scope="col">Nom de la tâche</th>
<th scope="col">Temps estimé</th>
<th scope="col">Actions</th>
</tr>
</thead>
<tbody id="taskTableBody">
<!-- Les tâches seront ajoutées ici -->
</tbody>
</table>
<!-- Boutons pour ajouter, sauvegarder et charger -->
<button type="button" class="btn btn-success" data-toggle="modal" data-target="#addTaskModal" id="addButton">Ajouter une tâche</button>
<button id="saveButton" class="btn btn-success">Sauver</button>
<button id="loadButton" class="btn btn-info">Charger</button>
<!-- Modale d'ajout de tâche -->
<div class="modal fade" id="addTaskModal" tabindex="-1" role="dialog" aria-labelledby="addTaskModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="addTaskModalLabel">Ajouter une tâche</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<div class="form-group">
<label for="taskName">Nom de la tâche :</label>
<input type="text" class="form-control" id="taskName" required>
</div>
<div class="form-group">
<label for="estimatedTime">Temps estimé (en heures) :</label>
<input type="number" class="form-control" id="estimatedTime" min="1" step="1" required>
</div>
</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="addTaskButton">Ajouter</button>
</div>
</div>
</div>
</div>
<!-- Modale d'édition de tâche -->
<div class="modal fade" id="editTaskModal" tabindex="-1" role="dialog" aria-labelledby="editTaskModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="editTaskModalLabel">Modifier la tâche</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<div class="form-group">
<label for="editTaskName">Nom de la tâche :</label>
<input type="text" class="form-control" id="editTaskName" required>
</div>
<div class="form-group">
<label for="editEstimatedTime">Temps estimé (en heures) :</label>
<input type="number" class="form-control" id="editEstimatedTime" min="1" step="1" required>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal" id="closeEditModalButton">Fermer</button>
<button type="button" class="btn btn-primary" id="editTaskButton">Modifier</button>
</div>
</div>
</div>
</div>
<!-- Modale de confirmation de suppression -->
<div class="modal fade" id="confirmDeleteModal" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Confirmer la suppression</h5>
<button type="button" class="close" data-dismiss="modal">×</button>
</div>
<div class="modal-body">
<p>Êtes-vous sûr de vouloir supprimer cette tâche ?</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal" id="closeCoonfirmationModalButton">Annuler</button>
<button type="button" class="btn btn-danger" id="confirmDeleteButton">Supprimer</button>
</div>
</div>
</div>
</div>
<!-- Modale pour les champs manquants -->
<div class="modal fade" id="missingFieldsModal" tabindex="-1" role="dialog" aria-labelledby="missingFieldsModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="missingFieldsModalLabel">Champs manquants</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<p>Tous les champs sont nécessaires pour ajouter ou modifier une tâche. Veuillez remplir les champs manquants.</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">OK</button>
</div>
</div>
</div>
</div>
<!-- Modale pour les valeurs invalides -->
<div class="modal fade" id="invalidValueModal" tabindex="-1" role="dialog" aria-labelledby="invalidValueModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="invalidValueModalLabel">Valeur invalide</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<p>Le temps estimé doit être supérieur à zéro.</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Annuler</button>
<button type="button" class="btn btn-secondary" data-dismiss="modal">OK</button>
</div>
</div>
</div>
</div>
<!-- Modale pour voir les détails de la tâche -->
<div class="modal fade" id="viewTaskModal" tabindex="-1" role="dialog" aria-labelledby="viewTaskModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="viewTaskModalLabel">Voir la tâche</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<div class="form-group">
<label for="viewTaskName">Nom de la tâche :</label>
<input type="text" class="form-control" id="viewTaskName" readonly>
</div>
<div class="form-group">
<label for="viewEstimatedTime">Temps estimé (en heures) :</label>
<input type="text" class="form-control" id="viewEstimatedTime" readonly>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal" id="closeVoirModalButton">Fermer</button>
</div>
</div>
</div>
</div>
</div>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.bundle.min.js"></script>
<script>
$(document).on("click", ".close", function () {
$(this).closest(".modal").modal("hide");
});
// Fonction pour afficher la modale en cas de champs manquants
function showMissingFieldsModal() {
$("#missingFieldsModal").modal("show");
}
// Fonction pour afficher la modale en cas de valeur invalide
function showInvalidValueModal() {
$("#invalidValueModal").modal("show");
}
$(document).ready(function () {
let nextIndex = 1;
$("#taskTableBody").sortable({
helper: function (e, tr) {
var $originals = tr.children();
var $helper = tr.clone();
// Appliquer les mêmes largeurs aux colonnes
$helper.children().each(function (index) {
$(this).width($originals.eq(index).outerWidth());
});
// Appliquer la même hauteur pour éviter l'effet de réduction
$helper.height(tr.height());
// Copier les styles internes (notamment pour les boutons)
$helper.children().each(function (index) {
$(this).css({
"height": $originals.eq(index).height(),
"display": $originals.eq(index).css("display"),
"visibility": "visible",
"overflow": "visible"
});
// Copier les styles des boutons dans la colonne action
var $originalButtons = $originals.eq(index).find("button");
var $helperButtons = $(this).find("button");
$helperButtons.each(function (btnIndex) {
$(this).css({
"width": $originalButtons.eq(btnIndex).outerWidth(),
"height": $originalButtons.eq(btnIndex).outerHeight(),
"display": "inline-block",
"visibility": "visible"
});
});
});
// S'assurer que la ligne déplacée garde son style
$helper.css({
"display": "table",
"background": "#fff",
"box-shadow": "2px 2px 5px rgba(0,0,0,0.2)"
});
return $helper;
},
placeholder: "ui-state-highlight",
start: function (event, ui) {
ui.placeholder.height(ui.helper.outerHeight());
// Ajuster la largeur des colonnes du placeholder
ui.placeholder.children().each(function (index) {
$(this).width(ui.helper.children().eq(index).width());
});
},
update: function (event, ui) {
updateIndices();
}
});
$("#saveButton").click(function () {
let table = document.getElementById("dataTable");
let data = [];
// Parcourir les lignes en ignorant la première ligne (header)
for (let i = 1; i < table.rows.length; i++) {
let row = [];
let cells = table.rows[i].cells;
// Inclure toutes les cellules sauf la dernière (actions)
for (let j = 0; j < cells.length - 1; j++) {
row.push(cells[j].innerText);
}
data.push(row);
}
fetch('save.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data)
}).then(response => response.text()).then(data => {
alert("Données sauvegardées !");
});
});
$("#loadButton").click(function () {
fetch("load.php")
.then(response => {
if (!response.ok) {
throw new Error("Erreur réseau : " + response.status);
}
return response.json();
})
.then(data => {
console.log("Données reçues :", data);
$("#taskTableBody").empty(); // Vider le tableau avant de le remplir
data.forEach(task => {
var newRow = `<tr>
<td>${task[0]}</td>
<td>${task[1]}</td>
<td>${task[2]}</td>
<td>
<button class="btn btn-info btn-sm view-btn">Voir</button>
<button class="btn btn-warning btn-sm edit-btn">Modifier</button>
<button class="btn btn-danger btn-sm delete-btn">Supprimer</button>
</td>
</tr>`;
$("#taskTableBody").append(newRow);
});
// Mettre à jour nextIndex en fonction des données chargées
nextIndex = data.length > 0 ? parseInt(data[data.length - 1][0]) + 1 : 1;
})
.catch(error => {
console.error("Erreur lors du chargement des données :", error);
});
});
$("#addTaskButton").click(function () {
// Récupérer les valeurs des champs du formulaire
var taskName = $("#taskName").val().trim();
var estimatedTime = $("#estimatedTime").val().trim();
// Vérifier que les champs ne sont pas vides
if (taskName === "" || estimatedTime === "") {
showMissingFieldsModal();
return;
}
// Vérifier que le temps estimé est supérieur à zéro
if (estimatedTime <= 0) {
showInvalidValueModal();
return;
}
// Ajouter une nouvelle ligne dans le tableau avec l'indice
var newRow = `<tr>
<td>${nextIndex}</td>
<td>${taskName}</td>
<td>${estimatedTime}</td>
<td>
<button class="btn btn-info btn-sm view-btn">Voir</button>
<button class="btn btn-warning btn-sm edit-btn">Modifier</button>
<button class="btn btn-danger btn-sm delete-btn">Supprimer</button>
</td>
</tr>`;
$("#taskTableBody").append(newRow);
// Incrémenter l'indice pour la prochaine tâche
nextIndex++;
// Réinitialiser les champs du formulaire
$("#taskName").val("");
$("#estimatedTime").val("");
// Fermer la modale
$("#addTaskModal").modal('hide');
});
// Modification d'une tâche (remplissage du formulaire de modification)
$(document).on("click", ".edit-btn", function () {
var row = $(this).closest("tr");
var taskName = row.find("td:eq(1)").text();
var estimatedTime = row.find("td:eq(2)").text().replace(" h", "");
$("#editTaskName").val(taskName);
$("#editEstimatedTime").val(estimatedTime);
// Stocker la ligne en cours d'édition
$("#editTaskModal").data("editingRow", row);
// Afficher la modale d'édition
$("#editTaskModal").modal("show");
});
// Validation de la modification
$("#editTaskButton").click(function () {
var editedTaskName = $("#editTaskName").val().trim();
var editedEstimatedTime = $("#editEstimatedTime").val().trim();
if (editedTaskName === "" || editedEstimatedTime === "") {
showMissingFieldsModal();
return;
}
// Vérifier que le temps estimé est supérieur à zéro
if (editedEstimatedTime <= 0) {
showInvalidValueModal();
return;
}
// Récupérer la ligne en cours d'édition
var editingRow = $("#editTaskModal").data("editingRow");
// Mettre à jour les valeurs
editingRow.find("td:eq(1)").text(editedTaskName);
editingRow.find("td:eq(2)").text(editedEstimatedTime);
// Fermer la modale
$("#editTaskModal").modal("hide");
// Afficher un message dans la console
console.log("Tâche modifiée :", editedTaskName, editedEstimatedTime);
});
// Clic sur "Supprimer" => ouvrir la boîte de confirmation
$(document).on("click", ".delete-btn", function () {
rowToDelete = $(this).closest("tr"); // Stocke la ligne
$("#confirmDeleteModal").modal("show");
});
// Confirmation de suppression
$("#confirmDeleteButton").click(function () {
if (rowToDelete) {
rowToDelete.remove();
rowToDelete = null;
}
$("#confirmDeleteModal").modal("hide");
});
// Clic sur "Voir" => afficher les détails de la tâche
$(document).on("click", ".view-btn", function () {
var row = $(this).closest("tr");
var taskName = row.find("td:eq(1)").text();
var estimatedTime = row.find("td:eq(2)").text();
$("#viewTaskName").val(taskName);
$("#viewEstimatedTime").val(estimatedTime);
// Afficher la modale de visualisation
$("#viewTaskModal").modal("show");
});
// Fonction pour mettre à jour les indices après le glisser-déposer
function updateIndices() {
$("#taskTableBody tr").each(function (index) {
$(this).find("td:eq(0)").text(index + 1);
});
}
// Gestionnaire d'événement pour le bouton "Fermer" dans la modale d'édition
$("#closeEditModalButton").click(function () {
console.log("Fermeture de la modale d'édition");
$("#editTaskModal").modal("hide");
});
// Gestionnaire d'événement pour le bouton "Fermer" dans la modale de visualisation
$("#closeVoirModalButton").click(function () {
console.log("Fermeture de la modale de visualisation");
$("#viewTaskModal").modal("hide");
});
// Gestionnaire d'événement pour le bouton "Fermer" dans la modale de visualisation
$("#closeCoonfirmationModalButton").click(function () {
console.log("Fermeture de la modale de visualisation");
$("#confirmDeleteModal").modal("hide");
});
// Gestionnaire d'événement pour les boutons de fermeture des modales
$(".modal").on("hidden.bs.modal", function () {
console.log("Modale fermée");
});
});
</script>
</body>
</html>