2014-10-08 15:36:47 -04:00
|
|
|
'use strict';
|
|
|
|
|
|
2015-10-24 21:29:20 -04:00
|
|
|
/* globals define, app, ajaxify, socket, bootbox, templates */
|
2014-10-08 15:36:47 -04:00
|
|
|
|
2015-12-24 12:08:10 +02:00
|
|
|
define('forum/topic/threadTools', [
|
|
|
|
|
'forum/topic/fork',
|
|
|
|
|
'forum/topic/move',
|
|
|
|
|
'forum/topic/delete-posts',
|
|
|
|
|
'components',
|
|
|
|
|
'translator'
|
|
|
|
|
], function(fork, move, deletePosts, components, translator) {
|
2014-10-08 15:36:47 -04:00
|
|
|
|
|
|
|
|
var ThreadTools = {};
|
|
|
|
|
|
2015-04-02 22:34:23 -04:00
|
|
|
ThreadTools.init = function(tid) {
|
2015-10-24 21:29:20 -04:00
|
|
|
|
|
|
|
|
renderMenu();
|
|
|
|
|
|
2015-10-24 22:13:30 -04:00
|
|
|
var topicContainer = $('.topic');
|
2015-10-24 21:29:20 -04:00
|
|
|
|
|
|
|
|
topicContainer.on('click', '[component="topic/delete"]', function() {
|
2015-04-02 22:06:18 -04:00
|
|
|
topicCommand('delete', tid);
|
|
|
|
|
return false;
|
|
|
|
|
});
|
|
|
|
|
|
2015-10-24 21:29:20 -04:00
|
|
|
topicContainer.on('click', '[component="topic/restore"]', function() {
|
2015-04-02 22:06:18 -04:00
|
|
|
topicCommand('restore', tid);
|
2014-10-08 15:36:47 -04:00
|
|
|
return false;
|
|
|
|
|
});
|
|
|
|
|
|
2015-10-24 21:29:20 -04:00
|
|
|
topicContainer.on('click', '[component="topic/purge"]', function() {
|
2014-10-08 15:36:47 -04:00
|
|
|
topicCommand('purge', tid);
|
|
|
|
|
return false;
|
|
|
|
|
});
|
|
|
|
|
|
2015-10-24 21:29:20 -04:00
|
|
|
topicContainer.on('click', '[component="topic/lock"]', function() {
|
2015-07-06 14:33:43 -04:00
|
|
|
socket.emit('topics.lock', {tids: [tid], cid: ajaxify.data.cid});
|
2015-04-02 22:06:18 -04:00
|
|
|
return false;
|
|
|
|
|
});
|
|
|
|
|
|
2015-10-24 21:29:20 -04:00
|
|
|
topicContainer.on('click', '[component="topic/unlock"]', function() {
|
2015-07-06 14:33:43 -04:00
|
|
|
socket.emit('topics.unlock', {tids: [tid], cid: ajaxify.data.cid});
|
2014-10-08 15:36:47 -04:00
|
|
|
return false;
|
|
|
|
|
});
|
|
|
|
|
|
2015-10-24 21:29:20 -04:00
|
|
|
topicContainer.on('click', '[component="topic/pin"]', function() {
|
2015-07-06 14:33:43 -04:00
|
|
|
socket.emit('topics.pin', {tids: [tid], cid: ajaxify.data.cid});
|
2015-04-02 22:06:18 -04:00
|
|
|
return false;
|
|
|
|
|
});
|
|
|
|
|
|
2015-10-24 21:29:20 -04:00
|
|
|
topicContainer.on('click', '[component="topic/unpin"]', function() {
|
2015-07-06 14:33:43 -04:00
|
|
|
socket.emit('topics.unpin', {tids: [tid], cid: ajaxify.data.cid});
|
2014-10-08 15:36:47 -04:00
|
|
|
return false;
|
|
|
|
|
});
|
|
|
|
|
|
2016-01-04 11:22:35 +02:00
|
|
|
topicContainer.on('click', '[component="topic/mark-unread"]', function() {
|
2016-02-01 19:52:26 +02:00
|
|
|
socket.emit('topics.markUnread', tid, function(err) {
|
|
|
|
|
if (err) {
|
|
|
|
|
return app.alertError(err);
|
|
|
|
|
}
|
|
|
|
|
app.alertSuccess('[[topic:mark_unread.success]]');
|
|
|
|
|
});
|
2016-01-04 11:22:35 +02:00
|
|
|
return false;
|
|
|
|
|
});
|
|
|
|
|
|
2015-10-24 21:29:20 -04:00
|
|
|
topicContainer.on('click', '[component="topic/mark-unread-for-all"]', function() {
|
2014-10-08 15:36:47 -04:00
|
|
|
var btn = $(this);
|
|
|
|
|
socket.emit('topics.markAsUnreadForAll', [tid], function(err) {
|
2015-04-02 22:06:18 -04:00
|
|
|
if (err) {
|
2014-10-08 15:36:47 -04:00
|
|
|
return app.alertError(err.message);
|
|
|
|
|
}
|
|
|
|
|
app.alertSuccess('[[topic:markAsUnreadForAll.success]]');
|
|
|
|
|
btn.parents('.thread-tools.open').find('.dropdown-toggle').trigger('click');
|
|
|
|
|
});
|
|
|
|
|
return false;
|
|
|
|
|
});
|
|
|
|
|
|
2015-10-24 21:29:20 -04:00
|
|
|
topicContainer.on('click', '[component="topic/move"]', function() {
|
2015-07-06 14:33:43 -04:00
|
|
|
move.init([tid], ajaxify.data.cid);
|
2014-10-08 15:36:47 -04:00
|
|
|
return false;
|
|
|
|
|
});
|
|
|
|
|
|
2015-12-24 12:08:10 +02:00
|
|
|
deletePosts.init();
|
2014-10-08 15:36:47 -04:00
|
|
|
fork.init();
|
|
|
|
|
|
2016-05-18 19:02:43 +03:00
|
|
|
$('.topic').on('click', '[component="topic/following"]', function() {
|
2016-05-19 14:20:34 +03:00
|
|
|
changeWatching('follow');
|
2016-05-18 19:02:43 +03:00
|
|
|
});
|
2016-05-19 14:20:34 +03:00
|
|
|
$('.topic').on('click', '[component="topic/not-following"]', function() {
|
|
|
|
|
changeWatching('unfollow');
|
2016-05-18 19:02:43 +03:00
|
|
|
});
|
|
|
|
|
$('.topic').on('click', '[component="topic/ignoring"]', function() {
|
2016-05-19 14:20:34 +03:00
|
|
|
changeWatching('ignore');
|
2016-05-18 19:02:43 +03:00
|
|
|
});
|
2015-03-23 14:42:17 -04:00
|
|
|
|
2016-05-19 14:20:34 +03:00
|
|
|
function changeWatching(type) {
|
2016-05-18 19:02:43 +03:00
|
|
|
socket.emit('topics.changeWatching', {tid: tid, type: type}, function(err) {
|
2015-04-02 22:06:18 -04:00
|
|
|
if (err) {
|
2014-10-08 15:36:47 -04:00
|
|
|
return app.alert({
|
|
|
|
|
type: 'danger',
|
|
|
|
|
alert_id: 'topic_follow',
|
|
|
|
|
title: '[[global:please_log_in]]',
|
|
|
|
|
message: '[[topic:login_to_subscribe]]',
|
|
|
|
|
timeout: 5000
|
|
|
|
|
});
|
|
|
|
|
}
|
2016-05-18 19:02:43 +03:00
|
|
|
var message = '';
|
|
|
|
|
if (type === 'follow') {
|
|
|
|
|
message = '[[topic:following_topic.message]]';
|
|
|
|
|
} else if (type === 'unfollow') {
|
|
|
|
|
message = '[[topic:not_following_topic.message]]';
|
|
|
|
|
} else if (type === 'ignore') {
|
|
|
|
|
message = '[[topic:ignoring_topic.message]]';
|
|
|
|
|
}
|
|
|
|
|
setFollowState(type);
|
2014-10-08 15:36:47 -04:00
|
|
|
|
|
|
|
|
app.alert({
|
|
|
|
|
alert_id: 'follow_thread',
|
2016-05-18 19:02:43 +03:00
|
|
|
message: message,
|
2014-10-08 15:36:47 -04:00
|
|
|
type: 'success',
|
|
|
|
|
timeout: 5000
|
|
|
|
|
});
|
2016-06-02 04:18:24 -04:00
|
|
|
|
|
|
|
|
$(window).trigger('action:topics.changeWatching', {tid: tid, type: type});
|
2014-10-08 15:36:47 -04:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return false;
|
2015-03-23 14:42:17 -04:00
|
|
|
}
|
2014-10-08 15:36:47 -04:00
|
|
|
};
|
|
|
|
|
|
2015-10-24 21:29:20 -04:00
|
|
|
function renderMenu() {
|
2015-10-24 22:29:22 -04:00
|
|
|
$('.topic').on('show.bs.dropdown', '.thread-tools', function () {
|
2015-10-24 21:29:20 -04:00
|
|
|
var $this = $(this);
|
|
|
|
|
var dropdownMenu = $this.find('.dropdown-menu');
|
|
|
|
|
if (dropdownMenu.html()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
socket.emit('topics.loadTopicTools', {tid: ajaxify.data.tid, cid: ajaxify.data.cid}, function(err, data) {
|
|
|
|
|
if (err) {
|
|
|
|
|
return app.alertError(err);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
templates.parse('partials/topic/topic-menu-list', data, function(html) {
|
|
|
|
|
translator.translate(html, function(html) {
|
|
|
|
|
dropdownMenu.html(html);
|
2015-10-29 13:48:58 -04:00
|
|
|
$(window).trigger('action:topic.tools.load');
|
2015-10-24 21:29:20 -04:00
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
});
|
2015-10-24 22:29:22 -04:00
|
|
|
});
|
2015-10-24 21:29:20 -04:00
|
|
|
}
|
|
|
|
|
|
2014-10-08 15:36:47 -04:00
|
|
|
function topicCommand(command, tid) {
|
|
|
|
|
translator.translate('[[topic:thread_tools.' + command + '_confirm]]', function(msg) {
|
|
|
|
|
bootbox.confirm(msg, function(confirm) {
|
2015-09-16 08:35:40 -04:00
|
|
|
if (!confirm) {
|
|
|
|
|
return;
|
2014-10-08 15:36:47 -04:00
|
|
|
}
|
2015-09-16 08:35:40 -04:00
|
|
|
|
|
|
|
|
socket.emit('topics.' + command, {tids: [tid], cid: ajaxify.data.cid}, function(err) {
|
|
|
|
|
if (err) {
|
|
|
|
|
app.alertError(err.message);
|
|
|
|
|
}
|
|
|
|
|
});
|
2014-10-08 15:36:47 -04:00
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ThreadTools.setLockedState = function(data) {
|
2015-03-17 13:38:18 -04:00
|
|
|
var threadEl = components.get('topic');
|
2015-04-02 22:06:18 -04:00
|
|
|
if (parseInt(data.tid, 10) !== parseInt(threadEl.attr('data-tid'), 10)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
2014-10-08 15:36:47 -04:00
|
|
|
|
2016-08-12 12:57:23 +03:00
|
|
|
var isLocked = data.isLocked && !ajaxify.data.privileges.isAdminOrMod;
|
2014-10-08 15:36:47 -04:00
|
|
|
|
2015-04-02 22:06:18 -04:00
|
|
|
components.get('topic/lock').toggleClass('hidden', data.isLocked);
|
|
|
|
|
components.get('topic/unlock').toggleClass('hidden', !data.isLocked);
|
2014-10-08 15:36:47 -04:00
|
|
|
|
2016-08-12 12:57:23 +03:00
|
|
|
var hideReply = (data.isLocked || ajaxify.data.deleted) && !ajaxify.data.privileges.isAdminOrMod;
|
|
|
|
|
|
|
|
|
|
components.get('topic/reply/container').toggleClass('hidden', hideReply);
|
|
|
|
|
components.get('topic/reply/locked').toggleClass('hidden', ajaxify.data.privileges.isAdminOrMod || !data.isLocked || ajaxify.data.deleted);
|
|
|
|
|
|
|
|
|
|
threadEl.find('[component="post"]:not(.deleted) [component="post/reply"], [component="post"]:not(.deleted) [component="post/quote"]').toggleClass('hidden', hideReply);
|
|
|
|
|
threadEl.find('[component="post/edit"], [component="post/delete"]').toggleClass('hidden', isLocked);
|
|
|
|
|
|
2016-10-13 11:42:29 +02:00
|
|
|
threadEl.find('[component="post"][data-uid="' + app.user.uid + '"].deleted [component="post/tools"]').toggleClass('hidden', isLocked);
|
2016-08-12 12:57:23 +03:00
|
|
|
|
2015-04-02 22:06:18 -04:00
|
|
|
$('[component="post/header"] i.fa-lock').toggleClass('hidden', !data.isLocked);
|
2016-08-12 12:57:23 +03:00
|
|
|
$('[component="post/tools"] .dropdown-menu').html('');
|
|
|
|
|
ajaxify.data.locked = data.isLocked;
|
2014-10-08 15:36:47 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
ThreadTools.setDeleteState = function(data) {
|
2015-03-17 13:38:18 -04:00
|
|
|
var threadEl = components.get('topic');
|
2014-10-08 15:36:47 -04:00
|
|
|
if (parseInt(data.tid, 10) !== parseInt(threadEl.attr('data-tid'), 10)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2015-04-02 22:06:18 -04:00
|
|
|
components.get('topic/delete').toggleClass('hidden', data.isDelete);
|
|
|
|
|
components.get('topic/restore').toggleClass('hidden', !data.isDelete);
|
|
|
|
|
components.get('topic/purge').toggleClass('hidden', !data.isDelete);
|
|
|
|
|
components.get('topic/deleted/message').toggleClass('hidden', !data.isDelete);
|
2014-10-08 15:36:47 -04:00
|
|
|
|
2016-08-12 12:57:23 +03:00
|
|
|
var hideReply = data.isDelete && !ajaxify.data.privileges.isAdminOrMod;
|
|
|
|
|
|
|
|
|
|
components.get('topic/reply/container').toggleClass('hidden', hideReply);
|
|
|
|
|
components.get('topic/reply/locked').toggleClass('hidden', ajaxify.data.privileges.isAdminOrMod || !ajaxify.data.locked || data.isDelete);
|
|
|
|
|
threadEl.find('[component="post"]:not(.deleted) [component="post/reply"], [component="post"]:not(.deleted) [component="post/quote"]').toggleClass('hidden', hideReply);
|
|
|
|
|
|
2014-10-08 15:36:47 -04:00
|
|
|
threadEl.toggleClass('deleted', data.isDelete);
|
2016-08-12 12:57:23 +03:00
|
|
|
ajaxify.data.deleted = data.isDelete;
|
2014-10-08 15:36:47 -04:00
|
|
|
};
|
|
|
|
|
|
2016-08-12 12:57:23 +03:00
|
|
|
|
2014-10-08 15:36:47 -04:00
|
|
|
ThreadTools.setPinnedState = function(data) {
|
2015-03-17 13:38:18 -04:00
|
|
|
var threadEl = components.get('topic');
|
2015-04-02 22:06:18 -04:00
|
|
|
if (parseInt(data.tid, 10) !== parseInt(threadEl.attr('data-tid'), 10)) {
|
|
|
|
|
return;
|
2014-10-08 15:36:47 -04:00
|
|
|
}
|
2015-04-02 22:06:18 -04:00
|
|
|
|
|
|
|
|
components.get('topic/pin').toggleClass('hidden', data.isPinned);
|
|
|
|
|
components.get('topic/unpin').toggleClass('hidden', !data.isPinned);
|
|
|
|
|
$('[component="post/header"] i.fa-thumb-tack').toggleClass('hidden', !data.isPinned);
|
2016-08-12 12:57:23 +03:00
|
|
|
ajaxify.data.pinned = data.isPinned;
|
2014-10-08 15:36:47 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
function setFollowState(state) {
|
2016-05-18 19:02:43 +03:00
|
|
|
var menu = components.get('topic/following/menu');
|
|
|
|
|
menu.toggleClass('hidden', state !== 'follow');
|
|
|
|
|
components.get('topic/following/check').toggleClass('fa-check', state === 'follow');
|
|
|
|
|
|
2016-05-19 14:20:34 +03:00
|
|
|
menu = components.get('topic/not-following/menu');
|
2016-05-18 19:02:43 +03:00
|
|
|
menu.toggleClass('hidden', state !== 'unfollow');
|
2016-05-19 14:20:34 +03:00
|
|
|
components.get('topic/not-following/check').toggleClass('fa-check', state === 'unfollow');
|
2016-05-18 19:02:43 +03:00
|
|
|
|
|
|
|
|
menu = components.get('topic/ignoring/menu');
|
|
|
|
|
menu.toggleClass('hidden', state !== 'ignore' );
|
|
|
|
|
components.get('topic/ignoring/check').toggleClass('fa-check', state === 'ignore');
|
2014-10-08 15:36:47 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return ThreadTools;
|
|
|
|
|
});
|