From 32db0412eca74bfccdd3b3c4a3006f8b9fc26828 Mon Sep 17 00:00:00 2001 From: Noemi Pusceddu Date: Thu, 8 May 2025 11:30:36 +0200 Subject: [PATCH] restriction to upload more files with same name in FileUploadAsync --- package.json | 177 +++++++++--------- .../components/FileuploadAsync/index.js | 49 ++++- 2 files changed, 128 insertions(+), 98 deletions(-) diff --git a/package.json b/package.json index a463d6b..e9c3a7e 100644 --- a/package.json +++ b/package.json @@ -1,90 +1,91 @@ { - "name": "bflows-gepafin", - "version": "1.0.0", - "private": true, - "dependencies": { - "@babel/plugin-proposal-private-property-in-object": "7.21.11", - "@babel/preset-react": "7.26.3", - "@date-fns/tz": "1.2.0", - "@emailjs/browser": "4.4.1", - "@number-flow/react": "0.5.9", - "@sentry/browser": "9.11.0", - "@stomp/stompjs": "7.1.1", - "@tanstack/react-table": "8.21.2", - "@wordpress/i18n": "5.21.0", - "@wordpress/react-i18n": "4.21.0", - "codice-fiscale-js": "2.3.22", - "copy-to-clipboard": "3.3.3", - "deep-object-diff": "1.1.9", - "dompurify": "3.2.5", - "expression-language": "1.2.0", - "fast-deep-equal": "3.1.3", - "hotkeys-js": "3.13.9", - "html-react-parser": "5.2.3", - "jwt-decode": "4.0.0", - "klona": "2.0.6", - "leader-line-new": "1.1.9", - "luxon": "3.6.1", - "mathjs": "14.4.0", - "mustache": "4.2.0", - "object-path-immutable": "4.1.2", - "primeicons": "7.0.0", - "primereact": "10.9.4", - "quill": "2.0.3", - "ramda": "0.30.1", - "react": "19.1.0", - "react-dnd": "16.0.1", - "react-dnd-html5-backend": "16.0.1", - "react-dom": "19.1.0", - "react-hook-form": "7.55.0", - "react-router-dom": "7.5.0", - "react-scripts": "5.0.1", - "recharts": "2.15.2", - "sockjs-client": "1.6.1", - "validate.js": "0.13.1", - "zustand": "5.0.3", - "zustand-x": "6.1.0" - }, - "devDependencies": { - "@babel/cli": "7.27.0", - "@babel/core": "7.26.10", - "@babel/plugin-syntax-jsx": "7.25.9", - "@wordpress/babel-plugin-makepot": "6.21.0", - "babel-plugin-macros": "3.1.0", - "node-wp-i18n": "1.2.7", - "sass": "1.86.3", - "sass-loader": "16.0.5" - }, - "scripts": { - "start": "GENERATE_SOURCEMAP=false react-scripts start", - "start:dev": "cp environments/dev/* public/loaded-files && rm public/loaded-files/dev.env && cp environments/dev/dev.env .env && PORT=8000 react-scripts start --mode development", - "start:prod": "cp environments/prod/* public/loaded-files && rm public/loaded-files/prod.env && cp environments/prod/prod.env .env && react-scripts start --mode production", - "build": "react-scripts build", - "build:dev": "cp environments/dev/* public/loaded-files && rm public/loaded-files/dev.env && cp environments/dev/dev.env .env && react-scripts build --mode development", - "build:prod": "cp environments/prod/* public/loaded-files && rm public/loaded-files/prod.env && cp environments/prod/prod.env .env && react-scripts build --mode production", - "test": "react-scripts test", - "eject": "react-scripts eject", - "make-pot": "wpi18n makepot --domain-path=languages --domain=gepafin" - }, - "eslintConfig": { - "extends": [ - "react-app", - "react-app/jest" - ], - "rules": { - "react-hooks/exhaustive-deps": "off" + "name": "bflows-gepafin", + "version": "1.0.0", + "private": true, + "dependencies": { + "@babel/plugin-proposal-private-property-in-object": "7.21.11", + "@babel/preset-react": "7.26.3", + "@date-fns/tz": "1.2.0", + "@emailjs/browser": "4.4.1", + "@number-flow/react": "0.5.9", + "@sentry/browser": "9.11.0", + "@stomp/stompjs": "7.1.1", + "@tanstack/react-table": "8.21.2", + "@wordpress/i18n": "5.21.0", + "@wordpress/react-i18n": "4.21.0", + "codice-fiscale-js": "2.3.22", + "copy-to-clipboard": "3.3.3", + "deep-object-diff": "1.1.9", + "dompurify": "3.2.5", + "expression-language": "1.2.0", + "fast-deep-equal": "3.1.3", + "hotkeys-js": "3.13.9", + "html-react-parser": "5.2.3", + "jwt-decode": "4.0.0", + "klona": "2.0.6", + "leader-line-new": "1.1.9", + "luxon": "3.6.1", + "mathjs": "14.4.0", + "mustache": "4.2.0", + "object-path-immutable": "4.1.2", + "primeicons": "7.0.0", + "primereact": "10.9.4", + "quill": "2.0.3", + "ramda": "0.30.1", + "react": "19.1.0", + "react-dnd": "16.0.1", + "react-dnd-html5-backend": "16.0.1", + "react-dom": "19.1.0", + "react-hook-form": "7.55.0", + "react-router-dom": "7.5.0", + "react-scripts": "5.0.1", + "recharts": "2.15.2", + "sockjs-client": "1.6.1", + "validate.js": "0.13.1", + "zustand": "5.0.3", + "zustand-x": "6.1.0" + }, + "devDependencies": { + "@babel/cli": "7.27.0", + "@babel/core": "7.26.10", + "@babel/plugin-syntax-jsx": "7.25.9", + "@wordpress/babel-plugin-makepot": "6.21.0", + "babel-plugin-macros": "3.1.0", + "node-wp-i18n": "1.2.7", + "sass": "1.86.3", + "sass-loader": "16.0.5" + }, + "scripts": { + "start": "GENERATE_SOURCEMAP=false react-scripts start", + "start2": "react-scripts start", + "start:dev": "cp environments/dev/* public/loaded-files && rm public/loaded-files/dev.env && cp environments/dev/dev.env .env && PORT=8000 react-scripts start --mode development", + "start:prod": "cp environments/prod/* public/loaded-files && rm public/loaded-files/prod.env && cp environments/prod/prod.env .env && react-scripts start --mode production", + "build": "react-scripts build", + "build:dev": "cp environments/dev/* public/loaded-files && rm public/loaded-files/dev.env && cp environments/dev/dev.env .env && react-scripts build --mode development", + "build:prod": "cp environments/prod/* public/loaded-files && rm public/loaded-files/prod.env && cp environments/prod/prod.env .env && react-scripts build --mode production", + "test": "react-scripts test", + "eject": "react-scripts eject", + "make-pot": "wpi18n makepot --domain-path=languages --domain=gepafin" + }, + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ], + "rules": { + "react-hooks/exhaustive-deps": "off" + } + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] } - }, - "browserslist": { - "production": [ - ">0.2%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - } -} +} \ No newline at end of file diff --git a/src/components/FormField/components/FileuploadAsync/index.js b/src/components/FormField/components/FileuploadAsync/index.js index b422c78..a1404e4 100644 --- a/src/components/FormField/components/FileuploadAsync/index.js +++ b/src/components/FormField/components/FileuploadAsync/index.js @@ -13,6 +13,8 @@ import { FileUpload } from 'primereact/fileupload'; import { Tag } from 'primereact/tag'; import { Button } from 'primereact/button'; import { head, isEmpty } from 'ramda'; +import { Messages } from 'primereact/messages'; + import { defaultMaxFileSize, mimeTypes } from '../../../../configData'; import getFormatedFileSizeText from '../../../../helpers/getFormatedFileSizeText'; @@ -42,24 +44,50 @@ const FileuploadAsync = ({ const [acceptFormats, setAcceptFormats] = useState(''); const [formatsForInput, setFormatsForInput] = useState(''); const inputRef = useRef(); + const messagesRef = useRef(null); const customBase64Uploader = (event) => { const formData = new FormData() + const filesToUpload = []; + const uploadedFiles = inputRef.current ? inputRef.current.getUploadedFiles() : []; + const currentFiles = stateFieldData; + for (const file of event.files) { - formData.append('file', file) + const isDuplicate = [...uploadedFiles, ...currentFiles].some( + (uploadedFile)=>uploadedFile.name === file.name + ); + + if(isDuplicate){ + messagesRef.current.show({ + severity: 'error', + summary: __('Attenzione', 'gepafin'), + detail: `Il file con nome "${file.name}" è già stato caricato.`, + life: 10000 + }); + + } else { + formData.append('file', file) + filesToUpload.push(file); + } + } - FileUploadService.uploadFile(sourceId, formData, callback, errorCallback, [ - ['documentType', doctype.toUpperCase()], - ['sourceType', source.toUpperCase()] - ]); + if(filesToUpload.length > 0){ + FileUploadService.uploadFile(sourceId, formData, callback, errorCallback, [ + ['documentType', doctype.toUpperCase()], + ['sourceType', source.toUpperCase()] + ]); + } }; - const callback = (data) => { + const callback = (data, uploadedFiles) => { if (data.status === 'SUCCESS') { - setStateFieldData(data.data); - const uploadedFiles = inputRef.current.getUploadedFiles(); - setDataFn(fieldName, [...uploadedFiles, ...data.data], { shouldValidate: true }); + setStateFieldData(prevState => [...prevState, ...data.data]); + const currentUploadedFiles = inputRef.current.getUploadedFiles() || []; + + inputRef.current.setUploadedFiles([...currentUploadedFiles, ...data.data]); inputRef.current.setFiles([]); + + setDataFn(fieldName, [...currentUploadedFiles, ...data.data], { shouldValidate: true }); } } @@ -160,7 +188,7 @@ const FileuploadAsync = ({ useEffect(() => { if (inputRef.current) { - inputRef.current.setUploadedFiles(defaultValue); + inputRef.current.setUploadedFiles(defaultValue); } setStateFieldData(defaultValue); }, [defaultValue]); @@ -186,6 +214,7 @@ const FileuploadAsync = ({ return ( sourceId && sourceId !== 0 ? <> +