From 9aba73f13ae2f5d3e84ade609c88f84a43c42252 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mert=20=C5=9Ei=C5=9Fmano=C4=9Flu?= Date: Thu, 8 Aug 2024 12:57:41 +0300 Subject: [PATCH 01/11] fix: use correct request methods edit=PUT, delete=DELETE >Routes >> alert >> check >> monitor --- Server/routes/alertRoute.js | 8 ++++---- Server/routes/checkRoute.js | 4 ++-- Server/routes/monitorRoute.js | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Server/routes/alertRoute.js b/Server/routes/alertRoute.js index ba30fd117..434c0495a 100644 --- a/Server/routes/alertRoute.js +++ b/Server/routes/alertRoute.js @@ -29,14 +29,14 @@ router.get( alertController.getAlertById ); // Edit -router.post( - "/edit/:alertId", +router.put( + "/:alertId", verifyOwnership(Monitor, "monitorId"), alertController.editAlert ); //Delete -router.post( - "/delete/:alertId", +router.delete( + "/:alertId", verifyOwnership(Monitor, "monitorId"), alertController.deleteAlert ); diff --git a/Server/routes/checkRoute.js b/Server/routes/checkRoute.js index 0216343c8..2e0323734 100644 --- a/Server/routes/checkRoute.js +++ b/Server/routes/checkRoute.js @@ -15,8 +15,8 @@ router.get( checkController.getChecks ); -router.post( - "/delete/:monitorId", +router.delete( + "/:monitorId", verifyOwnership(Monitor, "monitorId"), checkController.deleteChecks ); diff --git a/Server/routes/monitorRoute.js b/Server/routes/monitorRoute.js index 1f50c9e70..2622181a3 100644 --- a/Server/routes/monitorRoute.js +++ b/Server/routes/monitorRoute.js @@ -14,10 +14,10 @@ router.delete( monitorController.deleteMonitor ); router.put( - "/edit/:monitorId", + "/:monitorId", verifyOwnership(Monitor, "monitorId"), monitorController.editMonitor ); -router.delete("/delete/all", monitorController.deleteAllMonitors); +router.delete("/all", monitorController.deleteAllMonitors); module.exports = router; From c6cf2af246c1638318c77d8afe5b6755e205129b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mert=20=C5=9Ei=C5=9Fmano=C4=9Flu?= Date: Thu, 8 Aug 2024 22:12:00 +0300 Subject: [PATCH 02/11] docs: use correct http methods on readme>getting-started>endpoints - 'edit with post' => put - 'delete with post' => delete --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 6631d99be..b11490ff8 100644 --- a/README.md +++ b/README.md @@ -76,29 +76,29 @@ Made with [contrib.rocks](https://contrib.rocks). ###### Auth - POST [/api/v1/auth/register](#post-register) - POST [/api/v1/auth/login](#post-login) - - POST [/api/v1/auth/user/{userId}](#post-auth-user-edit-id) + - PUT [/api/v1/auth/user/{userId}](#post-auth-user-edit-id) - GET [/api/v1/auth/users](#get-all-users-id) - POST [/api/v1/auth/recovery/request](#post-auth-recovery-request-id) - POST [/api/v1/auth/recovery/validate](#post-auth-recovery-validate-id) - POST [/api/v1/auth/recovery/reset](#post-auth-recovery-reset-id) ###### Monitors - GET [/api/v1/monitors](#get-monitors) - - GET [/api/v1/monitor/{id}](#get-monitor-id) + - GET [/api/v1/monitors/{monitorId}](#get-monitor-id) - GET [/api/v1/monitors/user/{userId}?limit](#get-monitors-user-userid) - POST [/api/v1/monitors](#post-monitors) - - POST [/api/v1/monitors/delete/{monitorId}](#post-monitors-del-id) - - POST [/api/v1/monitors/edit/{monitorId}](#post-monitors-edit-id) + - PUT [/api/v1/monitors/{monitorId}](#put-monitors-id) + - DELETE [/api/v1/monitors/{monitorId}](#delete-monitors-id) ###### Checks - POST [/api/v1/checks/{monitorId}](#post-checks) - GET [/api/v1/checks/{monitorId}](#get-checks) - - POST [/api/v1/checks/delete/{monitorId}](#delete-checks) + - DELETE [/api/v1/checks/{monitorId}](#delete-checks) ###### Alerts - POST [/api/v1/alerts/{monitorId}](#create-alert) - GET [/api/v1/alerts/user/{userId}](#get-alerts-user-id) - GET [/api/v1/alerts/monitor/{monitorId}](#get-alerts-monitor-id) - GET [/api/v1/alerts/{alertId}](#get-alert-alert-id) - - POST [/api/v1/alerts/edit/{alertId}](#edit-alert) - - POST [/api/v1/alerts/delete/{alertId}](#delete-alert) + - PUT [/api/v1/alerts/{alertId}](#edit-alert) + - DELETE [/api/v1/alerts/{alertId}](#delete-alert) 1. [Error Handling](#error-handling) 1. [Contributors](#contributors) From 9cb0a1822ad61903910a47c2f217772aca158a90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mert=20=C5=9Ei=C5=9Fmano=C4=9Flu?= Date: Thu, 8 Aug 2024 22:18:36 +0300 Subject: [PATCH 03/11] docs(be-endpoints): fill missing endpoints in the current route groups - Current route groups are 'Auth', 'Monitors', 'Checks', 'Alerts' --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index b11490ff8..848de6c6c 100644 --- a/README.md +++ b/README.md @@ -78,6 +78,9 @@ Made with [contrib.rocks](https://contrib.rocks). - POST [/api/v1/auth/login](#post-login) - PUT [/api/v1/auth/user/{userId}](#post-auth-user-edit-id) - GET [/api/v1/auth/users](#get-all-users-id) + - GET [/api/v1/auth/users/admin](#get-all-admin-users-id) + - POST [/api/v1/auth/invite](#post-auth-invite-id) + - POST [/api/v1/auth/invite/verify/](#post-auth-invite-verify-id) - POST [/api/v1/auth/recovery/request](#post-auth-recovery-request-id) - POST [/api/v1/auth/recovery/validate](#post-auth-recovery-validate-id) - POST [/api/v1/auth/recovery/reset](#post-auth-recovery-reset-id) @@ -88,6 +91,7 @@ Made with [contrib.rocks](https://contrib.rocks). - POST [/api/v1/monitors](#post-monitors) - PUT [/api/v1/monitors/{monitorId}](#put-monitors-id) - DELETE [/api/v1/monitors/{monitorId}](#delete-monitors-id) + - DELETE [/api/v1/monitors/all](#delete-all-monitors) ###### Checks - POST [/api/v1/checks/{monitorId}](#post-checks) - GET [/api/v1/checks/{monitorId}](#get-checks) From 66ae3e6754752bb872ca228495e5ffd065030dbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mert=20=C5=9Ei=C5=9Fmano=C4=9Flu?= Date: Thu, 8 Aug 2024 22:31:13 +0300 Subject: [PATCH 04/11] docs(be-endpoints): add 'page speed' and 'maintenance window' route groups and their endpoints --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index 848de6c6c..2c29e2c41 100644 --- a/README.md +++ b/README.md @@ -103,6 +103,14 @@ Made with [contrib.rocks](https://contrib.rocks). - GET [/api/v1/alerts/{alertId}](#get-alert-alert-id) - PUT [/api/v1/alerts/{alertId}](#edit-alert) - DELETE [/api/v1/alerts/{alertId}](#delete-alert) + ###### Page Speed + - POST [/api/v1/pagespeed/:monitorId](#post-pagespeed) + - GET [/api/v1/pagespeed/:monitorId](#get-pagespeed) + - DELETE [/api/v1/pagespeed/:monitorId](#delete-pagespeed) + ###### Maintenance Window + - POST [/api/v1/maintenance-window/:monitorId](#post-maintenance-window) + - GET [/api/v1/maintenance-window/user/:userId](#get-maintenance-window-by-userid) + - GET [/api/v1/maintenance-window/monitor/:monitorId](#get-maintenance-window-by-monitor-id) 1. [Error Handling](#error-handling) 1. [Contributors](#contributors) From 6c57808012562d2aab74dc1e42088460f5a1eea5 Mon Sep 17 00:00:00 2001 From: Daniel Cojocea Date: Thu, 8 Aug 2024 15:41:15 -0400 Subject: [PATCH 05/11] Added pagespeed configure route --- Client/src/App.jsx | 5 +++++ Client/src/Pages/Monitors/index.css | 1 - Client/src/Pages/PageSpeed/Configure/index.css | 0 Client/src/Pages/PageSpeed/Configure/index.jsx | 7 +++++++ Client/src/Pages/PageSpeed/Details/index.jsx | 4 ++-- 5 files changed, 14 insertions(+), 3 deletions(-) create mode 100644 Client/src/Pages/PageSpeed/Configure/index.css create mode 100644 Client/src/Pages/PageSpeed/Configure/index.jsx diff --git a/Client/src/App.jsx b/Client/src/App.jsx index cad8a4ebd..12db9dab9 100644 --- a/Client/src/App.jsx +++ b/Client/src/App.jsx @@ -26,6 +26,7 @@ import PageSpeed from "./Pages/PageSpeed"; import CreatePageSpeed from "./Pages/PageSpeed/CreatePageSpeed"; import CreateNewMaintenanceWindow from "./Pages/Maintenance/CreateMaintenanceWindow"; import PageSpeedDetails from "./Pages/PageSpeed/Details"; +import PageSpeedConfigure from "./Pages/PageSpeed/Configure"; function App() { const AdminCheckedRegister = withAdminCheck(Register); @@ -103,6 +104,10 @@ function App() { path="pagespeed/:monitorId" element={} /> + } + /> } /> diff --git a/Client/src/Pages/Monitors/index.css b/Client/src/Pages/Monitors/index.css index 67da49c1f..7b40f7464 100644 --- a/Client/src/Pages/Monitors/index.css +++ b/Client/src/Pages/Monitors/index.css @@ -12,7 +12,6 @@ .monitors p.MuiTypography-root { font-size: var(--env-var-font-size-medium); } -.monitors h2:has(+ p), .monitors p.MuiTypography-root { color: var(--env-var-color-5); } diff --git a/Client/src/Pages/PageSpeed/Configure/index.css b/Client/src/Pages/PageSpeed/Configure/index.css new file mode 100644 index 000000000..e69de29bb diff --git a/Client/src/Pages/PageSpeed/Configure/index.jsx b/Client/src/Pages/PageSpeed/Configure/index.jsx new file mode 100644 index 000000000..dfaae1153 --- /dev/null +++ b/Client/src/Pages/PageSpeed/Configure/index.jsx @@ -0,0 +1,7 @@ +import { Box } from "@mui/material"; + +const PageSpeedConfigure = () => { + return ; +}; + +export default PageSpeedConfigure; diff --git a/Client/src/Pages/PageSpeed/Details/index.jsx b/Client/src/Pages/PageSpeed/Details/index.jsx index 52581f3b9..632a097c9 100644 --- a/Client/src/Pages/PageSpeed/Details/index.jsx +++ b/Client/src/Pages/PageSpeed/Details/index.jsx @@ -139,7 +139,7 @@ const SkeletonLayout = () => { - + { return props; }; - const pieSize = { width: 200, height: 200 }; + const pieSize = { width: 210, height: 200 }; const pieData = getPieData(audits); const colorMap = getColors(performance); From ba8bd7a39a1a026ddc531b0649892b16babeee3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mert=20=C5=9Ei=C5=9Fmano=C4=9Flu?= Date: Thu, 8 Aug 2024 22:51:08 +0300 Subject: [PATCH 06/11] fix(fe-endpoints): update the url of updateUptimeMonitor according to docs --- Client/src/Features/UptimeMonitors/uptimeMonitorsSlice.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Client/src/Features/UptimeMonitors/uptimeMonitorsSlice.js b/Client/src/Features/UptimeMonitors/uptimeMonitorsSlice.js index 52a02cd55..428e064e8 100644 --- a/Client/src/Features/UptimeMonitors/uptimeMonitorsSlice.js +++ b/Client/src/Features/UptimeMonitors/uptimeMonitorsSlice.js @@ -80,7 +80,7 @@ export const updateUptimeMonitor = createAsyncThunk( notifications: monitor.notifications, }; const res = await axiosInstance.put( - `/monitors/edit/${monitor._id}`, + `/monitors/${monitor._id}`, updatedFields, { headers: { From 8ac9e192382237983475b0f8656d43132d74306d Mon Sep 17 00:00:00 2001 From: Daniel Cojocea Date: Thu, 8 Aug 2024 16:33:32 -0400 Subject: [PATCH 07/11] Added layout and states --- .../TabPanels/Account/ProfilePanel.jsx | 2 +- Client/src/Pages/Monitors/Configure/index.jsx | 4 +- .../src/Pages/PageSpeed/Configure/index.css | 68 +++++ .../src/Pages/PageSpeed/Configure/index.jsx | 278 +++++++++++++++++- Client/src/Pages/PageSpeed/Details/index.jsx | 2 +- 5 files changed, 348 insertions(+), 6 deletions(-) diff --git a/Client/src/Components/TabPanels/Account/ProfilePanel.jsx b/Client/src/Components/TabPanels/Account/ProfilePanel.jsx index 05f3d8412..355b09ca6 100644 --- a/Client/src/Components/TabPanels/Account/ProfilePanel.jsx +++ b/Client/src/Components/TabPanels/Account/ProfilePanel.jsx @@ -352,7 +352,7 @@ const ProfilePanel = () => { top: "50%", left: "50%", transform: "translate(-50%, -50%)", - width: 400, + width: 500, bgcolor: "white", border: "solid 1px #f2f2f2", borderRadius: `${theme.shape.borderRadius}px`, diff --git a/Client/src/Pages/Monitors/Configure/index.jsx b/Client/src/Pages/Monitors/Configure/index.jsx index 0df88078f..08c8cbe39 100644 --- a/Client/src/Pages/Monitors/Configure/index.jsx +++ b/Client/src/Pages/Monitors/Configure/index.jsx @@ -460,10 +460,10 @@ const Configure = () => { }} > - Really delete this monitor? + Do you really want to delete this monitor? - Once deleted, this monitor cannot be retrieved back. + Once deleted, this monitor cannot be retrieved. .MuiStack-root:nth-child(2) { + background-color: var(--env-var-color-8); + border: solid 1px var(--env-var-color-6); + border-radius: var(--env-var-radius-1); + padding: var(--env-var-default-2); +} +.configure-pagespeed h1.MuiTypography-root { + font-size: var(--env-var-font-size-large-plus); +} +.configure-pagespeed h1.MuiTypography-root, +.configure-pagespeed h2.MuiTypography-root { + color: var(--env-var-color-1); +} +.configure-pagespeed span.MuiTypography-root { + font-size: var(--env-var-font-size-small-plus); +} +.configure-pagespeed p.MuiTypography-root, +.configure-pagespeed h3.MuiTypography-root { + color: var(--env-var-color-5); +} +.configure-pagespeed h1.MuiTypography-root, +.configure-pagespeed h3.MuiTypography-root, +.configure-pagespeed h2.MuiTypography-root { + font-weight: 600; +} +.configure-pagespeed p.MuiTypography-root, +.configure-pagespeed h3.MuiTypography-root, +.configure-pagespeed h3.MuiTypography-root > span.MuiTypography-root { + font-size: var(--env-var-font-size-medium); +} +.configure-pagespeed .MuiBox-root > .field + p.MuiTypography-root { + font-size: var(--env-var-font-size-small-plus); +} +.configure-pagespeed .MuiBox-root > .field + p.MuiTypography-root, +.configure-pagespeed h3.MuiTypography-root > span.MuiTypography-root { + opacity: 0.6; +} +.configure-pagespeed .checkbox-wrapper { + margin-bottom: 1px; +} +.configure-pagespeed .MuiInputBase-root:has(> .Mui-disabled) { + background-color: var(--env-var-color-13); +} +/* to be removed */ +.configure-pagespeed .section-disabled { + opacity: 0.4; + background-color: #f1f1f2; + padding: 10px; + border-radius: 8px; + user-select: none; + pointer-events: none; +} + +.configure-pagespeed button { + height: var(--env-var-height-2); +} + +body:has(.configure-pagespeed) .select-dropdown .MuiMenuItem-root, +.configure-pagespeed .select-wrapper .select-component > .MuiSelect-select { + text-transform: lowercase; +} + +.configure-pagespeed .field, +.configure-pagespeed .section-disabled, +.configure-pagespeed .select-wrapper, +.configure-pagespeed h3.MuiTypography-root { + flex: 1; +} diff --git a/Client/src/Pages/PageSpeed/Configure/index.jsx b/Client/src/Pages/PageSpeed/Configure/index.jsx index dfaae1153..4da437be1 100644 --- a/Client/src/Pages/PageSpeed/Configure/index.jsx +++ b/Client/src/Pages/PageSpeed/Configure/index.jsx @@ -1,7 +1,281 @@ -import { Box } from "@mui/material"; +import { useEffect, useState } from "react"; +import { useTheme } from "@emotion/react"; +import { Box, Modal, Stack, Typography } from "@mui/material"; +import { useDispatch, useSelector } from "react-redux"; +import { useNavigate, useParams } from "react-router"; +import Button from "../../../Components/Button"; +import Field from "../../../Components/Inputs/Field"; +import Select from "../../../Components/Inputs/Select"; +import Checkbox from "../../../Components/Inputs/Checkbox"; +import PauseCircleOutlineIcon from "@mui/icons-material/PauseCircleOutline"; +import WestRoundedIcon from "@mui/icons-material/WestRounded"; +import GreenCheck from "../../../assets/icons/checkbox-green.svg?react"; +import RedCheck from "../../../assets/icons/checkbox-red.svg?react"; +import "./index.css"; const PageSpeedConfigure = () => { - return ; + const theme = useTheme(); + const navigate = useNavigate(); + const dispatch = useDispatch(); + const MS_PER_MINUTE = 60000; + const { authToken } = useSelector((state) => state.auth); + const { monitors } = useSelector((state) => state.pageSpeedMonitors); + const { monitorId } = useParams(); + const [monitor, setMonitor] = useState({}); + const [errors, setErrors] = useState({}); + + const frequencies = [ + { _id: 3, name: "3 minutes" }, + { _id: 5, name: "5 minutes" }, + { _id: 10, name: "10 minutes" }, + { _id: 20, name: "20 minutes" }, + { _id: 60, name: "1 hour" }, + { _id: 1440, name: "1 day" }, + { _id: 10080, name: "1 week" }, + ]; + + useEffect(() => { + const data = monitors.find((monitor) => monitor._id === monitorId); + if (!data) { + console.error("Error fetching pagespeed monitor of id: " + monitorId); + navigate("/not-found"); + } + setMonitor({ + ...data, + }); + }, [monitorId]); + + const handleChange = (event, id) => { + const { value } = event.target; + setForm((prev) => ({ ...prev, [id]: value })); + + const { error } = monitorValidation.validate( + { [id]: value }, + { abortEarly: false } + ); + + setErrors((prev) => { + const newErrors = { ...prev }; + if (error) newErrors[id] = error.details[0].message; + else delete newErrors[id]; + return newErrors; + }); + }; + + const [isOpen, setIsOpen] = useState(false); + const handleRemove = async (event) => { + event.preventDefault(); + // const action = await dispatch(deletePageSpeedMonitor({ authToken, monitor })); + // if (action.meta.requestStatus === "fulfilled") { + // navigate("/monitors"); + // } else { + // createToast({ body: "Failed to delete monitor." }); + // } + }; + + return ( + +