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",
+ };
+};