summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGo MAEDA <maeda@farend.jp>2025-04-19 08:46:02 +0000
committerGo MAEDA <maeda@farend.jp>2025-04-19 08:46:02 +0000
commitce94a1d71a512f4cba9dd3e2359e8a4c2c1d285d (patch)
treeeb60961e7c32036696cd19bd22fada4d9bbf7766
parentd76cf64516e71ba4cfc1dd4bf93097f0bb5f9597 (diff)
downloadredmine-ce94a1d71a512f4cba9dd3e2359e8a4c2c1d285d.tar.gz
redmine-ce94a1d71a512f4cba9dd3e2359e8a4c2c1d285d.zip
Adds interval ratio setting to progressbar custom field (#42335).
Patch by Marius BĂLTEANU (user:marius.balteanu) and Go MAEDA (user:maeda). git-svn-id: https://svn.redmine.org/redmine/trunk@23686 e93f8b46-1217-0410-a6f0-8f06a7374b81
-rw-r--r--app/models/custom_field.rb3
-rw-r--r--lib/redmine/field_format.rb21
-rw-r--r--test/functional/custom_fields_controller_test.rb17
-rw-r--r--test/functional/issues_controller_test.rb10
-rw-r--r--test/unit/lib/redmine/field_format/progressbar_format_test.rb37
5 files changed, 83 insertions, 5 deletions
diff --git a/app/models/custom_field.rb b/app/models/custom_field.rb
index ec8c5de8d..ae6d108f4 100644
--- a/app/models/custom_field.rb
+++ b/app/models/custom_field.rb
@@ -101,7 +101,8 @@ class CustomField < ApplicationRecord
'version_status',
'extensions_allowed',
'full_width_layout',
- 'thousands_delimiter'
+ 'thousands_delimiter',
+ 'ratio_interval'
)
def copy_from(arg, options={})
diff --git a/lib/redmine/field_format.rb b/lib/redmine/field_format.rb
index c4fd1b592..2a76f2c46 100644
--- a/lib/redmine/field_format.rb
+++ b/lib/redmine/field_format.rb
@@ -1086,8 +1086,15 @@ module Redmine
class ProgressbarFormat < Numeric
add 'progressbar'
- self.form_partial = nil
+ self.form_partial = 'custom_fields/formats/progressbar'
self.totalable_supported = false
+ field_attributes :ratio_interval
+
+ # Take the default value from Setting.issue_done_ratio_interval.to_i
+ # in order to have a consistent behaviour for default ratio interval.
+ def self.default_ratio_interval
+ Setting.issue_done_ratio_interval.to_i
+ end
def label
"label_progressbar"
@@ -1112,11 +1119,19 @@ module Redmine
order_statement(custom_field)
end
+ def before_custom_field_save(custom_field)
+ super
+
+ if custom_field.ratio_interval.blank?
+ custom_field.ratio_interval = self.class.default_ratio_interval
+ end
+ end
+
def edit_tag(view, tag_id, tag_name, custom_value, options={})
view.select_tag(
tag_name,
view.options_for_select(
- (0..100).step(Setting.issue_done_ratio_interval.to_i).to_a.collect {|r| ["#{r} %", r]},
+ (0..100).step(custom_value.custom_field.ratio_interval.to_i).to_a.collect {|r| ["#{r} %", r]},
custom_value.value
),
options.merge(id: tag_id, style: "width: 75px;")
@@ -1124,7 +1139,7 @@ module Redmine
end
def bulk_edit_tag(view, tag_id, tag_name, custom_field, objects, value, options={})
- opts = view.options_for_select([[l(:label_no_change_option), '']] + (0..100).step(Setting.issue_done_ratio_interval.to_i).to_a.collect {|r| ["#{r} %", r]})
+ opts = view.options_for_select([[l(:label_no_change_option), '']] + (0..100).step(custom_field.ratio_interval.to_i).to_a.collect {|r| ["#{r} %", r]})
view.select_tag(tag_name, opts, options.merge(id: tag_id, style: "width: 75px;")) +
bulk_clear_tag(view, tag_id, tag_name, custom_field, value)
end
diff --git a/test/functional/custom_fields_controller_test.rb b/test/functional/custom_fields_controller_test.rb
index 0706a2eda..fdd2a4148 100644
--- a/test/functional/custom_fields_controller_test.rb
+++ b/test/functional/custom_fields_controller_test.rb
@@ -282,6 +282,23 @@ class CustomFieldsControllerTest < Redmine::ControllerTest
assert_select '[name=?]', 'custom_field[full_width_layout]', 0
end
+ def test_setting_ratio_interval_should_be_present_only_for_progressbar_format
+ get(
+ :new,
+ :params => {
+ :type => 'IssueCustomField',
+ :custom_field => {
+ :field_format => 'progressbar'
+ }
+ }
+ )
+ assert_response :success
+ assert_select '[name=?]', 'custom_field[ratio_interval]' do
+ assert_select 'option[value=?]', '5'
+ assert_select 'option[value=?][selected=?]', '10', 'selected'
+ end
+ end
+
def test_new_js
get(
:new,
diff --git a/test/functional/issues_controller_test.rb b/test/functional/issues_controller_test.rb
index a6aff636f..b5180fcff 100644
--- a/test/functional/issues_controller_test.rb
+++ b/test/functional/issues_controller_test.rb
@@ -5996,6 +5996,16 @@ class IssuesControllerTest < Redmine::ControllerTest
end
end
+ def test_get_edit_with_custom_field_progress_bar
+ cf = IssueCustomField.generate!(:tracker_ids => [1], :is_for_all => true, :field_format => 'progressbar')
+
+ @request.session[:user_id] = 1
+ get(:edit, :params => {:id => 1})
+ assert_response :success
+
+ assert_select "select[id=?]", "issue_custom_field_values_#{cf.id}", 1
+ end
+
def test_get_edit_with_me_assigned_to_id
@request.session[:user_id] = 2
get(
diff --git a/test/unit/lib/redmine/field_format/progressbar_format_test.rb b/test/unit/lib/redmine/field_format/progressbar_format_test.rb
index d507f9ddb..51bd8bc5f 100644
--- a/test/unit/lib/redmine/field_format/progressbar_format_test.rb
+++ b/test/unit/lib/redmine/field_format/progressbar_format_test.rb
@@ -21,7 +21,7 @@ require_relative '../../../../test_helper'
require 'redmine/field_format'
module Redmine::FieldFormat
- class ProgressbarFormatTest < ActiveSupport::TestCase
+ class ProgressbarFormatTest < ActionView::TestCase
def setup
@field = IssueCustomField.new(name: 'ProgressbarTest', field_format: 'progressbar')
@format = Redmine::FieldFormat::ProgressbarFormat.instance
@@ -81,5 +81,40 @@ module Redmine::FieldFormat
options = @format.query_filter_options(@field, nil)
assert_equal :integer, options[:type]
end
+
+ def test_default_ratio_interval_should_be_default_issue_done_ratio_interval
+ @field.save
+ assert_equal 10, @field.ratio_interval
+ end
+
+ def test_ratio_interval
+ @field.update(ratio_interval: 5)
+ assert_equal 5, @field.ratio_interval
+ end
+
+ def test_edit_tag_possible_values_with_ratio_interval
+ [5, 10].each do |ratio_interval|
+ @field.update(ratio_interval: ratio_interval)
+ value = CustomValue.new(custom_field: @field, value: '90')
+
+ tag = @field.format.edit_tag(self, 'id', 'name', value)
+ assert_select_in tag, 'select' do
+ assert_select 'option', 100 / ratio_interval + 1
+ end
+ end
+ end
+
+ def test_bulk_edit_tag_possible_values_with_ratio_interval
+ [5, 10].each do |ratio_interval|
+ @field.update(ratio_interval: ratio_interval)
+ value = CustomValue.new(custom_field: @field, value: '90')
+ objects = [Issue.new, Issue.new]
+
+ tag = @field.format.bulk_edit_tag(self, 'id', 'name', @field, objects, value)
+ assert_select_in tag, 'select' do |select|
+ assert_select select.first, 'option', 100 / ratio_interval + 2
+ end
+ end
+ end
end
end