mirror of
https://github.com/crocofied/CoreControl.git
synced 2025-12-18 16:07:10 +00:00
Bug Fixes
This commit is contained in:
parent
fe6586d051
commit
d095524291
@ -3,7 +3,7 @@ import prisma from "@/app/prisma";
|
|||||||
import { z } from "zod/v4";
|
import { z } from "zod/v4";
|
||||||
|
|
||||||
const schema = z.object({
|
const schema = z.object({
|
||||||
siteId: z.string(),
|
siteId: z.number(),
|
||||||
});
|
});
|
||||||
|
|
||||||
export async function DELETE(request: NextRequest) {
|
export async function DELETE(request: NextRequest) {
|
||||||
@ -12,7 +12,7 @@ export async function DELETE(request: NextRequest) {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
const site = await prisma.site.delete({
|
const site = await prisma.site.delete({
|
||||||
where: { id: Number(siteId.siteId) },
|
where: { id: siteId.siteId },
|
||||||
});
|
});
|
||||||
|
|
||||||
return NextResponse.json(site);
|
return NextResponse.json(site);
|
||||||
|
|||||||
@ -3,7 +3,7 @@ import prisma from "@/app/prisma";
|
|||||||
import { z } from "zod/v4";
|
import { z } from "zod/v4";
|
||||||
|
|
||||||
const schema = z.object({
|
const schema = z.object({
|
||||||
networkId: z.string(),
|
networkId: z.number(),
|
||||||
});
|
});
|
||||||
|
|
||||||
export async function DELETE(request: NextRequest) {
|
export async function DELETE(request: NextRequest) {
|
||||||
@ -13,7 +13,7 @@ export async function DELETE(request: NextRequest) {
|
|||||||
try {
|
try {
|
||||||
await prisma.network.delete({
|
await prisma.network.delete({
|
||||||
where: {
|
where: {
|
||||||
id: Number(network.networkId),
|
id: network.networkId,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -16,7 +16,7 @@ export async function POST(request: NextRequest) {
|
|||||||
try {
|
try {
|
||||||
const network = await prisma.network.update({
|
const network = await prisma.network.update({
|
||||||
where: {
|
where: {
|
||||||
id: Number(body.id),
|
id: body.id,
|
||||||
},
|
},
|
||||||
data: {
|
data: {
|
||||||
name: body.name,
|
name: body.name,
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
"use client"
|
"use client"
|
||||||
import Sidebar from "@/components/Sidebar"
|
import Sidebar from "@/components/Sidebar"
|
||||||
import useSite from "@/hooks/useSites"
|
import useSite from "@/hooks/useSites"
|
||||||
import { useEffect, useState } from "react"
|
import { useEffect, useState, useRef } from "react"
|
||||||
import { Network } from "@/app/types"
|
import { Network } from "@/app/types"
|
||||||
import Loading from "@/components/Loading"
|
import Loading from "@/components/Loading"
|
||||||
import { EditModeToggle } from "@/components/EditModeToggle"
|
import { EditModeToggle } from "@/components/EditModeToggle"
|
||||||
@ -15,15 +15,16 @@ import DeleteSite from "@/components/dialogues/DeleteSite"
|
|||||||
interface SitesPageProps {
|
interface SitesPageProps {
|
||||||
username: string
|
username: string
|
||||||
name: string
|
name: string
|
||||||
siteId: string
|
siteId: number
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function SitesPage({ username, name, siteId }: SitesPageProps) {
|
export default function SitesPage({ username, name, siteId }: SitesPageProps) {
|
||||||
const { site, loadSite, updateSite, setSiteId, loading } = useSite()
|
const { site, loadSite, updateSite, setSiteId, loading } = useSite()
|
||||||
const [isEditMode, setIsEditMode] = useState(false)
|
const [isEditMode, setIsEditMode] = useState(false)
|
||||||
|
const editSiteRef = useRef<{ resetForm: () => void }>(null)
|
||||||
|
|
||||||
const [selectedNetwork, setSelectedNetwork] = useState<Network | null>(null)
|
const [selectedNetwork, setSelectedNetwork] = useState<Network | null>(null)
|
||||||
const [selectedNetworkId, setSelectedNetworkId] = useState('')
|
const [selectedNetworkId, setSelectedNetworkId] = useState<number | null>(null)
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (siteId) {
|
if (siteId) {
|
||||||
@ -31,6 +32,11 @@ export default function SitesPage({ username, name, siteId }: SitesPageProps) {
|
|||||||
}
|
}
|
||||||
}, [siteId, setSiteId])
|
}, [siteId, setSiteId])
|
||||||
|
|
||||||
|
const handleEditClick = () => {
|
||||||
|
editSiteRef.current?.resetForm()
|
||||||
|
;(document.getElementById('edit_site') as HTMLDialogElement)?.showModal()
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Sidebar username={username} fullName={name} breadcrumbPath={["/", "Dashboard", "Resources", "Sites", site.name]}>
|
<Sidebar username={username} fullName={name} breadcrumbPath={["/", "Dashboard", "Resources", "Sites", site.name]}>
|
||||||
<main className="w-full">
|
<main className="w-full">
|
||||||
@ -49,7 +55,7 @@ export default function SitesPage({ username, name, siteId }: SitesPageProps) {
|
|||||||
<>
|
<>
|
||||||
<button
|
<button
|
||||||
className="btn btn-primary btn-sm px-2"
|
className="btn btn-primary btn-sm px-2"
|
||||||
onClick={() => (document.getElementById('edit_site') as HTMLDialogElement)?.showModal()}
|
onClick={handleEditClick}
|
||||||
>
|
>
|
||||||
<Pencil className="h-4 w-4" />
|
<Pencil className="h-4 w-4" />
|
||||||
</button>
|
</button>
|
||||||
@ -167,7 +173,7 @@ export default function SitesPage({ username, name, siteId }: SitesPageProps) {
|
|||||||
)}
|
)}
|
||||||
|
|
||||||
<AddNetwork siteId={site.id} onNetworkAdded={updateSite}/>
|
<AddNetwork siteId={site.id} onNetworkAdded={updateSite}/>
|
||||||
<EditSite site={site} onSiteEdited={updateSite} />
|
<EditSite ref={editSiteRef} site={site} onSiteEdited={updateSite} />
|
||||||
<DeleteSite siteId={site.id} />
|
<DeleteSite siteId={site.id} />
|
||||||
{selectedNetwork && (
|
{selectedNetwork && (
|
||||||
<EditNetwork
|
<EditNetwork
|
||||||
|
|||||||
@ -22,6 +22,6 @@ export default function Dashboard() {
|
|||||||
if (loading) {
|
if (loading) {
|
||||||
return <Loading />;
|
return <Loading />;
|
||||||
} else {
|
} else {
|
||||||
return <SitePage username={username} name={name} siteId={siteId as string} />;
|
return <SitePage username={username} name={name} siteId={Number(siteId)} />;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -19,7 +19,7 @@ export default function AddSite({ onSiteAdded }: AddSiteProps) {
|
|||||||
const { addSite } = useSite();
|
const { addSite } = useSite();
|
||||||
|
|
||||||
const addSiteHandler = async () => {
|
const addSiteHandler = async () => {
|
||||||
const response = addSite({ id: "", name, description, networks: [] });
|
const response = addSite({ id: 0, name, description, networks: [] });
|
||||||
if (typeof response === "string") {
|
if (typeof response === "string") {
|
||||||
setError(response)
|
setError(response)
|
||||||
return
|
return
|
||||||
|
|||||||
@ -6,7 +6,7 @@ import ErrorToast from "@/components/Error";
|
|||||||
import SuccessToast from "@/components/Success";
|
import SuccessToast from "@/components/Success";
|
||||||
|
|
||||||
interface DeleteNetworkProps {
|
interface DeleteNetworkProps {
|
||||||
networkId: string;
|
networkId: number;
|
||||||
onNetworkDeleted?: () => void;
|
onNetworkDeleted?: () => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -5,7 +5,7 @@ import { Trash2, AlertTriangle } from "lucide-react";
|
|||||||
import useSite from "@/hooks/useSites";
|
import useSite from "@/hooks/useSites";
|
||||||
|
|
||||||
interface DeleteSiteProps {
|
interface DeleteSiteProps {
|
||||||
siteId: string;
|
siteId: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function DeleteSite({ siteId }: DeleteSiteProps) {
|
export default function DeleteSite({ siteId }: DeleteSiteProps) {
|
||||||
@ -42,7 +42,7 @@ export default function DeleteSite({ siteId }: DeleteSiteProps) {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="modal-action">
|
<div className="modal-action">
|
||||||
<form method="dialog" className="flex gap-2">
|
<form method="dialog" className="flex gap-3 w-full justify-end">
|
||||||
<button className="btn btn-outline">Cancel</button>
|
<button className="btn btn-outline">Cancel</button>
|
||||||
<button
|
<button
|
||||||
className="btn btn-error text-error-content"
|
className="btn btn-error text-error-content"
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
"use client"
|
"use client"
|
||||||
import { useState, useEffect } from "react"
|
import { useState, useEffect, forwardRef, useImperativeHandle } from "react"
|
||||||
import axios from "axios"
|
import axios from "axios"
|
||||||
import { Site } from "@/app/types"
|
import { Site } from "@/app/types"
|
||||||
import { PencilLine, Building2, FileText } from "lucide-react"
|
import { PencilLine, Building2, FileText } from "lucide-react"
|
||||||
@ -12,16 +12,24 @@ interface EditSiteProps {
|
|||||||
onSiteEdited?: () => void
|
onSiteEdited?: () => void
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function EditSite({ site, onSiteEdited }: EditSiteProps) {
|
const EditSite = forwardRef<{ resetForm: () => void }, EditSiteProps>(({ site, onSiteEdited }, ref) => {
|
||||||
const [name, setName] = useState(site.name)
|
const [name, setName] = useState(site.name)
|
||||||
const [description, setDescription] = useState(site.description || "")
|
const [description, setDescription] = useState(site.description || "")
|
||||||
const [error, setError] = useState("")
|
const [error, setError] = useState("")
|
||||||
const [success, setSuccess] = useState("")
|
const [success, setSuccess] = useState("")
|
||||||
const { editSite } = useSite()
|
const { editSite } = useSite()
|
||||||
|
|
||||||
useEffect(() => {
|
const resetForm = () => {
|
||||||
setName(site.name)
|
setName(site.name)
|
||||||
setDescription(site.description || "")
|
setDescription(site.description || "")
|
||||||
|
}
|
||||||
|
|
||||||
|
useImperativeHandle(ref, () => ({
|
||||||
|
resetForm
|
||||||
|
}))
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
resetForm()
|
||||||
}, [site])
|
}, [site])
|
||||||
|
|
||||||
const handleEditSite = async () => {
|
const handleEditSite = async () => {
|
||||||
@ -40,9 +48,6 @@ export default function EditSite({ site, onSiteEdited }: EditSiteProps) {
|
|||||||
}
|
}
|
||||||
} catch (apiError) {
|
} catch (apiError) {
|
||||||
setError(typeof apiError === "string" ? apiError : "Failed to edit site")
|
setError(typeof apiError === "string" ? apiError : "Failed to edit site")
|
||||||
} finally {
|
|
||||||
setName("")
|
|
||||||
setDescription("")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -95,7 +100,7 @@ export default function EditSite({ site, onSiteEdited }: EditSiteProps) {
|
|||||||
|
|
||||||
<div className="modal-action">
|
<div className="modal-action">
|
||||||
<form method="dialog" className="flex gap-3 w-full justify-end">
|
<form method="dialog" className="flex gap-3 w-full justify-end">
|
||||||
<button className="btn btn-outline">Cancel</button>
|
<button className="btn btn-outline" onClick={resetForm}>Cancel</button>
|
||||||
<button
|
<button
|
||||||
className="btn btn-primary"
|
className="btn btn-primary"
|
||||||
onClick={handleEditSite}
|
onClick={handleEditSite}
|
||||||
@ -111,4 +116,8 @@ export default function EditSite({ site, onSiteEdited }: EditSiteProps) {
|
|||||||
<SuccessToast message={success} show={success !== ''} onClose={() => setSuccess('')} />
|
<SuccessToast message={success} show={success !== ''} onClose={() => setSuccess('')} />
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
})
|
||||||
|
|
||||||
|
EditSite.displayName = 'EditSite'
|
||||||
|
|
||||||
|
export default EditSite
|
||||||
@ -33,7 +33,7 @@ const useNetworks = () => {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const deleteNetwork = (networkId: string): Promise<string> | string => {
|
const deleteNetwork = (networkId: number): Promise<string> | string => {
|
||||||
if (!networkId) {
|
if (!networkId) {
|
||||||
return 'Network ID is required';
|
return 'Network ID is required';
|
||||||
}
|
}
|
||||||
|
|||||||
@ -10,7 +10,7 @@ const useSite = () => {
|
|||||||
description: "",
|
description: "",
|
||||||
networks: []
|
networks: []
|
||||||
});
|
});
|
||||||
const [siteId, setSiteId] = useState("");
|
const [siteId, setSiteId] = useState<number>(0);
|
||||||
const [loading, setLoading] = useState(false);
|
const [loading, setLoading] = useState(false);
|
||||||
const [currentPage, setCurrentPage] = useState(1);
|
const [currentPage, setCurrentPage] = useState(1);
|
||||||
const [itemPerPage, setItemPerPage] = useState(() => {
|
const [itemPerPage, setItemPerPage] = useState(() => {
|
||||||
@ -22,10 +22,11 @@ const useSite = () => {
|
|||||||
const [sites, setSites] = useState([]);
|
const [sites, setSites] = useState([]);
|
||||||
|
|
||||||
const loadSite = useCallback(() => {
|
const loadSite = useCallback(() => {
|
||||||
|
console.log(siteId)
|
||||||
if (!siteId) return;
|
if (!siteId) return;
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
axios.get('/api/sites/get', {
|
axios.get('/api/sites/get', {
|
||||||
params: { siteId }
|
params: { siteId: siteId }
|
||||||
}).then((response) => {
|
}).then((response) => {
|
||||||
setSite(response.data.site);
|
setSite(response.data.site);
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
@ -35,7 +36,7 @@ const useSite = () => {
|
|||||||
const updateSite = useCallback(() => {
|
const updateSite = useCallback(() => {
|
||||||
if (!siteId) return;
|
if (!siteId) return;
|
||||||
axios.get('/api/sites/get', {
|
axios.get('/api/sites/get', {
|
||||||
params: { siteId }
|
params: { siteId: siteId }
|
||||||
}).then((response) => {
|
}).then((response) => {
|
||||||
setSite(response.data.site);
|
setSite(response.data.site);
|
||||||
});
|
});
|
||||||
@ -77,12 +78,12 @@ const useSite = () => {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const deleteSite = (siteId: string) => {
|
const deleteSite = (siteId: number) => {
|
||||||
axios.delete('/api/sites/delete', {
|
axios.delete('/api/sites/delete', {
|
||||||
params: { siteId }
|
params: { siteId: siteId }
|
||||||
})
|
})
|
||||||
.then(() => {
|
.then(() => {
|
||||||
setSiteId('');
|
setSiteId(0);
|
||||||
})
|
})
|
||||||
.catch(err => {
|
.catch(err => {
|
||||||
console.error(err);
|
console.error(err);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user