Module: QueriesHelper

Overview

Redmine - project management software Copyright (C) 2006-2016 Jean-Philippe Lang

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

Since:

  • 0.4.0

Constant Summary

Constants included from ApplicationHelper

ApplicationHelper::HEADING_RE, ApplicationHelper::MACROS_RE, ApplicationHelper::MACRO_SUB_RE, ApplicationHelper::TOC_RE

Instance Method Summary collapse

Methods included from ApplicationHelper

#accesskey, #anchor, #api_meta, #authoring, #authorize_for, #avatar, #avatar_edit_link, #back_url, #back_url_hidden_field_tag, #body_css_classes, #breadcrumb, #calendar_for, #catch_macros, #check_all_links, #checked_image, #context_menu, #delete_link, #due_date_distance_in_words, #email_delivery_enabled?, #error_messages_for, #favicon, #favicon_path, #favicon_url, #format_activity_day, #format_activity_description, #format_activity_title, #format_object, #format_version_name, #generate_csv, #html_hours, #html_title, #image_tag, #include_calendar_headers_tags, #include_in_api_response?, #inject_macros, #javascript_heads, #javascript_include_tag, #labelled_fields_for, #labelled_form_for, #lang_options_for_select, #link_to_attachment, #link_to_function, #link_to_if_authorized, #link_to_issue, #link_to_message, #link_to_project, #link_to_project_settings, #link_to_revision, #link_to_user, #link_to_version, #option_tag, #other_formats_links, #page_header_title, #parse_headings, #parse_inline_attachments, #parse_non_pre_blocks, #parse_redmine_links, #parse_sections, #parse_wiki_links, #preview_link, #principals_check_box_tags, #principals_options_for_select, #progress_bar, #project_tree, #project_tree_options_for_select, #raw_json, #render_error_messages, #render_flash_messages, #render_page_hierarchy, #render_project_jump_box, #render_project_nested_lists, #render_tabs, #reorder_handle, #reorder_links, #replace_toc, #robot_exclusion_tag, #sanitize_anchor_name, #sidebar_content?, #simple_format_without_paragraph, #stylesheet_link_tag, #syntax_highlight, #syntax_highlight_lines, #textilizable, #thumbnail_tag, #time_tag, #title, #to_path_param, #toggle_checkboxes_link, #toggle_link, #truncate_lines, #truncate_single_line_raw, #view_layouts_base_sidebar_hook_response, #wiki_page_path

Methods included from Redmine::Helpers::URL

#uri_with_safe_scheme?

Methods included from Redmine::Hook::Helper

#call_hook

Methods included from Redmine::Themes::Helper

#current_theme, #heads_for_theme

Methods included from Redmine::SudoMode::Helper

#hash_to_hidden_fields

Methods included from Redmine::Pagination::Helper

#pagination_links_each, #pagination_links_full, #per_page_links, #per_page_options

Methods included from Redmine::I18n

#current_language, #day_letter, #day_name, #find_language, #format_date, #format_time, #l, #l_hours, #l_hours_short, #l_or_humanize, #languages_options, #ll, #lu, #month_name, #set_language_if_valid, #valid_languages

Methods included from GravatarHelper::PublicMethods

#gravatar, #gravatar_api_url, #gravatar_for, #gravatar_url

Methods included from Redmine::WikiFormatting::Macros::Definitions

#exec_macro, #extract_macro_options, #macro_exists?

Instance Method Details

#available_block_columns_tags(query) ⇒ Object

Since:

  • 2.2.0



79
80
81
82
83
84
85
# File 'app/helpers/queries_helper.rb', line 79

def available_block_columns_tags(query)
  tags = ''.html_safe
  query.available_block_columns.each do |column|
    tags << ('label', check_box_tag('c[]', column.name.to_s, query.has_column?(column), :id => nil) + " #{column.caption}", :class => 'inline')
  end
  tags
end

#available_totalable_columns_tags(query) ⇒ Object

Since:

  • 3.2.0



87
88
89
90
91
92
93
94
# File 'app/helpers/queries_helper.rb', line 87

def available_totalable_columns_tags(query)
  tags = ''.html_safe
  query.available_totalable_columns.each do |column|
    tags << ('label', check_box_tag('t[]', column.name.to_s, query.totalable_columns.include?(column), :id => nil) + " #{column.caption}", :class => 'inline')
  end
  tags << hidden_field_tag('t[]', '')
  tags
end

#column_content(column, issue) ⇒ Object

Since:

  • 0.6.0



129
130
131
132
133
134
135
136
137
# File 'app/helpers/queries_helper.rb', line 129

def column_content(column, issue)
  value = column.value_object(issue)
  if value.is_a?(Array)
    values = value.collect {|v| column_value(column, issue, v)}.compact
    safe_join(values, ', ')
  else
    column_value(column, issue, value)
  end
end

#column_header(column) ⇒ Object

Since:

  • 0.6.0



123
124
125
126
127
# File 'app/helpers/queries_helper.rb', line 123

def column_header(column)
  column.sortable ? sort_header_tag(column.name.to_s, :caption => column.caption,
                                                      :default_order => column.default_order) :
                    ('th', h(column.caption))
end

#column_value(column, issue, value) ⇒ Object

Since:

  • 1.4.0



139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# File 'app/helpers/queries_helper.rb', line 139

def column_value(column, issue, value)
  case column.name
  when :id
    link_to value, issue_path(issue)
  when :subject
    link_to value, issue_path(issue)
  when :parent
    value ? (value.visible? ? link_to_issue(value, :subject => false) : "##{value.id}") : ''
  when :description
    issue.description? ? ('div', textilizable(issue, :description), :class => "wiki") : ''
  when :done_ratio
    progress_bar(value)
  when :relations
    ('span',
      value.to_s(issue) {|other| link_to_issue(other, :subject => false, :tracker => false)}.html_safe,
      :class => value.css_classes_for(issue))
  else
    format_object(value)
  end
end

#csv_content(column, issue) ⇒ Object

Since:

  • 2.3.0



160
161
162
163
164
165
166
167
# File 'app/helpers/queries_helper.rb', line 160

def csv_content(column, issue)
  value = column.value_object(issue)
  if value.is_a?(Array)
    value.collect {|v| csv_value(column, issue, v)}.compact.join(', ')
  else
    csv_value(column, issue, value)
  end
end

#csv_value(column, object, value) ⇒ Object

Since:

  • 2.3.0



169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
# File 'app/helpers/queries_helper.rb', line 169

def csv_value(column, object, value)
  format_object(value, false) do |value|
    case value.class.name
    when 'Float'
      sprintf("%.2f", value).gsub('.', l(:general_csv_decimal_separator))
    when 'IssueRelation'
      value.to_s(object)
    when 'Issue'
      if object.is_a?(TimeEntry)
        "#{value.tracker} ##{value.id}: #{value.subject}"
      else
        value.id
      end
    else
      value
    end
  end
end

#filters_options_for_select(query) ⇒ Object

Since:

  • 2.1.0



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'app/helpers/queries_helper.rb', line 23

def filters_options_for_select(query)
  ungrouped = []
  grouped = {}
  query.available_filters.map do |field, field_options|
    if [:tree, :relation].include?(field_options[:type]) 
      group = :label_relations
    elsif field =~ /^(.+)\./
      # association filters
      group = "field_#{$1}"
    elsif %w(member_of_group assigned_to_role).include?(field)
      group = :field_assigned_to
    elsif field_options[:type] == :date_past || field_options[:type] == :date
      group = :label_date
    end
    if group
      (grouped[group] ||= []) << [field_options[:name], field]
    else
      ungrouped << [field_options[:name], field]
    end
  end
  # Don't group dates if there's only one (eg. time entries filters)
  if grouped[:label_date].try(:size) == 1 
    ungrouped << grouped.delete(:label_date).first
  end
  s = options_for_select([[]] + ungrouped)
  if grouped.present?
    localized_grouped = grouped.map {|k,v| [l(k), v]}
    s << grouped_options_for_select(localized_grouped)
  end
  s
end

#query_as_hidden_field_tags(query) ⇒ Object

Returns the query definition as hidden field tags

Since:

  • 3.2.1



250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
# File 'app/helpers/queries_helper.rb', line 250

def query_as_hidden_field_tags(query)
  tags = hidden_field_tag("set_filter", "1", :id => nil)

  if query.filters.present?
    query.filters.each do |field, filter|
      tags << hidden_field_tag("f[]", field, :id => nil)
      tags << hidden_field_tag("op[#{field}]", filter[:operator], :id => nil)
      filter[:values].each do |value|
        tags << hidden_field_tag("v[#{field}][]", value, :id => nil)
      end
    end
  else
    tags << hidden_field_tag("f[]", "", :id => nil)
  end
  if query.column_names.present?
    query.column_names.each do |name|
      tags << hidden_field_tag("c[]", name, :id => nil)
    end
  end
  if query.totalable_names.present?
    query.totalable_names.each do |name|
      tags << hidden_field_tag("t[]", name, :id => nil)
    end
  end
  if query.group_by.present?
    tags << hidden_field_tag("group_by", query.group_by, :id => nil)
  end

  tags
end

#query_available_inline_columns_options(query) ⇒ Object

Since:

  • 2.3.0



96
97
98
# File 'app/helpers/queries_helper.rb', line 96

def query_available_inline_columns_options(query)
  (query.available_inline_columns - query.columns).reject(&:frozen?).collect {|column| [column.caption, column.name]}
end

#query_columns_hidden_tags(query) ⇒ Object

Since:

  • 2.3.1



67
68
69
70
71
72
73
# File 'app/helpers/queries_helper.rb', line 67

def query_columns_hidden_tags(query)
  tags = ''.html_safe
  query.columns.each do |column|
    tags << hidden_field_tag("c[]", column.name, :id => nil)
  end
  tags
end

#query_filters_hidden_tags(query) ⇒ Object

Since:

  • 2.3.1



55
56
57
58
59
60
61
62
63
64
65
# File 'app/helpers/queries_helper.rb', line 55

def query_filters_hidden_tags(query)
  tags = ''.html_safe
  query.filters.each do |field, options|
    tags << hidden_field_tag("f[]", field, :id => nil)
    tags << hidden_field_tag("op[#{field}]", options[:operator], :id => nil)
    options[:values].each do |value|
      tags << hidden_field_tag("v[#{field}][]", value, :id => nil)
    end
  end
  tags
end

#query_hidden_tags(query) ⇒ Object

Since:

  • 2.3.1



75
76
77
# File 'app/helpers/queries_helper.rb', line 75

def query_hidden_tags(query)
  query_filters_hidden_tags(query) + query_columns_hidden_tags(query)
end

#query_selected_inline_columns_options(query) ⇒ Object

Since:

  • 2.3.0



100
101
102
# File 'app/helpers/queries_helper.rb', line 100

def query_selected_inline_columns_options(query)
  (query.inline_columns & query.available_inline_columns).reject(&:frozen?).collect {|column| [column.caption, column.name]}
end

#query_to_csv(items, query, options = {}) ⇒ Object

Since:

  • 2.3.0



188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
# File 'app/helpers/queries_helper.rb', line 188

def query_to_csv(items, query, options={})
  options ||= {}
  columns = (options[:columns] == 'all' ? query.available_inline_columns : query.inline_columns)
  query.available_block_columns.each do |column|
    if options[column.name].present?
      columns << column
    end
  end

  Redmine::Export::CSV.generate do |csv|
    # csv header fields
    csv << columns.map {|c| c.caption.to_s}
    # csv lines
    items.each do |item|
      csv << columns.map {|c| csv_content(c, item)}
    end
  end
end

#render_query_columns_selection(query, options = {}) ⇒ Object

Since:

  • 2.3.0



104
105
106
107
# File 'app/helpers/queries_helper.rb', line 104

def render_query_columns_selection(query, options={})
  tag_name = (options[:name] || 'c') + '[]'
  render :partial => 'queries/columns', :locals => {:query => query, :tag_name => tag_name}
end

#render_query_totals(query) ⇒ Object

Since:

  • 3.2.0



109
110
111
112
113
114
115
# File 'app/helpers/queries_helper.rb', line 109

def render_query_totals(query)
  return unless query.totalable_columns.present?
  totals = query.totalable_columns.map do |column|
    total_tag(column, query.total_for(column))
  end
  ('p', totals.join(" ").html_safe, :class => "query-totals")
end

#retrieve_queryObject

Retrieve query from session or build a new query

Since:

  • 1.0.0



208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
# File 'app/helpers/queries_helper.rb', line 208

def retrieve_query
  if !params[:query_id].blank?
    cond = "project_id IS NULL"
    cond << " OR project_id = #{@project.id}" if @project
    @query = IssueQuery.where(cond).find(params[:query_id])
    raise ::Unauthorized unless @query.visible?
    @query.project = @project
    session[:query] = {:id => @query.id, :project_id => @query.project_id}
    sort_clear
  elsif api_request? || params[:set_filter] || session[:query].nil? || session[:query][:project_id] != (@project ? @project.id : nil)
    # Give it a name, required to be valid
    @query = IssueQuery.new(:name => "_")
    @query.project = @project
    @query.build_from_params(params)
    session[:query] = {:project_id => @query.project_id, :filters => @query.filters, :group_by => @query.group_by, :column_names => @query.column_names, :totalable_names => @query.totalable_names}
  else
    # retrieve from session
    @query = nil
    @query = IssueQuery.find_by_id(session[:query][:id]) if session[:query][:id]
    @query ||= IssueQuery.new(:name => "_", :filters => session[:query][:filters], :group_by => session[:query][:group_by], :column_names => session[:query][:column_names], :totalable_names => session[:query][:totalable_names])
    @query.project = @project
  end
end

#retrieve_query_from_sessionObject

Since:

  • 1.4.0



232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
# File 'app/helpers/queries_helper.rb', line 232

def retrieve_query_from_session
  if session[:query]
    if session[:query][:id]
      @query = IssueQuery.find_by_id(session[:query][:id])
      return unless @query
    else
      @query = IssueQuery.new(:name => "_", :filters => session[:query][:filters], :group_by => session[:query][:group_by], :column_names => session[:query][:column_names], :totalable_names => session[:query][:totalable_names])
    end
    if session[:query].has_key?(:project_id)
      @query.project_id = session[:query][:project_id]
    else
      @query.project = @project
    end
    @query
  end
end

#total_tag(column, value) ⇒ Object

Since:

  • 3.2.0



117
118
119
120
121
# File 'app/helpers/queries_helper.rb', line 117

def total_tag(column, value)
  label = ('span', "#{column.caption}:")
  value = ('span', format_object(value), :class => 'value')
  ('span', label + " " + value, :class => "total-for-#{column.name.to_s.dasherize}")
end