Skip to content

Commit 16d3f55

Browse files
Improve "inputs" file handling in UI (#1036)
- Enhance file input handling in the UI to avoid losing selected files when adding new inputs. - Introduce a `selectedFiles` array to store and manage selected files. - Display selected files in the UI with additional features, including a delete button. - Update the `removeFile` function to correctly remove files from both the UI and the `selectedFiles` array. Fixes: #991 Signed-off-by: Jayanth Kumar <jknani111@gmail.com> Co-authored-by: tdruez <489057+tdruez@users.noreply.github.com>
1 parent 857ab86 commit 16d3f55

File tree

1 file changed

+52
-4
lines changed

1 file changed

+52
-4
lines changed

scancodeio/static/add-inputs.js

Lines changed: 52 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,41 @@
2121
// Visit https://github.com/aboutcode-org/scancode.io for support and download.
2222

2323
const fileInput = document.querySelector("#id_input_files");
24+
let selectedFiles = []; // Store selected files
2425
fileInput.onchange = updateFiles;
2526

2627
// Update the list of files to be uploaded in the UI
2728
function 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+
4388
function 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

Comments
 (0)