##// END OF EJS Templates
Speeds up rendering of the project list for users who belong to hundreds of projects....
Speeds up rendering of the project list for users who belong to hundreds of projects. git-svn-id: http://svn.redmine.org/redmine/trunk@16123 e93f8b46-1217-0410-a6f0-8f06a7374b81

File last commit:

r15705:e8e92ca054af
r15741:f8df935dcada
Show More
issues_helper.rb
524 lines | 19.2 KiB | text/x-ruby | RubyLexer
Jean-Philippe Lang
Added encoding comment to helpers (#9792)....
r8090 # encoding: utf-8
#
Jean-Philippe Lang
Keep track of issue description changes (#746)....
r4834 # Redmine - project management software
Jean-Philippe Lang
Updates copyright for 2016....
r14856 # Copyright (C) 2006-2016 Jean-Philippe Lang
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 #
# 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.
Toshi MARUYAMA
remove trailing white-spaces from issues helper source....
r5711 #
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 # 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.
Toshi MARUYAMA
remove trailing white-spaces from issues helper source....
r5711 #
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 # 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.
module IssuesHelper
Jean-Philippe Lang
Fixed: Date and time formats defined in settings not applied to the issues CSV export....
r928 include ApplicationHelper
Jean-Philippe Lang
Adds support for macro and Redmine links in PDF export (#13051)....
r13562 include Redmine::Export::PDF::IssuesPdfHelper
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330
Jean-Philippe Lang
Issue list improvements for subtasking (#5196):...
r3504 def issue_list(issues, &block)
ancestors = []
issues.each do |issue|
while (ancestors.any? && !issue.is_descendant_of?(ancestors.last))
ancestors.pop
end
yield issue, ancestors.size
Jean-Philippe Lang
Slight optimization in issue tree rendering....
r3506 ancestors << issue unless issue.leaf?
Jean-Philippe Lang
Issue list improvements for subtasking (#5196):...
r3504 end
end
Eric Davis
Document render_issue_tooltip...
r4052
Jean-Philippe Lang
Extract grouping logic to an helper....
r13590 def grouped_issue_list(issues, query, issue_count_by_group, &block)
Jean-Philippe Lang
Make time entries groupable (#16843)....
r15267 ancestors = []
grouped_query_results(issues, query, issue_count_by_group) do |issue, group_name, group_count, group_totals|
while (ancestors.any? && !issue.is_descendant_of?(ancestors.last))
ancestors.pop
Jean-Philippe Lang
Extract grouping logic to an helper....
r13590 end
Jean-Philippe Lang
Make time entries groupable (#16843)....
r15267 yield issue, ancestors.size, group_name, group_count, group_totals
ancestors << issue unless issue.leaf?
Jean-Philippe Lang
Extract grouping logic to an helper....
r13590 end
end
Eric Davis
Document render_issue_tooltip...
r4052 # Renders a HTML/CSS tooltip
#
# To use, a trigger div is needed. This is a div with the class of "tooltip"
# that contains this method wrapped in a span with the class of "tip"
#
# <div class="tooltip"><%= link_to_issue(issue) %>
# <span class="tip"><%= render_issue_tooltip(issue) %></span>
# </div>
#
Jean-Philippe Lang
Performance improvement on calendar and gantt (about 45% on gantt for large number of issues)....
r783 def render_issue_tooltip(issue)
Eric Davis
Add Issue Status to the tooltip. #6169...
r3838 @cached_label_status ||= l(:field_status)
Jean-Philippe Lang
Performance improvement on calendar and gantt (about 45% on gantt for large number of issues)....
r783 @cached_label_start_date ||= l(:field_start_date)
@cached_label_due_date ||= l(:field_due_date)
@cached_label_assigned_to ||= l(:field_assigned_to)
@cached_label_priority ||= l(:field_priority)
Eric Davis
Rewrite the Gantt chart. #6276...
r3958 @cached_label_project ||= l(:field_project)
Toshi MARUYAMA
Rails3: helper: html_safe for IssuesHelper render_issue_tooltip method...
r8334 link_to_issue(issue) + "<br /><br />".html_safe +
"<strong>#{@cached_label_project}</strong>: #{link_to_project(issue.project)}<br />".html_safe +
"<strong>#{@cached_label_status}</strong>: #{h(issue.status.name)}<br />".html_safe +
"<strong>#{@cached_label_start_date}</strong>: #{format_date(issue.start_date)}<br />".html_safe +
"<strong>#{@cached_label_due_date}</strong>: #{format_date(issue.due_date)}<br />".html_safe +
"<strong>#{@cached_label_assigned_to}</strong>: #{h(issue.assigned_to)}<br />".html_safe +
"<strong>#{@cached_label_priority}</strong>: #{h(issue.priority.name)}".html_safe
Jean-Philippe Lang
Performance improvement on calendar and gantt (about 45% on gantt for large number of issues)....
r783 end
Toshi MARUYAMA
remove trailing white-spaces from issues helper source....
r5711
Jean-Philippe Lang
Adds a helper for issue heading (#7647)....
r5327 def issue_heading(issue)
h("#{issue.tracker} ##{issue.id}")
end
Toshi MARUYAMA
remove trailing white-spaces from issues helper source....
r5711
Jean-Philippe Lang
Adds subtasking (#443) including:...
r3459 def render_issue_subject_with_tree(issue)
s = ''
Jean-Philippe Lang
Merged rails-4.1 branch (#14534)....
r13100 ancestors = issue.root? ? [] : issue.ancestors.visible.to_a
Jean-Philippe Lang
Save 2 queries when displaying a root issue....
r5124 ancestors.each do |ancestor|
Jean-Philippe Lang
Adds a setting to allow subtasks to belong to other projects (#5487)....
r10376 s << '<div>' + content_tag('p', link_to_issue(ancestor, :project => (issue.project_id != ancestor.project_id)))
Jean-Philippe Lang
Adds subtasking (#443) including:...
r3459 end
Jean-Philippe Lang
Private issues (#7414)....
r5346 s << '<div>'
subject = h(issue.subject)
if issue.is_private?
subject = content_tag('span', l(:field_is_private), :class => 'private') + ' ' + subject
end
s << content_tag('h3', subject)
Jean-Philippe Lang
Save 2 queries when displaying a root issue....
r5124 s << '</div>' * (ancestors.size + 1)
Toshi MARUYAMA
Rails3: use String#html_safe for render_issue_subject_with_tree() at IssuesHelper....
r6376 s.html_safe
Jean-Philippe Lang
Adds subtasking (#443) including:...
r3459 end
Toshi MARUYAMA
remove trailing white-spaces from issues helper source....
r5711
Jean-Philippe Lang
Adds subtasking (#443) including:...
r3459 def render_descendants_tree(issue)
Jean-Philippe Lang
Don't use a global variable for storing context menu URL....
r15554 s = '<table class="list issues">'
Jean-Philippe Lang
Preload assignee....
r15137 issue_list(issue.descendants.visible.preload(:status, :priority, :tracker, :assigned_to).sort_by(&:lft)) do |child, level|
Jean-Philippe Lang
Wrong CSS classes in subtasks tree (#23391)....
r15357 css = "issue issue-#{child.id} hascontextmenu #{child.css_classes}"
Jean-Philippe Lang
Use a local variable....
r10449 css << " idnt idnt-#{level}" if level > 0
Jean-Philippe Lang
Adds subtasking (#443) including:...
r3459 s << content_tag('tr',
Jean-Philippe Lang
Slight UI changes to the subtasks tree....
r3463 content_tag('td', check_box_tag("ids[]", child.id, false, :id => nil), :class => 'checkbox') +
Jean-Philippe Lang
Do not truncate subissue/related issues titles on the issue view (#18659)....
r13414 content_tag('td', link_to_issue(child, :project => (issue.project_id != child.project_id)), :class => 'subject', :style => 'width: 50%') +
Jean-Philippe Lang
Add status, assigned_to and done_ratio classes to issue subtasks (#21776)....
r14869 content_tag('td', h(child.status), :class => 'status') +
content_tag('td', link_to_user(child.assigned_to), :class => 'assigned_to') +
content_tag('td', child.disabled_core_fields.include?('done_ratio') ? '' : progress_bar(child.done_ratio), :class=> 'done_ratio'),
Jean-Philippe Lang
Use a local variable....
r10449 :class => css)
Jean-Philippe Lang
Adds subtasking (#443) including:...
r3459 end
Jean-Philippe Lang
Don't use a global variable for storing context menu URL....
r15554 s << '</table>'
Toshi MARUYAMA
Rails3: use String#html_safe for render_descendants_tree() at IssuesHelper....
r6377 s.html_safe
Jean-Philippe Lang
Adds subtasking (#443) including:...
r3459 end
Toshi MARUYAMA
remove trailing white-spaces from issues helper source....
r5711
Jean-Philippe Lang
Extracts the rendering of related issues to an helper (#3425)....
r15599 # Renders the list of related issues on the issue details view
def render_issue_relations(issue, relations)
manage_relations = User.current.allowed_to?(:manage_issue_relations, issue.project)
s = ''.html_safe
relations.each do |relation|
other_issue = relation.other_issue(issue)
css = "issue hascontextmenu #{other_issue.css_classes}"
link = manage_relations ? link_to(l(:label_relation_delete),
relation_path(relation),
:remote => true,
:method => :delete,
:data => {:confirm => l(:text_are_you_sure)},
:title => l(:label_relation_delete),
:class => 'icon-only icon-link-break'
) : nil
s << content_tag('tr',
content_tag('td', check_box_tag("ids[]", other_issue.id, false, :id => nil), :class => 'checkbox') +
content_tag('td', relation.to_s(@issue) {|other| link_to_issue(other, :project => Setting.cross_project_issue_relations?)}.html_safe, :class => 'subject', :style => 'width: 50%') +
content_tag('td', other_issue.status, :class => 'status') +
content_tag('td', other_issue.start_date, :class => 'start_date') +
content_tag('td', other_issue.due_date, :class => 'due_date') +
Jean-Philippe Lang
View progress bar of related issues (#3425)....
r15600 content_tag('td', other_issue.disabled_core_fields.include?('done_ratio') ? '' : progress_bar(other_issue.done_ratio), :class=> 'done_ratio') +
Jean-Philippe Lang
Extracts the rendering of related issues to an helper (#3425)....
r15599 content_tag('td', link, :class => 'buttons'),
:id => "relation-#{relation.id}",
:class => css)
end
content_tag('table', s, :class => 'list issues')
end
Jean-Philippe Lang
Don't store total estimated hours on parent issues (#16092)....
r13890 def issue_estimated_hours_details(issue)
Jean-Philippe Lang
Display time spent on the issue and the total time spent like estimated hours (#17550)....
r13891 if issue.total_estimated_hours.present?
if issue.total_estimated_hours == issue.estimated_hours
l_hours_short(issue.estimated_hours)
else
s = issue.estimated_hours.present? ? l_hours_short(issue.estimated_hours) : ""
s << " (#{l(:label_total)}: #{l_hours_short(issue.total_estimated_hours)})"
s.html_safe
end
end
end
def issue_spent_hours_details(issue)
if issue.total_spent_hours > 0
Jean-Philippe Lang
Remove special behaviour for listing issue time entries, use a filter for that....
r15262 path = project_time_entries_path(issue.project, :issue_id => "~#{issue.id}")
Jean-Philippe Lang
Display time spent on the issue and the total time spent like estimated hours (#17550)....
r13891 if issue.total_spent_hours == issue.spent_hours
Jean-Philippe Lang
Remove special behaviour for listing issue time entries, use a filter for that....
r15262 link_to(l_hours_short(issue.spent_hours), path)
Jean-Philippe Lang
Display time spent on the issue and the total time spent like estimated hours (#17550)....
r13891 else
s = issue.spent_hours > 0 ? l_hours_short(issue.spent_hours) : ""
Jean-Philippe Lang
Remove special behaviour for listing issue time entries, use a filter for that....
r15262 s << " (#{l(:label_total)}: #{link_to l_hours_short(issue.total_spent_hours), path})"
Jean-Philippe Lang
Display time spent on the issue and the total time spent like estimated hours (#17550)....
r13891 s.html_safe
end
Jean-Philippe Lang
Don't store total estimated hours on parent issues (#16092)....
r13890 end
end
Jean-Philippe Lang
Display the bulk edit form with error messages when some issues can not be saved (#13943)....
r11556 # Returns an array of error messages for bulk edited issues
def bulk_edit_error_messages(issues)
messages = {}
issues.each do |issue|
issue.errors.full_messages.each do |message|
messages[message] ||= []
messages[message] << issue
end
end
messages.map { |message, issues|
"#{message}: " + issues.map {|i| "##{i.id}"}.join(', ')
}
end
Jean-Philippe Lang
Adds a helper for displaying a link to add a subtask (#12113)....
r10450 # Returns a link for adding a new subtask to the given issue
def link_to_new_subtask(issue)
Jean-Philippe Lang
Use parent tracker as the default tracker when adding a subtask (#12113)....
r10451 attrs = {
:parent_issue_id => issue
}
Jean-Philippe Lang
Do not propose trackers which disallow parent_issue_id for new child issues (#22345)....
r14977 attrs[:tracker_id] = issue.tracker unless issue.tracker.disabled_core_fields.include?('parent_issue_id')
Jean-Philippe Lang
Use named route (#12113)....
r10452 link_to(l(:button_add), new_project_issue_path(issue.project, :issue => attrs))
Jean-Philippe Lang
Adds a helper for displaying a link to add a subtask (#12113)....
r10450 end
Jean-Philippe Lang
Adds Issue#allowed_target_trackers (#7839)....
r15048 def trackers_options_for_select(issue)
trackers = issue.allowed_target_trackers
if issue.new_record? && issue.parent_issue_id.present?
trackers = trackers.reject do |tracker|
issue.tracker_id != tracker.id && tracker.disabled_core_fields.include?('parent_issue_id')
end
end
trackers.collect {|t| [t.name, t.id]}
end
Jean-Philippe Lang
Ability to disable standard fields on a per tracker basis (#1091)....
r9729 class IssueFieldsRows
include ActionView::Helpers::TagHelper
def initialize
@left = []
@right = []
end
def left(*args)
args.any? ? @left << cells(*args) : @left
end
def right(*args)
args.any? ? @right << cells(*args) : @right
end
def size
@left.size > @right.size ? @left.size : @right.size
end
def to_html
Jean-Philippe Lang
Render issue attributes using divs instead of a table for responsiveness (#19097)....
r14466 content =
content_tag('div', @left.reduce(&:+), :class => 'splitcontentleft') +
content_tag('div', @right.reduce(&:+), :class => 'splitcontentleft')
content_tag('div', content, :class => 'splitcontent')
Jean-Philippe Lang
Ability to disable standard fields on a per tracker basis (#1091)....
r9729 end
def cells(label, text, options={})
Jean-Philippe Lang
Render issue attributes using divs instead of a table for responsiveness (#19097)....
r14466 options[:class] = [options[:class] || "", 'attribute'].join(' ')
content_tag 'div',
content_tag('div', label + ":", :class => 'label') + content_tag('div', text, :class => 'value'),
options
Jean-Philippe Lang
Ability to disable standard fields on a per tracker basis (#1091)....
r9729 end
end
def issue_fields_rows
r = IssueFieldsRows.new
yield r
r.to_html
end
Jean-Philippe Lang
Fixed: custom fields are not displayed in the same order on issue form and view....
r2722 def render_custom_fields_rows(issue)
Jean-Philippe Lang
Role-based issue custom field visibility (#5037)....
r11782 values = issue.visible_custom_field_values
return if values.empty?
half = (values.size / 2.0).ceil
Jean-Philippe Lang
Use #issue_fields_rows to render custom fields values....
r14464 issue_fields_rows do |rows|
values.each_with_index do |value, i|
css = "cf_#{value.custom_field.id}"
m = (i < half ? :left : :right)
rows.send m, custom_field_name_tag(value.custom_field), show_value(value), :class => css
end
end
Jean-Philippe Lang
Fixed: custom fields are not displayed in the same order on issue form and view....
r2722 end
Toshi MARUYAMA
remove trailing white-spaces from issues helper source....
r5711
Jean-Philippe Lang
Removed IssuesController#update_form action, use #new and #edit instead....
r13615 # Returns the path for updating the issue form
# with project as the current project
def update_issue_form_path(project, issue)
Jean-Philippe Lang
Implements /issues/new form for creating issues outside a project (#1003)....
r13617 options = {:format => 'js'}
Jean-Philippe Lang
Removed IssuesController#update_form action, use #new and #edit instead....
r13615 if issue.new_record?
Jean-Philippe Lang
Implements /issues/new form for creating issues outside a project (#1003)....
r13617 if project
new_project_issue_path(project, options)
else
new_issue_path(options)
end
Jean-Philippe Lang
Removed IssuesController#update_form action, use #new and #edit instead....
r13615 else
Jean-Philippe Lang
Implements /issues/new form for creating issues outside a project (#1003)....
r13617 edit_issue_path(issue, options)
Jean-Philippe Lang
Removed IssuesController#update_form action, use #new and #edit instead....
r13615 end
end
Jean-Philippe Lang
The descendant count in the issues delete confirmation message is wrong if issues share some descendants....
r13436 # Returns the number of descendants for an array of issues
def issues_descendant_count(issues)
ids = issues.reject(&:leaf?).map {|issue| issue.descendants.ids}.flatten.uniq
ids -= issues.map(&:id)
ids.size
end
Jean-Philippe Lang
Warn about subtasks before deleting a parent issue (#6562)....
r5375 def issues_destroy_confirmation_message(issues)
issues = [issues] unless issues.is_a?(Array)
message = l(:text_issues_destroy_confirmation)
Jean-Philippe Lang
The descendant count in the issues delete confirmation message is wrong if issues share some descendants....
r13436
Jean-Philippe Lang
Replace tabs with spaces and remove trailing tabs in several files (#20140)....
r13983 descendant_count = issues_descendant_count(issues)
Jean-Philippe Lang
Warn about subtasks before deleting a parent issue (#6562)....
r5375 if descendant_count > 0
Jean-Philippe Lang
The descendant count in the issues delete confirmation message is wrong if issues share some descendants....
r13436 message << "\n" + l(:text_issues_destroy_descendants_confirmation, :count => descendant_count)
Jean-Philippe Lang
Warn about subtasks before deleting a parent issue (#6562)....
r5375 end
message
end
Toshi MARUYAMA
remove trailing white-spaces from issues helper source....
r5711
Jean-Philippe Lang
Moved users list diplayed as available watchers on the new issue form to an helper....
r13613 # Returns an array of users that are proposed as watchers
# on the new issue form
def users_for_new_issue_watchers(issue)
users = issue.watcher_users
if issue.project.users.count <= 20
users = (users + issue.project.users.sort).uniq
end
users
end
Jean-Philippe Lang
Make the email notifications for adding/updating issues more readable/clear (#23978)....
r15705 def email_issue_attributes(issue, user, html)
Jean-Philippe Lang
Fixed that standard fields disabled still appear in email notifications (#14584)....
r11849 items = []
%w(author status priority assigned_to category fixed_version).each do |attribute|
unless issue.disabled_core_fields.include?(attribute+"_id")
Jean-Philippe Lang
Make the email notifications for adding/updating issues more readable/clear (#23978)....
r15705 if html
items << content_tag('strong', "#{l("field_#{attribute}")}: ") + (issue.send attribute)
else
items << "#{l("field_#{attribute}")}: #{issue.send attribute}"
end
Jean-Philippe Lang
Fixed that standard fields disabled still appear in email notifications (#14584)....
r11849 end
end
issue.visible_custom_field_values(user).each do |value|
Jean-Philippe Lang
Make the email notifications for adding/updating issues more readable/clear (#23978)....
r15705 if html
items << content_tag('strong', "#{value.custom_field.name}: ") + show_value(value, false)
else
items << "#{value.custom_field.name}: #{show_value(value, false)}"
end
Jean-Philippe Lang
Fixed that standard fields disabled still appear in email notifications (#14584)....
r11849 end
items
end
def render_email_issue_attributes(issue, user, html=false)
Jean-Philippe Lang
Make the email notifications for adding/updating issues more readable/clear (#23978)....
r15705 items = email_issue_attributes(issue, user, html)
Jean-Philippe Lang
Fixed that standard fields disabled still appear in email notifications (#14584)....
r11849 if html
Jean-Philippe Lang
Make the email notifications for adding/updating issues more readable/clear (#23978)....
r15705 content_tag('ul', items.map{|s| content_tag('li', s)}.join("\n").html_safe, :class => "details")
Jean-Philippe Lang
Fixed that standard fields disabled still appear in email notifications (#14584)....
r11849 else
items.map{|s| "* #{s}"}.join("\n")
end
end
Jean-Philippe Lang
Adds support for multiselect custom fields (#1189)....
r8601 # Returns the textual representation of a journal details
# as an array of strings
Jean-Philippe Lang
Mailer#url_for not called in views with Rails 3.1....
r8903 def details_to_strings(details, no_html=false, options={})
options[:only_path] = (options[:only_path] == false ? false : true)
Jean-Philippe Lang
Adds support for multiselect custom fields (#1189)....
r8601 strings = []
values_by_field = {}
details.each do |detail|
if detail.property == 'cf'
Jean-Philippe Lang
Avoid lots of CustomField.find_by_id calls when displaying an issue history with custom fields (#15072)....
r11987 field = detail.custom_field
Jean-Philippe Lang
Adds support for multiselect custom fields (#1189)....
r8601 if field && field.multiple?
Jean-Philippe Lang
Avoid lots of CustomField.find_by_id calls when displaying an issue history with custom fields (#15072)....
r11987 values_by_field[field] ||= {:added => [], :deleted => []}
Jean-Philippe Lang
Adds support for multiselect custom fields (#1189)....
r8601 if detail.old_value
Jean-Philippe Lang
Avoid lots of CustomField.find_by_id calls when displaying an issue history with custom fields (#15072)....
r11987 values_by_field[field][:deleted] << detail.old_value
Jean-Philippe Lang
Adds support for multiselect custom fields (#1189)....
r8601 end
if detail.value
Jean-Philippe Lang
Avoid lots of CustomField.find_by_id calls when displaying an issue history with custom fields (#15072)....
r11987 values_by_field[field][:added] << detail.value
Jean-Philippe Lang
Adds support for multiselect custom fields (#1189)....
r8601 end
next
end
end
Jean-Philippe Lang
Mailer#url_for not called in views with Rails 3.1....
r8903 strings << show_detail(detail, no_html, options)
Jean-Philippe Lang
Adds support for multiselect custom fields (#1189)....
r8601 end
Jean-Philippe Lang
Fixed rendering of multivalued custom fields in the issue history (#19225)....
r13672 if values_by_field.present?
multiple_values_detail = Struct.new(:property, :prop_key, :custom_field, :old_value, :value)
values_by_field.each do |field, changes|
if changes[:added].any?
detail = multiple_values_detail.new('cf', field.id.to_s, field)
detail.value = changes[:added]
strings << show_detail(detail, no_html, options)
end
if changes[:deleted].any?
detail = multiple_values_detail.new('cf', field.id.to_s, field)
detail.old_value = changes[:deleted]
strings << show_detail(detail, no_html, options)
end
Jean-Philippe Lang
Adds support for multiselect custom fields (#1189)....
r8601 end
end
strings
end
# Returns the textual representation of a single journal detail
Jean-Philippe Lang
Mailer#url_for not called in views with Rails 3.1....
r8903 def show_detail(detail, no_html=false, options={})
Jean-Philippe Lang
Adds support for multiselect custom fields (#1189)....
r8601 multiple = false
Jean-Philippe Lang
Show long text custom field changes as a diff (#15236)....
r13572 show_diff = false
Jean-Philippe Lang
Adds file custom field format (#6719)....
r15535 no_details = false
Jean-Philippe Lang
Show long text custom field changes as a diff (#15236)....
r13572
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 case detail.property
when 'attr'
Eric Davis
Refactor: Extract similar logic in IssuesHelper#show_detail to a new method....
r3439 field = detail.prop_key.to_s.gsub(/\_id$/, "")
label = l(("field_" + field).to_sym)
Jean-Philippe Lang
Code cleanup....
r8604 case detail.prop_key
when 'due_date', 'start_date'
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 value = format_date(detail.value.to_date) if detail.value
old_value = format_date(detail.old_value.to_date) if detail.old_value
Eric Davis
Refactor: Remove duplicated case statements....
r3440
Jean-Philippe Lang
Code cleanup....
r8604 when 'project_id', 'status_id', 'tracker_id', 'assigned_to_id',
'priority_id', 'category_id', 'fixed_version_id'
Eric Davis
Refactor: Extract similar logic in IssuesHelper#show_detail to a new method....
r3439 value = find_name_by_reflection(field, detail.value)
old_value = find_name_by_reflection(field, detail.old_value)
Eric Davis
Refactor: Remove duplicated case statements....
r3440
Jean-Philippe Lang
Code cleanup....
r8604 when 'estimated_hours'
Jean-Philippe Lang
Adds units in history for estimated time (#12456)....
r14761 value = l_hours_short(detail.value.to_f) unless detail.value.blank?
old_value = l_hours_short(detail.old_value.to_f) unless detail.old_value.blank?
Jean-Philippe Lang
Fixed: Wrong label in issue-journal for subtask-changes (#5090)....
r3479
Jean-Philippe Lang
Code cleanup....
r8604 when 'parent_id'
Jean-Philippe Lang
Fixed: Wrong label in issue-journal for subtask-changes (#5090)....
r3479 label = l(:field_parent_issue)
value = "##{detail.value}" unless detail.value.blank?
old_value = "##{detail.old_value}" unless detail.old_value.blank?
Toshi MARUYAMA
remove trailing white-spaces from issues helper source....
r5711
Jean-Philippe Lang
Code cleanup....
r8604 when 'is_private'
Jean-Philippe Lang
Private issues (#7414)....
r5346 value = l(detail.value == "0" ? :general_text_No : :general_text_Yes) unless detail.value.blank?
old_value = l(detail.old_value == "0" ? :general_text_No : :general_text_Yes) unless detail.old_value.blank?
Jean-Philippe Lang
Show long text custom field changes as a diff (#15236)....
r13572
when 'description'
show_diff = true
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
when 'cf'
Jean-Philippe Lang
Avoid lots of CustomField.find_by_id calls when displaying an issue history with custom fields (#15072)....
r11987 custom_field = detail.custom_field
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 if custom_field
label = custom_field.name
Jean-Philippe Lang
Adds file custom field format (#6719)....
r15535 if custom_field.format.class.change_no_details
no_details = true
elsif custom_field.format.class.change_as_diff
Jean-Philippe Lang
Show long text custom field changes as a diff (#15236)....
r13572 show_diff = true
else
multiple = custom_field.multiple?
value = format_value(detail.value, custom_field) if detail.value
old_value = format_value(detail.old_value, custom_field) if detail.old_value
end
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
Jean-Philippe Lang
Feature 9867 Allow file upload in comment and add to issue history...
r422 when 'attachment'
label = l(:label_attachment)
Toshi MARUYAMA
add journal after creating/deleting issue relation (#1005)...
r11655 when 'relation'
if detail.value && !detail.old_value
Jean-Philippe Lang
Fixed that journal details about issue relations may disclose issues that are not visible (#1005)....
r11709 rel_issue = Issue.visible.find_by_id(detail.value)
Jean-Philippe Lang
Prepends issue numbers with a number sign (#1005)....
r11710 value = rel_issue.nil? ? "#{l(:label_issue)} ##{detail.value}" :
Jean-Philippe Lang
Fixed that links for relations in notifications do not include hostname (#15677)....
r12140 (no_html ? rel_issue : link_to_issue(rel_issue, :only_path => options[:only_path]))
Toshi MARUYAMA
add journal after creating/deleting issue relation (#1005)...
r11655 elsif detail.old_value && !detail.value
Jean-Philippe Lang
Fixed that journal details about issue relations may disclose issues that are not visible (#1005)....
r11709 rel_issue = Issue.visible.find_by_id(detail.old_value)
Jean-Philippe Lang
Prepends issue numbers with a number sign (#1005)....
r11710 old_value = rel_issue.nil? ? "#{l(:label_issue)} ##{detail.old_value}" :
Jean-Philippe Lang
Fixed that links for relations in notifications do not include hostname (#15677)....
r12140 (no_html ? rel_issue : link_to_issue(rel_issue, :only_path => options[:only_path]))
Toshi MARUYAMA
add journal after creating/deleting issue relation (#1005)...
r11655 end
Jean-Philippe Lang
Store relation type instead of i18n key in journals (#15704)....
r12141 relation_type = IssueRelation::TYPES[detail.prop_key]
label = l(relation_type[:name]) if relation_type
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
Toshi MARUYAMA
code layout clean up issues helper...
r7905 call_hook(:helper_issues_show_detail_after_setting,
{:detail => detail, :label => label, :value => value, :old_value => old_value })
Jean-Philippe Lang
Merged hooks branch @ r1785 into trunk....
r1785
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 label ||= detail.prop_key
value ||= detail.value
old_value ||= detail.old_value
Toshi MARUYAMA
remove trailing white-spaces from issues helper source....
r5711
Jean-Philippe Lang
Reverted r9368....
r9236 unless no_html
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 label = content_tag('strong', label)
old_value = content_tag("i", h(old_value)) if detail.old_value
Toshi MARUYAMA
remove "del" tag from deleted issue relation (#1005)...
r11656 if detail.old_value && detail.value.blank? && detail.property != 'relation'
old_value = content_tag("del", old_value)
end
Jean-Philippe Lang
Use journalized attachments to prevent a query when displaying added file....
r13555 if detail.property == 'attachment' && value.present? &&
atta = detail.journal.journalized.attachments.detect {|a| a.id == detail.prop_key.to_i}
Jean-Philippe Lang
Main project list now displays root projects with their subprojects....
r718 # Link to the attachment if it has not been removed
Toshi MARUYAMA
add a view link to note attachment file (#4774)...
r9192 value = link_to_attachment(atta, :download => true, :only_path => options[:only_path])
Jean-Philippe Lang
Add missing links to images in issue history (#22058)....
r15169 if options[:only_path] != false && (atta.is_text? || atta.is_image?)
value += ' '
Jean-Philippe Lang
Improve accessibility for icon-only links by adding hidden text (#21805)....
r14889 value += link_to(l(:button_view),
Jean-Philippe Lang
Replace uses of image_tag() with CSS (#21256)....
r14686 { :controller => 'attachments', :action => 'show',
:id => atta, :filename => atta.filename },
Jean-Philippe Lang
Improve accessibility for icon-only links by adding hidden text (#21805)....
r14889 :class => 'icon-only icon-magnifier',
:title => l(:button_view))
Toshi MARUYAMA
add a view link to note attachment file (#4774)...
r9192 end
Jean-Philippe Lang
Main project list now displays root projects with their subprojects....
r718 else
value = content_tag("i", h(value)) if value
end
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
Toshi MARUYAMA
remove trailing white-spaces from issues helper source....
r5711
Jean-Philippe Lang
Adds file custom field format (#6719)....
r15535 if no_details
s = l(:text_journal_changed_no_detail, :label => label).html_safe
elsif show_diff
Jean-Philippe Lang
Keep track of issue description changes (#746)....
r4834 s = l(:text_journal_changed_no_detail, :label => label)
unless no_html
Toshi MARUYAMA
remove trailing white-spaces from issues helper source....
r5711 diff_link = link_to 'diff',
Jean-Philippe Lang
Use regular edit/update actions and named routes for JournalsController....
r14692 diff_journal_url(detail.journal_id, :detail_id => detail.id, :only_path => options[:only_path]),
Jean-Philippe Lang
Keep track of issue description changes (#746)....
r4834 :title => l(:label_view_diff)
s << " (#{ diff_link })"
end
Toshi MARUYAMA
Rails3: helper: html_safe for issues helper "show_detail" method...
r7904 s.html_safe
Jean-Philippe Lang
Code cleanup....
r8604 elsif detail.value.present?
Jean-Philippe Lang
Feature 9867 Allow file upload in comment and add to issue history...
r422 case detail.property
when 'attr', 'cf'
Jean-Philippe Lang
Code cleanup....
r8604 if detail.old_value.present?
Toshi MARUYAMA
Rails3: helper: html_safe for issues helper "show_detail" method...
r7904 l(:text_journal_changed, :label => label, :old => old_value, :new => value).html_safe
Jean-Philippe Lang
Adds support for multiselect custom fields (#1189)....
r8601 elsif multiple
l(:text_journal_added, :label => label, :value => value).html_safe
Jean-Philippe Lang
Feature 9867 Allow file upload in comment and add to issue history...
r422 else
Toshi MARUYAMA
Rails3: helper: html_safe for issues helper "show_detail" method...
r7904 l(:text_journal_set_to, :label => label, :value => value).html_safe
Jean-Philippe Lang
Feature 9867 Allow file upload in comment and add to issue history...
r422 end
Toshi MARUYAMA
add journal after creating/deleting issue relation (#1005)...
r11655 when 'attachment', 'relation'
Toshi MARUYAMA
Rails3: helper: html_safe for issues helper "show_detail" method...
r7904 l(:text_journal_added, :label => label, :value => value).html_safe
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
else
Toshi MARUYAMA
Rails3: helper: html_safe for issues helper "show_detail" method...
r7904 l(:text_journal_deleted, :label => label, :old => old_value).html_safe
Jean-Philippe Lang
added svn:eol-style native property on /app files...
r330 end
Jean-Philippe Lang
improved issues change history...
r52 end
Eric Davis
Refactor: Extract similar logic in IssuesHelper#show_detail to a new method....
r3439
# Find the name of an associated record stored in the field attribute
def find_name_by_reflection(field, id)
Jean-Philippe Lang
Don't do any query if id is not present....
r10875 unless id.present?
return nil
end
Jean-Philippe Lang
Memorize journal details value name to display....
r13556 @detail_value_name_by_reflection ||= Hash.new do |hash, key|
association = Issue.reflect_on_association(key.first.to_sym)
Jean-Philippe Lang
Fixed Stack level too deep error when calling #find_name_by_reflection for missing record....
r13620 name = nil
Jean-Philippe Lang
Memorize journal details value name to display....
r13556 if association
Jean-Philippe Lang
Use .klass instead of .class_name.constantize....
r13557 record = association.klass.find_by_id(key.last)
Jean-Philippe Lang
Memorize journal details value name to display....
r13556 if record
Jean-Philippe Lang
Fixed Stack level too deep error when calling #find_name_by_reflection for missing record....
r13620 name = record.name.force_encoding('UTF-8')
Jean-Philippe Lang
Memorize journal details value name to display....
r13556 end
Toshi MARUYAMA
PDF: fix incompatible character encodings: UTF-8 and ASCII-8BIT (#13354)...
r11407 end
Jean-Philippe Lang
Fixed Stack level too deep error when calling #find_name_by_reflection for missing record....
r13620 hash[key] = name
Eric Davis
Refactor: Extract similar logic in IssuesHelper#show_detail to a new method....
r3439 end
Jean-Philippe Lang
Memorize journal details value name to display....
r13556 @detail_value_name_by_reflection[[field, id]]
Eric Davis
Refactor: Extract similar logic in IssuesHelper#show_detail to a new method....
r3439 end
Toshi MARUYAMA
remove trailing white-spaces from issues helper source....
r5711
Jean-Philippe Lang
Adds subtasks to GET /issues/:id API (#5338)....
r4351 # Renders issue children recursively
def render_api_issue_children(issue, api)
return if issue.leaf?
api.array :children do
issue.children.each do |child|
api.issue(:id => child.id) do
api.tracker(:id => child.tracker_id, :name => child.tracker.name) unless child.tracker.nil?
api.subject child.subject
render_api_issue_children(child, api)
end
end
end
end
Jean-Philippe Lang
Initial commit...
r2 end