mirror of
https://github.com/Portabase/portabase.git
synced 2026-07-14 11:16:13 +02:00
Project delete.
This commit is contained in:
@@ -39,6 +39,7 @@ export default async function RoutePage(props: PageParams<{ projectId: string }>
|
||||
</PageTitle>
|
||||
<PageActions className="justify-between">
|
||||
<ButtonDeleteProject
|
||||
projectId={projectId}
|
||||
text={"Delete Project"}
|
||||
/>
|
||||
</PageActions>
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
/*
|
||||
Warnings:
|
||||
|
||||
- Added the required column `isArchived` to the `projects` table without a default value. This is not possible if the table is not empty.
|
||||
|
||||
*/
|
||||
-- AlterTable
|
||||
ALTER TABLE "projects" ADD COLUMN "isArchived" BOOLEAN NOT NULL;
|
||||
@@ -0,0 +1,2 @@
|
||||
-- AlterTable
|
||||
ALTER TABLE "projects" ALTER COLUMN "isArchived" SET DEFAULT false;
|
||||
@@ -102,11 +102,11 @@ model UserOrganization {
|
||||
}
|
||||
|
||||
model Project {
|
||||
id String @id @default(cuid())
|
||||
slug String @unique
|
||||
name String
|
||||
createdAt DateTime @default(now()) @map("created_at")
|
||||
|
||||
id String @id @default(cuid())
|
||||
slug String @unique
|
||||
name String
|
||||
createdAt DateTime @default(now()) @map("created_at")
|
||||
isArchived Boolean @default(false)
|
||||
organizationId String @map("organization_id")
|
||||
organization Organization @relation(fields: [organizationId], references: [id])
|
||||
|
||||
|
||||
+17
-10
@@ -2,29 +2,36 @@
|
||||
|
||||
import {Trash2} from "lucide-react";
|
||||
import {ButtonWithConfirm} from "@/components/wrappers/common/button/button-with-confirm";
|
||||
import {useMutation} from "@tanstack/react-query";
|
||||
import {deleteProjectAction} from "@/components/wrappers/dashboard/projects/ButtonDeleteProject/delete-project.action";
|
||||
import {useRouter} from "next/navigation";
|
||||
import {toast} from "sonner";
|
||||
|
||||
export type ButtonDeleteProjectProps = {
|
||||
text? : string
|
||||
projectId: string
|
||||
}
|
||||
|
||||
export const ButtonDeleteProject = (props: ButtonDeleteProjectProps) => {
|
||||
|
||||
// const mutation = useMutation({
|
||||
// mutationFn: () => deleteUserAction(""),
|
||||
// onSuccess: async () => {
|
||||
// await signOutAction();
|
||||
// },
|
||||
// })
|
||||
const router = useRouter()
|
||||
const mutation = useMutation({
|
||||
mutationFn: () => deleteProjectAction(props.projectId),
|
||||
onSuccess: async (result) => {
|
||||
router.push("/dashboard/projects")
|
||||
if(result.data.success) {
|
||||
toast.success(result.data.actionSuccess.message);
|
||||
}
|
||||
},
|
||||
})
|
||||
|
||||
return (
|
||||
<ButtonWithConfirm
|
||||
text={props.text ? props.text : ""}
|
||||
onClick={() => {
|
||||
// mutation.mutate()
|
||||
console.log("ok")
|
||||
mutation.mutate()
|
||||
}}
|
||||
variant={"destructive"}
|
||||
// isPending={mutation.isPending}
|
||||
isPending={mutation.isPending}
|
||||
className="gap-2"
|
||||
icon={<Trash2/>}
|
||||
/>
|
||||
|
||||
+47
@@ -0,0 +1,47 @@
|
||||
"use server"
|
||||
import {userAction} from "@/safe-actions";
|
||||
import {z} from "zod";
|
||||
import {v4 as uuidv4} from "uuid";
|
||||
import {prisma} from "@/prisma";
|
||||
import {ServerActionResult} from "@/types/action-type";
|
||||
import {Projects} from "@prisma/client";
|
||||
|
||||
|
||||
export const deleteProjectAction = userAction
|
||||
.schema(z.string())
|
||||
.action(async ({parsedInput, ctx}): Promise<ServerActionResult<Projects>> => {
|
||||
|
||||
try {
|
||||
const uuid = uuidv4()
|
||||
|
||||
const project = await prisma.project.update({
|
||||
where: {
|
||||
id: parsedInput
|
||||
},
|
||||
data:{
|
||||
isArchived: true,
|
||||
slug: uuid
|
||||
}
|
||||
})
|
||||
|
||||
return {
|
||||
success: true,
|
||||
value: project,
|
||||
actionSuccess: {
|
||||
message: "Projects has been successfully archived.",
|
||||
messageParams: {projectName: parsedInput.data.name},
|
||||
},
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
success: false,
|
||||
actionError: {
|
||||
message: "Failed to archived Projects.",
|
||||
status: 500, // Optional: Use a meaningful status code
|
||||
cause: error instanceof Error ? error.message : "Unknown error",
|
||||
messageParams: {projectName: parsedInput.data.name},
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
});
|
||||
@@ -42,7 +42,7 @@ export const createProjectAction = userAction
|
||||
success: true,
|
||||
value: project,
|
||||
actionSuccess: {
|
||||
message: "ProjectsForm has been successfully created.",
|
||||
message: "Projects has been successfully created.",
|
||||
messageParams: {projectName: parsedInput.data.name},
|
||||
},
|
||||
};
|
||||
@@ -50,7 +50,7 @@ export const createProjectAction = userAction
|
||||
return {
|
||||
success: false,
|
||||
actionError: {
|
||||
message: "Failed to create ProjectsForm.",
|
||||
message: "Failed to create Projects.",
|
||||
status: 500, // Optional: Use a meaningful status code
|
||||
cause: error instanceof Error ? error.message : "Unknown error",
|
||||
messageParams: {projectName: parsedInput.data.name},
|
||||
|
||||
Reference in New Issue
Block a user