luci-mod-network: fix device section cleanup

Ensure that device sections are only automatically removed after all
related options have been parsed, to avoid prematurely deleting sections.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
This commit is contained in:
Jo-Philipp Wich 2021-03-29 22:33:35 +02:00
parent ba4e214160
commit 2072c66c5a

View file

@ -145,24 +145,9 @@ function deviceWrite(section_id, formvalue) {
} }
function deviceRemove(section_id) { function deviceRemove(section_id) {
var ds = lookupDevSection(this.section, section_id, false), var ds = lookupDevSection(this.section, section_id, false);
sv = ds ? uci.get('network', ds) : null;
if (sv) {
var empty = true;
for (var opt in sv) {
if (opt.charAt(0) == '.' || opt == 'name' || opt == this.option)
continue;
empty = false;
}
if (empty)
uci.remove('network', ds);
else
uci.unset('network', ds, this.option); uci.unset('network', ds, this.option);
}
if (this.migrate) if (this.migrate)
uci.unset('network', section_id, this.option); uci.unset('network', section_id, this.option);
@ -188,6 +173,28 @@ function deviceRefresh(section_id) {
} }
} }
function sectionParse() {
var ds = lookupDevSection(this, this.section, false);
return form.NamedSection.prototype.parse.apply(this).then(function() {
var sv = ds ? uci.get('network', ds) : null;
if (sv) {
var empty = true;
for (var opt in sv) {
if (opt.charAt(0) == '.' || opt == 'name')
continue;
empty = false;
}
if (empty)
uci.remove('network', ds);
}
});
}
var cbiTagValue = form.Value.extend({ var cbiTagValue = form.Value.extend({
renderWidget: function(section_id, option_index, cfgvalue) { renderWidget: function(section_id, option_index, cfgvalue) {
@ -387,6 +394,9 @@ return baseclass.extend({
o, ss; o, ss;
if (isIface) { if (isIface) {
if (!s.hasOwnProperty('parse'))
s.parse = sectionParse;
var type; var type;
/* If an externally configured br-xxx interface already exists, /* If an externally configured br-xxx interface already exists,