Skip to content

Commit b644b3f

Browse files
committed
fileOpenDialog - add onComplete that returns array of all files found; add callback() for cancel events
1 parent 447ca43 commit b644b3f

File tree

1 file changed

+28
-4
lines changed

1 file changed

+28
-4
lines changed

lib/espruinotools.js

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6897,7 +6897,9 @@ while (d!==undefined) {console.log(btoa(d));d=f.read(${CHUNKSIZE});}
68976897
* @param {string} options.id ID to ensure that subsequent calls with the same ID remember the last used directory.
68986898
* @param {'text' | 'arraybuffer'} options.type (default 'text') Callback with either 'text' or 'arraybuffer'
68996899
* @param {string | undefined} options.mimeType Optional comma-separated list of accepted mime types for files or extensions (eg. ".js,application/javascript")
6900-
* @param {(contents: ArrayBuffer | string, mimeType: string, fileName: string) => void} callback
6900+
* @param {(files: Array<{contents: (ArrayBuffer|string), mimeType: string, fileName: string}>) => void | undefined} options.onComplete
6901+
* Optional callback returns all files as an array of {contents, mimeType, fileName}. Called with `undefined` if the dialog is cancelled.
6902+
* @param {(contents: ArrayBuffer | string, mimeType: string, fileName: string) => void} callback Called for each file. Called with `undefined` if the dialog is cancelled.
69016903
*/
69026904
function fileOpenDialog(options, callback) {
69036905
function readerLoaded(e,files,i,options,fileLoader) {
@@ -6909,17 +6911,30 @@ while (d!==undefined) {console.log(btoa(d));d=f.read(${CHUNKSIZE});}
69096911
result = "";
69106912
for (var j=0;j<a.length;j++)
69116913
result += String.fromCharCode(a[j]);
6912-
} else
6914+
} else {
69136915
result = e.target.result;
6914-
fileLoader.callback(result, files[i].type, files[i].name);
6916+
}
6917+
6918+
fileLoader._filesResult.push({ contents: result, mimeType: files[i].type, fileName: files[i].name });
6919+
6920+
if (fileLoader.callback) {
6921+
fileLoader.callback(result, files[i].type, files[i].name);
6922+
}
69156923

69166924

69176925
// If there's a file left to load
69186926
if (i < files.length - 1 && options.multi) {
69196927
// Load the next file
69206928
setupReader(files, i+1,options,fileLoader);
69216929
} else {
6930+
// All files processed
6931+
if (fileLoader.onComplete) {
6932+
var results = fileLoader._filesResult || [];
6933+
fileLoader.onComplete(results);
6934+
}
6935+
fileLoader._filesResult = undefined;
69226936
fileLoader.callback = undefined;
6937+
fileLoader.onComplete = undefined;
69236938
}
69246939
}
69256940

@@ -6950,15 +6965,24 @@ while (d!==undefined) {console.log(btoa(d));d=f.read(${CHUNKSIZE});}
69506965
e.target.value = ''; // handle repeated upload of the same file
69516966
});
69526967
fileLoader.addEventListener('change', function(e) {
6953-
if (!fileLoader.callback) return;
6968+
if (!fileLoader.callback && !fileLoader.onComplete) return;
69546969

69556970
var files = e.target.files;
69566971
setupReader(files,0,options,fileLoader);
69576972

69586973
}, false);
6974+
fileLoader.addEventListener('cancel', function(e) {
6975+
if (fileLoader.callback) fileLoader.callback();
6976+
if (fileLoader.onComplete) fileLoader.onComplete();
6977+
fileLoader._filesResult = undefined;
6978+
fileLoader.callback = undefined;
6979+
fileLoader.onComplete = undefined;
6980+
}, false);
69596981
document.body.appendChild(fileLoader);
69606982
}
6983+
fileLoader._filesResult = [];
69616984
fileLoader.callback = callback;
6985+
fileLoader.onComplete = options.onComplete;
69626986
fileLoader.click();
69636987
}
69646988

0 commit comments

Comments
 (0)