From 80bde7a9649cbf64f7d460ec0830aa7ad951666f Mon Sep 17 00:00:00 2001 From: Sam Arbid Date: Sat, 14 Sep 2024 02:10:31 +0200 Subject: [PATCH] UI: Handle empty file uploads in FileUploader * Display a warning for empty files, indicating they won't be included and listing file names. * Feature controlled by `records-resources-allow-empty-files` config value. * Continue uploading other files while showing the warning message. --- .../fields/FileUploader/FileUploader.js | 44 +++++++++++++++++-- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/invenio_rdm_records/assets/semantic-ui/js/invenio_rdm_records/src/deposit/fields/FileUploader/FileUploader.js b/invenio_rdm_records/assets/semantic-ui/js/invenio_rdm_records/src/deposit/fields/FileUploader/FileUploader.js index 1fd582bab..ea2db2bd5 100644 --- a/invenio_rdm_records/assets/semantic-ui/js/invenio_rdm_records/src/deposit/fields/FileUploader/FileUploader.js +++ b/invenio_rdm_records/assets/semantic-ui/js/invenio_rdm_records/src/deposit/fields/FileUploader/FileUploader.js @@ -3,6 +3,7 @@ // Copyright (C) 2020-2022 Northwestern University. // Copyright (C) 2022 Graz University of Technology. // Copyright (C) 2022 TU Wien. +// Copyright (C) 2024 KTH Royal Institute of Technology. // // Invenio-RDM-Records is free software; you can redistribute it and/or modify it // under the terms of the MIT License; see LICENSE file for more details. @@ -40,6 +41,7 @@ export const FileUploaderComponent = ({ isFileImportInProgress, decimalSizeDisplay, filesLocked, + allowEmptyFiles, ...uiProps }) => { // We extract the working copy of the draft stored as `values` in formik @@ -80,9 +82,24 @@ export const FileUploaderComponent = ({ const maxFileStorageReached = filesSize + acceptedFilesSize > quota.maxStorage; const filesNames = _map(filesList, "name"); - const duplicateFiles = acceptedFiles.filter((acceptedFile) => - filesNames.includes(acceptedFile.name) - ); + let hasNonEmptyFiles = false; + let hasEmptyFiles = false; + let duplicateFiles = []; + let nonEmptyFiles = []; + let emptyFiles = []; + + for (const file of acceptedFiles) { + if (file.size === 0) { + hasEmptyFiles = true; + emptyFiles.push(file); + } else { + hasNonEmptyFiles = true; + nonEmptyFiles.push(file); + } + if (filesNames.includes(file.name)) { + duplicateFiles.push(file); + } + } if (maxFileNumberReached) { setWarningMsg( @@ -130,7 +147,24 @@ export const FileUploaderComponent = ({ ); } else { - uploadFiles(formikDraft, acceptedFiles); + if (!allowEmptyFiles && hasEmptyFiles) { + setWarningMsg( +
+ +
+ ); + } + + // Proceed with uploading the non-empty files or all files if empty files are allowed + if (allowEmptyFiles || hasNonEmptyFiles) { + uploadFiles(formikDraft, allowEmptyFiles ? acceptedFiles : nonEmptyFiles); + } } }, multiple: true, @@ -348,6 +382,7 @@ FileUploaderComponent.propTypes = { decimalSizeDisplay: PropTypes.bool, filesLocked: PropTypes.bool, permissions: PropTypes.object, + allowEmptyFiles: PropTypes.bool, }; FileUploaderComponent.defaultProps = { @@ -369,4 +404,5 @@ FileUploaderComponent.defaultProps = { importButtonText: i18next.t("Import files"), decimalSizeDisplay: true, filesLocked: false, + allowEmptyFiles: true, };