Patch #756 » redmine-trunk.diff
| app/helpers/projects_helper.rb (working copy) | ||
|---|---|---|
| 16 | 16 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | 
| 17 | 17 | |
| 18 | 18 | module ProjectsHelper | 
| 19 | include IssuesHelper | |
| 19 | 20 |   def link_to_version(version, options = {}) | 
| 20 | 21 | return '' unless version && version.is_a?(Version) | 
| 21 | 22 |     link_to version.name, {:controller => 'projects', | 
| ... | ... | |
| 152 | 153 |     gc.stroke('transparent') | 
| 153 | 154 | events.each do |i| | 
| 154 | 155 | if i.is_a?(Issue) | 
| 155 |         i_start_date = (i.start_date >= date_from ? i.start_date : date_from ) | |
| 156 |         i_end_date = (i.due_date <= date_to ? i.due_date : date_to )         | |
| 157 |         i_done_date = i.start_date + ((i.due_date - i.start_date+1)*i.done_ratio/100).floor | |
| 156 |         i_start_date = (i.total('start_date') >= date_from ? i.total('start_date') : date_from ) | |
| 157 |         i_end_date = (i.total('due_date') <= date_to ? i.total('due_date') : date_to )         | |
| 158 |         i_done_date = i.total('start_date') + i.total('actual_days') | |
| 158 | 159 | i_done_date = (i_done_date <= date_from ? date_from : i_done_date ) | 
| 159 | 160 | i_done_date = (i_done_date >= date_to ? date_to : i_done_date ) | 
| 160 | 161 | i_late_date = [i_end_date, Date.today].min if i_start_date < Date.today | 
| ... | ... | |
| 171 | 172 |         gc.fill('blue') | 
| 172 | 173 | gc.rectangle(i_left, top, i_left + d_width, top - 6) if d_width > 0 | 
| 173 | 174 |         gc.fill('black') | 
| 174 |         gc.text(i_left + i_width + 5,top + 1, "#{i.status.name} #{i.done_ratio}%") | |
| 175 |         gc.text(i_left + i_width + 5,top + 1, "#{i.total('status').name} #{i.total('done_ratio')}%") | |
| 175 | 176 | else | 
| 176 | 177 | i_left = subject_width + ((i.start_date - date_from)*zoom).floor | 
| 177 | 178 |         gc.fill('green') | 
| app/helpers/issues_helper.rb (working copy) | ||
|---|---|---|
| 27 | 27 | @cached_label_priority ||= l(:field_priority) | 
| 28 | 28 |  | 
| 29 | 29 |     link_to_issue(issue) + ": #{h(issue.subject)}<br /><br />" + | 
| 30 |       "<strong>#{@cached_label_start_date}</strong>: #{format_date(issue.start_date)}<br />" + | |
| 31 |       "<strong>#{@cached_label_due_date}</strong>: #{format_date(issue.due_date)}<br />" + | |
| 30 |       "<strong>#{@cached_label_start_date}</strong>: #{format_date(issue.total('start_date'))}<br />" + | |
| 31 |       "<strong>#{@cached_label_due_date}</strong>: #{format_date(issue.total('due_date'))}<br />" + | |
| 32 | 32 |       "<strong>#{@cached_label_assigned_to}</strong>: #{issue.assigned_to}<br />" + | 
| 33 |       "<strong>#{@cached_label_priority}</strong>: #{issue.priority.name}" | |
| 33 |       "<strong>#{@cached_label_priority}</strong>: #{issue.total('priority').name}" | |
| 34 | 34 | end | 
| 35 | 35 | |
| 36 | 36 | def show_detail(detail, no_html=false) | 
| ... | ... | |
| 104 | 104 | end | 
| 105 | 105 | end | 
| 106 | 106 | end | 
| 107 |  | |
| 108 | def linklist_add_child(elements, no_my, no_child) | |
| 109 | if elements[no_my]["child"] == -1 #edge | |
| 110 | elements[no_my]["child"] = no_child | |
| 111 |  | |
| 112 | elements[no_child]["parent"] = no_my | |
| 113 | my_previous = elements[no_my]["previous"] | |
| 114 | my_next = elements[no_my]["next"] | |
| 115 | child_previous = elements[no_child]["previous"] | |
| 116 | child_next = elements[no_child]["next"] | |
| 117 | elements[no_my]["previous"] = child_previous | |
| 118 | elements[no_my]["next"] = child_next | |
| 119 | elements[child_previous]["next"] = no_my if child_previous != -1 | |
| 120 | elements[child_next]["previous"] = no_my if child_next != -1 | |
| 121 | elements[my_previous]["next"] = my_next if my_previous != -1 | |
| 122 | elements[my_next]["previous"] = my_previous if my_next != -1 | |
| 123 | elements[no_child]["previous"] = -1 | |
| 124 | elements[no_child]["next"] = -1 | |
| 125 | else | |
| 126 | no_element = elements[no_my]["child"] | |
| 127 | while elements[no_element]["next"] != -1 #until last | |
| 128 | no_element = elements[no_element]["next"] | |
| 129 | end | |
| 130 | elements[no_element]["next"] = no_child | |
| 131 |  | |
| 132 | elements[no_child]["parent"] = no_my | |
| 133 | child_previous = elements[no_child]["previous"] | |
| 134 | child_next = elements[no_child]["next"] | |
| 135 | elements[child_previous]["next"] = child_next if child_previous != -1 | |
| 136 | elements[child_next]["previous"] = child_previous if child_next != -1 | |
| 137 | elements[no_child]["previous"] = no_element | |
| 138 | elements[no_child]["next"] = -1 | |
| 139 | end | |
| 140 |  | |
| 141 | elements | |
| 142 | end | |
| 143 |  | |
| 144 | def make_outline(elements, outline_level, no_my) | |
| 145 | no_next = no_my | |
| 146 | while no_next != -1 | |
| 147 | elements[0]["no"] += 1 | |
| 148 | elements[no_next]["no"] = elements[0]["no"] | |
| 149 | elements[no_next]["issue"].outline_level(outline_level) | |
| 150 | if elements[no_next]["child"] != -1 | |
| 151 | elements = make_outline(elements, outline_level+1, elements[no_next]["child"]) | |
| 152 | end | |
| 153 | no_next = elements[no_next]["next"] | |
| 154 | end | |
| 155 | elements | |
| 156 | end | |
| 107 | 157 |  | 
| 158 | def issues_to_outlines(issues) | |
| 159 | no_used = 0 | |
| 160 | outlines = [] | |
| 161 |     outlines << {"no"=>0,"previous"=>-1,"next"=>-1,"parent"=>-1,"child"=>-1} | |
| 162 | # add edges | |
| 163 | issues.each do |issue| | |
| 164 | unless issue.childs && issue.childs.size > 0 | |
| 165 | outlines[no_used]["next"] = no_used + 1 | |
| 166 |         outlines << {"no"=>0,"previous"=>no_used,"next"=>-1,"parent"=>-1,"child"=>-1,"issue"=>issue} | |
| 167 | no_used += 1 | |
| 168 | end | |
| 169 | end | |
| 170 | # add non edges | |
| 171 | issues.each do |issue| | |
| 172 | if issue.childs && issue.childs.size > 0 | |
| 173 | outlines[no_used]["next"] = no_used + 1 | |
| 174 |         outlines << {"no"=>0,"previous"=>no_used,"next"=>-1,"parent"=>-1,"child"=>-1,"issue"=>issue} | |
| 175 | no_used += 1 | |
| 176 | end | |
| 177 | end | |
| 178 | # link family | |
| 179 | 1.upto(outlines.size-1) do |i| | |
| 180 | (i+1).upto(outlines.size-1) do |j| | |
| 181 | if outlines[i]["issue"].parents && (outlines[i]["issue"].parents.size > 0) && (outlines[i]["issue"].parents[0].id == outlines[j]["issue"].id) | |
| 182 | outlines = linklist_add_child(outlines, j, i) | |
| 183 | elsif outlines[j]["issue"].parents && (outlines[j]["issue"].parents.size > 0) && (outlines[j]["issue"].parents[0].id == outlines[i]["issue"].id) | |
| 184 | outlines = linklist_add_child(outlines, i, j) | |
| 185 | end | |
| 186 | end | |
| 187 | end | |
| 188 | # make outline | |
| 189 | outlines2 = make_outline(outlines, 1, outlines[0]["next"]) | |
| 190 | # sort | |
| 191 | outlines2.shift | |
| 192 | issues = [] | |
| 193 | 1.upto(outlines2.size) do |no| | |
| 194 | outlines2.each do |outline| | |
| 195 | if outline["no"] == no | |
| 196 | issues << outline["issue"] | |
| 197 | break | |
| 198 | end | |
| 199 | end | |
| 200 | end | |
| 201 | 0.upto(issues.size-1) do |no| | |
| 202 | if (no >= issues.size-1) || (issues[no].outline_level >= issues[no+1].outline_level) | |
| 203 | issues[no].edge(1) | |
| 204 | end | |
| 205 | end | |
| 206 | issues | |
| 207 | end | |
| 208 |  | |
| 209 |  | |
| 108 | 210 | def issues_to_csv(issues, project = nil) | 
| 109 | 211 | ic = Iconv.new(l(:general_csv_encoding), 'UTF-8') | 
| 110 | 212 | export = StringIO.new | 
| ... | ... | |
| 115 | 217 | l(:field_project), | 
| 116 | 218 | l(:field_tracker), | 
| 117 | 219 | l(:field_priority), | 
| 220 | l(:field_outline), | |
| 118 | 221 | l(:field_subject), | 
| 119 | 222 | l(:field_assigned_to), | 
| 120 | 223 | l(:field_category), | 
| ... | ... | |
| 132 | 235 | custom_fields = project.nil? ? IssueCustomField.for_all : project.all_custom_fields | 
| 133 | 236 |       custom_fields.each {|f| headers << f.name} | 
| 134 | 237 |       csv << headers.collect {|c| begin; ic.iconv(c.to_s); rescue; c.to_s; end } | 
| 238 | issues = issues_to_outlines(issues) | |
| 135 | 239 | # csv lines | 
| 136 | 240 | issues.each do |issue| | 
| 137 | 241 | fields = [issue.id, | 
| 138 |                   issue.status.name,  | |
| 242 |                   issue.total('status').name,  | |
| 139 | 243 | issue.project.name, | 
| 140 | 244 | issue.tracker.name, | 
| 141 | issue.priority.name, | |
| 245 |                   issue.total('priority').name, | |
| 246 | issue.outline_level, | |
| 142 | 247 | issue.subject, | 
| 143 | 248 | issue.assigned_to, | 
| 144 | 249 | issue.category, | 
| 145 | 250 | issue.fixed_version, | 
| 146 | 251 | issue.author.name, | 
| 147 |                   format_date(issue.start_date), | |
| 148 |                   format_date(issue.due_date), | |
| 149 |                   issue.done_ratio, | |
| 252 |                   format_date(issue.total('start_date')), | |
| 253 |                   format_date(issue.total('due_date')), | |
| 254 |                   issue.total('done_ratio'), | |
| 150 | 255 | issue.estimated_hours, | 
| 151 | 256 | format_time(issue.created_on), | 
| 152 | 257 | format_time(issue.updated_on) | 
| app/helpers/queries_helper.rb (working copy) | ||
|---|---|---|
| 32 | 32 |       cv = issue.custom_values.detect {|v| v.custom_field_id == column.custom_field.id} | 
| 33 | 33 | show_value(cv) | 
| 34 | 34 | else | 
| 35 | value = issue.send(column.name) | |
| 35 | # value = issue.send(column.name) | |
| 36 | value = issue.total(column.name) | |
| 36 | 37 | if value.is_a?(Date) | 
| 37 | 38 | format_date(value) | 
| 38 | 39 | elsif value.is_a?(Time) | 
| app/models/issue.rb (working copy) | ||
|---|---|---|
| 223 | 223 | def duplicates | 
| 224 | 224 |     relations.select {|r| r.relation_type == IssueRelation::TYPE_DUPLICATES}.collect {|r| r.other_issue(self)} | 
| 225 | 225 | end | 
| 226 | ||
| 227 | def duration1 | |
| 228 | (start_date && due_date) ? (due_date - start_date + 1) : 0 | |
| 229 | end | |
| 226 | 230 |  | 
| 227 | 231 | def duration | 
| 228 | 232 | (start_date && due_date) ? due_date - start_date : 0 | 
| ... | ... | |
| 231 | 235 | def soonest_start | 
| 232 | 236 |     @soonest_start ||= relations_to.collect{|relation| relation.successor_soonest_start}.compact.min | 
| 233 | 237 | end | 
| 234 |  | |
| 238 |  | |
| 235 | 239 | def self.visible_by(usr) | 
| 236 | 240 |     with_scope(:find => { :conditions => Project.visible_by(usr) }) do | 
| 237 | 241 | yield | 
| 238 | 242 | end | 
| 239 | 243 | end | 
| 244 |  | |
| 245 | def total(filed) | |
| 246 | filed = filed.to_s | |
| 247 | if filed == 'done_ratio' || filed == 'planned_days' || filed == 'actual_days' | |
| 248 | @total_planned_days ||= self.duration1 | |
| 249 | @total_actual_days ||= done_ratio ? (@total_planned_days * done_ratio / 100).floor : 0 | |
| 250 | @total_done_ratio ||= done_ratio | |
| 251 | else | |
| 252 |       eval("@total_#{filed} ||= #{filed}") | |
| 253 | end | |
| 254 | if filed == 'estimated_hours' || filed == 'spent_hours' | |
| 255 | type = 'sum' | |
| 256 | elsif filed == 'start_date' | |
| 257 | type = 'min' | |
| 258 | elsif filed == 'due_date' | |
| 259 | type = 'max' | |
| 260 | elsif filed == 'priority' || filed == 'fixed_version' | |
| 261 | type = 'max_id' | |
| 262 | elsif filed == 'status' | |
| 263 | type = 'min_id' | |
| 264 | elsif filed == 'done_ratio' || filed == 'planned_days' || filed == 'actual_days' | |
| 265 | type = 'done_ratio' | |
| 266 | else | |
| 267 |       return(eval("@total_#{filed}")) | |
| 268 | end | |
| 269 |     if !eval("@total_#{filed}") || (eval("@total_#{filed}") == 0) || (type == 'max_id') || (type == 'min_id') | |
| 270 | relations_to.each do |relation| | |
| 271 | if relation.relation_type == IssueRelation::TYPE_PARENTS | |
| 272 | othertotal = relation.other_issue(self).total(filed) | |
| 273 |           if ! eval("@total_#{filed}") | |
| 274 |             eval("@total_#{filed} = othertotal") | |
| 275 | elsif type == 'done_ratio' || type == 'planned_days' || type == 'actual_days' | |
| 276 |             planned_days = relation.other_issue(self).total('duration1') | |
| 277 |             actual_days = relation.other_issue(self).total('done_ratio') ?  (planned_days * relation.other_issue(self).total('done_ratio') / 100).floor : 0 | |
| 278 | @total_planned_days += planned_days | |
| 279 | @total_actual_days += actual_days | |
| 280 | @total_done_ratio = @total_planned_days != 0 ? (@total_actual_days * 100 / @total_planned_days).floor : 0 | |
| 281 | elsif type == 'max_id' | |
| 282 |             if othertotal && eval("@total_#{filed}.id") < othertotal.id | |
| 283 |               eval("@total_#{filed} = othertotal") | |
| 284 | end | |
| 285 | elsif type == 'min_id' | |
| 286 |             if othertotal && eval("@total_#{filed}.id") > othertotal.id | |
| 287 |               eval("@total_#{filed} = othertotal") | |
| 288 | end | |
| 289 | elsif type == 'sum' | |
| 290 | if othertotal | |
| 291 |               eval("@total_#{filed} += othertotal") | |
| 292 | end | |
| 293 | elsif type == 'max' | |
| 294 |             if othertotal && eval("@total_#{filed}") < othertotal | |
| 295 |               eval("@total_#{filed} = othertotal") | |
| 296 | end | |
| 297 | elsif type == 'min' | |
| 298 |             if othertotal && eval("@total_#{filed}") > othertotal | |
| 299 |               eval("@total_#{filed} = othertotal") | |
| 300 | end | |
| 301 | end | |
| 302 | end | |
| 303 | end | |
| 304 | end | |
| 305 |     eval("@total_#{filed}") | |
| 306 | end | |
| 307 |  | |
| 308 | def childs | |
| 309 | childs = [] | |
| 310 | relations_to.each do |relation| | |
| 311 | if relation.relation_type == IssueRelation::TYPE_PARENTS | |
| 312 | childs << relation.other_issue(self) | |
| 313 | end | |
| 314 | end | |
| 315 | childs | |
| 316 | end | |
| 317 |  | |
| 318 | def parents | |
| 319 | parents = [] | |
| 320 | relations_from.each do |relation| | |
| 321 | if relation.relation_type == IssueRelation::TYPE_PARENTS | |
| 322 | parents << relation.other_issue(self) | |
| 323 | end | |
| 324 | end | |
| 325 | parents | |
| 326 | end | |
| 327 |  | |
| 328 | def outline_level(outline_level=0) | |
| 329 |  | |
| 330 | @outline_level = outline_level if outline_level != 0 | |
| 331 | @outline_level ? @outline_level : 1 | |
| 332 | end | |
| 333 |  | |
| 334 | def edge(edge=false) | |
| 335 | @edge = edge if edge | |
| 336 | @edge ? @edge : false | |
| 337 | end | |
| 240 | 338 | end | 
| app/models/issue_relation.rb (working copy) | ||
|---|---|---|
| 23 | 23 | TYPE_DUPLICATES = "duplicates" | 
| 24 | 24 | TYPE_BLOCKS = "blocks" | 
| 25 | 25 | TYPE_PRECEDES = "precedes" | 
| 26 | TYPE_PARENTS = "parents" | |
| 26 | 27 |  | 
| 27 | 28 |   TYPES = { TYPE_RELATES =>     { :name => :label_relates_to, :sym_name => :label_relates_to, :order => 1 }, | 
| 28 | 29 |             TYPE_DUPLICATES =>  { :name => :label_duplicates, :sym_name => :label_duplicates, :order => 2 }, | 
| 29 | 30 |             TYPE_BLOCKS =>      { :name => :label_blocks, :sym_name => :label_blocked_by, :order => 3 }, | 
| 30 | 31 |             TYPE_PRECEDES =>    { :name => :label_precedes, :sym_name => :label_follows, :order => 4 }, | 
| 32 |             TYPE_PARENTS =>    { :name => :label_parents, :sym_name => :label_children, :order => 5 }, | |
| 31 | 33 | }.freeze | 
| 32 | 34 |  | 
| 33 | 35 | validates_presence_of :issue_from, :issue_to, :relation_type | 
| app/controllers/projects_controller.rb (working copy) | ||
|---|---|---|
| 368 | 368 | end | 
| 369 | 369 | @events += @project.versions.find(:all, :conditions => ["effective_date BETWEEN ? AND ?", @date_from, @date_to]) | 
| 370 | 370 |     @events.sort! {|x,y| x.start_date <=> y.start_date } | 
| 371 | ||
| 372 | parent_ids = [] | |
| 373 | my_ids = [] | |
| 374 | @events.each do |i| | |
| 375 | my_ids << i.id | |
| 376 | while i.parents && (i.parents.size > 0) | |
| 377 | @selected_tracker_ids.each do |tracker_id| | |
| 378 | parent_ids |= [i.parents[0].id] if tracker_id.to_i == i.parents[0].tracker_id | |
| 379 | end | |
| 380 | i = i.parents[0] | |
| 381 | end | |
| 382 | end | |
| 383 | parent_ids.sort | |
| 384 | my_ids.sort | |
| 385 | parent_ids = parent_ids - my_ids | |
| 386 |     @events += Issue.find(:all, :include => [:tracker, :status, :assigned_to, :priority, :project], :conditions => ["#{Issue.table_name}.id in (#{parent_ids.join(',')}) and #{Issue.table_name}.tracker_id in (#{@selected_tracker_ids.join(',')})"])  unless @selected_tracker_ids.empty? || parent_ids.empty? | |
| 387 | @events = issues_to_outlines(@events) | |
| 371 | 388 |  | 
| 372 | 389 | if params[:format]=='pdf' | 
| 373 | 390 |       @options_for_rfpdf ||= {} | 
| app/views/projects/gantt.rhtml (working copy) | ||
|---|---|---|
| 70 | 70 | @events.each do |i| %> | 
| 71 | 71 | <div style="position: absolute;line-height:1.2em;height:16px;top:<%= top %>px;left:4px;overflow:hidden;"><small> | 
| 72 | 72 | <% if i.is_a? Issue %> | 
| 73 | <% indent = "" %> | |
| 74 | <% (2).upto(i.outline_level) do |j| %> | |
| 75 |             <% indent += image_tag('white.png') %> | |
| 76 | <% end %> | |
| 77 |         <% indent += (i.edge ? image_tag('white.png'):image_tag('expanded.png')) %> | |
| 78 | <%= indent %> | |
| 73 | 79 |       	<%= h("#{i.project.name} -") unless @project && @project == i.project %> | 
| 74 | 80 | <%= link_to_issue i %>: <%=h i.subject %> | 
| 75 | 81 | <% else %> | 
| ... | ... | |
| 126 | 132 | width = (week_f + 6 <= @date_to) ? 7 * zoom -1 : (@date_to - week_f + 1) * zoom-1 | 
| 127 | 133 | %> | 
| 128 | 134 | <div style="left:<%= left %>px;top:19px;width:<%= width %>px;height:<%= height %>px;" class="gantt_hdr"> | 
| 129 | 		<small><%= week_f.cweek if width >= 16 %></small> | |
| 130 | </div> | |
| 135 |   	<small><% week_f.cweek if width >= 16 %><%= week_f.day if width >= 16 %></small> | |
| 136 |  		</div> | |
| 131 | 137 | <% | 
| 132 | 138 | left = left + width+1 | 
| 133 | 139 | week_f = week_f+7 | 
| ... | ... | |
| 162 | 168 | top = headers_height + 10 | 
| 163 | 169 | @events.each do |i| | 
| 164 | 170 | if i.is_a? Issue | 
| 165 | 	i_start_date = (i.start_date >= @date_from ? i.start_date : @date_from ) | |
| 166 | 	i_end_date = (i.due_date <= @date_to ? i.due_date : @date_to ) | |
| 171 | 	i_start_date = (i.total('start_date') >= @date_from ? i.total('start_date') : @date_from ) | |
| 172 | 	i_end_date = (i.total('due_date') <= @date_to ? i.total('due_date') : @date_to ) | |
| 167 | 173 |  | 
| 168 | 	i_done_date = i.start_date + ((i.due_date - i.start_date+1)*i.done_ratio/100).floor | |
| 174 | 	i_done_date = i.total('start_date') + i.total('actual_days') | |
| 169 | 175 | i_done_date = (i_done_date <= @date_from ? @date_from : i_done_date ) | 
| 170 | 176 | i_done_date = (i_done_date >= @date_to ? @date_to : i_done_date ) | 
| 171 | 177 |  | 
| ... | ... | |
| 184 | 190 | <div style="top:<%= top %>px;left:<%= i_left %>px;width:<%= d_width %>px;" class="task task_done"> </div> | 
| 185 | 191 | <% end %> | 
| 186 | 192 | <div style="top:<%= top %>px;left:<%= i_left + i_width + 5 %>px;background:#fff;" class="task"> | 
| 187 | 	<%= i.status.name %> | |
| 188 | 	<%= (i.done_ratio).to_i %>% | |
| 193 | 	<%= i.total('status').name %> | |
| 194 | 	<%= (i.total('done_ratio')).to_i %>% | |
| 189 | 195 | </div> | 
| 190 | 196 | <% # === tooltip === %> | 
| 191 | 197 | <div class="tooltip" style="position: absolute;top:<%= top %>px;left:<%= i_left %>px;width:<%= i_width %>px;height:12px;"> | 
| ... | ... | |
| 193 | 199 | <%= render_issue_tooltip i %> | 
| 194 | 200 | </span></div> | 
| 195 | 201 | <% else | 
| 196 |     i_left = ((i.start_date - @date_from)*zoom).floor | |
| 202 |     i_left = ((i.total('start_date') - @date_from)*zoom).floor | |
| 197 | 203 | %> | 
| 198 | 204 | <div style="top:<%= top %>px;left:<%= i_left %>px;width:15px;" class="task milestone"> </div> | 
| 199 | 205 | <div style="top:<%= top %>px;left:<%= i_left + 12 %>px;background:#fff;" class="task"> | 
| app/views/projects/gantt.rfpdf (working copy) | ||
|---|---|---|
| 4 | 4 | pdf.AliasNbPages | 
| 5 | 5 | pdf.footer_date = format_date(Date.today) | 
| 6 | 6 | pdf.AddPage("L")
 | 
| 7 | pdf.SetFontStyle('B',12)
 | |
| 8 | pdf.SetX(15) | |
| 9 | pdf.Cell(70, 20, @project.name) | |
| 10 | pdf.Ln | |
| 11 | pdf.SetFontStyle('B',9)
 | |
| 12 | 7 |  | 
| 13 | 8 | subject_width = 70 | 
| 14 | 9 | header_heigth = 5 | 
| ... | ... | |
| 31 | 26 | g_height = 120 | 
| 32 | 27 | t_height = g_height + headers_heigth | 
| 33 | 28 |  | 
| 29 | top = 20 | |
| 30 | @events.each do |i| | |
| 31 |  | |
| 32 | if (top == 20) | |
| 33 | pdf.SetFontStyle('B',12)
 | |
| 34 | pdf.SetX(15) | |
| 35 | pdf.Cell(70, 20, @project.name) | |
| 36 | pdf.Ln | |
| 37 | pdf.SetFontStyle('B',9)
 | |
| 38 |  | |
| 34 | 39 | y_start = pdf.GetY | 
| 35 | 40 |  | 
| 36 |  | |
| 37 | 41 | # | 
| 38 | 42 | # Months headers | 
| 39 | 43 | # | 
| ... | ... | |
| 71 | 75 | width = (week_f + 6 <= @date_to) ? 7 * zoom : (@date_to - week_f + 1) * zoom | 
| 72 | 76 | pdf.SetY(y_start + header_heigth) | 
| 73 | 77 | pdf.SetX(left) | 
| 74 | pdf.Cell(width, height, (width >= 5 ? week_f.cweek.to_s : ""), "LTR", 0, "C") | |
| 78 | # pdf.Cell(width, height, (width >= 5 ? week_f.cweek.to_s : ""), "LTR", 0, "C") | |
| 79 | pdf.Cell(width, height, (width >= 5 ? week_f.day.to_s : ""), "LTR", 0, "C") | |
| 75 | 80 | left = left + width | 
| 76 | 81 | week_f = week_f+7 | 
| 77 | 82 | end | 
| ... | ... | |
| 100 | 105 | pdf.SetX(15) | 
| 101 | 106 | pdf.Cell(subject_width+g_width-15, headers_heigth, "", 1) | 
| 102 | 107 |  | 
| 108 | top = headers_heigth + y_start | |
| 109 | end | |
| 103 | 110 |  | 
| 104 | 111 | # | 
| 105 | 112 | # Tasks | 
| 106 | 113 | # | 
| 107 | top = headers_heigth + y_start | |
| 108 | 114 | pdf.SetFontStyle('B',7)
 | 
| 109 | @events.each do |i| | |
| 110 | 115 | pdf.SetY(top) | 
| 111 | 116 | pdf.SetX(15) | 
| 112 | 117 |  | 
| 113 | 118 | if i.is_a? Issue | 
| 114 | 		pdf.Cell(subject_width-15, 5, "#{i.tracker.name} #{i.id}: #{i.subject}".sub(/^(.{30}[^\s]*\s).*$/, '\1 (...)'), "LR")
 | |
| 119 |     pdf.Image('public/images/expanded.png', pdf.GetX+3*(i.outline_level-1)+0.5, pdf.GetY+1, 3, 3) unless i.edge
 | |
| 120 | pdf.Cell(3*i.outline_level+1,5,'',0) | |
| 121 | 		pdf.Cell(subject_width-15-(3*i.outline_level+1), 5, "#{i.tracker.name} #{i.id}: #{i.subject}".sub(/^(.{30}[^\s]*\s).*$/, '\1 (...)'), 0)
 | |
| 122 | pdf.SetX(15) | |
| 123 | pdf.Cell(subject_width-15, 5, '', "LR") | |
| 115 | 124 | else | 
| 116 | 125 | 		pdf.Cell(subject_width-15, 5, "#{l(:label_version)}: #{i.name}", "LR")
 | 
| 117 | 126 | end | 
| ... | ... | |
| 123 | 132 | pdf.SetY(top+1.5) | 
| 124 | 133 |  | 
| 125 | 134 | if i.is_a? Issue | 
| 126 | 		i_start_date = (i.start_date >= @date_from ? i.start_date : @date_from )
 | |
| 127 | 		i_end_date = (i.due_date <= @date_to ? i.due_date : @date_to )
 | |
| 135 | 		i_start_date = (i.total('start_date') >= @date_from ? i.total('start_date') : @date_from )
 | |
| 136 | 		i_end_date = (i.total('due_date') <= @date_to ? i.total('due_date') : @date_to )
 | |
| 128 | 137 |  | 
| 129 | 		i_done_date = i.start_date + ((i.due_date - i.start_date+1)*i.done_ratio/100).floor
 | |
| 138 | 		i_done_date = i.total('start_date') + i.total('actual_days')
 | |
| 130 | 139 | i_done_date = (i_done_date <= @date_from ? @date_from : i_done_date ) | 
| 131 | 140 | i_done_date = (i_done_date >= @date_to ? @date_to : i_done_date ) | 
| 132 | 141 |  | 
| ... | ... | |
| 157 | 166 |  | 
| 158 | 167 | pdf.SetY(top+1.5) | 
| 159 | 168 | pdf.SetX(subject_width + i_left + i_width) | 
| 160 | 		pdf.Cell(30, 2, "#{i.status.name} #{i.done_ratio}%")
 | |
| 169 | 		pdf.Cell(30, 2, "#{i.total('status').name} #{i.total('done_ratio')}%")
 | |
| 161 | 170 | else | 
| 162 | 		i_left = ((i.start_date - @date_from)*zoom) 
 | |
| 171 | 		i_left = ((i.total('start_date') - @date_from)*zoom) 
 | |
| 163 | 172 |  | 
| 164 | 173 | pdf.SetX(subject_width + i_left) | 
| 165 | 174 | pdf.SetFillColor(50,200,50) | 
| ... | ... | |
| 175 | 184 | pdf.SetDrawColor(200, 200, 200) | 
| 176 | 185 | pdf.Line(15, top, subject_width+g_width, top) | 
| 177 | 186 | if pdf.GetY() > 180 | 
| 187 | pdf.SetDrawColor(0, 0, 0) | |
| 188 | pdf.Line(15, top, subject_width+g_width, top) | |
| 178 | 189 | 		pdf.AddPage("L")
 | 
| 179 | 190 | top = 20 | 
| 180 | pdf.Line(15, top, subject_width+g_width, top) | |
| 181 | 191 | end | 
| 182 | 192 | pdf.SetDrawColor(0, 0, 0) | 
| 183 | 193 | end | 
| app/views/issues/_relations.rhtml (working copy) | ||
|---|---|---|
| 12 | 12 | <tr> | 
| 13 | 13 | <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> | 
| 14 | 14 | <td><%=h relation.other_issue(@issue).subject %></td> | 
| 15 | <td><%= relation.other_issue(@issue).status.name %></td> | |
| 16 | <td><%= format_date(relation.other_issue(@issue).start_date) %></td> | |
| 17 | <td><%= format_date(relation.other_issue(@issue).due_date) %></td> | |
| 15 | <td><%= relation.other_issue(@issue).total('status').name %></td> | |
| 16 | <td><%= format_date(relation.other_issue(@issue).total('start_date')) %></td> | |
| 17 | <td><%= format_date(relation.other_issue(@issue).total('due_date')) %></td> | |
| 18 | 18 | <td><%= link_to_remote(image_tag('delete.png'), { :url => {:controller => 'issue_relations', :action => 'destroy', :issue_id => @issue, :id => relation},                                               | 
| 19 | 19 | :method => :post | 
| 20 | 20 |                                                 }, :title => l(:label_relation_delete)) if authorize_for('issue_relations', 'destroy') %></td> | 
| app/views/issues/show.rhtml (working copy) | ||
|---|---|---|
| 18 | 18 | |
| 19 | 19 | <table width="100%"> | 
| 20 | 20 | <tr> | 
| 21 |     <td style="width:15%"><b><%=l(:field_status)%> :</b></td><td style="width:35%"><%= @issue.status.name %></td> | |
| 22 |     <td style="width:15%"><b><%=l(:field_start_date)%> :</b></td><td style="width:35%"><%= format_date(@issue.start_date) %></td> | |
| 21 |     <td style="width:15%"><b><%=l(:field_status)%> :</b></td><td style="width:35%"><%= @issue.total('status').name %></td> | |
| 22 |     <td style="width:15%"><b><%=l(:field_start_date)%> :</b></td><td style="width:35%"><%= format_date(@issue.total('start_date')) %></td> | |
| 23 | 23 | </tr> | 
| 24 | 24 | <tr> | 
| 25 |     <td><b><%=l(:field_priority)%> :</b></td><td><%= @issue.priority.name %></td> | |
| 26 |     <td><b><%=l(:field_due_date)%> :</b></td><td><%= format_date(@issue.due_date) %></td> | |
| 25 |     <td><b><%=l(:field_priority)%> :</b></td><td><%= @issue.total('priority').name %></td> | |
| 26 |     <td><b><%=l(:field_due_date)%> :</b></td><td><%= format_date(@issue.total('due_date')) %></td> | |
| 27 | 27 | </tr> | 
| 28 | 28 | <tr> | 
| 29 | 29 | <td><b><%=l(:field_assigned_to)%> :</b></td><td><%= @issue.assigned_to ? link_to_user(@issue.assigned_to) : "-" %></td> | 
| 30 |     <td><b><%=l(:field_done_ratio)%> :</b></td><td><%= progress_bar @issue.done_ratio, :width => '80px', :legend => "#{@issue.done_ratio}%" %></td> | |
| 30 |     <td><b><%=l(:field_done_ratio)%> :</b></td><td><%= progress_bar @issue.total('done_ratio'), :width => '80px', :legend => "#{@issue.total('done_ratio')}%" %></td> | |
| 31 | 31 | </tr> | 
| 32 | 32 | <tr> | 
| 33 | 33 | <td><b><%=l(:field_category)%> :</b></td><td><%=h @issue.category ? @issue.category.name : "-" %></td> | 
| 34 | 34 | <% if User.current.allowed_to?(:view_time_entries, @project) %> | 
| 35 | 35 | <td><b><%=l(:label_spent_time)%> :</b></td> | 
| 36 |     <td><%= @issue.spent_hours > 0 ? (link_to lwr(:label_f_hour, @issue.spent_hours), {:controller => 'timelog', :action => 'details', :issue_id => @issue}, :class => 'icon icon-time') : "-" %></td> | |
| 36 |     <td><%= @issue.total('spent_hours') > 0 ? (link_to lwr(:label_f_hour, @issue.total('spent_hours')), {:controller => 'timelog', :action => 'details', :issue_id => @issue}, :class => 'icon icon-time') : "-" %></td> | |
| 37 | 37 | <% end %> | 
| 38 | 38 | </tr> | 
| 39 | 39 | <tr> | 
| 40 | 40 | <td><b><%=l(:field_fixed_version)%> :</b></td><td><%= @issue.fixed_version ? link_to_version(@issue.fixed_version) : "-" %></td> | 
| 41 |     <% if @issue.estimated_hours %> | |
| 42 |     <td><b><%=l(:field_estimated_hours)%> :</b></td><td><%= lwr(:label_f_hour, @issue.estimated_hours) %></td> | |
| 41 |     <% if @issue.total('estimated_hours') %> | |
| 42 |     <td><b><%=l(:field_estimated_hours)%> :</b></td><td><%= lwr(:label_f_hour, @issue.total('estimated_hours')) %></td> | |
| 43 | 43 | <% end %> | 
| 44 | 44 | </tr> | 
| 45 | 45 | <tr> | 
| app/views/issues/index.rfpdf (working copy) | ||
|---|---|---|
| 5 | 5 | pdf.footer_date = format_date(Date.today) | 
| 6 | 6 | 	pdf.AddPage("L") | 
| 7 | 7 | row_height = 7 | 
| 8 |  | |
| 9 | # | |
| 8 | ||
| 9 | @issues = issues_to_outlines(@issues) | |
| 10 | ||
| 11 | @issues.each do |issue| | |
| 12 | ||
| 13 | if pdf.GetY() < 20 | |
| 14 | # | |
| 10 | 15 | # title | 
| 11 | 16 | # | 
| 12 | 17 | 	pdf.SetFontStyle('B',11)   	 | 
| ... | ... | |
| 18 | 23 | # | 
| 19 | 24 | 	pdf.SetFontStyle('B',10) | 
| 20 | 25 | pdf.SetFillColor(230, 230, 230) | 
| 21 |    	pdf.Cell(15, row_height, "#", 0, 0, 'L', 1) | |
| 26 |    	pdf.Cell(15, row_height, "#", 0, 0, 'R', 1) | |
| 22 | 27 | pdf.Cell(30, row_height, l(:field_tracker), 0, 0, 'L', 1) | 
| 23 | 28 | pdf.Cell(30, row_height, l(:field_status), 0, 0, 'L', 1) | 
| 24 | 29 | pdf.Cell(30, row_height, l(:field_priority), 0, 0, 'L', 1) | 
| ... | ... | |
| 29 | 34 | pdf.Ln | 
| 30 | 35 | pdf.Line(10, pdf.GetY, 287, pdf.GetY) | 
| 31 | 36 | pdf.SetY(pdf.GetY() + 1) | 
| 37 | end | |
| 32 | 38 |  | 
| 33 | 39 | # | 
| 34 | 40 | # rows | 
| 35 | 41 | # | 
| 36 | 42 | 	pdf.SetFontStyle('',9) | 
| 37 | 43 | pdf.SetFillColor(255, 255, 255) | 
| 38 | @issues.each do |issue| | |
| 39 | pdf.Cell(15, row_height, issue.id.to_s, 0, 0, 'L', 1) | |
| 44 | pdf.Cell(15, row_height, issue.id.to_s, 0, 0, 'R', 1) | |
| 40 | 45 | pdf.Cell(30, row_height, issue.tracker.name, 0, 0, 'L', 1) | 
| 41 | 	   	pdf.Cell(30, row_height, issue.status.name, 0, 0, 'L', 1) | |
| 42 | 	   	pdf.Cell(30, row_height, issue.priority.name, 0, 0, 'L', 1) | |
| 46 | 	   	pdf.Cell(30, row_height, issue.total('status').name, 0, 0, 'L', 1) | |
| 47 | 	   	pdf.Cell(30, row_height, issue.total('priority').name, 0, 0, 'L', 1) | |
| 43 | 48 | pdf.Cell(40, row_height, issue.assigned_to ? issue.assigned_to.name : '', 0, 0, 'L', 1) | 
| 44 | 49 | pdf.Cell(25, row_height, format_date(issue.updated_on), 0, 0, 'L', 1) | 
| 50 |       pdf.Image('public/images/expanded.png', pdf.GetX+3*(issue.outline_level-1)+0.5, pdf.GetY+2, 3, 3) unless issue.edge | |
| 51 | pdf.Cell(3*issue.outline_level+1,row_height,'',0) | |
| 45 | 52 | 	   	pdf.MultiCell(0, row_height, (@project == issue.project ? issue.subject : "#{issue.project.name} - #{issue.subject}")) | 
| 46 | 53 | pdf.Line(10, pdf.GetY, 287, pdf.GetY) | 
| 47 | 54 | pdf.SetY(pdf.GetY() + 1) | 
| 55 |  | |
| 56 | if pdf.GetY() > 180 | |
| 57 | 		pdf.AddPage("L") | |
| 48 | 58 | end | 
| 59 | end | |
| 49 | 60 | %> | 
| 50 | 61 | <%= pdf.Output %> | 
| app/views/issues/_pdf.rfpdf (working copy) | ||
|---|---|---|
| 7 | 7 |     pdf.SetFontStyle('B',9)
 | 
| 8 | 8 | pdf.Cell(35,5, l(:field_status) + ":","LT") | 
| 9 | 9 |     pdf.SetFontStyle('',9)
 | 
| 10 |     pdf.Cell(60,5, issue.status.name,"RT")
 | |
| 10 |     pdf.Cell(60,5, issue.total('status').name,"RT")
 | |
| 11 | 11 |     pdf.SetFontStyle('B',9)
 | 
| 12 | 12 | pdf.Cell(35,5, l(:field_priority) + ":","LT") | 
| 13 | 13 |     pdf.SetFontStyle('',9)
 | 
| 14 |     pdf.Cell(60,5, issue.priority.name,"RT")        
 | |
| 14 |     pdf.Cell(60,5, issue.total('priority').name,"RT")        
 | |
| 15 | 15 | pdf.Ln | 
| 16 | 16 |  | 
| 17 | 17 |     pdf.SetFontStyle('B',9)
 | 
| ... | ... | |
| 41 | 41 |     pdf.SetFontStyle('B',9)
 | 
| 42 | 42 | pdf.Cell(35,5, l(:field_due_date) + ":","LB") | 
| 43 | 43 |     pdf.SetFontStyle('',9)
 | 
| 44 |     pdf.Cell(60,5, format_date(issue.due_date),"RB")
 | |
| 44 |     pdf.Cell(60,5, format_date(issue.total('due_date')),"RB")
 | |
| 45 | 45 | pdf.Ln | 
| 46 | 46 |  | 
| 47 | 47 | for custom_value in issue.custom_values | 
| lang/uk.yml (working copy) | ||
|---|---|---|
| 122 | 122 | field_due_date: Дата виконання | 
| 123 | 123 | field_assigned_to: Призначена до | 
| 124 | 124 | field_priority: Пріоритет | 
| 125 | field_outline: Outline | |
| 125 | 126 | field_fixed_version: Фіксована версія | 
| 126 | 127 | field_user: Користувач | 
| 127 | 128 | field_role: Роль | 
| ... | ... | |
| 411 | 412 | label_blocked_by: заблоковане | 
| 412 | 413 | label_precedes: передує | 
| 413 | 414 | label_follows: наступний за | 
| 415 | label_parents: parents | |
| 416 | label_children: children | |
| 414 | 417 | label_end_to_start: з кінця до початку | 
| 415 | 418 | label_end_to_end: з кінця до кінця | 
| 416 | 419 | label_start_to_start: з початку до початку | 
| lang/lt.yml (working copy) | ||
|---|---|---|
| 125 | 125 | field_due_date: Užbaigimo data | 
| 126 | 126 | field_assigned_to: Paskirtas | 
| 127 | 127 | field_priority: Prioritetas | 
| 128 | field_outline: Outline | |
| 128 | 129 | field_fixed_version: Pastovi versija | 
| 129 | 130 | field_user: Vartotojas | 
| 130 | 131 | field_role: Vaidmuo | 
| ... | ... | |
| 414 | 415 | label_blocked_by: blokuotas | 
| 415 | 416 | label_precedes: įvyksta pirma | 
| 416 | 417 | label_follows: seka | 
| 418 | label_parents: parents | |
| 419 | label_children: children | |
| 417 | 420 | label_end_to_start: užbaigti, kad pradėti | 
| 418 | 421 | label_end_to_end: užbaigti, kad pabaigti | 
| 419 | 422 | label_start_to_start: pradėkite pradėti | 
| lang/ro.yml (working copy) | ||
|---|---|---|
| 117 | 117 | field_due_date: Data finalizarii | 
| 118 | 118 | field_assigned_to: Atribuit pentru | 
| 119 | 119 | field_priority: Prioritate | 
| 120 | field_outline: Outline | |
| 120 | 121 | field_fixed_version: Versiune rezolvata | 
| 121 | 122 | field_user: Utilizator | 
| 122 | 123 | field_role: Rol | 
| ... | ... | |
| 393 | 394 | label_blocked_by: blocat de | 
| 394 | 395 | label_precedes: precedes | 
| 395 | 396 | label_follows: follows | 
| 397 | label_parents: parents | |
| 398 | label_children: children | |
| 396 | 399 | label_end_to_start: de la sfarsit la capat | 
| 397 | 400 | label_end_to_end: de la sfarsit la sfarsit | 
| 398 | 401 | label_start_to_start: de la capat la capat | 
| lang/zh.yml (working copy) | ||
|---|---|---|
| 120 | 120 | field_due_date: 到期日 | 
| 121 | 121 | field_assigned_to: 指派 | 
| 122 | 122 | field_priority: 优先级 | 
| 123 | field_outline: Outline | |
| 123 | 124 | field_fixed_version: 修订版本 | 
| 124 | 125 | field_user: 用户 | 
| 125 | 126 | field_role: 角色 | 
| ... | ... | |
| 397 | 398 | label_blocked_by: blocked by | 
| 398 | 399 | label_precedes: precedes | 
| 399 | 400 | label_follows: follows | 
| 401 | label_parents: parents | |
| 402 | label_children: children | |
| 400 | 403 | label_end_to_start: end to start | 
| 401 | 404 | label_end_to_end: end to end | 
| 402 | 405 | label_start_to_start: start to start | 
| lang/pt.yml (working copy) | ||
|---|---|---|
| 117 | 117 | field_due_date: Data final | 
| 118 | 118 | field_assigned_to: Atribuído para | 
| 119 | 119 | field_priority: Prioridade | 
| 120 | field_outline: Outline | |
| 120 | 121 | field_fixed_version: Versão corrigida | 
| 121 | 122 | field_user: Usuário | 
| 122 | 123 | field_role: Regra | 
| ... | ... | |
| 395 | 396 | label_blocked_by: bloqueado por | 
| 396 | 397 | label_precedes: procede | 
| 397 | 398 | label_follows: segue | 
| 399 | label_parents: parents | |
| 400 | label_children: children | |
| 398 | 401 | label_end_to_start: fim ao início | 
| 399 | 402 | label_end_to_end: fim ao fim | 
| 400 | 403 | label_start_to_start: ínícia ao inícia | 
| lang/sr.yml (working copy) | ||
|---|---|---|
| 121 | 121 | field_due_date: Do datuma | 
| 122 | 122 | field_assigned_to: Dodeljeno | 
| 123 | 123 | field_priority: Prioritet | 
| 124 | field_outline: Outline | |
| 124 | 125 | field_fixed_version: Ispravljena verzija | 
| 125 | 126 | field_user: Korisnik | 
| 126 | 127 | field_role: Uloga | 
| ... | ... | |
| 405 | 406 | label_blocked_by: blokiran od strane | 
| 406 | 407 | label_precedes: prethodi | 
| 407 | 408 | label_follows: sledi | 
| 409 | label_parents: parents | |
| 410 | label_children: children | |
| 408 | 411 | label_end_to_start: od kraja do početka | 
| 409 | 412 | label_end_to_end: od kraja do kraja | 
| 410 | 413 | label_start_to_start: od početka do pocetka | 
| lang/pt-br.yml (working copy) | ||
|---|---|---|
| 117 | 117 | field_due_date: Data devida | 
| 118 | 118 | field_assigned_to: Atribuido para | 
| 119 | 119 | field_priority: Prioridade | 
| 120 | field_outline: Outline | |
| 120 | 121 | field_fixed_version: Versao corrigida | 
| 121 | 122 | field_user: Usuario | 
| 122 | 123 | field_role: Regra | 
| ... | ... | |
| 395 | 396 | label_blocked_by: blocked by | 
| 396 | 397 | label_precedes: precedes | 
| 397 | 398 | label_follows: follows | 
| 399 | label_parents: parents | |
| 400 | label_children: children | |
| 398 | 401 | label_end_to_start: end to start | 
| 399 | 402 | label_end_to_end: end to end | 
| 400 | 403 | label_start_to_start: start to start | 
| lang/ru.yml (working copy) | ||
|---|---|---|
| 127 | 127 | field_due_date: Дата выполнения | 
| 128 | 128 | field_assigned_to: Назначена | 
| 129 | 129 | field_priority: Приоритет | 
| 130 | field_outline: Outline | |
| 130 | 131 | field_fixed_version: Фиксированная версия | 
| 131 | 132 | field_user: Пользователь | 
| 132 | 133 | field_role: Роль | 
| ... | ... | |
| 418 | 419 | label_blocked_by: заблокировано | 
| 419 | 420 | label_precedes: предшествует | 
| 420 | 421 | label_follows: следующий | 
| 422 | label_parents: parents | |
| 423 | label_children: children | |
| 421 | 424 | label_end_to_start: с конца к началу | 
| 422 | 425 | label_end_to_end: с конца к концу | 
| 423 | 426 | label_start_to_start: с начала к началу | 
| lang/sv.yml (working copy) | ||
|---|---|---|
| 117 | 117 | field_due_date: Färdigdatum | 
| 118 | 118 | field_assigned_to: Tilldelad | 
| 119 | 119 | field_priority: Prioritet | 
| 120 | field_outline: Outline | |
| 120 | 121 | field_fixed_version: Fixed version | 
| 121 | 122 | field_user: Användare | 
| 122 | 123 | field_role: Roll | 
| ... | ... | |
| 395 | 396 | label_blocked_by: blocked by | 
| 396 | 397 | label_precedes: precedes | 
| 397 | 398 | label_follows: follows | 
| 399 | label_parents: parents | |
| 400 | label_children: children | |
| 398 | 401 | label_end_to_start: end to start | 
| 399 | 402 | label_end_to_end: end to end | 
| 400 | 403 | label_start_to_start: start to start | 
| lang/bg.yml (working copy) | ||
|---|---|---|
| 117 | 117 | field_due_date: Крайна дата | 
| 118 | 118 | field_assigned_to: Възложена на | 
| 119 | 119 | field_priority: Приоритет | 
| 120 | field_outline: Outline | |
| 120 | 121 | field_fixed_version: Версия | 
| 121 | 122 | field_user: Потребител | 
| 122 | 123 | field_role: Роля | 
| ... | ... | |
| 395 | 396 | label_blocked_by: блокирана от | 
| 396 | 397 | label_precedes: предшества | 
| 397 | 398 | label_follows: изпълнява се след | 
| 399 | label_parents: parents | |
| 400 | label_children: children | |
| 398 | 401 | label_end_to_start: end to start | 
| 399 | 402 | label_end_to_end: end to end | 
| 400 | 403 | label_start_to_start: start to start | 
| lang/de.yml (working copy) | ||
|---|---|---|
| 126 | 126 | field_due_date: Abgabedatum | 
| 127 | 127 | field_assigned_to: Zugewiesen an | 
| 128 | 128 | field_priority: Priorität | 
| 129 | field_outline: Outline | |
| 129 | 130 | field_fixed_version: Erledigt in Version | 
| 130 | 131 | field_user: Benutzer | 
| 131 | 132 | field_role: Rolle | 
| ... | ... | |
| 420 | 421 | label_blocked_by: Blockiert durch | 
| 421 | 422 | label_precedes: Vorgänger von | 
| 422 | 423 | label_follows: folgt | 
| 424 | label_parents: parents | |
| 425 | label_children: children | |
| 423 | 426 | label_end_to_start: Ende - Anfang | 
| 424 | 427 | label_end_to_end: Ende - Ende | 
| 425 | 428 | label_start_to_start: Anfang - Anfang | 
| lang/ja.yml (working copy) | ||
|---|---|---|
| 118 | 118 | field_due_date: 期限日 | 
| 119 | 119 | field_assigned_to: 担当者 | 
| 120 | 120 | field_priority: 優先度 | 
| 121 | field_outline: アウトライン | |
| 121 | 122 | field_fixed_version: 修正されたバージョン | 
| 122 | 123 | field_user: ユーザ | 
| 123 | 124 | field_role: 役割 | 
| ... | ... | |
| 396 | 397 | label_blocked_by: ブロックされている | 
| 397 | 398 | label_precedes: 先行する | 
| 398 | 399 | label_follows: 後続する | 
| 400 | label_parents: 親 | |
| 401 | label_children: 子 | |
| 399 | 402 | label_end_to_start: end to start | 
| 400 | 403 | label_end_to_end: end to end | 
| 401 | 404 | label_start_to_start: start to start | 
| lang/he.yml (working copy) | ||
|---|---|---|
| 119 | 119 | field_due_date: תאריך סיום | 
| 120 | 120 | field_assigned_to: מוצב ל | 
| 121 | 121 | field_priority: עדיפות | 
| 122 | field_outline: Outline | |
| 122 | 123 | field_fixed_version: גירסא מקובעת | 
| 123 | 124 | field_user: מתשמש | 
| 124 | 125 | field_role: תפקיד | 
| ... | ... | |
| 400 | 401 | label_blocked_by: חסום ע"י | 
| 401 | 402 | label_precedes: מקדים את | 
| 402 | 403 | label_follows: עוקב אחרי | 
| 404 | label_parents: parents | |
| 405 | label_children: children | |
| 403 | 406 | label_end_to_start: מהתחלה לסוף | 
| 404 | 407 | label_end_to_end: מהסוף לסוף | 
| 405 | 408 | label_start_to_start: מהתחלה להתחלה | 
| lang/fi.yml (working copy) | ||
|---|---|---|
| 126 | 126 | field_due_date: Määräaika | 
| 127 | 127 | field_assigned_to: Nimetty | 
| 128 | 128 | field_priority: Prioriteetti | 
| 129 | field_outline: Outline | |
| 129 | 130 | field_fixed_version: Määrätty versio | 
| 130 | 131 | field_user: Käyttäjä | 
| 131 | 132 | field_role: Rooli | 
| ... | ... | |
| 418 | 419 | label_blocked_by: estetty | 
| 419 | 420 | label_precedes: edeltää | 
| 420 | 421 | label_follows: seuraa | 
| 422 | label_parents: parents | |
| 423 | label_children: children | |
| 421 | 424 | label_end_to_start: loppu alkuun | 
| 422 | 425 | label_end_to_end: loppu loppuun | 
| 423 | 426 | label_start_to_start: alku alkuun | 
| lang/en.yml (working copy) | ||
|---|---|---|
| 127 | 127 | field_due_date: Due date | 
| 128 | 128 | field_assigned_to: Assigned to | 
| 129 | 129 | field_priority: Priority | 
| 130 | field_outline: Outline | |
| 130 | 131 | field_fixed_version: Fixed version | 
| 131 | 132 | field_user: User | 
| 132 | 133 | field_role: Role | 
| ... | ... | |
| 443 | 444 | label_blocked_by: blocked by | 
| 444 | 445 | label_precedes: precedes | 
| 445 | 446 | label_follows: follows | 
| 447 | label_parents: parents | |
| 448 | label_children: children | |
| 446 | 449 | label_end_to_start: end to start | 
| 447 | 450 | label_end_to_end: end to end | 
| 448 | 451 | label_start_to_start: start to start | 
| lang/cs.yml (working copy) | ||
|---|---|---|
| 117 | 117 | field_due_date: Po lhůtě | 
| 118 | 118 | field_assigned_to: Přiřazeno | 
| 119 | 119 | field_priority: Priorita | 
| 120 | field_outline: Outline | |
| 120 | 121 | field_fixed_version: Pevná verze | 
| 121 | 122 | field_user: Uživatel | 
| 122 | 123 | field_role: Role | 
| ... | ... | |
| 393 | 394 | label_blocked_by: zamčeno | 
| 394 | 395 | label_precedes: předchází | 
| 395 | 396 | label_follows: následuje | 
| 397 | label_parents: parents | |
| 398 | label_children: children | |
| 396 | 399 | label_end_to_start: od konce do začátku | 
| 397 | 400 | label_end_to_end: od konce do konce | 
| 398 | 401 | label_start_to_start: od začátku do začátku | 
| lang/fr.yml (working copy) | ||
|---|---|---|
| 127 | 127 | field_due_date: Date d'échéance | 
| 128 | 128 | field_assigned_to: Assigné à | 
| 129 | 129 | field_priority: Priorité | 
| 130 | field_outline: Outline | |
| 130 | 131 | field_fixed_version: Version corrigée | 
| 131 | 132 | field_user: Utilisateur | 
| 132 | 133 | field_role: Rôle | 
| ... | ... | |
| 443 | 444 | label_blocked_by: bloqué par | 
| 444 | 445 | label_precedes: précède | 
| 445 | 446 | label_follows: suit | 
| 447 | label_parents: parents | |
| 448 | label_children: children | |
| 446 | 449 | label_end_to_start: fin à début | 
| 447 | 450 | label_end_to_end: fin à fin | 
| 448 | 451 | label_start_to_start: début à début | 
| lang/es.yml (working copy) | ||
|---|---|---|
| 114 | 114 | field_due_date: Fecha fin | 
| 115 | 115 | field_assigned_to: Asignado a | 
| 116 | 116 | field_priority: Prioridad | 
| 117 | field_outline: Outline | |
| 117 | 118 | field_fixed_version: Versión | 
| 118 | 119 | field_user: Usuario | 
| 119 | 120 | field_role: Perfil | 
| ... | ... | |
| 386 | 387 | label_blocked_by: bloqueado por | 
| 387 | 388 | label_precedes: anterior a | 
| 388 | 389 | label_follows: posterior a | 
| 390 | label_parents: parents | |
| 391 | label_children: children | |
| 389 | 392 | label_end_to_start: fin a principio | 
| 390 | 393 | label_end_to_end: fin a fin | 
| 391 | 394 | label_start_to_start: principio a principio | 
| lang/nl.yml (working copy) | ||
|---|---|---|
| 117 | 117 | field_due_date: Verwachte datum gereed | 
| 118 | 118 | field_assigned_to: Toegewezen aan | 
| 119 | 119 | field_priority: Prioriteit | 
| 120 | field_outline: Outline | |
| 120 | 121 | field_fixed_version: Opgeloste versie | 
| 121 | 122 | field_user: Gebruiker | 
| 122 | 123 | field_role: Rol | 
| ... | ... | |
| 395 | 396 | label_blocked_by: geblokkeerd door | 
| 396 | 397 | label_precedes: gaat vooraf aan | 
| 397 | 398 | label_follows: volgt op | 
| 399 | label_parents: parents | |
| 400 | label_children: children | |
| 398 | 401 | label_end_to_start: eind tot start | 
| 399 | 402 | label_end_to_end: eind tot eind | 
| 400 | 403 | label_start_to_start: start tot start | 
| lang/ko.yml (working copy) | ||
|---|---|---|
| 119 | 119 | field_due_date: 완료 기한 | 
| 120 | 120 | field_assigned_to: 담당자 | 
| 121 | 121 | field_priority: 우선순위 | 
| 122 | field_outline: Outline | |
| 122 | 123 | field_fixed_version: 마일스톤 | 
| 123 | 124 | field_user: 유저 | 
| 124 | 125 | field_role: 역할 | 
| ... | ... | |
| 402 | 403 | label_blocked_by: 막고 있는 티켓 | 
| 403 | 404 | label_precedes: 다음 티켓보다 앞서서 처리해야 함. | 
| 404 | 405 | label_follows: 선처리티켓 | 
| 406 | label_parents: parents | |
| 407 | label_children: children | |
| 405 | 408 | label_end_to_start: end to start | 
| 406 | 409 | label_end_to_end: end to end | 
| 407 | 410 | label_start_to_start: start to start | 
| lang/zh-tw.yml (working copy) | ||
|---|---|---|
| 126 | 126 | field_due_date: 完成日期 | 
| 127 | 127 | field_assigned_to: 分派給 | 
| 128 | 128 | field_priority: 優先權 | 
| 129 | field_outline: Outline | |
| 129 | 130 | field_fixed_version: 版本 | 
| 130 | 131 | field_user: 用戶 | 
| 131 | 132 | field_role: 角色 | 
| ... | ... | |
| 425 | 426 | label_blocked_by: 被阻擋 | 
| 426 | 427 | label_precedes: 優先於 | 
| 427 | 428 | label_follows: 跟隨於 | 
| 429 | label_parents: parents | |
| 430 | label_children: children | |
| 428 | 431 | label_end_to_start: end to start | 
| 429 | 432 | label_end_to_end: end to end | 
| 430 | 433 | label_start_to_start: start to start | 
| lang/pl.yml (working copy) | ||
|---|---|---|
| 114 | 114 | field_due_date: Data oddania | 
| 115 | 115 | field_assigned_to: Przydzielony do | 
| 116 | 116 | field_priority: Priorytet | 
| 117 | field_outline: Outline | |
| 117 | 118 | field_fixed_version: Wersja | 
| 118 | 119 | field_user: Użytkownik | 
| 119 | 120 | field_role: Rola | 
| ... | ... | |
| 386 | 387 | label_blocked_by: zablokowane przez | 
| 387 | 388 | label_precedes: poprzedza | 
| 388 | 389 | label_follows: podąża | 
| 390 | label_parents: parents | |
| 391 | label_children: children | |
| 389 | 392 | label_end_to_start: koniec do początku | 
| 390 | 393 | label_end_to_end: koniec do końca | 
| 391 | 394 | label_start_to_start: początek do początku | 
| lang/it.yml (working copy) | ||
|---|---|---|
| 117 | 117 | field_due_date: Data ultima | 
| 118 | 118 | field_assigned_to: Assegnato a | 
| 119 | 119 | field_priority: Priorita' | 
| 120 | field_outline: Outline | |
| 120 | 121 | field_fixed_version: Versione di fix | 
| 121 | 122 | field_user: Utente | 
| 122 | 123 | field_role: Ruolo | 
| ... | ... | |
| 395 | 396 | label_blocked_by: blocked by | 
| 396 | 397 | label_precedes: precedes | 
| 397 | 398 | label_follows: follows | 
| 399 | label_parents: parents | |
| 400 | label_children: children | |
| 398 | 401 | label_end_to_start: end to start | 
| 399 | 402 | label_end_to_end: end to end | 
| 400 | 403 | label_start_to_start: start to start |