@@ -501,10 +501,11 private | |||||
501 | end |
|
501 | end | |
502 | end |
|
502 | end | |
503 | @query.group_by = params[:group_by] |
|
503 | @query.group_by = params[:group_by] | |
504 | session[:query] = {:project_id => @query.project_id, :filters => @query.filters, :group_by => @query.group_by} |
|
504 | @query.column_names = params[:query] && params[:query][:column_names] | |
|
505 | session[:query] = {:project_id => @query.project_id, :filters => @query.filters, :group_by => @query.group_by, :column_names => @query.column_names} | |||
505 | else |
|
506 | else | |
506 | @query = Query.find_by_id(session[:query][:id]) if session[:query][:id] |
|
507 | @query = Query.find_by_id(session[:query][:id]) if session[:query][:id] | |
507 | @query ||= Query.new(:name => "_", :project => @project, :filters => session[:query][:filters], :group_by => session[:query][:group_by]) |
|
508 | @query ||= Query.new(:name => "_", :project => @project, :filters => session[:query][:filters], :group_by => session[:query][:group_by], :column_names => session[:query][:column_names]) | |
508 | @query.project = @project |
|
509 | @query.project = @project | |
509 | end |
|
510 | end | |
510 | end |
|
511 | end |
@@ -270,8 +270,14 class Query < ActiveRecord::Base | |||||
270 | end |
|
270 | end | |
271 |
|
271 | |||
272 | def column_names=(names) |
|
272 | def column_names=(names) | |
273 | names = names.select {|n| n.is_a?(Symbol) || !n.blank? } if names |
|
273 | if names | |
274 |
names = names. |
|
274 | names = names.select {|n| n.is_a?(Symbol) || !n.blank? } | |
|
275 | names = names.collect {|n| n.is_a?(Symbol) ? n : n.to_sym } | |||
|
276 | # Set column_names to nil if default columns | |||
|
277 | if names.map(&:to_s) == Setting.issue_list_default_columns | |||
|
278 | names = nil | |||
|
279 | end | |||
|
280 | end | |||
275 | write_attribute(:column_names, names) |
|
281 | write_attribute(:column_names, names) | |
276 | end |
|
282 | end | |
277 |
|
283 |
@@ -20,8 +20,16 | |||||
20 | <fieldset class="collapsible collapsed"> |
|
20 | <fieldset class="collapsible collapsed"> | |
21 | <legend onclick="toggleFieldset(this);"><%= l(:label_options) %></legend> |
|
21 | <legend onclick="toggleFieldset(this);"><%= l(:label_options) %></legend> | |
22 | <div style="display: none;"> |
|
22 | <div style="display: none;"> | |
23 | <%= l(:field_group_by) %> |
|
23 | <table> | |
24 | <%= select_tag('group_by', options_for_select([[]] + @query.groupable_columns.collect {|c| [c.caption, c.name.to_s]}, @query.group_by)) %> |
|
24 | <tr> | |
|
25 | <td><%= l(:field_column_names) %></td> | |||
|
26 | <td><%= render :partial => 'queries/columns', :locals => {:query => @query} %></td> | |||
|
27 | </tr> | |||
|
28 | <tr> | |||
|
29 | <td><%= l(:field_group_by) %></td> | |||
|
30 | <td><%= select_tag('group_by', options_for_select([[]] + @query.groupable_columns.collect {|c| [c.caption, c.name.to_s]}, @query.group_by)) %></td> | |||
|
31 | </tr> | |||
|
32 | </table> | |||
25 | </div> |
|
33 | </div> | |
26 | </fieldset> |
|
34 | </fieldset> | |
27 | </div> |
|
35 | </div> | |
@@ -29,6 +37,7 | |||||
29 |
|
37 | |||
30 | <%= link_to_remote l(:button_apply), |
|
38 | <%= link_to_remote l(:button_apply), | |
31 | { :url => { :set_filter => 1 }, |
|
39 | { :url => { :set_filter => 1 }, | |
|
40 | :before => 'selectAllOptions("selected_columns");', | |||
32 | :update => "content", |
|
41 | :update => "content", | |
33 | :with => "Form.serialize('query_form')" |
|
42 | :with => "Form.serialize('query_form')" | |
34 | }, :class => 'icon icon-checked' %> |
|
43 | }, :class => 'icon icon-checked' %> | |
@@ -40,7 +49,7 | |||||
40 | }, :class => 'icon icon-reload' %> |
|
49 | }, :class => 'icon icon-reload' %> | |
41 |
|
50 | |||
42 | <% if @query.new_record? && User.current.allowed_to?(:save_queries, @project, :global => true) %> |
|
51 | <% if @query.new_record? && User.current.allowed_to?(:save_queries, @project, :global => true) %> | |
43 | <%= link_to l(:button_save), {}, :onclick => "$('query_form').submit(); return false;", :class => 'icon icon-save' %> |
|
52 | <%= link_to l(:button_save), {}, :onclick => "selectAllOptions('selected_columns'); $('query_form').submit(); return false;", :class => 'icon icon-save' %> | |
44 | <% end %> |
|
53 | <% end %> | |
45 | </p> |
|
54 | </p> | |
46 | <% end %> |
|
55 | <% end %> |
@@ -1,10 +1,6 | |||||
1 | <% content_tag 'fieldset', :id => 'columns', :style => (query.has_default_columns? ? 'display:none;' : nil) do %> |
|
1 | <table style="border-collapse: collapse; border:0;"> | |
2 | <legend><%= l(:field_column_names) %></legend> |
|
|||
3 |
|
||||
4 | <%= hidden_field_tag 'query[column_names][]', '', :id => nil %> |
|
|||
5 | <table> |
|
|||
6 | <tr> |
|
2 | <tr> | |
7 | <td><%= select_tag 'available_columns', |
|
3 | <td style="padding-left:0"><%= select_tag 'available_columns', | |
8 | options_for_select((query.available_columns - query.columns).collect {|column| [column.caption, column.name]}), |
|
4 | options_for_select((query.available_columns - query.columns).collect {|column| [column.caption, column.name]}), | |
9 | :multiple => true, :size => 10, :style => "width:150px" %> |
|
5 | :multiple => true, :size => 10, :style => "width:150px" %> | |
10 | </td> |
|
6 | </td> | |
@@ -15,12 +11,11 | |||||
15 | onclick="moveOptions(this.form.selected_columns, this.form.available_columns);" /> |
|
11 | onclick="moveOptions(this.form.selected_columns, this.form.available_columns);" /> | |
16 | </td> |
|
12 | </td> | |
17 | <td><%= select_tag 'query[column_names][]', |
|
13 | <td><%= select_tag 'query[column_names][]', | |
18 |
options_for_select( |
|
14 | options_for_select(query.columns.collect {|column| [column.caption, column.name]}), | |
19 | :id => 'selected_columns', :multiple => true, :size => 10, :style => "width:150px" %> |
|
15 | :id => 'selected_columns', :multiple => true, :size => 10, :style => "width:150px" %> | |
20 | </td> |
|
16 | </td> | |
21 | </tr> |
|
17 | </tr> | |
22 | </table> |
|
18 | </table> | |
23 | <% end %> |
|
|||
24 |
|
19 | |||
25 | <% content_for :header_tags do %> |
|
20 | <% content_for :header_tags do %> | |
26 | <%= javascript_include_tag 'select_list_move' %> |
|
21 | <%= javascript_include_tag 'select_list_move' %> |
@@ -37,5 +37,9 | |||||
37 | <% end %> |
|
37 | <% end %> | |
38 | </fieldset> |
|
38 | </fieldset> | |
39 |
|
39 | |||
|
40 | <% content_tag 'fieldset', :id => 'columns', :style => (query.has_default_columns? ? 'display:none;' : nil) do %> | |||
|
41 | <legend><%= l(:field_column_names) %></legend> | |||
40 | <%= render :partial => 'queries/columns', :locals => {:query => query}%> |
|
42 | <%= render :partial => 'queries/columns', :locals => {:query => query}%> | |
|
43 | <% end %> | |||
|
44 | ||||
41 | </div> |
|
45 | </div> |
@@ -255,6 +255,22 class IssuesControllerTest < ActionController::TestCase | |||||
255 | assert !issues.empty? |
|
255 | assert !issues.empty? | |
256 | assert_equal issues.sort {|a,b| a.tracker == b.tracker ? b.id <=> a.id : a.tracker <=> b.tracker }.collect(&:id), issues.collect(&:id) |
|
256 | assert_equal issues.sort {|a,b| a.tracker == b.tracker ? b.id <=> a.id : a.tracker <=> b.tracker }.collect(&:id), issues.collect(&:id) | |
257 | end |
|
257 | end | |
|
258 | ||||
|
259 | def test_index_with_columns | |||
|
260 | columns = ['tracker', 'subject', 'assigned_to'] | |||
|
261 | get :index, :set_filter => 1, :query => { 'column_names' => columns} | |||
|
262 | assert_response :success | |||
|
263 | ||||
|
264 | # query should use specified columns | |||
|
265 | query = assigns(:query) | |||
|
266 | assert_kind_of Query, query | |||
|
267 | assert_equal columns, query.column_names.map(&:to_s) | |||
|
268 | ||||
|
269 | # columns should be stored in session | |||
|
270 | assert_kind_of Hash, session[:query] | |||
|
271 | assert_kind_of Array, session[:query][:column_names] | |||
|
272 | assert_equal columns, session[:query][:column_names].map(&:to_s) | |||
|
273 | end | |||
258 |
|
274 | |||
259 | def test_gantt |
|
275 | def test_gantt | |
260 | get :gantt, :project_id => 1 |
|
276 | get :gantt, :project_id => 1 |
General Comments 0
You need to be logged in to leave comments.
Login now