/** * 模块权限配置弹窗 */ import React, { useState, useEffect } from 'react'; import { Modal, Checkbox, Row, Col, message, Typography, Spin, Alert, } from 'antd'; import * as userApi from '../api/userApi'; import type { TenantMembership, ModuleOption } from '../types/user'; const { Text } = Typography; interface ModulePermissionModalProps { visible: boolean; userId: string; membership: TenantMembership; onClose: () => void; onSuccess: () => void; } const ModulePermissionModal: React.FC = ({ visible, userId, membership, onClose, onSuccess, }) => { const [submitting, setSubmitting] = useState(false); const [loading, setLoading] = useState(false); const [moduleOptions, setModuleOptions] = useState([]); const [selectedModules, setSelectedModules] = useState([]); // 加载模块选项 useEffect(() => { if (visible && membership) { setLoading(true); userApi.getModuleOptions(membership.tenantId) .then((options) => { setModuleOptions(options); // 设置当前已启用的模块 const enabled = membership.allowedModules .filter((m) => m.isEnabled) .map((m) => m.code); setSelectedModules(enabled); }) .catch(console.error) .finally(() => setLoading(false)); } }, [visible, membership]); // 提交 const handleSubmit = async () => { setSubmitting(true); try { await userApi.updateUserModules(userId, { tenantId: membership.tenantId, modules: selectedModules, }); message.success('模块权限更新成功'); onSuccess(); } catch (error: any) { message.error(error.response?.data?.message || '更新失败'); } finally { setSubmitting(false); } }; return ( {moduleOptions.length > 0 ? ( setSelectedModules(values as string[])} style={{ width: '100%' }} > {moduleOptions.map((module) => ( {module.name} {!module.isSubscribed && ( (未订阅) )} ))} ) : ( 暂无可用模块 )} ); }; export default ModulePermissionModal;