diff --git a/src/files-ui/components/dropzone/components/dropzone/Dropzone.tsx b/src/files-ui/components/dropzone/components/dropzone/Dropzone.tsx index 3282af7481da1e432f225fe7d0ed51681880d02b..3edcb0a25af47a36384edbbe25826aa927ba437f 100644 --- a/src/files-ui/components/dropzone/components/dropzone/Dropzone.tsx +++ b/src/files-ui/components/dropzone/components/dropzone/Dropzone.tsx @@ -23,6 +23,7 @@ import { sleepTransition, toUploadableExtFileList, cleanInput, + isUploadAbleExtFile, } from "../../../../core"; import { mergeProps } from "../../../overridable"; import InputHidden from "../../../input-hidden/InputHidden"; @@ -155,7 +156,10 @@ const Dropzone: React.FC<DropzoneProps> = (props: DropzoneProps) => { * Uploads each file in the array of ExtFiles * First, sets all the files in preparing status and awaits `preparingTime` miliseconds. * If `preparingTime` is not given or its value is false or 0, there won´t be a preparing phase. + * This is only for the first file, the rest of files will have preparing time until the file before was uploaded + * The first file will jump from undef to "uploading" * Then onChange event will be called to update the files outside. + * * If `onCancel` event ocurrs outside on any on the * FileItems(e.g. by clicking the cancel button on `FileItem`), * the extFileInstance will change its status from 'preparing' to undefined. If so, @@ -171,27 +175,27 @@ const Dropzone: React.FC<DropzoneProps> = (props: DropzoneProps) => { * @returns nothing */ const uploadfiles = async (localFiles: ExtFile[]): Promise<void> => { + //set uploading flag to true setIsUploading(true); - console.log("upload start:", localFiles, url); - // set flag to true - // recieve on the new list - // initialize new list of ExtFileInstances - let arrOfExtFilesInstances: ExtFileInstance[] = []; + //avoid to call upload if not allowed - if (isUploading || localFiles.length === 0 || !arrOfExtFilesInstances) { + // flag is already true or there isnt files + //url was not provided + if (isUploading || localFiles.length === 0 || !url) { setIsUploading(false); return; } + // initialize new list of ExtFileInstances + let arrOfExtFilesInstances: ExtFileInstance[] = []; + const totalNumber: number = localFiles.length; console.log("upload start: totalNumber", totalNumber); - const missingUpload: number = localFiles.filter((x: ExtFile) => { - return ( - (!validateFilesFlag || (validateFilesFlag && x.valid)) && - x.uploadStatus !== "success" - ); - }).length; + const missingUpload: number = localFiles.filter((extFile: ExtFile) => + isUploadAbleExtFile(extFile, validateFilesFlag) + ).length; + console.log("upload start: missingUpload", missingUpload); let totalRejected: number = 0; @@ -200,7 +204,8 @@ const Dropzone: React.FC<DropzoneProps> = (props: DropzoneProps) => { const uploadingMessenger: FunctionLabel = DropzoneLocalizer.uploadingMessage as FunctionLabel; - if (!(missingUpload > 0 && url)) { + //no missing to upload + if (!(missingUpload > 0)) { console.log("upload start: noFilesMessage", missingUpload); setLocalMessage(DropzoneLocalizer.noFilesMessage as string); @@ -211,20 +216,16 @@ const Dropzone: React.FC<DropzoneProps> = (props: DropzoneProps) => { setLocalMessage(uploadingMessenger(`${missingUpload}/${totalNumber}`)); // setIsUploading(true); //PREPARING stage - //use methods to update on static class - //obtain a fresher dui file list - console.log("***** before setFileListMapPreparing"); - console.table(localFiles); + console.log("validateFilesFlag", validateFilesFlag); + arrOfExtFilesInstances = ExtFileManager.setFileListMapPreparing( dropzoneId, localFiles, validateFilesFlag as boolean, - cleanOnUpload as boolean + cleanOnUpload as boolean, ) || []; - console.log("***** FileManagerLog setFileListMapPreparing"); - console.table(arrOfExtFilesInstances); const newExtFileLocal: ExtFile[] = [...arrOfExtFilesInstances].map((x) => x.toExtFile() ); @@ -242,17 +243,13 @@ const Dropzone: React.FC<DropzoneProps> = (props: DropzoneProps) => { //AWAIT when preparing time is given //general sleep for all files await sleepPreparing(preparingTime); - // workaround for preventing getting the uploadStatus as undefined - /* arrOfExtFilesInstances.forEach((F) => { - F.uploadStatus = "preparing"; - }); */ - //variable for storing responses - //console.log("uploadfiles after sleep response",response); + console.log("FileManagerLog after sleep", arrOfExtFilesInstances); //return; let serverResponses: Array<UploadResponse> = []; + //Uplad files one by one for (let i = 0; i < arrOfExtFilesInstances.length; i++) { const currentExtFileInstance: ExtFileInstance = arrOfExtFilesInstances[i]; console.log( @@ -313,10 +310,10 @@ const Dropzone: React.FC<DropzoneProps> = (props: DropzoneProps) => { if (!(currentExtFileInstance.uploadStatus === "aborted")) await sleepTransition(); - handleFilesChange( - arrOfExtFilesInstances.map((x: ExtFileInstance) => x.toExtFile()), - true + const newExtFileList: ExtFile[] = arrOfExtFilesInstances.map( + (x: ExtFileInstance) => x.toExtFile() ); + handleFilesChange(newExtFileList, true); if (uploadedFile.uploadStatus === "error") { totalRejected++; @@ -326,94 +323,9 @@ const Dropzone: React.FC<DropzoneProps> = (props: DropzoneProps) => { } } - /* arrOfExtFilesInstances.forEach(async (currentExtFileInstance) => { - console.log("FileManagerLog current", currentExtFileInstance); - if (currentExtFileInstance.uploadStatus === "preparing") { - //set stage to "uploading" in one file and notify change - // PREPARING => UPLOADING - await instantPreparingToUploadOne(currentExtFileInstance); - setLocalMessage( - uploadingMessenger(`${++currentCountUpload}/${missingUpload}`) - ); - //CHANGE - handleFilesChange([...arrOfExtFilesInstances], true); - - //UPLOADING => UPLOAD() - //upload one file and notify about change - const uploadResponse: UploadResponse = fakeUpload - ? await fakeFuiUpload(currentExtFileInstance, DropzoneLocalizer) - : await uploadOnePromiseXHR( - currentExtFileInstance, - url, - method, - headers, - uploadLabel - ); - - const { uploadedFile } = uploadResponse; - //update instances - currentExtFileInstance.uploadStatus = uploadedFile.uploadStatus; - currentExtFileInstance.uploadMessage = uploadedFile.uploadMessage; - //CHNAGE - if (!(currentExtFileInstance.uploadStatus === "aborted")) - await sleepTransition(); - handleFilesChange( - arrOfExtFilesInstances.map((x: ExtFileInstance) => x.toExtFile()), - true - ); - if (uploadedFile.uploadStatus === "error") { - totalRejected++; - } - - serverResponses.push(uploadResponse); - } - }); */ - - /* for (let i = 0; i < arrOfExtFilesInstances.length; i++) { - console.log("FileManagerLog current", arrOfExtFilesInstances[i]); - //all missing filesalways have "preparing" as uploadStatus prop - if (arrOfExtFilesInstances[i].uploadStatus === "preparing") { - //set stage to "uploading" in one file and notify change - // PREPARING => UPLOADING - await instantPreparingToUploadOne(arrOfExtFilesInstances[i]); - setLocalMessage( - uploadingMessenger(`${++currentCountUpload}/${missingUpload}`) - ); - //CHANGE - handleFilesChange([...arrOfExtFilesInstances], true); - - //UPLOADING => UPLOAD() - //upload one file and notify about change - const uploadResponse: UploadResponse = fakeUpload - ? await fakeFuiUpload(arrOfExtFilesInstances[i], DropzoneLocalizer) - : await uploadOnePromiseXHR( - arrOfExtFilesInstances[i], - url, - method, - headers, - uploadLabel - ); - - const { uploadedFile } = uploadResponse; - //update instances - arrOfExtFilesInstances[i].uploadStatus = uploadedFile.uploadStatus; - arrOfExtFilesInstances[i].uploadMessage = uploadedFile.uploadMessage; - //CHNAGE - if (!(arrOfExtFilesInstances[i].uploadStatus === "aborted")) - await sleepTransition(); - handleFilesChange( - arrOfExtFilesInstances.map((x: ExtFileInstance) => x.toExtFile()), - true - ); - if (uploadedFile.uploadStatus === "error") { - totalRejected++; - } - - serverResponses.push(uploadResponse); - } - } */ // upload group finished :D onUploadFinish?.(serverResponses); + const finishUploadMessenger: FunctionLabel = DropzoneLocalizer.uploadFinished as FunctionLabel; setLocalMessage( @@ -423,19 +335,17 @@ const Dropzone: React.FC<DropzoneProps> = (props: DropzoneProps) => { }; const handleAbortUpload = () => { + const listExtFileLocal: ExtFileInstance[] | undefined = ExtFileManager.getExtFileInstanceList(dropzoneId); + console.log("Aborting", listExtFileLocal, dropzoneId); + if (!listExtFileLocal) return; - listExtFileLocal.forEach((extFile) => { - extFile.xhr?.abort(); + listExtFileLocal.forEach((extFileInstance) => { + console.log("Aborting extFileInstance",extFileInstance.xhr); + extFileInstance.xhr?.abort(); }); }; - // the current number of valid files - // update number of valid files - /* const numberOfValidFiles: number = useNumberOfValidFiles( - localFiles, - validateFilesFlag - ); */ //the final className const dropzoneClassName: string | undefined = useDropzoneClassName( diff --git a/src/files-ui/components/file-mosaic/components/FileMosaicUploadLayer/FileMosaicUploadLayer.scss b/src/files-ui/components/file-mosaic/components/FileMosaicUploadLayer/FileMosaicUploadLayer.scss index 7c8ad35cb606e66c81f99394a1fe93af4a5ba2e0..4ef8d675cb7da04781c8570f36b4b220ae07b15b 100644 --- a/src/files-ui/components/file-mosaic/components/FileMosaicUploadLayer/FileMosaicUploadLayer.scss +++ b/src/files-ui/components/file-mosaic/components/FileMosaicUploadLayer/FileMosaicUploadLayer.scss @@ -9,7 +9,7 @@ overflow: hidden; .elevation-list { - transition: all 2s ease-in-out; + transition: all 1.5s ease; position: absolute; top: 0; left: 0; diff --git a/src/files-ui/components/file-mosaic/components/FileMosaicUploadLayer/FileMosaicUploadLayer.tsx b/src/files-ui/components/file-mosaic/components/FileMosaicUploadLayer/FileMosaicUploadLayer.tsx index 5359ad331e4e257fe9746fac3e149c30ba2cf5b1..ce8f0adf861cdfb0c6cca99768cc563601887106 100644 --- a/src/files-ui/components/file-mosaic/components/FileMosaicUploadLayer/FileMosaicUploadLayer.tsx +++ b/src/files-ui/components/file-mosaic/components/FileMosaicUploadLayer/FileMosaicUploadLayer.tsx @@ -1,14 +1,8 @@ import * as React from "react"; import { FileMosaicUploadLayerProps } from "./FileMosaicUploadLayerProps"; import "./FileMosaicUploadLayer.scss"; -import InfiniteLoader from "../../../loader/InfiniteLoader/InfiniteLoader"; -import { - FileItemLocalizerSelector, - LocalLabels, - UPLOADSTATUS, -} from "../../../../core"; -import { CheckCircle, Clear, DoDisturb } from "../../../icons"; -import { DynamicLoader } from "../../../loader"; +import { UPLOADSTATUS } from "../../../../core"; + import { AbortedStatus, EmptyStatus, @@ -26,16 +20,18 @@ const FileMosaicUploadLayer: React.FC<FileMosaicUploadLayerProps> = ( const elevationContainerRef = React.useRef<HTMLDivElement | null>(null); const listContainerStoryRef = React.useRef<HTMLDivElement | null>(null); - const FileItemStatusLocalizer: LocalLabels = FileItemLocalizerSelector( - localization - ).status as LocalLabels; - const [statusHistory, setStatusHistory] = React.useState< Array<UPLOADSTATUS | undefined> >([undefined]); React.useEffect(() => { setStatusHistory((statusHistory: Array<UPLOADSTATUS | undefined>) => { + if (statusHistory[statusHistory.length - 1] === "preparing") { + const tempStatusHistory = [...statusHistory]; + tempStatusHistory[statusHistory.length - 1] = uploadStatus; + //replace + return [...tempStatusHistory]; + } return [...statusHistory, uploadStatus]; }); }, [uploadStatus]); @@ -64,31 +60,38 @@ const FileMosaicUploadLayer: React.FC<FileMosaicUploadLayerProps> = ( case "preparing": return ( <div className="elevation-item" key={index + 1}> - <PreparingStatus onCancel={onCancel}/> + <PreparingStatus + onCancel={onCancel} + localization={localization} + /> </div> ); case "uploading": return ( <div className="elevation-item" key={index + 1}> - <UploadingStatus onAbort={onAbort} progress={progress}/> + <UploadingStatus + onAbort={onAbort} + progress={progress} + localization={localization} + /> </div> ); case "error": return ( <div className="elevation-item" key={index + 1}> - <ErrorStatus /> + <ErrorStatus localization={localization} /> </div> ); case "success": return ( <div className="elevation-item" key={index + 1}> - <SuccessStatus /> + <SuccessStatus localization={localization} /> </div> ); case "aborted": return ( <div className="elevation-item" key={index + 1}> - <AbortedStatus /> + <AbortedStatus localization={localization} /> </div> ); default: diff --git a/src/files-ui/components/file-mosaic/components/file-mosaic/FileMosaic.tsx b/src/files-ui/components/file-mosaic/components/file-mosaic/FileMosaic.tsx index 8636799c8bacef7fb13e0bb24c879635c9e9edac..e97149286d6322fdb428c422b062a5f39b7091b6 100644 --- a/src/files-ui/components/file-mosaic/components/file-mosaic/FileMosaic.tsx +++ b/src/files-ui/components/file-mosaic/components/file-mosaic/FileMosaic.tsx @@ -60,7 +60,7 @@ const FileMosaic: React.FC<FileMosaicProps> = (props: FileMosaicProps) => { onRightClick, } = props; - console.log("FileMosaic progress "+ id, progress); + console.log("FileMosaic progress " + id, progress); //ref for anchor download element const downloadRef = React.useRef<HTMLAnchorElement>(null); @@ -87,7 +87,7 @@ const FileMosaic: React.FC<FileMosaicProps> = (props: FileMosaicProps) => { ); */ const localProgress: number | undefined = useProgress(progress, xhr); - console.log("FileMosaic progress localProgress "+ localProgress); + console.log("FileMosaic progress localProgress " + localProgress); //Initialize File Item const [isReady, isImage, isVideo, url, imageSource]: [ @@ -281,8 +281,11 @@ const FileMosaic: React.FC<FileMosaicProps> = (props: FileMosaicProps) => { <FileMosaicUploadLayer uploadStatus={uploadStatus} progress={localProgress} - onCancel={onCancel} - onAbort={onAbort} + onCancel={() => onCancel?.(id)} + onAbort={() => { + xhr?.abort(); + onAbort?.(id); + }} localization={localization} /> </Layer> diff --git a/src/files-ui/core/index.ts b/src/files-ui/core/index.ts index aea53dc9a7e2a446ce5d09369fc5b3f0ea69aa97..e76085c5ebbd5f35e0d87965dee23db775d95d3f 100644 --- a/src/files-ui/core/index.ts +++ b/src/files-ui/core/index.ts @@ -138,7 +138,7 @@ export { sleepPreparing, uploadOne, uploadOneExtFile, - cleanInput, addClassName, getRandomInt + cleanInput, addClassName, getRandomInt, isUploadAbleExtFile } from "./utils"; export { diff --git a/src/files-ui/core/types/ExtFileManager.ts b/src/files-ui/core/types/ExtFileManager.ts index ca93798f7ebcd5ef5c0df05f3a4fdb9d20aa9753..7eaa531e4dcc38162460250345048db4b0777a78 100644 --- a/src/files-ui/core/types/ExtFileManager.ts +++ b/src/files-ui/core/types/ExtFileManager.ts @@ -96,20 +96,27 @@ export class ExtFileManager { validateFiles: boolean, cleanOnUpload: boolean ): ExtFileInstance[] | undefined { + console.log("setFileListMapPreparing before if", dropzoneId, localFiles, cleanOnUpload); if (!(typeof dropzoneId === "number" || typeof dropzoneId === "string")) return undefined; + console.log("setFileListMapPreparing before try", localFiles, cleanOnUpload); try { + let resultExtList: ExtFileInstance[] = []; - //remove non valids if cleanOnUpload is true and validateFiles is also true - let temLocalFiles: ExtFile[] = []; - if (cleanOnUpload) { + //initializes the extFileLInstance list + let temLocalFiles: ExtFile[] = [...localFiles]; + + //remove non valids if cleanOnUpload is true and validateFiles is also true + if (cleanOnUpload && validateFiles) { // clean on Upload is true, so non valid files must be removed - temLocalFiles = localFiles.filter(extFile => extFile.valid) + temLocalFiles = temLocalFiles.filter(extFile => extFile.valid) console.log("temLocalFiles filter", temLocalFiles); } + console.log("setFileListMapPreparing after remove non valids", temLocalFiles); + if (validateFiles) { // validation flag was set to true, so only valid=true files will be set to "preparing" @@ -126,7 +133,7 @@ export class ExtFileManager { }); } else { // all files will be set to "preparing" whether the valid value - // except those diles with uploadStatus ==="success" + // except those files with uploadStatus ==="success" temLocalFiles = temLocalFiles .map(extFile => { @@ -138,31 +145,19 @@ export class ExtFileManager { }); } - console.log("FileManagerLog RESULT temLocalFiles", temLocalFiles); - - //sets on preparing stage all files according to the following criteria: - // If the uploadStatus is diferent than "sucess" AND - // If validateFiles is true and the file is true OR validateFiles is false - // then update the files on preparing stage. Otherwise keep the extFile props. - /* for (let i = 0; i < resultExtList.length; i++) { - const extFileInstance: ExtFileInstance = resultExtList[i]; - const { valid, uploadStatus } = extFileInstance; - console.log("upload setFileListMapPreparing resultExtList[i]", (uploadStatus !== "success") && ((validateFiles && valid) || !validateFiles)); - - if ((uploadStatus !== "success") && ((validateFiles && valid) || !validateFiles)) - resultExtList[i].uploadStatus = "preparing"; - } */ + console.log("setFileListMapPreparing result", temLocalFiles); + //converto to Object instances resultExtList = temLocalFiles.map(F => new ExtFileInstance(F)); - console.log("FileManagerLog RESULT resultExtList", resultExtList); + console.log("setFileListMapPreparing RESULT resultExtList", resultExtList); const resultSet = ExtFileManager.setFileList(dropzoneId, resultExtList); - console.log("FileManagerLog RESULT resultSet", resultSet); + console.log("setFileListMapPreparing RESULT resultSet", resultSet); return resultExtList; // return ExtFileManager.fileLists[dropzoneId]; } catch (error) { - console.error("upload setFileListMapPreparing Error on get List", error); + console.error("setFileListMapPreparing Error on get List", error); return undefined; } diff --git a/src/files-ui/core/upload/utils.upload.ts b/src/files-ui/core/upload/utils.upload.ts index 00f45cd67588c65c97a158749f5f076c4e2881b7..1d58d63a1d913949642c886f4f2fecc5d54b3f76 100644 --- a/src/files-ui/core/upload/utils.upload.ts +++ b/src/files-ui/core/upload/utils.upload.ts @@ -111,7 +111,7 @@ export const sleepTransition = ( return new Promise((resolve, reject) => { setTimeout(() => { resolve(true); - }, 1200); + }, 1500); }); } diff --git a/src/files-ui/core/utils/index.ts b/src/files-ui/core/utils/index.ts index 01478032d4049b5f5cbc89eb9d4a6c078d0fb95e..678c2808484b745c11264947b8acbce11c63f7b4 100644 --- a/src/files-ui/core/utils/index.ts +++ b/src/files-ui/core/utils/index.ts @@ -36,4 +36,6 @@ export { getRandomInt } from "./randomInt"; export { cleanInput } from "./input.utils"; -export { addClassName } from "./addClassName"; \ No newline at end of file +export { addClassName } from "./addClassName"; + +export {isUploadAbleExtFile} from "./isUploadAbleExtFile"; \ No newline at end of file diff --git a/src/files-ui/core/utils/isUploadAbleExtFile.ts b/src/files-ui/core/utils/isUploadAbleExtFile.ts new file mode 100644 index 0000000000000000000000000000000000000000..112a345b28e1457e050097db68921163ddec2c4a --- /dev/null +++ b/src/files-ui/core/utils/isUploadAbleExtFile.ts @@ -0,0 +1,5 @@ +import { ExtFile } from "../types"; + +export const isUploadAbleExtFile = (extFile: ExtFile, validateFilesFlag: boolean) => { + return (!validateFilesFlag || (validateFilesFlag && extFile.valid)) && extFile.uploadStatus !== "success"; +} \ No newline at end of file