You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

192 lines
4.6 KiB
JavaScript

"use strict";
/* global define, socket, app, templates, RELATIVE_PATH */
define(function() {
var Topics = {};
Topics.init = function() {
var topicsListEl = $('.topics'),
loadMoreEl = $('#topics_loadmore');
this.resolveButtonStates();
topicsListEl.on('click', '[data-action]', function() {
var $this = $(this),
action = $this.attr('data-action'),
tid = $this.parents('[data-tid]').attr('data-tid');
switch (action) {
case 'pin':
if (!$this.hasClass('active')) {
socket.emit('topics.pin', tid, Topics.pin);
} else {
socket.emit('topics.unpin', tid, Topics.unpin);
}
break;
case 'lock':
if (!$this.hasClass('active')) {
socket.emit('topics.lock', tid, Topics.lock);
} else {
socket.emit('topics.unlock', tid, Topics.unlock);
}
break;
case 'delete':
if (!$this.hasClass('active')) {
socket.emit('topics.delete', tid, Topics.setDeleted);
} else {
socket.emit('topics.restore', tid, Topics.restore);
}
break;
}
});
loadMoreEl.on('click', function() {
if (!$(this).hasClass('disabled')) {
var topics = $('.topics li[data-tid]');
if(!topics.length) {
return;
}
var lastTid = parseInt(topics.eq(topics.length - 1).attr('data-tid'), 10);
$(this).html('<i class="fa fa-refresh fa-spin"></i> Retrieving topics');
socket.emit('admin.topics.getMore', {
limit: 10,
after: lastTid
}, function(err, topics) {
if(err) {
return app.alertError(err.message);
}
var btnEl = $('#topics_loadmore');
if (topics.length > 0) {
templates.preload_template('admin/topics', function() {
templates['admin/topics'].parse({topics:[]});
var html = templates.prepare(templates['admin/topics'].blocks.topics).parse({
topics: topics
}),
topicsListEl = $('.topics');
// Fix relative paths
html = html.replace(/\{relative_path\}/g, RELATIVE_PATH);
topicsListEl.html(topicsListEl.html() + html);
Topics.resolveButtonStates();
btnEl.html('Load More Topics');
$('span.timeago').timeago();
});
} else {
// Exhausted all topics
btnEl.addClass('disabled');
btnEl.html('No more topics');
}
});
}
}, false);
};
Topics.resolveButtonStates = function() {
// Resolve proper button state for all topics
var topicsListEl = $('.topics'),
topicEls = topicsListEl.find('li'),
numTopics = topicEls.length;
for (var x = 0; x < numTopics; x++) {
var topic = topicEls.eq(x);
if (topic.attr('data-pinned') === '1') {
topic.find('[data-action="pin"]').addClass('active');
topic.removeAttr('data-pinned');
}
if (topic.attr('data-locked') === '1') {
topic.find('[data-action="lock"]').addClass('active');
topic.removeAttr('data-locked');
}
if (topic.attr('data-deleted') === '1') {
topic.find('[data-action="delete"]').addClass('active');
topic.removeAttr('data-deleted');
}
}
};
Topics.setDeleted = function(err, response) {
if(err) {
return app.alert(err.message);
}
if (response && response.tid) {
var btnEl = $('li[data-tid="' + response.tid + '"] button[data-action="delete"]');
btnEl.addClass('active');
btnEl.siblings('[data-action="lock"]').addClass('active');
}
};
Topics.restore = function(err, response) {
if(err) {
return app.alert(err.message);
}
if (response && response.tid) {
var btnEl = $('li[data-tid="' + response.tid + '"] button[data-action="delete"]');
btnEl.removeClass('active');
btnEl.siblings('[data-action="lock"]').removeClass('active');
}
};
Topics.lock = function(err, response) {
if(err) {
return app.alert(err.message);
}
if (response && response.tid) {
var btnEl = $('li[data-tid="' + response.tid + '"] button[data-action="lock"]');
btnEl.addClass('active');
}
};
Topics.unlock = function(err, response) {
if(err) {
return app.alert(err.message);
}
if (response && response.tid) {
var btnEl = $('li[data-tid="' + response.tid + '"] button[data-action="lock"]');
btnEl.removeClass('active');
}
};
Topics.unpin = function(err, response) {
if(err) {
return app.alert(err.message);
}
if (response && response.tid) {
var btnEl = $('li[data-tid="' + response.tid + '"] button[data-action="pin"]');
btnEl.removeClass('active');
}
};
Topics.pin = function(err, response) {
if(err) {
return app.alert(err.message);
}
if (response && response.tid) {
var btnEl = $('li[data-tid="' + response.tid + '"] button[data-action="pin"]');
btnEl.addClass('active');
}
};
return Topics;
});