luci-mod-status: add support for add device to wifi black/whitelist

Add support for one-click add device to wifi black/whitelist in the status page. If the black/whitelist feature is enabled a combobox is displayed with the disconnect option.
Device already added will display only the disconnect button.

Fixes: #3675

Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
This commit is contained in:
Ansuel Smith 2020-10-10 01:05:55 +02:00
parent 01cefed7f0
commit ef94c52680
No known key found for this signature in database
GPG key ID: AC001D09ADBFEAD7

View file

@ -40,12 +40,28 @@ return baseclass.extend({
return s;
},
handleDelClient: function(wifinet, mac, ev) {
handleDelClient: function(wifinet, mac, ev, cmd) {
var exec = cmd || 'disconnect';
dom.parent(ev.currentTarget, '.tr').style.opacity = 0.5;
ev.currentTarget.classList.add('spinning');
ev.currentTarget.disabled = true;
ev.currentTarget.blur();
if (exec == 'addlist') {
var macs = [ mac ]
for (var mac in this.iface_maclist) {
macs.push(mac)
}
uci.set('wireless', wifinet.sid, 'maclist', macs);
return uci.save()
.then(L.bind(L.ui.changes.init, L.ui.changes))
.then(L.bind(L.ui.changes.displayChanges, L.ui.changes));
}
wifinet.disconnectClient(mac, true, 5, 60000);
},
@ -188,6 +204,8 @@ return baseclass.extend({
}, this));
},
isDeviceAdded: {},
render: function(data) {
var seen = {},
radios = data[0],
@ -218,6 +236,17 @@ return baseclass.extend({
var rows = [];
for (var i = 0; i < networks.length; i++) {
var macfilter = uci.get('wireless', networks[i].sid, 'macfilter');
if (macfilter != null && macfilter != 'disable') {
this.isDeviceAdded = {};
var macs = L.toArray(uci.get('wireless', networks[i].sid, 'maclist'));
for (var j = 0; j < macs.length; j++) {
var mac = macs[j].toUpperCase();
this.isDeviceAdded[mac] = true;
}
}
for (var k = 0; k < networks[i].assoclist.length; k++) {
var bss = networks[i].assoclist[k],
name = hosthints.getHostnameByMACAddr(bss.mac),
@ -297,10 +326,26 @@ return baseclass.extend({
if (assoclist.firstElementChild.childNodes.length < 6)
assoclist.firstElementChild.appendChild(E('div', { 'class': 'th cbi-section-actions' }));
row.push(E('button', {
'class': 'cbi-button cbi-button-remove',
'click': L.bind(this.handleDelClient, this, networks[i], bss.mac)
}, [ _('Disconnect') ]));
if (macfilter != null && macfilter != 'disable' && !this.isDeviceAdded[bss.mac]) {
row.push(new L.ui.ComboButton('button', {
'addlist': macfilter == 'allow' ? _('Add to Whitelist') : _('Add to Blacklist'),
'disconnect': _('Disconnect')
}, {
'click': L.bind(this.handleDelClient, this, networks[i], bss.mac),
'sort': [ 'disconnect', 'addlist' ],
'classes': {
'addlist': 'btn cbi-button cbi-button-remove',
'disconnect': 'btn cbi-button cbi-button-remove'
}
}).render()
)
}
else {
row.push(E('button', {
'class': 'cbi-button cbi-button-remove',
'click': L.bind(this.handleDelClient, this, networks[i], bss.mac)
}, [ _('Disconnect') ]));
}
}
else {
row.push('-');