Implement a read flag, mark unread items in the ui

+ unread count
This commit is contained in:
Aaron Mueller 2013-01-10 22:21:23 +01:00
parent c24799fed2
commit a4c8be72a7
14 changed files with 43 additions and 18 deletions

View file

@ -2,10 +2,11 @@
* Handle relative URLs in Atom feed. * Handle relative URLs in Atom feed.
(http://www.rfc1149.net/blog/2010/12/27/feed-and-relative-links/) (http://www.rfc1149.net/blog/2010/12/27/feed-and-relative-links/)
* Update a single feed manually and mark the new feeds in the db
* Rake task to update all feeds at once * Rake task to update all feeds at once
* Detect an RSS link in a given website URL * Detect an RSS link in a given website URL
* Add an optional manual title to the imported feed
* Collapse the opened item again
* Make the UI consistend (read/unread items)
=== Low priority === Low priority
@ -16,4 +17,3 @@
=== Broken feeds with feedzirra === Broken feeds with feedzirra
* http://blog.fefe.de/rss.xml

View file

@ -1,5 +1,9 @@
@import "config"; @import "config";
a.unread {
font-weight: bold;
}
li.item { li.item {
overflow: auto; overflow: auto;

View file

@ -1,7 +1,7 @@
@import "config"; @import "config";
aside { aside {
width: 250px; width: 350px;
float: left; float: left;
ul { ul {

View file

@ -10,6 +10,12 @@ class FeedsController < ApplicationController
render :layout => false render :layout => false
end end
def refresh
@feed = Feed.find(params[:id])
@feed.fetch!
redirect_to :action => :show, :notice => "Add the feed"
end
def create def create
@feed = Feed.import(params[:feed][:url]) @feed = Feed.import(params[:feed][:url])
redirect_to :action => :index, :notice => "Add the feed" redirect_to :action => :index, :notice => "Add the feed"

View file

@ -1,6 +1,7 @@
class ItemsController < ApplicationController class ItemsController < ApplicationController
def show def show
@item = Item.find(params[:id]) @item = Item.find(params[:id])
@item.read
render :layout => false render :layout => false
end end
end end

View file

@ -1,5 +1,3 @@
require "pp"
class Feed < ActiveRecord::Base class Feed < ActiveRecord::Base
has_many :items, :dependent => :destroy has_many :items, :dependent => :destroy
has_many :errors, :dependent => :destroy has_many :errors, :dependent => :destroy

View file

@ -1,11 +1,14 @@
class Item < ActiveRecord::Base class Item < ActiveRecord::Base
belongs_to :feed belongs_to :feed
validates_presence_of :title, :author, :content validates_presence_of :title, :author, :content
validates_uniqueness_of :url validates_uniqueness_of :url
default_scope order("published_at DESC") default_scope order("published_at DESC")
scope :recent, limit(10) scope :recent, limit(10)
scope :unread, where(:read_at => nil)
#attr_accessible :read_at
def self.create_from_feed_entry!(feed_entry) def self.create_from_feed_entry!(feed_entry)
feed_entry.sanitize! feed_entry.sanitize!
@ -19,6 +22,10 @@ class Item < ActiveRecord::Base
) )
end end
def read
update_attribute(:read_at, Time.now)
end
def <=>(other) def <=>(other)
self.published_at <=> other.published_at self.published_at <=> other.published_at
end end

View file

@ -1,9 +1,14 @@
<ul id="feed_list"> <ul id="feed_list">
<% @feeds.each do |feed| %> <% @feeds.each do |feed| %>
<% unread_count = feed.items.unread.size %>
<li> <li>
(<%= link_to "del", feed_path(feed), :remote => true, :method => :delete, :class => "delete_feed button", :confirm => "Delete this feed?" %>, (<%= link_to "del", feed_path(feed), :remote => true, :method => :delete, :class => "delete_feed button", :confirm => "Delete this feed?" %>,
<%= link_to "err", errors_feed_path(feed), :remote => true, :class => "button", :update => "feed_content" %>) <%= link_to "err", errors_feed_path(feed), :remote => true, :class => "button", :update => "feed_content" %>,
<%= link_to feed.title, feed_path(feed), :remote => true, :update => "feed_content" %> <%= link_to "up", refresh_feed_path(feed), :remote => true, :class => "button", :method => :post, :update => "feed_content" %>)
<% r = unread_count.zero? ? "read" : "unread" %>
<%= link_to feed.title, feed_path(feed), :remote => true, :update => "feed_content", :class => r %>
[<%= unread_count %>]
</li> </li>
<% end %> <% end %>
</ul> </ul>

View file

@ -3,7 +3,8 @@
<ul> <ul>
<% @feed.items.each do |item| %> <% @feed.items.each do |item| %>
<li class="item"> <li class="item">
<%= link_to raw(item.title), item_path(item), :remote => true %> <% r = item.read_at.nil? ? "unread" : "read" %>
<%= link_to raw(item.title), item_path(item), :remote => true, :class => r %>
<em class="date_published"><%= time_ago_in_words(item.published_at) %></em> <em class="author">by <%= item.author %></em> <em class="date_published"><%= time_ago_in_words(item.published_at) %></em> <em class="author">by <%= item.author %></em>
<article></article> <article></article>
</li> </li>

View file

@ -1,3 +1,3 @@
<p> <p>
<%= raw @item.content %> <%= raw @item.content %>
</p> </p>

View file

@ -17,6 +17,7 @@ FeedFu::Application.routes.draw do
get :import get :import
end end
member do member do
post :refresh
get :errors get :errors
end end
end end

View file

@ -1,9 +1,5 @@
class AddErrorField < ActiveRecord::Migration class AddErrorField < ActiveRecord::Migration
def up def change
add_column :feeds, :has_errors, :boolean, :default => false add_column :feeds, :has_errors, :boolean, :default => false
end end
def down
remove_column :feeds, :has_errors
end
end end

View file

@ -0,0 +1,5 @@
class AddReadFlagToItems < ActiveRecord::Migration
def change
add_column :items, :read_at, :timestamp, :default => nil
end
end

View file

@ -11,7 +11,7 @@
# #
# It's strongly recommended to check this file into your version control system. # It's strongly recommended to check this file into your version control system.
ActiveRecord::Schema.define(:version => 20130110200633) do ActiveRecord::Schema.define(:version => 20130110204625) do
create_table "errors", :force => true do |t| create_table "errors", :force => true do |t|
t.integer "feed_id" t.integer "feed_id"
@ -38,6 +38,7 @@ ActiveRecord::Schema.define(:version => 20130110200633) do
t.integer "feed_id" t.integer "feed_id"
t.datetime "created_at", :null => false t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false t.datetime "updated_at", :null => false
t.datetime "read_at"
end end
end end