From: Jo-Philipp Wich Date: Mon, 22 Nov 2010 00:32:54 +0000 (+0000) Subject: libs/web: combine apply actions of all maps on a page, prevents concurrent XHR X-Git-Tag: 0.10.0~386 X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fluci.git;a=commitdiff_plain;h=9c3db58ee44dfd411336d7d460d0f7a6a10f0ee3 libs/web: combine apply actions of all maps on a page, prevents concurrent XHR --- diff --git a/libs/web/luasrc/cbi.lua b/libs/web/luasrc/cbi.lua index 0fc93b25c..ce995803d 100644 --- a/libs/web/luasrc/cbi.lua +++ b/libs/web/luasrc/cbi.lua @@ -322,10 +322,10 @@ function Map.parse(self, readinput, ...) 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) - return io.popen(cmd) - end + -- This is evaluated by the dispatcher and delegated to the + -- template which in turn fires XHR to perform the actual + -- apply actions. + self.apply_needed = true end -- Reparse sections @@ -358,12 +358,6 @@ end function Map.render(self, ...) self:_run_hooks("on_init") Node.render(self, ...) - if false and self._apply then - local fp = self._apply() - fp:read("*a") - fp:close() - self:_run_hooks("on_apply") - end end -- Creates a child section diff --git a/libs/web/luasrc/dispatcher.lua b/libs/web/luasrc/dispatcher.lua index d10b5c0b5..589cb731f 100644 --- a/libs/web/luasrc/dispatcher.lua +++ b/libs/web/luasrc/dispatcher.lua @@ -718,21 +718,45 @@ local function _cbi(self, ...) end end - local redirect - local pageaction = true http.header("X-CBI-State", state or 0) + if not config.noheader then tpl.render("cbi/header", {state = state}) end + + local redirect + local applymap = false + local pageaction = true + local parsechain = { } + for i, res in ipairs(maps) do - res:render() - if res.pageaction == false then - pageaction = false + if res.apply_needed and res.parsechain then + local c + for _, c in ipairs(res.parsechain) do + parsechain[#parsechain+1] = c + end + applymap = true end + if res.redirect then redirect = redirect or res.redirect end + + if res.pageaction == false then + pageaction = false + end end + + for i, res in ipairs(maps) do + res:render({ + firstmap = (i == 1), + applymap = applymap, + redirect = redirect, + pageaction = pageaction, + parsechain = parsechain + }) + end + if not config.nofooter then tpl.render("cbi/footer", { flow = config, diff --git a/libs/web/luasrc/view/cbi/map.htm b/libs/web/luasrc/view/cbi/map.htm index 640c3d115..406c7e74e 100644 --- a/libs/web/luasrc/view/cbi/map.htm +++ b/libs/web/luasrc/view/cbi/map.htm @@ -18,7 +18,7 @@ $Id$
<% if self.title and #self.title > 0 then %>

<%=self.title%>

<% end %> <% if self.description and #self.description > 0 then %>
<%=self.description%>
<% end %> - <%- if self._apply then cbi_apply_xhr(self.config, self.parsechain, self.redirect) end -%> + <%- if firstmap and applymap then cbi_apply_xhr(self.config, parsechain, redirect) end -%> <%- self:render_children() %>