From 82028858700ee52a0319559f5c3df809552c6598 Mon Sep 17 00:00:00 2001 From: LilleBRG Date: Thu, 27 Mar 2025 22:17:45 +0100 Subject: [PATCH] devices half made --- backend/Api/BusinessLogic/DeviceLogic.cs | 11 +- backend/Api/Controllers/DeviceController.cs | 12 +- frontend/devices/index.html | 86 +++++++++++-- frontend/home/index.html | 22 ++-- frontend/img/Edit.png | Bin 0 -> 11695 bytes frontend/img/Trash.png | Bin 0 -> 31094 bytes frontend/mockdata/devices.mockdata.js | 3 + frontend/scripts/devices.js | 104 ++++++++++++--- frontend/scripts/profile.js | 4 +- frontend/scripts/services/devices.service.js | 34 ++++- frontend/styles/devices.css | 128 ++++++++++++++++++- frontend/styles/home.css | 7 +- 12 files changed, 359 insertions(+), 52 deletions(-) create mode 100644 frontend/img/Edit.png create mode 100644 frontend/img/Trash.png create mode 100644 frontend/mockdata/devices.mockdata.js diff --git a/backend/Api/BusinessLogic/DeviceLogic.cs b/backend/Api/BusinessLogic/DeviceLogic.cs index 506316c..ceb386b 100644 --- a/backend/Api/BusinessLogic/DeviceLogic.cs +++ b/backend/Api/BusinessLogic/DeviceLogic.cs @@ -29,12 +29,21 @@ namespace Api.BusinessLogic return new OkObjectResult(devices); } - public async Task AddDevice(Device device, int userId) + public async Task AddDevice(string referenceId, int userId) { var profile = await _dbAccess.ReadUser(userId); if (profile == null) { return new ConflictObjectResult(new { message = "Could not find user" }); } + Device device = new Device + { + Name = "Undefined", + TempHigh = 0, + TempLow = 0, + ReferenceId = referenceId, + Logs = new List(), + }; + return await _dbAccess.CreateDevice(device, userId); } diff --git a/backend/Api/Controllers/DeviceController.cs b/backend/Api/Controllers/DeviceController.cs index d936fdb..31b3188 100644 --- a/backend/Api/Controllers/DeviceController.cs +++ b/backend/Api/Controllers/DeviceController.cs @@ -30,9 +30,9 @@ namespace Api.Controllers [Authorize] [HttpPost("adddevice/{userId}")] - public async Task AddDevice([FromBody] Device device, int userId) + public async Task AddDevice([FromBody] string referenceId, int userId) { - return await _deviceLogic.AddDevice(device, userId); + return await _deviceLogic.AddDevice(referenceId, userId); } [Authorize] @@ -48,5 +48,13 @@ namespace Api.Controllers { return await _deviceLogic.EditDevice(device, deviceId); } + + + [Authorize] + [HttpDelete("Delete/{referenceId}")] + public async Task EditDevice(string referenceId) + { + return await _deviceLogic.EditDevice(referenceId); + } } } diff --git a/frontend/devices/index.html b/frontend/devices/index.html index 9348c45..9fe9dcc 100644 --- a/frontend/devices/index.html +++ b/frontend/devices/index.html @@ -24,16 +24,84 @@
- + +
+
+ + + + + + + + + + +
IdPlacement(name)Set Temp HighSet Temp LowLatest Meassurement
- - - - - - - -
IdPlacementLatest Meassurement
+ + + + + + + diff --git a/frontend/home/index.html b/frontend/home/index.html index 1072dd0..b960d84 100644 --- a/frontend/home/index.html +++ b/frontend/home/index.html @@ -26,16 +26,18 @@
- - - - - - - - - -
NameTemperatureDateTempHighTempLow
+
+ + + + + + + + + +
NameTemperatureDateTempHighTempLow
+
diff --git a/frontend/img/Edit.png b/frontend/img/Edit.png new file mode 100644 index 0000000000000000000000000000000000000000..f0f9e79541b186b2371d341da4a454a5102dc764 GIT binary patch literal 11695 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 z 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 literal 0 HcmV?d00001 diff --git a/frontend/mockdata/devices.mockdata.js b/frontend/mockdata/devices.mockdata.js new file mode 100644 index 0000000..00f74bf --- /dev/null +++ b/frontend/mockdata/devices.mockdata.js @@ -0,0 +1,3 @@ +export const devices = [ + {referenceId: "DKOFG", name: "Kitchen", tempHigh: 23.0, tempLow: 23.0, latestLog: { id: 1, temperature: 18.9, date: "2025-03-19T17:00:00Z", tempHigh: 22.0, tempLow: 18.0 }} +] \ No newline at end of file diff --git a/frontend/scripts/devices.js b/frontend/scripts/devices.js index 821c1c0..e958d0f 100644 --- a/frontend/scripts/devices.js +++ b/frontend/scripts/devices.js @@ -1,26 +1,90 @@ -import { getDevicesOnUserId } from "./services/devices.service.js"; +import { getDevicesOnUserId, deleteDevice, update, add } from "./services/devices.service.js"; +import { devices } from "../mockdata/devices.mockdata.js"; -let idlocation = localStorage.getItem("rememberLogin") -let id; -if(idlocation){ - id = localStorage.getItem("id"); -} -else{ - id = localStorage.getItem("id"); -} -getDevicesOnUserId(id).then(res => { - buildTable(res) -}) +let id = localStorage.getItem("id"); +// getDevicesOnUserId(id).then(res => { +// buildTable(res) +// }) +buildTable(devices); +let selectedReferenceId = null; // Store the selected referenceId function buildTable(data) { - var table = document.getElementById(`deviceTable`); + var table = document.getElementById("deviceTable"); + table.innerHTML = ""; // Clear existing rows before adding new ones + data.forEach((device) => { - var row = ` - Name - ${device.id} - ${device.name} - `; - table.innerHTML += row; + var row = document.createElement("tr"); + row.innerHTML = ` + ${device.referenceId} + ${device.name} + ${device.tempHigh} + ${device.tempLow} + Temperature: ${device.latestLog.temperature}°C, Date: ${device.latestLog.date} + + + + + `; + table.appendChild(row); }); - } \ No newline at end of file + + document.getElementById("addDevice").onclick = () => { + document.getElementById("addModal").style.display = "block"; + + } + + // Attach click event to all trash buttons + document.querySelectorAll(".trashBtn").forEach((btn) => { + btn.onclick = function () { + selectedReferenceId = this.getAttribute("data-referenceid"); // Store referenceId + document.getElementById("deleteDeviceHeader").innerHTML = `Delete Device ${selectedReferenceId}`; + document.getElementById("deleteModal").style.display = "block"; + }; + }); + + // Attach click event to all trash buttons + document.querySelectorAll(".editIconbtn").forEach((btn) => { + btn.onclick = function () { + selectedReferenceId = this.getAttribute("data-referenceid"); // Store referenceId + document.getElementById("editDeviceHeader").innerHTML = `Edit Device ${selectedReferenceId}`; + document.getElementById("editModal").style.display = "block"; + }; + }); +} + +document.querySelectorAll(".cancelbtn").forEach(button => { + button.onclick = () => { + document.getElementById("deleteModal").style.display = "none"; + document.getElementById("editModal").style.display = "none"; + document.getElementById("addModal").style.display = "none"; + + }; +}); +// Delete button logic +document.getElementById("deletebtn").onclick = () => { + if (selectedReferenceId) { + deleteDevice(selectedReferenceId); // Call delete function with referenceId + document.getElementById("deleteModal").style.display = "none"; + window.location.reload(); + } +}; + +document.getElementById("addbtn").onclick = () => { + const referenceId = document.getElementById("referenceId").value; + add(referenceId); // Call delete function with referenceId + document.getElementById("deleteModal").style.display = "none"; + window.location.reload(); +}; + +document.getElementById("editbtn").onclick = () => { + if (selectedReferenceId) { + const name = document.getElementById("name").value; + const tempHigh = document.getElementById("tempHigh").value; + const tempLow = document.getElementById("tempLow").value; + + update(selectedReferenceId, name, tempHigh, tempLow); // Call delete function with referenceId + document.getElementById("deleteModal").style.display = "none"; + window.location.reload(); + } +}; diff --git a/frontend/scripts/profile.js b/frontend/scripts/profile.js index 9587ac4..f0962a7 100644 --- a/frontend/scripts/profile.js +++ b/frontend/scripts/profile.js @@ -22,11 +22,11 @@ table.innerHTML += ` var pswModal = document.getElementById("PasswordModal"); var editModal = document.getElementById("editModal"); -var editBtn = document.getElementById("openEditModal"); +var editIconbtn = document.getElementById("openEditModal"); var passwordBtn = document.getElementById("openPasswordModal"); // Open modals -editBtn.onclick = () => (editModal.style.display = "block"); +editIconbtn.onclick = () => (editModal.style.display = "block"); passwordBtn.onclick = () => (pswModal.style.display = "block"); // Close modals when clicking on any close button diff --git a/frontend/scripts/services/devices.service.js b/frontend/scripts/services/devices.service.js index bcef00a..50211b8 100644 --- a/frontend/scripts/services/devices.service.js +++ b/frontend/scripts/services/devices.service.js @@ -12,13 +12,39 @@ export function getDevicesOnUserId(userId) { .catch(error => console.error("Error:", error)); } -export function update(ids) { - fetch(`${address}/get-on-user-id`, { - method: "PATCH", +export function add(id) { + fetch(`${address}/device`, { + method: "CREATE", + headers: { + "Content-Type": "application/json" + }, + body: JSON.stringify({ referenceId: id}) + }) + .then(response => response.json()) + .then(data => console.log("Success:", data)) + .catch(error => console.error("Error:", error)); +} + +export function update(id, name, tempHigh, tempLow) { + fetch(`${address}/device/${id}`, { + method: "PUT", + headers: { + "Content-Type": "application/json" + }, + body: JSON.stringify({ name: name, tempHigh: tempHigh, tempLow: tempLow }) + }) + .then(response => response.json()) + .then(data => console.log("Success:", data)) + .catch(error => console.error("Error:", error)); +} + +export function deleteDevice(referenceId) { + console.log(referenceId) + fetch(`${address}/device/${referenceId}`, { + method: "DELETE", headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ ids: ids }) }) .then(response => response.json()) .then(data => console.log("Success:", data)) diff --git a/frontend/styles/devices.css b/frontend/styles/devices.css index 68dcbb1..bc0b68f 100644 --- a/frontend/styles/devices.css +++ b/frontend/styles/devices.css @@ -2,7 +2,7 @@ table { margin: 20px; font-family: arial, sans-serif; border-collapse: collapse; - width: 100%; + width: 95%; } td, @@ -22,7 +22,129 @@ table { justify-content: flex-end; } -.addDevice{ +#addDevice{ width: 120px; margin: 0 20px 0 0; -} \ No newline at end of file +} + +.tableConatiner{ + display: flex; + justify-content: center; +} + +.tableIcons{ + margin-inline: 5px; + width: 30px; + height: 30px; +} + + .tableIcons:hover { + background-color: #ddd; + color: black; + cursor: pointer; + } + + + button { + background-color: #04AA6D; + color: white; + padding: 14px 20px; + margin: 8px 0; + border: none; + cursor: pointer; + width: 100%; + opacity: 0.9; + } + + button:hover { + opacity:1; + } + + /* Float cancel and delete buttons and add an equal width */ + .cancelbtn, #addbtn, #deletebtn, #editbtn{ + float: left; + width: 50%; + } + + /* Add a color to the cancel button */ + .cancelbtn { + background-color: #ccc; + color: black; + } + + /* Add a color to the delete button */ + #deletebtn { + background-color: #f44336; + } + + /* Add padding and center-align text to the container */ + .container { + padding: 16px; + } + + /* The Modal (background) */ + .modal { + display: none; /* Hidden by default */ + position: fixed; /* Stay in place */ + z-index: 1; /* Sit on top */ + left: 0; + top: 0; + width: 100%; /* Full width */ + height: 100%; /* Full height */ + overflow: auto; /* Enable scroll if needed */ + background-color: #474e5d; + padding-top: 50px; + } + + /* Modal Content/Box */ + .modal-content { + background-color: #fefefe; + margin: 5% auto 15% auto; /* 5% from the top, 15% from the bottom and centered */ + border: 1px solid #888; + width: 80%; /* Could be more or less, depending on screen size */ + } + + /* Style the horizontal ruler */ + hr { + border: 1px solid #f1f1f1; + margin-bottom: 25px; + } + + /* The Modal Close Button (x) */ + #close { + position: absolute; + right: 35px; + top: 15px; + font-size: 40px; + font-weight: bold; + color: #f1f1f1; + } + + #close:hover, + #close:focus { + color: #f44336; + cursor: pointer; + } + + /* Clear floats */ + .clearfix::after { + content: ""; + clear: both; + display: table; + } + + /* Change styles for cancel button and delete button on extra small screens */ + @media screen and (max-width: 300px) { + .cancelbtn, .deletebtn { + width: 100%; + } + } + + .form-container{ + width: 90%; + } + + .deviceHeader{ + display: flex; + text-align: center; + } diff --git a/frontend/styles/home.css b/frontend/styles/home.css index ece1235..a28e4d5 100644 --- a/frontend/styles/home.css +++ b/frontend/styles/home.css @@ -11,7 +11,7 @@ table { margin: 20px; font-family: arial, sans-serif; border-collapse: collapse; - width: 100%; + width: 95%; } td, @@ -53,3 +53,8 @@ tr:nth-child(even) { .chartContainer{ margin: 20px; } + +.tableConatiner{ + display: flex; + justify-content: center; +}