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!
2021-02-25 13:28:07 +00:00
https://github.com/jerrykuku/luci-theme-argon/issues
2020-04-15 14:07:13 +00:00
2021-02-25 13:28:07 +00:00
luci-theme-material:
2020-04-15 14:07:13 +00:00
Copyright 2015 Lutty Yang < lutty @ wcan . in >
2021-02-25 13:28:07 +00:00
Argon Theme
https://demos.creative-tim.com/argon-dashboard/index.html
2020-04-15 14:07:13 +00:00
Licensed to the public under the Apache License 2.0
-%>
< %
2021-02-25 13:28:07 +00:00
local sys = require "luci.sys"
2020-04-15 14:07:13 +00:00
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
2021-02-25 13:28:07 +00:00
local fs = require "nixio.fs"
2020-04-15 14:07:13 +00:00
local nutil = require "nixio.util"
2021-02-25 13:28:07 +00:00
local uci = require 'luci.model.uci'.cursor()
2020-04-15 14:07:13 +00:00
-- send as HTML5
http.prepare_content("text/html")
2021-02-25 13:28:07 +00:00
math.randomseed(os.time())
-- Custom settings
local mode = 'normal'
local dark_css = fs.readfile('/www/luci-static/argon/css/dark.css')
local bar_color = '#5e72e4'
local primary, dark_primary, blur_radius, blur_radius_dark, blur_opacity
if fs.access('/etc/config/argon') then
primary = uci:get_first('argon', 'global', 'primary')
dark_primary = uci:get_first('argon', 'global', 'dark_primary')
blur_radius = uci:get_first('argon', 'global', 'blur')
blur_radius_dark = uci:get_first('argon', 'global', 'blur_dark')
blur_opacity = uci:get_first('argon', 'global', 'transparency')
blur_opacity_dark = uci:get_first('argon', 'global', 'transparency_dark')
mode = uci:get_first('argon', 'global', 'mode')
bar_color = mode == 'dark' and dark_primary or primary
end
-- Brand name
local brand_name = boardinfo.hostname or "?"
2020-04-15 14:07:13 +00:00
-%>
<!DOCTYPE html>
< html lang = "<%=luci.i18n.context.lang%>" >
< head >
2021-02-25 13:28:07 +00:00
< 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" / >
< meta name = "format-detection" content = "telephone=no, email=no" / >
< meta name = "apple-mobile-web-app-capable" content = "yes" >
< meta name = "mobile-web-app-capable" content = "yes" >
< meta name = "x5-fullscreen" content = "true" >
< meta name = "full-screen" content = "yes" >
< meta name = "x5-page-mode" content = "app" >
< meta name = "browsermode" content = "application" >
< meta name = "msapplication-tap-highlight" content = "no" >
< meta name = "msapplication-TileColor" content = "<%=bar_color%>" >
< meta name = "application-name" content = "<%=striptags( (boardinfo.hostname or " ? " ) ) % > - LuCI">
< meta name = "apple-mobile-web-app-title" content = "<%=striptags( (boardinfo.hostname or " ? " ) ) % > - LuCI">
< link rel = "apple-touch-icon" sizes = "60x60" href = "<%=media%>/icon/apple-icon-60x60.png" >
< link rel = "apple-touch-icon" sizes = "72x72" href = "<%=media%>/icon/apple-icon-72x72.png" >
< link rel = "apple-touch-icon" sizes = "144x144" href = "<%=media%>/icon/apple-icon-144x144.png" >
< link rel = "icon" type = "image/png" sizes = "192x192" href = "<%=media%>/icon/android-icon-192x192.png" >
< link rel = "icon" type = "image/png" sizes = "32x32" href = "<%=media%>/icon/favicon-32x32.png" >
< link rel = "icon" type = "image/png" sizes = "96x96" href = "<%=media%>/icon/favicon-96x96.png" >
< link rel = "icon" type = "image/png" sizes = "16x16" href = "<%=media%>/icon/favicon-16x16.png" >
< link rel = "manifest" href = "<%=media%>/icon/manifest.json" >
< meta name = "msapplication-TileColor" content = "<%=bar_color%>" >
< meta name = "msapplication-TileImage" content = "<%=media%>/icon/ms-icon-144x144.png" >
< meta name = "theme-color" content = "<%=bar_color%>" >
< link rel = "stylesheet" href = "<%=media%>/css/cascade.css?v=<%=math.random(1,100000)%>" >
< style title = "text/css" >
< % if mode == 'normal' then %>
@media (prefers-color-scheme: dark) {
< %=dark_css%>
}
< % elseif mode == 'dark' then %>
< %=dark_css%>
< % end -%>
< % if fs.access('/etc/config/argon') then %>
:root {
--primary: < %=primary%>;
--dark-primary: < %=dark_primary%>;
--blur-radius:< %=blur_radius%>px;
--blur-opacity:< %=blur_opacity%>;
--blur-radius-dark:< %=blur_radius_dark%>px;
--blur-opacity-dark:< %=blur_opacity_dark%>;
}
< % end -%>
< / style >
< link rel = "shortcut icon" href = "<%=media%>/favicon.ico" >
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 -%>
2021-02-25 13:28:07 +00:00
< script src = "<%=media%>/js/polyfill.min.js" > < / script >
< script src = "<%=url('admin/translations', luci.i18n.context.lang)%>?v=2.2.4" > < / script >
< script src = "<%=resource%>/cbi.js?v=2.2.4" > < / script >
< script src = "<%=resource%>/luci.js?v=2.2.4" > < / script >
< script src = "<%=media%>/js/jquery.min.js?v=2.2.4" > < / script >
< script type = "text/javascript" > / / < ! [ C D A T A [
function EF() { return L.dom.create.apply(L.dom, arguments) }
(function() {
2020-04-15 14:07:13 +00:00
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 }));
}
2021-02-25 13:28:07 +00:00
return children.sort(function(a, b) {
2020-04-15 14:07:13 +00:00
return ((a.order || 1000) - (b.order || 1000));
});
}
function render_mainmenu(tree, url, level) {
var l = (level || 0) + 1,
2021-02-25 13:28:07 +00:00
ul = EF('ul', { 'class': level ? 'slide-menu' : 'nav' }),
children = get_children(tree);
2020-04-15 14:07:13 +00:00
if (children.length == 0 || l > 2)
2021-02-25 13:28:07 +00:00
return EF([]);
2020-04-15 14:07:13 +00:00
for (var i = 0; i < children.length ; i + + ) {
var submenu = render_mainmenu(children[i], url + '/' + children[i].name, l),
2021-02-25 13:28:07 +00:00
hasChildren = submenu.children.length;
ul.appendChild(EF('li', { 'class': hasChildren ? 'slide' : null }, [
EF('a', {
2020-04-15 14:07:13 +00:00
'href': hasChildren ? '#' : L.url(url, children[i].name),
2021-02-25 13:28:07 +00:00
'class': hasChildren ? 'menu' : null,
'data-title': hasChildren ? children[i].title.replace(" ", "_") : children[i].title.replace(" ", "_"),
}, [ _(children[i].title) ]),
2020-04-15 14:07:13 +00:00
submenu
]));
2020-09-07 09:00:15 +00:00
}
if (l == 1) {
var container = document.querySelector('#mainmenu');
container.appendChild(ul);
container.style.display = '';
}
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'),
2021-02-25 13:28:07 +00:00
children = get_children(tree);
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);
2021-02-25 13:28:07 +00:00
ul.appendChild(EF('li', {}, [
EF('a', {
2020-09-07 09:00:15 +00:00
'href': L.url(children[i].name),
'class': isActive ? 'active' : null
2021-02-25 13:28:07 +00:00
}, [ _(children[i].title) ])
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'),
2021-02-25 13:28:07 +00:00
l = (level || 0) + 1,
ul = EF('ul', { 'class': 'tabs' }),
children = get_children(tree),
activeNode = null;
2020-09-07 09:00:15 +00:00
if (children.length == 0)
2021-02-25 13:28:07 +00:00
return EF([]);
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),
2021-02-25 13:28:07 +00:00
activeClass = isActive ? ' active' : '',
className = 'tabmenu-item-%s %s'.format(children[i].name, activeClass);
ul.appendChild(EF('li', { 'class': className }, [
EF('a', { 'href': L.url(url, children[i].name) }, [ _(children[i].title) ] )
2020-09-07 09:00:15 +00:00
]));
if (isActive)
activeNode = children[i];
}
container.appendChild(ul);
container.style.display = '';
if (activeNode)
container.appendChild(render_tabmenu(activeNode, url + '/' + activeNode.name, l));
return ul;
}
2021-02-25 13:28:07 +00:00
document.addEventListener('luci-loaded', function(ev) {
var tree = < %= luci.http.write_json(luci.dispatcher.menu_json() or {}) %>,
node = tree,
url = '';
render_modemenu(tree);
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];
}
if (node)
render_tabmenu(node, url);
2020-09-07 09:00:15 +00:00
}
2021-02-25 13:28:07 +00:00
});
})();
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" >
2021-02-25 13:28:07 +00:00
< a class = "brand" href = "#" > < %=brand_name%>< / 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 >
2021-02-25 13:28:07 +00:00
< a class = "brand" href = "#" > < %=brand_name%>< / a >
2020-09-07 09:00:15 +00:00
< 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 >
2021-02-25 13:28:07 +00:00
< p > < %:There is no password set on this router. Please configure a root password to protect the web interface.%>
2020-04-15 14:07:13 +00:00
< / 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 >