luci-base: form.js: add a new "contains" dependency mode

By tagging option dependencies with `!contains`, dependencies are
considered satisfied when the value is contained in the value of
a related field, instead of being equal to it.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
This commit is contained in:
Jo-Philipp Wich 2020-01-19 16:00:57 +01:00
parent 4670099a20
commit 601c4ee01e

View file

@ -403,11 +403,12 @@ var CBIMap = CBINode.extend({
for (var i = 0; i < depends.length; i++) {
var istat = true,
reverse = false;
reverse = depends[i]['!reverse'],
contains = depends[i]['!contains'];
for (var dep in depends[i]) {
if (dep == '!reverse') {
reverse = true;
if (dep == '!reverse' || dep == '!contains') {
continue;
}
else if (dep == '!default') {
def = true;
@ -417,7 +418,11 @@ var CBIMap = CBINode.extend({
var res = this.lookupOption(dep, section_id, config_name),
val = (res && res[0].isActive(res[1])) ? res[0].formvalue(res[1]) : null;
istat = (istat && isEqual(val, depends[i][dep]));
var equal = contains
? isContained(val, depends[i][dep])
: isEqual(val, depends[i][dep]);
istat = (istat && equal);
}
}
@ -633,6 +638,23 @@ var isEqual = function(x, y) {
return true;
};
var isContained = function(x, y) {
if (Array.isArray(x)) {
for (var i = 0; i < x.length; i++)
if (x[i] == y)
return true;
}
else if (L.isObject(x)) {
if (x.hasOwnProperty(y) && x[y] != null)
return true;
}
else if (typeof(x) == 'string') {
return (x.indexOf(y) > -1);
}
return false;
};
var CBIAbstractValue = CBINode.extend({
__init__: function(map, section, option /*, ... */) {
this.super('__init__', this.varargs(arguments, 3));