"use client"; /** * ListView — compact rows for LIST views: icon, title, 1–2 inline properties, * comment count, date. Row click → record panel. */ import { useMemo } from "react"; import { Inbox, MessageSquare, Plus } from "lucide-react"; import { cn } from "@/lib/utils"; import { DatabaseProperty, DatabaseView, RecordDto, UseDatabaseRecordsResult, useCreateRecord, valueToText } from "@/hooks/use-database"; import { cellToText, formatDateValue } from "@/components/database/cell-renderer"; export interface ListProps { databaseId: string; view: DatabaseView; properties: DatabaseProperty[]; records: UseDatabaseRecordsResult; onOpenRecord: (record: RecordDto) => void; readOnly?: boolean; } export function ListView({ databaseId, view, properties, records, onOpenRecord, readOnly }: ListProps) { const { data, isLoading } = records; const createRecord = useCreateRecord(databaseId); const titleProp = properties.find((p) => p.isTitle); const inline = useMemo(() => { const subs = view.config.subtitlePropertyId ? properties.filter((p) => p.id === view.config.subtitlePropertyId) : []; const rest = properties.filter( (p) => p !== titleProp && p.type !== "files" && p.type !== "relation" && !subs.includes(p) ); return [...subs, ...rest].slice(0, 2); }, [properties, titleProp, view.config.subtitlePropertyId]); const dateProp = properties.find((p) => p.type === "date"); const addRow = () => { createRecord.mutate({ properties: titleProp ? { [titleProp.id]: { text: "New item", marks: [] } } : {} }); }; if (isLoading) { return (
{Array.from({ length: 8 }).map((_, i) => (
))}
); } return (
{data.records.length === 0 ? (

No items in this list.

{!readOnly && ( )}
) : ( )}
); }