Skip to content

Commit 44d4012

Browse files
committed
feat: setValue()
1 parent 65ba50f commit 44d4012

File tree

1 file changed

+56
-21
lines changed

1 file changed

+56
-21
lines changed

src/client.js

Lines changed: 56 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -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
218238
async 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
234256
function 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+
272307
async function save(element, action, data) {
273308
try {
274309
if (!data)

0 commit comments

Comments
 (0)