##// END OF EJS Templates
Merged r13556 (#13673)....
Jean-Philippe Lang -
r13246:fa4b6f294b16
parent child
Show More

The requested changes are too big and content was truncated. Show full diff

@@ -1,200 +1,202
1 # encoding: utf-8
1 # encoding: utf-8
2 #
2 #
3 # Redmine - project management software
3 # Redmine - project management software
4 # Copyright (C) 2006-2014 Jean-Philippe Lang
4 # Copyright (C) 2006-2014 Jean-Philippe Lang
5 #
5 #
6 # This program is free software; you can redistribute it and/or
6 # This program is free software; you can redistribute it and/or
7 # modify it under the terms of the GNU General Public License
7 # modify it under the terms of the GNU General Public License
8 # as published by the Free Software Foundation; either version 2
8 # as published by the Free Software Foundation; either version 2
9 # of the License, or (at your option) any later version.
9 # of the License, or (at your option) any later version.
10 #
10 #
11 # This program is distributed in the hope that it will be useful,
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
14 # GNU General Public License for more details.
15 #
15 #
16 # You should have received a copy of the GNU General Public License
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19
19
20 module QueriesHelper
20 module QueriesHelper
21 include ApplicationHelper
21 include ApplicationHelper
22
22
23 def filters_options_for_select(query)
23 def filters_options_for_select(query)
24 options_for_select(filters_options(query))
24 options_for_select(filters_options(query))
25 end
25 end
26
26
27 def filters_options(query)
27 def filters_options(query)
28 options = [[]]
28 options = [[]]
29 options += query.available_filters.map do |field, field_options|
29 options += query.available_filters.map do |field, field_options|
30 [field_options[:name], field]
30 [field_options[:name], field]
31 end
31 end
32 end
32 end
33
33
34 def query_filters_hidden_tags(query)
34 def query_filters_hidden_tags(query)
35 tags = ''.html_safe
35 tags = ''.html_safe
36 query.filters.each do |field, options|
36 query.filters.each do |field, options|
37 tags << hidden_field_tag("f[]", field, :id => nil)
37 tags << hidden_field_tag("f[]", field, :id => nil)
38 tags << hidden_field_tag("op[#{field}]", options[:operator], :id => nil)
38 tags << hidden_field_tag("op[#{field}]", options[:operator], :id => nil)
39 options[:values].each do |value|
39 options[:values].each do |value|
40 tags << hidden_field_tag("v[#{field}][]", value, :id => nil)
40 tags << hidden_field_tag("v[#{field}][]", value, :id => nil)
41 end
41 end
42 end
42 end
43 tags
43 tags
44 end
44 end
45
45
46 def query_columns_hidden_tags(query)
46 def query_columns_hidden_tags(query)
47 tags = ''.html_safe
47 tags = ''.html_safe
48 query.columns.each do |column|
48 query.columns.each do |column|
49 tags << hidden_field_tag("c[]", column.name, :id => nil)
49 tags << hidden_field_tag("c[]", column.name, :id => nil)
50 end
50 end
51 tags
51 tags
52 end
52 end
53
53
54 def query_hidden_tags(query)
54 def query_hidden_tags(query)
55 query_filters_hidden_tags(query) + query_columns_hidden_tags(query)
55 query_filters_hidden_tags(query) + query_columns_hidden_tags(query)
56 end
56 end
57
57
58 def available_block_columns_tags(query)
58 def available_block_columns_tags(query)
59 tags = ''.html_safe
59 tags = ''.html_safe
60 query.available_block_columns.each do |column|
60 query.available_block_columns.each do |column|
61 tags << content_tag('label', check_box_tag('c[]', column.name.to_s, query.has_column?(column), :id => nil) + " #{column.caption}", :class => 'inline')
61 tags << content_tag('label', check_box_tag('c[]', column.name.to_s, query.has_column?(column), :id => nil) + " #{column.caption}", :class => 'inline')
62 end
62 end
63 tags
63 tags
64 end
64 end
65
65
66 def query_available_inline_columns_options(query)
66 def query_available_inline_columns_options(query)
67 (query.available_inline_columns - query.columns).reject(&:frozen?).collect {|column| [column.caption, column.name]}
67 (query.available_inline_columns - query.columns).reject(&:frozen?).collect {|column| [column.caption, column.name]}
68 end
68 end
69
69
70 def query_selected_inline_columns_options(query)
70 def query_selected_inline_columns_options(query)
71 (query.inline_columns & query.available_inline_columns).reject(&:frozen?).collect {|column| [column.caption, column.name]}
71 (query.inline_columns & query.available_inline_columns).reject(&:frozen?).collect {|column| [column.caption, column.name]}
72 end
72 end
73
73
74 def render_query_columns_selection(query, options={})
74 def render_query_columns_selection(query, options={})
75 tag_name = (options[:name] || 'c') + '[]'
75 tag_name = (options[:name] || 'c') + '[]'
76 render :partial => 'queries/columns', :locals => {:query => query, :tag_name => tag_name}
76 render :partial => 'queries/columns', :locals => {:query => query, :tag_name => tag_name}
77 end
77 end
78
78
79 def column_header(column)
79 def column_header(column)
80 column.sortable ? sort_header_tag(column.name.to_s, :caption => column.caption,
80 column.sortable ? sort_header_tag(column.name.to_s, :caption => column.caption,
81 :default_order => column.default_order) :
81 :default_order => column.default_order) :
82 content_tag('th', h(column.caption))
82 content_tag('th', h(column.caption))
83 end
83 end
84
84
85 def column_content(column, issue)
85 def column_content(column, issue)
86 value = column.value_object(issue)
86 value = column.value_object(issue)
87 if value.is_a?(Array)
87 if value.is_a?(Array)
88 value.collect {|v| column_value(column, issue, v)}.compact.join(', ').html_safe
88 value.collect {|v| column_value(column, issue, v)}.compact.join(', ').html_safe
89 else
89 else
90 column_value(column, issue, value)
90 column_value(column, issue, value)
91 end
91 end
92 end
92 end
93
93
94 def column_value(column, issue, value)
94 def column_value(column, issue, value)
95 case column.name
95 case column.name
96 when :id
96 when :id
97 link_to value, issue_path(issue)
97 link_to value, issue_path(issue)
98 when :subject
98 when :subject
99 link_to value, issue_path(issue)
99 link_to value, issue_path(issue)
100 when :parent
101 value ? (value.visible? ? link_to_issue(value, :subject => false) : "##{value.id}") : ''
100 when :description
102 when :description
101 issue.description? ? content_tag('div', textilizable(issue, :description), :class => "wiki") : ''
103 issue.description? ? content_tag('div', textilizable(issue, :description), :class => "wiki") : ''
102 when :done_ratio
104 when :done_ratio
103 progress_bar(value, :width => '80px')
105 progress_bar(value, :width => '80px')
104 when :relations
106 when :relations
105 other = value.other_issue(issue)
107 other = value.other_issue(issue)
106 content_tag('span',
108 content_tag('span',
107 (l(value.label_for(issue)) + " " + link_to_issue(other, :subject => false, :tracker => false)).html_safe,
109 (l(value.label_for(issue)) + " " + link_to_issue(other, :subject => false, :tracker => false)).html_safe,
108 :class => value.css_classes_for(issue))
110 :class => value.css_classes_for(issue))
109 else
111 else
110 format_object(value)
112 format_object(value)
111 end
113 end
112 end
114 end
113
115
114 def csv_content(column, issue)
116 def csv_content(column, issue)
115 value = column.value_object(issue)
117 value = column.value_object(issue)
116 if value.is_a?(Array)
118 if value.is_a?(Array)
117 value.collect {|v| csv_value(column, issue, v)}.compact.join(', ')
119 value.collect {|v| csv_value(column, issue, v)}.compact.join(', ')
118 else
120 else
119 csv_value(column, issue, value)
121 csv_value(column, issue, value)
120 end
122 end
121 end
123 end
122
124
123 def csv_value(column, issue, value)
125 def csv_value(column, issue, value)
124 format_object(value, false) do |value|
126 format_object(value, false) do |value|
125 case value.class.name
127 case value.class.name
126 when 'Float'
128 when 'Float'
127 sprintf("%.2f", value).gsub('.', l(:general_csv_decimal_separator))
129 sprintf("%.2f", value).gsub('.', l(:general_csv_decimal_separator))
128 when 'IssueRelation'
130 when 'IssueRelation'
129 other = value.other_issue(issue)
131 other = value.other_issue(issue)
130 l(value.label_for(issue)) + " ##{other.id}"
132 l(value.label_for(issue)) + " ##{other.id}"
131 when 'Issue'
133 when 'Issue'
132 value.id
134 value.id
133 else
135 else
134 value
136 value
135 end
137 end
136 end
138 end
137 end
139 end
138
140
139 def query_to_csv(items, query, options={})
141 def query_to_csv(items, query, options={})
140 encoding = l(:general_csv_encoding)
142 encoding = l(:general_csv_encoding)
141 columns = (options[:columns] == 'all' ? query.available_inline_columns : query.inline_columns)
143 columns = (options[:columns] == 'all' ? query.available_inline_columns : query.inline_columns)
142 query.available_block_columns.each do |column|
144 query.available_block_columns.each do |column|
143 if options[column.name].present?
145 if options[column.name].present?
144 columns << column
146 columns << column
145 end
147 end
146 end
148 end
147
149
148 export = FCSV.generate(:col_sep => l(:general_csv_separator)) do |csv|
150 export = FCSV.generate(:col_sep => l(:general_csv_separator)) do |csv|
149 # csv header fields
151 # csv header fields
150 csv << columns.collect {|c| Redmine::CodesetUtil.from_utf8(c.caption.to_s, encoding) }
152 csv << columns.collect {|c| Redmine::CodesetUtil.from_utf8(c.caption.to_s, encoding) }
151 # csv lines
153 # csv lines
152 items.each do |item|
154 items.each do |item|
153 csv << columns.collect {|c| Redmine::CodesetUtil.from_utf8(csv_content(c, item), encoding) }
155 csv << columns.collect {|c| Redmine::CodesetUtil.from_utf8(csv_content(c, item), encoding) }
154 end
156 end
155 end
157 end
156 export
158 export
157 end
159 end
158
160
159 # Retrieve query from session or build a new query
161 # Retrieve query from session or build a new query
160 def retrieve_query
162 def retrieve_query
161 if !params[:query_id].blank?
163 if !params[:query_id].blank?
162 cond = "project_id IS NULL"
164 cond = "project_id IS NULL"
163 cond << " OR project_id = #{@project.id}" if @project
165 cond << " OR project_id = #{@project.id}" if @project
164 @query = IssueQuery.where(cond).find(params[:query_id])
166 @query = IssueQuery.where(cond).find(params[:query_id])
165 raise ::Unauthorized unless @query.visible?
167 raise ::Unauthorized unless @query.visible?
166 @query.project = @project
168 @query.project = @project
167 session[:query] = {:id => @query.id, :project_id => @query.project_id}
169 session[:query] = {:id => @query.id, :project_id => @query.project_id}
168 sort_clear
170 sort_clear
169 elsif api_request? || params[:set_filter] || session[:query].nil? || session[:query][:project_id] != (@project ? @project.id : nil)
171 elsif api_request? || params[:set_filter] || session[:query].nil? || session[:query][:project_id] != (@project ? @project.id : nil)
170 # Give it a name, required to be valid
172 # Give it a name, required to be valid
171 @query = IssueQuery.new(:name => "_")
173 @query = IssueQuery.new(:name => "_")
172 @query.project = @project
174 @query.project = @project
173 @query.build_from_params(params)
175 @query.build_from_params(params)
174 session[:query] = {:project_id => @query.project_id, :filters => @query.filters, :group_by => @query.group_by, :column_names => @query.column_names}
176 session[:query] = {:project_id => @query.project_id, :filters => @query.filters, :group_by => @query.group_by, :column_names => @query.column_names}
175 else
177 else
176 # retrieve from session
178 # retrieve from session
177 @query = nil
179 @query = nil
178 @query = IssueQuery.find_by_id(session[:query][:id]) if session[:query][:id]
180 @query = IssueQuery.find_by_id(session[:query][:id]) if session[:query][:id]
179 @query ||= IssueQuery.new(:name => "_", :filters => session[:query][:filters], :group_by => session[:query][:group_by], :column_names => session[:query][:column_names])
181 @query ||= IssueQuery.new(:name => "_", :filters => session[:query][:filters], :group_by => session[:query][:group_by], :column_names => session[:query][:column_names])
180 @query.project = @project
182 @query.project = @project
181 end
183 end
182 end
184 end
183
185
184 def retrieve_query_from_session
186 def retrieve_query_from_session
185 if session[:query]
187 if session[:query]
186 if session[:query][:id]
188 if session[:query][:id]
187 @query = IssueQuery.find_by_id(session[:query][:id])
189 @query = IssueQuery.find_by_id(session[:query][:id])
188 return unless @query
190 return unless @query
189 else
191 else
190 @query = IssueQuery.new(:name => "_", :filters => session[:query][:filters], :group_by => session[:query][:group_by], :column_names => session[:query][:column_names])
192 @query = IssueQuery.new(:name => "_", :filters => session[:query][:filters], :group_by => session[:query][:group_by], :column_names => session[:query][:column_names])
191 end
193 end
192 if session[:query].has_key?(:project_id)
194 if session[:query].has_key?(:project_id)
193 @query.project_id = session[:query][:project_id]
195 @query.project_id = session[:query][:project_id]
194 else
196 else
195 @query.project = @project
197 @query.project = @project
196 end
198 end
197 @query
199 @query
198 end
200 end
199 end
201 end
200 end
202 end
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
General Comments 0
You need to be logged in to leave comments. Login now