生产管理系统 - 角色管理联调

This commit is contained in:
2025-11-06 10:17:44 +08:00
parent 279bbe8536
commit 9f1cf21042
8 changed files with 600 additions and 189 deletions

View File

@@ -5,18 +5,21 @@ import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, Di
import { Button } from '@/components/ui/button';
import { Label } from '@/components/ui/label';
import { Badge } from '@/components/ui/badge';
import { Loader2 } from 'lucide-react';
import { Role, RoleType } from '../types';
interface RoleDetailDialogProps {
open: boolean;
onOpenChange: (open: boolean) => void;
selectedRole: Role | null;
detailLoading?: boolean;
}
export function RoleDetailDialog({
open,
onOpenChange,
selectedRole
selectedRole,
detailLoading = false
}: RoleDetailDialogProps) {
const getRoleTypeBadge = (type: RoleType) => {
return type === 'system' ? (
@@ -34,8 +37,6 @@ export function RoleDetailDialog({
);
};
if (!selectedRole) return null;
return (
<Dialog open={open} onOpenChange={onOpenChange}>
<DialogContent className="max-w-2xl">
@@ -46,58 +47,69 @@ export function RoleDetailDialog({
</DialogDescription>
</DialogHeader>
<div className="space-y-4">
<div className="grid grid-cols-2 gap-4">
<div>
<Label></Label>
<div className="mt-1">{selectedRole.name}</div>
{detailLoading ? (
<div className="flex items-center justify-center py-8">
<Loader2 className="h-6 w-6 animate-spin mr-2" />
<span>...</span>
</div>
<div>
<Label></Label>
<div className="mt-1">{selectedRole.code}</div>
</div>
<div className="col-span-2">
<Label></Label>
<div className="mt-1">{selectedRole.description || '-'}</div>
</div>
<div>
<Label></Label>
<div className="mt-1">{getRoleTypeBadge(selectedRole.type)}</div>
</div>
<div>
<Label></Label>
<div className="mt-1">{getStatusBadge(selectedRole.status)}</div>
</div>
{selectedRole.defaultHomePage && (
) : selectedRole ? (
<div className="grid grid-cols-2 gap-4">
<div>
<Label></Label>
<div className="mt-1">{selectedRole.name}</div>
</div>
<div>
<Label></Label>
<div className="mt-1">{selectedRole.code}</div>
</div>
<div className="col-span-2">
<Label></Label>
<div className="mt-1">{selectedRole.defaultHomePage}</div>
<Label></Label>
<div className="mt-1">{selectedRole.description || '-'}</div>
</div>
)}
<div>
<Label></Label>
<div className="mt-1">
{selectedRole.menuIds.includes('*') ? '全部' : selectedRole.menuIds.length}
<div>
<Label></Label>
<div className="mt-1">{getRoleTypeBadge(selectedRole.type)}</div>
</div>
<div>
<Label></Label>
<div className="mt-1">{getStatusBadge(selectedRole.status)}</div>
</div>
{selectedRole.defaultHomePage && (
<div className="col-span-2">
<Label></Label>
<div className="mt-1">{selectedRole.defaultHomePage}</div>
</div>
)}
<div>
<Label></Label>
<div className="mt-1">
{selectedRole.menuIds?.includes('*') ? '全部' : (selectedRole.menuIds?.length || 0)}
</div>
</div>
<div>
<Label></Label>
<div className="mt-1">
{selectedRole.permissionIds?.includes('*') ? '全部' : (selectedRole.permissionIds?.length || 0)}
</div>
</div>
<div>
<Label></Label>
<div className="mt-1">
{new Date(selectedRole.createdAt).toLocaleString('zh-CN')}
</div>
</div>
<div>
<Label></Label>
<div className="mt-1">
{new Date(selectedRole.updatedAt).toLocaleString('zh-CN')}
</div>
</div>
</div>
<div>
<Label></Label>
<div className="mt-1">
{selectedRole.permissionIds.includes('*') ? '全部' : selectedRole.permissionIds.length}
</div>
) : (
<div className="flex items-center justify-center py-8">
<span></span>
</div>
<div>
<Label></Label>
<div className="mt-1">
{new Date(selectedRole.createdAt).toLocaleString('zh-CN')}
</div>
</div>
<div>
<Label></Label>
<div className="mt-1">
{new Date(selectedRole.updatedAt).toLocaleString('zh-CN')}
</div>
</div>
</div>
)}
</div>
<DialogFooter>
<Button variant="outline" onClick={() => onOpenChange(false)}>