Merge pull request #3639 from TDT-AG/pr/20200217-leds
[project/luci.git] / modules / luci-mod-system / htdocs / luci-static / resources / view / system / leds.js
index 139db8797c0d8de578819f3315da2500d293ee24..849ead9528c12f0d0b3c4f1947423f927fac5cfb 100644 (file)
@@ -2,39 +2,56 @@
 'require uci';
 'require rpc';
 'require form';
-'require tools.widgets as widgets';
+'require fs';
 
-var callLeds, callUSB;
-
-callLeds = rpc.declare({
+var 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()
-               ]);
+                       L.resolveDefault(fs.list('/www' + L.resource('view/system/led-trigger')), [])
+               ]).then(function(data) {
+                       var plugins = data[1];
+                       var tasks = [];
+
+                       for (var i = 0; i < plugins.length; i++) {
+                               var m = plugins[i].name.match(/^(.+)\.js$/);
+
+                               if (plugins[i].type != 'file' || m == null)
+                                       continue;
+
+                               tasks.push(L.require('view.system.led-trigger.' + m[1]).then(L.bind(function(name){
+                                       return L.resolveDefault(L.require('view.system.led-trigger.' + name)).then(function(form) {
+                                               return {
+                                                       name: name,
+                                                       form: form,
+                                               };
+                                       });
+                               }, this, m[1])));
+                       }
+
+                       return Promise.all(tasks).then(function(plugins) {
+                               var value = {};
+                               value[0] = data[0];
+                               value[1] = plugins;
+                               return value;
+                       });
+               });
        },
 
-       render: function(results) {
-               var leds = results[0],
-                   usb = results[1],
-                   triggers = {},
-                   m, s, o;
+       render: function(data) {
+               var m, s, o, triggers = [];
+               var leds = data[0];
+               var plugins = data[1];
 
                for (var k in leds)
                        for (var i = 0; i < leds[k].triggers.length; i++)
-                               triggers[leds[k].triggers[i]] = true;
+                               triggers[i] = leds[k].triggers[i];
 
                m = new form.Map('system',
                        _('<abbr title="Light Emitting Diode">LED</abbr> Configuration'),
@@ -49,104 +66,28 @@ return L.view.extend({
                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;
+               Object.keys(leds).sort().forEach(function(name) {
+                       o.value(name)
+               });
 
                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);
-                       });
+               for (var i = 0; i < plugins.length; i++) {
+                       var plugin = plugins[i];
+
+                       if ( plugin.form.kernel == false )
+                               o.value(plugin.name, plugin.form.trigger);
+                       else
+                               for (var k = 0; k < triggers.length; k++)
+                                       if ( plugin.name == triggers[k] )
+                                               o.value(plugin.name, plugin.form.trigger);
                }
 
-               o = s.option(form.Value, 'port_mask', _('Switch Port Mask'));
-               o.modalonly = true;
-               o.depends('trigger', 'switch0');
-               o.depends('trigger', 'switch1');
+               s.addModalOptions = function(s) {
+                       for (var i = 0; i < plugins.length; i++) {
+                               var plugin = plugins[i];
+                               plugin.form.addFormOptions(s);
+                       }
+               };
 
                return m.render();
        }