From 8d20a2889dedf1703af5cab308f10952b9ffca85 Mon Sep 17 00:00:00 2001
From: Max Frederiksen <maxfrederiksen@Maxs-MacBook-Air.local>
Date: Wed, 20 Nov 2024 16:12:22 +0100
Subject: [PATCH] CE-3145: Only fetch data inside accordion when expanded

---
 .../IOC/IOCLiveStatus/IOCLiveStatus.jsx       |  2 ++
 src/components/Job/JobDetails.tsx             |  8 ++++-
 src/components/common/Loki/LokiPanel.jsx      | 14 +++++----
 .../deployments/DeploymentJobOutput.jsx       | 12 ++++----
 src/components/records/RecordSearch.jsx       | 30 ++++++++++++-------
 src/views/host/details/HostDetailsView.jsx    |  1 +
 6 files changed, 45 insertions(+), 22 deletions(-)

diff --git a/src/components/IOC/IOCLiveStatus/IOCLiveStatus.jsx b/src/components/IOC/IOCLiveStatus/IOCLiveStatus.jsx
index b8a0c051..73698a33 100644
--- a/src/components/IOC/IOCLiveStatus/IOCLiveStatus.jsx
+++ b/src/components/IOC/IOCLiveStatus/IOCLiveStatus.jsx
@@ -86,6 +86,7 @@ export function IOCLiveStatus({ ioc }) {
               <LokiPanel
                 hostName={hostName}
                 iocName={ioc.namingName}
+                isExpanded={accordionState.logStreamOpen}
               />
             )}
           </SimpleAccordion>
@@ -107,6 +108,7 @@ export function IOCLiveStatus({ ioc }) {
           <RecordSearch
             iocName={ioc.namingName}
             rowType="iocDetails"
+            isExpanded={accordionState.recordsOpen}
           />
         </SimpleAccordion>
       </AccessControl>
diff --git a/src/components/Job/JobDetails.tsx b/src/components/Job/JobDetails.tsx
index 03bbe70a..54502206 100644
--- a/src/components/Job/JobDetails.tsx
+++ b/src/components/Job/JobDetails.tsx
@@ -82,6 +82,7 @@ export const JobsDetails = ({ jobDetail: operation }: JobDetailsProps) => {
   const StepIcon = operation?.status
     ? StepperComponents[operation.status.toLowerCase()]
     : StepperComponents[STEPPER_STATES.unknown];
+  const [expanded, setExpanded] = useState(false);
 
   const awxJob = useMemo(
     () => new AWXJobDetails(operation, operation.action),
@@ -114,6 +115,8 @@ export const JobsDetails = ({ jobDetail: operation }: JobDetailsProps) => {
         renderNoAccess={() => <></>}
       >
         <SimpleAccordion
+          expanded={expanded}
+          onChange={() => setExpanded((prev) => !prev)}
           summary={
             <Stack
               flexDirection="row"
@@ -136,7 +139,10 @@ export const JobsDetails = ({ jobDetail: operation }: JobDetailsProps) => {
             </Stack>
           }
         >
-          <DeploymentJobOutput job={operation} />
+          <DeploymentJobOutput
+            job={operation}
+            isExpanded={expanded}
+          />
         </SimpleAccordion>
       </AccessControl>
     </Stack>
diff --git a/src/components/common/Loki/LokiPanel.jsx b/src/components/common/Loki/LokiPanel.jsx
index d9149797..428869ca 100644
--- a/src/components/common/Loki/LokiPanel.jsx
+++ b/src/components/common/Loki/LokiPanel.jsx
@@ -33,7 +33,7 @@ const TIME_RANGE_VALUES = [
  */
 
 const LOG_POLL_INTERVAL = 5000;
-export function LokiPanel({ hostName, iocName, isSyslog }) {
+export function LokiPanel({ hostName, iocName, isSyslog, isExpanded }) {
   const showWarning = useCustomSnackbar();
   const [timeRange, setTimeRange] = useState(720);
   const [logDialogOpen, setLogDialogOpen] = useState(false);
@@ -144,12 +144,14 @@ export function LokiPanel({ hostName, iocName, isSyslog }) {
   }, [alertIds]);
 
   useEffect(() => {
-    if (isSyslog === true) {
-      getSysLogData(params);
-    } else {
-      getProcServLog(params);
+    if (isExpanded) {
+      if (isSyslog === true) {
+        getSysLogData(params);
+      } else {
+        getProcServLog(params);
+      }
     }
-  }, [getSysLogData, getProcServLog, isSyslog, params]);
+  }, [getSysLogData, getProcServLog, isSyslog, isExpanded, params]);
 
   useEffect(() => {
     setHtml(
diff --git a/src/components/deployments/DeploymentJobOutput.jsx b/src/components/deployments/DeploymentJobOutput.jsx
index 73a96120..5f046b27 100644
--- a/src/components/deployments/DeploymentJobOutput.jsx
+++ b/src/components/deployments/DeploymentJobOutput.jsx
@@ -16,7 +16,7 @@ import { getErrorMessage, isAbortError } from "../common/Helper";
 
 const LOG_POLL_INTERVAL = 5000;
 
-export function DeploymentJobOutput({ job }) {
+export function DeploymentJobOutput({ job, isExpanded }) {
   const [consoleDialogOpen, setConsoleDialogOpen] = useState(false);
   const client = useContext(apiContext);
   const finalResultsNeeded = useRef(true);
@@ -40,11 +40,13 @@ export function DeploymentJobOutput({ job }) {
   });
 
   const getLog = useCallback(() => {
-    if (!job.finishedAt || finalResultsNeeded.current) {
-      getLogById(job.jobId);
-      finalResultsNeeded.current = !job.finishedAt;
+    if (isExpanded) {
+      if (!job.finishedAt || finalResultsNeeded.current) {
+        getLogById(job.jobId);
+        finalResultsNeeded.current = !job.finishedAt;
+      }
     }
-  }, [job.finishedAt, job.jobId, getLogById]);
+  }, [job.finishedAt, job.jobId, isExpanded, getLogById]);
 
   const hasAbortError = isAbortError(logError);
   const showLoading = !log || !job.startTime;
diff --git a/src/components/records/RecordSearch.jsx b/src/components/records/RecordSearch.jsx
index cb82c42f..8a0b1055 100644
--- a/src/components/records/RecordSearch.jsx
+++ b/src/components/records/RecordSearch.jsx
@@ -7,7 +7,7 @@ import { useAPIMethod, usePagination, SearchBar } from "@ess-ics/ce-ui-common";
 import { apiContext } from "../../api/DeployApi";
 import { ROWS_PER_PAGE } from "../../constants";
 
-export function RecordSearch({ iocName, rowType }) {
+export function RecordSearch({ iocName, rowType, isExpanded }) {
   const client = useContext(apiContext);
 
   const {
@@ -49,16 +49,26 @@ export function RecordSearch({ iocName, rowType }) {
 
   // Request new search results whenever search or pagination changes
   useEffect(() => {
-    let requestParams = initRequestParams(pagination);
-    requestParams.pv_status = recordFilter;
-    requestParams.text = searchParams.get("query");
-    requestParams.ioc_name = iocName;
-    getRecords(requestParams);
+    if (isExpanded) {
+      let requestParams = initRequestParams(pagination);
+      requestParams.pv_status = recordFilter;
+      requestParams.text = searchParams.get("query");
+      requestParams.ioc_name = iocName;
+      getRecords(requestParams);
 
-    return () => {
-      abort();
-    };
-  }, [getRecords, recordFilter, searchParams, pagination, abort, iocName]);
+      return () => {
+        abort();
+      };
+    }
+  }, [
+    getRecords,
+    recordFilter,
+    searchParams,
+    pagination,
+    abort,
+    iocName,
+    isExpanded
+  ]);
 
   // Callback for searchbar, called whenever user updates search
   const setSearch = useCallback(
diff --git a/src/views/host/details/HostDetailsView.jsx b/src/views/host/details/HostDetailsView.jsx
index bd1cb8e4..325ea578 100644
--- a/src/views/host/details/HostDetailsView.jsx
+++ b/src/views/host/details/HostDetailsView.jsx
@@ -130,6 +130,7 @@ export function HostDetailsView({ hostId, host, alert }) {
               <LokiPanel
                 hostName={host.name}
                 isSyslog
+                isExpanded={accordionState.logStreamOpen}
               />
             </SimpleAccordion>
           </AccessControl>
-- 
GitLab