diff --git a/app/models/issue.rb b/app/models/issue.rb index ad4728444..1e160d2a9 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -56,7 +56,11 @@ class Issue < ApplicationRecord acts_as_mentionable :attributes => ['description'] - DONE_RATIO_OPTIONS = %w(issue_field issue_status) + DONE_RATIO_OPTIONS = %w[ + issue_field + issue_field_5_percent_increments + issue_status + ] attr_reader :transition_warning attr_writer :deleted_attachment_ids @@ -746,7 +750,19 @@ class Issue < ApplicationRecord end def self.use_field_for_done_ratio? - Setting.issue_done_ratio == 'issue_field' + Setting.issue_done_ratio.start_with?('issue_field') + end + + def self.done_ratio_step_value + case Setting.issue_done_ratio + when 'issue_field' + 10 + when 'issue_field_5_percent_increments' + 5 + else + # Unknown option + self.use_field_for_done_ratio? ? 10 : nil + end end def validate_issue diff --git a/app/views/issues/_attributes.html.erb b/app/views/issues/_attributes.html.erb index 40b89547a..6475e41c3 100644 --- a/app/views/issues/_attributes.html.erb +++ b/app/views/issues/_attributes.html.erb @@ -88,7 +88,7 @@ <% end %> <% if @issue.safe_attribute?('done_ratio') && Issue.use_field_for_done_ratio? %> -

<%= f.select :done_ratio, ((0..10).to_a.collect {|r| ["#{r*10} %", r*10] }), :required => @issue.required_attribute?('done_ratio') %>

+

<%= f.select :done_ratio, ((0..100).step(Issue.done_ratio_step_value).to_a.collect {|r| ["#{r} %", r] }), :required => @issue.required_attribute?('done_ratio') %>

<% end %> diff --git a/app/views/issues/bulk_edit.html.erb b/app/views/issues/bulk_edit.html.erb index 4fe457b32..e604bccf1 100644 --- a/app/views/issues/bulk_edit.html.erb +++ b/app/views/issues/bulk_edit.html.erb @@ -178,7 +178,7 @@ <% if @safe_attributes.include?('done_ratio') && Issue.use_field_for_done_ratio? %>

- <%= select_tag 'issue[done_ratio]', options_for_select([[l(:label_no_change_option), '']] + (0..10).to_a.collect {|r| ["#{r*10} %", r*10] }, @issue_params[:done_ratio]) %> + <%= select_tag 'issue[done_ratio]', options_for_select([[l(:label_no_change_option), '']] + (0..100).step(Issue.done_ratio_step_value).to_a.collect {|r| ["#{r} %", r] }, @issue_params[:done_ratio]) %>

<% end %> diff --git a/config/locales/en.yml b/config/locales/en.yml index c842e4d7b..5cffdc97d 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -476,7 +476,8 @@ en: setting_new_project_user_role_id: Role given to a non-admin user who creates a project setting_default_projects_modules: Default enabled modules for new projects setting_issue_done_ratio: Calculate the issue done ratio with - setting_issue_done_ratio_issue_field: Use the issue field + setting_issue_done_ratio_issue_field: Use the issue field (10% increments) + setting_issue_done_ratio_issue_field_5_percent_increments: Use the issue field (5% increments) setting_issue_done_ratio_issue_status: Use the issue status setting_start_of_week: Start calendars on setting_rest_api_enabled: Enable REST web service diff --git a/test/functional/issues_controller_test.rb b/test/functional/issues_controller_test.rb index 53cfd8146..e3c6d1ccc 100644 --- a/test/functional/issues_controller_test.rb +++ b/test/functional/issues_controller_test.rb @@ -8736,4 +8736,19 @@ class IssuesControllerTest < Redmine::ControllerTest end end end + + def test_get_new_with_issue_field_five_percent_increments + with_settings :issue_done_ratio => 'issue_field_5_percent_increments' do + @request.session[:user_id] = 1 + get :new + assert_response :success + + assert_select 'select#issue_done_ratio' do + assert_select 'option', count: 21 + assert_select 'option:nth-of-type(1)', text: '0 %' + assert_select 'option:nth-of-type(2)', text: '5 %' + assert_select 'option:nth-of-type(21)', text: '100 %' + end + end + end end