@@ -73,7 +73,7 class IssuesController < ApplicationController | |||
|
73 | 73 | if @query.grouped? |
|
74 | 74 | # Retrieve the issue count by group |
|
75 | 75 | @issue_count_by_group = begin |
|
76 | Issue.count(:group => @query.group_by, :include => [:status, :project], :conditions => @query.statement) | |
|
76 | Issue.count(:group => @query.group_by_statement, :include => [:status, :project], :conditions => @query.statement) | |
|
77 | 77 | # Rails will raise an (unexpected) error if there's only a nil group value |
|
78 | 78 | rescue ActiveRecord::RecordNotFound |
|
79 | 79 | {nil => @issue_count} |
@@ -27,6 +27,15 module QueriesHelper | |||
|
27 | 27 | content_tag('th', column.caption) |
|
28 | 28 | end |
|
29 | 29 | |
|
30 | def column_value(column, issue) | |
|
31 | if column.is_a?(QueryCustomFieldColumn) | |
|
32 | cv = issue.custom_values.detect {|v| v.custom_field_id == column.custom_field.id} | |
|
33 | show_value(cv) | |
|
34 | else | |
|
35 | value = issue.send(column.name) | |
|
36 | end | |
|
37 | end | |
|
38 | ||
|
30 | 39 | def column_content(column, issue) |
|
31 | 40 | if column.is_a?(QueryCustomFieldColumn) |
|
32 | 41 | cv = issue.custom_values.detect {|v| v.custom_field_id == column.custom_field.id} |
@@ -23,6 +23,9 class QueryColumn | |||
|
23 | 23 | self.name = name |
|
24 | 24 | self.sortable = options[:sortable] |
|
25 | 25 | self.groupable = options[:groupable] || false |
|
26 | if groupable == true | |
|
27 | self.groupable = name.to_s | |
|
28 | end | |
|
26 | 29 | self.default_order = options[:default_order] |
|
27 | 30 | end |
|
28 | 31 | |
@@ -41,6 +44,10 class QueryCustomFieldColumn < QueryColumn | |||
|
41 | 44 | def initialize(custom_field) |
|
42 | 45 | self.name = "cf_#{custom_field.id}".to_sym |
|
43 | 46 | self.sortable = custom_field.order_statement || false |
|
47 | if %w(list date bool int).include?(custom_field.field_format) | |
|
48 | self.groupable = custom_field.order_statement | |
|
49 | end | |
|
50 | self.groupable ||= false | |
|
44 | 51 | @cf = custom_field |
|
45 | 52 | end |
|
46 | 53 | |
@@ -312,6 +319,10 class Query < ActiveRecord::Base | |||
|
312 | 319 | groupable_columns.detect {|c| c.name.to_s == group_by} |
|
313 | 320 | end |
|
314 | 321 | |
|
322 | def group_by_statement | |
|
323 | group_by_column.groupable | |
|
324 | end | |
|
325 | ||
|
315 | 326 | def project_statement |
|
316 | 327 | project_clauses = [] |
|
317 | 328 | if project && !@project.descendants.active.empty? |
@@ -10,11 +10,10 | |||
|
10 | 10 | <%= column_header(column) %> |
|
11 | 11 | <% end %> |
|
12 | 12 | </tr></thead> |
|
13 | <% group = false %> | |
|
13 | <% previous_group = false %> | |
|
14 | 14 | <tbody> |
|
15 | 15 | <% issues.each do |issue| -%> |
|
16 |
<% if @query.grouped? && |
|
|
17 | <% group = issue.send(@query.group_by) %> | |
|
16 | <% if @query.grouped? && (group = column_value(@query.group_by_column, issue) || '') != previous_group %> | |
|
18 | 17 | <% reset_cycle %> |
|
19 | 18 | <tr class="group open"> |
|
20 | 19 | <td colspan="<%= query.columns.size + 2 %>"> |
@@ -22,6 +21,7 | |||
|
22 | 21 | <%= group.blank? ? 'None' : group %> <span class="count">(<%= @issue_count_by_group[group] %>)</span> |
|
23 | 22 | </td> |
|
24 | 23 | </tr> |
|
24 | <% previous_group = group %> | |
|
25 | 25 | <% end %> |
|
26 | 26 | <tr id="issue-<%= issue.id %>" class="hascontextmenu <%= cycle('odd', 'even') %> <%= issue.css_classes %>"> |
|
27 | 27 | <td class="checkbox"><%= check_box_tag("ids[]", issue.id, false, :id => nil) %></td> |
@@ -134,4 +134,23 queries_008: | |||
|
134 | 134 | |
|
135 | 135 | user_id: 2 |
|
136 | 136 | column_names: |
|
137 | queries_009: | |
|
138 | id: 9 | |
|
139 | project_id: | |
|
140 | is_public: true | |
|
141 | name: Open issues grouped by list custom field | |
|
142 | filters: | | |
|
143 | --- | |
|
144 | status_id: | |
|
145 | :values: | |
|
146 | - "1" | |
|
147 | :operator: o | |
|
148 | ||
|
149 | user_id: 1 | |
|
150 | column_names: | |
|
151 | group_by: cf_1 | |
|
152 | sort_criteria: | | |
|
153 | --- | |
|
154 | - - priority | |
|
155 | - desc | |
|
137 | 156 |
@@ -171,12 +171,26 class IssuesControllerTest < ActionController::TestCase | |||
|
171 | 171 | assert_nil assigns(:issue_count_by_group) |
|
172 | 172 | end |
|
173 | 173 | |
|
174 |
def test_index_with_grouped_ |
|
|
174 | def test_index_with_query_grouped_by_tracker | |
|
175 | 175 | get :index, :project_id => 1, :query_id => 6 |
|
176 | 176 | assert_response :success |
|
177 | 177 | assert_template 'index.rhtml' |
|
178 | 178 | assert_not_nil assigns(:issues) |
|
179 |
|
|
|
179 | count_by_group = assigns(:issue_count_by_group) | |
|
180 | assert_kind_of Hash, count_by_group | |
|
181 | assert_kind_of Tracker, count_by_group.keys.first | |
|
182 | assert_not_nil count_by_group[Tracker.find(1)] | |
|
183 | end | |
|
184 | ||
|
185 | def test_index_with_query_grouped_by_list_custom_field | |
|
186 | get :index, :project_id => 1, :query_id => 9 | |
|
187 | assert_response :success | |
|
188 | assert_template 'index.rhtml' | |
|
189 | assert_not_nil assigns(:issues) | |
|
190 | count_by_group = assigns(:issue_count_by_group) | |
|
191 | assert_kind_of Hash, count_by_group | |
|
192 | assert_kind_of String, count_by_group.keys.first | |
|
193 | assert_not_nil count_by_group['MySQL'] | |
|
180 | 194 | end |
|
181 | 195 | |
|
182 | 196 | def test_index_csv_with_project |
@@ -197,6 +197,11 class QueryTest < ActiveSupport::TestCase | |||
|
197 | 197 | assert q.has_column?(c) |
|
198 | 198 | end |
|
199 | 199 | |
|
200 | def test_groupable_columns_should_include_custom_fields | |
|
201 | q = Query.new | |
|
202 | assert q.groupable_columns.detect {|c| c.is_a? QueryCustomFieldColumn} | |
|
203 | end | |
|
204 | ||
|
200 | 205 | def test_default_sort |
|
201 | 206 | q = Query.new |
|
202 | 207 | assert_equal [], q.sort_criteria |
General Comments 0
You need to be logged in to leave comments.
Login now