luci-base: initialize CBI optionals on initial Map render (#618)
authorJo-Philipp Wich <jow@openwrt.org>
Fri, 15 Jan 2016 15:39:01 +0000 (16:39 +0100)
committerJo-Philipp Wich <jow@openwrt.org>
Fri, 15 Jan 2016 15:39:15 +0000 (16:39 +0100)
Signed-off-by: Jo-Philipp Wich <jow@openwrt.org>
modules/luci-base/luasrc/cbi.lua

index 2c1bb4d2266a910f27de7ce43ed8bf80a038c4ee..2f97539ab3e7a3f1b746810e9f50d7e5d4faf9f0 100644 (file)
@@ -336,7 +336,7 @@ function Map.__init__(self, config, ...)
 end
 
 function Map.formvalue(self, key)
-       return self.readinput and luci.http.formvalue(key)
+       return self.readinput and luci.http.formvalue(key) or nil
 end
 
 function Map.formvaluetable(self, key)
@@ -886,14 +886,18 @@ function AbstractSection.render_tab(self, tab, ...)
 end
 
 -- Parse optional options
-function AbstractSection.parse_optionals(self, section)
+function AbstractSection.parse_optionals(self, section, noparse)
        if not self.optional then
                return
        end
 
        self.optionals[section] = {}
 
-       local field = self.map:formvalue("cbi.opt."..self.config.."."..section)
+       local field = nil
+       if not noparse then
+               field = self.map:formvalue("cbi.opt."..self.config.."."..section)
+       end
+
        for k,v in ipairs(self.children) do
                if v.optional and not v:cfgvalue(section) and not self:has_tabs() then
                        if field == v.option then
@@ -1071,6 +1075,11 @@ function NamedSection.__init__(self, map, section, stype, ...)
        self.section = section
 end
 
+function NamedSection.prepare(self)
+       AbstractSection.prepare(self)
+       AbstractSection.parse_optionals(self, self.section, true)
+end
+
 function NamedSection.parse(self, novld)
        local s = self.section
        local active = self:cfgvalue(s)
@@ -1120,6 +1129,15 @@ function TypedSection.__init__(self, map, type, ...)
        self.anonymous = false
 end
 
+function TypedSection.prepare(self)
+       AbstractSection.prepare(self)
+
+       local i, s
+       for i, s in ipairs(self:cfgsections()) do
+               AbstractSection.parse_optionals(self, s, true)
+       end
+end
+
 -- Return all matching UCI sections for this TypedSection
 function TypedSection.cfgsections(self)
        local sections = {}