/** * 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('post_list_top', {to: 'postListTop'}); } 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.menus.get("viewsMenu"), {label: this.view}).description); } }, fastRender: true }); var getDefaultViewController = function () { var defaultView = Settings.get('defaultView', 'top'); return Posts.controllers[defaultView]; }; // 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'); } }); });