diff --git a/packages/service/support/permission/schema.ts b/packages/service/support/permission/schema.ts index 1eebfceb2..dd94c8952 100644 --- a/packages/service/support/permission/schema.ts +++ b/packages/service/support/permission/schema.ts @@ -78,6 +78,11 @@ ResourcePermissionSchema.virtual('org', { }); try { + ResourcePermissionSchema.index({ + resourceType: 1, + teamId: 1 + }); + // Indexes for resourceId-based resources ResourcePermissionSchema.index( { diff --git a/projects/app/src/components/core/ai/ModelTable/index.tsx b/projects/app/src/components/core/ai/ModelTable/index.tsx index 104f16205..719ea1dc8 100644 --- a/projects/app/src/components/core/ai/ModelTable/index.tsx +++ b/projects/app/src/components/core/ai/ModelTable/index.tsx @@ -26,10 +26,10 @@ import dynamic from 'next/dynamic'; import CopyBox from '@fastgpt/web/components/common/String/CopyBox'; import MyIconButton from '@fastgpt/web/components/common/Icon/button'; import { useTableMultipleSelect } from '@fastgpt/web/hooks/useTableMultipleSelect'; -import CollaboratorContextProvider from '@/components/support/permission/MemberManager/context'; import { ReadRoleVal } from '@fastgpt/global/support/permission/constant'; import { getModelCollaborators, updateModelCollaborators } from '@/web/common/system/api'; import { useUserStore } from '@/web/support/user/useUserStore'; +import { LazyCollaboratorProvider } from '@/components/support/permission/MemberManager/context'; const MyModal = dynamic(() => import('@fastgpt/web/components/common/MyModal')); @@ -317,7 +317,7 @@ const ModelTable = () => { {item.priceLabel} {userInfo?.team.permission.hasManagePer && ( - getModelCollaborators(item.model)} @@ -335,12 +335,10 @@ const ModelTable = () => { size="1rem" hoverColor={'blue.500'} w="min-content" - onClick={() => { - onOpenManageModal(); - }} + onClick={onOpenManageModal} /> )} - + )} @@ -351,7 +349,7 @@ const ModelTable = () => { @@ -368,16 +366,11 @@ const ModelTable = () => { permission={userInfo?.team.permission!} > {({ onOpenManageModal }) => ( - )} - + } > diff --git a/projects/app/src/components/support/permission/MemberManager/context.tsx b/projects/app/src/components/support/permission/MemberManager/context.tsx index 0325ec853..6c6322e6b 100644 --- a/projects/app/src/components/support/permission/MemberManager/context.tsx +++ b/projects/app/src/components/support/permission/MemberManager/context.tsx @@ -10,7 +10,7 @@ import type { RoleListType, RoleValueType } from '@fastgpt/global/support/permission/type'; -import { type ReactNode, useCallback, useMemo } from 'react'; +import { type ReactNode, useCallback, useEffect, useMemo, useState } from 'react'; import { createContext } from 'use-context-selector'; import dynamic from 'next/dynamic'; @@ -230,3 +230,35 @@ const CollaboratorContextProvider = ({ }; export default CollaboratorContextProvider; + +export const LazyCollaboratorProvider = ({ + children, + ...props +}: { + children: (params: { onOpenManageModal: () => void }) => React.ReactNode; +} & React.ComponentProps) => { + const [isProviderMounted, setIsProviderMounted] = useState(false); + + const handleOpen = useCallback(() => { + setIsProviderMounted(true); + }, []); + + // 如果还未挂载 Provider,只渲染触发按钮 + if (!isProviderMounted) { + return <>{children({ onOpenManageModal: handleOpen })}; + } + + // Provider 已挂载,渲染完整的协作者管理功能 + return ( + + {({ onOpenManageModal }) => { + // 组件挂载后自动打开模态框 + useEffect(() => { + onOpenManageModal(); + }, [onOpenManageModal]); + + return <>{children({ onOpenManageModal })}; + }} + + ); +};