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