luci-base: prevent tools.widgets.ZoneSelect tracebacks

follow-up fix for 0be4ad51a0

It seems to have been this way for a while, for zone selections
involving the 'any' ('*') choice. firewall forwards.js has no
'this.allowany;' property on the widgets, so the any choice is absent,
leading to a traceback, caused by the 'src' widget, even though
this code block operates on the 'dst' value. Certain combinations of
'src' and 'dst' also triggered tracebacks.

This might not be the correct behaviour for this widget, but it does
prevent tracebacks caused by null values.

Signed-off-by: Paul Donald <newtwen+github@gmail.com>
This commit is contained in:
Paul Donald
2025-04-23 14:04:12 +02:00
parent 9180f2a762
commit aa6924cd4c

View File

@@ -189,26 +189,27 @@ var CBIZoneSelect = form.ListValue.extend({
emptyval.parentNode.removeChild(emptyval);
}
else {
var anyval = node.querySelector('[data-value="*"]'),
emptyval = node.querySelector('[data-value=""]');
const anyval = node.querySelector('[data-value="*"]') || '';
const emptyval = node.querySelector('[data-value=""]') || '';
if (emptyval == null) {
if (emptyval == null && anyval) {
emptyval = anyval.cloneNode(true);
emptyval.removeAttribute('display');
emptyval.removeAttribute('selected');
emptyval.setAttribute('data-value', '');
}
if (opt[0].allowlocal)
if (opt[0]?.allowlocal && emptyval)
L.dom.content(emptyval.querySelector('span'), [
E('strong', _('Device')), E('span', ' (%s)'.format(_('input')))
]);
if (opt[0]?.allowany && anyval && emptyval) {
L.dom.content(anyval.querySelector('span'), [
E('strong', _('Any zone')), E('span', ' (%s)'.format(_('forward')))
]);
L.dom.content(anyval.querySelector('span'), [
E('strong', _('Any zone')), E('span', ' (%s)'.format(_('forward')))
]);
anyval.parentNode.insertBefore(emptyval, anyval);
anyval.parentNode.insertBefore(emptyval, anyval);
}
}
}, this));