Stairs/web/static/assets/ts/index.ts
2017-05-06 15:27:20 +02:00

73 lines
1.6 KiB
TypeScript

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<IPage>({ pattern: '', component: '' });
private progress: KnockoutComputed<void>;
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());