queries_helper.rb
162 lines
| 5.6 KiB
| text/x-ruby
|
RubyLexer
|
r8090 | # encoding: utf-8 | ||
# | ||||
|
r5159 | # Redmine - project management software | ||
|
r9453 | # Copyright (C) 2006-2012 Jean-Philippe Lang | ||
|
r771 | # | ||
# 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. | ||||
|
r6767 | # | ||
|
r771 | # 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. | ||||
|
r6767 | # | ||
|
r771 | # 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. | ||||
|
r92 | |||
|
r771 | module QueriesHelper | ||
|
r9979 | def filters_options_for_select(query) | ||
|
r10339 | options_for_select(filters_options(query)) | ||
end | ||||
def filters_options(query) | ||||
|
r9979 | options = [[]] | ||
|
r10344 | sorted_options = query.available_filters.sort do |a, b| | ||
ord = 0 | ||||
if !(a[1][:order] == 20 && b[1][:order] == 20) | ||||
ord = a[1][:order] <=> b[1][:order] | ||||
else | ||||
cn = (CustomField::CUSTOM_FIELDS_NAMES.index(a[1][:field].class.name) <=> | ||||
CustomField::CUSTOM_FIELDS_NAMES.index(b[1][:field].class.name)) | ||||
if cn != 0 | ||||
ord = cn | ||||
else | ||||
f = (a[1][:field] <=> b[1][:field]) | ||||
if f != 0 | ||||
ord = f | ||||
else | ||||
# assigned_to or author | ||||
ord = (a[0] <=> b[0]) | ||||
end | ||||
end | ||||
end | ||||
ord | ||||
end | ||||
options += sorted_options.map do |field, field_options| | ||||
|
r9979 | [field_options[:name], field] | ||
end | ||||
|
r92 | end | ||
|
r6767 | |||
|
r10721 | def available_block_columns_tags(query) | ||
tags = ''.html_safe | ||||
query.available_block_columns.each do |column| | ||||
tags << content_tag('label', check_box_tag('c[]', column.name.to_s, query.has_column?(column)) + " #{column.caption}", :class => 'inline') | ||||
end | ||||
tags | ||||
end | ||||
|
r771 | def column_header(column) | ||
|
r2169 | column.sortable ? sort_header_tag(column.name.to_s, :caption => column.caption, | ||
|
r6767 | :default_order => column.default_order) : | ||
|
r6207 | content_tag('th', h(column.caption)) | ||
|
r771 | end | ||
|
r6767 | |||
|
r771 | def column_content(column, issue) | ||
|
r2998 | value = column.value(issue) | ||
|
r8601 | if value.is_a?(Array) | ||
|
r10303 | value.collect {|v| column_value(column, issue, v)}.compact.join(', ').html_safe | ||
|
r8601 | else | ||
column_value(column, issue, value) | ||||
end | ||||
end | ||||
def column_value(column, issue, value) | ||||
|
r2998 | case value.class.name | ||
when 'String' | ||||
if column.name == :subject | ||||
link_to(h(value), :controller => 'issues', :action => 'show', :id => issue) | ||||
|
r10721 | elsif column.name == :description | ||
issue.description? ? content_tag('div', textilizable(issue, :description), :class => "wiki") : '' | ||||
|
r2998 | else | ||
h(value) | ||||
end | ||||
when 'Time' | ||||
format_time(value) | ||||
when 'Date' | ||||
format_date(value) | ||||
when 'Fixnum', 'Float' | ||||
if column.name == :done_ratio | ||||
progress_bar(value, :width => '80px') | ||||
|
r7953 | elsif column.name == :spent_hours | ||
sprintf "%.2f", value | ||||
|
r10745 | elsif column.name == :hours | ||
html_hours("%.2f" % value) | ||||
|
r895 | else | ||
|
r6233 | h(value.to_s) | ||
|
r876 | end | ||
|
r2998 | when 'User' | ||
link_to_user value | ||||
when 'Project' | ||||
|
r3810 | link_to_project value | ||
|
r2998 | when 'Version' | ||
link_to(h(value), :controller => 'versions', :action => 'show', :id => value) | ||||
when 'TrueClass' | ||||
l(:general_text_Yes) | ||||
when 'FalseClass' | ||||
l(:general_text_No) | ||||
|
r3504 | when 'Issue' | ||
|
r10745 | value.visible? ? link_to_issue(value) : "##{value.id}" | ||
|
r10303 | when 'IssueRelation' | ||
other = value.other_issue(issue) | ||||
content_tag('span', | ||||
(l(value.label_for(issue)) + " " + link_to_issue(other, :subject => false, :tracker => false)).html_safe, | ||||
:class => value.css_classes_for(issue)) | ||||
|
r2998 | else | ||
h(value) | ||||
|
r771 | end | ||
end | ||||
|
r3577 | |||
# Retrieve query from session or build a new query | ||||
def retrieve_query | ||||
if !params[:query_id].blank? | ||||
cond = "project_id IS NULL" | ||||
cond << " OR project_id = #{@project.id}" if @project | ||||
|
r10737 | @query = IssueQuery.find(params[:query_id], :conditions => cond) | ||
|
r6043 | raise ::Unauthorized unless @query.visible? | ||
|
r7536 | @query.project = @project | ||
|
r3577 | session[:query] = {:id => @query.id, :project_id => @query.project_id} | ||
sort_clear | ||||
|
r7529 | 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 | ||||
|
r10737 | @query = IssueQuery.new(:name => "_") | ||
|
r7529 | @query.project = @project | ||
|
r10739 | @query.build_from_params(params) | ||
|
r7529 | session[:query] = {:project_id => @query.project_id, :filters => @query.filters, :group_by => @query.group_by, :column_names => @query.column_names} | ||
|
r3577 | else | ||
|
r7529 | # retrieve from session | ||
|
r10737 | @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]) | ||||
|
r7993 | @query.project = @project | ||
|
r7529 | end | ||
end | ||||
|
r7536 | |||
|
r8368 | def retrieve_query_from_session | ||
if session[:query] | ||||
|
r8537 | if session[:query][:id] | ||
|
r10737 | @query = IssueQuery.find_by_id(session[:query][:id]) | ||
|
r8537 | return unless @query | ||
else | ||||
|
r10737 | @query = IssueQuery.new(:name => "_", :filters => session[:query][:filters], :group_by => session[:query][:group_by], :column_names => session[:query][:column_names]) | ||
|
r8537 | end | ||
|
r8368 | if session[:query].has_key?(:project_id) | ||
@query.project_id = session[:query][:project_id] | ||||
else | ||||
@query.project = @project | ||||
end | ||||
@query | ||||
end | ||||
end | ||||
|
r92 | end | ||