Add admin page

This commit is contained in:
Shweelan Samson authored and Zaid Abdulla committed 2018-12-27 01:21:18 -08:00
1 parent 28a6ec950e
commit bb416d25b9
9 files changed
+147 -52

No files matched your search

+54
View File
@@ -0,0 +1,54 @@
"use strict";
import m from "mithril";
const menu = {
view: vnode => {
const active = { [vnode.attrs.page]: "active" };
const tabs = [];
if (window.authorizer.hasAccess("presets", 1)) {
tabs.push(
m(
"li",
{ class: active["presets"] },
m("a", { href: "#!/admin/presets" }, "Presets")
)
);
}
if (window.authorizer.hasAccess("provisions", 1)) {
tabs.push(
m(
"li",
{ class: active["provisions"] },
m("a", { href: "#!/admin/provisions" }, "Provisions")
)
);
}
if (window.authorizer.hasAccess("virtualParameters", 1)) {
tabs.push(
m(
"li",
{ class: active["virtualParameters"] },
m("a", { href: "#!/admin/virtualParameters" }, "Virtual Parameters")
)
);
}
if (window.authorizer.hasAccess("files", 1)) {
tabs.push(
m(
"li",
{ class: active["files"] },
m("a", { href: "#!/admin/files" }, "Files")
)
);
}
return m("nav#side-menu", m("ul", tabs));
}
};
export default menu;
+25 -4
View File
@@ -19,6 +19,8 @@ import * as notifications from "./notifications";
window.authorizer = new Authorizer(window.permissionSets); window.authorizer = new Authorizer(window.permissionSets);
const adminPages = ["presets", "provisions", "virtualParameters", "files"];
let state; let state;
let lastRenderTimestamp = 0; let lastRenderTimestamp = 0;
@@ -77,14 +79,33 @@ function pagify(pageName, page) {
return component; return component;
} }
function redirectAdminPage() {
const component = {
onmatch: () => {
for (const page of adminPages) {
if (window.authorizer.hasAccess(page, 2)) {
m.route.set(`/admin/${page}`);
return null;
}
}
return null;
}
};
return component;
}
m.route(document.body, "/overview", { m.route(document.body, "/overview", {
"/login": pagify("login", loginPage), "/login": pagify("login", loginPage),
"/overview": pagify("overview", overviewPage), "/overview": pagify("overview", overviewPage),
"/devices": pagify("devices", devicesPage), "/devices": pagify("devices", devicesPage),
"/devices/:id": pagify("devices", devicePage), "/devices/:id": pagify("devices", devicePage),
"/faults": pagify("faults", faultsPage), "/faults": pagify("faults", faultsPage),
"/presets": pagify("presets", presetsPage), "/admin": redirectAdminPage(),
"/provisions": pagify("provisions", provisionsPage), "/admin/presets": pagify("presets", presetsPage),
"/virtualParameters": pagify("virtualParameters", virtualParametersPage), "/admin/provisions": pagify("provisions", provisionsPage),
"/files": pagify("files", filesPage) "/admin/virtualParameters": pagify(
"virtualParameters",
virtualParametersPage
),
"/admin/files": pagify("files", filesPage)
}); });
+33
View File
@@ -253,7 +253,40 @@ i {
} }
} }
#content-wrapper {
display: flex;
}
#side-menu {
width: 200px;
& > ul {
padding: 0;
list-style: none;
& > li {
& > a {
display: block;
text-decoration: none;
margin: 5px 0;
padding: 8px;
border-bottom-right-radius: 6px;
border-top-right-radius: 6px;
background-color: var(--color3);
&:hover {
background-color: var(--color4);
color: var(--color3);
}
}
&.active {
font-weight: bold;
}
}
}
}
#content { #content {
flex-grow: 1;
margin: 10px; margin: 10px;
min-height: 250px; min-height: 250px;
} }
+2 -2
View File
@@ -322,13 +322,13 @@ const component = {
function onFilterChanged(filter) { function onFilterChanged(filter) {
const ops = { filter }; const ops = { filter };
if (vnode.attrs.sort) ops.sort = vnode.attrs.sort; if (vnode.attrs.sort) ops.sort = vnode.attrs.sort;
m.route.set("/files", ops); m.route.set(m.route.get(), ops);
} }
function onSortChange(sort) { function onSortChange(sort) {
const ops = { sort }; const ops = { sort };
if (vnode.attrs.filter) ops.filter = vnode.attrs.filter; if (vnode.attrs.filter) ops.filter = vnode.attrs.filter;
m.route.set("/files", ops); m.route.set(m.route.get(), ops);
} }
const sort = vnode.attrs.sort ? memoizedJsonParse(vnode.attrs.sort) : {}; const sort = vnode.attrs.sort ? memoizedJsonParse(vnode.attrs.sort) : {};
+15 -2
View File
@@ -5,18 +5,31 @@ import m from "mithril";
import menu from "./menu"; import menu from "./menu";
import drawerComponent from "./drawer-component"; import drawerComponent from "./drawer-component";
import userMenu from "./user-menu"; import userMenu from "./user-menu";
import adminMenu from "./admin-menu";
import * as overlay from "./overlay"; import * as overlay from "./overlay";
const adminPages = ["presets", "provisions", "virtualParameters", "files"];
const layout = { const layout = {
view: vnode => { view: vnode => {
let sideMenu, group;
if (adminPages.includes(vnode.attrs.page)) {
group = "admin";
sideMenu = m(adminMenu, { page: vnode.attrs.page });
}
return [ return [
m("#header", [ m("#header", [
m("img.logo", { src: "logo.svg" }), m("img.logo", { src: "logo.svg" }),
m(userMenu), m(userMenu),
m(menu, { page: vnode.attrs.page }), m(menu, { page: group || vnode.attrs.page }),
m(drawerComponent) m(drawerComponent)
]), ]),
m("#content", { class: `page-${vnode.attrs.page}` }, [vnode.children]), m(
"#content-wrapper",
sideMenu,
m("#content", { class: `page-${vnode.attrs.page}` }, [vnode.children])
),
overlay.render() overlay.render()
]; ];
} }
+12 -38
View File
@@ -37,44 +37,18 @@ const menu = {
); );
} }
if (window.authorizer.hasAccess("presets", 2)) { const adminPages = ["presets", "provisions", "virtualParameters", "files"];
tabs.push( for (const page of adminPages) {
m( if (window.authorizer.hasAccess(page, 2)) {
"li", tabs.push(
{ class: active["presets"] }, m(
m("a", { href: "#!/presets" }, "Presets") "li",
) { class: active["admin"] },
); m("a", { href: "#!/admin" }, "Admin")
} )
);
if (window.authorizer.hasAccess("provisions", 2)) { break;
tabs.push( }
m(
"li",
{ class: active["provisions"] },
m("a", { href: "#!/provisions" }, "Provisions")
)
);
}
if (window.authorizer.hasAccess("virtualParameters", 2)) {
tabs.push(
m(
"li",
{ class: active["virtualParameters"] },
m("a", { href: "#!/virtualParameters" }, "Virtual Parameters")
)
);
}
if (window.authorizer.hasAccess("files", 2)) {
tabs.push(
m(
"li",
{ class: active["files"] },
m("a", { href: "#!/files" }, "Files")
)
);
} }
return m("nav", m("ul", tabs)); return m("nav", m("ul", tabs));
+2 -2
View File
@@ -360,13 +360,13 @@ const component = {
function onFilterChanged(filter) { function onFilterChanged(filter) {
const ops = { filter }; const ops = { filter };
if (vnode.attrs.sort) ops.sort = vnode.attrs.sort; if (vnode.attrs.sort) ops.sort = vnode.attrs.sort;
m.route.set("/presets", ops); m.route.set(m.route.get(), ops);
} }
function onSortChange(sort) { function onSortChange(sort) {
const ops = { sort }; const ops = { sort };
if (vnode.attrs.filter) ops.filter = vnode.attrs.filter; if (vnode.attrs.filter) ops.filter = vnode.attrs.filter;
m.route.set("/presets", ops); m.route.set(m.route.get(), ops);
} }
const sort = vnode.attrs.sort ? memoizedJsonParse(vnode.attrs.sort) : {}; const sort = vnode.attrs.sort ? memoizedJsonParse(vnode.attrs.sort) : {};
+2 -2
View File
@@ -353,13 +353,13 @@ const component = {
function onFilterChanged(filter) { function onFilterChanged(filter) {
const ops = { filter }; const ops = { filter };
if (vnode.attrs.sort) ops.sort = vnode.attrs.sort; if (vnode.attrs.sort) ops.sort = vnode.attrs.sort;
m.route.set("/provisions", ops); m.route.set(m.route.get(), ops);
} }
function onSortChange(sort) { function onSortChange(sort) {
const ops = { sort }; const ops = { sort };
if (vnode.attrs.filter) ops.filter = vnode.attrs.filter; if (vnode.attrs.filter) ops.filter = vnode.attrs.filter;
m.route.set("/provisions", ops); m.route.set(m.route.get(), ops);
} }
const sort = vnode.attrs.sort ? memoizedJsonParse(vnode.attrs.sort) : {}; const sort = vnode.attrs.sort ? memoizedJsonParse(vnode.attrs.sort) : {};
+2 -2
View File
@@ -363,13 +363,13 @@ const component = {
function onFilterChanged(filter) { function onFilterChanged(filter) {
const ops = { filter }; const ops = { filter };
if (vnode.attrs.sort) ops.sort = vnode.attrs.sort; if (vnode.attrs.sort) ops.sort = vnode.attrs.sort;
m.route.set("/virtualParameters", ops); m.route.set(m.route.get(), ops);
} }
function onSortChange(sort) { function onSortChange(sort) {
const ops = { sort }; const ops = { sort };
if (vnode.attrs.filter) ops.filter = vnode.attrs.filter; if (vnode.attrs.filter) ops.filter = vnode.attrs.filter;
m.route.set("/virtualParameters", ops); m.route.set(m.route.get(), ops);
} }
const sort = vnode.attrs.sort ? memoizedJsonParse(vnode.attrs.sort) : {}; const sort = vnode.attrs.sort ? memoizedJsonParse(vnode.attrs.sort) : {};