From 6f7d65bcdaca3c9ac09595b82f6a7e863d8f71cc Mon Sep 17 00:00:00 2001 From: headlesdev Date: Sun, 18 May 2025 21:50:33 +0200 Subject: [PATCH] Edit & Delete Site --- app/api/sites/delete/route.ts | 7 +- app/api/sites/edit/route.ts | 8 +- app/dashboard/sites/[siteId]/SitePage.tsx | 24 +++++- components/dialogues/DeleteSite.tsx | 54 ++++++++++++++ components/dialogues/EditSite.tsx | 91 +++++++++++++++++++++++ hooks/useSite.ts | 23 ++++++ 6 files changed, 197 insertions(+), 10 deletions(-) create mode 100644 components/dialogues/DeleteSite.tsx create mode 100644 components/dialogues/EditSite.tsx diff --git a/app/api/sites/delete/route.ts b/app/api/sites/delete/route.ts index bd16574..ff6dd87 100644 --- a/app/api/sites/delete/route.ts +++ b/app/api/sites/delete/route.ts @@ -1,13 +1,10 @@ import { NextRequest, NextResponse } from "next/server"; import prisma from "@/app/prisma"; -interface Body { - siteId: string; -} export async function DELETE(request: NextRequest) { - const body: Body = await request.json(); - const { siteId } = body; + const searchParams = request.nextUrl.searchParams; + const siteId = searchParams.get("siteId"); try { const site = await prisma.site.delete({ diff --git a/app/api/sites/edit/route.ts b/app/api/sites/edit/route.ts index a81325c..882dd07 100644 --- a/app/api/sites/edit/route.ts +++ b/app/api/sites/edit/route.ts @@ -1,19 +1,21 @@ import { NextRequest, NextResponse } from "next/server"; import prisma from "@/app/prisma"; +import { Network } from "@/app/types"; interface Body { - siteId: string; + id: string; name: string; description: string; + networks: Network[]; } export async function POST(request: NextRequest) { const body: Body = await request.json(); - const { siteId, name, description } = body; + const { id, name, description, networks } = body; try { const site = await prisma.site.update({ - where: { id: Number(siteId) }, + where: { id: Number(id) }, data: { name, description }, }); diff --git a/app/dashboard/sites/[siteId]/SitePage.tsx b/app/dashboard/sites/[siteId]/SitePage.tsx index c2715bd..04d8e3d 100644 --- a/app/dashboard/sites/[siteId]/SitePage.tsx +++ b/app/dashboard/sites/[siteId]/SitePage.tsx @@ -7,6 +7,8 @@ import AddNetwork from "@/components/dialogues/AddNetwork" import { Plus, Pencil, Trash, Info, Building2, Network as NetworkIcon, Globe, Cpu } from "lucide-react" import EditNetwork from "@/components/dialogues/EditNetwork" import DeleteNetwork from "@/components/dialogues/DeleteNetwork" +import EditSite from "@/components/dialogues/EditSite" +import DeleteSite from "@/components/dialogues/DeleteSite" interface SitesPageProps { username: string @@ -31,8 +33,24 @@ export default function SitesPage({ username, name, siteId }: SitesPageProps) {
-

Site - {site.name}

-
+

Site - {site.name}

+
+ {isEditMode && ( + <> + + + + )}
@@ -132,6 +150,8 @@ export default function SitesPage({ username, name, siteId }: SitesPageProps) {
+ +
diff --git a/components/dialogues/DeleteSite.tsx b/components/dialogues/DeleteSite.tsx new file mode 100644 index 0000000..6205b86 --- /dev/null +++ b/components/dialogues/DeleteSite.tsx @@ -0,0 +1,54 @@ +"use client"; +import axios from "axios" +import { useRouter } from "next/navigation" +import { Trash2, AlertTriangle } from "lucide-react"; +import useSite from "@/hooks/useSite"; + +interface DeleteSiteProps { + siteId: string; +} + +export default function DeleteSite({ siteId }: DeleteSiteProps) { + const router = useRouter() + const { deleteSite } = useSite() + + return ( +
+ +
+
+
+ +
+

Delete Site

+
+ +
+

+ Are you sure you want to delete this site? +

+

+ This will also delete all networks associated with this site. +

+
+ + This action cannot be undone. +
+
+ +
+
+ + +
+
+
+
+
+ ); +} diff --git a/components/dialogues/EditSite.tsx b/components/dialogues/EditSite.tsx new file mode 100644 index 0000000..e0ea7ab --- /dev/null +++ b/components/dialogues/EditSite.tsx @@ -0,0 +1,91 @@ +"use client" +import { useState, useEffect } from "react" +import axios from "axios" +import { Site } from "@/app/types" +import { PencilLine, Building2, FileText } from "lucide-react" +import ErrorToast from "@/components/Error" +import SuccessToast from "@/components/Success" +import useSite from "@/hooks/useSite" + +interface EditSiteProps { + site: Site +} + +export default function EditSite({ site }: EditSiteProps) { + const [name, setName] = useState(site.name) + const [description, setDescription] = useState(site.description || "") + const [error, setError] = useState("") + const [success, setSuccess] = useState("") + const { editSite } = useSite() + + useEffect(() => { + setName(site.name) + setDescription(site.description || "") + }, [site]) + + return ( +
+ +
+
+
+ +
+

Edit Site

+
+ +
+
+
+ + setName(e.target.value)} + /> +
+ +
+ +