// kanban-page.jsx — Канбан-режим задач function KanbanPage({ tasks, onOpenTask, onToggle, setTasks, onAddTask, onNewVisit }) { const team = window.DATA.TEAM; const objects = window.DATA.OBJECTS; const [filterAssignee, setFilterAssignee] = React.useState("all"); const [filterObj, setFilterObj] = React.useState("all"); let filtered = tasks; if (filterAssignee !== "all") filtered = filtered.filter(t => t.assignee === filterAssignee); if (filterObj !== "all") filtered = filtered.filter(t => t.obj === filterObj); const columns = [ { id: "todo", label: "To Do", color: "var(--ink-3)", tone: "neutral" }, { id: "live", label: "У роботі", color: "var(--c-green-deep)", tone: "live" }, { id: "late", label: "Прострочено",color: "var(--late)", tone: "warn" }, { id: "done", label: "Виконано", color: "var(--c-green)", tone: "live" }, ]; const byStatus = {}; columns.forEach(c => byStatus[c.id] = filtered.filter(t => t.status === c.id)); const moveTask = (taskId, newStatus) => { setTasks(prev => prev.map(t => t.id === taskId ? { ...t, status: newStatus } : t)); }; return (

Канбан

{filtered.length} {window.plural(filtered.length, "задача", "задачі", "задач")} {filterAssignee !== "all" && <> фільтр: {team.find(p => p.id === filterAssignee)?.name} } {filterObj !== "all" && <> об'єкт: {objects.find(o => o.id === filterObj)?.code} }
{team.map(p => ( ))}
{onNewVisit && }
{columns.map(col => { const list = byStatus[col.id]; const total = list.reduce((s, t) => s + parseFloat(String(t.est || "0")) || 0, 0); return (
{col.label} {list.length}
{list.length === 0 ?
: list.map(task => ( onOpenTask(task)} onMove={(newStatus) => moveTask(task.id, newStatus)} columns={columns} /> )) }
); })}
); } function KanbanCard({ task, onOpen, onMove, columns }) { const obj = window.getObject(task.obj); const ids = task.assignees && task.assignees.length ? task.assignees : (task.assignee ? [task.assignee] : []); const people = ids.map(id => window.getTeam(id)).filter(Boolean); const cls = task.status === "late" ? "is-late" : task.status === "live" ? "is-live" : task.status === "done" ? "is-done" : ""; return (
{task.title}
{task.kind === "visit" && window.VisitTypeBadge && } {obj && {obj.code}} {task.section && <> {task.section} }
{task.est && {task.est}} {people.length > 0 &&
{people.slice(0, 3).map((p, i) => (
{p.initials}
))} {people.length > 3 &&
+{people.length - 3}
}
}
{/* Status quick-move */}
{columns.filter(c => c.id !== task.status).map(c => ( ))}
); } window.KanbanPage = KanbanPage;