import { AdminBranchManager } from '../../components/admin/AdminBranchManager'; import { AdminMissionManager } from '../../components/admin/AdminMissionManager'; import { AdminRankManager } from '../../components/admin/AdminRankManager'; import { AdminArtifactManager } from '../../components/admin/AdminArtifactManager'; import { AdminSubmissionCard } from '../../components/admin/AdminSubmissionCard'; import { apiFetch } from '../../lib/api'; import { requireRole } from '../../lib/auth/session'; interface Submission { id: number; mission_id: number; status: string; comment: string | null; proof_url: string | null; resume_link: string | null; passport_url: string | null; photo_url: string | null; resume_url: string | null; awarded_xp: number; awarded_mana: number; updated_at: string; } interface MissionSummary { id: number; title: string; description: string; xp_reward: number; mana_reward: number; difficulty: 'easy' | 'medium' | 'hard'; is_active: boolean; } interface BranchSummary { id: number; title: string; description: string; category: string; missions: Array<{ mission_id: number; mission_title: string; order: number }>; } interface RankSummary { id: number; title: string; description: string; required_xp: number; } interface CompetencySummary { id: number; name: string; description: string; category: string; } interface ArtifactSummary { id: number; name: string; description: string; rarity: string; image_url?: string | null; } interface SubmissionStats { pending: number; approved: number; rejected: number; } interface BranchCompletionStat { branch_id: number; branch_title: string; completion_rate: number; } interface AdminStats { total_users: number; active_pilots: number; average_completed_missions: number; submission_stats: SubmissionStats; branch_completion: BranchCompletionStat[]; } export default async function AdminPage() { // Админ-панель доступна только HR-сотрудникам; проверяем роль до загрузки данных. const session = await requireRole('hr'); const [submissions, missions, branches, ranks, competencies, artifacts, stats] = await Promise.all([ apiFetch('/api/admin/submissions', { authToken: session.token }), apiFetch('/api/admin/missions', { authToken: session.token }), apiFetch('/api/admin/branches', { authToken: session.token }), apiFetch('/api/admin/ranks', { authToken: session.token }), apiFetch('/api/admin/competencies', { authToken: session.token }), apiFetch('/api/admin/artifacts', { authToken: session.token }), apiFetch('/api/admin/stats', { authToken: session.token }) ]); return (

HR-панель

Управляйте миссиями, ветками и рангами, а также следите за очередью модерации отчётов.

Сводка

Пилоты

{stats.total_users}

Всего зарегистрировано
Активность

{stats.active_pilots}

Закрыли хотя бы одну миссию
Средний прогресс

{stats.average_completed_missions.toFixed(1)}

Миссий на пилота
Очередь модерации

На проверке: {stats.submission_stats.pending}

Одобрено: {stats.submission_stats.approved} · Отклонено: {stats.submission_stats.rejected}
Завершённость веток
    {stats.branch_completion.map((branchStat) => (
  • {branchStat.branch_title}: {(branchStat.completion_rate * 100).toFixed(0)}%
  • ))}

Очередь модерации

Список последующих отправок миссий. Для полноты UX можно добавить действия approve/reject прямо отсюда.

{submissions.map((submission) => ( ))} {submissions.length === 0 &&

Очередь пуста — все миссии проверены.

}
); }