'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(); } });