summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJo-Philipp Wich <jo@mein.io>2019-11-01 09:00:23 +0100
committerJo-Philipp Wich <jo@mein.io>2019-11-01 12:03:33 +0100
commit33346dadf483327bc6e474b5cd8e9ab827873170 (patch)
tree619378305ec7337d9f6c84dc7e098f98d81b17c1
parent470464ae4a33e5efbfbd1a389f965567a86fa31e (diff)
luci-base, luci-mod-system: move file upload handling to ui.js
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
-rw-r--r--modules/luci-base/htdocs/luci-static/resources/ui.js87
-rw-r--r--modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js86
2 files changed, 89 insertions, 84 deletions
diff --git a/modules/luci-base/htdocs/luci-static/resources/ui.js b/modules/luci-base/htdocs/luci-static/resources/ui.js
index c1389a8fd..c82b397c1 100644
--- a/modules/luci-base/htdocs/luci-static/resources/ui.js
+++ b/modules/luci-base/htdocs/luci-static/resources/ui.js
@@ -2221,6 +2221,93 @@ return L.Class.extend({
}
}),
+ /* File uploading */
+ uploadFile: function(path, progressStatusNode) {
+ return new Promise(function(resolveFn, rejectFn) {
+ L.ui.showModal(_('Uploading file…'), [
+ E('p', _('Please select the file to upload.')),
+ E('div', { 'style': 'display:flex' }, [
+ E('div', { 'class': 'left', 'style': 'flex:1' }, [
+ E('input', {
+ type: 'file',
+ style: 'display:none',
+ change: function(ev) {
+ L.dom.parent(ev.target, '.modal').querySelector('.cbi-button-action.important').disabled = false;
+ }
+ }),
+ E('button', {
+ 'class': 'btn',
+ 'click': function(ev) {
+ ev.target.previousElementSibling.click();
+ }
+ }, [ _('Browse…') ])
+ ]),
+ E('div', { 'class': 'right', 'style': 'flex:1' }, [
+ E('button', {
+ 'class': 'btn',
+ 'click': function() {
+ L.ui.hideModal();
+ rejectFn(new Error('Upload has been cancelled'));
+ }
+ }, [ _('Cancel') ]),
+ ' ',
+ E('button', {
+ 'class': 'btn cbi-button-action important',
+ 'disabled': true,
+ 'click': function(ev) {
+ var input = L.dom.parent(ev.target, '.modal').querySelector('input[type="file"]');
+
+ if (!input.files[0])
+ return;
+
+ var progress = E('div', { 'class': 'cbi-progressbar', 'title': '0%' }, E('div', { 'style': 'width:0' }));
+
+ L.ui.showModal(_('Uploading file…'), [ progress ]);
+
+ var data = new FormData();
+
+ data.append('sessionid', rpc.getSessionID());
+ data.append('filename', path);
+ data.append('filedata', input.files[0]);
+
+ var filename = input.files[0].name;
+
+ L.Request.post('/cgi-bin/cgi-upload', data, {
+ timeout: 0,
+ progress: function(pev) {
+ var percent = (pev.loaded / pev.total) * 100;
+
+ if (progressStatusNode)
+ progressStatusNode.data = '%.2f%%'.format(percent);
+
+ progress.setAttribute('title', '%.2f%%'.format(percent));
+ progress.firstElementChild.style.width = '%.2f%%'.format(percent);
+ }
+ }).then(function(res) {
+ var reply = res.json();
+
+ L.ui.hideModal();
+
+ if (L.isObject(reply) && reply.failure) {
+ L.ui.addNotification(null, E('p', _('Upload request failed: %s').format(reply.message)));
+ rejectFn(new Error(reply.failure));
+ }
+ else {
+ reply.name = filename;
+ resolveFn(reply);
+ }
+ }, function(err) {
+ L.ui.hideModal();
+ rejectFn(err);
+ });
+ }
+ }, [ _('Upload') ])
+ ])
+ ])
+ ]);
+ });
+ },
+
/* Reconnect handling */
pingDevice: function(proto, ipaddr) {
var target = '%s://%s%s?%s'.format(proto || 'http', ipaddr || window.location.host, L.resource('icons/loading.gif'), Math.random());
diff --git a/modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js b/modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js
index 612c4a4f9..e139ba661 100644
--- a/modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js
+++ b/modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js
@@ -10,88 +10,6 @@ var callSystemValidateFirmwareImage = rpc.declare({
expect: { '': { valid: false, forcable: true } }
});
-function fileUpload(node, path) {
- return new Promise(function(resolveFn, rejectFn) {
- L.ui.showModal(_('Uploading file…'), [
- E('p', _('Please select the file to upload.')),
- E('div', { 'style': 'display:flex' }, [
- E('div', { 'class': 'left', 'style': 'flex:1' }, [
- E('input', {
- type: 'file',
- style: 'display:none',
- change: function(ev) {
- L.dom.parent(ev.target, '.modal').querySelector('.cbi-button-action.important').disabled = false;
- }
- }),
- E('button', {
- 'class': 'btn',
- 'click': function(ev) {
- ev.target.previousElementSibling.click();
- }
- }, [ _('Browse…') ])
- ]),
- E('div', { 'class': 'right', 'style': 'flex:1' }, [
- E('button', {
- 'class': 'btn',
- 'click': function() {
- L.ui.hideModal();
- rejectFn(new Error('Upload has been cancelled'));
- }
- }, [ _('Cancel') ]),
- ' ',
- E('button', {
- 'class': 'btn cbi-button-action important',
- 'disabled': true,
- 'click': function(ev) {
- var input = L.dom.parent(ev.target, '.modal').querySelector('input[type="file"]');
-
- if (!input.files[0])
- return;
-
- var progress = E('div', { 'class': 'cbi-progressbar', 'title': '0%' }, E('div', { 'style': 'width:0' }));
-
- L.ui.showModal(_('Uploading file…'), [ progress ]);
-
- var data = new FormData();
-
- data.append('sessionid', rpc.getSessionID());
- data.append('filename', path);
- data.append('filedata', input.files[0]);
-
- L.Request.post('/cgi-bin/cgi-upload', data, {
- timeout: 0,
- progress: function(pev) {
- var percent = (pev.loaded / pev.total) * 100;
-
- node.data = '%.2f%%'.format(percent);
-
- progress.setAttribute('title', '%.2f%%'.format(percent));
- progress.firstElementChild.style.width = '%.2f%%'.format(percent);
- }
- }).then(function(res) {
- var reply = res.json();
-
- L.ui.hideModal();
-
- if (L.isObject(reply) && reply.failure) {
- L.ui.addNotification(null, E('p', _('Upload request failed: %s').format(reply.message)));
- rejectFn(new Error(reply.failure));
- }
- else {
- resolveFn(reply);
- }
- }, function(err) {
- L.ui.hideModal();
- rejectFn(err);
- });
- }
- }, [ _('Upload') ])
- ])
- ])
- ]);
- });
-}
-
function findStorageSize(procmtd, procpart) {
var kernsize = 0, rootsize = 0, wholesize = 0;
@@ -184,7 +102,7 @@ return L.view.extend({
},
handleRestore: function(ev) {
- return fileUpload(ev.target, '/tmp/backup.tar.gz')
+ return L.ui.uploadFile('/tmp/backup.tar.gz', ev.target)
.then(L.bind(function(btn, res) {
btn.firstChild.data = _('Checking archive…');
return fs.exec('/bin/tar', [ '-tzf', '/tmp/backup.tar.gz' ]);
@@ -267,7 +185,7 @@ return L.view.extend({
},
handleSysupgrade: function(storage_size, ev) {
- return fileUpload(ev.target.firstChild, '/tmp/firmware.bin')
+ return L.ui.uploadFile('/tmp/firmware.bin', ev.target.firstChild)
.then(L.bind(function(btn, reply) {
btn.firstChild.data = _('Checking image…');