events pages

This commit is contained in:
2025-04-02 10:04:36 +08:00
parent 9cb9f62686
commit bf7c62fdc9
4 changed files with 343 additions and 172 deletions

View File

@@ -18,6 +18,14 @@ interface Project {
deleted_at?: string | null;
schema_version?: number | null;
creator_id?: string | null;
team_name?: string;
}
// 添加需要的类型定义
interface ProjectWithTeam {
project_id: string;
projects: Project;
teams?: { name: string };
}
// ProjectSelector component with multi-select support
@@ -85,14 +93,14 @@ export function ProjectSelector({
let projectsQuery;
if (teamId) {
// If a teamId is provided, fetch projects for that team
// 如果提供了teamId,获取该团队的项目
projectsQuery = supabase
.from('team_projects')
.select('project_id, projects:project_id(*)')
.select('project_id, projects:project_id(*), teams:team_id(name)')
.eq('team_id', teamId)
.is('projects.deleted_at', null);
} else {
// Otherwise, fetch projects the user is a member of
// 否则,获取用户所属的所有项目及其所属团队
projectsQuery = supabase
.from('user_projects')
.select('project_id, projects:project_id(*)')
@@ -109,17 +117,59 @@ export function ProjectSelector({
return;
}
// Extract the project data from the query results
if (isMounted && projectsData && projectsData.length > 0) {
const projectList: Project[] = [];
// 如果没有提供teamId需要单独获取每个项目对应的团队信息
if (!teamId && projectsData.length > 0) {
const projectIds = projectsData.map(item => item.project_id);
for (const item of projectsData) {
if (item.projects && typeof item.projects === 'object' && 'id' in item.projects && 'name' in item.projects) {
projectList.push(item.projects as Project);
}
// 获取项目所属的团队信息
const { data: teamProjectsData, error: teamProjectsError } = await supabase
.from('team_projects')
.select('project_id, teams:team_id(name)')
.in('project_id', projectIds);
if (teamProjectsError) throw teamProjectsError;
// 创建项目ID到团队名称的映射
const projectTeamMap: Record<string, string> = {};
if (teamProjectsData) {
teamProjectsData.forEach(item => {
if (item.teams && typeof item.teams === 'object' && 'name' in item.teams) {
projectTeamMap[item.project_id] = (item.teams as { name: string }).name;
}
});
}
setProjects(projectList);
// 提取项目数据,并添加团队名称
if (isMounted && projectsData) {
const projectList: Project[] = [];
for (const item of projectsData) {
if (item.projects && typeof item.projects === 'object' && 'id' in item.projects && 'name' in item.projects) {
const project = item.projects as Project;
project.team_name = projectTeamMap[project.id];
projectList.push(project);
}
}
setProjects(projectList);
}
} else {
// 如果提供了teamId直接从查询结果中提取项目和团队信息
if (isMounted && projectsData) {
const projectList: Project[] = [];
for (const item of projectsData as ProjectWithTeam[]) {
if (item.projects && typeof item.projects === 'object' && 'id' in item.projects && 'name' in item.projects) {
const project = item.projects as Project;
if (item.teams && 'name' in item.teams) {
project.team_name = item.teams.name;
}
projectList.push(project);
}
}
setProjects(projectList);
}
}
} catch (err) {
if (isMounted) {
@@ -274,6 +324,11 @@ export function ProjectSelector({
>
<span className="flex flex-col">
<span className="font-medium">{project.name}</span>
{project.team_name && (
<span className="text-xs text-gray-500">
{project.team_name}
</span>
)}
{project.description && (
<span className="text-xs text-gray-500 truncate max-w-[250px]">
{project.description}