este-library-oldschool
Version:
Library for github.com/steida/este.git
149 lines (133 loc) • 3.5 kB
JavaScript
// Generated by github.com/steida/coffee2closure 900.1.18
/**
@fileoverview este.labs.App.
*/
goog.provide('este.labs.App');
goog.require('este.labs.app.Route');
goog.require('goog.asserts');
goog.require('goog.events.EventHandler');
/**
@param {Element} element
@param {este.labs.History} history
@param {este.labs.events.RoutingClickHandler} routingClickHandler
@param {este.labs.app.PagesContainer} pagesContainer
@param {este.labs.app.UrlLoader} urlLoader
@constructor
*/
este.labs.App = function(element, history, routingClickHandler, pagesContainer, urlLoader) {
this.element = element;
this.history = history;
this.routingClickHandler = routingClickHandler;
this.pagesContainer = pagesContainer;
this.urlLoader = urlLoader;
/**
@type {goog.events.EventHandler}
@protected
*/
this.eventHandler = new goog.events.EventHandler(this);
/**
@type {Array}
@protected
*/
this.routesPages = [];
}
/**
@type {Element}
@protected
*/
este.labs.App.prototype.element = null;
/**
@type {este.labs.History}
@protected
*/
este.labs.App.prototype.history = null;
/**
@type {este.labs.events.RoutingClickHandler}
@protected
*/
este.labs.App.prototype.routingClickHandler = null;
/**
@type {este.labs.app.PagesContainer}
@protected
*/
este.labs.App.prototype.pagesContainer = null;
/**
@param {string} path
@return {este.labs.app.Route}
*/
este.labs.App.prototype.route = function(path) {
return new este.labs.app.Route(path, this);
};
/**
@param {este.labs.app.Route} route
@param {este.labs.app.Page} page
*/
este.labs.App.prototype.add = function(route, page) {
return this.routesPages.push({
route: route,
page: page
});
};
/**
Start app.
*/
este.labs.App.prototype.start = function() {
this.registerEvents();
this.history.setEnabled(true);
return this.load(this.history.getToken());
};
/**
@param {string} url
*/
este.labs.App.prototype.load = function(url) {
var routePage;
routePage = goog.array.find(this.routesPages, function(routePage) {
return routePage.route.match(url);
});
goog.asserts.assert(!!routePage, "este.labs.App: Route for url '" + url + "' not found.");
if (!routePage) {
return null;
}
return this.urlLoader.load(url, function() {
return routePage.page.load(routePage.route.params(url));
}).then(this.onLoadFulfilled.bind(this, url, routePage), this.onLoadRejected.bind(this, url));
};
/**
@param {string} url
@param {Object} routePage
@param {*} value
@protected
*/
este.labs.App.prototype.onLoadFulfilled = function(url, routePage, value) {
this.pagesContainer.show(routePage.page, this.element, value);
this.history.setToken(url);
};
/**
@param {string} url
@param {*} reason
*/
este.labs.App.prototype.onLoadRejected = function(url, reason) {};
/**
@protected
*/
este.labs.App.prototype.registerEvents = function() {
this.eventHandler.listen(this.history, goog.history.EventType.NAVIGATE, this.onHistoryNavigate);
return this.eventHandler.listen(this.routingClickHandler, goog.events.EventType.CLICK, this.onRoutingClickHandlerClick);
};
/**
@param {goog.history.Event} e
@protected
*/
este.labs.App.prototype.onHistoryNavigate = function(e) {
if (!e.isNavigation) {
return;
}
return this.load(e.token);
};
/**
@param {goog.events.BrowserEvent} e
@protected
*/
este.labs.App.prototype.onRoutingClickHandlerClick = function(e) {
return this.load(e.target.getAttribute('href'));
};