// Pro Tareas: Home exercise assignment system function ProTareas() { const { players } = window.TData; const { tasks, completions, taskCategories } = window.TDataExt; const [view, setView] = React.useState("overview"); // overview | assign | player const [selectedPlayer, setSelectedPlayer] = React.useState(null); const [localComp, setLocalComp] = React.useState(completions); const [showForm, setShowForm] = React.useState(false); const [newTask, setNewTask] = React.useState({ title:"", category:"Técnica", desc:"", freq:"Diario", due:"", points:10 }); const [localTasks, setLocalTasks] = React.useState(tasks); const [filterCat, setFilterCat] = React.useState("Todas"); const getCatColor = cat => ({ "Técnica":"#2563eb","Físico":"#dc2626","Táctica":"#7c3aed","Recuperación":"#16a34a" }[cat]||T.accent); const getCompletion = (pid, tid) => localComp[pid]?.[tid] || false; const toggleComp = (pid, tid) => setLocalComp(prev=>({...prev,[pid]:{...prev[pid],[tid]:!prev[pid][tid]}})); const playerTaskPct = pid => { const done = localTasks.filter(t=>localComp[pid]?.[t.id]).length; return localTasks.length ? Math.round(done/localTasks.length*100) : 0; }; const taskCompPct = tid => { const done = players.filter(p=>localComp[p.id]?.[tid]).length; return Math.round(done/players.length*100); }; const addTask = () => { if (!newTask.title.trim()) return; const t = { ...newTask, id: Date.now(), assigned: new Date().toISOString().split("T")[0] }; setLocalTasks(prev=>[...prev, t]); setLocalComp(prev=>{ const n={...prev}; players.forEach(p=>{ n[p.id]={...n[p.id],[t.id]:false}; }); return n; }); setNewTask({ title:"", category:"Técnica", desc:"", freq:"Diario", due:"", points:10 }); setShowForm(false); }; const teamAvgPct = Math.round(players.reduce((s,p)=>s+playerTaskPct(p.id),0)/players.length); const filteredTasks = filterCat==="Todas" ? localTasks : localTasks.filter(t=>t.category===filterCat); if (selectedPlayer) { const p = selectedPlayer; const pct = playerTaskPct(p.id); const pctColor = pct>=80?T.green:pct>=60?T.yellow:T.red; return (
setSelectedPlayer(null)} label="Tareas" />
#{p.num} {p.name}
{pct}% de tareas completadas
{localTasks.map((t,i)=>{ const done = getCompletion(p.id, t.id); return (
toggleComp(p.id,t.id)} style={{ width:22,height:22,borderRadius:4,flexShrink:0,marginTop:1, border:`2px solid ${done?T.green:T.border}`, background:done?T.green:"#fff", display:"flex",alignItems:"center",justifyContent:"center", cursor:"pointer",color:"#fff",fontWeight:700,fontSize:13, transition:"all 0.15s" }}>{done?"✓":""}
{t.title} {t.freq}
{t.desc}
{t.due &&
Entrega: {t.due}
}
{done?`+${t.points} pts`:`${t.points} pts`}
); })}
); } return (

Tareas en Casa

Ejercicios y actividades asignadas fuera del entrenamiento

{/* Team summary */}
=75?T.green:teamAvgPct>=50?T.yellow:T.red} /> playerTaskPct(p.id)===100).length} sub="jugadoras" color={T.green} /> playerTaskPct(p.id)<50).length} sub="menos del 50%" color={T.red} />
{/* New task form */} {showForm && ( Nueva tarea
setNewTask(p=>({...p,title:e.target.value}))} placeholder="Ej: 30 tiros de media distancia" style={{width:"100%",padding:"8px 12px",border:`1px solid ${T.border}`,borderRadius:6,fontSize:13,color:T.text,outline:"none",fontFamily:"inherit",boxSizing:"border-box",background:"#fff"}} />
setNewTask(p=>({...p,due:e.target.value}))} style={{width:"100%",padding:"8px 12px",border:`1px solid ${T.border}`,borderRadius:6,fontSize:13,color:T.text,outline:"none",fontFamily:"inherit",background:"#fff"}} />