szurubooru/public_html/js/Router.js

95 lines
2.5 KiB
JavaScript
Raw Normal View History

2014-08-31 23:22:56 +02:00
var App = App || {};
2014-10-02 00:30:25 +02:00
App.Router = function(pathJs, _, jQuery, promise, util, appState, presenterManager) {
2014-08-31 23:22:56 +02:00
var root = '#/';
2014-09-16 17:29:11 +02:00
var previousLocation = window.location.href;
2014-08-31 23:22:56 +02:00
injectRoutes();
function navigateToMainPage() {
window.location.href = root;
2014-09-08 22:02:28 +02:00
}
2014-08-31 23:22:56 +02:00
function navigate(url) {
window.location.href = url;
2014-09-08 22:02:28 +02:00
}
2014-08-31 23:22:56 +02:00
function navigateInplace(url) {
if ('replaceState' in history) {
history.replaceState('', '', url);
pathJs.dispatch(document.location.hash);
} else {
navigate(url);
}
}
2014-08-31 23:22:56 +02:00
function start() {
2014-09-08 22:02:28 +02:00
pathJs.listen();
}
2014-08-31 23:22:56 +02:00
function injectRoutes() {
2014-09-07 19:49:11 +02:00
inject('#/home', 'homePresenter');
2014-09-07 09:30:48 +02:00
inject('#/login', 'loginPresenter');
inject('#/logout', 'logoutPresenter');
inject('#/register', 'registrationPresenter');
2014-09-07 19:49:11 +02:00
inject('#/upload', 'postUploadPresenter');
inject('#/password-reset(/:token)', 'userActivationPresenter', {operation: 'passwordReset'});
inject('#/activate(/:token)', 'userActivationPresenter', {operation: 'activation'});
2014-09-07 19:49:11 +02:00
inject('#/users(/:searchArgs)', 'userListPresenter');
inject('#/user/:userName(/:tab)', 'userPresenter');
inject('#/posts(/:searchArgs)', 'postListPresenter');
2014-10-05 10:09:02 +02:00
inject('#/post(/:postNameOrId)(/:searchArgs)', 'postPresenter');
2014-10-04 14:06:44 +02:00
inject('#/comments(/:searchArgs)', 'globalCommentListPresenter');
2014-09-07 19:49:11 +02:00
inject('#/tags(/:searchArgs)', 'tagListPresenter');
2014-10-07 21:15:26 +02:00
inject('#/tag(/:tagName)', 'tagPresenter');
2014-09-07 19:49:11 +02:00
inject('#/help', 'helpPresenter');
setRoot('#/home');
2014-09-08 22:02:28 +02:00
}
2014-08-31 23:22:56 +02:00
function setRoot(newRoot) {
root = newRoot;
2014-09-08 22:02:28 +02:00
pathJs.root(newRoot);
}
2014-08-31 23:22:56 +02:00
function inject(path, presenterName, additionalParams) {
2014-09-08 22:02:28 +02:00
pathJs.map(path).to(function() {
2014-09-25 19:22:31 +02:00
if (util.isExitConfirmationEnabled()) {
if (window.location.href === previousLocation) {
return;
} else {
if (window.confirm('Are you sure you want to leave this page? Data will be lost.')) {
util.disableExitConfirmation();
} else {
window.location.href = previousLocation;
return;
}
}
}
2014-10-02 00:30:25 +02:00
//abort every operation that can be executed
promise.abortAll();
2014-09-25 19:22:31 +02:00
previousLocation = window.location.href;
var finalParams = _.extend(
this.params,
additionalParams,
{previousRoute: pathJs.routes.previous});
2014-09-17 22:37:49 +02:00
var presenter = App.DI.get(presenterName);
presenter.name = presenterName;
presenterManager.switchContentPresenter(presenter, finalParams);
2014-08-31 23:22:56 +02:00
});
2014-09-08 22:02:28 +02:00
}
2014-08-31 23:22:56 +02:00
return {
start: start,
navigate: navigate,
navigateInplace: navigateInplace,
2014-08-31 23:22:56 +02:00
navigateToMainPage: navigateToMainPage,
};
};
2014-10-02 00:30:25 +02:00
App.DI.registerSingleton('router', ['pathJs', '_', 'jQuery', 'promise', 'util', 'appState', 'presenterManager'], App.Router);