@@ -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 | 23 | include CustomFieldsHelper |
|
24 | 24 | helper :ifpdf |
|
25 | 25 | include IfpdfHelper |
|
26 | helper :issue_relations | |
|
27 | include IssueRelationsHelper | |
|
26 | 28 | |
|
27 | 29 | def show |
|
28 | 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 | 364 | unless i.project_id == new_project.id |
|
365 | 365 | i.category = nil |
|
366 | 366 | i.fixed_version = nil |
|
367 | # delete issue relations | |
|
368 | i.relations_from.clear | |
|
369 | i.relations_to.clear | |
|
367 | 370 | end |
|
368 | 371 | # move the issue |
|
369 | 372 | i.project = new_project |
@@ -1,5 +1,5 | |||
|
1 | 1 | # redMine - project management software |
|
2 | # Copyright (C) 2006 Jean-Philippe Lang | |
|
2 | # Copyright (C) 2006-2007 Jean-Philippe Lang | |
|
3 | 3 | # |
|
4 | 4 | # This program is free software; you can redistribute it and/or |
|
5 | 5 | # modify it under the terms of the GNU General Public License |
@@ -16,7 +16,6 | |||
|
16 | 16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
17 | 17 | |
|
18 | 18 | class Issue < ActiveRecord::Base |
|
19 | ||
|
20 | 19 | belongs_to :project |
|
21 | 20 | belongs_to :tracker |
|
22 | 21 | belongs_to :status, :class_name => 'IssueStatus', :foreign_key => 'status_id' |
@@ -33,6 +32,9 class Issue < ActiveRecord::Base | |||
|
33 | 32 | has_many :custom_fields, :through => :custom_values |
|
34 | 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 | 38 | acts_as_watchable |
|
37 | 39 | |
|
38 | 40 | validates_presence_of :subject, :description, :priority, :tracker, :author, :status |
@@ -52,13 +54,13 class Issue < ActiveRecord::Base | |||
|
52 | 54 | if self.due_date and self.start_date and self.due_date < self.start_date |
|
53 | 55 | errors.add :due_date, :activerecord_error_greater_than_start_date |
|
54 | 56 | end |
|
57 | ||
|
58 | if start_date && soonest_start && start_date < soonest_start | |
|
59 | errors.add :start_date, :activerecord_error_invalid | |
|
60 | end | |
|
55 | 61 | end |
|
56 | ||
|
57 | #def before_create | |
|
58 | # build_history | |
|
59 | #end | |
|
60 | 62 | |
|
61 | def before_save | |
|
63 | def before_save | |
|
62 | 64 | if @current_journal |
|
63 | 65 | # attributes changes |
|
64 | 66 | (Issue.column_names - %w(id description)).each {|c| |
@@ -78,6 +80,10 class Issue < ActiveRecord::Base | |||
|
78 | 80 | end |
|
79 | 81 | end |
|
80 | 82 | |
|
83 | def after_save | |
|
84 | relations_from.each(&:set_issue_to_dates) | |
|
85 | end | |
|
86 | ||
|
81 | 87 | def long_id |
|
82 | 88 | "%05d" % self.id |
|
83 | 89 | end |
@@ -98,12 +104,25 class Issue < ActiveRecord::Base | |||
|
98 | 104 | def spent_hours |
|
99 | 105 | @spent_hours ||= time_entries.sum(:hours) || 0 |
|
100 | 106 | end |
|
101 | ||
|
102 | private | |
|
103 | # Creates an history for the issue | |
|
104 | #def build_history | |
|
105 | # @history = self.histories.build | |
|
106 | # @history.status = self.status | |
|
107 | # @history.author = self.author | |
|
108 | #end | |
|
107 | ||
|
108 | def relations | |
|
109 | (relations_from + relations_to).sort | |
|
110 | end | |
|
111 | ||
|
112 | def all_dependent_issues | |
|
113 | dependencies = [] | |
|
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 | 128 | end |
@@ -81,6 +81,12 end %> | |||
|
81 | 81 | |
|
82 | 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 | 90 | <div id="history" class="box"> |
|
85 | 91 | <h3><%=l(:label_history)%> |
|
86 | 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 | 15 | map.connect 'help/:ctrl/:page', :controller => 'help' |
|
16 | 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 | 20 | # Allow downloading Web Service WSDL as a file with an extension |
|
19 | 21 | # instead of a file named 'wsdl' |
|
20 | 22 | map.connect ':controller/service.wsdl', :action => 'wsdl' |
@@ -33,6 +33,8 activerecord_error_taken: вече съществува | |||
|
33 | 33 | activerecord_error_not_a_number: не е число |
|
34 | 34 | activerecord_error_not_a_date: е невалидна дата |
|
35 | 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 | 39 | general_fmt_age: %d yr |
|
38 | 40 | general_fmt_age_plural: %d yrs |
@@ -149,6 +151,8 field_activity: Дейност | |||
|
149 | 151 | field_spent_on: Дата |
|
150 | 152 | field_identifier: Идентификатор |
|
151 | 153 | field_is_filter: Използва се за филтър |
|
154 | field_issue_to_id: Related issue | |
|
155 | field_delay: Delay | |
|
152 | 156 | |
|
153 | 157 | setting_app_title: Заглавие |
|
154 | 158 | setting_app_subtitle: Описание |
@@ -364,6 +368,18 label_watched_issues: Наблюдавани задачи | |||
|
364 | 368 | label_related_issues: Свързани задачи |
|
365 | 369 | label_applied_status: Промени статуса на |
|
366 | 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 | 384 | button_login: Вход |
|
369 | 385 | button_submit: Изпращане |
@@ -33,6 +33,8 activerecord_error_taken: ist bereits vergeben | |||
|
33 | 33 | activerecord_error_not_a_number: ist keine Zahl |
|
34 | 34 | activerecord_error_not_a_date: ist kein gültiges Datum |
|
35 | 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 | 39 | general_fmt_age: %d Jahr |
|
38 | 40 | general_fmt_age_plural: %d Jahre |
@@ -149,6 +151,8 field_activity: Aktivität | |||
|
149 | 151 | field_spent_on: Datum |
|
150 | 152 | field_identifier: Identifier |
|
151 | 153 | field_is_filter: Used as a filter |
|
154 | field_issue_to_id: Related issue | |
|
155 | field_delay: Delay | |
|
152 | 156 | |
|
153 | 157 | setting_app_title: Applikation Titel |
|
154 | 158 | setting_app_subtitle: Applikation Untertitel |
@@ -364,6 +368,18 label_watched_issues: Watched issues | |||
|
364 | 368 | label_related_issues: Related issues |
|
365 | 369 | label_applied_status: Applied status |
|
366 | 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 | 384 | button_login: Einloggen |
|
369 | 385 | button_submit: OK |
@@ -33,6 +33,8 activerecord_error_taken: has already been taken | |||
|
33 | 33 | activerecord_error_not_a_number: is not a number |
|
34 | 34 | activerecord_error_not_a_date: is not a valid date |
|
35 | 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 | 39 | general_fmt_age: %d yr |
|
38 | 40 | general_fmt_age_plural: %d yrs |
@@ -149,6 +151,8 field_activity: Activity | |||
|
149 | 151 | field_spent_on: Date |
|
150 | 152 | field_identifier: Identifier |
|
151 | 153 | field_is_filter: Used as a filter |
|
154 | field_issue_to_id: Related issue | |
|
155 | field_delay: Delay | |
|
152 | 156 | |
|
153 | 157 | setting_app_title: Application title |
|
154 | 158 | setting_app_subtitle: Application subtitle |
@@ -364,6 +368,18 label_watched_issues: Watched issues | |||
|
364 | 368 | label_related_issues: Related issues |
|
365 | 369 | label_applied_status: Applied status |
|
366 | 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 | 384 | button_login: Login |
|
369 | 385 | button_submit: Submit |
@@ -33,6 +33,8 activerecord_error_taken: has already been taken | |||
|
33 | 33 | activerecord_error_not_a_number: is not a number |
|
34 | 34 | activerecord_error_not_a_date: no es una fecha válida |
|
35 | 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 | 39 | general_fmt_age: %d año |
|
38 | 40 | general_fmt_age_plural: %d años |
@@ -149,6 +151,8 field_activity: Activity | |||
|
149 | 151 | field_spent_on: Fecha |
|
150 | 152 | field_identifier: Identifier |
|
151 | 153 | field_is_filter: Used as a filter |
|
154 | field_issue_to_id: Related issue | |
|
155 | field_delay: Delay | |
|
152 | 156 | |
|
153 | 157 | setting_app_title: Título del aplicación |
|
154 | 158 | setting_app_subtitle: Subtítulo del aplicación |
@@ -364,6 +368,18 label_watched_issues: Watched issues | |||
|
364 | 368 | label_related_issues: Related issues |
|
365 | 369 | label_applied_status: Applied status |
|
366 | 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 | 384 | button_login: Conexión |
|
369 | 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 | 3 | actionview_datehelper_select_day_prefix: |
|
4 | 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 | 33 | activerecord_error_not_a_number: n'est pas un nombre |
|
34 | 34 | activerecord_error_not_a_date: n'est pas une date valide |
|
35 | 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 | 39 | general_fmt_age: %d an |
|
38 | 40 | general_fmt_age_plural: %d ans |
@@ -149,6 +151,8 field_activity: Activité | |||
|
149 | 151 | field_spent_on: Date |
|
150 | 152 | field_identifier: Identifiant |
|
151 | 153 | field_is_filter: Utilisé comme filtre |
|
154 | field_issue_to_id: Demande liée | |
|
155 | field_delay: Retard | |
|
152 | 156 | |
|
153 | 157 | setting_app_title: Titre de l'application |
|
154 | 158 | setting_app_subtitle: Sous-titre de l'application |
@@ -364,6 +368,18 label_watched_issues: Demandes surveillées | |||
|
364 | 368 | label_related_issues: Demandes liées |
|
365 | 369 | label_applied_status: Statut appliqué |
|
366 | 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 | 384 | button_login: Connexion |
|
369 | 385 | button_submit: Soumettre |
@@ -33,6 +33,8 activerecord_error_taken: e' gia' stato/a preso/a | |||
|
33 | 33 | activerecord_error_not_a_number: non e' un numero |
|
34 | 34 | activerecord_error_not_a_date: non e' una data valida |
|
35 | 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 | 39 | general_fmt_age: %d yr |
|
38 | 40 | general_fmt_age_plural: %d yrs |
@@ -149,6 +151,8 field_activity: Activity | |||
|
149 | 151 | field_spent_on: Data |
|
150 | 152 | field_identifier: Identifier |
|
151 | 153 | field_is_filter: Used as a filter |
|
154 | field_issue_to_id: Related issue | |
|
155 | field_delay: Delay | |
|
152 | 156 | |
|
153 | 157 | setting_app_title: Titolo applicazione |
|
154 | 158 | setting_app_subtitle: Sottotitolo applicazione |
@@ -364,6 +368,18 label_watched_issues: Watched issues | |||
|
364 | 368 | label_related_issues: Related issues |
|
365 | 369 | label_applied_status: Applied status |
|
366 | 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 | 384 | button_login: Login |
|
369 | 385 | button_submit: Invia |
@@ -34,6 +34,8 activerecord_error_taken: はすでに登録されています | |||
|
34 | 34 | activerecord_error_not_a_number: が数字ではありません |
|
35 | 35 | activerecord_error_not_a_date: の日付が間違っています |
|
36 | 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 | 40 | general_fmt_age: %d歳 |
|
39 | 41 | general_fmt_age_plural: %d歳 |
@@ -150,6 +152,8 field_activity: 活動 | |||
|
150 | 152 | field_spent_on: 日付 |
|
151 | 153 | field_identifier: 識別子 |
|
152 | 154 | field_is_filter: Used as a filter |
|
155 | field_issue_to_id: Related issue | |
|
156 | field_delay: Delay | |
|
153 | 157 | |
|
154 | 158 | setting_app_title: アプリケーションのタイトル |
|
155 | 159 | setting_app_subtitle: アプリケーションのサブタイトル |
@@ -365,6 +369,18 label_watched_issues: Watched issues | |||
|
365 | 369 | label_related_issues: Related issues |
|
366 | 370 | label_applied_status: Applied status |
|
367 | 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 | 385 | button_login: ログイン |
|
370 | 386 | button_submit: 変更 |
@@ -33,6 +33,8 activerecord_error_taken: ja esta examinado | |||
|
33 | 33 | activerecord_error_not_a_number: nao e um numero |
|
34 | 34 | activerecord_error_not_a_date: nao e uma data valida |
|
35 | 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 | 39 | general_fmt_age: %d yr |
|
38 | 40 | general_fmt_age_plural: %d yrs |
@@ -149,6 +151,8 field_activity: Atividade | |||
|
149 | 151 | field_spent_on: Data |
|
150 | 152 | field_identifier: Identificador |
|
151 | 153 | field_is_filter: Used as a filter |
|
154 | field_issue_to_id: Related issue | |
|
155 | field_delay: Delay | |
|
152 | 156 | |
|
153 | 157 | setting_app_title: Titulo da aplicacao |
|
154 | 158 | setting_app_subtitle: Sub-titulo da aplicacao |
@@ -364,6 +368,18 label_watched_issues: Watched issues | |||
|
364 | 368 | label_related_issues: Related issues |
|
365 | 369 | label_applied_status: Applied status |
|
366 | 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 | 384 | button_login: Login |
|
369 | 385 | button_submit: Enviar |
@@ -36,6 +36,8 activerecord_error_taken: has already been taken | |||
|
36 | 36 | activerecord_error_not_a_number: 不是数字 |
|
37 | 37 | activerecord_error_not_a_date: 不是有效的日期 |
|
38 | 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 | 42 | general_fmt_age: %d yr |
|
41 | 43 | general_fmt_age_plural: %d yrs |
@@ -152,6 +154,8 field_activity: 活动 | |||
|
152 | 154 | field_spent_on: 日期 |
|
153 | 155 | field_identifier: Identifier |
|
154 | 156 | field_is_filter: Used as a filter |
|
157 | field_issue_to_id: Related issue | |
|
158 | field_delay: Delay | |
|
155 | 159 | |
|
156 | 160 | setting_app_title: 应用程序标题 |
|
157 | 161 | setting_app_subtitle: 应用程序子标题 |
@@ -367,6 +371,18 label_watched_issues: Watched issues | |||
|
367 | 371 | label_related_issues: Related issues |
|
368 | 372 | label_applied_status: Applied status |
|
369 | 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 | 387 | button_login: 登录 |
|
372 | 388 | button_submit: 提交 |
@@ -32,6 +32,15 function showTab(name) { | |||
|
32 | 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 | 44 | /* shows and hides ajax indicator */ |
|
36 | 45 | Ajax.Responders.register({ |
|
37 | 46 | onCreate: function(){ |
General Comments 0
You need to be logged in to leave comments.
Login now