Skip to content

Commit 8f42568

Browse files
committed
refactor(defaultTheme): refine enhanceUpload() utilities
1 parent 88ad2f4 commit 8f42568

File tree

2 files changed

+61
-82
lines changed

2 files changed

+61
-82
lines changed

src/tpl/defaultTheme/frontend/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@
6060
</div>
6161
<div class="panel upload">
6262
<form method="POST" action="{{.SubItemPrefix}}?upload" enctype="multipart/form-data">
63-
<input type="file" name="file" multiple="multiple" class="file"/>
63+
<input type="file" name="file" multiple="multiple"/>
6464
<input type="hidden" name="contextquerystring" value="{{$contextQueryString}}"/>
6565
<button type="submit" class="submit">{{.Trans.UploadLabel}}</button>
6666
</form>

src/tpl/defaultTheme/frontend/index.js

Lines changed: 60 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@
4141

4242
var lastFocused;
4343

44+
var errLacksMkdir = new Error("mkdir permission is not enabled")
45+
4446
function enableFilter() {
4547
var filter = document.body.querySelector('.filter');
4648
if (!filter) return;
@@ -429,22 +431,16 @@
429431

430432
function enhanceUpload() {
431433
var upload = document.body.querySelector('.upload');
432-
if (!upload) {
433-
return;
434-
}
434+
if (!upload) return;
435+
435436
var form = upload.querySelector('form');
436-
if (!form) {
437-
return;
438-
}
439-
var fileInput = form.querySelector('.file');
440-
if (!fileInput) {
441-
return;
442-
}
437+
if (!form) return;
438+
439+
var fileInput = form.querySelector('input[type=file]');
440+
if (!fileInput) return;
443441

444442
var uploadType = document.body.querySelector('.upload-type');
445-
if (!uploadType) {
446-
return;
447-
}
443+
if (!uploadType) return;
448444

449445
var file = 'file';
450446
var dirFile = 'dirfile';
@@ -473,7 +469,7 @@
473469
var handleKindFile = 'file';
474470
var handleKindDir = 'directory';
475471
var permDescriptor = {mode: 'read'};
476-
itemsToFiles = function (dataTransferItems, canMkdir, onDone, onLacksMkdir) {
472+
itemsToFiles = function (dataTransferItems, canMkdir) {
477473
function resultsToFiles(results, files, dirPath) {
478474
return Promise.all(results.map(function (result) {
479475
var handle = result.value;
@@ -521,73 +517,60 @@
521517
var files = [];
522518
var hasDir = false;
523519

524-
var items = Array.prototype.slice.call(dataTransferItems);
525-
Promise.all(items.map(function (item) {
520+
return Promise.all(Array.from(dataTransferItems).map(function (item) {
526521
return item.getAsFileSystemHandle();
527522
})).then(function (handles) {
528523
handles = handles.filter(Boolean); // undefined for pasted content
529524
hasDir = handles.some(function (handle) {
530525
return handle.kind === handleKindDir;
531526
});
532527
if (hasDir && !canMkdir) {
533-
return onLacksMkdir();
528+
throw errLacksMkdir;
534529
}
535530
var handleResults = handles.map(function (handle) {
536531
return {value: handle, done: false};
537532
});
538-
resultsToFiles(handleResults, files, '').then(function () {
539-
onDone(files, hasDir);
533+
return resultsToFiles(handleResults, files, '').then(function () {
534+
return {files: files, hasDir: hasDir};
540535
});
541536
});
542537
}
543538
} else {
544-
itemsToFiles = function (dataTransferItems, canMkdir, onDone, onLacksMkdir) {
545-
function entriesToFiles(entries, files, onLevelDone) {
546-
var len = entries.length;
547-
var cb = 0;
548-
if (!len) return onLevelDone();
549-
550-
function increaseCb() {
551-
cb++;
552-
if (cb === len) {
553-
onLevelDone();
554-
}
555-
}
556-
557-
function dirReaderToFiles(dirReader, files, onAllRead) {
558-
dirReader.readEntries(function (subEntries) {
559-
if (!subEntries.length) return onAllRead();
560-
entriesToFiles(subEntries, files, function () {
561-
dirReaderToFiles(dirReader, files, onAllRead);
562-
});
563-
}, onAllRead);
564-
}
565-
566-
entries.forEach(function (entry) {
567-
if (entry.isFile) {
568-
var relativePath = entry.fullPath;
569-
if (relativePath[0] === '/') {
570-
relativePath = relativePath.substring(1);
539+
itemsToFiles = function (dataTransferItems, canMkdir) {
540+
function entriesToFiles(entries, files) {
541+
return Promise.all(entries.map(function (entry) {
542+
return new Promise(function (resolve) {
543+
if (entry.isFile) {
544+
var relativePath = entry.fullPath;
545+
if (relativePath[0] === '/') {
546+
relativePath = relativePath.slice(1);
547+
}
548+
entry.file(function (file) {
549+
files.push({file: file, relativePath: relativePath});
550+
resolve();
551+
}, function (err) {
552+
logError(err);
553+
resolve()
554+
});
555+
} else if (entry.isDirectory) {
556+
var dirReader = entry.createReader()
557+
var onReadSubEntries = function (subEntries) {
558+
if (!subEntries.length) resolve();
559+
entriesToFiles(subEntries, files).then(function () {
560+
dirReader.readEntries(onReadSubEntries);
561+
});
562+
}
563+
dirReader.readEntries(onReadSubEntries);
571564
}
572-
entry.file(function (file) {
573-
files.push({file: file, relativePath: relativePath});
574-
increaseCb();
575-
}, function (err) {
576-
increaseCb();
577-
logError(err);
578-
});
579-
} else if (entry.isDirectory) {
580-
var dirReader = entry.createReader();
581-
dirReaderToFiles(dirReader, files, increaseCb);
582-
}
583-
});
565+
})
566+
}));
584567
}
585568

569+
var entries = [];
586570
var files = [];
587571
var hasDir = false;
588572

589-
var entries = [];
590-
for (var i = 0, len = dataTransferItems.length; i < len; i++) {
573+
for (var i = 0; i < dataTransferItems.length; i++) {
591574
var item = dataTransferItems[i];
592575
var entry = item.webkitGetAsEntry();
593576
if (!entry) { // undefined for pasted text
@@ -603,27 +586,17 @@
603586
if (canMkdir) {
604587
entries.push(entry);
605588
} else {
606-
return onLacksMkdir();
589+
return Promise.reject(errLacksMkdir);
607590
}
608591
}
609592
}
610593

611-
entriesToFiles(entries, files, function () {
612-
onDone(files, hasDir);
594+
return entriesToFiles(entries, files).then(function () {
595+
return {files: files, hasDir: hasDir};
613596
});
614597
}
615598
}
616599

617-
function dataTransferToFiles(dataTransfer, canMkdir, onDone, onLacksMkdir) {
618-
itemsToFiles(dataTransfer.items, canMkdir, function (files, hasDir) {
619-
// ancient Browser
620-
if (files.length === 0 && dataTransfer.files && dataTransfer.files.length) {
621-
files = Array.prototype.slice.call(dataTransfer.files);
622-
}
623-
onDone(files, hasDir);
624-
}, onLacksMkdir);
625-
}
626-
627600
var switchToFileMode = noop;
628601
var switchToDirMode = noop;
629602

@@ -913,16 +886,19 @@
913886
return;
914887
}
915888

916-
dataTransferToFiles(e.dataTransfer, canMkdir, function (files, hasDir) {
917-
if (hasDir) {
889+
itemsToFiles(e.dataTransfer.items, canMkdir).then(function (result) {
890+
var files = result.files;
891+
if (result.hasDir) {
918892
switchToDirMode();
919893
uploadProgressively(files);
920894
} else {
921895
switchToFileMode();
922896
uploadProgressively(files);
923897
}
924-
}, function () {
925-
typeof showUploadDirFailMessage !== strUndef && showUploadDirFailMessage();
898+
}, function (err) {
899+
if (err === errLacksMkdir && typeof showUploadDirFailMessage !== strUndef) {
900+
showUploadDirFailMessage();
901+
}
926902
});
927903
}
928904

@@ -1012,7 +988,8 @@
1012988
return;
1013989
}
1014990

1015-
itemsToFiles(items, canMkdir, function (files, hasDir) {
991+
itemsToFiles(items, canMkdir).then(function (result) {
992+
var files = result.files;
1016993
// for pasted text
1017994
if (!files.length) {
1018995
generatePastedFiles(data);
@@ -1029,14 +1006,16 @@
10291006
}
10301007

10311008
// pasted real files
1032-
if (hasDir) {
1009+
if (result.hasDir) {
10331010
switchToDirMode();
10341011
} else {
10351012
switchToFileMode();
10361013
}
10371014
uploadProgressively(files);
1038-
}, function () {
1039-
typeof showUploadDirFailMessage !== strUndef && showUploadDirFailMessage();
1015+
}, function (err) {
1016+
if (err === errLacksMkdir && typeof showUploadDirFailMessage !== strUndef) {
1017+
showUploadDirFailMessage();
1018+
}
10401019
});
10411020
});
10421021
}

0 commit comments

Comments
 (0)