21
21
// Visit https://github.com/aboutcode-org/scancode.io for support and download.
22
22
23
23
const fileInput = document . querySelector ( "#id_input_files" ) ;
24
+ let selectedFiles = [ ] ; // Store selected files
24
25
fileInput . onchange = updateFiles ;
25
26
26
27
// Update the list of files to be uploaded in the UI
27
28
function updateFiles ( ) {
28
29
if ( fileInput . files . length > 0 ) {
29
30
const fileName = document . querySelector ( "#inputs_file_name" ) ;
30
31
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
+ } ) ;
33
59
}
34
60
}
35
61
}
@@ -40,15 +66,37 @@ function disableEvent(event) {
40
66
event . preventDefault ( ) ;
41
67
}
42
68
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
+
43
88
function dropHandler ( event ) {
44
89
disableEvent ( event ) ;
45
90
const droppedFiles = event . dataTransfer . files ;
46
- const updatedFiles = Array . from ( fileInput . files ) ;
91
+ const updatedFilesSet = new Set ( Array . from ( fileInput . files ) ) ;
47
92
48
93
for ( let file of droppedFiles ) {
49
- updatedFiles . push ( file ) ;
94
+ updatedFilesSet . add ( file ) ;
50
95
}
51
96
97
+ // Convert the Set back to an array if needed
98
+ const updatedFiles = Array . from ( updatedFilesSet ) ;
99
+
52
100
const dataTransfer = new DataTransfer ( ) ;
53
101
for ( let file of updatedFiles ) {
54
102
dataTransfer . items . add ( file ) ;
0 commit comments