Skip to content
Snippets Groups Projects
Unverified Commit df9fa32d authored by Matthias Schiffer's avatar Matthias Schiffer
Browse files

gluon-web-model: add state tracking to sections

This add support for a write() method on sections, in addition to the
value and form level write(). write() is only called when the section is
valid and visible. In addition, write() is empty by default, so it can be
overridden more easily.
parent bb920eae
No related branches found
No related tags found
No related merge requests found
...@@ -53,6 +53,7 @@ function Node:__init__(name, title, description) ...@@ -53,6 +53,7 @@ function Node:__init__(name, title, description)
self.name = name self.name = name
self.index = nil self.index = nil
self.parent = nil self.parent = nil
self.state = M.FORM_NODATA
self.package = 'gluon-web-model' self.package = 'gluon-web-model'
end end
...@@ -73,17 +74,32 @@ function Node:id() ...@@ -73,17 +74,32 @@ function Node:id()
end end
function Node:reset_node() function Node:reset_node()
self.state = M.FORM_NODATA
for _, child in ipairs(self.children) do for _, child in ipairs(self.children) do
child:reset_node() child:reset_node()
end end
end end
function Node:parse(http) function Node:parse(http)
self.state = M.FORM_VALID
for _, child in ipairs(self.children) do for _, child in ipairs(self.children) do
child:parse(http) child:parse(http)
end end
end end
function Node:propagate_state()
if self.state == M.FORM_NODATA then
return
end
for _, child in ipairs(self.children) do
child:propagate_state()
if child.state == M.FORM_INVALID then
self.state = M.FORM_INVALID
end
end
end
function Node:render(renderer, scope) function Node:render(renderer, scope)
if self.template then if self.template then
local env = setmetatable({ local env = setmetatable({
...@@ -158,9 +174,16 @@ function Node:resolve_node_depends() ...@@ -158,9 +174,16 @@ function Node:resolve_node_depends()
return true return true
end end
-- will be overridden: write(value)
function Node:write()
end
function Node:handle() function Node:handle()
for _, node in ipairs(self.children) do if self.state == M.FORM_VALID then
node:handle() for _, node in ipairs(self.children) do
node:handle()
end
self:write(self.data)
end end
end end
...@@ -187,7 +210,6 @@ function AbstractValue:__init__(...) ...@@ -187,7 +210,6 @@ function AbstractValue:__init__(...)
self.template = "model/valuewrapper" self.template = "model/valuewrapper"
self.error = false self.error = false
self.state = M.FORM_NODATA
end end
function AbstractValue:defaultvalue() function AbstractValue:defaultvalue()
...@@ -250,16 +272,6 @@ function AbstractValue:validate() ...@@ -250,16 +272,6 @@ function AbstractValue:validate()
end end
function AbstractValue:handle()
if self.state == M.FORM_VALID then
self:write(self.data)
end
end
-- will be overridden: write(value)
function AbstractValue:write()
end
local Value = class(AbstractValue) local Value = class(AbstractValue)
M.Value = Value M.Value = Value
...@@ -438,26 +450,7 @@ function Form:parse(http) ...@@ -438,26 +450,7 @@ function Form:parse(http)
while self:resolve_depends() do end while self:resolve_depends() do end
for _, s in ipairs(self.children) do self:propagate_state()
for _, v in ipairs(s.children) do
if v.state == M.FORM_INVALID then
self.state = M.FORM_INVALID
return
end
end
end
self.state = M.FORM_VALID
end
function Form:handle()
if self.state == M.FORM_VALID then
Node.handle(self)
self:write()
end
end
function Form:write()
end end
function Form:section(t, ...) function Form:section(t, ...)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment