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 { 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 (
);
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 (
| Title | {data.fields.map((field) => ({field.name} | ))} {data.canWrite &&} |
|---|---|---|
|
|
{data.fields.map((field) => (
|
))}
{data.canWrite && (
)} |