You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

268 lines
6.8 KiB
JavaScript

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

'use strict';
'require baseclass';
'require dom';
'require network';
'require rpc';
return baseclass.extend({
title: _('Wireless'),
params: [],
load: function() {
return Promise.all([
network.getWifiDevices(),
network.getWifiNetworks(),
network.getHostHints()
]).then(function(radios_networks_hints) {
var tasks = [];
for (var i = 0; i < radios_networks_hints[1].length; i++)
tasks.push(L.resolveDefault(radios_networks_hints[1][i].getAssocList(), []).then(L.bind(function(net, list) {
net.assoclist = list.sort(function(a, b) { return a.mac > b.mac });
}, this, radios_networks_hints[1][i])));
return Promise.all(tasks).then(function() {
return radios_networks_hints;
});
});
},
renderHtml: function() {
var container_wapper = E('div', { 'class': 'router-status-wifi dashboard-bg box-s1' });
var container_box = E('div', { 'class': 'wifi-info devices-list' });
var container_radio = E('div', { 'class': 'settings-info' });
var container_radio_item;
container_box.appendChild(E('div', { 'class': 'title'}, [
E('img', {
'src': L.resource('view/dashboard/icons/wireless.svg'),
'width': 55,
'title': this.title,
'class': 'middle'
}),
E('h3', this.title)
]));
container_box.appendChild(E('hr'));
for (var i =0; i < this.params.wifi.radios.length; i++) {
container_radio_item = E('div', { 'class': 'radio-info' })
for(var idx in this.params.wifi.radios[i]) {
var classname = idx,
radio = this.params.wifi.radios[i];
if (!radio[idx].visible) {
continue;
}
if ('actived' === idx) {
classname = radio[idx].value ? 'label label-success' : 'label label-danger';
radio[idx].value = radio[idx].value ? _('yes') : _('no');
}
container_radio_item.appendChild(
E('p', {}, [
E('span', { 'class': ''}, [ radio[idx].title + '']),
E('span', { 'class': classname }, [ radio[idx].value ]),
])
);
}
container_radio.appendChild(container_radio_item);
}
container_box.appendChild(container_radio);
var container_devices = E('table', { 'class': 'table assoclist devices-info' }, [
E('tr', { 'class': 'tr table-titles dashboard-bg' }, [
E('th', { 'class': 'th nowrap' }, _('Hostname')),
E('th', { 'class': 'th' }, _('Wireless')),
E('th', { 'class': 'th' }, _('Signal')),
E('th', { 'class': 'th' }, '%s / %s'.format( _('Up.'), _('Down.')))
])
]);
var container_devices_item;
var container_devices_list = E('table', { 'class': 'table assoclist devices-info' });
for (var i =0; i < this.params.wifi.devices.length; i++) {
container_devices_item = E('tr', { 'class': 'tr cbi-rowstyle-1' });
for(var idx in this.params.wifi.devices[i]) {
var device = this.params.wifi.devices[i];
if (!device[idx].visible) {
continue;
}
var container_content;
if ('progress' == idx) {
container_content = E('div', { 'class' : 'td device-info' }, [
E('div', { 'class': 'progress' }, [
E('div', { 'class': 'progress-bar ' + device[idx].value.style, role: 'progressbar', style: 'width:'+device[idx].value.qualite+'%', 'aria-valuenow': device[idx].value.qualite, 'aria-valuemin': 0, 'aria-valuemax': 100 }),
])
]);
} else if ('rate' == idx) {
container_content = E('td', { 'class': 'td device-info' }, [
E('p', {}, [
E('span', { 'class': ''}, [ device[idx].value.rx ]),
E('br'),
E('span', { 'class': ''}, [ device[idx].value.tx ])
])
]);
} else {
container_content = E('td', { 'class': 'td device-info'}, [
E('p', {}, [
E('span', { 'class': ''}, [ device[idx].value ]),
])
]);
}
container_devices_item.appendChild(container_content);
}
container_devices_list.appendChild(container_devices_item);
}
container_devices.appendChild(container_devices_list);
container_box.appendChild(E('hr'));
container_box.appendChild(container_devices);
container_box.appendChild(container_devices_list);
container_wapper.appendChild(container_box);
return container_wapper;
},
renderUpdateData: function(radios, networks, hosthints) {
for (var i = 0; i < radios.sort(function(a, b) { a.getName() > b.getName() }).length; i++) {
var network_items = networks.filter(function(net) { return net.getWifiDeviceName() == radios[i].getName() });
for (var j = 0; j < network_items.length; j++) {
var net = network_items[j],
is_assoc = (net.getBSSID() != '00:00:00:00:00:00' && net.getChannel() && !net.isDisabled()),
chan = net.getChannel(),
freq = net.getFrequency(),
rate = net.getBitRate();
this.params.wifi.radios.push(
{
ssid : {
title: _('SSID'),
visible: true,
value: net.getActiveSSID() || '?'
},
actived : {
title: _('Active'),
visible: true,
value: !net.isDisabled()
},
chan : {
title: _('Channel'),
visible: true,
value: chan ? '%d (%.3f %s)'.format(chan, freq, _('GHz')) : '-'
},
rate : {
title: _('Bitrate'),
visible: true,
value: rate ? '%d %s'.format(rate, _('Mbit/s')) : '-'
},
bssid : {
title: _('BSSID'),
visible: true,
value: is_assoc ? (net.getActiveBSSID() || '-') : '-'
},
encryption : {
title: _('Encryption'),
visible: true,
value: is_assoc ? net.getActiveEncryption() : '-'
},
associations : {
title: _('Devices Connected'),
visible: true,
value: is_assoc ? (net.assoclist.length || '0') : 0
}
}
);
}
}
for (var i = 0; i < networks.length; i++) {
for (var k = 0; k < networks[i].assoclist.length; k++) {
var bss = networks[i].assoclist[k],
name = hosthints.getHostnameByMACAddr(bss.mac);
var progress_style;
var q = Math.min((bss.signal + 110) / 70 * 100, 100);
if (q == 0 || q < 25)
progress_style = 'bg-danger';
else if (q < 50)
progress_style = 'bg-warning';
else if (q < 75)
progress_style = 'bg-success';
else
progress_style = 'bg-success';
this.params.wifi.devices.push(
{
hostname : {
title: _('Hostname'),
visible: true,
value: name || '?'
},
ssid : {
title: _('SSID'),
visible: true,
value: networks[i].getActiveSSID()
},
progress : {
title: _('Channel'),
visible: true,
value: {
qualite: q,
style: progress_style
}
},
rate : {
title: _('Bitrate'),
visible: true,
value: {
rx: '%s'.format('%.2mB'.format(bss.rx.bytes)),
tx: '%s'.format('%.2mB'.format(bss.tx.bytes)),
}
}
}
);
}
}
},
render: function(data) {
this.params.wifi = {
radios: [],
devices: []
};
this.renderUpdateData(data[0], data[1], data[2]);
return this.renderHtml();
}
});