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 |