diff --git a/apps/dokploy/components/dashboard/application/deployments/show-deployments.tsx b/apps/dokploy/components/dashboard/application/deployments/show-deployments.tsx index 159b89442..ffe35cd34 100644 --- a/apps/dokploy/components/dashboard/application/deployments/show-deployments.tsx +++ b/apps/dokploy/components/dashboard/application/deployments/show-deployments.tsx @@ -6,6 +6,7 @@ import { RefreshCcw, RocketIcon, Settings, + Trash2, } from "lucide-react"; import React, { useEffect, useMemo, useState } from "react"; import { toast } from "sonner"; @@ -78,6 +79,8 @@ export const ShowDeployments = ({ api.rollback.rollback.useMutation(); const { mutateAsync: killProcess, isLoading: isKillingProcess } = api.deployment.killProcess.useMutation(); + const { mutateAsync: removeDeployment, isLoading: isRemovingDeployment } = + api.deployment.removeDeployment.useMutation(); // Cancel deployment mutations const { @@ -256,7 +259,15 @@ export const ShowDeployments = ({ const isExpanded = expandedDescriptions.has( deployment.deploymentId, ); - + const lastSuccessfulDeployment = deployments?.find( + (d) => d.status === "done" + ); + const isLastSuccessfulDeployment = + lastSuccessfulDeployment?.deploymentId === deployment.deploymentId; + const canDelete = + deployments && + deployments.length > 1 && + !isLastSuccessfulDeployment; return (
+ {canDelete && ( + { + try { + await removeDeployment({ + deploymentId: deployment.deploymentId, + }); + toast.success("Deployment deleted successfully"); + } catch (error) { + toast.error("Error deleting deployment"); + } + }} + > + + + )} + {deployment?.rollback && deployment.status === "done" && type === "application" && ( diff --git a/apps/dokploy/server/api/routers/deployment.ts b/apps/dokploy/server/api/routers/deployment.ts index 9004a0a05..d9fab404f 100644 --- a/apps/dokploy/server/api/routers/deployment.ts +++ b/apps/dokploy/server/api/routers/deployment.ts @@ -8,6 +8,7 @@ import { findComposeById, findDeploymentById, findServerById, + removeDeployment, updateDeploymentStatus, } from "@dokploy/server"; import { TRPCError } from "@trpc/server"; @@ -107,4 +108,14 @@ export const deploymentRouter = createTRPCRouter({ await updateDeploymentStatus(deployment.deploymentId, "error"); }), + + removeDeployment: protectedProcedure + .input( + z.object({ + deploymentId: z.string().min(1), + }), + ) + .mutation(async ({ input }) => { + return await removeDeployment(input.deploymentId); + }), });