// Students / CRM screen. const STATUS_META = { active: { fa: 'فعال', cls: 'ok' }, completed: { fa: 'فارغالتحصیل', cls: 'info' }, 'at-risk': { fa: 'خطر ریزش', cls: 'warn' }, }; function StudentsScreen() { const { STUDENTS, COURSES } = window.DATA; const [tab, setTab] = React.useState('all'); const [selected, setSelected] = React.useState(new Set()); const [detail, setDetail] = React.useState(STUDENTS[0]); const [search, setSearch] = React.useState(''); const filtered = STUDENTS.filter(s => { if (tab !== 'all' && s.status !== tab) return false; if (search && !s.name.includes(search) && !s.course.includes(search)) return false; return true; }); const toggleSel = (id) => { const next = new Set(selected); next.has(id) ? next.delete(id) : next.add(id); setSelected(next); }; const segmentCounts = { all: STUDENTS.length, active: STUDENTS.filter(s => s.status === 'active').length, completed: STUDENTS.filter(s => s.status === 'completed').length, 'at-risk': STUDENTS.filter(s => s.status === 'at-risk').length, }; return (
مدیریت ارتباط با {STUDENTS.length} دانشجو در ۲ دوره
| 0} onChange={() => { if (selected.size === filtered.length) setSelected(new Set()); else setSelected(new Set(filtered.map(s => s.id))); }} /> | دانشجو | دوره | پیشرفت | وضعیت | آخرین فعالیت | |
|---|---|---|---|---|---|---|
| e.stopPropagation()}> toggleSel(s.id)} /> |
{s.initials}
{s.name}
{s.tag}
|
{s.course} |
= 100 ? 'oklch(0.62 0.14 155)' : 'var(--accent)') }} />
{String(s.progress).replace(/\d/g, d => '۰۱۲۳۴۵۶۷۸۹'[d])}٪
|
{STATUS_META[s.status].fa} | {s.lastActive} | e.stopPropagation()}> |