@@ -16,8 +16,9 @@ export default class extends Controller {
1616 declare readonly previewClearButtonTarget : HTMLButtonElement ;
1717 declare readonly previewFilenameTarget : HTMLDivElement ;
1818 declare readonly previewImageTarget : HTMLDivElement ;
19+ declare readonly containerTarget : HTMLDivElement ;
1920
20- static targets = [ 'input' , 'placeholder' , 'preview' , 'previewClearButton' , 'previewFilename' , 'previewImage' ] ;
21+ static targets = [ 'container' , ' input', 'placeholder' , 'preview' , 'previewClearButton' , 'previewFilename' , 'previewImage' ] ;
2122
2223 initialize ( ) {
2324 this . clear = this . clear . bind ( this ) ;
@@ -56,38 +57,60 @@ export default class extends Controller {
5657 this . inputTarget . value = '' ;
5758 this . inputTarget . style . display = 'block' ;
5859 this . placeholderTarget . style . display = 'block' ;
60+ this . previewTarget . innerHTML = '' ;
5961 this . previewTarget . style . display = 'none' ;
60- this . previewImageTarget . style . display = 'none' ;
61- this . previewImageTarget . style . backgroundImage = 'none' ;
62- this . previewFilenameTarget . textContent = '' ;
6362
6463 this . dispatchEvent ( 'clear' ) ;
6564 }
6665
6766 onInputChange ( event : any ) {
68- const file = event . target . files [ 0 ] ;
69- if ( typeof file === 'undefined' ) {
67+ const files = event . target . files ;
68+ if ( files . length === 0 ) {
69+ this . previewClearButtonTarget . style . display = 'none' ;
7070 return ;
7171 }
7272
7373 // Hide the input and placeholder
7474 this . inputTarget . style . display = 'none' ;
7575 this . placeholderTarget . style . display = 'none' ;
7676
77- // Show the filename in preview
78- this . previewFilenameTarget . textContent = file . name ;
79- this . previewTarget . style . display = 'flex' ;
77+ // Clear previous previews
78+ this . previewTarget . innerHTML = '' ;
8079
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 ) ;
85- }
80+ for ( let file of files ) {
81+ // Create a container for each file preview
82+ const filePreviewContainer = document . createElement ( 'div' ) ;
83+ filePreviewContainer . classList . add ( 'dropzone-preview-file' ) ;
8684
87- this . dispatchEvent ( 'change' , file ) ;
88- }
85+ // Create a filename preview element
86+ const fileNameElement = document . createElement ( 'span' ) ;
87+ fileNameElement . textContent = file . name ;
88+ filePreviewContainer . appendChild ( fileNameElement ) ;
89+
90+ // Create an image preview element if the file is an image, else a default svg file icon
91+ if ( file . type ) {
92+ const imagePreviewElement = document . createElement ( 'div' ) ;
93+ if ( file . type . indexOf ( 'image' ) !== - 1 ) {
94+ imagePreviewElement . classList . add ( 'dropzone-preview-image' ) ;
95+ this . _populateImagePreview ( file , imagePreviewElement ) ;
96+ } else {
97+ imagePreviewElement . classList . add ( 'dropzone-preview-svg' ) ;
98+ }
99+
100+ filePreviewContainer . appendChild ( imagePreviewElement ) ;
101+ }
102+
103+ // Append the file preview container to the main preview target
104+ this . previewTarget . appendChild ( filePreviewContainer ) ;
105+
106+ this . dispatchEvent ( 'change' , file ) ;
107+ } ;
108+
109+ // Show the preview container
110+ this . previewTarget . style . display = 'grid' ;
111+ }
89112
90- _populateImagePreview ( file : Blob ) {
113+ _populateImagePreview ( file : Blob , imagePreviewElement : HTMLElement ) {
91114 if ( typeof FileReader === 'undefined' ) {
92115 // FileReader API not available, skip
93116 return ;
@@ -96,8 +119,8 @@ export default class extends Controller {
96119 const reader = new FileReader ( ) ;
97120
98121 reader . addEventListener ( 'load' , ( event : any ) => {
99- this . previewImageTarget . style . display = 'block' ;
100- this . previewImageTarget . style . backgroundImage = `url(" ${ event . target . result } ")` ;
122+ imagePreviewElement . style . backgroundImage = `url(" ${ event . target . result } ")` ;
123+ imagePreviewElement . style . display = 'block' ;
101124 } ) ;
102125
103126 reader . readAsDataURL ( file ) ;
@@ -107,6 +130,7 @@ export default class extends Controller {
107130 this . inputTarget . style . display = 'block' ;
108131 this . placeholderTarget . style . display = 'block' ;
109132 this . previewTarget . style . display = 'none' ;
133+ this . containerTarget . classList . add ( 'dropzone-on-drag-enter' ) ;
110134 }
111135
112136 onDragLeave ( event : any ) {
@@ -117,6 +141,7 @@ export default class extends Controller {
117141 this . inputTarget . style . display = 'none' ;
118142 this . placeholderTarget . style . display = 'none' ;
119143 this . previewTarget . style . display = 'block' ;
144+ this . containerTarget . classList . add ( 'dropzone-on-drag-leave' ) ;
120145 }
121146 }
122147
0 commit comments