diff --git a/css/base/style.css b/css/base/style.css index 5d1b7d8..53551ba 100644 --- a/css/base/style.css +++ b/css/base/style.css @@ -5,7 +5,7 @@ body::before { left: 0; width: 100%; height: 100%; - background-image: url("../image/camera-image"); + background-image: url("../image/camera-image.png"); background-position: center; background-size: cover; filter: blur(1px) brightness(0.3); @@ -443,4 +443,30 @@ footer { .global_title_h1 { color: white; font-size: 10vh; +} + +/* Styles pour les statuts des projets dans le carrousel */ +.status-draft { + color: #6B8E23; /* Vert haricot/marron pour les brouillons */ + font-weight: bold; +} + +.status-capturing { + color: #87CEEB; /* Bleu ciel pour les projets en capture/en cours */ + font-weight: bold; +} + +.status-idle { + color: #32CD32; /* Vert vif pour les projets terminés */ + font-weight: bold; +} + +.status-stopping { + color: #FF4500; /* Orange rougeâtre pour les projets arrêtés */ + font-weight: bold; +} + +.status-unknown { + color: #cccccc; /* Gris pour les statuts inconnus */ + font-style: italic; } \ No newline at end of file diff --git a/css/image/camera-image b/css/image/camera-image.png similarity index 100% rename from css/image/camera-image rename to css/image/camera-image.png diff --git a/js/core/routes.js b/js/core/routes.js index 0a50fe6..49cd4ca 100644 --- a/js/core/routes.js +++ b/js/core/routes.js @@ -221,4 +221,30 @@ async function stopCamera(id){ alert("Error stopping the camera :", error); throw error; } -} \ No newline at end of file +} + +async function manualUpload(imageFile, projectId, timestamp, temperature, humidity) { + try { + // Create FormData to send the file and metadata + const formData = new FormData(); + formData.append('image', imageFile); + formData.append('projectId', projectId); + formData.append('timestamp', timestamp); + formData.append('temperature', temperature); + formData.append('humidity', humidity); + + const response = await $.ajax({ + url: api_url.concat("/camera/upload"), + method: "POST", + data: formData, + processData: false, // Prevents jQuery from converting FormData to string + contentType: false, // Lets browser set the content type with boundary + }); + + alert("Image uploaded successfully"); + return response; + } catch (error) { + alert("Error uploading image: " + error); + throw error; + } +} diff --git a/js/pages/index.js b/js/pages/index.js index 62de315..f6298c0 100644 --- a/js/pages/index.js +++ b/js/pages/index.js @@ -9,18 +9,56 @@ document.addEventListener("DOMContentLoaded", () => { }); }); +function formatDateToFrench(dateString) { + const options = { + year: 'numeric', + month: 'long', + day: 'numeric' + }; + const date = new Date(dateString); + return date.toLocaleDateString('fr-FR', options); +} + +function formatStatusWithColor(status) { + let statusText = ""; + let colorClass = ""; + + switch (status) { + case 0: + statusText = "Brouillon"; + colorClass = "status-draft"; + break; + case 1: + statusText = "En capture"; + colorClass = "status-capturing"; + break; + case 2: + statusText = "Terminé"; + colorClass = "status-idle"; + break; + case 3: + statusText = "En cours d'arrêt"; + colorClass = "status-stopping"; + default: + statusText = "Inconnu"; + colorClass = "status-unknown"; + } + + return `${statusText}`; +} + function formatStatus(status) { switch (status) { case 0: - return "brouillon"; + return "Brouillon"; // Projet à peine créé, vide sans config case 1: - return "en cours"; + return "En capture"; // Projet en cours de capture case 2: - return "terminé"; + return "En pause"; // Projet en pause ou inactif case 3: - return "En cours de génération"; + return "En cours d\'arrêt"; // Projet en cours d'arrêt default: - return "inconnu"; + return "Inconnu"; } } @@ -91,10 +129,10 @@ function setupCarousel(global_project_list) { projectDiv.classList.add(letter[index]); projectDiv.innerHTML = `

${project.name}

-

${formatDate(project.start_date)}

-

Status : ${formatStatus(parseInt(project.status))}

+

Date de début : ${formatDateToFrench(project.start_date)}

+

Statut : ${formatStatusWithColor(parseInt(project.status))}

- +
`; diff --git a/js/pages/projet_detail.js b/js/pages/projet_detail.js index 6d68b15..1fbd19d 100644 --- a/js/pages/projet_detail.js +++ b/js/pages/projet_detail.js @@ -30,6 +30,40 @@ document.addEventListener("DOMContentLoaded", async () => { const firstInput = document.getElementById("first"); const lastInput = document.getElementById("last"); + const formContainerUpload = document.getElementById("form-container-upload"); + const showFormButtonUpload = document.getElementById("show-form-button-upload"); + const closeFormButtonUpload = document.getElementById("close-form-button-upload"); + const manualUploadForm = document.getElementById("manual-upload-form"); + + if (formContainerUpload && showFormButtonUpload && closeFormButtonUpload && manualUploadForm) { + showFormButtonUpload.addEventListener("click", () => { + formContainerUpload.style.display = "flex"; + }); + + closeFormButtonUpload.addEventListener("click", () => { + formContainerUpload.style.display = "none"; + }); + + manualUploadForm.addEventListener("submit", async (event) => { + event.preventDefault(); + + const imageFile = document.getElementById("imageFile").files[0]; + const temperature = document.getElementById("temperature").value; + const humidity = document.getElementById("humidity").value; + const timestamp = new Date().toISOString(); + + try { + await manualUpload(imageFile, projectId, timestamp, temperature, humidity); + alert("Image uploadée avec succès !"); + formContainerUpload.style.display = "none"; + } catch (error) { + alert("Erreur lors de l'upload de l'image : " + error); + } + }); + } else { + console.error("Un ou plusieurs éléments du formulaire d'upload manuel sont introuvables."); + } + let selectedNumbers = []; populateTimelapseLogic(start_timelapse_button, projectId).then(() => { @@ -532,6 +566,11 @@ async function populateTimelapseLogic(placeholder, id) { placeholder.innerHTML = ``; + } else if (data.status == 2) { + // Ajout de la possibilité de configurer la caméra pour un projet avec statut "terminé" + placeholder.innerHTML = ``; } else { placeholder.innerHTML = ``; } diff --git a/pages/projet_detail.html b/pages/projet_detail.html index 6048967..80e22c2 100644 --- a/pages/projet_detail.html +++ b/pages/projet_detail.html @@ -108,6 +108,27 @@ + +
@@ -118,6 +139,7 @@
+