diff --git a/client/src/Components/Sidebar/index.jsx b/client/src/Components/Sidebar/index.jsx index 06a140c54..e9f0d3ad7 100644 --- a/client/src/Components/Sidebar/index.jsx +++ b/client/src/Components/Sidebar/index.jsx @@ -8,7 +8,6 @@ import { ListItemButton, ListItemIcon, ListItemText, - ListSubheader, Menu, MenuItem, Stack, @@ -39,6 +38,7 @@ import Docs from "../../assets/icons/docs.svg?react"; import StatusPages from "../../assets/icons/status-pages.svg?react"; import Discussions from "../../assets/icons/discussions.svg?react"; import Notifications from "../../assets/icons/notifications.svg?react"; +import Logs from "../../assets/icons/logs.svg?react"; import "./index.css"; @@ -64,6 +64,7 @@ const getMenu = (t) => [ { name: t("menu.statusPages"), path: "status", icon: }, { name: t("menu.maintenance"), path: "maintenance", icon: }, + { name: t("menu.logs"), path: "logs", icon: }, { name: t("menu.settings"), diff --git a/client/src/Components/StatusBoxes/index.jsx b/client/src/Components/StatusBoxes/index.jsx index 40ea2d182..d97bb6211 100644 --- a/client/src/Components/StatusBoxes/index.jsx +++ b/client/src/Components/StatusBoxes/index.jsx @@ -4,7 +4,7 @@ import SkeletonLayout from "./skeleton"; // Utils import { useTheme } from "@mui/material/styles"; import PropTypes from "prop-types"; -const StatusBoxes = ({ shouldRender, flexWrap = "nowrap", children }) => { +const StatusBoxes = ({ shouldRender = true, flexWrap = "nowrap", children }) => { const theme = useTheme(); if (!shouldRender) { return ( diff --git a/client/src/Pages/Queue/components/FailedJobTable/index.jsx b/client/src/Pages/Logs/Queue/components/FailedJobTable/index.jsx similarity index 93% rename from client/src/Pages/Queue/components/FailedJobTable/index.jsx rename to client/src/Pages/Logs/Queue/components/FailedJobTable/index.jsx index d7284f9da..94fc2f5c3 100644 --- a/client/src/Pages/Queue/components/FailedJobTable/index.jsx +++ b/client/src/Pages/Logs/Queue/components/FailedJobTable/index.jsx @@ -1,10 +1,10 @@ import Stack from "@mui/material/Stack"; import Typography from "@mui/material/Typography"; -import DataTable from "../../../../Components/Table"; +import DataTable from "../../../../../Components/Table"; import { useNavigate } from "react-router-dom"; import { useTheme } from "@emotion/react"; -import { TypeToPathMap } from "../../../../Utils/monitorUtils"; +import { TypeToPathMap } from "../../../../../Utils/monitorUtils"; import PropTypes from "prop-types"; import { useTranslation } from "react-i18next"; diff --git a/client/src/Pages/Queue/components/JobTable/index.jsx b/client/src/Pages/Logs/Queue/components/JobTable/index.jsx similarity index 93% rename from client/src/Pages/Queue/components/JobTable/index.jsx rename to client/src/Pages/Logs/Queue/components/JobTable/index.jsx index f4aa0768c..e27dd103f 100644 --- a/client/src/Pages/Queue/components/JobTable/index.jsx +++ b/client/src/Pages/Logs/Queue/components/JobTable/index.jsx @@ -1,13 +1,13 @@ import Stack from "@mui/material/Stack"; -import DataTable from "../../../../Components/Table"; +import DataTable from "../../../../../Components/Table"; import Typography from "@mui/material/Typography"; // Utils import PropTypes from "prop-types"; import { useTheme } from "@emotion/react"; import { useNavigate } from "react-router-dom"; -import { TypeToPathMap } from "../../../../Utils/monitorUtils"; +import { TypeToPathMap } from "../../../../../Utils/monitorUtils"; import { useTranslation } from "react-i18next"; -import { createHeaderFactory } from "../../../../Components/Table/TableUtils"; +import { createHeaderFactory } from "../../../../../Components/Table/TableUtils"; const JobTable = ({ jobs = [] }) => { const theme = useTheme(); diff --git a/client/src/Pages/Logs/Queue/components/Metrics/index.jsx b/client/src/Pages/Logs/Queue/components/Metrics/index.jsx new file mode 100644 index 000000000..52117cd3b --- /dev/null +++ b/client/src/Pages/Logs/Queue/components/Metrics/index.jsx @@ -0,0 +1,45 @@ +import Stack from "@mui/material/Stack"; +import Typography from "@mui/material/Typography"; +import StatBox from "../../../../../Components/StatBox"; +import StatusBoxes from "../../../../../Components/StatusBoxes"; + +import { useTranslation } from "react-i18next"; +import { useTheme } from "@emotion/react"; + +const camelToTitle = (str) => { + return str + .replace(/([A-Z])/g, " $1") + .toLowerCase() + .replace(/^./, (m) => m.toUpperCase()); +}; + +const Metrics = ({ metrics = {} }) => { + const { t } = useTranslation(); + const theme = useTheme(); + + const data = Object.keys(metrics) + .filter((key) => key !== "jobsWithFailures") + .map((key) => { + return { key, title: camelToTitle(key), value: metrics[key] }; + }); + + console.log(JSON.stringify(data, null, 2)); + + return ( + + {t("queuePage.metricsTable.title")} + + {data.map((metric) => { + return ( + + ); + })} + + + ); +}; +export default Metrics; diff --git a/client/src/Pages/Queue/components/MetricsTable/index.jsx b/client/src/Pages/Logs/Queue/components/MetricsTable/index.jsx similarity index 95% rename from client/src/Pages/Queue/components/MetricsTable/index.jsx rename to client/src/Pages/Logs/Queue/components/MetricsTable/index.jsx index 818b4e543..204b90035 100644 --- a/client/src/Pages/Queue/components/MetricsTable/index.jsx +++ b/client/src/Pages/Logs/Queue/components/MetricsTable/index.jsx @@ -1,6 +1,6 @@ import Stack from "@mui/material/Stack"; import Typography from "@mui/material/Typography"; -import DataTable from "../../../../Components/Table"; +import DataTable from "../../../../../Components/Table"; // Utils import { useTranslation } from "react-i18next"; diff --git a/client/src/Pages/Queue/index.jsx b/client/src/Pages/Logs/Queue/index.jsx similarity index 82% rename from client/src/Pages/Queue/index.jsx rename to client/src/Pages/Logs/Queue/index.jsx index eb732560c..729f87fe3 100644 --- a/client/src/Pages/Queue/index.jsx +++ b/client/src/Pages/Logs/Queue/index.jsx @@ -1,15 +1,14 @@ // Components import Stack from "@mui/material/Stack"; -import Breadcrumbs from "../../Components/Breadcrumbs"; import JobTable from "./components/JobTable"; -import MetricsTable from "./components/MetricsTable"; +import Metrics from "./components/Metrics"; import FailedJobTable from "./components/FailedJobTable"; import ButtonGroup from "@mui/material/ButtonGroup"; import Button from "@mui/material/Button"; // Utils import { useState } from "react"; -import { useFetchQueueData, useFlushQueue } from "../../Hooks/queueHooks"; +import { useFetchQueueData, useFlushQueue } from "../../../Hooks/queueHooks"; import { useTranslation } from "react-i18next"; import { useTheme } from "@emotion/react"; @@ -23,15 +22,13 @@ const QueueDetails = () => { const [jobs, metrics, isLoading, error] = useFetchQueueData(trigger); const [flushQueue, isFlushing, flushError] = useFlushQueue(); - const BREADCRUMBS = [{ name: t("queuePage.title"), path: "/queue" }]; if (isLoading) return
Loading...
; if (error || flushError) return
Error: {error.message}
; return ( - + - { + const { t } = useTranslation(); + const theme = useTheme(); + + // Local state + const [value, setValue] = useState(0); + + // Handlers + const handleChange = (event, newValue) => { + setValue(newValue); + }; + + const BREADCRUMBS = [{ name: t("logsPage.title"), path: "/logs" }]; + return ( + + + + + + + {value === 0 && } + {value === 1 &&
Not yet
} +
+ ); +}; + +export default Logs; diff --git a/client/src/Pages/Settings/SettingsDev.jsx b/client/src/Pages/Settings/SettingsDev.jsx deleted file mode 100644 index 721a17d5c..000000000 --- a/client/src/Pages/Settings/SettingsDev.jsx +++ /dev/null @@ -1,37 +0,0 @@ -import Box from "@mui/material/Box"; -import Typography from "@mui/material/Typography"; -import ConfigBox from "../../Components/ConfigBox"; -// Utils -import { useTranslation } from "react-i18next"; -import { useNavigate } from "react-router-dom"; -import Link from "../../Components/Link"; - -const SettingsDev = ({ isAdmin, HEADER_SX }) => { - const { t } = useTranslation(); - - if (!isAdmin) return null; - - return ( - - - - {t("settingsDev")} - - {t("settingsDevDescription")} - - - - - - ); -}; - -export default SettingsDev; diff --git a/client/src/Pages/Settings/index.jsx b/client/src/Pages/Settings/index.jsx index ef57a16c7..0cd954e52 100644 --- a/client/src/Pages/Settings/index.jsx +++ b/client/src/Pages/Settings/index.jsx @@ -8,7 +8,6 @@ import SettingsPagespeed from "./SettingsPagespeed"; import SettingsDemoMonitors from "./SettingsDemoMonitors"; import SettingsAbout from "./SettingsAbout"; import SettingsEmail from "./SettingsEmail"; -import SettingsDev from "./SettingsDev"; import Button from "@mui/material/Button"; // Utils import { settingsValidation } from "../../Validation/validation"; @@ -209,10 +208,7 @@ const Settings = () => { emailPasswordHasBeenReset={emailPasswordHasBeenReset} setEmailPasswordHasBeenReset={setEmailPasswordHasBeenReset} /> - + { const AdminCheckedRegister = withAdminCheck(AuthRegister); @@ -187,9 +187,10 @@ const Routes = () => { path="account/team" element={} /> + } + path="logs" + element={} /> diff --git a/client/src/Utils/Theme/globalTheme.js b/client/src/Utils/Theme/globalTheme.js index 58d9943be..ae014432d 100644 --- a/client/src/Utils/Theme/globalTheme.js +++ b/client/src/Utils/Theme/globalTheme.js @@ -407,6 +407,7 @@ const baseTheme = (palette) => ({ }), }, }, + MuiTab: { styleOverrides: { root: ({ theme }) => ({ @@ -475,6 +476,8 @@ const baseTheme = (palette) => ({ MuiTabs: { styleOverrides: { root: ({ theme }) => ({ + height: "34px", + minHeight: "34px", display: "inline-flex", borderRadius: 0, "& .MuiTabs-indicator": { diff --git a/client/src/assets/icons/logs.svg b/client/src/assets/icons/logs.svg new file mode 100644 index 000000000..e1adcb390 --- /dev/null +++ b/client/src/assets/icons/logs.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/client/src/locales/en.json b/client/src/locales/en.json index 14317e689..0856592fc 100644 --- a/client/src/locales/en.json +++ b/client/src/locales/en.json @@ -30,9 +30,6 @@ "settingsRemoveAllMonitorsDialogTitle": "Do you want to remove all monitors?", "settingsRemoveAllMonitorsDialogConfirm": "Yes, remove all monitors", "settingsAbout": "About", - "settingsDev": "Developer", - "settingsDevDescription": "Developer settings", - "settingsDevViewJobQueueDetails": "View job queue details", "settingsDevelopedBy": "Developed by Bluewave Labs.", "settingsSave": "Save", "settingsSuccessSaved": "Settings saved successfully", @@ -431,6 +428,7 @@ "statusPages": "Status pages", "maintenance": "Maintenance", "integrations": "Integrations", + "logs": "Logs", "settings": "Settings", "support": "Support", "discussions": "Discussions", @@ -756,6 +754,13 @@ "settingsEmailPool": "Enable connection pooling: Reuse existing connections to improve performance", "sendTestNotifications": "Send test notifications", "selectAll": "Select all", + "logsPage": { + "title": "Logs", + "tabs": { + "queue": "Job queue", + "logs": "Logs" + } + }, "queuePage": { "title": "Queue", "refreshButton": "Refresh",