80 lines
2.8 KiB
TypeScript
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>
|
|
);
|
|
}
|