// 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 (
{/* header */}

دانشجویان

مدیریت ارتباط با {STUDENTS.length} دانشجو در ۲ دوره

{/* stat strip */}
{[ { l: 'کل دانشجویان', v: STUDENTS.length, sub: '+۴۸ این ماه', good: true }, { l: 'فعال این هفته', v: STUDENTS.filter(s => s.status === 'active').length, sub: '۸۲٪ نرخ فعالیت', good: true }, { l: 'تکمیل‌کنندگان', v: STUDENTS.filter(s => s.status === 'completed').length, sub: 'نرخ ۴۲٪', good: true }, { l: 'در معرض ریزش', v: STUDENTS.filter(s => s.status === 'at-risk').length, sub: 'نیاز به پیگیری', good: false }, ].map((s, i) => (
{s.l}
{String(s.v).replace(/\d/g, d => '۰۱۲۳۴۵۶۷۸۹'[d])}
{s.sub}
))}
{/* main: list + detail */}
{/* filters */}
{[ ['all', 'همه'], ['active', 'فعال'], ['completed', 'تکمیل‌شده'], ['at-risk', 'در معرض ریزش'], ].map(([k, v]) => ( ))}
setSearch(e.target.value)} />
{selected.size > 0 && ( {String(selected.size).replace(/\d/g, d => '۰۱۲۳۴۵۶۷۸۹'[d])} انتخاب شده )}
{/* table */}
{filtered.map(s => ( setDetail(s)} style={{ background: detail?.id === s.id ? 'var(--accent-soft)' : undefined }}> ))}
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()}>
{/* footer */}
نمایش {filtered.length} از {STUDENTS.length} دانشجو
{/* detail panel */} {detail && (
{detail.initials}
{detail.name}
عضو از {detail.joined}

پیشرفت در دوره

{detail.course} {String(detail.progress).replace(/\d/g, d => '۰۱۲۳۴۵۶۷۸۹'[d])}٪
۲۴ از ۳۸ درس ۸ ساعت تماشا
{[ { l: 'مبلغ پرداختی', v: detail.spent + ' ت', cls: 'num' }, { l: 'آزمون‌های موفق', v: '۳ از ۴', cls: 'num' }, { l: 'تمرین ارسالی', v: '۵', cls: 'num' }, { l: 'امتیاز رضایت', v: '⭐ ۴٫۸', cls: '' }, ].map((s, i) => (
{s.l}
{s.v}
))}

تایم‌لاین

{[ { ic: 'check', t: 'درس «تئوری رنگ کاربردی» را تمام کرد', when: '۲ ساعت پیش', color: 'oklch(0.62 0.14 155)' }, { ic: 'chat', t: 'پرسشی در گفت‌وگوی دوره مطرح کرد', when: 'دیروز', color: 'oklch(0.70 0.12 240)' }, { ic: 'quiz', t: 'به آزمون فصل اول نمره ۹۲ گرفت', when: '۳ روز پیش', color: 'oklch(0.72 0.12 280)' }, { ic: 'star', t: 'دوره را خریداری کرد', when: detail.joined, color: 'oklch(0.74 0.13 50)' }, ].map((x, i) => (
{x.t}
{x.when}
))}
)}
); } window.StudentsScreen = StudentsScreen;