Patch #14862 ยป document_paging_and_export.patch
| app/controllers/documents_controller.rb (Arbeitskopie) | ||
|---|---|---|
| 24 | 24 |
before_filter :authorize |
| 25 | 25 | |
| 26 | 26 |
helper :attachments |
| 27 |
include Redmine::Export::PDF |
|
| 27 | 28 | |
| 28 | 29 |
def index |
| 29 |
@sort_by = %w(category date title author).include?(params[:sort_by]) ? params[:sort_by] : 'category' |
|
| 30 |
documents = @project.documents.includes(:attachments, :category).all |
|
| 31 |
case @sort_by |
|
| 32 |
when 'date' |
|
| 33 |
@grouped = documents.group_by {|d| d.updated_on.to_date }
|
|
| 34 |
when 'title' |
|
| 35 |
@grouped = documents.group_by {|d| d.title.first.upcase}
|
|
| 36 |
when 'author' |
|
| 37 |
@grouped = documents.select{|d| d.attachments.any?}.group_by {|d| d.attachments.last.author}
|
|
| 30 |
|
|
| 31 |
# Paging init |
|
| 32 |
case params[:format] |
|
| 33 |
when 'xml', 'json' |
|
| 34 |
@offset, @limit = 5 |
|
| 38 | 35 |
else |
| 39 |
@grouped = documents.group_by(&:category)
|
|
| 36 |
@limit = 10
|
|
| 40 | 37 |
end |
| 38 | ||
| 39 |
|
|
| 40 |
@documents_count = @project.documents.visible.count |
|
| 41 |
@documents_pages = Paginator.new self, @documents_count, @limit, params['page'] |
|
| 42 |
@offset ||= @documents_pages.current.offset |
|
| 43 |
@documents = @project.documents.visible.all(:include => [:attachments, :category], |
|
| 44 |
:limit => @limit, |
|
| 45 |
:offset => @offset, |
|
| 46 |
:order => "#{Document.table_name}.title")
|
|
| 47 | ||
| 48 |
|
|
| 49 |
@sort_by = %w(category title date author).include?(params[:sort_by]) ? params[:sort_by] : 'category' |
|
| 50 |
|
|
| 51 |
case @sort_by |
|
| 52 |
when 'date' |
|
| 53 |
@documents = @project.documents.visible.all(:include => [:attachments, :category], |
|
| 54 |
:limit => @limit, |
|
| 55 |
:offset => @offset, |
|
| 56 |
:order => "#{Document.table_name}.created_on, #{Document.table_name}.title ")
|
|
| 57 |
@grouped = @documents.group_by {|d| d.updated_on.to_date}
|
|
| 58 |
when 'title' |
|
| 59 |
@grouped = @documents.group_by {|d| d.title.first.upcase}
|
|
| 60 |
when 'author' |
|
| 61 |
@grouped = @documents.select{|d| d.attachments.any?}.group_by {|d| d.attachments.last.author}
|
|
| 62 |
else |
|
| 63 |
@documents = @project.documents.visible.all(:include => [:attachments, :category], |
|
| 64 |
:limit => @limit, |
|
| 65 |
:offset => @offset, |
|
| 66 |
:order => "#{Document.table_name}.category_id, #{Document.table_name}.title")
|
|
| 67 |
@grouped = @documents.group_by {|d| d.category.name}
|
|
| 68 |
end |
|
| 41 | 69 |
@document = @project.documents.build |
| 42 | 70 |
render :layout => false if request.xhr? |
| 43 | 71 |
end |
| 44 | 72 | |
| 73 |
# Display document and all attachments |
|
| 74 |
# Handle the export functions |
|
| 45 | 75 |
def show |
| 46 | 76 |
@attachments = @document.attachments.all |
| 77 |
# export of document |
|
| 78 |
if User.current.allowed_to?(:edit_documents, @project) # Check permission |
|
| 79 |
if params[:format] == 'pdf' |
|
| 80 |
send_data(document_to_pdf(@document, @project), :type => 'application/pdf', :filename => "#{@document.title}.pdf")
|
|
| 81 |
return |
|
| 82 |
elsif params[:format] == 'html' |
|
| 83 |
export = render_to_string :action => 'export', :layout => false |
|
| 84 |
send_data(export, :type => 'text/html', :filename => "#{@document.title}.html")
|
|
| 85 |
return |
|
| 86 |
elsif params[:format] == 'txt' |
|
| 87 |
send_data(@document.description, :type => 'text/plain', :filename => "#{@document.title}.txt")
|
|
| 88 |
return |
|
| 89 |
end |
|
| 90 |
end |
|
| 91 | ||
| 47 | 92 |
end |
| 48 | ||
| 49 | 93 |
def new |
| 50 | 94 |
@document = @project.documents.build |
| 51 | 95 |
@document.safe_attributes = params[:document] |
| app/views/documents/export.html.erb (Arbeitskopie) | ||
|---|---|---|
| 1 |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> |
|
| 2 |
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> |
|
| 3 |
<head> |
|
| 4 |
<title><%=h @document.title %></title> |
|
| 5 |
<meta http-equiv="content-type" content="text/html; charset=utf-8" /> |
|
| 6 |
<style> |
|
| 7 |
body { font:80% Verdana,Tahoma,Arial,sans-serif; }
|
|
| 8 |
h1, h2, h3, h4 { font-family: "Trebuchet MS",Georgia,"Times New Roman",serif; }
|
|
| 9 |
ul.toc { padding: 4px; margin-left: 0; }
|
|
| 10 |
ul.toc li { list-style-type:none; }
|
|
| 11 |
ul.toc li.heading2 { margin-left: 1em; }
|
|
| 12 |
ul.toc li.heading3 { margin-left: 2em; }
|
|
| 13 |
a.wiki-anchor { display: none; margin-left: 6px; text-decoration: none; }
|
|
| 14 |
a.wiki-anchor:hover { color: #aaa !important; text-decoration: none; }
|
|
| 15 |
</style> |
|
| 16 |
</head> |
|
| 17 |
<body> |
|
| 18 |
<h2><%=h @document.title %></h2> |
|
| 19 | ||
| 20 |
<p><em><%=h @document.category.name %><br /> |
|
| 21 |
<%= format_time @document.created_on %></em></p> |
|
| 22 | ||
| 23 |
<%= textilizable @document.description, :attachments => @attachements %> |
|
| 24 |
</body> |
|
| 25 |
</html> |
|
| app/views/documents/index.html.erb (Arbeitskopie) | ||
|---|---|---|
| 15 | 15 |
</div> |
| 16 | 16 | |
| 17 | 17 |
<h2><%=l(:label_document_plural)%></h2> |
| 18 |
<p class="pagination"><%= pagination_links_full @documents_pages %></p> |
|
| 18 | 19 | |
| 19 | 20 |
<% if @grouped.empty? %><p class="nodata"><%= l(:label_no_data) %></p><% end %> |
| 20 | 21 | |
| ... | ... | |
| 22 | 23 |
<h3><%= group %></h3> |
| 23 | 24 |
<%= render :partial => 'documents/document', :collection => @grouped[group] %> |
| 24 | 25 |
<% end %> |
| 26 |
<p class="pagination"><%= pagination_links_full @documents_pages %></p> |
|
| 25 | 27 | |
| 26 | 28 |
<% content_for :sidebar do %> |
| 27 | 29 |
<h3><%= l(:label_sort_by, '') %></h3> |
| app/views/documents/show.html.erb (Arbeitskopie) | ||
|---|---|---|
| 10 | 10 |
<h2><%=h @document.title %></h2> |
| 11 | 11 | |
| 12 | 12 |
<p><em><%=h @document.category.name %><br /> |
| 13 |
<%= format_date @document.created_on %></em></p>
|
|
| 13 |
<%= format_time @document.created_on %></em></p>
|
|
| 14 | 14 |
<div class="wiki"> |
| 15 | 15 |
<%= textilizable @document, :description, :attachments => @document.attachments %> |
| 16 | 16 |
</div> |
| ... | ... | |
| 29 | 29 |
<% end %> |
| 30 | 30 |
<% end %> |
| 31 | 31 | |
| 32 |
<% other_formats_links do |f| %> |
|
| 33 |
<%= f.link_to 'PDF', :url => {:id => @document.id} %>
|
|
| 34 |
<%= f.link_to 'HTML', :url => {:id => @document.id} %>
|
|
| 35 |
<%= f.link_to 'TXT', :url => {:id => @document.id} %>
|
|
| 36 |
<% end if User.current.allowed_to?(:edit_documents, @project) %> |
|
| 37 | ||
| 32 | 38 |
<% html_title @document.title -%> |
| lib/redmine/export/pdf.rb (Arbeitskopie) | ||
|---|---|---|
| 696 | 696 |
end |
| 697 | 697 |
end |
| 698 | 698 | |
| 699 |
if issue.attachments.any? |
|
| 700 |
pdf.SetFontStyle('B',9)
|
|
| 701 |
pdf.RDMCell(190,5, l(:label_attachment_plural), "B") |
|
| 702 |
pdf.Ln |
|
| 703 |
for attachment in issue.attachments |
|
| 704 |
pdf.SetFontStyle('',8)
|
|
| 705 |
pdf.RDMCell(80,5, attachment.filename) |
|
| 706 |
pdf.RDMCell(20,5, number_to_human_size(attachment.filesize),0,0,"R") |
|
| 707 |
pdf.RDMCell(25,5, format_date(attachment.created_on),0,0,"R") |
|
| 708 |
pdf.RDMCell(65,5, attachment.author.name,0,0,"R") |
|
| 709 |
pdf.Ln |
|
| 710 |
end |
|
| 711 |
end |
|
| 699 |
common_write_attachments_list(pdf, issue.attachments) |
|
| 712 | 700 |
pdf.Output |
| 713 | 701 |
end |
| 714 | 702 | |
| ... | ... | |
| 765 | 753 |
def write_wiki_page(pdf, page) |
| 766 | 754 |
pdf.RDMwriteHTMLCell(190,5,0,0, |
| 767 | 755 |
page.content.text.to_s, page.attachments, 0) |
| 768 |
if page.attachments.any? |
|
| 756 |
common_write_attachments_list(pdf,page.attachments) |
|
| 757 |
end |
|
| 758 | ||
| 759 | ||
| 760 |
# Generate a PDF of a single document |
|
| 761 |
def document_to_pdf(document, project) |
|
| 762 |
pdf = ITCPDF.new(current_language) |
|
| 763 |
pdf.SetTitle("#{project} - #{document.title}")
|
|
| 764 |
pdf.alias_nb_pages |
|
| 765 |
pdf.footer_date = format_date(Date.today) |
|
| 766 |
pdf.AddPage |
|
| 767 |
pdf.SetFontStyle('B',11)
|
|
| 768 |
pdf.RDMMultiCell(190,5, |
|
| 769 |
"#{project} - #{document.title} - #{document.category}")
|
|
| 770 |
pdf.Ln |
|
| 771 |
# Repeat title and document info |
|
| 772 |
pdf.SetFontStyle('B',14) # font size for title
|
|
| 773 |
pdf.RDMMultiCell(190,5, |
|
| 774 |
document.title.to_s) # title |
|
| 775 |
pdf.SetFontStyle('I',9) # font size for document info
|
|
| 776 |
pdf.RDMMultiCell(190,5, |
|
| 777 |
document.category.to_s) |
|
| 778 |
pdf.RDMMultiCell(190,5, |
|
| 779 |
format_date(document.created_on)) |
|
| 780 |
# Set resize image scale |
|
| 781 |
pdf.SetImageScale(1.6) |
|
| 782 |
pdf.SetFontStyle('',9)
|
|
| 783 |
# Generate document content as pdf |
|
| 784 |
document_to_pdf_content(pdf, document) |
|
| 785 |
pdf.Output |
|
| 786 |
end |
|
| 787 | ||
| 788 |
# Attach document content to pdf-object |
|
| 789 |
def document_to_pdf_content(pdf, document) |
|
| 790 |
pdf.RDMwriteHTMLCell(190,5,0,0, |
|
| 791 |
document.description.to_s, document.attachments, 0) |
|
| 792 |
common_write_attachments_list(pdf, document.attachments) |
|
| 793 |
end |
|
| 794 | ||
| 795 |
# Write a list of attachments-properties to pdf-object |
|
| 796 |
def common_write_attachments_list(pdf, attachments) |
|
| 797 |
if attachments.any? |
|
| 769 | 798 |
pdf.Ln |
| 770 | 799 |
pdf.SetFontStyle('B',9)
|
| 771 | 800 |
pdf.RDMCell(190,5, l(:label_attachment_plural), "B") |
| 772 | 801 |
pdf.Ln |
| 773 |
for attachment in page.attachments
|
|
| 802 |
for attachment in attachments |
|
| 774 | 803 |
pdf.SetFontStyle('',8)
|
| 775 | 804 |
pdf.RDMCell(80,5, attachment.filename) |
| 776 | 805 |
pdf.RDMCell(20,5, number_to_human_size(attachment.filesize),0,0,"R") |
| ... | ... | |
| 780 | 809 |
end |
| 781 | 810 |
end |
| 782 | 811 |
end |
| 783 | ||
| 812 |
|
|
| 813 |
|
|
| 784 | 814 |
class RDMPdfEncoding |
| 785 | 815 |
def self.rdm_from_utf8(txt, encoding) |
| 786 | 816 |
txt ||= '' |