Skip to content

Commit fa60fd6

Browse files
TASK: adjust handling of selected, uploaded and rejected files in upload dialogs, improve UX
1 parent e493533 commit fa60fd6

File tree

3 files changed

+65
-8
lines changed

3 files changed

+65
-8
lines changed

Resources/Private/JavaScript/asset-upload-screen/src/NewAssetUpload.tsx

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { Button } from '@neos-project/react-ui-components';
55
import { createUseMediaUiStyles, MediaUiTheme, useIntl, useNotify } from '@media-ui/core/src';
66
import { useUploadDialogState, useUploadFiles } from '@media-ui/feature-asset-upload/src/hooks';
77
import { useCallback } from 'react';
8-
import { UploadedFile } from '@media-ui/feature-asset-upload/src/interfaces';
8+
import { FilesUploadState, UploadedFile } from '@media-ui/feature-asset-upload/src/interfaces';
99
import { PreviewSection, UploadSection } from '@media-ui/feature-asset-upload/src/components';
1010

1111
const useStyles = createUseMediaUiStyles((theme: MediaUiTheme) => ({
@@ -30,32 +30,71 @@ const NewAssetUpload = (props: { onComplete: (result: { object: { __identity: st
3030
const handleUpload = useCallback(() => {
3131
uploadFiles(dialogState.files.selected)
3232
.then(({ data: { uploadFiles } }) => {
33+
setFiles((prev) => {
34+
return {
35+
selected: [],
36+
finished: [
37+
...prev.finished,
38+
...prev.selected.filter((file) =>
39+
uploadFiles.find((result) => {
40+
return result.success && result.filename === file.name
41+
? (file.uploadStateResult = result.result)
42+
: false;
43+
})
44+
),
45+
],
46+
rejected: [
47+
...prev.rejected,
48+
...prev.selected.filter((file) =>
49+
uploadFiles.find((result) => {
50+
return !result.success && result.filename === file.name
51+
? (file.uploadStateResult = result.result)
52+
: false;
53+
})
54+
),
55+
],
56+
} as FilesUploadState;
57+
});
3358
if (!uploadFiles[0].success) {
3459
Notify.warning(
60+
translate('uploadDialog.uploadFinishedWithErrors', 'Some files could not be uploaded'),
3561
translate('uploadDialog.uploadFinishedWithErrors', 'Some files could not be uploaded')
3662
);
3763
} else {
3864
Notify.ok(translate('uploadDialog.uploadFinished', 'Upload finished'));
3965
onComplete({ object: { __identity: uploadFiles[0].assetId } });
4066
}
67+
setUploadPossible(false);
4168
})
4269
.catch((error) => {
4370
Notify.error(translate('fileUpload.error', 'Upload failed'), error);
4471
});
45-
}, [uploadFiles, dialogState.files.selected, Notify, translate, onComplete]);
72+
}, [uploadFiles, dialogState.files.selected, setFiles, setUploadPossible, Notify, translate, onComplete]);
4673

4774
const handleSetFiles = useCallback(
4875
(files: UploadedFile[]) => {
4976
setFiles((prev) => {
50-
return { ...prev, selected: files };
77+
const fileNames = new Set();
78+
for (const file of prev.finished.concat(prev.rejected)) {
79+
fileNames.add(file.name);
80+
}
81+
const newSelectedFiles = files.filter((file) => {
82+
return fileNames.has(file.name) ? false : fileNames.add(file.name);
83+
});
84+
return { ...prev, selected: newSelectedFiles };
5185
});
5286
},
5387
[setFiles]
5488
);
5589

5690
return (
5791
<section className={classes.uploadArea}>
58-
<UploadSection files={dialogState.files.selected} loading={loading} onSetFiles={handleSetFiles} />
92+
<UploadSection
93+
files={dialogState.files.selected}
94+
loading={loading}
95+
onSetFiles={handleSetFiles}
96+
maxFiles={1}
97+
/>
5998
<PreviewSection
6099
files={dialogState.files}
61100
loading={loading}

Resources/Private/JavaScript/asset-upload/src/components/Dialogs/NewAssetDialog.tsx

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ const NewAssetDialog: React.FC = () => {
2121
const { refetch } = useAssetsQuery();
2222

2323
const handleUpload = useCallback(() => {
24-
uploadFiles(dialogState.files.selected)
24+
const filesToUpload = dialogState.files.selected.filter((file) => !dialogState.files.finished.includes(file));
25+
uploadFiles(filesToUpload)
2526
.then(({ data: { uploadFiles } }) => {
2627
// FIXME: Mapping the uploadState to the files name is not the best solution as the same filename might be used multiple times
2728
// Move uploaded or failed files into separate lists
@@ -31,13 +32,21 @@ const NewAssetDialog: React.FC = () => {
3132
finished: [
3233
...prev.finished,
3334
...prev.selected.filter((file) =>
34-
uploadFiles.find((result) => result.success && result.filename === file.name)
35+
uploadFiles.find((result) => {
36+
return result.success && result.filename === file.name
37+
? (file.uploadStateResult = result.result)
38+
: false;
39+
})
3540
),
3641
],
3742
rejected: [
3843
...prev.rejected,
3944
...prev.selected.filter((file) =>
40-
uploadFiles.find((result) => !result.success && result.filename === file.name)
45+
uploadFiles.find((result) => {
46+
return !result.success && result.filename === file.name
47+
? (file.uploadStateResult = result.result)
48+
: false;
49+
})
4150
),
4251
],
4352
} as FilesUploadState;
@@ -54,6 +63,7 @@ const NewAssetDialog: React.FC = () => {
5463
if (uploadFiles.some((result) => result.success)) {
5564
void refetch();
5665
}
66+
setUploadPossible(false);
5767
})
5868
.catch((error) => {
5969
Notify.error(translate('fileUpload.error', 'Upload failed'), error);
@@ -63,7 +73,14 @@ const NewAssetDialog: React.FC = () => {
6373
const handleSetFiles = useCallback(
6474
(files: UploadedFile[]) => {
6575
setFiles((prev) => {
66-
return { ...prev, selected: files };
76+
const fileNames = new Set();
77+
for (const file of prev.finished.concat(prev.rejected)) {
78+
fileNames.add(file.name);
79+
}
80+
const newSelectedFiles = files.filter((file) => {
81+
return fileNames.has(file.name) ? false : fileNames.add(file.name);
82+
});
83+
return { ...prev, selected: newSelectedFiles };
6784
});
6885
},
6986
[setFiles]

Resources/Private/JavaScript/asset-upload/typings/UploadedFile.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,5 @@ interface UploadedFile extends File {
1111
copyrightNoticeNotNeeded?: boolean;
1212
title?: string;
1313
caption?: string;
14+
uploadStateResult?: string;
1415
}

0 commit comments

Comments
 (0)