"use client" import React, { useState } from "react" import type { ColumnDef } from "@tanstack/react-table" import { Settings2, Plus, ArrowLeft } from "lucide-react" import { Button } from "@/shared/components/ui/button" import { Dialog, DialogContent, DialogHeader, DialogTitle, } from "@/shared/components/ui/dialog" import { ScrollArea } from "@/shared/components/ui/scroll-area" import { DataTable } from "@/shared/data-view/table-view" import { createActionsColumn } from "@/shared/data-view/table-view" import { useCrudDialog, type CrudDialogClient, type UseCrudDialogOptions } from "./use-crud-dialog" // ── Types ── export type CrudDialogProps = UseCrudDialogOptions & { /** Dialog title shown in the header */ title: string /** Table columns (receives `openEdit` and `handleDelete` helpers) */ columns: (helpers: { openEdit: (row: any) => void handleDelete: (row: any) => Promise }) => ColumnDef[] /** Render the create/edit form */ renderForm: (props: { resourceId: string | null initialData: any onSuccess: () => void }) => React.ReactNode /** Optional trigger button; defaults to a settings icon button */ trigger?: React.ReactNode /** Custom trigger class */ triggerClassName?: string } // ── Component ── export function CrudDialog({ title, columns: columnsFn, renderForm, trigger, triggerClassName, ...hookOptions }: CrudDialogProps) { const [isOpen, setIsOpen] = useState(false) const crud = useCrudDialog(hookOptions) const columns = columnsFn({ openEdit: crud.openEdit, handleDelete: crud.handleDelete, }) // Add actions column const allColumns: ColumnDef[] = [ ...columns, createActionsColumn({ onEdit: crud.openEdit, onDelete: crud.handleDelete, }), ] const handleClose = () => { setIsOpen(false) crud.closeForm() } return ( <> {trigger ? (
setIsOpen(true)}>{trigger}
) : ( )} { if (!v) handleClose() }}>
{crud.isFormOpen && ( )} {crud.isFormOpen ? (crud.editingId ? `Edit ${title}` : `New ${title}`) : title}
{crud.isFormOpen ? (
{renderForm({ resourceId: crud.editingId, initialData: crud.editingItem, onSuccess: crud.handleFormSuccess, })}
) : (
)}
) }