diff --git a/frontend-modern/src/App.tsx b/frontend-modern/src/App.tsx index c7806c348..64badb006 100644 --- a/frontend-modern/src/App.tsx +++ b/frontend-modern/src/App.tsx @@ -1,4 +1,4 @@ -import { Show, createSignal, createContext, useContext, createEffect, onMount, onCleanup } from 'solid-js'; +import { Show, createSignal, createContext, useContext, createEffect, onMount, onCleanup, getOwner, runWithOwner } from 'solid-js'; import { getGlobalWebSocketStore } from './stores/websocket-global'; import { Dashboard } from './components/Dashboard/Dashboard'; import StorageComponent from './components/Storage/Storage'; @@ -46,6 +46,9 @@ export const useDarkMode = () => { }; function App() { + const owner = getOwner(); + const acquireWsStore = () => (owner ? runWithOwner(owner, () => getGlobalWebSocketStore()) : getGlobalWebSocketStore()); + // Simple auth state const [isLoading, setIsLoading] = createSignal(true); const [needsAuth, setNeedsAuth] = createSignal(false); @@ -189,7 +192,7 @@ function App() { setHasAuth(false); setNeedsAuth(false); // Initialize WebSocket immediately since no auth needed - setWsStore(getGlobalWebSocketStore()); + setWsStore(acquireWsStore()); // Load theme preference from server for cross-device sync // Only use server preference if no local preference exists @@ -237,7 +240,7 @@ function App() { }); setNeedsAuth(false); // Initialize WebSocket for proxy auth users - setWsStore(getGlobalWebSocketStore()); + setWsStore(acquireWsStore()); // Load theme preference from server for cross-device sync // Only use server preference if no local preference exists @@ -294,7 +297,7 @@ function App() { } else { setNeedsAuth(false); // Only initialize WebSocket after successful auth check - setWsStore(getGlobalWebSocketStore()); + setWsStore(acquireWsStore()); // Load theme preference from server for cross-device sync // Only use server preference if no local preference exists @@ -324,7 +327,7 @@ function App() { console.error('Auth check error:', error); // On error, try to proceed without auth setNeedsAuth(false); - setWsStore(getGlobalWebSocketStore()); + setWsStore(acquireWsStore()); // Theme is already applied on initialization, no need to reapply } finally { diff --git a/frontend-modern/src/components/Alerts/ResourceTable.tsx b/frontend-modern/src/components/Alerts/ResourceTable.tsx index 800ff03fa..509f20e84 100644 --- a/frontend-modern/src/components/Alerts/ResourceTable.tsx +++ b/frontend-modern/src/components/Alerts/ResourceTable.tsx @@ -71,10 +71,7 @@ export function ResourceTable(props: ResourceTableProps) {
| Resource Type | -CPU % |
- Memory % |
- Disk % |
- Storage % |
- Disk Read MB/s |
- Disk Write MB/s |
- Net In MB/s |
- Net Out MB/s |
-
|---|---|---|---|---|---|---|---|---|
| VMs & Containers | -- { - props.setGuestDefaults((prev) => ({...prev, cpu: parseInt(e.currentTarget.value) || 0})); - props.setHasUnsavedChanges(true); - }} - class="w-16 px-2 py-1 text-sm text-center border border-gray-300 dark:border-gray-600 rounded - bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-blue-500 focus:border-transparent" - /> - | -- { - props.setGuestDefaults((prev) => ({...prev, memory: parseInt(e.currentTarget.value) || 0})); - props.setHasUnsavedChanges(true); - }} - class="w-16 px-2 py-1 text-sm text-center border border-gray-300 dark:border-gray-600 rounded - bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-blue-500 focus:border-transparent" - /> - | -- { - props.setGuestDefaults((prev) => ({...prev, disk: parseInt(e.currentTarget.value) || 0})); - props.setHasUnsavedChanges(true); - }} - class="w-16 px-2 py-1 text-sm text-center border border-gray-300 dark:border-gray-600 rounded - bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-blue-500 focus:border-transparent" - /> - | -- | -- { - props.setGuestDefaults((prev) => ({...prev, diskRead: parseInt(e.currentTarget.value) || 0})); - props.setHasUnsavedChanges(true); - }} - class="w-16 px-2 py-1 text-sm text-center border border-gray-300 dark:border-gray-600 rounded - bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-blue-500 focus:border-transparent" - /> - | -- { - props.setGuestDefaults((prev) => ({...prev, diskWrite: parseInt(e.currentTarget.value) || 0})); - props.setHasUnsavedChanges(true); - }} - class="w-16 px-2 py-1 text-sm text-center border border-gray-300 dark:border-gray-600 rounded - bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-blue-500 focus:border-transparent" - /> - | -- { - props.setGuestDefaults((prev) => ({...prev, networkIn: parseInt(e.currentTarget.value) || 0})); - props.setHasUnsavedChanges(true); - }} - class="w-16 px-2 py-1 text-sm text-center border border-gray-300 dark:border-gray-600 rounded - bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-blue-500 focus:border-transparent" - /> - | -- { - props.setGuestDefaults((prev) => ({...prev, networkOut: parseInt(e.currentTarget.value) || 0})); - props.setHasUnsavedChanges(true); - }} - class="w-16 px-2 py-1 text-sm text-center border border-gray-300 dark:border-gray-600 rounded - bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-blue-500 focus:border-transparent" - /> - | -
| Proxmox Nodes | -- { - props.setNodeDefaults((prev) => ({...prev, cpu: parseInt(e.currentTarget.value) || 0})); - props.setHasUnsavedChanges(true); - }} - class="w-16 px-2 py-1 text-sm text-center border border-gray-300 dark:border-gray-600 rounded - bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-blue-500 focus:border-transparent" - /> - | -- { - props.setNodeDefaults((prev) => ({...prev, memory: parseInt(e.currentTarget.value) || 0})); - props.setHasUnsavedChanges(true); - }} - class="w-16 px-2 py-1 text-sm text-center border border-gray-300 dark:border-gray-600 rounded - bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-blue-500 focus:border-transparent" - /> - | -- { - props.setNodeDefaults((prev) => ({...prev, disk: parseInt(e.currentTarget.value) || 0})); - props.setHasUnsavedChanges(true); - }} - class="w-16 px-2 py-1 text-sm text-center border border-gray-300 dark:border-gray-600 rounded - bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-blue-500 focus:border-transparent" - /> - | -- | -- | -- | -- | -- | -
| Storage | -- | -- | -- | -- { - props.setStorageDefault(parseInt(e.currentTarget.value) || 0); - props.setHasUnsavedChanges(true); - }} - class="w-16 px-2 py-1 text-sm text-center border border-gray-300 dark:border-gray-600 rounded - bg-white dark:bg-gray-700 text-gray-900 dark:text-gray-100 focus:ring-2 focus:ring-blue-500 focus:border-transparent" - /> - | -- | -- | -- | -- | -