fix: project details table refresh

This commit is contained in:
Théo LAGACHE
2026-02-10 11:44:45 +01:00
parent a49b6d6573
commit 921a355ae0
48 changed files with 808 additions and 566 deletions
+12
View File
@@ -46,3 +46,15 @@ export const updateAgentAction = userAction
data: updatedAgent,
};
});
export const getAgentAction = userAction.schema(z.string()).action(async ({parsedInput}) => {
const agent = await db.query.agent.findFirst({
where: eq(drizzleDb.schemas.agent.id, parsedInput),
with: {
databases: true
}
});
return {
data: agent,
};
});
@@ -13,7 +13,7 @@ import {Input} from "@/components/ui/input";
import {Form} from "@/components/ui/form";
import {Button} from "@/components/ui/button";
import {useRouter} from "next/navigation";
import {useMutation} from "@tanstack/react-query";
import {useMutation, useQueryClient} from "@tanstack/react-query";
import {TooltipProvider} from "@/components/ui/tooltip";
import {AgentSchema, AgentType} from "@/features/agents/agents.schema";
import {toast} from "sonner";
@@ -27,6 +27,7 @@ export type agentFormProps = {
export const AgentForm = (props: agentFormProps) => {
const isCreate = !Boolean(props.defaultValues);
const queryClient = useQueryClient();
const form = useZodForm({
schema: AgentSchema,
@@ -51,7 +52,10 @@ export const AgentForm = (props: agentFormProps) => {
return;
}
toast.success(`Success ${isCreate ? "creating" : "updating"} agent`);
router.refresh();
if (!isCreate && props.agentId) {
queryClient.invalidateQueries({ queryKey: ["agent-data", props.agentId] });
}
if (props.onSuccess) {
props.onSuccess(data);
+11 -25
View File
@@ -1,39 +1,16 @@
"use client";
import {ColumnDef} from "@tanstack/react-table";
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuLabel,
DropdownMenuSeparator,
DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu";
import {Button} from "@/components/ui/button";
import {Download, MoreHorizontal, Trash2} from "lucide-react";
import {ReloadIcon} from "@radix-ui/react-icons";
import {
getFileUrlPresignedLocal,
getFileUrlPreSignedS3Action
} from "@/features/upload/private/upload.action";
import {useMutation} from "@tanstack/react-query";
import {createRestorationAction, deleteBackupAction} from "@/features/dashboard/restore/restore.action";
import {toast} from "sonner";
import {useRouter} from "next/navigation";
import {StatusBadge} from "@/components/wrappers/common/status-badge";
import {Backup, DatabaseWith} from "@/db/schema/07_database";
import {TooltipCustom} from "@/components/wrappers/common/tooltip-custom";
import {Setting} from "@/db/schema/01_setting";
import {SafeActionResult} from "next-safe-action";
import {ZodString} from "zod";
import {ServerActionResult} from "@/types/action-type";
import {cn} from "@/lib/utils";
import {Tooltip, TooltipContent, TooltipProvider, TooltipTrigger} from "@/components/ui/tooltip";
import {MemberWithUser} from "@/db/schema/03_organization";
import {formatLocalizedDate} from "@/utils/date-formatting";
import {formatBytes, isImportedFilename} from "@/utils/text";
import {DatabaseActionsCell} from "@/components/wrappers/dashboard/database/backup/actions/backup-actions-cell";
import { Badge as BadgeC } from "@/components/ui/badge";
export function backupColumns(
isAlreadyRestore: boolean,
@@ -68,7 +45,16 @@ export function backupColumns(
cell: ({row}) => {
const reference = row.original.id
const isImported = row.original.imported
return isImported ? `${reference} (imported)` : `${reference}`
return (
<div className="flex items-center space-x-2">
<span>{reference}</span>
{isImported && (
<BadgeC variant="outline" className="bg-orange-400/10 border-orange-600/50 text-orange-600">
Imported
</BadgeC>
)}
</div>
)
},
},
{
+5 -6
View File
@@ -15,13 +15,12 @@ import { ReloadIcon } from "@radix-ui/react-icons";
import { StatusBadge } from "@/components/wrappers/common/status-badge";
import {Restoration} from "@/db/schema/07_database";
import {formatLocalizedDate} from "@/utils/date-formatting";
import {useMutation} from "@tanstack/react-query";
import {useMutation, useQueryClient} from "@tanstack/react-query";
import {
deleteRestoreAction,
rerunRestorationAction
} from "@/features/dashboard/restore/restore.action";
import {toast} from "sonner";
import {useRouter} from "next/navigation";
import {TooltipCustom} from "@/components/wrappers/common/tooltip-custom";
import {MemberWithUser} from "@/db/schema/03_organization";
@@ -54,7 +53,7 @@ export function restoreColumns(
cell: ({ row }) => {
const status = row.getValue("status");
const router = useRouter();
const queryClient = useQueryClient();
const rowData: Restoration = row.original;
@@ -67,7 +66,7 @@ export function restoreColumns(
if (restoration.data.success) {
// @ts-ignore
toast.success(restoration.data.actionSuccess.message);
router.refresh();
queryClient.invalidateQueries({queryKey: ["database-data", rowData.databaseId]});
} else {
// @ts-ignore
toast.error(restoration.data.actionError.message);
@@ -84,7 +83,7 @@ export function restoreColumns(
if (restoration.data.success) {
// @ts-ignore
toast.success(restoration.data.actionSuccess.message);
router.refresh();
queryClient.invalidateQueries({queryKey: ["database-data", rowData.databaseId]});
} else {
// @ts-ignore
toast.error(restoration.data.actionError.message);
@@ -109,7 +108,7 @@ export function restoreColumns(
{activeMember.role != "member" && (
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="ghost" className="h-8 w-8 p-0">
<Button variant="ghost" className="h-8 w-8 p-0" type="button" onClick={(e) => e.stopPropagation()}>
<span className="sr-only">Open menu</span>
<MoreHorizontal className="h-4 w-4"/>
</Button>
@@ -4,7 +4,7 @@ import { FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessa
import { Input } from "@/components/ui/input";
import { Form } from "@/components/ui/form";
import { Button } from "@/components/ui/button";
import { useMutation } from "@tanstack/react-query";
import { useMutation, useQueryClient } from "@tanstack/react-query";
import { ProjectSchema, ProjectType } from "@/features/projects/projects.schema";
import { createProjectAction, updateProjectAction } from "@/features/projects/projects.action";
import { useRouter } from "next/navigation";
@@ -29,6 +29,7 @@ export type projectFormProps = {
export const ProjectForm = (props: projectFormProps) => {
const router = useRouter();
const queryClient = useQueryClient();
const isCreate = !Boolean(props.defaultValues);
const formatDatabasesList = (databases: DatabaseWith[]) => {
return databases.map((database) => ({
@@ -70,7 +71,13 @@ export const ProjectForm = (props: projectFormProps) => {
if (project && project.data) {
if (project.data.success) {
project.data.actionSuccess && toast.success(project.data.actionSuccess.message);
router.refresh();
if (!isCreate && values.databases) {
values.databases.forEach(dbId => {
queryClient.invalidateQueries({ queryKey: ["database-data", dbId] });
});
}
if (props.onSuccess) {
props.onSuccess(project.data.value);
} else {
@@ -78,11 +85,9 @@ export const ProjectForm = (props: projectFormProps) => {
}
} else {
project.data.actionError && toast.error(project.data.actionError.message || "Unknown error occurred.");
router.refresh();
}
} else {
toast.error("Failed to process request. No response received.");
router.refresh();
}
},
});
@@ -75,10 +75,7 @@ export async function deleteFileS3Private(fileName: string, bucketName: string)
*/
export async function deleteLocalPrivate(fileName: string) {
try {
console.log(fileName);
const filePath = path.join(process.cwd(), privateLocalDir, fileName);
console.log(`Deleted ${filePath}`);
// Delete locally
await unlink(filePath);
return {