Overall CBI improvements

This commit is contained in:
Steven Barth 2008-11-03 19:20:21 +00:00
parent 14a2e32142
commit e0e58e842d

View file

@ -57,7 +57,14 @@ function load(cbimap, ...)
local upldir = "/lib/uci/upload/" local upldir = "/lib/uci/upload/"
local cbidir = luci.util.libpath() .. "/model/cbi/" local cbidir = luci.util.libpath() .. "/model/cbi/"
local func, err = loadfile(cbimap) or loadfile(cbidir..cbimap..".lua")
assert(luci.fs.stat(cbimap) or luci.fs.stat(cbidir..cbimap..".lua"),
"Model not found!")
local func, err = loadfile(cbimap)
if not func then
func, err = loadfile(cbidir..cbimap..".lua")
end
assert(func, err) assert(func, err)
luci.i18n.loadc("cbi") luci.i18n.loadc("cbi")
@ -287,6 +294,8 @@ function Map.__init__(self, config, ...)
self.parsechain = {self.config} self.parsechain = {self.config}
self.template = "cbi/map" self.template = "cbi/map"
self.apply_on_parse = nil self.apply_on_parse = nil
self.readinput = true
self.uci = uci.cursor() self.uci = uci.cursor()
self.save = true self.save = true
@ -301,6 +310,14 @@ function Map.__init__(self, config, ...)
end end
function Map.formvalue(self, key)
return self.readinput and luci.http.formvalue(key)
end
function Map.formvaluetable(self, key)
return self.readinput and luci.http.formvaluetable(key)
end
function Map.get_scheme(self, sectiontype, option) function Map.get_scheme(self, sectiontype, option)
if not option then if not option then
return self.scheme and self.scheme.sections[sectiontype] return self.scheme and self.scheme.sections[sectiontype]
@ -311,7 +328,7 @@ function Map.get_scheme(self, sectiontype, option)
end end
function Map.submitstate(self) function Map.submitstate(self)
return luci.http.formvalue("cbi.submit") return self:formvalue("cbi.submit")
end end
-- Chain foreign config -- Chain foreign config
@ -319,9 +336,14 @@ function Map.chain(self, config)
table.insert(self.parsechain, config) table.insert(self.parsechain, config)
end end
function Map.state_handler(self, state)
return state
end
-- Use optimized UCI writing -- Use optimized UCI writing
function Map.parse(self) function Map.parse(self, readinput, ...)
Node.parse(self) self.readinput = (readinput ~= false)
Node.parse(self, ...)
if self.save then if self.save then
for i, config in ipairs(self.parsechain) do for i, config in ipairs(self.parsechain) do
@ -365,7 +387,7 @@ function Map.parse(self)
self.state = FORM_NODATA self.state = FORM_NODATA
end end
return self.state return self:state_handler(self.state)
end end
function Map.render(self, ...) function Map.render(self, ...)
@ -422,6 +444,90 @@ function Map.get(self, section, option)
end end
end end
--[[
Compound - Container
]]--
Compound = class(Node)
function Compound.__init__(self, ...)
Node.__init__(self)
self.children = {...}
end
function Compound.parse(self, ...)
local cstate, state = 0, 0
for k, child in ipairs(self.children) do
cstate = child:parse(...)
state = (not state or cstate < state) and cstate or state
end
return state
end
--[[
Delegator - Node controller
]]--
Delegator = class(Node)
function Delegator.__init__(self, ...)
Node.__init__(self, ...)
self.nodes = {}
self.template = "cbi/delegator"
end
function Delegator.state(self, name, node, transitor)
transitor = transitor or self.transistor_linear
local state = {node=node, name=name, transitor=transitor}
assert(instanceof(node, Node), "Invalid node")
assert(not self.nodes[name], "Duplicate entry")
self.nodes[name] = state
self:append(state)
return state
end
function Delegator.get(self, name)
return self.nodes[name]
end
function Delegator.transistor_linear(self, state, cstate)
if cstate > 0 then
for i, child in ipairs(self.children) do
if state == child then
return self.children[i+1]
end
end
else
return state
end
end
function Delegator.parse(self, ...)
local active = self:getactive()
assert(active, "Invalid state")
local cstate = active.node:parse()
self.active = active.transistor(self, active.node, cstate)
if not self.active then
return FORM_DONE
else
self.active:parse(false)
return FROM_PROCEED
end
end
function Delegator.render(self, ...)
self.active.node:render(...)
end
function Delegator.getactive(self)
return self:get(Map.formvalue(self, "cbi.delegated")
or (self.children[1] and self.children[1].name))
end
--[[ --[[
Page - A simple node Page - A simple node
@ -444,10 +550,15 @@ function SimpleForm.__init__(self, config, title, description, data)
self.template = "cbi/simpleform" self.template = "cbi/simpleform"
self.dorender = true self.dorender = true
self.pageaction = false self.pageaction = false
self.readinput = true
end end
function SimpleForm.parse(self, ...) SimpleForm.formvalue = Map.formvalue
if luci.http.formvalue("cbi.submit") then SimpleForm.formvaluetable = Map.formvaluetable
function SimpleForm.parse(self, readinput, ...)
self.readinput = (readinput ~= false)
if self:submitstate() then
Node.parse(self, 1, ...) Node.parse(self, 1, ...)
end end
@ -476,7 +587,7 @@ function SimpleForm.render(self, ...)
end end
function SimpleForm.submitstate(self) function SimpleForm.submitstate(self)
return luci.http.formvalue("cbi.submit") return self:formvalue("cbi.submit")
end end
function SimpleForm.section(self, class, ...) function SimpleForm.section(self, class, ...)
@ -595,7 +706,7 @@ function AbstractSection.parse_optionals(self, section)
self.optionals[section] = {} self.optionals[section] = {}
local field = luci.http.formvalue("cbi.opt."..self.config.."."..section) local field = self.map:formvalue("cbi.opt."..self.config.."."..section)
for k,v in ipairs(self.children) do for k,v in ipairs(self.children) do
if v.optional and not v:cfgvalue(section) then if v.optional and not v:cfgvalue(section) then
if field == v.option then if field == v.option then
@ -624,7 +735,7 @@ function AbstractSection.parse_dynamic(self, section)
end end
local arr = luci.util.clone(self:cfgvalue(section)) local arr = luci.util.clone(self:cfgvalue(section))
local form = luci.http.formvaluetable("cbid."..self.config.."."..section) local form = self.map:formvaluetable("cbid."..self.config.."."..section)
for k, v in pairs(form) do for k, v in pairs(form) do
arr[k] = v arr[k] = v
end end
@ -702,12 +813,16 @@ function Table.__init__(self, form, data, ...)
datasource.config = "table" datasource.config = "table"
self.data = data self.data = data
datasource.formvalue = Map.formvalue
datasource.formvaluetable = Map.formvaluetable
datasource.readinput = true
function datasource.get(self, section, option) function datasource.get(self, section, option)
return data[section] and data[section][option] return data[section] and data[section][option]
end end
function datasource.submitstate(self) function datasource.submitstate(self)
return luci.http.formvalue("cbi.submit") return Map.formvalue(self, "cbi.submit")
end end
function datasource.del(...) function datasource.del(...)
@ -724,7 +839,8 @@ function Table.__init__(self, form, data, ...)
self.anonymous = true self.anonymous = true
end end
function Table.parse(self) function Table.parse(self, readinput)
self.map.readinput = (readinput ~= false)
for i, k in ipairs(self:cfgsections()) do for i, k in ipairs(self:cfgsections()) do
if self.map:submitstate() then if self.map:submitstate() then
Node.parse(self, k) Node.parse(self, k)
@ -776,11 +892,12 @@ function NamedSection.parse(self, novld)
if self.addremove then if self.addremove then
local path = self.config.."."..s local path = self.config.."."..s
if active then -- Remove the section if active then -- Remove the section
if luci.http.formvalue("cbi.rns."..path) and self:remove(s) then if self.map:formvalue("cbi.rns."..path) and self:remove(s) then
self:push_events()
return return
end end
else -- Create and apply default values else -- Create and apply default values
if luci.http.formvalue("cbi.cns."..path) then if self.map:formvalue("cbi.cns."..path) then
self:create(s) self:create(s)
return return
end end
@ -854,7 +971,7 @@ function TypedSection.parse(self, novld)
if self.addremove then if self.addremove then
-- Remove -- Remove
local crval = REMOVE_PREFIX .. self.config local crval = REMOVE_PREFIX .. self.config
local name = luci.http.formvaluetable(crval) local name = self.map:formvaluetable(crval)
for k,v in pairs(name) do for k,v in pairs(name) do
if k:sub(-2) == ".x" then if k:sub(-2) == ".x" then
k = k:sub(1, #k - 2) k = k:sub(1, #k - 2)
@ -882,7 +999,7 @@ function TypedSection.parse(self, novld)
-- Create -- Create
local created local created
local crval = CREATE_PREFIX .. self.config .. "." .. self.sectiontype local crval = CREATE_PREFIX .. self.config .. "." .. self.sectiontype
local name = luci.http.formvalue(crval) local name = self.map:formvalue(crval)
if self.anonymous then if self.anonymous then
if name then if name then
created = self:create() created = self:create()
@ -1034,12 +1151,12 @@ end
-- Return whether this object should be created -- Return whether this object should be created
function AbstractValue.formcreated(self, section) function AbstractValue.formcreated(self, section)
local key = "cbi.opt."..self.config.."."..section local key = "cbi.opt."..self.config.."."..section
return (luci.http.formvalue(key) == self.option) return (self.map:formvalue(key) == self.option)
end end
-- Returns the formvalue for this object -- Returns the formvalue for this object
function AbstractValue.formvalue(self, section) function AbstractValue.formvalue(self, section)
return luci.http.formvalue(self:cbid(section)) return self.map:formvalue(self:cbid(section))
end end
function AbstractValue.additional(self, value) function AbstractValue.additional(self, value)
@ -1403,8 +1520,8 @@ function DynamicList.formvalue(self, section)
local valid = {} local valid = {}
for i, v in ipairs(value) do for i, v in ipairs(value) do
if v and #v > 0 if v and #v > 0
and not luci.http.formvalue("cbi.rle."..section.."."..self.option.."."..i) and not self.map:formvalue("cbi.rle."..section.."."..self.option.."."..i)
and not luci.http.formvalue("cbi.rle."..section.."."..self.option.."."..i..".x") then and not self.map:formvalue("cbi.rle."..section.."."..self.option.."."..i..".x") then
table.insert(valid, v) table.insert(valid, v)
end end
end end
@ -1451,8 +1568,8 @@ end
function FileUpload.formcreated(self, section) function FileUpload.formcreated(self, section)
return AbstractValue.formcreated(self, section) or return AbstractValue.formcreated(self, section) or
luci.http.formvalue("cbi.rlf."..section.."."..self.option) or self.map:formvalue("cbi.rlf."..section.."."..self.option) or
luci.http.formvalue("cbi.rlf."..section.."."..self.option..".x") self.map:formvalue("cbi.rlf."..section.."."..self.option..".x")
end end
function FileUpload.cfgvalue(self, section) function FileUpload.cfgvalue(self, section)
@ -1466,8 +1583,8 @@ end
function FileUpload.formvalue(self, section) function FileUpload.formvalue(self, section)
local val = AbstractValue.formvalue(self, section) local val = AbstractValue.formvalue(self, section)
if val then if val then
if not luci.http.formvalue("cbi.rlf."..section.."."..self.option) and if not self.map:formvalue("cbi.rlf."..section.."."..self.option) and
not luci.http.formvalue("cbi.rlf."..section.."."..self.option..".x") not self.map:formvalue("cbi.rlf."..section.."."..self.option..".x")
then then
return val return val
end end