summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--libs/cbi/luasrc/cbi.lua47
1 files changed, 38 insertions, 9 deletions
diff --git a/libs/cbi/luasrc/cbi.lua b/libs/cbi/luasrc/cbi.lua
index c176da0922..0265301f73 100644
--- a/libs/cbi/luasrc/cbi.lua
+++ b/libs/cbi/luasrc/cbi.lua
@@ -301,6 +301,7 @@ function Map.__init__(self, config, ...)
self.apply_on_parse = nil
self.readinput = true
self.proceed = false
+ self.flow = {}
self.uci = uci.cursor()
self.save = true
@@ -506,7 +507,7 @@ function Delegator.set(self, name, node)
if type(node) == "table" and getmetatable(node) == nil then
node = Compound(unpack(node))
end
- assert(instanceof(node, Compound), "Invalid node")
+ assert(type(node) == "function" or instanceof(node, Compound), "Invalid")
assert(not self.nodes[name], "Duplicate entry")
self.nodes[name] = node
@@ -528,19 +529,43 @@ function Delegator.insert_after(self, name, after)
table.insert(self.chain, n, name)
end
+function Delegator.set_route(self, ...)
+ local n, chain, route = 0, self.chain, {...}
+ for i = 1, #chain do
+ if chain[i] == self.current then
+ n = i
+ break
+ end
+ end
+ for i = 1, #route do
+ n = n + 1
+ chain[n] = route[i]
+ end
+ for i = n + 1, #chain do
+ chain[i] = nil
+ end
+end
+
function Delegator.get(self, name)
return self.nodes[name]
end
function Delegator.parse(self, ...)
local newcurrent
- self.chain = self:get_chain()
- self.current = self:get_active()
- self.active = self:get(self.current)
+ self.chain = self.chain or self:get_chain()
+ self.current = self.current or self:get_active()
+ self.active = self.active or self:get(self.current)
assert(self.active, "Invalid state")
- self.active:populate_delegator(self)
- if self.active:parse() > FORM_PROCEED then
+ local stat = FORM_DONE
+ if type(self.active) ~= "function" then
+ self.active:populate_delegator(self)
+ stat = self.active:parse()
+ else
+ self:active()
+ end
+
+ if stat > FORM_PROCEED then
if Map.formvalue(self, "cbi.delg.back") then
newcurrent = self:get_prev(self.current)
else
@@ -553,8 +578,12 @@ function Delegator.parse(self, ...)
else
self.current = newcurrent
self.active = self:get(self.current)
- self.active:parse(false)
- return FROM_PROCEED
+ if type(self.active) ~= "function" then
+ self.active:parse(false)
+ return FROM_PROCEED
+ else
+ return self:parse(...)
+ end
end
end
@@ -783,8 +812,8 @@ function AbstractSection.parse_optionals(self, section)
if v.optional and not v:cfgvalue(section) then
if field == v.option then
field = nil
- else
self.map.proceed = true
+ else
table.insert(self.optionals[section], v)
end
end