Vulcan/packages/telescope-posts/lib/routes.js
2015-05-19 18:29:54 +09:00

242 lines
5.3 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* The Posts.controllers namespace
* @namespace Posts.controllers
*/
Posts.controllers = {};
/**
* Controller for all posts lists
*/
Posts.controllers.list = RouteController.extend({
template: "posts_list_controller",
onBeforeAction: function () {
var showViewsNav = (typeof this.showViewsNav === 'undefined') ? true : this.showViewsNav;
if (showViewsNav) {
this.render('posts_list_top', {to: 'postsListTop'});
}
this.next();
},
data: function () {
var terms = {
view: this.view,
limit: this.params.limit || Settings.get('postsPerPage', 10)
};
// console.log('----------------- router running');
// note: the post list controller template will handle all subscriptions, so we just need to pass in the terms
return {
terms: terms
};
},
getTitle: function () {
return i18n.t(this.view);
},
getDescription: function () {
if (Router.current().route.getName() === 'posts_default') { // return site description on root path
return Settings.get('description');
} else {
return i18n.t(_.findWhere(Telescope.menuItems.get("viewsMenu"), {label: this.view}).description);
}
},
fastRender: true
});
var getDefaultViewController = function () {
var defaultView = Settings.get('defaultView', 'top');
// if view we got from settings is available in Posts.views object, use it
if (!!Posts.controllers[defaultView]) {
return Posts.controllers[defaultView];
} else {
return Posts.controllers.top;
}
};
// wrap in startup block to make sure Settings collection is defined
Meteor.startup(function () {
Posts.controllers.default = getDefaultViewController().extend({
getTitle: function () {
var title = Settings.get('title', 'Telescope');
var tagline = Settings.get('tagline');
var fullTitle = !!tagline ? title + ' ' + tagline : title ;
return fullTitle;
}
});
});
/**
* Controller for top view
*/
Posts.controllers.top = Posts.controllers.list.extend({
view: 'top'
});
/**
* Controller for new view
*/
Posts.controllers.new = Posts.controllers.list.extend({
view: 'new'
});
/**
* Controller for best view
*/
Posts.controllers.best = Posts.controllers.list.extend({
view: 'best'
});
/**
* Controller for pending view
*/
Posts.controllers.pending = Posts.controllers.list.extend({
view: 'pending'
});
/**
* Controller for scheduled view
*/
Posts.controllers.scheduled = Posts.controllers.list.extend({
view: 'scheduled'
});
/**
* Controller for single post page
*/
Posts.controllers.page = RouteController.extend({
template: 'post_page',
waitOn: function() {
this.postSubscription = coreSubscriptions.subscribe('singlePost', this.params._id);
this.postUsersSubscription = coreSubscriptions.subscribe('postUsers', this.params._id);
this.commentSubscription = coreSubscriptions.subscribe('commentsList', {view: 'postComments', postId: this.params._id});
},
post: function() {
return Posts.findOne(this.params._id);
},
getTitle: function () {
if (!!this.post())
return this.post().title;
},
onBeforeAction: function() {
if (! this.post()) {
if (this.postSubscription.ready()) {
this.render('not_found');
} else {
this.render('loading');
}
} else {
this.next();
}
},
onRun: function() {
var sessionId = Meteor.default_connection && Meteor.default_connection._lastSessionId ? Meteor.default_connection._lastSessionId : null;
Meteor.call('increasePostViews', this.params._id, sessionId);
this.next();
},
data: function() {
return this.post();
},
fastRender: true
});
Meteor.startup(function () {
Router.route('/', {
name: 'posts_default',
controller: Posts.controllers.default
});
Router.route('/top/:limit?', {
name: 'posts_top',
controller: Posts.controllers.top
});
// New
Router.route('/new/:limit?', {
name: 'posts_new',
controller: Posts.controllers.new
});
// Best
Router.route('/best/:limit?', {
name: 'posts_best',
controller: Posts.controllers.best
});
// Pending
Router.route('/pending/:limit?', {
name: 'posts_pending',
controller: Posts.controllers.pending
});
// Scheduled
Router.route('/scheduled/:limit?', {
name: 'posts_scheduled',
controller: Posts.controllers.scheduled
});
// Post Page
Router.route('/posts/:_id', {
name: 'post_page',
controller: Posts.controllers.page
});
Router.route('/posts/:_id/comment/:commentId', {
name: 'post_page_comment',
controller: Posts.controllers.page,
onAfterAction: function () {
// TODO: scroll to comment position
}
});
// Post Edit
Router.route('/posts/:_id/edit', {
name: 'post_edit',
template: 'post_edit',
waitOn: function () {
return [
coreSubscriptions.subscribe('singlePost', this.params._id),
coreSubscriptions.subscribe('allUsersAdmin')
];
},
data: function() {
return {
postId: this.params._id,
post: Posts.findOne(this.params._id)
};
},
fastRender: true
});
// Post Submit
Router.route('/submit', {
name: 'post_submit',
template: 'post_submit',
waitOn: function () {
return coreSubscriptions.subscribe('allUsersAdmin');
}
});
});