luci-mod-status: add support for add device to wifi black/whitelist 4507/head
authorAnsuel Smith <ansuelsmth@gmail.com>
Fri, 9 Oct 2020 23:05:55 +0000 (01:05 +0200)
committerAnsuel Smith <ansuelsmth@gmail.com>
Fri, 30 Oct 2020 20:46:31 +0000 (21:46 +0100)
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>
modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js

index 928b5959ba6054a65bc1ac843ceafd2929e349e3..1019365836d29f9a8da8280bac6f59bf7da51b57 100644 (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('-');