@@ -16,8 +16,17 @@ export default class extends Controller {
16
16
declare readonly previewClearButtonTarget : HTMLButtonElement ;
17
17
declare readonly previewFilenameTarget : HTMLDivElement ;
18
18
declare readonly previewImageTarget : HTMLDivElement ;
19
-
20
- static targets = [ 'input' , 'placeholder' , 'preview' , 'previewClearButton' , 'previewFilename' , 'previewImage' ] ;
19
+ declare readonly containerTarget : HTMLDivElement ;
20
+
21
+ static targets = [
22
+ 'container' ,
23
+ 'input' ,
24
+ 'placeholder' ,
25
+ 'preview' ,
26
+ 'previewClearButton' ,
27
+ 'previewFilename' ,
28
+ 'previewImage' ,
29
+ ] ;
21
30
22
31
initialize ( ) {
23
32
this . clear = this . clear . bind ( this ) ;
@@ -56,38 +65,60 @@ export default class extends Controller {
56
65
this . inputTarget . value = '' ;
57
66
this . inputTarget . style . display = 'block' ;
58
67
this . placeholderTarget . style . display = 'block' ;
68
+ this . previewTarget . innerHTML = '' ;
59
69
this . previewTarget . style . display = 'none' ;
60
- this . previewImageTarget . style . display = 'none' ;
61
- this . previewImageTarget . style . backgroundImage = 'none' ;
62
- this . previewFilenameTarget . textContent = '' ;
63
70
64
71
this . dispatchEvent ( 'clear' ) ;
65
72
}
66
73
67
74
onInputChange ( event : any ) {
68
- const file = event . target . files [ 0 ] ;
69
- if ( typeof file === 'undefined' ) {
75
+ const files = event . target . files ;
76
+ if ( files . length === 0 ) {
77
+ this . previewClearButtonTarget . style . display = 'none' ;
70
78
return ;
71
79
}
72
80
73
81
// Hide the input and placeholder
74
82
this . inputTarget . style . display = 'none' ;
75
83
this . placeholderTarget . style . display = 'none' ;
76
84
77
- // Show the filename in preview
78
- this . previewFilenameTarget . textContent = file . name ;
79
- this . previewTarget . style . display = 'flex' ;
85
+ // Clear previous previews
86
+ this . previewTarget . innerHTML = '' ;
87
+
88
+ for ( const file of files ) {
89
+ // Create a container for each file preview
90
+ const filePreviewContainer = document . createElement ( 'div' ) ;
91
+ filePreviewContainer . classList . add ( 'dropzone-preview-file' ) ;
92
+
93
+ // Create a filename preview element
94
+ const fileNameElement = document . createElement ( 'span' ) ;
95
+ fileNameElement . textContent = file . name ;
96
+ filePreviewContainer . appendChild ( fileNameElement ) ;
97
+
98
+ // Create an image preview element if the file is an image, else a default svg file icon
99
+ if ( file . type ) {
100
+ const imagePreviewElement = document . createElement ( 'div' ) ;
101
+ if ( file . type . indexOf ( 'image' ) !== - 1 ) {
102
+ imagePreviewElement . classList . add ( 'dropzone-preview-image' ) ;
103
+ this . _populateImagePreview ( file , imagePreviewElement ) ;
104
+ } else {
105
+ imagePreviewElement . classList . add ( 'dropzone-preview-svg' ) ;
106
+ }
107
+
108
+ filePreviewContainer . appendChild ( imagePreviewElement ) ;
109
+ }
110
+
111
+ // Append the file preview container to the main preview target
112
+ this . previewTarget . appendChild ( filePreviewContainer ) ;
80
113
81
- // If the file is an image, load it and display it as preview
82
- this . previewImageTarget . style . display = 'none' ;
83
- if ( file . type && file . type . indexOf ( 'image' ) !== - 1 ) {
84
- this . _populateImagePreview ( file ) ;
114
+ this . dispatchEvent ( 'change' , file ) ;
85
115
}
86
116
87
- this . dispatchEvent ( 'change' , file ) ;
117
+ // Show the preview container
118
+ this . previewTarget . style . display = 'grid' ;
88
119
}
89
120
90
- _populateImagePreview ( file : Blob ) {
121
+ _populateImagePreview ( file : Blob , imagePreviewElement : HTMLElement ) {
91
122
if ( typeof FileReader === 'undefined' ) {
92
123
// FileReader API not available, skip
93
124
return ;
@@ -96,8 +127,8 @@ export default class extends Controller {
96
127
const reader = new FileReader ( ) ;
97
128
98
129
reader . addEventListener ( 'load' , ( event : any ) => {
99
- this . previewImageTarget . style . display = 'block' ;
100
- this . previewImageTarget . style . backgroundImage = `url(" ${ event . target . result } ")` ;
130
+ imagePreviewElement . style . backgroundImage = `url(" ${ event . target . result } ")` ;
131
+ imagePreviewElement . style . display = 'block' ;
101
132
} ) ;
102
133
103
134
reader . readAsDataURL ( file ) ;
@@ -107,6 +138,7 @@ export default class extends Controller {
107
138
this . inputTarget . style . display = 'block' ;
108
139
this . placeholderTarget . style . display = 'block' ;
109
140
this . previewTarget . style . display = 'none' ;
141
+ this . containerTarget . classList . add ( 'dropzone-on-drag-enter' ) ;
110
142
}
111
143
112
144
onDragLeave ( event : any ) {
@@ -117,6 +149,7 @@ export default class extends Controller {
117
149
this . inputTarget . style . display = 'none' ;
118
150
this . placeholderTarget . style . display = 'none' ;
119
151
this . previewTarget . style . display = 'block' ;
152
+ this . containerTarget . classList . add ( 'dropzone-on-drag-leave' ) ;
120
153
}
121
154
}
122
155
0 commit comments