Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
D
dify
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
ai-tech
dify
Commits
06077de6
Commit
06077de6
authored
Jun 20, 2023
by
Joel
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'feat/files-uploader-new' into deploy/dev
parents
ae51344c
93c38f00
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
26 additions
and
70 deletions
+26
-70
index.tsx
web/app/components/datasets/create/file-uploader/index.tsx
+25
-70
index.tsx
web/app/components/datasets/create/step-one/index.tsx
+1
-0
No files found.
web/app/components/datasets/create/file-uploader/index.tsx
View file @
06077de6
'use client'
'use client'
import
React
,
{
use
Callback
,
use
Effect
,
useRef
,
useState
}
from
'react'
import
React
,
{
useEffect
,
useRef
,
useState
}
from
'react'
import
{
useTranslation
}
from
'react-i18next'
import
{
useTranslation
}
from
'react-i18next'
import
{
useContext
}
from
'use-context-selector'
import
{
useContext
}
from
'use-context-selector'
import
cn
from
'classnames'
import
cn
from
'classnames'
...
@@ -11,6 +11,7 @@ import { upload } from '@/service/base'
...
@@ -11,6 +11,7 @@ import { upload } from '@/service/base'
type
IFileUploaderProps
=
{
type
IFileUploaderProps
=
{
fileList
:
any
[]
fileList
:
any
[]
titleClassName
?:
string
prepareFileList
:
(
files
:
any
[])
=>
void
prepareFileList
:
(
files
:
any
[])
=>
void
onFileUpdate
:
(
fileItem
:
any
,
progress
:
number
,
list
:
any
[])
=>
void
onFileUpdate
:
(
fileItem
:
any
,
progress
:
number
,
list
:
any
[])
=>
void
onFileListUpdate
?:
(
files
:
any
)
=>
void
onFileListUpdate
?:
(
files
:
any
)
=>
void
...
@@ -34,6 +35,7 @@ const BATCH_COUNT = 5
...
@@ -34,6 +35,7 @@ const BATCH_COUNT = 5
const
FileUploader
=
({
const
FileUploader
=
({
fileList
,
fileList
,
titleClassName
,
prepareFileList
,
prepareFileList
,
onFileUpdate
,
onFileUpdate
,
onFileListUpdate
,
onFileListUpdate
,
...
@@ -45,13 +47,8 @@ const FileUploader = ({
...
@@ -45,13 +47,8 @@ const FileUploader = ({
const
dropRef
=
useRef
<
HTMLDivElement
>
(
null
)
const
dropRef
=
useRef
<
HTMLDivElement
>
(
null
)
const
dragRef
=
useRef
<
HTMLDivElement
>
(
null
)
const
dragRef
=
useRef
<
HTMLDivElement
>
(
null
)
const
fileUploader
=
useRef
<
HTMLInputElement
>
(
null
)
const
fileUploader
=
useRef
<
HTMLInputElement
>
(
null
)
const
uploadPromise
=
useRef
<
any
>
(
null
)
const
[
currentFile
,
setCurrentFile
]
=
useState
<
File
>
()
const
[
uploading
,
setUploading
]
=
useState
(
false
)
const
[
percent
,
setPercent
]
=
useState
(
0
)
// TODO
const
fileListRef
=
useRef
<
any
>
([])
const
fileListRef
=
useRef
<
any
>
(
null
)
// utils
// utils
const
getFileType
=
(
currentFile
:
File
)
=>
{
const
getFileType
=
(
currentFile
:
File
)
=>
{
...
@@ -61,10 +58,7 @@ const FileUploader = ({
...
@@ -61,10 +58,7 @@ const FileUploader = ({
const
arr
=
currentFile
.
name
.
split
(
'.'
)
const
arr
=
currentFile
.
name
.
split
(
'.'
)
return
arr
[
arr
.
length
-
1
]
return
arr
[
arr
.
length
-
1
]
}
}
const
getFileName
=
(
name
:
string
)
=>
{
const
arr
=
name
.
split
(
'.'
)
return
arr
.
slice
(
0
,
-
1
).
join
()
}
const
getFileSize
=
(
size
:
number
)
=>
{
const
getFileSize
=
(
size
:
number
)
=>
{
if
(
size
/
1024
<
10
)
if
(
size
/
1024
<
10
)
return
`
${(
size
/
1024
).
toFixed
(
2
)}
KB`
return
`
${(
size
/
1024
).
toFixed
(
2
)}
KB`
...
@@ -85,25 +79,14 @@ const FileUploader = ({
...
@@ -85,25 +79,14 @@ const FileUploader = ({
return
isValidType
&&
isValidSize
return
isValidType
&&
isValidSize
}
}
const
onProgress
=
useCallback
((
e
:
ProgressEvent
)
=>
{
if
(
e
.
lengthComputable
)
{
const
percent
=
Math
.
floor
(
e
.
loaded
/
e
.
total
*
100
)
// updateFileItem
setPercent
(
percent
)
}
},
[
setPercent
])
const
abort
=
()
=>
{
const
currentXHR
=
uploadPromise
.
current
currentXHR
.
abort
()
}
const
fileUpload
=
async
(
fileItem
:
any
)
=>
{
const
fileUpload
=
async
(
fileItem
:
any
)
=>
{
const
fileListCopy
=
fileListRef
.
current
const
formData
=
new
FormData
()
const
formData
=
new
FormData
()
formData
.
append
(
'file'
,
fileItem
.
file
)
formData
.
append
(
'file'
,
fileItem
.
file
)
const
onProgress
=
(
e
:
ProgressEvent
)
=>
{
const
onProgress
=
(
e
:
ProgressEvent
)
=>
{
if
(
e
.
lengthComputable
)
{
if
(
e
.
lengthComputable
)
{
const
percent
=
Math
.
floor
(
e
.
loaded
/
e
.
total
*
100
)
const
percent
=
Math
.
floor
(
e
.
loaded
/
e
.
total
*
100
)
onFileUpdate
(
fileItem
,
percent
,
fileList
Copy
)
onFileUpdate
(
fileItem
,
percent
,
fileList
Ref
.
current
)
}
}
}
}
...
@@ -113,11 +96,13 @@ const FileUploader = ({
...
@@ -113,11 +96,13 @@ const FileUploader = ({
onprogress
:
onProgress
,
onprogress
:
onProgress
,
})
})
.
then
((
res
:
FileEntity
)
=>
{
.
then
((
res
:
FileEntity
)
=>
{
const
fileListCopy
=
fileListRef
.
current
const
completeFile
=
{
const
completeFile
=
{
fileID
:
fileItem
.
fileID
,
fileID
:
fileItem
.
fileID
,
file
:
res
,
file
:
res
,
}
}
const
index
=
fileListCopy
.
findIndex
(
item
=>
item
.
fileID
===
fileItem
.
fileID
)
const
index
=
fileListCopy
.
findIndex
(
(
item
:
any
)
=>
item
.
fileID
===
fileItem
.
fileID
)
fileListCopy
[
index
]
=
completeFile
fileListCopy
[
index
]
=
completeFile
onFileUpdate
(
completeFile
,
100
,
fileListCopy
)
onFileUpdate
(
completeFile
,
100
,
fileListCopy
)
return
Promise
.
resolve
({
...
completeFile
})
return
Promise
.
resolve
({
...
completeFile
})
...
@@ -159,9 +144,9 @@ const FileUploader = ({
...
@@ -159,9 +144,9 @@ const FileUploader = ({
}
}
return
fileItem
return
fileItem
})
})
prepareFileList
(
preparedFiles
)
const
newFiles
=
[...
fileListRef
.
current
,
...
preparedFiles
]
// TODO fix filelist copy
prepareFileList
(
newFiles
)
fileListRef
.
current
=
prepared
Files
fileListRef
.
current
=
new
Files
uploadMultipleFiles
(
preparedFiles
)
uploadMultipleFiles
(
preparedFiles
)
}
}
const
handleDragEnter
=
(
e
:
DragEvent
)
=>
{
const
handleDragEnter
=
(
e
:
DragEvent
)
=>
{
...
@@ -178,7 +163,7 @@ const FileUploader = ({
...
@@ -178,7 +163,7 @@ const FileUploader = ({
e
.
stopPropagation
()
e
.
stopPropagation
()
e
.
target
===
dragRef
.
current
&&
setDragging
(
false
)
e
.
target
===
dragRef
.
current
&&
setDragging
(
false
)
}
}
// TODO
const
handleDrop
=
(
e
:
DragEvent
)
=>
{
const
handleDrop
=
(
e
:
DragEvent
)
=>
{
e
.
preventDefault
()
e
.
preventDefault
()
e
.
stopPropagation
()
e
.
stopPropagation
()
...
@@ -187,13 +172,9 @@ const FileUploader = ({
...
@@ -187,13 +172,9 @@ const FileUploader = ({
return
return
const
files
=
[...
e
.
dataTransfer
.
files
]
const
files
=
[...
e
.
dataTransfer
.
files
]
if
(
files
.
length
>
1
)
{
const
validFiles
=
files
.
filter
(
file
=>
isValid
(
file
))
notify
({
type
:
'error'
,
message
:
t
(
'datasetCreation.stepOne.uploader.validation.count'
)
})
// fileUpload(files[0])
return
initialUpload
(
validFiles
)
}
// TODO
// onFileUpdate()
fileUpload
(
files
[
0
])
}
}
const
selectHandle
=
()
=>
{
const
selectHandle
=
()
=>
{
...
@@ -201,12 +182,11 @@ const FileUploader = ({
...
@@ -201,12 +182,11 @@ const FileUploader = ({
fileUploader
.
current
.
click
()
fileUploader
.
current
.
click
()
}
}
const
removeFile
=
(
index
:
number
)
=>
{
const
removeFile
=
(
fileID
:
string
)
=>
{
if
(
fileUploader
.
current
)
if
(
fileUploader
.
current
)
fileUploader
.
current
.
value
=
''
fileUploader
.
current
.
value
=
''
setCurrentFile
(
undefined
)
fileListRef
.
current
=
fileListRef
.
current
.
filter
((
item
:
any
)
=>
item
.
fileID
!==
fileID
)
fileListRef
.
current
.
splice
(
index
,
1
)
onFileListUpdate
?.([...
fileListRef
.
current
])
onFileListUpdate
?.([...
fileListRef
.
current
])
}
}
const
fileChangeHandle
=
(
e
:
React
.
ChangeEvent
<
HTMLInputElement
>
)
=>
{
const
fileChangeHandle
=
(
e
:
React
.
ChangeEvent
<
HTMLInputElement
>
)
=>
{
...
@@ -238,7 +218,7 @@ const FileUploader = ({
...
@@ -238,7 +218,7 @@ const FileUploader = ({
accept=
{
ACCEPTS
.
join
(
','
)
}
accept=
{
ACCEPTS
.
join
(
','
)
}
onChange=
{
fileChangeHandle
}
onChange=
{
fileChangeHandle
}
/>
/>
<
div
className=
{
s
.
title
}
>
{
t
(
'datasetCreation.stepOne.uploader.title'
)
}
</
div
>
<
div
className=
{
cn
(
s
.
title
,
titleClassName
)
}
>
{
t
(
'datasetCreation.stepOne.uploader.title'
)
}
</
div
>
<
div
ref=
{
dropRef
}
className=
{
cn
(
s
.
uploader
,
dragging
&&
s
.
dragging
)
}
>
<
div
ref=
{
dropRef
}
className=
{
cn
(
s
.
uploader
,
dragging
&&
s
.
dragging
)
}
>
<
div
className=
'flex justify-center items-center h-6 mb-2'
>
<
div
className=
'flex justify-center items-center h-6 mb-2'
>
<
span
className=
{
s
.
uploadIcon
}
/>
<
span
className=
{
s
.
uploadIcon
}
/>
...
@@ -260,7 +240,7 @@ const FileUploader = ({
...
@@ -260,7 +240,7 @@ const FileUploader = ({
)
}
)
}
>
>
{
fileItem
.
progress
<
100
&&
(
{
fileItem
.
progress
<
100
&&
(
<
div
className=
{
s
.
progressbar
}
style=
{
{
width
:
`${
percent
}%`
}
}
/>
<
div
className=
{
s
.
progressbar
}
style=
{
{
width
:
`${
fileItem.progress
}%`
}
}
/>
)
}
)
}
<
div
className=
{
s
.
fileInfo
}
>
<
div
className=
{
s
.
fileInfo
}
>
<
div
className=
{
cn
(
s
.
fileIcon
,
s
[
getFileType
(
fileItem
.
file
)])
}
/>
<
div
className=
{
cn
(
s
.
fileIcon
,
s
[
getFileType
(
fileItem
.
file
)])
}
/>
...
@@ -272,7 +252,10 @@ const FileUploader = ({
...
@@ -272,7 +252,10 @@ const FileUploader = ({
<
div
className=
{
s
.
percent
}
>
{
`${fileItem.progress}%`
}
</
div
>
<
div
className=
{
s
.
percent
}
>
{
`${fileItem.progress}%`
}
</
div
>
)
}
)
}
{
fileItem
.
progress
===
100
&&
(
{
fileItem
.
progress
===
100
&&
(
<
div
className=
{
s
.
remove
}
onClick=
{
()
=>
removeFile
(
index
)
}
/>
<
div
className=
{
s
.
remove
}
onClick=
{
(
e
)
=>
{
e
.
stopPropagation
()
removeFile
(
fileItem
.
fileID
)
}
}
/>
)
}
)
}
</
div
>
</
div
>
</
div
>
</
div
>
...
@@ -305,34 +288,6 @@ const FileUploader = ({
...
@@ -305,34 +288,6 @@ const FileUploader = ({
</div>
</div>
)} */
}
)} */
}
</
div
>
</
div
>
{
/* TODO */
}
{
/* {false && !currentFile && fileList[0] && (
<div
// onClick={() => onPreview(currentFile)}
className={cn(
s.file,
uploading && s.uploading,
s.active,
)}
>
{uploading && (
<div className={s.progressbar} style={{ width: `${percent}%` }}/>
)}
<div className={s.fileInfo}>
<div className={cn(s.fileIcon, s[getFileType(fileList[0])])}/>
<div className={s.filename}>{fileList[0].name}</div>
<div className={s.size}>{getFileSize(fileList[0].size)}</div>
</div>
<div className={s.actionWrapper}>
{uploading && (
<div className={s.percent}>{`${percent}%`}</div>
)}
{!uploading && (
<div className={s.remove} onClick={removeFile}/>
)}
</div>
</div>
)} */
}
</
div
>
</
div
>
)
)
}
}
...
...
web/app/components/datasets/create/step-one/index.tsx
View file @
06077de6
...
@@ -155,6 +155,7 @@ const StepOne = ({
...
@@ -155,6 +155,7 @@ const StepOne = ({
<>
<>
<
FileUploader
<
FileUploader
fileList=
{
files
}
fileList=
{
files
}
titleClassName=
{
!
shouldShowDataSourceTypeList
?
'mt-[30px] !mb-[44px] !text-lg !font-semibold !text-gray-900'
:
undefined
}
prepareFileList=
{
updateFileList
}
prepareFileList=
{
updateFileList
}
onFileListUpdate=
{
updateFileList
}
onFileListUpdate=
{
updateFileList
}
onFileUpdate=
{
updateFile
}
onFileUpdate=
{
updateFile
}
...
...
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