luci-app-olsr: handle empty result for non-status tables
[oweals/luci.git] / modules / luci-mod-system / htdocs / luci-static / resources / view / system / leds.js
1 'use strict';
2 'require uci';
3 'require rpc';
4 'require form';
5
6 var callInitAction, callLeds, callUSB, callNetdevs;
7
8 callInitAction = rpc.declare({
9         object: 'luci',
10         method: 'initCall',
11         params: [ 'name', 'action' ],
12         expect: { result: false }
13 });
14
15 callLeds = rpc.declare({
16         object: 'luci',
17         method: 'leds'
18 });
19
20 callUSB = rpc.declare({
21         object: 'luci',
22         method: 'usb'
23 });
24
25 callNetdevs = rpc.declare({
26         object: 'luci',
27         method: 'ifaddrs',
28         expect: { result: [] },
29         filter: function(res) {
30                 var devs = {};
31                 for (var i = 0; i < res.length; i++)
32                         devs[res[i].name] = true;
33                 return Object.keys(devs).sort();
34         }
35 });
36
37 return L.view.extend({
38         load: function() {
39                 return Promise.all([
40                         callLeds(),
41                         callUSB(),
42                         callNetdevs()
43                 ]);
44         },
45
46         render: function(results) {
47                 var leds = results[0],
48                     usb = results[1],
49                     netdevs = results[2],
50                     triggers = {},
51                     trigger, m, s, o;
52
53                 for (var k in leds)
54                         for (var i = 0; i < leds[k].triggers.length; i++)
55                                 triggers[leds[k].triggers[i]] = true;
56
57                 m = new form.Map('system',
58                         _('<abbr title="Light Emitting Diode">LED</abbr> Configuration'),
59                         _('Customizes the behaviour of the device <abbr title="Light Emitting Diode">LED</abbr>s if possible.'));
60
61                 s = m.section(form.TypedSection, 'led', '');
62                 s.anonymous = true;
63                 s.addremove = true;
64
65                 s.option(form.Value, 'name', _('Name'));
66
67                 o = s.option(form.ListValue, 'sysfs', _('<abbr title="Light Emitting Diode">LED</abbr> Name'));
68                 Object.keys(leds).sort().forEach(function(name) { o.value(name) });
69
70                 o = s.option(form.Flag, 'default', _('Default state'));
71                 o.rmempty = false;
72
73                 trigger = s.option(form.ListValue, 'trigger', _('Trigger'));
74                 Object.keys(triggers).sort().forEach(function(t) { trigger.value(t, t.replace(/-/g, '')) });
75                 if (usb.devices && usb.devices.length)
76                         trigger.value('usbdev');
77                 if (usb.ports && usb.ports.length)
78                         trigger.value('usbport');
79
80                 o = s.option(form.Value, 'delayon', _('On-State Delay'));
81                 o.depends('trigger', 'timer');
82
83                 o = s.option(form.Value, 'delayoff', _('Off-State Delay'));
84                 o.depends('trigger', 'timer');
85
86                 o = s.option(form.ListValue, '_net_dev', _('Device'));
87                 o.rmempty = true;
88                 o.ucioption = 'dev';
89                 o.depends('trigger', 'netdev');
90                 o.remove = function(section_id) {
91                         var t = trigger.formvalue(section_id);
92                         if (t != 'netdev' && t != 'usbdev')
93                                 uci.unset('system', section_id, 'dev');
94                 };
95                 o.value('');
96                 netdevs.sort().forEach(function(dev) { o.value(dev) });
97
98                 o = s.option(form.MultiValue, 'mode', _('Trigger Mode'));
99                 o.rmempty = true;
100                 o.depends('trigger', 'netdev');
101                 o.value('link', _('Link On'));
102                 o.value('tx', _('Transmit'));
103                 o.value('rx', _('Receive'));
104
105                 if (usb.devices && usb.devices.length) {
106                         o = s.option(form.ListValue, '_usb_dev', _('USB Device'));
107                         o.depends('trigger', 'usbdev');
108                         o.rmempty = true;
109                         o.ucioption = 'dev';
110                         o.remove = function(section_id) {
111                                 var t = trigger.formvalue(section_id);
112                                 if (t != 'netdev' && t != 'usbdev')
113                                         uci.unset('system', section_id, 'dev');
114                         }
115                         o.value('');
116                         usb.devices.forEach(function(usbdev) {
117                                 o.value(usbdev.id, '%s (%s - %s)'.format(usbdev.id, usbdev.vendor || '?', usbdev.product || '?'));
118                         });
119                 }
120
121                 if (usb.ports && usb.ports.length) {
122                         o = s.option(form.MultiValue, 'port', _('USB Ports'));
123                         o.depends('trigger', 'usbport');
124                         o.rmempty = true;
125                         o.cfgvalue = function(section_id) {
126                                 var ports = [],
127                                     value = uci.get('system', section_id, 'port');
128
129                                 if (!Array.isArray(value))
130                                         value = String(value || '').split(/\s+/);
131
132                                 for (var i = 0; i < value.length; i++)
133                                         if (value[i].match(/^usb(\d+)-port(\d+)$/))
134                                                 ports.push(value[i]);
135                                         else if (value[i].match(/^(\d+)-(\d+)$/))
136                                                 ports.push('usb%d-port%d'.format(Regexp.$1, Regexp.$2));
137
138                                 return ports;
139                         };
140                         usb.ports.forEach(function(usbport) {
141                                 o.value('usb%d-port%d'.format(usbport.hub, usbport.port),
142                                         'Hub %d, Port %d'.format(usbport.hub, usbport.port));
143                         });
144                 }
145
146                 o = s.option(form.Value, 'port_mask', _('Switch Port Mask'));
147                 o.depends('trigger', 'switch0');
148                 o.depends('trigger', 'switch1');
149
150                 return m.render();
151         }
152 });