@@ -18,6 +18,17 | |||||
18 | module IssuesHelper |
|
18 | module IssuesHelper | |
19 | include ApplicationHelper |
|
19 | include ApplicationHelper | |
20 |
|
20 | |||
|
21 | def issue_list(issues, &block) | |||
|
22 | ancestors = [] | |||
|
23 | issues.each do |issue| | |||
|
24 | while (ancestors.any? && !issue.is_descendant_of?(ancestors.last)) | |||
|
25 | ancestors.pop | |||
|
26 | end | |||
|
27 | yield issue, ancestors.size | |||
|
28 | ancestors << issue | |||
|
29 | end | |||
|
30 | end | |||
|
31 | ||||
21 | def render_issue_tooltip(issue) |
|
32 | def render_issue_tooltip(issue) | |
22 | @cached_label_start_date ||= l(:field_start_date) |
|
33 | @cached_label_start_date ||= l(:field_start_date) | |
23 | @cached_label_due_date ||= l(:field_due_date) |
|
34 | @cached_label_due_date ||= l(:field_due_date) | |
@@ -43,17 +54,14 module IssuesHelper | |||||
43 |
|
54 | |||
44 | def render_descendants_tree(issue) |
|
55 | def render_descendants_tree(issue) | |
45 | s = '<form><table class="list issues">' |
|
56 | s = '<form><table class="list issues">' | |
46 | ancestors = [] |
|
57 | issue_list(issue.descendants.sort_by(&:lft)) do |child, level| | |
47 | issue.descendants.sort_by(&:lft).each do |child| |
|
|||
48 | level = child.level - issue.level - 1 |
|
|||
49 | s << content_tag('tr', |
|
58 | s << content_tag('tr', | |
50 | content_tag('td', check_box_tag("ids[]", child.id, false, :id => nil), :class => 'checkbox') + |
|
59 | content_tag('td', check_box_tag("ids[]", child.id, false, :id => nil), :class => 'checkbox') + | |
51 |
content_tag('td', link_to_issue(child, :truncate => 60), :class => 'subject' |
|
60 | content_tag('td', link_to_issue(child, :truncate => 60), :class => 'subject') + | |
52 | :style => "padding-left: #{level * 20}px") + |
|
|||
53 | content_tag('td', h(child.status)) + |
|
61 | content_tag('td', h(child.status)) + | |
54 | content_tag('td', link_to_user(child.assigned_to)) + |
|
62 | content_tag('td', link_to_user(child.assigned_to)) + | |
55 | content_tag('td', progress_bar(child.done_ratio, :width => '80px')), |
|
63 | content_tag('td', progress_bar(child.done_ratio, :width => '80px')), | |
56 | :class => "issue-#{child.id} hascontextmenu") |
|
64 | :class => "issue issue-#{child.id} hascontextmenu #{level > 0 ? "idnt idnt-#{level}" : nil}") | |
57 | end |
|
65 | end | |
58 | s << '</form></table>' |
|
66 | s << '</form></table>' | |
59 | s |
|
67 | s |
@@ -57,6 +57,8 module QueriesHelper | |||||
57 | l(:general_text_Yes) |
|
57 | l(:general_text_Yes) | |
58 | when 'FalseClass' |
|
58 | when 'FalseClass' | |
59 | l(:general_text_No) |
|
59 | l(:general_text_No) | |
|
60 | when 'Issue' | |||
|
61 | link_to_issue(value, :subject => false) | |||
60 | else |
|
62 | else | |
61 | h(value) |
|
63 | h(value) | |
62 | end |
|
64 | end |
@@ -81,7 +81,7 module SortHelper | |||||
81 | def to_sql |
|
81 | def to_sql | |
82 | sql = @criteria.collect do |k,o| |
|
82 | sql = @criteria.collect do |k,o| | |
83 | if s = @available_criteria[k] |
|
83 | if s = @available_criteria[k] | |
84 |
(o ? s.to_a : s.to_a.collect {|c| |
|
84 | (o ? s.to_a : s.to_a.collect {|c| append_desc(c)}).join(', ') | |
85 | end |
|
85 | end | |
86 | end.compact.join(', ') |
|
86 | end.compact.join(', ') | |
87 | sql.blank? ? nil : sql |
|
87 | sql.blank? ? nil : sql | |
@@ -120,6 +120,15 module SortHelper | |||||
120 | @criteria.slice!(3) |
|
120 | @criteria.slice!(3) | |
121 | self |
|
121 | self | |
122 | end |
|
122 | end | |
|
123 | ||||
|
124 | # Appends DESC to the sort criterion unless it has a fixed order | |||
|
125 | def append_desc(criterion) | |||
|
126 | if criterion =~ / (asc|desc)$/i | |||
|
127 | criterion | |||
|
128 | else | |||
|
129 | "#{criterion} DESC" | |||
|
130 | end | |||
|
131 | end | |||
123 | end |
|
132 | end | |
124 |
|
133 | |||
125 | def sort_name |
|
134 | def sort_name |
@@ -27,10 +27,11 class QueryColumn | |||||
27 | self.groupable = name.to_s |
|
27 | self.groupable = name.to_s | |
28 | end |
|
28 | end | |
29 | self.default_order = options[:default_order] |
|
29 | self.default_order = options[:default_order] | |
|
30 | @caption_key = options[:caption] || "field_#{name}" | |||
30 | end |
|
31 | end | |
31 |
|
32 | |||
32 | def caption |
|
33 | def caption | |
33 | l("field_#{name}") |
|
34 | l(@caption_key) | |
34 | end |
|
35 | end | |
35 |
|
36 | |||
36 | # Returns true if the column is sortable, otherwise false |
|
37 | # Returns true if the column is sortable, otherwise false | |
@@ -120,6 +121,7 class Query < ActiveRecord::Base | |||||
120 | @@available_columns = [ |
|
121 | @@available_columns = [ | |
121 | QueryColumn.new(:project, :sortable => "#{Project.table_name}.name", :groupable => true), |
|
122 | QueryColumn.new(:project, :sortable => "#{Project.table_name}.name", :groupable => true), | |
122 | QueryColumn.new(:tracker, :sortable => "#{Tracker.table_name}.position", :groupable => true), |
|
123 | QueryColumn.new(:tracker, :sortable => "#{Tracker.table_name}.position", :groupable => true), | |
|
124 | QueryColumn.new(:parent, :sortable => ["#{Issue.table_name}.root_id", "#{Issue.table_name}.lft ASC"], :default_order => 'desc', :caption => :field_parent_issue), | |||
123 | QueryColumn.new(:status, :sortable => "#{IssueStatus.table_name}.position", :groupable => true), |
|
125 | QueryColumn.new(:status, :sortable => "#{IssueStatus.table_name}.position", :groupable => true), | |
124 | QueryColumn.new(:priority, :sortable => "#{IssuePriority.table_name}.position", :default_order => 'desc', :groupable => true), |
|
126 | QueryColumn.new(:priority, :sortable => "#{IssuePriority.table_name}.position", :default_order => 'desc', :groupable => true), | |
125 | QueryColumn.new(:subject, :sortable => "#{Issue.table_name}.subject"), |
|
127 | QueryColumn.new(:subject, :sortable => "#{Issue.table_name}.subject"), |
@@ -13,7 +13,7 | |||||
13 | </tr></thead> |
|
13 | </tr></thead> | |
14 | <% previous_group = false %> |
|
14 | <% previous_group = false %> | |
15 | <tbody> |
|
15 | <tbody> | |
16 |
<% issues |
|
16 | <% issue_list(issues) do |issue, level| -%> | |
17 | <% if @query.grouped? && (group = @query.group_by_column.value(issue)) != previous_group %> |
|
17 | <% if @query.grouped? && (group = @query.group_by_column.value(issue)) != previous_group %> | |
18 | <% reset_cycle %> |
|
18 | <% reset_cycle %> | |
19 | <tr class="group open"> |
|
19 | <tr class="group open"> | |
@@ -24,7 +24,7 | |||||
24 | </tr> |
|
24 | </tr> | |
25 | <% previous_group = group %> |
|
25 | <% previous_group = group %> | |
26 | <% end %> |
|
26 | <% end %> | |
27 | <tr id="issue-<%= issue.id %>" class="hascontextmenu <%= cycle('odd', 'even') %> <%= issue.css_classes %>"> |
|
27 | <tr id="issue-<%= issue.id %>" class="hascontextmenu <%= cycle('odd', 'even') %> <%= issue.css_classes %> <%= level > 0 ? "idnt idnt-#{level}" : nil %>"> | |
28 | <td class="checkbox"><%= check_box_tag("ids[]", issue.id, false, :id => nil) %></td> |
|
28 | <td class="checkbox"><%= check_box_tag("ids[]", issue.id, false, :id => nil) %></td> | |
29 | <td><%= link_to issue.id, :controller => 'issues', :action => 'show', :id => issue %></td> |
|
29 | <td><%= link_to issue.id, :controller => 'issues', :action => 'show', :id => issue %></td> | |
30 | <% query.columns.each do |column| %><%= content_tag 'td', column_content(column, issue), :class => column.name %><% end %> |
|
30 | <% query.columns.each do |column| %><%= content_tag 'td', column_content(column, issue), :class => column.name %><% end %> |
@@ -118,6 +118,17 tr.issue td.subject, tr.issue td.category, td.assigned_to { white-space: normal; | |||||
118 | tr.issue td.subject { text-align: left; } |
|
118 | tr.issue td.subject { text-align: left; } | |
119 | tr.issue td.done_ratio table.progress { margin-left:auto; margin-right: auto;} |
|
119 | tr.issue td.done_ratio table.progress { margin-left:auto; margin-right: auto;} | |
120 |
|
120 | |||
|
121 | tr.issue.idnt td.subject a {background: url(../images/bullet_arrow_right.png) no-repeat 0 50%; padding-left: 16px;} | |||
|
122 | tr.issue.idnt-1 td.subject {padding-left: 0.5em;} | |||
|
123 | tr.issue.idnt-2 td.subject {padding-left: 2em;} | |||
|
124 | tr.issue.idnt-3 td.subject {padding-left: 3.5em;} | |||
|
125 | tr.issue.idnt-4 td.subject {padding-left: 5em;} | |||
|
126 | tr.issue.idnt-5 td.subject {padding-left: 6.5em;} | |||
|
127 | tr.issue.idnt-6 td.subject {padding-left: 8em;} | |||
|
128 | tr.issue.idnt-7 td.subject {padding-left: 9.5em;} | |||
|
129 | tr.issue.idnt-8 td.subject {padding-left: 11em;} | |||
|
130 | tr.issue.idnt-9 td.subject {padding-left: 12.5em;} | |||
|
131 | ||||
121 | tr.entry { border: 1px solid #f8f8f8; } |
|
132 | tr.entry { border: 1px solid #f8f8f8; } | |
122 | tr.entry td { white-space: nowrap; } |
|
133 | tr.entry td { white-space: nowrap; } | |
123 | tr.entry td.filename { width: 30%; } |
|
134 | tr.entry td.filename { width: 30%; } |
General Comments 0
You need to be logged in to leave comments.
Login now