Propagate CBI status via HTTP-Header
authorSteven Barth <steven@midlink.org>
Mon, 20 Oct 2008 22:35:11 +0000 (22:35 +0000)
committerSteven Barth <steven@midlink.org>
Mon, 20 Oct 2008 22:35:11 +0000 (22:35 +0000)
libs/cbi/luasrc/cbi.lua
libs/web/luasrc/dispatcher.lua

index 5f2a7b7..f54d5ac 100644 (file)
@@ -39,6 +39,7 @@ local instanceof = luci.util.instanceof
 FORM_NODATA  =  0
 FORM_VALID   =  1
 FORM_INVALID = -1
+FORM_CHANGED =  2
 
 AUTO = true
 
@@ -304,6 +305,9 @@ function Map.get_scheme(self, sectiontype, option)
        end
 end
 
+function Map.submitstate(self)
+       return luci.http.formvalue("cbi.submit")
+end
 
 -- Chain foreign config
 function Map.chain(self, config)
@@ -342,8 +346,18 @@ function Map.parse(self)
                        self.uci:unload(config)
                end
                if type(self.commit_handler) == "function" then
-                       self:commit_handler(luci.http.formvalue("cbi.submit"))
+                       self:commit_handler(self:submitstate())
+               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
 
@@ -439,11 +453,12 @@ function SimpleForm.parse(self, ...)
        end
 
        local state =
-               not luci.http.formvalue("cbi.submit") and 0
-               or valid and 1
-               or -1
+               not self:submitstate() and FORM_NODATA
+               or valid and FORM_VALID
+               or FORM_INVALID
 
        self.dorender = not self.handle or self:handle(state, self.data) ~= false
+       return state
 end
 
 function SimpleForm.render(self, ...)
@@ -452,6 +467,10 @@ function SimpleForm.render(self, ...)
        end
 end
 
+function SimpleForm.submitstate(self)
+       return luci.http.formvalue("cbi.submit")
+end
+
 function SimpleForm.section(self, class, ...)
        if instanceof(class, AbstractSection) then
                local obj  = class(self, ...)
@@ -688,7 +707,7 @@ end
 
 function Table.parse(self)
        for i, k in ipairs(self:cfgsections()) do
-               if luci.http.formvalue("cbi.submit") then
+               if self.map:submitstate() then
                        Node.parse(self, k)
                end
        end
@@ -751,7 +770,7 @@ function NamedSection.parse(self, novld)
 
        if active then
                AbstractSection.parse_dynamic(self, s)
-               if luci.http.formvalue("cbi.submit") then
+               if self.map:submitstate() then
                        Node.parse(self, s)
 
                        if not novld and not self.override_scheme and self.map.scheme then
@@ -826,7 +845,7 @@ function TypedSection.parse(self, novld)
        local co
        for i, k in ipairs(self:cfgsections()) do
                AbstractSection.parse_dynamic(self, k)
-               if luci.http.formvalue("cbi.submit") then
+               if self.map:submitstate() then
                        Node.parse(self, k)
 
                        if not novld and not self.override_scheme and self.map.scheme then
index a54685f..d199d41 100644 (file)
@@ -487,13 +487,20 @@ function cbi(model)
        return function(...)
                require("luci.cbi")
                require("luci.template")
+               local http = require "luci.http"
 
                maps = luci.cbi.load(model, ...)
 
+               local state = nil
+
                for i, res in ipairs(maps) do
-                       res:parse()
+                       local cstate = res:parse()
+                       if not state or cstate < state then
+                               state = cstate
+                       end
                end
 
+               http.header("X-CBI-State", state or 0)
                luci.template.render("cbi/header")
                for i, res in ipairs(maps) do
                        res:render()
@@ -508,13 +515,20 @@ function form(model)
        return function(...)
                require("luci.cbi")
                require("luci.template")
+               local http = require "luci.http"
 
                maps = luci.cbi.load(model, ...)
 
+               local state = nil
+
                for i, res in ipairs(maps) do
-                       res:parse()
+                       local cstate = res:parse()
+                       if not state or cstate < state then
+                               state = cstate
+                       end
                end
 
+               http.header("X-CBI-State", state or 0)
                luci.template.render("header")
                for i, res in ipairs(maps) do
                        res:render()