assert(func, err)
- luci.i18n.loadc("cbi")
- luci.i18n.loadc("uvl")
+ luci.i18n.loadc("base")
local env = {
translate=i18n.translate,
self.template = "cbi/node"
end
--- i18n helper
-function Node._i18n(self, config, section, option, title, description)
-
- -- i18n loaded?
- if type(luci.i18n) == "table" then
-
- local key = config and config:gsub("[^%w]+", "") or ""
-
- if section then key = key .. "_" .. section: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", "" )
+-- hook helper
+function Node._run_hooks(self, ...)
+ local f
+ local r = false
+ for _, f in ipairs(arg) do
+ if type(self[f]) == "function" then
+ self[f](self)
+ r = true
+ end
end
+ return r
end
-- Prepare nodes
function Map.__init__(self, config, ...)
Node.__init__(self, ...)
- Node._i18n(self, config, nil, nil, ...)
self.config = config
self.parsechain = {self.config}
self.validator = luci.uvl.UVL()
self.scheme = self.validator:get_scheme(self.config)
-
end
function Map.formvalue(self, key)
-- Use optimized UCI writing
function Map.parse(self, readinput, ...)
self.readinput = (readinput ~= false)
+ self:_run_hooks("on_parse")
if self:formvalue("cbi.skip") then
self.state = FORM_SKIP
self.uci:save(config)
end
if self:submitstate() and ((not self.proceed and self.flow.autoapply) or luci.http.formvalue("cbi.apply")) then
+ self:_run_hooks("on_before_commit")
for i, config in ipairs(self.parsechain) do
self.uci:commit(config)
-- Refresh data because commit changes section names
self.uci:load(config)
end
+ self:_run_hooks("on_commit", "on_after_commit", "on_before_apply")
if self.apply_on_parse then
self.uci:apply(self.parsechain)
+ self:_run_hooks("on_apply", "on_after_apply")
else
self._apply = function()
local cmd = self.uci:apply(self.parsechain, true)
end
function Map.render(self, ...)
+ self:_run_hooks("on_init")
Node.render(self, ...)
if self._apply then
local fp = self._apply()
fp:read("*a")
fp:close()
+ self:_run_hooks("on_apply")
end
end
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"
end
function Delegator.parse(self, ...)
+ if self.allow_cancel and Map.formvalue(self, "cbi.cancel") then
+ if self:_run_hooks("on_cancel") then
+ return FORM_DONE
+ end
+ end
+
+ if not Map.formvalue(self, "cbi.delg.current") then
+ self:_run_hooks("on_init")
+ end
+
local newcurrent
self.chain = self.chain or self:get_chain()
self.current = self.current or self:get_active()
if not Map.formvalue(self, "cbi.submit") then
return FORM_NODATA
- elseif not newcurrent or not self:get(newcurrent) then
+ elseif stat > FORM_PROCEED
+ and (not newcurrent or not self:get(newcurrent)) then
+ self:_run_hooks("on_done")
return FORM_DONE
else
- self.current = newcurrent
+ self.current = newcurrent or self.current
self.active = self:get(self.current)
if type(self.active) ~= "function" then
self.active:parse(false)
return FORM_SKIP
end
+ if self:formvalue("cbi.cancel") and self:_run_hooks("on_cancel") then
+ return FORM_DONE
+ end
+
if self:submitstate() then
Node.parse(self, 1, ...)
end
if instanceof(class, AbstractValue) then
local obj = class(self.map, self, option, ...)
-
- Node._i18n(obj, self.config, self.section or self.sectiontype, option, ...)
-
self:append(obj)
self.fields[option] = obj
return obj
function NamedSection.__init__(self, map, section, stype, ...)
AbstractSection.__init__(self, map, stype, ...)
- Node._i18n(self, map.config, section, nil, ...)
-- Defaults
self.addremove = false
function TypedSection.__init__(self, map, type, ...)
AbstractSection.__init__(self, map, type, ...)
- Node._i18n(self, map.config, type, nil, ...)
self.template = "cbi/tsection"
self.deps = {}
self.tag_reqerror = {}
self.tag_error = {}
self.deps = {}
+ self.subdeps = {}
--self.cast = "string"
self.track_missing = false
table.insert(self.vallist, tostring(val))
for i, deps in ipairs({...}) do
- table.insert(self.deps, {add = "-"..key, deps=deps})
+ self.subdeps[#self.subdeps + 1] = {add = "-"..key, deps=deps}
end
end