@@ -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') %> | |||
|
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 | |
|
81 | | |
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 | _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