luci-mod-system: use client side cbi forms for system and led config
[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 return L.view.extend({
7         callInitAction: rpc.declare({
8                 object: 'luci',
9                 method: 'initCall',
10                 params: [ 'name', 'action' ],
11                 expect: { result: false }
12         }),
13
14         callLeds: rpc.declare({
15                 object: 'luci',
16                 method: 'leds'
17         }),
18
19         callUSB: rpc.declare({
20                 object: 'luci',
21                 method: 'usb'
22         }),
23
24         callNetdevs: rpc.declare({
25                 object: 'luci',
26                 method: 'ifaddrs',
27                 expect: { result: [] },
28                 filter: function(res) {
29                         var devs = {};
30                         for (var i = 0; i < res.length; i++)
31                                 devs[res[i].name] = true;
32                         return Object.keys(devs).sort();
33                 }
34         }),
35
36         load: function() {
37                 rpc.batch();
38                 this.callLeds();
39                 this.callUSB();
40                 this.callNetdevs();
41                 return rpc.flush();
42         },
43
44         render: function(results) {
45                 var leds = results[0],
46                     usb = results[1],
47                     netdevs = results[2],
48                     triggers = {},
49                     trigger, m, s, o;
50
51                 for (var k in leds)
52                         for (var i = 0; i < leds[k].triggers.length; i++)
53                                 triggers[leds[k].triggers[i]] = true;
54
55                 m = new form.Map('system',
56                         _('<abbr title="Light Emitting Diode">LED</abbr> Configuration'),
57                         _('Customizes the behaviour of the device <abbr title="Light Emitting Diode">LED</abbr>s if possible.'));
58
59                 s = m.section(form.TypedSection, 'led', '');
60                 s.anonymous = true;
61                 s.addremove = true;
62
63                 s.option(form.Value, 'name', _('Name'));
64
65                 o = s.option(form.ListValue, 'sysfs', _('<abbr title="Light Emitting Diode">LED</abbr> Name'));
66                 Object.keys(leds).sort().forEach(function(name) { o.value(name) });
67
68                 o = s.option(form.Flag, 'default', _('Default state'));
69                 o.rmempty = false;
70
71                 trigger = s.option(form.ListValue, 'trigger', _('Trigger'));
72                 Object.keys(triggers).sort().forEach(function(t) { trigger.value(t, t.replace(/-/g, '')) });
73                 trigger.value('usbdev');
74                 trigger.value('usbport');
75
76                 o = s.option(form.Value, 'delayon', _('On-State Delay'));
77                 o.depends('trigger', 'timer');
78
79                 o = s.option(form.Value, 'delayoff', _('Off-State Delay'));
80                 o.depends('trigger', 'timer');
81
82                 o = s.option(form.ListValue, '_net_dev', _('Device'));
83                 o.rmempty = true;
84                 o.ucioption = 'dev';
85                 o.depends('trigger', 'netdev');
86                 o.remove = function(section_id) {
87                         var t = trigger.formvalue(section_id);
88                         if (t != 'netdev' && t != 'usbdev')
89                                 uci.unset('system', section_id, 'dev');
90                 };
91                 o.value('');
92                 netdevs.sort().forEach(function(dev) { o.value(dev) });
93
94                 o = s.option(form.MultiValue, 'mode', _('Trigger Mode'));
95                 o.rmempty = true;
96                 o.depends('trigger', 'netdev');
97                 o.value('link', _('Link On'));
98                 o.value('tx', _('Transmit'));
99                 o.value('rx', _('Receive'));
100
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                 o = s.option(form.MultiValue, 'port', _('USB Ports'));
116                 o.depends('trigger', 'usbport');
117                 o.rmempty = 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(/^usb(\d+)-port(\d+)$/))
127                                         ports.push(value[i]);
128                                 else if (value[i].match(/^(\d+)-(\d+)$/))
129                                         ports.push('usb%d-port%d'.format(Regexp.$1, Regexp.$2));
130
131                         return ports;
132                 };
133                 (usb.ports || []).forEach(function(usbport) {
134                         o.value('usb%d-port%d'.format(usbport.hub, usbport.port),
135                                 'Hub %d, Port %d'.format(usbport.hub, usbport.port));
136                 });
137
138                 o = s.option(form.Value, 'port_mask', _('Switch Port Mask'));
139                 o.depends('trigger', 'switch0');
140                 o.depends('trigger', 'switch1');
141
142                 return m.render();
143         }
144 });