Custom fields can now be displayed as columns on the issue list.
Custom fields marked as "for all projects" can be added to the default columns of the issue list (in application settings). Project specific custom fields can be displayed on custom queries. git-svn-id: http://redmine.rubyforge.org/svn/trunk@889 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
parent
ad68a82be1
commit
63ceea2e21
|
@ -22,24 +22,25 @@ module QueriesHelper
|
||||||
end
|
end
|
||||||
|
|
||||||
def column_header(column)
|
def column_header(column)
|
||||||
if column.sortable
|
column.sortable ? sort_header_tag(column.sortable, :caption => column.caption) : content_tag('th', column.caption)
|
||||||
sort_header_tag(column.sortable, :caption => l("field_#{column.name}"))
|
|
||||||
else
|
|
||||||
content_tag('th', l("field_#{column.name}"))
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def column_content(column, issue)
|
def column_content(column, issue)
|
||||||
value = issue.send(column.name)
|
if column.is_a?(QueryCustomFieldColumn)
|
||||||
if value.is_a?(Date)
|
cv = issue.custom_values.detect {|v| v.custom_field_id == column.custom_field.id}
|
||||||
format_date(value)
|
show_value(cv)
|
||||||
elsif value.is_a?(Time)
|
|
||||||
format_time(value)
|
|
||||||
elsif column.name == :subject
|
|
||||||
((@project.nil? || @project != issue.project) ? "#{issue.project.name} - " : '') +
|
|
||||||
link_to(h(value), :controller => 'issues', :action => 'show', :id => issue)
|
|
||||||
else
|
else
|
||||||
h(value)
|
value = issue.send(column.name)
|
||||||
|
if value.is_a?(Date)
|
||||||
|
format_date(value)
|
||||||
|
elsif value.is_a?(Time)
|
||||||
|
format_time(value)
|
||||||
|
elsif column.name == :subject
|
||||||
|
((@project.nil? || @project != issue.project) ? "#{issue.project.name} - " : '') +
|
||||||
|
link_to(h(value), :controller => 'issues', :action => 'show', :id => issue)
|
||||||
|
else
|
||||||
|
h(value)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -17,13 +17,33 @@
|
||||||
|
|
||||||
class QueryColumn
|
class QueryColumn
|
||||||
attr_accessor :name, :sortable
|
attr_accessor :name, :sortable
|
||||||
|
include GLoc
|
||||||
|
|
||||||
def initialize(name, options={})
|
def initialize(name, options={})
|
||||||
self.name = name
|
self.name = name
|
||||||
self.sortable = options[:sortable]
|
self.sortable = options[:sortable]
|
||||||
end
|
end
|
||||||
|
|
||||||
def default?; default end
|
def caption
|
||||||
|
l("field_#{name}")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class QueryCustomFieldColumn < QueryColumn
|
||||||
|
|
||||||
|
def initialize(custom_field)
|
||||||
|
self.name = "cf_#{custom_field.id}".to_sym
|
||||||
|
self.sortable = false
|
||||||
|
@cf = custom_field
|
||||||
|
end
|
||||||
|
|
||||||
|
def caption
|
||||||
|
@cf.name
|
||||||
|
end
|
||||||
|
|
||||||
|
def custom_field
|
||||||
|
@cf
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
class Query < ActiveRecord::Base
|
class Query < ActiveRecord::Base
|
||||||
|
@ -203,7 +223,12 @@ class Query < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
def available_columns
|
def available_columns
|
||||||
cols = Query.available_columns
|
return @available_columns if @available_columns
|
||||||
|
@available_columns = Query.available_columns
|
||||||
|
@available_columns += (project ?
|
||||||
|
project.custom_fields :
|
||||||
|
IssueCustomField.find(:all, :conditions => {:is_for_all => true})
|
||||||
|
).collect {|cf| QueryCustomFieldColumn.new(cf) }
|
||||||
end
|
end
|
||||||
|
|
||||||
def columns
|
def columns
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
<table margin=0>
|
<table margin=0>
|
||||||
<tr>
|
<tr>
|
||||||
<td><%= select_tag 'available_columns',
|
<td><%= select_tag 'available_columns',
|
||||||
options_for_select((query.available_columns - query.columns).collect {|column| [l("field_#{column.name}"), column.name]}),
|
options_for_select((query.available_columns - query.columns).collect {|column| [column.caption, column.name]}),
|
||||||
:multiple => true, :size => 10, :style => "width:150px" %>
|
:multiple => true, :size => 10, :style => "width:150px" %>
|
||||||
</td>
|
</td>
|
||||||
<td align="center" valign="middle">
|
<td align="center" valign="middle">
|
||||||
|
@ -15,7 +15,7 @@
|
||||||
onclick="moveOptions(this.form.selected_columns, this.form.available_columns);" />
|
onclick="moveOptions(this.form.selected_columns, this.form.available_columns);" />
|
||||||
</td>
|
</td>
|
||||||
<td><%= select_tag 'query[column_names][]',
|
<td><%= select_tag 'query[column_names][]',
|
||||||
options_for_select(@query.columns.collect {|column| [l("field_#{column.name}"), column.name]}),
|
options_for_select(@query.columns.collect {|column| [column.caption, column.name]}),
|
||||||
:id => 'selected_columns', :multiple => true, :size => 10, :style => "width:150px" %>
|
:id => 'selected_columns', :multiple => true, :size => 10, :style => "width:150px" %>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
|
@ -61,9 +61,9 @@
|
||||||
|
|
||||||
<fieldset class="box"><legend><%= l(:setting_issue_list_default_columns) %></legend>
|
<fieldset class="box"><legend><%= l(:setting_issue_list_default_columns) %></legend>
|
||||||
<%= hidden_field_tag 'settings[issue_list_default_columns][]', '' %>
|
<%= hidden_field_tag 'settings[issue_list_default_columns][]', '' %>
|
||||||
<p><% Query.available_columns.each do |column| %>
|
<p><% Query.new.available_columns.each do |column| %>
|
||||||
<label><%= check_box_tag 'settings[issue_list_default_columns][]', column.name, Setting.issue_list_default_columns.include?(column.name.to_s) %>
|
<label><%= check_box_tag 'settings[issue_list_default_columns][]', column.name, Setting.issue_list_default_columns.include?(column.name.to_s) %>
|
||||||
<%= l("field_#{column.name}") %></label>
|
<%= column.caption %></label>
|
||||||
<% end %></p>
|
<% end %></p>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue