From 2b1ed57cebef1388061cc74840d431bf087ec2e4 Mon Sep 17 00:00:00 2001 From: Rassl Date: Thu, 25 Jun 2026 19:50:01 +0400 Subject: [PATCH] feat: standalone admin --- next.config.ts | 8 + src/app/admin/(console)/activity/page.tsx | 12 + src/app/admin/(console)/appearance/page.tsx | 12 + src/app/admin/(console)/audit/page.tsx | 12 + src/app/admin/(console)/general/page.tsx | 86 ++++ src/app/admin/(console)/janitors/page.tsx | 12 + src/app/admin/(console)/layout.tsx | 145 +++++++ src/app/admin/(console)/page.tsx | 66 ++++ src/app/admin/(console)/schedule/page.tsx | 12 + src/app/{ => admin}/domains/domain-panel.tsx | 80 ++-- src/app/{ => admin}/domains/page.tsx | 46 ++- src/app/admin/layout.tsx | 25 ++ .../{ => admin}/ontology/edge-type-panel.tsx | 2 +- src/app/{ => admin}/ontology/mock-large.ts | 2 +- src/app/{ => admin}/ontology/mock-small.ts | 2 +- .../ontology/ontology-graph-3d.tsx | 2 +- .../{ => admin}/ontology/ontology-graph.tsx | 2 +- src/app/{ => admin}/ontology/page.tsx | 54 +-- src/app/{ => admin}/ontology/type-editor.tsx | 2 +- src/app/admin/reviews/page.tsx | 11 +- src/app/settings/page.tsx | 245 ------------ .../admin/activity-settings.tsx} | 0 .../admin}/appearance-settings.tsx | 0 src/components/admin/review-row.tsx | 2 +- .../admin}/schema-audit.tsx | 0 src/components/agent/message-list.tsx | 2 +- src/components/feed/feed-card.tsx | 2 +- src/components/layout/app-layout.tsx | 2 +- src/components/layout/attachable-embeds.tsx | 2 +- src/components/layout/connections-section.tsx | 2 +- src/components/layout/node-preview-panel.tsx | 2 +- src/components/layout/node-row.tsx | 2 +- src/components/layout/toolkit.tsx | 14 +- src/components/modals/add-node-form.tsx | 2 +- src/components/modals/domain-settings.tsx | 327 --------------- src/components/modals/edit-node-modal.tsx | 2 +- src/components/universe/graph-canvas.tsx | 2 +- .../universe/hover-preview-card.tsx | 2 +- src/lib/__tests__/admin-general-page.test.tsx | 83 ++++ src/lib/__tests__/admin-guard.test.tsx | 69 ++++ src/lib/__tests__/domain-panel.test.tsx | 30 +- src/lib/__tests__/edge-type-view.test.tsx | 4 +- src/lib/__tests__/hover-preview-card.test.tsx | 2 +- src/lib/__tests__/node-display.test.ts | 2 +- src/lib/__tests__/node-remap.test.ts | 2 +- src/lib/__tests__/node-schema-utils.test.ts | 2 +- src/lib/__tests__/schema-audit.test.tsx | 2 +- src/lib/__tests__/settings-page.test.tsx | 373 ------------------ src/lib/__tests__/skin-system.test.tsx | 6 +- src/lib/__tests__/toolkit-fab.test.tsx | 18 +- src/lib/__tests__/type-editor.test.tsx | 4 +- src/lib/node-display.ts | 2 +- src/lib/node-remap.ts | 2 +- src/lib/node-schema-utils.ts | 2 +- src/lib/schema-types.ts | 46 +++ src/stores/schema-store.ts | 2 +- vitest.config.ts | 5 +- 57 files changed, 760 insertions(+), 1099 deletions(-) create mode 100644 src/app/admin/(console)/activity/page.tsx create mode 100644 src/app/admin/(console)/appearance/page.tsx create mode 100644 src/app/admin/(console)/audit/page.tsx create mode 100644 src/app/admin/(console)/general/page.tsx create mode 100644 src/app/admin/(console)/janitors/page.tsx create mode 100644 src/app/admin/(console)/layout.tsx create mode 100644 src/app/admin/(console)/page.tsx create mode 100644 src/app/admin/(console)/schedule/page.tsx rename src/app/{ => admin}/domains/domain-panel.tsx (78%) rename src/app/{ => admin}/domains/page.tsx (92%) create mode 100644 src/app/admin/layout.tsx rename src/app/{ => admin}/ontology/edge-type-panel.tsx (98%) rename src/app/{ => admin}/ontology/mock-large.ts (99%) rename src/app/{ => admin}/ontology/mock-small.ts (99%) rename src/app/{ => admin}/ontology/ontology-graph-3d.tsx (99%) rename src/app/{ => admin}/ontology/ontology-graph.tsx (99%) rename src/app/{ => admin}/ontology/page.tsx (87%) rename src/app/{ => admin}/ontology/type-editor.tsx (99%) delete mode 100644 src/app/settings/page.tsx rename src/{app/settings/activity.tsx => components/admin/activity-settings.tsx} (100%) rename src/{app/settings => components/admin}/appearance-settings.tsx (100%) rename src/{app/settings => components/admin}/schema-audit.tsx (100%) delete mode 100644 src/components/modals/domain-settings.tsx create mode 100644 src/lib/__tests__/admin-general-page.test.tsx create mode 100644 src/lib/__tests__/admin-guard.test.tsx delete mode 100644 src/lib/__tests__/settings-page.test.tsx create mode 100644 src/lib/schema-types.ts 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" + /> +
+ +
+ +