summaryrefslogtreecommitdiff
path: root/lib/redmine_hacks/timelog_hooks.rb
blob: ad2e13f154e39c558b252571aa1c546ef9870a7f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#
# Allows anyone who is authorized to log time be able to log time
# as anyone else who is also authorized to log time.
#

module RedmineHacks
  class Hooks < Redmine::Hook::ViewListener

    def controller_timelog_edit_before_save(context={})
      params     = context[:params]
      time_entry = context[:time_entry]
      if params[:time_entry] && params[:time_entry][:user_id]
        user = User.find_by_id(params[:time_entry][:user_id])
        if user && user.allowed_to?(:log_time, time_entry.project)
          time_entry.user = user
        end
      end
    end

    def view_timelog_edit_form_bottom(context={})
      form = context[:form]
      time_entry = context[:time_entry]
      "<p>%s</p>" % form.select(
        :user_id,
        timelog_user_collection_for_select_options(time_entry),
        {:required => true},
        {:size => time_entry.project.members.size}
      )
    end

    protected

    def timelog_user_collection_for_select_options(time_entry)
      collection = time_entry.project.members.map{|member| member.user }.sort
      collection.keep_if{|user| user.allowed_to?(:log_time, time_entry.project)}
      if time_entry.user && !collection.include?(time_entry.user)
        collection << time_entry.user
      end
      s = ''
      collection.sort.each do |element|
        if time_entry.user && time_entry.user == element
          selected_attribute = ' selected="selected"'
        else
          selected_attribute = ''
        end
        s << %(<option value="#{element.id}"#{selected_attribute}>#{h element.login} - #{h element.name}</option>)
      end
      s.html_safe
    end

  end
end