Add read-only Noya admin panel with assignments and UX polish.

Ship admin auth, user overview, assessments, chats, assignment filters/export, security hardening, and a separate desktop admin shell with clearer assessment answers.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
ar.badiei
2026-09-21 08:00:24 +03:30
co-authored by Cursor
parent 8016b8f45e
commit c6243caa35
104 changed files with 15654 additions and 415 deletions
+21 -1
View File
@@ -4,7 +4,7 @@ import { motion, AnimatePresence } from 'framer-motion';
import { useAuth } from '@/hooks/useAuth';
import { APP_NAME } from '@/utils/constants';
import { BrandLogo } from '@/components/BrandLogo';
import { ClipboardList, LogOut, Moon, Sun, User } from 'lucide-react';
import { ClipboardList, LogOut, Moon, NotebookPen, Sun, User } from 'lucide-react';
import { MOTION_DURATION, MOTION_EASE, fastTransition } from '@/lib/motion';
import { useTheme } from '@/hooks/useTheme';
import { cn } from '@/lib/utils';
@@ -127,6 +127,26 @@ export function AppHeader() {
<ClipboardList className="h-4 w-4 shrink-0 text-sky-600 dark:text-sky-400" />
وضعیت دوره
</Link>
<Link
to="/assignments"
role="menuitem"
className="header-menu-item"
onClick={() => setMenuOpen(false)}
>
<NotebookPen className="h-4 w-4 shrink-0 text-sky-600 dark:text-sky-400" />
تکالیف من
</Link>
{user?.role === 'admin' ? (
<Link
to="/admin"
role="menuitem"
className="header-menu-item"
onClick={() => setMenuOpen(false)}
>
<ClipboardList className="h-4 w-4 shrink-0 text-sky-600 dark:text-sky-400" />
پنل ادمین
</Link>
) : null}
<button
type="button"
role="menuitem"