From 264177075afc84e645cd170d77d808702896698f Mon Sep 17 00:00:00 2001 From: Floris Date: Mon, 27 Apr 2026 22:21:04 +0200 Subject: [PATCH 1/9] chore: add package.json for workspace management and script definitions Co-authored-by: Copilot --- dashboard/app/config/page.tsx | 119 ++ dashboard/app/globals.css | 209 +-- dashboard/app/layout.tsx | 16 +- dashboard/app/monitors/page.tsx | 289 ++++ dashboard/app/page.tsx | 618 ++++----- dashboard/app/stories/page.tsx | 129 ++ dashboard/components/MonitorForm.tsx | 436 ++++++ dashboard/components/ResultsDrawer.tsx | 103 ++ dashboard/components/Sidebar.tsx | 56 + dashboard/components/ToastProvider.tsx | 29 + dashboard/globals.d.ts | 1 + dashboard/lib/api.ts | 105 ++ dashboard/lib/types.ts | 70 + dashboard/next.config.mjs | 4 +- dashboard/package.json | 15 +- dashboard/pnpm-lock.yaml | 1681 ++++++++++++++++++++++++ dashboard/postcss.config.mjs | 5 + dashboard/tsconfig.json | 11 +- dashboard/tsconfig.tsbuildinfo | 1 + package.json | 13 + 20 files changed, 3392 insertions(+), 518 deletions(-) create mode 100644 dashboard/app/config/page.tsx create mode 100644 dashboard/app/monitors/page.tsx create mode 100644 dashboard/app/stories/page.tsx create mode 100644 dashboard/components/MonitorForm.tsx create mode 100644 dashboard/components/ResultsDrawer.tsx create mode 100644 dashboard/components/Sidebar.tsx create mode 100644 dashboard/components/ToastProvider.tsx create mode 100644 dashboard/globals.d.ts create mode 100644 dashboard/lib/api.ts create mode 100644 dashboard/lib/types.ts create mode 100644 dashboard/pnpm-lock.yaml create mode 100644 dashboard/postcss.config.mjs create mode 100644 dashboard/tsconfig.tsbuildinfo create mode 100644 package.json diff --git a/dashboard/app/config/page.tsx b/dashboard/app/config/page.tsx new file mode 100644 index 0000000..de149ad --- /dev/null +++ b/dashboard/app/config/page.tsx @@ -0,0 +1,119 @@ +"use client"; + +import { useCallback, useEffect, useState } from "react"; +import { Button, Spinner } from "@heroui/react"; +import { Icon } from "@iconify/react"; +import { useToast } from "@/components/ToastProvider"; +import { restartServer } from "@/lib/api"; + +export default function ConfigPage() { + const { toast } = useToast(); + const [yaml, setYaml] = useState(""); + const [loading, setLoading] = useState(true); + const [saving, setSaving] = useState(false); + const [restarting, setRestarting] = useState(false); + + const loadConfig = useCallback(async () => { + try { + const res = await fetch("/api/config"); + if (!res.ok) throw new Error(await res.text()); + setYaml(await res.text()); + } catch (err) { + toast(String(err), { variant: "danger" }); + } finally { + setLoading(false); + } + }, [toast]); + + useEffect(() => { + loadConfig(); + }, [loadConfig]); + + async function handleSave() { + setSaving(true); + try { + const res = await fetch("/api/config", { + method: "PUT", + headers: { "Content-Type": "text/yaml" }, + body: yaml, + }); + if (!res.ok) throw new Error(await res.text()); + toast("Config saved. Restart to apply changes.", { variant: "success" }); + } catch (err) { + toast(String(err), { variant: "danger" }); + } finally { + setSaving(false); + } + } + + async function handleRestart() { + if (!confirm("Restart the monitoring service?")) return; + setRestarting(true); + try { + await restartServer(); + toast("Restart signal sent.", { variant: "success" }); + } catch (err) { + toast(String(err), { variant: "danger" }); + } finally { + setRestarting(false); + } + } + + return ( +
+
+
+

Config

+

+ Raw YAML configuration — edits here require a restart +

+
+
+ + + +
+
+ + {loading ? ( +
+ +
+ ) : ( +
+
+ + xbp.yml +
+