luci-mod-system: rework leds.js and system.js views
[project/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 trigger.value('usbdev');
76 trigger.value('usbport');
77
78 o = s.option(form.Value, 'delayon', _('On-State Delay'));
79 o.depends('trigger', 'timer');
80
81 o = s.option(form.Value, 'delayoff', _('Off-State Delay'));
82 o.depends('trigger', 'timer');
83
84 o = s.option(form.ListValue, '_net_dev', _('Device'));
85 o.rmempty = true;
86 o.ucioption = 'dev';
87 o.depends('trigger', 'netdev');
88 o.remove = function(section_id) {
89 var t = trigger.formvalue(section_id);
90 if (t != 'netdev' && t != 'usbdev')
91 uci.unset('system', section_id, 'dev');
92 };
93 o.value('');
94 netdevs.sort().forEach(function(dev) { o.value(dev) });
95
96 o = s.option(form.MultiValue, 'mode', _('Trigger Mode'));
97 o.rmempty = true;
98 o.depends('trigger', 'netdev');
99 o.value('link', _('Link On'));
100 o.value('tx', _('Transmit'));
101 o.value('rx', _('Receive'));
102
103 o = s.option(form.ListValue, '_usb_dev', _('USB Device'));
104 o.depends('trigger', 'usbdev');
105 o.rmempty = true;
106 o.ucioption = 'dev';
107 o.remove = function(section_id) {
108 var t = trigger.formvalue(section_id);
109 if (t != 'netdev' && t != 'usbdev')
110 uci.unset('system', section_id, 'dev');
111 }
112 o.value('');
113 (usb.devices || []).forEach(function(usbdev) {
114 o.value(usbdev.id, '%s (%s - %s)'.format(usbdev.id, usbdev.vendor || '?', usbdev.product || '?'));
115 });
116
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(/^usb(\d+)-port(\d+)$/))
129 ports.push(value[i]);
130 else if (value[i].match(/^(\d+)-(\d+)$/))
131 ports.push('usb%d-port%d'.format(Regexp.$1, Regexp.$2));
132
133 return ports;
134 };
135 (usb.ports || []).forEach(function(usbport) {
136 o.value('usb%d-port%d'.format(usbport.hub, usbport.port),
137 'Hub %d, Port %d'.format(usbport.hub, usbport.port));
138 });
139
140 o = s.option(form.Value, 'port_mask', _('Switch Port Mask'));
141 o.depends('trigger', 'switch0');
142 o.depends('trigger', 'switch1');
143
144 return m.render();
145 }
146 });