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
9d97b605
authored
Mar 27, 2025
by
Archer
Committed by
GitHub
Mar 27, 2025
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
perf: member tableui (#4353)
parent
f3a069bc
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
14 additions
and
150 deletions
+14
-150
docSite/content/zh-cn/docs/development/upgrading/492.md
+2
-1
packages/web/hooks/useEditTextarea.tsx
+0
-133
packages/web/i18n/en/account_team.json
+2
-2
packages/web/i18n/zh-CN/account_team.json
+2
-2
packages/web/i18n/zh-Hant/account_team.json
+2
-2
projects/app/src/pageComponents/account/team/MemberTable.tsx
+4
-5
projects/app/src/web/common/hooks/useEditTitle.tsx
+2
-5
No files found.
docSite/content/zh-cn/docs/development/upgrading/492.md
View file @
9d97b605
...
@@ -30,7 +30,8 @@ weight: 799
...
@@ -30,7 +30,8 @@ weight: 799
6.
工作流节点数组字符串类型,自动适配 string 输入。
6.
工作流节点数组字符串类型,自动适配 string 输入。
7.
工作流节点数组类型,自动进行 JSON parse 解析 string 输入。
7.
工作流节点数组类型,自动进行 JSON parse 解析 string 输入。
8.
AI proxy 日志优化,去除重试失败的日志,仅保留最后一份错误日志。
8.
AI proxy 日志优化,去除重试失败的日志,仅保留最后一份错误日志。
9.
分块算法小调整:
9.
个人信息和通知展示优化。
10.
分块算法小调整:
*
跨处理符号之间连续性更强。
*
跨处理符号之间连续性更强。
*
代码块分割时,用 LLM 模型上下文作为分块大小,尽可能保证代码块完整性。
*
代码块分割时,用 LLM 模型上下文作为分块大小,尽可能保证代码块完整性。
*
表格分割时,用 LLM 模型上下文作为分块大小,尽可能保证表格完整性。
*
表格分割时,用 LLM 模型上下文作为分块大小,尽可能保证表格完整性。
...
...
packages/web/hooks/useEditTextarea.tsx
deleted
100644 → 0
View file @
f3a069bc
import
React
,
{
useCallback
,
useRef
}
from
'react'
;
import
{
ModalFooter
,
ModalBody
,
Input
,
useDisclosure
,
Button
,
Box
,
Textarea
}
from
'@chakra-ui/react'
;
import
MyModal
from
'../components/common/MyModal'
;
import
{
useToast
}
from
'./useToast'
;
import
{
useTranslation
}
from
'next-i18next'
;
export
const
useEditTextarea
=
({
title
,
tip
,
placeholder
=
''
,
canEmpty
=
true
,
valueRule
,
rows
=
10
}:
{
title
:
string
;
tip
?:
string
;
placeholder
?:
string
;
canEmpty
?:
boolean
;
valueRule
?:
(
val
:
string
)
=>
string
|
void
;
rows
?:
number
;
})
=>
{
const
{
t
}
=
useTranslation
();
const
{
isOpen
,
onOpen
,
onClose
}
=
useDisclosure
();
const
textareaRef
=
useRef
<
HTMLTextAreaElement
|
null
>
(
null
);
const
onSuccessCb
=
useRef
<
(
content
:
string
)
=>
void
|
Promise
<
void
>>
();
const
onErrorCb
=
useRef
<
(
err
:
any
)
=>
void
>
();
const
{
toast
}
=
useToast
();
const
defaultValue
=
useRef
(
''
);
const
onOpenModal
=
useCallback
(
({
defaultVal
,
onSuccess
,
onError
}:
{
defaultVal
:
string
;
onSuccess
:
(
content
:
string
)
=>
any
;
onError
?:
(
err
:
any
)
=>
void
;
})
=>
{
onOpen
();
onSuccessCb
.
current
=
onSuccess
;
onErrorCb
.
current
=
onError
;
defaultValue
.
current
=
defaultVal
;
},
[
onOpen
]
);
const
onclickConfirm
=
useCallback
(
async
()
=>
{
if
(
!
textareaRef
.
current
||
!
onSuccessCb
.
current
)
return
;
const
val
=
textareaRef
.
current
.
value
;
if
(
!
canEmpty
&&
!
val
)
{
textareaRef
.
current
.
focus
();
return
;
}
if
(
valueRule
)
{
const
result
=
valueRule
(
val
);
if
(
result
)
{
return
toast
({
status
:
'warning'
,
title
:
result
});
}
}
try
{
await
onSuccessCb
.
current
(
val
);
onClose
();
}
catch
(
err
)
{
onErrorCb
.
current
?.(
err
);
}
},
[
canEmpty
,
onClose
]);
// eslint-disable-next-line react/display-name
const
EditModal
=
useCallback
(
({
maxLength
=
30
,
iconSrc
=
'modal/edit'
,
closeBtnText
=
t
(
'common:common.Close'
)
}:
{
maxLength
?:
number
;
iconSrc
?:
string
;
closeBtnText
?:
string
;
})
=>
(
<
MyModal
isOpen=
{
isOpen
}
onClose=
{
onClose
}
iconSrc=
{
iconSrc
}
title=
{
title
}
maxW=
{
'500px'
}
>
<
ModalBody
pt=
{
tip
?
'3 !important'
:
'5 !important'
}
>
{
!!
tip
&&
(
<
Box
mb=
{
3
}
color=
{
'myGray.500'
}
fontSize=
{
'sm'
}
>
{
tip
}
</
Box
>
)
}
<
Textarea
ref=
{
textareaRef
}
defaultValue=
{
defaultValue
.
current
}
placeholder=
{
placeholder
}
autoFocus
maxLength=
{
maxLength
}
rows=
{
rows
}
bg=
{
'myGray.50'
}
/>
</
ModalBody
>
<
ModalFooter
>
{
!!
closeBtnText
&&
(
<
Button
mr=
{
3
}
variant=
{
'whiteBase'
}
onClick=
{
onClose
}
>
{
closeBtnText
}
</
Button
>
)
}
<
Button
onClick=
{
onclickConfirm
}
px=
{
6
}
>
{
t
(
'common:common.Confirm'
)
}
</
Button
>
</
ModalFooter
>
</
MyModal
>
),
[
isOpen
,
onClose
,
onclickConfirm
,
placeholder
,
tip
,
title
]
);
return
{
onOpenModal
,
EditModal
};
};
packages/web/i18n/en/account_team.json
View file @
9d97b605
...
@@ -17,9 +17,9 @@
...
@@ -17,9 +17,9 @@
"create_sub_org"
:
"Create sub-organization"
,
"create_sub_org"
:
"Create sub-organization"
,
"delete"
:
"delete"
,
"delete"
:
"delete"
,
"delete_org"
:
"Delete organization"
,
"delete_org"
:
"Delete organization"
,
"edit_member"
:
"Edit user"
,
"edit_member_tip"
:
"username"
,
"edit_info"
:
"Edit information"
,
"edit_info"
:
"Edit information"
,
"edit_member"
:
"Edit user"
,
"edit_member_tip"
:
"Name"
,
"edit_org_info"
:
"Edit organization information"
,
"edit_org_info"
:
"Edit organization information"
,
"expires"
:
"Expiration time"
,
"expires"
:
"Expiration time"
,
"forbid_hint"
:
"After forbidden, this invitation link will become invalid. This action is irreversible. Are you sure you want to deactivate?"
,
"forbid_hint"
:
"After forbidden, this invitation link will become invalid. This action is irreversible. Are you sure you want to deactivate?"
,
...
...
packages/web/i18n/zh-CN/account_team.json
View file @
9d97b605
...
@@ -20,9 +20,9 @@
...
@@ -20,9 +20,9 @@
"delete_from_org"
:
"移出部门"
,
"delete_from_org"
:
"移出部门"
,
"delete_from_team"
:
"移出团队"
,
"delete_from_team"
:
"移出团队"
,
"delete_org"
:
"删除部门"
,
"delete_org"
:
"删除部门"
,
"edit_member"
:
"编辑用户"
,
"edit_member_tip"
:
"用户名"
,
"edit_info"
:
"编辑信息"
,
"edit_info"
:
"编辑信息"
,
"edit_member"
:
"编辑用户"
,
"edit_member_tip"
:
"成员名"
,
"edit_org_info"
:
"编辑部门信息"
,
"edit_org_info"
:
"编辑部门信息"
,
"expires"
:
"过期时间"
,
"expires"
:
"过期时间"
,
"export_members"
:
"导出成员"
,
"export_members"
:
"导出成员"
,
...
...
packages/web/i18n/zh-Hant/account_team.json
View file @
9d97b605
...
@@ -17,9 +17,9 @@
...
@@ -17,9 +17,9 @@
"create_sub_org"
:
"創建子部門"
,
"create_sub_org"
:
"創建子部門"
,
"delete"
:
"刪除"
,
"delete"
:
"刪除"
,
"delete_org"
:
"刪除部門"
,
"delete_org"
:
"刪除部門"
,
"edit_member"
:
"編輯用戶"
,
"edit_member_tip"
:
"使用者名稱"
,
"edit_info"
:
"編輯訊息"
,
"edit_info"
:
"編輯訊息"
,
"edit_member"
:
"編輯用戶"
,
"edit_member_tip"
:
"成員名"
,
"edit_org_info"
:
"編輯部門資訊"
,
"edit_org_info"
:
"編輯部門資訊"
,
"expires"
:
"過期時間"
,
"expires"
:
"過期時間"
,
"forbid_hint"
:
"停用後,該邀請連結將失效。 該操作不可撤銷,是否確認停用?"
,
"forbid_hint"
:
"停用後,該邀請連結將失效。 該操作不可撤銷,是否確認停用?"
,
...
...
projects/app/src/pageComponents/account/team/MemberTable.tsx
View file @
9d97b605
...
@@ -17,7 +17,6 @@ import {
...
@@ -17,7 +17,6 @@ import {
import
{
useTranslation
}
from
'next-i18next'
;
import
{
useTranslation
}
from
'next-i18next'
;
import
{
useUserStore
}
from
'@/web/support/user/useUserStore'
;
import
{
useUserStore
}
from
'@/web/support/user/useUserStore'
;
import
{
useConfirm
}
from
'@fastgpt/web/hooks/useConfirm'
;
import
{
useConfirm
}
from
'@fastgpt/web/hooks/useConfirm'
;
import
{
useEditTextarea
}
from
'@fastgpt/web/hooks/useEditTextarea'
;
import
{
import
{
delRemoveMember
,
delRemoveMember
,
getTeamMembers
,
getTeamMembers
,
...
@@ -50,6 +49,7 @@ import { useScrollPagination } from '@fastgpt/web/hooks/useScrollPagination';
...
@@ -50,6 +49,7 @@ import { useScrollPagination } from '@fastgpt/web/hooks/useScrollPagination';
import
{
PaginationResponse
}
from
'@fastgpt/web/common/fetch/type'
;
import
{
PaginationResponse
}
from
'@fastgpt/web/common/fetch/type'
;
import
_
from
'lodash'
;
import
_
from
'lodash'
;
import
MySelect
from
'@fastgpt/web/components/common/MySelect'
;
import
MySelect
from
'@fastgpt/web/components/common/MySelect'
;
import
{
useEditTitle
}
from
'@/web/common/hooks/useEditTitle'
;
const
InviteModal
=
dynamic
(()
=>
import
(
'./Invite/InviteModal'
));
const
InviteModal
=
dynamic
(()
=>
import
(
'./Invite/InviteModal'
));
const
TeamTagModal
=
dynamic
(()
=>
import
(
'@/components/support/user/team/TeamTagModal'
));
const
TeamTagModal
=
dynamic
(()
=>
import
(
'@/components/support/user/team/TeamTagModal'
));
...
@@ -157,11 +157,10 @@ function MemberTable({ Tabs }: { Tabs: React.ReactNode }) {
...
@@ -157,11 +157,10 @@ function MemberTable({ Tabs }: { Tabs: React.ReactNode }) {
const
isLoading
=
loadingMembers
||
isSyncing
;
const
isLoading
=
loadingMembers
||
isSyncing
;
const
{
EditModal
:
EditMemberNameModal
,
onOpenModal
:
openEditMemberName
}
=
useEditT
extarea
({
const
{
EditModal
:
EditMemberNameModal
,
onOpenModal
:
openEditMemberName
}
=
useEditT
itle
({
title
:
t
(
'account_team:edit_member'
),
title
:
t
(
'account_team:edit_member'
),
tip
:
t
(
'account_team:edit_member_tip'
),
tip
:
t
(
'account_team:edit_member_tip'
),
canEmpty
:
false
,
canEmpty
:
false
rows
:
1
});
});
const
handleEditMemberName
=
(
tmbId
:
string
,
memberName
:
string
)
=>
{
const
handleEditMemberName
=
(
tmbId
:
string
,
memberName
:
string
)
=>
{
openEditMemberName
({
openEditMemberName
({
...
@@ -323,8 +322,8 @@ function MemberTable({ Tabs }: { Tabs: React.ReactNode }) {
...
@@ -323,8 +322,8 @@ function MemberTable({ Tabs }: { Tabs: React.ReactNode }) {
member
.
tmbId
!==
userInfo
?.
team
.
tmbId
&&
member
.
tmbId
!==
userInfo
?.
team
.
tmbId
&&
(
member
.
status
===
TeamMemberStatusEnum
.
active
?
(
(
member
.
status
===
TeamMemberStatusEnum
.
active
?
(
<>
<>
{
' '
}
<
Icon
<
Icon
mr=
{
2
}
name=
{
'edit'
}
name=
{
'edit'
}
cursor=
{
'pointer'
}
cursor=
{
'pointer'
}
w=
"1rem"
w=
"1rem"
...
...
projects/app/src/web/common/hooks/useEditTitle.tsx
View file @
9d97b605
...
@@ -4,6 +4,7 @@ import MyModal from '@fastgpt/web/components/common/MyModal';
...
@@ -4,6 +4,7 @@ import MyModal from '@fastgpt/web/components/common/MyModal';
import
{
useToast
}
from
'@fastgpt/web/hooks/useToast'
;
import
{
useToast
}
from
'@fastgpt/web/hooks/useToast'
;
import
{
useTranslation
}
from
'next-i18next'
;
import
{
useTranslation
}
from
'next-i18next'
;
import
{
useRequest2
}
from
'@fastgpt/web/hooks/useRequest'
;
import
{
useRequest2
}
from
'@fastgpt/web/hooks/useRequest'
;
import
FormLabel
from
'@fastgpt/web/components/common/MyBox/FormLabel'
;
export
const
useEditTitle
=
({
export
const
useEditTitle
=
({
title
,
title
,
...
@@ -89,11 +90,7 @@ export const useEditTitle = ({
...
@@ -89,11 +90,7 @@ export const useEditTitle = ({
return
(
return
(
<
MyModal
isOpen=
{
isOpen
}
onClose=
{
onClose
}
iconSrc=
{
iconSrc
}
title=
{
title
}
maxW=
{
'500px'
}
>
<
MyModal
isOpen=
{
isOpen
}
onClose=
{
onClose
}
iconSrc=
{
iconSrc
}
title=
{
title
}
maxW=
{
'500px'
}
>
<
ModalBody
>
<
ModalBody
>
{
!!
tip
&&
(
{
!!
tip
&&
<
FormLabel
mb=
{
2
}
>
{
tip
}
</
FormLabel
>
}
<
Box
mb=
{
2
}
color=
{
'myGray.500'
}
fontSize=
{
'sm'
}
>
{
tip
}
</
Box
>
)
}
<
Input
<
Input
ref=
{
inputRef
}
ref=
{
inputRef
}
...
...
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