NIU: Minor fixes
[project/luci.git] / libs / cbi / luasrc / cbi.lua
index 9268d41..c9db8be 100644 (file)
@@ -222,6 +222,12 @@ function Node.__init__(self, title, description)
 end
 
 -- hook helper
+function Node._run_hook(self, hook)
+       if type(self[hook]) == "function" then
+               return self[hook](self)
+       end 
+end
+
 function Node._run_hooks(self, ...)
        local f
        local r = false
@@ -351,6 +357,7 @@ end
 -- Use optimized UCI writing
 function Map.parse(self, readinput, ...)
        self.readinput = (readinput ~= false)
+       self:_run_hooks("on_parse")
 
        if self:formvalue("cbi.skip") then
                self.state = FORM_SKIP
@@ -512,10 +519,6 @@ function Delegator.__init__(self, ...)
 end
 
 function Delegator.set(self, name, node)
-       if type(node) == "table" and getmetatable(node) == nil then
-               node = Compound(unpack(node))
-       end
-       assert(type(node) == "function" or instanceof(node, Compound), "Invalid")
        assert(not self.nodes[name], "Duplicate entry")
 
        self.nodes[name] = node
@@ -527,9 +530,9 @@ function Delegator.add(self, name, node)
 end
 
 function Delegator.insert_after(self, name, after)
-       local n = #self.chain
+       local n = #self.chain + 1
        for k, v in ipairs(self.chain) do
-               if v == state then
+               if v == after then
                        n = k + 1
                        break
                end
@@ -555,7 +558,17 @@ function Delegator.set_route(self, ...)
 end
 
 function Delegator.get(self, name)
-       return self.nodes[name]
+       local node = self.nodes[name]
+
+       if type(node) == "string" then
+               node = load(node, name)
+       end
+
+       if type(node) == "table" and getmetatable(node) == nil then
+               node = Compound(unpack(node))
+       end
+
+       return node
 end
 
 function Delegator.parse(self, ...)
@@ -598,14 +611,18 @@ function Delegator.parse(self, ...)
                return FORM_NODATA
        elseif stat > FORM_PROCEED 
        and (not newcurrent or not self:get(newcurrent)) then
-               self:_run_hooks("on_done")
-               return FORM_DONE
+               return self:_run_hook("on_done") or FORM_DONE
        else
                self.current = newcurrent or self.current
                self.active = self:get(self.current)
                if type(self.active) ~= "function" then
-                       self.active:parse(false)
-                       return FROM_PROCEED
+                       self.active:populate_delegator(self)
+                       local stat = self.active:parse(false)
+                       if stat == FORM_SKIP then
+                               return self:parse(...)
+                       else
+                               return FORM_PROCEED
+                       end
                else
                        return self:parse(...)
                end
@@ -1264,6 +1281,7 @@ function AbstractValue.__init__(self, map, section, option, ...)
        self.tag_reqerror = {}
        self.tag_error = {}
        self.deps = {}
+       self.subdeps = {}
        --self.cast = "string"
 
        self.track_missing = false
@@ -1594,7 +1612,7 @@ function ListValue.value(self, key, val, ...)
        table.insert(self.vallist, tostring(val))
 
        for i, deps in ipairs({...}) do
-               table.insert(self.deps, {add = "-"..key, deps=deps})
+               self.subdeps[#self.subdeps + 1] = {add = "-"..key, deps=deps}
        end
 end