From 8e93e3fbbbf65d6ad7d112a5e80977e2331ca3fc Mon Sep 17 00:00:00 2001
From: Sky Brewer <sky.brewer@ess.eu>
Date: Wed, 22 Jan 2025 14:08:46 +0100
Subject: [PATCH 01/12] Send encodedname to api

---
 src/views/records/RecordDetailsView.tsx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/views/records/RecordDetailsView.tsx b/src/views/records/RecordDetailsView.tsx
index 87c902f0..9e371f1d 100644
--- a/src/views/records/RecordDetailsView.tsx
+++ b/src/views/records/RecordDetailsView.tsx
@@ -34,7 +34,7 @@ export function RecordDetailsView() {
     error: fetchError,
     isLoading: recordLoading
   } = useGetRecordQuery({
-    name: decodedName
+    name: encodeURIComponent(decodedName)
   });
 
   const navigate = useNavigate();
-- 
GitLab


From c2f7838dc8800b7ced706bc0d9c325551cdbbbec Mon Sep 17 00:00:00 2001
From: Sky Brewer <sky.brewer@ess.eu>
Date: Wed, 22 Jan 2025 14:09:21 +0100
Subject: [PATCH 02/12] Create correct link to alias

---
 src/views/records/Alias.tsx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/views/records/Alias.tsx b/src/views/records/Alias.tsx
index 37fb5709..f8cf4ad7 100644
--- a/src/views/records/Alias.tsx
+++ b/src/views/records/Alias.tsx
@@ -17,7 +17,7 @@ export const Alias = ({ aliases }: { aliases?: string[] }) => {
       {aliases.map((alias, index) => (
         <InternalLink
           key={itemsKeys[index]}
-          to={`/records/${alias}`}
+          to={`/records/${encodeURIComponent(alias)}`}
           label={alias}
         >
           {`${alias}${index < aliases.length - 1 && aliases.length > 1 ? "," : ""}`}
-- 
GitLab


From b05ca0c14e54fd6874f2a6ebd01f1ac0a1ed64ef Mon Sep 17 00:00:00 2001
From: Sky Brewer <sky.brewer@ess.eu>
Date: Fri, 24 Jan 2025 13:41:47 +0100
Subject: [PATCH 03/12] Add generate api dependency

---
 package-lock.json | 138 ++++++++++++++++++++++++++++++++++++++++++++++
 package.json      |   1 +
 2 files changed, 139 insertions(+)

diff --git a/package-lock.json b/package-lock.json
index f321686d..c5f49e6d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -60,6 +60,7 @@
         "prop-types": "^15.8.1",
         "storybook": "^8.4.2",
         "stream-http": "^3.2.0",
+        "ts-node": "^10.9.2",
         "typescript": "^5.7.2",
         "vite": "^5.4.10",
         "vite-plugin-node-polyfills": "^0.22.0",
@@ -676,6 +677,28 @@
         "node": ">=0.1.90"
       }
     },
+    "node_modules/@cspotcode/source-map-support": {
+      "version": "0.8.1",
+      "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
+      "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
+      "dev": true,
+      "dependencies": {
+        "@jridgewell/trace-mapping": "0.3.9"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": {
+      "version": "0.3.9",
+      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
+      "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
+      "dev": true,
+      "dependencies": {
+        "@jridgewell/resolve-uri": "^3.0.3",
+        "@jridgewell/sourcemap-codec": "^1.4.10"
+      }
+    },
     "node_modules/@cypress/request": {
       "version": "3.0.6",
       "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.6.tgz",
@@ -3972,6 +3995,30 @@
         "@testing-library/dom": ">=7.21.4"
       }
     },
+    "node_modules/@tsconfig/node10": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz",
+      "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==",
+      "dev": true
+    },
+    "node_modules/@tsconfig/node12": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
+      "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
+      "dev": true
+    },
+    "node_modules/@tsconfig/node14": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
+      "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==",
+      "dev": true
+    },
+    "node_modules/@tsconfig/node16": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz",
+      "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
+      "dev": true
+    },
     "node_modules/@types/aria-query": {
       "version": "5.0.4",
       "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz",
@@ -4637,6 +4684,18 @@
         "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
       }
     },
+    "node_modules/acorn-walk": {
+      "version": "8.3.4",
+      "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz",
+      "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==",
+      "dev": true,
+      "dependencies": {
+        "acorn": "^8.11.0"
+      },
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
     "node_modules/aggregate-error": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
@@ -4840,6 +4899,12 @@
         }
       ]
     },
+    "node_modules/arg": {
+      "version": "4.1.3",
+      "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
+      "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
+      "dev": true
+    },
     "node_modules/argparse": {
       "version": "1.0.10",
       "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
@@ -6309,6 +6374,15 @@
         "node": ">=8"
       }
     },
+    "node_modules/diff": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
+      "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.3.1"
+      }
+    },
     "node_modules/diff-match-patch": {
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz",
@@ -9252,6 +9326,12 @@
         "@jridgewell/sourcemap-codec": "^1.5.0"
       }
     },
+    "node_modules/make-error": {
+      "version": "1.3.6",
+      "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
+      "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
+      "dev": true
+    },
     "node_modules/map-or-similar": {
       "version": "1.5.0",
       "resolved": "https://registry.npmjs.org/map-or-similar/-/map-or-similar-1.5.0.tgz",
@@ -12289,6 +12369,49 @@
       "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.4.tgz",
       "integrity": "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA=="
     },
+    "node_modules/ts-node": {
+      "version": "10.9.2",
+      "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz",
+      "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==",
+      "dev": true,
+      "dependencies": {
+        "@cspotcode/source-map-support": "^0.8.0",
+        "@tsconfig/node10": "^1.0.7",
+        "@tsconfig/node12": "^1.0.7",
+        "@tsconfig/node14": "^1.0.0",
+        "@tsconfig/node16": "^1.0.2",
+        "acorn": "^8.4.1",
+        "acorn-walk": "^8.1.1",
+        "arg": "^4.1.0",
+        "create-require": "^1.1.0",
+        "diff": "^4.0.1",
+        "make-error": "^1.1.1",
+        "v8-compile-cache-lib": "^3.0.1",
+        "yn": "3.1.1"
+      },
+      "bin": {
+        "ts-node": "dist/bin.js",
+        "ts-node-cwd": "dist/bin-cwd.js",
+        "ts-node-esm": "dist/bin-esm.js",
+        "ts-node-script": "dist/bin-script.js",
+        "ts-node-transpile-only": "dist/bin-transpile.js",
+        "ts-script": "dist/bin-script-deprecated.js"
+      },
+      "peerDependencies": {
+        "@swc/core": ">=1.2.50",
+        "@swc/wasm": ">=1.2.50",
+        "@types/node": "*",
+        "typescript": ">=2.7"
+      },
+      "peerDependenciesMeta": {
+        "@swc/core": {
+          "optional": true
+        },
+        "@swc/wasm": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/ts-pattern": {
       "version": "5.2.0",
       "resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-5.2.0.tgz",
@@ -12648,6 +12771,12 @@
         "uuid": "dist/bin/uuid"
       }
     },
+    "node_modules/v8-compile-cache-lib": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
+      "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
+      "dev": true
+    },
     "node_modules/verror": {
       "version": "1.10.0",
       "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
@@ -13446,6 +13575,15 @@
         "fd-slicer": "~1.1.0"
       }
     },
+    "node_modules/yn": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
+      "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
     "node_modules/yocto-queue": {
       "version": "0.1.0",
       "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
diff --git a/package.json b/package.json
index 230088c6..58df30b8 100644
--- a/package.json
+++ b/package.json
@@ -84,6 +84,7 @@
     "prop-types": "^15.8.1",
     "storybook": "^8.4.2",
     "stream-http": "^3.2.0",
+    "ts-node": "^10.9.2",
     "typescript": "^5.7.2",
     "vite": "^5.4.10",
     "vite-plugin-node-polyfills": "^0.22.0",
-- 
GitLab


From 768614ee74a2bf4fe0d143543d0611a92e0f02eb Mon Sep 17 00:00:00 2001
From: Sky Brewer <sky.brewer@ess.eu>
Date: Fri, 24 Jan 2025 13:44:14 +0100
Subject: [PATCH 04/12] Update api for aliases

---
 src/store/deployApi.ts                  | 29 +++++++++++++++----------
 src/views/records/RecordDetailsView.tsx |  2 +-
 2 files changed, 18 insertions(+), 13 deletions(-)

diff --git a/src/store/deployApi.ts b/src/store/deployApi.ts
index abcb3b50..4c87cb1a 100644
--- a/src/store/deployApi.ts
+++ b/src/store/deployApi.ts
@@ -113,12 +113,6 @@ const injectedRtkApi = api.injectEndpoints({
         body: queryArg.updateHostRequest
       })
     }),
-    getHealthCheck: build.query<
-      GetHealthCheckApiResponse,
-      GetHealthCheckApiArg
-    >({
-      query: () => ({ url: `/healthcheck` })
-    }),
     findAllRecords: build.query<
       FindAllRecordsApiResponse,
       FindAllRecordsApiArg
@@ -304,6 +298,12 @@ const injectedRtkApi = api.injectEndpoints({
         url: `/api/v1/hosts/${queryArg.hostId}/info_by_host_id`
       })
     }),
+    checkHostExists: build.query<
+      CheckHostExistsApiResponse,
+      CheckHostExistsApiArg
+    >({
+      query: (queryArg) => ({ url: `/api/v1/hosts/${queryArg.hostId}/exists` })
+    }),
     findHostAlerts: build.query<
       FindHostAlertsApiResponse,
       FindHostAlertsApiArg
@@ -465,7 +465,8 @@ export type UpdateIocApiArg = {
   iocUpdateRequest: IocUpdateRequest;
 };
 export type UnDeployInDbApiResponse =
-  /** status 200 Undeployment created */ Deployment[];
+  /** status 200 Undeployment created */
+  Deployment[] | /** status 204 No Content */ void;
 export type UnDeployInDbApiArg = {
   /** The id of the IOC to undeploy */
   iocId: number;
@@ -477,8 +478,6 @@ export type UpdateActiveDeploymentHostApiArg = {
   iocId: number;
   updateHostRequest: UpdateHostRequest;
 };
-export type GetHealthCheckApiResponse = /** status 200 OK */ string;
-export type GetHealthCheckApiArg = void;
 export type FindAllRecordsApiResponse =
   /** status 200 A paged array of Channel Finder records */ PagedRecordResponse;
 export type FindAllRecordsApiArg = {
@@ -657,6 +656,12 @@ export type FindNetBoxHostByHostIdApiArg = {
   /** The host's Host ID */
   hostId: string;
 };
+export type CheckHostExistsApiResponse =
+  /** status 200 Hosts exists in NetBox */ void;
+export type CheckHostExistsApiArg = {
+  /** Host identifier */
+  hostId: string;
+};
 export type FindHostAlertsApiResponse =
   /** status 200 Host alerts */ HostAlertResponse;
 export type FindHostAlertsApiArg = {
@@ -939,7 +944,7 @@ export type RecordDetails = {
     [key: string]: string;
   };
   hostId?: string;
-  aliasTo?: string[];
+  aliases?: string[];
 };
 export type NameResponse = {
   uuid?: string;
@@ -1143,8 +1148,6 @@ export const {
   useUpdateIocMutation,
   useUnDeployInDbMutation,
   useUpdateActiveDeploymentHostMutation,
-  useGetHealthCheckQuery,
-  useLazyGetHealthCheckQuery,
   useFindAllRecordsQuery,
   useLazyFindAllRecordsQuery,
   useGetRecordQuery,
@@ -1188,6 +1191,8 @@ export const {
   useLazyFindAssociatedIocsByHostIdQuery,
   useFindNetBoxHostByHostIdQuery,
   useLazyFindNetBoxHostByHostIdQuery,
+  useCheckHostExistsQuery,
+  useLazyCheckHostExistsQuery,
   useFindHostAlertsQuery,
   useLazyFindHostAlertsQuery,
   useFindNetBoxHostByFqdnQuery,
diff --git a/src/views/records/RecordDetailsView.tsx b/src/views/records/RecordDetailsView.tsx
index 9e371f1d..f6bcf93d 100644
--- a/src/views/records/RecordDetailsView.tsx
+++ b/src/views/records/RecordDetailsView.tsx
@@ -71,7 +71,7 @@ export function RecordDetailsView() {
       ) : (
         record?.hostName
       ),
-      "Alias to": <Alias aliases={record?.aliasTo} />,
+      Aliases: <Alias aliases={record?.aliases} />,
       [LAST_UPDATED]: "",
       [IOC_REVISION]: ""
     };
-- 
GitLab


From 4bfa8060439c129ce5fe3466f3cf0bdc8f41f4fd Mon Sep 17 00:00:00 2001
From: Sky Brewer <sky.brewer@ess.eu>
Date: Fri, 24 Jan 2025 15:34:26 +0100
Subject: [PATCH 05/12] Generate api with records alerts

---
 src/store/deployApi.ts | 31 ++++++++++++++++++++++++++-----
 1 file changed, 26 insertions(+), 5 deletions(-)

diff --git a/src/store/deployApi.ts b/src/store/deployApi.ts
index 4c87cb1a..1ec62c4f 100644
--- a/src/store/deployApi.ts
+++ b/src/store/deployApi.ts
@@ -128,6 +128,14 @@ const injectedRtkApi = api.injectEndpoints({
         }
       })
     }),
+    fetchRecordAlerts: build.query<
+      FetchRecordAlertsApiResponse,
+      FetchRecordAlertsApiArg
+    >({
+      query: (queryArg) => ({
+        url: `/api/v1/records/${queryArg.recordName}/alerts`
+      })
+    }),
     getRecord: build.query<GetRecordApiResponse, GetRecordApiArg>({
       query: (queryArg) => ({ url: `/api/v1/records/${queryArg.name}` })
     }),
@@ -492,6 +500,12 @@ export type FindAllRecordsApiArg = {
   /** Page size */
   limit?: string;
 };
+export type FetchRecordAlertsApiResponse =
+  /** status 200 Alerts of the Record */ RecordAlertResponse;
+export type FetchRecordAlertsApiArg = {
+  /** Name of the Record */
+  recordName: string;
+};
 export type GetRecordApiResponse = /** status 200 Found record */ RecordDetails;
 export type GetRecordApiArg = {
   /** Unique (part of the) name of the record */
@@ -930,6 +944,16 @@ export type PagedRecordResponse = {
   limit?: number;
   recordList?: Record[];
 };
+export type Alert = {
+  type?: "ERROR" | "WARNING" | "INFO";
+  message?: string;
+  link?: string;
+};
+export type RecordAlertResponse = {
+  alertSeverity?: "ERROR" | "WARNING" | "INFO";
+  alerts?: Alert[];
+  recordName?: string;
+};
 export type RecordDetails = {
   name?: string;
   iocName?: string;
@@ -975,11 +999,6 @@ export type HostWithFqdn = {
   externalIdValid?: boolean;
   fqdn?: string;
 };
-export type Alert = {
-  type?: "ERROR" | "WARNING" | "INFO";
-  message?: string;
-  link?: string;
-};
 export type JobDetailsEntry = {
   iocName?: string;
   iocId?: number;
@@ -1150,6 +1169,8 @@ export const {
   useUpdateActiveDeploymentHostMutation,
   useFindAllRecordsQuery,
   useLazyFindAllRecordsQuery,
+  useFetchRecordAlertsQuery,
+  useLazyFetchRecordAlertsQuery,
   useGetRecordQuery,
   useLazyGetRecordQuery,
   useFetchIocByNameQuery,
-- 
GitLab


From 2eee4a5eefceac46d66c4df9d7ae588a825cb7a0 Mon Sep 17 00:00:00 2001
From: Sky Brewer <sky.brewer@ess.eu>
Date: Fri, 24 Jan 2025 15:42:27 +0100
Subject: [PATCH 06/12] Add alerts to record page

---
 src/views/records/RecordDetailsView.tsx | 18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/src/views/records/RecordDetailsView.tsx b/src/views/records/RecordDetailsView.tsx
index f6bcf93d..f568c608 100644
--- a/src/views/records/RecordDetailsView.tsx
+++ b/src/views/records/RecordDetailsView.tsx
@@ -7,7 +7,8 @@ import {
   GlobalAppBarContext,
   InternalLink,
   formatDateAndTime,
-  EmptyValue
+  EmptyValue,
+  AlertBannerList
 } from "@ess-ics/ce-ui-common";
 import { useParams, useNavigate } from "react-router-dom";
 import { Alias } from "./Alias";
@@ -15,7 +16,11 @@ import { RecordBadge } from "../../components/records/RecordBadge";
 import { applicationTitle } from "../../components/navigation/applicationTitle";
 import { NotFoundView } from "../../components/navigation/NotFoundView/NotFoundView";
 
-import { RecordDetails, useGetRecordQuery } from "../../store/deployApi";
+import {
+  RecordDetails,
+  useFetchRecordAlertsQuery,
+  useGetRecordQuery
+} from "../../store/deployApi";
 import { GlobalAppBarContext as GlobalAppBarContextType } from "../../types/common";
 import { getErrorState } from "../../components/common/Alerts/AlertsData";
 import { isNotFound } from "../../components/navigation/NotFoundView/isNotFound";
@@ -37,6 +42,12 @@ export function RecordDetailsView() {
     name: encodeURIComponent(decodedName)
   });
 
+  const { data: alert, error: alertError } = useFetchRecordAlertsQuery(
+    {
+      recordName: decodedName ?? ""
+    },
+    { skip: !decodedName }
+  );
   const navigate = useNavigate();
 
   const { setTitle } = useContext<GlobalAppBarContextType>(GlobalAppBarContext);
@@ -92,7 +103,7 @@ export function RecordDetailsView() {
     }
   }, []);
 
-  const { status } = getErrorState(fetchError);
+  const { status } = getErrorState(fetchError || alertError);
 
   if (decodedName.includes(";") || isNotFound(status)) {
     return <NotFoundView />;
@@ -118,6 +129,7 @@ export function RecordDetailsView() {
         </IconButton>
         {record && (
           <>
+            <AlertBannerList alerts={alert?.alerts ?? []} />
             <RecordBadge record={record} />
             <KeyValueTable
               obj={getSubset(record)}
-- 
GitLab


From 16148fcc2253c0111350c504ab5a9263d2475159 Mon Sep 17 00:00:00 2001
From: Sky Brewer <sky.brewer@ess.eu>
Date: Tue, 28 Jan 2025 14:44:10 +0100
Subject: [PATCH 07/12] Remove unneeded wrapper

---
 src/views/records/RecordDetailsView.tsx | 40 ++++++++++++-------------
 1 file changed, 19 insertions(+), 21 deletions(-)

diff --git a/src/views/records/RecordDetailsView.tsx b/src/views/records/RecordDetailsView.tsx
index f568c608..aad720cb 100644
--- a/src/views/records/RecordDetailsView.tsx
+++ b/src/views/records/RecordDetailsView.tsx
@@ -119,27 +119,25 @@ export function RecordDetailsView() {
 
   return (
     <RootPaper>
-      <>
-        <IconButton
-          color="inherit"
-          onClick={handleClick}
-          size="large"
-        >
-          <ArrowBackIcon />
-        </IconButton>
-        {record && (
-          <>
-            <AlertBannerList alerts={alert?.alerts ?? []} />
-            <RecordBadge record={record} />
-            <KeyValueTable
-              obj={getSubset(record)}
-              variant="overline"
-              sx={{ border: 0 }}
-              valueOptions={{ headerName: "" }}
-            />
-          </>
-        )}
-      </>
+      <IconButton
+        color="inherit"
+        onClick={handleClick}
+        size="large"
+      >
+        <ArrowBackIcon />
+      </IconButton>
+      {record && (
+        <>
+          <AlertBannerList alerts={alert?.alerts ?? []} />
+          <RecordBadge record={record} />
+          <KeyValueTable
+            obj={getSubset(record)}
+            variant="overline"
+            sx={{ border: 0 }}
+            valueOptions={{ headerName: "" }}
+          />
+        </>
+      )}
     </RootPaper>
   );
 }
-- 
GitLab


From 4a0789943832b1af5ede2d8518b675d83895499c Mon Sep 17 00:00:00 2001
From: Sky Brewer <sky.brewer@ess.eu>
Date: Tue, 28 Jan 2025 15:08:16 +0100
Subject: [PATCH 08/12] Remove using alertsError

---
 src/views/records/RecordDetailsView.tsx | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/views/records/RecordDetailsView.tsx b/src/views/records/RecordDetailsView.tsx
index aad720cb..bf1a3b4d 100644
--- a/src/views/records/RecordDetailsView.tsx
+++ b/src/views/records/RecordDetailsView.tsx
@@ -42,7 +42,7 @@ export function RecordDetailsView() {
     name: encodeURIComponent(decodedName)
   });
 
-  const { data: alert, error: alertError } = useFetchRecordAlertsQuery(
+  const { data: alert } = useFetchRecordAlertsQuery(
     {
       recordName: decodedName ?? ""
     },
@@ -103,7 +103,7 @@ export function RecordDetailsView() {
     }
   }, []);
 
-  const { status } = getErrorState(fetchError || alertError);
+  const { status } = getErrorState(fetchError);
 
   if (decodedName.includes(";") || isNotFound(status)) {
     return <NotFoundView />;
-- 
GitLab


From 27e93e10217a06ac974359c7586dda367e3bc052 Mon Sep 17 00:00:00 2001
From: Sky Brewer <sky.brewer@ess.eu>
Date: Tue, 28 Jan 2025 15:08:55 +0100
Subject: [PATCH 09/12] Move Aliases and Alias for together

---
 src/views/records/RecordDetailsView.tsx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/views/records/RecordDetailsView.tsx b/src/views/records/RecordDetailsView.tsx
index bf1a3b4d..6c135bc1 100644
--- a/src/views/records/RecordDetailsView.tsx
+++ b/src/views/records/RecordDetailsView.tsx
@@ -67,6 +67,7 @@ export function RecordDetailsView() {
       "Alias for": (
         <Alias aliases={record?.aliasFor ? [record?.aliasFor] : []} />
       ),
+      Aliases: <Alias aliases={record?.aliases} />,
       [DESCRIPTION]: record?.description || <EmptyValue />,
       Version: record?.iocVersion || <EmptyValue />,
       [RECORD_TYPE]: record.recordType || <EmptyValue />,
@@ -82,7 +83,6 @@ export function RecordDetailsView() {
       ) : (
         record?.hostName
       ),
-      Aliases: <Alias aliases={record?.aliases} />,
       [LAST_UPDATED]: "",
       [IOC_REVISION]: ""
     };
-- 
GitLab


From a0c8aa2c56915b66ed13e39a8a3cd1d313399f36 Mon Sep 17 00:00:00 2001
From: Sky Brewer <sky.brewer@ess.eu>
Date: Tue, 28 Jan 2025 15:54:43 +0100
Subject: [PATCH 10/12] Fix uri encoding of path variables

---
 src/views/records/RecordDetailsView.tsx | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/src/views/records/RecordDetailsView.tsx b/src/views/records/RecordDetailsView.tsx
index 6c135bc1..10cc0318 100644
--- a/src/views/records/RecordDetailsView.tsx
+++ b/src/views/records/RecordDetailsView.tsx
@@ -33,20 +33,21 @@ const IOC_REVISION = "IOC Revision";
 export function RecordDetailsView() {
   const { name } = useParams();
   const decodedName = decodeURIComponent(name ?? "");
+  const encodedName = encodeURIComponent(decodedName);
 
   const {
     data: record,
     error: fetchError,
     isLoading: recordLoading
   } = useGetRecordQuery({
-    name: encodeURIComponent(decodedName)
+    name: encodedName
   });
 
   const { data: alert } = useFetchRecordAlertsQuery(
     {
-      recordName: decodedName ?? ""
+      recordName: encodedName
     },
-    { skip: !decodedName }
+    { skip: !encodedName }
   );
   const navigate = useNavigate();
 
-- 
GitLab


From 474ad3ada23979d9cf8e22e130c460c94a3ca64d Mon Sep 17 00:00:00 2001
From: Sky Brewer <sky.brewer@ess.eu>
Date: Tue, 28 Jan 2025 15:58:52 +0100
Subject: [PATCH 11/12] Add some nice spacing

---
 src/views/records/RecordDetailsView.tsx | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/views/records/RecordDetailsView.tsx b/src/views/records/RecordDetailsView.tsx
index 10cc0318..50db05c0 100644
--- a/src/views/records/RecordDetailsView.tsx
+++ b/src/views/records/RecordDetailsView.tsx
@@ -1,5 +1,5 @@
 import { useEffect, useCallback, useContext } from "react";
-import { IconButton, Typography, LinearProgress } from "@mui/material";
+import { IconButton, Typography, LinearProgress, Stack } from "@mui/material";
 import ArrowBackIcon from "@mui/icons-material/ArrowBack";
 import {
   RootPaper,
@@ -128,7 +128,7 @@ export function RecordDetailsView() {
         <ArrowBackIcon />
       </IconButton>
       {record && (
-        <>
+        <Stack spacing={2}>
           <AlertBannerList alerts={alert?.alerts ?? []} />
           <RecordBadge record={record} />
           <KeyValueTable
@@ -137,7 +137,7 @@ export function RecordDetailsView() {
             sx={{ border: 0 }}
             valueOptions={{ headerName: "" }}
           />
-        </>
+        </Stack>
       )}
     </RootPaper>
   );
-- 
GitLab


From 2fc1c63d1a9880a4047d702891d22c828443abac Mon Sep 17 00:00:00 2001
From: Sky Brewer <sky.brewer@ess.eu>
Date: Wed, 29 Jan 2025 10:14:51 +0100
Subject: [PATCH 12/12] Fix alias stack

---
 src/views/records/Alias.tsx | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/src/views/records/Alias.tsx b/src/views/records/Alias.tsx
index f8cf4ad7..6829b9d9 100644
--- a/src/views/records/Alias.tsx
+++ b/src/views/records/Alias.tsx
@@ -9,18 +9,14 @@ export const Alias = ({ aliases }: { aliases?: string[] }) => {
   }
 
   return (
-    <Stack
-      direction="row"
-      gap={1.5}
-      flexWrap="wrap"
-    >
+    <Stack gap={0.5}>
       {aliases.map((alias, index) => (
         <InternalLink
           key={itemsKeys[index]}
           to={`/records/${encodeURIComponent(alias)}`}
           label={alias}
         >
-          {`${alias}${index < aliases.length - 1 && aliases.length > 1 ? "," : ""}`}
+          {alias}
         </InternalLink>
       ))}
     </Stack>
-- 
GitLab