import { useState } from "react"; import { removeProjectItem, updateProjectItem } from "~/fns/projects"; import { useAction } from "~/hooks/use-action"; import { ItemTitle } from "./ItemTitle"; import type { ProjectData, ProjectField, ProjectItem } from "./ItemTitle"; import { InlineSelect, inputClass } from "~/ui/Field"; import { EmptyState } from "~/ui/EmptyState"; import { cn } from "~/utils/cn"; type Ref = { owner: string; number: number }; function Cell({ projectRef, item, field, canWrite, }: { projectRef: Ref; item: ProjectItem; field: ProjectField; canWrite: boolean; }) { const current = item.values[field.id] ?? ""; const [draft, setDraft] = useState(current); const update = useAction(updateProjectItem); const save = (value: string) => { if (value === current) return; void update.run({ data: { ...projectRef, itemId: item.id, fieldId: field.id, value: value || null } }); }; if (!canWrite) return {current}; if (field.kind === "single_select") return ( ({ value: option, label: option }))]} /> ); return ( setDraft(event.target.value)} onBlur={() => save(draft)} onKeyDown={(event) => event.key === "Enter" && event.currentTarget.blur()} className={cn(inputClass, "h-7 border-transparent bg-transparent text-xs", update.error && "border-danger-700")} title={update.error ?? undefined} /> ); } export function ProjectTable({ data }: { data: ProjectData }) { const remove = useAction(removeProjectItem); const projectRef = { owner: data.project.owner, number: data.project.number }; if (data.items.length === 0) return ( Add issues, pull requests or notes. ); return (
{data.fields.map((field) => ( ))} {data.canWrite && {data.items.map((item) => ( {data.fields.map((field) => ( ))} {data.canWrite && ( )} ))}
Title {field.name} }
); }