import ko = require('knockout'); import hasher = require('hasher'); import crossroads = require('crossroads'); import NProgress = require('nprogress'); import stairs = require('stairs'); export interface IPage { pattern: string; component: string; } class IndexController { public Page = ko.observable({ pattern: '', component: '' }); private progress: KnockoutComputed; constructor() { crossroads.normalizeFn = crossroads.NORM_AS_OBJECT; this.addPage(':rest*:', 'mode', -Infinity); this.addPage('settings', 'settings'); this.addPage('firmware', 'firmware'); hasher.initialized.add((hash: string) => crossroads.parse(hash)); hasher.changed.add((hash: string) => crossroads.parse(hash)); hasher.init(); NProgress.configure({ parent: '#progress' }); var instance = stairs.Stairs.instance(); var initialProgress = true; this.progress = ko.computed(() => { if (instance.Saving()) NProgress.start() else { // Only show the progress bar initially, not for later refreshes if (initialProgress && instance.Loading()) NProgress.start(); else { NProgress.done(); initialProgress = false; } } }); } private addPage(pattern: string, pageName: string, priority?: number): void { var page: IPage = { pattern: pattern, component: 'page-' + pageName }; ko.components.register(page.component, { require: 'components/' + page.component }); crossroads.addRoute(pattern, () => { this.Page(page); }, priority); } } ko.applyBindings(new IndexController());