@@ -48,32 +48,54 @@ function init(elements) {
4848 else if ( ! Array . isArray ( elements ) )
4949 elements = [ elements ]
5050 for ( let i = 0 ; i < elements . length ; i ++ ) {
51- if ( elements [ i ] . tagName !== 'INPUT' ) {
52- // TODO: create input and append to div if input dos not exist
53- // check if input exist
54- let input = document . createElement ( "input" ) ;
55- input . type = "file" ;
56- input . setAttribute ( 'hidden' , '' )
57- elements [ i ] . appendChild ( input ) ;
51+ let nestedInput , isInput = elements [ i ] . tagName === 'INPUT'
52+ if ( ! isInput ) {
53+ nestedInput = elements [ i ] . querySelector ( 'input[type="file"]' )
5854 }
5955
6056 elements [ i ] . getValue = async ( ) => await getFiles ( [ elements [ i ] ] )
6157 elements [ i ] . getFiles = async ( ) => await getFiles ( [ elements [ i ] ] )
62-
63- // elements[i].setValue = (value) => pickr.setColor(value);
58+ elements [ i ] . setValue = ( files ) => setFiles ( elements [ i ] , files ) ;
6459
6560 if ( elements [ i ] . hasAttribute ( 'directory' ) ) {
66- if ( window . showDirectoryPicker )
61+ if ( ! isInput && window . showDirectoryPicker )
6762 elements [ i ] . addEventListener ( "click" , fileEvent ) ;
6863 else if ( 'webkitdirectory' in elements [ i ] ) {
6964 elements [ i ] . webkitdirectory = true
70- elements [ i ] . addEventListener ( "change" , fileEvent )
65+ if ( ! isInput && ! nestedInput ) {
66+ nestedInput = document . createElement ( "input" ) ;
67+ nestedInput . type = "file" ;
68+ nestedInput . setAttribute ( 'hidden' , '' )
69+ elements [ i ] . appendChild ( nestedInput ) ;
70+ }
71+
72+ if ( nestedInput ) {
73+ elements [ i ] . addEventListener ( "click" , function ( ) {
74+ nestedInput . click ( )
75+ } ) ;
76+ nestedInput . addEventListener ( "change" , fileEvent ) ;
77+ } else
78+ elements [ i ] . addEventListener ( "change" , fileEvent ) ;
7179 } else
7280 console . error ( "Directory selection not supported in this browser." ) ;
73- } else if ( window . showOpenFilePicker )
81+ } else if ( ! isInput && window . showOpenFilePicker )
7482 elements [ i ] . addEventListener ( "click" , fileEvent ) ;
75- else
76- elements [ i ] . addEventListener ( "change" , fileEvent ) ;
83+ else {
84+ if ( ! isInput && ! nestedInput ) {
85+ nestedInput = document . createElement ( "input" ) ;
86+ nestedInput . type = "file" ;
87+ nestedInput . setAttribute ( 'hidden' , '' )
88+ elements [ i ] . appendChild ( nestedInput ) ;
89+ }
90+
91+ if ( nestedInput ) {
92+ elements [ i ] . addEventListener ( "click" , function ( ) {
93+ nestedInput . click ( )
94+ } ) ;
95+ nestedInput . addEventListener ( "change" , fileEvent ) ;
96+ } else
97+ elements [ i ] . addEventListener ( "change" , fileEvent ) ;
98+ }
7799 }
78100}
79101
@@ -82,7 +104,7 @@ async function fileEvent(event) {
82104 const input = event . target ;
83105 let selected = inputs . get ( input ) || new Map ( )
84106 let files = input . files ;
85- if ( ! files . length ) {
107+ if ( ! files || ! files . length ) {
86108 event . preventDefault ( )
87109 const multiple = input . multiple
88110 if ( input . hasAttribute ( 'directory' ) ) {
@@ -120,7 +142,7 @@ async function fileEvent(event) {
120142 }
121143
122144 if ( ! files [ i ] . src )
123- files [ i ] = await readFile ( files [ i ] )
145+ await readFile ( files [ i ] )
124146
125147 files [ i ] . directory = handle . directory || '/'
126148 files [ i ] . path = handle . path || '/'
@@ -148,7 +170,6 @@ async function fileEvent(event) {
148170 if ( isRealtime !== 'false' && ( isImport || isImport == "" ) ) {
149171 Import ( input )
150172 }
151-
152173 }
153174 } catch ( error ) {
154175 if ( error . name !== 'AbortError' ) {
@@ -203,7 +224,7 @@ async function getFiles(fileInputs) {
203224 if ( selected ) {
204225 for ( let file of selected . values ( ) ) {
205226 if ( ! file . src )
206- file = await readFile ( file )
227+ await readFile ( file )
207228
208229 file = await getCustomData ( { ...file } )
209230 files . push ( file )
@@ -214,7 +235,6 @@ async function getFiles(fileInputs) {
214235 return files
215236}
216237
217- // gets file custom data
218238async function getCustomData ( file ) {
219239 let form = document . querySelector ( `[file_id="${ file . id } "]` ) ;
220240 if ( form ) {
@@ -226,10 +246,12 @@ async function getCustomData(file) {
226246 }
227247 }
228248 }
249+
250+ delete file . input ;
251+
229252 return file ;
230253}
231254
232-
233255// This function reads the file and returns its src
234256function readFile ( file ) {
235257 return new Promise ( ( resolve ) => {
@@ -244,7 +266,7 @@ function readFile(file) {
244266 } else if ( [ 'mp4' , 'avi' , 'mov' , 'mpeg' , 'flv' ] . includes ( fileType [ 1 ] )
245267 || fileType [ 0 ] === 'video' ) {
246268 readAs = 'readAsDataURL' ;
247- } if ( [ 'mp3' , 'wav' , 'wma' , 'aac' , 'ogg' ] . includes ( fileType [ 1 ] )
269+ } else if ( [ 'mp3' , 'wav' , 'wma' , 'aac' , 'ogg' ] . includes ( fileType [ 1 ] )
248270 || fileType [ 0 ] === 'audio' ) { // updated condition
249271 readAs = 'readAsDataURL' ;
250272 } else if ( fileType [ 1 ] === 'pdf' ) {
@@ -269,6 +291,19 @@ function readFile(file) {
269291 } ) ;
270292}
271293
294+ function setFiles ( element , files ) {
295+ if ( ! Array . isArray ( files ) )
296+ files = [ files ]
297+
298+ let selected = inputs . get ( element ) || new Map ( )
299+ for ( let i = 0 ; i < files . length ; i ++ ) {
300+ files [ i ] . input = element
301+ selected . set ( files [ i ] . id , files [ i ] )
302+ Files . set ( files [ i ] . id , files [ i ] )
303+ }
304+ inputs . set ( element , selected ) ;
305+ }
306+
272307async function save ( element , action , data ) {
273308 try {
274309 if ( ! data )
0 commit comments