From eba4a6e3f5745c6d849c9585250d3ab96bafe975 Mon Sep 17 00:00:00 2001 From: Kyle Drake Date: Thu, 1 May 2014 14:09:45 -0700 Subject: [PATCH] event like support --- app.rb | 8 ++ models/event.rb | 22 +++++ public/assets/scripts/news/like.js | 27 ++++++ views/_news.erb | 1 + views/_news_actions.erb | 11 +++ views/_news_profile_comment.erb | 2 + views/home.erb | 133 +++++++++++++++-------------- 7 files changed, 138 insertions(+), 66 deletions(-) create mode 100644 public/assets/scripts/news/like.js create mode 100644 views/_news_actions.erb diff --git a/app.rb b/app.rb index e87da76e..f5739880 100644 --- a/app.rb +++ b/app.rb @@ -857,6 +857,14 @@ post '/api/:name' do api_not_found end +post '/event/:event_id/toggle_like' do |event_id| + require_login + content_type :json + event = Event[id: event_id] + liked_response = event.toggle_site_like(current_site) ? 'liked' : 'unliked' + {result: liked_response, event_like_count: event.likes_dataset.count}.to_json +end + def require_admin redirect '/' unless signed_in? && current_site.is_admin end diff --git a/models/event.rb b/models/event.rb index a86811b1..527c6854 100644 --- a/models/event.rb +++ b/models/event.rb @@ -6,4 +6,26 @@ class Event < Sequel::Model one_to_one :site_change many_to_one :profile_comment one_to_many :likes + + def site_likes?(site) + likes_dataset.filter(actioning_site_id: site.id).count > 0 + end + + def site_like(site) + add_like actioning_site_id: site.id + end + + def site_unlike(site) + likes_dataset.filter(actioning_site_id: site.id).delete + end + + def toggle_site_like(site) + if site_likes? site + site_unlike site + false + else + site_like site + true + end + end end \ No newline at end of file diff --git a/public/assets/scripts/news/like.js b/public/assets/scripts/news/like.js new file mode 100644 index 00000000..d0388728 --- /dev/null +++ b/public/assets/scripts/news/like.js @@ -0,0 +1,27 @@ +var Like = function(eventId, csrfToken) { + this.eventId = eventId + this.csrfToken = csrfToken + this.link = $('#event_'+this.eventId+'_actions a#like') +} + +Like.prototype.toggleLike = function() { + console.log('herp?') + var self = this + $.post('/event/'+this.eventId+'/toggle_like', {csrf_token: this.csrfToken}, function(res) { + console.log(res) + + console.log(self.link.text('butts')) + + if(res.result == 'liked') + self.link.text('Unlike ('+res.event_like_count+')') + + if(res.result == 'unliked') { + var linkText = 'Like' + + if(res.event_like_count > 0) + linkText += ' ('+res.event_like_count+')' + + self.link.text(linkText) + } + }) +} \ No newline at end of file diff --git a/views/_news.erb b/views/_news.erb index 1565d00f..d13324a1 100644 --- a/views/_news.erb +++ b/views/_news.erb @@ -1,3 +1,4 @@ + <% events.each do |event| %> <% if event.profile_comment_id %> <%== erb :'_news_profile_comment', layout: false, locals: {profile_comment: event.profile_comment} %> diff --git a/views/_news_actions.erb b/views/_news_actions.erb new file mode 100644 index 00000000..05f3d578 --- /dev/null +++ b/views/_news_actions.erb @@ -0,0 +1,11 @@ +
+ <% if current_site %> + <%= event.site_likes?(current_site) ? 'Unlike' : 'Like' %><%= event.likes_dataset.count > 0 ? " (#{event.likes_dataset.count})" : '' %> + <% else %> + <% event_like_count = event.likes_dataset.count %> + <% if event_like_count > 0 %> + <%= event_like_count %> <%= event_like_count == 1 ? 'like' : 'likes' %> + <% end %> + <% end %> + Reply +
\ No newline at end of file diff --git a/views/_news_profile_comment.erb b/views/_news_profile_comment.erb index 70473d2f..f5ffdbd1 100644 --- a/views/_news_profile_comment.erb +++ b/views/_news_profile_comment.erb @@ -5,4 +5,6 @@ <%= profile_comment.created_at.ago %>
<%= profile_comment.message %>
+ + <%== erb :'_news_actions', layout: false, locals: {event: profile_comment.event} %> \ No newline at end of file diff --git a/views/home.erb b/views/home.erb index fb2729f7..643808de 100644 --- a/views/home.erb +++ b/views/home.erb @@ -21,77 +21,78 @@

You aren't following any websites yet! Once you do, updates will show up here and you can like and comment on them. Here are some website suggestions based on your tags, or check out all the sites on Neocities!

-
- - Games - Anime - Art - Cooking -
+
+ + Games + Anime + Art + Cooking +
+ +
+ + Games + Anime + Art +
+ +
+ + Games + Anime +
+ +
+ + Games +
+ +
+ + Games + Anime +
+ +
+ + Games +
-
- - Games - Anime - Art -
- -
- - Games - Anime -
- -
- - Games -
- -
- - Games - Anime -
- -
- - Games -
<% end %>
-

http://<%= site.username %>.neocities.org

+

<%= site.username %>.neocities.org

<% if site.updated_at %>