Skip to content

Commit 771a028

Browse files
committed
enhance multiple file input with javascript to display selected file names
1 parent 06edb5d commit 771a028

File tree

2 files changed

+53
-2
lines changed

2 files changed

+53
-2
lines changed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import { Controller } from "@hotwired/stimulus";
2+
3+
/**
4+
* Stimulus controller to enhance the file input UI for multiple files.
5+
*
6+
* This controller:
7+
* - Listens for file selection on an `<input type="file" multiple="multiple">`
8+
* - Displays selected file names in a custom list **when multiple files are selected
9+
* - Defaults to the browser’s built-in display for a single file selection
10+
*
11+
* Expected HTML structure should have a placeholder div for the selected file names:
12+
*
13+
* ```erb
14+
* <div data-controller="file-input">
15+
* <input type="file" multiple data-file-input-target="input">
16+
* <div data-file-input-target="list"></div>
17+
* </div>
18+
* ```
19+
*/
20+
export default class extends Controller {
21+
static targets = ["input", "list"];
22+
23+
connect() {
24+
this.inputTarget.addEventListener("change", () => this.updateFileList());
25+
}
26+
27+
updateFileList() {
28+
const files = this.inputTarget.files;
29+
this.listTarget.innerHTML = ""; // Clear previous list
30+
31+
// If no files or only one file is selected, let the native UI handle it
32+
if (files.length <= 1) {
33+
return;
34+
}
35+
36+
const ul = document.createElement("ul");
37+
ul.classList.add("list-unstyled", "mt-2");
38+
39+
Array.from(files).forEach((file) => {
40+
const li = document.createElement("li");
41+
li.classList.add("p-1", "rounded", "mb-1");
42+
li.textContent = file.name;
43+
ul.appendChild(li);
44+
});
45+
46+
this.listTarget.appendChild(ul);
47+
}
48+
}

app/views/partners/profiles/step/_attached_documents_form.html.erb

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<%= f.fields_for :profile, profile do |pf| %>
2-
<div class="form-group">
2+
<div class="form-group" data-controller="file-input">
33
<% if profile.documents.attached? %>
44
<strong>Attached files:</strong>
55
<ul class="list-unstyled">
@@ -16,6 +16,9 @@
1616
<% end %>
1717
</ul>
1818
<% end %>
19-
<%= pf.file_field :documents, multiple: true, class: "form-control-file" %>
19+
20+
<%# Native file input and placeholder for selected file names %>
21+
<%= pf.file_field :documents, multiple: true, class: "form-control-file", data: { file_input_target: "input" } %>
22+
<div data-file-input-target="list" class="mt-2"></div>
2023
</div>
2124
<% end %>

0 commit comments

Comments
 (0)