mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-10-26 16:46:12 +01:00
fix: #7103
update counter when user navigates to /unread fix new topic alert on /unread moved unread code from footer to unread
This commit is contained in:
@@ -112,7 +112,13 @@ app.cacheBuster = null;
|
|||||||
* config (obj)
|
* config (obj)
|
||||||
* next (string)
|
* next (string)
|
||||||
*/
|
*/
|
||||||
require(['benchpress', 'translator', 'forum/header/notifications', 'forum/header/chat'], function (Benchpress, translator, Notifications, Chat) {
|
require([
|
||||||
|
'benchpress',
|
||||||
|
'translator',
|
||||||
|
'forum/unread',
|
||||||
|
'forum/header/notifications',
|
||||||
|
'forum/header/chat',
|
||||||
|
], function (Benchpress, translator, Unread, Notifications, Chat) {
|
||||||
app.user = data.header.user;
|
app.user = data.header.user;
|
||||||
data.header.config = data.config;
|
data.header.config = data.config;
|
||||||
config = data.config;
|
config = data.config;
|
||||||
@@ -136,7 +142,7 @@ app.cacheBuster = null;
|
|||||||
Object.values(toRender).forEach(function (element, idx) {
|
Object.values(toRender).forEach(function (element, idx) {
|
||||||
element.html(html[idx]);
|
element.html(html[idx]);
|
||||||
});
|
});
|
||||||
|
Unread.initUnreadTopics();
|
||||||
Notifications.prepareDOM();
|
Notifications.prepareDOM();
|
||||||
Chat.prepareDOM();
|
Chat.prepareDOM();
|
||||||
app.reskin(data.config.bootswatchSkin);
|
app.reskin(data.config.bootswatchSkin);
|
||||||
|
|||||||
@@ -4,101 +4,21 @@
|
|||||||
define('forum/footer', [
|
define('forum/footer', [
|
||||||
'components',
|
'components',
|
||||||
'translator',
|
'translator',
|
||||||
|
'forum/unread',
|
||||||
'forum/header/notifications',
|
'forum/header/notifications',
|
||||||
'forum/header/chat',
|
'forum/header/chat',
|
||||||
], function (components, translator, Notifications, Chat) {
|
], function (components, translator, Unread, Notifications, Chat) {
|
||||||
Notifications.prepareDOM();
|
Notifications.prepareDOM();
|
||||||
Chat.prepareDOM();
|
Chat.prepareDOM();
|
||||||
translator.prepareDOM();
|
translator.prepareDOM();
|
||||||
|
|
||||||
function updateUnreadTopicCount(url, count) {
|
socket.on('event:unread.updateChatCount', function (count) {
|
||||||
if (!utils.isNumber(count)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
$('a[href="' + config.relative_path + url + '"].navigation-link i')
|
|
||||||
.toggleClass('unread-count', count > 0)
|
|
||||||
.attr('data-content', count > 99 ? '99+' : count);
|
|
||||||
}
|
|
||||||
|
|
||||||
function updateUnreadChatCount(count) {
|
|
||||||
components.get('chat/icon')
|
components.get('chat/icon')
|
||||||
.toggleClass('unread-count', count > 0)
|
.toggleClass('unread-count', count > 0)
|
||||||
.attr('data-content', count > 99 ? '99+' : count);
|
.attr('data-content', count > 99 ? '99+' : count);
|
||||||
}
|
});
|
||||||
|
|
||||||
function initUnreadTopics() {
|
|
||||||
var unreadTopics = {};
|
|
||||||
|
|
||||||
function onNewPost(data) {
|
|
||||||
if (data && data.posts && data.posts.length) {
|
|
||||||
var post = data.posts[0];
|
|
||||||
|
|
||||||
if (parseInt(post.uid, 10) !== parseInt(app.user.uid, 10) && !unreadTopics[post.topic.tid]) {
|
|
||||||
increaseUnreadCount(data);
|
|
||||||
markTopicsUnread(post.topic.tid);
|
|
||||||
unreadTopics[post.topic.tid] = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function increaseUnreadCount(data) {
|
|
||||||
var post = data.posts[0];
|
|
||||||
|
|
||||||
var unreadTopicCount = parseInt($('a[href="' + config.relative_path + '/unread"].navigation-link i').attr('data-content'), 10) + 1;
|
|
||||||
updateUnreadTopicCount('/unread', unreadTopicCount);
|
|
||||||
|
|
||||||
var isNewTopic = post.isMain && parseInt(post.uid, 10) !== parseInt(app.user.uid, 10);
|
|
||||||
if (isNewTopic) {
|
|
||||||
var unreadNewTopicCount = parseInt($('a[href="' + config.relative_path + '/unread?filter=new"].navigation-link i').attr('data-content'), 10) + 1;
|
|
||||||
updateUnreadTopicCount('/unread?filter=new', unreadNewTopicCount);
|
|
||||||
}
|
|
||||||
|
|
||||||
var isUnreplied = parseInt(post.topic.postcount, 10) <= 1;
|
|
||||||
if (isUnreplied) {
|
|
||||||
var unreadUnrepliedTopicCount = parseInt($('a[href="' + config.relative_path + '/unread?filter=unreplied"].navigation-link i').attr('data-content'), 10) + 1;
|
|
||||||
updateUnreadTopicCount('/unread?filter=unreplied', unreadUnrepliedTopicCount);
|
|
||||||
}
|
|
||||||
if ($('a[href="' + config.relative_path + '/unread?filter=watched"].navigation-link i').length) {
|
|
||||||
socket.emit('topics.isFollowed', post.topic.tid, function (err, isFollowed) {
|
|
||||||
if (err) {
|
|
||||||
return app.alertError(err.message);
|
|
||||||
}
|
|
||||||
if (isFollowed) {
|
|
||||||
var unreadWatchedTopicCount = parseInt($('a[href="' + config.relative_path + '/unread?filter=watched"].navigation-link i').attr('data-content'), 10) + 1;
|
|
||||||
updateUnreadTopicCount('/unread?filter=watched', unreadWatchedTopicCount);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function markTopicsUnread(tid) {
|
|
||||||
$('[data-tid="' + tid + '"]').addClass('unread');
|
|
||||||
}
|
|
||||||
|
|
||||||
$(window).on('action:ajaxify.end', function (ev, data) {
|
|
||||||
if (data.url) {
|
|
||||||
var tid = data.url.match(/^topic\/(\d+)/);
|
|
||||||
|
|
||||||
if (tid && tid[1]) {
|
|
||||||
delete unreadTopics[tid[1]];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
socket.on('event:new_post', onNewPost);
|
|
||||||
}
|
|
||||||
|
|
||||||
function updateUnreadCounters(data) {
|
|
||||||
updateUnreadTopicCount('/unread', data.unreadTopicCount);
|
|
||||||
updateUnreadTopicCount('/unread?filter=new', data.unreadNewTopicCount);
|
|
||||||
updateUnreadTopicCount('/unread?filter=watched', data.unreadWatchedTopicCount);
|
|
||||||
updateUnreadTopicCount('/unread?filter=unreplied', data.unreadUnrepliedTopicCount);
|
|
||||||
}
|
|
||||||
|
|
||||||
socket.on('event:unread.updateCount', updateUnreadCounters);
|
|
||||||
socket.on('event:unread.updateChatCount', updateUnreadChatCount);
|
|
||||||
|
|
||||||
if (app.user.uid > 0) {
|
if (app.user.uid > 0) {
|
||||||
initUnreadTopics();
|
Unread.initUnreadTopics();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -10,6 +10,8 @@ define('forum/unread', ['topicSelect', 'components', 'topicList'], function (top
|
|||||||
topicList.init('unread');
|
topicList.init('unread');
|
||||||
topicSelect.init();
|
topicSelect.init();
|
||||||
|
|
||||||
|
updateUnreadTopicCount('/' + ajaxify.data.selectedFilter.url, ajaxify.data.topicCount);
|
||||||
|
|
||||||
$('#markSelectedRead').on('click', function () {
|
$('#markSelectedRead').on('click', function () {
|
||||||
var tids = topicSelect.getSelectedTids();
|
var tids = topicSelect.getSelectedTids();
|
||||||
if (!tids.length) {
|
if (!tids.length) {
|
||||||
@@ -77,6 +79,81 @@ define('forum/unread', ['topicSelect', 'components', 'topicList'], function (top
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function updateUnreadTopicCount(url, count) {
|
||||||
|
if (!utils.isNumber(count)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$('a[href="' + config.relative_path + url + '"].navigation-link i')
|
||||||
|
.toggleClass('unread-count', count > 0)
|
||||||
|
.attr('data-content', count > 99 ? '99+' : count);
|
||||||
|
}
|
||||||
|
|
||||||
|
Unread.initUnreadTopics = function () {
|
||||||
|
var unreadTopics = {};
|
||||||
|
|
||||||
|
function onNewPost(data) {
|
||||||
|
if (data && data.posts && data.posts.length) {
|
||||||
|
var post = data.posts[0];
|
||||||
|
|
||||||
|
if (parseInt(post.uid, 10) !== parseInt(app.user.uid, 10) && !unreadTopics[post.topic.tid]) {
|
||||||
|
increaseUnreadCount(post);
|
||||||
|
markTopicsUnread(post.topic.tid);
|
||||||
|
unreadTopics[post.topic.tid] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function increaseUnreadCount(post) {
|
||||||
|
var unreadTopicCount = parseInt($('a[href="' + config.relative_path + '/unread"].navigation-link i').attr('data-content'), 10) + 1;
|
||||||
|
updateUnreadTopicCount('/unread', unreadTopicCount);
|
||||||
|
|
||||||
|
var isNewTopic = post.isMain && parseInt(post.uid, 10) !== parseInt(app.user.uid, 10);
|
||||||
|
if (isNewTopic) {
|
||||||
|
var unreadNewTopicCount = parseInt($('a[href="' + config.relative_path + '/unread?filter=new"].navigation-link i').attr('data-content'), 10) + 1;
|
||||||
|
updateUnreadTopicCount('/unread?filter=new', unreadNewTopicCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
var isUnreplied = parseInt(post.topic.postcount, 10) <= 1;
|
||||||
|
if (isUnreplied) {
|
||||||
|
var unreadUnrepliedTopicCount = parseInt($('a[href="' + config.relative_path + '/unread?filter=unreplied"].navigation-link i').attr('data-content'), 10) + 1;
|
||||||
|
updateUnreadTopicCount('/unread?filter=unreplied', unreadUnrepliedTopicCount);
|
||||||
|
}
|
||||||
|
if ($('a[href="' + config.relative_path + '/unread?filter=watched"].navigation-link i').length) {
|
||||||
|
socket.emit('topics.isFollowed', post.topic.tid, function (err, isFollowed) {
|
||||||
|
if (err) {
|
||||||
|
return app.alertError(err.message);
|
||||||
|
}
|
||||||
|
if (isFollowed) {
|
||||||
|
var unreadWatchedTopicCount = parseInt($('a[href="' + config.relative_path + '/unread?filter=watched"].navigation-link i').attr('data-content'), 10) + 1;
|
||||||
|
updateUnreadTopicCount('/unread?filter=watched', unreadWatchedTopicCount);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function markTopicsUnread(tid) {
|
||||||
|
$('[data-tid="' + tid + '"]').addClass('unread');
|
||||||
|
}
|
||||||
|
|
||||||
|
$(window).on('action:ajaxify.end', function () {
|
||||||
|
if (ajaxify.data.template.topic) {
|
||||||
|
delete unreadTopics[ajaxify.data.tid];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
socket.removeListener('event:new_post', onNewPost);
|
||||||
|
socket.on('event:new_post', onNewPost);
|
||||||
|
|
||||||
|
socket.removeListener('event:unread.updateCount', updateUnreadCounters);
|
||||||
|
socket.on('event:unread.updateCount', updateUnreadCounters);
|
||||||
|
};
|
||||||
|
|
||||||
|
function updateUnreadCounters(data) {
|
||||||
|
updateUnreadTopicCount('/unread', data.unreadTopicCount);
|
||||||
|
updateUnreadTopicCount('/unread?filter=new', data.unreadNewTopicCount);
|
||||||
|
updateUnreadTopicCount('/unread?filter=watched', data.unreadWatchedTopicCount);
|
||||||
|
updateUnreadTopicCount('/unread?filter=unreplied', data.unreadUnrepliedTopicCount);
|
||||||
|
}
|
||||||
|
|
||||||
return Unread;
|
return Unread;
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ define('topicList', [
|
|||||||
};
|
};
|
||||||
|
|
||||||
function onNewTopic(data) {
|
function onNewTopic(data) {
|
||||||
if ((ajaxify.data.selectedCids && ajaxify.data.selectedCids.indexOf(parseInt(data.cid, 10)) === -1) ||
|
if ((ajaxify.data.selectedCids && ajaxify.data.selectedCids.length && ajaxify.data.selectedCids.indexOf(parseInt(data.cid, 10)) === -1) ||
|
||||||
(ajaxify.data.selectedFilter && ajaxify.data.selectedFilter.filter === 'watched') ||
|
(ajaxify.data.selectedFilter && ajaxify.data.selectedFilter.filter === 'watched') ||
|
||||||
(ajaxify.data.template.category && parseInt(ajaxify.data.cid, 10) !== parseInt(data.cid, 10))) {
|
(ajaxify.data.template.category && parseInt(ajaxify.data.cid, 10) !== parseInt(data.cid, 10))) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ module.exports = function (Groups) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
function inviteOrRequestMembership(groupName, uid, type, callback) {
|
function inviteOrRequestMembership(groupName, uid, type, callback) {
|
||||||
if (!parseInt(uid, 10)) {
|
if (!(parseInt(uid, 10) > 0)) {
|
||||||
return callback(new Error('[[error:not-logged-in]]'));
|
return callback(new Error('[[error:not-logged-in]]'));
|
||||||
}
|
}
|
||||||
var hookName = type === 'invite' ? 'action:group.inviteMember' : 'action:group.requestMembership';
|
var hookName = type === 'invite' ? 'action:group.inviteMember' : 'action:group.requestMembership';
|
||||||
|
|||||||
@@ -215,26 +215,26 @@ module.exports = function (Topics) {
|
|||||||
if (topic && topic.cid && cidMatch(topic.cid) && !blockedUids.includes(parseInt(topic.uid, 10))) {
|
if (topic && topic.cid && cidMatch(topic.cid) && !blockedUids.includes(parseInt(topic.uid, 10))) {
|
||||||
topic.tid = parseInt(topic.tid, 10);
|
topic.tid = parseInt(topic.tid, 10);
|
||||||
if ((results.isTopicsFollowed[index] || !isCidIgnored[topic.cid])) {
|
if ((results.isTopicsFollowed[index] || !isCidIgnored[topic.cid])) {
|
||||||
counts[''] += 1;
|
|
||||||
tidsByFilter[''].push(topic.tid);
|
tidsByFilter[''].push(topic.tid);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (results.isTopicsFollowed[index]) {
|
if (results.isTopicsFollowed[index]) {
|
||||||
counts.watched += 1;
|
|
||||||
tidsByFilter.watched.push(topic.tid);
|
tidsByFilter.watched.push(topic.tid);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (topic.postcount <= 1) {
|
if (topic.postcount <= 1) {
|
||||||
counts.unreplied += 1;
|
|
||||||
tidsByFilter.unreplied.push(topic.tid);
|
tidsByFilter.unreplied.push(topic.tid);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!userRead[topic.tid]) {
|
if (!userRead[topic.tid]) {
|
||||||
counts.new += 1;
|
|
||||||
tidsByFilter.new.push(topic.tid);
|
tidsByFilter.new.push(topic.tid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
counts[''] = tidsByFilter[''].length;
|
||||||
|
counts.watched = tidsByFilter.watched.length;
|
||||||
|
counts.unreplied = tidsByFilter.unreplied.length;
|
||||||
|
counts.new = tidsByFilter.new.length;
|
||||||
|
|
||||||
next(null, {
|
next(null, {
|
||||||
counts: counts,
|
counts: counts,
|
||||||
@@ -439,10 +439,8 @@ module.exports = function (Topics) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
Topics.hasReadTopics = function (tids, uid, callback) {
|
Topics.hasReadTopics = function (tids, uid, callback) {
|
||||||
if (!parseInt(uid, 10)) {
|
if (!(parseInt(uid, 10) > 0)) {
|
||||||
return callback(null, tids.map(function () {
|
return setImmediate(callback, null, tids.map(() => false));
|
||||||
return false;
|
|
||||||
}));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async.waterfall([
|
async.waterfall([
|
||||||
|
|||||||
Reference in New Issue
Block a user