'use client'; import { Entity } from '@prisma/client'; import React, { useState } from 'react'; import { CellContext } from '@tanstack/table-core'; import { Button } from '@/components/ui/button'; import { Edit, Trash } from 'lucide-react'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog'; import EntityForm from '@/components/form/entityForm'; import { DataTable } from '@/components/ui/data-table'; import { columns } from '@/app/entities/columns'; import { z } from 'zod'; import { entityFormSchema } from '@/lib/form-schemas/entityFormSchema'; import { ActionResponse } from '@/lib/types/actionResponse'; import { Input } from '@/components/ui/input'; import { useRouter } from 'next/navigation'; import { toast } from 'sonner'; import { sonnerContent } from '@/components/ui/sonner'; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogFooter, AlertDialogHeader, } from '@/components/ui/alert-dialog'; import { useMediaQuery } from '@/lib/hooks/useMediaQuery'; import { Drawer, DrawerContent, DrawerHeader, DrawerTitle, DrawerTrigger } from '@/components/ui/drawer'; export default function EntityPageClientContent({entities, onSubmit, onDelete, className}: { entities: Entity[], onSubmit: (data: z.infer) => Promise, onDelete: (id: number) => Promise, className: string, }) { const isDesktop = useMediaQuery('(min-width: 768px)'); const router = useRouter(); const [isEditDialogOpen, setIsEditDialogOpen] = useState(false); const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false); const [selectedEntity, setSelectedEntity] = useState(undefined); async function handleSubmit(data: z.infer) { const response = await onSubmit(data); router.refresh(); setIsEditDialogOpen(false); return response; } async function handleDelete(id: number | undefined) { if (!id) { return; } const response = await onDelete(id); toast(sonnerContent(response)); if (response.redirect) { router.push(response.redirect); } router.refresh(); setIsDeleteDialogOpen(false); return response; } function filterEntities(entities: Entity[], filter: string) { const filterChars = filter.toLowerCase().split(''); const filterCharCounts: Record = {}; // Count character occurrences in the filter filterChars.forEach(char => { filterCharCounts[char] = (filterCharCounts[char] || 0) + 1; }); return entities.filter(entity => { const entityChars = entity.name.toLowerCase().split(''); const entityCharCounts: Record = {}; // Check if entity has enough of each character for (const char of entityChars) { entityCharCounts[char] = (entityCharCounts[char] || 0) + 1; } // Ensure all filter characters were found return Object.keys(filterCharCounts).every(char => { return entityCharCounts[char] >= filterCharCounts[char]; }); }); } const actionCell = ({row}: CellContext) => { const entity = row.original as Entity; return (
); }; const [filter, setFilter] = useState(''); return (

Entities

{/* Edit dialog */} { isDesktop ? ( {selectedEntity?.id ? 'Update Entity' : 'Create Entity'} ) : ( {selectedEntity?.id ? 'Update Entity' : 'Create Entity'} ) }
{/* Filter input */} setFilter(event.target.value)} placeholder="Filter entities"/> {/* Data Table */} {/* Delete confirmation dialog */} Delete Entity?

Are your sure you want to delete the entity {selectedEntity?.name}?

Cancel handleDelete(selectedEntity?.id)}> Delete
); }