X-Git-Url: https://git.archive.openwrt.org/?a=blobdiff_plain;f=libs%2Fcbi%2Fluasrc%2Fcbi.lua;h=399f486752d65c05a839a62339672ffdf43da9d5;hb=36717208f1ae73290d352d706425e32f9726ff37;hp=4b4bf39059836a40c5be62b3375b7eab2ca6bca4;hpb=fbae92e522692d9bb34501ad9a805da794a47123;p=project%2Fluci.git diff --git a/libs/cbi/luasrc/cbi.lua b/libs/cbi/luasrc/cbi.lua index 4b4bf3905..399f48675 100644 --- a/libs/cbi/luasrc/cbi.lua +++ b/libs/cbi/luasrc/cbi.lua @@ -35,6 +35,12 @@ local uci = luci.model.uci local class = luci.util.class local instanceof = luci.util.instanceof +FORM_NODATA = 0 +FORM_VALID = 1 +FORM_INVALID = -1 + +CREATE_PREFIX = "cbi.cts." +REMOVE_PREFIX = "cbi.rts." -- Loads a CBI map from given file, creating an environment and returns it function load(cbimap, ...) @@ -61,7 +67,7 @@ function load(cbimap, ...) local maps = {func()} for i, map in ipairs(maps) do - if not instanceof(map, Map) then + if not instanceof(map, Node) then error("CBI map returns no valid map object!") return nil end @@ -230,6 +236,73 @@ function Map.get(self, section, option) end end +-- UCI stateget +function Map.stateget(self, section, option) + return uci.get_statevalue(self.config, section, option) +end + + +--[[ +SimpleForm - A Simple non-UCI form +]]-- +SimpleForm = class(Node) + +function SimpleForm.__init__(self, config, title, description, data) + Node.__init__(self, title, description) + self.config = config + self.data = data or {} + self.template = "cbi/simpleform" + self.dorender = true +end + +function SimpleForm.parse(self, ...) + Node.parse(self, 1, ...) + + local valid = true + for i, v in ipairs(self.children) do + valid = valid and not v.tag_missing[1] and not v.tag_invalid[1] + end + + local state = + not luci.http.formvalue("cbi.submit") and 0 + or valid and 1 + or -1 + + self.dorender = self:handle(state, self.data) +end + +function SimpleForm.render(self, ...) + if self.dorender then + Node.render(self, ...) + end +end + +-- Creates a child section +function SimpleForm.field(self, class, ...) + if instanceof(class, AbstractValue) then + local obj = class(self, ...) + self:append(obj) + return obj + else + error("class must be a descendent of AbstractValue") + end +end + +function SimpleForm.set(self, section, option, value) + self.data[option] = value +end + + +function SimpleForm.del(self, section, option) + self.data[option] = nil +end + + +function SimpleForm.get(self, section, option) + return self.data[option] +end + + --[[ AbstractSection @@ -440,7 +513,7 @@ end function TypedSection.parse(self) if self.addremove then -- Create - local crval = "cbi.cts." .. self.config .. "." .. self.sectiontype + local crval = CREATE_PREFIX .. self.config .. "." .. self.sectiontype local name = luci.http.formvalue(crval) if self.anonymous then if name then @@ -466,7 +539,7 @@ function TypedSection.parse(self) end -- Remove - crval = "cbi.rts." .. self.config + crval = REMOVE_PREFIX .. self.config name = luci.http.formvaluetable(crval) for k,v in pairs(name) do if self:cfgvalue(k) and self:checkscope(k) then @@ -534,12 +607,14 @@ function AbstractValue.__init__(self, map, option, ...) self.map = map self.config = map.config self.tag_invalid = {} + self.tag_missing = {} self.deps = {} - self.rmempty = false - self.default = nil - self.size = nil - self.optional = false + self.rmempty = false + self.default = nil + self.size = nil + self.optional = false + self.stateful = false end -- Add a dependencie to another section field @@ -559,11 +634,20 @@ function AbstractValue.formvalue(self, section) return luci.http.formvalue(key) end +function AbstractValue.additional(self, value) + self.optional = value +end + +function AbstractValue.mandatory(self, value) + self.rmempty = not value +end + function AbstractValue.parse(self, section) local fvalue = self:formvalue(section) + local cvalue = self:cfgvalue(section) if fvalue and fvalue ~= "" then -- If we have a form value, write it to UCI - fvalue = self:validate(fvalue) + fvalue = self:transform(self:validate(fvalue)) if not fvalue then self.tag_invalid[section] = true end @@ -573,6 +657,8 @@ function AbstractValue.parse(self, section) else -- Unset the UCI or error if self.rmempty or self.optional then self:remove(section) + elseif not fvalue or fvalue ~= cvalue then + --self.tag_missing[section] = true end end end @@ -610,7 +696,9 @@ end -- Return the UCI value of this object function AbstractValue.cfgvalue(self, section) - return self.map:get(section, self.option) + return self.stateful + and self.map:stateget(section, self.option) + or self.map:get(section, self.option) end -- Validate the form value @@ -618,6 +706,9 @@ function AbstractValue.validate(self, value) return value end +AbstractValue.transform = AbstractValue.validate + + -- Write to UCI function AbstractValue.write(self, section, value) return self.map:set(section, self.option, value) @@ -785,3 +876,14 @@ function MultiValue.validate(self, val) return result end + +--[[ +TextValue - A multi-line value + rows: Rows +]]-- +TextValue = class(AbstractValue) + +function TextValue.__init__(self, ...) + AbstractValue.__init__(self, ...) + self.template = "cbi/tvalue" +end