Feature #1474 » show_last_comment_in_issues_list.patch
| app/controllers/issues_controller.rb (working copy) | ||
|---|---|---|
| 63 | 63 | :conditions => @query.statement, | 
| 64 | 64 | :limit => limit, | 
| 65 | 65 | :offset => @issue_pages.current.offset | 
| 66 | @issues.each do |issue| | |
| 67 | 	    journals = issue.journals.find(:all, :include => [:user, :details], :order => "#{Journal.table_name}.created_on DESC LIMIT 1") | |
| 68 | issue.last_comment ||= journals.first[:notes] if !journals.first.nil? | |
| 69 | end | |
| 66 | 70 | respond_to do |format| | 
| 67 | 71 |         format.html { render :template => 'issues/index.rhtml', :layout => !request.xhr? } | 
| 68 | 72 |         format.atom { render_feed(@issues, :title => l(:label_issue_plural)) } | 
| ... | ... | |
| 116 | 120 | @issue.project = @project | 
| 117 | 121 | @issue.author = User.current | 
| 118 | 122 | @issue.tracker ||= @project.trackers.find(params[:tracker_id] ? params[:tracker_id] : :first) | 
| 123 | #@issue.last_comment = " " | |
| 119 | 124 | if @issue.tracker.nil? | 
| 120 | 125 | flash.now[:error] = 'No tracker is associated to this project. Please check the Project settings.' | 
| 121 | 126 | render :nothing => true, :layout => true | 
| app/helpers/issues_helper.rb (working copy) | ||
|---|---|---|
| 25 | 25 | @cached_label_due_date ||= l(:field_due_date) | 
| 26 | 26 | @cached_label_assigned_to ||= l(:field_assigned_to) | 
| 27 | 27 | @cached_label_priority ||= l(:field_priority) | 
| 28 | #@cahced_label_last_comment ||= l(:field_last_comment) | |
| 28 | 29 |  | 
| 29 | 30 |     link_to_issue(issue) + ": #{h(issue.subject)}<br /><br />" + | 
| 30 | 31 |       "<strong>#{@cached_label_start_date}</strong>: #{format_date(issue.start_date)}<br />" + | 
| ... | ... | |
| 138 | 139 | l(:field_done_ratio), | 
| 139 | 140 | l(:field_estimated_hours), | 
| 140 | 141 | l(:field_created_on), | 
| 141 | l(:field_updated_on) | |
| 142 | l(:field_updated_on), | |
| 143 | l(:field_last_comment), | |
| 142 | 144 | ] | 
| 143 | 145 | # Export project custom fields if project is given | 
| 144 | 146 | # otherwise export custom fields marked as "For all projects" | 
| ... | ... | |
| 164 | 166 | issue.done_ratio, | 
| 165 | 167 | issue.estimated_hours, | 
| 166 | 168 | format_time(issue.created_on), | 
| 167 | format_time(issue.updated_on) | |
| 169 | format_time(issue.updated_on), | |
| 170 | issue.last_comment | |
| 168 | 171 | ] | 
| 169 | 172 |         custom_fields.each {|f| fields << show_value(issue.custom_value_for(f)) } | 
| 170 | 173 | fields << issue.description | 
| app/models/query.rb (working copy) | ||
|---|---|---|
| 107 | 107 |     QueryColumn.new(:estimated_hours, :sortable => "#{Issue.table_name}.estimated_hours"), | 
| 108 | 108 |     QueryColumn.new(:done_ratio, :sortable => "#{Issue.table_name}.done_ratio"), | 
| 109 | 109 |     QueryColumn.new(:created_on, :sortable => "#{Issue.table_name}.created_on", :default_order => 'desc'), | 
| 110 | 	QueryColumn.new(:last_comment, :sortable => "#{Issue.table_name}.last_comment"), | |
| 110 | 111 | ] | 
| 111 | 112 | cattr_reader :available_columns | 
| 112 | 113 |  | 
| app/views/issues/index.rfpdf (working copy) | ||
|---|---|---|
| 4 | 4 | pdf.AliasNbPages | 
| 5 | 5 | pdf.footer_date = format_date(Date.today) | 
| 6 | 6 | 	pdf.AddPage("L") | 
| 7 | 	row_height = 7 | |
| 7 | 	row_height = 5 | |
| 8 | 8 |  | 
| 9 | 9 | # | 
| 10 | 10 | # title | 
| ... | ... | |
| 18 | 18 | # | 
| 19 | 19 | 	pdf.SetFontStyle('B',10) | 
| 20 | 20 | pdf.SetFillColor(230, 230, 230) | 
| 21 | pdf.Cell(15, row_height, "#", 0, 0, 'L', 1) | |
| 22 | pdf.Cell(30, row_height, l(:field_tracker), 0, 0, 'L', 1) | |
| 23 | pdf.Cell(30, row_height, l(:field_status), 0, 0, 'L', 1) | |
| 24 | pdf.Cell(30, row_height, l(:field_priority), 0, 0, 'L', 1) | |
| 25 | pdf.Cell(40, row_height, l(:field_assigned_to), 0, 0, 'L', 1) | |
| 26 | pdf.Cell(25, row_height, l(:field_updated_on), 0, 0, 'L', 1) | |
| 27 | pdf.Cell(0, row_height, l(:field_subject), 0, 0, 'L', 1) | |
| 21 | pdf.Cell(15, row_height, "#", 0, 0, 'C', 1) | |
| 22 | pdf.Cell(30, row_height, l(:field_tracker), 0, 0, 'C', 1) | |
| 23 | pdf.Cell(30, row_height, l(:field_status), 0, 0, 'C', 1) | |
| 24 | pdf.Cell(30, row_height, l(:field_priority), 0, 0, 'C', 1) | |
| 25 | pdf.Cell(50, row_height, l(:field_assigned_to), 0, 0, 'C', 1) | |
| 26 | pdf.Cell(30, row_height, l(:field_updated_on), 0, 0, 'C', 1) | |
| 27 | pdf.Cell(0, row_height, l(:field_subject), 0, 0, 'L', 1) | |
| 28 |  | |
| 28 | 29 | pdf.Line(10, pdf.GetY, 287, pdf.GetY) | 
| 29 | 30 | pdf.Ln | 
| 30 | 31 | pdf.Line(10, pdf.GetY, 287, pdf.GetY) | 
| ... | ... | |
| 36 | 37 | 	pdf.SetFontStyle('',9) | 
| 37 | 38 | pdf.SetFillColor(255, 255, 255) | 
| 38 | 39 | @issues.each do |issue| | 
| 39 | pdf.Cell(15, row_height, issue.id.to_s, 0, 0, 'L', 1) | |
| 40 | pdf.Cell(30, row_height, issue.tracker.name, 0, 0, 'L', 1) | |
| 41 | pdf.Cell(30, row_height, issue.status.name, 0, 0, 'L', 1) | |
| 42 | pdf.Cell(30, row_height, issue.priority.name, 0, 0, 'L', 1) | |
| 43 | pdf.Cell(40, row_height, issue.assigned_to ? issue.assigned_to.name : '', 0, 0, 'L', 1) | |
| 44 | pdf.Cell(25, row_height, format_date(issue.updated_on), 0, 0, 'L', 1) | |
| 45 | 	   	pdf.MultiCell(0, row_height, (@project == issue.project ? issue.subject : "#{issue.project.name} - #{issue.subject}")) | |
| 40 | pdf.Cell(15, row_height, issue.id.to_s, 0, 0, 'C', 1) | |
| 41 | pdf.Cell(30, row_height, issue.tracker.name, 0, 0, 'C', 1) | |
| 42 | pdf.Cell(30, row_height, issue.status.name, 0, 0, 'C', 1) | |
| 43 | pdf.Cell(30, row_height, issue.priority.name, 0, 0, 'C', 1) | |
| 44 | pdf.Cell(50, row_height, issue.assigned_to ? issue.assigned_to.name : '', 0, 0, 'C', 1) | |
| 45 | pdf.Cell(30, row_height, format_date(issue.updated_on), 0, 0, 'C', 1) | |
| 46 | 	  	pdf.MultiCell(0, row_height, (@project == issue.project ? issue.subject : "#{issue.project.name}\n#{issue.subject}")) | |
| 47 | if issue.last_comment != nil | |
| 48 | if issue.last_comment != "" | |
| 49 | pdf.Cell(23, row_height, "Last Comment:",0,0,'R',1) | |
| 50 | pdf.MultiCell(0, row_height, issue.last_comment) | |
| 51 | end | |
| 52 | end | |
| 46 | 53 | pdf.Line(10, pdf.GetY, 287, pdf.GetY) | 
| 47 | 54 | pdf.SetY(pdf.GetY() + 1) | 
| 48 | 55 | end | 
| lang/en.yml (working copy) | ||
|---|---|---|
| 174 | 174 | field_assignable: Issues can be assigned to this role | 
| 175 | 175 | field_redirect_existing_links: Redirect existing links | 
| 176 | 176 | field_estimated_hours: Estimated time | 
| 177 | field_last_comment: Last Comment | |
| 177 | 178 | field_column_names: Columns | 
| 178 | 179 | field_time_zone: Time zone | 
| 179 | 180 | field_searchable: Searchable | 
| public/stylesheets/application.css (working copy) | ||
|---|---|---|
| 86 | 86 | |
| 87 | 87 | table.list.issues { margin-top: 10px; } | 
| 88 | 88 | tr.issue { text-align: center; white-space: nowrap; } | 
| 89 | tr.issue td.subject, tr.issue td.category { white-space: normal; } | |
| 90 | tr.issue td.subject { text-align: left; } | |
| 89 | tr.issue td.subject, tr.issue td.category, tr.issue td.last_comment { white-space: normal; } | |
| 90 | tr.issue td.subject, tr.issue td.last_comment { text-align: left; width: 25%} | |
| 91 | 91 | tr.issue td.done_ratio table.progress { margin-left:auto; margin-right: auto;} | 
| 92 | 92 | |
| 93 | 93 | tr.entry { border: 1px solid #f8f8f8; } |