2020-04-15 14:07:13 +00:00
< %#
Argon is a clean HTML5 theme for LuCI. It is based on luci-theme-material Argon Template
luci-theme-argon
2020-09-07 09:00:15 +00:00
Copyright 2020 Jerrykuku < jerrykuku @ qq . com >
2020-04-15 14:07:13 +00:00
Have a bug? Please create an issue here on GitHub!
https://github.com/jerrykuku/luci-theme-argon/issues
luci-theme-material:
Copyright 2015 Lutty Yang < lutty @ wcan . in >
Agron Theme
https://demos.creative-tim.com/argon-dashboard/index.html
Licensed to the public under the Apache License 2.0
-%>
< %
local sys = require "luci.sys"
local util = require "luci.util"
local http = require "luci.http"
local disp = require "luci.dispatcher"
local boardinfo = util.ubus("system", "board")
local node = disp.context.dispatched
local fs = require "nixio.fs"
local nutil = require "nixio.util"
-- send as HTML5
http.prepare_content("text/html")
math.randomseed(os.time())
-%>
<!DOCTYPE html>
< html lang = "<%=luci.i18n.context.lang%>" >
< head >
< meta charset = "utf-8" >
< title >
< %=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %>
- LuCI< / title >
< meta content = "width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name = "viewport" / >
2020-09-07 09:00:15 +00:00
< meta name = "format-detection" content = "telephone=no, email=no" / >
2020-04-15 14:07:13 +00:00
< meta name = "apple-mobile-web-app-capable" content = "yes" >
< meta name = "mobile-web-app-capable" content = "yes" >
2020-09-07 09:00:15 +00:00
< meta name = "x5-fullscreen" content = "true" >
< meta name = "full-screen" content = "yes" >
< meta name = "x5-page-mode" content = "app" >
< meta name = "browsermode" content = "application" >
2020-04-15 14:07:13 +00:00
< meta name = "msapplication-tap-highlight" content = "no" >
2020-09-07 09:00:15 +00:00
< meta name = "msapplication-TileColor" content = "#5e72e4" >
2020-04-15 14:07:13 +00:00
< meta name = "application-name" content = "<%=striptags( (boardinfo.hostname or " ? " ) ) % > - LuCI">
< meta name = "apple-mobile-web-app-title" content = "<%=striptags( (boardinfo.hostname or " ? " ) ) % > - LuCI">
2020-09-07 09:00:15 +00:00
< link rel = "shortcut icon" type = "image/png" href = "<%=media%>/icon/favicon.png" >
< link rel = "manifest" href = "<%=media%>/icon/manifest.json" >
< meta name = "msapplication-TileColor" content = "#5e72e4" >
< meta name = "theme-color" content = "#5e72e4" >
< link rel = "stylesheet" href = "<%=media%>/css/cascade.css?v=<%=math.random(1,100000)%>" >
< % if nixio.fs.access("/etc/dark") then %>
< link rel = "stylesheet" href = "<%=media%>/css/dark.css?v=<%=math.random(1,100000)%>" >
< % end -%>
2020-04-15 14:07:13 +00:00
< % if node and node.css then %>
< link rel = "stylesheet" href = "<%=resource%>/<%=node.css%>" >
< % end -%>
< % if css then %>
< style title = "text/css" >
< %=css %>
< / style >
< % end -%>
< script src = "<%=url('admin/translations', luci.i18n.context.lang)%><%# ?v=PKG_VERSION %>" > < / script >
2020-09-07 09:00:15 +00:00
< script src = "<%=resource%>/cbi.js<%# ?v=PKG_VERSION %>" > < / script >
< script src = "<%=resource%>/luci.js<%# ?v=PKG_VERSION %>" > < / script >
< script src = "<%=media%>/js/jquery.min.js<%# ?v=PKG_VERSION %>" > < / script >
2020-04-15 14:07:13 +00:00
< script type = "text/javascript" > / / < ! [ C D A T A [
(function () {
function get_children(node) {
var children = [];
for (var k in node.children) {
if (!node.children.hasOwnProperty(k))
continue;
if (!node.children[k].satisfied)
continue;
if (!node.children[k].hasOwnProperty('title'))
continue;
children.push(Object.assign(node.children[k], { name: k }));
}
return children.sort(function (a, b) {
return ((a.order || 1000) - (b.order || 1000));
});
}
function render_mainmenu(tree, url, level) {
var l = (level || 0) + 1,
ul = E('ul', { 'class': level ? 'slide-menu' : 'nav' }),
children = get_children(tree);
if (children.length == 0 || l > 2)
return E([]);
for (var i = 0; i < children.length ; i + + ) {
var submenu = render_mainmenu(children[i], url + '/' + children[i].name, l),
hasChildren = submenu.children.length;
2020-09-07 09:00:15 +00:00
isLogout = (children[i].name == 'logout');
2020-04-15 14:07:13 +00:00
ul.appendChild(E('li', { 'class': hasChildren ? 'slide' : isLogout ? 'lg' : null }, [
E('a', {
'href': hasChildren ? '#' : L.url(url, children[i].name),
2020-09-07 09:00:15 +00:00
'class': hasChildren ? 'menu' : isLogout ? "logout" : null,
'data-title': children[i].title.replace(" ", "_"),
2020-04-15 14:07:13 +00:00
}, [_(children[i].title)]),
submenu
]));
2020-09-07 09:00:15 +00:00
}
2020-04-15 14:07:13 +00:00
2020-09-07 09:00:15 +00:00
if (l == 1) {
var container = document.querySelector('#mainmenu');
2020-04-15 14:07:13 +00:00
2020-09-07 09:00:15 +00:00
container.appendChild(ul);
container.style.display = '';
}
2020-04-15 14:07:13 +00:00
2020-09-07 09:00:15 +00:00
return ul;
}
2020-04-15 14:07:13 +00:00
function render_modemenu(tree) {
2020-09-07 09:00:15 +00:00
var ul = document.querySelector('#modemenu'),
children = get_children(tree);
2020-04-15 14:07:13 +00:00
2020-09-07 09:00:15 +00:00
for (var i = 0; i < children.length ; i + + ) {
var isActive = (L.env.requestpath.length ? children[i].name == L.env.requestpath[0] : i == 0);
2020-04-15 14:07:13 +00:00
2020-09-07 09:00:15 +00:00
ul.appendChild(E('li', {}, [
E('a', {
'href': L.url(children[i].name),
'class': isActive ? 'active' : null
}, [_(children[i].title)])
]));
2020-04-15 14:07:13 +00:00
2020-09-07 09:00:15 +00:00
if (isActive)
render_mainmenu(children[i], children[i].name);
}
if (ul.children.length > 1)
ul.style.display = '';
2020-04-15 14:07:13 +00:00
}
2020-09-07 09:00:15 +00:00
function render_tabmenu(tree, url, level) {
var container = document.querySelector('#tabmenu'),
l = (level || 0) + 1,
ul = E('ul', { 'class': 'tabs' }),
children = get_children(tree),
activeNode = null;
2020-04-15 14:07:13 +00:00
2020-09-07 09:00:15 +00:00
if (children.length == 0)
return E([]);
2020-04-15 14:07:13 +00:00
2020-09-07 09:00:15 +00:00
for (var i = 0; i < children.length ; i + + ) {
var isActive = (L.env.dispatchpath[l + 2] == children[i].name),
activeClass = isActive ? ' active' : '',
className = 'tabmenu-item-%s %s'.format(children[i].name, activeClass);
2020-04-15 14:07:13 +00:00
2020-09-07 09:00:15 +00:00
ul.appendChild(E('li', { 'class': className }, [
E('a', { 'href': L.url(url, children[i].name) }, [_(children[i].title)])
]));
2020-04-15 14:07:13 +00:00
2020-09-07 09:00:15 +00:00
if (isActive)
activeNode = children[i];
}
2020-04-15 14:07:13 +00:00
2020-09-07 09:00:15 +00:00
container.appendChild(ul);
container.style.display = '';
2020-04-15 14:07:13 +00:00
2020-09-07 09:00:15 +00:00
if (activeNode)
container.appendChild(render_tabmenu(activeNode, url + '/' + activeNode.name, l));
2020-04-15 14:07:13 +00:00
2020-09-07 09:00:15 +00:00
return ul;
}
2020-04-15 14:07:13 +00:00
2020-09-07 09:00:15 +00:00
document.addEventListener('luci-loaded', function (ev) {
var tree = < %= luci.http.write_json(luci.dispatcher.menu_json() or { }) %>,
node = tree,
url = '';
2020-04-15 14:07:13 +00:00
2020-09-07 09:00:15 +00:00
render_modemenu(tree);
2020-04-15 14:07:13 +00:00
2020-09-07 09:00:15 +00:00
if (L.env.dispatchpath.length >= 3) {
for (var i = 0; i < 3 & & node ; i + + ) {
node = node.children[L.env.dispatchpath[i]];
url = url + (url ? '/' : '') + L.env.dispatchpath[i];
}
2020-04-15 14:07:13 +00:00
2020-09-07 09:00:15 +00:00
if (node)
render_tabmenu(node, url);
2020-04-15 14:07:13 +00:00
}
});
}) ();
//]]>< / script >
< / head >
< body
class="lang_< %=luci.i18n.context.lang%> < % if node then %>< %= striptags( node.title ) %>< % end %> < % if luci.dispatcher.context.authsession then %>logged-in< % end %>"
data-page="< %= table.concat(disp.context.requestpath, "-") %>">
< div class = "main" >
< div class = "main-left" id = "mainmenu" style = "display:none" >
< div class = "sidenav-header d-flex align-items-center" >
2020-09-07 09:00:15 +00:00
< a class = "brand" href = "#" > < %=boardinfo.hostname or "?"%>< / a >
2020-04-15 14:07:13 +00:00
< div class = "ml-auto" >
<!-- Sidenav toggler -->
< div class = "sidenav-toggler d-none d-xl-block active" data-action = "sidenav-unpin"
data-target="#sidenav-main">
< div class = "sidenav-toggler-inner" >
< i class = "sidenav-toggler-line" > < / i >
< i class = "sidenav-toggler-line" > < / i >
< i class = "sidenav-toggler-line" > < / i >
< / div >
< / div >
< / div >
< / div >
< / div >
< div class = "main-right" >
< header class = "bg-primary" >
< div class = "fill" >
< div class = "container" >
< a class = "showSide" > < / a >
2020-09-07 09:00:15 +00:00
< a class = "brand" href = "#" > < %=boardinfo.hostname or "?"%> ™< / a >
< div class = "status" id = "indicators" >
< span id = "xhr_poll_status" style = "display:none" onclick = "XHR.running() ? XHR.halt() : XHR.run()" >
< span class = "label success" id = "xhr_poll_status_on" > < span class = "mobile-hide" > < %:Auto Refresh%>< / span > < %:on%>< / span >
< span class = "label" id = "xhr_poll_status_off" style = "display:none" > < span class = "mobile-hide" > < %:Auto Refresh%>< / span > < %:off%>< / span >
< / span >
< / div >
2020-04-15 14:07:13 +00:00
< / div >
< / div >
< / header >
< div class = "darkMask" > < / div >
< div id = "maincontent" >
< div class = "container" >
< %- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") then -%>
< div class = "alert-message error" >
< h4 > < %:No password set!%>< / h4 >
< p > < %:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%>
< / p >
< % if disp.lookup("admin/system/admin") then %>
< div class = "right" > < a class = "btn"
href="< %=url("admin/system/admin")%>">< %:Go to password configuration...%>< / a > < / div >
< % end %>
< / div >
< %- end -%>
< noscript >
< div class = "alert-message error" >
< h4 > < %:JavaScript required!%>< / h4 >
< p > < %:You must enable JavaScript in your browser or LuCI will not work properly.%>< / p >
< / div >
< / noscript >
2020-09-07 09:00:15 +00:00
< div id = "tabmenu" style = "display:none" > < / div >