diff --git a/next.config.ts b/next.config.ts index a2dd57ac..7a38b878 100644 --- a/next.config.ts +++ b/next.config.ts @@ -2,6 +2,14 @@ import type { NextConfig } from "next"; const nextConfig: NextConfig = { output: "standalone", + async redirects() { + // Admin surfaces were consolidated under /admin. Keep old bookmarks working. + return [ + { source: "/settings", destination: "/admin", permanent: false }, + { source: "/ontology", destination: "/admin/ontology", permanent: false }, + { source: "/domains", destination: "/admin/domains", permanent: false }, + ] + }, async headers() { return [ { diff --git a/src/app/admin/(console)/activity/page.tsx b/src/app/admin/(console)/activity/page.tsx new file mode 100644 index 00000000..2036291c --- /dev/null +++ b/src/app/admin/(console)/activity/page.tsx @@ -0,0 +1,12 @@ +"use client" + +import dynamic from "next/dynamic" + +const ActivitySettings = dynamic( + () => import("@/components/admin/activity-settings").then((m) => m.ActivitySettings), + { ssr: false, loading: () =>

Loading…

} +) + +export default function ActivityPage() { + return +} diff --git a/src/app/admin/(console)/appearance/page.tsx b/src/app/admin/(console)/appearance/page.tsx new file mode 100644 index 00000000..be2cfa21 --- /dev/null +++ b/src/app/admin/(console)/appearance/page.tsx @@ -0,0 +1,12 @@ +"use client" + +import dynamic from "next/dynamic" + +const AppearanceSettings = dynamic( + () => import("@/components/admin/appearance-settings").then((m) => m.AppearanceSettings), + { ssr: false, loading: () =>

Loading…

} +) + +export default function AppearancePage() { + return +} diff --git a/src/app/admin/(console)/audit/page.tsx b/src/app/admin/(console)/audit/page.tsx new file mode 100644 index 00000000..ccd150d8 --- /dev/null +++ b/src/app/admin/(console)/audit/page.tsx @@ -0,0 +1,12 @@ +"use client" + +import dynamic from "next/dynamic" + +const SchemaAuditSettings = dynamic( + () => import("@/components/admin/schema-audit").then((m) => m.SchemaAuditSettings), + { ssr: false, loading: () =>

Loading…

} +) + +export default function AuditPage() { + return +} diff --git a/src/app/admin/(console)/general/page.tsx b/src/app/admin/(console)/general/page.tsx new file mode 100644 index 00000000..65fceff6 --- /dev/null +++ b/src/app/admin/(console)/general/page.tsx @@ -0,0 +1,86 @@ +"use client" + +import { useCallback, useEffect, useState } from "react" +import { Button } from "@/components/ui/button" +import { Input } from "@/components/ui/input" +import { Label } from "@/components/ui/label" +import { MAX_LENGTHS } from "@/lib/input-limits" +import { useAppStore } from "@/stores/app-store" +import { api } from "@/lib/api" + +export default function GeneralSettingsPage() { + const { graphName, graphDescription, setGraphMeta } = useAppStore() + + const [name, setName] = useState(graphName) + const [description, setDescription] = useState(graphDescription) + const [saving, setSaving] = useState(false) + + // Sync local form state when global meta changes (e.g. after load) + useEffect(() => { + setName(graphName) + setDescription(graphDescription) + }, [graphName, graphDescription]) + + const handleSave = useCallback(async () => { + setSaving(true) + try { + await api.post("/about", { title: name, description }) + setGraphMeta(name, description) + } catch (err) { + console.error("Failed to save settings:", err) + } finally { + setSaving(false) + } + }, [name, description, setGraphMeta]) + + const handleCancel = useCallback(() => { + setName(graphName) + setDescription(graphDescription) + }, [graphName, graphDescription]) + + return ( +
+

General

+ +
+ + setName(e.target.value)} + maxLength={MAX_LENGTHS.GRAPH_NAME} + className="bg-muted/50 border-border/50 focus:border-primary/40" + /> +
+ +
+ +