refactor post tools

v1.18.x
barisusakli 8 years ago
parent a112655bd2
commit 827e4b4ffd

@ -0,0 +1,67 @@
'use strict';
/* globals define, app, socket */
define('forum/topic/move-post', [], function () {
var MovePost = {};
MovePost.openMovePostModal = function(button) {
app.parseAndTranslate('partials/move_post_modal', {}, function (html) {
var moveModal = $(html);
var moveBtn = moveModal.find('#move_post_commit'),
topicId = moveModal.find('#topicId');
moveModal.on('hidden.bs.modal', function () {
moveModal.remove();
});
showMoveModal(moveModal);
moveModal.find('.close, #move_post_cancel').on('click', function () {
moveModal.addClass('hide');
});
topicId.on('keyup change', function () {
moveBtn.attr('disabled', !topicId.val());
});
moveBtn.on('click', function () {
movePost(button.parents('[data-pid]'), button.parents('[data-pid]').attr('data-pid'), topicId.val(), function () {
moveModal.modal('hide');
topicId.val('');
});
});
});
};
function showMoveModal(modal) {
modal.modal('show')
.css("position", "fixed")
.css("left", Math.max(0, (($(window).width() - modal.outerWidth()) / 2) + $(window).scrollLeft()) + "px")
.css("top", "0px")
.css("z-index", "2000");
}
function movePost(post, pid, tid, callback) {
socket.emit('posts.movePost', {pid: pid, tid: tid}, function (err) {
if (err) {
app.alertError(err.message);
return callback();
}
post.fadeOut(500, function () {
post.remove();
});
app.alertSuccess('[[topic:post_moved]]');
callback();
});
}
return MovePost;
});

@ -2,7 +2,14 @@
/* globals define, app, ajaxify, bootbox, socket, templates, utils, config */
define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator'], function (share, navigator, components, translator) {
define('forum/topic/postTools', [
'share',
'navigator',
'components',
'translator',
'forum/topic/votes',
'forum/topic/move-post'
], function (share, navigator, components, translator, votes, movePost) {
var PostTools = {};
@ -17,7 +24,7 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator
share.addShareHandlers(ajaxify.data.titleRaw);
addVoteHandler();
votes.addVoteHandler();
PostTools.updatePostCount(ajaxify.data.postcount);
};
@ -69,62 +76,6 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator
navigator.setCount(postCount);
};
function addVoteHandler() {
components.get('topic').on('mouseenter', '[data-pid] [component="post/vote-count"]', loadDataAndCreateTooltip);
components.get('topic').on('mouseout', '[data-pid] [component="post/vote-count"]', function () {
var el = $(this).parent();
el.on('shown.bs.tooltip', function () {
$('.tooltip').tooltip('destroy');
el.off('shown.bs.tooltip');
});
$('.tooltip').tooltip('destroy');
});
}
function loadDataAndCreateTooltip(e) {
e.stopPropagation();
var $this = $(this);
var el = $this.parent();
var pid = el.parents('[data-pid]').attr('data-pid');
$('.tooltip').tooltip('destroy');
$this.off('mouseenter', loadDataAndCreateTooltip);
socket.emit('posts.getUpvoters', [pid], function (err, data) {
if (err) {
return app.alertError(err.message);
}
if (data.length) {
createTooltip(el, data[0]);
}
$this.off('mouseenter').on('mouseenter', loadDataAndCreateTooltip);
});
return false;
}
function createTooltip(el, data) {
function doCreateTooltip(title) {
el.attr('title', title).tooltip('fixTitle').tooltip('show');
}
var usernames = data.usernames;
if (!usernames.length) {
return;
}
if (usernames.length + data.otherCount > 6) {
usernames = usernames.join(', ').replace(/,/g, '|');
translator.translate('[[topic:users_and_others, ' + usernames + ', ' + data.otherCount + ']]', function (translated) {
translated = translated.replace(/\|/g, ',');
doCreateTooltip(translated);
});
} else {
usernames = usernames.join(', ');
doCreateTooltip(usernames);
}
}
function addPostHandlers(tid) {
var postContainer = components.get('topic');
@ -150,19 +101,19 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator
});
postContainer.on('click', '[component="post/bookmark"]', function () {
bookmarkPost($(this), getData($(this), 'data-pid'));
return bookmarkPost($(this), getData($(this), 'data-pid'));
});
postContainer.on('click', '[component="post/upvote"]', function () {
return toggleVote($(this), '.upvoted', 'posts.upvote');
return votes.toggleVote($(this), '.upvoted', 'posts.upvote');
});
postContainer.on('click', '[component="post/downvote"]', function () {
return toggleVote($(this), '.downvoted', 'posts.downvote');
return votes.toggleVote($(this), '.downvoted', 'posts.downvote');
});
postContainer.on('click', '[component="post/vote-count"]', function () {
showVotes(getData($(this), 'data-pid'));
votes.showVotes(getData($(this), 'data-pid'));
});
postContainer.on('click', '[component="post/flag"]', function () {
@ -237,7 +188,7 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator
});
postContainer.on('click', '[component="post/move"]', function () {
openMovePostModal($(this));
movePost.openMovePostModal($(this));
});
postContainer.on('click', '[component="post/chat"]', function () {
@ -347,55 +298,6 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator
return false;
}
function toggleVote(button, className, method) {
var post = button.parents('[data-pid]'),
currentState = post.find(className).length;
socket.emit(currentState ? 'posts.unvote' : method , {
pid: post.attr('data-pid'),
room_id: app.currentRoom
}, function (err) {
if (err) {
if (err.message === 'self-vote') {
showVotes(post.attr('data-pid'));
} else {
app.alertError(err.message);
}
}
});
return false;
}
function showVotes(pid) {
socket.emit('posts.getVoters', {pid: pid, cid: ajaxify.data.cid}, function (err, data) {
if (err) {
if (err.message === '[[error:no-privileges]]') {
return;
}
// Only show error if it's an unexpected error.
return app.alertError(err.message);
}
templates.parse('partials/modals/votes_modal', data, function (html) {
translator.translate(html, function (translated) {
var dialog = bootbox.dialog({
title: 'Voters',
message: translated,
className: 'vote-modal',
show: true
});
dialog.on('click', function () {
dialog.modal('hide');
});
});
});
});
}
function getData(button, data) {
return button.parents('[data-pid]').attr(data);
}
@ -449,67 +351,6 @@ define('forum/topic/postTools', ['share', 'navigator', 'components', 'translator
});
}
function openMovePostModal(button) {
parseMoveModal(function (html) {
var moveModal = $(html);
var moveBtn = moveModal.find('#move_post_commit'),
topicId = moveModal.find('#topicId');
moveModal.on('hidden.bs.modal', function () {
moveModal.remove();
});
showMoveModal(moveModal);
moveModal.find('.close, #move_post_cancel').on('click', function () {
moveModal.addClass('hide');
});
topicId.on('keyup change', function () {
moveBtn.attr('disabled', !topicId.val());
});
moveBtn.on('click', function () {
movePost(button.parents('[data-pid]'), getData(button, 'data-pid'), topicId.val(), function () {
moveModal.modal('hide');
topicId.val('');
});
});
});
}
function parseMoveModal(callback) {
templates.parse('partials/move_post_modal', {}, function (html) {
translator.translate(html, callback);
});
}
function showMoveModal(modal) {
modal.modal('show')
.css("position", "fixed")
.css("left", Math.max(0, (($(window).width() - modal.outerWidth()) / 2) + $(window).scrollLeft()) + "px")
.css("top", "0px")
.css("z-index", "2000");
}
function movePost(post, pid, tid, callback) {
socket.emit('posts.movePost', {pid: pid, tid: tid}, function (err) {
if (err) {
app.alertError(err.message);
return callback();
}
post.fadeOut(500, function () {
post.remove();
});
app.alertSuccess('[[topic:post_moved]]');
callback();
});
}
function openChat(button) {
var post = button.parents('[data-pid]');

@ -0,0 +1,117 @@
'use strict';
/* globals define, app, socket, ajaxify, templates, bootbox */
define('forum/topic/votes', ['components', 'translator'], function (components, translator) {
var Votes = {};
Votes.addVoteHandler = function () {
components.get('topic').on('mouseenter', '[data-pid] [component="post/vote-count"]', loadDataAndCreateTooltip);
components.get('topic').on('mouseout', '[data-pid] [component="post/vote-count"]', function () {
var el = $(this).parent();
el.on('shown.bs.tooltip', function () {
$('.tooltip').tooltip('destroy');
el.off('shown.bs.tooltip');
});
$('.tooltip').tooltip('destroy');
});
};
function loadDataAndCreateTooltip(e) {
e.stopPropagation();
var $this = $(this);
var el = $this.parent();
var pid = el.parents('[data-pid]').attr('data-pid');
$('.tooltip').tooltip('destroy');
$this.off('mouseenter', loadDataAndCreateTooltip);
socket.emit('posts.getUpvoters', [pid], function (err, data) {
if (err) {
return app.alertError(err.message);
}
if (data.length) {
createTooltip(el, data[0]);
}
$this.off('mouseenter').on('mouseenter', loadDataAndCreateTooltip);
});
return false;
}
function createTooltip(el, data) {
function doCreateTooltip(title) {
el.attr('title', title).tooltip('fixTitle').tooltip('show');
}
var usernames = data.usernames;
if (!usernames.length) {
return;
}
if (usernames.length + data.otherCount > 6) {
usernames = usernames.join(', ').replace(/,/g, '|');
translator.translate('[[topic:users_and_others, ' + usernames + ', ' + data.otherCount + ']]', function (translated) {
translated = translated.replace(/\|/g, ',');
doCreateTooltip(translated);
});
} else {
usernames = usernames.join(', ');
doCreateTooltip(usernames);
}
}
Votes.toggleVote = function (button, className, method) {
var post = button.parents('[data-pid]'),
currentState = post.find(className).length;
socket.emit(currentState ? 'posts.unvote' : method , {
pid: post.attr('data-pid'),
room_id: app.currentRoom
}, function (err) {
if (err) {
if (err.message === 'self-vote') {
Votes.showVotes(post.attr('data-pid'));
} else {
app.alertError(err.message);
}
}
});
return false;
};
Votes.showVotes = function (pid) {
socket.emit('posts.getVoters', {pid: pid, cid: ajaxify.data.cid}, function (err, data) {
if (err) {
if (err.message === '[[error:no-privileges]]') {
return;
}
// Only show error if it's an unexpected error.
return app.alertError(err.message);
}
templates.parse('partials/modals/votes_modal', data, function (html) {
translator.translate(html, function (translated) {
var dialog = bootbox.dialog({
title: 'Voters',
message: translated,
className: 'vote-modal',
show: true
});
dialog.on('click', function () {
dialog.modal('hide');
});
});
});
});
};
return Votes;
});
Loading…
Cancel
Save