"use client"; import { type Dispatch, type SetStateAction } from "react"; import { Table2 } from "lucide-react"; import { RowActionMenuItems, RowActions, } from "@/app/components/shared/RowActions"; import { TABLE_CHECKBOX_CLASS, TABLE_STICKY_CELL_BG, SkeletonDot, SkeletonLine, TableBody, TableCell, TableEmptyState, TableHeaderCell, TableHeaderRow, TablePrimaryCell, TableRow, TableScrollArea, TableStickyCell, } from "@/app/components/shared/TablePrimitive"; import type { Document, TabularReview } from "@/app/components/shared/types"; import { formatDate } from "./ProjectPageParts"; export function ProjectReviewsTable({ docs, reviews, filteredReviews, selectedReviewIds, allReviewsSelected, someReviewsSelected, creatingReview, currentUserId, onCreateReview, onOpenReview, onOpenDetails, onDeleteReview, onOwnerOnlyAction, setSelectedReviewIds, loading = false, }: { docs: Document[]; reviews: TabularReview[]; filteredReviews: TabularReview[]; selectedReviewIds: string[]; allReviewsSelected: boolean; someReviewsSelected: boolean; creatingReview: boolean; currentUserId?: string | null; onCreateReview: () => void; onOpenReview: (reviewId: string) => void; onOpenDetails: (review: TabularReview) => void; onDeleteReview: (review: TabularReview) => Promise | void; onOwnerOnlyAction: (action: string) => void; setSelectedReviewIds: Dispatch>; loading?: boolean; }) { return ( {loading ? ( ) : ( { if (el) el.indeterminate = someReviewsSelected; }} onChange={() => { if (allReviewsSelected) setSelectedReviewIds([]); else setSelectedReviewIds( filteredReviews.map((r) => r.id), ); }} className={TABLE_CHECKBOX_CLASS} /> )} Name Columns Documents Created } > {loading ? ( ) : reviews.length === 0 ? (

Tabular Reviews

Extract data from project documents into tables using AI.

) : ( {filteredReviews.map((review) => ( ( { if ( currentUserId && review.user_id !== currentUserId ) { onOwnerOnlyAction( "edit tabular review details", ); return; } onOpenDetails(review); }} onDelete={() => onDeleteReview(review)} /> )} onClick={() => onOpenReview(review.id)} className="pr-8 md:pr-8" > setSelectedReviewIds((prev) => prev.includes(review.id) ? prev.filter( (x) => x !== review.id, ) : [...prev, review.id], ) } label={review.title ?? "Untitled Review"} /> {review.columns_config?.length ?? 0} {review.document_count ?? 0} {review.created_at ? ( formatDate(review.created_at) ) : ( )}
e.stopPropagation()} > { if ( currentUserId && review.user_id !== currentUserId ) { onOwnerOnlyAction( "edit tabular review details", ); return; } onOpenDetails(review); }} onDelete={() => onDeleteReview(review)} />
))}
)}
); } function ProjectReviewsLoadingRows() { const titleWidths = ["w-36", "w-40", "w-44", "w-48", "w-52"]; return ( {[1, 2, 3, 4, 5].map((i) => (
))}
); }