// frontend/components/tasks/ListView.tsx "use client"; import { Icon } from "@/components/Icon"; import { cx } from "@/lib/cx"; import { COLUMNS, STATUS_META, dueDay, dueLabel, isSoon, pct, stat } from "@/lib/tasks/tree"; import type { Person, Project, Task } from "@/lib/types"; import { Av, Tag } from "./bits"; function LRow({ t, people, projects, onOpen, }: { t: Task; people: Record; projects: Record; onOpen: (id: string) => void; }) { const s = stat(t); const sm = STATUS_META[t.status]; const soon = isSoon(t); return (
onOpen(t.id)}>
{t.title}
{dueLabel(t.due)}
{t.prio}
{s.total > 0 ? ( {s.done}/{s.total} ) : ( )}
); } export function ListView({ tasks, people, projects, onOpen, }: { tasks: Task[]; people: Record; projects: Record; onOpen: (id: string) => void; }) { const groups = COLUMNS.map((col) => ({ ...col, items: tasks .filter((t) => t.status === col.id) .sort((a, b) => dueDay(a.due) - dueDay(b.due)), })).filter((g) => g.items.length > 0); return (
{groups.map((g) => (
{g.label} {g.items.length}
작업
프로젝트
담당
마감
우선순위
진행
{g.items.map((t) => ( ))}
))} {groups.length === 0 &&
표시할 작업이 없어요
}
); }