'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', _('LED Configuration'), _('Customizes the behaviour of the device LEDs 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', _('LED Name')); Object.keys(leds).sort().forEach(function(name) { o.value(name) }); o = s.option(form.Flag, 'default', _('Default state')); o.rmempty = false; o.textvalue = function(section_id) { var cval = this.cfgvalue(section_id); if (cval == null) cval = this.default; return (cval == this.enabled) ? _('On') : _('Off'); }; 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'); o = s.option(form.Value, 'speed_mask', _('Switch Speed Mask')); o.modalonly = true; o.depends('trigger', 'switch0'); o.depends('trigger', 'switch1'); return m.render(); } });