Compare commits

...
23 Commits
Author SHA1 Message Date
Jean-Philippe Lang 7a0e3f40a7 tagged version 2.3.1
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/tags/2.3.1@11759 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-05-01 15:15:05 +00:00
Jean-Philippe Lang 1a71316b37 Merged r11757 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.3-stable@11758 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-05-01 15:14:28 +00:00
Jean-Philippe Lang 5fa087a792 Merged r11592 from trunk.
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.3-stable@11756 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-05-01 15:12:24 +00:00
Jean-Philippe Lang 425a0fe988 Merged r11754 from trunk (#12684).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.3-stable@11755 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-05-01 13:14:21 +00:00
Jean-Philippe Lang 606762dcad Merged r11750 from trunk (#12650).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.3-stable@11751 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-05-01 12:53:10 +00:00
Jean-Philippe Lang 07dc1e34ff Merged r11748 from trunk (#13712).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.3-stable@11749 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-05-01 12:36:48 +00:00
Jean-Philippe Lang 1afe67bf74 Merged r11698 from trunk (#13541).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.3-stable@11747 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-05-01 12:17:31 +00:00
Jean-Philippe Lang f9f4591cff Merged r11680 from trunk (#13541).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.3-stable@11746 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-05-01 12:16:56 +00:00
Jean-Philippe Lang aa4fc1b58a Merged r11696 from trunk (#13618).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.3-stable@11745 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-05-01 12:15:49 +00:00
Toshi MARUYAMA 8c17237638 Merged r11737 and r11738 from trunk to 2.3-stable (#13823)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.3-stable@11739 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-04-21 09:00:27 +00:00
Toshi MARUYAMA 06ab582e5d Merged r11728, r11729, r11730, r11731, r11732 and r11733 from trunk to 2.3-stable (#13811)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.3-stable@11734 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-04-20 11:26:12 +00:00
Toshi MARUYAMA af66c42d9e 2.3-stable: svn propset svn:eol-style native test fixtures (#13644)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.3-stable@11710 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-04-05 09:59:21 +00:00
Toshi MARUYAMA 655c50849d Merged r11706 and r11707 from trunk to 2.3-stable (#13644)
fix diff error in case of line_left out of range.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.3-stable@11709 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-04-05 09:56:14 +00:00
Toshi MARUYAMA bd5b7428d8 Merged r11700 from trunk to 2.3-stable (#13678, #13674)
Lithuanian translation for 2.3-stable updated by Vasaris Vėjas.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.3-stable@11703 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-04-04 12:52:40 +00:00
Toshi MARUYAMA 4ed30a4495 Merged r11699 from trunk to 2.3-stable (#13678)
remove duplicate "text_repository_usernames_mapping" from Lithuanian translation.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.3-stable@11702 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-04-04 12:52:29 +00:00
Jean-Philippe Lang ca39b05420 Merged r11692 from trunk (#13586).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.3-stable@11697 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-04-03 17:04:40 +00:00
Etienne Massip e189641e8c Merged r11693 from trunk (#13630).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.3-stable@11695 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-04-02 17:50:39 +00:00
Toshi MARUYAMA 102dd4c11b 2.3-stable: svn:eol-style native jquery.ui.datepicker-pt.js (#13584)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.3-stable@11691 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-03-25 14:56:22 +00:00
Toshi MARUYAMA c1d853d957 Merged r11686 from trunk to 2.3-stable (#13584)
add missing Portuguese jQuery UI date picker.

jquery.ui.datepicker-pt.js is from
https://raw.github.com/jquery/jquery-ui/49f9b849b9c5023f13/ui/i18n/jquery.ui.datepicker-pt.js

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.3-stable@11690 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-03-25 14:51:06 +00:00
Toshi MARUYAMA 225f99377a Merged r11682 and r11685 from trunk to 2.3-stable (#13579)
fix that datepicker uses Simplified Chinese in Traditional Chinese locale.

Contributed by Chage Juan.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.3-stable@11689 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-03-25 14:50:55 +00:00
Toshi MARUYAMA d8cf4c57d3 Merged r11675 from trunk to 2.3-stable (#13552, #13551)
Dutch translations for 2.3-stable updated by Pieter Nicolai.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.3-stable@11679 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-03-22 01:04:33 +00:00
Toshi MARUYAMA 4b5fa08f66 Merged r11671, r11672 and r11674 from trunk to 2.3-stable (#13405)
Fixed commit link title escaping.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.3-stable@11678 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-03-22 01:04:22 +00:00
Toshi MARUYAMA 4380c0af73 Merged r11664 from trunk to 2.3-stable (#13531 ,#13528)
Traditional Chinese translation for 2.3-stable updated by ChunChang Lo.

git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.3-stable@11669 e93f8b46-1217-0410-a6f0-8f06a7374b81
2013-03-20 07:01:37 +00:00
28 changed files with 386 additions and 114 deletions
+6 -2
View File
@@ -471,7 +471,11 @@ module ApplicationHelper
end end
def accesskey(s) def accesskey(s)
Redmine::AccessKeys.key_for s @used_accesskeys ||= []
key = Redmine::AccessKeys.key_for(s)
return nil if @used_accesskeys.include?(key)
@used_accesskeys << key
key
end end
# Formats text according to system settings. # Formats text according to system settings.
@@ -758,7 +762,7 @@ module ApplicationHelper
if repository && (changeset = Changeset.visible.where("repository_id = ? AND scmid LIKE ?", repository.id, "#{name}%").first) if repository && (changeset = Changeset.visible.where("repository_id = ? AND scmid LIKE ?", repository.id, "#{name}%").first)
link = link_to h("#{project_prefix}#{repo_prefix}#{name}"), {:only_path => only_path, :controller => 'repositories', :action => 'revision', :id => project, :repository_id => repository.identifier_param, :rev => changeset.identifier}, link = link_to h("#{project_prefix}#{repo_prefix}#{name}"), {:only_path => only_path, :controller => 'repositories', :action => 'revision', :id => project, :repository_id => repository.identifier_param, :rev => changeset.identifier},
:class => 'changeset', :class => 'changeset',
:title => truncate_single_line(h(changeset.comments), :length => 100) :title => truncate_single_line(changeset.comments, :length => 100)
end end
else else
if repository && User.current.allowed_to?(:browse_repository, project) if repository && User.current.allowed_to?(:browse_repository, project)
+24
View File
@@ -29,6 +29,30 @@ module QueriesHelper
end end
end end
def query_filters_hidden_tags(query)
tags = ''.html_safe
query.filters.each do |field, options|
tags << hidden_field_tag("f[]", field, :id => nil)
tags << hidden_field_tag("op[#{field}]", options[:operator], :id => nil)
options[:values].each do |value|
tags << hidden_field_tag("v[#{field}][]", value, :id => nil)
end
end
tags
end
def query_columns_hidden_tags(query)
tags = ''.html_safe
query.columns.each do |column|
tags << hidden_field_tag("c[]", column.name, :id => nil)
end
tags
end
def query_hidden_tags(query)
query_filters_hidden_tags(query) + query_columns_hidden_tags(query)
end
def available_block_columns_tags(query) def available_block_columns_tags(query)
tags = ''.html_safe tags = ''.html_safe
query.available_block_columns.each do |column| query.available_block_columns.each do |column|
+6 -2
View File
@@ -859,10 +859,14 @@ class Issue < ActiveRecord::Base
dependencies = [] dependencies = []
dependencies += relations_from.map(&:issue_to) dependencies += relations_from.map(&:issue_to)
dependencies += children unless leaf? dependencies += children unless leaf?
dependencies << parent
dependencies.compact! dependencies.compact!
dependencies -= except dependencies -= except
dependencies + dependencies.map {|issue| issue.all_dependent_issues(except)}.flatten dependencies += dependencies.map {|issue| issue.all_dependent_issues(except)}.flatten
if parent
dependencies << parent
dependencies += parent.all_dependent_issues(except + parent.descendants)
end
dependencies
end end
# Returns an array of issues that duplicate this one # Returns an array of issues that duplicate this one
+2 -1
View File
@@ -27,7 +27,8 @@
<div id="csv-export-options" style="display:none;"> <div id="csv-export-options" style="display:none;">
<h3 class="title"><%= l(:label_export_options, :export_format => 'CSV') %></h3> <h3 class="title"><%= l(:label_export_options, :export_format => 'CSV') %></h3>
<%= form_tag(params.merge({:format => 'csv',:page=>nil}), :method => :get, :id => 'csv-export-form') do %> <%= form_tag(params.slice(:project_id, :issue_id).merge(:format => 'csv', :page=>nil), :method => :get, :id => 'csv-export-form') do %>
<%= query_hidden_tags @query %>
<p> <p>
<label><%= radio_button_tag 'columns', '', true %> <%= l(:description_selected_columns) %></label><br /> <label><%= radio_button_tag 'columns', '', true %> <%= l(:description_selected_columns) %></label><br />
<label><%= radio_button_tag 'columns', 'all' %> <%= l(:description_all_columns) %></label> <label><%= radio_button_tag 'columns', 'all' %> <%= l(:description_all_columns) %></label>
+32 -31
View File
@@ -1,8 +1,10 @@
# Lithuanian translations for Ruby on Rails # Lithuanian translations for Ruby on Rails
# by Laurynas Butkus (laurynas.butkus@gmail.com) # by Laurynas Butkus (laurynas.butkus@gmail.com)
# Redmine translation by Gediminas Muižis gediminas.muizis@gmail.com # Redmine translation by Gediminas Muižis gediminas.muizis@gmail.com
# and Sergej Jegorov sergej.jegorov@gmail.com # and Sergej Jegorov sergej.jegorov@gmail.com
# and Gytis Gurklys gytis.gurklys@gmail.com # and Gytis Gurklys gytis.gurklys@gmail.com
# and Andrius Kriučkovas andrius.kriuckovas@gmail.com
lt: lt:
direction: ltr direction: ltr
date: date:
@@ -228,8 +230,8 @@ lt:
notice_default_data_loaded: Numatytoji konfiguracija sėkmingai užkrauta. notice_default_data_loaded: Numatytoji konfiguracija sėkmingai užkrauta.
notice_unable_delete_version: Neįmanoma panaikinti versiją. notice_unable_delete_version: Neįmanoma panaikinti versiją.
notice_unable_delete_time_entry: Neįmano ištrinti laiko žurnalo įrašą. notice_unable_delete_time_entry: Neįmano ištrinti laiko žurnalo įrašą.
notice_issue_done_ratios_updated: Issue done ratios updated. notice_issue_done_ratios_updated: Problemos baigtumo rodikliai atnaujinti.
notice_gantt_chart_truncated: The chart was truncated because it exceeds the maximum number of items that can be displayed (%{max}) notice_gantt_chart_truncated: Grafikas buvo sutrumpintas, kadangi jis viršija maksimalų (%{max}) leistinų atvaizduoti elementų kiekį
notice_issue_successful_create: Darbas %{id} sukurtas. notice_issue_successful_create: Darbas %{id} sukurtas.
error_can_t_load_default_data: "Numatytoji konfiguracija negali būti užkrauta: %{value}" error_can_t_load_default_data: "Numatytoji konfiguracija negali būti užkrauta: %{value}"
@@ -241,15 +243,16 @@ lt:
error_no_tracker_in_project: 'Joks pėdsekys nesusietas su šiuo projektu. Prašom patikrinti Projekto nustatymus.' error_no_tracker_in_project: 'Joks pėdsekys nesusietas su šiuo projektu. Prašom patikrinti Projekto nustatymus.'
error_no_default_issue_status: Nenustatyta numatytoji darbų būsena. Prašome patikrinti konfigūravimą ("Administravimas -> Darbų būsenos"). error_no_default_issue_status: Nenustatyta numatytoji darbų būsena. Prašome patikrinti konfigūravimą ("Administravimas -> Darbų būsenos").
error_can_not_delete_custom_field: Negalima ištrinti kliento lauko error_can_not_delete_custom_field: Negalima ištrinti kliento lauko
error_can_not_delete_tracker: "This tracker contains issues and cannot be deleted." error_can_not_delete_tracker: "Šis pėdsekys turi įrašus ir todėl negali būti ištrintas."
error_can_not_remove_role: "This role is in use and cannot be deleted." error_can_not_remove_role: "Ši rolė yra naudojama ir negali būti ištrinta."
error_can_not_reopen_issue_on_closed_version: Uždarytai versijai priskirtas darbas negali būti atnaujintas. error_can_not_reopen_issue_on_closed_version: Uždarytai versijai priskirtas darbas negali būti atnaujintas.
error_can_not_archive_project: Šio projekto negalima suarchyvuoti error_can_not_archive_project: Šio projekto negalima suarchyvuoti
error_issue_done_ratios_not_updated: "Issue done ratios not updated." error_issue_done_ratios_not_updated: "Įrašo baigtumo rodikliai nebuvo atnaujinti. "
error_workflow_copy_source: 'Please select a source tracker or role' error_workflow_copy_source: 'Prašome pasirinkti pirminį šaltinio seklį arba rolę'
error_workflow_copy_target: 'Please select target tracker(s) and role(s)' error_workflow_copy_target: 'Prašome pasirinkti galutinį paskirties seklį(-ius) arba rolę(-s)'
error_unable_delete_issue_status: 'Negalima ištrinti darbo statuso' error_unable_delete_issue_status: 'Negalima ištrinti darbo statuso'
error_unable_to_connect: Negalima prisijungti (%{value}) error_unable_to_connect: Negalima prisijungti (%{value})
error_attachment_too_big: "Ši byla negali būti įkelta, nes viršija maksimalią (%{max_size}) leistiną bylos apimtį"
error_attachment_too_big: "This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size})" error_attachment_too_big: "This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size})"
warning_attachments_not_saved: "%{count} byla(ų) negali būti išsaugota." warning_attachments_not_saved: "%{count} byla(ų) negali būti išsaugota."
@@ -431,7 +434,7 @@ lt:
setting_cache_formatted_text: Paslėpti formatuotą tekstą setting_cache_formatted_text: Paslėpti formatuotą tekstą
setting_default_notification_option: Numatytosios pranešimų nuostatos setting_default_notification_option: Numatytosios pranešimų nuostatos
setting_commit_logtime_enabled: Įjungti laiko registravimą setting_commit_logtime_enabled: Įjungti laiko registravimą
setting_commit_logtime_activity_id: Activity for logged time setting_commit_logtime_activity_id: Laiko įrašų veikla
setting_gantt_items_limit: Maksimalus rodmenų skaičius rodomas Gantt'o grafike setting_gantt_items_limit: Maksimalus rodmenų skaičius rodomas Gantt'o grafike
setting_issue_group_assignment: Leisti darbo priskirimą grupėms setting_issue_group_assignment: Leisti darbo priskirimą grupėms
setting_default_issue_start_date_to_creation_date: Naudoti dabartinę datą kaip naujų darbų pradžios datą setting_default_issue_start_date_to_creation_date: Naudoti dabartinę datą kaip naujų darbų pradžios datą
@@ -877,8 +880,8 @@ lt:
label_issues_visibility_public: Visi vieši darbai label_issues_visibility_public: Visi vieši darbai
label_issues_visibility_own: Darbai, sukurti vartotojo arba jam priskirti label_issues_visibility_own: Darbai, sukurti vartotojo arba jam priskirti
label_git_report_last_commit: Nurodyti paskutinį failų ir katalogų pakeitimą label_git_report_last_commit: Nurodyti paskutinį failų ir katalogų pakeitimą
label_parent_revision: Parent label_parent_revision: Pirminė revizija
label_child_revision: Child label_child_revision: Sekanti revizija
label_export_options: "%{export_format} eksportavimo nustatymai" label_export_options: "%{export_format} eksportavimo nustatymai"
button_login: Registruotis button_login: Registruotis
@@ -991,20 +994,19 @@ lt:
text_enumeration_destroy_question: "%{count} objektai(ų) priskirti šiai reikšmei." text_enumeration_destroy_question: "%{count} objektai(ų) priskirti šiai reikšmei."
text_enumeration_category_reassign_to: 'Priskirti juos šiai reikšmei:' text_enumeration_category_reassign_to: 'Priskirti juos šiai reikšmei:'
text_email_delivery_not_configured: "El.pašto siuntimas nesukonfigūruotas, ir perspėjimai neaktyvus.\nSukonfigūruokite savo SMTP serverį byloje config/configuration.yml ir perleiskite programą norėdami pritaikyti pakeitimus." text_email_delivery_not_configured: "El.pašto siuntimas nesukonfigūruotas, ir perspėjimai neaktyvus.\nSukonfigūruokite savo SMTP serverį byloje config/configuration.yml ir perleiskite programą norėdami pritaikyti pakeitimus."
text_repository_usernames_mapping: "Select or update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped."
text_repository_usernames_mapping: "Parinkite ar atnaujinkite Redmine vartotoją, kuris paminėtas saugyklos log'e.\nVartotojai, turintys tą patį Redmine ir saugyklos vardą ar el.paštą yra automatiškai surišti." text_repository_usernames_mapping: "Parinkite ar atnaujinkite Redmine vartotoją, kuris paminėtas saugyklos log'e.\nVartotojai, turintys tą patį Redmine ir saugyklos vardą ar el.paštą yra automatiškai surišti."
text_diff_truncated: "... Šis diff'as nukarpytas, nes jis viršijo maksimalų rodomų eilučių skaičių." text_diff_truncated: "... Šis diff'as nukarpytas, nes jis viršijo maksimalų rodomų eilučių skaičių."
text_custom_field_possible_values_info: 'Po vieną eilutę kiekvienai reikšmei' text_custom_field_possible_values_info: 'Po vieną eilutę kiekvienai reikšmei'
text_wiki_page_destroy_question: "This page has %{descendants} child page(s) and descendant(s). What do you want to do?" text_wiki_page_destroy_question: "Šis puslapis turi %{descendants} susijusių arba išvestinių puslapių. Ką norėtumėte daryti?"
text_wiki_page_nullify_children: Laikyti child puslapius kaip pagrindinius puslapius text_wiki_page_nullify_children: Laikyti child puslapius kaip pagrindinius puslapius
text_wiki_page_destroy_children: "Pašalinti child puslapius ir jų palikuonis" text_wiki_page_destroy_children: "Pašalinti child puslapius ir jų palikuonis"
text_wiki_page_reassign_children: "Priskirkite iš naujo 'child' puslapius šiam pagrindiniam puslapiui" text_wiki_page_reassign_children: "Priskirkite iš naujo 'child' puslapius šiam pagrindiniam puslapiui"
text_own_membership_delete_confirmation: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?" text_own_membership_delete_confirmation: "Jūs esate pasiruošęs panaikinti dalį arba visus leidimus ir po šio pakeitimo galite prarasti šio projekto redagavimo galimybę. \n Ar jūs esate įsitikinęs ir tęsti?"
text_zoom_in: Priartinti text_zoom_in: Priartinti
text_zoom_out: Nutolinti text_zoom_out: Nutolinti
text_warn_on_leaving_unsaved: "Dabartinis puslapis turi neišsaugoto teksto, kuris bus prarastas, jeigu paliksite šį puslapį." text_warn_on_leaving_unsaved: "Dabartinis puslapis turi neišsaugoto teksto, kuris bus prarastas, jeigu paliksite šį puslapį."
text_scm_path_encoding_note: "Numatytasis: UTF-8" text_scm_path_encoding_note: "Numatytasis: UTF-8"
text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo) text_git_repository_note: Saugykla (repository) yra plika ir vietinė (pvz. /gitrepo, c:\gitrepo)
text_mercurial_repository_note: Vietinė saugykla (e.g. /hgrepo, c:\hgrepo) text_mercurial_repository_note: Vietinė saugykla (e.g. /hgrepo, c:\hgrepo)
text_scm_command: Komanda text_scm_command: Komanda
text_scm_command_version: Versija text_scm_command_version: Versija
@@ -1069,7 +1071,7 @@ lt:
label_completed_versions: Užbaigtos versijos label_completed_versions: Užbaigtos versijos
text_project_identifier_info: Leidžiamos tik mažosios raidės (a-z), skaitmenys, brūkšneliai ir pabraukimo simboliai.<br />Kartą išsaugojus pakeitimai negalimi text_project_identifier_info: Leidžiamos tik mažosios raidės (a-z), skaitmenys, brūkšneliai ir pabraukimo simboliai.<br />Kartą išsaugojus pakeitimai negalimi
field_multiple: Keletas reikšmių field_multiple: Keletas reikšmių
setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed setting_commit_cross_project_ref: Leisti visų kitų projektų įrašus susieti nuorodomis ir sutaisyti
text_issue_conflict_resolution_add_notes: Išsaugoti mano žinutę ir atmesti likusius mano pataisymus text_issue_conflict_resolution_add_notes: Išsaugoti mano žinutę ir atmesti likusius mano pataisymus
text_issue_conflict_resolution_overwrite: Išsaugoti mano pakeitimus (ankstesnių pakeitimų žinutės bus išsaugotos, tačiau kai kurie pakeitimai bus perrašyti) text_issue_conflict_resolution_overwrite: Išsaugoti mano pakeitimus (ankstesnių pakeitimų žinutės bus išsaugotos, tačiau kai kurie pakeitimai bus perrašyti)
notice_issue_update_conflict: Darbas buvo pakoreguotas kito vartotojo kol jūs atlikote pakeitimus. notice_issue_update_conflict: Darbas buvo pakoreguotas kito vartotojo kol jūs atlikote pakeitimus.
@@ -1131,18 +1133,17 @@ lt:
setting_non_working_week_days: Nedarbo dienos setting_non_working_week_days: Nedarbo dienos
label_in_the_next_days: per ateinančias label_in_the_next_days: per ateinančias
label_in_the_past_days: per paskutines label_in_the_past_days: per paskutines
label_attribute_of_user: User's %{name} label_attribute_of_user: Vartotojo %{name}
text_turning_multiple_off: If you disable multiple values, multiple values will be text_turning_multiple_off: Jei jūs išjungsite kelių reikšmių pasirinkimą, visos išvardintos reikšmės bus pašalintos ir palikta tik viena reikšmė kiekvienam laukui.
removed in order to preserve only one value per item. label_attribute_of_issue: Įrašai %{name}
label_attribute_of_issue: Issue's %{name} permission_add_documents: Pridėti dokumentus
permission_add_documents: Add documents permission_edit_documents: Redaguoti dokumentus
permission_edit_documents: Edit documents permission_delete_documents: Trinti dokumentus
permission_delete_documents: Delete documents label_gantt_progress_line: Progreso linija
label_gantt_progress_line: Progress line setting_jsonp_enabled: Įgalinti JSONP palaikymą
setting_jsonp_enabled: Enable JSONP support field_inherit_members: Paveldėti narius
field_inherit_members: Inherit members field_closed_on: Uždarytas
field_closed_on: Closed setting_default_projects_tracker_ids: Sekliai pagal nutylėjimą naujiems projektams
setting_default_projects_tracker_ids: Default trackers for new projects
label_total_time: Iš viso label_total_time: Iš viso
text_scm_config: You can configure your SCM commands in config/configuration.yml. Please restart the application after editing it. text_scm_config: Jūs galite pakeisti SCM komandas byloje config/configuration.yml. Prašome perkrauti programą po redagavimo, idant įgalinti pakeitimus.
text_scm_command_not_available: SCM command is not available. Please check settings on the administration panel. text_scm_command_not_available: SCM komanda nepasiekiama. Patikrinkite administravimo skydelio nustatymus.
+25 -26
View File
@@ -343,9 +343,9 @@ nl:
one: 1 open one: 1 open
other: "%{count} open" other: "%{count} open"
label_x_closed_issues_abbr: label_x_closed_issues_abbr:
zero: 0 closed zero: 0 gesloten
one: 1 closed one: 1 gesloten
other: "%{count} closed" other: "%{count} gesloten"
label_comment: Commentaar label_comment: Commentaar
label_comment_add: Voeg commentaar toe label_comment_add: Voeg commentaar toe
label_comment_added: Commentaar toegevoegd label_comment_added: Commentaar toegevoegd
@@ -1022,7 +1022,7 @@ nl:
text_project_closed: Dit project is gesloten en op alleen-lezen text_project_closed: Dit project is gesloten en op alleen-lezen
notice_user_successful_create: Gebruiker %{id} aangemaakt. notice_user_successful_create: Gebruiker %{id} aangemaakt.
field_core_fields: Standaard verleden field_core_fields: Standaard verleden
field_timeout: Timeout (in seconds) field_timeout: Timeout (in seconden)
setting_thumbnails_enabled: Geef bijlage miniaturen weer setting_thumbnails_enabled: Geef bijlage miniaturen weer
setting_thumbnails_size: Grootte miniaturen (in pixels) setting_thumbnails_size: Grootte miniaturen (in pixels)
label_status_transitions: Status transitie label_status_transitions: Status transitie
@@ -1036,36 +1036,35 @@ nl:
label_attribute_of_assigned_to: Toegewezen %{name} label_attribute_of_assigned_to: Toegewezen %{name}
label_attribute_of_fixed_version: Target versions %{name} label_attribute_of_fixed_version: Target versions %{name}
label_copy_subtasks: Kopieer subtaken label_copy_subtasks: Kopieer subtaken
label_copied_to: copied to label_copied_to: gekopieerd naar
label_copied_from: copied from label_copied_from: gekopieerd van
label_any_issues_in_project: any issues in project label_any_issues_in_project: any issues in project
label_any_issues_not_in_project: any issues not in project label_any_issues_not_in_project: any issues not in project
field_private_notes: Private notes field_private_notes: Privé notities
permission_view_private_notes: View private notes permission_view_private_notes: Bekijk privé notities
permission_set_notes_private: Set notes as private permission_set_notes_private: Maak notities privé
label_no_issues_in_project: no issues in project label_no_issues_in_project: geen issues in project
label_any: alle label_any: alle
label_last_n_weeks: last %{count} weeks label_last_n_weeks: afgelopen %{count} weken
setting_cross_project_subtasks: Allow cross-project subtasks setting_cross_project_subtasks: Sta subtaken in andere projecten toe
label_cross_project_descendants: Met subprojecten label_cross_project_descendants: Met subprojecten
label_cross_project_tree: Met project boom label_cross_project_tree: Met project boom
label_cross_project_hierarchy: Met project hiërarchie label_cross_project_hierarchy: Met project hiërarchie
label_cross_project_system: Met alle projecten label_cross_project_system: Met alle projecten
button_hide: Hide button_hide: Verberg
setting_non_working_week_days: Non-working days setting_non_working_week_days: Niet-werkdagen
label_in_the_next_days: in the next label_in_the_next_days: in de volgende
label_in_the_past_days: in the past label_in_the_past_days: in de afgelopen
label_attribute_of_user: User's %{name} label_attribute_of_user: User's %{name}
text_turning_multiple_off: If you disable multiple values, multiple values will be text_turning_multiple_off: Bij het uitschakelen van meerdere waardes zal er maar een waarde bewaard blijven.
removed in order to preserve only one value per item.
label_attribute_of_issue: Issue's %{name} label_attribute_of_issue: Issue's %{name}
permission_add_documents: Add documents permission_add_documents: Voeg documenten toe
permission_edit_documents: Edit documents permission_edit_documents: Bewerk documenten
permission_delete_documents: Delete documents permission_delete_documents: Verwijder documenten
label_gantt_progress_line: Progress line label_gantt_progress_line: Voortgangslijn
setting_jsonp_enabled: Enable JSONP support setting_jsonp_enabled: Schakel JSONP support in
field_inherit_members: Inherit members field_inherit_members: Neem leden over
field_closed_on: Closed field_closed_on: Gesloten
setting_default_projects_tracker_ids: Default trackers for new projects setting_default_projects_tracker_ids: Standaard trackers voor nieuwe projecten
label_total_time: Totaal label_total_time: Totaal
setting_emails_header: Email header setting_emails_header: Email header
+3 -1
View File
@@ -4,6 +4,8 @@
"zh-TW": "zh-TW":
direction: ltr direction: ltr
jquery:
locale: "zh-TW"
date: date:
formats: formats:
# Use the strftime parameters for formats. # Use the strftime parameters for formats.
@@ -483,6 +485,7 @@
setting_thumbnails_size: "縮圖大小 (單位: 像素 pixels)" setting_thumbnails_size: "縮圖大小 (單位: 像素 pixels)"
setting_non_working_week_days: 非工作日 setting_non_working_week_days: 非工作日
setting_jsonp_enabled: 啟用 JSONP 支援 setting_jsonp_enabled: 啟用 JSONP 支援
setting_default_projects_tracker_ids: 新專案預設使用的追蹤標籤
permission_add_project: 建立專案 permission_add_project: 建立專案
permission_add_subprojects: 建立子專案 permission_add_subprojects: 建立子專案
@@ -1165,5 +1168,4 @@
description_date_from: 輸入起始日期 description_date_from: 輸入起始日期
description_date_to: 輸入結束日期 description_date_to: 輸入結束日期
text_repository_identifier_info: '僅允許使用小寫英文字母 (a-z), 阿拉伯數字, 虛線與底線。<br />一旦儲存之後, 代碼便無法再次被更改。' text_repository_identifier_info: '僅允許使用小寫英文字母 (a-z), 阿拉伯數字, 虛線與底線。<br />一旦儲存之後, 代碼便無法再次被更改。'
setting_default_projects_tracker_ids: Default trackers for new projects
label_total_time: 總計 label_total_time: 總計
+19
View File
@@ -4,6 +4,25 @@ Redmine - project management software
Copyright (C) 2006-2013 Jean-Philippe Lang Copyright (C) 2006-2013 Jean-Philippe Lang
http://www.redmine.org/ http://www.redmine.org/
== 2013-05-01 v2.3.1
* Defect #12650: Lost text after selection in issue list with IE
* Defect #12684: Hotkey for Issue-Edit doesn't work as expected
* Defect #13405: Commit link title is escaped twice when using "commit:" prefix
* Defect #13541: Can't access SCM when log/production.scm.stderr.log is not writable
* Defect #13579: Datepicker uses Simplified Chinese in Traditional Chinese locale
* Defect #13584: Missing Portuguese jQuery UI date picker
* Defect #13586: Circular loop testing prevents precedes/follows relation between subtasks
* Defect #13618: CSV export of spent time ignores filters and columns selection
* Defect #13630: PDF export generates the issue id twice
* Defect #13644: Diff - Internal Error
* Defect #13712: Fix email rake tasks to also support no_account_notice and default_group options
* Defect #13811: Broken javascript in IE7 ; recurrence of #12195
* Defect #13823: Trailing comma in javascript files
* Patch #13531: Traditional Chinese translation for 2.3-stable
* Patch #13552: Dutch translations for 2.3-stable
* Patch #13678: Lithuanian translation for 2.3-stable
== 2013-03-19 v2.3.0 == 2013-03-19 v2.3.0
* Defect #3107: Issue with two digit year on Logtime * Defect #3107: Issue with two digit year on Logtime
+8 -1
View File
@@ -7,7 +7,7 @@ http://www.redmine.org/
== Requirements == Requirements
* Ruby 1.8.7, 1.9.2 or 1.9.3 * Ruby 1.8.7, 1.9.2, 1.9.3 or 2.0.0
* RubyGems * RubyGems
* Bundler >= 1.0.21 * Bundler >= 1.0.21
@@ -15,6 +15,7 @@ http://www.redmine.org/
* MySQL (tested with MySQL 5.1) * MySQL (tested with MySQL 5.1)
* PostgreSQL (tested with PostgreSQL 9.1) * PostgreSQL (tested with PostgreSQL 9.1)
* SQLite3 (tested with SQLite 3.7) * SQLite3 (tested with SQLite 3.7)
* SQLServer (tested with SQLServer 2012)
Optional: Optional:
* SCM binaries (e.g. svn, git...), for repository browsing (must be available in PATH) * SCM binaries (e.g. svn, git...), for repository browsing (must be available in PATH)
@@ -39,6 +40,12 @@ Optional:
of the rmagick gem using: of the rmagick gem using:
bundle install --without development test rmagick bundle install --without development test rmagick
Only the gems that are needed by the adapters you've specified in your database
configuration file are actually installed (eg. if your config/database.yml
uses the 'mysql2' adapter, then only the mysql2 gem will be installed). Don't
forget to re-run `bundle install` when you change config/database.yml for using
other database adapters.
If you need to load some gems that are not required by Redmine core (eg. fcgi), If you need to load some gems that are not required by Redmine core (eg. fcgi),
you can create a file named Gemfile.local at the root of your redmine directory. you can create a file named Gemfile.local at the root of your redmine directory.
It will be loaded automatically when running `bundle install`. It will be loaded automatically when running `bundle install`.
+14 -17
View File
@@ -380,7 +380,7 @@ module Redmine
col_width col_width
end end
def render_table_header(pdf, query, col_width, row_height, col_id_width, table_width) def render_table_header(pdf, query, col_width, row_height, table_width)
# headers # headers
pdf.SetFontStyle('B',8) pdf.SetFontStyle('B',8)
pdf.SetFillColor(230, 230, 230) pdf.SetFillColor(230, 230, 230)
@@ -389,13 +389,12 @@ module Redmine
base_x = pdf.GetX base_x = pdf.GetX
base_y = pdf.GetY base_y = pdf.GetY
max_height = issues_to_pdf_write_cells(pdf, query.inline_columns, col_width, row_height, true) max_height = issues_to_pdf_write_cells(pdf, query.inline_columns, col_width, row_height, true)
pdf.Rect(base_x, base_y, table_width + col_id_width, max_height, 'FD'); pdf.Rect(base_x, base_y, table_width, max_height, 'FD');
pdf.SetXY(base_x, base_y); pdf.SetXY(base_x, base_y);
# write the cells on page # write the cells on page
pdf.RDMCell(col_id_width, row_height, "#", "T", 0, 'C', 1)
issues_to_pdf_write_cells(pdf, query.inline_columns, col_width, row_height, true) issues_to_pdf_write_cells(pdf, query.inline_columns, col_width, row_height, true)
issues_to_pdf_draw_borders(pdf, base_x, base_y, base_y + max_height, col_id_width, col_width) issues_to_pdf_draw_borders(pdf, base_x, base_y, base_y + max_height, col_width)
pdf.SetY(base_y + max_height); pdf.SetY(base_y + max_height);
# rows # rows
@@ -417,22 +416,22 @@ module Redmine
# Landscape A4 = 210 x 297 mm # Landscape A4 = 210 x 297 mm
page_height = 210 page_height = 210
page_width = 297 page_width = 297
left_margin = 10
right_margin = 10 right_margin = 10
bottom_margin = 20 bottom_margin = 20
col_id_width = 10
row_height = 4 row_height = 4
# column widths # column widths
table_width = page_width - right_margin - 10 # fixed left margin table_width = page_width - right_margin - left_margin
col_width = [] col_width = []
unless query.inline_columns.empty? unless query.inline_columns.empty?
col_width = calc_col_width(issues, query, table_width - col_id_width, pdf) col_width = calc_col_width(issues, query, table_width, pdf)
table_width = col_width.inject(0) {|s,v| s += v} table_width = col_width.inject(0) {|s,v| s += v}
end end
# use full width if the description is displayed # use full width if the description is displayed
if table_width > 0 && query.has_column?(:description) if table_width > 0 && query.has_column?(:description)
col_width = col_width.map {|w| w = w * (page_width - right_margin - 10 - col_id_width) / table_width} col_width = col_width.map {|w| w * (page_width - right_margin - left_margin) / table_width}
table_width = col_width.inject(0) {|s,v| s += v} table_width = col_width.inject(0) {|s,v| s += v}
end end
@@ -440,7 +439,7 @@ module Redmine
pdf.SetFontStyle('B',11) pdf.SetFontStyle('B',11)
pdf.RDMCell(190,10, title) pdf.RDMCell(190,10, title)
pdf.Ln pdf.Ln
render_table_header(pdf, query, col_width, row_height, col_id_width, table_width) render_table_header(pdf, query, col_width, row_height, table_width)
previous_group = false previous_group = false
issue_list(issues) do |issue, level| issue_list(issues) do |issue, level|
if query.grouped? && if query.grouped? &&
@@ -449,7 +448,7 @@ module Redmine
group_label = group.blank? ? 'None' : group.to_s.dup group_label = group.blank? ? 'None' : group.to_s.dup
group_label << " (#{query.issue_count_by_group[group]})" group_label << " (#{query.issue_count_by_group[group]})"
pdf.Bookmark group_label, 0, -1 pdf.Bookmark group_label, 0, -1
pdf.RDMCell(table_width + col_id_width, row_height * 2, group_label, 1, 1, 'L') pdf.RDMCell(table_width, row_height * 2, group_label, 1, 1, 'L')
pdf.SetFontStyle('',8) pdf.SetFontStyle('',8)
previous_group = group previous_group = group
end end
@@ -468,15 +467,14 @@ module Redmine
space_left = page_height - base_y - bottom_margin space_left = page_height - base_y - bottom_margin
if max_height > space_left if max_height > space_left
pdf.AddPage("L") pdf.AddPage("L")
render_table_header(pdf, query, col_width, row_height, col_id_width, table_width) render_table_header(pdf, query, col_width, row_height, table_width)
base_x = pdf.GetX base_x = pdf.GetX
base_y = pdf.GetY base_y = pdf.GetY
end end
# write the cells on page # write the cells on page
pdf.RDMCell(col_id_width, row_height, issue.id.to_s, "T", 0, 'C', 1)
issues_to_pdf_write_cells(pdf, col_values, col_width, row_height) issues_to_pdf_write_cells(pdf, col_values, col_width, row_height)
issues_to_pdf_draw_borders(pdf, base_x, base_y, base_y + max_height, col_id_width, col_width) issues_to_pdf_draw_borders(pdf, base_x, base_y, base_y + max_height, col_width)
pdf.SetY(base_y + max_height); pdf.SetY(base_y + max_height);
if query.has_column?(:description) && issue.description? if query.has_column?(:description) && issue.description?
@@ -513,9 +511,8 @@ module Redmine
end end
# Draw lines to close the row (MultiCell border drawing in not uniform) # Draw lines to close the row (MultiCell border drawing in not uniform)
def issues_to_pdf_draw_borders(pdf, top_x, top_y, lower_y, def issues_to_pdf_draw_borders(pdf, top_x, top_y, lower_y, col_widths)
id_width, col_widths) col_x = top_x
col_x = top_x + id_width
pdf.Line(col_x, top_y, col_x, lower_y) # id right border pdf.Line(col_x, top_y, col_x, lower_y) # id right border
col_widths.each do |width| col_widths.each do |width|
col_x += width col_x += width
+26 -5
View File
@@ -219,18 +219,39 @@ module Redmine
end end
# Path to the file where scm stderr output is logged # Path to the file where scm stderr output is logged
# Returns nil if the log file is not writable
def self.stderr_log_file def self.stderr_log_file
@stderr_log_path ||= if @stderr_log_file.nil?
Redmine::Configuration['scm_stderr_log_file'].presence || writable = false
Rails.root.join("log/#{Rails.env}.scm.stderr.log").to_s path = Redmine::Configuration['scm_stderr_log_file'].presence
path ||= Rails.root.join("log/#{Rails.env}.scm.stderr.log").to_s
if File.exists?(path)
if File.file?(path) && File.writable?(path)
writable = true
else
logger.warn("SCM log file (#{path}) is not writable")
end
else
begin
File.open(path, "w") {}
writable = true
rescue => e
logger.warn("SCM log file (#{path}) cannot be created: #{e.message}")
end
end
@stderr_log_file = writable ? path : false
end
@stderr_log_file || nil
end end
def self.shellout(cmd, options = {}, &block) def self.shellout(cmd, options = {}, &block)
if logger && logger.debug? if logger && logger.debug?
logger.debug "Shelling out: #{strip_credential(cmd)}" logger.debug "Shelling out: #{strip_credential(cmd)}"
# Capture stderr in a log file
if stderr_log_file
cmd = "#{cmd} 2>>#{shell_quote(stderr_log_file)}"
end
end end
# Capture stderr in a log file
cmd = "#{cmd} 2>>#{shell_quote(stderr_log_file)}"
begin begin
mode = "r+" mode = "r+"
IO.popen(cmd, mode) do |io| IO.popen(cmd, mode) do |io|
+8 -4
View File
@@ -199,15 +199,19 @@ module Redmine
while starting < max && line_left[starting] == line_right[starting] while starting < max && line_left[starting] == line_right[starting]
starting += 1 starting += 1
end end
while line_left[starting].ord.between?(128, 191) && starting > 0 if (! "".respond_to?(:force_encoding)) && starting < line_left.size
starting -= 1 while line_left[starting].ord.between?(128, 191) && starting > 0
starting -= 1
end
end end
ending = -1 ending = -1
while ending >= -(max - starting) && line_left[ending] == line_right[ending] while ending >= -(max - starting) && line_left[ending] == line_right[ending]
ending -= 1 ending -= 1
end end
while line_left[ending].ord.between?(128, 191) && ending > -1 if (! "".respond_to?(:force_encoding)) && ending > (-1 * line_left.size)
ending -= 1 while line_left[ending].ord.between?(128, 191) && ending > -1
ending -= 1
end
end end
unless starting == 0 && ending == -1 unless starting == 0 && ending == -1
[starting, ending] [starting, ending]
+1 -1
View File
@@ -4,7 +4,7 @@ module Redmine
module VERSION #:nodoc: module VERSION #:nodoc:
MAJOR = 2 MAJOR = 2
MINOR = 3 MINOR = 3
TINY = 0 TINY = 1
# Branch values: # Branch values:
# * official release: nil # * official release: nil
+10
View File
@@ -29,6 +29,8 @@ General options:
create: create a user account create: create a user account
no_permission_check=1 disable permission checking when receiving no_permission_check=1 disable permission checking when receiving
the email the email
no_account_notice=1 disable new user account notification
default_group=foo,bar adds created user to foo and bar groups
Issue attributes control options: Issue attributes control options:
project=PROJECT identifier of the target project project=PROJECT identifier of the target project
@@ -58,6 +60,8 @@ END_DESC
options[:allow_override] = ENV['allow_override'] if ENV['allow_override'] options[:allow_override] = ENV['allow_override'] if ENV['allow_override']
options[:unknown_user] = ENV['unknown_user'] if ENV['unknown_user'] options[:unknown_user] = ENV['unknown_user'] if ENV['unknown_user']
options[:no_permission_check] = ENV['no_permission_check'] if ENV['no_permission_check'] options[:no_permission_check] = ENV['no_permission_check'] if ENV['no_permission_check']
options[:no_account_notice] = ENV['no_account_notice'] if ENV['no_account_notice']
options[:default_group] = ENV['default_group'] if ENV['default_group']
MailHandler.receive(STDIN.read, options) MailHandler.receive(STDIN.read, options)
end end
@@ -73,6 +77,8 @@ General options:
create: create a user account create: create a user account
no_permission_check=1 disable permission checking when receiving no_permission_check=1 disable permission checking when receiving
the email the email
no_account_notice=1 disable new user account notification
default_group=foo,bar adds created user to foo and bar groups
Available IMAP options: Available IMAP options:
host=HOST IMAP server host (default: 127.0.0.1) host=HOST IMAP server host (default: 127.0.0.1)
@@ -129,6 +135,8 @@ END_DESC
options[:allow_override] = ENV['allow_override'] if ENV['allow_override'] options[:allow_override] = ENV['allow_override'] if ENV['allow_override']
options[:unknown_user] = ENV['unknown_user'] if ENV['unknown_user'] options[:unknown_user] = ENV['unknown_user'] if ENV['unknown_user']
options[:no_permission_check] = ENV['no_permission_check'] if ENV['no_permission_check'] options[:no_permission_check] = ENV['no_permission_check'] if ENV['no_permission_check']
options[:no_account_notice] = ENV['no_account_notice'] if ENV['no_account_notice']
options[:default_group] = ENV['default_group'] if ENV['default_group']
Redmine::IMAP.check(imap_options, options) Redmine::IMAP.check(imap_options, options)
end end
@@ -162,6 +170,8 @@ END_DESC
options[:allow_override] = ENV['allow_override'] if ENV['allow_override'] options[:allow_override] = ENV['allow_override'] if ENV['allow_override']
options[:unknown_user] = ENV['unknown_user'] if ENV['unknown_user'] options[:unknown_user] = ENV['unknown_user'] if ENV['unknown_user']
options[:no_permission_check] = ENV['no_permission_check'] if ENV['no_permission_check'] options[:no_permission_check] = ENV['no_permission_check'] if ENV['no_permission_check']
options[:no_account_notice] = ENV['no_account_notice'] if ENV['no_account_notice']
options[:default_group] = ENV['default_group'] if ENV['default_group']
Redmine::POP3.check(pop_options, options) Redmine::POP3.check(pop_options, options)
end end
+10 -10
View File
@@ -14,12 +14,12 @@ function toggleCheckboxesBySelector(selector) {
$(selector).each(function(index) { $(selector).each(function(index) {
if (!$(this).is(':checked')) { all_checked = false; } if (!$(this).is(':checked')) { all_checked = false; }
}); });
$(selector).attr('checked', !all_checked) $(selector).attr('checked', !all_checked);
} }
function showAndScrollTo(id, focus) { function showAndScrollTo(id, focus) {
$('#'+id).show(); $('#'+id).show();
if (focus!=null) { if (focus !== null) {
$('#'+focus).focus(); $('#'+focus).focus();
} }
$('html, body').animate({scrollTop: $('#'+id).offset().top}, 100); $('html, body').animate({scrollTop: $('#'+id).offset().top}, 100);
@@ -131,10 +131,10 @@ function buildFilterRow(field, operator, values) {
select = tr.find('td.operator select'); select = tr.find('td.operator select');
for (i=0;i<operators.length;i++){ for (i=0;i<operators.length;i++){
var option = $('<option>').val(operators[i]).text(operatorLabels[operators[i]]); var option = $('<option>').val(operators[i]).text(operatorLabels[operators[i]]);
if (operators[i] == operator) {option.attr('selected', true)}; if (operators[i] == operator) { option.attr('selected', true); }
select.append(option); select.append(option);
} }
select.change(function(){toggleOperator(field)}); select.change(function(){ toggleOperator(field); });
switch (filterOptions['type']){ switch (filterOptions['type']){
case "list": case "list":
@@ -146,7 +146,7 @@ function buildFilterRow(field, operator, values) {
' <span class="toggle-multiselect">&nbsp;</span></span>' ' <span class="toggle-multiselect">&nbsp;</span></span>'
); );
select = tr.find('td.values select'); select = tr.find('td.values select');
if (values.length > 1) {select.attr('multiple', true)}; if (values.length > 1) { select.attr('multiple', true); }
for (i=0;i<filterValues.length;i++){ for (i=0;i<filterValues.length;i++){
var filterValue = filterValues[i]; var filterValue = filterValues[i];
var option = $('<option>'); var option = $('<option>');
@@ -189,7 +189,7 @@ function buildFilterRow(field, operator, values) {
var filterValue = allProjects[i]; var filterValue = allProjects[i];
var option = $('<option>'); var option = $('<option>');
option.val(filterValue[1]).text(filterValue[0]); option.val(filterValue[1]).text(filterValue[0]);
if (values[0] == filterValue[1]) {option.attr('selected', true)}; if (values[0] == filterValue[1]) { option.attr('selected', true); }
select.append(option); select.append(option);
} }
case "integer": case "integer":
@@ -352,7 +352,7 @@ function setPredecessorFieldsVisibility() {
function showModal(id, width) { function showModal(id, width) {
var el = $('#'+id).first(); var el = $('#'+id).first();
if (el.length == 0 || el.is(':visible')) {return;} if (el.length === 0 || el.is(':visible')) {return;}
var title = el.find('h3.title').text(); var title = el.find('h3.title').text();
el.dialog({ el.dialog({
width: width, width: width,
@@ -462,7 +462,7 @@ function observeAutocompleteField(fieldId, url, options) {
source: url, source: url,
minLength: 2, minLength: 2,
search: function(){$('#'+fieldId).addClass('ajax-loading');}, search: function(){$('#'+fieldId).addClass('ajax-loading');},
response: function(){$('#'+fieldId).removeClass('ajax-loading');}, response: function(){$('#'+fieldId).removeClass('ajax-loading');}
}, options)); }, options));
$('#'+fieldId).addClass('autocomplete'); $('#'+fieldId).addClass('autocomplete');
}); });
@@ -546,13 +546,13 @@ function warnLeavingUnsaved(message) {
}); });
if (warn) {return warnLeavingUnsavedMessage;} if (warn) {return warnLeavingUnsavedMessage;}
}; };
}; }
function setupAjaxIndicator() { function setupAjaxIndicator() {
$('#ajax-indicator').bind('ajaxSend', function(event, xhr, settings) { $('#ajax-indicator').bind('ajaxSend', function(event, xhr, settings) {
if ($('.ajax-loading').length == 0 && settings.contentType != 'application/octet-stream') { if ($('.ajax-loading').length === 0 && settings.contentType != 'application/octet-stream') {
$('#ajax-indicator').show(); $('#ajax-indicator').show();
} }
}); });
+1 -1
View File
@@ -186,7 +186,7 @@ function contextMenuCheckSelectionBox(tr, checked) {
function contextMenuClearDocumentSelection() { function contextMenuClearDocumentSelection() {
// TODO // TODO
if (document.selection) { if (document.selection) {
document.selection.clear(); // IE document.selection.empty(); // IE
} else { } else {
window.getSelection().removeAllRanges(); window.getSelection().removeAllRanges();
} }
+1 -1
View File
@@ -93,7 +93,7 @@ function drawRelations() {
.attr({stroke: "none", .attr({stroke: "none",
fill: color, fill: color,
"stroke-linecap": "butt", "stroke-linecap": "butt",
"stroke-linejoin": "miter", "stroke-linejoin": "miter"
}); });
}); });
} }
+22
View File
@@ -0,0 +1,22 @@
/* Portuguese initialisation for the jQuery UI date picker plugin. */
jQuery(function($){
$.datepicker.regional['pt'] = {
closeText: 'Fechar',
prevText: '&#x3C;Anterior',
nextText: 'Seguinte',
currentText: 'Hoje',
monthNames: ['Janeiro','Fevereiro','Março','Abril','Maio','Junho',
'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],
monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun',
'Jul','Ago','Set','Out','Nov','Dez'],
dayNames: ['Domingo','Segunda-feira','Terça-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sábado'],
dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'],
dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'],
weekHeader: 'Sem',
dateFormat: 'dd/mm/yy',
firstDay: 0,
isRTL: false,
showMonthAfterYear: false,
yearSuffix: ''};
$.datepicker.setDefaults($.datepicker.regional['pt']);
});
@@ -9,8 +9,8 @@ jsToolBar.strings['Heading 2'] = 'Heading 2';
jsToolBar.strings['Heading 3'] = 'Heading 3'; jsToolBar.strings['Heading 3'] = 'Heading 3';
jsToolBar.strings['Unordered list'] = 'Nenumeruotas sąrašas'; jsToolBar.strings['Unordered list'] = 'Nenumeruotas sąrašas';
jsToolBar.strings['Ordered list'] = 'Numeruotas sąrašas'; jsToolBar.strings['Ordered list'] = 'Numeruotas sąrašas';
jsToolBar.strings['Quote'] = 'Quote'; jsToolBar.strings['Quote'] = 'Cituoti';
jsToolBar.strings['Unquote'] = 'Remove Quote'; jsToolBar.strings['Unquote'] = 'Pašalinti citavimą';
jsToolBar.strings['Preformatted text'] = 'Preformatuotas tekstas'; jsToolBar.strings['Preformatted text'] = 'Preformatuotas tekstas';
jsToolBar.strings['Wiki link'] = 'Nuoroda į Wiki puslapį'; jsToolBar.strings['Wiki link'] = 'Nuoroda į Wiki puslapį';
jsToolBar.strings['Image'] = 'Paveikslas'; jsToolBar.strings['Image'] = 'Paveikslas';
+1 -1
View File
@@ -43,7 +43,7 @@ function drawRevisionGraph(holder, commits_hash, graph_space) {
revisionGraph.circle(x, y, 3) revisionGraph.circle(x, y, 3)
.attr({ .attr({
fill: colors[commit.space], fill: colors[commit.space],
stroke: 'none', stroke: 'none'
}).toFront(); }).toFront();
// paths to parents // paths to parents
$.each(commit.parent_scmids, function(index, parent_scmid) { $.each(commit.parent_scmids, function(index, parent_scmid) {
+2 -1
View File
@@ -3,8 +3,9 @@ changesets_001:
commit_date: 2007-04-11 commit_date: 2007-04-11
committed_on: 2007-04-11 15:14:44 +02:00 committed_on: 2007-04-11 15:14:44 +02:00
revision: 1 revision: 1
scmid: 691322a8eb01e11fd7
id: 100 id: 100
comments: My very first commit comments: 'My very first commit do not escaping #<>&'
repository_id: 10 repository_id: 10
committer: dlopper committer: dlopper
user_id: 3 user_id: 3
+7
View File
@@ -0,0 +1,7 @@
--- a.txt 2013-04-05 14:19:39.000000000 +0900
+++ b.txt 2013-04-05 14:19:51.000000000 +0900
@@ -1,3 +1,3 @@
aaaa
-日本
+日本語
bbbb
+7
View File
@@ -0,0 +1,7 @@
--- a.txt 2013-04-05 14:19:39.000000000 +0900
+++ b.txt 2013-04-05 14:19:51.000000000 +0900
@@ -1,3 +1,3 @@
aaaa
-日本
+にっぽん日本
bbbb
@@ -548,6 +548,46 @@ class TimelogControllerTest < ActionController::TestCase
assert assigns(:items).first.is_a?(TimeEntry) assert assigns(:items).first.is_a?(TimeEntry)
end end
def test_index_at_project_level_should_include_csv_export_dialog
get :index, :project_id => 'ecookbook',
:f => ['spent_on'],
:op => {'spent_on' => '>='},
:v => {'spent_on' => ['2007-04-01']},
:c => ['spent_on', 'user']
assert_response :success
assert_select '#csv-export-options' do
assert_select 'form[action=?][method=get]', '/projects/ecookbook/time_entries.csv' do
# filter
assert_select 'input[name=?][value=?]', 'f[]', 'spent_on'
assert_select 'input[name=?][value=?]', 'op[spent_on]', '&gt;='
assert_select 'input[name=?][value=?]', 'v[spent_on][]', '2007-04-01'
# columns
assert_select 'input[name=?][value=?]', 'c[]', 'spent_on'
assert_select 'input[name=?][value=?]', 'c[]', 'user'
assert_select 'input[name=?]', 'c[]', 2
end
end
end
def test_index_cross_project_should_include_csv_export_dialog
get :index
assert_response :success
assert_select '#csv-export-options' do
assert_select 'form[action=?][method=get]', '/time_entries.csv'
end
end
def test_index_at_issue_level_should_include_csv_export_dialog
get :index, :project_id => 'ecookbook', :issue_id => 3
assert_response :success
assert_select '#csv-export-options' do
assert_select 'form[action=?][method=get]', '/projects/ecookbook/issues/3/time_entries.csv'
end
end
def test_index_csv_all_projects def test_index_csv_all_projects
Setting.date_format = '%m/%d/%Y' Setting.date_format = '%m/%d/%Y'
get :index, :format => 'csv' get :index, :format => 'csv'
+20
View File
@@ -85,6 +85,26 @@ class LayoutTest < ActionController::IntegrationTest
get '/issues' get '/issues'
assert_not_include "/javascripts/i18n/jquery.ui.datepicker", response.body assert_not_include "/javascripts/i18n/jquery.ui.datepicker", response.body
end end
with_settings :default_language => 'zh' do
get '/issues'
assert_include "/javascripts/i18n/jquery.ui.datepicker-zh-CN.js", response.body
end
with_settings :default_language => 'zh-TW' do
get '/issues'
assert_include "/javascripts/i18n/jquery.ui.datepicker-zh-TW.js", response.body
end
with_settings :default_language => 'pt' do
get '/issues'
assert_include "/javascripts/i18n/jquery.ui.datepicker-pt.js", response.body
end
with_settings :default_language => 'pt-BR' do
get '/issues'
assert_include "/javascripts/i18n/jquery.ui.datepicker-pt-BR.js", response.body
end
end end
def test_search_field_outside_project_should_link_to_global_search def test_search_field_outside_project_should_link_to_global_search
+12 -7
View File
@@ -264,11 +264,15 @@ RAW
note_link = link_to('#3', {:controller => 'issues', :action => 'show', :id => 3, :anchor => 'note-14'}, note_link = link_to('#3', {:controller => 'issues', :action => 'show', :id => 3, :anchor => 'note-14'},
:class => Issue.find(3).css_classes, :title => 'Error 281 when updating a recipe (New)') :class => Issue.find(3).css_classes, :title => 'Error 281 when updating a recipe (New)')
changeset_link = link_to('r1', {:controller => 'repositories', :action => 'revision', :id => 'ecookbook', :rev => 1}, revision_link = link_to('r1', {:controller => 'repositories', :action => 'revision', :id => 'ecookbook', :rev => 1},
:class => 'changeset', :title => 'My very first commit') :class => 'changeset', :title => 'My very first commit do not escaping #<>&')
changeset_link2 = link_to('r2', {:controller => 'repositories', :action => 'revision', :id => 'ecookbook', :rev => 2}, revision_link2 = link_to('r2', {:controller => 'repositories', :action => 'revision', :id => 'ecookbook', :rev => 2},
:class => 'changeset', :title => 'This commit fixes #1, #2 and references #1 & #3') :class => 'changeset', :title => 'This commit fixes #1, #2 and references #1 & #3')
changeset_link2 = link_to('691322a8eb01e11fd7',
{:controller => 'repositories', :action => 'revision', :id => 'ecookbook', :rev => 1},
:class => 'changeset', :title => 'My very first commit do not escaping #<>&')
document_link = link_to('Test document', {:controller => 'documents', :action => 'show', :id => 1}, document_link = link_to('Test document', {:controller => 'documents', :action => 'show', :id => 1},
:class => 'document') :class => 'document')
@@ -304,10 +308,11 @@ RAW
# should not ignore leading zero # should not ignore leading zero
'#03' => '#03', '#03' => '#03',
# changesets # changesets
'r1' => changeset_link, 'r1' => revision_link,
'r1.' => "#{changeset_link}.", 'r1.' => "#{revision_link}.",
'r1, r2' => "#{changeset_link}, #{changeset_link2}", 'r1, r2' => "#{revision_link}, #{revision_link2}",
'r1,r2' => "#{changeset_link},#{changeset_link2}", 'r1,r2' => "#{revision_link},#{revision_link2}",
'commit:691322a8eb01e11fd7' => changeset_link2,
# documents # documents
'document#1' => document_link, 'document#1' => document_link,
'document:"Test document"' => document_link, 'document:"Test document"' => document_link,
+13
View File
@@ -137,6 +137,19 @@ class IssueRelationTest < ActiveSupport::TestCase
assert_include 'This relation would create a circular dependency', r.errors.full_messages assert_include 'This relation would create a circular dependency', r.errors.full_messages
end end
def test_subtasks_should_allow_precedes_relation
parent = Issue.generate!
child1 = Issue.generate!(:parent_issue_id => parent.id)
child2 = Issue.generate!(:parent_issue_id => parent.id)
r = IssueRelation.new(
:issue_from => child1, :issue_to => child2,
:relation_type => IssueRelation::TYPE_PRECEDES
)
assert r.valid?
assert r.save
end
def test_validates_circular_dependency_on_reverse_relations def test_validates_circular_dependency_on_reverse_relations
IssueRelation.delete_all IssueRelation.delete_all
assert IssueRelation.create!( assert IssueRelation.create!(
@@ -244,6 +244,70 @@ DIFF
end end
end end
def test_offset_range_ascii_1
raw = <<-DIFF
--- a.txt 2013-04-05 14:19:39.000000000 +0900
+++ b.txt 2013-04-05 14:19:51.000000000 +0900
@@ -1,3 +1,3 @@
aaaa
-abc
+abcd
bbbb
DIFF
diff = Redmine::UnifiedDiff.new(raw, :type => 'sbs')
assert_equal 1, diff.size
assert_equal 3, diff.first.size
assert_equal "abc<span></span>", diff.first[1].html_line_left
assert_equal "abc<span>d</span>", diff.first[1].html_line_right
end
def test_offset_range_ascii_2
raw = <<-DIFF
--- a.txt 2013-04-05 14:19:39.000000000 +0900
+++ b.txt 2013-04-05 14:19:51.000000000 +0900
@@ -1,3 +1,3 @@
aaaa
-abc
+zabc
bbbb
DIFF
diff = Redmine::UnifiedDiff.new(raw, :type => 'sbs')
assert_equal 1, diff.size
assert_equal 3, diff.first.size
assert_equal "<span></span>abc", diff.first[1].html_line_left
assert_equal "<span>z</span>abc", diff.first[1].html_line_right
end
def test_offset_range_japanese_1
ja1 = "\xe6\x97\xa5\xe6\x9c\xac<span></span>"
ja1.force_encoding('UTF-8') if ja1.respond_to?(:force_encoding)
ja2 = "\xe6\x97\xa5\xe6\x9c\xac<span>\xe8\xaa\x9e</span>"
ja2.force_encoding('UTF-8') if ja2.respond_to?(:force_encoding)
with_settings :repositories_encodings => '' do
diff = Redmine::UnifiedDiff.new(
read_diff_fixture('issue-13644-1.diff'), :type => 'sbs')
assert_equal 1, diff.size
assert_equal 3, diff.first.size
assert_equal ja1, diff.first[1].html_line_left
assert_equal ja2, diff.first[1].html_line_right
end
end
def test_offset_range_japanese_2
ja1 = "<span></span>\xe6\x97\xa5\xe6\x9c\xac"
ja1.force_encoding('UTF-8') if ja1.respond_to?(:force_encoding)
ja2 = "<span>\xe3\x81\xab\xe3\x81\xa3\xe3\x81\xbd\xe3\x82\x93</span>\xe6\x97\xa5\xe6\x9c\xac"
ja2.force_encoding('UTF-8') if ja2.respond_to?(:force_encoding)
with_settings :repositories_encodings => '' do
diff = Redmine::UnifiedDiff.new(
read_diff_fixture('issue-13644-2.diff'), :type => 'sbs')
assert_equal 1, diff.size
assert_equal 3, diff.first.size
assert_equal ja1, diff.first[1].html_line_left
assert_equal ja2, diff.first[1].html_line_right
end
end
private private
def read_diff_fixture(filename) def read_diff_fixture(filename)