diff --git a/apps/reader/views.py b/apps/reader/views.py
index b323295ca..e81f53445 100644
--- a/apps/reader/views.py
+++ b/apps/reader/views.py
@@ -742,6 +742,17 @@ def load_river_stories__redis(request):
# Find starred stories
if found_feed_ids:
+ if read_filter == 'all':
+ story_ids = [story['id'] for story in stories]
+ userstories_db = MUserStory.objects(user_id=user.pk,
+ feed_id__in=found_feed_ids,
+ story_id__in=story_ids
+ ).only('story_id').hint([('user_id', 1),
+ ('feed_id', 1),
+ ('story_id', 1)])
+ userstories = set(us.story_id for us in userstories_db)
+ else:
+ userstories = []
starred_stories = MStarredStory.objects(
user_id=user.pk,
story_feed_id__in=found_feed_ids
@@ -749,6 +760,7 @@ def load_river_stories__redis(request):
starred_stories = dict([(story.story_guid, story.starred_date)
for story in starred_stories])
else:
+ userstories = []
starred_stories = {}
# Intelligence classifiers for all feeds involved
@@ -772,9 +784,13 @@ def load_river_stories__redis(request):
classifier_titles=classifier_titles,
classifier_tags=classifier_tags)
+
# Just need to format stories
for story in stories:
- story['read_status'] = 0
+ if read_filter == 'all' and story['id'] in userstories:
+ story['read_status'] = 1
+ else:
+ story['read_status'] = 0
story_date = localtime_for_timezone(story['story_date'], user.profile.timezone)
story['short_parsed_date'] = format_story_link_date__short(story_date, now)
story['long_parsed_date'] = format_story_link_date__long(story_date, now)
diff --git a/media/css/reader.css b/media/css/reader.css
index d5d936420..12ade3856 100644
--- a/media/css/reader.css
+++ b/media/css/reader.css
@@ -1707,11 +1707,11 @@ background: transparent;
position: absolute;
}
-#story_pane .NB-story-iframe {
+#story_pane .NB-text-view {
left: 200%;
top: 0;
}
-#story_pane .NB-text-view {
+#story_pane .NB-story-iframe {
left: 300%;
top: 0;
}
@@ -3226,7 +3226,7 @@ background: transparent;
.NB-taskbar .NB-task-view-switch-arrow {
position: absolute;
top: 8px;
- right: -8px;
+ left: -8px;
width: 16px;
height: 16px;
background: transparent url('/media/embed/icons/silk/arrow_switch.png') no-repeat center 0px;
diff --git a/media/js/newsblur/common/assetmodel.js b/media/js/newsblur/common/assetmodel.js
index f06d67838..14924fc24 100644
--- a/media/js/newsblur/common/assetmodel.js
+++ b/media/js/newsblur/common/assetmodel.js
@@ -536,8 +536,8 @@ NEWSBLUR.AssetModel = Backbone.Router.extend({
this.make_request('/reader/river_stories', {
feeds: feeds,
page: page,
- order: this.view_setting(feed_id, 'order')
- // read_filter: this.view_setting(feed_id, 'read_filter')
+ order: this.view_setting(feed_id, 'order'),
+ read_filter: this.view_setting(feed_id, 'read_filter')
}, pre_callback, error_callback, {
'ajax_group': (page ? 'feed_page' : 'feed'),
'request_type': 'GET'
diff --git a/media/js/newsblur/models/folders.js b/media/js/newsblur/models/folders.js
index ff73a329b..f61216de6 100644
--- a/media/js/newsblur/models/folders.js
+++ b/media/js/newsblur/models/folders.js
@@ -228,6 +228,18 @@ NEWSBLUR.Collections.Folders = Backbone.Collection.extend({
}
});
},
+
+ feeds_with_unreads: function(options) {
+ options = options || {};
+
+ return _.compact(_.flatten(this.map(function(item) {
+ if (item.is_feed()) {
+ return item.feed.has_unreads(options) && item.feed;
+ } else if (item.is_folder()) {
+ return item.folders.feeds_with_unreads(options);
+ }
+ })));
+ },
propagate_feed_selected: function() {
if (this.parent_folder) {
diff --git a/media/js/newsblur/reader/reader.js b/media/js/newsblur/reader/reader.js
index cfb707424..83b3f311b 100644
--- a/media/js/newsblur/reader/reader.js
+++ b/media/js/newsblur/reader/reader.js
@@ -1404,7 +1404,7 @@
}
}
- var feeds = this.list_feeds_with_unreads_in_folder($folder, false, true);
+ var feeds = this.list_feeds_with_unreads_in_folder(this.active_folder.folders, false, true);
this.cache['river_feeds_with_unreads'] = feeds;
this.hide_stories_error();
this.show_stories_progress_bar(feeds.length);
@@ -1452,29 +1452,28 @@
}
},
- list_feeds_with_unreads_in_folder: function($folder, counts_only, visible_only) {
+ list_feeds_with_unreads_in_folder: function(folder, counts_only, visible_only) {
var model = this.model;
var unread_view = this.get_unread_view_name();
- $folder = $folder || this.$s.$feed_list;
+ folder = folder || this.active_folder.folders;
- var $feeds = $('.feed:not(.NB-empty)', $folder);
- var feeds = _.compact(_.map($('.feed:not(.NB-empty)', $folder), function(o) {
- var feed_id = parseInt($(o).data('id'), 10);
- var feed = model.get_feed(feed_id);
- if (!feed) {
- return;
- } else if (counts_only && !visible_only) {
+ if (!folder || folder.get('fake')) {
+ folder = NEWSBLUR.assets.folders;
+ }
+
+ var feeds = _.compact(_.map(folder.feeds_with_unreads(), function(feed) {
+ if (counts_only && !visible_only) {
return feed.get('ps') + feed.get('nt') + feed.get('ng');
} else if (counts_only && visible_only) {
if (unread_view == 'positive') return feed.get('ps');
if (unread_view == 'neutral') return feed.get('ps') + feed.get('nt');
if (unread_view == 'negative') return feed.get('ps') + feed.get('nt') + feed.get('ng');
} else if (!counts_only && visible_only) {
- if (unread_view == 'positive') return feed.get('ps') && feed_id;
- if (unread_view == 'neutral') return (feed.get('ps') || feed.get('nt')) && feed_id;
- if (unread_view == 'negative') return (feed.get('ps') || feed.get('nt') || feed.get('ng')) && feed_id;
+ if (unread_view == 'positive') return feed.get('ps') && feed.id;
+ if (unread_view == 'neutral') return (feed.get('ps') || feed.get('nt')) && feed.id;
+ if (unread_view == 'negative') return (feed.get('ps') || feed.get('nt') || feed.get('ng')) && feed.id;
} else {
- return (feed.get('ps') || feed.get('nt') || feed.get('ng')) && feed_id;
+ return (feed.get('ps') || feed.get('nt') || feed.get('ng')) && feed.id;
}
}));
@@ -1759,7 +1758,10 @@
NEWSBLUR.app.original_tab_view.iframe_not_busting();
this.model.flags['no_more_stories'] = true;
- message = message || "Oh no!
There was an error!";
+ if (!message || message == 'error') {
+ message = "Oh no!
There was an error!";
+ }
+
if (data && data.status) {
if (data.status == 502) {
message = "NewsBlur is down right now.
Try again soon.";
@@ -2345,8 +2347,8 @@
var $taskbar_buttons = $('.NB-taskbar .task_button_view');
var $feed_view = this.$s.$feed_view;
var $feed_iframe = this.$s.$feed_iframe;
- var $page_to_feed_arrow = $('.NB-taskbar .NB-task-view-page-to-feed-arrow');
- var $feed_to_story_arrow = $('.NB-taskbar .NB-task-view-feed-to-story-arrow');
+ var $to_feed_arrow = $('.NB-taskbar .NB-task-view-to-feed-arrow');
+ var $to_story_arrow = $('.NB-taskbar .NB-task-view-to-story-arrow');
var $to_text_arrow = $('.NB-taskbar .NB-task-view-to-text-arrow');
if (!options.skip_save_type && this.story_view != view) {
@@ -2354,17 +2356,17 @@
}
this.hide_stories_error();
- $page_to_feed_arrow.hide();
- $feed_to_story_arrow.hide();
+ $to_feed_arrow.hide();
+ $to_story_arrow.hide();
$to_text_arrow.hide();
this.flags['page_view_showing_feed_view'] = false;
this.flags['feed_view_showing_story_view'] = false;
this.flags['temporary_story_view'] = false;
if (options.skip_save_type == 'page') {
- $page_to_feed_arrow.show();
+ $to_feed_arrow.show();
this.flags['page_view_showing_feed_view'] = true;
} else if (options.skip_save_type == 'story') {
- $feed_to_story_arrow.show();
+ $to_story_arrow.show();
this.flags['feed_view_showing_story_view'] = true;
} else if (options.skip_save_type == 'text') {
$to_text_arrow.show();
@@ -2413,7 +2415,7 @@
});
NEWSBLUR.app.story_list.reset_story_positions();
- } else if (view == 'story') {
+ } else if (view == 'text') {
$story_pane.animate({
'left': -2 * $feed_iframe.width()
}, {
@@ -2421,11 +2423,11 @@
'duration': this.model.preference('animations') ? 550 : 0,
'queue': false
});
- NEWSBLUR.app.story_tab_view.load_story_iframe();
+ NEWSBLUR.app.text_tab_view.load_story();
if (!this.active_story) {
this.show_next_story(1);
}
- } else if (view == 'text') {
+ } else if (view == 'story') {
$story_pane.animate({
'left': -3 * $feed_iframe.width()
}, {
@@ -2433,7 +2435,7 @@
'duration': this.model.preference('animations') ? 550 : 0,
'queue': false
});
- NEWSBLUR.app.text_tab_view.load_story();
+ NEWSBLUR.app.story_tab_view.load_story_iframe();
if (!this.active_story) {
this.show_next_story(1);
}
@@ -2451,20 +2453,20 @@
// view = 'page';
} else if ($active.hasClass('task_view_feed')) {
view = 'page';
- } else if ($active.hasClass('task_view_story')) {
- view = 'feed';
} else if ($active.hasClass('task_view_text')) {
- view = 'story';
+ view = 'feed';
+ } else if ($active.hasClass('task_view_story')) {
+ view = 'text';
}
} else if (direction == 1) {
if ($active.hasClass('task_view_page')) {
view = 'feed';
} else if ($active.hasClass('task_view_feed')) {
- view = 'story';
- } else if ($active.hasClass('task_view_story')) {
view = 'text';
} else if ($active.hasClass('task_view_text')) {
- // view = 'story';
+ view = 'story';
+ } else if ($active.hasClass('task_view_story')) {
+ // view = 'text';
}
}
@@ -2834,7 +2836,11 @@
$.make('ul', { className: 'segmented-control NB-menu-manage-view-setting-order' }, [
$.make('li', { className: 'NB-view-setting-order-newest NB-active' }, 'Newest first'),
$.make('li', { className: 'NB-view-setting-order-oldest' }, 'Oldest')
- ])
+ ]),
+ (NEWSBLUR.Globals.is_admin && $.make('ul', { className: 'segmented-control NB-menu-manage-view-setting-readfilter' }, [
+ $.make('li', { className: 'NB-view-setting-readfilter-all NB-active' }, 'All stories'),
+ $.make('li', { className: 'NB-view-setting-readfilter-unread' }, 'Unread only')
+ ]))
]),
$.make('li', { className: 'NB-menu-separator' }),
$.make('li', { className: 'NB-menu-item NB-menu-manage-move NB-menu-manage-folder-move' }, [
@@ -3698,7 +3704,6 @@
get_unread_count: function(visible_only, feed_id) {
var total = 0;
- var $folder;
feed_id = feed_id || this.active_feed;
var feed = this.model.get_feed(feed_id);
@@ -3719,12 +3724,7 @@
}
return total;
} else if (this.flags['river_view'] && !this.flags['social_view']) {
- if (feed_id == 'river:') {
- $folder = this.$s.$feed_list;
- } else {
- $folder = $('li.folder.NB-selected');
- }
- var counts = this.list_feeds_with_unreads_in_folder($folder, true, visible_only);
+ var counts = this.list_feeds_with_unreads_in_folder(this.active_folder.folders, true, visible_only);
return _.reduce(counts, function(m, c) { return m + c; }, 0);
} else if (this.flags['river_view'] && this.flags['social_view']) {
var unread_score = this.get_unread_view_score();
diff --git a/templates/reader/feeds_skeleton.xhtml b/templates/reader/feeds_skeleton.xhtml
index 3095953cf..d9c4e761b 100644
--- a/templates/reader/feeds_skeleton.xhtml
+++ b/templates/reader/feeds_skeleton.xhtml
@@ -166,15 +166,7 @@