diff --git a/client/pages/ProjectsAdmin.tsx b/client/pages/ProjectsAdmin.tsx new file mode 100644 index 00000000..ac192e37 --- /dev/null +++ b/client/pages/ProjectsAdmin.tsx @@ -0,0 +1,129 @@ +import Layout from "@/components/Layout"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; +import { Input } from "@/components/ui/input"; +import { Textarea } from "@/components/ui/textarea"; +import { supabase } from "@/lib/supabase"; +import { useAuth } from "@/contexts/AuthContext"; +import { useEffect, useState } from "react"; + +interface Link { label: string; href: string } +interface Contributor { name: string; title?: string; avatar?: string } + +export default function ProjectsAdmin() { + const { user } = useAuth(); + const isOwner = user?.email?.toLowerCase() === "mrpiglr@gmail.com"; + const [list, setList] = useState([]); + const [loading, setLoading] = useState(false); + const [draft, setDraft] = useState({ title: "", org_unit: "Studio", timeframe: "", description: "", tags: "" }); + + useEffect(() => { + if (!isOwner) return; + setLoading(true); + supabase + .from("showcase_projects" as any) + .select("id,title,org_unit,role,timeframe,description,tags") + .order("created_at", { ascending: false }) + .then(({ data }) => setList(data || [])) + .finally(() => setLoading(false)); + }, [isOwner]); + + const create = async () => { + const tags = (draft.tags || "").split(",").map((s: string) => s.trim()).filter(Boolean); + const { error } = await supabase.from("showcase_projects" as any).insert({ + title: draft.title, + org_unit: draft.org_unit, + role: "AeThex", + timeframe: draft.timeframe || null, + description: draft.description || null, + tags, + }); + if (!error) { + setDraft({ title: "", org_unit: "Studio", timeframe: "", description: "", tags: "" }); + const { data } = await supabase.from("showcase_projects" as any).select("id,title,org_unit,role,timeframe,description,tags").order("created_at", { ascending: false }); + setList(data || []); + } + }; + + if (!isOwner) { + return ( + +
+
+ + + Access denied + Owner account required. + + +
+
+
+ ); + } + + return ( + +
+
+
+
+ Admin +

Projects Admin

+

Create and manage showcase entries (Supabase)

+
+ +
+
+ +
+ + + New project + Title and basics + + + setDraft({ ...draft, title: e.target.value })} /> +
+ + setDraft({ ...draft, timeframe: e.target.value })} /> +
+