end
-- Init template engine
- if not track.notemplate then
+ if (c and c.index) or not track.notemplate then
local tpl = require("luci.template")
+ local media = track.mediaurlbase or luci.config.main.mediaurlbase
+ if not pcall(tpl.Template, "themes/%s/header" % fs.basename(media)) then
+ media = nil
+ for name, theme in pairs(luci.config.themes) do
+ if name:sub(1,1) ~= "." and pcall(tpl.Template,
+ "themes/%s/header" % fs.basename(theme)) then
+ media = theme
+ end
+ end
+ assert(media, "No valid theme found")
+ end
+
local viewns = setmetatable({}, {__index=_G})
tpl.context.viewns = viewns
viewns.write = luci.http.write
viewns.translate = function(...) return require("luci.i18n").translate(...) end
viewns.striptags = util.striptags
viewns.controller = luci.http.getenv("SCRIPT_NAME")
- viewns.media = luci.config.main.mediaurlbase
+ viewns.media = media
+ viewns.theme = fs.basename(media)
viewns.resource = luci.config.main.resourcebase
viewns.REQUEST_URI = (luci.http.getenv("SCRIPT_NAME") or "") .. (luci.http.getenv("PATH_INFO") or "")
end
luci.sys.process.setuser(track.setuser)
end
- if c and type(c.target) == "function" then
- context.dispatched = c
+ if c and (c.index or type(c.target) == "function") then
+ ctx.dispatched = c
+ ctx.requested = ctx.requested or ctx.dispatched
+ end
+ if c and c.index then
+ local tpl = require "luci.template"
+
+ if util.copcall(tpl.render, "indexer", {}) then
+ return true
+ end
+ end
+
+ if c and type(c.target) == "function" then
util.copcall(function()
local oldenv = getfenv(c.target)
local module = require(c.module)
-- @param ... Additional parameters passed to the function
function call(name, ...)
local argv = {...}
- return function() return getfenv()[name](unpack(argv)) end
+ return function(...)
+ if #argv > 0 then
+ return getfenv()[name](unpack(argv), ...)
+ else
+ return getfenv()[name](...)
+ end
+ end
end
--- Create a template render dispatching target.
return function(...)
require("luci.cbi")
require("luci.template")
+ local http = require "luci.http"
maps = luci.cbi.load(model, ...)
- local uploads = { }
- local has_upload = false
-
- for _, map in ipairs(maps) do
- if map.upload_fields then
- has_upload = true
- for _, field in ipairs(map.upload_fields) do
- uploads[
- field.config .. '.' ..
- field.section.sectiontype .. '.' ..
- field.option
- ] = true
- end
- end
- end
-
- if has_upload then
- local uci = luci.model.uci.cursor()
- local prm = luci.http.context.request.message.params
- local fd, cbid
-
- luci.http.setfilehandler(
- function( field, chunk, eof )
- if not field then return end
- if field.name and not cbid then
- local c, s, o = field.name:gmatch(
- "cbid%.([^%.]+)%.([^%.]+)%.([^%.]+)"
- )()
-
- if c and s and o then
- local t = uci:get( c, s )
- if t and uploads[c.."."..t.."."..o] then
- local path = "/lib/uci/upload/"..field.name
- fd = io.open(path, "w")
- if fd then
- cbid = field.name
- prm[cbid] = path
- -- else
- -- io.stderr:write("E: " .. err .. "\n")
- end
- end
- end
- end
-
- if field.name == cbid and fd then
- fd:write(chunk)
- end
-
- if eof and fd then
- fd:close()
- fd = nil
- cbid = nil
- end
- end
- )
- end
+ local state = nil
for i, res in ipairs(maps) do
- res:parse()
+ local cstate = res:parse()
+ if not state or cstate < state then
+ state = cstate
+ end
end
+ http.header("X-CBI-State", state or 0)
luci.template.render("cbi/header")
for i, res in ipairs(maps) do
res:render()
return function(...)
require("luci.cbi")
require("luci.template")
+ local http = require "luci.http"
maps = luci.cbi.load(model, ...)
+ local state = nil
+
for i, res in ipairs(maps) do
- res:parse()
+ local cstate = res:parse()
+ if not state or cstate < state then
+ state = cstate
+ end
end
+ http.header("X-CBI-State", state or 0)
luci.template.render("header")
for i, res in ipairs(maps) do
res:render()