luci/modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js
Jo-Philipp Wich 45b56e85a6 luci-mod-system: leds.js: fix handling device option
Since the modal overlay map was unable to read the current trigger value,
it mistakingly allowed the removal of the device option value.

Fix it by finding the option object through lookupOption() instead of
relying on a reference.

Fixes: #3216
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2019-10-18 18:55:10 +02:00

153 lines
4.2 KiB
JavaScript

'use strict';
'require uci';
'require rpc';
'require form';
'require tools.widgets as widgets';
var callLeds, callUSB;
callLeds = rpc.declare({
object: 'luci',
method: 'getLEDs',
expect: { '': {} }
});
callUSB = rpc.declare({
object: 'luci',
method: 'getUSBDevices',
expect: { '': {} }
});
return L.view.extend({
load: function() {
return Promise.all([
callLeds(),
callUSB()
]);
},
render: function(results) {
var leds = results[0],
usb = results[1],
triggers = {},
m, s, o;
for (var k in leds)
for (var i = 0; i < leds[k].triggers.length; i++)
triggers[leds[k].triggers[i]] = true;
m = new form.Map('system',
_('<abbr title="Light Emitting Diode">LED</abbr> Configuration'),
_('Customizes the behaviour of the device <abbr title="Light Emitting Diode">LED</abbr>s if possible.'));
s = m.section(form.GridSection, 'led', '');
s.anonymous = true;
s.addremove = true;
s.sortable = true;
s.addbtntitle = _('Add LED action');
s.option(form.Value, 'name', _('Name'));
o = s.option(form.ListValue, 'sysfs', _('<abbr title="Light Emitting Diode">LED</abbr> Name'));
Object.keys(leds).sort().forEach(function(name) { o.value(name) });
o = s.option(form.Flag, 'default', _('Default state'));
o.rmempty = false;
o = s.option(form.ListValue, 'trigger', _('Trigger'));
if (usb.devices && usb.devices.length)
triggers['usbdev'] = true;
if (usb.ports && usb.ports.length)
triggers['usbport'] = true;
Object.keys(triggers).sort().forEach(function(t) { o.value(t, t.replace(/-/g, '')) });
o = s.option(form.Value, 'delayon', _('On-State Delay'));
o.modalonly = true;
o.depends('trigger', 'timer');
o = s.option(form.Value, 'delayoff', _('Off-State Delay'));
o.modalonly = true;
o.depends('trigger', 'timer');
o = s.option(widgets.DeviceSelect, '_net_dev', _('Device'));
o.rmempty = true;
o.ucioption = 'dev';
o.modalonly = true;
o.noaliases = true;
o.depends('trigger', 'netdev');
o.remove = function(section_id) {
var topt = this.map.lookupOption('trigger', section_id),
tval = topt ? topt[0].formvalue(section_id) : null;
if (tval != 'netdev' && tval != 'usbdev')
uci.unset('system', section_id, 'dev');
};
o = s.option(form.MultiValue, 'mode', _('Trigger Mode'));
o.rmempty = true;
o.modalonly = true;
o.depends('trigger', 'netdev');
o.value('link', _('Link On'));
o.value('tx', _('Transmit'));
o.value('rx', _('Receive'));
if (usb.devices && usb.devices.length) {
o = s.option(form.ListValue, '_usb_dev', _('USB Device'));
o.depends('trigger', 'usbdev');
o.rmempty = true;
o.ucioption = 'dev';
o.modalonly = true;
o.remove = function(section_id) {
var topt = this.map.lookupOption('trigger', section_id),
tval = topt ? topt[0].formvalue(section_id) : null;
if (tval != 'netdev' && tval != 'usbdev')
uci.unset('system', section_id, 'dev');
}
o.value('');
usb.devices.forEach(function(usbdev) {
o.value(usbdev.id, '%s (%s - %s)'.format(usbdev.id, usbdev.vendor || '?', usbdev.product || '?'));
});
}
if (usb.ports && usb.ports.length) {
o = s.option(form.MultiValue, 'port', _('USB Ports'));
o.depends('trigger', 'usbport');
o.rmempty = true;
o.modalonly = true;
o.cfgvalue = function(section_id) {
var ports = [],
value = uci.get('system', section_id, 'port');
if (!Array.isArray(value))
value = String(value || '').split(/\s+/);
for (var i = 0; i < value.length; i++)
if (value[i].match(/^(\d+)-(\d+)$/))
ports.push('usb%d-port%d'.format(Regexp.$1, Regexp.$2));
else
ports.push(value[i]);
return ports;
};
usb.ports.forEach(function(usbport) {
var dev = (usbport.device && Array.isArray(usb.devices))
? usb.devices.filter(function(d) { return d.id == usbport.device })[0] : null;
var label = _('Port %s').format(usbport.port);
if (dev)
label += ' (%s - %s)'.format(dev.vendor || '?', dev.product || '?');
o.value(usbport.port, label);
});
}
o = s.option(form.Value, 'port_mask', _('Switch Port Mask'));
o.modalonly = true;
o.depends('trigger', 'switch0');
o.depends('trigger', 'switch1');
return m.render();
}
});