// Screens for Dashy function LoginScreen({ onLogin }) { const [pickedId, setPickedId] = React.useState('rod'); return (
Dashy

Pick up where you left off.

Sign in to your team workspace · murchison-auto

{USERS.map(u => ( ))}

⌘ ⏎ to submit · e.preventDefault()}>Forgot password

04 May → 08 May
v0.1 · build 26.05.08
); } function Stat({ n, label }) { return (
{n}
{label}
); } function BrandMark({ size = 22 }) { return ( ); } function TopBar({ me, isAdmin, tab, setTab, onAdd, onLogs, onLogout, onProfile, onDB }) { return (
Dashy murchison-auto
{isAdmin && ( )} {isAdmin && ( )}
); } function Tab({ id, label, tab, setTab, user }) { const active = tab === id; return ( ); } function HeadsUp({ items, onDismiss, onOpenTask }) { if (!items.length) return null; return (
{items.map(it => (
{it.kind === 'unsuccessful' ? '!' : it.kind === 'billing' ? '⇄' : '✦'}
{it.title}
{it.sub}
))}
); } function OverviewScreen({ tasks, onOpen, onAddFor, density, onMoveTask }) { const byUser = Object.fromEntries(USERS.map(u => [u.id, []])); tasks.forEach(t => { if (byUser[t.assignee]) byUser[t.assignee].push(t); }); const [draggingTask, setDraggingTask] = React.useState(null); const [dragOverCol, setDragOverCol] = React.useState(null); return (
{USERS.map(u => ( onAddFor(u.id)} density={density} dragOver={dragOverCol === u.id && draggingTask && draggingTask.assignee !== u.id} onDragOver={(uid) => setDragOverCol(uid)} onDragLeave={() => setDragOverCol(prev => prev === u.id ? null : prev)} onDragStartCard={(t) => setDraggingTask(t)} onDragEndCard={() => { setDraggingTask(null); setDragOverCol(null); }} draggingId={draggingTask && draggingTask.id} onDropTask={(toId) => { if (draggingTask && draggingTask.assignee !== toId) { onMoveTask && onMoveTask(draggingTask.id, toId); } setDraggingTask(null); setDragOverCol(null); }} /> ))}
); } function Column({ user, tasks, onOpen, onAdd, density, onDropTask, dragOver, onDragOver, onDragLeave, onDragStartCard, onDragEndCard, draggingId }) { return (
{ e.preventDefault(); onDragOver && onDragOver(user.id); }} onDragLeave={(e) => { onDragLeave && onDragLeave(user.id); }} onDrop={(e) => { e.preventDefault(); onDropTask && onDropTask(user.id); }} >

{user.name}

{user.role}
{tasks.length}
{tasks.length === 0 && (
— inbox zero —
)} {tasks.map(t => ( ))}
); } function UserScreen({ user, tasks, onOpen, onAddFor, density }) { const mine = tasks.filter(t => t.assignee === user.id); const open = mine.filter(t => t.status === 'open'); const flagged = mine.filter(t => t.status === 'unsuccessful' || t.status === 'billing'); return (

{user.name}

{user.role} · {mine.length} tasks

{flagged.length > 0 && (
{flagged.map(t => )}
)}
{open.map(t => )}
); } function Section({ title, sub, children }) { return (

{title}

{sub && {sub}}
{children}
); } function AddTaskModal({ open, onClose, onSubmit, defaultAssignee, me }) { const [title, setTitle] = React.useState(''); const [desc, setDesc] = React.useState(''); const [assignee, setAssignee] = React.useState(defaultAssignee || 'lani'); const [priority, setPriority] = React.useState('med'); React.useEffect(() => { if (open) setAssignee(defaultAssignee || 'lani'); }, [open, defaultAssignee]); React.useEffect(() => { if (open) { setTitle(''); setDesc(''); setPriority('med'); } }, [open]); if (!open) return null; const submit = (e) => { e && e.preventDefault(); if (!title.trim()) return; onSubmit({ title: title.trim(), description: desc.trim(), assignee, priority }); }; return (