From ec54122a48da50503b62362950ae191f416599b2 Mon Sep 17 00:00:00 2001 From: Christian Korber Date: Fri, 22 May 2026 12:00:27 +0200 Subject: [PATCH] luci-base: keep not yet rendered clone elements `handleClone` triggers `checkDepends` and also `parse` on `this.map.save` which in turn also removes not yet rendered elements like clones. This is not wanted and therefore guarded against. Signed-off-by: Christian Korber --- .../luci-base/htdocs/luci-static/resources/form.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/modules/luci-base/htdocs/luci-static/resources/form.js b/modules/luci-base/htdocs/luci-static/resources/form.js index 54fca6930d..7e5c4a2569 100644 --- a/modules/luci-base/htdocs/luci-static/resources/form.js +++ b/modules/luci-base/htdocs/luci-static/resources/form.js @@ -1309,6 +1309,12 @@ const CBIAbstractSection = CBIAbstractElement.extend(/** @lends LuCI.form.Abstra const sids = this.cfgsections(); for (let i = 0, sid = sids[0]; (sid = sids[i]) != null; i++) { + /* + * do not remove elements that are not rendered yet + */ + if (!this.map.findElement('data-section-id', sid)) + continue; + for (let j = 0, o = this.children[0]; (o = this.children[j]) != null; j++) { let isActive = o.isActive(sid); const isSatisfied = o.checkDepends(sid); @@ -2155,7 +2161,11 @@ const CBIAbstractValue = CBIAbstractElement.extend(/** @lends LuCI.form.Abstract } } else if (this.forcewrite || !isEqual(cval, fval)) { - return Promise.resolve(this.write(section_id, fval)); + /* + * do not remove elements that are not rendered yet + */ + if (this.map.findElement('data-field', this.cbid(section_id)) != null) + return Promise.resolve(this.write(section_id, fval)); } } else if (!this.retain) {