feat: Add refresh button and admin restrictions

This commit is contained in:
gpt-engineer-app[bot]
2025-09-28 19:08:01 +00:00
parent c7825fbe03
commit 661bf77d95
2 changed files with 25 additions and 11 deletions

View File

@@ -1,4 +1,4 @@
import { Shield, ArrowLeft, Settings } from 'lucide-react'; import { Shield, ArrowLeft, Settings, RefreshCw } from 'lucide-react';
import { Button } from '@/components/ui/button'; import { Button } from '@/components/ui/button';
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
import { ThemeToggle } from '@/components/theme/ThemeToggle'; import { ThemeToggle } from '@/components/theme/ThemeToggle';
@@ -30,6 +30,15 @@ export function AdminHeader() {
{/* Right Section - Admin actions */} {/* Right Section - Admin actions */}
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<Button
variant="ghost"
size="sm"
onClick={() => window.location.reload()}
title="Refresh admin data"
>
<RefreshCw className="w-4 h-4" />
<span className="hidden sm:ml-2 sm:inline">Refresh</span>
</Button>
{permissions?.role_level === 'superuser' && ( {permissions?.role_level === 'superuser' && (
<Button variant="ghost" size="sm" asChild> <Button variant="ghost" size="sm" asChild>
<Link to="/admin/settings"> <Link to="/admin/settings">

View File

@@ -37,7 +37,7 @@ export function UserRoleManager() {
const [searchResults, setSearchResults] = useState<any[]>([]); const [searchResults, setSearchResults] = useState<any[]>([]);
const [actionLoading, setActionLoading] = useState<string | null>(null); const [actionLoading, setActionLoading] = useState<string | null>(null);
const { user } = useAuth(); const { user } = useAuth();
const { isAdmin } = useUserRole(); const { isAdmin, isSuperuser, permissions } = useUserRole();
const { toast } = useToast(); const { toast } = useToast();
const fetchUserRoles = async () => { const fetchUserRoles = async () => {
@@ -271,7 +271,9 @@ export function UserRoleManager() {
</SelectTrigger> </SelectTrigger>
<SelectContent> <SelectContent>
<SelectItem value="moderator">Moderator</SelectItem> <SelectItem value="moderator">Moderator</SelectItem>
<SelectItem value="admin">Administrator</SelectItem> {isSuperuser() && (
<SelectItem value="admin">Administrator</SelectItem>
)}
</SelectContent> </SelectContent>
</Select> </Select>
</div> </div>
@@ -343,14 +345,17 @@ export function UserRoleManager() {
</Badge> </Badge>
</div> </div>
<Button {/* Only show revoke button if current user can manage this role */}
variant="outline" {(isSuperuser() || (isAdmin() && !['admin', 'superuser'].includes(userRole.role))) && (
size="sm" <Button
onClick={() => revokeRole(userRole.id)} variant="outline"
disabled={actionLoading === userRole.id} size="sm"
> onClick={() => revokeRole(userRole.id)}
<X className="w-4 h-4" /> disabled={actionLoading === userRole.id}
</Button> >
<X className="w-4 h-4" />
</Button>
)}
</CardContent> </CardContent>
</Card> </Card>
)) ))