Showing feeds, icons, and unread counts. Needs separated unread counts and an intelligence slider.

This commit is contained in:
Samuel Clay 2011-06-07 10:17:56 -04:00
parent 6d0c0c3cdc
commit 3d933723d9
6 changed files with 155 additions and 28 deletions

View file

@ -184,6 +184,7 @@ def load_feed_favicons(request):
def load_feeds_flat(request):
user = get_user(request)
include_favicons = request.REQUEST.get('include_favicons', False)
feeds = {}
try:
@ -197,14 +198,7 @@ def load_feeds_flat(request):
for sub in user_subs:
if sub.needs_unread_recalc:
sub.calculate_feed_scores(silent=True)
feeds[sub.feed.pk] = {
'id': sub.feed.pk,
'feed_title': sub.user_title or sub.feed.feed_title,
'feed_link': sub.feed.feed_link,
'ps': sub.unread_count_positive,
'nt': sub.unread_count_neutral,
'ng': sub.unread_count_negative,
}
feeds[sub.feed.pk] = sub.canonical(include_favicon=include_favicons)
folders = json.decode(folders.folders)
flat_folders = {}
@ -212,25 +206,24 @@ def load_feeds_flat(request):
def make_feeds_folder(items, parent_folder="", depth=0):
for item in items:
if isinstance(item, int) and item in feeds:
feed = feeds[item]
if not parent_folder:
parent_folder = ' '
if parent_folder in flat_folders:
flat_folders[parent_folder].append(feed)
flat_folders[parent_folder].append(item)
else:
flat_folders[parent_folder] = [feed]
flat_folders[parent_folder] = [item]
elif isinstance(item, dict):
for folder_name in item:
folder = item[folder_name]
flat_folder_name = "%s%s%s" % (
parent_folder,
" - " if parent_folder else "",
" - " if parent_folder and parent_folder != ' ' else "",
folder_name
)
make_feeds_folder(folder, flat_folder_name, depth+1)
make_feeds_folder(folders)
data = dict(flat_folders=flat_folders, user=user.username)
data = dict(flat_folders=flat_folders, feeds=feeds, user=user.username)
return data
@json.json_view

View file

@ -0,0 +1,5 @@
#NB-feed-list .ui-li-icon {
width: 16px;
height: 16px;
margin-top: -2px;
}

View file

@ -2,10 +2,92 @@
NEWSBLUR.MobileReader = function() {
// ===========
// = Globals =
// ===========
this.model = NEWSBLUR.AssetModel.reader();
this.story_view = 'page';
this.$s = {
$body: $('body'),
$feed_list: $('#NB-feed-list')
};
this.flags = {
'feeds_loaded' : false
};
this.locks = {};
this.counts = {};
this.cache = {};
this.constants = {};
this.runner();
};
NEWSBLUR.MobileReader.prototype = {
runner: function() {
this.load_feeds();
},
// =============
// = Feed List =
// =============
load_feeds: function() {
$.mobile.pageLoading();
this.model.load_feeds_flat($.rescope(this.build_feed_list, this));
},
build_feed_list: function() {
var self = this;
var folders = this.model.folders;
var feeds = this.model.feeds;
var $feed_list = this.$s.$feed_list;
var $feeds = '';
_.each(folders, function(items, folder_name) {
$feeds += '<ul data-role="listview" data-inset="true" data-theme="c" data-dividertheme="b">';
if (folder_name && folder_name != ' ') {
$feeds += _.template('\
<li data-role="list-divider"><%= folder_name %></li>', {
folder_name : folder_name
});
}
_.each(items, function(item) {
$feeds += self.make_feed_title(item);
});
$feeds += '</ul>';
});
this.flags.feeds_loaded = true;
$feed_list.html($feeds);
$('ul', $feed_list).listview();
$.mobile.pageLoading(true);
},
make_feed_title: function(feed_id) {
var feed = this.model.get_feed(feed_id);
var $feed = _.template('\
<li>\
<a href="#" data-feed-id="<%= feed.id %>">\
<img src="<%= $.favicon(feed.favicon) %>" class="ui-li-icon">\
<%= feed.feed_title %>\
<% if (feed.ps) { %>\
<span class="ui-li-count ui-li-count-positive"><%= feed.ps %></span>\
<% } %>\
<% if (feed.nt) { %>\
<span class="ui-li-count ui-li-count-positive"><%= feed.nt %></span>\
<% } %>\
<% if (feed.ng) { %>\
<span class="ui-li-count ui-li-count-positive"><%= feed.ng %></span>\
<% } %>\
</a>\
</li>', {
feed : feed
});
return $feed;
}
};
})(jQuery);

View file

@ -230,6 +230,46 @@ NEWSBLUR.AssetModel.Reader.prototype = {
this.make_request('/reader/feeds', data, pre_callback, error_callback, {request_type: 'GET'});
},
load_feeds_flat: function(callback, error_callback) {
var self = this;
var data = {
flat: true,
include_favicons: true
};
var pre_callback = function(subscriptions) {
NEWSBLUR.log(['subscriptions', subscriptions.flat_folders]);
var flat_feeds = function(feeds) {
var flattened = _.flatten(_.map(feeds, _.values));
return _.flatten(_.map(flattened, function(feed) {
if (!_.isNumber(feed) && feed) return flat_feeds(feed);
else return feed;
}));
};
var valid_feeds = flat_feeds({'root': subscriptions.flat_folders});
_.each(subscriptions.feeds, function(feed, feed_id) {
if (_.contains(valid_feeds, parseInt(feed_id, 10))) {
self.feeds[feed_id] = feed;
if (feed.favicon_fetching) self.flags['favicons_fetching'] = true;
}
});
self.folders = subscriptions.flat_folders;
self.starred_count = subscriptions.starred_count;
if (!_.isEqual(self.favicons, {})) {
_.each(self.feeds, function(feed) {
if (self.favicons[feed.id]) {
feed.favicon = self.favicons[feed.id];
}
});
}
callback();
};
this.make_request('/reader/feeds', data, pre_callback, error_callback, {request_type: 'GET'});
},
load_feed_favicons: function(callback, loaded_once, load_all) {
var pre_callback = _.bind(function(favicons) {
this.favicons = favicons;

View file

@ -208,6 +208,8 @@ COMPRESS_JS = {
'source_filenames': (
'js/jquery-1.6.1.js',
'js/mobile/jquery.mobile-1.0a4.js',
'js/jquery.ajaxmanager.3.js',
'js/underscore.js',
'js/inflector.js',
'js/jquery.json.js',
'js/jquery.easing.js',

View file

@ -8,6 +8,22 @@
<script type="text/javascript" charset="utf-8">
var NEWSBLUR = {};
NEWSBLUR.Globals = {
'is_authenticated' : {{ user.is_authenticated|yesno:"true,false" }},
'is_anonymous' : {{ user.is_anonymous|yesno:"true,false" }},
'is_premium' : {{ user.profile.is_premium|yesno:"true,false" }},
'secret_token' : "{{ user.profile.secret_token }}",
'username' : "{{ user.username|safe }}",
'email' : "{{ user.email|safe }}",
'google_favicon_url' : 'http://www.google.com/s2/favicons?domain_url=',
'MEDIA_URL' : "{{ MEDIA_URL }}"
};
NEWSBLUR.Flags = {
'start_import_from_google_reader': {{ start_import_from_google_reader|yesno:"true,false" }}
};
NEWSBLUR.URLs = {
'domain' : "{% current_domain %}"
};
</script>
{% compressed_css 'mobile' %}
@ -37,23 +53,12 @@
<body>
<div data-role="page" id="NB-feeds">
<div data-role="page" id="NB-page-feeds">
<div data-role="header">
<h1>{{ request.user.username }}</h1>
</div>
<div data-role="content">
<ul data-role="listview">
<li><a href="index.html"><img src="images/gf.png" alt="France" class="ui-li-icon">France <span class="ui-li-count">4</span></a></li>
<li><a href="index.html"><img src="images/de.png" alt="Germany" class="ui-li-icon">Germany <span class="ui-li-count">4</span></a></li>
<li><a href="index.html"><img src="images/gb.png" alt="Great Britain" class="ui-li-icon">Great Britain <span class="ui-li-count">0</span></a></li>
<li><a href="index.html"><img src="images/fi.png" alt="Finland" class="ui-li-icon">Finland <span class="ui-li-count">12</span><span class="ui-li-count">12</span></a></li>
<li><a href="index.html"><img src="images/sj.png" alt="Norway" class="ui-li-icon">Norway <span class="ui-li-count">328</span></a></li>
<li><a href="index.html"><img src="images/us.png" alt="United States" class="ui-li-icon">United States <span class="ui-li-count">62</span></a></li>
</ul>
<div data-role="content">
<div id="NB-feed-list"></div>
</div>
<div data-role="footer"> 1
<div class="NB-footer-site-count ui-li-count">12 sites</div>
@ -62,7 +67,7 @@
<script>
$(document).ready(function() {
$(document).bind('ready', function() {
NEWSBLUR.mobile_reader = new NEWSBLUR.MobileReader();
});
</script>