diff --git a/app/controllers/context_menus_controller.rb b/app/controllers/context_menus_controller.rb
index 4c7305873..1e37f623b 100644
--- a/app/controllers/context_menus_controller.rb
+++ b/app/controllers/context_menus_controller.rb
@@ -33,7 +33,7 @@ class ContextMenusController < ApplicationController
@can = {
:edit => @issues.all?(&:attributes_editable?),
- :log_time => (@project && User.current.allowed_to?(:log_time, @project)),
+ :log_time => @issue&.time_loggable?,
:copy => User.current.allowed_to?(:copy_issues, @projects) && Issue.allowed_target_projects.any?,
:add_watchers => User.current.allowed_to?(:add_issue_watchers, @projects),
:delete => @issues.all?(&:deletable?),
diff --git a/app/models/issue.rb b/app/models/issue.rb
index 980bd56f0..7b261cf67 100644
--- a/app/models/issue.rb
+++ b/app/models/issue.rb
@@ -188,6 +188,11 @@ class Issue < ApplicationRecord
end
end
+ # Returns true if user or current user is allowed to log time on the issue
+ def time_loggable?(user=User.current)
+ user.allowed_to?(:log_time, project) && (!Setting.timelog_accept_future_dates? || !closed?)
+ end
+
# Returns true if user or current user is allowed to edit or add notes to the issue
def editable?(user=User.current)
attributes_editable?(user) || notes_addable?(user)
diff --git a/app/models/time_entry.rb b/app/models/time_entry.rb
index abbbe4441..b97d47b5d 100644
--- a/app/models/time_entry.rb
+++ b/app/models/time_entry.rb
@@ -182,6 +182,9 @@ class TimeEntry < ApplicationRecord
if spent_on && spent_on_changed? && user
errors.add :base, I18n.t(:error_spent_on_future_date) if !Setting.timelog_accept_future_dates? && (spent_on > user.today)
end
+ if !Setting.timelog_accept_closed_issues? && issue&.closed? && issue&.was_closed?
+ errors.add :base, I18n.t(:error_spent_on_closed_issue)
+ end
end
def hours=(h)
diff --git a/app/views/issues/_action_menu.html.erb b/app/views/issues/_action_menu.html.erb
index 6009df89e..8b5d3021d 100644
--- a/app/views/issues/_action_menu.html.erb
+++ b/app/views/issues/_action_menu.html.erb
@@ -3,7 +3,7 @@
:onclick => 'showAndScrollTo("update", "issue_notes"); return false;',
:class => 'icon icon-edit ', :accesskey => accesskey(:edit) if @issue.editable? %>
<%= link_to sprite_icon('time-add', l(:button_log_time)), new_issue_time_entry_path(@issue),
- :class => 'icon icon-time-add ' if User.current.allowed_to?(:log_time, @project) %>
+ :class => 'icon icon-time-add ' if @issue.time_loggable? %>
<%= watcher_link(@issue, User.current) %>
<%= link_to sprite_icon('copy', l(:button_copy)), project_copy_issue_path(@project, @issue),
:class => 'icon icon-copy ' if User.current.allowed_to?(:copy_issues, @project) && Issue.allowed_target_projects.any? %>
diff --git a/app/views/issues/_edit.html.erb b/app/views/issues/_edit.html.erb
index f00b65750..5692eb80b 100644
--- a/app/views/issues/_edit.html.erb
+++ b/app/views/issues/_edit.html.erb
@@ -9,7 +9,7 @@
<% end %>
- <% if User.current.allowed_to?(:log_time, @issue.project) %>
+ <% if @issue.time_loggable? %>