To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.

Statistics Download as Zip
| Branch: | Tag: | Revision:

root / app / helpers / queries_helper.rb @ 1298:4f746d8966dd

History | View | Annotate | Download (7.47 KB)

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