CBI: Cancelaction and event callbacks for Delegators
[project/luci.git] / libs / cbi / luasrc / cbi.lua
index 33b0c7c..13aad8d 100644 (file)
@@ -369,7 +369,7 @@ function Map.parse(self, readinput, ...)
                for i, config in ipairs(self.parsechain) do
                        self.uci:save(config)
                end
-               if self:submitstate() and not self.proceed and (self.flow.autoapply or luci.http.formvalue("cbi.apply")) then
+               if self:submitstate() and ((not self.proceed and self.flow.autoapply) or luci.http.formvalue("cbi.apply")) then
                        for i, config in ipairs(self.parsechain) do
                                self.uci:commit(config)
 
@@ -506,6 +506,7 @@ function Delegator.__init__(self, ...)
        self.pageaction = false
        self.readinput = true
        self.allow_reset = false
+       self.allow_cancel = false
        self.allow_back = false
        self.allow_finish = false
        self.template = "cbi/delegator"
@@ -559,6 +560,17 @@ function Delegator.get(self, name)
 end
 
 function Delegator.parse(self, ...)
+       if self.allow_cancel and Map.formvalue(self, "cbi.cancel") then
+               if self.on_cancel then
+                       self:on_cancel()
+                       return FORM_DONE
+               end
+       end
+       
+       if self.on_init and not Map.formvalue(self, "cbi.delg.current") then
+               self:on_init()
+       end
+
        local newcurrent
        self.chain = self.chain or self:get_chain()
        self.current = self.current or self:get_active()
@@ -587,6 +599,9 @@ function Delegator.parse(self, ...)
        if not Map.formvalue(self, "cbi.submit") then
                return FORM_NODATA
        elseif not newcurrent or not self:get(newcurrent) then
+               if self.on_done then
+                       self:on_done()
+               end
                return FORM_DONE
        else
                self.current = newcurrent
@@ -931,7 +946,7 @@ function AbstractSection.create(self, section)
        local stat
 
        if section then
-               stat = section:match("^%w+$") and self.map:set(section, nil, self.sectiontype)
+               stat = section:match("^[%w_]+$") and self.map:set(section, nil, self.sectiontype)
        else
                section = self.map:add(self.sectiontype)
                stat = section
@@ -1330,6 +1345,22 @@ function AbstractValue.parse(self, section, novld)
        local fvalue = self:formvalue(section)
        local cvalue = self:cfgvalue(section)
 
+       -- If favlue and cvalue are both tables and have the same content
+       -- make them identical
+       if type(fvalue) == "table" and type(cvalue) == "table" then
+               local equal = #fvalue == #cvalue
+               if equal then
+                       for i=1, #fvalue do
+                               if cvalue[i] ~= fvalue[i] then
+                                       equal = false
+                               end
+                       end
+               end
+               if equal then
+                       fvalue = cvalue
+               end
+       end
+
        if fvalue and #fvalue > 0 then -- If we have a form value, write it to UCI
                fvalue = self:transform(self:validate(fvalue, section))
                if not fvalue and not novld then