import React, { useEffect, useState } from 'react'; import { api, type GuideLinkItem } from '../api'; import type { StatsResponse } from '../api'; import { useAuth } from '../auth/AuthContext'; interface DashboardTabProps { onNavigate: (tab: string) => void; } const IconClasses = () => ( ); const IconActiveClasses = () => ( ); const IconStudents = () => ( ); const IconAlert = () => ( ); export const DashboardTab: React.FC = ({ onNavigate }) => { const { staff } = useAuth(); const isSuperAdmin = staff?.email === 'phuocntb@rikkeiacademy.com'; const [stats, setStats] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); // Guide links (teacher guides) state const [links, setLinks] = useState([]); const [linksLoading, setLinksLoading] = useState(true); // Modal states const [showModal, setShowModal] = useState(false); const [editingLink, setEditingLink] = useState(null); const [modalTitle, setModalTitle] = useState(''); const [modalUrl, setModalUrl] = useState(''); const [modalSaving, setModalSaving] = useState(false); const fetchLinks = async () => { try { setLinksLoading(true); const res = await api.listGuideLinks(); setLinks(res.data || []); } catch (err) { console.error('Không thể tải tài liệu hướng dẫn giáo viên:', err); } finally { setLinksLoading(false); } }; useEffect(() => { const fetchStats = async () => { try { setLoading(true); const data = await api.getStats(); setStats(data); } catch (err: any) { setError(err.message || 'Không thể tải dữ liệu thống kê'); } finally { setLoading(false); } }; fetchStats(); fetchLinks(); }, []); const handleOpenAddModal = () => { setEditingLink(null); setModalTitle(''); setModalUrl(''); setShowModal(true); }; const handleOpenEditModal = (link: GuideLinkItem) => { setEditingLink(link); setModalTitle(link.title); setModalUrl(link.url); setShowModal(true); }; const handleSaveLink = async () => { if (!modalTitle.trim() || !modalUrl.trim()) { alert('Vui lòng điền đầy đủ tiêu đề và đường dẫn'); return; } try { setModalSaving(true); if (editingLink) { await api.updateGuideLink(editingLink.id, modalTitle.trim(), modalUrl.trim()); } else { await api.createGuideLink(modalTitle.trim(), modalUrl.trim()); } setShowModal(false); await fetchLinks(); } catch (err: any) { alert(err.message || 'Lưu tài liệu thất bại'); } finally { setModalSaving(false); } }; const handleDeleteLink = async (id: number, title: string) => { if (window.confirm(`Bạn có chắc chắn muốn xóa tài liệu giáo viên "${title}"?`)) { try { await api.deleteGuideLink(id); await fetchLinks(); } catch (err: any) { alert(err.message || 'Xóa tài liệu thất bại'); } } }; return ( Tổng Quan Hệ Thống Giám sát đồng bộ và quản lý lớp học, sinh viên từ hệ thống chính {loading && ( Đang tải thông số hệ thống... )} {error && ( Lỗi: {error} )} {!loading && !error && stats && ( <> onNavigate('classes')} style={{ cursor: 'pointer' }}> Tổng lớp học đã đồng bộ {stats.totalClasses} onNavigate('classes')} style={{ cursor: 'pointer' }}> Lớp đang giảng dạy {stats.activeClasses} onNavigate('students')} style={{ cursor: 'pointer' }}> Tổng sinh viên đã đồng bộ {stats.totalStudents} Khởi động nhanh Chào mừng bạn đến với trang quản trị Simple Care. Hệ thống hỗ trợ quản lý lớp học, thi cử và chăm sóc sinh viên. onNavigate('classes')}> Quản lý lớp học onNavigate('learning')}> Lịch học & Giám sát onNavigate('exams')}> Quản lý phòng thi Tài liệu nội bộ (Giáo viên) {isSuperAdmin && ( + Thêm tài liệu )} {linksLoading && ( )} {!linksLoading && links.length === 0 && ( Chưa có tài liệu hướng dẫn nào được cấu hình. )} {!linksLoading && links.length > 0 && ( {links.map((link) => ( { e.currentTarget.style.borderColor = 'rgba(187, 33, 38, 0.25)'; e.currentTarget.style.backgroundColor = '#fff'; e.currentTarget.style.boxShadow = 'var(--shadow-sm)'; }} onMouseLeave={(e) => { e.currentTarget.style.borderColor = 'var(--border-color)'; e.currentTarget.style.backgroundColor = 'var(--bg-app)'; e.currentTarget.style.boxShadow = 'none'; }} > e.currentTarget.style.color = 'var(--accent)'} onMouseLeave={(e) => e.currentTarget.style.color = 'var(--text-primary)'} > {link.title} {isSuperAdmin && ( handleOpenEditModal(link)} style={{ padding: '0.25rem 0.5rem', fontSize: '0.75rem' }} > Sửa handleDeleteLink(link.id, link.title)} style={{ padding: '0.25rem 0.5rem', fontSize: '0.75rem', color: 'var(--danger)', borderColor: 'rgba(214, 48, 49, 0.2)' }} > Xóa )} ))} )} > )} {showModal && ( setShowModal(false)}> e.stopPropagation()}> {editingLink ? 'Cập nhật tài liệu' : 'Thêm tài liệu hướng dẫn'} setShowModal(false)} aria-label="Đóng">× Tiêu đề tài liệu setModalTitle(e.target.value)} placeholder="VD: Hướng dẫn coi thi cuối kỳ" style={{ width: '100%', padding: '0.55rem 0.75rem', borderRadius: 'var(--radius-sm)', border: '1px solid var(--border-color)', fontSize: '0.9rem', outline: 'none', transition: 'var(--transition)' }} onFocus={e => e.target.style.borderColor = 'var(--accent)'} onBlur={e => e.target.style.borderColor = 'var(--border-color)'} /> Đường dẫn Google Docs setModalUrl(e.target.value)} placeholder="https://docs.google.com/document/d/..." style={{ width: '100%', padding: '0.55rem 0.75rem', borderRadius: 'var(--radius-sm)', border: '1px solid var(--border-color)', fontSize: '0.9rem', outline: 'none', transition: 'var(--transition)' }} onFocus={e => e.target.style.borderColor = 'var(--accent)'} onBlur={e => e.target.style.borderColor = 'var(--border-color)'} /> setShowModal(false)}>Hủy {modalSaving ? 'Đang lưu...' : 'Lưu lại'} )} ); };
Giám sát đồng bộ và quản lý lớp học, sinh viên từ hệ thống chính
Đang tải thông số hệ thống...
Lỗi: {error}
Chào mừng bạn đến với trang quản trị Simple Care. Hệ thống hỗ trợ quản lý lớp học, thi cử và chăm sóc sinh viên.
Chưa có tài liệu hướng dẫn nào được cấu hình.