2121// Visit https://github.com/aboutcode-org/scancode.io for support and download.
2222
2323const fileInput = document . querySelector ( "#id_input_files" ) ;
24+ let selectedFiles = [ ] ; // Store selected files
2425fileInput . onchange = updateFiles ;
2526
2627// Update the list of files to be uploaded in the UI
2728function updateFiles ( ) {
2829 if ( fileInput . files . length > 0 ) {
2930 const fileName = document . querySelector ( "#inputs_file_name" ) ;
3031 fileName . innerHTML = "" ;
31- for ( let file of fileInput . files ) {
32- fileName . innerHTML += `<span class="is-block">${ file . name } </span>` ;
32+
33+ // Update the selectedFiles array
34+ const newFiles = Array . from ( fileInput . files ) ;
35+ // Create a Set to track unique file names
36+ const uniqueFileNames = new Set ( selectedFiles . map ( file => file . name ) ) ;
37+ // Filter out files with the same name
38+ const filteredNewFiles = newFiles . filter ( file => ! uniqueFileNames . has ( file . name ) ) ;
39+ // Concatenate the unique files to the existing selectedFiles array
40+ selectedFiles = selectedFiles . concat ( filteredNewFiles ) ;
41+
42+ for ( let file of selectedFiles ) {
43+ const fileNameWithoutSpaces = file . name . replace ( / \s / g, '' ) ;
44+ fileName . innerHTML += `
45+ <span class="is-flex is-justify-content-space-between is-block" id="file-name-${ fileNameWithoutSpaces } ">
46+ <span class="is-block">${ file . name } </span>
47+ <a href="#" onclick="removeFile('${ fileNameWithoutSpaces } ')" class="model-button" id="file-delete-btn-${ fileNameWithoutSpaces } ">
48+ <i class="fa-solid fa-trash-can"></i>
49+ </a>
50+ </span>
51+ ` ;
52+ document . getElementById ( "file-delete-btn-" + fileNameWithoutSpaces ) . addEventListener ( "click" , function ( event ) {
53+ disableEvent ( event ) ;
54+ removeFile ( fileNameWithoutSpaces ) ;
55+ if ( selectedFiles . length == 0 ) {
56+ fileName . innerHTML = "<i>No files selected</i>"
57+ }
58+ } ) ;
3359 }
3460 }
3561}
@@ -40,15 +66,37 @@ function disableEvent(event) {
4066 event . preventDefault ( ) ;
4167}
4268
69+ function removeFile ( fileName ) {
70+ selectedFiles = selectedFiles . filter ( file => {
71+ const fileNameWithoutSpaces = file . name . replace ( / \s / g, '' ) ;
72+ return fileNameWithoutSpaces !== fileName ;
73+ } ) ;
74+
75+ const fileNameElement = document . getElementById ( `file-name-${ fileName } ` ) ;
76+ if ( fileNameElement ) {
77+ fileNameElement . remove ( ) ;
78+ }
79+
80+ const dataTransfer = new DataTransfer ( ) ;
81+ for ( let file of selectedFiles ) {
82+ dataTransfer . items . add ( file ) ;
83+ }
84+
85+ fileInput . files = dataTransfer . files ;
86+ }
87+
4388function dropHandler ( event ) {
4489 disableEvent ( event ) ;
4590 const droppedFiles = event . dataTransfer . files ;
46- const updatedFiles = Array . from ( fileInput . files ) ;
91+ const updatedFilesSet = new Set ( Array . from ( fileInput . files ) ) ;
4792
4893 for ( let file of droppedFiles ) {
49- updatedFiles . push ( file ) ;
94+ updatedFilesSet . add ( file ) ;
5095 }
5196
97+ // Convert the Set back to an array if needed
98+ const updatedFiles = Array . from ( updatedFilesSet ) ;
99+
52100 const dataTransfer = new DataTransfer ( ) ;
53101 for ( let file of updatedFiles ) {
54102 dataTransfer . items . add ( file ) ;
0 commit comments