##// END OF EJS Templates
Issue relations first commit (not thoroughly tested). 4 kinds of relation are available:...
Jean-Philippe Lang -
r503:92b02014d21f
parent child
Show More
@@ -0,0 +1,59
1 # redMine - project management software
2 # Copyright (C) 2006-2007 Jean-Philippe Lang
3 #
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
18 class IssueRelationsController < ApplicationController
19 layout 'base'
20 before_filter :find_project, :authorize
21
22 def new
23 @relation = IssueRelation.new(params[:relation])
24 @relation.issue_from = @issue
25 @relation.save if request.post?
26 respond_to do |format|
27 format.html { redirect_to :controller => 'issues', :action => 'show', :id => @issue }
28 format.js do
29 render :update do |page|
30 page.replace_html "relations", :partial => 'issues/relations'
31 if @relation.errors.empty?
32 page << "$('relation_delay').value = ''"
33 page << "$('relation_issue_to_id').value = ''"
34 end
35 end
36 end
37 end
38 end
39
40 def destroy
41 relation = IssueRelation.find(params[:id])
42 if request.post? && @issue.relations.include?(relation)
43 relation.destroy
44 @issue.reload
45 end
46 respond_to do |format|
47 format.html { redirect_to :controller => 'issues', :action => 'show', :id => @issue }
48 format.js { render(:update) {|page| page.replace_html "relations", :partial => 'issues/relations'} }
49 end
50 end
51
52 private
53 def find_project
54 @issue = Issue.find(params[:issue_id])
55 @project = @issue.project
56 rescue ActiveRecord::RecordNotFound
57 render_404
58 end
59 end
@@ -0,0 +1,23
1 # redMine - project management software
2 # Copyright (C) 2006-2007 Jean-Philippe Lang
3 #
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
18 module IssueRelationsHelper
19 def collection_for_relation_type_select
20 values = IssueRelation::TYPES
21 values.keys.sort{|x,y| values[x][:order] <=> values[y][:order]}.collect{|k| [l(values[k][:name]), k]}
22 end
23 end
@@ -0,0 +1,79
1 # redMine - project management software
2 # Copyright (C) 2006-2007 Jean-Philippe Lang
3 #
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
18 class IssueRelation < ActiveRecord::Base
19 belongs_to :issue_from, :class_name => 'Issue', :foreign_key => 'issue_from_id'
20 belongs_to :issue_to, :class_name => 'Issue', :foreign_key => 'issue_to_id'
21
22 TYPE_RELATES = "relates"
23 TYPE_DUPLICATES = "duplicates"
24 TYPE_BLOCKS = "blocks"
25 TYPE_PRECEDES = "precedes"
26
27 TYPES = { TYPE_RELATES => { :name => :label_relates_to, :sym_name => :label_relates_to, :order => 1 },
28 TYPE_DUPLICATES => { :name => :label_duplicates, :sym_name => :label_duplicates, :order => 2 },
29 TYPE_BLOCKS => { :name => :label_blocks, :sym_name => :label_blocked_by, :order => 3 },
30 TYPE_PRECEDES => { :name => :label_precedes, :sym_name => :label_follows, :order => 4 },
31 }.freeze
32
33 validates_presence_of :issue_from, :issue_to, :relation_type
34 validates_inclusion_of :relation_type, :in => TYPES.keys
35 validates_numericality_of :delay, :allow_nil => true
36 validates_uniqueness_of :issue_to_id, :scope => :issue_from_id
37
38 def validate
39 if issue_from && issue_to
40 errors.add :issue_to_id, :activerecord_error_invalid if issue_from_id == issue_to_id
41 errors.add :issue_to_id, :activerecord_error_not_same_project unless issue_from.project_id == issue_to.project_id
42 errors.add_to_base :activerecord_error_circular_dependency if issue_to.all_dependent_issues.include? issue_from
43 end
44 end
45
46 def other_issue(issue)
47 (self.issue_from_id == issue.id) ? issue_to : issue_from
48 end
49
50 def label_for(issue)
51 TYPES[relation_type] ? TYPES[relation_type][(self.issue_from_id == issue.id) ? :name : :sym_name] : :unknow
52 end
53
54 def before_save
55 if TYPE_PRECEDES == relation_type
56 self.delay ||= 0
57 else
58 self.delay = nil
59 end
60 set_issue_to_dates
61 end
62
63 def set_issue_to_dates
64 soonest_start = self.successor_soonest_start
65 if soonest_start && (!issue_to.start_date || issue_to.start_date < soonest_start)
66 issue_to.start_date, issue_to.due_date = successor_soonest_start, successor_soonest_start + issue_to.duration
67 issue_to.save
68 end
69 end
70
71 def successor_soonest_start
72 return nil unless (TYPE_PRECEDES == self.relation_type) && (issue_from.start_date || issue_from.due_date)
73 (issue_from.due_date || issue_from.start_date) + 1 + delay
74 end
75
76 def <=>(relation)
77 TYPES[self.relation_type][:order] <=> TYPES[relation.relation_type][:order]
78 end
79 end
@@ -0,0 +1,10
1 <%= error_messages_for 'relation' %>
2
3 <p><%= f.select :relation_type, collection_for_relation_type_select, {}, :onchange => "setPredecessorFieldsVisibility();" %>
4 <%= l(:label_issue) %> #<%= f.text_field :issue_to_id, :size => 6 %>
5 <span id="predecessor_fields" style="display:none;">
6 <%= l(:field_delay) %>: <%= f.text_field :delay, :size => 3 %> <%= l(:label_day_plural) %>
7 </span>
8 <%= submit_tag l(:button_add) %></p>
9
10 <%= javascript_tag "setPredecessorFieldsVisibility();" %>
@@ -0,0 +1,22
1 <h3><%=l(:label_related_issues)%></h3>
2
3 <table style="width:100%">
4 <% @issue.relations.each do |relation| %>
5 <tr>
6 <td><%= l(relation.label_for(@issue)) %> <%= "(#{lwr(:actionview_datehelper_time_in_words_day, relation.delay)})" if relation.delay && relation.delay != 0 %> <%= link_to_issue relation.other_issue(@issue) %></td>
7 <td><%=h relation.other_issue(@issue).subject %></td>
8 <td><div class="square" style="background:#<%= relation.other_issue(@issue).status.html_color %>;"></div> <%= relation.other_issue(@issue).status.name %></td>
9 <td><%= format_date(relation.other_issue(@issue).start_date) %></td>
10 <td><%= format_date(relation.other_issue(@issue).due_date) %></td>
11 <td><%= link_to_remote image_tag('delete.png'), { :url => {:controller => 'issue_relations', :action => 'destroy', :issue_id => @issue, :id => relation},
12 :method => :post
13 }, :title => l(:label_relation_delete) %></td>
14 </tr>
15 <% end %>
16 </table>
17
18 <% if authorize_for('issue_relations', 'new') %>&nbsp;
19 <% remote_form_for(:relation, @relation, :url => {:controller => 'issue_relations', :action => 'new', :issue_id => @issue}, :method => :post) do |f| %>
20 <%= render :partial => 'issue_relations/form', :locals => {:f => f}%>
21 <% end %>
22 <% end %>
@@ -0,0 +1,14
1 class CreateIssueRelations < ActiveRecord::Migration
2 def self.up
3 create_table :issue_relations do |t|
4 t.column :issue_from_id, :integer, :null => false
5 t.column :issue_to_id, :integer, :null => false
6 t.column :relation_type, :string, :default => "", :null => false
7 t.column :delay, :integer
8 end
9 end
10
11 def self.down
12 drop_table :issue_relations
13 end
14 end
@@ -0,0 +1,11
1 class AddRelationsPermissions < ActiveRecord::Migration
2 def self.up
3 Permission.create :controller => "issue_relations", :action => "new", :description => "label_relation_new", :sort => 1080, :is_public => false, :mail_option => 0, :mail_enabled => 0
4 Permission.create :controller => "issue_relations", :action => "destroy", :description => "label_relation_delete", :sort => 1085, :is_public => false, :mail_option => 0, :mail_enabled => 0
5 end
6
7 def self.down
8 Permission.find_by_controller_and_action("issue_relations", "new").destroy
9 Permission.find_by_controller_and_action("issue_relations", "destroy").destroy
10 end
11 end
@@ -23,6 +23,8 class IssuesController < ApplicationController
23 include CustomFieldsHelper
23 include CustomFieldsHelper
24 helper :ifpdf
24 helper :ifpdf
25 include IfpdfHelper
25 include IfpdfHelper
26 helper :issue_relations
27 include IssueRelationsHelper
26
28
27 def show
29 def show
28 @status_options = @issue.status.find_new_statuses_allowed_to(logged_in_user.role_for_project(@project), @issue.tracker) if logged_in_user
30 @status_options = @issue.status.find_new_statuses_allowed_to(logged_in_user.role_for_project(@project), @issue.tracker) if logged_in_user
@@ -364,6 +364,9 class ProjectsController < ApplicationController
364 unless i.project_id == new_project.id
364 unless i.project_id == new_project.id
365 i.category = nil
365 i.category = nil
366 i.fixed_version = nil
366 i.fixed_version = nil
367 # delete issue relations
368 i.relations_from.clear
369 i.relations_to.clear
367 end
370 end
368 # move the issue
371 # move the issue
369 i.project = new_project
372 i.project = new_project
@@ -1,5 +1,5
1 # redMine - project management software
1 # redMine - project management software
2 # Copyright (C) 2006 Jean-Philippe Lang
2 # Copyright (C) 2006-2007 Jean-Philippe Lang
3 #
3 #
4 # This program is free software; you can redistribute it and/or
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
5 # modify it under the terms of the GNU General Public License
@@ -16,7 +16,6
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 class Issue < ActiveRecord::Base
18 class Issue < ActiveRecord::Base
19
20 belongs_to :project
19 belongs_to :project
21 belongs_to :tracker
20 belongs_to :tracker
22 belongs_to :status, :class_name => 'IssueStatus', :foreign_key => 'status_id'
21 belongs_to :status, :class_name => 'IssueStatus', :foreign_key => 'status_id'
@@ -33,6 +32,9 class Issue < ActiveRecord::Base
33 has_many :custom_fields, :through => :custom_values
32 has_many :custom_fields, :through => :custom_values
34 has_and_belongs_to_many :changesets, :order => "revision ASC"
33 has_and_belongs_to_many :changesets, :order => "revision ASC"
35
34
35 has_many :relations_from, :class_name => 'IssueRelation', :foreign_key => 'issue_from_id', :dependent => :delete_all
36 has_many :relations_to, :class_name => 'IssueRelation', :foreign_key => 'issue_to_id', :dependent => :delete_all
37
36 acts_as_watchable
38 acts_as_watchable
37
39
38 validates_presence_of :subject, :description, :priority, :tracker, :author, :status
40 validates_presence_of :subject, :description, :priority, :tracker, :author, :status
@@ -52,13 +54,13 class Issue < ActiveRecord::Base
52 if self.due_date and self.start_date and self.due_date < self.start_date
54 if self.due_date and self.start_date and self.due_date < self.start_date
53 errors.add :due_date, :activerecord_error_greater_than_start_date
55 errors.add :due_date, :activerecord_error_greater_than_start_date
54 end
56 end
57
58 if start_date && soonest_start && start_date < soonest_start
59 errors.add :start_date, :activerecord_error_invalid
60 end
55 end
61 end
56
57 #def before_create
58 # build_history
59 #end
60
62
61 def before_save
63 def before_save
62 if @current_journal
64 if @current_journal
63 # attributes changes
65 # attributes changes
64 (Issue.column_names - %w(id description)).each {|c|
66 (Issue.column_names - %w(id description)).each {|c|
@@ -78,6 +80,10 class Issue < ActiveRecord::Base
78 end
80 end
79 end
81 end
80
82
83 def after_save
84 relations_from.each(&:set_issue_to_dates)
85 end
86
81 def long_id
87 def long_id
82 "%05d" % self.id
88 "%05d" % self.id
83 end
89 end
@@ -98,12 +104,25 class Issue < ActiveRecord::Base
98 def spent_hours
104 def spent_hours
99 @spent_hours ||= time_entries.sum(:hours) || 0
105 @spent_hours ||= time_entries.sum(:hours) || 0
100 end
106 end
101
107
102 private
108 def relations
103 # Creates an history for the issue
109 (relations_from + relations_to).sort
104 #def build_history
110 end
105 # @history = self.histories.build
111
106 # @history.status = self.status
112 def all_dependent_issues
107 # @history.author = self.author
113 dependencies = []
108 #end
114 relations_from.each do |relation|
115 dependencies << relation.issue_to
116 dependencies += relation.issue_to.all_dependent_issues
117 end
118 dependencies
119 end
120
121 def duration
122 (start_date && due_date) ? due_date - start_date : 0
123 end
124
125 def soonest_start
126 @soonest_start ||= relations_to.collect{|relation| relation.successor_soonest_start}.compact.min
127 end
109 end
128 end
@@ -81,6 +81,12 end %>
81 &nbsp;
81 &nbsp;
82 </div>
82 </div>
83
83
84 <% if authorize_for('issue_relations', 'new') || @issue.relations.any? %>
85 <div id="relations" class="box">
86 <%= render :partial => 'relations' %>
87 </div>
88 <% end %>
89
84 <div id="history" class="box">
90 <div id="history" class="box">
85 <h3><%=l(:label_history)%>
91 <h3><%=l(:label_history)%>
86 <% if @journals_count > @journals.length %>(<%= l(:label_last_changes, @journals.length) %>)<% end %></h3>
92 <% if @journals_count > @journals.length %>(<%= l(:label_last_changes, @journals.length) %>)<% end %></h3>
@@ -15,6 +15,8 ActionController::Routing::Routes.draw do |map|
15 map.connect 'help/:ctrl/:page', :controller => 'help'
15 map.connect 'help/:ctrl/:page', :controller => 'help'
16 #map.connect ':controller/:action/:id/:sort_key/:sort_order'
16 #map.connect ':controller/:action/:id/:sort_key/:sort_order'
17
17
18 map.connect 'issues/:issue_id/relations/:action/:id', :controller => 'issue_relations'
19
18 # Allow downloading Web Service WSDL as a file with an extension
20 # Allow downloading Web Service WSDL as a file with an extension
19 # instead of a file named 'wsdl'
21 # instead of a file named 'wsdl'
20 map.connect ':controller/service.wsdl', :action => 'wsdl'
22 map.connect ':controller/service.wsdl', :action => 'wsdl'
@@ -33,6 +33,8 activerecord_error_taken: вече съществува
33 activerecord_error_not_a_number: не е число
33 activerecord_error_not_a_number: не е число
34 activerecord_error_not_a_date: е невалидна дата
34 activerecord_error_not_a_date: е невалидна дата
35 activerecord_error_greater_than_start_date: трябва да е след началната дата
35 activerecord_error_greater_than_start_date: трябва да е след началната дата
36 activerecord_error_not_same_project: doesn't belong to the same project
37 activerecord_error_circular_dependency: This relation would create a circular dependency
36
38
37 general_fmt_age: %d yr
39 general_fmt_age: %d yr
38 general_fmt_age_plural: %d yrs
40 general_fmt_age_plural: %d yrs
@@ -149,6 +151,8 field_activity: Дейност
149 field_spent_on: Дата
151 field_spent_on: Дата
150 field_identifier: Идентификатор
152 field_identifier: Идентификатор
151 field_is_filter: Използва се за филтър
153 field_is_filter: Използва се за филтър
154 field_issue_to_id: Related issue
155 field_delay: Delay
152
156
153 setting_app_title: Заглавие
157 setting_app_title: Заглавие
154 setting_app_subtitle: Описание
158 setting_app_subtitle: Описание
@@ -364,6 +368,18 label_watched_issues: Наблюдавани задачи
364 label_related_issues: Свързани задачи
368 label_related_issues: Свързани задачи
365 label_applied_status: Промени статуса на
369 label_applied_status: Промени статуса на
366 label_loading: Зареждане...
370 label_loading: Зареждане...
371 label_relation_new: New relation
372 label_relation_delete: Delete relation
373 label_relates_to: related tp
374 label_duplicates: duplicates
375 label_blocks: blocks
376 label_blocked_by: blocked by
377 label_precedes: precedes
378 label_follows: follows
379 label_end_to_start: start to end
380 label_end_to_end: end to end
381 label_start_to_start: start to start
382 label_start_to_end: start to end
367
383
368 button_login: Вход
384 button_login: Вход
369 button_submit: Изпращане
385 button_submit: Изпращане
@@ -33,6 +33,8 activerecord_error_taken: ist bereits vergeben
33 activerecord_error_not_a_number: ist keine Zahl
33 activerecord_error_not_a_number: ist keine Zahl
34 activerecord_error_not_a_date: ist kein gültiges Datum
34 activerecord_error_not_a_date: ist kein gültiges Datum
35 activerecord_error_greater_than_start_date: muss größer als Anfangsdatum sein
35 activerecord_error_greater_than_start_date: muss größer als Anfangsdatum sein
36 activerecord_error_not_same_project: doesn't belong to the same project
37 activerecord_error_circular_dependency: This relation would create a circular dependency
36
38
37 general_fmt_age: %d Jahr
39 general_fmt_age: %d Jahr
38 general_fmt_age_plural: %d Jahre
40 general_fmt_age_plural: %d Jahre
@@ -149,6 +151,8 field_activity: Aktivität
149 field_spent_on: Datum
151 field_spent_on: Datum
150 field_identifier: Identifier
152 field_identifier: Identifier
151 field_is_filter: Used as a filter
153 field_is_filter: Used as a filter
154 field_issue_to_id: Related issue
155 field_delay: Delay
152
156
153 setting_app_title: Applikation Titel
157 setting_app_title: Applikation Titel
154 setting_app_subtitle: Applikation Untertitel
158 setting_app_subtitle: Applikation Untertitel
@@ -364,6 +368,18 label_watched_issues: Watched issues
364 label_related_issues: Related issues
368 label_related_issues: Related issues
365 label_applied_status: Applied status
369 label_applied_status: Applied status
366 label_loading: Loading...
370 label_loading: Loading...
371 label_relation_new: New relation
372 label_relation_delete: Delete relation
373 label_relates_to: related tp
374 label_duplicates: duplicates
375 label_blocks: blocks
376 label_blocked_by: blocked by
377 label_precedes: precedes
378 label_follows: follows
379 label_end_to_start: start to end
380 label_end_to_end: end to end
381 label_start_to_start: start to start
382 label_start_to_end: start to end
367
383
368 button_login: Einloggen
384 button_login: Einloggen
369 button_submit: OK
385 button_submit: OK
@@ -33,6 +33,8 activerecord_error_taken: has already been taken
33 activerecord_error_not_a_number: is not a number
33 activerecord_error_not_a_number: is not a number
34 activerecord_error_not_a_date: is not a valid date
34 activerecord_error_not_a_date: is not a valid date
35 activerecord_error_greater_than_start_date: must be greater than start date
35 activerecord_error_greater_than_start_date: must be greater than start date
36 activerecord_error_not_same_project: doesn't belong to the same project
37 activerecord_error_circular_dependency: This relation would create a circular dependency
36
38
37 general_fmt_age: %d yr
39 general_fmt_age: %d yr
38 general_fmt_age_plural: %d yrs
40 general_fmt_age_plural: %d yrs
@@ -149,6 +151,8 field_activity: Activity
149 field_spent_on: Date
151 field_spent_on: Date
150 field_identifier: Identifier
152 field_identifier: Identifier
151 field_is_filter: Used as a filter
153 field_is_filter: Used as a filter
154 field_issue_to_id: Related issue
155 field_delay: Delay
152
156
153 setting_app_title: Application title
157 setting_app_title: Application title
154 setting_app_subtitle: Application subtitle
158 setting_app_subtitle: Application subtitle
@@ -364,6 +368,18 label_watched_issues: Watched issues
364 label_related_issues: Related issues
368 label_related_issues: Related issues
365 label_applied_status: Applied status
369 label_applied_status: Applied status
366 label_loading: Loading...
370 label_loading: Loading...
371 label_relation_new: New relation
372 label_relation_delete: Delete relation
373 label_relates_to: related tp
374 label_duplicates: duplicates
375 label_blocks: blocks
376 label_blocked_by: blocked by
377 label_precedes: precedes
378 label_follows: follows
379 label_end_to_start: start to end
380 label_end_to_end: end to end
381 label_start_to_start: start to start
382 label_start_to_end: start to end
367
383
368 button_login: Login
384 button_login: Login
369 button_submit: Submit
385 button_submit: Submit
@@ -33,6 +33,8 activerecord_error_taken: has already been taken
33 activerecord_error_not_a_number: is not a number
33 activerecord_error_not_a_number: is not a number
34 activerecord_error_not_a_date: no es una fecha válida
34 activerecord_error_not_a_date: no es una fecha válida
35 activerecord_error_greater_than_start_date: debe ser la fecha mayor que del comienzo
35 activerecord_error_greater_than_start_date: debe ser la fecha mayor que del comienzo
36 activerecord_error_not_same_project: doesn't belong to the same project
37 activerecord_error_circular_dependency: This relation would create a circular dependency
36
38
37 general_fmt_age: %d año
39 general_fmt_age: %d año
38 general_fmt_age_plural: %d años
40 general_fmt_age_plural: %d años
@@ -149,6 +151,8 field_activity: Activity
149 field_spent_on: Fecha
151 field_spent_on: Fecha
150 field_identifier: Identifier
152 field_identifier: Identifier
151 field_is_filter: Used as a filter
153 field_is_filter: Used as a filter
154 field_issue_to_id: Related issue
155 field_delay: Delay
152
156
153 setting_app_title: Título del aplicación
157 setting_app_title: Título del aplicación
154 setting_app_subtitle: Subtítulo del aplicación
158 setting_app_subtitle: Subtítulo del aplicación
@@ -364,6 +368,18 label_watched_issues: Watched issues
364 label_related_issues: Related issues
368 label_related_issues: Related issues
365 label_applied_status: Applied status
369 label_applied_status: Applied status
366 label_loading: Loading...
370 label_loading: Loading...
371 label_relation_new: New relation
372 label_relation_delete: Delete relation
373 label_relates_to: related tp
374 label_duplicates: duplicates
375 label_blocks: blocks
376 label_blocked_by: blocked by
377 label_precedes: precedes
378 label_follows: follows
379 label_end_to_start: start to end
380 label_end_to_end: end to end
381 label_start_to_start: start to start
382 label_start_to_end: start to end
367
383
368 button_login: Conexión
384 button_login: Conexión
369 button_submit: Someter
385 button_submit: Someter
@@ -1,4 +1,4
1 _gloc_rule_default: '|n| n<=1 ? "" : "_plural" '
1 _gloc_rule_default: '|n| n==1 ? "" : "_plural" '
2
2
3 actionview_datehelper_select_day_prefix:
3 actionview_datehelper_select_day_prefix:
4 actionview_datehelper_select_month_names: Janvier,Février,Mars,Avril,Mai,Juin,Juillet,Août,Septembre,Octobre,Novembre,Décembre
4 actionview_datehelper_select_month_names: Janvier,Février,Mars,Avril,Mai,Juin,Juillet,Août,Septembre,Octobre,Novembre,Décembre
@@ -33,6 +33,8 activerecord_error_taken: est déjà utilisé
33 activerecord_error_not_a_number: n'est pas un nombre
33 activerecord_error_not_a_number: n'est pas un nombre
34 activerecord_error_not_a_date: n'est pas une date valide
34 activerecord_error_not_a_date: n'est pas une date valide
35 activerecord_error_greater_than_start_date: doit être postérieur à la date de début
35 activerecord_error_greater_than_start_date: doit être postérieur à la date de début
36 activerecord_error_not_same_project: n'appartient pas au même projet
37 activerecord_error_circular_dependency: Cette relation créerait une dépendance circulaire
36
38
37 general_fmt_age: %d an
39 general_fmt_age: %d an
38 general_fmt_age_plural: %d ans
40 general_fmt_age_plural: %d ans
@@ -149,6 +151,8 field_activity: Activité
149 field_spent_on: Date
151 field_spent_on: Date
150 field_identifier: Identifiant
152 field_identifier: Identifiant
151 field_is_filter: Utilisé comme filtre
153 field_is_filter: Utilisé comme filtre
154 field_issue_to_id: Demande liée
155 field_delay: Retard
152
156
153 setting_app_title: Titre de l'application
157 setting_app_title: Titre de l'application
154 setting_app_subtitle: Sous-titre de l'application
158 setting_app_subtitle: Sous-titre de l'application
@@ -364,6 +368,18 label_watched_issues: Demandes surveillées
364 label_related_issues: Demandes liées
368 label_related_issues: Demandes liées
365 label_applied_status: Statut appliqué
369 label_applied_status: Statut appliqué
366 label_loading: Chargement...
370 label_loading: Chargement...
371 label_relation_new: Nouvelle relation
372 label_relation_delete: Supprimer la relation
373 label_relates_to: lié à
374 label_duplicates: doublon de
375 label_blocks: bloque
376 label_blocked_by: bloqué par
377 label_precedes: précède
378 label_follows: suit
379 label_end_to_start: début à fin
380 label_end_to_end: fin à fin
381 label_start_to_start: début à début
382 label_start_to_end: début à fin
367
383
368 button_login: Connexion
384 button_login: Connexion
369 button_submit: Soumettre
385 button_submit: Soumettre
@@ -33,6 +33,8 activerecord_error_taken: e' gia' stato/a preso/a
33 activerecord_error_not_a_number: non e' un numero
33 activerecord_error_not_a_number: non e' un numero
34 activerecord_error_not_a_date: non e' una data valida
34 activerecord_error_not_a_date: non e' una data valida
35 activerecord_error_greater_than_start_date: deve essere maggiore della data di partenza
35 activerecord_error_greater_than_start_date: deve essere maggiore della data di partenza
36 activerecord_error_not_same_project: doesn't belong to the same project
37 activerecord_error_circular_dependency: This relation would create a circular dependency
36
38
37 general_fmt_age: %d yr
39 general_fmt_age: %d yr
38 general_fmt_age_plural: %d yrs
40 general_fmt_age_plural: %d yrs
@@ -149,6 +151,8 field_activity: Activity
149 field_spent_on: Data
151 field_spent_on: Data
150 field_identifier: Identifier
152 field_identifier: Identifier
151 field_is_filter: Used as a filter
153 field_is_filter: Used as a filter
154 field_issue_to_id: Related issue
155 field_delay: Delay
152
156
153 setting_app_title: Titolo applicazione
157 setting_app_title: Titolo applicazione
154 setting_app_subtitle: Sottotitolo applicazione
158 setting_app_subtitle: Sottotitolo applicazione
@@ -364,6 +368,18 label_watched_issues: Watched issues
364 label_related_issues: Related issues
368 label_related_issues: Related issues
365 label_applied_status: Applied status
369 label_applied_status: Applied status
366 label_loading: Loading...
370 label_loading: Loading...
371 label_relation_new: New relation
372 label_relation_delete: Delete relation
373 label_relates_to: related tp
374 label_duplicates: duplicates
375 label_blocks: blocks
376 label_blocked_by: blocked by
377 label_precedes: precedes
378 label_follows: follows
379 label_end_to_start: start to end
380 label_end_to_end: end to end
381 label_start_to_start: start to start
382 label_start_to_end: start to end
367
383
368 button_login: Login
384 button_login: Login
369 button_submit: Invia
385 button_submit: Invia
@@ -34,6 +34,8 activerecord_error_taken: はすでに登録されています
34 activerecord_error_not_a_number: が数字ではありません
34 activerecord_error_not_a_number: が数字ではありません
35 activerecord_error_not_a_date: の日付が間違っています
35 activerecord_error_not_a_date: の日付が間違っています
36 activerecord_error_greater_than_start_date: を開始日より後にしてください
36 activerecord_error_greater_than_start_date: を開始日より後にしてください
37 activerecord_error_not_same_project: doesn't belong to the same project
38 activerecord_error_circular_dependency: This relation would create a circular dependency
37
39
38 general_fmt_age: %d歳
40 general_fmt_age: %d歳
39 general_fmt_age_plural: %d歳
41 general_fmt_age_plural: %d歳
@@ -150,6 +152,8 field_activity: 活動
150 field_spent_on: 日付
152 field_spent_on: 日付
151 field_identifier: 識別子
153 field_identifier: 識別子
152 field_is_filter: Used as a filter
154 field_is_filter: Used as a filter
155 field_issue_to_id: Related issue
156 field_delay: Delay
153
157
154 setting_app_title: アプリケーションのタイトル
158 setting_app_title: アプリケーションのタイトル
155 setting_app_subtitle: アプリケーションのサブタイトル
159 setting_app_subtitle: アプリケーションのサブタイトル
@@ -365,6 +369,18 label_watched_issues: Watched issues
365 label_related_issues: Related issues
369 label_related_issues: Related issues
366 label_applied_status: Applied status
370 label_applied_status: Applied status
367 label_loading: Loading...
371 label_loading: Loading...
372 label_relation_new: New relation
373 label_relation_delete: Delete relation
374 label_relates_to: related tp
375 label_duplicates: duplicates
376 label_blocks: blocks
377 label_blocked_by: blocked by
378 label_precedes: precedes
379 label_follows: follows
380 label_end_to_start: start to end
381 label_end_to_end: end to end
382 label_start_to_start: start to start
383 label_start_to_end: start to end
368
384
369 button_login: ログイン
385 button_login: ログイン
370 button_submit: 変更
386 button_submit: 変更
@@ -33,6 +33,8 activerecord_error_taken: ja esta examinado
33 activerecord_error_not_a_number: nao e um numero
33 activerecord_error_not_a_number: nao e um numero
34 activerecord_error_not_a_date: nao e uma data valida
34 activerecord_error_not_a_date: nao e uma data valida
35 activerecord_error_greater_than_start_date: deve ser maior que a data inicial
35 activerecord_error_greater_than_start_date: deve ser maior que a data inicial
36 activerecord_error_not_same_project: doesn't belong to the same project
37 activerecord_error_circular_dependency: This relation would create a circular dependency
36
38
37 general_fmt_age: %d yr
39 general_fmt_age: %d yr
38 general_fmt_age_plural: %d yrs
40 general_fmt_age_plural: %d yrs
@@ -149,6 +151,8 field_activity: Atividade
149 field_spent_on: Data
151 field_spent_on: Data
150 field_identifier: Identificador
152 field_identifier: Identificador
151 field_is_filter: Used as a filter
153 field_is_filter: Used as a filter
154 field_issue_to_id: Related issue
155 field_delay: Delay
152
156
153 setting_app_title: Titulo da aplicacao
157 setting_app_title: Titulo da aplicacao
154 setting_app_subtitle: Sub-titulo da aplicacao
158 setting_app_subtitle: Sub-titulo da aplicacao
@@ -364,6 +368,18 label_watched_issues: Watched issues
364 label_related_issues: Related issues
368 label_related_issues: Related issues
365 label_applied_status: Applied status
369 label_applied_status: Applied status
366 label_loading: Loading...
370 label_loading: Loading...
371 label_relation_new: New relation
372 label_relation_delete: Delete relation
373 label_relates_to: related tp
374 label_duplicates: duplicates
375 label_blocks: blocks
376 label_blocked_by: blocked by
377 label_precedes: precedes
378 label_follows: follows
379 label_end_to_start: start to end
380 label_end_to_end: end to end
381 label_start_to_start: start to start
382 label_start_to_end: start to end
367
383
368 button_login: Login
384 button_login: Login
369 button_submit: Enviar
385 button_submit: Enviar
@@ -36,6 +36,8 activerecord_error_taken: has already been taken
36 activerecord_error_not_a_number: 不是数字
36 activerecord_error_not_a_number: 不是数字
37 activerecord_error_not_a_date: 不是有效的日期
37 activerecord_error_not_a_date: 不是有效的日期
38 activerecord_error_greater_than_start_date: 必需大于开始日期
38 activerecord_error_greater_than_start_date: 必需大于开始日期
39 activerecord_error_not_same_project: doesn't belong to the same project
40 activerecord_error_circular_dependency: This relation would create a circular dependency
39
41
40 general_fmt_age: %d yr
42 general_fmt_age: %d yr
41 general_fmt_age_plural: %d yrs
43 general_fmt_age_plural: %d yrs
@@ -152,6 +154,8 field_activity: 活动
152 field_spent_on: 日期
154 field_spent_on: 日期
153 field_identifier: Identifier
155 field_identifier: Identifier
154 field_is_filter: Used as a filter
156 field_is_filter: Used as a filter
157 field_issue_to_id: Related issue
158 field_delay: Delay
155
159
156 setting_app_title: 应用程序标题
160 setting_app_title: 应用程序标题
157 setting_app_subtitle: 应用程序子标题
161 setting_app_subtitle: 应用程序子标题
@@ -367,6 +371,18 label_watched_issues: Watched issues
367 label_related_issues: Related issues
371 label_related_issues: Related issues
368 label_applied_status: Applied status
372 label_applied_status: Applied status
369 label_loading: Loading...
373 label_loading: Loading...
374 label_relation_new: New relation
375 label_relation_delete: Delete relation
376 label_relates_to: related tp
377 label_duplicates: duplicates
378 label_blocks: blocks
379 label_blocked_by: blocked by
380 label_precedes: precedes
381 label_follows: follows
382 label_end_to_start: start to end
383 label_end_to_end: end to end
384 label_start_to_start: start to start
385 label_start_to_end: start to end
370
386
371 button_login: 登录
387 button_login: 登录
372 button_submit: 提交
388 button_submit: 提交
@@ -32,6 +32,15 function showTab(name) {
32 return false;
32 return false;
33 }
33 }
34
34
35 function setPredecessorFieldsVisibility() {
36 relationType = $('relation_relation_type');
37 if (relationType && relationType.value == "precedes") {
38 Element.show('predecessor_fields');
39 } else {
40 Element.hide('predecessor_fields');
41 }
42 }
43
35 /* shows and hides ajax indicator */
44 /* shows and hides ajax indicator */
36 Ajax.Responders.register({
45 Ajax.Responders.register({
37 onCreate: function(){
46 onCreate: function(){
General Comments 0
You need to be logged in to leave comments. Login now