Propagate CBI status via HTTP-Header

This commit is contained in:
Steven Barth 2008-10-20 22:35:11 +00:00
parent 76f8a9cfd2
commit de4b0abeb9
2 changed files with 42 additions and 9 deletions

View file

@ -39,6 +39,7 @@ local instanceof = luci.util.instanceof
FORM_NODATA = 0 FORM_NODATA = 0
FORM_VALID = 1 FORM_VALID = 1
FORM_INVALID = -1 FORM_INVALID = -1
FORM_CHANGED = 2
AUTO = true AUTO = true
@ -304,6 +305,9 @@ function Map.get_scheme(self, sectiontype, option)
end end
end end
function Map.submitstate(self)
return luci.http.formvalue("cbi.submit")
end
-- Chain foreign config -- Chain foreign config
function Map.chain(self, config) function Map.chain(self, config)
@ -342,9 +346,19 @@ function Map.parse(self)
self.uci:unload(config) self.uci:unload(config)
end end
if type(self.commit_handler) == "function" then if type(self.commit_handler) == "function" then
self:commit_handler(luci.http.formvalue("cbi.submit")) self:commit_handler(self:submitstate())
end end
end end
if self:submitstate() then
if self.save then
return self.changed and FORM_CHANGED or FORM_VALID
else
return FORM_INVALID
end
else
return FORM_NODATA
end
end end
function Map.render(self, ...) function Map.render(self, ...)
@ -439,11 +453,12 @@ function SimpleForm.parse(self, ...)
end end
local state = local state =
not luci.http.formvalue("cbi.submit") and 0 not self:submitstate() and FORM_NODATA
or valid and 1 or valid and FORM_VALID
or -1 or FORM_INVALID
self.dorender = not self.handle or self:handle(state, self.data) ~= false self.dorender = not self.handle or self:handle(state, self.data) ~= false
return state
end end
function SimpleForm.render(self, ...) function SimpleForm.render(self, ...)
@ -452,6 +467,10 @@ function SimpleForm.render(self, ...)
end end
end end
function SimpleForm.submitstate(self)
return luci.http.formvalue("cbi.submit")
end
function SimpleForm.section(self, class, ...) function SimpleForm.section(self, class, ...)
if instanceof(class, AbstractSection) then if instanceof(class, AbstractSection) then
local obj = class(self, ...) local obj = class(self, ...)
@ -688,7 +707,7 @@ end
function Table.parse(self) function Table.parse(self)
for i, k in ipairs(self:cfgsections()) do for i, k in ipairs(self:cfgsections()) do
if luci.http.formvalue("cbi.submit") then if self.map:submitstate() then
Node.parse(self, k) Node.parse(self, k)
end end
end end
@ -751,7 +770,7 @@ function NamedSection.parse(self, novld)
if active then if active then
AbstractSection.parse_dynamic(self, s) AbstractSection.parse_dynamic(self, s)
if luci.http.formvalue("cbi.submit") then if self.map:submitstate() then
Node.parse(self, s) Node.parse(self, s)
if not novld and not self.override_scheme and self.map.scheme then if not novld and not self.override_scheme and self.map.scheme then
@ -826,7 +845,7 @@ function TypedSection.parse(self, novld)
local co local co
for i, k in ipairs(self:cfgsections()) do for i, k in ipairs(self:cfgsections()) do
AbstractSection.parse_dynamic(self, k) AbstractSection.parse_dynamic(self, k)
if luci.http.formvalue("cbi.submit") then if self.map:submitstate() then
Node.parse(self, k) Node.parse(self, k)
if not novld and not self.override_scheme and self.map.scheme then if not novld and not self.override_scheme and self.map.scheme then

View file

@ -487,13 +487,20 @@ function cbi(model)
return function(...) return function(...)
require("luci.cbi") require("luci.cbi")
require("luci.template") require("luci.template")
local http = require "luci.http"
maps = luci.cbi.load(model, ...) maps = luci.cbi.load(model, ...)
local state = nil
for i, res in ipairs(maps) do for i, res in ipairs(maps) do
res:parse() local cstate = res:parse()
if not state or cstate < state then
state = cstate
end
end end
http.header("X-CBI-State", state or 0)
luci.template.render("cbi/header") luci.template.render("cbi/header")
for i, res in ipairs(maps) do for i, res in ipairs(maps) do
res:render() res:render()
@ -508,13 +515,20 @@ function form(model)
return function(...) return function(...)
require("luci.cbi") require("luci.cbi")
require("luci.template") require("luci.template")
local http = require "luci.http"
maps = luci.cbi.load(model, ...) maps = luci.cbi.load(model, ...)
local state = nil
for i, res in ipairs(maps) do for i, res in ipairs(maps) do
res:parse() local cstate = res:parse()
if not state or cstate < state then
state = cstate
end
end end
http.header("X-CBI-State", state or 0)
luci.template.render("header") luci.template.render("header")
for i, res in ipairs(maps) do for i, res in ipairs(maps) do
res:render() res:render()