Allow users to filter the favorite watchlist
[gitorious:base_uri-fixes.git] / app / helpers / favorites_helper.rb
1 # encoding: utf-8
2 #--
3 #   Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
4 #
5 #   This program is free software: you can redistribute it and/or modify
6 #   it under the terms of the GNU Affero General Public License as published by
7 #   the Free Software Foundation, either version 3 of the License, or
8 #   (at your option) any later version.
9 #
10 #   This program is distributed in the hope that it will be useful,
11 #   but WITHOUT ANY WARRANTY; without even the implied warranty of
12 #   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 #   GNU Affero General Public License for more details.
14 #
15 #   You should have received a copy of the GNU Affero General Public License
16 #   along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 #++
18
19 module FavoritesHelper
20   def favorite_button(watchable)
21     if logged_in? && favorite = current_user.favorites.detect{|f| f.watchable == watchable}
22       link = destroy_favorite_link_to(favorite, watchable)
23     else
24       link = create_favorite_link_to(watchable)
25     end
26
27     content_tag(:div, link, :class => "white-button round-10 small-button favorite")
28   end
29
30   def create_favorite_link_to(watchable)
31     class_name = watchable.class.name
32     link_to("Start watching",
33       favorites_path(:watchable_id => watchable.id,:watchable_type => class_name),
34       :method => :post, :"data-request-method" => "post",
35       :class => "watch-link disabled round-10",
36       :id => "watch_#{class_name.downcase}_#{watchable.id}"
37       )
38   end
39
40   def destroy_favorite_link_to(favorite, watchable)
41     link_to("Stop watching",
42       favorite_path(favorite),
43       :method => :delete, :"data-request-method" => "delete",
44       :class => "watch-link enabled round-10")
45   end
46
47   # Builds a link to the target of a favorite event
48   def link_to_watchable(watchable)
49     case watchable
50     when Repository
51       link_to(repo_title(watchable, watchable.project),
52         repo_owner_path(watchable, [watchable.project, watchable]))
53     when MergeRequest
54       link_to(h(truncate(watchable.summary, :length => 65)),
55         repo_owner_path(watchable.target_repository,
56           [watchable.source_repository.project,
57            watchable.target_repository,
58           watchable]))
59     else
60       link_to(h(watchable.title), watchable)
61     end
62   end
63
64   # is this +watchable+ included in the users @favorites?
65   def favorited?(watchable)
66     @favorites.include?(watchable)
67   end
68
69   def css_classes_for(watchable)
70     css_classes = ["favorite"]
71     css_classes << watchable.class.name.underscore
72     if current_user == watchable.user
73       css_classes << "mine"
74     else
75       css_classes << "foreign"
76     end
77     css_classes.join(" ")
78   end
79 end