diff --git a/ui/package.json b/ui/package.json
index c9b38c70cd00..e792561ee376 100644
--- a/ui/package.json
+++ b/ui/package.json
@@ -82,7 +82,7 @@
"@types/leaflet.markercluster": "^1.5.1",
"@types/lodash": "^4.14.196",
"@types/marked": "^4.0.3",
- "@types/node": "18",
+ "@types/node": ">=18",
"@types/splitpanes": "^2.2.1",
"@typescript-eslint/eslint-plugin": "^6.2.1",
"@typescript-eslint/parser": "^6.2.1",
@@ -95,7 +95,7 @@
"eslint-plugin-vue": "^9.16.1",
"happy-dom": "^9.20.3",
"prettier": "^2.8.8",
- "typescript": "^4.9.4",
+ "typescript": "^5.2.2",
"unplugin-auto-import": "^0.12.1",
"unplugin-vue-components": "^0.22.12",
"vite": "^4.3.9",
diff --git a/ui/src/App.vue b/ui/src/App.vue
index 23b3b6d4f2f3..b29fe67360dd 100644
--- a/ui/src/App.vue
+++ b/ui/src/App.vue
@@ -32,10 +32,12 @@ import { useAuthStore } from '@/stores/authStore'
import { useInfoStore } from '@/stores/infoStore'
import { usePluginStore } from '@/stores/pluginStore'
import { useMenuStore } from '@/stores/menuStore'
+import { useNodeStructureStore } from '@/stores/nodeStructureStore'
const authStore = useAuthStore()
const infoStore = useInfoStore()
const menuStore = useMenuStore()
+const nodeStructureStore = useNodeStructureStore()
const pluginStore = usePluginStore()
onMounted(() => {
@@ -43,6 +45,8 @@ onMounted(() => {
infoStore.getInfo()
menuStore.getMainMenu()
menuStore.getNotificationSummary()
+ nodeStructureStore.getCategories()
+ nodeStructureStore.getMonitoringLocations()
pluginStore.getPlugins()
})
diff --git a/ui/src/components/Nodes/ManagementIPTooltipCell.vue b/ui/src/components/Nodes/ManagementIPTooltipCell.vue
index 1d1548481b66..d7dc13327149 100644
--- a/ui/src/components/Nodes/ManagementIPTooltipCell.vue
+++ b/ui/src/components/Nodes/ManagementIPTooltipCell.vue
@@ -16,7 +16,10 @@
import { IpInterface, Node } from '@/types'
import { FeatherTooltip, PointerAlignment, PopoverPlacement } from '@featherds/tooltip'
import { PropType } from 'vue'
-import { IpInterfaceInfo, getBestIpInterfaceForNode } from './utils'
+import { IpInterfaceInfo } from '@/types'
+import { useIpInterfaceQuery } from '@/components/Nodes/hooks/useIpInterfaceQuery'
+
+const { getBestIpInterfaceForNode } = useIpInterfaceQuery()
const props = defineProps({
computeNodeIpInterfaceLink: {
diff --git a/ui/src/components/Nodes/NodeDetailsDialog.vue b/ui/src/components/Nodes/NodeDetailsDialog.vue
index f55945582ec8..cd8504c5ec20 100644
--- a/ui/src/components/Nodes/NodeDetailsDialog.vue
+++ b/ui/src/components/Nodes/NodeDetailsDialog.vue
@@ -17,7 +17,8 @@