luci-app-dawn: error message when service not running
[project/luci.git] / applications / luci-app-dawn / htdocs / luci-static / resources / view / dawn / hearing_map.js
1 'use strict';
2 'require uci';
3 'require view';
4 'require dawn.dawn-common as dawn';
5
6 return view.extend({
7 handleSaveApply: null,
8 handleSave: null,
9 handleReset: null,
10
11 load: function() {
12 return Promise.all([
13 dawn.isDawnRPCAvailable().then(function(isAvailable) {
14 return ( isAvailable ? dawn.callDawnGetHearingMap() : null )
15 }),
16 dawn.isDawnRPCAvailable().then(function(isAvailable) {
17 return ( isAvailable ? dawn.callDawnGetNetwork() : null )
18 }),
19 dawn.callHostHints()
20 ]);
21 },
22
23 render: function(data) {
24
25 const dawnHearingMapData = data[0];
26 const dawnNetworkData = data[1];
27 const hostHintsData = data[2];
28
29 let accessPointsHintsData = {};
30 let connectedClients = {};
31 for (let network in dawnNetworkData) {
32 connectedClients[network] = [];
33 let aps = Object.entries(dawnNetworkData[network]).map(function(ap) {
34 accessPointsHintsData[ap[0]] = {name: ap[1].hostname};
35 let clientData = Object.entries(ap[1]);
36 for (let i = 0; i < clientData.length; i++) {
37 if (typeof clientData[i][1] === 'object') {
38 connectedClients[network].push(clientData[i][0]);
39 }
40 }
41 });
42 }
43
44 if (!dawnHearingMapData || !dawnNetworkData) {
45 return dawn.getDawnServiceNotRunningErrorMessage();
46 }
47
48 const body = E([
49 E('h2', _('Hearing Map'))
50 ]);
51
52 for (let network in dawnHearingMapData) {
53
54 body.appendChild(
55 E('h3', 'SSID: ' + network)
56 );
57
58 let hearing_map_table = E('table', { 'class': 'table cbi-section-table' }, [
59 E('tr', { 'class': 'tr table-titles' }, [
60 E('th', { 'class': 'th' }, _('Client')),
61 E('th', { 'class': 'th' }, _('Access Point')),
62 E('th', { 'class': 'th' }, _('Frequency')),
63 E('th', { 'class': 'th' }, E('span', { 'data-tooltip': _('High Throughput') }, [ _('HT') ])),
64 E('th', { 'class': 'th' }, E('span', { 'data-tooltip': _('Very High Throughput') }, [ _('VHT') ])),
65 E('th', { 'class': 'th' }, _('Signal')),
66 E('th', { 'class': 'th' }, E('span', { 'data-tooltip': _('Received Channel Power Indication') }, [ _('RCPI') ])),
67 E('th', { 'class': 'th' }, E('span', { 'data-tooltip': _('Received Signal to Noise Indicator') }, [ _('RSNI') ])),
68 E('th', { 'class': 'th' }, _('Channel Utilization')),
69 E('th', { 'class': 'th' }, _('Connected to Network')),
70 E('th', { 'class': 'th' }, _('Score'))
71 ])
72 ]);
73
74 let clients = Object.entries(dawnHearingMapData[network]).map(function(client) {
75
76 return Object.entries(client[1]).map(function(ap) {
77
78 if (ap[1].freq != 0) {
79 return [
80 dawn.getHostnameFromMAC(hostHintsData, client[0]),
81 dawn.getHostnameFromMAC(accessPointsHintsData, ap[0]),
82 dawn.getFormattedNumber(ap[1].freq, 3, 1000) + ' GHz (' + _('Channel') + ': ' + dawn.getChannelFromFrequency(ap[1].freq) + ')',
83 dawn.getAvailableText(ap[1].ht_capabilities && ap[1].ht_support),
84 dawn.getAvailableText(ap[1].vht_capabilities && ap[1].vht_support),
85 ap[1].signal,
86 ap[1].rcpi,
87 ap[1].rsni,
88 dawn.getFormattedNumber(ap[1].channel_utilization, 2, 2.55) + '%',
89 dawn.getYesText(connectedClients[network].includes(client[0])),
90 ap[1].score
91 ]
92 }
93 })
94
95 }).flat();
96
97 cbi_update_table(hearing_map_table, clients, E('em', _('No clients connected.')));
98
99 body.appendChild(hearing_map_table);
100 }
101 return body;
102 }
103 });