Feature #22024 » 22024-v3.patch
| app/helpers/application_helper.rb | ||
|---|---|---|
| 266 | 266 |
when Integer |
| 267 | 267 |
object.to_s |
| 268 | 268 |
when Float |
| 269 |
sprintf "%.2f", object
|
|
| 269 |
number_with_delimiter(sprintf('%.2f', object), delimiter: nil)
|
|
| 270 | 270 |
when User, Group |
| 271 | 271 |
html ? link_to_principal(object) : object.to_s |
| 272 | 272 |
when Project |
| ... | ... | |
| 684 | 684 | |
| 685 | 685 |
def html_hours(text) |
| 686 | 686 |
text.gsub( |
| 687 |
%r{(\d+)([\.:])(\d+)},
|
|
| 687 |
%r{(\d+)([\.,:])(\d+)},
|
|
| 688 | 688 |
'<span class="hours hours-int">\1</span><span class="hours hours-dec">\2\3</span>' |
| 689 | 689 |
).html_safe |
| 690 | 690 |
end |
| lib/redmine/export/pdf/issues_pdf_helper.rb | ||
|---|---|---|
| 21 | 21 |
module Export |
| 22 | 22 |
module PDF |
| 23 | 23 |
module IssuesPdfHelper |
| 24 |
include ActionView::Helpers::NumberHelper |
|
| 25 | ||
| 24 | 26 |
# Returns a PDF string of a single issue |
| 25 | 27 |
def issue_to_pdf(issue, assoc={})
|
| 26 | 28 |
pdf = ITCPDF.new(current_language) |
| ... | ... | |
| 406 | 408 |
elsif value.is_a?(Time) |
| 407 | 409 |
format_time(value) |
| 408 | 410 |
elsif value.is_a?(Float) |
| 409 |
sprintf "%.2f", value
|
|
| 411 |
number_with_delimiter(sprintf('%.2f', value), delimiter: nil)
|
|
| 410 | 412 |
else |
| 411 | 413 |
value |
| 412 | 414 |
end |
| lib/redmine/field_format.rb | ||
|---|---|---|
| 539 | 539 |
end |
| 540 | 540 | |
| 541 | 541 |
def validate_single_value(custom_field, value, customized=nil) |
| 542 |
value = normalize_float(value) |
|
| 542 | 543 |
errs = super |
| 543 |
errs << ::I18n.t('activerecord.errors.messages.invalid') unless (Kernel.Float(value) rescue nil)
|
|
| 544 |
errs << ::I18n.t('activerecord.errors.messages.invalid') unless Kernel.Float(value, exception: false)
|
|
| 544 | 545 |
errs |
| 545 | 546 |
end |
| 546 | 547 | |
| lib/redmine/i18n.rb | ||
|---|---|---|
| 21 | 21 | |
| 22 | 22 |
module Redmine |
| 23 | 23 |
module I18n |
| 24 |
include ActionView::Helpers::NumberHelper |
|
| 25 | ||
| 24 | 26 |
def self.included(base) |
| 25 | 27 |
base.extend Redmine::I18n |
| 26 | 28 |
end |
| ... | ... | |
| 95 | 97 |
m = ((hours - h) * 60).round |
| 96 | 98 |
"%d:%02d" % [h, m] |
| 97 | 99 |
else |
| 98 |
"%.2f" % hours.to_f
|
|
| 100 |
number_with_delimiter(sprintf('%.2f', hours.to_f), delimiter: nil)
|
|
| 99 | 101 |
end |
| 100 | 102 |
end |
| 101 | 103 | |
| 104 |
# Will consider language specific separator in user input |
|
| 105 |
# and normalize them to a unified format to be accepted by Kernel.Float(). |
|
| 106 |
# |
|
| 107 |
# @param value [String] A string represenation of a float value. |
|
| 108 |
# |
|
| 109 |
# @note The delimiter cannot be used here if it is a decimal point since it |
|
| 110 |
# will clash with the dot separator. |
|
| 111 |
def normalize_float(value) |
|
| 112 |
separator = ::I18n.t('number.format.separator')
|
|
| 113 |
value.gsub(/[#{separator}]/, separator => '.')
|
|
| 114 |
end |
|
| 115 | ||
| 102 | 116 |
def day_name(day) |
| 103 | 117 |
::I18n.t('date.day_names')[day % 7]
|
| 104 | 118 |
end |
| test/helpers/application_helper_test.rb | ||
|---|---|---|
| 2171 | 2171 |
end |
| 2172 | 2172 |
end |
| 2173 | 2173 | |
| 2174 |
def test_format_hours_should_use_locale_decimal_separator |
|
| 2175 |
to_test = {'en' => '0.75', 'de' => '0,75'}
|
|
| 2176 |
with_settings :timespan_format => 'decimal' do |
|
| 2177 |
to_test.each do |locale, expected| |
|
| 2178 |
with_locale locale do |
|
| 2179 |
assert_equal expected, format_hours(0.75) |
|
| 2180 |
end |
|
| 2181 |
end |
|
| 2182 |
end |
|
| 2183 |
end |
|
| 2184 | ||
| 2174 | 2185 |
def test_html_hours |
| 2175 | 2186 |
assert_equal '<span class="hours hours-int">0</span><span class="hours hours-dec">:45</span>', |
| 2176 | 2187 |
html_hours('0:45')
|
| test/unit/lib/redmine/export/pdf/issues_pdf_test.rb | ||
|---|---|---|
| 33 | 33 |
time_entry = TimeEntry.create!(:spent_on => Date.today, :hours => 4.3432, :user => user, :author => user, |
| 34 | 34 |
:project_id => 1, :issue => issue, :activity => TimeEntryActivity.first) |
| 35 | 35 | |
| 36 |
results = fetch_row_values(issue, query, 0) |
|
| 37 |
assert_equal ["2", "Add ingredients categories", "4.34"], results |
|
| 36 |
to_test = {'en' => '4.34', 'de' => '4,34'}
|
|
| 37 |
to_test.each do |locale, expected| |
|
| 38 |
with_locale locale do |
|
| 39 |
results = fetch_row_values(issue, query, 0) |
|
| 40 |
assert_equal ['2', 'Add ingredients categories', expected], results |
|
| 41 |
end |
|
| 42 |
end |
|
| 38 | 43 |
end |
| 39 | 44 | |
| 40 | 45 |
def test_fetch_row_values_should_be_able_to_handle_parent_issue_subject |
| test/unit/lib/redmine/field_format/numeric_format_test.rb | ||
|---|---|---|
| 23 | 23 |
class Redmine::NumericFieldFormatTest < ActionView::TestCase |
| 24 | 24 |
include ApplicationHelper |
| 25 | 25 | |
| 26 |
fixtures :projects, :users, :issue_statuses, :enumerations, |
|
| 27 |
:trackers, :projects_trackers, :roles, :member_roles, |
|
| 28 |
:members, :enabled_modules |
|
| 29 | ||
| 26 | 30 |
def setup |
| 27 | 31 |
User.current = nil |
| 28 | 32 |
end |
| ... | ... | |
| 34 | 38 |
assert_equal 3, field.format.formatted_custom_value(self, custom_value, false) |
| 35 | 39 |
assert_equal '<a href="http://foo/3" class="external">3</a>', field.format.formatted_custom_value(self, custom_value, true) |
| 36 | 40 |
end |
| 41 | ||
| 42 |
def test_float_field_value_should_validate_when_given_with_various_separator |
|
| 43 |
field = IssueCustomField.generate!(field_format: 'float') |
|
| 44 |
issue = Issue.generate!(tracker: Tracker.find(1), status: IssueStatus.find(1), priority: IssuePriority.find(6)) |
|
| 45 |
to_test = {'en' => '3.33', 'de' => '3,33'}
|
|
| 46 |
to_test.each do |locale, expected| |
|
| 47 |
with_locale locale do |
|
| 48 |
assert field.format.validate_single_value(field, expected, issue) |
|
| 49 |
end |
|
| 50 |
end |
|
| 51 |
end |
|
| 52 | ||
| 53 |
def test_float_field_should_format_with_various_locale_separator |
|
| 54 |
field = IssueCustomField.generate!(field_format: 'float') |
|
| 55 |
issue = Issue.generate!(tracker: Tracker.find(1), status: IssueStatus.find(1), priority: IssuePriority.find(6)) |
|
| 56 |
issue.custom_field_values = { field.id => '1234.56' }
|
|
| 57 |
issue.save! |
|
| 58 |
to_test = {'en' => '1234.56', 'de' => '1234,56'}
|
|
| 59 |
to_test.each do |locale, expected| |
|
| 60 |
with_locale locale do |
|
| 61 |
assert_equal expected, format_object(issue.reload.custom_field_values.last, false) |
|
| 62 |
end |
|
| 63 |
end |
|
| 64 |
end |
|
| 37 | 65 |
end |
- « Previous
- 1
- 2
- 3
- Next »