Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
赵月辉
/
fastgpt-migrated
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Unverified
Commit
826a53dc
authored
Mar 25, 2025
by
Archer
Committed by
archer
Mar 27, 2025
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
tmp org api rewrite (#4304)
* sync collection * remove lock * tmp org api rewrite
parent
5a47af6f
Show whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
65 additions
and
98 deletions
+65
-98
docSite/content/zh-cn/docs/development/upgrading/492.md
+1
-0
packages/global/support/user/team/org/type.d.ts
+9
-4
packages/service/support/permission/memberGroup/memberGroupSchema.ts
+0
-1
projects/app/package.json
+1
-1
projects/app/src/pageComponents/account/team/GroupManage/GroupManageMember.tsx
+12
-16
projects/app/src/pageComponents/account/team/MemberTable.tsx
+1
-1
projects/app/src/pageComponents/account/team/OrgManage/OrgInfoModal.tsx
+0
-1
projects/app/src/pageComponents/account/team/OrgManage/OrgMemberManageModal.tsx
+2
-2
projects/app/src/pageComponents/account/team/OrgManage/OrgMoveModal.tsx
+4
-4
projects/app/src/pageComponents/account/team/OrgManage/index.tsx
+30
-44
projects/app/src/pageComponents/account/team/context.tsx
+1
-20
projects/app/src/web/support/user/team/org/api.ts
+4
-3
projects/app/src/web/support/user/useUserStore.ts
+0
-1
No files found.
docSite/content/zh-cn/docs/development/upgrading/492.md
View file @
826a53dc
...
@@ -18,6 +18,7 @@ weight: 799
...
@@ -18,6 +18,7 @@ weight: 799
2.
知识库分块增加自定义分隔符预设值,同时支持自定义换行符分割。
2.
知识库分块增加自定义分隔符预设值,同时支持自定义换行符分割。
3.
外部变量改名:自定义变量。 并且支持在测试时调试,在分享链接中,该变量直接隐藏。
3.
外部变量改名:自定义变量。 并且支持在测试时调试,在分享链接中,该变量直接隐藏。
4.
集合同步时,支持同步修改标题。
4.
集合同步时,支持同步修改标题。
5.
团队成员管理重构,抽离主流 IM SSO(企微、飞书、钉钉),并支持通过自定义 SSO 接入 FastGPT。同时完善与外部系统的成员同步。
## ⚙️ 优化
## ⚙️ 优化
...
...
packages/global/support/user/team/org/type.d.ts
View file @
826a53dc
import
type
{
TeamPermission
}
from
'
support
/permission/user/controller'
;
import
type
{
TeamPermission
}
from
'
../../..
/permission/user/controller'
;
import
{
ResourcePermissionType
}
from
'../type'
;
import
{
ResourcePermissionType
}
from
'../type'
;
import
{
SourceMemberType
}
from
'
support/user
/type'
;
import
{
SourceMemberType
}
from
'
../..
/type'
;
type
OrgSchemaType
=
{
type
OrgSchemaType
=
{
_id
:
string
;
_id
:
string
;
...
@@ -8,7 +8,7 @@ type OrgSchemaType = {
...
@@ -8,7 +8,7 @@ type OrgSchemaType = {
pathId
:
string
;
pathId
:
string
;
path
:
string
;
path
:
string
;
name
:
string
;
name
:
string
;
avatar
?
:
string
;
avatar
:
string
;
description
?:
string
;
description
?:
string
;
updateTime
:
Date
;
updateTime
:
Date
;
};
};
...
@@ -20,7 +20,12 @@ type OrgMemberSchemaType = {
...
@@ -20,7 +20,12 @@ type OrgMemberSchemaType = {
tmbId
:
string
;
tmbId
:
string
;
};
};
type
OrgType
=
Omit
<
OrgSchemaType
,
'avatar'
>
&
{
export
type
OrgListItemType
=
OrgSchemaType
&
{
permission
:
TeamPermission
;
total
:
number
;
// members + children orgs
};
export
type
OrgType
=
Omit
<
OrgSchemaType
,
'avatar'
>
&
{
avatar
:
string
;
avatar
:
string
;
permission
:
TeamPermission
;
permission
:
TeamPermission
;
members
:
OrgMemberSchemaType
[];
members
:
OrgMemberSchemaType
[];
...
...
packages/service/support/permission/memberGroup/memberGroupSchema.ts
View file @
826a53dc
import
{
TeamCollectionName
}
from
'@fastgpt/global/support/user/team/constant'
;
import
{
TeamCollectionName
}
from
'@fastgpt/global/support/user/team/constant'
;
import
{
connectionMongo
,
getMongoModel
}
from
'../../../common/mongo'
;
import
{
connectionMongo
,
getMongoModel
}
from
'../../../common/mongo'
;
import
{
MemberGroupSchemaType
}
from
'@fastgpt/global/support/permission/memberGroup/type'
;
import
{
MemberGroupSchemaType
}
from
'@fastgpt/global/support/permission/memberGroup/type'
;
import
{
GroupMemberCollectionName
}
from
'./groupMemberSchema'
;
const
{
Schema
}
=
connectionMongo
;
const
{
Schema
}
=
connectionMongo
;
export
const
MemberGroupCollectionName
=
'team_member_groups'
;
export
const
MemberGroupCollectionName
=
'team_member_groups'
;
...
...
projects/app/package.json
View file @
826a53dc
{
{
"name"
:
"
app
"
,
"name"
:
"
app
"
,
"version"
:
"4.9.
1
"
,
"version"
:
"4.9.
2
"
,
"private"
:
false
,
"private"
:
false
,
"scripts"
:
{
"scripts"
:
{
"dev"
:
"next dev"
,
"dev"
:
"next dev"
,
...
...
projects/app/src/pageComponents/account/team/GroupManage/GroupManageMember.tsx
View file @
826a53dc
...
@@ -24,6 +24,8 @@ import { useUserStore } from '@/web/support/user/useUserStore';
...
@@ -24,6 +24,8 @@ import { useUserStore } from '@/web/support/user/useUserStore';
import
{
useToast
}
from
'@fastgpt/web/hooks/useToast'
;
import
{
useToast
}
from
'@fastgpt/web/hooks/useToast'
;
import
{
DEFAULT_TEAM_AVATAR
}
from
'@fastgpt/global/common/system/constants'
;
import
{
DEFAULT_TEAM_AVATAR
}
from
'@fastgpt/global/common/system/constants'
;
import
SearchInput
from
'@fastgpt/web/components/common/Input/SearchInput'
;
import
SearchInput
from
'@fastgpt/web/components/common/Input/SearchInput'
;
import
{
GroupMemberItemType
}
from
'@fastgpt/global/support/permission/memberGroup/type'
;
import
{
useMount
}
from
'ahooks'
;
export
type
GroupFormType
=
{
export
type
GroupFormType
=
{
members
:
{
members
:
{
...
@@ -46,26 +48,20 @@ function GroupEditModal({ onClose, editGroupId }: { onClose: () => void; editGro
...
@@ -46,26 +48,20 @@ function GroupEditModal({ onClose, editGroupId }: { onClose: () => void; editGro
return
groups
.
find
((
item
)
=>
item
.
_id
===
editGroupId
);
return
groups
.
find
((
item
)
=>
item
.
_id
===
editGroupId
);
},
[
editGroupId
,
groups
]);
},
[
editGroupId
,
groups
]);
const
{
data
:
groupMembers
}
=
useRequest2
(
()
=>
{
if
(
editGroupId
)
return
getGroupMembers
(
editGroupId
);
return
Promise
.
resolve
(
undefined
);
},
{
manual
:
false
,
onSuccess
:
(
data
)
=>
{
setMembers
(
data
??
[]);
}
}
);
const
allMembers
=
useContextSelector
(
TeamContext
,
(
v
)
=>
v
.
members
);
const
allMembers
=
useContextSelector
(
TeamContext
,
(
v
)
=>
v
.
members
);
const
refetchMembers
=
useContextSelector
(
TeamContext
,
(
v
)
=>
v
.
refetchMembers
);
const
refetchMembers
=
useContextSelector
(
TeamContext
,
(
v
)
=>
v
.
refetchMembers
);
const
MemberScrollData
=
useContextSelector
(
TeamContext
,
(
v
)
=>
v
.
MemberScrollData
);
const
MemberScrollData
=
useContextSelector
(
TeamContext
,
(
v
)
=>
v
.
MemberScrollData
);
const
[
hoveredMemberId
,
setHoveredMemberId
]
=
useState
<
string
>
();
const
[
hoveredMemberId
,
setHoveredMemberId
]
=
useState
<
string
>
();
const
selectedMembersRef
=
useRef
<
HTMLDivElement
>
(
null
);
const
selectedMembersRef
=
useRef
<
HTMLDivElement
>
(
null
);
const
[
members
,
setMembers
]
=
useState
(
groupMembers
||
[]);
const
[
members
,
setMembers
]
=
useState
<
GroupMemberItemType
[]
>
([]);
useMount
(
async
()
=>
{
if
(
editGroupId
)
{
const
data
=
await
getGroupMembers
(
editGroupId
);
setMembers
(
data
);
}
});
const
[
searchKey
,
setSearchKey
]
=
useState
(
''
);
const
[
searchKey
,
setSearchKey
]
=
useState
(
''
);
const
filtered
=
useMemo
(()
=>
{
const
filtered
=
useMemo
(()
=>
{
...
@@ -80,7 +76,7 @@ function GroupEditModal({ onClose, editGroupId }: { onClose: () => void; editGro
...
@@ -80,7 +76,7 @@ function GroupEditModal({ onClose, editGroupId }: { onClose: () => void; editGro
const
{
runAsync
:
onUpdate
,
loading
:
isLoadingUpdate
}
=
useRequest2
(
const
{
runAsync
:
onUpdate
,
loading
:
isLoadingUpdate
}
=
useRequest2
(
async
()
=>
{
async
()
=>
{
if
(
!
editGroupId
||
!
members
.
length
)
return
;
if
(
!
editGroupId
||
!
members
.
length
)
return
;
console
.
log
(
members
);
return
putUpdateGroup
({
return
putUpdateGroup
({
groupId
:
editGroupId
,
groupId
:
editGroupId
,
memberList
:
members
memberList
:
members
...
@@ -209,7 +205,7 @@ function GroupEditModal({ onClose, editGroupId }: { onClose: () => void; editGro
...
@@ -209,7 +205,7 @@ function GroupEditModal({ onClose, editGroupId }: { onClose: () => void; editGro
<
Flex
borderLeft=
"1px"
borderColor=
"myGray.200"
flexDirection=
"column"
p=
"4"
h=
{
'100%'
}
>
<
Flex
borderLeft=
"1px"
borderColor=
"myGray.200"
flexDirection=
"column"
p=
"4"
h=
{
'100%'
}
>
<
Box
mt=
{
2
}
>
{
t
(
'common:chosen'
)
+
': '
+
members
.
length
}
</
Box
>
<
Box
mt=
{
2
}
>
{
t
(
'common:chosen'
)
+
': '
+
members
.
length
}
</
Box
>
<
MemberScrollData
ScrollContainerRef=
{
selectedMembersRef
}
mt=
{
3
}
flex=
{
'1 0 0'
}
h=
{
0
}
>
<
MemberScrollData
ScrollContainerRef=
{
selectedMembersRef
}
mt=
{
3
}
flex=
{
'1 0 0'
}
h=
{
0
}
>
{
members
?
.
map
((
member
)
=>
{
{
members
.
map
((
member
)
=>
{
return
(
return
(
<
HStack
<
HStack
onMouseEnter=
{
()
=>
setHoveredMemberId
(
member
.
tmbId
)
}
onMouseEnter=
{
()
=>
setHoveredMemberId
(
member
.
tmbId
)
}
...
...
projects/app/src/pageComponents/account/team/MemberTable.tsx
View file @
826a53dc
...
@@ -268,7 +268,7 @@ function MemberTable({ Tabs }: { Tabs: React.ReactNode }) {
...
@@ -268,7 +268,7 @@ function MemberTable({ Tabs }: { Tabs: React.ReactNode }) {
<
Box
className=
{
'textEllipsis'
}
>
<
Box
className=
{
'textEllipsis'
}
>
{
member
.
memberName
}
{
member
.
memberName
}
{
member
.
status
!==
'active'
&&
(
{
member
.
status
!==
'active'
&&
(
<
Tag
ml=
"2"
colorSchema=
"gray"
>
<
Tag
ml=
"2"
colorSchema=
"gray"
bg=
{
'myGray.100'
}
color=
{
'myGray.700'
}
>
{
t
(
'account_team:leave'
)
}
{
t
(
'account_team:leave'
)
}
</
Tag
>
</
Tag
>
)
}
)
}
...
...
projects/app/src/pageComponents/account/team/OrgManage/OrgInfoModal.tsx
View file @
826a53dc
...
@@ -7,7 +7,6 @@ import FormLabel from '@fastgpt/web/components/common/MyBox/FormLabel';
...
@@ -7,7 +7,6 @@ import FormLabel from '@fastgpt/web/components/common/MyBox/FormLabel';
import
MyModal
from
'@fastgpt/web/components/common/MyModal'
;
import
MyModal
from
'@fastgpt/web/components/common/MyModal'
;
import
{
useRequest2
}
from
'@fastgpt/web/hooks/useRequest'
;
import
{
useRequest2
}
from
'@fastgpt/web/hooks/useRequest'
;
import
{
useTranslation
}
from
'next-i18next'
;
import
{
useTranslation
}
from
'next-i18next'
;
import
dynamic
from
'next/dynamic'
;
import
{
useForm
}
from
'react-hook-form'
;
import
{
useForm
}
from
'react-hook-form'
;
export
type
OrgFormType
=
{
export
type
OrgFormType
=
{
...
...
projects/app/src/pageComponents/account/team/OrgManage/OrgMemberManageModal.tsx
View file @
826a53dc
...
@@ -21,7 +21,7 @@ import type React from 'react';
...
@@ -21,7 +21,7 @@ import type React from 'react';
import
{
useEffect
,
useMemo
,
useState
}
from
'react'
;
import
{
useEffect
,
useMemo
,
useState
}
from
'react'
;
import
{
useContextSelector
}
from
'use-context-selector'
;
import
{
useContextSelector
}
from
'use-context-selector'
;
import
{
TeamContext
}
from
'../context'
;
import
{
TeamContext
}
from
'../context'
;
import
{
OrgType
}
from
'@fastgpt/global/support/user/team/org/type'
;
import
{
Org
ListItemType
,
Org
Type
}
from
'@fastgpt/global/support/user/team/org/type'
;
import
{
useScrollPagination
}
from
'@fastgpt/web/hooks/useScrollPagination'
;
import
{
useScrollPagination
}
from
'@fastgpt/web/hooks/useScrollPagination'
;
export
type
GroupFormType
=
{
export
type
GroupFormType
=
{
...
@@ -46,7 +46,7 @@ function OrgMemberManageModal({
...
@@ -46,7 +46,7 @@ function OrgMemberManageModal({
refetchOrgs
,
refetchOrgs
,
onClose
onClose
}:
{
}:
{
currentOrg
:
OrgType
;
currentOrg
:
Org
ListItem
Type
;
refetchOrgs
:
()
=>
void
;
refetchOrgs
:
()
=>
void
;
onClose
:
()
=>
void
;
onClose
:
()
=>
void
;
})
{
})
{
...
...
projects/app/src/pageComponents/account/team/OrgManage/OrgMoveModal.tsx
View file @
826a53dc
import
{
putMoveOrg
}
from
'@/web/support/user/team/org/api'
;
import
{
putMoveOrg
}
from
'@/web/support/user/team/org/api'
;
import
{
Button
,
ModalBody
,
ModalFooter
}
from
'@chakra-ui/react'
;
import
{
Button
,
ModalBody
,
ModalFooter
}
from
'@chakra-ui/react'
;
import
type
{
OrgType
}
from
'@fastgpt/global/support/user/team/org/type'
;
import
type
{
Org
ListItemType
,
Org
Type
}
from
'@fastgpt/global/support/user/team/org/type'
;
import
MyModal
from
'@fastgpt/web/components/common/MyModal'
;
import
MyModal
from
'@fastgpt/web/components/common/MyModal'
;
import
{
useRequest2
}
from
'@fastgpt/web/hooks/useRequest'
;
import
{
useRequest2
}
from
'@fastgpt/web/hooks/useRequest'
;
import
{
useTranslation
}
from
'next-i18next'
;
import
{
useTranslation
}
from
'next-i18next'
;
...
@@ -15,13 +15,13 @@ function OrgMoveModal({
...
@@ -15,13 +15,13 @@ function OrgMoveModal({
onClose
,
onClose
,
onSuccess
onSuccess
}:
{
}:
{
movingOrg
:
OrgType
;
movingOrg
:
Org
ListItem
Type
;
orgs
:
OrgType
[];
orgs
:
Org
ListItem
Type
[];
onClose
:
()
=>
void
;
onClose
:
()
=>
void
;
onSuccess
:
()
=>
void
;
onSuccess
:
()
=>
void
;
})
{
})
{
const
{
t
}
=
useTranslation
();
const
{
t
}
=
useTranslation
();
const
[
selectedOrg
,
setSelectedOrg
]
=
useState
<
OrgType
>
();
const
[
selectedOrg
,
setSelectedOrg
]
=
useState
<
Org
ListItem
Type
>
();
const
{
userInfo
}
=
useUserStore
();
const
{
userInfo
}
=
useUserStore
();
const
team
=
userInfo
?.
team
!
;
const
team
=
userInfo
?.
team
!
;
...
...
projects/app/src/pageComponents/account/team/OrgManage/index.tsx
View file @
826a53dc
...
@@ -14,7 +14,7 @@ import {
...
@@ -14,7 +14,7 @@ import {
Tr
,
Tr
,
VStack
VStack
}
from
'@chakra-ui/react'
;
}
from
'@chakra-ui/react'
;
import
type
{
OrgType
}
from
'@fastgpt/global/support/user/team/org/type'
;
import
type
{
Org
ListItemType
,
Org
Type
}
from
'@fastgpt/global/support/user/team/org/type'
;
import
Avatar
from
'@fastgpt/web/components/common/Avatar'
;
import
Avatar
from
'@fastgpt/web/components/common/Avatar'
;
import
MyIcon
from
'@fastgpt/web/components/common/Icon'
;
import
MyIcon
from
'@fastgpt/web/components/common/Icon'
;
import
type
{
IconNameType
}
from
'@fastgpt/web/components/common/Icon/type'
;
import
type
{
IconNameType
}
from
'@fastgpt/web/components/common/Icon/type'
;
...
@@ -23,9 +23,7 @@ import { useConfirm } from '@fastgpt/web/hooks/useConfirm';
...
@@ -23,9 +23,7 @@ import { useConfirm } from '@fastgpt/web/hooks/useConfirm';
import
{
useRequest2
}
from
'@fastgpt/web/hooks/useRequest'
;
import
{
useRequest2
}
from
'@fastgpt/web/hooks/useRequest'
;
import
{
useTranslation
}
from
'next-i18next'
;
import
{
useTranslation
}
from
'next-i18next'
;
import
{
useMemo
,
useState
}
from
'react'
;
import
{
useMemo
,
useState
}
from
'react'
;
import
{
useContextSelector
}
from
'use-context-selector'
;
import
MemberTag
from
'@/components/support/user/team/Info/MemberTag'
;
import
MemberTag
from
'@/components/support/user/team/Info/MemberTag'
;
import
{
TeamContext
}
from
'../context'
;
import
{
import
{
deleteOrg
,
deleteOrg
,
deleteOrgMember
,
deleteOrgMember
,
...
@@ -39,10 +37,10 @@ import { defaultOrgForm, type OrgFormType } from './OrgInfoModal';
...
@@ -39,10 +37,10 @@ import { defaultOrgForm, type OrgFormType } from './OrgInfoModal';
import
dynamic
from
'next/dynamic'
;
import
dynamic
from
'next/dynamic'
;
import
MyBox
from
'@fastgpt/web/components/common/MyBox'
;
import
MyBox
from
'@fastgpt/web/components/common/MyBox'
;
import
Path
from
'@/components/common/folder/Path'
;
import
Path
from
'@/components/common/folder/Path'
;
import
{
ParentTreePathItemType
}
from
'@fastgpt/global/common/parentFolder/type'
;
import
{
Parent
IdType
,
Parent
TreePathItemType
}
from
'@fastgpt/global/common/parentFolder/type'
;
import
{
getOrgChildrenPath
}
from
'@fastgpt/global/support/user/team/org/constant'
;
import
{
getOrgChildrenPath
}
from
'@fastgpt/global/support/user/team/org/constant'
;
import
{
useSystemStore
}
from
'@/web/common/system/useSystemStore'
;
import
{
useSystemStore
}
from
'@/web/common/system/useSystemStore'
;
import
{
delRemoveMember
,
getTeamMembers
}
from
'@/web/support/user/team/api'
;
import
{
delRemoveMember
}
from
'@/web/support/user/team/api'
;
import
SearchInput
from
'@fastgpt/web/components/common/Input/SearchInput'
;
import
SearchInput
from
'@fastgpt/web/components/common/Input/SearchInput'
;
import
{
useScrollPagination
}
from
'@fastgpt/web/hooks/useScrollPagination'
;
import
{
useScrollPagination
}
from
'@fastgpt/web/hooks/useScrollPagination'
;
...
@@ -82,24 +80,16 @@ function ActionButton({
...
@@ -82,24 +80,16 @@ function ActionButton({
function
OrgTable
({
Tabs
}:
{
Tabs
:
React
.
ReactNode
})
{
function
OrgTable
({
Tabs
}:
{
Tabs
:
React
.
ReactNode
})
{
const
{
t
}
=
useTranslation
();
const
{
t
}
=
useTranslation
();
const
{
userInfo
,
isTeamAdmin
}
=
useUserStore
();
const
{
userInfo
,
isTeamAdmin
}
=
useUserStore
();
const
{
feConfigs
}
=
useSystemStore
();
const
isSyncMember
=
feConfigs
.
register_method
?.
includes
(
'sync'
);
const
[
searchOrg
,
setSearchOrg
]
=
useState
(
''
);
const
[
searchOrg
,
setSearchOrg
]
=
useState
(
''
);
const
[
orgStack
,
setOrgStack
]
=
useState
<
OrgType
[]
>
([]);
const
currentOrg
=
useMemo
(()
=>
orgStack
[
orgStack
.
length
-
1
],
[
orgStack
]);
const
[
rootOrg
,
setRootOrg
]
=
useState
<
OrgType
>
();
const
[
parentId
,
setParentId
]
=
useState
<
ParentIdType
>
();
const
[
currentOrg
,
setCurrentOrg
]
=
useState
<
OrgListItemType
>
();
const
{
data
:
members
=
[],
ScrollData
:
MemberScrollData
}
=
useScrollPagination
(
getOrgMembers
,
{
// 用于 org 层级
pageSize
:
20
,
const
[
orgStack
,
setOrgStack
]
=
useState
<
OrgListItemType
[]
>
([]);
params
:
{
orgId
:
currentOrg
?.
_id
??
rootOrg
?.
_id
},
refreshDeps
:
[
currentOrg
?.
_id
,
rootOrg
?.
_id
]
});
const
{
feConfigs
}
=
useSystemStore
();
const
isSyncMember
=
feConfigs
.
register_method
?.
includes
(
'sync'
);
const
[
path
,
setPath
]
=
useState
(
''
);
const
{
const
{
data
:
orgs
=
[],
data
:
orgs
=
[],
...
@@ -107,43 +97,35 @@ function OrgTable({ Tabs }: { Tabs: React.ReactNode }) {
...
@@ -107,43 +97,35 @@ function OrgTable({ Tabs }: { Tabs: React.ReactNode }) {
refresh
:
refetchOrgs
refresh
:
refetchOrgs
}
=
useRequest2
(
}
=
useRequest2
(
()
=>
{
()
=>
{
// sync path to orgStack
return
getOrgList
(
parentId
);
const
splitPath
=
path
.
split
(
'/'
).
filter
(
Boolean
);
const
orgs
=
orgStack
.
filter
((
o
)
=>
splitPath
.
includes
(
o
.
pathId
));
setOrgStack
(
orgs
);
return
getOrgList
(
path
);
},
},
{
{
manual
:
false
,
manual
:
false
,
refreshDeps
:
[
userInfo
?.
team
?.
teamId
,
path
],
refreshDeps
:
[
userInfo
?.
team
?.
teamId
,
parentId
]
onSuccess
:
(
data
)
=>
{
if
(
!
rootOrg
)
{
setRootOrg
(
data
[
0
]);
}
}
}
}
);
);
const
paths
=
useMemo
(()
=>
{
const
paths
=
useMemo
(()
=>
{
if
(
!
currentOrg
)
return
[];
return
orgStack
return
orgStack
.
map
((
org
)
=>
{
.
map
((
org
)
=>
{
if
(
org
?.
path
===
''
)
return
;
return
{
return
{
parentId
:
getOrgChildrenPath
(
org
),
parentId
:
getOrgChildrenPath
(
org
),
parentName
:
org
.
name
parentName
:
org
.
name
};
};
})
})
.
filter
(
Boolean
)
as
ParentTreePathItemType
[];
.
filter
(
Boolean
)
as
ParentTreePathItemType
[];
},
[
orgStack
]);
},
[
currentOrg
,
orgStack
]);
const
onClickOrg
=
(
org
:
OrgType
)
=>
{
const
onClickOrg
=
(
org
:
OrgListItemType
)
=>
{
setParentId
(
currentOrg
?.
_id
);
setOrgStack
([...
orgStack
,
org
]);
setOrgStack
([...
orgStack
,
org
]);
set
Path
(
getOrgChildrenPath
(
org
)
);
set
CurrentOrg
(
org
);
};
};
const
[
editOrg
,
setEditOrg
]
=
useState
<
OrgFormType
>
();
const
[
editOrg
,
setEditOrg
]
=
useState
<
OrgFormType
>
();
const
[
manageMemberOrg
,
setManageMemberOrg
]
=
useState
<
OrgType
>
();
const
[
manageMemberOrg
,
setManageMemberOrg
]
=
useState
<
Org
ListItem
Type
>
();
const
[
movingOrg
,
setMovingOrg
]
=
useState
<
OrgType
>
();
const
[
movingOrg
,
setMovingOrg
]
=
useState
<
Org
ListItem
Type
>
();
// Delete org
// Delete org
const
{
ConfirmModal
:
ConfirmDeleteOrgModal
,
openConfirm
:
openDeleteOrgModal
}
=
useConfirm
({
const
{
ConfirmModal
:
ConfirmDeleteOrgModal
,
openConfirm
:
openDeleteOrgModal
}
=
useConfirm
({
...
@@ -157,6 +139,14 @@ function OrgTable({ Tabs }: { Tabs: React.ReactNode }) {
...
@@ -157,6 +139,14 @@ function OrgTable({ Tabs }: { Tabs: React.ReactNode }) {
}
}
});
});
const
{
data
:
members
=
[],
ScrollData
:
MemberScrollData
}
=
useScrollPagination
(
getOrgMembers
,
{
pageSize
:
20
,
params
:
{
orgId
:
currentOrg
?.
_id
},
refreshDeps
:
[
currentOrg
?.
_id
]
});
// Delete member
// Delete member
const
{
ConfirmModal
:
ConfirmDeleteMemberFromOrg
,
openConfirm
:
openDeleteMemberFromOrgModal
}
=
const
{
ConfirmModal
:
ConfirmDeleteMemberFromOrg
,
openConfirm
:
openDeleteMemberFromOrgModal
}
=
useConfirm
({
useConfirm
({
...
@@ -183,11 +173,7 @@ function OrgTable({ Tabs }: { Tabs: React.ReactNode }) {
...
@@ -183,11 +173,7 @@ function OrgTable({ Tabs }: { Tabs: React.ReactNode }) {
const
searchedOrgs
=
useMemo
(()
=>
{
const
searchedOrgs
=
useMemo
(()
=>
{
if
(
!
searchOrg
)
return
[];
if
(
!
searchOrg
)
return
[];
return
orgs
return
orgs
.
filter
((
org
)
=>
org
.
name
.
includes
(
searchOrg
));
.
filter
((
org
)
=>
org
.
name
.
includes
(
searchOrg
))
.
map
((
org
)
=>
({
...
org
}));
},
[
orgs
,
searchOrg
]);
},
[
orgs
,
searchOrg
]);
return
(
return
(
...
@@ -231,7 +217,7 @@ function OrgTable({ Tabs }: { Tabs: React.ReactNode }) {
...
@@ -231,7 +217,7 @@ function OrgTable({ Tabs }: { Tabs: React.ReactNode }) {
<
Tr
key=
{
org
.
_id
}
overflow=
{
'unset'
}
onClick=
{
()
=>
onClickOrg
(
org
)
}
>
<
Tr
key=
{
org
.
_id
}
overflow=
{
'unset'
}
onClick=
{
()
=>
onClickOrg
(
org
)
}
>
<
Td
>
<
Td
>
<
HStack
cursor=
{
'pointer'
}
onClick=
{
()
=>
onClickOrg
(
org
)
}
>
<
HStack
cursor=
{
'pointer'
}
onClick=
{
()
=>
onClickOrg
(
org
)
}
>
<
MemberTag
name=
{
org
.
name
}
avatar=
{
org
.
avatar
}
/>
<
MemberTag
name=
{
org
.
name
}
avatar=
{
org
.
avatar
!
}
/>
<
Tag
size=
"sm"
>
{
org
.
total
}
</
Tag
>
<
Tag
size=
"sm"
>
{
org
.
total
}
</
Tag
>
<
MyIcon
<
MyIcon
name=
"core/chat/chevronRight"
name=
"core/chat/chevronRight"
...
@@ -427,7 +413,7 @@ function OrgTable({ Tabs }: { Tabs: React.ReactNode }) {
...
@@ -427,7 +413,7 @@ function OrgTable({ Tabs }: { Tabs: React.ReactNode }) {
onClick=
{
()
=>
{
onClick=
{
()
=>
{
setEditOrg
({
setEditOrg
({
...
defaultOrgForm
,
...
defaultOrgForm
,
parentId
:
currentOrg
?.
_id
??
rootOrg
?.
_id
parentId
:
currentOrg
?.
_id
});
});
}
}
}
}
/>
/>
...
...
projects/app/src/pageComponents/account/team/context.tsx
View file @
826a53dc
...
@@ -16,7 +16,6 @@ import { useTranslation } from 'next-i18next';
...
@@ -16,7 +16,6 @@ import { useTranslation } from 'next-i18next';
import
{
getGroupList
}
from
'@/web/support/user/team/group/api'
;
import
{
getGroupList
}
from
'@/web/support/user/team/group/api'
;
import
{
MemberGroupListType
}
from
'@fastgpt/global/support/permission/memberGroup/type'
;
import
{
MemberGroupListType
}
from
'@fastgpt/global/support/permission/memberGroup/type'
;
import
{
useScrollPagination
}
from
'@fastgpt/web/hooks/useScrollPagination'
;
import
{
useScrollPagination
}
from
'@fastgpt/web/hooks/useScrollPagination'
;
import
{
getOrgList
}
from
'@/web/support/user/team/org/api'
;
import
{
OrgType
}
from
'@fastgpt/global/support/user/team/org/type'
;
import
{
OrgType
}
from
'@fastgpt/global/support/user/team/org/type'
;
const
EditInfoModal
=
dynamic
(()
=>
import
(
'./EditInfoModal'
));
const
EditInfoModal
=
dynamic
(()
=>
import
(
'./EditInfoModal'
));
...
@@ -25,7 +24,6 @@ type TeamModalContextType = {
...
@@ -25,7 +24,6 @@ type TeamModalContextType = {
myTeams
:
TeamTmbItemType
[];
myTeams
:
TeamTmbItemType
[];
members
:
TeamMemberItemType
[];
members
:
TeamMemberItemType
[];
groups
:
MemberGroupListType
;
groups
:
MemberGroupListType
;
orgs
:
OrgType
[];
isLoading
:
boolean
;
isLoading
:
boolean
;
onSwitchTeam
:
(
teamId
:
string
)
=>
void
;
onSwitchTeam
:
(
teamId
:
string
)
=>
void
;
setEditTeamData
:
React
.
Dispatch
<
React
.
SetStateAction
<
EditTeamFormDataType
|
undefined
>>
;
setEditTeamData
:
React
.
Dispatch
<
React
.
SetStateAction
<
EditTeamFormDataType
|
undefined
>>
;
...
@@ -33,7 +31,6 @@ type TeamModalContextType = {
...
@@ -33,7 +31,6 @@ type TeamModalContextType = {
refetchMembers
:
()
=>
void
;
refetchMembers
:
()
=>
void
;
refetchTeams
:
()
=>
void
;
refetchTeams
:
()
=>
void
;
refetchGroups
:
()
=>
void
;
refetchGroups
:
()
=>
void
;
refetchOrgs
:
()
=>
void
;
teamSize
:
number
;
teamSize
:
number
;
MemberScrollData
:
ReturnType
<
typeof
useScrollPagination
>
[
'ScrollData'
];
MemberScrollData
:
ReturnType
<
typeof
useScrollPagination
>
[
'ScrollData'
];
};
};
...
@@ -42,7 +39,6 @@ export const TeamContext = createContext<TeamModalContextType>({
...
@@ -42,7 +39,6 @@ export const TeamContext = createContext<TeamModalContextType>({
myTeams
:
[],
myTeams
:
[],
groups
:
[],
groups
:
[],
members
:
[],
members
:
[],
orgs
:
[],
isLoading
:
false
,
isLoading
:
false
,
onSwitchTeam
:
function
(
_teamId
:
string
):
void
{
onSwitchTeam
:
function
(
_teamId
:
string
):
void
{
throw
new
Error
(
'Function not implemented.'
);
throw
new
Error
(
'Function not implemented.'
);
...
@@ -59,9 +55,6 @@ export const TeamContext = createContext<TeamModalContextType>({
...
@@ -59,9 +55,6 @@ export const TeamContext = createContext<TeamModalContextType>({
refetchGroups
:
function
():
void
{
refetchGroups
:
function
():
void
{
throw
new
Error
(
'Function not implemented.'
);
throw
new
Error
(
'Function not implemented.'
);
},
},
refetchOrgs
:
function
():
void
{
throw
new
Error
(
'Function not implemented.'
);
},
teamSize
:
0
,
teamSize
:
0
,
MemberScrollData
:
()
=>
<></>
MemberScrollData
:
()
=>
<></>
});
});
...
@@ -80,15 +73,6 @@ export const TeamModalContextProvider = ({ children }: { children: ReactNode })
...
@@ -80,15 +73,6 @@ export const TeamModalContextProvider = ({ children }: { children: ReactNode })
refreshDeps
:
[
userInfo
?.
_id
]
refreshDeps
:
[
userInfo
?.
_id
]
});
});
const
{
data
:
orgs
=
[],
loading
:
isLoadingOrgs
,
refresh
:
refetchOrgs
}
=
useRequest2
(
getOrgList
,
{
manual
:
false
,
refreshDeps
:
[
userInfo
?.
team
?.
teamId
]
});
const
{
data
:
teamMemberCountData
,
refresh
:
refetchTeamMemberCount
}
=
useRequest2
(
const
{
data
:
teamMemberCountData
,
refresh
:
refetchTeamMemberCount
}
=
useRequest2
(
getTeamMemberCount
,
getTeamMemberCount
,
{
{
...
@@ -135,16 +119,13 @@ export const TeamModalContextProvider = ({ children }: { children: ReactNode })
...
@@ -135,16 +119,13 @@ export const TeamModalContextProvider = ({ children }: { children: ReactNode })
refreshDeps
:
[
userInfo
?.
team
?.
teamId
]
refreshDeps
:
[
userInfo
?.
team
?.
teamId
]
});
});
const
isLoading
=
const
isLoading
=
isLoadingTeams
||
isSwitchingTeam
||
loadingMembers
||
isLoadingGroups
;
isLoadingTeams
||
isSwitchingTeam
||
loadingMembers
||
isLoadingGroups
||
isLoadingOrgs
;
const
contextValue
=
{
const
contextValue
=
{
myTeams
,
myTeams
,
refetchTeams
,
refetchTeams
,
isLoading
,
isLoading
,
onSwitchTeam
,
onSwitchTeam
,
orgs
,
refetchOrgs
,
// create | update team
// create | update team
setEditTeamData
,
setEditTeamData
,
...
...
projects/app/src/web/support/user/team/org/api.ts
View file @
826a53dc
...
@@ -4,13 +4,14 @@ import type {
...
@@ -4,13 +4,14 @@ import type {
putUpdateOrgData
,
putUpdateOrgData
,
putUpdateOrgMembersData
putUpdateOrgMembersData
}
from
'@fastgpt/global/support/user/team/org/api'
;
}
from
'@fastgpt/global/support/user/team/org/api'
;
import
type
{
OrgType
}
from
'@fastgpt/global/support/user/team/org/type'
;
import
type
{
Org
ListItem
Type
}
from
'@fastgpt/global/support/user/team/org/type'
;
import
type
{
putMoveOrgType
}
from
'@fastgpt/global/support/user/team/org/api'
;
import
type
{
putMoveOrgType
}
from
'@fastgpt/global/support/user/team/org/api'
;
import
{
PaginationProps
,
PaginationResponse
}
from
'@fastgpt/web/common/fetch/type'
;
import
{
PaginationProps
,
PaginationResponse
}
from
'@fastgpt/web/common/fetch/type'
;
import
{
TeamMemberItemType
}
from
'@fastgpt/global/support/user/team/type'
;
import
{
TeamMemberItemType
}
from
'@fastgpt/global/support/user/team/type'
;
import
{
ParentIdType
}
from
'@fastgpt/global/common/parentFolder/type'
;
export
const
getOrgList
=
(
pa
th
:
string
)
=>
export
const
getOrgList
=
(
pa
rentId
:
ParentIdType
)
=>
GET
<
Org
Type
[]
>
(
`/proApi/support/user/team/org/list`
,
{
orgPath
:
path
});
GET
<
Org
ListItemType
[]
>
(
`/proApi/support/user/team/org/list`
,
{
parentId
});
export
const
postCreateOrg
=
(
data
:
postCreateOrgData
)
=>
export
const
postCreateOrg
=
(
data
:
postCreateOrgData
)
=>
POST
(
'/proApi/support/user/team/org/create'
,
data
);
POST
(
'/proApi/support/user/team/org/create'
,
data
);
...
...
projects/app/src/web/support/user/useUserStore.ts
View file @
826a53dc
...
@@ -9,7 +9,6 @@ import type { UserType } from '@fastgpt/global/support/user/type.d';
...
@@ -9,7 +9,6 @@ import type { UserType } from '@fastgpt/global/support/user/type.d';
import
type
{
FeTeamPlanStatusType
}
from
'@fastgpt/global/support/wallet/sub/type'
;
import
type
{
FeTeamPlanStatusType
}
from
'@fastgpt/global/support/wallet/sub/type'
;
import
{
getTeamPlanStatus
}
from
'./team/api'
;
import
{
getTeamPlanStatus
}
from
'./team/api'
;
import
{
getGroupList
}
from
'./team/group/api'
;
import
{
getGroupList
}
from
'./team/group/api'
;
import
{
getOrgList
}
from
'./team/org/api'
;
type
State
=
{
type
State
=
{
systemMsgReadId
:
string
;
systemMsgReadId
:
string
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment