// Tasks.jsx
(function () {
const { useState } = React;
const priorityConfig = {
high: { label: 'Wysoki', color: '#EF4444', bg: 'rgba(239,68,68,.12)' },
medium: { label: 'Średni', color: '#F59E0B', bg: 'rgba(245,158,11,.12)' },
low: { label: 'Niski', color: '#22C55E', bg: 'rgba(34,197,94,.12)' },
};
function getCategory(task) {
const today = '2026-07-21';
if (task.due < today) return 'overdue';
if (task.due === today) return 'today';
return 'upcoming';
}
function fmtDue(due) {
const [y, m, d] = due.split('-');
const months = ['sty','lut','mar','kwi','maj','cze','lip','sie','wrz','paź','lis','gru'];
return `${parseInt(d)} ${months[parseInt(m)-1]}`;
}
// ── Task Item ─────────────────────────────────────────────────────
function TaskItem({ task, onToggle }) {
const pc = priorityConfig[task.priority];
const cat = getCategory(task);
const isOverdue = cat === 'overdue' && !task.done;
const assignee = (window.SEED.team || []).find(m => m.id === task.assignee);
return (
e.currentTarget.style.background='var(--bg-hover)'}
onMouseLeave={e=>e.currentTarget.style.background='transparent'}
>
{/* Checkbox */}
onToggle(task.id)} style={{
width:18, height:18, borderRadius:6, flexShrink:0, cursor:'pointer',
border: task.done ? 'none' : `1.5px solid ${pc.color}`,
background: task.done ? '#22C55E' : 'transparent',
display:'flex', alignItems:'center', justifyContent:'center',
transition:'all .15s',
}}>
{task.done &&
}
{/* Text */}
{/* Assignee */}
{assignee && (
{assignee.initials}
{assignee.name.split(' ')[0]}
)}
{/* Priority badge */}
{pc.label}
{/* Due date */}
{isOverdue ? '⚠ ' : ''}{fmtDue(task.due)}
);
}
// ── Add Task Modal ────────────────────────────────────────────────
function AddTaskModal({ onClose, onSave }) {
const team = window.SEED.team || [];
const [form, setForm] = useState({ text:'', priority:'medium', due:'2026-07-21', assignee: team[0]?.id || '' });
const set = (k,v) => setForm(f => ({ ...f, [k]:v }));
const canSave = form.text.trim().length > 0;
const submit = () => {
if (!canSave) return;
onSave({ id:'T'+Math.random().toString(36).slice(2,8).toUpperCase(), text:form.text.trim(), priority:form.priority, due:form.due, done:false, assignee:form.assignee });
onClose();
};
const inputStyle = { width:'100%', padding:'9px 12px', borderRadius:9, border:'1px solid var(--bdr)', background:'var(--bg-input)', color:'var(--t1)', fontSize:13, outline:'none' };
const labelStyle = { fontSize:11, fontWeight:600, color:'var(--t3)', marginBottom:5, display:'block', textTransform:'uppercase', letterSpacing:0.5 };
return (
<>
Nowe zadanie
>
);
}
// ── Tasks (main export) ───────────────────────────────────────────
window.Tasks = function Tasks({ tasks, setTasks }) {
const [tab, setTab] = useState('today');
const [showAdd, setShowAdd] = useState(false);
const today = '2026-07-21';
const tabs = [
{ id:'today', label:'Dziś', filter: t => t.due === today },
{ id:'overdue', label:'Zaległe', filter: t => t.due < today && !t.done },
{ id:'upcoming', label:'Nadchodzące', filter: t => t.due > today },
];
const [assigneeFilter, setAssigneeFilter] = useState('all');
const team = window.SEED.team || [];
const activeTab = tabs.find(t => t.id === tab);
const filtered = tasks.filter(activeTab.filter).filter(t => assigneeFilter === 'all' || t.assignee === assigneeFilter);
const toggle = (id) => setTasks(prev => prev.map(t => t.id === id ? { ...t, done: !t.done } : t));
const overdueCnt = tasks.filter(t => t.due < today && !t.done).length;
const todayCnt = tasks.filter(t => t.due === today).length;
return (
{/* Header */}
Wszystkie zadania
{tasks.filter(t=>!t.done).length} aktywnych · {tasks.filter(t=>t.done).length} ukończonych
{/* Team overview — click an employee to see their tasks */}
Zadania zespołu
{team.map(m => {
const cnt = tasks.filter(t => t.assignee === m.id && !t.done).length;
const active = assigneeFilter === m.id;
return (
);
})}
{/* Tabs */}
{assigneeFilter !== 'all' && (
Zadania: {team.find(m=>m.id===assigneeFilter)?.name}
)}
{tabs.map(t => (
))}
{/* List */}
{filtered.length === 0 ? (
{tab==='overdue' ? '🎉 Brak zaległych zadań!' : 'Brak zadań w tej kategorii'}
) : (
filtered.map((t,i) => (
{i < filtered.length-1 &&
}
))
)}
{/* Priority legend */}
Priorytet:
{Object.entries(priorityConfig).map(([k, v]) => (
{v.label}
))}
{showAdd &&
setShowAdd(false)} onSave={t => setTasks(prev => [t, ...prev])} />}
);
};
})();