##// END OF EJS Templates
* single/multiple issues pdf export added...
Jean-Philippe Lang -
r35:51e0989c4919
parent child
Show More
@@ -0,0 +1,43
1 # redMine - project management software
2 # Copyright (C) 2006 Jean-Philippe Lang
3 #
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
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
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
18 require 'iconv'
19
20 module IfpdfHelper
21
22 class IFPDF < FPDF
23
24 def Cell(w,h=0,txt='',border=0,ln=0,align='',fill=0,link='')
25 @ic ||= Iconv.new('ISO-8859-1', 'UTF-8')
26 super w,h,@ic.iconv(txt),border,ln,align,fill,link
27 end
28
29 def MultiCell(w,h,txt,border=0,align='J',fill=0)
30 @ic ||= Iconv.new('ISO-8859-1', 'UTF-8')
31 super w,h,txt,border,align,fill
32 end
33
34 def Footer
35 SetY(-15)
36 SetX(-30)
37 SetFont('Helvetica', 'I', 8)
38 Cell(0, 5, PageNo().to_s + '/{nb}', 0, 0, 'C')
39 end
40
41 end
42
43 end
@@ -0,0 +1,95
1 <% pdf.SetFont('Arial','B',11)
2 pdf.Cell(190,10, "#{issue.project.name} - #{issue.tracker.name} # #{issue.long_id} - #{issue.subject}")
3 pdf.Ln
4
5 y0 = pdf.GetY
6
7 pdf.SetFont('Arial','B',9)
8 pdf.Cell(35,5, l(:field_status) + ":","LT")
9 pdf.SetFont('Arial','',9)
10 pdf.Cell(60,5, issue.status.name,"RT")
11 pdf.SetFont('Arial','B',9)
12 pdf.Cell(35,5, l(:field_priority) + ":","LT")
13 pdf.SetFont('Arial','',9)
14 pdf.Cell(60,5, issue.priority.name,"RT")
15 pdf.Ln
16
17 pdf.SetFont('Arial','B',9)
18 pdf.Cell(35,5, l(:field_author) + ":","L")
19 pdf.SetFont('Arial','',9)
20 pdf.Cell(60,5, issue.author.name,"R")
21 pdf.SetFont('Arial','B',9)
22 pdf.Cell(35,5, l(:field_category) + ":","L")
23 pdf.SetFont('Arial','',9)
24 pdf.Cell(60,5, (issue.category ? issue.category.name : "-"),"R")
25 pdf.Ln
26
27 pdf.SetFont('Arial','B',9)
28 pdf.Cell(35,5, l(:field_created_on) + ":","L")
29 pdf.SetFont('Arial','',9)
30 pdf.Cell(60,5, format_date(issue.created_on),"R")
31 pdf.SetFont('Arial','B',9)
32 pdf.Cell(35,5, l(:field_assigned_to) + ":","L")
33 pdf.SetFont('Arial','',9)
34 pdf.Cell(60,5, (issue.assigned_to ? issue.assigned_to.name : "-"),"R")
35 pdf.Ln
36
37 pdf.SetFont('Arial','B',9)
38 pdf.Cell(35,5, l(:field_updated_on) + ":","LB")
39 pdf.SetFont('Arial','',9)
40 pdf.Cell(60,5, format_date(issue.updated_on),"RB")
41 pdf.SetFont('Arial','B',9)
42 pdf.Cell(35,5, l(:field_due_date) + ":","LB")
43 pdf.SetFont('Arial','',9)
44 pdf.Cell(60,5, format_date(issue.due_date),"RB")
45 pdf.Ln
46
47 for custom_value in issue.custom_values
48 pdf.SetFont('Arial','B',9)
49 pdf.Cell(35,5, custom_value.custom_field.name + ":","L")
50 pdf.SetFont('Arial','',9)
51 pdf.MultiCell(155,5, (show_value custom_value),"R")
52 end
53
54 pdf.SetFont('Arial','B',9)
55 pdf.Cell(35,5, l(:field_subject) + ":","LTB")
56 pdf.SetFont('Arial','',9)
57 pdf.Cell(155,5, issue.subject,"RTB")
58 pdf.Ln
59
60 pdf.SetFont('Arial','B',9)
61 pdf.Cell(35,5, l(:field_description) + ":")
62 pdf.SetFont('Arial','',9)
63 pdf.MultiCell(155,5, issue.description,"BR")
64
65 pdf.Line(pdf.GetX, y0, pdf.GetX, pdf.GetY)
66 pdf.Line(pdf.GetX, pdf.GetY, 170, pdf.GetY)
67
68 pdf.Ln
69 pdf.SetFont('Arial','B',9)
70 pdf.Cell(190,5, l(:label_history),"B")
71 pdf.Ln
72 for history in issue.histories.find(:all, :include => [:author, :status])
73 pdf.SetFont('Arial','B',8)
74 pdf.Cell(100,5, history.status.name)
75 pdf.SetFont('Arial','',8)
76 pdf.Cell(20,5, format_date(history.created_on))
77 pdf.Cell(70,5, history.author.name,0,0,"R")
78 pdf.SetFont('Arial','',8)
79 pdf.Ln
80 pdf.Cell(10,4, "") and pdf.MultiCell(180,4, history.notes) if history.notes?
81 end
82 pdf.Ln
83
84 pdf.SetFont('Arial','B',9)
85 pdf.Cell(190,5, l(:label_attachment_plural), "B")
86 pdf.Ln
87 for attachment in issue.attachments
88 pdf.SetFont('Arial','',8)
89 pdf.Cell(80,5, attachment.filename)
90 pdf.Cell(20,5, human_size(attachment.filesize))
91 pdf.Cell(20,5, format_date(attachment.created_on))
92 pdf.Cell(70,5, attachment.author.name,0,0,"R")
93 pdf.Ln
94 end
95 %> No newline at end of file
@@ -0,0 +1,8
1 <% pdf=IfpdfHelper::IFPDF.new
2 pdf.AliasNbPages
3 pdf.AddPage
4
5 render :partial => 'issues/pdf', :locals => { :pdf => pdf, :issue => @issue }
6 %>
7
8 <%= pdf.Output %> No newline at end of file
@@ -0,0 +1,3
1 Issue #<%= @issue.id %> has been reported.
2 ----------------------------------------
3 <%= render :file => "_issue", :use_full_path => true, :locals => { :issue => @issue } %> No newline at end of file
@@ -0,0 +1,3
1 Issue #<%= @issue.id %> has been reported.
2 ----------------------------------------
3 <%= render :file => "_issue", :use_full_path => true, :locals => { :issue => @issue } %> No newline at end of file
@@ -0,0 +1,3
1 Issue #<%= @issue.id %> has been updated to "<%= @issue.status.name %>" status.
2 ----------------------------------------
3 <%= render :file => "_issue", :use_full_path => true, :locals => { :issue => @issue } %> No newline at end of file
@@ -0,0 +1,3
1 Issue #<%= @issue.id %> has been updated to "<%= @issue.status.name %>" status.
2 ----------------------------------------
3 <%= render :file => "_issue", :use_full_path => true, :locals => { :issue => @issue } %> No newline at end of file
@@ -0,0 +1,3
1 To change your password, use the following link:
2
3 http://<%= $RDM_HOST_NAME %>/account/lost_password?token=<%= @token.value %> No newline at end of file
@@ -0,0 +1,3
1 To change your password, use the following link:
2
3 http://<%= $RDM_HOST_NAME %>/account/lost_password?token=<%= @token.value %> No newline at end of file
@@ -0,0 +1,3
1 To activate your redMine account, use the following link:
2
3 http://<%= $RDM_HOST_NAME %>/account/register?token=<%= @token.value %> No newline at end of file
@@ -0,0 +1,3
1 To activate your redMine account, use the following link:
2
3 http://<%= $RDM_HOST_NAME %>/account/register?token=<%= @token.value %> No newline at end of file
@@ -0,0 +1,10
1 <% pdf=IfpdfHelper::IFPDF.new
2 pdf.AliasNbPages
3 pdf.AddPage
4 @issues.each {|i|
5 render :partial => 'issues/pdf', :locals => { :pdf => pdf, :issue => i }
6 pdf.AddPage
7 }
8 %>
9
10 <%= pdf.Output %> No newline at end of file
@@ -0,0 +1,11
1 class ExportPdf < ActiveRecord::Migration
2 def self.up
3 Permission.create :controller => "projects", :action => "export_issues_pdf", :description => "label_export_pdf", :sort => 1002, :is_public => true, :mail_option => 0, :mail_enabled => 0
4 Permission.create :controller => "issues", :action => "export_pdf", :description => "label_export_pdf", :sort => 1015, :is_public => true, :mail_option => 0, :mail_enabled => 0
5 end
6
7 def self.down
8 Permission.find(:first, :conditions => ["controller=? and action=?", 'projects', 'export_issues_pdf']).destroy
9 Permission.find(:first, :conditions => ["controller=? and action=?", 'issues', 'export_pdf']).destroy
10 end
11 end
@@ -88,7 +88,7 class ApplicationController < ActionController::Base
88 88 render :nothing => true, :status => 403
89 89 false
90 90 end
91
91
92 92 # store current uri in session.
93 93 # return to this location by calling redirect_back_or_default
94 94 def store_location
@@ -16,15 +16,23
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 class IssuesController < ApplicationController
19 layout 'base'
19 layout 'base', :except => :export_pdf
20 20 before_filter :find_project, :authorize
21 21
22 22 helper :custom_fields
23 23 include CustomFieldsHelper
24 helper :ifpdf
25 include IfpdfHelper
24 26
25 27 def show
26 28 @status_options = @issue.status.workflows.find(:all, :include => :new_status, :conditions => ["role_id=? and tracker_id=?", self.logged_in_user.role_for_project(@project.id), @issue.tracker.id]).collect{ |w| w.new_status } if self.logged_in_user
27 29 @custom_values = @issue.custom_values.find(:all, :include => :custom_field)
30 end
31
32 def export_pdf
33 @custom_values = @issue.custom_values.find(:all, :include => :custom_field)
34 @options_for_rfpdf ||= {}
35 @options_for_rfpdf[:file_name] = "#{@project.name}_#{@issue.long_id}.pdf"
28 36 end
29 37
30 38 def edit
@@ -16,7 +16,7
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 class ProjectsController < ApplicationController
19 layout 'base'
19 layout 'base', :except => :export_issues_pdf
20 20 before_filter :find_project, :authorize, :except => [ :index, :list, :add ]
21 21 before_filter :require_admin, :only => [ :add, :destroy ]
22 22
@@ -26,7 +26,9 class ProjectsController < ApplicationController
26 26 include SearchFilterHelper
27 27 helper :custom_fields
28 28 include CustomFieldsHelper
29
29 helper :ifpdf
30 include IfpdfHelper
31
30 32 def index
31 33 list
32 34 render :action => 'list' unless request.xhr?
@@ -208,15 +210,23 class ProjectsController < ApplicationController
208 210 search_filter_init_list_issues
209 211 search_filter_update if params[:set_filter]
210 212
213 @results_per_page_options = [ 15, 25, 50, 100 ]
214 if params[:per_page] and @results_per_page_options.include? params[:per_page].to_i
215 @results_per_page = params[:per_page].to_i
216 session[:results_per_page] = @results_per_page
217 else
218 @results_per_page = session[:results_per_page] || @results_per_page_options.first
219 end
220
211 221 @issue_count = Issue.count(:include => [:status, :project], :conditions => search_filter_clause)
212 @issue_pages = Paginator.new self, @issue_count, 15, @params['page']
222 @issue_pages = Paginator.new self, @issue_count, @results_per_page, @params['page']
213 223 @issues = Issue.find :all, :order => sort_clause,
214 224 :include => [ :author, :status, :tracker, :project ],
215 225 :conditions => search_filter_clause,
216 226 :limit => @issue_pages.items_per_page,
217 227 :offset => @issue_pages.current.offset
218 228
219 render :action => "list_issues", :layout => false if request.xhr?
229 render :layout => false if request.xhr?
220 230 end
221 231
222 232 # Export filtered/sorted issues list to CSV
@@ -227,20 +237,44 class ProjectsController < ApplicationController
227 237 search_filter_init_list_issues
228 238
229 239 @issues = Issue.find :all, :order => sort_clause,
230 :include => [ :author, :status, :tracker, :project ],
240 :include => [ :author, :status, :tracker, :project, :custom_values ],
231 241 :conditions => search_filter_clause
232 242
243 ic = Iconv.new('ISO-8859-1', 'UTF-8')
233 244 export = StringIO.new
234 CSV::Writer.generate(export, ',') do |csv|
235 csv << %w(Id Status Tracker Subject Author Created Updated)
245 CSV::Writer.generate(export, l(:general_csv_separator)) do |csv|
246 # csv header fields
247 headers = [ "#", l(:field_status), l(:field_tracker), l(:field_subject), l(:field_author), l(:field_created_on), l(:field_updated_on) ]
248 for custom_field in @project.all_custom_fields
249 headers << custom_field.name
250 end
251 csv << headers.collect {|c| ic.iconv(c) }
252 # csv lines
236 253 @issues.each do |issue|
237 csv << [issue.id, issue.status.name, issue.tracker.name, issue.subject, issue.author.display_name, l_datetime(issue.created_on), l_datetime(issue.updated_on)]
254 fields = [issue.id, issue.status.name, issue.tracker.name, issue.subject, issue.author.display_name, l_datetime(issue.created_on), l_datetime(issue.updated_on)]
255 for custom_field in @project.all_custom_fields
256 fields << (show_value issue.custom_value_for(custom_field))
257 end
258 csv << fields.collect {|c| ic.iconv(c.to_s) }
238 259 end
239 260 end
240 261 export.rewind
241 send_data(export.read,
242 :type => 'text/csv; charset=utf-8; header=present',
243 :filename => 'export.csv')
262 send_data(export.read, :type => 'text/csv; header=present', :filename => 'export.csv')
263 end
264
265 # Export filtered/sorted issues to PDF
266 def export_issues_pdf
267 sort_init 'issues.id', 'desc'
268 sort_update
269
270 search_filter_init_list_issues
271
272 @issues = Issue.find :all, :order => sort_clause,
273 :include => [ :author, :status, :tracker, :project, :custom_values ],
274 :conditions => search_filter_clause
275
276 @options_for_rfpdf ||= {}
277 @options_for_rfpdf[:file_name] = "export.pdf"
244 278 end
245 279
246 280 def move_issues
@@ -49,7 +49,7 module ApplicationHelper
49 49 def link_to_user(user)
50 50 link_to user.display_name, :controller => 'account', :action => 'show', :id => user
51 51 end
52
52
53 53 def format_date(date)
54 54 l_date(date) if date
55 55 end
@@ -57,7 +57,7 module ApplicationHelper
57 57 def format_time(time)
58 58 l_datetime(time) if time
59 59 end
60
60
61 61 def pagination_links_full(paginator, options={}, html_options={})
62 62 html = ''
63 63 html << link_to_remote(('&#171; ' + l(:label_previous)),
@@ -53,9 +53,11 module CustomFieldsHelper
53 53
54 54 # Return a string used to display a custom value
55 55 def show_value(custom_value)
56 return "" unless custom_value
57
56 58 case custom_value.custom_field.field_format
57 59 when "date"
58 format_date(custom_value.value.to_date)
60 l_date(custom_value.value.to_date) if custom_value.value
59 61 when "bool"
60 62 l_YesNo(custom_value.value == "1")
61 63 else
@@ -86,6 +86,11 module SearchFilterHelper
86 86 ] + @project.versions.collect {|s| [s.name, s.id, ["issues.fixed_version_id=?", s.id]] }
87 87 }
88 88
89 search_filter_criteria('author_id') {
90 [ [('['+l(:label_all)+']'), "A", nil],
91 ] + @project.users.collect {|s| [s.display_name, s.id, ["issues.author_id=?", s.id]] }
92 }
93
89 94 search_filter_criteria('assigned_to_id') {
90 95 [ [('['+l(:label_all)+']'), "A", nil],
91 96 [('['+l(:label_none)+']'), "N", ["issues.assigned_to_id is null"]]
@@ -29,6 +29,10 class Enumeration < ActiveRecord::Base
29 29 def self.get_values(option)
30 30 find(:all, :conditions => ['opt=?', option])
31 31 end
32
33 def option_name
34 OPTIONS[self.opt]
35 end
32 36
33 37 private
34 38 def check_integrity
@@ -53,6 +53,11 class Issue < ActiveRecord::Base
53 53 def long_id
54 54 "%05d" % self.id
55 55 end
56
57 def custom_value_for(custom_field)
58 self.custom_values.each {|v| return v if v.custom_field_id == custom_field.id }
59 return nil
60 end
56 61
57 62 private
58 63 # Creates an history for the issue
@@ -43,6 +43,11 class Project < ActiveRecord::Base
43 43 :conditions => ["is_for_all=? or project_id=?", true, self.id])
44 44 #(CustomField.for_all + custom_fields).uniq
45 45 end
46
47 def all_custom_fields
48 @all_custom_fields ||= IssueCustomField.find(:all, :include => :projects,
49 :conditions => ["is_for_all=? or project_id=?", true, self.id])
50 end
46 51
47 52 protected
48 53 def validate
@@ -18,7 +18,7
18 18
19 19 <br /><br />
20 20
21 <table class="listTableContent">
21 <table class="reportTableContent">
22 22 <% for attachment in @attachments %>
23 23 <tr class="<%= cycle("odd", "even") %>">
24 24 <td><%= format_date(attachment.created_on) %></td>
@@ -1,4 +1,4
1 <h2><%=l(:label_enumeration_new)%></h2>
1 <h2><%= l(@enumeration.option_name) %>: <%=l(:label_enumeration_new)%></h2>
2 2
3 3 <%= start_form_tag({:action => 'create'}, :class => "tabular") %>
4 4 <%= render :partial => 'form' %>
@@ -1,4 +1,9
1 1 <h2><%= @issue.tracker.name %> #<%= @issue.id %> - <%= @issue.subject %></h2>
2 <div class="topright">
3 <small>
4 <%= link_to 'PDF', :action => 'export_pdf', :id => @issue %>
5 </small>
6 </div>
2 7
3 8 <div class="box">
4 9 <p>
@@ -7,15 +12,18
7 12 <b><%=l(:field_assigned_to)%> :</b> <%= @issue.assigned_to ? @issue.assigned_to.display_name : "-" %> &nbsp &nbsp
8 13 <b><%=l(:field_category)%> :</b> <%= @issue.category ? @issue.category.name : "-" %>
9 14 </p>
10 <p><b><%=l(:field_author)%> :</b> <%= @issue.author.display_name %></p>
11 <p><b><%=l(:field_subject)%> :</b> <%= @issue.subject %></p>
12 <p><b><%=l(:field_description)%> :</b> <%= simple_format auto_link @issue.description %></p>
13 <p><b><%=l(:field_due_date)%> :</b> <%= format_date(@issue.due_date) %></p>
14 <p><b><%=l(:field_created_on)%> :</b> <%= format_date(@issue.created_on) %></p>
15 <div class="tabular">
16 <p><label><%=l(:field_author)%> :</label> <%= link_to_user @issue.author %>&nbsp;</p>
17 <p><label><%=l(:field_created_on)%> :</label> <%= format_date(@issue.created_on) %>&nbsp;</p>
18 <p><label><%=l(:field_subject)%> :</label> <%= @issue.subject %>&nbsp;</p>
19 <%= simple_format ("<label>" + l(:field_description) + ": </label>" + auto_link(@issue.description)) %>
20 <p><label><%=l(:field_due_date)%> :</label> <%= format_date(@issue.due_date) %>&nbsp;</p>
15 21
16 22 <% for custom_value in @custom_values %>
17 <p><b><%= custom_value.custom_field.name %></b> : <%= show_value custom_value %></p>
23 <p><label><%= custom_value.custom_field.name %> :</label> <%= show_value custom_value %></p>
18 24 <% end %>
25 &nbsp;
26 </div>
19 27
20 28 <% if authorize_for('issues', 'edit') %>
21 29 <%= start_form_tag ({:controller => 'issues', :action => 'edit', :id => @issue}, :method => "get" ) %>
@@ -26,7 +34,7
26 34
27 35 <% if authorize_for('issues', 'change_status') and @status_options and !@status_options.empty? %>
28 36 <%= start_form_tag ({:controller => 'issues', :action => 'change_status', :id => @issue}) %>
29 <label for="history_status_id"><%=l(:label_change_status)%> :</label>
37 <%=l(:label_change_status)%> :
30 38 <select name="history[status_id]">
31 39 <%= options_from_collection_for_select @status_options, "id", "name" %>
32 40 </select>
@@ -1,5 +1,6
1 1 <%=l(:label_issue)%> #<%= issue.id %> - <%= issue.subject %>
2 2 <%=l(:field_author)%>: <%= issue.author.display_name %>
3 <%=l(:field_status)%>: <%= issue.status.name %>
3 4
4 5 <%= issue.description %>
5 6
@@ -1,4 +1,10
1 1 <h2><%=l(:label_issue_plural)%></h2>
2 <div class="topright">
3 <small>
4 <%= link_to 'PDF ', :action => 'export_issues_pdf', :id => @project %> |
5 <%= link_to 'CSV ', :action => 'export_issues_csv', :id => @project %>
6 </small>
7 </div>
2 8
3 9 <form method="post" class="noborder">
4 10 <table cellpadding=2>
@@ -8,6 +14,7
8 14 <td><small><%=l(:field_priority)%>:</small><br /><%= search_filter_tag 'priority_id', :class => 'select-small' %></td>
9 15 <td><small><%=l(:field_category)%>:</small><br /><%= search_filter_tag 'category_id', :class => 'select-small' %></td>
10 16 <td><small><%=l(:field_fixed_version)%>:</small><br /><%= search_filter_tag 'fixed_version_id', :class => 'select-small' %></td>
17 <td><small><%=l(:field_author)%>:</small><br /><%= search_filter_tag 'author_id', :class => 'select-small' %></td>
11 18 <td><small><%=l(:field_assigned_to)%>:</small><br /><%= search_filter_tag 'assigned_to_id', :class => 'select-small' %></td>
12 19 <td><small><%=l(:label_subproject_plural)%>:</small><br /><%= search_filter_tag 'subproject_id', :class => 'select-small' %></td>
13 20 <td valign="bottom">
@@ -22,13 +29,21
22 29 <%= end_form_tag %>
23 30
24 31 &nbsp;
25
26 <%= start_form_tag ({:controller => 'projects', :action => 'move_issues', :id => @project}, :id => 'issues_form' ) %>
27 32 <table class="listTableContent">
28 33 <tr>
29 34 <td colspan="6" align="left"><small><%= check_all_links 'issues_form' %></small></td>
30 <td colspan="2" align="right"><small><%= link_to l(:label_export_csv), :action => 'export_issues_csv', :id => @project.id %></small></td>
31 </tr>
35 <td colspan="2" align="right">
36 <small><%= l(:label_per_page) %>:</small>
37 <%= start_form_tag %>
38 <%= select_tag 'per_page', options_for_select(@results_per_page_options, @results_per_page), :class => 'select-small'%>
39 <%= submit_tag l(:button_apply), :class => 'button-small'%>
40 <%= end_form_tag %>
41 </td>
42 </tr>
43 </table>
44 <%= start_form_tag ({:controller => 'projects', :action => 'move_issues', :id => @project}, :id => 'issues_form' ) %>
45 <table class="listTableContent">
46
32 47 <tr class="ListHead">
33 48 <td></td>
34 49 <%= sort_header_tag('issues.id', :caption => '#') %>
@@ -1,22 +1,20
1 1 <h2><%=l(:label_report_plural)%></h2>
2 2
3 3 <div class="splitcontentleft">
4 <strong><%=l(:field_tracker)%></strong>
4 <strong><%=l(:field_tracker)%></strong> <small>[ <%= link_to l(:label_details), :detail => 'author' %> ]</small>
5 5 <%= render :partial => 'simple', :locals => { :data => @issues_by_tracker, :field_name => "tracker_id", :rows => @trackers } %>
6 <p align="right"><small><%= link_to l(:label_details), :detail => 'tracker' %></small>&nbsp;</p>
7
8 <strong><%=l(:field_priority)%></strong>
6 <br />
7 <strong><%=l(:field_priority)%></strong> <small>[ <%= link_to l(:label_details), :detail => 'priority' %> ]</small>
9 8 <%= render :partial => 'simple', :locals => { :data => @issues_by_priority, :field_name => "priority_id", :rows => @priorities } %>
10 <p align="right"><small><%= link_to l(:label_details), :detail => 'priority' %></small>&nbsp;</p>
11
12 <strong><%=l(:field_author)%></strong>
9 <br />
10 <strong><%=l(:field_author)%></strong> <small>[ <%= link_to l(:label_details), :detail => 'author' %> ]</small>
13 11 <%= render :partial => 'simple', :locals => { :data => @issues_by_author, :field_name => "author_id", :rows => @authors } %>
14 <p align="right"><small><%= link_to l(:label_details), :detail => 'author' %></small>&nbsp;</p>
12 <br />
15 13 </div>
16 14
17 15 <div class="splitcontentright">
18 <strong><%=l(:field_category)%></strong>
16 <strong><%=l(:field_category)%></strong> <small>[ <%= link_to l(:label_details), :detail => 'category' %> ]</small>
19 17 <%= render :partial => 'simple', :locals => { :data => @issues_by_category, :field_name => "category_id", :rows => @categories } %>
20 <p align="right"><small><%= link_to l(:label_details), :detail => 'category' %></small>&nbsp;</p>
18 <br />
21 19 </div>
22 20
@@ -44,6 +44,7 general_text_Yes: 'Ja'
44 44 general_text_no: 'nein'
45 45 general_text_yes: 'ja'
46 46 general_lang_de: 'Deutsch'
47 general_csv_separator: ';'
47 48
48 49 notice_account_updated: Konto wurde erfolgreich aktualisiert.
49 50 notice_account_invalid_creditentials: Unzulässiger Benutzer oder Passwort
@@ -225,6 +226,7 label_version_new: Neue Version
225 226 label_version_plural: Versionen
226 227 label_confirmation: Bestätigung
227 228 #label_export_csv: Export to CSV
229 #label_export_pdf: Export to PDF
228 230 label_read: Lesen...
229 231 label_public_projects: Öffentliche Projekte
230 232 #label_open_issues: Open
@@ -242,6 +244,7 label_previous: Zurück
242 244 label_used_by: Benutzt von
243 245 #label_details: Details...
244 246 #label_add_note: Add a note
247 #label_per_page: Per page
245 248
246 249 button_login: Einloggen
247 250 button_submit: Einreichen
@@ -44,6 +44,7 general_text_Yes: 'Yes'
44 44 general_text_no: 'no'
45 45 general_text_yes: 'yes'
46 46 general_lang_en: 'English'
47 general_csv_separator: ','
47 48
48 49 notice_account_updated: Account was successfully updated.
49 50 notice_account_invalid_creditentials: Invalid user or password
@@ -225,6 +226,7 label_version_new: New version
225 226 label_version_plural: Versions
226 227 label_confirmation: Confirmation
227 228 label_export_csv: Export to CSV
229 label_export_pdf: Export to PDF
228 230 label_read: Read...
229 231 label_public_projects: Public projects
230 232 label_open_issues: Open
@@ -242,6 +244,7 label_previous: Previous
242 244 label_used_by: Used by
243 245 label_details: Details...
244 246 label_add_note: Add a note
247 label_per_page: Per page
245 248
246 249 button_login: Login
247 250 button_submit: Submit
@@ -44,6 +44,7 general_text_Yes: 'Sí'
44 44 general_text_no: 'no'
45 45 general_text_yes: 'sí'
46 46 general_lang_es: 'Español'
47 general_csv_separator: ';'
47 48
48 49 notice_account_updated: Account was successfully updated.
49 50 notice_account_invalid_creditentials: Invalid user or password
@@ -225,6 +226,7 label_version_new: Nueva versión
225 226 label_version_plural: Versiónes
226 227 label_confirmation: Confirmación
227 228 label_export_csv: Exportar a CSV
229 label_export_pdf: Exportar a PDF
228 230 label_read: Leer...
229 231 label_public_projects: Proyectos publicos
230 232 label_open_issues: Abierta
@@ -242,6 +244,7 label_previous: Precedente
242 244 label_used_by: Utilizado por
243 245 #label_details: Details...
244 246 #label_add_note: Add a note
247 #label_per_page: Per page
245 248
246 249 button_login: Conexión
247 250 button_submit: Someter
@@ -44,6 +44,7 general_text_Yes: 'Oui'
44 44 general_text_no: 'non'
45 45 general_text_yes: 'oui'
46 46 general_lang_fr: 'Français'
47 general_csv_separator: ';'
47 48
48 49 notice_account_updated: Le compte a été mis à jour avec succès.
49 50 notice_account_invalid_creditentials: Identifiant ou mot de passe invalide.
@@ -225,6 +226,7 label_version_new: Nouvelle version
225 226 label_version_plural: Versions
226 227 label_confirmation: Confirmation
227 228 label_export_csv: Exporter en CSV
229 label_export_pdf: Exporter en PDF
228 230 label_read: Lire...
229 231 label_public_projects: Projets publics
230 232 label_open_issues: Ouverte
@@ -242,6 +244,7 label_previous: Précédent
242 244 label_used_by: Utilisé par
243 245 label_details: Détails...
244 246 label_add_note: Ajouter une note
247 label_per_page: Par page
245 248
246 249 button_login: Connexion
247 250 button_submit: Soumettre
@@ -205,10 +205,14 input.button-small
205 205 font-size: 0.8em;
206 206 }
207 207
208 select {
209 vertical-align: middle;
210 }
211
208 212 select.select-small
209 213 {
210 214 border: 1px solid #7F9DB9;
211 padding: 1px;
215 padding: 1px;
212 216 font-size: 0.8em;
213 217 }
214 218
@@ -244,7 +248,7 table.listTableContent {
244 248 }
245 249
246 250 table.listTableContent td {
247 padding:4px;
251 padding:2px;
248 252 }
249 253
250 254 tr.ListHead {
@@ -366,6 +370,12 color:#505050;
366 370 line-height:1.5em;
367 371 }
368 372
373 .topright{
374 position: absolute;
375 right: 25px;
376 top: 100px;
377 }
378
369 379 .login {
370 380 width: 50%;
371 381 text-align: left;
General Comments 0
You need to be logged in to leave comments. Login now