luci-base: form.js: consider aliased options in AbstractValue.remove()
authorJo-Philipp Wich <jo@mein.io>
Tue, 1 Jun 2021 12:45:42 +0000 (14:45 +0200)
committerJo-Philipp Wich <jo@mein.io>
Tue, 1 Jun 2021 13:34:11 +0000 (15:34 +0200)
If different options point to the same underlying uci option, we must only
remove the uci value if none of the other alias options is active in order
to prevent inactive options (due to unsatisfied depends) removing the uci
value of active once on save.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
modules/luci-base/htdocs/luci-static/resources/form.js

index f7b4c64f8fe2c8cb045a14b9e43d0ab584a375b4..8fc8d3aca739926b567423a79dd8af5876b9d447 100644 (file)
@@ -2035,10 +2035,32 @@ var CBIAbstractValue = CBIAbstractElement.extend(/** @lends LuCI.form.AbstractVa
         * The configuration section ID
         */
        remove: function(section_id) {
-               return this.map.data.unset(
-                       this.uciconfig || this.section.uciconfig || this.map.config,
-                       this.ucisection || section_id,
-                       this.ucioption || this.option);
+               var this_cfg = this.uciconfig || this.section.uciconfig || this.map.config,
+                   this_sid = this.ucisection || section_id,
+                   this_opt = this.ucioption || this.option;
+
+               for (var i = 0; i < this.section.children.length; i++) {
+                       var sibling = this.section.children[i];
+
+                       if (sibling === this || sibling.ucioption == null)
+                               continue;
+
+                       var sibling_cfg = sibling.uciconfig || sibling.section.uciconfig || sibling.map.config,
+                           sibling_sid = sibling.ucisection || section_id,
+                           sibling_opt = sibling.ucioption || sibling.option;
+
+                       if (this_cfg != sibling_cfg || this_sid != sibling_sid || this_opt != sibling_opt)
+                               continue;
+
+                       if (!sibling.isActive(section_id))
+                               continue;
+
+                       /* found another active option aliasing the same uci option name,
+                        * so we can't remove the value */
+                       return;
+               }
+
+               this.map.data.unset(this_cfg, this_sid, this_opt);
        }
 });