Feature #26279 » select_encoding4.patch
| app/helpers/application_helper.rb | ||
|---|---|---|
| 1487 | 1487 |
encoding = l(:general_csv_encoding) |
| 1488 | 1488 |
end |
| 1489 | 1489 | |
| 1490 |
def export_csv_encoding_select_tag |
|
| 1491 |
return if l(:general_csv_encoding).casecmp('UTF-8') == 0
|
|
| 1492 |
options = [l(:general_csv_encoding), 'UTF-8'] |
|
| 1493 |
content_tag(:p) do |
|
| 1494 |
concat( |
|
| 1495 |
content_tag(:label) do |
|
| 1496 |
concat l(:label_encoding) |
|
| 1497 |
concat select_tag('encoding', options_for_select(options, l(:general_csv_encoding)))
|
|
| 1498 |
end |
|
| 1499 |
) |
|
| 1500 |
end |
|
| 1501 |
end |
|
| 1502 | ||
| 1490 | 1503 |
private |
| 1491 | 1504 | |
| 1492 | 1505 |
def wiki_helper |
| app/helpers/queries_helper.rb | ||
|---|---|---|
| 275 | 275 |
def query_to_csv(items, query, options={})
|
| 276 | 276 |
columns = query.columns |
| 277 | 277 | |
| 278 |
Redmine::Export::CSV.generate do |csv| |
|
| 278 |
Redmine::Export::CSV.generate(:encoding => params[:encoding]) do |csv|
|
|
| 279 | 279 |
# csv header fields |
| 280 | 280 |
csv << columns.map {|c| c.caption.to_s}
|
| 281 | 281 |
# csv lines |
| ... | ... | |
| 370 | 370 | |
| 371 | 371 |
tags |
| 372 | 372 |
end |
| 373 |
|
|
| 373 | ||
| 374 | 374 |
def query_hidden_sort_tag(query) |
| 375 | 375 |
hidden_field_tag("sort", query.sort_criteria.to_param, :id => nil)
|
| 376 | 376 |
end |
| app/helpers/timelog_helper.rb | ||
|---|---|---|
| 76 | 76 |
end |
| 77 | 77 | |
| 78 | 78 |
def report_to_csv(report) |
| 79 |
Redmine::Export::CSV.generate do |csv| |
|
| 79 |
Redmine::Export::CSV.generate(:encoding => params[:encoding]) do |csv|
|
|
| 80 | 80 |
# Column headers |
| 81 | 81 |
headers = report.criteria.collect {|criteria| l(report.available_criteria[criteria][:label]) }
|
| 82 | 82 |
headers += report.periods |
| app/views/issues/index.html.erb | ||
|---|---|---|
| 38 | 38 |
<label><%= check_box_tag 'c[]', 'description', @query.has_column?(:description) %> <%= l(:field_description) %></label> |
| 39 | 39 |
<label><%= check_box_tag 'c[]', 'last_notes', @query.has_column?(:last_notes) %> <%= l(:label_last_notes) %></label> |
| 40 | 40 |
</p> |
| 41 |
<%= export_csv_encoding_select_tag %> |
|
| 41 | 42 |
<% if @issue_count > Setting.issues_export_limit.to_i %> |
| 42 | 43 |
<p class="icon icon-warning"> |
| 43 | 44 |
<%= l(:setting_issues_export_limit) %>: <%= Setting.issues_export_limit.to_i %> |
| app/views/timelog/index.html.erb | ||
|---|---|---|
| 31 | 31 |
<label><%= radio_button_tag 'c[]', '', true %> <%= l(:description_selected_columns) %></label><br /> |
| 32 | 32 |
<label><%= radio_button_tag 'c[]', 'all_inline' %> <%= l(:description_all_columns) %></label> |
| 33 | 33 |
</p> |
| 34 |
<%= export_csv_encoding_select_tag %> |
|
| 34 | 35 |
<p class="buttons"> |
| 35 | 36 |
<%= submit_tag l(:button_export), :name => nil, :onclick => "hideModal(this);" %> |
| 36 | 37 |
<%= submit_tag l(:button_cancel), :name => nil, :onclick => "hideModal(this);", :type => 'button' %> |
| app/views/timelog/report.html.erb | ||
|---|---|---|
| 1 | 1 |
<div class="contextual"> |
| 2 |
<%= link_to l(:button_log_time),
|
|
| 2 |
<%= link_to l(:button_log_time), |
|
| 3 | 3 |
_new_time_entry_path(@project, @issue), |
| 4 | 4 |
:class => 'icon icon-time-add' if User.current.allowed_to?(:log_time, @project, :global => true) %> |
| 5 | 5 |
</div> |
| ... | ... | |
| 24 | 24 |
:disabled => (@report.criteria.length >= 3), |
| 25 | 25 |
:id => "criterias") %> |
| 26 | 26 |
<%= link_to l(:button_clear), {:params => request.query_parameters.merge(:criteria => nil)}, :class => 'icon icon-reload' %></p>
|
| 27 |
<%= hidden_field_tag 'encoding', l(:general_csv_encoding) unless l(:general_csv_encoding).casecmp('UTF-8') == 0 %>
|
|
| 27 | 28 |
<% end %> |
| 28 | 29 | |
| 29 | 30 |
<% if @query.valid? %> |
| ... | ... | |
| 62 | 63 |
</div> |
| 63 | 64 | |
| 64 | 65 |
<% other_formats_links do |f| %> |
| 65 |
<%= f.link_to_with_query_parameters 'CSV' %> |
|
| 66 |
<%= f.link_to_with_query_parameters 'CSV', {}, :onclick => "showModal('csv-export-options', '330px'); return false;" %>
|
|
| 66 | 67 |
<% end %> |
| 67 | 68 |
<% end %> |
| 69 |
<div id="csv-export-options" style="display: none;"> |
|
| 70 |
<h3 class="title"><%= l(:label_export_options, :export_format => 'CSV') %></h3> |
|
| 71 |
<%= export_csv_encoding_select_tag %> |
|
| 72 |
<p class="buttons"> |
|
| 73 |
<%= submit_tag l(:button_export), :name => nil, :id => 'csv-export-button' %> |
|
| 74 |
<%= submit_tag l(:button_cancel), :name => nil, :onclick => 'hideModal(this);', :type => 'button' %> |
|
| 75 |
</p> |
|
| 76 |
</div> |
|
| 68 | 77 |
<% end %> |
| 69 | 78 |
<% end %> |
| 70 | 79 | |
| ... | ... | |
| 74 | 83 | |
| 75 | 84 |
<% html_title(@query.new_record? ? l(:label_spent_time) : @query.name, l(:label_report)) %> |
| 76 | 85 | |
| 86 | ||
| 87 |
<%= javascript_tag do %> |
|
| 88 |
$(document).ready(function(){
|
|
| 89 |
$('input#csv-export-button').click(function(){
|
|
| 90 |
$('form input#encoding').val($('select#encoding option:selected').val());
|
|
| 91 |
$('form#query_form').attr('action', '<%= report_time_entries_path(:format => 'csv') %>').submit();
|
|
| 92 |
$('form#query_form').attr('action', '<%= report_time_entries_path %>');
|
|
| 93 |
hideModal(this); |
|
| 94 |
}); |
|
| 95 |
}); |
|
| 96 |
<% end %> |
|
| lib/redmine/export/csv.rb | ||
|---|---|---|
| 31 | 31 | |
| 32 | 32 |
class << self |
| 33 | 33 | |
| 34 |
def generate(&block) |
|
| 34 |
def generate(options = {}, &block)
|
|
| 35 | 35 |
col_sep = l(:general_csv_separator) |
| 36 |
encoding = l(:general_csv_encoding)
|
|
| 36 |
encoding = Encoding.find(options[:encoding]) rescue Encoding.find(l(:general_csv_encoding))
|
|
| 37 | 37 | |
| 38 | 38 |
str = ''.force_encoding(encoding) |
| 39 |
if encoding == 'UTF-8'
|
|
| 39 |
if encoding == Encoding::UTF_8
|
|
| 40 | 40 |
# BOM |
| 41 | 41 |
str = "\xEF\xBB\xBF".force_encoding(encoding) |
| 42 | 42 |
end |
| test/helpers/application_helper_test.rb | ||
|---|---|---|
| 1568 | 1568 |
assert_equal '<span class="hours hours-int">0</span><span class="hours hours-dec">:45</span>', html_hours('0:45')
|
| 1569 | 1569 |
assert_equal '<span class="hours hours-int">0</span><span class="hours hours-dec">.75</span>', html_hours('0.75')
|
| 1570 | 1570 |
end |
| 1571 | ||
| 1572 |
def test_export_csv_encoding_select_tag_should_return_nil_when_general_csv_encoding_is_UTF8 |
|
| 1573 |
with_locale 'az' do |
|
| 1574 |
assert_equal l(:general_csv_encoding), 'UTF-8' |
|
| 1575 |
assert_nil export_csv_encoding_select_tag |
|
| 1576 |
end |
|
| 1577 |
end |
|
| 1578 | ||
| 1579 |
def test_export_csv_encoding_select_tag_should_have_two_option_when_general_csv_encoding_is_not_UTF8 |
|
| 1580 |
with_locale 'en' do |
|
| 1581 |
assert_not_equal l(:general_csv_encoding), 'UTF-8' |
|
| 1582 |
result = export_csv_encoding_select_tag |
|
| 1583 |
assert_select_in result, "option[selected='selected'][value=#{l(:general_csv_encoding)}]", :text => l(:general_csv_encoding)
|
|
| 1584 |
assert_select_in result, "option[value='UTF-8']", :text => 'UTF-8' |
|
| 1585 |
end |
|
| 1586 |
end |
|
| 1571 | 1587 |
end |
| test/unit/lib/redmine/export/csv_test.rb | ||
|---|---|---|
| 18 | 18 |
require File.expand_path('../../../../../test_helper', __FILE__)
|
| 19 | 19 | |
| 20 | 20 |
class CsvTest < ActiveSupport::TestCase |
| 21 | ||
| 21 |
include Redmine::I18n |
|
| 22 | 22 |
BOM = "\xEF\xBB\xBF".force_encoding('UTF-8')
|
| 23 | 23 | |
| 24 | 24 |
def test_should_include_bom_when_utf8_encoded |
| ... | ... | |
| 28 | 28 |
assert string.starts_with?(BOM) |
| 29 | 29 |
end |
| 30 | 30 |
end |
| 31 | ||
| 32 |
def test_generate_should_return_strings_encoded_with_general_csv_encoding |
|
| 33 |
with_locale 'en' do |
|
| 34 |
string = Redmine::Export::CSV.generate({encoding: 'dummy-encoding'}) {|csv| csv << %w(Foo Bar)}
|
|
| 35 |
assert_equal l(:general_csv_encoding), string.encoding.name |
|
| 36 |
end |
|
| 37 |
end |
|
| 38 | ||
| 39 |
def test_generate_should_return_strings_encoded_with_encoding_option_if_encoding_option_exists |
|
| 40 |
with_locale 'en' do |
|
| 41 |
string = Redmine::Export::CSV.generate({encoding: 'UTF-8'}) {|csv| csv << %w(Foo Bar)}
|
|
| 42 |
assert_equal 'UTF-8', string.encoding.name |
|
| 43 |
assert_not_equal l(:general_csv_encoding), string.encoding.name |
|
| 44 |
end |
|
| 45 |
end |
|
| 31 | 46 |
end |