@@ -48,32 +48,54 @@ function init(elements) {
48
48
else if ( ! Array . isArray ( elements ) )
49
49
elements = [ elements ]
50
50
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"]' )
58
54
}
59
55
60
56
elements [ i ] . getValue = async ( ) => await getFiles ( [ elements [ i ] ] )
61
57
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 ) ;
64
59
65
60
if ( elements [ i ] . hasAttribute ( 'directory' ) ) {
66
- if ( window . showDirectoryPicker )
61
+ if ( ! isInput && window . showDirectoryPicker )
67
62
elements [ i ] . addEventListener ( "click" , fileEvent ) ;
68
63
else if ( 'webkitdirectory' in elements [ i ] ) {
69
64
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 ) ;
71
79
} else
72
80
console . error ( "Directory selection not supported in this browser." ) ;
73
- } else if ( window . showOpenFilePicker )
81
+ } else if ( ! isInput && window . showOpenFilePicker )
74
82
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
+ }
77
99
}
78
100
}
79
101
@@ -82,7 +104,7 @@ async function fileEvent(event) {
82
104
const input = event . target ;
83
105
let selected = inputs . get ( input ) || new Map ( )
84
106
let files = input . files ;
85
- if ( ! files . length ) {
107
+ if ( ! files || ! files . length ) {
86
108
event . preventDefault ( )
87
109
const multiple = input . multiple
88
110
if ( input . hasAttribute ( 'directory' ) ) {
@@ -120,7 +142,7 @@ async function fileEvent(event) {
120
142
}
121
143
122
144
if ( ! files [ i ] . src )
123
- files [ i ] = await readFile ( files [ i ] )
145
+ await readFile ( files [ i ] )
124
146
125
147
files [ i ] . directory = handle . directory || '/'
126
148
files [ i ] . path = handle . path || '/'
@@ -148,7 +170,6 @@ async function fileEvent(event) {
148
170
if ( isRealtime !== 'false' && ( isImport || isImport == "" ) ) {
149
171
Import ( input )
150
172
}
151
-
152
173
}
153
174
} catch ( error ) {
154
175
if ( error . name !== 'AbortError' ) {
@@ -203,7 +224,7 @@ async function getFiles(fileInputs) {
203
224
if ( selected ) {
204
225
for ( let file of selected . values ( ) ) {
205
226
if ( ! file . src )
206
- file = await readFile ( file )
227
+ await readFile ( file )
207
228
208
229
file = await getCustomData ( { ...file } )
209
230
files . push ( file )
@@ -214,7 +235,6 @@ async function getFiles(fileInputs) {
214
235
return files
215
236
}
216
237
217
- // gets file custom data
218
238
async function getCustomData ( file ) {
219
239
let form = document . querySelector ( `[file_id="${ file . id } "]` ) ;
220
240
if ( form ) {
@@ -226,10 +246,12 @@ async function getCustomData(file) {
226
246
}
227
247
}
228
248
}
249
+
250
+ delete file . input ;
251
+
229
252
return file ;
230
253
}
231
254
232
-
233
255
// This function reads the file and returns its src
234
256
function readFile ( file ) {
235
257
return new Promise ( ( resolve ) => {
@@ -244,7 +266,7 @@ function readFile(file) {
244
266
} else if ( [ 'mp4' , 'avi' , 'mov' , 'mpeg' , 'flv' ] . includes ( fileType [ 1 ] )
245
267
|| fileType [ 0 ] === 'video' ) {
246
268
readAs = 'readAsDataURL' ;
247
- } if ( [ 'mp3' , 'wav' , 'wma' , 'aac' , 'ogg' ] . includes ( fileType [ 1 ] )
269
+ } else if ( [ 'mp3' , 'wav' , 'wma' , 'aac' , 'ogg' ] . includes ( fileType [ 1 ] )
248
270
|| fileType [ 0 ] === 'audio' ) { // updated condition
249
271
readAs = 'readAsDataURL' ;
250
272
} else if ( fileType [ 1 ] === 'pdf' ) {
@@ -269,6 +291,19 @@ function readFile(file) {
269
291
} ) ;
270
292
}
271
293
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
+
272
307
async function save ( element , action , data ) {
273
308
try {
274
309
if ( ! data )
0 commit comments