From dc26e2d037504f3fcd3ce1947770fbce92d48241 Mon Sep 17 00:00:00 2001 From: Richard Yu Date: Sat, 9 Nov 2019 23:43:00 +0800 Subject: luci-app-shadowsocks-libev: add server links import feature Signed-off-by: Richard Yu --- .../resources/view/shadowsocks-libev/servers.js | 54 ++++++++++++++++++++-- 1 file changed, 49 insertions(+), 5 deletions(-) (limited to 'applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view') diff --git a/applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/servers.js b/applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/servers.js index d46bfb0aa7..5951e92e51 100644 --- a/applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/servers.js +++ b/applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/servers.js @@ -1,21 +1,65 @@ 'use strict'; 'require form'; +'require uci'; +'require ui'; 'require shadowsocks-libev as ss'; -function startsWith(str, search) { - return str.substring(0, search.length) === search; -} +var conf = 'shadowsocks-libev'; return L.view.extend({ render: function() { var m, s, o; - m = new form.Map('shadowsocks-libev', _('Remote Servers'), + m = new form.Map(conf, _('Remote Servers'), _('Definition of remote shadowsocks servers. \ Disable any of them will also disable instances referring to it.')); s = m.section(form.GridSection, 'server'); s.addremove = true; + s.handleLinkImport = function() { + var textarea = new ui.Textarea(); + ui.showModal(_('Import Links'), [ + textarea.render(), + E('div', { class: 'right' }, [ + E('button', { + class: 'btn', + click: ui.hideModal + }, [ _('Cancel') ]), + ' ', + E('button', { + class: 'btn cbi-button-action', + click: ui.createHandlerFn(this, function() { + textarea.getValue().split('\n').forEach(function(s) { + var config = ss.parse_uri(s); + if (config) { + var tag = config[1]; + if (tag && !tag.match(/^[a-zA-Z0-9_]+$/)) tag = null; + var sid = uci.add(conf, 'server', tag); + config = config[0]; + Object.keys(config).forEach(function(k) { + uci.set(conf, sid, k, config[k]); + }); + } + }); + return uci.save() + .then(L.bind(this.map.load, this.map)) + .then(L.bind(this.map.reset, this.map)) + .then(L.ui.hideModal) + .catch(function() {}); + }) + }, [ _('Import') ]) + ]) + ]); + }; + s.renderSectionAdd = function(extra_class) { + var el = form.GridSection.prototype.renderSectionAdd.apply(this, arguments); + el.appendChild(E('button', { + 'class': 'cbi-button cbi-button-add', + 'title': _('Import Links'), + 'click': ui.createHandlerFn(this, 'handleLinkImport') + }, [ _('Import Links') ])); + return el; + }; o = s.option(form.Flag, 'disabled', _('Disable')); o.editable = true; @@ -26,7 +70,7 @@ return L.view.extend({ }, addFooter: function() { var p = '#edit='; - if (startsWith(location.hash, p)) { + if (location.hash.indexOf(p) === 0) { var section_id = location.hash.substring(p.length); var editBtn = document.querySelector('#cbi-shadowsocks-libev-' + section_id + ' button.cbi-button-edit'); if (editBtn) -- cgit v1.2.3