Feature #2679 » group_by_patch.patch
app/controllers/issues_controller.rb (revision 2) | ||
---|---|---|
64 | 64 |
:conditions => @query.statement, |
65 | 65 |
:limit => limit, |
66 | 66 |
:offset => @issue_pages.current.offset |
67 |
if !params[:group_by].nil? |
|
68 |
@query.group_by = params[:group_by].to_s |
|
69 |
end |
|
67 | 70 |
respond_to do |format| |
68 | 71 |
format.html { render :template => 'issues/index.rhtml', :layout => !request.xhr? } |
69 | 72 |
format.atom { render_feed(@issues, :title => "#{@project || Setting.app_title}: #{l(:label_issue_plural)}") } |
app/controllers/queries_controller.rb (revision 2) | ||
---|---|---|
26 | 26 |
@query.user = User.current |
27 | 27 |
@query.is_public = false unless (@query.project && current_role.allowed_to?(:manage_public_queries)) || User.current.admin? |
28 | 28 |
@query.column_names = nil if params[:default_columns] |
29 |
@query.group_by = params[:group_by] |
|
29 | 30 |
|
30 | 31 |
params[:fields].each do |field| |
31 | 32 |
@query.add_filter(field, params[:operators][field], params[:values][field]) |
... | ... | |
49 | 50 |
@query.project = nil if params[:query_is_for_all] |
50 | 51 |
@query.is_public = false unless (@query.project && current_role.allowed_to?(:manage_public_queries)) || User.current.admin? |
51 | 52 |
@query.column_names = nil if params[:default_columns] |
53 |
@query.group_by = params[:group_by].to_s |
|
52 | 54 |
|
53 | 55 |
if @query.save |
54 | 56 |
flash[:notice] = l(:notice_successful_update) |
app/views/issues/_list.rhtml (revision 2) | ||
---|---|---|
1 |
<script type="text/javascript"> |
|
2 |
//<![CDATA[ |
|
3 |
function toggle_group(group_id) { |
|
4 |
$$('tr.group-' + group_id).invoke('toggle');//.hide(); |
|
5 |
el = $('gh-' + group_id); |
|
6 |
el.className = (el.className == "entry")?'entry open':'entry'; |
|
7 |
} |
|
8 |
//]]> |
|
9 |
</script> |
|
1 | 10 |
<% form_tag({}) do -%> |
2 | 11 |
<table class="list issues"> |
3 | 12 |
<thead><tr> |
... | ... | |
10 | 19 |
<% end %> |
11 | 20 |
</tr></thead> |
12 | 21 |
<tbody> |
13 |
<% issues.each do |issue| -%> |
|
14 |
<tr id="issue-<%= issue.id %>" class="hascontextmenu <%= cycle('odd', 'even') %> <%= css_issue_classes(issue) %>"> |
|
22 | ||
23 |
<% is_group_defined = query.group_by.nil? %> |
|
24 |
<% if !is_group_defined %> |
|
25 |
<% is_group_defined = query.group_by.empty? %> |
|
26 |
<% end %> |
|
27 |
<% if is_group_defined %> |
|
28 |
<% @issues_by_group = { "" => @issues } %> |
|
29 |
<% else %> |
|
30 |
<% column = query.columns.find{|c| c.name.to_s == query.group_by} %> |
|
31 |
<% @issues_by_group = @issues.group_by {|i| column_content(column, i) } %> |
|
32 |
<% end %> |
|
33 | ||
34 |
<% col_nums = query.columns.size %> |
|
35 |
<% group_num = 0 %> |
|
36 |
<% @issues_by_group.each do |key, issue_list| -%> |
|
37 |
<% group_num = group_num+1 %> |
|
38 |
|
|
39 |
<% if !is_group_defined %> |
|
40 |
<tr class="entry open" id="gh-<%= group_num.to_s %>"> |
|
41 |
<td colspan="<%= col_nums+2 %>" class="header" style="padding-top: 10px; padding-bottom: 10px; font-weight: bold;"> |
|
42 |
<span class="expander" onclick='toggle_group(<%= group_num.to_s %>);'> </span></a> [<%= key %>] (<%= issue_list.size %>)</td> |
|
43 |
</tr> |
|
44 |
<% end %> |
|
45 | ||
46 |
<% issue_list.each do |issue| -%> |
|
47 |
<tr id="issue-<%= issue.id %>" class="hascontextmenu <%= cycle('odd', 'even') %> <%= css_issue_classes(issue) %> group-<%= group_num %>"> |
|
15 | 48 |
<td class="checkbox"><%= check_box_tag("ids[]", issue.id, false, :id => nil) %></td> |
16 | 49 |
<td><%= link_to issue.id, :controller => 'issues', :action => 'show', :id => issue %></td> |
17 | 50 |
<% query.columns.each do |column| %><%= content_tag 'td', column_content(column, issue), :class => column.name %><% end %> |
18 | 51 |
</tr> |
52 | ||
19 | 53 |
<% end -%> |
54 | ||
55 |
<% end -%> |
|
56 |
|
|
20 | 57 |
</tbody> |
21 | 58 |
</table> |
22 | 59 |
<% end -%> |
app/views/queries/_filters.rhtml (revision 2) | ||
---|---|---|
58 | 58 | |
59 | 59 |
<table width="100%"> |
60 | 60 |
<tr> |
61 |
<td> |
|
61 |
<td rowspan="2">
|
|
62 | 62 |
<table> |
63 | 63 |
<% query.available_filters.sort{|a,b| a[1][:order]<=>b[1][:order]}.each do |filter| %> |
64 | 64 |
<% field = filter[0] |
... | ... | |
95 | 95 |
</td> |
96 | 96 |
<td class="add-filter"> |
97 | 97 |
<%= l(:label_filter_add) %>: |
98 |
<%= 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" %> |
|
98 |
<%= 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" %>
|
|
99 | 99 |
</td> |
100 | 100 |
</tr> |
101 |
<tr> |
|
102 |
<td class="add-filter"> |
|
103 |
<%= l(:label_group_by) %>: |
|
104 |
<%= 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" %> |
|
105 |
</td> |
|
106 |
</tr> |
|
101 | 107 |
</table> |
lang/ru.yml (revision 2) | ||
---|---|---|
730 | 730 |
text_wiki_destroy_confirmation: Вы уверены, что хотите удалить данную Wiki и все ее содержимое? |
731 | 731 |
text_workflow_edit: Выберите роль и трекер для редактирования последовательности состояний |
732 | 732 | |
733 |
label_group_by: Группировать по |