webui-aria2/js/ctrls/modal.js
Sergei Morozov 24d3e25126 getUris dialog improvements
This patch resolves #295 by making the Download Settings fieldset collapsed by default and moving the examples of URIs in textarea into the placeholder of textarea itself.

It also allows form submission when textarea is focused by pressing Ctrl+Enter.
2017-01-08 14:47:22 -08:00

245 lines
6.1 KiB
JavaScript

var parseFiles = function(files, cb) {
var cnt = 0;
var txts = [];
var onload = function(res) {
var txt = res.target.result;
txts.push(txt.split(',')[1]);
cnt--;
if (!cnt) {
cb(txts);
}
};
_.each(files, function(file) {
cnt++;
console.log('starting file reader');
var reader = new FileReader();
reader.onload = onload;
reader.onerror = function(err) {
// return error
// TODO: find a better way to propogate error upstream
console.log('got back error', err);
cb([]);
};
reader.readAsDataURL(file);
});
};
angular
.module('webui.ctrls.modal', [
"ui.bootstrap", 'webui.services.deps', 'webui.services.modals', 'webui.services.rpc',
'webui.services.configuration'
])
.controller('ModalCtrl', [
'$_', '$scope', '$modal', "$modals", '$rpc','$fileSettings', '$downloadProps',
function(_, scope, $modal, modals, rpc, fsettings, dprops) {
scope.getUris = {
open: function(cb) {
var self = this;
this.uris = "";
this.downloadSettingsCollapsed = true;
this.advancedSettingsCollapsed = true;
this.settings = {};
this.fsettings = _.cloneDeep(fsettings);
this.cb = cb;
// fill in default download properties
_.forEach(dprops, function(p) {
self.settings[p] = self.fsettings[p];
delete self.fsettings[p];
});
this.inst = $modal.open({
templateUrl: "getUris.html",
scope: scope,
windowClass: "modal-large"
});
this.inst.result.then(function() {
delete self.inst;
if (self.cb) {
var settings = {};
// no need to send in default values, just the changed ones
for (var i in self.settings) {
if (fsettings[i].val != self.settings[i].val)
settings[i] = self.settings[i].val;
}
for (var i in self.fsettings) {
if (fsettings[i].val != self.fsettings[i].val)
settings[i] = self.fsettings[i].val;
}
console.log('sending settings:', settings);
self.cb(self.parse(), settings);
}
},
function() {
delete self.inst;
});
},
parse: function() {
return _
.chain(this.uris.trim().split(/\r?\n/g))
.map(function(d) { return d.trim().split(/\s+/g) })
.filter(function(d) { return d.length })
.value();
}
};
scope.settings = {
open: function(settings, title, actionText, cb) {
var self = this;
this.settings = settings;
this.title = title;
this.actionText = actionText;
this.inst = $modal.open({
templateUrl: "settings.html",
scope: scope,
windowClass: "modal-large"
});
this.inst.result.then(function() {
delete self.inst;
if (cb) {
cb(self.settings);
}
},
function() {
delete self.inst;
});
}
};
scope.selectFiles = {
open: function(files, cb) {
var self = this;
this.files = _.cloneDeep(files);
this.inst = $modal.open({
templateUrl: "selectFiles.html",
scope: scope,
windowClass: "modal-large"
});
this.inst.result.then(function() {
delete self.inst;
if (cb) {
cb(self.files);
}
},
function() {
delete self.inst;
});
}
};
scope.connection = {
open: function(defaults, cb) {
var self = this;
// XXX We need to actually clone this!
this.conf = rpc.getConfiguration();
this.inst = $modal.open({
templateUrl: "connection.html",
scope: scope,
windowClass: "modal-large",
});
this.inst.result.then(function() {
delete self.inst;
if (cb) {
cb(self.conf);
}
},
function() {
delete self.inst;
});
}
};
_.each(['getTorrents', 'getMetalinks'], function(name) {
scope[name] = {
open: function(cb) {
var self = this;
this.files = [];
this.collapsed = true;
this.settings = {};
this.fsettings = _.cloneDeep(fsettings);
// fill in default download properties
_.forEach(dprops, function(p) {
self.settings[p] = self.fsettings[p];
delete self.fsettings[p];
});
this.inst = $modal.open({
templateUrl: name + ".html",
scope: scope,
windowClass: "modal-large",
});
this.inst.result.then(function() {
delete self.inst;
if (cb) {
parseFiles(self.files, function(txts) {
var settings = {};
// no need to send in default values, just the changed ones
for (var i in self.settings) {
if (fsettings[i].val != self.settings[i].val)
settings[i] = self.settings[i].val;
}
for (var i in self.fsettings) {
if (fsettings[i].val != self.fsettings[i].val)
settings[i] = self.fsettings[i].val;
}
console.log('sending settings:', settings);
cb(txts, settings);
});
}
},
function() {
delete self.inst;
});
}
};
});
_.each(["about", "server_info"], function(name) {
scope[name] = {
open: function() {
var self = this;
this.inst = $modal.open({
templateUrl: name + ".html",
scope: scope
});
this.inst.result.then(function() {
delete self.inst;
},
function() {
delete self.inst;
});
}
};
});
rpc.once('getVersion', [], function(data) {
scope.miscellaneous = data[0];
});
_.each([
'getUris', 'getTorrents', 'getMetalinks', 'selectFiles',
'settings', 'connection', 'server_info', 'about'
], function(name) {
modals.register(name, function() {
if (scope[name].inst) {
// Already open.
return;
}
var args = Array.prototype.slice.call(arguments, 0);
scope[name].open.apply(scope[name], args);
});
});
}]);