diff --git a/frontend/src/pages/System/Role/components/AssignTagDialog.tsx b/frontend/src/pages/System/Role/components/AssignTagDialog.tsx new file mode 100644 index 00000000..1ec6307e --- /dev/null +++ b/frontend/src/pages/System/Role/components/AssignTagDialog.tsx @@ -0,0 +1,166 @@ +import React, { useEffect, useState } from 'react'; +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, + DialogFooter, +} from '@/components/ui/dialog'; +import { Button } from '@/components/ui/button'; +import { Badge } from '@/components/ui/badge'; +import { Checkbox } from '@/components/ui/checkbox'; +import { Label } from '@/components/ui/label'; +import { useToast } from '@/components/ui/use-toast'; +import { Loader2, Tag as TagIcon } from 'lucide-react'; +import type { RoleTagResponse } from '../types'; +import { getAllTags, assignTags } from '../service'; + +interface AssignTagDialogProps { + open: boolean; + roleId: number; + onOpenChange: (open: boolean) => void; + onSuccess: () => void; + selectedTags?: RoleTagResponse[]; +} + +/** + * 分配标签对话框 + */ +const AssignTagDialog: React.FC = ({ + open, + roleId, + onOpenChange, + onSuccess, + selectedTags = [] +}) => { + const { toast } = useToast(); + const [loading, setLoading] = useState(false); + const [submitting, setSubmitting] = useState(false); + const [allTags, setAllTags] = useState([]); + const [selectedTagIds, setSelectedTagIds] = useState([]); + + useEffect(() => { + if (open) { + loadTags(); + setSelectedTagIds(selectedTags.map(tag => tag.id)); + } + }, [open, selectedTags]); + + const loadTags = async () => { + try { + setLoading(true); + const tags = await getAllTags(); + setAllTags(tags); + } catch (error) { + console.error('获取标签列表失败:', error); + toast({ + title: '加载失败', + description: error instanceof Error ? error.message : '未知错误', + variant: 'destructive' + }); + } finally { + setLoading(false); + } + }; + + const handleToggle = (tagId: number) => { + setSelectedTagIds(prev => + prev.includes(tagId) + ? prev.filter(id => id !== tagId) + : [...prev, tagId] + ); + }; + + const handleSubmit = async () => { + setSubmitting(true); + try { + await assignTags(roleId, selectedTagIds); + toast({ + title: '分配成功', + description: '标签已成功分配给角色', + }); + onSuccess(); + } catch (error) { + console.error('分配标签失败:', error); + toast({ + title: '分配失败', + description: error instanceof Error ? error.message : '未知错误', + variant: 'destructive' + }); + } finally { + setSubmitting(false); + } + }; + + return ( + + + + + 分配标签 + + +
+ {loading ? ( +
+ + 加载中... +
+ ) : ( + <> + +
+ {allTags.length > 0 ? ( + allTags.map(tag => ( +
+ handleToggle(tag.id)} + /> + +
+ )) + ) : ( +
+ 暂无可用标签 +
+ )} +
+ + )} +
+ + + + +
+
+ ); +}; + +export default AssignTagDialog; + diff --git a/frontend/src/pages/System/Role/components/AssignTagModal.tsx b/frontend/src/pages/System/Role/components/AssignTagModal.tsx deleted file mode 100644 index c7843324..00000000 --- a/frontend/src/pages/System/Role/components/AssignTagModal.tsx +++ /dev/null @@ -1,84 +0,0 @@ -import React, { useEffect, useState } from 'react'; -import { Modal, Select, message, Spin } from 'antd'; -import type { RoleTagResponse } from '../types'; -import { getAllTags, assignTags } from '../service'; - -interface AssignTagModalProps { - visible: boolean; - roleId: number; - onCancel: () => void; - onSuccess: () => void; - selectedTags?: RoleTagResponse[]; -} - -const AssignTagModal: React.FC = ({ - visible, - roleId, - onCancel, - onSuccess, - selectedTags = [] -}) => { - const [loading, setLoading] = useState(false); - const [allTags, setAllTags] = useState([]); - const [selectedTagIds, setSelectedTagIds] = useState([]); - - useEffect(() => { - if (visible) { - loadTags(); - setSelectedTagIds(selectedTags.map(tag => tag.id)); - } - }, [visible, selectedTags]); - - const loadTags = async () => { - try { - setLoading(true); - const tags = await getAllTags(); - setAllTags(tags); - } catch (error) { - message.error('获取标签列表失败'); - } finally { - setLoading(false); - } - }; - - const handleOk = async () => { - try { - await assignTags(roleId, selectedTagIds); - message.success('标签分配成功'); - onSuccess(); - } catch (error) { - message.error('标签分配失败'); - } - }; - - return ( - - - setFormData({ ...formData, code: e.target.value })} + placeholder="请输入角色编码" + disabled={!!record} + /> + + +
+ + setFormData({ ...formData, name: e.target.value })} + placeholder="请输入角色名称" + /> +
+ +
+ + setFormData({ ...formData, sort: Number(e.target.value) })} + placeholder="请输入排序值" + /> +
+ +
+ +