From c312ce396fc452c149fab6ee9feec680f18398b0 Mon Sep 17 00:00:00 2001
From: Edgar Wang
Date: Mon, 13 May 2013 12:44:50 +0800
Subject: [PATCH 1/9] Add is_starred column for stories table
---
Gemfile.lock | 2 +-
.../20130513044029_add_is_starred_status_for_stories.rb | 5 +++++
2 files changed, 6 insertions(+), 1 deletion(-)
create mode 100644 db/migrate/20130513044029_add_is_starred_status_for_stories.rb
diff --git a/Gemfile.lock b/Gemfile.lock
index 56aa80c78..c2c4d0764 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -76,7 +76,7 @@ GEM
multi_json (1.7.3)
nokogiri (1.5.9)
pg (0.15.1)
- pry (0.9.12.1)
+ pry (0.9.12.2)
coderay (~> 1.0.5)
method_source (~> 0.8)
slop (~> 3.4)
diff --git a/db/migrate/20130513044029_add_is_starred_status_for_stories.rb b/db/migrate/20130513044029_add_is_starred_status_for_stories.rb
new file mode 100644
index 000000000..63423ab31
--- /dev/null
+++ b/db/migrate/20130513044029_add_is_starred_status_for_stories.rb
@@ -0,0 +1,5 @@
+class AddIsStarredStatusForStories < ActiveRecord::Migration
+ def change
+ add_column :stories, :is_starred, :boolean, default: false
+ end
+end
From f74f49c6da10ee3aefadbde476a3cf98e980d947 Mon Sep 17 00:00:00 2001
From: Edgar Wang
Date: Mon, 13 May 2013 13:00:51 +0800
Subject: [PATCH 2/9] Add starred function to story repository to get all
starred stories
---
app/repositories/story_repository.rb | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/app/repositories/story_repository.rb b/app/repositories/story_repository.rb
index 552ca2ae9..b8e20767a 100644
--- a/app/repositories/story_repository.rb
+++ b/app/repositories/story_repository.rb
@@ -8,6 +8,7 @@ def self.add(entry, feed)
permalink: entry.url,
body: extract_content(entry),
is_read: false,
+ is_starred: false,
published: entry.published || Time.now)
end
@@ -31,6 +32,11 @@ def self.read(page = 1)
Story.where(is_read: true).order("published desc").page(page).per_page(15)
end
+ def self.starred(page = 1)
+ Story.where(is_starred: true)
+ .order("published desc").page(page).per_page(15)
+ end
+
def self.read_count
Story.where(is_read: true).count
end
From 8875aaa29353754c371d5371ca6f139216998795 Mon Sep 17 00:00:00 2001
From: Edgar Wang
Date: Tue, 14 May 2013 07:53:56 +0800
Subject: [PATCH 3/9] Add /starred controller and update js to add starred
feature
---
app/controllers/stories_controller.rb | 9 ++++++++-
app/public/js/app.js | 17 +++++++++++++++--
2 files changed, 23 insertions(+), 3 deletions(-)
diff --git a/app/controllers/stories_controller.rb b/app/controllers/stories_controller.rb
index 5df3e92fc..1a9813019 100644
--- a/app/controllers/stories_controller.rb
+++ b/app/controllers/stories_controller.rb
@@ -14,12 +14,19 @@ class Stringer < Sinatra::Base
erb :archive
end
+ get "/starred" do
+ @starred_stories = StoryRepository.read(params[:page])
+
+ erb :starred
+ end
+
put "/stories/:id" do
json_params = JSON.parse(request.body.read, symbolize_names: true)
story = StoryRepository.fetch(params[:id])
story.is_read = json_params[:is_read]
story.keep_unread = json_params[:keep_unread]
+ story.is_starred = json_params[:is_starred]
StoryRepository.save(story)
end
@@ -28,4 +35,4 @@ class Stringer < Sinatra::Base
redirect to("/news")
end
-end
\ No newline at end of file
+end
diff --git a/app/public/js/app.js b/app/public/js/app.js
index b90f0df92..dcdc07b23 100644
--- a/app/public/js/app.js
+++ b/app/public/js/app.js
@@ -47,6 +47,14 @@ var Story = Backbone.Model.extend({
if (this.shouldSave()) this.save();
},
+ toggleStarred: function() {
+ if (this.get("is_starred")) {
+ this.set("is_starred", false);
+ } else {
+ this.set("is_starred", true);
+ }
+ },
+
close: function() {
this.set("open", false);
},
@@ -73,7 +81,8 @@ var StoryView = Backbone.View.extend({
events: {
"click .story-preview" : "storyClicked",
- "click .story-keep-unread" : "toggleKeepUnread"
+ "click .story-keep-unread" : "toggleKeepUnread",
+ "click .story-starred" : "toggleStarred"
},
initialize: function() {
@@ -106,6 +115,10 @@ var StoryView = Backbone.View.extend({
toggleKeepUnread: function() {
this.model.toggleKeepUnread();
+ },
+
+ toggleStarred: function() {
+ this.model.toggleStarred();
}
});
@@ -269,4 +282,4 @@ $(document).ready(function() {
Mousetrap.bind("?", function() {
$("#shortcuts").modal('toggle');
});
-});
\ No newline at end of file
+});
From e0e3bc06e7f7e1578cd3d98de83dadb979db6e99 Mon Sep 17 00:00:00 2001
From: Edgar Wang
Date: Sat, 18 May 2013 11:03:04 +0800
Subject: [PATCH 4/9] Add starred option to archive and news page
---
app/public/css/styles.css | 12 ++++++++++++
app/public/js/app.js | 10 +++++++++-
app/views/js/templates/_story.js.erb | 5 ++++-
3 files changed, 25 insertions(+), 2 deletions(-)
diff --git a/app/public/css/styles.css b/app/public/css/styles.css
index fe9d4a125..7fe5f88b8 100644
--- a/app/public/css/styles.css
+++ b/app/public/css/styles.css
@@ -179,6 +179,18 @@ li.story.open .story-preview {
margin-right: 25px;
}
+.story-starred {
+ display: inline-block;
+ cursor: pointer;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ margin-right: 25px;
+}
+
.story-body {
margin-left: 20px;
margin-right: 20px;
diff --git a/app/public/js/app.js b/app/public/js/app.js
index 8c186f2a6..bf89bd7c3 100644
--- a/app/public/js/app.js
+++ b/app/public/js/app.js
@@ -53,6 +53,8 @@ var Story = Backbone.Model.extend({
} else {
this.set("is_starred", true);
}
+
+ if (this.shouldSave()) this.save();
},
close: function() {
@@ -92,6 +94,7 @@ var StoryView = Backbone.View.extend({
this.listenTo(this.model, 'change:open', this.itemOpened);
this.listenTo(this.model, 'change:is_read', this.itemRead);
this.listenTo(this.model, 'change:keep_unread', this.itemKeepUnread);
+ this.listenTo(this.model, 'change:is_starred', this.itemStarred);
},
render: function() {
@@ -119,11 +122,16 @@ var StoryView = Backbone.View.extend({
if (!this.$el.visible()) window.scrollTo(0, this.$el.offset().top);
},
- itemKeepUnread: function(){
+ itemKeepUnread: function() {
var icon = this.model.get("keep_unread") ? "icon-check" : "icon-check-empty";
this.$(".story-keep-unread > i").attr("class", icon);
},
+ itemStarred: function() {
+ var icon = this.model.get("is_starred") ? "icon-star" : "icon-star-empty";
+ this.$(".story-starred > i").attr("class", icon);
+ },
+
storyClicked: function() {
this.model.toggle();
window.scrollTo(0, this.$el.offset().top);
diff --git a/app/views/js/templates/_story.js.erb b/app/views/js/templates/_story.js.erb
index 56460f982..414d8540e 100644
--- a/app/views/js/templates/_story.js.erb
+++ b/app/views/js/templates/_story.js.erb
@@ -32,10 +32,13 @@
<%= t('stories.keep_unread') %>
+
+
+
-
\ No newline at end of file
+
From 1ea443537daebff71bc87ad8c678df622d5cbb86 Mon Sep 17 00:00:00 2001
From: Edgar Wang
Date: Sat, 18 May 2013 12:28:00 +0800
Subject: [PATCH 5/9] Add starred page and locales
---
Gemfile.lock | 2 +-
app/controllers/stories_controller.rb | 2 +-
app/views/js/templates/_story.js.erb | 2 +-
app/views/partials/_action_bar.erb | 3 +++
app/views/partials/_feed_action_bar.erb | 3 +++
app/views/starred.erb | 30 +++++++++++++++++++++++++
config/locales/en.yml | 7 ++++++
config/locales/zh-CN.yml | 7 ++++++
8 files changed, 53 insertions(+), 3 deletions(-)
create mode 100644 app/views/starred.erb
diff --git a/Gemfile.lock b/Gemfile.lock
index b90f087c7..459d55e27 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -128,7 +128,7 @@ GEM
tilt (>= 1.3.0)
sinatra-flash (0.3.0)
sinatra (>= 1.0.0)
- slop (3.4.4)
+ slop (3.4.5)
sqlite3 (1.3.7)
thor (0.18.1)
tilt (1.4.1)
diff --git a/app/controllers/stories_controller.rb b/app/controllers/stories_controller.rb
index 2724e3406..6cd49c6bc 100644
--- a/app/controllers/stories_controller.rb
+++ b/app/controllers/stories_controller.rb
@@ -15,7 +15,7 @@ class Stringer < Sinatra::Base
end
get "/starred" do
- @starred_stories = StoryRepository.read(params[:page])
+ @starred_stories = StoryRepository.starred(params[:page])
erb :starred
end
diff --git a/app/views/js/templates/_story.js.erb b/app/views/js/templates/_story.js.erb
index 414d8540e..51b9a1d43 100644
--- a/app/views/js/templates/_story.js.erb
+++ b/app/views/js/templates/_story.js.erb
@@ -5,7 +5,7 @@
{{= source }}
-
+
{{= headline }}
diff --git a/app/views/partials/_action_bar.erb b/app/views/partials/_action_bar.erb
index 326fdf89d..800cf2ef5 100644
--- a/app/views/partials/_action_bar.erb
+++ b/app/views/partials/_action_bar.erb
@@ -11,6 +11,9 @@
+
+
+
diff --git a/app/views/partials/_feed_action_bar.erb b/app/views/partials/_feed_action_bar.erb
index fd8f302c5..f11a3d0c4 100644
--- a/app/views/partials/_feed_action_bar.erb
+++ b/app/views/partials/_feed_action_bar.erb
@@ -6,6 +6,9 @@
+
+
+
diff --git a/app/views/starred.erb b/app/views/starred.erb
new file mode 100644
index 000000000..816f39937
--- /dev/null
+++ b/app/views/starred.erb
@@ -0,0 +1,30 @@
+
+ <%= render_partial :feed_action_bar %>
+
+
+<% unless @starred_stories.empty? %>
+ <%= render_js :stories, { stories: @starred_stories } %>
+
+
+
+
+<% else %>
+
+
<%= t('starred.sorry') %>
+
+<% end %>
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 7387899ef..1dad920d5 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -4,6 +4,11 @@ en:
of: of
previous: Previous
sorry: Sorry, you haven't read any stories yet!
+ starred:
+ next: Next
+ of: of
+ previous: Previous
+ sorry: Sorry, you haven't starred any stories yet!
date:
abbr_month_names:
-
@@ -70,6 +75,7 @@ en:
mark_all: Mark all as read
refresh: Refresh
view_feeds: View feeds
+ starred_stories: Starred stories
feed:
last_fetched:
never: Never
@@ -83,6 +89,7 @@ en:
archived_stories: Archived stories
feeds: View feeds
home: Return to Stories
+ starred_stories: Starred stories
shortcuts:
keys:
jk: Next/previous story
diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml
index c02dfa781..3d1ad899b 100644
--- a/config/locales/zh-CN.yml
+++ b/config/locales/zh-CN.yml
@@ -4,6 +4,11 @@ zh-CN:
of: of
previous: 上一页
sorry: 呃,你现在还没有已经读过的故事
+ starred:
+ next: 下一页
+ of: of
+ previous: 上一页
+ sorry: 呃,你现在还没有为任何故事加注星标
date:
abbr_month_names:
-
@@ -70,6 +75,7 @@ zh-CN:
mark_all: 全部标为已读
refresh: 刷新
view_feeds: 查看订阅列表
+ starred_stories: 加星标的故事
feed:
last_fetched:
never: 尚未成功读取过
@@ -83,6 +89,7 @@ zh-CN:
archived_stories: 已读故事
feeds: 查看订阅列表
home: 返回未读故事列表
+ starred_stories: 加星标的故事
shortcuts:
keys:
jk: 下一个/上一个故事
From 14f2abd34621c98f1fa7d1ef6b523d7b9a430815 Mon Sep 17 00:00:00 2001
From: Edgar Wang
Date: Sun, 19 May 2013 09:54:37 +0800
Subject: [PATCH 6/9] Add hotkey 's' to toggle between starred and unstarred
status
---
app/public/js/app.js | 9 +++++++++
app/views/js/stories.js.erb | 6 +++++-
app/views/partials/_shortcuts.erb | 1 +
config/locales/en.yml | 1 +
config/locales/zh-CN.yml | 1 +
5 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/app/public/js/app.js b/app/public/js/app.js
index bf89bd7c3..c5ba3e7be 100644
--- a/app/public/js/app.js
+++ b/app/public/js/app.js
@@ -224,6 +224,11 @@ var StoryList = Backbone.Collection.extend({
toggleCurrentKeepUnread: function() {
if (this.cursorPosition < 0) this.cursorPosition = 0;
this.at(this.cursorPosition).toggleKeepUnread();
+ },
+
+ toggleCurrentStarred: function() {
+ if (this.cursorPosition < 0) this.cursorPosition = 0;
+ this.at(this.cursorPosition).toggleStarred();
}
});
@@ -284,6 +289,10 @@ var AppView = Backbone.View.extend({
toggleCurrentKeepUnread: function() {
this.stories.toggleCurrentKeepUnread();
+ },
+
+ toggleCurrentStarred: function() {
+ this.stories.toggleCurrentStarred();
}
});
diff --git a/app/views/js/stories.js.erb b/app/views/js/stories.js.erb
index 866d4c547..f937cce8a 100644
--- a/app/views/js/stories.js.erb
+++ b/app/views/js/stories.js.erb
@@ -35,5 +35,9 @@
Mousetrap.bind(["m"], function() {
StoryApp.toggleCurrentKeepUnread();
});
+
+ Mousetrap.bind(["s"], function() {
+ StoryApp.toggleCurrentStarred();
+ });
});
-
\ No newline at end of file
+
diff --git a/app/views/partials/_shortcuts.erb b/app/views/partials/_shortcuts.erb
index ce896bc46..0cc2e32ed 100644
--- a/app/views/partials/_shortcuts.erb
+++ b/app/views/partials/_shortcuts.erb
@@ -9,6 +9,7 @@
n/p: <%= t('partials.shortcuts.keys.np') %>
o <%= t('partials.shortcuts.keys.or') %> enter: <%= t('partials.shortcuts.keys.oenter') %>
m: <%= t('partials.shortcuts.keys.m') %>
+ s: <%= t('partials.shortcuts.keys.s') %>
v: <%= t('partials.shortcuts.keys.v') %>
shift+a: <%= t('partials.shortcuts.keys.shifta') %>
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 1dad920d5..67675905c 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -94,6 +94,7 @@ en:
keys:
jk: Next/previous story
m: Mark item as read/unread
+ s: Mark item as starred/unstarred
np: Move down/move up
oenter: Toggle story open/closed
or: or
diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml
index 3d1ad899b..980ed2cda 100644
--- a/config/locales/zh-CN.yml
+++ b/config/locales/zh-CN.yml
@@ -94,6 +94,7 @@ zh-CN:
keys:
jk: 下一个/上一个故事
m: 将一个条目标为已读/未读
+ s: 为一个条目加注星标/取消星标
np: 向上/向下移动
oenter: 点击打开/关闭
or: 或
From 9b6fe6f5a722f3c66c6c05ae5a5579c57f093ea4 Mon Sep 17 00:00:00 2001
From: Edgar Wang
Date: Mon, 20 May 2013 22:41:59 +0800
Subject: [PATCH 7/9] Add another star icon before feed title to show star
status
---
app/public/css/styles.css | 7 +++++++
app/public/js/app.js | 1 +
app/views/js/templates/_story.js.erb | 5 +++++
3 files changed, 13 insertions(+)
diff --git a/app/public/css/styles.css b/app/public/css/styles.css
index 7fe5f88b8..ab57f90a2 100644
--- a/app/public/css/styles.css
+++ b/app/public/css/styles.css
@@ -179,6 +179,13 @@ li.story.open .story-preview {
margin-right: 25px;
}
+.story-starred-box {
+ display: inline-block;
+ float: left;
+ padding-left: 2px;
+ width: 15%;
+}
+
.story-starred {
display: inline-block;
cursor: pointer;
diff --git a/app/public/js/app.js b/app/public/js/app.js
index c5ba3e7be..d6a232f98 100644
--- a/app/public/js/app.js
+++ b/app/public/js/app.js
@@ -130,6 +130,7 @@ var StoryView = Backbone.View.extend({
itemStarred: function() {
var icon = this.model.get("is_starred") ? "icon-star" : "icon-star-empty";
this.$(".story-starred > i").attr("class", icon);
+ this.$el.preventDefault();
},
storyClicked: function() {
diff --git a/app/views/js/templates/_story.js.erb b/app/views/js/templates/_story.js.erb
index 51b9a1d43..60d6c482d 100644
--- a/app/views/js/templates/_story.js.erb
+++ b/app/views/js/templates/_story.js.erb
@@ -1,6 +1,11 @@