From c5ba7aae08623e687d943fcda33dccba78961c5a Mon Sep 17 00:00:00 2001 From: ibs0d <53568938+ibs0d@users.noreply.github.com> Date: Sat, 7 Mar 2026 20:45:17 +1100 Subject: [PATCH] Fix recording roots UI usage and filesystem labels --- web/public/locales/en/views/system.json | 18 +++++++++--------- web/src/components/storage/RecordingsRoots.tsx | 12 +++++++++--- .../storage/__tests__/RecordingsRoots.test.tsx | 16 ++++++++++++---- 3 files changed, 30 insertions(+), 16 deletions(-) diff --git a/web/public/locales/en/views/system.json b/web/public/locales/en/views/system.json index 70939e8be..dfb0c07c9 100644 --- a/web/public/locales/en/views/system.json +++ b/web/public/locales/en/views/system.json @@ -128,15 +128,15 @@ "storage": { "title": "Storage", "overview": "Overview", - "recordings": { - "title": "Recordings", - "tips": "This value represents the total storage used by the recordings in Frigate's database. Frigate does not track storage usage for all files on your disk.", - "earliestRecording": "Earliest recording available:", - "roots": "Recording Roots", - "nonDefault": "Non-default root", - "rootSummary": "Disk used: {{used}} MiB • Free: {{free}} MiB • Usage: {{usage_percent}}%", - "rootCameras": "Cameras: {{cameras}}" - }, + "recordings": { + "title": "Recordings", + "tips": "This value represents the total storage used by the recordings in Frigate's database. Frigate does not track storage usage for all files on your disk.", + "earliestRecording": "Earliest recording available:", + "roots": "Recording Roots", + "rootSummary": "Disk used: {{used}} MiB \u2022 Free: {{free}} MiB \u2022 Usage: {{usage_percent}}%", + "rootCameras": "Cameras: {{cameras}}", + "recordingsTracked": "Frigate recordings tracked: {{recordings_size}} MiB" + }, "shm": { "title": "SHM (shared memory) allocation", "warning": "The current SHM size of {{total}}MB is too small. Increase it to at least {{min_shm}}MB." diff --git a/web/src/components/storage/RecordingsRoots.tsx b/web/src/components/storage/RecordingsRoots.tsx index 721f30810..869b4eaaf 100644 --- a/web/src/components/storage/RecordingsRoots.tsx +++ b/web/src/components/storage/RecordingsRoots.tsx @@ -20,6 +20,7 @@ export type RecordingRootStorage = { cameras: string[]; camera_usages: RootCameraStorage; is_default: boolean; + filesystem?: string; }; export function RecordingsRoots({ roots }: { roots: RecordingRootStorage[] }) { @@ -36,15 +37,15 @@ export function RecordingsRoots({ roots }: { roots: RecordingRootStorage[] }) { >
{root.path}
- {!root.is_default && ( + {root.filesystem && (
- {t("storage.recordings.nonDefault")} + {root.filesystem}
)}
@@ -54,6 +55,11 @@ export function RecordingsRoots({ roots }: { roots: RecordingRootStorage[] }) { usage_percent: root.usage_percent.toFixed(2), })}
+
+ {t("storage.recordings.recordingsTracked", { + recordings_size: root.recordings_size, + })} +
{t("storage.recordings.rootCameras", { cameras: diff --git a/web/src/components/storage/__tests__/RecordingsRoots.test.tsx b/web/src/components/storage/__tests__/RecordingsRoots.test.tsx index ffa722933..cfe6f3603 100644 --- a/web/src/components/storage/__tests__/RecordingsRoots.test.tsx +++ b/web/src/components/storage/__tests__/RecordingsRoots.test.tsx @@ -5,11 +5,13 @@ import { RecordingsRoots, type RecordingRootStorage } from "../RecordingsRoots"; vi.mock("react-i18next", () => ({ useTranslation: () => ({ - t: (key: string, opts?: Record) => { - if (key === "storage.recordings.nonDefault") return "Non-default root"; + t: (key: string, opts?: Record) => { if (key === "storage.recordings.rootSummary") { return `Disk used: ${opts?.used} MiB • Free: ${opts?.free} MiB • Usage: ${opts?.usage_percent}%`; } + if (key === "storage.recordings.recordingsTracked") { + return `Frigate recordings tracked: ${opts?.recordings_size} MiB`; + } if (key === "storage.recordings.rootCameras") { return `Cameras: ${opts?.cameras}`; } @@ -20,7 +22,7 @@ vi.mock("react-i18next", () => ({ })); describe("RecordingsRoots", () => { - it("renders multiple roots and per-camera usage", () => { + it("renders multiple roots, filesystem details, and per-camera usage", () => { const roots: RecordingRootStorage[] = [ { path: "/media/frigate/recordings", @@ -31,6 +33,7 @@ describe("RecordingsRoots", () => { recordings_size: 600, cameras: ["front_door"], is_default: true, + filesystem: "ext4 • /media/frigate", camera_usages: { front_door: { bandwidth: 5, usage: 600, usage_percent: 100 }, }, @@ -44,6 +47,7 @@ describe("RecordingsRoots", () => { recordings_size: 800, cameras: ["back_yard", "garage"], is_default: false, + filesystem: "xfs • /mnt", camera_usages: { back_yard: { bandwidth: 4, usage: 300, usage_percent: 37.5 }, garage: { bandwidth: 6, usage: 500, usage_percent: 62.5 }, @@ -55,7 +59,11 @@ describe("RecordingsRoots", () => { expect(html).toContain("/media/frigate/recordings"); expect(html).toContain("/mnt/custom-recordings"); - expect(html).toContain("Non-default root"); + expect(html).toContain("ext4 • /media/frigate"); + expect(html).toContain("xfs • /mnt"); + expect(html).not.toContain("Non-default root"); + expect(html).toContain("Disk used: 700 MiB • Free: 300 MiB • Usage: 70.00%"); + expect(html).toContain("Frigate recordings tracked: 600 MiB"); expect(html).toContain("Cameras: back yard, garage"); expect(html).toContain("garage"); });