luci-base: add client based view actions

Introduce a new view() target for CBI dispatch nodes, as long with the
required template and plumbing work in luci.js to allow requiring view
classes.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
This commit is contained in:
Jo-Philipp Wich 2019-04-01 15:38:00 +02:00
parent 5b7924c808
commit 2beb9fa16f
3 changed files with 29 additions and 12 deletions

View File

@ -582,19 +582,19 @@
for (var i = 0; ptr && i < parts.length - 1; i++)
ptr = ptr[parts[i]];
if (!ptr)
L.error('DependencyError',
'Parent "%s" for class "%s" is missing',
parts.slice(0, i).join('.'), name);
if (ptr)
ptr[parts[i]] = instance;
classes[name] = ptr[parts[i]] = instance;
classes[name] = instance;
return instance;
});
};
/* Request class file */
classes[name] = Request.get(url, { cache: true }).then(compileClass);
classes[name] = Request.get(url, { cache: true })
.then(compileClass)
.catch(L.error);
return classes[name];
},
@ -942,18 +942,18 @@
__name__: 'LuCI.View',
__init__: function() {
var mc = document.getElementById('maincontent');
var vp = document.getElementById('view');
L.dom.content(mc, E('div', { 'class': 'spinning' }, _('Loading view…')));
L.dom.content(vp, E('div', { 'class': 'spinning' }, _('Loading view…')));
return Promise.resolve(this.load())
.then(L.bind(this.render, this))
.then(L.bind(function(nodes) {
var mc = document.getElementById('maincontent');
var vp = document.getElementById('view');
L.dom.content(mc, nodes);
L.dom.append(mc, this.addFooter());
}, this));
L.dom.content(vp, nodes);
L.dom.append(vp, this.addFooter());
}, this)).catch(L.error);
},
load: function() {},

View File

@ -857,6 +857,15 @@ function template(name)
end
local _view = function(self, ...)
require "luci.template".render("view", { view = self.view })
end
function view(name)
return {type = "view", view = name, target = _view}
end
local function _cbi(self, ...)
local cbi = require "luci.cbi"
local tpl = require "luci.template"

View File

@ -0,0 +1,8 @@
<%+header%>
<div id="view">
<div class="spinning"><%:Loading view…%></div>
<script type="text/javascript">L.require('view.<%=view%>');</script>
</div>
<%+footer%>