##// END OF EJS Templates
Adds dynamic columns selection on the issue list (#4272)....
Jean-Philippe Lang -
r2991:66540afc0820
parent child
Show More
@@ -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.collect {|n| n.is_a?(Symbol) ? n : n.to_sym } if 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(@query.columns.collect {|column| [column.caption, column.name]}),
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