X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fluci.git;a=blobdiff_plain;f=libs%2Fcbi%2Fluasrc%2Fcbi.lua;h=7e2f53c80c06a79a710358ed63fea17aae327398;hp=8816b11b7bafe0b702a44b0a3d0a7c34542edf43;hb=f94fb5ac1843ae47a28cfa1ef2ea4cbdd6b239f2;hpb=d915e6e1d7421f366ca61bf081b6ca0d29945ec1 diff --git a/libs/cbi/luasrc/cbi.lua b/libs/cbi/luasrc/cbi.lua index 8816b11b7..7e2f53c80 100644 --- a/libs/cbi/luasrc/cbi.lua +++ b/libs/cbi/luasrc/cbi.lua @@ -92,10 +92,10 @@ function Node._i18n(self, config, section, option, title, description) -- i18n loaded? if type(luci.i18n) == "table" then - local key = config:gsub("[^%w]+", "") + local key = config and config:gsub("[^%w]+", "") or "" if section then key = key .. "_" .. section:lower():gsub("[^%w]+", "") end - if option then key = key .. "_" .. option:lower():gsub("[^%w]+", "") end + if option then key = key .. "_" .. tostring(option):lower():gsub("[^%w]+", "") end self.title = title or luci.i18n.translate( key, option or section or config ) self.description = description or luci.i18n.translate( key .. "_desc", "" ) @@ -247,6 +247,15 @@ end --[[ +Page - A simple node +]]-- + +Page = class(Node) +Page.__init__ = Node.__init__ +Page.parse = function() end + + +--[[ SimpleForm - A Simple non-UCI form ]]-- SimpleForm = class(Node) @@ -260,13 +269,17 @@ function SimpleForm.__init__(self, config, title, description, data) end function SimpleForm.parse(self, ...) - Node.parse(self, 1, ...) + if luci.http.formvalue("cbi.submit") then + Node.parse(self, 1, ...) + end local valid = true - for i, v in ipairs(self.children) do - valid = valid - and (not v.tag_missing or not v.tag_missing[1]) - and (not v.tag_invalid or not v.tag_invalid[1]) + for k, j in ipairs(self.children) do + for i, v in ipairs(j.children) do + valid = valid + and (not v.tag_missing or not v.tag_missing[1]) + and (not v.tag_invalid or not v.tag_invalid[1]) + end end local state = @@ -274,7 +287,7 @@ function SimpleForm.parse(self, ...) or valid and 1 or -1 - self.dorender = self:handle(state, self.data) + self.dorender = self:handle(state, self.data) ~= false end function SimpleForm.render(self, ...) @@ -283,11 +296,33 @@ function SimpleForm.render(self, ...) end end --- Creates a child section +function SimpleForm.section(self, class, ...) + if instanceof(class, AbstractSection) then + local obj = class(self, ...) + self:append(obj) + return obj + else + error("class must be a descendent of AbstractSection") + end +end + +-- Creates a child field function SimpleForm.field(self, class, ...) + local section + for k, v in ipairs(self.children) do + if instanceof(v, SimpleSection) then + section = v + break + end + end + if not section then + section = self:section(SimpleSection) + end + if instanceof(class, AbstractValue) then local obj = class(self, ...) - self:append(obj) + obj.track_missing = true + section:append(obj) return obj else error("class must be a descendent of AbstractValue") @@ -436,6 +471,42 @@ function AbstractSection.create(self, section) end +SimpleSection = class(AbstractSection) + +function SimpleSection.__init__(self, form, ...) + AbstractSection.__init__(self, form, nil, ...) + self.template = "cbi/nullsection" +end + + +Table = class(AbstractSection) + +function Table.__init__(self, form, data, ...) + local datasource = {} + datasource.config = "table" + self.data = data + + function datasource.get(self, section, option) + return data[section][option] + end + + AbstractSection.__init__(self, datasource, "table", ...) + self.template = "cbi/tblsection" + self.rowcolors = true + self.anonymous = true +end + +function Table.cfgsections(self) + local sections = {} + + for i, v in pairs(self.data) do + table.insert(sections, i) + end + + return sections +end + + --[[ NamedSection - A fixed configuration section defined by its name @@ -616,6 +687,7 @@ function AbstractValue.__init__(self, map, option, ...) self.tag_missing = {} self.deps = {} + self.track_missing = false self.rmempty = false self.default = nil self.size = nil @@ -653,18 +725,18 @@ function AbstractValue.parse(self, section) local cvalue = self:cfgvalue(section) if fvalue and fvalue ~= "" then -- If we have a form value, write it to UCI - fvalue = self:transform(self:validate(fvalue)) + fvalue = self:transform(self:validate(fvalue, section)) if not fvalue then self.tag_invalid[section] = true end - if fvalue and not (fvalue == self:cfgvalue(section)) then + if fvalue and not (fvalue == cvalue) then self:write(section, fvalue) end 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 + elseif self.track_missing and (not fvalue or fvalue ~= cvalue) then + self.tag_missing[section] = true end end end @@ -682,10 +754,10 @@ function AbstractValue.render(self, s, scope) if cond then return string.format( ' %s="%s"', tostring(key), - tostring( val + luci.util.pcdata(tostring( val or scope[key] or (type(self[key]) ~= "function" and self[key]) - or "" ) + or "" )) ) else return ''