mirror of
https://github.com/vale981/Vulcan
synced 2025-03-06 18:11:40 -05:00
paginating user profile on the client
This commit is contained in:
parent
01916ef0ee
commit
6dee86463a
6 changed files with 109 additions and 121 deletions
|
@ -69,6 +69,13 @@
|
||||||
<td>{{formatDate createdAt "MM/DD/YYYY, HH:mm"}}</td>
|
<td>{{formatDate createdAt "MM/DD/YYYY, HH:mm"}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
|
{{#if hasMorePosts}}
|
||||||
|
<tr>
|
||||||
|
<td colspan="2">
|
||||||
|
<a class="posts-more more-button grid-module" href="#"><span>{{i18n "Load more"}}</span></a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{{/if}}
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -87,6 +94,13 @@
|
||||||
<td>{{formatDate votedAt "MM/DD/YYYY, HH:mm"}}</td>
|
<td>{{formatDate votedAt "MM/DD/YYYY, HH:mm"}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
|
{{#if hasMoreUpvotedPosts}}
|
||||||
|
<tr>
|
||||||
|
<td colspan="2">
|
||||||
|
<a class="upvotedposts-more more-button grid-module" href="#"><span>{{i18n "Load more"}}</span></a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{{/if}}
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -105,6 +119,13 @@
|
||||||
<td>{{formatDate votedAt "MM/DD/YYYY, HH:mm"}}</td>
|
<td>{{formatDate votedAt "MM/DD/YYYY, HH:mm"}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
|
{{#if hasMoreDownvotedPosts}}
|
||||||
|
<tr>
|
||||||
|
<td colspan="2">
|
||||||
|
<a class="downvoted-more more-button grid-module" href="#"><span>{{i18n "Load more"}}</span></a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{{/if}}
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -125,6 +146,13 @@
|
||||||
<td>{{formatDate createdAt "MM/DD/YYYY, HH:mm"}}</td>
|
<td>{{formatDate createdAt "MM/DD/YYYY, HH:mm"}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
|
{{#if hasMoreComments}}
|
||||||
|
<tr>
|
||||||
|
<td colspan="2">
|
||||||
|
<a class="comments-more more-button grid-module" href="#"><span>{{i18n "Load more"}}</span></a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{{/if}}
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,10 @@
|
||||||
|
Template[getTemplate('user_profile')].created = function () {
|
||||||
|
Session.set('postsShown', 5);
|
||||||
|
Session.set('upvotedPostsShown', 5);
|
||||||
|
Session.set('downvotedPostsShown', 5);
|
||||||
|
Session.set('commentsShown', 5);
|
||||||
|
}
|
||||||
|
|
||||||
Template[getTemplate('user_profile')].helpers({
|
Template[getTemplate('user_profile')].helpers({
|
||||||
avatarUrl: function() {
|
avatarUrl: function() {
|
||||||
return getAvatarUrl(this);
|
return getAvatarUrl(this);
|
||||||
|
@ -23,7 +30,10 @@ Template[getTemplate('user_profile')].helpers({
|
||||||
return getGitHubName(this);
|
return getGitHubName(this);
|
||||||
},
|
},
|
||||||
posts: function () {
|
posts: function () {
|
||||||
return Posts.find({userId: this._id});
|
return Posts.find({userId: this._id}, {limit: Session.get('postsShown')});
|
||||||
|
},
|
||||||
|
hasMorePosts: function () {
|
||||||
|
return Posts.find({userId: this._id}).count() > Session.get('postsShown');
|
||||||
},
|
},
|
||||||
upvotedPosts: function () {
|
upvotedPosts: function () {
|
||||||
// extend upvotes with each upvoted post
|
// extend upvotes with each upvoted post
|
||||||
|
@ -32,9 +42,12 @@ Template[getTemplate('user_profile')].helpers({
|
||||||
var post = Posts.findOne(item.itemId);
|
var post = Posts.findOne(item.itemId);
|
||||||
return _.extend(item, post);
|
return _.extend(item, post);
|
||||||
});
|
});
|
||||||
return extendedVotes
|
return _.first(extendedVotes, Session.get('upvotedPostsShown'));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
hasMoreUpvotedPosts: function () {
|
||||||
|
return !!this.votes.upvotedPosts && this.votes.upvotedPosts.length > Session.get('upvotedPostsShown');
|
||||||
|
},
|
||||||
downvotedPosts: function () {
|
downvotedPosts: function () {
|
||||||
// extend upvotes with each upvoted post
|
// extend upvotes with each upvoted post
|
||||||
if(!!this.votes.downvotedPosts){
|
if(!!this.votes.downvotedPosts){
|
||||||
|
@ -42,11 +55,14 @@ Template[getTemplate('user_profile')].helpers({
|
||||||
var post = Posts.findOne(item.itemId);
|
var post = Posts.findOne(item.itemId);
|
||||||
return _.extend(item, post);
|
return _.extend(item, post);
|
||||||
});
|
});
|
||||||
return extendedVotes
|
return _.first(extendedVotes, Session.get('downvotedPostsShown'));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
hasMoreDownvotedPosts: function () {
|
||||||
|
return !!this.votes.downvotedPosts && this.votes.downvotedPosts.length > Session.get('downvotedPostsShown');
|
||||||
|
},
|
||||||
comments: function () {
|
comments: function () {
|
||||||
var comments = Comments.find({userId: this._id})
|
var comments = Comments.find({userId: this._id}, {limit: Session.get('commentsShown')});
|
||||||
if(!!comments){
|
if(!!comments){
|
||||||
// extend comments with each commented post
|
// extend comments with each commented post
|
||||||
var extendedComments = comments.map(function (comment) {
|
var extendedComments = comments.map(function (comment) {
|
||||||
|
@ -57,6 +73,9 @@ Template[getTemplate('user_profile')].helpers({
|
||||||
});
|
});
|
||||||
return extendedComments
|
return extendedComments
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
hasMoreComments: function () {
|
||||||
|
return Comments.find({userId: this._id}).count() > Session.get('commentsShown');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -64,5 +83,25 @@ Template[getTemplate('user_profile')].events({
|
||||||
'click .invite-link': function(e, instance){
|
'click .invite-link': function(e, instance){
|
||||||
Meteor.call('inviteUser', instance.data.user._id);
|
Meteor.call('inviteUser', instance.data.user._id);
|
||||||
throwError('Thanks, user has been invited.')
|
throwError('Thanks, user has been invited.')
|
||||||
|
},
|
||||||
|
'click .posts-more': function (e) {
|
||||||
|
e.preventDefault();
|
||||||
|
var postsShown = Session.get('postsShown');
|
||||||
|
Session.set('postsShown', postsShown + 10);
|
||||||
|
},
|
||||||
|
'click .upvotedposts-more': function (e) {
|
||||||
|
e.preventDefault();
|
||||||
|
var upvotedPostsShown = Session.get('upvotedPostsShown');
|
||||||
|
Session.set('upvotedPostsShown', upvotedPostsShown + 10);
|
||||||
|
},
|
||||||
|
'click .downvotedposts-more': function (e) {
|
||||||
|
e.preventDefault();
|
||||||
|
var downvotedPostsShown = Session.get('downvotedPostsShown');
|
||||||
|
Session.set('downvotedPostsShown', downvotedPostsShown + 10);
|
||||||
|
},
|
||||||
|
'click .comments-more': function (e) {
|
||||||
|
e.preventDefault();
|
||||||
|
var commentsShown = Session.get('commentsShown');
|
||||||
|
Session.set('commentsShown', commentsShown + 10);
|
||||||
}
|
}
|
||||||
});
|
});
|
|
@ -427,8 +427,7 @@ CommentPageController = FastRender.RouteController.extend({
|
||||||
UserPageController = FastRender.RouteController.extend({
|
UserPageController = FastRender.RouteController.extend({
|
||||||
waitOn: function() {
|
waitOn: function() {
|
||||||
return [
|
return [
|
||||||
coreSubscriptions.subscribe('singleUser', this.params._idOrSlug),
|
coreSubscriptions.subscribe('userProfile', this.params._idOrSlug)
|
||||||
coreSubscriptions.subscribe('userData', this.params._idOrSlug)
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
data: function() {
|
data: function() {
|
||||||
|
|
|
@ -1,71 +0,0 @@
|
||||||
// buildEmailTemplate = function (htmlContent) {
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// var emailProperties = {
|
|
||||||
// headerColor: getSetting('headerColor', '#444444'),
|
|
||||||
// buttonColor: getSetting('buttonColor', '#DD3416'),
|
|
||||||
// siteName: getSetting('title'),
|
|
||||||
// tagline: getSetting('tagline'),
|
|
||||||
// siteUrl: getSiteUrl(),
|
|
||||||
// body: htmlContent,
|
|
||||||
// unsubscribe: '',
|
|
||||||
// accountLink: getSiteUrl()+'account',
|
|
||||||
// footer: getSetting('emailFooter'),
|
|
||||||
// logoUrl: getSetting('logoUrl'),
|
|
||||||
// logoHeight: getSetting('logoHeight'),
|
|
||||||
// logoWidth: getSetting('logoWidth')
|
|
||||||
// }
|
|
||||||
|
|
||||||
// var emailHTML = getEmailTemplate('emailWrapper')(emailProperties);
|
|
||||||
|
|
||||||
// var inlinedHTML = Async.runSync(function(done) {
|
|
||||||
// Juice.juiceContent(emailHTML, {
|
|
||||||
// url: getSiteUrl(),
|
|
||||||
// removeStyleTags: false
|
|
||||||
// }, function (error, result) {
|
|
||||||
// done(null, result);
|
|
||||||
// });
|
|
||||||
// }).result;
|
|
||||||
|
|
||||||
// var doctype = '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">'
|
|
||||||
|
|
||||||
// return doctype+inlinedHTML;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// sendEmail = function(to, subject, html, text){
|
|
||||||
|
|
||||||
// // TODO: limit who can send emails
|
|
||||||
// // TODO: fix this error: Error: getaddrinfo ENOTFOUND
|
|
||||||
|
|
||||||
// var from = getSetting('defaultEmail', 'noreply@example.com');
|
|
||||||
// var siteName = getSetting('title');
|
|
||||||
// var subject = '['+siteName+'] '+subject;
|
|
||||||
|
|
||||||
// if (typeof text == 'undefined'){
|
|
||||||
// // Auto-generate text version if it doesn't exist. Has bugs, but should be good enough.
|
|
||||||
// var text = HtmlToText.fromString(html, {
|
|
||||||
// wordwrap: 130
|
|
||||||
// });
|
|
||||||
// }
|
|
||||||
|
|
||||||
// console.log('//////// sending email…');
|
|
||||||
// console.log('from: '+from);
|
|
||||||
// console.log('to: '+to);
|
|
||||||
// console.log('subject: '+subject);
|
|
||||||
// // console.log('html: '+html);
|
|
||||||
// // console.log('text: '+text);
|
|
||||||
|
|
||||||
// Email.send({
|
|
||||||
// from: from,
|
|
||||||
// to: to,
|
|
||||||
// subject: subject,
|
|
||||||
// text: text,
|
|
||||||
// html: html
|
|
||||||
// });
|
|
||||||
// };
|
|
||||||
|
|
||||||
// buildAndSendEmail = function (to, subject, template, properties) {
|
|
||||||
// var html = buildEmailTemplate(getEmailTemplate(template)(properties));
|
|
||||||
// sendEmail (to, subject, buildEmailTemplate(html));
|
|
||||||
// }
|
|
|
@ -43,7 +43,6 @@ buildEmailNotification = function (notification) {
|
||||||
}
|
}
|
||||||
|
|
||||||
newPostNotification = function(post, excludedIDs){
|
newPostNotification = function(post, excludedIDs){
|
||||||
|
|
||||||
var excludedIDs = typeof excludedIDs == 'undefined' ? [] : excludedIDs;
|
var excludedIDs = typeof excludedIDs == 'undefined' ? [] : excludedIDs;
|
||||||
var p = getPostProperties(post);
|
var p = getPostProperties(post);
|
||||||
var subject = p.postAuthorName+' has created a new post: '+p.postTitle;
|
var subject = p.postAuthorName+' has created a new post: '+p.postTitle;
|
||||||
|
|
|
@ -23,54 +23,48 @@ Meteor.publish('currentUser', function() {
|
||||||
|
|
||||||
// Publish a single user
|
// Publish a single user
|
||||||
|
|
||||||
Meteor.publish('singleUser', function(userIdOrSlug) {
|
Meteor.publish('userProfile', function(userIdOrSlug) {
|
||||||
if(canViewById(this.userId)){
|
if(canViewById(this.userId)){
|
||||||
var options = isAdminById(this.userId) ? {limit: 1} : {limit: 1, fields: privacyOptions};
|
var options = isAdminById(this.userId) ? {limit: 1} : {limit: 1, fields: privacyOptions};
|
||||||
var findById = Meteor.users.find(userIdOrSlug, options);
|
var findById = Meteor.users.findOne(userIdOrSlug);
|
||||||
var findBySlug = Meteor.users.find({slug: userIdOrSlug}, options);
|
var findBySlug = Meteor.users.findOne({slug: userIdOrSlug});
|
||||||
// if we find something when treating the argument as an ID, return that; else assume it's a slug
|
var user = typeof findById !== 'undefined' ? findById : findBySlug;
|
||||||
return findById.count() ? findById : findBySlug;
|
|
||||||
|
// user's own posts
|
||||||
|
var userPosts = Posts.find({userId: user._id});
|
||||||
|
var postsIds = _.pluck(userPosts.fetch(), '_id');
|
||||||
|
|
||||||
|
// user's own comments
|
||||||
|
var userComments = Comments.find({userId: user._id});
|
||||||
|
var commentsIds = _.pluck(userComments.fetch(), '_id');
|
||||||
|
|
||||||
|
// add upvoted posts ids
|
||||||
|
var postsIds = postsIds.concat(_.pluck(user.votes.upvotedPosts, 'itemId'));
|
||||||
|
|
||||||
|
// add upvoted comments ids
|
||||||
|
var commentsIds = commentsIds.concat(_.pluck(user.votes.upvotedComments, 'itemId'));
|
||||||
|
|
||||||
|
// add downvoted posts ids
|
||||||
|
var postsIds = postsIds.concat(_.pluck(user.votes.downvotedPosts, 'itemId'));
|
||||||
|
|
||||||
|
// add downvoted comments ids
|
||||||
|
var commentsIds = commentsIds.concat(_.pluck(user.votes.downvotedComments, 'itemId'));
|
||||||
|
|
||||||
|
// add commented posts ids
|
||||||
|
if(!!userComments.count()){ // there might not be any comments
|
||||||
|
var commentedPostIds = _.pluck(userComments.fetch(), 'postId');
|
||||||
|
var postsIds = postsIds.concat(commentedPostIds);
|
||||||
|
}
|
||||||
|
|
||||||
|
return [
|
||||||
|
Meteor.users.find({_id: user._id}, options),
|
||||||
|
Comments.find({_id: {$in: commentsIds}}),
|
||||||
|
Posts.find({_id: {$in: postsIds}})
|
||||||
|
];
|
||||||
}
|
}
|
||||||
return [];
|
return [];
|
||||||
});
|
});
|
||||||
|
|
||||||
Meteor.publish('userData', function(userIdOrSlug) {
|
|
||||||
var findById = Meteor.users.findOne(userIdOrSlug);
|
|
||||||
var findBySlug = Meteor.users.findOne({slug: userIdOrSlug});
|
|
||||||
var user = typeof findById !== 'undefined' ? findById : findBySlug;
|
|
||||||
|
|
||||||
// user's own posts
|
|
||||||
var userPosts = Posts.find({userId: user._id});
|
|
||||||
var postsIds = _.pluck(userPosts.fetch(), '_id');
|
|
||||||
|
|
||||||
// user's own comments
|
|
||||||
var userComments = Comments.find({userId: user._id});
|
|
||||||
var commentsIds = _.pluck(userComments.fetch(), '_id');
|
|
||||||
|
|
||||||
// add upvoted posts ids
|
|
||||||
var postsIds = postsIds.concat(_.pluck(user.votes.upvotedPosts, 'itemId'));
|
|
||||||
|
|
||||||
// add upvoted comments ids
|
|
||||||
var commentsIds = commentsIds.concat(_.pluck(user.votes.upvotedComments, 'itemId'));
|
|
||||||
|
|
||||||
// add downvoted posts ids
|
|
||||||
var postsIds = postsIds.concat(_.pluck(user.votes.downvotedPosts, 'itemId'));
|
|
||||||
|
|
||||||
// add downvoted comments ids
|
|
||||||
var commentsIds = commentsIds.concat(_.pluck(user.votes.downvotedComments, 'itemId'));
|
|
||||||
|
|
||||||
// add commented posts ids
|
|
||||||
if(!!userComments.count()){ // there might not be any comments
|
|
||||||
var commentedPostIds = _.pluck(userComments.fetch(), 'postId');
|
|
||||||
var postsIds = postsIds.concat(commentedPostIds);
|
|
||||||
}
|
|
||||||
|
|
||||||
return [
|
|
||||||
Comments.find({_id: {$in: commentsIds}}),
|
|
||||||
Posts.find({_id: {$in: postsIds}})
|
|
||||||
];
|
|
||||||
});
|
|
||||||
|
|
||||||
// Publish authors of the current post and its comments
|
// Publish authors of the current post and its comments
|
||||||
|
|
||||||
Meteor.publish('postUsers', function(postId) {
|
Meteor.publish('postUsers', function(postId) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue