mirror of
https://github.com/discourse/discourse.git
synced 2025-06-06 21:14:39 +08:00
work in progress live unread / new counts
This commit is contained in:
@ -18,12 +18,12 @@ Discourse.ListController = Discourse.Controller.extend({
|
|||||||
return Discourse.SiteSettings.top_menu.split("|").map(function(i) {
|
return Discourse.SiteSettings.top_menu.split("|").map(function(i) {
|
||||||
return Discourse.NavItem.fromText(i, {
|
return Discourse.NavItem.fromText(i, {
|
||||||
loggedOn: loggedOn,
|
loggedOn: loggedOn,
|
||||||
countSummary: summary
|
hasCategories: hasCategories
|
||||||
});
|
});
|
||||||
}).filter(function(i) {
|
}).filter(function(i) {
|
||||||
return i !== null;
|
return i !== null;
|
||||||
});
|
});
|
||||||
}.property('filterSummary'),
|
}.property(),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Load a list based on a filter
|
Load a list based on a filter
|
||||||
|
@ -10,6 +10,7 @@ var validNavNames = ['latest', 'hot', 'categories', 'category', 'favorited', 'un
|
|||||||
var validAnon = ['latest', 'hot', 'categories', 'category'];
|
var validAnon = ['latest', 'hot', 'categories', 'category'];
|
||||||
|
|
||||||
Discourse.NavItem = Discourse.Model.extend({
|
Discourse.NavItem = Discourse.Model.extend({
|
||||||
|
userTrackingStateBinding: Ember.Binding.oneWay('Discourse.currentUser.userTrackingState.messageCount'),
|
||||||
categoryName: function() {
|
categoryName: function() {
|
||||||
var split = this.get('name').split('/');
|
var split = this.get('name').split('/');
|
||||||
return split[0] === 'category' ? split[1] : null;
|
return split[0] === 'category' ? split[1] : null;
|
||||||
@ -21,7 +22,14 @@ Discourse.NavItem = Discourse.Model.extend({
|
|||||||
href = Discourse.getURL("/") + name.replace(' ', '-');
|
href = Discourse.getURL("/") + name.replace(' ', '-');
|
||||||
if (name === 'category') href += "/" + this.get('categoryName');
|
if (name === 'category') href += "/" + this.get('categoryName');
|
||||||
return href;
|
return href;
|
||||||
}.property('name')
|
}.property('name'),
|
||||||
|
|
||||||
|
count: function() {
|
||||||
|
var state = Discourse.get('currentUser.userTrackingState');
|
||||||
|
if (state) {
|
||||||
|
return state.lookupCount(this.get('name'));
|
||||||
|
}
|
||||||
|
}.property('userTrackingState')
|
||||||
});
|
});
|
||||||
|
|
||||||
Discourse.NavItem.reopenClass({
|
Discourse.NavItem.reopenClass({
|
||||||
@ -43,7 +51,7 @@ Discourse.NavItem.reopenClass({
|
|||||||
filters: split.splice(1)
|
filters: split.splice(1)
|
||||||
};
|
};
|
||||||
|
|
||||||
if (countSummary && countSummary[name]) opts.count = countSummary[name];
|
// if (countSummary && countSummary[name]) opts.count = countSummary[name];
|
||||||
|
|
||||||
return Discourse.NavItem.create(opts);
|
return Discourse.NavItem.create(opts);
|
||||||
}
|
}
|
||||||
|
@ -118,7 +118,6 @@ Discourse.TopicList.reopenClass({
|
|||||||
topics: Discourse.TopicList.topicsFrom(result),
|
topics: Discourse.TopicList.topicsFrom(result),
|
||||||
can_create_topic: result.topic_list.can_create_topic,
|
can_create_topic: result.topic_list.can_create_topic,
|
||||||
more_topics_url: result.topic_list.more_topics_url,
|
more_topics_url: result.topic_list.more_topics_url,
|
||||||
filter_summary: result.topic_list.filter_summary,
|
|
||||||
draft_key: result.topic_list.draft_key,
|
draft_key: result.topic_list.draft_key,
|
||||||
draft_sequence: result.topic_list.draft_sequence,
|
draft_sequence: result.topic_list.draft_sequence,
|
||||||
draft: result.topic_list.draft,
|
draft: result.topic_list.draft,
|
||||||
|
@ -314,6 +314,7 @@ Discourse.User.reopenClass({
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Checks if given username is valid for this email address
|
Checks if given username is valid for this email address
|
||||||
|
|
||||||
|
@ -1,16 +1,80 @@
|
|||||||
Discourse.UserTrackingState = Discourse.Model.extend({
|
Discourse.UserTrackingState = Discourse.Model.extend({
|
||||||
unreadPosts: function(){
|
init: function(){
|
||||||
return 10;
|
this._super();
|
||||||
}.property(),
|
this.states = {};
|
||||||
|
|
||||||
newPosts: function() {
|
var _this = this;
|
||||||
return 10;
|
setTimeout(function(){
|
||||||
}.property()
|
console.log("YYYYYYYYYYY");
|
||||||
|
_this.loadStates([{
|
||||||
|
topic_id: 100,
|
||||||
|
last_read_post_number: null
|
||||||
|
}]);
|
||||||
|
_this.set('messageCount', 100);
|
||||||
|
}, 2000);
|
||||||
|
},
|
||||||
|
|
||||||
|
establishChannels: function() {
|
||||||
|
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
countNew: function(){
|
||||||
|
var count = 0;
|
||||||
|
$.each(this.states, function(){
|
||||||
|
count += this.last_read_post_number === null ? 1 : 0;
|
||||||
|
});
|
||||||
|
return count;
|
||||||
|
},
|
||||||
|
|
||||||
|
countUnread: function(){
|
||||||
|
var count = 0;
|
||||||
|
$.each(this.states, function(){
|
||||||
|
count += (this.last_read_post_number !== null &&
|
||||||
|
this.last_read_post_number < this.highest_post_number) ? 1 : 0;
|
||||||
|
});
|
||||||
|
return count;
|
||||||
|
},
|
||||||
|
|
||||||
|
countCategory: function(category) {
|
||||||
|
var count = 0;
|
||||||
|
$.each(this.states, function(){
|
||||||
|
if (this.category_name === category) {
|
||||||
|
count += (this.last_read_post_number === null ||
|
||||||
|
this.last_read_post_number < this.highest_post_number) ? 1 : 0;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return count;
|
||||||
|
},
|
||||||
|
|
||||||
|
lookupCount: function(name){
|
||||||
|
if(name==="new") {
|
||||||
|
return this.countNew();
|
||||||
|
} else if(name==="unread") {
|
||||||
|
return this.countUnread();
|
||||||
|
} else {
|
||||||
|
var category = name.split("/")[1];
|
||||||
|
if(category) {
|
||||||
|
return this.countCategory(category);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
loadStates: function (data) {
|
||||||
|
// not exposed
|
||||||
|
var states = this.states;
|
||||||
|
|
||||||
|
data.each(function(row){
|
||||||
|
states["t" + row.topic_id] = row;
|
||||||
|
});
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
Discourse.UserTrackingState.reopenClass({
|
Discourse.UserTrackingState.reopenClass({
|
||||||
init: function(data){
|
createFromStates: function(data){
|
||||||
|
var instance = Discourse.UserTrackingState.create();
|
||||||
|
instance.loadStates(data);
|
||||||
|
instance.establishChannels();
|
||||||
|
return instance;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
24
app/assets/javascripts/discourse/routes/application_route.js
Normal file
24
app/assets/javascripts/discourse/routes/application_route.js
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
/**
|
||||||
|
The base Application route
|
||||||
|
|
||||||
|
@class ApplicationRoute
|
||||||
|
@extends Discourse.Route
|
||||||
|
@namespace Discourse
|
||||||
|
@module Discourse
|
||||||
|
**/
|
||||||
|
Discourse.ApplicationRoute = Discourse.Route.extend({
|
||||||
|
setupController: function(controller) {
|
||||||
|
Discourse.set('site', Discourse.Site.create(PreloadStore.get('site')));
|
||||||
|
var currentUser = PreloadStore.get('currentUser');
|
||||||
|
if (currentUser) {
|
||||||
|
var states = currentUser.user_tracking_states;
|
||||||
|
currentUser.user_tracking_states = null;
|
||||||
|
|
||||||
|
Discourse.set('currentUser', Discourse.User.create(currentUser));
|
||||||
|
Discourse.set('currentUser.userTrackingState', Discourse.UserTrackingState.createFromStates(states));
|
||||||
|
}
|
||||||
|
// make sure we delete preloaded data
|
||||||
|
PreloadStore.remove('site');
|
||||||
|
PreloadStore.remove('currentUser');
|
||||||
|
}
|
||||||
|
});
|
@ -10,12 +10,12 @@ Discourse.NavItemView = Discourse.View.extend({
|
|||||||
tagName: 'li',
|
tagName: 'li',
|
||||||
classNameBindings: ['isActive', 'content.hasIcon:has-icon'],
|
classNameBindings: ['isActive', 'content.hasIcon:has-icon'],
|
||||||
attributeBindings: ['title'],
|
attributeBindings: ['title'],
|
||||||
|
countBinding: Ember.Binding.oneWay('content.count'),
|
||||||
|
|
||||||
title: function() {
|
title: function() {
|
||||||
var name = this.get('content.name');
|
var categoryName, extra, name;
|
||||||
var categoryName = this.get('content.categoryName');
|
name = this.get('content.name');
|
||||||
|
categoryName = this.get('content.categoryName');
|
||||||
var extra;
|
|
||||||
if (categoryName) {
|
if (categoryName) {
|
||||||
extra = { categoryName: categoryName };
|
extra = { categoryName: categoryName };
|
||||||
name = "category";
|
name = "category";
|
||||||
@ -30,10 +30,17 @@ Discourse.NavItemView = Discourse.View.extend({
|
|||||||
|
|
||||||
hidden: Em.computed.not('content.visible'),
|
hidden: Em.computed.not('content.visible'),
|
||||||
|
|
||||||
|
countChanged: function(){
|
||||||
|
this.rerender();
|
||||||
|
}.observes('count'),
|
||||||
|
|
||||||
name: function() {
|
name: function() {
|
||||||
var name = this.get('content.name');
|
var categoryName, extra, name;
|
||||||
var categoryName = this.get('content.categoryName');
|
name = this.get('content.name');
|
||||||
var extra = { count: this.get('content.count') || 0 };
|
categoryName = this.get('content.categoryName');
|
||||||
|
extra = {
|
||||||
|
count: this.get('content.count') || 0
|
||||||
|
};
|
||||||
if (categoryName) {
|
if (categoryName) {
|
||||||
name = 'category';
|
name = 'category';
|
||||||
extra.categoryName = categoryName.titleize();
|
extra.categoryName = categoryName.titleize();
|
||||||
|
@ -2,7 +2,7 @@ class TopicListSerializer < ApplicationSerializer
|
|||||||
|
|
||||||
attributes :can_create_topic,
|
attributes :can_create_topic,
|
||||||
:more_topics_url,
|
:more_topics_url,
|
||||||
:filter_summary,
|
# :filter_summary,
|
||||||
:draft,
|
:draft,
|
||||||
:draft_key,
|
:draft_key,
|
||||||
:draft_sequence,
|
:draft_sequence,
|
||||||
|
Reference in New Issue
Block a user