diff --git a/Client/src/Components/BasicTable/index.jsx b/Client/src/Components/BasicTable/index.jsx
index a80c7bfb6..a1c3afef2 100644
--- a/Client/src/Components/BasicTable/index.jsx
+++ b/Client/src/Components/BasicTable/index.jsx
@@ -17,40 +17,52 @@ import PropTypes from "prop-types";
*
* @component
* @param {Object} props - Component props.
- * @param {Array} props.headers - Array of header titles for the table.
- * @param {Array} props.rowItems - Array of row data objects for the table.
- * @param {boolean} props.paginated - Flag to enable pagination.
+ * @param {Object} props.data - Data for the table including columns and rows.
+ * @param {Array} props.data.cols - Array of objects for column headers.
+ * @param {number} props.data.cols[].id - Unique identifier for the column.
+ * @param {string} props.data.cols[].name - Name of the column to display as header.
+ * @param {Array} props.data.rows - Array of row objects.
+ * @param {number} props.data.rows[].id - Unique identifier for the row.
+ * @param {Array} props.data.rows[].data - Array of cell data objects for the row.
+ * @param {number} props.data.rows[].data[].id - Unique identifier for the cell.
+ * @param {JSX.Element} props.data.rows[].data[].data - The content to display in the cell.
+ * @param {function} props.data.rows.data.handleClick - Function to call when the row is clicked.
+ * @param {boolean} [props.paginated=false] - Flag to enable pagination.
*
* @example
+ * const data = {
+ * cols: [
+ * { id: 1, name: "First Col" },
+ * { id: 2, name: "Second Col" },
+ * { id: 3, name: "Third Col" },
+ * { id: 4, name: "Fourth Col" },
+ * ],
+ * rows: [
+ * {
+ * id: 1,
+ * data: [
+ * { id: 1, data:
Data for Row 1 Col 1
},
+ * { id: 2, data: Data for Row 1 Col 2
},
+ * { id: 3, data: Data for Row 1 Col 3
},
+ * { id: 4, data: Data for Row 1 Col 4
},
+ * ],
+ * },
+ * {
+ * id: 2,
+ * data: [
+ * { id: 5, data: Data for Row 2 Col 1
},
+ * { id: 6, data: Data for Row 2 Col 2
},
+ * { id: 7, data: Data for Row 2 Col 3
},
+ * { id: 8, data: Data for Row 2 Col 4
},
+ * ],
+ * },
+ * ],
+ * };
*
- * Headers is an array of objets that have a unique ID and a name
- * Rows is an array of objects that have a unique ID and some data to display
- * Row data can be any valid React node
- * Rows are split into groups according to the number of headers, so if you have 3 headers then
- * Rows will go under the index % 3 column.
- * ie: Row 0 -> col 0 % 3 = 0
- * ie: Row 1 -> col 1 % 3 = 1
- * ie: Row 2 -> col 2 % 3 = 2
- * ie: Row 3 -> col 3 % 3 = 0
- *
- * Thus items are put in their correct columns
- *
- *
- * const headers = [
- * { id: 1, name: "ID" },
- * { id: 2, name: "Name" },
- * { id: 3, name: "Age" },
- * ];
- * const rows = [
- * { id: 1, data: 999 },
- * { id: 2, data: Alex Holliday
},
- * { id: 3, data: 5
},
- * // More rows...
- * ];
- *
+ *
*/
-const BasicTable = ({ headers, rowItems, paginated }) => {
+const BasicTable = ({ data, paginated }) => {
// Add headers to props validation
const [page, setPage] = useState(0);
@@ -65,19 +77,9 @@ const BasicTable = ({ headers, rowItems, paginated }) => {
setPage(0); // Reset to first page after changing rows per page
};
- const numOfCols = headers.length;
-
- const groupedRowItems = rowItems.reduce((acc, item, idx) => {
- const rowIndex = Math.floor((item.id - 1) / numOfCols);
- if (!acc[rowIndex]) acc[rowIndex] = { items: [], idx };
- acc[rowIndex].items.push({ item });
- return acc;
- }, {});
-
- const paginatedRowsKeys = Object.keys(groupedRowItems).slice(
- page * rowsPerPage,
- page * rowsPerPage + rowsPerPage
- );
+ let displayData = paginated
+ ? data.rows.slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)
+ : data.rows;
return (
<>
@@ -85,42 +87,37 @@ const BasicTable = ({ headers, rowItems, paginated }) => {
- {headers.map((header) => {
- return {header.name};
- })}
+ {data.cols.map((col) => (
+ {col.name}
+ ))}
- {paginated === false &&
- Object.keys(groupedRowItems).map((key) => {
- return (
-
- {groupedRowItems[key].items.map(({ item }) => {
- return {item.data};
- })}
-
- );
- })}
- {paginated === true &&
- paginatedRowsKeys.map((key) => (
-
- {groupedRowItems[key].items.map(({ item }) => (
- {item.data}
- ))}
+ {displayData.map((row) => {
+ return (
+
+ {row.data.map((cell) => {
+ return {cell.data};
+ })}
- ))}
+ );
+ })}
{paginated === true && (
)}
>
@@ -128,18 +125,7 @@ const BasicTable = ({ headers, rowItems, paginated }) => {
};
BasicTable.propTypes = {
- headers: PropTypes.arrayOf(
- PropTypes.shape({
- id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,
- name: PropTypes.string.isRequired,
- })
- ).isRequired,
- rowItems: PropTypes.arrayOf(
- PropTypes.shape({
- id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,
- data: PropTypes.node,
- })
- ).isRequired,
+ data: PropTypes.object.isRequired,
paginated: PropTypes.bool,
};
diff --git a/Client/src/Components/Host/index.jsx b/Client/src/Components/Host/index.jsx
deleted file mode 100644
index 370745f4d..000000000
--- a/Client/src/Components/Host/index.jsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import React from "react";
-import OpenIt from "../../assets/Images/Icon-open-in-tab-gray.png";
-
-function Host(title, precentage, statusColor, link) {
- return (
-
-
-
-
-
{title}
-
- {precentage}%
-
-
- );
-}
-
-export default Host;
diff --git a/Client/src/Components/HostActions/index.jsx b/Client/src/Components/HostActions/index.jsx
deleted file mode 100644
index c974906e8..000000000
--- a/Client/src/Components/HostActions/index.jsx
+++ /dev/null
@@ -1,8 +0,0 @@
-import React from "react";
-import DashboardSettings from "../DashboardSettingsIcon";
-
-function HostActions() {
- return ;
-}
-
-export default HostActions;
diff --git a/Client/src/Components/HostStatus/index.jsx b/Client/src/Components/HostStatus/index.jsx
deleted file mode 100644
index 3b0660c33..000000000
--- a/Client/src/Components/HostStatus/index.jsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import React from "react";
-
-function HostStatus(backgroundColor, status, dotColor) {
- return (
-
- );
-}
-
-export default HostStatus;
diff --git a/Client/src/Components/HostsTable/index.jsx b/Client/src/Components/HostsTable/index.jsx
deleted file mode 100644
index bc1dc1ff9..000000000
--- a/Client/src/Components/HostsTable/index.jsx
+++ /dev/null
@@ -1,80 +0,0 @@
-import PropTypes from "prop-types";
-import Host from "../Host/";
-import HostStatus from "../HostStatus";
-import ResponseTimeChart from "../Charts/ResponseTimeChart";
-/**
- * HostsTable displays the current status of monitor
- *
- * @component
- * @param {Array} monitors - An array of monitor objects to be displayed.
- */
-
-const getLastCheckStatus = (monitor) => {
- if (monitor.checks.length === 0) {
- // Default values for when there are no checks
- return {
- color: "var(--env-var-color-21)",
- statusText: "No Data",
- dotColor: "var(--env-var-color-19)",
- };
- }
-
- const lastCheck = monitor.checks[monitor.checks.length - 1];
- const isUp = lastCheck.status === true;
- return {
- color: isUp ? "var(--env-var-color-20)" : "var(--env-var-color-21)",
- statusText: isUp ? "Up" : "Down",
- dotColor: isUp ? "var(--env-var-color-17)" : "var(--env-var-color-19)",
- };
-};
-
-const HostsTable = ({ monitors }) => {
- return (
-
-
-
-
- | Host |
- Status |
- Response |
- Actions |
-
-
-
- {monitors.map((monitor) => {
- const host = Host(
- monitor.name,
- 100,
- "var(--env-var-color-17)",
- monitor.url
- );
-
- const { color, currentStatus, dotColor } =
- getLastCheckStatus(monitor);
-
- const status = HostStatus(color, currentStatus, dotColor);
-
- return (
-
- | {host} |
- {status} |
-
-
- |
-
- {monitor.actions}
- |
-
- );
- })}
-
-
-
- );
-};
-
-HostsTable.propTypes = {
- monitors: PropTypes.arrayOf(PropTypes.object).isRequired,
-};
-
-export default HostsTable;
diff --git a/Client/src/Components/MonitorTable/index.jsx b/Client/src/Components/MonitorTable/index.jsx
index 338ebb793..35b7a0fca 100644
--- a/Client/src/Components/MonitorTable/index.jsx
+++ b/Client/src/Components/MonitorTable/index.jsx
@@ -3,6 +3,7 @@ import PropTypes from "prop-types";
import ResponseTimeChart from "../Charts/ResponseTimeChart";
import BasicTable from "../BasicTable";
import OpenInNewPage from "../../assets/icons/open-in-new-page.svg?react";
+import { useNavigate } from "react-router-dom";
/**
* Host component.
@@ -80,14 +81,19 @@ const Status = ({ params }) => {
* @returns {React.Component} Returns a table with the monitor data.
*/
const MonitorTable = ({ monitors = [] }) => {
- const headers = [
- { id: 1, name: "Host" },
- { id: 2, name: "Status" },
- { id: 3, name: "Response Time" },
- { id: 4, name: "Actions" },
- ];
- const data = [];
- monitors.forEach((monitor) => {
+ const navigate = useNavigate();
+
+ const data = {
+ cols: [
+ { id: 1, name: "Host" },
+ { id: 2, name: "Status" },
+ { id: 3, name: "Response Time" },
+ { id: 4, name: "Actions" },
+ ],
+ rows: [],
+ };
+
+ data.rows = monitors.map((monitor, idx) => {
const params = {
url: monitor.url,
title: monitor.name,
@@ -106,16 +112,20 @@ const MonitorTable = ({ monitors = [] }) => {
? "var(--env-var-color-17)"
: "var(--env-var-color-19)",
};
- data.push({ id: data.length + 1, data: });
- data.push({ id: data.length + 1, data: });
- data.push({
- id: data.length + 1,
- data: ,
- });
- data.push({ id: data.length + 1, data: "TODO" });
+
+ return {
+ id: monitor._id,
+ handleClick: () => navigate(`/monitors/${monitor._id}`),
+ data: [
+ { id: idx, data: },
+ { id: idx + 1, data: },
+ { id: idx + 2, data: },
+ { id: idx + 3, data: "TODO" },
+ ],
+ };
});
- return ;
+ return ;
};
MonitorTable.propTypes = {
diff --git a/Client/src/Pages/Details/index.jsx b/Client/src/Pages/Details/index.jsx
index 488b2b6ab..c8cd6be7a 100644
--- a/Client/src/Pages/Details/index.jsx
+++ b/Client/src/Pages/Details/index.jsx
@@ -1,5 +1,4 @@
import React, { useEffect, useState } from "react";
-import CustomizedTables from "../../Components/CustomizedTables";
import { Box, Typography, useTheme } from "@mui/material";
import { useSelector } from "react-redux";
import { useParams } from "react-router-dom";
@@ -27,7 +26,6 @@ const DetailsPage = () => {
const theme = useTheme();
- // Example monitor data (replace with actual data or fetch from API)
/**
* Function to calculate uptime duration based on the most recent check.
* @param {Array} checks Array of check objects.
diff --git a/Server/controllers/authController.js b/Server/controllers/authController.js
index 979a0b87e..1cab8703e 100644
--- a/Server/controllers/authController.js
+++ b/Server/controllers/authController.js
@@ -309,11 +309,12 @@ const validateRecoveryTokenController = async (req, res, next) => {
const resetPasswordController = async (req, res, next) => {
try {
await newPasswordValidation.validateAsync(req.body);
- user = await req.db.resetPassword(req, res);
+ const user = await req.db.resetPassword(req, res);
+ const token = issueToken(user);
res.status(200).json({
success: true,
msg: successMessages.AUTH_RESET_PASSWORD,
- data: user,
+ data: { user, token },
});
} catch (error) {
error.service = SERVICE_NAME;
diff --git a/Server/routes/pageSpeedCheckRoute.js b/Server/routes/pageSpeedCheckRoute.js
index 515b6848f..72f20d1ad 100644
--- a/Server/routes/pageSpeedCheckRoute.js
+++ b/Server/routes/pageSpeedCheckRoute.js
@@ -14,12 +14,14 @@ const {
* @param {string} monitorId - The ID of the monitor
* @middleware verifyOwnership - Ensures the user owns the monitor
*/
+
router.post(
"/:monitorId",
verifyOwnership(Monitor, "monitorId"),
createPageSpeedCheck
);
+
/**
* @route GET /:monitorId
* @description Get all PageSpeedChecks for a monitor
@@ -27,6 +29,7 @@ router.post(
* @param {string} monitorId - The ID of the monitor
* @middleware verifyOwnership - Ensures the user owns the monitor
*/
+
router.get(
"/:monitorId",
verifyOwnership(Monitor, "monitorId"),
@@ -40,10 +43,12 @@ router.get(
* @param {string} monitorId - The ID of the monitor
* @middleware verifyOwnership - Ensures the user owns the monitor
*/
-router.post(
- "/delete/:monitorId",
+
+router.delete(
+ "/:monitorId",
verifyOwnership(Monitor, "monitorId"),
deletePageSpeedCheck
);
+
module.exports = router;