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 @@