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
9d29b471
authored
Jun 24, 2024
by
Finley Ge
Committed by
GitHub
Jun 24, 2024
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
chore: dataset fe adjusting (#1833)
parent
4a33e04a
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
490 additions
and
433 deletions
+490
-433
projects/app/src/pages/api/core/dataset/list.ts
+15
-2
projects/app/src/pages/dataset/list/component/List.tsx
+205
-395
projects/app/src/pages/dataset/list/context.tsx
+57
-12
projects/app/src/pages/dataset/list/index.tsx
+211
-22
projects/app/src/web/core/dataset/api.ts
+2
-2
No files found.
projects/app/src/pages/api/core/dataset/list.ts
View file @
9d29b471
...
...
@@ -11,11 +11,12 @@ import {
ReadPermissionVal
}
from
'@fastgpt/global/support/permission/constant'
;
import
{
MongoResourcePermission
}
from
'@fastgpt/service/support/permission/schema'
;
import
{
parseParentIdInMongo
}
from
'@fastgpt/global/common/parentFolder/utils'
;
import
{
DatasetDefaultPermission
}
from
'@fastgpt/global/support/permission/dataset/constant'
;
import
{
ParentIdType
}
from
'@fastgpt/global/common/parentFolder/type'
;
import
{
parseParentIdInMongo
}
from
'@fastgpt/global/common/parentFolder/utils'
;
async
function
handler
(
req
:
NextApiRequest
)
{
const
{
parentId
,
type
}
=
req
.
query
as
{
parentId
?:
string
;
type
?:
DatasetTypeEnum
};
const
{
parentId
,
type
}
=
req
.
body
as
{
parentId
:
ParentIdType
;
type
?:
DatasetTypeEnum
};
// 凭证校验
const
{
teamId
,
...
...
@@ -27,6 +28,18 @@ async function handler(req: NextApiRequest) {
authApiKey
:
true
,
per
:
ReadPermissionVal
});
console
.
log
(
'parentId'
,
parentId
,
'type'
,
type
,
'teamId'
,
teamId
,
'tmbId'
,
tmbId
,
'tmbPer'
,
tmbPer
);
const
[
myDatasets
,
rpList
]
=
await
Promise
.
all
([
MongoDataset
.
find
({
...
...
projects/app/src/pages/dataset/list/component/List.tsx
View file @
9d29b471
import
React
,
{
useMemo
,
useRef
,
useState
}
from
'react'
;
import
{
delDatasetById
,
getDatasetById
,
putDatasetById
,
postCreateDataset
}
from
'@/web/core/dataset/api'
;
import
{
EditFolderFormType
}
from
'@fastgpt/web/components/common/MyModal/EditFolderModal'
;
import
{
FolderImgUrl
}
from
'@fastgpt/global/common/file/image/constants'
;
import
{
useUserStore
}
from
'@/web/support/user/useUserStore'
;
import
{
putDatasetById
}
from
'@/web/core/dataset/api'
;
import
{
useDatasetStore
}
from
'@/web/core/dataset/store/dataset'
;
import
{
FolderIcon
}
from
'@fastgpt/global/common/file/image/constants'
;
import
{
Box
,
Flex
,
Grid
,
Button
,
Image
,
useDisclosure
}
from
'@chakra-ui/react'
;
import
{
Box
,
Flex
,
Grid
}
from
'@chakra-ui/react'
;
import
{
DatasetTypeEnum
,
DatasetTypeMap
}
from
'@fastgpt/global/core/dataset/constants'
;
import
MyMenu
from
'@fastgpt/web/components/common/MyMenu'
;
import
MyIcon
from
'@fastgpt/web/components/common/Icon'
;
...
...
@@ -19,7 +10,7 @@ import PermissionIconText from '@/components/support/permission/IconText';
import
DatasetTypeTag
from
'@/components/core/dataset/DatasetTypeTag'
;
import
Avatar
from
'@/components/Avatar'
;
import
{
useConfirm
}
from
'@fastgpt/web/hooks/useConfirm'
;
import
{
useRequest
,
useRequest2
}
from
'@fastgpt/web/hooks/useRequest'
;
import
{
useRequest
}
from
'@fastgpt/web/hooks/useRequest'
;
import
{
DatasetItemType
}
from
'@fastgpt/global/core/dataset/type'
;
import
{
useSystemStore
}
from
'@/web/common/system/useSystemStore'
;
import
{
useToast
}
from
'@fastgpt/web/hooks/useToast'
;
...
...
@@ -27,7 +18,6 @@ import { checkTeamExportDatasetLimit } from '@/web/support/user/team/api';
import
{
downloadFetch
}
from
'@/web/common/system/utils'
;
import
MyTooltip
from
'@fastgpt/web/components/common/MyTooltip'
;
import
dynamic
from
'next/dynamic'
;
import
{
EditResourceInfoFormType
}
from
'@/components/common/Modal/EditResourceModal'
;
import
{
useContextSelector
}
from
'use-context-selector'
;
import
{
DatasetContext
}
from
'../context'
;
import
{
...
...
@@ -40,37 +30,28 @@ import {
getCollaboratorList
,
postUpdateDatasetCollaborators
}
from
'@/web/core/dataset/api/collaborator'
;
import
FolderSlideCard
from
'@/components/common/folder/SlideCard'
;
import
EmptyTip
from
'@fastgpt/web/components/common/EmptyTip'
;
import
{
useFolderDrag
}
from
'@/components/common/folder/useFolderDrag'
;
import
MyBox
from
'@fastgpt/web/components/common/MyBox'
;
import
{
useI18n
}
from
'@/web/context/I18n'
;
import
{
useTranslation
}
from
'react-i18next'
;
import
{
AddIcon
}
from
'@chakra-ui/icons'
;
const
CreateModal
=
dynamic
(()
=>
import
(
'./CreateModal'
));
const
EditFolderModal
=
dynamic
(
()
=>
import
(
'@fastgpt/web/components/common/MyModal/EditFolderModal'
)
);
function
List
()
{
const
{
setLoading
,
isPc
}
=
useSystemStore
();
const
{
setLoading
}
=
useSystemStore
();
const
{
toast
}
=
useToast
();
const
{
t
}
=
useTranslation
();
const
{
commonT
}
=
useI18n
();
const
{
refetchDatasets
,
setMoveDatasetId
,
refetchPaths
}
=
useContextSelector
(
DatasetContext
,
(
v
)
=>
v
);
const
[
editPerDatasetIndex
,
setEditPerDatasetIndex
]
=
useState
<
number
>
();
const
{
myDatasets
,
loadMyDatasets
,
setMyDatasets
}
=
useDatasetStore
();
const
{
userInfo
}
=
useUserStore
();
const
{
isOpen
:
isOpenCreateModal
,
onOpen
:
onOpenCreateModal
,
onClose
:
onCloseCreateModal
}
=
useDisclosure
();
refetchDatasets
,
setMoveDatasetId
,
refetchPaths
,
refetchFolderDetail
,
editedDataset
,
setEditedDataset
,
onDelDataset
}
=
useContextSelector
(
DatasetContext
,
(
v
)
=>
v
);
const
[
editPerDatasetIndex
,
setEditPerDatasetIndex
]
=
useState
<
number
>
();
const
{
myDatasets
,
loadMyDatasets
}
=
useDatasetStore
();
const
{
getBoxProps
}
=
useFolderDrag
({
activeStyles
:
{
...
...
@@ -98,14 +79,6 @@ function List() {
const
{
parentId
=
null
}
=
router
.
query
as
{
parentId
?:
string
|
null
};
const
{
data
:
folderDetail
,
runAsync
:
refetchFolderDetail
}
=
useRequest2
(
()
=>
(
parentId
?
getDatasetById
(
parentId
)
:
Promise
.
resolve
(
undefined
)),
{
manual
:
false
,
refreshDeps
:
[
parentId
,
myDatasets
]
}
);
const
{
mutate
:
exportDataset
}
=
useRequest
({
mutationFn
:
async
(
dataset
:
DatasetItemType
)
=>
{
setLoading
(
true
);
...
...
@@ -128,25 +101,7 @@ function List() {
errorToast
:
t
(
'dataset.Export Dataset Limit Error'
)
});
const
{
mutate
:
onDelDataset
}
=
useRequest
({
mutationFn
:
async
(
id
:
string
)
=>
{
setLoading
(
true
);
await
delDatasetById
(
id
);
return
id
;
},
onSuccess
(
id
:
string
)
{
setMyDatasets
(
myDatasets
.
filter
((
item
)
=>
item
.
_id
!==
id
));
router
.
push
(
'/dataset/list'
);
},
onSettled
()
{
setLoading
(
false
);
},
successToast
:
t
(
'common.Delete Success'
),
errorToast
:
t
(
'dataset.Delete Dataset Error'
)
});
const
EditResourceModal
=
dynamic
(()
=>
import
(
'@/components/common/Modal/EditResourceModal'
));
const
[
editedDataset
,
setEditedDataset
]
=
useState
<
EditResourceInfoFormType
>
();
const
DeleteTipsMap
=
useRef
({
[
DatasetTypeEnum
.
folder
]:
t
(
'dataset.deleteFolderTips'
),
...
...
@@ -173,322 +128,212 @@ function List() {
const
onClickDeleteDataset
=
(
id
:
string
)
=>
{
openConfirm
(
()
=>
onDelDataset
(
id
),
()
=>
onDelDataset
(
id
).
then
(()
=>
{
refetchPaths
();
refetchDatasets
();
}),
undefined
,
DeleteTipsMap
.
current
[
DatasetTypeEnum
.
dataset
]
)();
};
const
[
editFolderData
,
setEditFolderData
]
=
useState
<
EditFolderFormType
>
();
return
(
<>
<
Flex
{
...
(
parentId
?
{
px
:
'8'
}
:
{})}
>
{
formatDatasets
.
length
>
0
&&
(
<
Grid
flexGrow=
{
1
}
py=
{
5
}
gridTemplateColumns=
{
[
'1fr'
,
'repeat(2,1fr)'
,
'repeat(3,1fr)'
,
'repeat(4,1fr)'
]
}
gridGap=
{
5
}
userSelect=
{
'none'
}
>
{
formatDatasets
.
map
((
dataset
,
index
)
=>
(
<
MyTooltip
key=
{
dataset
.
_id
}
label=
{
<
Flex
flexDirection=
{
'column'
}
alignItems=
{
'center'
}
>
<
Box
fontSize=
{
'xs'
}
color=
{
'myGray.500'
}
>
{
dataset
.
type
===
DatasetTypeEnum
.
folder
?
'打开文件夹'
:
'打开知识库'
}
</
Box
>
</
Flex
>
}
{
formatDatasets
.
length
>
0
&&
(
<
Grid
flexGrow=
{
1
}
py=
{
5
}
gridTemplateColumns=
{
[
'1fr'
,
'repeat(2,1fr)'
,
'repeat(3,1fr)'
,
'repeat(4,1fr)'
]
}
gridGap=
{
5
}
userSelect=
{
'none'
}
>
{
formatDatasets
.
map
((
dataset
,
index
)
=>
(
<
MyTooltip
key=
{
dataset
.
_id
}
label=
{
<
Flex
flexDirection=
{
'column'
}
alignItems=
{
'center'
}
>
<
Box
fontSize=
{
'xs'
}
color=
{
'myGray.500'
}
>
{
dataset
.
type
===
DatasetTypeEnum
.
folder
?
'打开文件夹'
:
'打开知识库'
}
</
Box
>
</
Flex
>
}
>
<
MyBox
display=
{
'flex'
}
flexDirection=
{
'column'
}
py=
{
3
}
px=
{
5
}
cursor=
{
'pointer'
}
borderWidth=
{
1.5
}
bg=
{
'white'
}
borderRadius=
{
'md'
}
minH=
{
'130px'
}
position=
{
'relative'
}
{
...
getBoxProps
({
dataId
:
dataset
.
_id
,
isFolder
:
dataset
.
type
===
DatasetTypeEnum
.
folder
})}
_hover=
{
{
borderColor
:
'primary.300'
,
boxShadow
:
'1.5'
,
'& .delete'
:
{
display
:
'block'
},
'& .more'
:
{
display
:
'flex'
}
}
}
onClick=
{
()
=>
{
if
(
dataset
.
type
===
DatasetTypeEnum
.
folder
)
{
router
.
push
({
pathname
:
'/dataset/list'
,
query
:
{
parentId
:
dataset
.
_id
}
});
}
else
{
router
.
push
({
pathname
:
'/dataset/detail'
,
query
:
{
datasetId
:
dataset
.
_id
}
});
}
}
}
>
<
MyBox
display=
{
'flex'
}
flexDirection=
{
'column'
}
py=
{
3
}
px=
{
5
}
cursor=
{
'pointer'
}
borderWidth=
{
1.5
}
bg=
{
'white'
}
borderRadius=
{
'md'
}
minH=
{
'130px'
}
position=
{
'relative'
}
{
...
getBoxProps
({
dataId
:
dataset
.
_id
,
isFolder
:
dataset
.
type
===
DatasetTypeEnum
.
folder
})}
_hover=
{
{
borderColor
:
'primary.300'
,
boxShadow
:
'1.5'
,
'& .delete'
:
{
display
:
'block'
},
'& .more'
:
{
display
:
'flex'
}
}
}
onClick=
{
()
=>
{
if
(
dataset
.
type
===
DatasetTypeEnum
.
folder
)
{
router
.
push
({
pathname
:
'/dataset/list'
,
query
:
{
parentId
:
dataset
.
_id
}
});
}
else
{
router
.
push
({
pathname
:
'/dataset/detail'
,
query
:
{
datasetId
:
dataset
.
_id
}
});
}
}
}
>
{
dataset
.
permission
.
hasWritePer
&&
(
<
Box
className=
"more"
display=
{
[
''
,
'none'
]
}
position=
{
'absolute'
}
top=
{
3.5
}
right=
{
4
}
borderRadius=
{
'md'
}
_hover=
{
{
color
:
'primary.500'
,
'& .icon'
:
{
bg
:
'myGray.100'
}
}
}
onClick=
{
(
e
)
=>
{
e
.
stopPropagation
();
}
}
>
<
MyMenu
Button=
{
<
Box
w=
{
'22px'
}
h=
{
'22px'
}
>
<
MyIcon
className=
"icon"
name=
{
'more'
}
h=
{
'16px'
}
w=
{
'16px'
}
px=
{
1
}
py=
{
1
}
borderRadius=
{
'md'
}
cursor=
{
'pointer'
}
/>
</
Box
>
}
menuList=
{
[
{
children
:
[
{
icon
:
'edit'
,
label
:
'编辑信息'
,
onClick
:
()
=>
setEditedDataset
({
id
:
dataset
.
_id
,
name
:
dataset
.
name
,
intro
:
dataset
.
intro
,
avatar
:
dataset
.
avatar
})
},
{
icon
:
'common/file/move'
,
label
:
t
(
'Move'
),
onClick
:
()
=>
setMoveDatasetId
(
dataset
.
_id
)
},
{
dataset
.
permission
.
hasWritePer
&&
(
<
Box
className=
"more"
display=
{
[
''
,
'none'
]
}
position=
{
'absolute'
}
top=
{
3.5
}
right=
{
4
}
borderRadius=
{
'md'
}
_hover=
{
{
color
:
'primary.500'
,
'& .icon'
:
{
bg
:
'myGray.100'
}
}
}
onClick=
{
(
e
)
=>
{
e
.
stopPropagation
();
}
}
>
<
MyMenu
Button=
{
<
Box
w=
{
'22px'
}
h=
{
'22px'
}
>
<
MyIcon
className=
"icon"
name=
{
'more'
}
h=
{
'16px'
}
w=
{
'16px'
}
px=
{
1
}
py=
{
1
}
borderRadius=
{
'md'
}
cursor=
{
'pointer'
}
/>
</
Box
>
}
menuList=
{
[
{
children
:
[
{
icon
:
'edit'
,
label
:
commonT
(
'dataset.Edit Info'
),
onClick
:
()
=>
setEditedDataset
({
id
:
dataset
.
_id
,
name
:
dataset
.
name
,
intro
:
dataset
.
intro
,
avatar
:
dataset
.
avatar
})
},
{
icon
:
'common/file/move'
,
label
:
t
(
'Move'
),
onClick
:
()
=>
setMoveDatasetId
(
dataset
.
_id
)
},
...(
dataset
.
type
!==
DatasetTypeEnum
.
folder
?
[
{
icon
:
'export'
,
label
:
t
(
'Export'
),
onClick
:
()
=>
{
exportDataset
(
dataset
);
}
...(
dataset
.
type
!=
DatasetTypeEnum
.
folder
?
[
{
icon
:
'export'
,
label
:
t
(
'Export'
),
onClick
:
()
=>
{
exportDataset
(
dataset
);
}
]
:
[]),
...(
dataset
.
permission
.
hasManagePer
?
[
{
icon
:
'support/team/key'
,
label
:
t
(
'permission.Permission'
),
onClick
:
()
=>
setEditPerDatasetIndex
(
index
)
}
]
:
[])
]
},
{
children
:
[
}
]
:
[]),
...(
dataset
.
permission
.
hasManagePer
?
[
{
icon
:
'support/team/key'
,
label
:
t
(
'permission.Permission'
),
onClick
:
()
=>
setEditPerDatasetIndex
(
index
)
}
]
:
[])
]
},
...(
dataset
.
permission
.
hasManagePer
?
[
{
icon
:
'export'
,
label
:
t
(
'Export'
),
onClick
:
()
=>
{
exportDataset
(
dataset
);
}
children
:
[
{
icon
:
'delete'
,
label
:
t
(
'common.Delete'
),
type
:
'danger'
as
'danger'
,
onClick
:
()
=>
onClickDeleteDataset
(
dataset
.
_id
)
}
]
}
]
},
...(
dataset
.
permission
.
hasManagePer
?
[
{
children
:
[
{
icon
:
'delete'
,
label
:
t
(
'common.Delete'
),
type
:
'danger'
as
'danger'
,
onClick
:
()
=>
onClickDeleteDataset
(
dataset
.
_id
)
}
]
}
]
:
[])
]
}
/>
</
Box
>
)
}
:
[])
]
}
/>
</
Box
>
)
}
<
Flex
alignItems=
{
'center'
}
h=
{
'38px'
}
>
<
Avatar
src=
{
dataset
.
avatar
}
borderRadius=
{
'md'
}
w=
{
'28px'
}
/>
<
Box
mx=
{
3
}
className=
"textEllipsis3"
>
{
dataset
.
name
}
</
Box
>
</
Flex
>
<
Box
flex=
{
1
}
className=
{
'textEllipsis3'
}
py=
{
1
}
wordBreak=
{
'break-all'
}
fontSize=
{
'xs'
}
color=
{
'myGray.500'
}
>
{
dataset
.
intro
||
(
dataset
.
type
===
DatasetTypeEnum
.
folder
?
t
(
'core.dataset.Folder placeholder'
)
:
t
(
'core.dataset.Intro Placeholder'
))
}
<
Flex
alignItems=
{
'center'
}
h=
{
'38px'
}
>
<
Avatar
src=
{
dataset
.
avatar
}
borderRadius=
{
'md'
}
w=
{
'28px'
}
/>
<
Box
mx=
{
3
}
className=
"textEllipsis3"
>
{
dataset
.
name
}
</
Box
>
<
Flex
alignItems=
{
'center'
}
fontSize=
{
'sm'
}
>
<
Box
flex=
{
1
}
>
<
PermissionIconText
defaultPermission=
{
dataset
.
defaultPermission
}
color=
{
'myGray.600'
}
/>
</
Box
>
{
dataset
.
type
!==
DatasetTypeEnum
.
folder
&&
(
<
DatasetTypeTag
type=
{
dataset
.
type
}
py=
{
1
}
px=
{
2
}
/>
)
}
</
Flex
>
</
MyBox
>
</
MyTooltip
>
))
}
</
Grid
>
)
}
{
myDatasets
.
length
===
0
&&
(
<
EmptyTip
pt=
{
'35vh'
}
text=
{
t
(
'core.dataset.Empty Dataset Tips'
)
}
flexGrow=
"1"
></
EmptyTip
>
)
}
{
userInfo
?.
team
?.
permission
.
hasWritePer
&&
(
<
MyMenu
offset=
{
[
-
30
,
5
]
}
width=
{
120
}
Button=
{
<
Button
variant=
{
'primaryOutline'
}
px=
{
0
}
>
<
Flex
alignItems=
{
'center'
}
px=
{
'20px'
}
>
<
AddIcon
mr=
{
2
}
/>
<
Box
>
{
t
(
'common.Create New'
)
}
</
Box
>
</
Flex
>
</
Button
>
}
menuList=
{
[
{
children
:
[
{
label
:
(
<
Flex
>
<
MyIcon
name=
{
FolderIcon
}
w=
{
'20px'
}
mr=
{
1
}
/>
{
t
(
'Folder'
)
}
</
Flex
>
),
onClick
:
()
=>
setEditFolderData
({})
},
{
label
:
(
<
Flex
>
<
Image
src=
{
'/imgs/workflow/db.png'
}
alt=
{
''
}
w=
{
'20px'
}
mr=
{
1
}
/>
{
t
(
'core.dataset.Dataset'
)
}
</
Flex
>
),
onClick
:
onOpenCreateModal
}
]
}
]
}
/>
)
}
{
!!
folderDetail
&&
isPc
&&
(
<
Box
pt=
{
[
4
,
6
]
}
ml=
{
[
4
,
6
]
}
>
<
FolderSlideCard
refreshDeps=
{
[
folderDetail
.
_id
]
}
name=
{
folderDetail
.
name
}
intro=
{
folderDetail
.
intro
}
onEdit=
{
()
=>
{
setEditedDataset
({
id
:
folderDetail
.
_id
,
name
:
folderDetail
.
name
,
intro
:
folderDetail
.
intro
});
}
}
onMove=
{
()
=>
setMoveDatasetId
(
folderDetail
.
_id
)
}
deleteTip=
{
t
(
'dataset.deleteFolderTips'
)
}
onDelete=
{
()
=>
onDelDataset
(
folderDetail
.
_id
)
}
defaultPer=
{
{
value
:
folderDetail
.
defaultPermission
,
defaultValue
:
DatasetDefaultPermission
,
onChange
:
(
e
)
=>
{
return
putDatasetById
({
id
:
folderDetail
.
_id
,
defaultPermission
:
e
});
}
}
}
managePer=
{
{
permission
:
folderDetail
.
permission
,
onGetCollaboratorList
:
()
=>
getCollaboratorList
(
folderDetail
.
_id
),
permissionList
:
DatasetPermissionList
,
onUpdateCollaborators
:
({
tmbIds
,
permission
}:
{
tmbIds
:
string
[];
permission
:
number
;
})
=>
{
return
postUpdateDatasetCollaborators
({
tmbIds
,
permission
,
datasetId
:
folderDetail
.
_id
});
},
onDelOneCollaborator
:
(
tmbId
:
string
)
=>
deleteDatasetCollaborators
({
datasetId
:
folderDetail
.
_id
,
tmbId
})
}
}
/>
</
Box
>
)
}
</
Flex
>
<
ConfirmModal
/>
<
Box
flex=
{
1
}
className=
{
'textEllipsis3'
}
py=
{
1
}
wordBreak=
{
'break-all'
}
fontSize=
{
'xs'
}
color=
{
'myGray.500'
}
>
{
dataset
.
intro
||
(
dataset
.
type
===
DatasetTypeEnum
.
folder
?
t
(
'core.dataset.Folder placeholder'
)
:
t
(
'core.dataset.Intro Placeholder'
))
}
</
Box
>
<
Flex
alignItems=
{
'center'
}
fontSize=
{
'sm'
}
>
<
Box
flex=
{
1
}
>
<
PermissionIconText
defaultPermission=
{
dataset
.
defaultPermission
}
color=
{
'myGray.600'
}
/>
</
Box
>
{
dataset
.
type
!==
DatasetTypeEnum
.
folder
&&
(
<
DatasetTypeTag
type=
{
dataset
.
type
}
py=
{
1
}
px=
{
2
}
/>
)
}
</
Flex
>
</
MyBox
>
</
MyTooltip
>
))
}
</
Grid
>
)
}
{
myDatasets
.
length
===
0
&&
(
<
EmptyTip
pt=
{
'35vh'
}
text=
{
t
(
'core.dataset.Empty Dataset Tips'
)
}
flexGrow=
"1"
></
EmptyTip
>
)
}
{
editedDataset
&&
(
<
EditResourceModal
...
...
@@ -551,42 +396,7 @@ function List() {
onClose=
{
()
=>
setEditPerDatasetIndex
(
undefined
)
}
/>
)
}
{
!!
editFolderData
&&
(
<
EditFolderModal
onClose=
{
()
=>
setEditFolderData
(
undefined
)
}
onCreate=
{
async
({
name
})
=>
{
try
{
await
postCreateDataset
({
parentId
:
parentId
||
undefined
,
name
,
type
:
DatasetTypeEnum
.
folder
,
avatar
:
FolderImgUrl
,
intro
:
''
});
refetchDatasets
();
refetchPaths
();
}
catch
(
error
)
{
return
Promise
.
reject
(
error
);
}
}
}
onEdit=
{
async
({
name
,
intro
,
id
})
=>
{
try
{
await
putDatasetById
({
id
,
name
,
intro
});
refetchDatasets
();
refetchPaths
();
}
catch
(
error
)
{
return
Promise
.
reject
(
error
);
}
}
}
/>
)
}
{
isOpenCreateModal
&&
(
<
CreateModal
onClose=
{
onCloseCreateModal
}
parentId=
{
parentId
||
undefined
}
/>
)
}
<
ConfirmModal
/>
</>
);
}
...
...
projects/app/src/pages/dataset/list/context.tsx
View file @
9d29b471
import
{
getDatasetPaths
,
putDatasetById
}
from
'@/web/core/dataset/api'
;
import
{
getDatasetPaths
,
putDatasetById
,
getDatasets
,
getDatasetById
,
delDatasetById
}
from
'@/web/core/dataset/api'
;
import
{
useDatasetStore
}
from
'@/web/core/dataset/store/dataset'
;
import
{
GetResourceFolderListProps
,
...
...
@@ -9,18 +15,28 @@ import { useRouter } from 'next/router';
import
React
,
{
useCallback
,
useState
}
from
'react'
;
import
{
createContext
}
from
'use-context-selector'
;
import
{
useI18n
}
from
'@/web/context/I18n'
;
import
{
useRequest2
}
from
'@fastgpt/web/hooks/useRequest'
;
import
{
useRequest
,
useRequest
2
}
from
'@fastgpt/web/hooks/useRequest'
;
import
{
DatasetUpdateBody
}
from
'@fastgpt/global/core/dataset/api'
;
import
dynamic
from
'next/dynamic'
;
import
{
DatasetTypeEnum
}
from
'@fastgpt/global/core/dataset/constants'
;
import
{
DatasetItemType
}
from
'@fastgpt/global/core/dataset/type'
;
import
{
EditResourceInfoFormType
}
from
'@/components/common/Modal/EditResourceModal'
;
import
{
useSystemStore
}
from
'@/web/common/system/useSystemStore'
;
import
{
useTranslation
}
from
'react-i18next'
;
const
MoveModal
=
dynamic
(()
=>
import
(
'@/components/common/folder/MoveModal'
));
export
type
DatasetContextType
=
{
refetchDatasets
:
()
=>
void
;
refetchPaths
:
()
=>
void
;
refetchFolderDetail
:
()
=>
void
;
isFetchingDatasets
:
boolean
;
setMoveDatasetId
:
(
id
:
string
)
=>
void
;
paths
:
ParentTreePathItemType
[];
folderDetail
?:
DatasetItemType
;
editedDataset
?:
EditResourceInfoFormType
;
setEditedDataset
:
(
data
?:
EditResourceInfoFormType
)
=>
void
;
onDelDataset
:
(
id
:
string
)
=>
Promise
<
void
>
;
};
export
const
DatasetContext
=
createContext
<
DatasetContextType
>
({
...
...
@@ -28,22 +44,39 @@ export const DatasetContext = createContext<DatasetContextType>({
isFetchingDatasets
:
false
,
setMoveDatasetId
:
()
=>
{},
refetchPaths
:
()
=>
{},
paths
:
[]
paths
:
[],
refetchFolderDetail
:
()
=>
{},
folderDetail
:
{}
as
any
,
editedDataset
:
{}
as
any
,
setEditedDataset
:
()
=>
{},
onDelDataset
:
()
=>
Promise
.
resolve
()
});
function
DatasetContextProvider
({
children
}:
{
children
:
React
.
ReactNode
})
{
const
router
=
useRouter
();
const
{
commonT
}
=
useI18n
();
const
{
t
}
=
useTranslation
();
const
{
parentId
=
null
}
=
router
.
query
as
{
parentId
?:
string
|
null
};
const
{
loadMyDatasets
}
=
useDatasetStore
();
const
getDatasetFolderList
=
useCallback
(
async
({
parentId
}:
GetResourceFolderListProps
)
=>
{
const
res
=
await
getDatasetPaths
(
parentId
);
return
res
.
map
((
item
)
=>
({
id
:
item
.
parentId
,
name
:
item
.
parentName
}));
const
{
myDatasets
,
loadMyDatasets
}
=
useDatasetStore
();
const
{
data
:
folderDetail
,
runAsync
:
refetchFolderDetail
}
=
useRequest2
(
()
=>
(
parentId
?
getDatasetById
(
parentId
)
:
Promise
.
resolve
(
undefined
)),
{
manual
:
false
,
refreshDeps
:
[
parentId
,
myDatasets
]
}
);
const
getDatasetFolderList
=
useCallback
(({
parentId
}:
GetResourceFolderListProps
)
=>
{
return
getDatasets
({
parentId
,
type
:
DatasetTypeEnum
.
folder
}).
then
((
res
)
=>
{
return
res
.
map
((
item
)
=>
({
id
:
item
.
_id
,
name
:
item
.
name
}));
});
},
[]);
const
{
data
:
paths
=
[],
runAsync
:
refetchPaths
}
=
useRequest2
(
...
...
@@ -82,12 +115,24 @@ function DatasetContextProvider({ children }: { children: React.ReactNode }) {
[
moveDatasetId
,
onUpdateDataset
]
);
const
[
editedDataset
,
setEditedDataset
]
=
useState
<
EditResourceInfoFormType
>
();
const
{
runAsync
:
onDelDataset
}
=
useRequest2
(
delDatasetById
,
{
successToast
:
t
(
'common.Delete Success'
),
errorToast
:
t
(
'dataset.Delete Dataset Error'
)
});
const
contextValue
=
{
refetchDatasets
,
isFetchingDatasets
,
setMoveDatasetId
,
paths
,
refetchPaths
refetchPaths
,
refetchFolderDetail
,
folderDetail
,
editedDataset
,
setEditedDataset
,
onDelDataset
};
return
(
...
...
projects/app/src/pages/dataset/list/index.tsx
View file @
9d29b471
import
React
from
'react'
;
import
{
Box
,
Flex
,
Image
}
from
'@chakra-ui/react'
;
import
React
,
{
useState
}
from
'react'
;
import
{
Box
,
Flex
,
Image
,
Button
,
useDisclosure
}
from
'@chakra-ui/react'
;
import
{
useRouter
}
from
'next/router'
;
import
PageContainer
from
'@/components/PageContainer'
;
import
{
useTranslation
}
from
'next-i18next'
;
...
...
@@ -10,41 +10,230 @@ import List from './component/List';
import
{
DatasetContext
}
from
'./context'
;
import
DatasetContextProvider
from
'./context'
;
import
{
useContextSelector
}
from
'use-context-selector'
;
import
MyMenu
from
'@fastgpt/web/components/common/MyMenu'
;
import
{
AddIcon
}
from
'@chakra-ui/icons'
;
import
{
useUserStore
}
from
'@/web/support/user/useUserStore'
;
import
MyIcon
from
'@fastgpt/web/components/common/Icon'
;
import
{
FolderIcon
,
FolderImgUrl
}
from
'@fastgpt/global/common/file/image/constants'
;
import
{
EditFolderFormType
}
from
'@fastgpt/web/components/common/MyModal/EditFolderModal'
;
import
dynamic
from
'next/dynamic'
;
import
{
postCreateDataset
,
putDatasetById
}
from
'@/web/core/dataset/api'
;
import
{
DatasetTypeEnum
}
from
'@fastgpt/global/core/dataset/constants'
;
import
FolderSlideCard
from
'@/components/common/folder/SlideCard'
;
import
{
useSystemStore
}
from
'@/web/common/system/useSystemStore'
;
import
{
DatasetDefaultPermission
,
DatasetPermissionList
}
from
'@fastgpt/global/support/permission/dataset/constant'
;
import
{
postUpdateDatasetCollaborators
,
deleteDatasetCollaborators
,
getCollaboratorList
}
from
'@/web/core/dataset/api/collaborator'
;
const
EditFolderModal
=
dynamic
(
()
=>
import
(
'@fastgpt/web/components/common/MyModal/EditFolderModal'
)
);
const
CreateModal
=
dynamic
(()
=>
import
(
'./component/CreateModal'
));
const
Dataset
=
()
=>
{
const
{
isPc
}
=
useSystemStore
();
const
{
t
}
=
useTranslation
();
const
router
=
useRouter
();
const
{
parentId
}
=
router
.
query
as
{
parentId
:
string
};
const
{
myDatasets
}
=
useDatasetStore
();
const
{
paths
,
isFetchingDatasets
}
=
useContextSelector
(
DatasetContext
,
(
v
)
=>
v
);
const
{
paths
,
isFetchingDatasets
,
refetchPaths
,
refetchDatasets
,
folderDetail
,
setEditedDataset
,
setMoveDatasetId
,
onDelDataset
}
=
useContextSelector
(
DatasetContext
,
(
v
)
=>
v
);
const
{
userInfo
}
=
useUserStore
();
const
[
editFolderData
,
setEditFolderData
]
=
useState
<
EditFolderFormType
>
();
const
{
isOpen
:
isOpenCreateModal
,
onOpen
:
onOpenCreateModal
,
onClose
:
onCloseCreateModal
}
=
useDisclosure
();
return
(
<
PageContainer
isLoading=
{
myDatasets
.
length
===
0
&&
isFetchingDatasets
}
insertProps=
{
{
px
:
[
5
,
'48px'
]
}
}
>
<
Flex
pt=
{
[
4
,
'30px'
]
}
alignItems=
{
'center'
}
justifyContent=
{
'space-between'
}
>
{
/* url path */
}
<
ParentPaths
paths=
{
paths
}
FirstPathDom=
{
<
Flex
flex=
{
1
}
alignItems=
{
'center'
}
>
<
Image
src=
{
'/imgs/workflow/db.png'
}
alt=
{
''
}
mr=
{
2
}
h=
{
'24px'
}
/>
<
Box
className=
"textlg"
letterSpacing=
{
1
}
fontSize=
{
'24px'
}
fontWeight=
{
'bold'
}
>
{
t
(
'core.dataset.My Dataset'
)
}
</
Box
>
</
Flex
>
}
onClick=
{
(
e
)
=>
{
router
.
push
({
query
:
{
parentId
:
e
<
Flex
pt=
{
[
8
,
10
]
}
pr=
{
folderDetail
?
[
4
,
6
]
:
[
4
,
10
]
}
>
<
Flex
flexGrow=
{
1
}
flexDirection=
"column"
>
<
Flex
alignItems=
{
'center'
}
justifyContent=
{
'space-between'
}
>
<
ParentPaths
paths=
{
paths
}
FirstPathDom=
{
<
Flex
flex=
{
1
}
alignItems=
{
'center'
}
>
<
Image
src=
{
'/imgs/workflow/db.png'
}
alt=
{
''
}
mr=
{
2
}
h=
{
'24px'
}
/>
<
Box
className=
"textlg"
letterSpacing=
{
1
}
fontSize=
{
'24px'
}
fontWeight=
{
'bold'
}
>
{
t
(
'core.dataset.My Dataset'
)
}
</
Box
>
</
Flex
>
}
});
onClick=
{
(
e
)
=>
{
router
.
push
({
query
:
{
parentId
:
e
}
});
}
}
/>
{
userInfo
?.
team
?.
permission
.
hasWritePer
&&
(
<
MyMenu
offset=
{
[
-
30
,
5
]
}
width=
{
120
}
Button=
{
<
Button
variant=
{
'primary'
}
px=
"0"
>
<
Flex
alignItems=
{
'center'
}
px=
{
'20px'
}
>
<
AddIcon
mr=
{
2
}
/>
<
Box
>
{
t
(
'common.Create New'
)
}
</
Box
>
</
Flex
>
</
Button
>
}
menuList=
{
[
{
children
:
[
{
label
:
(
<
Flex
>
<
MyIcon
name=
{
FolderIcon
}
w=
{
'20px'
}
mr=
{
1
}
/>
{
t
(
'Folder'
)
}
</
Flex
>
),
onClick
:
()
=>
setEditFolderData
({})
},
{
label
:
(
<
Flex
>
<
Image
src=
{
'/imgs/workflow/db.png'
}
alt=
{
''
}
w=
{
'20px'
}
mr=
{
1
}
/>
{
t
(
'core.dataset.Dataset'
)
}
</
Flex
>
),
onClick
:
onOpenCreateModal
}
]
}
]
}
/>
)
}
</
Flex
>
<
Box
flexGrow=
{
1
}
>
<
List
/>
</
Box
>
</
Flex
>
{
!!
folderDetail
&&
isPc
&&
(
<
Box
ml=
"6"
>
<
FolderSlideCard
refreshDeps=
{
[
folderDetail
.
_id
]
}
name=
{
folderDetail
.
name
}
intro=
{
folderDetail
.
intro
}
onEdit=
{
()
=>
{
setEditedDataset
({
id
:
folderDetail
.
_id
,
name
:
folderDetail
.
name
,
intro
:
folderDetail
.
intro
});
}
}
onMove=
{
()
=>
setMoveDatasetId
(
folderDetail
.
_id
)
}
deleteTip=
{
t
(
'dataset.deleteFolderTips'
)
}
onDelete=
{
()
=>
onDelDataset
(
folderDetail
.
_id
).
then
(()
=>
{
router
.
replace
({
query
:
{
...
router
.
query
,
parentId
:
folderDetail
.
parentId
}
});
})
}
defaultPer=
{
{
value
:
folderDetail
.
defaultPermission
,
defaultValue
:
DatasetDefaultPermission
,
onChange
:
(
e
)
=>
{
return
putDatasetById
({
id
:
folderDetail
.
_id
,
defaultPermission
:
e
});
}
}
}
managePer=
{
{
permission
:
folderDetail
.
permission
,
onGetCollaboratorList
:
()
=>
getCollaboratorList
(
folderDetail
.
_id
),
permissionList
:
DatasetPermissionList
,
onUpdateCollaborators
:
({
tmbIds
,
permission
}:
{
tmbIds
:
string
[];
permission
:
number
;
})
=>
{
return
postUpdateDatasetCollaborators
({
tmbIds
,
permission
,
datasetId
:
folderDetail
.
_id
});
},
onDelOneCollaborator
:
(
tmbId
:
string
)
=>
deleteDatasetCollaborators
({
datasetId
:
folderDetail
.
_id
,
tmbId
})
}
}
/>
</
Box
>
)
}
</
Flex
>
{
!!
editFolderData
&&
(
<
EditFolderModal
onClose=
{
()
=>
setEditFolderData
(
undefined
)
}
onCreate=
{
async
({
name
})
=>
{
try
{
await
postCreateDataset
({
parentId
:
parentId
||
undefined
,
name
,
type
:
DatasetTypeEnum
.
folder
,
avatar
:
FolderImgUrl
,
intro
:
''
});
refetchDatasets
();
refetchPaths
();
}
catch
(
error
)
{
return
Promise
.
reject
(
error
);
}
}
}
onEdit=
{
async
({
name
,
intro
,
id
})
=>
{
try
{
await
putDatasetById
({
id
,
name
,
intro
});
refetchDatasets
();
refetchPaths
();
}
catch
(
error
)
{
return
Promise
.
reject
(
error
);
}
}
}
/>
</
Flex
>
<
List
/>
)
}
{
isOpenCreateModal
&&
(
<
CreateModal
onClose=
{
onCloseCreateModal
}
parentId=
{
parentId
||
undefined
}
/>
)
}
</
PageContainer
>
);
};
...
...
projects/app/src/web/core/dataset/api.ts
View file @
9d29b471
...
...
@@ -51,8 +51,8 @@ import type {
import
type
{
readCollectionSourceResponse
}
from
'@/pages/api/core/dataset/collection/read'
;
/* ======================== dataset ======================= */
export
const
getDatasets
=
(
data
:
{
parentId
?:
string
;
type
?:
DatasetTypeEnum
})
=>
GE
T
<
DatasetListItemType
[]
>
(
`/core/dataset/list`
,
data
);
export
const
getDatasets
=
(
data
:
{
parentId
?:
ParentIdType
;
type
?:
DatasetTypeEnum
})
=>
POS
T
<
DatasetListItemType
[]
>
(
`/core/dataset/list`
,
data
);
/**
* get type=dataset list
...
...
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