// 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 */}
{task.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
set('text',e.target.value)} placeholder="np. Zadzwoń do klienta" autoFocus />
set('assignee',v)} options={team.map(m => ({ value:m.id, label:m.name }))} />
set('priority',v)} options={[{value:'high',label:'Wysoki'},{value:'medium',label:'Średni'},{value:'low',label:'Niski'}]} />
set('due',e.target.value)} />
); } // ── 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])} />}
); }; })();