luci/modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js
Florian Eckert b6fb2b1697 luci-mod-system: Set description to blank if the trigger has none
In this case the cbi description div will not be generated and when
switching to another trigger later, attempts to change the description
div contents will fail.

Signed-off-by: Florian Eckert <fe@dev.tdt.de>
2022-04-12 14:14:27 +02:00

140 lines
3.5 KiB
JavaScript

'use strict';
'require view';
'require uci';
'require rpc';
'require form';
'require fs';
var callLeds = rpc.declare({
object: 'luci',
method: 'getLEDs',
expect: { '': {} }
});
return view.extend({
load: function() {
return Promise.all([
callLeds(),
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(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[i] = leds[k].triggers[i];
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.nodescriptions = true;
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.ListValue, 'trigger', _('Trigger'));
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 {
if (triggers.indexOf(plugin.name) >= 0)
o.value(plugin.name, plugin.form.trigger);
}
}
o.onchange = function(ev, section, value) {
for (var i = 0; i < plugins.length; i++) {
var plugin = plugins[i];
if ( plugin.name === value )
this.map.findElement('id', 'cbid.system.%s.trigger'.format(section))
.nextElementSibling.innerHTML = plugin.form.description || '';
}
}
o.load = function(section_id) {
var trigger = uci.get('system', section_id, 'trigger');
for (var i = 0; i < plugins.length; i++) {
var plugin = plugins[i];
if ( plugin.name === trigger)
this.description = plugin.form.description || ' ';
}
return trigger;
};
s.addModalOptions = function(s) {
for (var i = 0; i < plugins.length; i++) {
var plugin = plugins[i];
plugin.form.addFormOptions(s);
}
var opts = s.getOption();
var removeIfNoneActive = function(original_remove_fn, section_id) {
var isAnyActive = false;
for (var optname in opts) {
if (opts[optname].ucioption != this.ucioption)
continue;
if (!opts[optname].isActive(section_id))
continue;
isAnyActive = true;
break;
}
if (!isAnyActive)
original_remove_fn.call(this, section_id);
};
for (var optname in opts) {
if (!opts[optname].ucioption || optname == opts[optname].ucioption)
continue;
opts[optname].remove = removeIfNoneActive.bind(opts[optname], opts[optname].remove);
}
};
return m.render();
}
});