Propagate CBI status via HTTP-Header
[project/luci.git] / libs / cbi / luasrc / cbi.lua
index 296ec81..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
 
@@ -121,7 +122,6 @@ function load(cbimap, ...)
                                end
 
                                if field.name == cbid and fd then
-                                       io.stderr:write("*** CHUNK:"..tostring(#chunk).." ***\n")
                                        fd:write(chunk)
                                end
 
@@ -305,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)
@@ -343,8 +346,18 @@ function Map.parse(self)
                        self.uci:unload(config)
                end
                if type(self.commit_handler) == "function" then
-                       self:commit_handler()
+                       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
 
@@ -440,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, ...)
@@ -453,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, ...)
@@ -689,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
@@ -752,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
@@ -827,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
@@ -1396,6 +1414,12 @@ function FileUpload.__init__(self, ...)
        end
 end
 
+function FileUpload.formcreated(self, section)
+       return AbstractValue.formcreated(self, section) or
+               luci.http.formvalue("cbi.rlf."..section.."."..self.option) or
+               luci.http.formvalue("cbi.rlf."..section.."."..self.option..".x")
+end
+
 function FileUpload.cfgvalue(self, section)
        local val = AbstractValue.cfgvalue(self, section)
        if val and luci.fs.access(val) then
@@ -1423,3 +1447,11 @@ function FileUpload.remove(self, section)
        if val and luci.fs.access(val) then luci.fs.unlink(val) end
        return AbstractValue.remove(self, section)
 end
+
+
+FileBrowser = class(AbstractValue)
+
+function FileBrowser.__init__(self, ...)
+       AbstractValue.__init__(self, ...)
+       self.template = "cbi/browser"
+end