diff --git a/Client/src/Components/TabPanels/Status/ContentPanel.jsx b/Client/src/Components/TabPanels/Status/ContentPanel.jsx index 39c18c9ba..7af66ff07 100644 --- a/Client/src/Components/TabPanels/Status/ContentPanel.jsx +++ b/Client/src/Components/TabPanels/Status/ContentPanel.jsx @@ -14,7 +14,7 @@ import { networkService } from "../../../main"; const ContentPanel = () => { const theme = useTheme(); const { form, setForm, errors, setErrors } = useContext(StatusFormContext); - const [cards, setCards] = useState(form.monitors.length>0? form.monitors.map((m, idx)=>({id: idx, val: m})): []); + const [cards, setCards] = useState([]); const {user, authToken } = useSelector((state) => state.auth); const [monitors, setMonitors] = useState([]); @@ -30,7 +30,15 @@ const ContentPanel = () => { if(response.data.data.monitors.length==0){ setErrors({monitors: "Please config monitors to setup status page"}) } - setMonitors(response.data.data.monitors); + const fullMonitors = response.data.data.monitors ; + setMonitors(fullMonitors); + if (form.monitors.length > 0) + setCards( + form.monitors.map((mid, idx) => ({ + id: "" + idx, + val: fullMonitors.filter((fM) => fM._id == mid)[0], + })) + ); } catch (error) { createToast({ body: "Failed to fetch monitors data" }); logger.error("Failed to fetch monitors", error); diff --git a/Client/src/Components/TabPanels/Status/GeneralSettingsPanel.jsx b/Client/src/Components/TabPanels/Status/GeneralSettingsPanel.jsx index 95478477b..f037e47c3 100644 --- a/Client/src/Components/TabPanels/Status/GeneralSettingsPanel.jsx +++ b/Client/src/Components/TabPanels/Status/GeneralSettingsPanel.jsx @@ -1,7 +1,6 @@ import { useState, useRef, useContext } from "react"; import { Box, Stack, Typography } from "@mui/material"; import ConfigBox from "../../../Components/ConfigBox"; -import Checkbox from "../../Inputs/Checkbox"; import { useTheme } from "@emotion/react"; import TabPanel from "@mui/lab/TabPanel"; import TextInput from "../../Inputs/TextInput"; @@ -25,7 +24,7 @@ const GeneralSettingsPanel = () => { const { form, setForm, errors, setErrors } = useContext(StatusFormContext); const [progress, setProgress] = useState({ value: 0, isLoading: false }); const intervalRef = useRef(null); - + // Clears specific error from errors state const clearError = (err) => { setErrors((prev) => { @@ -131,13 +130,13 @@ const GeneralSettingsPanel = () => { - + /> */} diff --git a/Client/src/Pages/Status/CreateStatus/index.jsx b/Client/src/Pages/Status/CreateStatus/index.jsx index 1f112c19d..136145b9a 100644 --- a/Client/src/Pages/Status/CreateStatus/index.jsx +++ b/Client/src/Pages/Status/CreateStatus/index.jsx @@ -69,12 +69,18 @@ import { networkService } from "../../../main"; e.preventDefault(); //validate rest of the form delete form.logo; - //let localData = {...form, monitors: form.monitors.map(m=>m.url)} - let localData = {...form, monitors: form.monitors, theme: mode} + let localData = { + ...form, + monitors: + form.monitors[0] && Object.keys(form.monitors[0]).includes("_id") + ? form.monitors.map((m) => m._id) + : form.monitors, + theme: mode, + }; if (hasValidationErrors(localData, publicPageGeneralSettingsValidation, setErrors)) { setActiveTabOnErrors(); return; - } + } // //validate image field, double check if it is required // let error = validateField( // { type: logo?.type ?? null, size: logo?.size ?? null }, @@ -82,20 +88,17 @@ import { networkService } from "../../../main"; // ); // if (error) return; - //form.logo = { ...logo, size: formatBytes(logo?.size) }; - localData = {...form, monitors: form.monitors.map(m=>m.url),theme: mode} + //form.logo = { ...logo, size: formatBytes(logo?.size) }; let config = { authToken: authToken, url: "status-page", data: localData }; - try{ - const res = await networkService.createStatusPage(config) + try { + const res = await networkService.createStatusPage(config); if (!res.status === 200) { throw new Error("Failed to create status page"); } createToast({ body: "Status page created successfully!" }); - } - catch(e){ + } catch (e) { createToast({ body: e.message || "Error creating status page" }); - } - + } }; return ( @@ -144,7 +147,7 @@ import { networkService } from "../../../main"; { "refreshTokenTTL", "jwtTTL", "notify-email-list", + "_id", + "__v", + "createdAt", + "updatedAt" ].includes(err.path[0]) ) { newErrors[err.path[0]] = err.message ?? "Validation error"; @@ -84,7 +88,6 @@ const hasValidationErrors = (form, validation, setErrors) => { newErrors["usage_temperature"] = null; } }); - if (Object.values(newErrors).some((v) => v)) { setErrors(newErrors); return true; diff --git a/Client/src/Validation/validation.js b/Client/src/Validation/validation.js index 073703295..dd9118490 100644 --- a/Client/src/Validation/validation.js +++ b/Client/src/Validation/validation.js @@ -158,18 +158,14 @@ const publicPageGeneralSettingsValidation = joi.object({ url: joi.string().trim().messages({ "string.empty": "URL is required." }), timezone: joi.string().trim().messages({ "string.empty": "Timezone is required." }), color: joi.string().trim().messages({ "string.empty": "Color is required." }), - + theme: joi.string(), - monitors: joi - .array() - .min(1) - .items({ id: joi.string(), url: joi.string().required() }) - .messages({ - "string.pattern.base": "Must be a valid monitor ID", - "array.base": "Monitors must be an array", - "array.empty": "At least one monitor is required", - "any.required": "Monitors are required", - }), + monitors: joi.array().min(1).items(joi.string().required()).messages({ + "string.pattern.base": "Must be a valid monitor ID", + "array.base": "Monitors must be an array", + "array.empty": "At least one monitor is required", + "any.required": "Monitors are required", + }), }); const settingsValidation = joi.object({ ttl: joi.number().required().messages({