Sean Cross
ceb2d55543
We don't need React -- we'll reinvent it ourselves! Signed-off-by: Sean Cross <sean@xobs.io>
112 lines
4.1 KiB
TypeScript
112 lines
4.1 KiB
TypeScript
import { FarpatchWidget, farpatchWidgets } from './interfaces';
|
|
|
|
// TODO: Get the current widget from the address bar, if one exists
|
|
var currentWidget: FarpatchWidget = farpatchWidgets[0];
|
|
var widgetViews: HTMLElement[] = [];
|
|
// var currentWidgetView: HTMLElement = document.getElementById(currentWidgetName + "-view") as HTMLElement;
|
|
|
|
function addToggleSidebarListener(element: HTMLElement) {
|
|
// Hide or show the sidebar. MaterialUI calls this toggling between
|
|
// a "rail" and a "sidebar".
|
|
element.addEventListener('click', function () {
|
|
// Hide or show the main content area
|
|
var main = document.getElementsByTagName("main")[0];
|
|
// Adjust the width of the sidebar as well
|
|
var sideNav = document.querySelectorAll(".sidenav")[0];
|
|
if (main.classList.contains("main-sidebar-rail")) {
|
|
main.classList.remove("main-sidebar-rail");
|
|
sideNav.classList.remove("sidenav-rail");
|
|
} else {
|
|
main.classList.add("main-sidebar-rail");
|
|
sideNav.classList.add("sidenav-rail");
|
|
}
|
|
|
|
}, false);
|
|
}
|
|
|
|
function deactivateWidget(widget: FarpatchWidget) {
|
|
widget.navItem.classList.remove("sidenav-item-active");
|
|
widgetViews[widget.index].classList.remove("main-content-active");
|
|
widget.onBlur(widgetViews[widget.index]);
|
|
}
|
|
|
|
function activateWidget(widget: FarpatchWidget) {
|
|
widget.navItem.classList.add("sidenav-item-active");
|
|
widgetViews[widget.index].classList.add("main-content-active");
|
|
widget.onFocus(widgetViews[widget.index]);
|
|
}
|
|
|
|
function switchToWidget(widget: FarpatchWidget) {
|
|
if (widget === currentWidget) {
|
|
return;
|
|
}
|
|
deactivateWidget(currentWidget);
|
|
currentWidget = widget;
|
|
activateWidget(widget);
|
|
}
|
|
|
|
// On load, add a listener for mouse clicks on the navigation bar.
|
|
function setupNavItem(widget: FarpatchWidget) {
|
|
var w = widget;
|
|
widget.navItem.addEventListener('click', function () {
|
|
switchToWidget(w);
|
|
}, false);
|
|
}
|
|
|
|
document.addEventListener('DOMContentLoaded', function () {
|
|
// Populate the page
|
|
var body = document.getElementsByTagName("body")[0];
|
|
var sidenav = document.createElement("nav");
|
|
var mainView: HTMLElement = document.createElement("main");
|
|
|
|
sidenav.classList.add("sidenav");
|
|
var sidenavList = document.createElement("ul");
|
|
sidenavList.classList.add("sidenav-nav");
|
|
|
|
for (var i = 0; i < farpatchWidgets.length; i++) {
|
|
var widget = farpatchWidgets[i];
|
|
widget.onInit();
|
|
|
|
var widgetView = document.createElement("div");
|
|
widgetView.classList.add("main-content");
|
|
widgetView.id = widget.name + "-view";
|
|
widgetViews.push(widgetView);
|
|
|
|
mainView.appendChild(widgetView);
|
|
sidenavList.appendChild(widget.navItem);
|
|
|
|
setupNavItem(widget);
|
|
}
|
|
|
|
// Add the button to collapse the sidebar
|
|
var sidebarFiller = document.createElement("li");
|
|
sidebarFiller.classList.add("sidenav-item-filler");
|
|
sidenavList.appendChild(sidebarFiller);
|
|
var toggleSidebar = document.createElement("li");
|
|
toggleSidebar.classList.add("sidenav-item");
|
|
toggleSidebar.classList.add("sidenav-item-toggle");
|
|
toggleSidebar.id = "rail-toggle-button";
|
|
var toggleSidebarLink = document.createElement("a");
|
|
toggleSidebarLink.classList.add("sidenav-link");
|
|
var toggleSidebarIcon = document.createElement("span");
|
|
toggleSidebarIcon.classList.add("las");
|
|
toggleSidebarIcon.classList.add("la-3x");
|
|
toggleSidebarIcon.classList.add("la-bars");
|
|
toggleSidebarIcon.classList.add("icon");
|
|
var toggleSidebarText = document.createElement("span");
|
|
toggleSidebarText.classList.add("link-text");
|
|
toggleSidebarText.innerText = "Hide Sidebar";
|
|
toggleSidebarLink.appendChild(toggleSidebarIcon);
|
|
toggleSidebarLink.appendChild(toggleSidebarText);
|
|
toggleSidebar.appendChild(toggleSidebarLink);
|
|
sidenavList.appendChild(toggleSidebar);
|
|
addToggleSidebarListener(toggleSidebar);
|
|
|
|
sidenav.appendChild(sidenavList);
|
|
body.appendChild(sidenav);
|
|
body.appendChild(mainView);
|
|
|
|
currentWidget = farpatchWidgets[0];
|
|
activateWidget(farpatchWidgets[0]);
|
|
}, false);
|