diff --git a/js/projet_detail.js b/js/projet_detail.js index 88ce1ad..6d68b15 100644 --- a/js/projet_detail.js +++ b/js/projet_detail.js @@ -3,15 +3,16 @@ document.addEventListener("DOMContentLoaded", async () => { const urlParams = new URLSearchParams(window.location.search); const projectId = urlParams.get("id"); const data = await getAllProject(); - const DataMetrics = await getDataMetrics(projectId); - - const project = data.find((project) => project.id == projectId); - if (project) { - for (obj of document.getElementsByClassName("name_project")) - obj.innerHTML = project.name; - } else { - console.error("Project not found"); + let DataMetrics; + try { + DataMetrics = await getDataMetrics(projectId); + } catch (error) { + if (error.status !== 404) { + console.error(error); + } + DataMetrics = 404; // Assign a fallback value } + const start_timelapse_button = document.getElementById("start-timelapse"); const videoSelector = document.getElementById("video_selector"); const numberPicker = document.getElementById("number-picker"); const choiceSelect = document.getElementById("choice"); @@ -28,21 +29,19 @@ document.addEventListener("DOMContentLoaded", async () => { // Add event listeners for the "Début" and "Fin" input fields const firstInput = document.getElementById("first"); const lastInput = document.getElementById("last"); - const start_timelapse_button = document.getElementById("start-timelapse"); let selectedNumbers = []; populateTimelapseLogic(start_timelapse_button, projectId).then(() => { - if(document - .getElementById("show-form-button-project") != null){ - document - .getElementById("show-form-button-project") - .addEventListener("click", showFormCamera); + if (document.getElementById("show-form-button-project") != null) { + document + .getElementById("show-form-button-project") + .addEventListener("click", showFormCamera); document - .getElementById("close-form-button-camera") - .addEventListener("click", hideFormCamera); - } + .getElementById("close-form-button-camera") + .addEventListener("click", hideFormCamera); + } if (document.getElementById("commencer") != null) { document .getElementById("commencer") @@ -51,9 +50,14 @@ document.addEventListener("DOMContentLoaded", async () => { const hours = document.getElementById("hours").value; const minutes = document.getElementById("minutes").value; const frequency = days * 1440 + hours * 60 + minutes; - start_timelapse(projectId, frequency).then(() => { - location.reload(); - }); + if(frequency >= 3) { + const nbrimages = document.getElementById("totalImages").value; + start_timelapse(projectId, frequency, nbrimages).then(() => { + location.reload(); + }); + } else { + alert("La fréquence doit être supérieure à 3 minutes !"); + } }); } if (document.getElementById("stop-camera") != null) { @@ -65,194 +69,221 @@ document.addEventListener("DOMContentLoaded", async () => { }); } }); + - choiceSelect.addEventListener("change", toggleContainers); - - if (addNumberButton) { - addNumberButton.addEventListener("click", addSelectedNumber); - } - videoSelector.addEventListener("change", () => generateViewMetric(projectId)); - document - .getElementById("show-form-button-camera") - .addEventListener("click", showFormProject); - document - .getElementById("close-form-button-project") - .addEventListener("click", hideFormProject); - - document - .getElementById("increment-button") - .addEventListener("click", incrementDuration); - document - .getElementById("decrement-button") - .addEventListener("click", decrementDuration); - document.getElementById("submit").addEventListener("click", handleFormSubmit); - document - .getElementById("projets") - .addEventListener("click", navigateToProjects); - document.getElementById("toggle-view").addEventListener("click", toggleView); - - firstInput.addEventListener("input", updateRange); - lastInput.addEventListener("input", updateRange); - - generateViewMetric(projectId); - PopulateSelect(videoSelector, projectId); - - function toggleContainers() { - if (choiceSelect.value === "oneByOne") { - oneByOneContainer.style.display = "block"; - firstLastContainer.style.display = "none"; - populateNumberBoard(DataMetrics.length); - setRequiredAttributes(); - } else { - oneByOneContainer.style.display = "none"; - firstLastContainer.style.display = "block"; - const last = document.getElementById("last"); - last.value = DataMetrics.length; - last.max = DataMetrics.length; - document.getElementById("first").max = last.value; - setRequiredAttributes(); + if (addNumberButton) { + addNumberButton.addEventListener("click", addSelectedNumber); } - } - toggleContainers(); - - function setRequiredAttributes() { - const firstInput = document.getElementById("first"); - const lastInput = document.getElementById("last"); - const denominatorInput = document.getElementById("denominator"); - - if (firstLastContainer.style.display === "block") { - firstInput.required = true; - lastInput.required = true; - denominatorInput.required = true; - } else { - firstInput.required = false; - lastInput.required = false; - denominatorInput.required = false; - } - } - - function addSelectedNumber() { - const selectedNumber = parseInt(numberPicker.value, 10); - if (!selectedNumbers.includes(selectedNumber)) { - selectedNumbers.push(selectedNumber); - numberPicker.remove(numberPicker.selectedIndex); - } - } - - function showFormCamera() { - formContainerCamera.style.display = "flex"; - } - - function hideFormCamera() { - formContainerCamera.style.display = "none"; - } - function showFormProject() { - formContainerProject.style.display = "flex"; - } - - function hideFormProject() { - formContainerProject.style.display = "none"; - } - function incrementDuration() { - durationInput.value = parseInt(durationInput.value) + 1; - } - - function decrementDuration() { - if (parseInt(durationInput.value) > 0) { - durationInput.value = parseInt(durationInput.value) - 1; - } - } - - async function handleFormSubmit(event) { - event.preventDefault(); - const data = await getDataProjectVideosFromApi(projectId); - const nameVideo = document.getElementById("name").value; - const videoDuration = durationInput.value; - const videoResolution = document.getElementById("resolution").value; - - if (videoDuration <= 0) { - alert("La durée de la vidéo doit être supérieur à 0"); - return 0; - } - if (!checkVideoPath(data, nameVideo) || !nameVideo.length > 0) { - alert( - 'Le nom : " ' + - nameVideo + - ' " est déjà pris ou vide ! \n' + - "veuillez en trouver un autre" - ); - return 0; - } - const choice = choiceSelect.value; - const measurementIds = getMeasurementsIdsFromForm( - choice, - firstInput, - lastInput + videoSelector.addEventListener("change", () => + generateViewMetric(projectId) ); - postNewVideo( - projectId, - measurementIds, - nameVideo, - videoResolution, - videoDuration - ).then(() => { - alert( - "Nouvelle vidéo enregistrée :\nNom : " + - nameVideo + - "\nRésolution : " + - videoResolution + - "\nDurée : " + - videoDuration + - " secondes" + document + .getElementById("show-form-button-camera") + .addEventListener("click", showFormProject); + document + .getElementById("close-form-button-project") + .addEventListener("click", hideFormProject); + + document + .getElementById("increment-button") + .addEventListener("click", incrementDuration); + document + .getElementById("decrement-button") + .addEventListener("click", decrementDuration); + document + .getElementById("submit") + .addEventListener("click", handleFormSubmit); + document + .getElementById("projets") + .addEventListener("click", navigateToProjects); + document + .getElementById("toggle-view") + .addEventListener("click", toggleView); + + firstInput.addEventListener("input", updateRange); + lastInput.addEventListener("input", updateRange); + + function toggleContainers() { + if (choiceSelect.value === "oneByOne") { + oneByOneContainer.style.display = "block"; + firstLastContainer.style.display = "none"; + populateNumberBoard(DataMetrics.length); + setRequiredAttributes(); + } else { + oneByOneContainer.style.display = "none"; + firstLastContainer.style.display = "block"; + const last = document.getElementById("last"); + last.value = DataMetrics.length; + last.max = DataMetrics.length; + document.getElementById("first").max = last.value; + setRequiredAttributes(); + } + } + toggleContainers(); + + function setRequiredAttributes() { + const firstInput = document.getElementById("first"); + const lastInput = document.getElementById("last"); + const denominatorInput = document.getElementById("denominator"); + + if (firstLastContainer.style.display === "block") { + firstInput.required = true; + lastInput.required = true; + denominatorInput.required = true; + } else { + firstInput.required = false; + lastInput.required = false; + denominatorInput.required = false; + } + } + + function addSelectedNumber() { + const selectedNumber = parseInt(numberPicker.value, 10); + if (!selectedNumbers.includes(selectedNumber)) { + selectedNumbers.push(selectedNumber); + numberPicker.remove(numberPicker.selectedIndex); + } + } + + function showFormCamera() { + formContainerCamera.style.display = "flex"; + } + + function hideFormCamera() { + formContainerCamera.style.display = "none"; + } + function showFormProject() { + formContainerProject.style.display = "flex"; + } + + function hideFormProject() { + formContainerProject.style.display = "none"; + } + function incrementDuration() { + durationInput.value = parseInt(durationInput.value) + 1; + } + + function decrementDuration() { + if (parseInt(durationInput.value) > 0) { + durationInput.value = parseInt(durationInput.value) - 1; + } + } + + async function handleFormSubmit(event) { + event.preventDefault(); + const data = await getDataProjectVideosFromApi(projectId); + const nameVideo = document.getElementById("name").value; + const videoDuration = durationInput.value; + const videoResolution = document.getElementById("resolution").value; + + if (videoDuration <= 0) { + alert("La durée de la vidéo doit être supérieur à 0"); + return 0; + } + if (!checkVideoPath(data, nameVideo) || !nameVideo.length > 0) { + alert( + 'Le nom : " ' + + nameVideo + + ' " est déjà pris ou vide ! \n' + + "veuillez en trouver un autre" + ); + return 0; + } + const choice = choiceSelect.value; + const measurementIds = getMeasurementsIdsFromForm( + choice, + firstInput, + lastInput ); - }); - } - - function navigateToProjects() { - window.location.href = "../index.html"; - } - - function toggleView() { - if (tableImage.classList.contains("hiddenTable")) { - tableImage.classList.remove("hiddenTable"); - tableImage.classList.add("full-view"); - } else { - tableImage.classList.remove("full-view"); - tableImage.classList.add("hiddenTable"); - } - } - - function populateNumberBoard(length) { - numberBoard.innerHTML = ""; - numberBoard.style.gridTemplateColumns = `repeat(auto-fill, minmax(50px, 1fr))`; - for (let i = 1; i <= length; i++) { - const numberButton = document.createElement("button"); - numberButton.classList.add("number-button"); - numberButton.textContent = i; - numberButton.addEventListener("click", () => - highlightNumber(numberButton) - ); - numberBoard.appendChild(numberButton); - } - } - - function highlightNumber(button) { - button.classList.toggle("highlight"); - } - - function updateRange() { - const firstValue = parseInt(firstInput.value); - const lastValue = parseInt(lastInput.value); - - if (firstValue > lastValue) { - lastInput.value = firstValue; - } - if (lastValue < firstValue) { - firstInput.value = lastValue; + postNewVideo( + projectId, + measurementIds, + nameVideo, + videoResolution, + videoDuration + ).then(() => { + alert( + "Nouvelle vidéo enregistrée :\nNom : " + + nameVideo + + "\nRésolution : " + + videoResolution + + "\nDurée : " + + videoDuration + + " secondes" + ); + }); } - firstInput.max = lastValue; - lastInput.min = firstValue; + function navigateToProjects() { + window.location.href = "../index.html"; + } + + function toggleView() { + if (tableImage.classList.contains("hiddenTable")) { + tableImage.classList.remove("hiddenTable"); + tableImage.classList.add("full-view"); + } else { + tableImage.classList.remove("full-view"); + tableImage.classList.add("hiddenTable"); + } + } + + function populateNumberBoard(length) { + numberBoard.innerHTML = ""; + numberBoard.style.gridTemplateColumns = `repeat(auto-fill, minmax(50px, 1fr))`; + for (let i = 1; i <= length; i++) { + const numberButton = document.createElement("button"); + numberButton.classList.add("number-button"); + numberButton.textContent = i; + numberButton.addEventListener("click", () => + highlightNumber(numberButton) + ); + numberBoard.appendChild(numberButton); + } + } + + function highlightNumber(button) { + button.classList.toggle("highlight"); + } + + function updateRange() { + const firstValue = parseInt(firstInput.value); + const lastValue = parseInt(lastInput.value); + + if (firstValue > lastValue) { + lastInput.value = firstValue; + } + if (lastValue < firstValue) { + firstInput.value = lastValue; + } + + firstInput.max = lastValue; + lastInput.min = firstValue; + } + if (DataMetrics != 404) { + const project = data.find((project) => project.id == projectId); + if (project) { + for (obj of document.getElementsByClassName("name_project")) + obj.innerHTML = project.name; + } else { + console.error("Project not found"); + } + + choiceSelect.addEventListener("change", toggleContainers); + + generateViewMetric(projectId); + PopulateSelect(videoSelector, projectId); + } else { + document.getElementById("metric_viewer").style.display = "none"; + document.getElementById("video-container").style.display = "none"; + document.getElementById("delete-placeholder").style.display = "none"; + document.getElementById("content1").style.display = "none"; + document.getElementById("form-container-project").style.display = "none"; + document.getElementById("form-container-camera").style.display = "none"; + document.getElementById("show-form-button-camera").style.display = "none"; + for (el of document.querySelectorAll(".box")) { + el.style.display = "none"; + } } }); @@ -303,108 +334,112 @@ async function generateViewMetric(projectId) { const videoId = document.getElementById("video_selector").value; measurements = await getDataMetrics(projectId); - let samples; - if (videoId != -1) { - currentVideoDatas = await getDataVideoFromApi(videoId); - samples = JSON.parse(currentVideoDatas[0]["measurement_ids"]); - if (currentVideoDatas[0].status != 0) { - videoPlaceHolder.innerHTML = ` + if (measurements != 404) { + let samples; + if (videoId != -1) { + currentVideoDatas = await getDataVideoFromApi(videoId); + samples = JSON.parse(currentVideoDatas[0]["measurement_ids"]); + if (currentVideoDatas[0].status != 0) { + videoPlaceHolder.innerHTML = ` `; - } else { - videoPlaceHolder.innerHTML = `

La vidéo n'a pas été rendered

`; - } - deletePlaceHolder.innerHTML = ` + } else { + videoPlaceHolder.innerHTML = `

La vidéo n'a pas été rendered

`; + } + deletePlaceHolder.innerHTML = ` `; - document.getElementById("delete-video").addEventListener("click", () => { - showConfirmationAlert(videoId); + document.getElementById("delete-video").addEventListener("click", () => { + showConfirmationAlert(videoId); + }); + tempoMeasure = filterAndSortMeasurementsByNumber(measurements, samples); + } else { + deletePlaceHolder.innerHTML = ""; + videoPlaceHolder.innerHTML = ""; + samples = measurements.map((measurements) => measurements.id); + tempoMeasure = filterAndSortMeasurementsByIds(measurements, samples); + } + tempoMeasure.forEach((measure) => { + datesMeasurement.push(measure.timestamp); + Temperature.push(measure.temperature); + Hygrometrie.push(measure.humidity); }); - tempoMeasure = filterAndSortMeasurementsByNumber(measurements, samples); - } else { - deletePlaceHolder.innerHTML = ""; - videoPlaceHolder.innerHTML = ""; - samples = measurements.map((measurements) => measurements.id); - tempoMeasure = filterAndSortMeasurementsByIds(measurements, samples); - } - tempoMeasure.forEach((measure) => { - datesMeasurement.push(measure.timestamp); - Temperature.push(measure.temperature); - Hygrometrie.push(measure.humidity); - }); - populateImageTable(tempoMeasure); + populateImageTable(tempoMeasure); - if (myChart) { - myChart.destroy(); - } + if (myChart) { + myChart.destroy(); + } - myChart = new Chart(ctx, { - type: "line", - data: { - labels: datesMeasurement, - datasets: [ - { - label: "Température (C°)", - data: Temperature, - fill: false, - borderColor: "rgba(75, 192, 192, 1)", - tension: 0.1, - yAxisID: "y", // Use the default y-axis - }, - { - label: "Hygrometrie (%)", - data: Hygrometrie, - fill: false, - color: "rgba(153, 102, 255, 1)", - borderColor: "rgba(153, 102, 255, 1)", - tension: 0.1, - yAxisID: "y1", // Use the second y-axis - }, - ], - }, - options: { - scales: { - y: { - beginAtZero: true, - position: "left", - ticks: { - color: 'white', // Set y-axis labels to white + myChart = new Chart(ctx, { + type: "line", + data: { + labels: datesMeasurement, + datasets: [ + { + label: "Température (C°)", + data: Temperature, + fill: false, + borderColor: "rgba(75, 192, 192, 1)", + tension: 0.1, + yAxisID: "y", // Use the default y-axis }, - grid: { - color: 'white', // Set grid line color to white + { + label: "Hygrometrie (%)", + data: Hygrometrie, + fill: false, + color: "rgba(153, 102, 255, 1)", + borderColor: "rgba(153, 102, 255, 1)", + tension: 0.1, + yAxisID: "y1", // Use the second y-axis + }, + ], + }, + options: { + scales: { + y: { + beginAtZero: true, + position: "left", + ticks: { + color: "white", // Set y-axis labels to white + }, + grid: { + color: "white", // Set grid line color to white + }, + }, + x: { + ticks: { + color: "white", // Set x-axis labels to white + }, + grid: { + drawOnChartArea: true, + color: "white", // Set grid line color to white + }, + }, + y1: { + beginAtZero: true, + position: "right", + grid: { + drawOnChartArea: false, // Only want the grid lines for one axis to show up + }, + ticks: { + color: "white", // Set y-axis labels to white + }, }, }, - x: { - ticks: { - color: 'white', // Set x-axis labels to white + plugins: { + legend: { + labels: { + color: "white", // Set legend labels to white + }, }, - grid: { - drawOnChartArea: true, - color: 'white', // Set grid line color to white - }, - }, - y1: { - beginAtZero: true, - position: "right", - grid: { - drawOnChartArea: false, // Only want the grid lines for one axis to show up - }, - ticks: { - color: 'white', // Set y-axis labels to white - } }, }, - plugins: { - legend: { - labels: { - color: "white", // Set legend labels to white - }, - } - } - }, - }); + }); + } else { + document.getElementById("metric_viewer").style.display = "none"; + } } function showConfirmationAlert(videoId) { const customAlert = document.getElementById("customAlert"); @@ -516,6 +551,14 @@ function decrement(id) { updateFrequencyText(); } +function decrementImage(id) { + const input = document.getElementById(id); + if (parseInt(input.value) > 1) { + input.value = parseInt(input.value) - 1; + } + updateFrequencyText(); +} + function updateFrequencyText() { const days = document.getElementById("days").value; const hours = document.getElementById("hours").value;