// 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;