diff --git a/frontend/src/forms/Downtime.vue b/frontend/src/forms/Downtime.vue index a23cb788..652d46b4 100644 --- a/frontend/src/forms/Downtime.vue +++ b/frontend/src/forms/Downtime.vue @@ -196,8 +196,6 @@ const checkFormErrors = (value, id) => { errors.failures = 'Enter Valid Positve Number without decimal point'; } else if (!start && end) { errors.start = 'Need to enter Start Date'; - } else if ( id && startSec && !endSec ) { - errors.end = 'Need to enter End Date'; } else if ( endSec && startSec > endSec ) { errors.end = 'End Date should be greater than Start Date'; } @@ -279,7 +277,7 @@ export default { const { id } = this.$route.params; const { serviceId, subStatus, failures, start, end } = this.downtime; - return serviceId && subStatus && failures && start && (id ? end : true); + return serviceId && subStatus && failures && start; }, saveDowntime: async function () { const { id } = this.$route.params; diff --git a/react-frontend/src/components/GroupItem.jsx b/react-frontend/src/components/GroupItem.jsx index 09ab6ff2..d9955875 100644 --- a/react-frontend/src/components/GroupItem.jsx +++ b/react-frontend/src/components/GroupItem.jsx @@ -3,12 +3,12 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faCircleNotch } from "@fortawesome/free-solid-svg-icons"; import ReactTooltip from "react-tooltip"; import API from "../config/API"; -import langs from "../config/langs"; import GroupServiceFailures from "./GroupServiceFailures"; import SubServiceCard from "./SubServiceCard"; import infoIcon from "../static/info.svg"; import { analyticsTrack } from "../utils/trackers"; import IncidentsBlock from "./IncidentsBlock"; +import { getServiceStatus } from "../utils/helper"; const GroupItem = ({ service, showPlusButton }) => { const [collapse, setCollapse] = useState(false); @@ -116,12 +116,7 @@ const GroupItem = ({ service, showPlusButton }) => { {!collapse && (
- - {service.online ? langs("online") : langs("offline")} - + {getServiceStatus(service.online)}
)} diff --git a/react-frontend/src/components/GroupServiceFailures.jsx b/react-frontend/src/components/GroupServiceFailures.jsx index 498fe718..3114cb3e 100644 --- a/react-frontend/src/components/GroupServiceFailures.jsx +++ b/react-frontend/src/components/GroupServiceFailures.jsx @@ -1,5 +1,5 @@ import { useState, useEffect } from "react"; -// import useIntersectionObserver from "../hooks/useIntersectionObserver"; +import { useToast } from "@chakra-ui/react"; import DateUtils from "../utils/DateUtils"; import langs from "../config/langs"; import API from "../config/API"; @@ -7,6 +7,7 @@ import ServiceLoader from "./ServiceLoader"; import ReactTooltip from "react-tooltip"; import { STATUS_CLASS } from "../utils/constants"; import { calcPer, isObjectEmpty } from "../utils/helper"; +import { errorToastConfig } from "../utils/toast"; const STATUS_TEXT = { up: "Uptime", @@ -52,7 +53,7 @@ async function fetchFailureSeries(url) { "24h", true ); - // console.log(data); + return data; } @@ -62,9 +63,12 @@ const GroupServiceFailures = ({ group = null, service, collapse }) => { const [failureData, setFailureData] = useState([]); const [uptime, setUptime] = useState(0); + const toast = useToast(); + useEffect(() => { async function fetchData() { let url = "/services"; + try { if (group) { url += `/${group.id}/sub_services/${service.id}/block_series`; @@ -72,27 +76,29 @@ const GroupServiceFailures = ({ group = null, service, collapse }) => { url += `/${service.id}/block_series`; } const { series, downtime, uptime } = await fetchFailureSeries(url); - const failureData = []; - series.forEach((d) => { - let date = DateUtils.parseISO(d.timeframe); + + const failureData = series.map((item) => { + let date = DateUtils.parseISO(item.timeframe); date = DateUtils.format(date, "dd MMMM yyyy"); - failureData.push({ + + return { timeframe: date, - status: d.status, - downtimes: groupByStatus(d.downtimes), - }); + status: item.status, + downtimes: groupByStatus(item.downtimes), + }; }); + const percentage = calcPer(uptime, downtime); setFailureData(failureData); setUptime(percentage); } catch (e) { - console.log(e.message); + toast(errorToastConfig(e.message)); } finally { setLoaded(false); } } fetchData(); - }, [service, group]); + }, [service, group, toast]); const handleTooltip = (d) => { let txt = ""; diff --git a/react-frontend/src/components/IncidentsBlock.jsx b/react-frontend/src/components/IncidentsBlock.jsx index 19ff8aea..db488e2e 100644 --- a/react-frontend/src/components/IncidentsBlock.jsx +++ b/react-frontend/src/components/IncidentsBlock.jsx @@ -70,7 +70,10 @@ const IncidentsBlock = ({ service, group }) => {
{title} - {description} + + Issue Description -{" "} + + {description} Updated {DateUtils.ago(updatedAt)} ago.{" "} diff --git a/react-frontend/src/components/SubServiceCard.jsx b/react-frontend/src/components/SubServiceCard.jsx index 73505179..62355aec 100644 --- a/react-frontend/src/components/SubServiceCard.jsx +++ b/react-frontend/src/components/SubServiceCard.jsx @@ -1,9 +1,9 @@ import React, { useState } from "react"; import ReactTooltip from "react-tooltip"; -import langs from "../config/langs"; import GroupServiceFailures from "./GroupServiceFailures"; import IncidentsBlock from "./IncidentsBlock"; import infoIcon from "../static/info.svg"; +import { getServiceStatus } from "../utils/helper"; const SubServiceCard = ({ group, service }) => { const [hoverText, setHoverText] = useState(""); @@ -20,10 +20,7 @@ const SubServiceCard = ({ group, service }) => {
- + {service.name} {service?.description && ( @@ -47,16 +44,12 @@ const SubServiceCard = ({ group, service }) => { )}
- - {service.online ? langs("online") : langs("offline")} - + {getServiceStatus(service.online)}
+
); diff --git a/react-frontend/src/config/langs.js b/react-frontend/src/config/langs.js index 318422ac..7abfa66c 100644 --- a/react-frontend/src/config/langs.js +++ b/react-frontend/src/config/langs.js @@ -8,6 +8,7 @@ const english = { login: "Login", logout: "Logout", online: "Online", + degraded: "Degraded", offline: "Offline", configs: "Configuration", username: "Username", diff --git a/react-frontend/src/utils/helper.js b/react-frontend/src/utils/helper.js index 1727bb66..59e91d25 100644 --- a/react-frontend/src/utils/helper.js +++ b/react-frontend/src/utils/helper.js @@ -1,3 +1,5 @@ +import langs from "../config/langs"; + export function findStatus(data) { if (!Array.isArray(data)) return null; if (data.length === 0) return null; @@ -23,6 +25,22 @@ export function getIncidentTextType(type) { } } +export const getServiceStatus = (status) => { + let className = ""; + + if (status) { + className = " uptime"; + } else { + className = " downtime"; + } + + return ( + + {status ? langs("online") : langs("offline")} + + ); +}; + export const isObject = (obj) => { if (Object.prototype.toString.call(obj) === "[object Object]") { return true; diff --git a/react-frontend/src/utils/toast.js b/react-frontend/src/utils/toast.js new file mode 100644 index 00000000..bc6a8a5b --- /dev/null +++ b/react-frontend/src/utils/toast.js @@ -0,0 +1,8 @@ +export const errorToastConfig = (title) => { + return { + title: title, + status: "error", + isClosable: true, + position: "top-right", + }; +};