luci-mod-network: add port status to bridge vlan filter matrix

Also ensure that port devices are ordered numerically.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
This commit is contained in:
Jo-Philipp Wich 2021-06-11 10:18:10 +02:00
parent 08ca25fe9c
commit 8c71b1d01e
2 changed files with 66 additions and 6 deletions

View file

@ -1,5 +1,6 @@
'use strict'; 'use strict';
'require ui'; 'require ui';
'require dom';
'require uci'; 'require uci';
'require form'; 'require form';
'require network'; 'require network';
@ -80,16 +81,54 @@ function isBridgePort(dev) {
return isPort; return isPort;
} }
function renderDevBadge(dev) { function updateDevBadge(node, dev) {
var type = dev.getType(), up = dev.isUp(); var type = dev.getType(),
up = dev.getCarrier();
return E('span', { 'class': 'ifacebadge', 'style': 'font-weight:normal' }, [ dom.content(node, [
E('img', { E('img', {
'class': 'middle', 'class': 'middle',
'src': L.resource('icons/%s%s.png').format(type, up ? '' : '_disabled') 'src': L.resource('icons/%s%s.png').format(type, up ? '' : '_disabled')
}), }),
'\x0a', dev.getName() '\x0a', dev.getName()
]); ]);
return node;
}
function renderDevBadge(dev) {
return updateDevBadge(E('span', {
'class': 'ifacebadge port-status-device',
'style': 'font-weight:normal',
'data-device': dev.getName()
}), dev);
}
function updatePortStatus(node, dev) {
var carrier = dev.getCarrier(),
duplex = dev.getDuplex(),
speed = dev.getSpeed(),
desc;
if (carrier && speed > 0 && duplex != null)
desc = E('abbr', {
'title': '%d MBit/s, %s'.format(speed, duplex == 'full' ? _('full-duplex') : _('half-duplex'))
}, [ '%d%s'.format(speed, duplex == 'full' ? 'FD' : 'HD') ]);
else if (carrier)
desc = document.createTextNode(_('Connected'));
else
desc = document.createTextNode(_('no link'));
dom.content(node, [ desc ]);
return node;
}
function renderPortStatus(dev) {
return updatePortStatus(E('span', {
'class': 'port-status-link',
'data-device': dev.getName()
}), dev);
} }
function lookupDevName(s, section_id) { function lookupDevName(s, section_id) {
@ -839,7 +878,7 @@ return baseclass.extend({
this.children = this.children.filter(function(opt) { return !opt.option.match(/^port_/) }); this.children = this.children.filter(function(opt) { return !opt.option.match(/^port_/) });
for (var i = 0; i < devices.length; i++) { for (var i = 0; i < devices.length; i++) {
o = ss.option(cbiTagValue, 'port_%s'.format(sfh(devices[i].getName())), renderDevBadge(devices[i])); o = ss.option(cbiTagValue, 'port_%s'.format(sfh(devices[i].getName())), renderDevBadge(devices[i]), renderPortStatus(devices[i]));
o.port = devices[i].getName(); o.port = devices[i].getName();
} }
@ -941,8 +980,21 @@ return baseclass.extend({
for (var port_name in seen_ports) for (var port_name in seen_ports)
ports.push(port_name); ports.push(port_name);
ports.sort(); ports.sort(function(a, b) {
var m1 = a.match(/^(.+?)([0-9]*)$/),
m2 = b.match(/^(.+?)([0-9]*)$/);
if (m1[1] < m2[1])
return -1;
else if (m1[1] > m2[1])
return 1;
else
return +(m1[2] || 0) - +(m2[2] || 0);
});
ss.updatePorts(ports); ss.updatePorts(ports);
} },
updateDevBadge: updateDevBadge,
updatePortStatus: updatePortStatus
}); });

View file

@ -319,6 +319,14 @@ return view.extend({
btn2.disabled = isReadonlyView || btn1.classList.contains('spinning') || btn2.classList.contains('spinning') || dynamic || disabled; btn2.disabled = isReadonlyView || btn1.classList.contains('spinning') || btn2.classList.contains('spinning') || dynamic || disabled;
} }
document.querySelectorAll('.port-status-device[data-device]').forEach(function(node) {
nettools.updateDevBadge(node, network.instantiateDevice(node.getAttribute('data-device')));
});
document.querySelectorAll('.port-status-link[data-device]').forEach(function(node) {
nettools.updatePortStatus(node, network.instantiateDevice(node.getAttribute('data-device')));
});
return Promise.all([ resolveZone, network.flushCache() ]); return Promise.all([ resolveZone, network.flushCache() ]);
}, },