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 @ 1534:b31caaed9d4d

History | View | Annotate | Download (6.88 KB)

1
# encoding: utf-8
2
#
3
# Redmine - project management software
4
# Copyright (C) 2006-2014  Jean-Philippe Lang
5
#
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
#
11
# 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
#
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
18
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19

    
20
module QueriesHelper
21
  def filters_options_for_select(query)
22
    options_for_select(filters_options(query))
23
  end
24

    
25
  def filters_options(query)
26
    options = [[]]
27
    options += query.available_filters.map do |field, field_options|
28
      [field_options[:name], field]
29
    end
30
  end
31

    
32
  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
  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), :id => nil) + " #{column.caption}", :class => 'inline')
60
    end
61
    tags
62
  end
63

    
64
  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
  def column_header(column)
78
    column.sortable ? sort_header_tag(column.name.to_s, :caption => column.caption,
79
                                                        :default_order => column.default_order) :
80
                      content_tag('th', h(column.caption))
81
  end
82

    
83
  def column_content(column, issue)
84
    value = column.value(issue)
85
    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
    case column.name
94
    when :id
95
      link_to value, issue_path(issue)
96
    when :subject
97
      link_to value, issue_path(issue)
98
    when :description
99
      issue.description? ? content_tag('div', textilizable(issue, :description), :class => "wiki") : ''
100
    when :done_ratio
101
      progress_bar(value, :width => '80px')
102
    when :relations
103
      other = value.other_issue(issue)
104
      content_tag('span',
105
        (l(value.label_for(issue)) + " " + link_to_issue(other, :subject => false, :tracker => false)).html_safe,
106
        :class => value.css_classes_for(issue))
107
    else
108
      format_object(value)
109
    end
110
  end
111

    
112
  def csv_content(column, issue)
113
    value = column.value(issue)
114
    if value.is_a?(Array)
115
      value.collect {|v| csv_value(column, issue, v)}.compact.join(', ')
116
    else
117
      csv_value(column, issue, value)
118
    end
119
  end
120

    
121
  def csv_value(column, issue, value)
122
    case value.class.name
123
    when 'Time'
124
      format_time(value)
125
    when 'Date'
126
      format_date(value)
127
    when 'Float'
128
      sprintf("%.2f", value).gsub('.', l(:general_csv_decimal_separator))
129
    when 'IssueRelation'
130
      other = value.other_issue(issue)
131
      l(value.label_for(issue)) + " ##{other.id}"
132
    when 'TrueClass'
133
      l(:general_text_Yes)
134
    when 'FalseClass'
135
      l(:general_text_No)
136
    else
137
      value.to_s
138
    end
139
  end
140

    
141
  def query_to_csv(items, query, options={})
142
    encoding = l(:general_csv_encoding)
143
    columns = (options[:columns] == 'all' ? query.available_inline_columns : query.inline_columns)
144
    query.available_block_columns.each do |column|
145
      if options[column.name].present?
146
        columns << column
147
      end
148
    end
149

    
150
    export = FCSV.generate(:col_sep => l(:general_csv_separator)) do |csv|
151
      # csv header fields
152
      csv << columns.collect {|c| Redmine::CodesetUtil.from_utf8(c.caption.to_s, encoding) }
153
      # csv lines
154
      items.each do |item|
155
        csv << columns.collect {|c| Redmine::CodesetUtil.from_utf8(csv_content(c, item), encoding) }
156
      end
157
    end
158
    export
159
  end
160

    
161
  # Retrieve query from session or build a new query
162
  def retrieve_query
163
    if !params[:query_id].blank?
164
      cond = "project_id IS NULL"
165
      cond << " OR project_id = #{@project.id}" if @project
166
      @query = IssueQuery.where(cond).find(params[:query_id])
167
      raise ::Unauthorized unless @query.visible?
168
      @query.project = @project
169
      session[:query] = {:id => @query.id, :project_id => @query.project_id}
170
      sort_clear
171
    elsif api_request? || params[:set_filter] || session[:query].nil? || session[:query][:project_id] != (@project ? @project.id : nil)
172
      # Give it a name, required to be valid
173
      @query = IssueQuery.new(:name => "_")
174
      @query.project = @project
175
      @query.build_from_params(params)
176
      session[:query] = {:project_id => @query.project_id, :filters => @query.filters, :group_by => @query.group_by, :column_names => @query.column_names}
177
    else
178
      # retrieve from session
179
      @query = nil
180
      @query = IssueQuery.find_by_id(session[:query][:id]) if session[:query][:id]
181
      @query ||= IssueQuery.new(:name => "_", :filters => session[:query][:filters], :group_by => session[:query][:group_by], :column_names => session[:query][:column_names])
182
      @query.project = @project
183
    end
184
  end
185

    
186
  def retrieve_query_from_session
187
    if session[:query]
188
      if session[:query][:id]
189
        @query = IssueQuery.find_by_id(session[:query][:id])
190
        return unless @query
191
      else
192
        @query = IssueQuery.new(:name => "_", :filters => session[:query][:filters], :group_by => session[:query][:group_by], :column_names => session[:query][:column_names])
193
      end
194
      if session[:query].has_key?(:project_id)
195
        @query.project_id = session[:query][:project_id]
196
      else
197
        @query.project = @project
198
      end
199
      @query
200
    end
201
  end
202
end