refactored topics.js

removed ajaxify.register_events using removeListener now
v1.18.x
barisusakli 11 years ago
parent ec399d8b3b
commit d43d363a7a

@ -11,17 +11,6 @@ var ajaxify = ajaxify || {};
availableTemplates = null, availableTemplates = null,
apiXHR = null; apiXHR = null;
var events = [];
ajaxify.register_events = function (new_page_events) {
for (var i = 0, ii = events.length; i < ii; i++) {
socket.removeAllListeners(events[i]); // optimize this to user removeListener(event, listener) instead.
}
events = new_page_events;
};
window.onpopstate = function (event) { window.onpopstate = function (event) {
if (event !== null && event.state && event.state.url !== undefined && !ajaxify.initialLoad) { if (event !== null && event.state && event.state.url !== undefined && !ajaxify.initialLoad) {
ajaxify.go(event.state.url, function() { ajaxify.go(event.state.url, function() {

@ -5,10 +5,11 @@ define(function() {
var Admin = {}; var Admin = {};
Admin.init = function() { Admin.init = function() {
ajaxify.register_events(['meta.rooms.getAll']);
app.enterRoom('admin'); app.enterRoom('admin');
socket.emit('meta.rooms.getAll', Admin.updateRoomUsage); socket.emit('meta.rooms.getAll', Admin.updateRoomUsage);
socket.removeListener('event:meta.rooms.update', Admin.updateRoomUsage);
socket.on('event:meta.rooms.update', Admin.updateRoomUsage); socket.on('event:meta.rooms.update', Admin.updateRoomUsage);
$('#logout-link').on('click', function() { $('#logout-link').on('click', function() {
@ -50,7 +51,6 @@ define(function() {
uniqueVisitors.find('#' + key).text(data[key]); uniqueVisitors.find('#' + key).text(data[key]);
} }
} }
}); });
}; };

@ -9,9 +9,16 @@ define(['composer', 'forum/pagination', 'share', 'navigator', 'forum/categoryToo
$(window).on('action:ajaxify.start', function(ev, data) { $(window).on('action:ajaxify.start', function(ev, data) {
if(data && data.url.indexOf('category') !== 0) { if(data && data.url.indexOf('category') !== 0) {
navigator.hide(); navigator.hide();
removeListeners();
} }
}); });
function removeListeners() {
socket.removeListener('event:new_topic', Category.onNewTopic);
categoryTools.removeListeners();
}
Category.init = function() { Category.init = function() {
var cid = ajaxify.variables.get('category_id'); var cid = ajaxify.variables.get('category_id');
@ -23,11 +30,6 @@ define(['composer', 'forum/pagination', 'share', 'navigator', 'forum/categoryToo
composer.newTopic(cid); composer.newTopic(cid);
}); });
ajaxify.register_events([
'event:new_topic', 'event:topic_deleted', 'event:topic_restored', 'event:topic_locked',
'event:topic_unlocked', 'event:topic_pinned', 'event:topic_unpinned', 'event:topic_moved'
]);
socket.on('event:new_topic', Category.onNewTopic); socket.on('event:new_topic', Category.onNewTopic);
categoryTools.init(cid); categoryTools.init(cid);

@ -91,6 +91,16 @@ define(['forum/topic/move', 'topicSelect'], function(move, topicSelect) {
socket.on('event:topic_moved', onTopicMoved); socket.on('event:topic_moved', onTopicMoved);
}; };
CategoryTools.removeListeners = function() {
socket.removeListener('event:topic_deleted', setDeleteState);
socket.removeListener('event:topic_restored', setDeleteState);
socket.removeListener('event:topic_locked', setLockedState);
socket.removeListener('event:topic_unlocked', setLockedState);
socket.removeListener('event:topic_pinned', setPinnedState);
socket.removeListener('event:topic_unpinned', setPinnedState);
socket.removeListener('event:topic_moved', onTopicMoved);
};
function closeDropDown() { function closeDropDown() {
$('.thread-tools.open').find('.dropdown-toggle').trigger('click'); $('.thread-tools.open').find('.dropdown-toggle').trigger('click');
} }

@ -3,6 +3,12 @@ define(['forum/recent'], function(recent) {
loadingMoreTopics = false, loadingMoreTopics = false,
active = ''; active = '';
$(window).on('action:ajaxify.start', function(ev, data) {
if(data.url.indexOf('recent') !== 0) {
recent.removeListeners();
}
});
Popular.init = function() { Popular.init = function() {
app.enterRoom('recent_posts'); app.enterRoom('recent_posts');

@ -1,3 +1,7 @@
'use strict';
/* globals define, app, socket, ajaxify, templates, translator, utils */
define(function() { define(function() {
var Recent = {}; var Recent = {};
@ -14,15 +18,19 @@ define(function() {
return active; return active;
} }
$(window).on('action:ajaxify.start', function(ev, data) {
if(data.url.indexOf('recent') !== 0) {
Recent.removeListeners();
}
});
Recent.init = function() { Recent.init = function() {
app.enterRoom('recent_posts'); app.enterRoom('recent_posts');
Recent.watchForNewPosts(); Recent.watchForNewPosts();
active = Recent.selectActivePill(); active = Recent.selectActivePill();
$('#new-topics-alert').on('click', function() { $('#new-topics-alert').on('click', function() {
$(this).addClass('hide'); $(this).addClass('hide');
}); });
@ -48,29 +56,32 @@ define(function() {
}); });
return active; return active;
} };
Recent.watchForNewPosts = function () { Recent.watchForNewPosts = function () {
newPostCount = 0; newPostCount = 0;
newTopicCount = 0; newTopicCount = 0;
ajaxify.register_events([ socket.on('event:new_topic', onNewTopic);
'event:new_topic', socket.on('event:new_post', onNewPost);
'event:new_post' };
]);
socket.on('event:new_topic', function(data) { function onNewTopic(data) {
++newTopicCount; ++newTopicCount;
Recent.updateAlertText(); Recent.updateAlertText();
}); }
socket.on('event:new_post', function(data) { function onNewPost(data) {
++newPostCount; ++newPostCount;
Recent.updateAlertText(); Recent.updateAlertText();
});
} }
Recent.removeListeners = function() {
console.log('removing');
socket.removeListener('event:new_topic', onNewTopic);
socket.removeListener('event:new_post', onNewPost);
};
Recent.updateAlertText = function() { Recent.updateAlertText = function() {
var text = 'There'; var text = 'There';
@ -90,7 +101,7 @@ define(function() {
$('#new-topics-alert').html(text).removeClass('hide').fadeIn('slow'); $('#new-topics-alert').html(text).removeClass('hide').fadeIn('slow');
$('#category-no-topics').addClass('hide'); $('#category-no-topics').addClass('hide');
} };
Recent.loadMoreTopics = function() { Recent.loadMoreTopics = function() {
if(!$('#topics-container').length) { if(!$('#topics-container').length) {
@ -113,7 +124,7 @@ define(function() {
loadingMoreTopics = false; loadingMoreTopics = false;
}); });
} };
Recent.onTopicsLoaded = function(templateName, topics, showSelect) { Recent.onTopicsLoaded = function(templateName, topics, showSelect) {
ajaxify.loadTemplate(templateName, function(template) { ajaxify.loadTemplate(templateName, function(template) {
@ -129,7 +140,7 @@ define(function() {
utils.makeNumbersHumanReadable(html.find('.human-readable-number')); utils.makeNumbersHumanReadable(html.find('.human-readable-number'));
}); });
}); });
} };
return Recent; return Recent;
}); });

@ -3,23 +3,22 @@
/* globals define, app, templates, translator, socket, bootbox, config, ajaxify, RELATIVE_PATH, utils */ /* globals define, app, templates, translator, socket, bootbox, config, ajaxify, RELATIVE_PATH, utils */
define(['forum/pagination', 'forum/topic/threadTools', 'forum/topic/postTools', 'navigator'], function(pagination, threadTools, postTools, navigator) { define(['forum/pagination', 'forum/topic/threadTools', 'forum/topic/postTools', 'forum/topic/events', 'navigator'], function(pagination, threadTools, postTools, events, navigator) {
var Topic = {}, var Topic = {},
infiniteLoaderActive = false, infiniteLoaderActive = false,
scrollingToPost = false, scrollingToPost = false,
currentUrl = ''; currentUrl = '';
function showBottomPostBar() {
if($('#post-container .post-row').length > 1 || !$('#post-container li[data-index="0"]').length) {
$('.bottom-post-bar').removeClass('hide');
}
}
$(window).on('action:ajaxify.start', function(ev, data) { $(window).on('action:ajaxify.start', function(ev, data) {
if(data.url.indexOf('topic') !== 0) { if(data.url.indexOf('topic') !== 0) {
navigator.hide(); navigator.hide();
$('.header-topic-title').find('span').text('').hide(); $('.header-topic-title').find('span').text('').hide();
app.removeAlert('bookmark'); app.removeAlert('bookmark');
events.removeListeners();
socket.removeListener('event:new_post', onNewPost);
} }
}); });
@ -30,40 +29,19 @@ define(['forum/pagination', 'forum/topic/threadTools', 'forum/topic/postTools',
deleted: ajaxify.variables.get('deleted'), deleted: ajaxify.variables.get('deleted'),
pinned: ajaxify.variables.get('pinned') pinned: ajaxify.variables.get('pinned')
}, },
currentPage = parseInt(ajaxify.variables.get('currentPage'), 10), postCount = ajaxify.variables.get('postcount');
pageCount = parseInt(ajaxify.variables.get('pageCount'), 10);
Topic.postCount = ajaxify.variables.get('postcount');
$(window).trigger('action:topic.loading'); $(window).trigger('action:topic.loading');
function hidePostToolsForDeletedPosts() {
$('#post-container li.deleted').each(function() {
toggle_post_tools($(this).attr('data-pid'), true);
});
}
$(function() {
utils.addCommasToNumbers($('.topic .formatted-number')); utils.addCommasToNumbers($('.topic .formatted-number'));
app.enterRoom('topic_' + tid); app.enterRoom('topic_' + tid);
showBottomPostBar(); showBottomPostBar();
if (thread_state.locked === '1') {
set_locked_state(true);
}
if (thread_state.deleted === '1') {
set_delete_state(true);
}
if (thread_state.pinned === '1') {
set_pinned_state(true);
}
postTools.init(tid, thread_state); postTools.init(tid, thread_state);
threadTools.init(tid, thread_state); threadTools.init(tid, thread_state);
events.init();
hidePostToolsForDeletedPosts(); hidePostToolsForDeletedPosts();
@ -72,7 +50,7 @@ define(['forum/pagination', 'forum/topic/threadTools', 'forum/topic/postTools',
var bookmark = localStorage.getItem('topic:' + tid + ':bookmark'); var bookmark = localStorage.getItem('topic:' + tid + ':bookmark');
if (window.location.hash) { if (window.location.hash) {
Topic.scrollToPost(window.location.hash.substr(1), true); Topic.scrollToPost(window.location.hash.substr(1), true);
} else if (bookmark && (!config.usePagination || (config.usePagination && pagination.currentPage === 1)) && Topic.postCount > 1) { } else if (bookmark && (!config.usePagination || (config.usePagination && pagination.currentPage === 1)) && postCount > 1) {
app.alert({ app.alert({
alert_id: 'bookmark', alert_id: 'bookmark',
message: '[[topic:bookmark_instructions]]', message: '[[topic:bookmark_instructions]]',
@ -88,21 +66,40 @@ define(['forum/pagination', 'forum/topic/threadTools', 'forum/topic/postTools',
} }
if (!config.usePagination) { if (!config.usePagination) {
navigator.init('.posts > .post-row', Topic.postCount, Topic.navigatorCallback); navigator.init('.posts > .post-row', postCount, Topic.navigatorCallback);
} }
$('#post-container').on('mouseenter', '.favourite-tooltip', function(e) { socket.on('event:new_post', onNewPost);
if (!$(this).data('users-loaded')) {
$(this).data('users-loaded', "true"); $(window).on('scroll', updateTopicTitle);
var pid = $(this).parents('.post-row').attr('data-pid');
var el = $(this).attr('title', "Loading..."); $(window).trigger('action:topic.loaded');
socket.emit('posts.getFavouritedUsers', pid, function(err, usernames) { };
el.attr('title', usernames).tooltip('show');
}); function showBottomPostBar() {
if($('#post-container .post-row').length > 1 || !$('#post-container li[data-index="0"]').length) {
$('.bottom-post-bar').removeClass('hide');
}
}
function onNewPost(data) {
var tid = ajaxify.variables.get('topic_id');
if(data && data.posts && data.posts.length && data.posts[0].tid !== tid) {
return;
} }
});
});
if(config.usePagination) {
return onNewPostPagination(data);
}
for (var i=0; i<data.posts.length; ++i) {
var postcount = $('.user_postcount_' + data.posts[i].uid);
postcount.html(parseInt(postcount.html(), 10) + 1);
}
socket.emit('topics.markAsRead', {tid: tid, uid: app.uid});
createNewPosts(data);
}
function enableInfiniteLoading() { function enableInfiniteLoading() {
if(!config.usePagination) { if(!config.usePagination) {
@ -126,7 +123,7 @@ define(['forum/pagination', 'forum/topic/threadTools', 'forum/topic/postTools',
var offset = el.offset().top - $('#header-menu').offset().top + $('#header-menu').height(); var offset = el.offset().top - $('#header-menu').offset().top + $('#header-menu').height();
loadMorePosts(tid, after, function() { loadMorePosts(ajaxify.variables.get('topic_id'), after, function() {
hidePostToolsForDeletedPosts(); hidePostToolsForDeletedPosts();
if(direction < 0 && el) { if(direction < 0 && el) {
Topic.scrollToPost(el.attr('data-pid'), false, 0, offset); Topic.scrollToPost(el.attr('data-pid'), false, 0, offset);
@ -137,365 +134,16 @@ define(['forum/pagination', 'forum/topic/threadTools', 'forum/topic/postTools',
} else { } else {
navigator.hide(); navigator.hide();
pagination.init(currentPage, pageCount); pagination.init(parseInt(ajaxify.variables.get('currentPage'), 10), parseInt(ajaxify.variables.get('pageCount'), 10));
}
}
ajaxify.register_events([
'event:voted', 'event:favourited', 'event:new_post', 'get_users_in_room',
'event:topic_deleted', 'event:topic_restored', 'event:topic_locked',
'event:topic_unlocked', 'event:topic_pinned', 'event:topic_unpinned',
'event:topic_moved', 'event:post_edited', 'event:post_deleted', 'event:post_restored',
'posts.favourite', 'user.isOnline', 'posts.upvote', 'posts.downvote',
'event:topic.replyStart', 'event:topic.replyStop'
]);
function createUserIcon(uid, picture, userslug, username) {
if(!$('.thread_active_users').find('[data-uid="' + uid + '"]').length) {
return $('<div class="inline-block"><a data-uid="' + uid + '" href="' + RELATIVE_PATH + '/user/' + userslug + '"><img title="' + username + '" src="'+ picture +'"/></a></div>');
}
}
socket.on('get_users_in_room', function(data) {
if(data && data.room.indexOf('topic') !== -1) {
var activeEl = $('.thread_active_users');
// remove users that are no longer here
activeEl.find('a').each(function(index, element) {
if(element) {
var uid = $(element).attr('data-uid');
var absent = data.users.every(function(user) {
return parseInt(user.uid, 10) !== parseInt(uid, 10);
});
if (absent) {
$(element).remove();
}
}
});
var i=0, icon;
// add self
for(i = 0; i<data.users.length; ++i) {
if(parseInt(data.users[i].uid, 10) === parseInt(app.uid, 10)) {
icon = createUserIcon(data.users[i].uid, data.users[i].picture, data.users[i].userslug, data.users[i].username);
activeEl.prepend(icon);
data.users.splice(i, 1);
break;
}
}
// add other users
for(i=0; i<data.users.length; ++i) {
icon = createUserIcon(data.users[i].uid, data.users[i].picture, data.users[i].userslug, data.users[i].username);
activeEl.append(icon);
if(activeEl.children().length > 8) {
break;
}
}
activeEl.find('a[data-uid] img').tooltip({
placement: 'top'
});
var remainingUsers = data.users.length - 9;
remainingUsers = remainingUsers < 0 ? 0 : remainingUsers;
var anonymousCount = parseInt(data.anonymousCount, 10);
activeEl.find('.anonymous-box').remove();
if(anonymousCount || remainingUsers) {
var anonLink = $('<div class="anonymous-box inline-block"><i class="fa fa-user"></i></div>');
activeEl.append(anonLink);
var title = '';
if(remainingUsers && anonymousCount) {
title = '[[topic:more_users_and_guests, ' + remainingUsers + ', ' + anonymousCount + ']]';
} else if(remainingUsers) {
title = '[[topic:more_users, ' + remainingUsers + ']]';
} else {
title = '[[topic:more_guests, ' + anonymousCount + ']]';
}
translator.translate(title, function(translated) {
$('.anonymous-box').tooltip({
placement: 'top',
title: translated
});
});
}
getReplyingUsers();
}
app.populateOnlineUsers();
});
function getReplyingUsers() {
var activeEl = $('.thread_active_users');
socket.emit('modules.composer.getUsersByTid', ajaxify.variables.get('topic_id'), function(err, uids) {
if (uids && uids.length) {
for(var x=0;x<uids.length;x++) {
activeEl.find('[data-uid="' + uids[x] + '"]').addClass('replying');
}
}
});
}
socket.on('user.isOnline', function(err, data) {
app.populateOnlineUsers();
updateActiveUsers(data);
});
function updateActiveUsers(data) {
var activeEl = $('.thread_active_users');
var user = activeEl.find('a[data-uid="'+ data.uid + '"]');
if (user.length && !data.online) {
user.parent().remove();
} else if(!user.length && data.online) {
user = createUserIcon(data.uid, data.picture, data.userslug, data.username);
activeEl.append(user);
activeEl.find('a[data-uid] img').tooltip({
placement: 'top'
});
}
}
socket.on('event:voted', function(data) {
updatePostVotesAndUserReputation(data);
});
socket.on('event:favourited', function(data) {
updateFavouriteCount(data.post.pid, data.post.reputation);
});
socket.on('event:new_post', function(data) {
if(data && data.posts && data.posts.length && data.posts[0].tid !== ajaxify.variables.get('topic_id')) {
return;
}
if(config.usePagination) {
onNewPostPagination(data);
return;
}
for (var i=0; i<data.posts.length; ++i) {
var postcount = $('.user_postcount_' + data.posts[i].uid);
postcount.html(parseInt(postcount.html(), 10) + 1);
}
socket.emit('topics.markAsRead', {tid: tid, uid: app.uid});
createNewPosts(data);
});
socket.on('event:topic_deleted', function(data) {
if (data && data.tid === tid) {
set_locked_state(true);
set_delete_state(true);
}
});
socket.on('event:topic_restored', function(data) {
if (data && data.tid === tid) {
set_locked_state(false);
set_delete_state(false);
}
});
socket.on('event:topic_locked', function(data) {
if (data && data.tid === tid) {
set_locked_state(true, 1);
}
});
socket.on('event:topic_unlocked', function(data) {
if (data && data.tid === tid) {
set_locked_state(false, 1);
}
});
socket.on('event:topic_pinned', function(data) {
if (data && data.tid === tid) {
set_pinned_state(true, 1);
}
});
socket.on('event:topic_unpinned', function(data) {
if (data && data.tid === tid) {
set_pinned_state(false, 1);
}
});
socket.on('event:topic_moved', function(data) {
if (data && data.tid > 0) {
ajaxify.go('topic/' + data.tid);
} }
});
socket.on('event:post_edited', function(data) {
var editedPostEl = $('#content_' + data.pid),
editedPostTitle = $('#topic_title_' + data.pid);
if (editedPostTitle.length) {
editedPostTitle.fadeOut(250, function() {
editedPostTitle.html(data.title);
editedPostTitle.fadeIn(250);
});
} }
editedPostEl.fadeOut(250, function() { function hidePostToolsForDeletedPosts() {
editedPostEl.html(data.content); $('#post-container li.deleted').each(function() {
editedPostEl.find('img').addClass('img-responsive'); postTools.toggle($(this).attr('data-pid'), true);
editedPostEl.fadeIn(250);
});
});
socket.on('posts.upvote', function(pid) {
toggleUpvoteDownvote(pid, true, false);
});
socket.on('posts.downvote', function(pid) {
toggleUpvoteDownvote(pid, false, true);
});
socket.on('posts.unvote', function(pid) {
toggleUpvoteDownvote(pid, false, false);
});
function toggleUpvoteDownvote(pid, upvote, downvote) {
var post = $('li[data-pid="' + pid + '"]');
post.find('.upvote').toggleClass('btn-primary upvoted', upvote);
post.find('.downvote').toggleClass('btn-primary downvoted', downvote);
}
socket.on('posts.favourite', function(pid) {
toggleFavourite(pid, true);
});
socket.on('posts.unfavourite', function(pid) {
toggleFavourite(pid, false);
});
function toggleFavourite(pid, isFavourited) {
var favBtn = $('li[data-pid="' + pid + '"] .favourite');
if(favBtn.length) {
favBtn.addClass('btn-warning')
.attr('data-favourited', isFavourited);
var icon = favBtn.find('i');
var className = icon.attr('class');
if (isFavourited ? className.indexOf('-o') !== -1 : className.indexOf('-o') === -1) {
icon.attr('class', isFavourited ? className.replace('-o', '') : className + '-o');
}
}
}
socket.on('event:post_deleted', function(data) {
if (data.pid) {
toggle_post_delete_state(data.pid);
}
});
socket.on('event:post_restored', function(data) {
if (data.pid) {
toggle_post_delete_state(data.pid);
}
});
socket.on('event:topic.replyStart', function(uid) {
$('.thread_active_users [data-uid="' + uid + '"]').addClass('replying');
});
socket.on('event:topic.replyStop', function(uid) {
$('.thread_active_users [data-uid="' + uid + '"]').removeClass('replying');
});
function updatePostVotesAndUserReputation(data) {
var votes = $('li[data-pid="' + data.post.pid + '"] .votes'),
reputationElements = $('.reputation[data-uid="' + data.post.uid + '"]');
votes.html(data.post.votes).attr('data-votes', data.post.votes);
reputationElements.html(data.user.reputation).attr('data-reputation', data.user.reputation);
}
function updateFavouriteCount(pid, value) {
$('li[data-pid="' + pid + '"] .favouriteCount').html(value).attr('data-favourites', value);
}
function set_locked_state(locked, alert) {
translator.translate('<i class="fa fa-fw fa-' + (locked ? 'un': '') + 'lock"></i> [[topic:thread_tools.' + (locked ? 'un': '') + 'lock]]', function(translated) {
$('.lock_thread').html(translated);
});
$('#post-container .post_reply').html(locked ? 'Locked <i class="fa fa-lock"></i>' : 'Reply <i class="fa fa-reply"></i>');
$('#post-container').find('.quote, .edit, .delete').toggleClass('none', locked);
$('.topic-main-buttons .post_reply').attr('disabled', locked).html(locked ? 'Locked <i class="fa fa-lock"></i>' : 'Reply');
if (alert) {
app.alertSuccess(locked ? '[[topic:topic_lock_success]]' : '[[topic:topic_unlock_success]]');
}
thread_state.locked = locked ? '1' : '0';
}
function set_delete_state(deleted) {
var threadEl = $('#post-container');
translator.translate('<i class="fa fa-fw ' + (deleted ? 'fa-comment' : 'fa-trash-o') + '"></i> [[topic:thread_tools.' + (deleted ? 'restore' : 'delete') + ']]', function(translated) {
$('.delete_thread span').html(translated);
});
threadEl.toggleClass('deleted', deleted);
thread_state.deleted = deleted ? '1' : '0';
if(deleted) {
translator.translate('[[topic:deleted_message]]', function(translated) {
$('<div id="thread-deleted" class="alert alert-warning">' + translated + '</div>').insertBefore(threadEl);
});
} else {
$('#thread-deleted').remove();
}
}
function set_pinned_state(pinned, alert) {
translator.translate('<i class="fa fa-fw fa-thumb-tack"></i> [[topic:thread_tools.' + (pinned ? 'unpin' : 'pin') + ']]', function(translated) {
$('.pin_thread').html(translated);
if (alert) {
app.alertSuccess(pinned ? '[[topic:topic_pin_success]]' : '[[topic:topic_unpin_success]]');
}
thread_state.pinned = pinned ? '1' : '0';
});
}
function toggle_post_delete_state(pid) {
var postEl = $('#post-container li[data-pid="' + pid + '"]');
if (postEl.length) {
postEl.toggleClass('deleted');
toggle_post_tools(pid, postEl.hasClass('deleted'));
updatePostCount();
}
}
function toggle_post_tools(pid, isDeleted) {
var postEl = $('#post-container li[data-pid="' + pid + '"]');
postEl.find('.quote, .favourite, .post_reply, .chat').toggleClass('none', isDeleted);
translator.translate(isDeleted ? ' [[topic:restore]]' : ' [[topic:delete]]', function(translated) {
postEl.find('.delete').find('span').html(translated);
}); });
} }
$(window).on('scroll', updateTopicTitle);
$(window).trigger('action:topic.loaded');
};
function updateTopicTitle() { function updateTopicTitle() {
if($(window).scrollTop() > 50) { if($(window).scrollTop() > 50) {
@ -705,7 +353,7 @@ define(['forum/pagination', 'forum/topic/threadTools', 'forum/topic/postTools',
if(err) { if(err) {
return app.alertError(err.message); return app.alertError(err.message);
} }
toggle_mod_tools(html, privileges); toggleModTools(html, privileges);
}); });
} }
@ -721,25 +369,15 @@ define(['forum/pagination', 'forum/topic/threadTools', 'forum/topic/postTools',
utils.makeNumbersHumanReadable(html.find('.human-readable-number')); utils.makeNumbersHumanReadable(html.find('.human-readable-number'));
html.find('span.timeago').timeago(); html.find('span.timeago').timeago();
html.find('.post-content img').addClass('img-responsive'); html.find('.post-content img').addClass('img-responsive');
updatePostCount(); postTools.updatePostCount();
showBottomPostBar(); showBottomPostBar();
} }
function toggle_mod_tools(postHtml, privileges) { function toggleModTools(postHtml, privileges) {
postHtml.find('.edit, .delete').toggleClass('none', !privileges.editable); postHtml.find('.edit, .delete').toggleClass('none', !privileges.editable);
postHtml.find('.move').toggleClass('none', !privileges.move); postHtml.find('.move').toggleClass('none', !privileges.move);
} }
function updatePostCount() {
socket.emit('topics.postcount', ajaxify.variables.get('topic_id'), function(err, postcount) {
if(!err) {
Topic.postCount = postcount;
$('.topic-post-count').html(Topic.postCount);
navigator.setCount(Topic.postCount);
}
});
}
function loadMorePosts(tid, after, callback) { function loadMorePosts(tid, after, callback) {
var indicatorEl = $('.loading-indicator'); var indicatorEl = $('.loading-indicator');

@ -0,0 +1,123 @@
'use strict';
/* globals define, app, translator, config, socket, ajaxify */
define(function() {
var Browsing = {};
Browsing.onUpdateUsersInRoom = function(data) {
if(data && data.room.indexOf('topic') !== -1) {
var activeEl = $('.thread_active_users');
// remove users that are no longer here
activeEl.find('a').each(function(index, element) {
if(element) {
var uid = $(element).attr('data-uid');
var absent = data.users.every(function(user) {
return parseInt(user.uid, 10) !== parseInt(uid, 10);
});
if (absent) {
$(element).remove();
}
}
});
var i=0, icon;
// add self
for(i = 0; i<data.users.length; ++i) {
if(parseInt(data.users[i].uid, 10) === parseInt(app.uid, 10)) {
icon = createUserIcon(data.users[i].uid, data.users[i].picture, data.users[i].userslug, data.users[i].username);
activeEl.prepend(icon);
data.users.splice(i, 1);
break;
}
}
// add other users
for(i=0; i<data.users.length; ++i) {
icon = createUserIcon(data.users[i].uid, data.users[i].picture, data.users[i].userslug, data.users[i].username);
activeEl.append(icon);
if(activeEl.children().length > 8) {
break;
}
}
activeEl.find('a[data-uid] img').tooltip({
placement: 'top'
});
var remainingUsers = data.users.length - 9;
remainingUsers = remainingUsers < 0 ? 0 : remainingUsers;
var anonymousCount = parseInt(data.anonymousCount, 10);
activeEl.find('.anonymous-box').remove();
if(anonymousCount || remainingUsers) {
var anonLink = $('<div class="anonymous-box inline-block"><i class="fa fa-user"></i></div>');
activeEl.append(anonLink);
var title = '';
if(remainingUsers && anonymousCount) {
title = '[[topic:more_users_and_guests, ' + remainingUsers + ', ' + anonymousCount + ']]';
} else if(remainingUsers) {
title = '[[topic:more_users, ' + remainingUsers + ']]';
} else {
title = '[[topic:more_guests, ' + anonymousCount + ']]';
}
translator.translate(title, function(translated) {
$('.anonymous-box').tooltip({
placement: 'top',
title: translated
});
});
}
getReplyingUsers();
}
app.populateOnlineUsers();
};
Browsing.onUserOnline = function(err, data) {
app.populateOnlineUsers();
updateBrowsingUsers(data);
};
function updateBrowsingUsers(data) {
var activeEl = $('.thread_active_users');
var user = activeEl.find('a[data-uid="'+ data.uid + '"]');
if (user.length && !data.online) {
user.parent().remove();
} else if(!user.length && data.online) {
user = createUserIcon(data.uid, data.picture, data.userslug, data.username);
activeEl.append(user);
activeEl.find('a[data-uid] img').tooltip({
placement: 'top'
});
}
}
function createUserIcon(uid, picture, userslug, username) {
if(!$('.thread_active_users').find('[data-uid="' + uid + '"]').length) {
return $('<div class="inline-block"><a data-uid="' + uid + '" href="' + config.relative_path + '/user/' + userslug + '"><img title="' + username + '" src="'+ picture +'"/></a></div>');
}
}
function getReplyingUsers() {
var activeEl = $('.thread_active_users');
socket.emit('modules.composer.getUsersByTid', ajaxify.variables.get('topic_id'), function(err, uids) {
if (uids && uids.length) {
for(var x=0;x<uids.length;x++) {
activeEl.find('[data-uid="' + uids[x] + '"]').addClass('replying');
}
}
});
}
return Browsing;
});

@ -0,0 +1,152 @@
'use strict';
/* globals app, ajaxify, define, socket */
define(['forum/topic/browsing', 'forum/topic/postTools', 'forum/topic/threadTools'], function(browsing, postTools, threadTools) {
var Events = {};
var events = {
'event:update_users_in_room': browsing.onUpdateUsersInRoom,
'user.isOnline': browsing.onUserOnline,
'event:voted': updatePostVotesAndUserReputation,
'event:favourited': updateFavouriteCount,
'event:topic_deleted': toggleTopicDeleteState,
'event:topic_restored': toggleTopicDeleteState,
'event:topic_locked': toggleTopicLockedState,
'event:topic_unlocked': toggleTopicLockedState,
'event:topic_pinned': toggleTopicPinnedState,
'event:topic_unpinned': toggleTopicPinnedState,
'event:topic_moved': onTopicMoved,
'event:post_edited': onPostEdited,
'event:post_deleted': togglePostDeleteState,
'event:post_restored': togglePostDeleteState,
'posts.favourite': togglePostFavourite,
'posts.unfavourite': togglePostFavourite,
'posts.upvote': togglePostVote,
'posts.downvote': togglePostVote,
'posts.unvote': togglePostVote,
'event:topic.toggleReply': toggleReply,
};
Events.init = function() {
for(var eventName in events) {
if (events.hasOwnProperty(eventName)) {
socket.on(eventName, events[eventName]);
}
}
};
Events.removeListeners = function() {
for(var eventName in events) {
if (events.hasOwnProperty(eventName)) {
socket.removeListener(eventName, events[eventName]);
}
}
};
function updatePostVotesAndUserReputation(data) {
var votes = $('li[data-pid="' + data.post.pid + '"] .votes'),
reputationElements = $('.reputation[data-uid="' + data.post.uid + '"]');
votes.html(data.post.votes).attr('data-votes', data.post.votes);
reputationElements.html(data.user.reputation).attr('data-reputation', data.user.reputation);
}
function updateFavouriteCount(data) {
$('li[data-pid="' + data.post.pid + '"] .favouriteCount').html(data.post.reputation).attr('data-favourites', data.post.reputation);
}
function toggleTopicDeleteState(data) {
threadTools.setLockedState(data);
threadTools.setDeleteState(data);
}
function toggleTopicLockedState(data) {
threadTools.setLockedState(data);
app.alertSuccess(data.isLocked ? '[[topic:topic_lock_success]]' : '[[topic:topic_unlock_success]]');
}
function toggleTopicPinnedState(data) {
threadTools.setPinnedState(data);
app.alertSuccess(data.isPinned ? '[[topic:topic_pin_success]]' : '[[topic:topic_unpin_success]]');
}
function onTopicMoved(data) {
if (data && data.tid > 0) {
ajaxify.go('topic/' + data.tid);
}
}
function onPostEdited(data) {
var editedPostEl = $('#content_' + data.pid),
editedPostTitle = $('#topic_title_' + data.pid);
if (editedPostTitle.length) {
editedPostTitle.fadeOut(250, function() {
editedPostTitle.html(data.title);
editedPostTitle.fadeIn(250);
});
}
editedPostEl.fadeOut(250, function() {
editedPostEl.html(data.content);
editedPostEl.find('img').addClass('img-responsive');
editedPostEl.fadeIn(250);
});
}
function togglePostDeleteState(data) {
var postEl = $('#post-container li[data-pid="' + data.pid + '"]');
if (postEl.length) {
postEl.toggleClass('deleted');
postTools.toggle(data.pid, postEl.hasClass('deleted'));
postTools.updatePostCount();
}
}
function togglePostFavourite(data) {
var favBtn = $('li[data-pid="' + data.post.pid + '"] .favourite');
if (favBtn.length) {
favBtn.addClass('btn-warning')
.attr('data-favourited', data.isFavourited);
var icon = favBtn.find('i');
var className = icon.attr('class');
if (data.isFavourited ? className.indexOf('-o') !== -1 : className.indexOf('-o') === -1) {
icon.attr('class', data.isFavourited ? className.replace('-o', '') : className + '-o');
}
}
}
function togglePostVote(data) {
var post = $('li[data-pid="' + data.post.pid + '"]');
post.find('.upvote').toggleClass('btn-primary upvoted', data.upvote);
post.find('.downvote').toggleClass('btn-primary downvoted', data.downvote);
}
function toggleReply(data) {
$('.thread_active_users [data-uid="' + data.uid + '"]').toggleClass('replying', data.isReplying);
}
return Events;
});

@ -2,7 +2,7 @@
/* globals define, app, translator, ajaxify, socket, bootbox */ /* globals define, app, translator, ajaxify, socket, bootbox */
define(['composer', 'share'], function(composer, share) { define(['composer', 'share', 'navigator'], function(composer, share, navigator) {
var PostTools = {}, var PostTools = {},
topicName; topicName;
@ -13,8 +13,42 @@ define(['composer', 'share'], function(composer, share) {
addPostHandlers(tid, threadState); addPostHandlers(tid, threadState);
share.addShareHandlers(topicName); share.addShareHandlers(topicName);
addFavouriteHandler();
};
PostTools.toggle = function(pid, isDeleted) {
var postEl = $('#post-container li[data-pid="' + pid + '"]');
postEl.find('.quote, .favourite, .post_reply, .chat').toggleClass('none', isDeleted);
translator.translate(isDeleted ? ' [[topic:restore]]' : ' [[topic:delete]]', function(translated) {
postEl.find('.delete').find('span').html(translated);
});
}; };
PostTools.updatePostCount = function() {
socket.emit('topics.postcount', ajaxify.variables.get('topic_id'), function(err, postCount) {
if (!err) {
$('.topic-post-count').html(postCount);
navigator.setCount(postCount);
}
});
};
function addFavouriteHandler() {
$('#post-container').on('mouseenter', '.favourite-tooltip', function(e) {
if (!$(this).data('users-loaded')) {
$(this).data('users-loaded', "true");
var pid = $(this).parents('.post-row').attr('data-pid');
var el = $(this).attr('title', "Loading...");
socket.emit('posts.getFavouritedUsers', pid, function(err, usernames) {
el.attr('title', usernames).tooltip('show');
});
}
});
}
function addPostHandlers(tid, threadState) { function addPostHandlers(tid, threadState) {
$('.topic').on('click', '.post_reply', function() { $('.topic').on('click', '.post_reply', function() {
if (threadState.locked !== '1') { if (threadState.locked !== '1') {

@ -7,6 +7,19 @@ define(['forum/topic/fork', 'forum/topic/move'], function(fork, move) {
var ThreadTools = {}; var ThreadTools = {};
ThreadTools.init = function(tid, threadState) { ThreadTools.init = function(tid, threadState) {
ThreadTools.threadState = threadState;
if (threadState.locked === '1') {
ThreadTools.setLockedState({tid: tid, isLocked: true});
}
if (threadState.deleted === '1') {
ThreadTools.setDeleteState({tid: tid, isDelete: true});
}
if (threadState.pinned === '1') {
ThreadTools.setPinnedState({tid: tid, isPinned: true});
}
if (ajaxify.variables.get('expose_tools') === '1') { if (ajaxify.variables.get('expose_tools') === '1') {
@ -57,7 +70,7 @@ define(['forum/topic/fork', 'forum/topic/move'], function(fork, move) {
} }
socket.emit('topics.followCheck', tid, function(err, state) { socket.emit('topics.followCheck', tid, function(err, state) {
setFollowState(state, false); setFollowState(state);
}); });
$('.posts').on('click', '.follow', function() { $('.posts').on('click', '.follow', function() {
@ -72,22 +85,64 @@ define(['forum/topic/fork', 'forum/topic/move'], function(fork, move) {
}); });
} }
setFollowState(state, true); setFollowState(state);
app.alertSuccess(state ? '[[topic:following_topic.message]]' : '[[topic:not_following_topic.message]]');
}); });
return false; return false;
}); });
};
ThreadTools.setLockedState = function(data) {
var threadEl = $('#post-container');
if (parseInt(data.tid, 10) === parseInt(threadEl.attr('data-tid'), 10)) {
translator.translate('<i class="fa fa-fw fa-' + (data.isLocked ? 'un': '') + 'lock"></i> [[topic:thread_tools.' + (data.isLocked ? 'un': '') + 'lock]]', function(translated) {
$('.lock_thread').html(translated);
});
threadEl.find('.post_reply').html(data.isLocked ? 'Locked <i class="fa fa-lock"></i>' : 'Reply <i class="fa fa-reply"></i>');
threadEl.find('.quote, .edit, .delete').toggleClass('none', data.isLocked);
$('.topic-main-buttons .post_reply').attr('disabled', data.isLocked).html(data.isLocked ? 'Locked <i class="fa fa-lock"></i>' : 'Reply');
ThreadTools.threadState.locked = data.isLocked ? '1' : '0';
}
}; };
function setFollowState(state, alert) { ThreadTools.setDeleteState = function(data) {
var threadEl = $('#post-container');
if (parseInt(data.tid, 10) === parseInt(threadEl.attr('data-tid'), 10)) {
translator.translate('<i class="fa fa-fw ' + (data.isDelete ? 'fa-comment' : 'fa-trash-o') + '"></i> [[topic:thread_tools.' + (data.isDelete ? 'restore' : 'delete') + ']]', function(translated) {
$('.delete_thread span').html(translated);
});
$('.posts .follow').toggleClass('btn-success', state).attr('title', state ? 'You are currently receiving updates to this topic' : 'Be notified of new replies in this topic'); threadEl.toggleClass('deleted', data.isDelete);
ThreadTools.threadState.deleted = data.isDelete ? '1' : '0';
if(alert) { if (data.isDelete) {
app.alertSuccess(state ? '[[topic:following_topic.message]]' : '[[topic:not_following_topic.message]]'); translator.translate('[[topic:deleted_message]]', function(translated) {
$('<div id="thread-deleted" class="alert alert-warning">' + translated + '</div>').insertBefore(threadEl);
});
} else {
$('#thread-deleted').remove();
} }
} }
};
ThreadTools.setPinnedState = function(data) {
var threadEl = $('#post-container');
if (parseInt(data.tid, 10) === parseInt(threadEl.attr('data-tid'), 10)) {
translator.translate('<i class="fa fa-fw fa-thumb-tack"></i> [[topic:thread_tools.' + (data.isPinned ? 'unpin' : 'pin') + ']]', function(translated) {
$('.pin_thread').html(translated);
ThreadTools.threadState.pinned = data.isPinned ? '1' : '0';
});
}
}
function setFollowState(state) {
$('.posts .follow').toggleClass('btn-success', state).attr('title', state ? 'You are currently receiving updates to this topic' : 'Be notified of new replies in this topic');
}
return ThreadTools; return ThreadTools;

@ -6,6 +6,12 @@ define(['forum/recent', 'topicSelect'], function(recent, topicSelect) {
var Unread = {}, var Unread = {},
loadingMoreTopics = false; loadingMoreTopics = false;
$(window).on('action:ajaxify.start', function(ev, data) {
if(data.url.indexOf('unread') !== 0) {
recent.removeListeners();
}
});
Unread.init = function() { Unread.init = function() {
app.enterRoom('recent_posts'); app.enterRoom('recent_posts');

@ -48,7 +48,9 @@ var async = require('async'),
user: { user: {
reputation: newreputation reputation: newreputation
}, },
post: postData post: postData,
upvote: type === 'upvote' && !unvote,
downvote: type === 'downvote' && !unvote
}); });
}); });
}); });
@ -154,7 +156,7 @@ var async = require('async'),
if (uid === 0) { if (uid === 0) {
return callback(new Error('[[error:not-logged-in]]')); return callback(new Error('[[error:not-logged-in]]'));
} }
var isFavouriting = type === 'favourite';
posts.getPostFields(pid, ['pid', 'uid', 'timestamp'], function (err, postData) { posts.getPostFields(pid, ['pid', 'uid', 'timestamp'], function (err, postData) {
if (err) { if (err) {
return callback(err); return callback(err);
@ -165,22 +167,22 @@ var async = require('async'),
return callback(err); return callback(err);
} }
if (type === 'favourite' && hasFavourited) { if (isFavouriting && hasFavourited) {
return callback(new Error('[[error:already-favourited]]')); return callback(new Error('[[error:already-favourited]]'));
} }
if (type === 'unfavourite' && !hasFavourited) { if (!isFavouriting && !hasFavourited) {
return callback(new Error('[[error:alrady-unfavourited]]')); return callback(new Error('[[error:alrady-unfavourited]]'));
} }
if (type === 'favourite') { if (isFavouriting) {
db.sortedSetAdd('uid:' + uid + ':favourites', postData.timestamp, pid); db.sortedSetAdd('uid:' + uid + ':favourites', postData.timestamp, pid);
} else { } else {
db.sortedSetRemove('uid:' + uid + ':favourites', pid); db.sortedSetRemove('uid:' + uid + ':favourites', pid);
} }
db[type === 'favourite' ? 'setAdd' : 'setRemove']('pid:' + pid + ':users_favourited', uid, function(err) { db[isFavouriting ? 'setAdd' : 'setRemove']('pid:' + pid + ':users_favourited', uid, function(err) {
if (err) { if (err) {
return callback(err); return callback(err);
} }
@ -192,7 +194,8 @@ var async = require('async'),
postData.reputation = count; postData.reputation = count;
posts.setPostField(pid, 'reputation', count, function(err) { posts.setPostField(pid, 'reputation', count, function(err) {
callback(err, { callback(err, {
post: postData post: postData,
isFavourited: isFavouriting
}); });
}); });
}); });

@ -286,7 +286,7 @@ function updateRoomBrowsingText(roomName) {
return user.status !== 'offline'; return user.status !== 'offline';
}); });
io.sockets.in(roomName).emit('get_users_in_room', { io.sockets.in(roomName).emit('event:update_users_in_room', {
users: users, users: users,
anonymousCount: anonymousCount, anonymousCount: anonymousCount,
room: roomName room: roomName

@ -29,7 +29,7 @@ var posts = require('../posts'),
var stopTracking = function(replyObj) { var stopTracking = function(replyObj) {
if (isLast(replyObj.uid, replyObj.tid)) { if (isLast(replyObj.uid, replyObj.tid)) {
server.in('topic_' + replyObj.tid).emit('event:topic.replyStop', replyObj.uid); server.in('topic_' + replyObj.tid).emit('event:topic.toggleReply', {uid: replyObj.uid, isReplying: false});
} }
clearInterval(replyObj.timer); clearInterval(replyObj.timer);
@ -106,7 +106,7 @@ SocketModules.composer.renderHelp = function(socket, data, callback) {
SocketModules.composer.register = function(socket, data) { SocketModules.composer.register = function(socket, data) {
var now = Date.now(); var now = Date.now();
server.in('topic_' + data.tid).emit('event:topic.replyStart', data.uid); server.in('topic_' + data.tid).emit('event:topic.toggleReply', {uid: data.uid, isReplying: true});
data.socket = socket; data.socket = socket;
data.lastPing = now; data.lastPing = now;

@ -77,7 +77,7 @@ function favouriteCommand(command, eventName, socket, data, callback) {
return callback(err); return callback(err);
} }
socket.emit('posts.' + command, data.pid); socket.emit('posts.' + command, result);
if(data.room_id && result && eventName) { if(data.room_id && result && eventName) {
websockets.in(data.room_id).emit('event:' + eventName, result); websockets.in(data.room_id).emit('event:' + eventName, result);

Loading…
Cancel
Save