fix: refresh token re-reads role from DB; remove staff stats cards

- /api/auth/refresh now fetches current role from DB instead of using
  stale Redis payload — role changes now take effect on next page refresh
  without requiring re-login. Also deactivates token if user.active=false.
- Removed role-count stat cards from staff page (user request)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-20 20:17:09 +03:00
parent a05bc3c48e
commit 696cf4d38c
2 changed files with 28 additions and 28 deletions

View File

@@ -1025,10 +1025,8 @@ export function UsersPage() {
}
}
const stats = {
total: users.length,
active: users.filter(u => u.isActive).length,
}
const totalUsers = users.length
const activeUsers = users.filter(u => u.isActive).length
return (
<div className="p-4 md:p-6 space-y-5">
@@ -1036,7 +1034,7 @@ export function UsersPage() {
<div className="flex items-center justify-between">
<div>
<h1 className="text-xl font-bold text-slate-900 dark:text-slate-100">Сотрудники</h1>
<p className="text-sm text-slate-500 dark:text-slate-400">{stats.total} пользователей · {stats.active} активных</p>
<p className="text-sm text-slate-500 dark:text-slate-400">{totalUsers} пользователей · {activeUsers} активных</p>
</div>
{tab === 'staff' && (
<button className="btn-primary" onClick={openCreate}>
@@ -1066,25 +1064,6 @@ export function UsersPage() {
{tab === 'staff' && (
<>
{/* Stats */}
<div className="grid grid-cols-2 md:grid-cols-4 gap-3">
{(Object.entries(ROLE_META) as [StaffRole, typeof ROLE_META[StaffRole]][]).map(([role, meta]) => {
const count = users.filter(u => u.role === role).length
return (
<div key={role} className="card p-4 cursor-pointer hover:shadow-card-hover transition-shadow"
onClick={() => setRoleFilter(roleFilter === role ? 'all' : role)}>
<div className="flex items-center gap-2 mb-1">
<meta.icon size={14} className="text-slate-500 dark:text-slate-400" />
<span className={cn('text-xs font-medium px-1.5 py-0.5 rounded-full', meta.color)}>
{meta.label}
</span>
</div>
<p className="text-2xl font-bold text-slate-900 dark:text-slate-100">{count}</p>
</div>
)
})}
</div>
{/* Filters */}
<div className="flex gap-3 flex-wrap">
<div className="relative flex-1 min-w-48">