Index: app/controllers/issues_controller.rb =================================================================== --- app/controllers/issues_controller.rb (revision 1) +++ app/controllers/issues_controller.rb (revision 2) @@ -64,6 +64,9 @@ :conditions => @query.statement, :limit => limit, :offset => @issue_pages.current.offset + if !params[:group_by].nil? + @query.group_by = params[:group_by].to_s + end respond_to do |format| format.html { render :template => 'issues/index.rhtml', :layout => !request.xhr? } format.atom { render_feed(@issues, :title => "#{@project || Setting.app_title}: #{l(:label_issue_plural)}") } Index: app/controllers/queries_controller.rb =================================================================== --- app/controllers/queries_controller.rb (revision 1) +++ app/controllers/queries_controller.rb (revision 2) @@ -26,6 +26,7 @@ @query.user = User.current @query.is_public = false unless (@query.project && current_role.allowed_to?(:manage_public_queries)) || User.current.admin? @query.column_names = nil if params[:default_columns] + @query.group_by = params[:group_by] params[:fields].each do |field| @query.add_filter(field, params[:operators][field], params[:values][field]) @@ -49,6 +50,7 @@ @query.project = nil if params[:query_is_for_all] @query.is_public = false unless (@query.project && current_role.allowed_to?(:manage_public_queries)) || User.current.admin? @query.column_names = nil if params[:default_columns] + @query.group_by = params[:group_by].to_s if @query.save flash[:notice] = l(:notice_successful_update) Index: app/views/issues/_list.rhtml =================================================================== --- app/views/issues/_list.rhtml (revision 1) +++ app/views/issues/_list.rhtml (revision 2) @@ -1,3 +1,12 @@ + <% form_tag({}) do -%> @@ -10,13 +19,41 @@ <% end %> - <% issues.each do |issue| -%> - + + <% is_group_defined = query.group_by.nil? %> + <% if !is_group_defined %> + <% is_group_defined = query.group_by.empty? %> + <% end %> + <% if is_group_defined %> + <% @issues_by_group = { "" => @issues } %> + <% else %> + <% column = query.columns.find{|c| c.name.to_s == query.group_by} %> + <% @issues_by_group = @issues.group_by {|i| column_content(column, i) } %> + <% end %> + + <% col_nums = query.columns.size %> + <% group_num = 0 %> + <% @issues_by_group.each do |key, issue_list| -%> + <% group_num = group_num+1 %> + + <% if !is_group_defined %> + + + + <% end %> + + <% issue_list.each do |issue| -%> + <% query.columns.each do |column| %><%= content_tag 'td', column_content(column, issue), :class => column.name %><% end %> + <% end -%> + + <% end -%> +
+   [<%= key %>] (<%= issue_list.size %>)
<%= check_box_tag("ids[]", issue.id, false, :id => nil) %> <%= link_to issue.id, :controller => 'issues', :action => 'show', :id => issue %>
<% end -%> Index: app/views/queries/_filters.rhtml =================================================================== --- app/views/queries/_filters.rhtml (revision 1) +++ app/views/queries/_filters.rhtml (revision 2) @@ -58,7 +58,7 @@ -
+ <% query.available_filters.sort{|a,b| a[1][:order]<=>b[1][:order]}.each do |filter| %> <% field = filter[0] @@ -95,7 +95,13 @@ + + +
<%= l(:label_filter_add) %>: -<%= select_tag 'add_filter_select', options_for_select([["",""]] + query.available_filters.sort{|a,b| a[1][:order]<=>b[1][:order]}.collect{|field| [ field[1][:name] || l(("field_"+field[0].to_s.gsub(/\_id$/, "")).to_sym), field[0]] unless query.has_filter?(field[0])}.compact), :onchange => "add_filter();", :class => "select-small" %> +<%= select_tag 'add_filter_select', options_for_select([["",""]] + query.available_filters.sort{|a,b| a[1][:order]<=>b[1][:order]}.collect{|field| [ field[1][:name] || l(("field_"+field[0].to_s.gsub(/\_id$/, "")).to_sym), field[0]] unless query.has_filter?(field[0])}.compact), :onchange => "add_filter();", :class => "select-small", :style => "width: 150px" %>
+<%= l(:label_group_by) %>: +<%= select_tag 'group_by', options_for_select([["",""]] + query.columns.collect {|column| [column.caption, column.name.to_s]}, query.group_by), :class => "select-small", :style => "width: 150px" %> +
Index: lang/ru.yml =================================================================== --- lang/ru.yml (revision 1) +++ lang/ru.yml (revision 2) @@ -730,3 +730,4 @@ text_wiki_destroy_confirmation: Вы уверены, что хотите удалить данную Wiki и все ее содержимое? text_workflow_edit: Выберите роль и трекер для редактирования последовательности состояний +label_group_by: Группировать по \ No newline at end of file