Files
easyai-ai-gateway/apps/web/src/pages/admin/AccessRulesPanel.tsx
T

80 lines
2.8 KiB
TypeScript

import { useEffect, useState } from 'react';
import { ShieldCheck } from 'lucide-react';
import type {
BaseModelCatalogItem,
GatewayAccessRule,
GatewayAccessRuleBatchRequest,
IntegrationPlatform,
PlatformModel,
UserGroup,
} from '@easyai-ai-gateway/contracts';
import { Badge, Card, CardContent, CardHeader, CardTitle, Label, Select } from '../../components/ui';
import type { LoadState } from '../../types';
import { AccessPermissionEditor } from './AccessPermissionEditor';
export function AccessRulesPanel(props: {
accessRules: GatewayAccessRule[];
baseModels: BaseModelCatalogItem[];
message: string;
platformModels: PlatformModel[];
platforms: IntegrationPlatform[];
state: LoadState;
userGroups: UserGroup[];
onBatchAccessRules: (input: GatewayAccessRuleBatchRequest) => Promise<void>;
}) {
const [selectedGroupId, setSelectedGroupId] = useState(props.userGroups[0]?.id ?? '');
useEffect(() => {
if (!selectedGroupId && props.userGroups[0]?.id) {
setSelectedGroupId(props.userGroups[0].id);
}
}, [props.userGroups, selectedGroupId]);
return (
<div className="pageStack">
<Card>
<CardHeader>
<div>
<CardTitle>用户组访问权限</CardTitle>
<p className="mutedText">数据仍写入统一权限规则表;这里按用户组维护专属使用和不允许使用的平台/模型。</p>
</div>
<Badge variant="secondary">{props.accessRules.length} 条规则</Badge>
</CardHeader>
<CardContent>
{props.message && <p className="formMessage">{props.message}</p>}
<div className="accessGroupToolbar">
<Label>
用户组
<Select size="sm" value={selectedGroupId} onChange={(event) => setSelectedGroupId(event.target.value)}>
{props.userGroups.map((group) => <option value={group.id} key={group.id}>{group.name}</option>)}
</Select>
</Label>
<div className="accessGroupHint">
<ShieldCheck size={15} />
<span>未配置规则时默认放行;拒绝规则优先于专属规则。</span>
</div>
</div>
</CardContent>
</Card>
{selectedGroupId ? (
<AccessPermissionEditor
accessRules={props.accessRules}
metadataMode="user_group_permission_tree"
platformModels={props.platformModels}
platforms={props.platforms}
state={props.state}
subjectId={selectedGroupId}
subjectType="user_group"
onBatchAccessRules={props.onBatchAccessRules}
/>
) : (
<div className="emptyState">
<strong>暂无用户组</strong>
<span>请先创建用户组,再维护平台和模型权限。</span>
</div>
)}
</div>
);
}