diff --git a/src/hooks/team/useTeams.js b/src/hooks/team/useTeams.js index cbd2482..88c253d 100644 --- a/src/hooks/team/useTeams.js +++ b/src/hooks/team/useTeams.js @@ -42,12 +42,35 @@ export const useTeams = () => { } }; + // 创建团队前检查类型是否已存在 + const checkTeamTypeExists = async (type) => { + try { + const {data} = await supabaseService.select('teams', { + filter: { + deleted_at: { is: null }, + 'attributes->>type': { eq: type } + } + }); + return data.length > 0; + } catch (error) { + console.error('检查团队类型失败:', error); + throw error; + } + }; + // 创建团队 const createTeam = async (values) => { try { + if (values.type) { + const result = await checkTeamTypeExists(values.type); + if (result) { + throw new Error(`团队类型 "${values.type}" 已存在,请使用其他类型名称`); + } + } const newTeam = await supabaseService.insert('teams', { name: values.name, - description: values.description + description: values.description, + attributes: { type: values.type } }); // 创建团队成员关系 diff --git a/src/pages/resource/team/components/CreateTeamModal/TeamForm.jsx b/src/pages/resource/team/components/CreateTeamModal/TeamForm.jsx index 4c450b8..99f04bb 100644 --- a/src/pages/resource/team/components/CreateTeamModal/TeamForm.jsx +++ b/src/pages/resource/team/components/CreateTeamModal/TeamForm.jsx @@ -41,7 +41,12 @@ export const TeamForm = ({ form }) => { > - + + + { @@ -69,17 +70,26 @@ export const ExpandedMemberships = ({ teamId }) => { } }; - const handleAdd = () => { + const handleAdd = (value) => { + handleModalOk(value) setIsModalVisible(true); form.resetFields(); }; - const handleModalOk = async () => { + const handleModalOk = async (values) => { try { - const values = await form.validateFields(); + const { data: users, error: userError } = await supabase + .from('users') + .select('id, email') + .eq('email', values.email) + .single(); + if (userError || users.length===0) { + throw new Error('未找到该用户'); + } await supabaseService.insert('team_membership', { + id:uuidv4(), team_id: teamId, - user_id: values.user_id, + user_id: users.id, role: values.role, is_creator: false }); @@ -88,7 +98,7 @@ export const ExpandedMemberships = ({ teamId }) => { message.success('成员已添加'); await loadMemberships(); } catch (error) { - message.error('添加成员失败'); + message.error(error.message || '添加成员失败'); console.error('Add failed:', error); } }; diff --git a/src/pages/resource/team/components/MembershipTable.jsx b/src/pages/resource/team/components/MembershipTable.jsx index dfddfd8..edba38c 100644 --- a/src/pages/resource/team/components/MembershipTable.jsx +++ b/src/pages/resource/team/components/MembershipTable.jsx @@ -1,12 +1,14 @@ import React, { useState } from 'react'; -import { Table, Button, Space, Popconfirm, Tag, Form } from 'antd'; +import { Table, Button, Space, Popconfirm, Tag, Form, Modal, Input, Select } from 'antd'; import { EditOutlined, DeleteOutlined, SaveOutlined, CloseOutlined, PlusOutlined } from '@ant-design/icons'; import { EditableMembershipCell } from './EditableMembershipCell'; import { roleColors } from '../constants/teamConstants'; +import { message } from 'antd'; export const MembershipTable = ({ memberships, onUpdate, onDelete, onAdd }) => { const [form] = Form.useForm(); const [editingKey, setEditingKey] = useState(''); + const [addModalVisible, setAddModalVisible] = useState(false); const isEditing = (record) => record.id === editingKey; @@ -38,7 +40,6 @@ export const MembershipTable = ({ memberships, onUpdate, onDelete, onAdd }) => { render: (user) => (
{user?.email} - {user?.email}
), }, @@ -137,16 +138,71 @@ export const MembershipTable = ({ memberships, onUpdate, onDelete, onAdd }) => { }; }); + const AddMemberModal = ({ visible, onCancel, onAdd }) => { + const [loading, setLoading] = useState(false); + + const handleSubmit = async () => { + try { + setLoading(true); + const values = await form.validateFields(); + await onAdd(values); + form.resetFields(); + onCancel(); + } catch (error) { + message.error('添加失败: ' + error.message); + } finally { + setLoading(false); + } + }; + + return ( + +
+ + + + + + +
+
+ ); + }; + return (
- {/* */} +
{ pagination={false} /> + + setAddModalVisible(false)} + onAdd={onAdd} + /> ); }; \ No newline at end of file diff --git a/src/pages/resource/team/components/TeamForm.jsx b/src/pages/resource/team/components/TeamForm.jsx index 18ec025..762071c 100644 --- a/src/pages/resource/team/components/TeamForm.jsx +++ b/src/pages/resource/team/components/TeamForm.jsx @@ -48,7 +48,7 @@ export const TeamForm = ({ form }) => { > - + ), }, + { + title: '归属', + dataIndex: 'type', + dataIndex: ["attributes", "type"], + key: "type", + }, { title: '描述', dataIndex: 'description', diff --git a/src/pages/resource/team/index.jsx b/src/pages/resource/team/index.jsx index 80144f6..a7120c3 100644 --- a/src/pages/resource/team/index.jsx +++ b/src/pages/resource/team/index.jsx @@ -152,7 +152,7 @@ const TeamManagement = () => { await loadTeams({ current: 1 }); message.success('创建团队成功'); } catch (error) { - message.error('创建团队失败'); + message.error(error.message); } finally { setConfirmLoading(false); }