From 91022d044825b6613c2b125cbfd6e3437e2c05f1 Mon Sep 17 00:00:00 2001 From: Daniel Cojocea Date: Thu, 1 Aug 2024 17:04:11 -0400 Subject: [PATCH] Added functions and rmeove modal --- Client/src/Pages/Monitors/index.css | 4 ++ Client/src/Pages/Monitors/index.jsx | 104 +++++++++++++++++++++++++--- 2 files changed, 100 insertions(+), 8 deletions(-) diff --git a/Client/src/Pages/Monitors/index.css b/Client/src/Pages/Monitors/index.css index f87893b29..bce3bee72 100644 --- a/Client/src/Pages/Monitors/index.css +++ b/Client/src/Pages/Monitors/index.css @@ -51,3 +51,7 @@ body:has(.monitors) .actions-menu li.MuiButtonBase-root { body:has(.monitors) .actions-menu li.MuiButtonBase-root:last-of-type { color: var(--env-var-color-26); } +body:has(.monitors) .MuiModal-root p.MuiTypography-root { + font-size: var(--env-var-font-size-medium); + color: var(--env-var-color-2); +} diff --git a/Client/src/Pages/Monitors/index.jsx b/Client/src/Pages/Monitors/index.jsx index f067b11f4..9c9f99d15 100644 --- a/Client/src/Pages/Monitors/index.jsx +++ b/Client/src/Pages/Monitors/index.jsx @@ -1,7 +1,10 @@ import "./index.css"; import { useEffect, useState } from "react"; import { useSelector, useDispatch } from "react-redux"; -import { getUptimeMonitorsByUserId } from "../../Features/UptimeMonitors/uptimeMonitorsSlice"; +import { + deleteUptimeMonitor, + getUptimeMonitorsByUserId, +} from "../../Features/UptimeMonitors/uptimeMonitorsSlice"; import { useNavigate } from "react-router-dom"; import Button from "../../Components/Button"; import ServerStatus from "../../Components/Charts/Servers/ServerStatus"; @@ -11,12 +14,14 @@ import OpenInNewPage from "../../assets/icons/open-in-new-page.svg?react"; import Settings from "../../assets/icons/settings-bold.svg?react"; import BasicTable from "../../Components/BasicTable"; import { StatusLabel } from "../../Components/Label"; +import { createToast } from "../../Utils/toastUtils"; import ResponseTimeChart from "../../Components/Charts/ResponseTimeChart"; import { Box, IconButton, Menu, MenuItem, + Modal, Stack, Typography, } from "@mui/material"; @@ -50,9 +55,38 @@ const Monitors = () => { const navigate = useNavigate(); const monitorState = useSelector((state) => state.uptimeMonitors); const authState = useSelector((state) => state.auth); - const dispatch = useDispatch(); + const dispatch = useDispatch({}); const [anchorEl, setAnchorEl] = useState(null); + const [actions, setActions] = useState({}); + const openMenu = (event, id, url) => { + setAnchorEl(event.currentTarget); + setActions({ id: id, url: url }); + }; + const closeMenu = () => { + setAnchorEl(null); + setActions({}); + }; + + const [isOpen, setIsOpen] = useState(false); + const openRemove = () => { + setAnchorEl(null); + setIsOpen(true); + }; + const handleRemove = async (event) => { + event.preventDefault(); + let monitor = { _id: actions.id }; + const action = await dispatch( + deleteUptimeMonitor({ authToken: authState.authToken, monitor }) + ); + if (action.meta.requestStatus === "fulfilled") { + setIsOpen(false); // close modal + dispatch(getUptimeMonitorsByUserId(authState.authToken)); + createToast({ body: "Monitor deleted successfully." }); + } else { + createToast({ body: "Failed to delete monitor." }); + } + }; useEffect(() => { dispatch(getUptimeMonitorsByUserId(authState.authToken)); @@ -129,7 +163,7 @@ const Monitors = () => { <> setAnchorEl(event.currentTarget)} + onClick={(event) => openMenu(event, monitor._id, monitor.url)} sx={{ "&:focus": { outline: "none", @@ -190,15 +224,69 @@ const Monitors = () => { className="actions-menu" anchorEl={anchorEl} open={Boolean(anchorEl)} - onClose={() => setAnchorEl(null)} + onClose={closeMenu} > - Open site - Details + window.open(actions.url, "_blank", "noreferrer")} + > + Open site + + navigate(`/monitors/${actions.id}`)}> + Details + {/* TODO - pass monitor id to Incidents page */} Incidents - Configure - Remove + navigate(`/monitors/configure/${actions.id}`)}> + Configure + + Remove + setIsOpen(false)} + disablePortal + > + + + Really delete this monitor? + + + Once deleted, this monitor cannot be retrieved back. + + +