mirror of
https://github.com/NodeBB/NodeBB.git
synced 2026-07-05 23:57:29 +02:00
Merge branch 'master' of github.com:designcreateplay/NodeBB
This commit is contained in:
@@ -9,6 +9,7 @@
|
||||
"age": "Age",
|
||||
"joined": "Joined",
|
||||
"lastonline": "Last Online",
|
||||
"profile": "Profile",
|
||||
"profile_views": "Profile views",
|
||||
"reputation": "Reputation",
|
||||
"posts": "Posts",
|
||||
|
||||
@@ -13,6 +13,7 @@ define(['forum/accountheader'], function(header) {
|
||||
app.enterRoom('user/' + theirid);
|
||||
|
||||
app.addCommasToNumbers();
|
||||
app.makeNumbersHumanReadable($('.account .human-readable-number'));
|
||||
$('.user-recent-posts img').addClass('img-responsive');
|
||||
|
||||
var followBtn = $('#follow-btn');
|
||||
@@ -88,11 +89,7 @@ define(['forum/accountheader'], function(header) {
|
||||
return;
|
||||
}
|
||||
|
||||
translator.get('global:' + data.status, function(translated) {
|
||||
onlineStatus.find('span span').text(translated);
|
||||
onlineStatus.find('i').attr('class', 'fa fa-circle status ' + data.status);
|
||||
});
|
||||
|
||||
onlineStatus.attr('class', 'account-online-status fa fa-circle status ' + data.status);
|
||||
};
|
||||
|
||||
return Account;
|
||||
|
||||
@@ -42,7 +42,7 @@ define(['forum/accountheader', 'uploader'], function(header, uploader) {
|
||||
$('.account-username-box a').each(function(index) {
|
||||
$(this).attr('href', $(this).attr('href').replace(oldslug, data.userslug));
|
||||
});
|
||||
$('.account-username a:first-child').html(userData.username);
|
||||
|
||||
$('.account-username-box').attr('data-userslug', data.userslug);
|
||||
|
||||
$('#user-profile-link').attr('href', config.relative_path + '/user/' + data.userslug);
|
||||
|
||||
@@ -2,43 +2,58 @@ define(function() {
|
||||
var AccountHeader = {};
|
||||
|
||||
AccountHeader.init = function() {
|
||||
var yourid = templates.get('yourid'),
|
||||
theirid = templates.get('theirid');
|
||||
|
||||
|
||||
AccountHeader.createMenu();
|
||||
|
||||
var editLink = $('#editLink');
|
||||
var settingsLink = $('#settingsLink');
|
||||
var favouritesLink = $('#favouritesLink');
|
||||
hideLinks();
|
||||
|
||||
if (yourid === "0" || yourid !== theirid) {
|
||||
editLink.hide();
|
||||
settingsLink.hide();
|
||||
favouritesLink.hide();
|
||||
}
|
||||
|
||||
jQuery('.account-sub-links span a').removeClass('bold').each(function() {
|
||||
var href = this.getAttribute('href');
|
||||
if (window.location.href.indexOf(href) !== -1) {
|
||||
jQuery(this).addClass('bold');
|
||||
return false;
|
||||
}
|
||||
});
|
||||
selectActivePill();
|
||||
}
|
||||
|
||||
AccountHeader.createMenu = function() {
|
||||
var userslug = $('.account-username-box').attr('data-userslug');
|
||||
|
||||
var html = '<div class="account-sub-links inline-block pull-right">\
|
||||
<span id="settingsLink" class="pull-right"><a href="' + RELATIVE_PATH + '/user/' + userslug + '/settings">[[user:settings]]</a></span>\
|
||||
<span id="favouritesLink" class="pull-right"><a href="' + RELATIVE_PATH + '/user/' + userslug + '/favourites">[[user:favourites]]</a></span>\
|
||||
<span class="pull-right"><a href="' + RELATIVE_PATH + '/user/' + userslug + '/followers">[[user:followers]]</a></span>\
|
||||
<span class="pull-right"><a href="' + RELATIVE_PATH + '/user/' + userslug + '/following">[[user:following]]</a></span>\
|
||||
<span id="editLink" class="pull-right"><a href="' + RELATIVE_PATH + '/user/' + userslug + '/edit">[[user:edit]]</a></span>\
|
||||
</div>'
|
||||
var html ='<ul class="nav nav-tabs account-sub-links">\
|
||||
<li id="settingsLink"><a href="' + RELATIVE_PATH + '/user/' + userslug + '/settings">[[user:settings]]</a></li>\
|
||||
<li id="favouritesLink"><a href="' + RELATIVE_PATH + '/user/' + userslug + '/favourites">[[user:favourites]]</a></li>\
|
||||
<li><a href="' + RELATIVE_PATH + '/user/' + userslug + '/posts">[[global:posts]]</a></li>\
|
||||
<li><a href="' + RELATIVE_PATH + '/user/' + userslug + '/followers">[[user:followers]]</a></li>\
|
||||
<li><a href="' + RELATIVE_PATH + '/user/' + userslug + '/following">[[user:following]]</a></li>\
|
||||
<li id="editLink"><a href="' + RELATIVE_PATH + '/user/' + userslug + '/edit">[[user:edit]]</a></li>\
|
||||
<li id="profile"><a href="' + RELATIVE_PATH + '/user/' + userslug + '">[[user:profile]]</a></li>\
|
||||
</ul>';
|
||||
|
||||
|
||||
translator.translate(html, function(translatedHtml) {
|
||||
$('.account-username-box').append(translatedHtml);
|
||||
selectActivePill();
|
||||
hideLinks();
|
||||
});
|
||||
}
|
||||
|
||||
function hideLinks() {
|
||||
var yourid = templates.get('yourid'),
|
||||
theirid = templates.get('theirid');
|
||||
|
||||
var editLink = $('#editLink');
|
||||
var settingsLink = $('#settingsLink');
|
||||
var favouritesLink = $('#favouritesLink');
|
||||
|
||||
if (parseInt(yourid, 10) === 0 || parseInt(yourid, 10) !== parseInt(theirid, 10)) {
|
||||
editLink.hide();
|
||||
settingsLink.hide();
|
||||
favouritesLink.hide();
|
||||
}
|
||||
}
|
||||
|
||||
function selectActivePill() {
|
||||
$('.account-sub-links li').removeClass('active').each(function() {
|
||||
var href = $(this).find('a').attr('href');
|
||||
if (window.location.href.indexOf(href) !== -1) {
|
||||
$(this).addClass('active');
|
||||
return false;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
52
public/src/forum/accountposts.js
Normal file
52
public/src/forum/accountposts.js
Normal file
@@ -0,0 +1,52 @@
|
||||
define(['forum/accountheader'], function(header) {
|
||||
var AccountPosts = {},
|
||||
loadingMore = false;
|
||||
|
||||
AccountPosts.init = function() {
|
||||
header.init();
|
||||
|
||||
app.enableInfiniteLoading(function() {
|
||||
if(!loadingMore) {
|
||||
loadMore();
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
function loadMore() {
|
||||
loadingMore = true;
|
||||
socket.emit('posts.loadMoreUserPosts', {
|
||||
uid: $('.account-username-box').attr('data-uid'),
|
||||
after: $('.user-favourite-posts').attr('data-nextstart')
|
||||
}, function(err, data) {
|
||||
if(err) {
|
||||
return app.alertError(err.message);
|
||||
}
|
||||
|
||||
if (data.posts && data.posts.length) {
|
||||
onTopicsLoaded(data.posts);
|
||||
$('.user-favourite-posts').attr('data-nextstart', data.nextStart);
|
||||
}
|
||||
|
||||
loadingMore = false;
|
||||
});
|
||||
}
|
||||
|
||||
function onTopicsLoaded(posts) {
|
||||
var html = templates.prepare(templates['accountposts'].blocks['posts']).parse({
|
||||
posts: posts
|
||||
});
|
||||
|
||||
translator.translate(html, function(translatedHTML) {
|
||||
|
||||
$('#category-no-topics').remove();
|
||||
|
||||
html = $(translatedHTML);
|
||||
$('.user-favourite-posts').append(html);
|
||||
$('span.timeago').timeago();
|
||||
app.createUserTooltips();
|
||||
app.makeNumbersHumanReadable(html.find('.human-readable-number'));
|
||||
});
|
||||
}
|
||||
|
||||
return AccountPosts;
|
||||
});
|
||||
@@ -296,7 +296,7 @@ define(['composer', 'forum/pagination'], function(composer, pagination) {
|
||||
set_follow_state = function(state, quiet) {
|
||||
if (state && !followEl.hasClass('btn-success')) {
|
||||
followEl.addClass('btn-success');
|
||||
followEl[0].title = 'You are currently receiving updates to this topic';
|
||||
followEl.attr('title', 'You are currently receiving updates to this topic');
|
||||
if (!quiet) {
|
||||
app.alert({
|
||||
alert_id: 'topic_follow',
|
||||
@@ -308,7 +308,7 @@ define(['composer', 'forum/pagination'], function(composer, pagination) {
|
||||
}
|
||||
} else if (!state && followEl.hasClass('btn-success')) {
|
||||
followEl.removeClass('btn-success');
|
||||
followEl[0].title = 'Be notified of new replies in this topic';
|
||||
followEl.attr('title', 'Be notified of new replies in this topic');
|
||||
if (!quiet) {
|
||||
app.alert({
|
||||
alert_id: 'topic_follow',
|
||||
@@ -325,23 +325,23 @@ define(['composer', 'forum/pagination'], function(composer, pagination) {
|
||||
set_follow_state(state, true);
|
||||
});
|
||||
|
||||
if (followEl[0]) {
|
||||
followEl[0].addEventListener('click', function() {
|
||||
socket.emit('topics.follow', tid, function(err, state) {
|
||||
if(err) {
|
||||
return app.alert({
|
||||
type: 'danger',
|
||||
alert_id: 'topic_follow',
|
||||
title: 'Please Log In',
|
||||
message: 'Please register or log in in order to subscribe to this topic',
|
||||
timeout: 5000
|
||||
});
|
||||
}
|
||||
followEl.on('click', function() {
|
||||
socket.emit('topics.follow', tid, function(err, state) {
|
||||
if(err) {
|
||||
return app.alert({
|
||||
type: 'danger',
|
||||
alert_id: 'topic_follow',
|
||||
title: 'Please Log In',
|
||||
message: 'Please register or log in in order to subscribe to this topic',
|
||||
timeout: 5000
|
||||
});
|
||||
}
|
||||
|
||||
set_follow_state(state);
|
||||
});
|
||||
}, false);
|
||||
}
|
||||
set_follow_state(state);
|
||||
});
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
enableInfiniteLoading();
|
||||
|
||||
@@ -438,16 +438,22 @@ define(['composer', 'forum/pagination'], function(composer, pagination) {
|
||||
pid: pid,
|
||||
room_id: app.currentRoom
|
||||
});
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
$('#post-container').on('click', '.flag', function() {
|
||||
var pid = $(this).parents('.post-row').attr('data-pid');
|
||||
bootbox.confirm('Are you sure you want to flag this post?', function(confirm) {
|
||||
if (confirm) {
|
||||
var pid = $(this).parents('.post-row').attr('data-pid');
|
||||
|
||||
socket.emit('posts.flag', pid, function(err) {
|
||||
if(err) {
|
||||
return app.alertError(err.message);
|
||||
socket.emit('posts.flag', pid, function(err) {
|
||||
if(err) {
|
||||
return app.alertError(err.message);
|
||||
}
|
||||
app.alertSuccess('This post has been flagged for moderation.');
|
||||
});
|
||||
}
|
||||
app.alertSuccess('This post has been flagged for moderation.');
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -109,13 +109,13 @@ define(function() {
|
||||
|
||||
function loadMoreUsers() {
|
||||
var set = '';
|
||||
if (active === 'latest' || active === 'users') {
|
||||
if (active === 'latest') {
|
||||
set = 'users:joindate';
|
||||
} else if (active === 'sort-posts') {
|
||||
set = 'users:postcount';
|
||||
} else if (active === 'sort-reputation') {
|
||||
set = 'users:reputation';
|
||||
} else if (active === 'online') {
|
||||
} else if (active === 'online' || active === 'users') {
|
||||
set = 'users:online';
|
||||
}
|
||||
|
||||
|
||||
@@ -244,6 +244,9 @@ define(['taskbar'], function(taskbar) {
|
||||
var selector = $(this).attr('data-pane');
|
||||
postContainer.find('.tab-content div').removeClass('active');
|
||||
postContainer.find(selector).addClass('active');
|
||||
if(selector === '.tab-write') {
|
||||
bodyEl.focus();
|
||||
}
|
||||
return false;
|
||||
});
|
||||
|
||||
|
||||
@@ -1,102 +1,103 @@
|
||||
|
||||
<div class="account-username-box" data-userslug="{userslug}">
|
||||
|
||||
</div>
|
||||
|
||||
<div class="well account">
|
||||
|
||||
<div class="account-username-box" data-userslug="{userslug}">
|
||||
<span class="account-username">
|
||||
<a href="{relative_path}/user/{userslug}">{username}</a>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-2 account-block" style="text-align: center; margin-bottom:20px;">
|
||||
<div class="account-picture-block">
|
||||
<img src="{picture}" class="user-profile-picture img-thumbnail"/>
|
||||
</div>
|
||||
<div class="account-online-status">
|
||||
<span><i class="fa fa-circle status offline"></i> <span>[[user:offline]]</span></span>
|
||||
</div>
|
||||
<!-- IF banned -->
|
||||
<div>
|
||||
<span class="label label-danger">[[user:banned]]</span>
|
||||
</div>
|
||||
<!-- ENDIF banned -->
|
||||
<div>
|
||||
<a id="chat-btn" href="#" class="btn btn-default hide">Chat</a>
|
||||
</div>
|
||||
<div id="user-actions">
|
||||
<a id="follow-btn" href="#" class="btn btn-default hide">Follow</a>
|
||||
<a id="unfollow-btn" href="#" class="btn btn-default hide">Unfollow</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-5 account-block">
|
||||
|
||||
<div class="text-center account-picture-block">
|
||||
<div>
|
||||
<a href="{relative_path}/user/{userslug}"><img src="{picture}" class="user-profile-picture img-thumbnail"/></a>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<div>
|
||||
<span>
|
||||
<i class="account-online-status fa fa-circle status offline"></i>
|
||||
<span class="account-username"> {username}</span>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<!-- IF banned -->
|
||||
<div>
|
||||
<span class="label label-danger">[[user:banned]]</span>
|
||||
</div>
|
||||
<!-- ENDIF banned -->
|
||||
<div>
|
||||
<a id="chat-btn" href="#" class="btn btn-primary hide">Chat</a>
|
||||
<a id="follow-btn" href="#" class="btn btn-success hide">Follow</a>
|
||||
<a id="unfollow-btn" href="#" class="btn btn-warning hide">Unfollow</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="text-center account-stats panel panel-default">
|
||||
<div class="panel-body">
|
||||
<div class="inline-block text-center">
|
||||
<div class="human-readable-number" title="{reputation}">{reputation}</div>
|
||||
<div class="account-bio-label">[[user:reputation]]</div>
|
||||
</div>
|
||||
|
||||
<div class="inline-block text-center">
|
||||
<div class="human-readable-number" title="{postcount}">{postcount}</div>
|
||||
<div class="account-bio-label">[[user:posts]]</div>
|
||||
</div>
|
||||
|
||||
<div class="inline-block text-center">
|
||||
<div class="human-readable-number" title="{profileviews}">{profileviews}</div>
|
||||
<div class="account-bio-label">[[user:profile_views]]</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-body">
|
||||
|
||||
<div class="col-md-4">
|
||||
<div class="inline-block">
|
||||
<div class="account-bio-block">
|
||||
<span class="account-bio-label">[[user:email]]</span><i class="fa fa-eye-slash {emailClass}" title="[[user:email_hidden]]"></i>
|
||||
<!-- IF email -->
|
||||
<span>{email}</span>
|
||||
<!-- ELSE -->
|
||||
<i class="fa fa-eye-slash" title="[[user:email_hidden]]"></i> [[user:hidden]]
|
||||
<span class="account-bio-label">[[user:email]]</span>
|
||||
<span class="account-bio-value"><i class="fa fa-eye-slash {emailClass}" title="[[user:email_hidden]]"></i> {email}</span>
|
||||
<!-- ENDIF email -->
|
||||
<br/>
|
||||
|
||||
|
||||
<!-- IF fullname -->
|
||||
<span class="account-bio-label">[[user:fullname]]</span>
|
||||
<span>{fullname}</span>
|
||||
<br/>
|
||||
<span class="account-bio-value">{fullname}</span>
|
||||
<!-- ENDIF fullname -->
|
||||
|
||||
<!-- IF website -->
|
||||
<!-- IF websiteName -->
|
||||
<span class="account-bio-label">[[user:website]]</span>
|
||||
<span><a href="{website}">{websiteName}</a></span>
|
||||
<br/>
|
||||
<!-- ENDIF website -->
|
||||
<span class="account-bio-value"><a href="{website}">{websiteName}</a></span>
|
||||
<!-- ENDIF websiteName -->
|
||||
|
||||
<!-- IF location -->
|
||||
<span class="account-bio-label">[[user:location]]</span>
|
||||
<span>{location}</span>
|
||||
<br/>
|
||||
<span class="account-bio-value">{location}</span>
|
||||
<!-- ENDIF location -->
|
||||
|
||||
<!-- IF age -->
|
||||
<span class="account-bio-label">[[user:age]]</span>
|
||||
<span>{age}</span>
|
||||
<br/>
|
||||
<span class="account-bio-value">{age}</span>
|
||||
<!-- ENDIF age -->
|
||||
|
||||
<hr/>
|
||||
<span class="account-bio-label">[[user:joined]]</span>
|
||||
<span class="timeago" title="{joindate}"></span>
|
||||
<br/>
|
||||
|
||||
<span class="account-bio-label">[[user:lastonline]]</span>
|
||||
<span class="timeago" title="{lastonline}"></span>
|
||||
<br/>
|
||||
|
||||
<span class="account-bio-label">[[user:profile_views]]</span>
|
||||
<span class="formatted-number">{profileviews}</span>
|
||||
<br/>
|
||||
|
||||
<span class="account-bio-label">[[user:reputation]]</span>
|
||||
<span class="formatted-number">{reputation}</span>
|
||||
<br/>
|
||||
|
||||
<span class="account-bio-label">[[user:posts]]</span>
|
||||
<span class="formatted-number">{postcount}</span>
|
||||
<br/>
|
||||
|
||||
<span class="account-bio-label">[[user:followers]]</span>
|
||||
<span class="formatted-number">{followerCount}</span>
|
||||
<br/>
|
||||
<span class="human-readable-number account-bio-value" title="{followerCount}">{followerCount}</span>
|
||||
|
||||
<span class="account-bio-label">[[user:following]]</span>
|
||||
<span class="formatted-number">{followingCount}</span>
|
||||
<br/>
|
||||
<span class="human-readable-number account-bio-value" title="{followingCount}">{followingCount}</span>
|
||||
|
||||
<span class="account-bio-label">[[user:joined]]</span>
|
||||
<span class="timeago account-bio-value" title="{joindate}"></span>
|
||||
|
||||
<span class="account-bio-label">[[user:lastonline]]</span>
|
||||
<span class="timeago account-bio-value" title="{lastonline}"></span>
|
||||
|
||||
<hr/>
|
||||
<!-- IF !disableSignatures -->
|
||||
<!-- IF signature -->
|
||||
<hr/>
|
||||
<span class="account-bio-label">[[user:signature]]</span>
|
||||
<div class="post-signature">
|
||||
<span id='signature'>{signature}</span>
|
||||
@@ -105,9 +106,12 @@
|
||||
<!-- ENDIF !disableSignatures -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<div class="col-md-6 user-recent-posts">
|
||||
|
||||
<div class="col-md-7 user-recent-posts">
|
||||
<div class="topic-row panel panel-default clearfix">
|
||||
<div class="panel-heading">
|
||||
<h3 class="panel-title">[[global:recentposts]]</h3>
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
<div class="account-username-box" data-userslug="{userslug}">
|
||||
|
||||
</div>
|
||||
|
||||
<div class="well account">
|
||||
|
||||
<div id="change-picture-modal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="[[user:change_picture]]" aria-hidden="true">
|
||||
@@ -30,13 +34,6 @@
|
||||
</div><!-- /.modal-dialog -->
|
||||
</div><!-- /.modal -->
|
||||
|
||||
<div class="account-username-box" data-userslug="{userslug}">
|
||||
<span class="account-username">
|
||||
<a href="{relative_path}/user/{userslug}">{username}</a> <i class="fa fa-chevron-right"></i>
|
||||
<a href="{relative_path}/user/{userslug}/edit">[[user:edit]]</a>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-2" style="text-align: center; margin-bottom:20px;">
|
||||
<div class="account-picture-block text-center">
|
||||
@@ -153,5 +150,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<input type="hidden" template-variable="yourid" value="{yourid}" />
|
||||
<input type="hidden" template-variable="theirid" value="{theirid}" />
|
||||
<input type="hidden" template-variable="gravatarpicture" value="{gravatarpicture}" />
|
||||
<input type="hidden" template-variable="uploadedpicture" value="{uploadedpicture}" />
|
||||
|
||||
45
public/templates/accountposts.tpl
Normal file
45
public/templates/accountposts.tpl
Normal file
@@ -0,0 +1,45 @@
|
||||
<div class="account-username-box clearfix" data-userslug="{userslug}" data-uid="{uid}">
|
||||
|
||||
</div>
|
||||
|
||||
<div class="well favourites">
|
||||
|
||||
<!-- IF !posts.length -->
|
||||
<div class="alert alert-warning">[[topic:favourites.has_no_favourites]]</div>
|
||||
<!-- ENDIF !posts.length -->
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12 user-favourite-posts" data-nextstart="{nextStart}">
|
||||
<!-- BEGIN posts -->
|
||||
<div class="topic-row panel panel-default clearfix">
|
||||
<div class="panel-body">
|
||||
<a href="../../user/{posts.userslug}">
|
||||
<img title="{posts.username}" class="img-rounded user-img" src="{posts.picture}">
|
||||
</a>
|
||||
|
||||
<a href="../../user/{posts.userslug}">
|
||||
<strong><span>{posts.username}</span></strong>
|
||||
</a>
|
||||
<p>{posts.content}</p>
|
||||
|
||||
<div>
|
||||
<small>
|
||||
<span class="pull-right">
|
||||
<a href="../../topic/{posts.tid}/#{posts.pid}">posted</a>
|
||||
in
|
||||
<a href="../../category/{posts.categorySlug}">
|
||||
<i class="fa {posts.categoryIcon}"></i> {posts.categoryName}
|
||||
</a>
|
||||
<span class="timeago" title="{posts.relativeTime}"></span>
|
||||
</span>
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- END posts -->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<input type="hidden" template-variable="yourid" value="{yourid}" />
|
||||
<input type="hidden" template-variable="theirid" value="{theirid}" />
|
||||
@@ -1,11 +1,8 @@
|
||||
<div class="well account">
|
||||
<div class="account-username-box clearfix" data-userslug="{userslug}">
|
||||
|
||||
<div class="account-username-box" data-userslug="{userslug}">
|
||||
<span class="account-username">
|
||||
<a href="{relative_path}/user/{userslug}">{username}</a> <i class="fa fa-chevron-right"></i>
|
||||
<a href="{relative_path}/user/{userslug}/settings">[[user:settings]]</a>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="well account">
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
@@ -25,3 +22,6 @@
|
||||
<a id="submitBtn" href="#" class="btn btn-primary">[[global:save_changes]]</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<input type="hidden" template-variable="yourid" value="{yourid}" />
|
||||
<input type="hidden" template-variable="theirid" value="{theirid}" />
|
||||
@@ -41,7 +41,7 @@
|
||||
<div id="alert_window"></div>
|
||||
|
||||
<div id="footer" class="container" style="padding-top: 50px; display:none;">
|
||||
<footer class="footer">Copyright © 2013 <a target="_blank" href="http://www.nodebb.com">NodeBB</a> by <a target="_blank" href="https://github.com/psychobunny">psychobunny</a>, <a href="https://github.com/julianlam" target="_blank">julianlam</a>, <a href="https://github.com/barisusakli" target="_blank">barisusakli</a> from <a target="_blank" href="http://www.designcreateplay.com">designcreateplay</a></footer>
|
||||
<footer class="footer">Copyright © 2014 <a target="_blank" href="http://www.nodebb.com">NodeBB</a> by <a target="_blank" href="https://github.com/psychobunny">psychobunny</a>, <a href="https://github.com/julianlam" target="_blank">julianlam</a>, <a href="https://github.com/barisusakli" target="_blank">barisusakli</a> from <a target="_blank" href="http://www.designcreateplay.com">designcreateplay</a></footer>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
"^user.*followers": "followers",
|
||||
"^user.*settings": "accountsettings",
|
||||
"^user.*favourites": "favourites",
|
||||
"^user.*posts": "accountposts",
|
||||
"^user/.*": "account",
|
||||
|
||||
"^recent/.*": "recent",
|
||||
|
||||
@@ -1,13 +1,11 @@
|
||||
<div class="account-username-box clearfix" data-userslug="{userslug}">
|
||||
|
||||
</div>
|
||||
|
||||
<div class="well favourites">
|
||||
<div class="account-username-box" data-userslug="{userslug}">
|
||||
<span class="account-username">
|
||||
<a href="{relative_path}/user/{userslug}">{username}</a> <i class="fa fa-chevron-right"></i>
|
||||
<a href="{relative_path}/user/{userslug}/favourites">[[topic:favourites]]</a>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<!-- IF !posts.length -->
|
||||
<div id="no-favourites-notice" class="alert alert-warning">[[topic:favourites.has_no_favourites]]</div>
|
||||
<div class="alert alert-warning">[[topic:favourites.has_no_favourites]]</div>
|
||||
<!-- ENDIF !posts.length -->
|
||||
|
||||
<div class="row">
|
||||
@@ -42,3 +40,6 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<input type="hidden" template-variable="yourid" value="{yourid}" />
|
||||
<input type="hidden" template-variable="theirid" value="{theirid}" />
|
||||
@@ -1,12 +1,8 @@
|
||||
<div class="account-username-box clearfix" data-userslug="{userslug}">
|
||||
|
||||
</div>
|
||||
|
||||
<div class="well users account">
|
||||
|
||||
<div class="account-username-box" data-userslug="{userslug}">
|
||||
<span class="account-username">
|
||||
<a href="../../user/{userslug}">{username}</a> <i class="fa fa-chevron-right"></i>
|
||||
<a href="../../user/{userslug}/followers">[[user:followers]]</a>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<!-- BEGIN followers -->
|
||||
<div class="users-box">
|
||||
|
||||
@@ -1,12 +1,8 @@
|
||||
<div class="account-username-box clearfix" data-userslug="{userslug}">
|
||||
|
||||
</div>
|
||||
|
||||
<div class="well users account">
|
||||
|
||||
<div class="account-username-box" data-userslug="{userslug}">
|
||||
<span class="account-username">
|
||||
<a href="../../user/{userslug}">{username}</a> <i class="fa fa-chevron-right"></i>
|
||||
<a href="../../user/{userslug}/following">[[user:following]]</a>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<!-- BEGIN following -->
|
||||
<div class="users-box">
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
<footer id="footer" class="container footer hide">
|
||||
{footerHTML}
|
||||
<div class="copyright">
|
||||
Copyright © 2013 <a target="_blank" href="https://www.nodebb.com">NodeBB Forums</a> | <a target="_blank" href="//github.com/designcreateplay/NodeBB/graphs/contributors">Contributors</a>
|
||||
Copyright © 2014 <a target="_blank" href="https://www.nodebb.com">NodeBB Forums</a> | <a target="_blank" href="//github.com/designcreateplay/NodeBB/graphs/contributors">Contributors</a>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
|
||||
@@ -415,12 +415,11 @@
|
||||
}
|
||||
field = field.replace(/\./g, '\uff0E');
|
||||
data[field] = value;
|
||||
db.collection('objects').update({_key:key}, {$inc : data}, {upsert:true}, function(err, result) {
|
||||
module.getObjectField(key, field, function(err, value) {
|
||||
if(callback) {
|
||||
callback(err, value);
|
||||
}
|
||||
});
|
||||
|
||||
db.collection('objects').findAndModify({_key:key}, {}, {$inc: data}, {new:true, upsert:true}, function(err, result) {
|
||||
if(callback) {
|
||||
callback(err, result ? result[field] : null);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -32,18 +32,23 @@ Emailer.send = function(template, uid, params) {
|
||||
}
|
||||
}, function(err, results) {
|
||||
User.getUserField(uid, 'email', function(err, email) {
|
||||
if (!err) {
|
||||
Plugins.fireHook('action:email.send', {
|
||||
to: email,
|
||||
from: Meta.config['email:from'] || 'no-reply@localhost.lan',
|
||||
subject: params.subject,
|
||||
html: results.html,
|
||||
plaintext: results.plaintext,
|
||||
|
||||
template: template,
|
||||
uid: uid
|
||||
});
|
||||
if(err) {
|
||||
return winston.error(err.message);
|
||||
}
|
||||
|
||||
if(!email) {
|
||||
return winston.warn('uid : ' + uid + ' has no email, not sending.');
|
||||
}
|
||||
|
||||
Plugins.fireHook('action:email.send', {
|
||||
to: email,
|
||||
from: Meta.config['email:from'] || 'no-reply@localhost.lan',
|
||||
subject: params.subject,
|
||||
html: results.html,
|
||||
plaintext: results.plaintext,
|
||||
template: template,
|
||||
uid: uid
|
||||
});
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
@@ -49,7 +49,7 @@ var db = require('./database'),
|
||||
return callback(null, []);
|
||||
}
|
||||
|
||||
user.getMultipleUserFields([fromuid, touid], ['username', 'picture'], function(err, userData) {
|
||||
user.getMultipleUserFields([fromuid, touid], ['username', 'userslug', 'picture'], function(err, userData) {
|
||||
if(err) {
|
||||
return callback(err, null);
|
||||
}
|
||||
@@ -93,10 +93,10 @@ var db = require('./database'),
|
||||
picture;
|
||||
|
||||
if (parseInt(fromuid, 10) === parseInt(myuid, 10)) {
|
||||
picture = '<img class="chat-user-image" src="' + myUserData.picture + '">';
|
||||
picture = '<a href="/user/' + myUserData.userslug + '"><img class="chat-user-image" src="' + myUserData.picture + '"></a>';
|
||||
username = '<span class="chat-user chat-user-you"> '+ myUserData.username + '</span>: ';
|
||||
} else {
|
||||
picture = '<img class="chat-user-image" src="' + toUserData.picture + '">';
|
||||
picture = '<a href="/user/' + toUserData.userslug + '"><img class="chat-user-image" src="' + toUserData.picture + '"></a>';
|
||||
username = '<span class="chat-user"> ' + toUserData.username + '</span>: ';
|
||||
}
|
||||
|
||||
|
||||
23
src/posts.js
23
src/posts.js
@@ -169,11 +169,30 @@ var db = require('./database'),
|
||||
});
|
||||
}, function(pids) {
|
||||
if (!(pids && pids.length)) {
|
||||
return callback(null, []);
|
||||
return callback(null, { posts: [], nextStart: 0});
|
||||
}
|
||||
|
||||
|
||||
Posts.getPostSummaryByPids(pids, false, callback);
|
||||
Posts.getPostSummaryByPids(pids, false, function(err, posts) {
|
||||
if(err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
if(!posts || !posts.length) {
|
||||
return callback(null, { posts: [], nextStart: 0});
|
||||
}
|
||||
|
||||
db.sortedSetRevRank('uid:' + uid + ':posts', posts[posts.length - 1].pid, function(err, rank) {
|
||||
if(err) {
|
||||
return calllback(err);
|
||||
}
|
||||
var userPosts = {
|
||||
posts: posts,
|
||||
nextStart: parseInt(rank, 10) + 1
|
||||
};
|
||||
callback(null, userPosts);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@@ -72,6 +72,7 @@ var fs = require('fs'),
|
||||
createRoute('/:userslug/following', '/following', 'following');
|
||||
createRoute('/:userslug/followers', '/followers', 'followers');
|
||||
createRoute('/:userslug/favourites', '/favourites', 'favourites');
|
||||
createRoute('/:userslug/posts', '/posts', 'accountposts');
|
||||
|
||||
app.get('/:userslug/edit', function (req, res) {
|
||||
|
||||
@@ -310,6 +311,9 @@ var fs = require('fs'),
|
||||
} else {
|
||||
userData.showemail = "";
|
||||
}
|
||||
|
||||
userData.theirid = uid;
|
||||
userData.yourid = callerUID;
|
||||
res.json(userData);
|
||||
} else {
|
||||
res.json(404, {
|
||||
@@ -349,6 +353,8 @@ var fs = require('fs'),
|
||||
return next(err);
|
||||
}
|
||||
|
||||
userData.theirid = uid;
|
||||
userData.yourid = callerUID;
|
||||
userData.posts = favourites.posts;
|
||||
userData.nextStart = favourites.nextStart;
|
||||
|
||||
@@ -363,6 +369,44 @@ var fs = require('fs'),
|
||||
});
|
||||
});
|
||||
|
||||
app.get('/api/user/:userslug/posts', function (req, res, next) {
|
||||
var callerUID = req.user ? req.user.uid : '0';
|
||||
|
||||
user.getUidByUserslug(req.params.userslug, function (err, uid) {
|
||||
if (!uid) {
|
||||
res.json(404, {
|
||||
error: 'User not found!'
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
user.getUserFields(uid, ['username', 'userslug'], function (err, userData) {
|
||||
if (err) {
|
||||
return next(err);
|
||||
}
|
||||
|
||||
if (userData) {
|
||||
posts.getPostsByUid(callerUID, uid, 0, 19, function (err, userPosts) {
|
||||
if (err) {
|
||||
return next(err);
|
||||
}
|
||||
userData.uid = uid;
|
||||
userData.theirid = uid;
|
||||
userData.yourid = callerUID;
|
||||
userData.posts = userPosts.posts;
|
||||
userData.nextStart = userPosts.nextStart;
|
||||
|
||||
res.json(userData);
|
||||
});
|
||||
} else {
|
||||
res.json(404, {
|
||||
error: 'User not found!'
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
app.get('/api/user/:userslug', function (req, res, next) {
|
||||
var callerUID = req.user ? req.user.uid : '0';
|
||||
|
||||
@@ -375,13 +419,13 @@ var fs = require('fs'),
|
||||
|
||||
user.isFollowing(callerUID, userData.theirid, function (isFollowing) {
|
||||
|
||||
posts.getPostsByUid(callerUID, userData.theirid, 0, 9, function (err, posts) {
|
||||
posts.getPostsByUid(callerUID, userData.theirid, 0, 9, function (err, userPosts) {
|
||||
|
||||
if(err) {
|
||||
return next(err);
|
||||
}
|
||||
|
||||
userData.posts = posts.filter(function (p) {
|
||||
userData.posts = userPosts.posts.filter(function (p) {
|
||||
return p && parseInt(p.deleted, 10) !== 1;
|
||||
});
|
||||
|
||||
@@ -391,7 +435,7 @@ var fs = require('fs'),
|
||||
userData.profileviews = 1;
|
||||
}
|
||||
|
||||
if (parseInt(callerUID, 10) !== parseInt(userData.uid, 10)) {
|
||||
if (parseInt(callerUID, 10) !== parseInt(userData.uid, 10) && parseInt(callerUID, 0)) {
|
||||
user.incrementUserFieldBy(userData.uid, 'profileviews', 1);
|
||||
}
|
||||
|
||||
|
||||
@@ -258,4 +258,15 @@ SocketPosts.loadMoreFavourites = function(socket, data, callback) {
|
||||
posts.getFavourites(socket.uid, start, end, callback);
|
||||
};
|
||||
|
||||
SocketPosts.loadMoreUserPosts = function(socket, data, callback) {
|
||||
if(!data || !data.after || !data.uid) {
|
||||
return callback(new Error('invalid data'));
|
||||
}
|
||||
|
||||
var start = parseInt(data.after, 10),
|
||||
end = start + 9;
|
||||
|
||||
posts.getPostsByUid(socket.uid, data.uid, start, end, callback);
|
||||
};
|
||||
|
||||
module.exports = SocketPosts;
|
||||
@@ -514,7 +514,7 @@ module.exports.server = server;
|
||||
});
|
||||
});
|
||||
|
||||
app.get('/topic/:topic_id/:slug?', function (req, res) {
|
||||
app.get('/topic/:topic_id/:slug?', function (req, res, next) {
|
||||
var tid = req.params.topic_id;
|
||||
|
||||
if (tid.match(/^\d+\.rss$/)) {
|
||||
@@ -531,24 +531,33 @@ module.exports.server = server;
|
||||
|
||||
};
|
||||
|
||||
if (!fs.existsSync(rssPath)) {
|
||||
feed.updateTopic(tid, function (err) {
|
||||
if (err) {
|
||||
res.redirect('/404');
|
||||
} else {
|
||||
loadFeed();
|
||||
}
|
||||
});
|
||||
} else {
|
||||
loadFeed();
|
||||
}
|
||||
ThreadTools.privileges(tid, ((req.user) ? req.user.uid || 0 : 0), function(err, privileges) {
|
||||
if(err) {
|
||||
return next(err);
|
||||
}
|
||||
|
||||
if(!privileges.read) {
|
||||
return res.redirect('403');
|
||||
}
|
||||
|
||||
if (!fs.existsSync(rssPath)) {
|
||||
feed.updateTopic(tid, function (err) {
|
||||
if (err) {
|
||||
res.redirect('/404');
|
||||
} else {
|
||||
loadFeed();
|
||||
}
|
||||
});
|
||||
} else {
|
||||
loadFeed();
|
||||
}
|
||||
});
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
async.waterfall([
|
||||
function(next) {
|
||||
// Check whether this user is allowed to access this topic
|
||||
ThreadTools.privileges(tid, ((req.user) ? req.user.uid || 0 : 0), function(err, privileges) {
|
||||
if (!err) {
|
||||
if (!privileges.read) {
|
||||
@@ -687,7 +696,7 @@ module.exports.server = server;
|
||||
});
|
||||
});
|
||||
|
||||
app.get('/category/:category_id/:slug?', function (req, res) {
|
||||
app.get('/category/:category_id/:slug?', function (req, res, next) {
|
||||
var cid = req.params.category_id;
|
||||
|
||||
if (cid.match(/^\d+\.rss$/)) {
|
||||
@@ -704,24 +713,33 @@ module.exports.server = server;
|
||||
|
||||
};
|
||||
|
||||
if (!fs.existsSync(rssPath)) {
|
||||
feed.updateCategory(cid, function (err) {
|
||||
if (err) {
|
||||
res.redirect('/404');
|
||||
} else {
|
||||
loadFeed();
|
||||
}
|
||||
});
|
||||
} else {
|
||||
loadFeed();
|
||||
}
|
||||
CategoryTools.privileges(cid, ((req.user) ? req.user.uid || 0 : 0), function(err, privileges) {
|
||||
if(err) {
|
||||
return next(err);
|
||||
}
|
||||
|
||||
if(!privileges.read) {
|
||||
return res.redirect('403');
|
||||
}
|
||||
|
||||
if (!fs.existsSync(rssPath)) {
|
||||
feed.updateCategory(cid, function (err) {
|
||||
if (err) {
|
||||
res.redirect('/404');
|
||||
} else {
|
||||
loadFeed();
|
||||
}
|
||||
});
|
||||
} else {
|
||||
loadFeed();
|
||||
}
|
||||
});
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
async.waterfall([
|
||||
function(next) {
|
||||
// Check whether this user is allowed to access this category
|
||||
CategoryTools.privileges(cid, ((req.user) ? req.user.uid || 0 : 0), function(err, privileges) {
|
||||
if (!err) {
|
||||
if (!privileges.read) {
|
||||
|
||||
Reference in New Issue
Block a user