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