diff --git a/Client/package-lock.json b/Client/package-lock.json
index 3a7eba0ef..c22ba8f78 100644
--- a/Client/package-lock.json
+++ b/Client/package-lock.json
@@ -19,6 +19,7 @@
"@mui/x-date-pickers": "7.3.2",
"@reduxjs/toolkit": "2.2.5",
"axios": "1.7.2",
+ "chart.js": "^4.4.3",
"dayjs": "1.11.11",
"joi": "17.13.1",
"jwt-decode": "^4.0.0",
@@ -27,7 +28,8 @@
"react-redux": "9.1.2",
"react-router": "^6.23.0",
"react-router-dom": "^6.23.1",
- "react-toastify": "^10.0.5"
+ "react-toastify": "^10.0.5",
+ "redux-persist": "6.0.0"
},
"devDependencies": {
"@types/react": "^18.2.66",
@@ -1089,6 +1091,11 @@
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
+ "node_modules/@kurkle/color": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz",
+ "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw=="
+ },
"node_modules/@mui/base": {
"version": "5.0.0-beta.40",
"resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.40.tgz",
@@ -2352,6 +2359,17 @@
"node": ">=0.8.0"
}
},
+ "node_modules/chart.js": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.3.tgz",
+ "integrity": "sha512-qK1gkGSRYcJzqrrzdR6a+I0vQ4/R+SoODXyAjscQ/4mzuNzySaMCd+hyVxitSY1+L2fjPD1Gbn+ibNqRmwQeLw==",
+ "dependencies": {
+ "@kurkle/color": "^0.3.0"
+ },
+ "engines": {
+ "pnpm": ">=8"
+ }
+ },
"node_modules/clsx": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
@@ -4745,6 +4763,15 @@
"resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz",
"integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w=="
},
+ "node_modules/redux-persist": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/redux-persist/-/redux-persist-6.0.0.tgz",
+ "integrity": "sha512-71LLMbUq2r02ng2We9S215LtPu3fY0KgaGE0k8WRgl6RkqxtGfl7HUozz1Dftwsb0D/5mZ8dwAaPbtnzfvbEwQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "redux": ">4.0.0"
+ }
+ },
"node_modules/redux-thunk": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz",
diff --git a/Client/package.json b/Client/package.json
index 72b5ba5bc..2edb972b7 100644
--- a/Client/package.json
+++ b/Client/package.json
@@ -21,6 +21,7 @@
"@mui/x-date-pickers": "7.3.2",
"@reduxjs/toolkit": "2.2.5",
"axios": "1.7.2",
+ "chart.js": "^4.4.3",
"dayjs": "1.11.11",
"joi": "17.13.1",
"jwt-decode": "^4.0.0",
@@ -29,7 +30,8 @@
"react-redux": "9.1.2",
"react-router": "^6.23.0",
"react-router-dom": "^6.23.1",
- "react-toastify": "^10.0.5"
+ "react-toastify": "^10.0.5",
+ "redux-persist": "6.0.0"
},
"devDependencies": {
"@types/react": "^18.2.66",
diff --git a/Client/src/Components/Charts/BarChart/BarChart.jsx b/Client/src/Components/Charts/BarChart/BarChart.jsx
new file mode 100644
index 000000000..e424fef3e
--- /dev/null
+++ b/Client/src/Components/Charts/BarChart/BarChart.jsx
@@ -0,0 +1,23 @@
+import React from "react";
+import "./barChart.css";
+import PropTypes from "prop-types";
+
+const BarChart = ({ checks = [] }) => {
+ return (
+
+ {checks.map((value, index) => (
+
+ ))}
+
+ );
+};
+
+BarChart.propTypes = {
+ checks: PropTypes.array,
+};
+
+export default BarChart;
diff --git a/Client/src/Components/Charts/BarChart/barChart.css b/Client/src/Components/Charts/BarChart/barChart.css
new file mode 100644
index 000000000..8dd2a2b22
--- /dev/null
+++ b/Client/src/Components/Charts/BarChart/barChart.css
@@ -0,0 +1,20 @@
+.bar-chart {
+ display: flex;
+ justify-content: space-around;
+ align-items: flex-end;
+ height: 50px;
+ width: 300px;
+}
+
+.bar {
+ width: 7%;
+ transition: height 0.3s ease;
+}
+
+.green {
+ background-color: var(--env-var-color-23);
+}
+
+.red {
+ background-color: var(--env-var-color-24);
+}
diff --git a/Client/src/Components/Charts/Servers/serverStatus.css b/Client/src/Components/Charts/Servers/serverStatus.css
index f42ae2801..deff765af 100644
--- a/Client/src/Components/Charts/Servers/serverStatus.css
+++ b/Client/src/Components/Charts/Servers/serverStatus.css
@@ -12,7 +12,7 @@
}
.server-status-tile {
- width: 230px;
+ width: 310px;
padding: var(--spacing-general-1);
border: 1px solid var(--color-border-0);
border-radius: var(--border-radius-0);
diff --git a/Client/src/Components/ConfigBox/index.css b/Client/src/Components/ConfigBox/index.css
new file mode 100644
index 000000000..d5d6c96b2
--- /dev/null
+++ b/Client/src/Components/ConfigBox/index.css
@@ -0,0 +1,24 @@
+.config-box {
+ display: flex;
+ padding: 30px 40px;
+ border: 1px solid var(--env-var-color-16);
+ border-radius: var(--env-var-radius-1);
+ justify-content: space-between;
+ padding-bottom: 50px;
+}
+
+.config-box-desc {
+ width: 35%;
+}
+
+.config-box-desc-title {
+ color: var(--env-var-color-5);
+ font-size: var(--env-var-font-size-large);
+ font-weight: 700;
+ margin-bottom: var(--env-var-spacing-1);
+}
+
+.config-box-desc-text {
+ color: var(--env-var-color-5);
+ font-size: var(--env-var-font-size-medium);
+}
diff --git a/Client/src/Components/ConfigBox/index.jsx b/Client/src/Components/ConfigBox/index.jsx
new file mode 100644
index 000000000..7cf547232
--- /dev/null
+++ b/Client/src/Components/ConfigBox/index.jsx
@@ -0,0 +1,13 @@
+import "./index.css";
+import React from "react";
+
+const ConfigBox = ({ leftLayout, rightLayout }) => {
+ return (
+
+ {leftLayout}
+ {rightLayout}
+
+ );
+};
+
+export default ConfigBox;
diff --git a/Client/src/Components/CurrentMonitors/index.css b/Client/src/Components/CurrentMonitors/index.css
index 7b00b1cec..8580bfcd0 100644
--- a/Client/src/Components/CurrentMonitors/index.css
+++ b/Client/src/Components/CurrentMonitors/index.css
@@ -8,8 +8,110 @@
display: flex;
}
+.current-monitors-bar {
+ display: flex;
+ justify-content: space-between;
+}
+
.current-monitors-title {
font-size: 1rem;
font-weight: bold;
- margin-right: var();
+ margin-right: var(--env-var-spacing-1);
+}
+
+.current-monitors-counter {
+ width: var(--env-var-spacing-2);
+ height: var(--env-var-spacing-2);
+ background-color: var(--env-var-color-15);
+ border: 1px solid var(--env-var-color-6);
+ border-radius: 50%;
+ text-align: center;
+ align-items: center;
+}
+
+.monitors-v-gaping {
+ height: var(--env-var-spacing-3);
+}
+
+.current-monitors-table {
+ width: 100%;
+ text-align: left;
+}
+
+.current-monitors-table {
+ width: 100%;
+ text-align: left;
+ border-collapse: collapse;
+ border: 1px solid var(--env-var-color-16);
+ border-radius: var(--env-var-radius-1);
+}
+
+.current-monitors-table th,
+.current-monitors-table td {
+ border: 1px solid var(--env-var-color-16);
+ border-left: none;
+ border-right: none;
+ padding: 8px;
+}
+
+.theader-row {
+ background-color: var(--env-var-color-13);
+ color: var(--env-var-color-2);
+ font-weight: 500;
+}
+
+.theader-row td {
+ padding: var(--env-var-spacing-1) var(--env-var-spacing-2);
+ font-size: var(--env-var-font-size-medium);
+}
+
+.host-list-item {
+ display: flex;
+ align-items: center;
+ cursor: pointer;
+}
+
+.host-list-item-open {
+ width: var(--env-var-img-width-2);
+ height: var(--env-var-img-width-2);
+ margin-right: 8px;
+}
+
+.host-list-item-name {
+ font-size: var(--env-var-font-size-medium);
+ font-weight: bold;
+ margin-right: var(--env-var-spacing-1);
+}
+
+.host-list-item-precentage {
+ font-size: var(--env-var-font-size-medium);
+}
+
+.tbody-row td {
+ padding: var(--env-var-spacing-2) var(--env-var-img-width-2);
+}
+
+.host-status-box {
+ display: flex;
+ width: fit-content;
+ border: 1px solid var(--env-var-color-4);
+ border-radius: var(--env-var-radius-2);
+ align-items: center;
+ padding: calc(var(--env-var-spacing-1) / 2);
+}
+
+.host-status-box-circle {
+ width: 6px;
+ height: 6px;
+ border-radius: 50%;
+ margin-right: calc(var(--env-var-spacing-1) / 2);
+}
+
+.host-actions {
+ margin: auto;
+ cursor: pointer;
+}
+
+.tbody-row-cell.actions-cell {
+ padding-left: 30px;
}
diff --git a/Client/src/Components/CurrentMonitors/index.jsx b/Client/src/Components/CurrentMonitors/index.jsx
index bf376c832..868ce7a99 100644
--- a/Client/src/Components/CurrentMonitors/index.jsx
+++ b/Client/src/Components/CurrentMonitors/index.jsx
@@ -1,7 +1,10 @@
+import SearchTextField from "../TextFields/Search/SearchTextField";
import "./index.css";
import React from "react";
+import HostsTable from "../HostsTable";
+import Pagination from "../Pagination";
-const CurrentMonitors = () => {
+const CurrentMonitors = ({ monitors }) => {
return (
@@ -9,8 +12,14 @@ const CurrentMonitors = () => {
Current monitors
5
-
+
+
+
+
+
+
+
);
};
diff --git a/Client/src/Components/DashboardSettingsIcon/index.css b/Client/src/Components/DashboardSettingsIcon/index.css
index e69de29bb..95dc58176 100644
--- a/Client/src/Components/DashboardSettingsIcon/index.css
+++ b/Client/src/Components/DashboardSettingsIcon/index.css
@@ -0,0 +1,13 @@
+#dashboard-setting-menu-item {
+ width: 135px;
+ padding: 6px;
+ margin: 5px 12px;
+}
+
+#dashboard-setting-menu-item:hover {
+ color: var(--env-var-color-26);
+}
+
+#menu-appbar {
+ padding: var(--env-var-spacing-1);
+}
diff --git a/Client/src/Components/DashboardSettingsIcon/index.jsx b/Client/src/Components/DashboardSettingsIcon/index.jsx
index e1f1d59da..f01e65900 100644
--- a/Client/src/Components/DashboardSettingsIcon/index.jsx
+++ b/Client/src/Components/DashboardSettingsIcon/index.jsx
@@ -1,15 +1,22 @@
-import { useState } from 'react';
-import Box from '@mui/material/Box';
-import IconButton from '@mui/material/IconButton';
-import Menu from '@mui/material/Menu';
-import Tooltip from '@mui/material/Tooltip';
-import MenuItem from '@mui/material/MenuItem';
-import Typography from '@mui/material/Typography';
-import SvgIcon from '@mui/material/SvgIcon';
-import SettingsIcon from '@mui/icons-material/Settings';
-import { useTheme } from '@mui/material/styles';
+import "./index.css";
+import { useState } from "react";
+import Box from "@mui/material/Box";
+import IconButton from "@mui/material/IconButton";
+import Menu from "@mui/material/Menu";
+import Tooltip from "@mui/material/Tooltip";
+import MenuItem from "@mui/material/MenuItem";
+import Typography from "@mui/material/Typography";
+import SvgIcon from "@mui/material/SvgIcon";
+import SettingsIcon from "@mui/icons-material/Settings";
+import { useTheme } from "@mui/material/styles";
-const settings = ['Open Site', 'Detailed View', 'Incidents', 'Configure', 'Remove'];
+const settings = [
+ "Open Site",
+ "Detailed View",
+ "Incidents",
+ "Configure",
+ "Remove",
+];
/**
* DashboardSettings component
@@ -54,20 +61,29 @@ function DashboardSettings() {
id="menu-appbar"
anchorEl={anchorElUser}
anchorOrigin={{
- vertical: 'top',
- horizontal: 'right',
+ vertical: "top",
+ horizontal: "right",
}}
keepMounted
transformOrigin={{
- vertical: 'top',
- horizontal: 'right',
+ vertical: "top",
+ horizontal: "right",
}}
open={Boolean(anchorElUser)}
onClose={handleCloseUserMenu}
>
{settings.map((setting) => (
-