From 85b8cf5a1d45266da148f0c183154a282f66072e Mon Sep 17 00:00:00 2001
From: Johanna Szepanski <johanna.szepanski@softhouse.se>
Date: Wed, 14 Aug 2024 09:37:51 +0200
Subject: [PATCH] generalised ioc icon components and data and moved files to
 common/status

---
 src/components/IOC/IOCBadge/IOCBadge.js       | 18 ------
 src/components/IOC/IOCBadge/index.js          |  4 --
 src/components/IOC/IOCIcons/IOCStatusData.js  | 50 ---------------
 src/components/IOC/IOCIcons/index.js          |  3 -
 .../IOCIcons.js => common/Status/Status.js}   | 62 +++++++++++--------
 src/components/common/Status/StatusData.js    | 53 ++++++++++++++++
 src/components/common/Status/index.js         |  8 ++-
 7 files changed, 94 insertions(+), 104 deletions(-)
 delete mode 100644 src/components/IOC/IOCBadge/IOCBadge.js
 delete mode 100644 src/components/IOC/IOCBadge/index.js
 delete mode 100644 src/components/IOC/IOCIcons/IOCStatusData.js
 delete mode 100644 src/components/IOC/IOCIcons/index.js
 rename src/components/{IOC/IOCIcons/IOCIcons.js => common/Status/Status.js} (64%)

diff --git a/src/components/IOC/IOCBadge/IOCBadge.js b/src/components/IOC/IOCBadge/IOCBadge.js
deleted file mode 100644
index f62f95ac..00000000
--- a/src/components/IOC/IOCBadge/IOCBadge.js
+++ /dev/null
@@ -1,18 +0,0 @@
-import { IconBadge } from "@ess-ics/ce-ui-common";
-import { IOCStatusIcon } from "../IOCIcons";
-
-export function IOCBadge({ ioc, ...rest }) {
-  return (
-    <IconBadge
-      icon={
-        <IOCStatusIcon
-          ioc={ioc}
-          hideAlerts
-        />
-      }
-      title={ioc.namingName ?? ioc.name}
-      subtitle={ioc.activeDeployment?.host?.fqdn || "---"}
-      {...rest}
-    />
-  );
-}
diff --git a/src/components/IOC/IOCBadge/index.js b/src/components/IOC/IOCBadge/index.js
deleted file mode 100644
index 712570a3..00000000
--- a/src/components/IOC/IOCBadge/index.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import { IOCBadge } from "./IOCBadge";
-
-export { IOCBadge };
-export default IOCBadge;
diff --git a/src/components/IOC/IOCIcons/IOCStatusData.js b/src/components/IOC/IOCIcons/IOCStatusData.js
deleted file mode 100644
index d11d4d5b..00000000
--- a/src/components/IOC/IOCIcons/IOCStatusData.js
+++ /dev/null
@@ -1,50 +0,0 @@
-import { SEVERITY, STATUS } from "../../common/Status";
-
-export const getIocStatus = (ioc) => {
-  let { active, activeDeployment } = ioc;
-  const alertSeverity = ioc?.alertSeverity?.toLowerCase();
-
-  if (
-    active &&
-    (alertSeverity === undefined || alertSeverity === SEVERITY.info)
-  ) {
-    // Active status / running
-    return STATUS.active;
-  } else if (
-    active === false &&
-    (alertSeverity === undefined || alertSeverity === SEVERITY.info)
-  ) {
-    // stopped/paused
-    return STATUS.disabled;
-  } else if (
-    active !== undefined &&
-    alertSeverity !== undefined &&
-    alertSeverity === SEVERITY.alert
-  ) {
-    // error
-    return STATUS.alert;
-  } else if (
-    active !== undefined &&
-    alertSeverity !== undefined &&
-    alertSeverity === SEVERITY.warning
-  ) {
-    // warning
-    return STATUS.warning;
-  } else if (
-    (!active || activeDeployment === null) &&
-    (alertSeverity === undefined || alertSeverity === SEVERITY.info)
-  ) {
-    // Inactive status
-    return STATUS.inactive;
-  } else if (
-    (!active || activeDeployment === null) &&
-    alertSeverity !== undefined &&
-    alertSeverity !== SEVERITY.info
-  ) {
-    // inactive with warning/error
-    return STATUS.inactiveAlert;
-  } else {
-    // unknown fallback state
-    return null;
-  }
-};
diff --git a/src/components/IOC/IOCIcons/index.js b/src/components/IOC/IOCIcons/index.js
deleted file mode 100644
index 913ed4cc..00000000
--- a/src/components/IOC/IOCIcons/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import { IOCStatusIcon, CommandTypeIcon } from "./IOCIcons";
-
-export { IOCStatusIcon, CommandTypeIcon };
diff --git a/src/components/IOC/IOCIcons/IOCIcons.js b/src/components/common/Status/Status.js
similarity index 64%
rename from src/components/IOC/IOCIcons/IOCIcons.js
rename to src/components/common/Status/Status.js
index 8dfb935e..da7bc53b 100644
--- a/src/components/IOC/IOCIcons/IOCIcons.js
+++ b/src/components/common/Status/Status.js
@@ -1,30 +1,38 @@
+import { useState, useEffect } from "react";
 import { LabeledIcon } from "@ess-ics/ce-ui-common";
 import Popover from "../../common/Popover";
-import { object, bool } from "prop-types";
+import { object, bool, array } from "prop-types";
 import { useTheme } from "@mui/material";
 import { PlayCircleFilled, PauseCircleFilled } from "@mui/icons-material";
-import {
-  StatusPopoverContent,
-  StatusBadge,
-  StatusIcon,
-  STATUS,
-  statusConfig
-} from "../../common/Status";
-import { getIocStatus } from "./IOCStatusData";
+import { StatusPopoverContent } from "./StatusPopoverContent";
+import { StatusBadge } from "./StatusBadge";
+import { StatusIcon } from "./StatusIcon";
+import { STATUS, statusConfig, getStatus } from "./StatusData";
+
 const propsTypes = {
-  ioc: object,
+  state: object,
+  alert: array,
   hideAlerts: bool
 };
 
-export function IOCStatusIcon({ ioc, hideAlerts = false }) {
-  const theme = useTheme();
-  let { alerts = [], id } = ioc;
-  const iocStatus = getIocStatus(ioc);
-  const displayBadge =
+const checkDisplayBadge = (status, hideAlerts) => {
+  return (
     !hideAlerts &&
-    (iocStatus === STATUS.alert ||
-      iocStatus === STATUS.warning ||
-      iocStatus === STATUS.inactiveAlert);
+    (status === STATUS.alert ||
+      status === STATUS.warning ||
+      status === STATUS.inactiveAlert ||
+      status === STATUS.inactiveWarning)
+  );
+};
+
+export function Status({ state, alert, hideAlerts = false }) {
+  const [status, setStatus] = useState(null);
+  const theme = useTheme();
+  let { id } = state;
+
+  useEffect(() => {
+    setStatus(getStatus(state, alert));
+  }, [state, alert]);
 
   return (
     <Popover
@@ -42,28 +50,28 @@ export function IOCStatusIcon({ ioc, hideAlerts = false }) {
           onMouseLeave={handlePopoverClose}
           style={{ color: theme.palette.status.icons }}
         >
-          {displayBadge ? (
+          {checkDisplayBadge(status, hideAlerts) ? (
             <StatusBadge
-              status={iocStatus}
+              status={status}
               theme={theme}
             >
               <StatusIcon
-                alerts={alerts}
-                status={iocStatus}
+                alerts={alert?.alerts ? alert.alerts : []}
+                status={status}
               />
             </StatusBadge>
           ) : (
             <StatusIcon
-              alerts={alerts}
-              status={iocStatus}
+              alerts={alert?.alerts ? alert.alerts : []}
+              status={status}
             />
           )}
         </div>
       )}
       popoverContents={
         <StatusPopoverContent
-          title={statusConfig[iocStatus].title}
-          alerts={hideAlerts ? [] : alerts}
+          title={statusConfig[status].title}
+          alerts={hideAlerts ? [] : alert?.alerts ? alert.alerts : []}
         />
       }
       anchorOrigin={{
@@ -74,7 +82,7 @@ export function IOCStatusIcon({ ioc, hideAlerts = false }) {
   );
 }
 
-IOCStatusIcon.propsTypes = propsTypes;
+Status.propsTypes = propsTypes;
 
 export function CommandTypeIcon({
   type,
diff --git a/src/components/common/Status/StatusData.js b/src/components/common/Status/StatusData.js
index 4c3fce63..0219be02 100644
--- a/src/components/common/Status/StatusData.js
+++ b/src/components/common/Status/StatusData.js
@@ -55,3 +55,56 @@ export const statusConfig = {
     icon: HelpOutline
   }
 };
+
+export const getStatus = (state, alert) => {
+  let { isActive } = state;
+  const alertSeverity = alert?.alertSeverity?.toLowerCase();
+
+  if (
+    isActive &&
+    (alertSeverity === undefined || alertSeverity === SEVERITY.info)
+  ) {
+    // Active status / running
+    return STATUS.active;
+  } else if (
+    isActive === false &&
+    (alertSeverity === undefined || alertSeverity === SEVERITY.info)
+  ) {
+    // stopped/paused
+    return STATUS.disabled;
+  } else if (
+    isActive &&
+    alertSeverity !== undefined &&
+    alertSeverity === SEVERITY.alert
+  ) {
+    // error
+    return STATUS.alert;
+  } else if (
+    isActive &&
+    alertSeverity !== undefined &&
+    alertSeverity === SEVERITY.warning
+  ) {
+    // warning
+    return STATUS.warning;
+  } else if (
+    (!isActive || isActive === null) &&
+    (alertSeverity === undefined || alertSeverity === SEVERITY.info)
+  ) {
+    // Inactive status
+    return STATUS.inactive;
+  } else if (
+    (!isActive || isActive === null) &&
+    alertSeverity === SEVERITY.alert
+  ) {
+    // inactive with warning/error
+    return STATUS.inactiveAlert;
+  } else if (
+    (!isActive || isActive === null) &&
+    alertSeverity === SEVERITY.warning
+  ) {
+    return STATUS.inactiveWarning;
+  } else {
+    // unknown fallback state
+    return null;
+  }
+};
diff --git a/src/components/common/Status/index.js b/src/components/common/Status/index.js
index d5ab35f0..7d5d12af 100644
--- a/src/components/common/Status/index.js
+++ b/src/components/common/Status/index.js
@@ -1,13 +1,17 @@
+import { Status, CommandTypeIcon } from "./Status";
 import { StatusBadge } from "./StatusBadge";
 import { StatusIcon } from "./StatusIcon";
 import { StatusPopoverContent } from "./StatusPopoverContent";
-import { statusConfig, STATUS, SEVERITY } from "./StatusData";
+import { statusConfig, STATUS, SEVERITY, getStatus } from "./StatusData";
 
 export {
+  Status,
+  CommandTypeIcon,
   StatusPopoverContent,
   StatusBadge,
   StatusIcon,
   STATUS,
   SEVERITY,
-  statusConfig
+  statusConfig,
+  getStatus
 };
-- 
GitLab