mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-11-01 11:35:55 +01:00
closes #1353
mark all read will mark everything read, can also select topics and mark them read, can mark specific categories read too
This commit is contained in:
@@ -1,6 +1,9 @@
|
|||||||
{
|
{
|
||||||
"title": "Unread",
|
"title": "Unread",
|
||||||
"no_unread_topics": "There are no unread topics.",
|
"no_unread_topics": "There are no unread topics.",
|
||||||
"mark_all_read": "Mark all as Read",
|
"load_more": "Load More",
|
||||||
"load_more": "Load More"
|
"mark_as_read": "Mark as Read",
|
||||||
|
"selected": "Selected",
|
||||||
|
"all": "All",
|
||||||
|
"topics_marked_as_read.success": "Topics marked as read!"
|
||||||
}
|
}
|
||||||
@@ -1,3 +1,7 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
/* globals define, app, socket */
|
||||||
|
|
||||||
define(['forum/recent'], function(recent) {
|
define(['forum/recent'], function(recent) {
|
||||||
var Unread = {},
|
var Unread = {},
|
||||||
loadingMoreTopics = false;
|
loadingMoreTopics = false;
|
||||||
@@ -11,26 +15,39 @@ define(['forum/recent'], function(recent) {
|
|||||||
|
|
||||||
recent.watchForNewPosts();
|
recent.watchForNewPosts();
|
||||||
|
|
||||||
$('#mark-allread-btn').on('click', function() {
|
$('#markSelectedRead').on('click', function() {
|
||||||
function getUnreadTids() {
|
function getSelectedTids() {
|
||||||
var tids = [];
|
var tids = [];
|
||||||
$('#topics-container .category-item[data-tid]').each(function() {
|
$('#topics-container .category-item.selected').each(function() {
|
||||||
tids.push($(this).attr('data-tid'));
|
tids.push($(this).attr('data-tid'));
|
||||||
});
|
});
|
||||||
return tids;
|
return tids;
|
||||||
}
|
}
|
||||||
|
var tids = getSelectedTids();
|
||||||
var btn = $(this);
|
if(!tids.length) {
|
||||||
|
return;
|
||||||
socket.emit('topics.markAllRead', getUnreadTids(), function(err) {
|
}
|
||||||
|
socket.emit('topics.markTidsRead', tids, function(err) {
|
||||||
if(err) {
|
if(err) {
|
||||||
return app.alertError('There was an error marking topics read!');
|
return app.alertError('There was an error marking topics read!');
|
||||||
}
|
}
|
||||||
|
|
||||||
btn.remove();
|
doneRemovingTids(tids);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#markAllRead').on('click', function() {
|
||||||
|
socket.emit('topics.markAllRead', function(err) {
|
||||||
|
if(err) {
|
||||||
|
return app.alertError('There was an error marking topics read!');
|
||||||
|
}
|
||||||
|
|
||||||
|
app.alertSuccess('[[unread:topics_marked_as_read.success]]');
|
||||||
|
|
||||||
$('#topics-container').empty();
|
$('#topics-container').empty();
|
||||||
$('#category-no-topics').removeClass('hidden');
|
$('#category-no-topics').removeClass('hidden');
|
||||||
app.alertSuccess('All topics marked as read!');
|
$('.markread').addClass('hidden');
|
||||||
|
|
||||||
$('#numUnreadBadge')
|
$('#numUnreadBadge')
|
||||||
.removeClass('badge-important')
|
.removeClass('badge-important')
|
||||||
.addClass('badge-inverse')
|
.addClass('badge-inverse')
|
||||||
@@ -38,6 +55,37 @@ define(['forum/recent'], function(recent) {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$('.markread').on('click', '.category', function() {
|
||||||
|
function getCategoryTids(cid) {
|
||||||
|
var tids = [];
|
||||||
|
$('#topics-container .category-item[data-cid="' + cid + '"]').each(function() {
|
||||||
|
tids.push($(this).attr('data-tid'));
|
||||||
|
});
|
||||||
|
return tids;
|
||||||
|
}
|
||||||
|
var cid = $(this).attr('data-cid');
|
||||||
|
var tids = getCategoryTids(cid);
|
||||||
|
|
||||||
|
socket.emit('topics.markCategoryTopicsRead', cid, function(err) {
|
||||||
|
if(err) {
|
||||||
|
return app.alertError('There was an error marking topics read!');
|
||||||
|
}
|
||||||
|
|
||||||
|
doneRemovingTids(tids);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
socket.emit('categories.get', onCategoriesLoaded);
|
||||||
|
|
||||||
|
$('#topics-container').on('click', '.select', function() {
|
||||||
|
var select = $(this);
|
||||||
|
var isChecked = !select.hasClass('fa-square-o');
|
||||||
|
|
||||||
|
select.toggleClass('fa-check-square-o', !isChecked);
|
||||||
|
select.toggleClass('fa-square-o', isChecked);
|
||||||
|
select.parents('.category-item').toggleClass('selected', !isChecked);
|
||||||
|
});
|
||||||
|
|
||||||
if ($("body").height() <= $(window).height() && $('#topics-container').children().length >= 20) {
|
if ($("body").height() <= $(window).height() && $('#topics-container').children().length >= 20) {
|
||||||
$('#load-more-btn').show();
|
$('#load-more-btn').show();
|
||||||
}
|
}
|
||||||
@@ -77,5 +125,43 @@ define(['forum/recent'], function(recent) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function doneRemovingTids(tids) {
|
||||||
|
removeTids(tids);
|
||||||
|
|
||||||
|
app.alertSuccess('[[unread:topics_marked_as_read.success]]');
|
||||||
|
|
||||||
|
if (!$('#topics-container').children().length) {
|
||||||
|
$('#category-no-topics').removeClass('hidden');
|
||||||
|
$('.markread').addClass('hidden');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function removeTids(tids) {
|
||||||
|
for(var i=0; i<tids.length; ++i) {
|
||||||
|
$('#topics-container .category-item[data-tid="' + tids[i] + '"]').remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function onCategoriesLoaded(err, data) {
|
||||||
|
createCategoryLinks(data.categories);
|
||||||
|
console.log(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
function createCategoryLinks(categories) {
|
||||||
|
categories = categories.filter(function(category) {
|
||||||
|
return !category.disabled;
|
||||||
|
});
|
||||||
|
|
||||||
|
for(var i=0; i<categories.length; ++i) {
|
||||||
|
createCategoryLink(categories[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function createCategoryLink(category) {
|
||||||
|
var link = $('<li role="presentation" class="category" data-cid="' + category.cid + '"><a role="menuitem" href="#"><i class="fa fa-fw ' + category.icon + '"></i> ' + category.name + '</a></li>');
|
||||||
|
|
||||||
|
$('.markread .dropdown-menu').append(link);
|
||||||
|
}
|
||||||
|
|
||||||
return Unread;
|
return Unread;
|
||||||
});
|
});
|
||||||
@@ -97,18 +97,18 @@ SocketTopics.markAsRead = function(socket, data) {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
SocketTopics.markAllRead = function(socket, tids, callback) {
|
SocketTopics.markTidsRead = function(socket, tids, callback) {
|
||||||
|
|
||||||
if (!Array.isArray(tids)) {
|
if (!Array.isArray(tids)) {
|
||||||
return callback(new Error('invalid-data'));
|
return callback(new Error('invalid-data'));
|
||||||
}
|
}
|
||||||
|
|
||||||
topics.markAllRead(socket.uid, tids, function(err) {
|
topics.markTidsRead(socket.uid, tids, function(err) {
|
||||||
if(err) {
|
if(err) {
|
||||||
return callback(err);
|
return callback(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
index.server.sockets.in('uid_' + socket.uid).emit('event:unread.updateCount', null, 0);
|
topics.pushUnreadCount(socket.uid);
|
||||||
|
|
||||||
for (var i=0; i<tids.length; ++i) {
|
for (var i=0; i<tids.length; ++i) {
|
||||||
topics.markTopicNotificationsRead(tids[i], socket.uid);
|
topics.markTopicNotificationsRead(tids[i], socket.uid);
|
||||||
@@ -118,6 +118,43 @@ SocketTopics.markAllRead = function(socket, tids, callback) {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
SocketTopics.markAllRead = function(socket, data, callback) {
|
||||||
|
topics.getUnreadTids(socket.uid, 0, -1, function(err, tids) {
|
||||||
|
if (err) {
|
||||||
|
return callback(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
SocketTopics.markTidsRead(socket, tids, callback);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
SocketTopics.markCategoryTopicsRead = function(socket, cid, callback) {
|
||||||
|
topics.getUnreadTids(socket.uid, 0, -1, function(err, tids) {
|
||||||
|
if (err) {
|
||||||
|
return callback(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
var keys = tids.map(function(tid) {
|
||||||
|
return 'topic:' + tid;
|
||||||
|
});
|
||||||
|
|
||||||
|
db.getObjectsFields(keys, ['tid', 'cid'], function(err, topicData) {
|
||||||
|
if (err) {
|
||||||
|
return callback(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
tids = topicData.filter(function(topic) {
|
||||||
|
return parseInt(topic.cid, 10) === parseInt(cid, 10);
|
||||||
|
}).map(function(topic) {
|
||||||
|
return topic.tid;
|
||||||
|
});
|
||||||
|
|
||||||
|
SocketTopics.markTidsRead(socket, tids, callback);
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
SocketTopics.markAsUnreadForAll = function(socket, tid, callback) {
|
SocketTopics.markAsUnreadForAll = function(socket, tid, callback) {
|
||||||
topics.markAsUnreadForAll(tid, function(err) {
|
topics.markAsUnreadForAll(tid, function(err) {
|
||||||
if(err) {
|
if(err) {
|
||||||
|
|||||||
@@ -71,7 +71,8 @@ module.exports = function(Topics) {
|
|||||||
|
|
||||||
var unreadTopics = {
|
var unreadTopics = {
|
||||||
no_topics_message: '',
|
no_topics_message: '',
|
||||||
show_markallread_button: 'hidden',
|
show_markread_button: 'hidden',
|
||||||
|
showSelect: true,
|
||||||
nextStart : 0,
|
nextStart : 0,
|
||||||
topics: []
|
topics: []
|
||||||
};
|
};
|
||||||
@@ -94,7 +95,7 @@ module.exports = function(Topics) {
|
|||||||
unreadTopics.topics = topicData;
|
unreadTopics.topics = topicData;
|
||||||
unreadTopics.nextStart = parseInt(rank, 10) + 1;
|
unreadTopics.nextStart = parseInt(rank, 10) + 1;
|
||||||
unreadTopics.no_topics_message = (!topicData || topicData.length === 0) ? '' : 'hidden';
|
unreadTopics.no_topics_message = (!topicData || topicData.length === 0) ? '' : 'hidden';
|
||||||
unreadTopics.show_markallread_button = topicData.length === 0 ? 'hidden' : '';
|
unreadTopics.show_markread_button = topicData.length === 0 ? 'hidden' : '';
|
||||||
|
|
||||||
callback(null, unreadTopics);
|
callback(null, unreadTopics);
|
||||||
});
|
});
|
||||||
@@ -152,7 +153,7 @@ module.exports = function(Topics) {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
Topics.markAllRead = function(uid, tids, callback) {
|
Topics.markTidsRead = function(uid, tids, callback) {
|
||||||
if(!tids || !tids.length) {
|
if(!tids || !tids.length) {
|
||||||
return callback();
|
return callback();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user