comparison app/helpers/.svn/text-base/issues_helper.rb.svn-base @ 441:cbce1fd3b1b7 redmine-1.2

Update to Redmine 1.2-stable branch (Redmine SVN rev 6000)
author Chris Cannam
date Mon, 06 Jun 2011 14:24:13 +0100
parents 051f544170fe
children
comparison
equal deleted inserted replaced
245:051f544170fe 441:cbce1fd3b1b7
3 # 3 #
4 # This program is free software; you can redistribute it and/or 4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License 5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2 6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version. 7 # of the License, or (at your option) any later version.
8 # 8 #
9 # This program is distributed in the hope that it will be useful, 9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details. 12 # GNU General Public License for more details.
13 # 13 #
14 # You should have received a copy of the GNU General Public License 14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software 15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 module IssuesHelper 18 module IssuesHelper
52 "<strong>#{@cached_label_start_date}</strong>: #{format_date(issue.start_date)}<br />" + 52 "<strong>#{@cached_label_start_date}</strong>: #{format_date(issue.start_date)}<br />" +
53 "<strong>#{@cached_label_due_date}</strong>: #{format_date(issue.due_date)}<br />" + 53 "<strong>#{@cached_label_due_date}</strong>: #{format_date(issue.due_date)}<br />" +
54 "<strong>#{@cached_label_assigned_to}</strong>: #{issue.assigned_to}<br />" + 54 "<strong>#{@cached_label_assigned_to}</strong>: #{issue.assigned_to}<br />" +
55 "<strong>#{@cached_label_priority}</strong>: #{issue.priority.name}" 55 "<strong>#{@cached_label_priority}</strong>: #{issue.priority.name}"
56 end 56 end
57 57
58 def issue_heading(issue)
59 h("#{issue.tracker} ##{issue.id}")
60 end
61
58 def render_issue_subject_with_tree(issue) 62 def render_issue_subject_with_tree(issue)
59 s = '' 63 s = ''
60 issue.ancestors.each do |ancestor| 64 ancestors = issue.root? ? [] : issue.ancestors.visible.all
65 ancestors.each do |ancestor|
61 s << '<div>' + content_tag('p', link_to_issue(ancestor)) 66 s << '<div>' + content_tag('p', link_to_issue(ancestor))
62 end 67 end
63 s << '<div>' + content_tag('h3', h(issue.subject)) 68 s << '<div>'
64 s << '</div>' * (issue.ancestors.size + 1) 69 subject = h(issue.subject)
70 if issue.is_private?
71 subject = content_tag('span', l(:field_is_private), :class => 'private') + ' ' + subject
72 end
73 s << content_tag('h3', subject)
74 s << '</div>' * (ancestors.size + 1)
65 s 75 s
66 end 76 end
67 77
68 def render_descendants_tree(issue) 78 def render_descendants_tree(issue)
69 s = '<form><table class="list issues">' 79 s = '<form><table class="list issues">'
70 issue_list(issue.descendants.sort_by(&:lft)) do |child, level| 80 issue_list(issue.descendants.visible.sort_by(&:lft)) do |child, level|
71 s << content_tag('tr', 81 s << content_tag('tr',
72 content_tag('td', check_box_tag("ids[]", child.id, false, :id => nil), :class => 'checkbox') + 82 content_tag('td', check_box_tag("ids[]", child.id, false, :id => nil), :class => 'checkbox') +
73 content_tag('td', link_to_issue(child, :truncate => 60), :class => 'subject') + 83 content_tag('td', link_to_issue(child, :truncate => 60), :class => 'subject') +
74 content_tag('td', h(child.status)) + 84 content_tag('td', h(child.status)) +
75 content_tag('td', link_to_user(child.assigned_to)) + 85 content_tag('td', link_to_user(child.assigned_to)) +
77 :class => "issue issue-#{child.id} hascontextmenu #{level > 0 ? "idnt idnt-#{level}" : nil}") 87 :class => "issue issue-#{child.id} hascontextmenu #{level > 0 ? "idnt idnt-#{level}" : nil}")
78 end 88 end
79 s << '</form></table>' 89 s << '</form></table>'
80 s 90 s
81 end 91 end
82 92
83 def render_custom_fields_rows(issue) 93 def render_custom_fields_rows(issue)
84 return if issue.custom_field_values.empty? 94 return if issue.custom_field_values.empty?
85 ordered_values = [] 95 ordered_values = []
86 half = (issue.custom_field_values.size / 2.0).ceil 96 half = (issue.custom_field_values.size / 2.0).ceil
87 half.times do |i| 97 half.times do |i|
96 n += 1 106 n += 1
97 end 107 end
98 s << "</tr>\n" 108 s << "</tr>\n"
99 s 109 s
100 end 110 end
101 111
112 def issues_destroy_confirmation_message(issues)
113 issues = [issues] unless issues.is_a?(Array)
114 message = l(:text_issues_destroy_confirmation)
115 descendant_count = issues.inject(0) {|memo, i| memo += (i.right - i.left - 1)/2}
116 if descendant_count > 0
117 issues.each do |issue|
118 next if issue.root?
119 issues.each do |other_issue|
120 descendant_count -= 1 if issue.is_descendant_of?(other_issue)
121 end
122 end
123 if descendant_count > 0
124 message << "\n" + l(:text_issues_destroy_descendants_confirmation, :count => descendant_count)
125 end
126 end
127 message
128 end
129
102 def sidebar_queries 130 def sidebar_queries
103 unless @sidebar_queries 131 unless @sidebar_queries
104 # User can see public queries and his own queries 132 # User can see public queries and his own queries
105 visible = ARCondition.new(["is_public = ? OR user_id = ?", true, (User.current.logged? ? User.current.id : 0)]) 133 visible = ARCondition.new(["is_public = ? OR user_id = ?", true, (User.current.logged? ? User.current.id : 0)])
106 # Project specific queries and global queries 134 # Project specific queries and global queries
107 visible << (@project.nil? ? ["project_id IS NULL"] : ["project_id IS NULL OR project_id = ?", @project.id]) 135 visible << (@project.nil? ? ["project_id IS NULL"] : ["project_id IS NULL OR project_id = ?", @project.id])
108 @sidebar_queries = Query.find(:all, 136 @sidebar_queries = Query.find(:all,
109 :select => 'id, name, is_public', 137 :select => 'id, name, is_public',
110 :order => "name ASC", 138 :order => "name ASC",
111 :conditions => visible.conditions) 139 :conditions => visible.conditions)
112 end 140 end
113 @sidebar_queries 141 @sidebar_queries
114 end 142 end
115 143
116 def query_links(title, queries) 144 def query_links(title, queries)
117 # links to #index on issues/show 145 # links to #index on issues/show
118 url_params = controller_name == 'issues' ? {:controller => 'issues', :action => 'index', :project_id => @project} : params 146 url_params = controller_name == 'issues' ? {:controller => 'issues', :action => 'index', :project_id => @project} : params
119 147
120 content_tag('h3', title) + 148 content_tag('h3', title) +
121 queries.collect {|query| 149 queries.collect {|query|
122 link_to(h(query.name), url_params.merge(:query_id => query)) 150 link_to(h(query.name), url_params.merge(:query_id => query))
123 }.join('<br />') 151 }.join('<br />')
124 end 152 end
125 153
126 def render_sidebar_queries 154 def render_sidebar_queries
127 out = '' 155 out = ''
128 queries = sidebar_queries.select {|q| !q.is_public?} 156 queries = sidebar_queries.select {|q| !q.is_public?}
129 out << query_links(l(:label_my_queries), queries) if queries.any? 157 out << query_links(l(:label_my_queries), queries) if queries.any?
130 queries = sidebar_queries.select {|q| q.is_public?} 158 queries = sidebar_queries.select {|q| q.is_public?}
152 180
153 when detail.prop_key == 'parent_id' 181 when detail.prop_key == 'parent_id'
154 label = l(:field_parent_issue) 182 label = l(:field_parent_issue)
155 value = "##{detail.value}" unless detail.value.blank? 183 value = "##{detail.value}" unless detail.value.blank?
156 old_value = "##{detail.old_value}" unless detail.old_value.blank? 184 old_value = "##{detail.old_value}" unless detail.old_value.blank?
185
186 when detail.prop_key == 'is_private'
187 value = l(detail.value == "0" ? :general_text_No : :general_text_Yes) unless detail.value.blank?
188 old_value = l(detail.old_value == "0" ? :general_text_No : :general_text_Yes) unless detail.old_value.blank?
157 end 189 end
158 when 'cf' 190 when 'cf'
159 custom_field = CustomField.find_by_id(detail.prop_key) 191 custom_field = CustomField.find_by_id(detail.prop_key)
160 if custom_field 192 if custom_field
161 label = custom_field.name 193 label = custom_field.name
168 call_hook(:helper_issues_show_detail_after_setting, {:detail => detail, :label => label, :value => value, :old_value => old_value }) 200 call_hook(:helper_issues_show_detail_after_setting, {:detail => detail, :label => label, :value => value, :old_value => old_value })
169 201
170 label ||= detail.prop_key 202 label ||= detail.prop_key
171 value ||= detail.value 203 value ||= detail.value
172 old_value ||= detail.old_value 204 old_value ||= detail.old_value
173 205
174 unless no_html 206 unless no_html
175 label = content_tag('strong', label) 207 label = content_tag('strong', label)
176 old_value = content_tag("i", h(old_value)) if detail.old_value 208 old_value = content_tag("i", h(old_value)) if detail.old_value
177 old_value = content_tag("strike", old_value) if detail.old_value and (!detail.value or detail.value.empty?) 209 old_value = content_tag("strike", old_value) if detail.old_value and (!detail.value or detail.value.empty?)
178 if detail.property == 'attachment' && !value.blank? && a = Attachment.find_by_id(detail.prop_key) 210 if detail.property == 'attachment' && !value.blank? && a = Attachment.find_by_id(detail.prop_key)
180 value = link_to_attachment(a) 212 value = link_to_attachment(a)
181 else 213 else
182 value = content_tag("i", h(value)) if value 214 value = content_tag("i", h(value)) if value
183 end 215 end
184 end 216 end
185 217
186 if detail.property == 'attr' && detail.prop_key == 'description' 218 if detail.property == 'attr' && detail.prop_key == 'description'
187 s = l(:text_journal_changed_no_detail, :label => label) 219 s = l(:text_journal_changed_no_detail, :label => label)
188 unless no_html 220 unless no_html
189 diff_link = link_to 'diff', 221 diff_link = link_to 'diff',
190 {:controller => 'journals', :action => 'diff', :id => detail.journal_id, :detail_id => detail.id}, 222 {:controller => 'journals', :action => 'diff', :id => detail.journal_id, :detail_id => detail.id},
191 :title => l(:label_view_diff) 223 :title => l(:label_view_diff)
192 s << " (#{ diff_link })" 224 s << " (#{ diff_link })"
193 end 225 end
194 s 226 s
214 if association 246 if association
215 record = association.class_name.constantize.find_by_id(id) 247 record = association.class_name.constantize.find_by_id(id)
216 return record.name if record 248 return record.name if record
217 end 249 end
218 end 250 end
219 251
220 # Renders issue children recursively 252 # Renders issue children recursively
221 def render_api_issue_children(issue, api) 253 def render_api_issue_children(issue, api)
222 return if issue.leaf? 254 return if issue.leaf?
223 api.array :children do 255 api.array :children do
224 issue.children.each do |child| 256 issue.children.each do |child|
228 render_api_issue_children(child, api) 260 render_api_issue_children(child, api)
229 end 261 end
230 end 262 end
231 end 263 end
232 end 264 end
233 265
234 def issues_to_csv(issues, project = nil) 266 def issues_to_csv(issues, project = nil)
235 ic = Iconv.new(l(:general_csv_encoding), 'UTF-8') 267 ic = Iconv.new(l(:general_csv_encoding), 'UTF-8')
236 decimal_separator = l(:general_csv_decimal_separator) 268 decimal_separator = l(:general_csv_decimal_separator)
237 export = FCSV.generate(:col_sep => l(:general_csv_separator)) do |csv| 269 export = FCSV.generate(:col_sep => l(:general_csv_separator)) do |csv|
238 # csv header fields 270 # csv header fields
239 headers = [ "#", 271 headers = [ "#",
240 l(:field_status), 272 l(:field_status),
241 l(:field_project), 273 l(:field_project),
242 l(:field_tracker), 274 l(:field_tracker),
243 l(:field_priority), 275 l(:field_priority),
244 l(:field_subject), 276 l(:field_subject),
245 l(:field_assigned_to), 277 l(:field_assigned_to),
262 headers << l(:field_description) 294 headers << l(:field_description)
263 csv << headers.collect {|c| begin; ic.iconv(c.to_s); rescue; c.to_s; end } 295 csv << headers.collect {|c| begin; ic.iconv(c.to_s); rescue; c.to_s; end }
264 # csv lines 296 # csv lines
265 issues.each do |issue| 297 issues.each do |issue|
266 fields = [issue.id, 298 fields = [issue.id,
267 issue.status.name, 299 issue.status.name,
268 issue.project.name, 300 issue.project.name,
269 issue.tracker.name, 301 issue.tracker.name,
270 issue.priority.name, 302 issue.priority.name,
271 issue.subject, 303 issue.subject,
272 issue.assigned_to, 304 issue.assigned_to,
273 issue.category, 305 issue.category,
274 issue.fixed_version, 306 issue.fixed_version,
276 format_date(issue.start_date), 308 format_date(issue.start_date),
277 format_date(issue.due_date), 309 format_date(issue.due_date),
278 issue.done_ratio, 310 issue.done_ratio,
279 issue.estimated_hours.to_s.gsub('.', decimal_separator), 311 issue.estimated_hours.to_s.gsub('.', decimal_separator),
280 issue.parent_id, 312 issue.parent_id,
281 format_time(issue.created_on), 313 format_time(issue.created_on),
282 format_time(issue.updated_on) 314 format_time(issue.updated_on)
283 ] 315 ]
284 custom_fields.each {|f| fields << show_value(issue.custom_value_for(f)) } 316 custom_fields.each {|f| fields << show_value(issue.custom_value_for(f)) }
285 fields << issue.description 317 fields << issue.description
286 csv << fields.collect {|c| begin; ic.iconv(c.to_s); rescue; c.to_s; end } 318 csv << fields.collect {|c| begin; ic.iconv(c.to_s); rescue; c.to_s; end }