Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
908dcc4eb4 | ||
|
|
20bdba13cf | ||
|
|
46c0d72782 | ||
|
|
36b5d4f6af | ||
|
|
b366375e7e | ||
|
|
629c106a46 | ||
|
|
f19ae06a72 | ||
|
|
69b99aa518 | ||
|
|
cb5d0c469d | ||
|
|
57d10ed893 | ||
|
|
28e4ff8957 | ||
|
|
3d1bd79ffb | ||
|
|
7f957653ad | ||
|
|
9a9141041e | ||
|
|
bc4249e3d3 | ||
|
|
fae04f3ae1 | ||
|
|
b13ef64794 | ||
|
|
683e1c5d73 | ||
|
|
1c1755d278 | ||
|
|
5e6ff86f47 | ||
|
|
764393aa6a | ||
|
|
3155b8ccad | ||
|
|
567c8ed9b0 | ||
|
|
49b6f9e4dd | ||
|
|
c9d4d3a2be | ||
|
|
31178553f3 | ||
|
|
dea10c54f9 | ||
|
|
6abd32be9e | ||
|
|
56318aab53 | ||
|
|
babb14dd94 | ||
|
|
3b90141543 | ||
|
|
bce764d9bc | ||
|
|
b65d546245 | ||
|
|
9f12151ac0 | ||
|
|
78cac6f02b | ||
|
|
16b85bda32 | ||
|
|
733987fbb6 | ||
|
|
7389b4bed0 | ||
|
|
4570fcb7a2 | ||
|
|
0a709660d2 | ||
|
|
633e026e44 | ||
|
|
618ab6004e |
@@ -27,7 +27,7 @@ class AdminController < ApplicationController
|
|||||||
|
|
||||||
def projects
|
def projects
|
||||||
sort_init 'name', 'asc'
|
sort_init 'name', 'asc'
|
||||||
sort_update
|
sort_update %w(name is_public created_on)
|
||||||
|
|
||||||
@status = params[:status] ? params[:status].to_i : 1
|
@status = params[:status] ? params[:status].to_i : 1
|
||||||
c = ARCondition.new(@status == 0 ? "status <> 0" : ["status = ?", @status])
|
c = ARCondition.new(@status == 0 ? "status <> 0" : ["status = ?", @status])
|
||||||
@@ -86,6 +86,7 @@ class AdminController < ApplicationController
|
|||||||
@flags = {
|
@flags = {
|
||||||
:default_admin_changed => User.find(:first, :conditions => ["login=? and hashed_password=?", 'admin', User.hash_password('admin')]).nil?,
|
:default_admin_changed => User.find(:first, :conditions => ["login=? and hashed_password=?", 'admin', User.hash_password('admin')]).nil?,
|
||||||
:file_repository_writable => File.writable?(Attachment.storage_path),
|
:file_repository_writable => File.writable?(Attachment.storage_path),
|
||||||
|
:plugin_assets_writable => File.writable?(Engines.public_directory),
|
||||||
:rmagick_available => Object.const_defined?(:Magick)
|
:rmagick_available => Object.const_defined?(:Magick)
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -126,10 +126,14 @@ class ApplicationController < ActionController::Base
|
|||||||
def redirect_back_or_default(default)
|
def redirect_back_or_default(default)
|
||||||
back_url = CGI.unescape(params[:back_url].to_s)
|
back_url = CGI.unescape(params[:back_url].to_s)
|
||||||
if !back_url.blank?
|
if !back_url.blank?
|
||||||
uri = URI.parse(back_url)
|
begin
|
||||||
# do not redirect user to another host or to the login or register page
|
uri = URI.parse(back_url)
|
||||||
if (uri.relative? || (uri.host == request.host)) && !uri.path.match(%r{/(login|account/register)})
|
# do not redirect user to another host or to the login or register page
|
||||||
redirect_to(back_url) and return
|
if (uri.relative? || (uri.host == request.host)) && !uri.path.match(%r{/(login|account/register)})
|
||||||
|
redirect_to(back_url) and return
|
||||||
|
end
|
||||||
|
rescue URI::InvalidURIError
|
||||||
|
# redirect to default
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
redirect_to default
|
redirect_to default
|
||||||
@@ -171,6 +175,7 @@ class ApplicationController < ActionController::Base
|
|||||||
# TODO: move to model
|
# TODO: move to model
|
||||||
def attach_files(obj, attachments)
|
def attach_files(obj, attachments)
|
||||||
attached = []
|
attached = []
|
||||||
|
unsaved = []
|
||||||
if attachments && attachments.is_a?(Hash)
|
if attachments && attachments.is_a?(Hash)
|
||||||
attachments.each_value do |attachment|
|
attachments.each_value do |attachment|
|
||||||
file = attachment['file']
|
file = attachment['file']
|
||||||
@@ -179,7 +184,10 @@ class ApplicationController < ActionController::Base
|
|||||||
:file => file,
|
:file => file,
|
||||||
:description => attachment['description'].to_s.strip,
|
:description => attachment['description'].to_s.strip,
|
||||||
:author => User.current)
|
:author => User.current)
|
||||||
attached << a unless a.new_record?
|
a.new_record? ? (unsaved << a) : (attached << a)
|
||||||
|
end
|
||||||
|
if unsaved.any?
|
||||||
|
flash[:warning] = l(:warning_attachments_not_saved, unsaved.size)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
attached
|
attached
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# redMine - project management software
|
# Redmine - project management software
|
||||||
# Copyright (C) 2006-2007 Jean-Philippe Lang
|
# Copyright (C) 2006-2008 Jean-Philippe Lang
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or
|
# This program is free software; you can redistribute it and/or
|
||||||
# modify it under the terms of the GNU General Public License
|
# modify it under the terms of the GNU General Public License
|
||||||
@@ -17,7 +17,11 @@
|
|||||||
|
|
||||||
class AttachmentsController < ApplicationController
|
class AttachmentsController < ApplicationController
|
||||||
before_filter :find_project
|
before_filter :find_project
|
||||||
|
before_filter :read_authorize, :except => :destroy
|
||||||
|
before_filter :delete_authorize, :only => :destroy
|
||||||
|
|
||||||
|
verify :method => :post, :only => :destroy
|
||||||
|
|
||||||
def show
|
def show
|
||||||
if @attachment.is_diff?
|
if @attachment.is_diff?
|
||||||
@diff = File.new(@attachment.diskfile, "rb").read
|
@diff = File.new(@attachment.diskfile, "rb").read
|
||||||
@@ -31,25 +35,40 @@ class AttachmentsController < ApplicationController
|
|||||||
end
|
end
|
||||||
|
|
||||||
def download
|
def download
|
||||||
@attachment.increment_download if @attachment.container.is_a?(Version)
|
if @attachment.container.is_a?(Version) || @attachment.container.is_a?(Project)
|
||||||
|
@attachment.increment_download
|
||||||
|
end
|
||||||
|
|
||||||
# images are sent inline
|
# images are sent inline
|
||||||
send_file @attachment.diskfile, :filename => filename_for_content_disposition(@attachment.filename),
|
send_file @attachment.diskfile, :filename => filename_for_content_disposition(@attachment.filename),
|
||||||
:type => @attachment.content_type,
|
:type => @attachment.content_type,
|
||||||
:disposition => (@attachment.image? ? 'inline' : 'attachment')
|
:disposition => (@attachment.image? ? 'inline' : 'attachment')
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def destroy
|
||||||
|
# Make sure association callbacks are called
|
||||||
|
@attachment.container.attachments.delete(@attachment)
|
||||||
|
redirect_to :back
|
||||||
|
rescue ::ActionController::RedirectBackError
|
||||||
|
redirect_to :controller => 'projects', :action => 'show', :id => @project
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
def find_project
|
def find_project
|
||||||
@attachment = Attachment.find(params[:id])
|
@attachment = Attachment.find(params[:id])
|
||||||
# Show 404 if the filename in the url is wrong
|
# Show 404 if the filename in the url is wrong
|
||||||
raise ActiveRecord::RecordNotFound if params[:filename] && params[:filename] != @attachment.filename
|
raise ActiveRecord::RecordNotFound if params[:filename] && params[:filename] != @attachment.filename
|
||||||
|
|
||||||
@project = @attachment.project
|
@project = @attachment.project
|
||||||
permission = @attachment.container.is_a?(Version) ? :view_files : "view_#{@attachment.container.class.name.underscore.pluralize}".to_sym
|
|
||||||
allowed = User.current.allowed_to?(permission, @project)
|
|
||||||
allowed ? true : (User.current.logged? ? render_403 : require_login)
|
|
||||||
rescue ActiveRecord::RecordNotFound
|
rescue ActiveRecord::RecordNotFound
|
||||||
render_404
|
render_404
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def read_authorize
|
||||||
|
@attachment.visible? ? true : deny_access
|
||||||
|
end
|
||||||
|
|
||||||
|
def delete_authorize
|
||||||
|
@attachment.deletable? ? true : deny_access
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -35,12 +35,14 @@ class BoardsController < ApplicationController
|
|||||||
end
|
end
|
||||||
|
|
||||||
def show
|
def show
|
||||||
sort_init "#{Message.table_name}.updated_on", "desc"
|
sort_init 'updated_on', 'desc'
|
||||||
sort_update
|
sort_update 'created_on' => "#{Message.table_name}.created_on",
|
||||||
|
'replies' => "#{Message.table_name}.replies_count",
|
||||||
|
'updated_on' => "#{Message.table_name}.updated_on"
|
||||||
|
|
||||||
@topic_count = @board.topics.count
|
@topic_count = @board.topics.count
|
||||||
@topic_pages = Paginator.new self, @topic_count, per_page_option, params['page']
|
@topic_pages = Paginator.new self, @topic_count, per_page_option, params['page']
|
||||||
@topics = @board.topics.find :all, :order => "#{Message.table_name}.sticky DESC, #{sort_clause}",
|
@topics = @board.topics.find :all, :order => ["#{Message.table_name}.sticky DESC", sort_clause].compact.join(', '),
|
||||||
:include => [:author, {:last_reply => :author}],
|
:include => [:author, {:last_reply => :author}],
|
||||||
:limit => @topic_pages.items_per_page,
|
:limit => @topic_pages.items_per_page,
|
||||||
:offset => @topic_pages.current.offset
|
:offset => @topic_pages.current.offset
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ class DocumentsController < ApplicationController
|
|||||||
else
|
else
|
||||||
@grouped = documents.group_by(&:category)
|
@grouped = documents.group_by(&:category)
|
||||||
end
|
end
|
||||||
|
@document = @project.documents.build
|
||||||
render :layout => false if request.xhr?
|
render :layout => false if request.xhr?
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -70,11 +71,6 @@ class DocumentsController < ApplicationController
|
|||||||
Mailer.deliver_attachments_added(attachments) if !attachments.empty? && Setting.notified_events.include?('document_added')
|
Mailer.deliver_attachments_added(attachments) if !attachments.empty? && Setting.notified_events.include?('document_added')
|
||||||
redirect_to :action => 'show', :id => @document
|
redirect_to :action => 'show', :id => @document
|
||||||
end
|
end
|
||||||
|
|
||||||
def destroy_attachment
|
|
||||||
@document.attachments.find(params[:attachment_id]).destroy
|
|
||||||
redirect_to :action => 'show', :id => @document
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
private
|
||||||
def find_project
|
def find_project
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
class IssuesController < ApplicationController
|
class IssuesController < ApplicationController
|
||||||
menu_item :new_issue, :only => :new
|
menu_item :new_issue, :only => :new
|
||||||
|
|
||||||
before_filter :find_issue, :only => [:show, :edit, :reply, :destroy_attachment]
|
before_filter :find_issue, :only => [:show, :edit, :reply]
|
||||||
before_filter :find_issues, :only => [:bulk_edit, :move, :destroy]
|
before_filter :find_issues, :only => [:bulk_edit, :move, :destroy]
|
||||||
before_filter :find_project, :only => [:new, :update_form, :preview]
|
before_filter :find_project, :only => [:new, :update_form, :preview]
|
||||||
before_filter :authorize, :except => [:index, :changes, :gantt, :calendar, :preview, :update_form, :context_menu]
|
before_filter :authorize, :except => [:index, :changes, :gantt, :calendar, :preview, :update_form, :context_menu]
|
||||||
@@ -30,8 +30,6 @@ class IssuesController < ApplicationController
|
|||||||
include ProjectsHelper
|
include ProjectsHelper
|
||||||
helper :custom_fields
|
helper :custom_fields
|
||||||
include CustomFieldsHelper
|
include CustomFieldsHelper
|
||||||
helper :ifpdf
|
|
||||||
include IfpdfHelper
|
|
||||||
helper :issue_relations
|
helper :issue_relations
|
||||||
include IssueRelationsHelper
|
include IssueRelationsHelper
|
||||||
helper :watchers
|
helper :watchers
|
||||||
@@ -43,11 +41,13 @@ class IssuesController < ApplicationController
|
|||||||
include SortHelper
|
include SortHelper
|
||||||
include IssuesHelper
|
include IssuesHelper
|
||||||
helper :timelog
|
helper :timelog
|
||||||
|
include Redmine::Export::PDF
|
||||||
|
|
||||||
def index
|
def index
|
||||||
sort_init "#{Issue.table_name}.id", "desc"
|
|
||||||
sort_update
|
|
||||||
retrieve_query
|
retrieve_query
|
||||||
|
sort_init 'id', 'desc'
|
||||||
|
sort_update({'id' => "#{Issue.table_name}.id"}.merge(@query.columns.inject({}) {|h, c| h[c.name.to_s] = c.sortable; h}))
|
||||||
|
|
||||||
if @query.valid?
|
if @query.valid?
|
||||||
limit = per_page_option
|
limit = per_page_option
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
@@ -67,7 +67,7 @@ class IssuesController < ApplicationController
|
|||||||
format.html { render :template => 'issues/index.rhtml', :layout => !request.xhr? }
|
format.html { render :template => 'issues/index.rhtml', :layout => !request.xhr? }
|
||||||
format.atom { render_feed(@issues, :title => "#{@project || Setting.app_title}: #{l(:label_issue_plural)}") }
|
format.atom { render_feed(@issues, :title => "#{@project || Setting.app_title}: #{l(:label_issue_plural)}") }
|
||||||
format.csv { send_data(issues_to_csv(@issues, @project).read, :type => 'text/csv; header=present', :filename => 'export.csv') }
|
format.csv { send_data(issues_to_csv(@issues, @project).read, :type => 'text/csv; header=present', :filename => 'export.csv') }
|
||||||
format.pdf { send_data(render(:template => 'issues/index.rfpdf', :layout => false), :type => 'application/pdf', :filename => 'export.pdf') }
|
format.pdf { send_data(issues_to_pdf(@issues, @project), :type => 'application/pdf', :filename => 'export.pdf') }
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
# Send html if the query is not valid
|
# Send html if the query is not valid
|
||||||
@@ -78,9 +78,10 @@ class IssuesController < ApplicationController
|
|||||||
end
|
end
|
||||||
|
|
||||||
def changes
|
def changes
|
||||||
sort_init "#{Issue.table_name}.id", "desc"
|
|
||||||
sort_update
|
|
||||||
retrieve_query
|
retrieve_query
|
||||||
|
sort_init 'id', 'desc'
|
||||||
|
sort_update({'id' => "#{Issue.table_name}.id"}.merge(@query.columns.inject({}) {|h, c| h[c.name.to_s] = c.sortable; h}))
|
||||||
|
|
||||||
if @query.valid?
|
if @query.valid?
|
||||||
@journals = Journal.find :all, :include => [ :details, :user, {:issue => [:project, :author, :tracker, :status]} ],
|
@journals = Journal.find :all, :include => [ :details, :user, {:issue => [:project, :author, :tracker, :status]} ],
|
||||||
:conditions => @query.statement,
|
:conditions => @query.statement,
|
||||||
@@ -104,7 +105,7 @@ class IssuesController < ApplicationController
|
|||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.html { render :template => 'issues/show.rhtml' }
|
format.html { render :template => 'issues/show.rhtml' }
|
||||||
format.atom { render :action => 'changes', :layout => false, :content_type => 'application/atom+xml' }
|
format.atom { render :action => 'changes', :layout => false, :content_type => 'application/atom+xml' }
|
||||||
format.pdf { send_data(render(:template => 'issues/show.rfpdf', :layout => false), :type => 'application/pdf', :filename => "#{@project.identifier}-#{@issue.id}.pdf") }
|
format.pdf { send_data(issue_to_pdf(@issue), :type => 'application/pdf', :filename => "#{@project.identifier}-#{@issue.id}.pdf") }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -121,7 +122,10 @@ class IssuesController < ApplicationController
|
|||||||
render :nothing => true, :layout => true
|
render :nothing => true, :layout => true
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
@issue.attributes = params[:issue]
|
if params[:issue].is_a?(Hash)
|
||||||
|
@issue.attributes = params[:issue]
|
||||||
|
@issue.watcher_user_ids = params[:issue]['watcher_user_ids'] if User.current.allowed_to?(:add_issue_watchers, @project)
|
||||||
|
end
|
||||||
@issue.author = User.current
|
@issue.author = User.current
|
||||||
|
|
||||||
default_status = IssueStatus.default
|
default_status = IssueStatus.default
|
||||||
@@ -143,7 +147,8 @@ class IssuesController < ApplicationController
|
|||||||
attach_files(@issue, params[:attachments])
|
attach_files(@issue, params[:attachments])
|
||||||
flash[:notice] = l(:notice_successful_create)
|
flash[:notice] = l(:notice_successful_create)
|
||||||
Mailer.deliver_issue_add(@issue) if Setting.notified_events.include?('issue_added')
|
Mailer.deliver_issue_add(@issue) if Setting.notified_events.include?('issue_added')
|
||||||
redirect_to :controller => 'issues', :action => 'show', :id => @issue
|
redirect_to(params[:continue] ? { :action => 'new', :tracker_id => @issue.tracker } :
|
||||||
|
{ :action => 'show', :id => @issue })
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -181,7 +186,7 @@ class IssuesController < ApplicationController
|
|||||||
|
|
||||||
if (@time_entry.hours.nil? || @time_entry.valid?) && @issue.save
|
if (@time_entry.hours.nil? || @time_entry.valid?) && @issue.save
|
||||||
# Log spend time
|
# Log spend time
|
||||||
if current_role.allowed_to?(:log_time)
|
if User.current.allowed_to?(:log_time, @project)
|
||||||
@time_entry.save
|
@time_entry.save
|
||||||
end
|
end
|
||||||
if !journal.new_record?
|
if !journal.new_record?
|
||||||
@@ -313,17 +318,6 @@ class IssuesController < ApplicationController
|
|||||||
@issues.each(&:destroy)
|
@issues.each(&:destroy)
|
||||||
redirect_to :action => 'index', :project_id => @project
|
redirect_to :action => 'index', :project_id => @project
|
||||||
end
|
end
|
||||||
|
|
||||||
def destroy_attachment
|
|
||||||
a = @issue.attachments.find(params[:attachment_id])
|
|
||||||
a.destroy
|
|
||||||
journal = @issue.init_journal(User.current)
|
|
||||||
journal.details << JournalDetail.new(:property => 'attachment',
|
|
||||||
:prop_key => a.id,
|
|
||||||
:old_value => a.filename)
|
|
||||||
journal.save
|
|
||||||
redirect_to :action => 'show', :id => @issue
|
|
||||||
end
|
|
||||||
|
|
||||||
def gantt
|
def gantt
|
||||||
@gantt = Redmine::Helpers::Gantt.new(params)
|
@gantt = Redmine::Helpers::Gantt.new(params)
|
||||||
@@ -352,7 +346,7 @@ class IssuesController < ApplicationController
|
|||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.html { render :template => "issues/gantt.rhtml", :layout => !request.xhr? }
|
format.html { render :template => "issues/gantt.rhtml", :layout => !request.xhr? }
|
||||||
format.png { send_data(@gantt.to_image, :disposition => 'inline', :type => 'image/png', :filename => "#{@project.identifier}-gantt.png") } if @gantt.respond_to?('to_image')
|
format.png { send_data(@gantt.to_image, :disposition => 'inline', :type => 'image/png', :filename => "#{@project.identifier}-gantt.png") } if @gantt.respond_to?('to_image')
|
||||||
format.pdf { send_data(render(:template => "issues/gantt.rfpdf", :layout => false), :type => 'application/pdf', :filename => "#{@project.nil? ? '' : "#{@project.identifier}-" }gantt.pdf") }
|
format.pdf { send_data(gantt_to_pdf(@gantt, @project), :type => 'application/pdf', :filename => "#{@project.nil? ? '' : "#{@project.identifier}-" }gantt.pdf") }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ class JournalsController < ApplicationController
|
|||||||
if request.post?
|
if request.post?
|
||||||
@journal.update_attributes(:notes => params[:notes]) if params[:notes]
|
@journal.update_attributes(:notes => params[:notes]) if params[:notes]
|
||||||
@journal.destroy if @journal.details.empty? && @journal.notes.blank?
|
@journal.destroy if @journal.details.empty? && @journal.notes.blank?
|
||||||
|
call_hook(:controller_journals_edit_post, { :journal => @journal, :params => params})
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.html { redirect_to :controller => 'issues', :action => 'show', :id => @journal.journalized_id }
|
format.html { redirect_to :controller => 'issues', :action => 'show', :id => @journal.journalized_id }
|
||||||
format.js { render :action => 'update' }
|
format.js { render :action => 'update' }
|
||||||
|
|||||||
@@ -33,8 +33,6 @@ class ProjectsController < ApplicationController
|
|||||||
include SortHelper
|
include SortHelper
|
||||||
helper :custom_fields
|
helper :custom_fields
|
||||||
include CustomFieldsHelper
|
include CustomFieldsHelper
|
||||||
helper :ifpdf
|
|
||||||
include IfpdfHelper
|
|
||||||
helper :issues
|
helper :issues
|
||||||
helper IssuesHelper
|
helper IssuesHelper
|
||||||
helper :queries
|
helper :queries
|
||||||
@@ -84,6 +82,11 @@ class ProjectsController < ApplicationController
|
|||||||
|
|
||||||
# Show @project
|
# Show @project
|
||||||
def show
|
def show
|
||||||
|
if params[:jump]
|
||||||
|
# try to redirect to the requested menu item
|
||||||
|
redirect_to_project_menu_item(@project, params[:jump]) && return
|
||||||
|
end
|
||||||
|
|
||||||
@members_by_role = @project.members.find(:all, :include => [:user, :role], :order => 'position').group_by {|m| m.role}
|
@members_by_role = @project.members.find(:all, :include => [:user, :role], :order => 'position').group_by {|m| m.role}
|
||||||
@subprojects = @project.children.find(:all, :conditions => Project.visible_by(User.current))
|
@subprojects = @project.children.find(:all, :conditions => Project.visible_by(User.current))
|
||||||
@news = @project.news.find(:all, :limit => 5, :include => [ :author, :project ], :order => "#{News.table_name}.created_on DESC")
|
@news = @project.news.find(:all, :limit => 5, :include => [ :author, :project ], :order => "#{News.table_name}.created_on DESC")
|
||||||
@@ -188,18 +191,26 @@ class ProjectsController < ApplicationController
|
|||||||
|
|
||||||
def add_file
|
def add_file
|
||||||
if request.post?
|
if request.post?
|
||||||
@version = @project.versions.find_by_id(params[:version_id])
|
container = (params[:version_id].blank? ? @project : @project.versions.find_by_id(params[:version_id]))
|
||||||
attachments = attach_files(@version, params[:attachments])
|
attachments = attach_files(container, params[:attachments])
|
||||||
Mailer.deliver_attachments_added(attachments) if !attachments.empty? && Setting.notified_events.include?('file_added')
|
if !attachments.empty? && Setting.notified_events.include?('file_added')
|
||||||
|
Mailer.deliver_attachments_added(attachments)
|
||||||
|
end
|
||||||
redirect_to :controller => 'projects', :action => 'list_files', :id => @project
|
redirect_to :controller => 'projects', :action => 'list_files', :id => @project
|
||||||
|
return
|
||||||
end
|
end
|
||||||
@versions = @project.versions.sort
|
@versions = @project.versions.sort
|
||||||
end
|
end
|
||||||
|
|
||||||
def list_files
|
def list_files
|
||||||
sort_init "#{Attachment.table_name}.filename", "asc"
|
sort_init 'filename', 'asc'
|
||||||
sort_update
|
sort_update 'filename' => "#{Attachment.table_name}.filename",
|
||||||
@versions = @project.versions.find(:all, :include => :attachments, :order => sort_clause).sort.reverse
|
'created_on' => "#{Attachment.table_name}.created_on",
|
||||||
|
'size' => "#{Attachment.table_name}.filesize",
|
||||||
|
'downloads' => "#{Attachment.table_name}.downloads"
|
||||||
|
|
||||||
|
@containers = [ Project.find(@project.id, :include => :attachments, :order => sort_clause)]
|
||||||
|
@containers += @project.versions.find(:all, :include => :attachments, :order => sort_clause).sort.reverse
|
||||||
render :layout => !request.xhr?
|
render :layout => !request.xhr?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -51,8 +51,9 @@ class RepositoriesController < ApplicationController
|
|||||||
@users += User.find_all_by_id(additional_user_ids) unless additional_user_ids.empty?
|
@users += User.find_all_by_id(additional_user_ids) unless additional_user_ids.empty?
|
||||||
@users.compact!
|
@users.compact!
|
||||||
@users.sort!
|
@users.sort!
|
||||||
if request.post?
|
if request.post? && params[:committers].is_a?(Hash)
|
||||||
@repository.committer_ids = params[:committers]
|
# Build a hash with repository usernames as keys and corresponding user ids as values
|
||||||
|
@repository.committer_ids = params[:committers].values.inject({}) {|h, c| h[c.first] = c.last; h}
|
||||||
flash[:notice] = l(:notice_successful_update)
|
flash[:notice] = l(:notice_successful_update)
|
||||||
redirect_to :action => 'committers', :id => @project
|
redirect_to :action => 'committers', :id => @project
|
||||||
end
|
end
|
||||||
@@ -126,6 +127,9 @@ class RepositoriesController < ApplicationController
|
|||||||
end
|
end
|
||||||
|
|
||||||
def annotate
|
def annotate
|
||||||
|
@entry = @repository.entry(@path, @rev)
|
||||||
|
show_error_not_found and return unless @entry
|
||||||
|
|
||||||
@annotate = @repository.scm.annotate(@path, @rev)
|
@annotate = @repository.scm.annotate(@path, @rev)
|
||||||
render_error l(:error_scm_annotate) and return if @annotate.nil? || @annotate.empty?
|
render_error l(:error_scm_annotate) and return if @annotate.nil? || @annotate.empty?
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ class SettingsController < ApplicationController
|
|||||||
@options[:user_format] = User::USER_FORMATS.keys.collect {|f| [User.current.name(f), f.to_s] }
|
@options[:user_format] = User::USER_FORMATS.keys.collect {|f| [User.current.name(f), f.to_s] }
|
||||||
@deliveries = ActionMailer::Base.perform_deliveries
|
@deliveries = ActionMailer::Base.perform_deliveries
|
||||||
|
|
||||||
@guessed_host_and_path = request.host_with_port
|
@guessed_host_and_path = request.host_with_port.dup
|
||||||
@guessed_host_and_path << ('/'+ request.relative_url_root.gsub(%r{^\/}, '')) unless request.relative_url_root.blank?
|
@guessed_host_and_path << ('/'+ request.relative_url_root.gsub(%r{^\/}, '')) unless request.relative_url_root.blank?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -138,7 +138,12 @@ class TimelogController < ApplicationController
|
|||||||
|
|
||||||
def details
|
def details
|
||||||
sort_init 'spent_on', 'desc'
|
sort_init 'spent_on', 'desc'
|
||||||
sort_update
|
sort_update 'spent_on' => 'spent_on',
|
||||||
|
'user' => 'user_id',
|
||||||
|
'activity' => 'activity_id',
|
||||||
|
'project' => "#{Project.table_name}.name",
|
||||||
|
'issue' => 'issue_id',
|
||||||
|
'hours' => 'hours'
|
||||||
|
|
||||||
cond = ARCondition.new
|
cond = ARCondition.new
|
||||||
if @project.nil?
|
if @project.nil?
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ class UsersController < ApplicationController
|
|||||||
|
|
||||||
def list
|
def list
|
||||||
sort_init 'login', 'asc'
|
sort_init 'login', 'asc'
|
||||||
sort_update
|
sort_update %w(login firstname lastname mail admin created_on last_login_on)
|
||||||
|
|
||||||
@status = params[:status] ? params[:status].to_i : 1
|
@status = params[:status] ? params[:status].to_i : 1
|
||||||
c = ARCondition.new(@status == 0 ? "status <> 0" : ["status = ?", @status])
|
c = ARCondition.new(@status == 0 ? "status <> 0" : ["status = ?", @status])
|
||||||
@@ -75,7 +75,11 @@ class UsersController < ApplicationController
|
|||||||
@user.admin = params[:user][:admin] if params[:user][:admin]
|
@user.admin = params[:user][:admin] if params[:user][:admin]
|
||||||
@user.login = params[:user][:login] if params[:user][:login]
|
@user.login = params[:user][:login] if params[:user][:login]
|
||||||
@user.password, @user.password_confirmation = params[:password], params[:password_confirmation] unless params[:password].nil? or params[:password].empty? or @user.auth_source_id
|
@user.password, @user.password_confirmation = params[:password], params[:password_confirmation] unless params[:password].nil? or params[:password].empty? or @user.auth_source_id
|
||||||
if @user.update_attributes(params[:user])
|
@user.attributes = params[:user]
|
||||||
|
# Was the account actived ? (do it before User#save clears the change)
|
||||||
|
was_activated = (@user.status_change == [User::STATUS_REGISTERED, User::STATUS_ACTIVE])
|
||||||
|
if @user.save
|
||||||
|
Mailer.deliver_account_activated(@user) if was_activated
|
||||||
flash[:notice] = l(:notice_successful_update)
|
flash[:notice] = l(:notice_successful_update)
|
||||||
# Give a string to redirect_to otherwise it would use status param as the response code
|
# Give a string to redirect_to otherwise it would use status param as the response code
|
||||||
redirect_to(url_for(:action => 'list', :status => params[:status], :page => params[:page]))
|
redirect_to(url_for(:action => 'list', :status => params[:status], :page => params[:page]))
|
||||||
|
|||||||
@@ -37,12 +37,6 @@ class VersionsController < ApplicationController
|
|||||||
redirect_to :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project
|
redirect_to :controller => 'projects', :action => 'settings', :tab => 'versions', :id => @project
|
||||||
end
|
end
|
||||||
|
|
||||||
def destroy_file
|
|
||||||
@version.attachments.find(params[:attachment_id]).destroy
|
|
||||||
flash[:notice] = l(:notice_successful_delete)
|
|
||||||
redirect_to :controller => 'projects', :action => 'list_files', :id => @project
|
|
||||||
end
|
|
||||||
|
|
||||||
def status_by
|
def status_by
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.html { render :action => 'show' }
|
format.html { render :action => 'show' }
|
||||||
|
|||||||
@@ -19,8 +19,9 @@ require 'diff'
|
|||||||
|
|
||||||
class WikiController < ApplicationController
|
class WikiController < ApplicationController
|
||||||
before_filter :find_wiki, :authorize
|
before_filter :find_wiki, :authorize
|
||||||
|
before_filter :find_existing_page, :only => [:rename, :protect, :history, :diff, :annotate, :add_attachment, :destroy]
|
||||||
|
|
||||||
verify :method => :post, :only => [:destroy, :destroy_attachment, :protect], :redirect_to => { :action => :index }
|
verify :method => :post, :only => [:destroy, :protect], :redirect_to => { :action => :index }
|
||||||
|
|
||||||
helper :attachments
|
helper :attachments
|
||||||
include AttachmentsHelper
|
include AttachmentsHelper
|
||||||
@@ -91,8 +92,7 @@ class WikiController < ApplicationController
|
|||||||
|
|
||||||
# rename a page
|
# rename a page
|
||||||
def rename
|
def rename
|
||||||
@page = @wiki.find_page(params[:page])
|
return render_403 unless editable?
|
||||||
return render_403 unless editable?
|
|
||||||
@page.redirect_existing_links = true
|
@page.redirect_existing_links = true
|
||||||
# used to display the *original* title if some AR validation errors occur
|
# used to display the *original* title if some AR validation errors occur
|
||||||
@original_title = @page.pretty_title
|
@original_title = @page.pretty_title
|
||||||
@@ -103,15 +103,12 @@ class WikiController < ApplicationController
|
|||||||
end
|
end
|
||||||
|
|
||||||
def protect
|
def protect
|
||||||
page = @wiki.find_page(params[:page])
|
@page.update_attribute :protected, params[:protected]
|
||||||
page.update_attribute :protected, params[:protected]
|
redirect_to :action => 'index', :id => @project, :page => @page.title
|
||||||
redirect_to :action => 'index', :id => @project, :page => page.title
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# show page history
|
# show page history
|
||||||
def history
|
def history
|
||||||
@page = @wiki.find_page(params[:page])
|
|
||||||
|
|
||||||
@version_count = @page.content.versions.count
|
@version_count = @page.content.versions.count
|
||||||
@version_pages = Paginator.new self, @version_count, per_page_option, params['p']
|
@version_pages = Paginator.new self, @version_count, per_page_option, params['p']
|
||||||
# don't load text
|
# don't load text
|
||||||
@@ -125,21 +122,19 @@ class WikiController < ApplicationController
|
|||||||
end
|
end
|
||||||
|
|
||||||
def diff
|
def diff
|
||||||
@page = @wiki.find_page(params[:page])
|
|
||||||
@diff = @page.diff(params[:version], params[:version_from])
|
@diff = @page.diff(params[:version], params[:version_from])
|
||||||
render_404 unless @diff
|
render_404 unless @diff
|
||||||
end
|
end
|
||||||
|
|
||||||
def annotate
|
def annotate
|
||||||
@page = @wiki.find_page(params[:page])
|
|
||||||
@annotate = @page.annotate(params[:version])
|
@annotate = @page.annotate(params[:version])
|
||||||
|
render_404 unless @annotate
|
||||||
end
|
end
|
||||||
|
|
||||||
# remove a wiki page and its history
|
# remove a wiki page and its history
|
||||||
def destroy
|
def destroy
|
||||||
@page = @wiki.find_page(params[:page])
|
return render_403 unless editable?
|
||||||
return render_403 unless editable?
|
@page.destroy
|
||||||
@page.destroy if @page
|
|
||||||
redirect_to :action => 'special', :id => @project, :page => 'Page_index'
|
redirect_to :action => 'special', :id => @project, :page => 'Page_index'
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -181,19 +176,11 @@ class WikiController < ApplicationController
|
|||||||
end
|
end
|
||||||
|
|
||||||
def add_attachment
|
def add_attachment
|
||||||
@page = @wiki.find_page(params[:page])
|
|
||||||
return render_403 unless editable?
|
return render_403 unless editable?
|
||||||
attach_files(@page, params[:attachments])
|
attach_files(@page, params[:attachments])
|
||||||
redirect_to :action => 'index', :page => @page.title
|
redirect_to :action => 'index', :page => @page.title
|
||||||
end
|
end
|
||||||
|
|
||||||
def destroy_attachment
|
|
||||||
@page = @wiki.find_page(params[:page])
|
|
||||||
return render_403 unless editable?
|
|
||||||
@page.attachments.find(params[:attachment_id]).destroy
|
|
||||||
redirect_to :action => 'index', :page => @page.title
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def find_wiki
|
def find_wiki
|
||||||
@@ -204,6 +191,12 @@ private
|
|||||||
render_404
|
render_404
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Finds the requested page and returns a 404 error if it doesn't exist
|
||||||
|
def find_existing_page
|
||||||
|
@page = @wiki.find_page(params[:page])
|
||||||
|
render_404 if @page.nil?
|
||||||
|
end
|
||||||
|
|
||||||
# Returns true if the current user is allowed to edit the page, otherwise false
|
# Returns true if the current user is allowed to edit the page, otherwise false
|
||||||
def editable?(page = @page)
|
def editable?(page = @page)
|
||||||
page.editable_by?(User.current)
|
page.editable_by?(User.current)
|
||||||
|
|||||||
@@ -18,6 +18,7 @@
|
|||||||
require 'coderay'
|
require 'coderay'
|
||||||
require 'coderay/helpers/file_type'
|
require 'coderay/helpers/file_type'
|
||||||
require 'forwardable'
|
require 'forwardable'
|
||||||
|
require 'cgi'
|
||||||
|
|
||||||
module ApplicationHelper
|
module ApplicationHelper
|
||||||
include Redmine::WikiFormatting::Macros::Definitions
|
include Redmine::WikiFormatting::Macros::Definitions
|
||||||
@@ -47,8 +48,8 @@ module ApplicationHelper
|
|||||||
end
|
end
|
||||||
|
|
||||||
# Display a link to user's account page
|
# Display a link to user's account page
|
||||||
def link_to_user(user)
|
def link_to_user(user, options={})
|
||||||
(user && !user.anonymous?) ? link_to(user, :controller => 'account', :action => 'show', :id => user) : 'Anonymous'
|
(user && !user.anonymous?) ? link_to(user.name(options[:format]), :controller => 'account', :action => 'show', :id => user) : 'Anonymous'
|
||||||
end
|
end
|
||||||
|
|
||||||
def link_to_issue(issue, options={})
|
def link_to_issue(issue, options={})
|
||||||
@@ -146,6 +147,15 @@ module ApplicationHelper
|
|||||||
end
|
end
|
||||||
content
|
content
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Renders flash messages
|
||||||
|
def render_flash_messages
|
||||||
|
s = ''
|
||||||
|
flash.each do |k,v|
|
||||||
|
s << content_tag('div', v, :class => "flash #{k}")
|
||||||
|
end
|
||||||
|
s
|
||||||
|
end
|
||||||
|
|
||||||
# Truncates and returns the string as a single line
|
# Truncates and returns the string as a single line
|
||||||
def truncate_single_line(string, *args)
|
def truncate_single_line(string, *args)
|
||||||
@@ -281,16 +291,15 @@ module ApplicationHelper
|
|||||||
attachments = attachments.sort_by(&:created_on).reverse
|
attachments = attachments.sort_by(&:created_on).reverse
|
||||||
text = text.gsub(/!((\<|\=|\>)?(\([^\)]+\))?(\[[^\]]+\])?(\{[^\}]+\})?)(\S+\.(bmp|gif|jpg|jpeg|png))!/i) do |m|
|
text = text.gsub(/!((\<|\=|\>)?(\([^\)]+\))?(\[[^\]]+\])?(\{[^\}]+\})?)(\S+\.(bmp|gif|jpg|jpeg|png))!/i) do |m|
|
||||||
style = $1
|
style = $1
|
||||||
filename = $6
|
filename = $6.downcase
|
||||||
rf = Regexp.new(Regexp.escape(filename), Regexp::IGNORECASE)
|
|
||||||
# search for the picture in attachments
|
# search for the picture in attachments
|
||||||
if found = attachments.detect { |att| att.filename =~ rf }
|
if found = attachments.detect { |att| att.filename.downcase == filename }
|
||||||
image_url = url_for :only_path => only_path, :controller => 'attachments', :action => 'download', :id => found
|
image_url = url_for :only_path => only_path, :controller => 'attachments', :action => 'download', :id => found
|
||||||
desc = found.description.to_s.gsub(/^([^\(\)]*).*$/, "\\1")
|
desc = found.description.to_s.gsub(/^([^\(\)]*).*$/, "\\1")
|
||||||
alt = desc.blank? ? nil : "(#{desc})"
|
alt = desc.blank? ? nil : "(#{desc})"
|
||||||
"!#{style}#{image_url}#{alt}!"
|
"!#{style}#{image_url}#{alt}!"
|
||||||
else
|
else
|
||||||
"!#{style}#{filename}!"
|
m
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -478,11 +487,11 @@ module ApplicationHelper
|
|||||||
full_messages = []
|
full_messages = []
|
||||||
object.errors.each do |attr, msg|
|
object.errors.each do |attr, msg|
|
||||||
next if msg.nil?
|
next if msg.nil?
|
||||||
msg = msg.first if msg.is_a? Array
|
msg = [msg] unless msg.is_a?(Array)
|
||||||
if attr == "base"
|
if attr == "base"
|
||||||
full_messages << l(msg)
|
full_messages << l(*msg)
|
||||||
else
|
else
|
||||||
full_messages << "« " + (l_has_string?("field_" + attr) ? l("field_" + attr) : object.class.human_attribute_name(attr)) + " » " + l(msg) unless attr == "custom_values"
|
full_messages << "« " + (l_has_string?("field_" + attr) ? l("field_" + attr) : object.class.human_attribute_name(attr)) + " » " + l(*msg) unless attr == "custom_values"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
# retrieve custom values error messages
|
# retrieve custom values error messages
|
||||||
@@ -490,8 +499,8 @@ module ApplicationHelper
|
|||||||
object.custom_values.each do |v|
|
object.custom_values.each do |v|
|
||||||
v.errors.each do |attr, msg|
|
v.errors.each do |attr, msg|
|
||||||
next if msg.nil?
|
next if msg.nil?
|
||||||
msg = msg.first if msg.is_a? Array
|
msg = [msg] unless msg.is_a?(Array)
|
||||||
full_messages << "« " + v.custom_field.name + " » " + l(msg)
|
full_messages << "« " + v.custom_field.name + " » " + l(*msg)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -525,7 +534,8 @@ module ApplicationHelper
|
|||||||
|
|
||||||
def back_url_hidden_field_tag
|
def back_url_hidden_field_tag
|
||||||
back_url = params[:back_url] || request.env['HTTP_REFERER']
|
back_url = params[:back_url] || request.env['HTTP_REFERER']
|
||||||
hidden_field_tag('back_url', back_url) unless back_url.blank?
|
back_url = CGI.unescape(back_url.to_s)
|
||||||
|
hidden_field_tag('back_url', CGI.escape(back_url)) unless back_url.blank?
|
||||||
end
|
end
|
||||||
|
|
||||||
def check_all_links(form_name)
|
def check_all_links(form_name)
|
||||||
|
|||||||
@@ -16,10 +16,15 @@
|
|||||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
|
||||||
module AttachmentsHelper
|
module AttachmentsHelper
|
||||||
# displays the links to a collection of attachments
|
# Displays view/delete links to the attachments of the given object
|
||||||
def link_to_attachments(attachments, options = {})
|
# Options:
|
||||||
if attachments.any?
|
# :author -- author names are not displayed if set to false
|
||||||
render :partial => 'attachments/links', :locals => {:attachments => attachments, :options => options}
|
def link_to_attachments(container, options = {})
|
||||||
|
options.assert_valid_keys(:author)
|
||||||
|
|
||||||
|
if container.attachments.any?
|
||||||
|
options = {:deletable => container.attachments_deletable?, :author => true}.merge(options)
|
||||||
|
render :partial => 'attachments/links', :locals => {:attachments => container.attachments, :options => options}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -1,85 +0,0 @@
|
|||||||
# redMine - project management software
|
|
||||||
# Copyright (C) 2006 Jean-Philippe Lang
|
|
||||||
#
|
|
||||||
# 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.
|
|
||||||
#
|
|
||||||
# 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.
|
|
||||||
#
|
|
||||||
# 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.
|
|
||||||
|
|
||||||
require 'iconv'
|
|
||||||
require 'rfpdf/chinese'
|
|
||||||
|
|
||||||
module IfpdfHelper
|
|
||||||
|
|
||||||
class IFPDF < FPDF
|
|
||||||
include GLoc
|
|
||||||
attr_accessor :footer_date
|
|
||||||
|
|
||||||
def initialize(lang)
|
|
||||||
super()
|
|
||||||
set_language_if_valid lang
|
|
||||||
case current_language.to_s
|
|
||||||
when 'ja'
|
|
||||||
extend(PDF_Japanese)
|
|
||||||
AddSJISFont()
|
|
||||||
@font_for_content = 'SJIS'
|
|
||||||
@font_for_footer = 'SJIS'
|
|
||||||
when 'zh'
|
|
||||||
extend(PDF_Chinese)
|
|
||||||
AddGBFont()
|
|
||||||
@font_for_content = 'GB'
|
|
||||||
@font_for_footer = 'GB'
|
|
||||||
when 'zh-tw'
|
|
||||||
extend(PDF_Chinese)
|
|
||||||
AddBig5Font()
|
|
||||||
@font_for_content = 'Big5'
|
|
||||||
@font_for_footer = 'Big5'
|
|
||||||
else
|
|
||||||
@font_for_content = 'Arial'
|
|
||||||
@font_for_footer = 'Helvetica'
|
|
||||||
end
|
|
||||||
SetCreator(Redmine::Info.app_name)
|
|
||||||
SetFont(@font_for_content)
|
|
||||||
end
|
|
||||||
|
|
||||||
def SetFontStyle(style, size)
|
|
||||||
SetFont(@font_for_content, style, size)
|
|
||||||
end
|
|
||||||
|
|
||||||
def Cell(w,h=0,txt='',border=0,ln=0,align='',fill=0,link='')
|
|
||||||
@ic ||= Iconv.new(l(:general_pdf_encoding), 'UTF-8')
|
|
||||||
# these quotation marks are not correctly rendered in the pdf
|
|
||||||
txt = txt.gsub(/[“”]/, '"') if txt
|
|
||||||
txt = begin
|
|
||||||
# 0x5c char handling
|
|
||||||
txtar = txt.split('\\')
|
|
||||||
txtar << '' if txt[-1] == ?\\
|
|
||||||
txtar.collect {|x| @ic.iconv(x)}.join('\\').gsub(/\\/, "\\\\\\\\")
|
|
||||||
rescue
|
|
||||||
txt
|
|
||||||
end || ''
|
|
||||||
super w,h,txt,border,ln,align,fill,link
|
|
||||||
end
|
|
||||||
|
|
||||||
def Footer
|
|
||||||
SetFont(@font_for_footer, 'I', 8)
|
|
||||||
SetY(-15)
|
|
||||||
SetX(15)
|
|
||||||
Cell(0, 5, @footer_date, 0, 0, 'L')
|
|
||||||
SetY(-15)
|
|
||||||
SetX(-30)
|
|
||||||
Cell(0, 5, PageNo().to_s + '/{nb}', 0, 0, 'C')
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
@@ -33,6 +33,14 @@ module IssuesHelper
|
|||||||
"<strong>#{@cached_label_priority}</strong>: #{issue.priority.name}"
|
"<strong>#{@cached_label_priority}</strong>: #{issue.priority.name}"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Returns a string of css classes that apply to the given issue
|
||||||
|
def css_issue_classes(issue)
|
||||||
|
s = "issue status-#{issue.status.position} priority-#{issue.priority.position}"
|
||||||
|
s << ' closed' if issue.closed?
|
||||||
|
s << ' overdue' if issue.overdue?
|
||||||
|
s
|
||||||
|
end
|
||||||
|
|
||||||
def sidebar_queries
|
def sidebar_queries
|
||||||
unless @sidebar_queries
|
unless @sidebar_queries
|
||||||
# User can see public queries and his own queries
|
# User can see public queries and his own queries
|
||||||
|
|||||||
@@ -22,8 +22,8 @@ module QueriesHelper
|
|||||||
end
|
end
|
||||||
|
|
||||||
def column_header(column)
|
def column_header(column)
|
||||||
column.sortable ? sort_header_tag(column.sortable, :caption => column.caption,
|
column.sortable ? sort_header_tag(column.name.to_s, :caption => column.caption,
|
||||||
:default_order => column.default_order) :
|
:default_order => column.default_order) :
|
||||||
content_tag('th', column.caption)
|
content_tag('th', column.caption)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -67,23 +67,31 @@ module SortHelper
|
|||||||
|
|
||||||
# Updates the sort state. Call this in the controller prior to calling
|
# Updates the sort state. Call this in the controller prior to calling
|
||||||
# sort_clause.
|
# sort_clause.
|
||||||
#
|
# sort_keys can be either an array or a hash of allowed keys
|
||||||
def sort_update()
|
def sort_update(sort_keys)
|
||||||
if params[:sort_key]
|
sort_key = params[:sort_key]
|
||||||
sort = {:key => params[:sort_key], :order => params[:sort_order]}
|
sort_key = nil unless (sort_keys.is_a?(Array) ? sort_keys.include?(sort_key) : sort_keys[sort_key])
|
||||||
|
|
||||||
|
sort_order = (params[:sort_order] == 'desc' ? 'DESC' : 'ASC')
|
||||||
|
|
||||||
|
if sort_key
|
||||||
|
sort = {:key => sort_key, :order => sort_order}
|
||||||
elsif session[@sort_name]
|
elsif session[@sort_name]
|
||||||
sort = session[@sort_name] # Previous sort.
|
sort = session[@sort_name] # Previous sort.
|
||||||
else
|
else
|
||||||
sort = @sort_default
|
sort = @sort_default
|
||||||
end
|
end
|
||||||
session[@sort_name] = sort
|
session[@sort_name] = sort
|
||||||
|
|
||||||
|
sort_column = (sort_keys.is_a?(Hash) ? sort_keys[sort[:key]] : sort[:key])
|
||||||
|
@sort_clause = (sort_column.blank? ? nil : "#{sort_column} #{sort[:order]}")
|
||||||
end
|
end
|
||||||
|
|
||||||
# Returns an SQL sort clause corresponding to the current sort state.
|
# Returns an SQL sort clause corresponding to the current sort state.
|
||||||
# Use this to sort the controller's table items collection.
|
# Use this to sort the controller's table items collection.
|
||||||
#
|
#
|
||||||
def sort_clause()
|
def sort_clause()
|
||||||
session[@sort_name][:key] + ' ' + (session[@sort_name][:order] || 'ASC')
|
@sort_clause
|
||||||
end
|
end
|
||||||
|
|
||||||
# Returns a link which sorts by the named column.
|
# Returns a link which sorts by the named column.
|
||||||
|
|||||||
@@ -16,6 +16,8 @@
|
|||||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
|
||||||
module TimelogHelper
|
module TimelogHelper
|
||||||
|
include ApplicationHelper
|
||||||
|
|
||||||
def render_timelog_breadcrumb
|
def render_timelog_breadcrumb
|
||||||
links = []
|
links = []
|
||||||
links << link_to(l(:label_project_all), {:project_id => nil, :issue_id => nil})
|
links << link_to(l(:label_project_all), {:project_id => nil, :issue_id => nil})
|
||||||
@@ -81,7 +83,7 @@ module TimelogHelper
|
|||||||
csv << headers.collect {|c| begin; ic.iconv(c.to_s); rescue; c.to_s; end }
|
csv << headers.collect {|c| begin; ic.iconv(c.to_s); rescue; c.to_s; end }
|
||||||
# csv lines
|
# csv lines
|
||||||
entries.each do |entry|
|
entries.each do |entry|
|
||||||
fields = [l_date(entry.spent_on),
|
fields = [format_date(entry.spent_on),
|
||||||
entry.user,
|
entry.user,
|
||||||
entry.activity,
|
entry.activity,
|
||||||
entry.project,
|
entry.project,
|
||||||
|
|||||||
@@ -98,6 +98,14 @@ class Attachment < ActiveRecord::Base
|
|||||||
container.project
|
container.project
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def visible?(user=User.current)
|
||||||
|
container.attachments_visible?(user)
|
||||||
|
end
|
||||||
|
|
||||||
|
def deletable?(user=User.current)
|
||||||
|
container.attachments_deletable?(user)
|
||||||
|
end
|
||||||
|
|
||||||
def image?
|
def image?
|
||||||
self.filename =~ /\.(jpe?g|gif|png)$/i
|
self.filename =~ /\.(jpe?g|gif|png)$/i
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
class Document < ActiveRecord::Base
|
class Document < ActiveRecord::Base
|
||||||
belongs_to :project
|
belongs_to :project
|
||||||
belongs_to :category, :class_name => "Enumeration", :foreign_key => "category_id"
|
belongs_to :category, :class_name => "Enumeration", :foreign_key => "category_id"
|
||||||
has_many :attachments, :as => :container, :dependent => :destroy
|
acts_as_attachable :delete_permission => :manage_documents
|
||||||
|
|
||||||
acts_as_searchable :columns => ['title', "#{table_name}.description"], :include => :project
|
acts_as_searchable :columns => ['title', "#{table_name}.description"], :include => :project
|
||||||
acts_as_event :title => Proc.new {|o| "#{l(:label_document)}: #{o.title}"},
|
acts_as_event :title => Proc.new {|o| "#{l(:label_document)}: #{o.title}"},
|
||||||
@@ -28,4 +28,10 @@ class Document < ActiveRecord::Base
|
|||||||
|
|
||||||
validates_presence_of :project, :title, :category
|
validates_presence_of :project, :title, :category
|
||||||
validates_length_of :title, :maximum => 60
|
validates_length_of :title, :maximum => 60
|
||||||
|
|
||||||
|
def after_initialize
|
||||||
|
if new_record?
|
||||||
|
self.category ||= Enumeration.default('DCAT')
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -44,7 +44,9 @@ class Enumeration < ActiveRecord::Base
|
|||||||
end
|
end
|
||||||
|
|
||||||
def before_save
|
def before_save
|
||||||
Enumeration.update_all("is_default = #{connection.quoted_false}", {:opt => opt}) if is_default?
|
if is_default? && is_default_changed?
|
||||||
|
Enumeration.update_all("is_default = #{connection.quoted_false}", {:opt => opt})
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def objects_count
|
def objects_count
|
||||||
|
|||||||
+18
-2
@@ -26,13 +26,13 @@ class Issue < ActiveRecord::Base
|
|||||||
belongs_to :category, :class_name => 'IssueCategory', :foreign_key => 'category_id'
|
belongs_to :category, :class_name => 'IssueCategory', :foreign_key => 'category_id'
|
||||||
|
|
||||||
has_many :journals, :as => :journalized, :dependent => :destroy
|
has_many :journals, :as => :journalized, :dependent => :destroy
|
||||||
has_many :attachments, :as => :container, :dependent => :destroy
|
|
||||||
has_many :time_entries, :dependent => :delete_all
|
has_many :time_entries, :dependent => :delete_all
|
||||||
has_and_belongs_to_many :changesets, :order => "#{Changeset.table_name}.committed_on ASC, #{Changeset.table_name}.id ASC"
|
has_and_belongs_to_many :changesets, :order => "#{Changeset.table_name}.committed_on ASC, #{Changeset.table_name}.id ASC"
|
||||||
|
|
||||||
has_many :relations_from, :class_name => 'IssueRelation', :foreign_key => 'issue_from_id', :dependent => :delete_all
|
has_many :relations_from, :class_name => 'IssueRelation', :foreign_key => 'issue_from_id', :dependent => :delete_all
|
||||||
has_many :relations_to, :class_name => 'IssueRelation', :foreign_key => 'issue_to_id', :dependent => :delete_all
|
has_many :relations_to, :class_name => 'IssueRelation', :foreign_key => 'issue_to_id', :dependent => :delete_all
|
||||||
|
|
||||||
|
acts_as_attachable :after_remove => :attachment_removed
|
||||||
acts_as_customizable
|
acts_as_customizable
|
||||||
acts_as_watchable
|
acts_as_watchable
|
||||||
acts_as_searchable :columns => ['subject', "#{table_name}.description", "#{Journal.table_name}.notes"],
|
acts_as_searchable :columns => ['subject', "#{table_name}.description", "#{Journal.table_name}.notes"],
|
||||||
@@ -45,7 +45,7 @@ class Issue < ActiveRecord::Base
|
|||||||
acts_as_activity_provider :find_options => {:include => [:project, :author, :tracker]},
|
acts_as_activity_provider :find_options => {:include => [:project, :author, :tracker]},
|
||||||
:author_key => :author_id
|
:author_key => :author_id
|
||||||
|
|
||||||
validates_presence_of :subject, :description, :priority, :project, :tracker, :author, :status
|
validates_presence_of :subject, :priority, :project, :tracker, :author, :status
|
||||||
validates_length_of :subject, :maximum => 255
|
validates_length_of :subject, :maximum => 255
|
||||||
validates_inclusion_of :done_ratio, :in => 0..100
|
validates_inclusion_of :done_ratio, :in => 0..100
|
||||||
validates_numericality_of :estimated_hours, :allow_nil => true
|
validates_numericality_of :estimated_hours, :allow_nil => true
|
||||||
@@ -195,6 +195,11 @@ class Issue < ActiveRecord::Base
|
|||||||
self.status.is_closed?
|
self.status.is_closed?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Returns true if the issue is overdue
|
||||||
|
def overdue?
|
||||||
|
!due_date.nil? && (due_date < Date.today)
|
||||||
|
end
|
||||||
|
|
||||||
# Users the issue can be assigned to
|
# Users the issue can be assigned to
|
||||||
def assignable_users
|
def assignable_users
|
||||||
project.assignable_users
|
project.assignable_users
|
||||||
@@ -261,4 +266,15 @@ class Issue < ActiveRecord::Base
|
|||||||
def to_s
|
def to_s
|
||||||
"#{tracker} ##{id}: #{subject}"
|
"#{tracker} ##{id}: #{subject}"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
# Callback on attachment deletion
|
||||||
|
def attachment_removed(obj)
|
||||||
|
journal = init_journal(User.current)
|
||||||
|
journal.details << JournalDetail.new(:property => 'attachment',
|
||||||
|
:prop_key => obj.id,
|
||||||
|
:old_value => obj.filename)
|
||||||
|
journal.save
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
+43
-19
@@ -16,6 +16,7 @@
|
|||||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
|
||||||
class MailHandler < ActionMailer::Base
|
class MailHandler < ActionMailer::Base
|
||||||
|
include ActionView::Helpers::SanitizeHelper
|
||||||
|
|
||||||
class UnauthorizedAction < StandardError; end
|
class UnauthorizedAction < StandardError; end
|
||||||
class MissingInformation < StandardError; end
|
class MissingInformation < StandardError; end
|
||||||
@@ -39,7 +40,7 @@ class MailHandler < ActionMailer::Base
|
|||||||
# Processes incoming emails
|
# Processes incoming emails
|
||||||
def receive(email)
|
def receive(email)
|
||||||
@email = email
|
@email = email
|
||||||
@user = User.active.find(:first, :conditions => ["LOWER(mail) = ?", email.from.first.to_s.strip.downcase])
|
@user = User.active.find(:first, :conditions => ["LOWER(mail) = ?", email.from.to_a.first.to_s.strip.downcase])
|
||||||
unless @user
|
unless @user
|
||||||
# Unknown user => the email is ignored
|
# Unknown user => the email is ignored
|
||||||
# TODO: ability to create the user's account
|
# TODO: ability to create the user's account
|
||||||
@@ -88,15 +89,21 @@ class MailHandler < ActionMailer::Base
|
|||||||
issue.status = status
|
issue.status = status
|
||||||
end
|
end
|
||||||
issue.subject = email.subject.chomp.toutf8
|
issue.subject = email.subject.chomp.toutf8
|
||||||
issue.description = email.plain_text_body.chomp
|
issue.description = plain_text_body
|
||||||
|
# custom fields
|
||||||
|
issue.custom_field_values = issue.available_custom_fields.inject({}) do |h, c|
|
||||||
|
if value = get_keyword(c.name, :override => true)
|
||||||
|
h[c.id] = value
|
||||||
|
end
|
||||||
|
h
|
||||||
|
end
|
||||||
issue.save!
|
issue.save!
|
||||||
add_attachments(issue)
|
add_attachments(issue)
|
||||||
logger.info "MailHandler: issue ##{issue.id} created by #{user}" if logger && logger.info
|
logger.info "MailHandler: issue ##{issue.id} created by #{user}" if logger && logger.info
|
||||||
# send notification before adding watchers since they were cc'ed
|
|
||||||
Mailer.deliver_issue_add(issue) if Setting.notified_events.include?('issue_added')
|
|
||||||
# add To and Cc as watchers
|
# add To and Cc as watchers
|
||||||
add_watchers(issue)
|
add_watchers(issue)
|
||||||
|
# send notification after adding watchers so that they can reply to Redmine
|
||||||
|
Mailer.deliver_issue_add(issue) if Setting.notified_events.include?('issue_added')
|
||||||
issue
|
issue
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -120,7 +127,7 @@ class MailHandler < ActionMailer::Base
|
|||||||
raise UnauthorizedAction unless status.nil? || user.allowed_to?(:edit_issues, issue.project)
|
raise UnauthorizedAction unless status.nil? || user.allowed_to?(:edit_issues, issue.project)
|
||||||
|
|
||||||
# add the note
|
# add the note
|
||||||
journal = issue.init_journal(user, email.plain_text_body.chomp)
|
journal = issue.init_journal(user, plain_text_body)
|
||||||
add_attachments(issue)
|
add_attachments(issue)
|
||||||
# check workflow
|
# check workflow
|
||||||
if status && issue.new_statuses_allowed_to(user).include?(status)
|
if status && issue.new_statuses_allowed_to(user).include?(status)
|
||||||
@@ -155,22 +162,39 @@ class MailHandler < ActionMailer::Base
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def get_keyword(attr)
|
def get_keyword(attr, options={})
|
||||||
if @@handler_options[:allow_override].include?(attr.to_s) && email.plain_text_body =~ /^#{attr}:[ \t]*(.+)$/i
|
@keywords ||= {}
|
||||||
$1.strip
|
if @keywords.has_key?(attr)
|
||||||
elsif !@@handler_options[:issue][attr].blank?
|
@keywords[attr]
|
||||||
@@handler_options[:issue][attr]
|
else
|
||||||
|
@keywords[attr] = begin
|
||||||
|
if (options[:override] || @@handler_options[:allow_override].include?(attr.to_s)) && plain_text_body.gsub!(/^#{attr}:[ \t]*(.+)\s*$/i, '')
|
||||||
|
$1.strip
|
||||||
|
elsif !@@handler_options[:issue][attr].blank?
|
||||||
|
@@handler_options[:issue][attr]
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
# Returns the text/plain part of the email
|
||||||
class TMail::Mail
|
# If not found (eg. HTML-only email), returns the body with tags removed
|
||||||
# Returns body of the first plain text part found if any
|
|
||||||
def plain_text_body
|
def plain_text_body
|
||||||
return @plain_text_body unless @plain_text_body.nil?
|
return @plain_text_body unless @plain_text_body.nil?
|
||||||
p = self.parts.collect {|c| (c.respond_to?(:parts) && !c.parts.empty?) ? c.parts : c}.flatten
|
parts = @email.parts.collect {|c| (c.respond_to?(:parts) && !c.parts.empty?) ? c.parts : c}.flatten
|
||||||
plain = p.detect {|c| c.content_type == 'text/plain'}
|
if parts.empty?
|
||||||
@plain_text_body = plain.nil? ? self.body : plain.body
|
parts << @email
|
||||||
|
end
|
||||||
|
plain_text_part = parts.detect {|p| p.content_type == 'text/plain'}
|
||||||
|
if plain_text_part.nil?
|
||||||
|
# no text/plain part found, assuming html-only email
|
||||||
|
# strip html tags and remove doctype directive
|
||||||
|
@plain_text_body = strip_tags(@email.body.to_s)
|
||||||
|
@plain_text_body.gsub! %r{^<!DOCTYPE .*$}, ''
|
||||||
|
else
|
||||||
|
@plain_text_body = plain_text_part.body.to_s
|
||||||
|
end
|
||||||
|
@plain_text_body.strip!
|
||||||
|
@plain_text_body
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
+25
-10
@@ -22,12 +22,19 @@ class Mailer < ActionMailer::Base
|
|||||||
|
|
||||||
include ActionController::UrlWriter
|
include ActionController::UrlWriter
|
||||||
|
|
||||||
|
def self.default_url_options
|
||||||
|
h = Setting.host_name
|
||||||
|
h = h.to_s.gsub(%r{\/.*$}, '') unless Redmine::Utils.relative_url_root.blank?
|
||||||
|
{ :host => h, :protocol => Setting.protocol }
|
||||||
|
end
|
||||||
|
|
||||||
def issue_add(issue)
|
def issue_add(issue)
|
||||||
redmine_headers 'Project' => issue.project.identifier,
|
redmine_headers 'Project' => issue.project.identifier,
|
||||||
'Issue-Id' => issue.id,
|
'Issue-Id' => issue.id,
|
||||||
'Issue-Author' => issue.author.login
|
'Issue-Author' => issue.author.login
|
||||||
redmine_headers 'Issue-Assignee' => issue.assigned_to.login if issue.assigned_to
|
redmine_headers 'Issue-Assignee' => issue.assigned_to.login if issue.assigned_to
|
||||||
recipients issue.recipients
|
recipients issue.recipients
|
||||||
|
cc(issue.watcher_recipients - @recipients)
|
||||||
subject "[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}] (#{issue.status.name}) #{issue.subject}"
|
subject "[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}] (#{issue.status.name}) #{issue.subject}"
|
||||||
body :issue => issue,
|
body :issue => issue,
|
||||||
:issue_url => url_for(:controller => 'issues', :action => 'show', :id => issue)
|
:issue_url => url_for(:controller => 'issues', :action => 'show', :id => issue)
|
||||||
@@ -39,6 +46,7 @@ class Mailer < ActionMailer::Base
|
|||||||
'Issue-Id' => issue.id,
|
'Issue-Id' => issue.id,
|
||||||
'Issue-Author' => issue.author.login
|
'Issue-Author' => issue.author.login
|
||||||
redmine_headers 'Issue-Assignee' => issue.assigned_to.login if issue.assigned_to
|
redmine_headers 'Issue-Assignee' => issue.assigned_to.login if issue.assigned_to
|
||||||
|
@author = journal.user
|
||||||
recipients issue.recipients
|
recipients issue.recipients
|
||||||
# Watchers in cc
|
# Watchers in cc
|
||||||
cc(issue.watcher_recipients - @recipients)
|
cc(issue.watcher_recipients - @recipients)
|
||||||
@@ -57,7 +65,7 @@ class Mailer < ActionMailer::Base
|
|||||||
subject l(:mail_subject_reminder, issues.size)
|
subject l(:mail_subject_reminder, issues.size)
|
||||||
body :issues => issues,
|
body :issues => issues,
|
||||||
:days => days,
|
:days => days,
|
||||||
:issues_url => url_for(:controller => 'issues', :action => 'index', :set_filter => 1, :assigned_to_id => user.id, :sort_key => 'issues.due_date', :sort_order => 'asc')
|
:issues_url => url_for(:controller => 'issues', :action => 'index', :set_filter => 1, :assigned_to_id => user.id, :sort_key => 'due_date', :sort_order => 'asc')
|
||||||
end
|
end
|
||||||
|
|
||||||
def document_added(document)
|
def document_added(document)
|
||||||
@@ -73,6 +81,9 @@ class Mailer < ActionMailer::Base
|
|||||||
added_to = ''
|
added_to = ''
|
||||||
added_to_url = ''
|
added_to_url = ''
|
||||||
case container.class.name
|
case container.class.name
|
||||||
|
when 'Project'
|
||||||
|
added_to_url = url_for(:controller => 'projects', :action => 'list_files', :id => container)
|
||||||
|
added_to = "#{l(:label_project)}: #{container}"
|
||||||
when 'Version'
|
when 'Version'
|
||||||
added_to_url = url_for(:controller => 'projects', :action => 'list_files', :id => container.project_id)
|
added_to_url = url_for(:controller => 'projects', :action => 'list_files', :id => container.project_id)
|
||||||
added_to = "#{l(:label_version)}: #{container.name}"
|
added_to = "#{l(:label_version)}: #{container.name}"
|
||||||
@@ -122,6 +133,15 @@ class Mailer < ActionMailer::Base
|
|||||||
:url => url_for(:controller => 'users', :action => 'index', :status => User::STATUS_REGISTERED, :sort_key => 'created_on', :sort_order => 'desc')
|
:url => url_for(:controller => 'users', :action => 'index', :status => User::STATUS_REGISTERED, :sort_key => 'created_on', :sort_order => 'desc')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# A registered user's account was activated by an administrator
|
||||||
|
def account_activated(user)
|
||||||
|
set_language_if_valid user.language
|
||||||
|
recipients user.mail
|
||||||
|
subject l(:mail_subject_register, Setting.app_title)
|
||||||
|
body :user => user,
|
||||||
|
:login_url => url_for(:controller => 'account', :action => 'login')
|
||||||
|
end
|
||||||
|
|
||||||
def lost_password(token)
|
def lost_password(token)
|
||||||
set_language_if_valid(token.user.language)
|
set_language_if_valid(token.user.language)
|
||||||
recipients token.user.mail
|
recipients token.user.mail
|
||||||
@@ -184,12 +204,6 @@ class Mailer < ActionMailer::Base
|
|||||||
set_language_if_valid Setting.default_language
|
set_language_if_valid Setting.default_language
|
||||||
from Setting.mail_from
|
from Setting.mail_from
|
||||||
|
|
||||||
# URL options
|
|
||||||
h = Setting.host_name
|
|
||||||
h = h.to_s.gsub(%r{\/.*$}, '') unless ActionController::AbstractRequest.relative_url_root.blank?
|
|
||||||
default_url_options[:host] = h
|
|
||||||
default_url_options[:protocol] = Setting.protocol
|
|
||||||
|
|
||||||
# Common headers
|
# Common headers
|
||||||
headers 'X-Mailer' => 'Redmine',
|
headers 'X-Mailer' => 'Redmine',
|
||||||
'X-Redmine-Host' => Setting.host_name,
|
'X-Redmine-Host' => Setting.host_name,
|
||||||
@@ -205,9 +219,10 @@ class Mailer < ActionMailer::Base
|
|||||||
def create_mail
|
def create_mail
|
||||||
# Removes the current user from the recipients and cc
|
# Removes the current user from the recipients and cc
|
||||||
# if he doesn't want to receive notifications about what he does
|
# if he doesn't want to receive notifications about what he does
|
||||||
if User.current.pref[:no_self_notified]
|
@author ||= User.current
|
||||||
recipients.delete(User.current.mail) if recipients
|
if @author.pref[:no_self_notified]
|
||||||
cc.delete(User.current.mail) if cc
|
recipients.delete(@author.mail) if recipients
|
||||||
|
cc.delete(@author.mail) if cc
|
||||||
end
|
end
|
||||||
# Blind carbon copy recipients
|
# Blind carbon copy recipients
|
||||||
if Setting.bcc_recipients?
|
if Setting.bcc_recipients?
|
||||||
|
|||||||
@@ -19,11 +19,11 @@ class Message < ActiveRecord::Base
|
|||||||
belongs_to :board
|
belongs_to :board
|
||||||
belongs_to :author, :class_name => 'User', :foreign_key => 'author_id'
|
belongs_to :author, :class_name => 'User', :foreign_key => 'author_id'
|
||||||
acts_as_tree :counter_cache => :replies_count, :order => "#{Message.table_name}.created_on ASC"
|
acts_as_tree :counter_cache => :replies_count, :order => "#{Message.table_name}.created_on ASC"
|
||||||
has_many :attachments, :as => :container, :dependent => :destroy
|
acts_as_attachable
|
||||||
belongs_to :last_reply, :class_name => 'Message', :foreign_key => 'last_reply_id'
|
belongs_to :last_reply, :class_name => 'Message', :foreign_key => 'last_reply_id'
|
||||||
|
|
||||||
acts_as_searchable :columns => ['subject', 'content'],
|
acts_as_searchable :columns => ['subject', 'content'],
|
||||||
:include => {:board, :project},
|
:include => {:board => :project},
|
||||||
:project_key => 'project_id',
|
:project_key => 'project_id',
|
||||||
:date_column => "#{table_name}.created_on"
|
:date_column => "#{table_name}.created_on"
|
||||||
acts_as_event :title => Proc.new {|o| "#{o.board.name}: #{o.subject}"},
|
acts_as_event :title => Proc.new {|o| "#{o.board.name}: #{o.subject}"},
|
||||||
|
|||||||
@@ -44,6 +44,8 @@ class Project < ActiveRecord::Base
|
|||||||
:association_foreign_key => 'custom_field_id'
|
:association_foreign_key => 'custom_field_id'
|
||||||
|
|
||||||
acts_as_tree :order => "name", :counter_cache => true
|
acts_as_tree :order => "name", :counter_cache => true
|
||||||
|
acts_as_attachable :view_permission => :view_files,
|
||||||
|
:delete_permission => :manage_files
|
||||||
|
|
||||||
acts_as_customizable
|
acts_as_customizable
|
||||||
acts_as_searchable :columns => ['name', 'description'], :project_key => 'id', :permission => nil
|
acts_as_searchable :columns => ['name', 'description'], :project_key => 'id', :permission => nil
|
||||||
@@ -58,7 +60,7 @@ class Project < ActiveRecord::Base
|
|||||||
validates_associated :repository, :wiki
|
validates_associated :repository, :wiki
|
||||||
validates_length_of :name, :maximum => 30
|
validates_length_of :name, :maximum => 30
|
||||||
validates_length_of :homepage, :maximum => 255
|
validates_length_of :homepage, :maximum => 255
|
||||||
validates_length_of :identifier, :in => 3..20
|
validates_length_of :identifier, :in => 2..20
|
||||||
validates_format_of :identifier, :with => /^[a-z0-9\-]*$/
|
validates_format_of :identifier, :with => /^[a-z0-9\-]*$/
|
||||||
|
|
||||||
before_destroy :delete_all_members
|
before_destroy :delete_all_members
|
||||||
|
|||||||
+2
-2
@@ -31,9 +31,9 @@ class Role < ActiveRecord::Base
|
|||||||
raise "Can not copy workflow from a #{role.class}" unless role.is_a?(Role)
|
raise "Can not copy workflow from a #{role.class}" unless role.is_a?(Role)
|
||||||
raise "Can not copy workflow from/to an unsaved role" if proxy_owner.new_record? || role.new_record?
|
raise "Can not copy workflow from/to an unsaved role" if proxy_owner.new_record? || role.new_record?
|
||||||
clear
|
clear
|
||||||
connection.insert "INSERT INTO workflows (tracker_id, old_status_id, new_status_id, role_id)" +
|
connection.insert "INSERT INTO #{Workflow.table_name} (tracker_id, old_status_id, new_status_id, role_id)" +
|
||||||
" SELECT tracker_id, old_status_id, new_status_id, #{proxy_owner.id}" +
|
" SELECT tracker_id, old_status_id, new_status_id, #{proxy_owner.id}" +
|
||||||
" FROM workflows" +
|
" FROM #{Workflow.table_name}" +
|
||||||
" WHERE role_id = #{role.id}"
|
" WHERE role_id = #{role.id}"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ class TimeEntry < ActiveRecord::Base
|
|||||||
:description => :comments
|
:description => :comments
|
||||||
|
|
||||||
validates_presence_of :user_id, :activity_id, :project_id, :hours, :spent_on
|
validates_presence_of :user_id, :activity_id, :project_id, :hours, :spent_on
|
||||||
validates_numericality_of :hours, :allow_nil => true
|
validates_numericality_of :hours, :allow_nil => true, :message => :activerecord_error_invalid
|
||||||
validates_length_of :comments, :maximum => 255, :allow_nil => true
|
validates_length_of :comments, :maximum => 255, :allow_nil => true
|
||||||
|
|
||||||
def after_initialize
|
def after_initialize
|
||||||
@@ -54,7 +54,7 @@ class TimeEntry < ActiveRecord::Base
|
|||||||
end
|
end
|
||||||
|
|
||||||
def hours=(h)
|
def hours=(h)
|
||||||
write_attribute :hours, (h.is_a?(String) ? h.to_hours : h)
|
write_attribute :hours, (h.is_a?(String) ? (h.to_hours || h) : h)
|
||||||
end
|
end
|
||||||
|
|
||||||
# tyear, tmonth, tweek assigned where setting spent_on attributes
|
# tyear, tmonth, tweek assigned where setting spent_on attributes
|
||||||
|
|||||||
@@ -23,9 +23,9 @@ class Tracker < ActiveRecord::Base
|
|||||||
raise "Can not copy workflow from a #{tracker.class}" unless tracker.is_a?(Tracker)
|
raise "Can not copy workflow from a #{tracker.class}" unless tracker.is_a?(Tracker)
|
||||||
raise "Can not copy workflow from/to an unsaved tracker" if proxy_owner.new_record? || tracker.new_record?
|
raise "Can not copy workflow from/to an unsaved tracker" if proxy_owner.new_record? || tracker.new_record?
|
||||||
clear
|
clear
|
||||||
connection.insert "INSERT INTO workflows (tracker_id, old_status_id, new_status_id, role_id)" +
|
connection.insert "INSERT INTO #{Workflow.table_name} (tracker_id, old_status_id, new_status_id, role_id)" +
|
||||||
" SELECT #{proxy_owner.id}, old_status_id, new_status_id, role_id" +
|
" SELECT #{proxy_owner.id}, old_status_id, new_status_id, role_id" +
|
||||||
" FROM workflows" +
|
" FROM #{Workflow.table_name}" +
|
||||||
" WHERE tracker_id = #{tracker.id}"
|
" WHERE tracker_id = #{tracker.id}"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
+6
-1
@@ -144,7 +144,7 @@ class User < ActiveRecord::Base
|
|||||||
end
|
end
|
||||||
|
|
||||||
def time_zone
|
def time_zone
|
||||||
@time_zone ||= (self.pref.time_zone.blank? ? nil : TimeZone[self.pref.time_zone])
|
@time_zone ||= (self.pref.time_zone.blank? ? nil : ActiveSupport::TimeZone[self.pref.time_zone])
|
||||||
end
|
end
|
||||||
|
|
||||||
def wants_comments_in_reverse_order?
|
def wants_comments_in_reverse_order?
|
||||||
@@ -178,6 +178,11 @@ class User < ActiveRecord::Base
|
|||||||
token = Token.find_by_action_and_value('autologin', key)
|
token = Token.find_by_action_and_value('autologin', key)
|
||||||
token && (token.created_on > Setting.autologin.to_i.day.ago) && token.user.active? ? token.user : nil
|
token && (token.created_on > Setting.autologin.to_i.day.ago) && token.user.active? ? token.user : nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Makes find_by_mail case-insensitive
|
||||||
|
def self.find_by_mail(mail)
|
||||||
|
find(:first, :conditions => ["LOWER(mail) = ?", mail.to_s.downcase])
|
||||||
|
end
|
||||||
|
|
||||||
# Sort users by their display names
|
# Sort users by their display names
|
||||||
def <=>(user)
|
def <=>(user)
|
||||||
|
|||||||
@@ -19,7 +19,8 @@ class Version < ActiveRecord::Base
|
|||||||
before_destroy :check_integrity
|
before_destroy :check_integrity
|
||||||
belongs_to :project
|
belongs_to :project
|
||||||
has_many :fixed_issues, :class_name => 'Issue', :foreign_key => 'fixed_version_id'
|
has_many :fixed_issues, :class_name => 'Issue', :foreign_key => 'fixed_version_id'
|
||||||
has_many :attachments, :as => :container, :dependent => :destroy
|
acts_as_attachable :view_permission => :view_files,
|
||||||
|
:delete_permission => :manage_files
|
||||||
|
|
||||||
validates_presence_of :name
|
validates_presence_of :name
|
||||||
validates_uniqueness_of :name, :scope => [:project_id]
|
validates_uniqueness_of :name, :scope => [:project_id]
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ require 'enumerator'
|
|||||||
class WikiPage < ActiveRecord::Base
|
class WikiPage < ActiveRecord::Base
|
||||||
belongs_to :wiki
|
belongs_to :wiki
|
||||||
has_one :content, :class_name => 'WikiContent', :foreign_key => 'page_id', :dependent => :destroy
|
has_one :content, :class_name => 'WikiContent', :foreign_key => 'page_id', :dependent => :destroy
|
||||||
has_many :attachments, :as => :container, :dependent => :destroy
|
acts_as_attachable :delete_permission => :delete_wiki_pages_attachments
|
||||||
acts_as_tree :order => 'title'
|
acts_as_tree :order => 'title'
|
||||||
|
|
||||||
acts_as_event :title => Proc.new {|o| "#{l(:label_wiki)}: #{o.title}"},
|
acts_as_event :title => Proc.new {|o| "#{l(:label_wiki)}: #{o.title}"},
|
||||||
@@ -111,6 +111,10 @@ class WikiPage < ActiveRecord::Base
|
|||||||
def editable_by?(usr)
|
def editable_by?(usr)
|
||||||
!protected? || usr.allowed_to?(:protect_wiki_pages, wiki.project)
|
!protected? || usr.allowed_to?(:protect_wiki_pages, wiki.project)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def attachments_deletable?(usr=User.current)
|
||||||
|
editable_by?(usr) && super(usr)
|
||||||
|
end
|
||||||
|
|
||||||
def parent_title
|
def parent_title
|
||||||
@parent_title || (self.parent && self.parent.pretty_title)
|
@parent_title || (self.parent && self.parent.pretty_title)
|
||||||
|
|||||||
@@ -4,7 +4,8 @@
|
|||||||
|
|
||||||
<table class="list">
|
<table class="list">
|
||||||
<tr class="odd"><td><%= l(:text_default_administrator_account_changed) %></td><td><%= image_tag (@flags[:default_admin_changed] ? 'true.png' : 'false.png'), :style => "vertical-align:bottom;" %></td></tr>
|
<tr class="odd"><td><%= l(:text_default_administrator_account_changed) %></td><td><%= image_tag (@flags[:default_admin_changed] ? 'true.png' : 'false.png'), :style => "vertical-align:bottom;" %></td></tr>
|
||||||
<tr class="even"><td><%= l(:text_file_repository_writable) %></td><td><%= image_tag (@flags[:file_repository_writable] ? 'true.png' : 'false.png'), :style => "vertical-align:bottom;" %></td></tr>
|
<tr class="even"><td><%= l(:text_file_repository_writable) %> (<%= Attachment.storage_path %>)</td><td><%= image_tag (@flags[:file_repository_writable] ? 'true.png' : 'false.png'), :style => "vertical-align:bottom;" %></td></tr>
|
||||||
|
<tr class="even"><td><%= l(:text_plugin_assets_writable) %> (<%= Engines.public_directory %>)</td><td><%= image_tag (@flags[:plugin_assets_writable] ? 'true.png' : 'false.png'), :style => "vertical-align:bottom;" %></td></tr>
|
||||||
<tr class="odd"><td><%= l(:text_rmagick_available) %></td><td><%= image_tag (@flags[:rmagick_available] ? 'true.png' : 'false.png'), :style => "vertical-align:bottom;" %></td></tr>
|
<tr class="odd"><td><%= l(:text_rmagick_available) %></td><td><%= image_tag (@flags[:rmagick_available] ? 'true.png' : 'false.png'), :style => "vertical-align:bottom;" %></td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
|||||||
@@ -3,14 +3,14 @@
|
|||||||
<p><%= link_to_attachment attachment, :class => 'icon icon-attachment' -%>
|
<p><%= link_to_attachment attachment, :class => 'icon icon-attachment' -%>
|
||||||
<%= h(" - #{attachment.description}") unless attachment.description.blank? %>
|
<%= h(" - #{attachment.description}") unless attachment.description.blank? %>
|
||||||
<span class="size">(<%= number_to_human_size attachment.filesize %>)</span>
|
<span class="size">(<%= number_to_human_size attachment.filesize %>)</span>
|
||||||
<% if options[:delete_url] %>
|
<% if options[:deletable] %>
|
||||||
<%= link_to image_tag('delete.png'), options[:delete_url].update({:attachment_id => attachment}),
|
<%= link_to image_tag('delete.png'), {:controller => 'attachments', :action => 'destroy', :id => attachment},
|
||||||
:confirm => l(:text_are_you_sure),
|
:confirm => l(:text_are_you_sure),
|
||||||
:method => :post,
|
:method => :post,
|
||||||
:class => 'delete',
|
:class => 'delete',
|
||||||
:title => l(:button_delete) %>
|
:title => l(:button_delete) %>
|
||||||
<% end %>
|
<% end %>
|
||||||
<% unless options[:no_author] %>
|
<% if options[:author] %>
|
||||||
<span class="author"><%= attachment.author %>, <%= format_time(attachment.created_on) %></span>
|
<span class="author"><%= attachment.author %>, <%= format_time(attachment.created_on) %></span>
|
||||||
<% end %>
|
<% end %>
|
||||||
</p>
|
</p>
|
||||||
|
|||||||
@@ -33,9 +33,9 @@
|
|||||||
<thead><tr>
|
<thead><tr>
|
||||||
<th><%= l(:field_subject) %></th>
|
<th><%= l(:field_subject) %></th>
|
||||||
<th><%= l(:field_author) %></th>
|
<th><%= l(:field_author) %></th>
|
||||||
<%= sort_header_tag("#{Message.table_name}.created_on", :caption => l(:field_created_on)) %>
|
<%= sort_header_tag('created_on', :caption => l(:field_created_on)) %>
|
||||||
<%= sort_header_tag("#{Message.table_name}.replies_count", :caption => l(:label_reply_plural)) %>
|
<%= sort_header_tag('replies', :caption => l(:label_reply_plural)) %>
|
||||||
<%= sort_header_tag("#{Message.table_name}.updated_on", :caption => l(:label_message_last)) %>
|
<%= sort_header_tag('updated_on', :caption => l(:label_message_last)) %>
|
||||||
</tr></thead>
|
</tr></thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<% @topics.each do |topic| %>
|
<% @topics.each do |topic| %>
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<% Redmine::UnifiedDiff.new(diff, diff_type).each do |table_file| -%>
|
<% diff = Redmine::UnifiedDiff.new(diff, :type => diff_type, :max_lines => Setting.diff_max_lines_displayed.to_i) -%>
|
||||||
|
<% diff.each do |table_file| -%>
|
||||||
<div class="autoscroll">
|
<div class="autoscroll">
|
||||||
<% if diff_type == 'sbs' -%>
|
<% if diff_type == 'sbs' -%>
|
||||||
<table class="filecontent CodeRay">
|
<table class="filecontent CodeRay">
|
||||||
@@ -62,3 +63,5 @@
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
<% end -%>
|
<% end -%>
|
||||||
|
|
||||||
|
<%= l(:text_diff_truncated) if diff.truncated? %>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<tbody>
|
<tbody>
|
||||||
<% line_num = 1 %>
|
<% line_num = 1 %>
|
||||||
<% syntax_highlight(filename, to_utf8(content)).each_line do |line| %>
|
<% syntax_highlight(filename, to_utf8(content)).each_line do |line| %>
|
||||||
<tr><th class="line-num" id="L<%= line_num %>"><%= line_num %></th><td class="line-code"><pre><%= line %></pre></td></tr>
|
<tr><th class="line-num" id="L<%= line_num %>"><a href="#L<%= line_num %>"><%= line_num %></a></th><td class="line-code"><pre><%= line %></pre></td></tr>
|
||||||
<% line_num += 1 %>
|
<% line_num += 1 %>
|
||||||
<% end %>
|
<% end %>
|
||||||
</tbody>
|
</tbody>
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h3><%= l(:label_attachment_plural) %></h3>
|
<h3><%= l(:label_attachment_plural) %></h3>
|
||||||
<%= link_to_attachments @attachments, :delete_url => (authorize_for('documents', 'destroy_attachment') ? {:controller => 'documents', :action => 'destroy_attachment', :id => @document} : nil) %>
|
<%= link_to_attachments @document %>
|
||||||
|
|
||||||
<% if authorize_for('documents', 'add_attachment') %>
|
<% if authorize_for('documents', 'add_attachment') %>
|
||||||
<p><%= link_to l(:label_attachment_new), {}, :onclick => "Element.show('add_attachment_form'); Element.hide(this); Element.scrollTo('add_attachment_form'); return false;",
|
<p><%= link_to l(:label_attachment_new), {}, :onclick => "Element.show('add_attachment_form'); Element.hide(this); Element.scrollTo('add_attachment_form'); return false;",
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
<div id="issue_descr_fields" <%= 'style="display:none"' unless @issue.new_record? || @issue.errors.any? %>>
|
<div id="issue_descr_fields" <%= 'style="display:none"' unless @issue.new_record? || @issue.errors.any? %>>
|
||||||
<p><%= f.text_field :subject, :size => 80, :required => true %></p>
|
<p><%= f.text_field :subject, :size => 80, :required => true %></p>
|
||||||
<p><%= f.text_area :description, :required => true,
|
<p><%= f.text_area :description,
|
||||||
:cols => 60,
|
:cols => 60,
|
||||||
:rows => (@issue.description.blank? ? 10 : [[10, @issue.description.length / 50].max, 100].min),
|
:rows => (@issue.description.blank? ? 10 : [[10, @issue.description.length / 50].max, 100].min),
|
||||||
:accesskey => accesskey(:edit),
|
:accesskey => accesskey(:edit),
|
||||||
@@ -24,11 +24,13 @@
|
|||||||
|
|
||||||
<p><%= f.select :priority_id, (@priorities.collect {|p| [p.name, p.id]}), :required => true %></p>
|
<p><%= f.select :priority_id, (@priorities.collect {|p| [p.name, p.id]}), :required => true %></p>
|
||||||
<p><%= f.select :assigned_to_id, (@issue.assignable_users.collect {|m| [m.name, m.id]}), :include_blank => true %></p>
|
<p><%= f.select :assigned_to_id, (@issue.assignable_users.collect {|m| [m.name, m.id]}), :include_blank => true %></p>
|
||||||
|
<% unless @project.issue_categories.empty? %>
|
||||||
<p><%= f.select :category_id, (@project.issue_categories.collect {|c| [c.name, c.id]}), :include_blank => true %>
|
<p><%= f.select :category_id, (@project.issue_categories.collect {|c| [c.name, c.id]}), :include_blank => true %>
|
||||||
<%= prompt_to_remote(l(:label_issue_category_new),
|
<%= prompt_to_remote(l(:label_issue_category_new),
|
||||||
l(:label_issue_category_new), 'category[name]',
|
l(:label_issue_category_new), 'category[name]',
|
||||||
{:controller => 'projects', :action => 'add_issue_category', :id => @project},
|
{:controller => 'projects', :action => 'add_issue_category', :id => @project},
|
||||||
:class => 'small', :tabindex => 199) if authorize_for('projects', 'add_issue_category') %></p>
|
:class => 'small', :tabindex => 199) if authorize_for('projects', 'add_issue_category') %></p>
|
||||||
|
<% end %>
|
||||||
<%= content_tag('p', f.select(:fixed_version_id,
|
<%= content_tag('p', f.select(:fixed_version_id,
|
||||||
(@project.versions.sort.collect {|v| [v.name, v.id]}),
|
(@project.versions.sort.collect {|v| [v.name, v.id]}),
|
||||||
{ :include_blank => true })) unless @project.versions.empty? %>
|
{ :include_blank => true })) unless @project.versions.empty? %>
|
||||||
@@ -48,6 +50,14 @@
|
|||||||
<p><label><%=l(:label_attachment_plural)%></label><%= render :partial => 'attachments/form' %></p>
|
<p><label><%=l(:label_attachment_plural)%></label><%= render :partial => 'attachments/form' %></p>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
|
<% if @issue.new_record? && User.current.allowed_to?(:add_issue_watchers, @project) -%>
|
||||||
|
<p><label><%= l(:label_issue_watchers) %></label>
|
||||||
|
<% @issue.project.users.sort.each do |user| -%>
|
||||||
|
<label class="floating"><%= check_box_tag 'issue[watcher_user_ids][]', user.id, @issue.watcher_user_ids.include?(user.id) %> <%=h user %></label>
|
||||||
|
<% end -%>
|
||||||
|
</p>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
<%= call_hook(:view_issues_form_details_bottom, { :issue => @issue, :form => f }) %>
|
<%= call_hook(:view_issues_form_details_bottom, { :issue => @issue, :form => f }) %>
|
||||||
|
|
||||||
<%= wikitoolbar_for 'issue_description' %>
|
<%= wikitoolbar_for 'issue_description' %>
|
||||||
|
|||||||
@@ -4,14 +4,14 @@
|
|||||||
<th><%= link_to image_tag('toggle_check.png'), {}, :onclick => 'toggleIssuesSelection(Element.up(this, "form")); return false;',
|
<th><%= link_to image_tag('toggle_check.png'), {}, :onclick => 'toggleIssuesSelection(Element.up(this, "form")); return false;',
|
||||||
:title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}" %>
|
:title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}" %>
|
||||||
</th>
|
</th>
|
||||||
<%= sort_header_tag("#{Issue.table_name}.id", :caption => '#', :default_order => 'desc') %>
|
<%= sort_header_tag('id', :caption => '#', :default_order => 'desc') %>
|
||||||
<% query.columns.each do |column| %>
|
<% query.columns.each do |column| %>
|
||||||
<%= column_header(column) %>
|
<%= column_header(column) %>
|
||||||
<% end %>
|
<% end %>
|
||||||
</tr></thead>
|
</tr></thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<% issues.each do |issue| -%>
|
<% issues.each do |issue| -%>
|
||||||
<tr id="issue-<%= issue.id %>" class="issue hascontextmenu <%= cycle('odd', 'even') %> <%= "status-#{issue.status.position} priority-#{issue.priority.position}" %>">
|
<tr id="issue-<%= issue.id %>" class="hascontextmenu <%= cycle('odd', 'even') %> <%= css_issue_classes(issue) %>">
|
||||||
<td class="checkbox"><%= check_box_tag("ids[]", issue.id, false, :id => nil) %></td>
|
<td class="checkbox"><%= check_box_tag("ids[]", issue.id, false, :id => nil) %></td>
|
||||||
<td><%= link_to issue.id, :controller => 'issues', :action => 'show', :id => issue %></td>
|
<td><%= link_to issue.id, :controller => 'issues', :action => 'show', :id => issue %></td>
|
||||||
<% query.columns.each do |column| %><%= content_tag 'td', column_content(column, issue), :class => column.name %><% end %>
|
<% query.columns.each do |column| %><%= content_tag 'td', column_content(column, issue), :class => column.name %><% end %>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
</tr></thead>
|
</tr></thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<% for issue in issues %>
|
<% for issue in issues %>
|
||||||
<tr id="issue-<%= issue.id %>" class="issue hascontextmenu <%= cycle('odd', 'even') %> <%= "status-#{issue.status.position} priority-#{issue.priority.position}" %>">
|
<tr id="issue-<%= issue.id %>" class="hascontextmenu <%= cycle('odd', 'even') %> <%= css_issue_classes(issue) %>">
|
||||||
<td class="id">
|
<td class="id">
|
||||||
<%= check_box_tag("ids[]", issue.id, false, :style => 'display:none;') %>
|
<%= check_box_tag("ids[]", issue.id, false, :style => 'display:none;') %>
|
||||||
<%= link_to issue.id, :controller => 'issues', :action => 'show', :id => issue %>
|
<%= link_to issue.id, :controller => 'issues', :action => 'show', :id => issue %>
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
<h3><%= l(:label_query_plural) %></h3>
|
<h3><%= l(:label_query_plural) %></h3>
|
||||||
|
|
||||||
<% sidebar_queries.each do |query| -%>
|
<% sidebar_queries.each do |query| -%>
|
||||||
<%= link_to query.name, :controller => 'issues', :action => 'index', :project_id => @project, :query_id => query %><br />
|
<%= link_to(h(query.name), :controller => 'issues', :action => 'index', :project_id => @project, :query_id => query) %><br />
|
||||||
<% end -%>
|
<% end -%>
|
||||||
<%= call_hook(:view_issues_sidebar_queries_bottom) %>
|
<%= call_hook(:view_issues_sidebar_queries_bottom) %>
|
||||||
<% end -%>
|
<% end -%>
|
||||||
|
|||||||
@@ -44,6 +44,7 @@
|
|||||||
<fieldset><legend><%= l(:field_notes) %></legend>
|
<fieldset><legend><%= l(:field_notes) %></legend>
|
||||||
<%= text_area_tag 'notes', @notes, :cols => 60, :rows => 10, :class => 'wiki-edit' %>
|
<%= text_area_tag 'notes', @notes, :cols => 60, :rows => 10, :class => 'wiki-edit' %>
|
||||||
<%= wikitoolbar_for 'notes' %>
|
<%= wikitoolbar_for 'notes' %>
|
||||||
|
</fieldset>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p><%= submit_tag l(:button_submit) %>
|
<p><%= submit_tag l(:button_submit) %>
|
||||||
|
|||||||
@@ -1,188 +0,0 @@
|
|||||||
<%
|
|
||||||
pdf=IfpdfHelper::IFPDF.new(current_language)
|
|
||||||
pdf.SetTitle("#{l(:label_gantt)} #{@project}")
|
|
||||||
pdf.AliasNbPages
|
|
||||||
pdf.footer_date = format_date(Date.today)
|
|
||||||
pdf.AddPage("L")
|
|
||||||
pdf.SetFontStyle('B',12)
|
|
||||||
pdf.SetX(15)
|
|
||||||
pdf.Cell(70, 20, @project.to_s)
|
|
||||||
pdf.Ln
|
|
||||||
pdf.SetFontStyle('B',9)
|
|
||||||
|
|
||||||
subject_width = 70
|
|
||||||
header_heigth = 5
|
|
||||||
|
|
||||||
headers_heigth = header_heigth
|
|
||||||
show_weeks = false
|
|
||||||
show_days = false
|
|
||||||
|
|
||||||
if @gantt.months < 7
|
|
||||||
show_weeks = true
|
|
||||||
headers_heigth = 2*header_heigth
|
|
||||||
if @gantt.months < 3
|
|
||||||
show_days = true
|
|
||||||
headers_heigth = 3*header_heigth
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
g_width = 210
|
|
||||||
zoom = (g_width) / (@gantt.date_to - @gantt.date_from + 1)
|
|
||||||
g_height = 120
|
|
||||||
t_height = g_height + headers_heigth
|
|
||||||
|
|
||||||
y_start = pdf.GetY
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# Months headers
|
|
||||||
#
|
|
||||||
month_f = @gantt.date_from
|
|
||||||
left = subject_width
|
|
||||||
height = header_heigth
|
|
||||||
@gantt.months.times do
|
|
||||||
width = ((month_f >> 1) - month_f) * zoom
|
|
||||||
pdf.SetY(y_start)
|
|
||||||
pdf.SetX(left)
|
|
||||||
pdf.Cell(width, height, "#{month_f.year}-#{month_f.month}", "LTR", 0, "C")
|
|
||||||
left = left + width
|
|
||||||
month_f = month_f >> 1
|
|
||||||
end
|
|
||||||
|
|
||||||
#
|
|
||||||
# Weeks headers
|
|
||||||
#
|
|
||||||
if show_weeks
|
|
||||||
left = subject_width
|
|
||||||
height = header_heigth
|
|
||||||
if @gantt.date_from.cwday == 1
|
|
||||||
# @gantt.date_from is monday
|
|
||||||
week_f = @gantt.date_from
|
|
||||||
else
|
|
||||||
# find next monday after @gantt.date_from
|
|
||||||
week_f = @gantt.date_from + (7 - @gantt.date_from.cwday + 1)
|
|
||||||
width = (7 - @gantt.date_from.cwday + 1) * zoom-1
|
|
||||||
pdf.SetY(y_start + header_heigth)
|
|
||||||
pdf.SetX(left)
|
|
||||||
pdf.Cell(width + 1, height, "", "LTR")
|
|
||||||
left = left + width+1
|
|
||||||
end
|
|
||||||
while week_f <= @gantt.date_to
|
|
||||||
width = (week_f + 6 <= @gantt.date_to) ? 7 * zoom : (@gantt.date_to - week_f + 1) * zoom
|
|
||||||
pdf.SetY(y_start + header_heigth)
|
|
||||||
pdf.SetX(left)
|
|
||||||
pdf.Cell(width, height, (width >= 5 ? week_f.cweek.to_s : ""), "LTR", 0, "C")
|
|
||||||
left = left + width
|
|
||||||
week_f = week_f+7
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
#
|
|
||||||
# Days headers
|
|
||||||
#
|
|
||||||
if show_days
|
|
||||||
left = subject_width
|
|
||||||
height = header_heigth
|
|
||||||
wday = @gantt.date_from.cwday
|
|
||||||
pdf.SetFontStyle('B',7)
|
|
||||||
(@gantt.date_to - @gantt.date_from + 1).to_i.times do
|
|
||||||
width = zoom
|
|
||||||
pdf.SetY(y_start + 2 * header_heigth)
|
|
||||||
pdf.SetX(left)
|
|
||||||
pdf.Cell(width, height, day_name(wday).first, "LTR", 0, "C")
|
|
||||||
left = left + width
|
|
||||||
wday = wday + 1
|
|
||||||
wday = 1 if wday > 7
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
pdf.SetY(y_start)
|
|
||||||
pdf.SetX(15)
|
|
||||||
pdf.Cell(subject_width+g_width-15, headers_heigth, "", 1)
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# Tasks
|
|
||||||
#
|
|
||||||
top = headers_heigth + y_start
|
|
||||||
pdf.SetFontStyle('B',7)
|
|
||||||
@gantt.events.each do |i|
|
|
||||||
pdf.SetY(top)
|
|
||||||
pdf.SetX(15)
|
|
||||||
|
|
||||||
if i.is_a? Issue
|
|
||||||
pdf.Cell(subject_width-15, 5, "#{i.tracker.name} #{i.id}: #{i.subject}".sub(/^(.{30}[^\s]*\s).*$/, '\1 (...)'), "LR")
|
|
||||||
else
|
|
||||||
pdf.Cell(subject_width-15, 5, "#{l(:label_version)}: #{i.name}", "LR")
|
|
||||||
end
|
|
||||||
|
|
||||||
pdf.SetY(top)
|
|
||||||
pdf.SetX(subject_width)
|
|
||||||
pdf.Cell(g_width, 5, "", "LR")
|
|
||||||
|
|
||||||
pdf.SetY(top+1.5)
|
|
||||||
|
|
||||||
if i.is_a? Issue
|
|
||||||
i_start_date = (i.start_date >= @gantt.date_from ? i.start_date : @gantt.date_from )
|
|
||||||
i_end_date = (i.due_before <= @gantt.date_to ? i.due_before : @gantt.date_to )
|
|
||||||
|
|
||||||
i_done_date = i.start_date + ((i.due_before - i.start_date+1)*i.done_ratio/100).floor
|
|
||||||
i_done_date = (i_done_date <= @gantt.date_from ? @gantt.date_from : i_done_date )
|
|
||||||
i_done_date = (i_done_date >= @gantt.date_to ? @gantt.date_to : i_done_date )
|
|
||||||
|
|
||||||
i_late_date = [i_end_date, Date.today].min if i_start_date < Date.today
|
|
||||||
|
|
||||||
i_left = ((i_start_date - @gantt.date_from)*zoom)
|
|
||||||
i_width = ((i_end_date - i_start_date + 1)*zoom)
|
|
||||||
d_width = ((i_done_date - i_start_date)*zoom)
|
|
||||||
l_width = ((i_late_date - i_start_date+1)*zoom) if i_late_date
|
|
||||||
l_width ||= 0
|
|
||||||
|
|
||||||
pdf.SetX(subject_width + i_left)
|
|
||||||
pdf.SetFillColor(200,200,200)
|
|
||||||
pdf.Cell(i_width, 2, "", 0, 0, "", 1)
|
|
||||||
|
|
||||||
if l_width > 0
|
|
||||||
pdf.SetY(top+1.5)
|
|
||||||
pdf.SetX(subject_width + i_left)
|
|
||||||
pdf.SetFillColor(255,100,100)
|
|
||||||
pdf.Cell(l_width, 2, "", 0, 0, "", 1)
|
|
||||||
end
|
|
||||||
if d_width > 0
|
|
||||||
pdf.SetY(top+1.5)
|
|
||||||
pdf.SetX(subject_width + i_left)
|
|
||||||
pdf.SetFillColor(100,100,255)
|
|
||||||
pdf.Cell(d_width, 2, "", 0, 0, "", 1)
|
|
||||||
end
|
|
||||||
|
|
||||||
pdf.SetY(top+1.5)
|
|
||||||
pdf.SetX(subject_width + i_left + i_width)
|
|
||||||
pdf.Cell(30, 2, "#{i.status.name} #{i.done_ratio}%")
|
|
||||||
else
|
|
||||||
i_left = ((i.start_date - @gantt.date_from)*zoom)
|
|
||||||
|
|
||||||
pdf.SetX(subject_width + i_left)
|
|
||||||
pdf.SetFillColor(50,200,50)
|
|
||||||
pdf.Cell(2, 2, "", 0, 0, "", 1)
|
|
||||||
|
|
||||||
pdf.SetY(top+1.5)
|
|
||||||
pdf.SetX(subject_width + i_left + 3)
|
|
||||||
pdf.Cell(30, 2, "#{i.name}")
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
top = top + 5
|
|
||||||
pdf.SetDrawColor(200, 200, 200)
|
|
||||||
pdf.Line(15, top, subject_width+g_width, top)
|
|
||||||
if pdf.GetY() > 180
|
|
||||||
pdf.AddPage("L")
|
|
||||||
top = 20
|
|
||||||
pdf.Line(15, top, subject_width+g_width, top)
|
|
||||||
end
|
|
||||||
pdf.SetDrawColor(0, 0, 0)
|
|
||||||
end
|
|
||||||
|
|
||||||
pdf.Line(15, top, subject_width+g_width, top)
|
|
||||||
|
|
||||||
%>
|
|
||||||
<%= pdf.Output %>
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
<% pdf=IfpdfHelper::IFPDF.new(current_language)
|
|
||||||
title = @project ? "#{@project.name} - #{l(:label_issue_plural)}" : "#{l(:label_issue_plural)}"
|
|
||||||
pdf.SetTitle(title)
|
|
||||||
pdf.AliasNbPages
|
|
||||||
pdf.footer_date = format_date(Date.today)
|
|
||||||
pdf.AddPage("L")
|
|
||||||
row_height = 7
|
|
||||||
|
|
||||||
#
|
|
||||||
# title
|
|
||||||
#
|
|
||||||
pdf.SetFontStyle('B',11)
|
|
||||||
pdf.Cell(190,10, title)
|
|
||||||
pdf.Ln
|
|
||||||
|
|
||||||
#
|
|
||||||
# headers
|
|
||||||
#
|
|
||||||
pdf.SetFontStyle('B',10)
|
|
||||||
pdf.SetFillColor(230, 230, 230)
|
|
||||||
pdf.Cell(15, row_height, "#", 0, 0, 'L', 1)
|
|
||||||
pdf.Cell(30, row_height, l(:field_tracker), 0, 0, 'L', 1)
|
|
||||||
pdf.Cell(30, row_height, l(:field_status), 0, 0, 'L', 1)
|
|
||||||
pdf.Cell(30, row_height, l(:field_priority), 0, 0, 'L', 1)
|
|
||||||
pdf.Cell(40, row_height, l(:field_assigned_to), 0, 0, 'L', 1)
|
|
||||||
pdf.Cell(25, row_height, l(:field_updated_on), 0, 0, 'L', 1)
|
|
||||||
pdf.Cell(0, row_height, l(:field_subject), 0, 0, 'L', 1)
|
|
||||||
pdf.Line(10, pdf.GetY, 287, pdf.GetY)
|
|
||||||
pdf.Ln
|
|
||||||
pdf.Line(10, pdf.GetY, 287, pdf.GetY)
|
|
||||||
pdf.SetY(pdf.GetY() + 1)
|
|
||||||
|
|
||||||
#
|
|
||||||
# rows
|
|
||||||
#
|
|
||||||
pdf.SetFontStyle('',9)
|
|
||||||
pdf.SetFillColor(255, 255, 255)
|
|
||||||
@issues.each do |issue|
|
|
||||||
pdf.Cell(15, row_height, issue.id.to_s, 0, 0, 'L', 1)
|
|
||||||
pdf.Cell(30, row_height, issue.tracker.name, 0, 0, 'L', 1)
|
|
||||||
pdf.Cell(30, row_height, issue.status.name, 0, 0, 'L', 1)
|
|
||||||
pdf.Cell(30, row_height, issue.priority.name, 0, 0, 'L', 1)
|
|
||||||
pdf.Cell(40, row_height, issue.assigned_to ? issue.assigned_to.name : '', 0, 0, 'L', 1)
|
|
||||||
pdf.Cell(25, row_height, format_date(issue.updated_on), 0, 0, 'L', 1)
|
|
||||||
pdf.MultiCell(0, row_height, (@project == issue.project ? issue.subject : "#{issue.project.name} - #{issue.subject}"))
|
|
||||||
pdf.Line(10, pdf.GetY, 287, pdf.GetY)
|
|
||||||
pdf.SetY(pdf.GetY() + 1)
|
|
||||||
end
|
|
||||||
%>
|
|
||||||
<%= pdf.Output %>
|
|
||||||
@@ -42,6 +42,7 @@
|
|||||||
<% else %>
|
<% else %>
|
||||||
<%= render :partial => 'issues/list', :locals => {:issues => @issues, :query => @query} %>
|
<%= render :partial => 'issues/list', :locals => {:issues => @issues, :query => @query} %>
|
||||||
<p class="pagination"><%= pagination_links_full @issue_pages, @issue_count %></p>
|
<p class="pagination"><%= pagination_links_full @issue_pages, @issue_count %></p>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
<p class="other-formats">
|
<p class="other-formats">
|
||||||
<%= l(:label_export_to) %>
|
<%= l(:label_export_to) %>
|
||||||
@@ -50,7 +51,6 @@
|
|||||||
<span><%= link_to 'PDF', {:format => 'pdf'}, :class => 'pdf' %></span>
|
<span><%= link_to 'PDF', {:format => 'pdf'}, :class => 'pdf' %></span>
|
||||||
</p>
|
</p>
|
||||||
<% end %>
|
<% end %>
|
||||||
<% end %>
|
|
||||||
|
|
||||||
<% content_for :sidebar do %>
|
<% content_for :sidebar do %>
|
||||||
<%= render :partial => 'issues/sidebar' %>
|
<%= render :partial => 'issues/sidebar' %>
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
<%= render :partial => 'issues/form', :locals => {:f => f} %>
|
<%= render :partial => 'issues/form', :locals => {:f => f} %>
|
||||||
</div>
|
</div>
|
||||||
<%= submit_tag l(:button_create) %>
|
<%= submit_tag l(:button_create) %>
|
||||||
|
<%= submit_tag l(:button_create_and_continue), :name => 'continue' %>
|
||||||
<%= link_to_remote l(:label_preview),
|
<%= link_to_remote l(:label_preview),
|
||||||
{ :url => { :controller => 'issues', :action => 'preview', :project_id => @project },
|
{ :url => { :controller => 'issues', :action => 'preview', :project_id => @project },
|
||||||
:method => 'post',
|
:method => 'post',
|
||||||
@@ -14,6 +15,12 @@
|
|||||||
:with => "Form.serialize('issue-form')",
|
:with => "Form.serialize('issue-form')",
|
||||||
:complete => "Element.scrollTo('preview')"
|
:complete => "Element.scrollTo('preview')"
|
||||||
}, :accesskey => accesskey(:preview) %>
|
}, :accesskey => accesskey(:preview) %>
|
||||||
|
|
||||||
|
<%= javascript_tag "Form.Element.focus('issue_subject');" %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<div id="preview" class="wiki"></div>
|
<div id="preview" class="wiki"></div>
|
||||||
|
|
||||||
|
<% content_for :header_tags do %>
|
||||||
|
<%= stylesheet_link_tag 'scm' %>
|
||||||
|
<% end %>
|
||||||
|
|||||||
@@ -1,126 +0,0 @@
|
|||||||
<% pdf=IfpdfHelper::IFPDF.new(current_language)
|
|
||||||
pdf.SetTitle("#{@project.name} - ##{@issue.tracker.name} #{@issue.id}")
|
|
||||||
pdf.AliasNbPages
|
|
||||||
pdf.footer_date = format_date(Date.today)
|
|
||||||
pdf.AddPage
|
|
||||||
|
|
||||||
pdf.SetFontStyle('B',11)
|
|
||||||
pdf.Cell(190,10, "#{@issue.project} - #{@issue.tracker} # #{@issue.id}: #{@issue.subject}")
|
|
||||||
pdf.Ln
|
|
||||||
|
|
||||||
y0 = pdf.GetY
|
|
||||||
|
|
||||||
pdf.SetFontStyle('B',9)
|
|
||||||
pdf.Cell(35,5, l(:field_status) + ":","LT")
|
|
||||||
pdf.SetFontStyle('',9)
|
|
||||||
pdf.Cell(60,5, @issue.status.name,"RT")
|
|
||||||
pdf.SetFontStyle('B',9)
|
|
||||||
pdf.Cell(35,5, l(:field_priority) + ":","LT")
|
|
||||||
pdf.SetFontStyle('',9)
|
|
||||||
pdf.Cell(60,5, @issue.priority.name,"RT")
|
|
||||||
pdf.Ln
|
|
||||||
|
|
||||||
pdf.SetFontStyle('B',9)
|
|
||||||
pdf.Cell(35,5, l(:field_author) + ":","L")
|
|
||||||
pdf.SetFontStyle('',9)
|
|
||||||
pdf.Cell(60,5, @issue.author.name,"R")
|
|
||||||
pdf.SetFontStyle('B',9)
|
|
||||||
pdf.Cell(35,5, l(:field_category) + ":","L")
|
|
||||||
pdf.SetFontStyle('',9)
|
|
||||||
pdf.Cell(60,5, (@issue.category ? @issue.category.name : "-"),"R")
|
|
||||||
pdf.Ln
|
|
||||||
|
|
||||||
pdf.SetFontStyle('B',9)
|
|
||||||
pdf.Cell(35,5, l(:field_created_on) + ":","L")
|
|
||||||
pdf.SetFontStyle('',9)
|
|
||||||
pdf.Cell(60,5, format_date(@issue.created_on),"R")
|
|
||||||
pdf.SetFontStyle('B',9)
|
|
||||||
pdf.Cell(35,5, l(:field_assigned_to) + ":","L")
|
|
||||||
pdf.SetFontStyle('',9)
|
|
||||||
pdf.Cell(60,5, (@issue.assigned_to ? @issue.assigned_to.name : "-"),"R")
|
|
||||||
pdf.Ln
|
|
||||||
|
|
||||||
pdf.SetFontStyle('B',9)
|
|
||||||
pdf.Cell(35,5, l(:field_updated_on) + ":","LB")
|
|
||||||
pdf.SetFontStyle('',9)
|
|
||||||
pdf.Cell(60,5, format_date(@issue.updated_on),"RB")
|
|
||||||
pdf.SetFontStyle('B',9)
|
|
||||||
pdf.Cell(35,5, l(:field_due_date) + ":","LB")
|
|
||||||
pdf.SetFontStyle('',9)
|
|
||||||
pdf.Cell(60,5, format_date(@issue.due_date),"RB")
|
|
||||||
pdf.Ln
|
|
||||||
|
|
||||||
for custom_value in @issue.custom_values
|
|
||||||
pdf.SetFontStyle('B',9)
|
|
||||||
pdf.Cell(35,5, custom_value.custom_field.name + ":","L")
|
|
||||||
pdf.SetFontStyle('',9)
|
|
||||||
pdf.MultiCell(155,5, (show_value custom_value),"R")
|
|
||||||
end
|
|
||||||
|
|
||||||
pdf.SetFontStyle('B',9)
|
|
||||||
pdf.Cell(35,5, l(:field_subject) + ":","LTB")
|
|
||||||
pdf.SetFontStyle('',9)
|
|
||||||
pdf.Cell(155,5, @issue.subject,"RTB")
|
|
||||||
pdf.Ln
|
|
||||||
|
|
||||||
pdf.SetFontStyle('B',9)
|
|
||||||
pdf.Cell(35,5, l(:field_description) + ":")
|
|
||||||
pdf.SetFontStyle('',9)
|
|
||||||
pdf.MultiCell(155,5, @issue.description,"BR")
|
|
||||||
|
|
||||||
pdf.Line(pdf.GetX, y0, pdf.GetX, pdf.GetY)
|
|
||||||
pdf.Line(pdf.GetX, pdf.GetY, 170, pdf.GetY)
|
|
||||||
|
|
||||||
pdf.Ln
|
|
||||||
|
|
||||||
if @issue.changesets.any? && User.current.allowed_to?(:view_changesets, @issue.project)
|
|
||||||
pdf.SetFontStyle('B',9)
|
|
||||||
pdf.Cell(190,5, l(:label_associated_revisions), "B")
|
|
||||||
pdf.Ln
|
|
||||||
for changeset in @issue.changesets
|
|
||||||
pdf.SetFontStyle('B',8)
|
|
||||||
pdf.Cell(190,5, format_time(changeset.committed_on) + " - " + changeset.author.to_s)
|
|
||||||
pdf.Ln
|
|
||||||
unless changeset.comments.blank?
|
|
||||||
pdf.SetFontStyle('',8)
|
|
||||||
pdf.MultiCell(190,5, changeset.comments)
|
|
||||||
end
|
|
||||||
pdf.Ln
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
pdf.SetFontStyle('B',9)
|
|
||||||
pdf.Cell(190,5, l(:label_history), "B")
|
|
||||||
pdf.Ln
|
|
||||||
for journal in @issue.journals.find(:all, :include => [:user, :details], :order => "#{Journal.table_name}.created_on ASC")
|
|
||||||
pdf.SetFontStyle('B',8)
|
|
||||||
pdf.Cell(190,5, format_time(journal.created_on) + " - " + journal.user.name)
|
|
||||||
pdf.Ln
|
|
||||||
pdf.SetFontStyle('I',8)
|
|
||||||
for detail in journal.details
|
|
||||||
pdf.Cell(190,5, "- " + show_detail(detail, true))
|
|
||||||
pdf.Ln
|
|
||||||
end
|
|
||||||
if journal.notes?
|
|
||||||
pdf.SetFontStyle('',8)
|
|
||||||
pdf.MultiCell(190,5, journal.notes)
|
|
||||||
end
|
|
||||||
pdf.Ln
|
|
||||||
end
|
|
||||||
|
|
||||||
if @issue.attachments.any?
|
|
||||||
pdf.SetFontStyle('B',9)
|
|
||||||
pdf.Cell(190,5, l(:label_attachment_plural), "B")
|
|
||||||
pdf.Ln
|
|
||||||
for attachment in @issue.attachments
|
|
||||||
pdf.SetFontStyle('',8)
|
|
||||||
pdf.Cell(80,5, attachment.filename)
|
|
||||||
pdf.Cell(20,5, number_to_human_size(attachment.filesize),0,0,"R")
|
|
||||||
pdf.Cell(25,5, format_date(attachment.created_on),0,0,"R")
|
|
||||||
pdf.Cell(65,5, attachment.author.name,0,0,"R")
|
|
||||||
pdf.Ln
|
|
||||||
end
|
|
||||||
end
|
|
||||||
%>
|
|
||||||
|
|
||||||
<%= pdf.Output %>
|
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
<h2><%= @issue.tracker.name %> #<%= @issue.id %></h2>
|
<h2><%= @issue.tracker.name %> #<%= @issue.id %></h2>
|
||||||
|
|
||||||
<div class="issue <%= "status-#{@issue.status.position} priority-#{@issue.priority.position}" %>">
|
<div class="<%= css_issue_classes(@issue) %>">
|
||||||
<%= avatar(@issue.author, :size => "64") %>
|
<%= avatar(@issue.author, :size => "64") %>
|
||||||
<h3><%=h @issue.subject %></h3>
|
<h3><%=h @issue.subject %></h3>
|
||||||
<p class="author">
|
<p class="author">
|
||||||
@@ -19,11 +19,11 @@
|
|||||||
|
|
||||||
<table width="100%">
|
<table width="100%">
|
||||||
<tr>
|
<tr>
|
||||||
<td style="width:15%" class="status"><b><%=l(:field_status)%>:</b></td><td style="width:35%" class="status status-<%= @issue.status.name %>"><%= @issue.status.name %></td>
|
<td style="width:15%" class="status"><b><%=l(:field_status)%>:</b></td><td style="width:35%" class="status"><%= @issue.status.name %></td>
|
||||||
<td style="width:15%" class="start-date"><b><%=l(:field_start_date)%>:</b></td><td style="width:35%"><%= format_date(@issue.start_date) %></td>
|
<td style="width:15%" class="start-date"><b><%=l(:field_start_date)%>:</b></td><td style="width:35%"><%= format_date(@issue.start_date) %></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="priority"><b><%=l(:field_priority)%>:</b></td><td class="priority priority-<%= @issue.priority.name %>"><%= @issue.priority.name %></td>
|
<td class="priority"><b><%=l(:field_priority)%>:</b></td><td class="priority"><%= @issue.priority.name %></td>
|
||||||
<td class="due-date"><b><%=l(:field_due_date)%>:</b></td><td class="due-date"><%= format_date(@issue.due_date) %></td>
|
<td class="due-date"><b><%=l(:field_due_date)%>:</b></td><td class="due-date"><%= format_date(@issue.due_date) %></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -59,7 +59,7 @@ end %>
|
|||||||
<hr />
|
<hr />
|
||||||
|
|
||||||
<div class="contextual">
|
<div class="contextual">
|
||||||
<%= link_to_remote_if_authorized l(:button_quote), { :url => {:action => 'reply', :id => @issue} }, :class => 'icon icon-comment' %>
|
<%= link_to_remote_if_authorized(l(:button_quote), { :url => {:action => 'reply', :id => @issue} }, :class => 'icon icon-comment') unless @issue.description.blank? %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p><strong><%=l(:field_description)%></strong></p>
|
<p><strong><%=l(:field_description)%></strong></p>
|
||||||
@@ -67,9 +67,7 @@ end %>
|
|||||||
<%= textilizable @issue, :description, :attachments => @issue.attachments %>
|
<%= textilizable @issue, :description, :attachments => @issue.attachments %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<% if @issue.attachments.any? %>
|
<%= link_to_attachments @issue %>
|
||||||
<%= link_to_attachments @issue.attachments, :delete_url => (authorize_for('issues', 'destroy_attachment') ? {:controller => 'issues', :action => 'destroy_attachment', :id => @issue} : nil) %>
|
|
||||||
<% end %>
|
|
||||||
|
|
||||||
<% if authorize_for('issue_relations', 'new') || @issue.relations.any? %>
|
<% if authorize_for('issue_relations', 'new') || @issue.relations.any? %>
|
||||||
<hr />
|
<hr />
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
<% form_remote_tag(:url => {}, :html => { :id => "journal-#{@journal.id}-form" }) do %>
|
<% form_remote_tag(:url => {}, :html => { :id => "journal-#{@journal.id}-form" }) do %>
|
||||||
<%= text_area_tag :notes, @journal.notes, :class => 'wiki-edit',
|
<%= text_area_tag :notes, h(@journal.notes), :class => 'wiki-edit',
|
||||||
:rows => (@journal.notes.blank? ? 10 : [[10, @journal.notes.length / 50].max, 100].min) %>
|
:rows => (@journal.notes.blank? ? 10 : [[10, @journal.notes.length / 50].max, 100].min) %>
|
||||||
|
<%= call_hook(:view_journals_notes_form_after_notes, { :journal => @journal}) %>
|
||||||
<p><%= submit_tag l(:button_save) %>
|
<p><%= submit_tag l(:button_save) %>
|
||||||
<%= link_to l(:button_cancel), '#', :onclick => "Element.remove('journal-#{@journal.id}-form'); " +
|
<%= link_to l(:button_cancel), '#', :onclick => "Element.remove('journal-#{@journal.id}-form'); " +
|
||||||
"Element.show('journal-#{@journal.id}-notes'); return false;" %></p>
|
"Element.show('journal-#{@journal.id}-notes'); return false;" %></p>
|
||||||
|
|||||||
@@ -6,3 +6,5 @@ else
|
|||||||
page.show "journal-#{@journal.id}-notes"
|
page.show "journal-#{@journal.id}-notes"
|
||||||
page.remove "journal-#{@journal.id}-form"
|
page.remove "journal-#{@journal.id}-form"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
call_hook(:view_journals_update_rjs_bottom, { :page => page, :journal => @journal })
|
||||||
|
|||||||
@@ -3,10 +3,10 @@
|
|||||||
<option selected="selected"><%= l(:label_jump_to_a_project) %></option>
|
<option selected="selected"><%= l(:label_jump_to_a_project) %></option>
|
||||||
<option disabled="disabled">---</option>
|
<option disabled="disabled">---</option>
|
||||||
<% user_projects_by_root.keys.sort.each do |root| %>
|
<% user_projects_by_root.keys.sort.each do |root| %>
|
||||||
<%= content_tag('option', h(root.name), :value => url_for(:controller => 'projects', :action => 'show', :id => root)) %>
|
<%= content_tag('option', h(root.name), :value => url_for(:controller => 'projects', :action => 'show', :id => root, :jump => current_menu_item)) %>
|
||||||
<% user_projects_by_root[root].sort.each do |project| %>
|
<% user_projects_by_root[root].sort.each do |project| %>
|
||||||
<% next if project == root %>
|
<% next if project == root %>
|
||||||
<%= content_tag('option', ('» ' + h(project.name)), :value => url_for(:controller => 'projects', :action => 'show', :id => project)) %>
|
<%= content_tag('option', ('» ' + h(project.name)), :value => url_for(:controller => 'projects', :action => 'show', :id => project, :jump => current_menu_item)) %>
|
||||||
<% end %>
|
<% end %>
|
||||||
<% end %>
|
<% end %>
|
||||||
</select>
|
</select>
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
<div id="account">
|
<div id="account">
|
||||||
<%= render_menu :account_menu -%>
|
<%= render_menu :account_menu -%>
|
||||||
</div>
|
</div>
|
||||||
<%= content_tag('div', "#{l(:label_logged_as)} #{User.current.login}", :id => 'loggedas') if User.current.logged? %>
|
<%= content_tag('div', "#{l(:label_logged_as)} #{link_to_user(User.current, :format => :username)}", :id => 'loggedas') if User.current.logged? %>
|
||||||
<%= render_menu :top_menu -%>
|
<%= render_menu :top_menu -%>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -47,19 +47,20 @@
|
|||||||
<%= tag('div', {:id => 'main', :class => (has_content?(:sidebar) ? '' : 'nosidebar')}, true) %>
|
<%= tag('div', {:id => 'main', :class => (has_content?(:sidebar) ? '' : 'nosidebar')}, true) %>
|
||||||
<div id="sidebar">
|
<div id="sidebar">
|
||||||
<%= yield :sidebar %>
|
<%= yield :sidebar %>
|
||||||
|
<%= call_hook :view_layouts_base_sidebar %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="content">
|
<div id="content">
|
||||||
<%= content_tag('div', flash[:error], :class => 'flash error') if flash[:error] %>
|
<%= render_flash_messages %>
|
||||||
<%= content_tag('div', flash[:notice], :class => 'flash notice') if flash[:notice] %>
|
|
||||||
<%= yield %>
|
<%= yield %>
|
||||||
|
<%= call_hook :view_layouts_base_content %>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="ajax-indicator" style="display:none;"><span><%= l(:label_loading) %></span></div>
|
<div id="ajax-indicator" style="display:none;"><span><%= l(:label_loading) %></span></div>
|
||||||
|
|
||||||
<div id="footer">
|
<div id="footer">
|
||||||
Powered by <%= link_to Redmine::Info.app_name, Redmine::Info.url %> © 2006-2008 Jean-Philippe Lang
|
Powered by <%= link_to Redmine::Info.app_name, Redmine::Info.url %> © 2006-2009 Jean-Philippe Lang
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<%= call_hook :view_layouts_base_body_bottom %>
|
<%= call_hook :view_layouts_base_body_bottom %>
|
||||||
|
|||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<p><%= l(:notice_account_activated) %></p>
|
||||||
|
<p><%= l(:label_login) %>: <%= link_to @login_url, @login_url %></p>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<%= l(:notice_account_activated) %>
|
||||||
|
<%= l(:label_login) %>: <%= @login_url %>
|
||||||
@@ -6,17 +6,12 @@ body {
|
|||||||
font-size: 0.8em;
|
font-size: 0.8em;
|
||||||
color:#484848;
|
color:#484848;
|
||||||
}
|
}
|
||||||
h1 {
|
h1, h2, h3 { font-family: "Trebuchet MS", Verdana, sans-serif; margin: 0px; }
|
||||||
font-family: "Trebuchet MS", Verdana, sans-serif;
|
h1 { font-size: 1.2em; }
|
||||||
font-size: 1.2em;
|
h2, h3 { font-size: 1.1em; }
|
||||||
margin: 0px;
|
a, a:link, a:visited { color: #2A5685;}
|
||||||
}
|
a:hover, a:active { color: #c61a1a; }
|
||||||
a, a:link, a:visited {
|
a.wiki-anchor { display: none; }
|
||||||
color: #2A5685;
|
|
||||||
}
|
|
||||||
a:hover, a:active {
|
|
||||||
color: #c61a1a;
|
|
||||||
}
|
|
||||||
hr {
|
hr {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 1px;
|
height: 1px;
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
<div class="wiki">
|
<div class="wiki">
|
||||||
<%= textilizable(@topic.content, :attachments => @topic.attachments) %>
|
<%= textilizable(@topic.content, :attachments => @topic.attachments) %>
|
||||||
</div>
|
</div>
|
||||||
<%= link_to_attachments @topic.attachments, :no_author => true %>
|
<%= link_to_attachments @topic, :author => false %>
|
||||||
</div>
|
</div>
|
||||||
<br />
|
<br />
|
||||||
|
|
||||||
@@ -31,7 +31,7 @@
|
|||||||
<div class="message reply">
|
<div class="message reply">
|
||||||
<h4><%=h message.subject %> - <%= authoring message.created_on, message.author %></h4>
|
<h4><%=h message.subject %> - <%= authoring message.created_on, message.author %></h4>
|
||||||
<div class="wiki"><%= textilizable message, :content, :attachments => message.attachments %></div>
|
<div class="wiki"><%= textilizable message, :content, :attachments => message.attachments %></div>
|
||||||
<%= link_to_attachments message.attachments, :no_author => true %>
|
<%= link_to_attachments message, :author => false %>
|
||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|||||||
@@ -38,7 +38,7 @@
|
|||||||
<div class="box tabular">
|
<div class="box tabular">
|
||||||
<% fields_for :pref, @user.pref, :builder => TabularFormBuilder, :lang => current_language do |pref_fields| %>
|
<% fields_for :pref, @user.pref, :builder => TabularFormBuilder, :lang => current_language do |pref_fields| %>
|
||||||
<p><%= pref_fields.check_box :hide_mail %></p>
|
<p><%= pref_fields.check_box :hide_mail %></p>
|
||||||
<p><%= pref_fields.select :time_zone, TimeZone.all.collect {|z| [ z.to_s, z.name ]}, :include_blank => true %></p>
|
<p><%= pref_fields.select :time_zone, ActiveSupport::TimeZone.all.collect {|z| [ z.to_s, z.name ]}, :include_blank => true %></p>
|
||||||
<p><%= pref_fields.select :comments_sorting, [[l(:label_chronological_order), 'asc'], [l(:label_reverse_chronological_order), 'desc']] %></p>
|
<p><%= pref_fields.select :comments_sorting, [[l(:label_chronological_order), 'asc'], [l(:label_reverse_chronological_order), 'desc']] %></p>
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -47,6 +47,6 @@ entries_by_day = entries.group_by(&:spent_on)
|
|||||||
</tr>
|
</tr>
|
||||||
<% end -%>
|
<% end -%>
|
||||||
<% end -%>
|
<% end -%>
|
||||||
</tbdoy>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
<p><%= f.text_area :description, :rows => 5, :class => 'wiki-edit' %></p>
|
<p><%= f.text_area :description, :rows => 5, :class => 'wiki-edit' %></p>
|
||||||
<p><%= f.text_field :identifier, :required => true, :disabled => @project.identifier_frozen? %>
|
<p><%= f.text_field :identifier, :required => true, :disabled => @project.identifier_frozen? %>
|
||||||
<% unless @project.identifier_frozen? %>
|
<% unless @project.identifier_frozen? %>
|
||||||
<br /><em><%= l(:text_length_between, 3, 20) %> <%= l(:text_project_identifier_info) %></em>
|
<br /><em><%= l(:text_length_between, 2, 20) %> <%= l(:text_project_identifier_info) %></em>
|
||||||
<% end %></p>
|
<% end %></p>
|
||||||
<p><%= f.text_field :homepage, :size => 60 %></p>
|
<p><%= f.text_field :homepage, :size => 60 %></p>
|
||||||
<p><%= f.check_box :is_public %></p>
|
<p><%= f.check_box :is_public %></p>
|
||||||
|
|||||||
@@ -46,7 +46,9 @@
|
|||||||
<% form_tag({}, :method => :get) do %>
|
<% form_tag({}, :method => :get) do %>
|
||||||
<h3><%= l(:label_activity) %></h3>
|
<h3><%= l(:label_activity) %></h3>
|
||||||
<p><% @activity.event_types.each do |t| %>
|
<p><% @activity.event_types.each do |t| %>
|
||||||
<label><%= check_box_tag "show_#{t}", 1, @activity.scope.include?(t) %> <%= l("label_#{t.singularize}_plural")%></label><br />
|
<%= check_box_tag "show_#{t}", 1, @activity.scope.include?(t) %>
|
||||||
|
<%= link_to(l("label_#{t.singularize}_plural"), {"show_#{t}" => 1, :user_id => params[:user_id]})%>
|
||||||
|
<br />
|
||||||
<% end %></p>
|
<% end %></p>
|
||||||
<% if @project && @project.active_children.any? %>
|
<% if @project && @project.active_children.any? %>
|
||||||
<p><label><%= check_box_tag 'with_subprojects', 1, @with_subprojects %> <%=l(:label_subproject_plural)%></label></p>
|
<p><label><%= check_box_tag 'with_subprojects', 1, @with_subprojects %> <%=l(:label_subproject_plural)%></label></p>
|
||||||
|
|||||||
@@ -4,10 +4,13 @@
|
|||||||
<div class="box">
|
<div class="box">
|
||||||
<% form_tag({ :action => 'add_file', :id => @project }, :multipart => true, :class => "tabular") do %>
|
<% form_tag({ :action => 'add_file', :id => @project }, :multipart => true, :class => "tabular") do %>
|
||||||
|
|
||||||
<p><label for="version_id"><%=l(:field_version)%> <span class="required">*</span></label>
|
<% if @versions.any? %>
|
||||||
<%= select_tag "version_id", options_from_collection_for_select(@versions, "id", "name") %></p>
|
<p><label for="version_id"><%=l(:field_version)%></label>
|
||||||
|
<%= select_tag "version_id", content_tag('option', '') +
|
||||||
|
options_from_collection_for_select(@versions, "id", "name") %></p>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
<p><label><%=l(:label_attachment_plural)%></label><%= render :partial => 'attachments/form' %></p>
|
<p><label><%=l(:label_attachment_plural)%></label><%= render :partial => 'attachments/form' %></p>
|
||||||
</div>
|
</div>
|
||||||
<%= submit_tag l(:button_add) %>
|
<%= submit_tag l(:button_add) %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|||||||
@@ -4,39 +4,41 @@
|
|||||||
|
|
||||||
<h2><%=l(:label_attachment_plural)%></h2>
|
<h2><%=l(:label_attachment_plural)%></h2>
|
||||||
|
|
||||||
<% delete_allowed = authorize_for('versions', 'destroy_file') %>
|
<% delete_allowed = User.current.allowed_to?(:manage_files, @project) %>
|
||||||
|
|
||||||
<table class="list">
|
<table class="list files">
|
||||||
<thead><tr>
|
<thead><tr>
|
||||||
<th><%=l(:field_version)%></th>
|
<%= sort_header_tag('filename', :caption => l(:field_filename)) %>
|
||||||
<%= sort_header_tag("#{Attachment.table_name}.filename", :caption => l(:field_filename)) %>
|
<%= sort_header_tag('created_on', :caption => l(:label_date), :default_order => 'desc') %>
|
||||||
<%= sort_header_tag("#{Attachment.table_name}.created_on", :caption => l(:label_date), :default_order => 'desc') %>
|
<%= sort_header_tag('size', :caption => l(:field_filesize), :default_order => 'desc') %>
|
||||||
<%= sort_header_tag("#{Attachment.table_name}.filesize", :caption => l(:field_filesize), :default_order => 'desc') %>
|
<%= sort_header_tag('downloads', :caption => l(:label_downloads_abbr), :default_order => 'desc') %>
|
||||||
<%= sort_header_tag("#{Attachment.table_name}.downloads", :caption => l(:label_downloads_abbr), :default_order => 'desc') %>
|
|
||||||
<th>MD5</th>
|
<th>MD5</th>
|
||||||
<% if delete_allowed %><th></th><% end %>
|
<th></th>
|
||||||
</tr></thead>
|
</tr></thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<% for version in @versions %>
|
<% @containers.each do |container| %>
|
||||||
<% unless version.attachments.empty? %>
|
<% next if container.attachments.empty? -%>
|
||||||
<tr><th colspan="7" align="left"><span class="icon icon-package"><b><%= version.name %></b></span></th></tr>
|
<% if container.is_a?(Version) -%>
|
||||||
<% for file in version.attachments %>
|
<tr>
|
||||||
<tr class="<%= cycle("odd", "even") %>">
|
<th colspan="6" align="left">
|
||||||
<td></td>
|
<%= link_to(h(container), {:controller => 'versions', :action => 'show', :id => container}, :class => "icon icon-package") %>
|
||||||
<td><%= link_to_attachment file, :download => true, :title => file.description %></td>
|
</th>
|
||||||
<td align="center"><%= format_time(file.created_on) %></td>
|
</tr>
|
||||||
<td align="center"><%= number_to_human_size(file.filesize) %></td>
|
<% end -%>
|
||||||
<td align="center"><%= file.downloads %></td>
|
<% container.attachments.each do |file| %>
|
||||||
<td align="center"><small><%= file.digest %></small></td>
|
<tr class="file <%= cycle("odd", "even") %>">
|
||||||
<% if delete_allowed %>
|
<td class="filename"><%= link_to_attachment file, :download => true, :title => file.description %></td>
|
||||||
|
<td class="created_on"><%= format_time(file.created_on) %></td>
|
||||||
|
<td class="filesize"><%= number_to_human_size(file.filesize) %></td>
|
||||||
|
<td class="downloads"><%= file.downloads %></td>
|
||||||
|
<td class="digest"><%= file.digest %></td>
|
||||||
<td align="center">
|
<td align="center">
|
||||||
<%= link_to_if_authorized image_tag('delete.png'), {:controller => 'versions', :action => 'destroy_file', :id => version, :attachment_id => file}, :confirm => l(:text_are_you_sure), :method => :post %>
|
<%= link_to(image_tag('delete.png'), {:controller => 'attachments', :action => 'destroy', :id => file},
|
||||||
|
:confirm => l(:text_are_you_sure), :method => :post) if delete_allowed %>
|
||||||
</td>
|
</td>
|
||||||
<% end %>
|
|
||||||
</tr>
|
</tr>
|
||||||
<% end
|
<% end
|
||||||
reset_cycle %>
|
reset_cycle %>
|
||||||
<% end %>
|
|
||||||
<% end %>
|
<% end %>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
<td><%= link_to(version.wiki_page_title, :controller => 'wiki', :page => Wiki.titleize(version.wiki_page_title)) unless version.wiki_page_title.blank? || @project.wiki.nil? %></td>
|
<td><%= link_to(version.wiki_page_title, :controller => 'wiki', :page => Wiki.titleize(version.wiki_page_title)) unless version.wiki_page_title.blank? || @project.wiki.nil? %></td>
|
||||||
<td align="center"><%= link_to_if_authorized l(:button_edit), { :controller => 'versions', :action => 'edit', :id => version }, :class => 'icon icon-edit' %></td>
|
<td align="center"><%= link_to_if_authorized l(:button_edit), { :controller => 'versions', :action => 'edit', :id => version }, :class => 'icon icon-edit' %></td>
|
||||||
<td align="center"><%= link_to_if_authorized l(:button_delete), {:controller => 'versions', :action => 'destroy', :id => version}, :confirm => l(:text_are_you_sure), :method => :post, :class => 'icon icon-del' %></td>
|
<td align="center"><%= link_to_if_authorized l(:button_delete), {:controller => 'versions', :action => 'destroy', :id => version}, :confirm => l(:text_are_you_sure), :method => :post, :class => 'icon icon-del' %></td>
|
||||||
</td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<% end; reset_cycle %>
|
<% end; reset_cycle %>
|
||||||
</tbody>
|
</tbody>
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
<p>
|
||||||
|
<% if @repository.supports_cat? %>
|
||||||
|
<%= link_to_if action_name != 'entry', l(:button_view), {:action => 'entry', :id => @project, :path => to_path_param(@path), :rev => @rev } %> |
|
||||||
|
<% end %>
|
||||||
|
<% if @repository.supports_annotate? %>
|
||||||
|
<%= link_to_if action_name != 'annotate', l(:button_annotate), {:action => 'annotate', :id => @project, :path => to_path_param(@path), :rev => @rev } %> |
|
||||||
|
<% end %>
|
||||||
|
<%= link_to(l(:button_download), {:action => 'entry', :id => @project, :path => to_path_param(@path), :rev => @rev, :format => 'raw' }) if @repository.supports_cat? %>
|
||||||
|
<%= "(#{number_to_human_size(@entry.size)})" if @entry.size %>
|
||||||
|
</p>
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
<h2><%= render :partial => 'navigation', :locals => { :path => @path, :kind => 'file', :revision => @rev } %></h2>
|
<h2><%= render :partial => 'navigation', :locals => { :path => @path, :kind => 'file', :revision => @rev } %></h2>
|
||||||
|
|
||||||
|
<p><%= render :partial => 'link_to_functions' %></p>
|
||||||
|
|
||||||
<% colors = Hash.new {|k,v| k[v] = (k.size % 12) } %>
|
<% colors = Hash.new {|k,v| k[v] = (k.size % 12) } %>
|
||||||
|
|
||||||
<div class="autoscroll">
|
<div class="autoscroll">
|
||||||
@@ -9,7 +11,7 @@
|
|||||||
<% syntax_highlight(@path, to_utf8(@annotate.content)).each_line do |line| %>
|
<% syntax_highlight(@path, to_utf8(@annotate.content)).each_line do |line| %>
|
||||||
<% revision = @annotate.revisions[line_num-1] %>
|
<% revision = @annotate.revisions[line_num-1] %>
|
||||||
<tr class="bloc-<%= revision.nil? ? 0 : colors[revision.identifier || revision.revision] %>">
|
<tr class="bloc-<%= revision.nil? ? 0 : colors[revision.identifier || revision.revision] %>">
|
||||||
<th class="line-num"><%= line_num %></th>
|
<th class="line-num" id="L<%= line_num %>"><a href="#L<%= line_num %>"><%= line_num %></a></th>
|
||||||
<td class="revision">
|
<td class="revision">
|
||||||
<%= (revision.identifier ? link_to(format_revision(revision.identifier), :action => 'revision', :id => @project, :rev => revision.identifier) : format_revision(revision.revision)) if revision %></td>
|
<%= (revision.identifier ? link_to(format_revision(revision.identifier), :action => 'revision', :id => @project, :rev => revision.identifier) : format_revision(revision.revision)) if revision %></td>
|
||||||
<td class="author"><%= h(revision.author.to_s.split('<').first) if revision %></td>
|
<td class="author"><%= h(revision.author.to_s.split('<').first) if revision %></td>
|
||||||
|
|||||||
@@ -1,15 +1,6 @@
|
|||||||
<h2><%= render :partial => 'navigation', :locals => { :path => @path, :kind => (@entry ? @entry.kind : nil), :revision => @rev } %></h2>
|
<h2><%= render :partial => 'navigation', :locals => { :path => @path, :kind => (@entry ? @entry.kind : nil), :revision => @rev } %></h2>
|
||||||
|
|
||||||
<p>
|
<p><%= render :partial => 'link_to_functions' %></p>
|
||||||
<% if @repository.supports_cat? %>
|
|
||||||
<%= link_to l(:button_view), {:action => 'entry', :id => @project, :path => to_path_param(@path), :rev => @rev } %> |
|
|
||||||
<% end %>
|
|
||||||
<% if @repository.supports_annotate? %>
|
|
||||||
<%= link_to l(:button_annotate), {:action => 'annotate', :id => @project, :path => to_path_param(@path), :rev => @rev } %> |
|
|
||||||
<% end %>
|
|
||||||
<%= link_to(l(:button_download), {:action => 'entry', :id => @project, :path => to_path_param(@path), :rev => @rev, :format => 'raw' }) if @repository.supports_cat? %>
|
|
||||||
<%= "(#{number_to_human_size(@entry.size)})" if @entry.size %>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<%= render_properties(@properties) %>
|
<%= render_properties(@properties) %>
|
||||||
|
|
||||||
|
|||||||
@@ -15,11 +15,16 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
|
<% i = 0 -%>
|
||||||
<% @committers.each do |committer, user_id| -%>
|
<% @committers.each do |committer, user_id| -%>
|
||||||
<tr class="<%= cycle 'odd', 'even' %>">
|
<tr class="<%= cycle 'odd', 'even' %>">
|
||||||
<td><%=h committer %></td>
|
<td><%=h committer %></td>
|
||||||
<td><%= select_tag "committers[#{committer}]", content_tag('option', "-- #{l :actionview_instancetag_blank_option} --", :value => '') + options_from_collection_for_select(@users, 'id', 'name', user_id.to_i) %></td>
|
<td>
|
||||||
|
<%= hidden_field_tag "committers[#{i}][]", committer %>
|
||||||
|
<%= select_tag "committers[#{i}][]", content_tag('option', "-- #{l :actionview_instancetag_blank_option} --", :value => '') + options_from_collection_for_select(@users, 'id', 'name', user_id.to_i) %>
|
||||||
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<% i += 1 -%>
|
||||||
<% end -%>
|
<% end -%>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
<h2><%= render :partial => 'navigation', :locals => { :path => @path, :kind => 'file', :revision => @rev } %></h2>
|
<h2><%= render :partial => 'navigation', :locals => { :path => @path, :kind => 'file', :revision => @rev } %></h2>
|
||||||
|
|
||||||
|
<p><%= render :partial => 'link_to_functions' %></p>
|
||||||
|
|
||||||
<%= render :partial => 'common/file', :locals => {:filename => @path, :content => @content} %>
|
<%= render :partial => 'common/file', :locals => {:filename => @path, :content => @content} %>
|
||||||
|
|
||||||
<% content_for :header_tags do %>
|
<% content_for :header_tags do %>
|
||||||
|
|||||||
@@ -48,6 +48,9 @@
|
|||||||
<p><label><%= l(:setting_feeds_limit) %></label>
|
<p><label><%= l(:setting_feeds_limit) %></label>
|
||||||
<%= text_field_tag 'settings[feeds_limit]', Setting.feeds_limit, :size => 6 %></p>
|
<%= text_field_tag 'settings[feeds_limit]', Setting.feeds_limit, :size => 6 %></p>
|
||||||
|
|
||||||
|
<p><label><%= l(:setting_diff_max_lines_displayed) %></label>
|
||||||
|
<%= text_field_tag 'settings[diff_max_lines_displayed]', Setting.diff_max_lines_displayed, :size => 6 %></p>
|
||||||
|
|
||||||
<p><label><%= l(:setting_gravatar_enabled) %></label>
|
<p><label><%= l(:setting_gravatar_enabled) %></label>
|
||||||
<%= check_box_tag 'settings[gravatar_enabled]', 1, Setting.gravatar_enabled? %><%= hidden_field_tag 'settings[gravatar_enabled]', 0 %></p>
|
<%= check_box_tag 'settings[gravatar_enabled]', 1, Setting.gravatar_enabled? %><%= hidden_field_tag 'settings[gravatar_enabled]', 0 %></p>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -11,12 +11,12 @@
|
|||||||
<%= text_field_tag 'settings[issues_export_limit]', Setting.issues_export_limit, :size => 6 %></p>
|
<%= text_field_tag 'settings[issues_export_limit]', Setting.issues_export_limit, :size => 6 %></p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<fieldset class="box"><legend><%= l(:setting_issue_list_default_columns) %></legend>
|
<fieldset class="box settings"><legend><%= l(:setting_issue_list_default_columns) %></legend>
|
||||||
<%= hidden_field_tag 'settings[issue_list_default_columns][]', '' %>
|
<%= hidden_field_tag 'settings[issue_list_default_columns][]', '' %>
|
||||||
<p><% Query.new.available_columns.each do |column| %>
|
<% Query.new.available_columns.each do |column| %>
|
||||||
<label><%= check_box_tag 'settings[issue_list_default_columns][]', column.name, Setting.issue_list_default_columns.include?(column.name.to_s) %>
|
<label><%= check_box_tag 'settings[issue_list_default_columns][]', column.name, Setting.issue_list_default_columns.include?(column.name.to_s) %>
|
||||||
<%= column.caption %></label>
|
<%= column.caption %></label><br />
|
||||||
<% end %></p>
|
<% end %>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
|
|
||||||
<%= submit_tag l(:button_save) %>
|
<%= submit_tag l(:button_save) %>
|
||||||
|
|||||||
@@ -2,10 +2,10 @@
|
|||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<%= sort_header_tag('spent_on', :caption => l(:label_date), :default_order => 'desc') %>
|
<%= sort_header_tag('spent_on', :caption => l(:label_date), :default_order => 'desc') %>
|
||||||
<%= sort_header_tag('user_id', :caption => l(:label_member)) %>
|
<%= sort_header_tag('user', :caption => l(:label_member)) %>
|
||||||
<%= sort_header_tag('activity_id', :caption => l(:label_activity)) %>
|
<%= sort_header_tag('activity', :caption => l(:label_activity)) %>
|
||||||
<%= sort_header_tag("#{Project.table_name}.name", :caption => l(:label_project)) %>
|
<%= sort_header_tag('project', :caption => l(:label_project)) %>
|
||||||
<%= sort_header_tag('issue_id', :caption => l(:label_issue), :default_order => 'desc') %>
|
<%= sort_header_tag('issue', :caption => l(:label_issue), :default_order => 'desc') %>
|
||||||
<th><%= l(:field_comments) %></th>
|
<th><%= l(:field_comments) %></th>
|
||||||
<%= sort_header_tag('hours', :caption => l(:field_hours)) %>
|
<%= sort_header_tag('hours', :caption => l(:field_hours)) %>
|
||||||
<th></th>
|
<th></th>
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
<th class="line-num"><%= line_num %></th>
|
<th class="line-num"><%= line_num %></th>
|
||||||
<td class="revision"><%= link_to line[0], :controller => 'wiki', :action => 'index', :id => @project, :page => @page.title, :version => line[0] %></td>
|
<td class="revision"><%= link_to line[0], :controller => 'wiki', :action => 'index', :id => @project, :page => @page.title, :version => line[0] %></td>
|
||||||
<td class="author"><%= h(line[1]) %></td>
|
<td class="author"><%= h(line[1]) %></td>
|
||||||
<td class="line-code"><pre><%= line[2] %></pre></td>
|
<td class="line-code"><pre><%=h line[2] %></pre></td>
|
||||||
</tr>
|
</tr>
|
||||||
<% line_num += 1 %>
|
<% line_num += 1 %>
|
||||||
<% end -%>
|
<% end -%>
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||||
<style>
|
<style>
|
||||||
body { font:80% Verdana,Tahoma,Arial,sans-serif; }
|
body { font:80% Verdana,Tahoma,Arial,sans-serif; }
|
||||||
h1, h2, h3, h4 { font-family: Trebuchet MS,Georgia,"Times New Roman",serif; }
|
h1, h2, h3, h4 { font-family: "Trebuchet MS",Georgia,"Times New Roman",serif; }
|
||||||
ul.toc { padding: 4px; margin-left: 0; }
|
ul.toc { padding: 4px; margin-left: 0; }
|
||||||
ul.toc li { list-style-type:none; }
|
ul.toc li { list-style-type:none; }
|
||||||
ul.toc li.heading2 { margin-left: 1em; }
|
ul.toc li.heading2 { margin-left: 1em; }
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||||
<style>
|
<style>
|
||||||
body { font:80% Verdana,Tahoma,Arial,sans-serif; }
|
body { font:80% Verdana,Tahoma,Arial,sans-serif; }
|
||||||
h1, h2, h3, h4 { font-family: Trebuchet MS,Georgia,"Times New Roman",serif; }
|
h1, h2, h3, h4 { font-family: "Trebuchet MS",Georgia,"Times New Roman",serif; }
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
|
|
||||||
<%= render(:partial => "wiki/content", :locals => {:content => @content}) %>
|
<%= render(:partial => "wiki/content", :locals => {:content => @content}) %>
|
||||||
|
|
||||||
<%= link_to_attachments @page.attachments, :delete_url => ((@editable && authorize_for('wiki', 'destroy_attachment')) ? {:controller => 'wiki', :action => 'destroy_attachment', :page => @page.title} : nil) %>
|
<%= link_to_attachments @page %>
|
||||||
|
|
||||||
<% if @editable && authorize_for('wiki', 'add_attachment') %>
|
<% if @editable && authorize_for('wiki', 'add_attachment') %>
|
||||||
<p><%= link_to l(:label_attachment_new), {}, :onclick => "Element.show('add_attachment_form'); Element.hide(this); Element.scrollTo('add_attachment_form'); return false;",
|
<p><%= link_to l(:label_attachment_new), {}, :onclick => "Element.show('add_attachment_form'); Element.hide(this); Element.scrollTo('add_attachment_form'); return false;",
|
||||||
|
|||||||
@@ -61,6 +61,9 @@ protocol:
|
|||||||
feeds_limit:
|
feeds_limit:
|
||||||
format: int
|
format: int
|
||||||
default: 15
|
default: 15
|
||||||
|
diff_max_lines_displayed:
|
||||||
|
format: int
|
||||||
|
default: 1500
|
||||||
enabled_scm:
|
enabled_scm:
|
||||||
serialized: true
|
serialized: true
|
||||||
default:
|
default:
|
||||||
|
|||||||
@@ -2,9 +2,10 @@ class SetTopicAuthorsAsWatchers < ActiveRecord::Migration
|
|||||||
def self.up
|
def self.up
|
||||||
# Sets active users who created/replied a topic as watchers of the topic
|
# Sets active users who created/replied a topic as watchers of the topic
|
||||||
# so that the new watch functionality at topic level doesn't affect notifications behaviour
|
# so that the new watch functionality at topic level doesn't affect notifications behaviour
|
||||||
Message.connection.execute("INSERT INTO watchers (watchable_type, watchable_id, user_id)" +
|
Message.connection.execute("INSERT INTO #{Watcher.table_name} (watchable_type, watchable_id, user_id)" +
|
||||||
" SELECT DISTINCT 'Message', COALESCE(messages.parent_id, messages.id), messages.author_id FROM messages, users" +
|
" SELECT DISTINCT 'Message', COALESCE(m.parent_id, m.id), m.author_id" +
|
||||||
" WHERE messages.author_id = users.id AND users.status = 1")
|
" FROM #{Message.table_name} m, #{User.table_name} u" +
|
||||||
|
" WHERE m.author_id = u.id AND u.status = 1")
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.down
|
def self.down
|
||||||
|
|||||||
+68
-1
@@ -1,10 +1,77 @@
|
|||||||
== Redmine changelog
|
== Redmine changelog
|
||||||
|
|
||||||
Redmine - project management software
|
Redmine - project management software
|
||||||
Copyright (C) 2006-2008 Jean-Philippe Lang
|
Copyright (C) 2006-2009 Jean-Philippe Lang
|
||||||
http://www.redmine.org/
|
http://www.redmine.org/
|
||||||
|
|
||||||
|
|
||||||
|
== 2009-03-07 v0.8.2
|
||||||
|
|
||||||
|
* Send an email to the user when an administrator activates a registered user
|
||||||
|
* Strip keywords from received email body
|
||||||
|
* Footer updated to 2009
|
||||||
|
* Show RSS-link even when no issues is found
|
||||||
|
* One click filter action in activity view
|
||||||
|
* Clickable/linkable line #'s while browsing the repo or viewing a file
|
||||||
|
* Links to versions on files list
|
||||||
|
* Added request and controller objects to the hooks by default
|
||||||
|
* Fixed: exporting an issue with attachments to PDF raises an error
|
||||||
|
* Fixed: "too few arguments" error may occur on activerecord error translation
|
||||||
|
* Fixed: "Default columns Displayed on the Issues list" setting is not easy to read
|
||||||
|
* Fixed: visited links to closed tickets are not striked through with IE6
|
||||||
|
* Fixed: MailHandler#plain_text_body returns nil if there was nothing to strip
|
||||||
|
* Fixed: MailHandler raises an error when processing an email without From header
|
||||||
|
|
||||||
|
|
||||||
|
== 2009-02-15 v0.8.1
|
||||||
|
|
||||||
|
* Select watchers on new issue form
|
||||||
|
* Issue description is no longer a required field
|
||||||
|
* Files module: ability to add files without version
|
||||||
|
* Jump to the current tab when using the project quick-jump combo
|
||||||
|
* Display a warning if some attachments were not saved
|
||||||
|
* Import custom fields values from emails on issue creation
|
||||||
|
* Show view/annotate/download links on entry and annotate views
|
||||||
|
* Admin Info Screen: Display if plugin assets directory is writable
|
||||||
|
* Adds a 'Create and continue' button on the new issue form
|
||||||
|
* IMAP: add options to move received emails
|
||||||
|
* Do not show Category field when categories are not defined
|
||||||
|
* Lower the project identifier limit to a minimum of two characters
|
||||||
|
* Add "closed" html class to closed entries in issue list
|
||||||
|
* Fixed: broken redirect URL on login failure
|
||||||
|
* Fixed: Deleted files are shown when using Darcs
|
||||||
|
* Fixed: Darcs adapter works on Win32 only
|
||||||
|
* Fixed: syntax highlight doesn't appear in new ticket preview
|
||||||
|
* Fixed: email notification for changes I make still occurs when running Repository.fetch_changesets
|
||||||
|
* Fixed: no error is raised when entering invalid hours on the issue update form
|
||||||
|
* Fixed: Details time log report CSV export doesn't honour date format from settings
|
||||||
|
* Fixed: invalid css classes on issue details
|
||||||
|
* Fixed: Trac importer creates duplicate custom values
|
||||||
|
* Fixed: inline attached image should not match partial filename
|
||||||
|
|
||||||
|
|
||||||
|
== 2008-12-30 v0.8.0
|
||||||
|
|
||||||
|
* Setting added in order to limit the number of diff lines that should be displayed
|
||||||
|
* Makes logged-in username in topbar linking to
|
||||||
|
* Mail handler: strip tags when receiving a html-only email
|
||||||
|
* Mail handler: add watchers before sending notification
|
||||||
|
* Adds a css class (overdue) to overdue issues on issue lists and detail views
|
||||||
|
* Fixed: project activity truncated after viewing user's activity
|
||||||
|
* Fixed: email address entered for password recovery shouldn't be case-sensitive
|
||||||
|
* Fixed: default flag removed when editing a default enumeration
|
||||||
|
* Fixed: default category ignored when adding a document
|
||||||
|
* Fixed: error on repository user mapping when a repository username is blank
|
||||||
|
* Fixed: Firefox cuts off large diffs
|
||||||
|
* Fixed: CVS browser should not show dead revisions (deleted files)
|
||||||
|
* Fixed: escape double-quotes in image titles
|
||||||
|
* Fixed: escape textarea content when editing a issue note
|
||||||
|
* Fixed: JS error on context menu with IE
|
||||||
|
* Fixed: bold syntax around single character in series doesn't work
|
||||||
|
* Fixed several XSS vulnerabilities
|
||||||
|
* Fixed a SQL injection vulnerability
|
||||||
|
|
||||||
|
|
||||||
== 2008-12-07 v0.8.0-rc1
|
== 2008-12-07 v0.8.0-rc1
|
||||||
|
|
||||||
* Wiki page protection
|
* Wiki page protection
|
||||||
|
|||||||
+1
-1
@@ -7,7 +7,7 @@ http://www.redmine.org/
|
|||||||
|
|
||||||
== Requirements
|
== Requirements
|
||||||
|
|
||||||
* Ruby on Rails 2.1
|
* Ruby on Rails 2.1.2
|
||||||
* A database:
|
* A database:
|
||||||
* MySQL (tested with MySQL 5)
|
* MySQL (tested with MySQL 5)
|
||||||
* PostgreSQL (tested with PostgreSQL 8.1)
|
* PostgreSQL (tested with PostgreSQL 8.1)
|
||||||
|
|||||||
@@ -694,3 +694,8 @@ permission_edit_own_messages: Edit own messages
|
|||||||
permission_delete_own_messages: Delete own messages
|
permission_delete_own_messages: Delete own messages
|
||||||
label_user_activity: "%s's activity"
|
label_user_activity: "%s's activity"
|
||||||
label_updated_time_by: Updated by %s %s ago
|
label_updated_time_by: Updated by %s %s ago
|
||||||
|
text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
|
||||||
|
setting_diff_max_lines_displayed: Max number of diff lines displayed
|
||||||
|
text_plugin_assets_writable: Plugin assets directory writable
|
||||||
|
warning_attachments_not_saved: "%d file(s) could not be saved."
|
||||||
|
button_create_and_continue: Create and continue
|
||||||
|
|||||||
@@ -695,3 +695,8 @@ permission_edit_own_messages: Edit own messages
|
|||||||
permission_delete_own_messages: Delete own messages
|
permission_delete_own_messages: Delete own messages
|
||||||
label_user_activity: "%s's activity"
|
label_user_activity: "%s's activity"
|
||||||
label_updated_time_by: Updated by %s %s ago
|
label_updated_time_by: Updated by %s %s ago
|
||||||
|
text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
|
||||||
|
setting_diff_max_lines_displayed: Max number of diff lines displayed
|
||||||
|
text_plugin_assets_writable: Plugin assets directory writable
|
||||||
|
warning_attachments_not_saved: "%d file(s) could not be saved."
|
||||||
|
button_create_and_continue: Create and continue
|
||||||
|
|||||||
@@ -699,3 +699,8 @@ permission_edit_own_messages: Edit own messages
|
|||||||
permission_delete_own_messages: Delete own messages
|
permission_delete_own_messages: Delete own messages
|
||||||
label_user_activity: "%s's activity"
|
label_user_activity: "%s's activity"
|
||||||
label_updated_time_by: Updated by %s %s ago
|
label_updated_time_by: Updated by %s %s ago
|
||||||
|
text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
|
||||||
|
setting_diff_max_lines_displayed: Max number of diff lines displayed
|
||||||
|
text_plugin_assets_writable: Plugin assets directory writable
|
||||||
|
warning_attachments_not_saved: "%d file(s) could not be saved."
|
||||||
|
button_create_and_continue: Create and continue
|
||||||
|
|||||||
@@ -695,3 +695,8 @@ permission_edit_own_messages: Edit own messages
|
|||||||
permission_delete_own_messages: Delete own messages
|
permission_delete_own_messages: Delete own messages
|
||||||
label_user_activity: "%s's activity"
|
label_user_activity: "%s's activity"
|
||||||
label_updated_time_by: Updated by %s %s ago
|
label_updated_time_by: Updated by %s %s ago
|
||||||
|
text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
|
||||||
|
setting_diff_max_lines_displayed: Max number of diff lines displayed
|
||||||
|
text_plugin_assets_writable: Plugin assets directory writable
|
||||||
|
warning_attachments_not_saved: "%d file(s) could not be saved."
|
||||||
|
button_create_and_continue: Create and continue
|
||||||
|
|||||||
+7
-2
@@ -223,6 +223,7 @@ setting_mail_handler_api_enabled: Abruf eingehender E-Mails aktivieren
|
|||||||
setting_mail_handler_api_key: API-Schlüssel
|
setting_mail_handler_api_key: API-Schlüssel
|
||||||
setting_sequential_project_identifiers: Fortlaufende Projektkennungen generieren
|
setting_sequential_project_identifiers: Fortlaufende Projektkennungen generieren
|
||||||
setting_gravatar_enabled: Gravatar Benutzerbilder benutzen
|
setting_gravatar_enabled: Gravatar Benutzerbilder benutzen
|
||||||
|
setting_diff_max_lines_displayed: Maximale Anzahl anzuzeigender Diff-Zeilen
|
||||||
|
|
||||||
permission_edit_project: Projekt bearbeiten
|
permission_edit_project: Projekt bearbeiten
|
||||||
permission_select_project_modules: Projektmodule auswählen
|
permission_select_project_modules: Projektmodule auswählen
|
||||||
@@ -344,6 +345,7 @@ label_last_updates_plural: %d zuletzt aktualisierten
|
|||||||
label_registered_on: Angemeldet am
|
label_registered_on: Angemeldet am
|
||||||
label_activity: Aktivität
|
label_activity: Aktivität
|
||||||
label_overall_activity: Aktivität aller Projekte anzeigen
|
label_overall_activity: Aktivität aller Projekte anzeigen
|
||||||
|
label_user_activity: "Aktivität von %s"
|
||||||
label_new: Neu
|
label_new: Neu
|
||||||
label_logged_as: Angemeldet als
|
label_logged_as: Angemeldet als
|
||||||
label_environment: Environment
|
label_environment: Environment
|
||||||
@@ -543,6 +545,7 @@ label_send_test_email: Test-E-Mail senden
|
|||||||
label_feeds_access_key_created_on: Atom-Zugriffsschlüssel vor %s erstellt
|
label_feeds_access_key_created_on: Atom-Zugriffsschlüssel vor %s erstellt
|
||||||
label_module_plural: Module
|
label_module_plural: Module
|
||||||
label_added_time_by: Von %s vor %s hinzugefügt
|
label_added_time_by: Von %s vor %s hinzugefügt
|
||||||
|
label_updated_time_by: Von %s vor %s aktualisiert
|
||||||
label_updated_time: Vor %s aktualisiert
|
label_updated_time: Vor %s aktualisiert
|
||||||
label_jump_to_a_project: Zu einem Projekt springen...
|
label_jump_to_a_project: Zu einem Projekt springen...
|
||||||
label_file_plural: Dateien
|
label_file_plural: Dateien
|
||||||
@@ -668,6 +671,7 @@ text_enumeration_destroy_question: '%d Objekte sind diesem Wert zugeordnet.'
|
|||||||
text_enumeration_category_reassign_to: 'Die Objekte stattdessen diesem Wert zuordnen:'
|
text_enumeration_category_reassign_to: 'Die Objekte stattdessen diesem Wert zuordnen:'
|
||||||
text_email_delivery_not_configured: "Der SMTP-Server ist nicht konfiguriert und Mailbenachrichtigungen sind ausgeschaltet.\nNehmen Sie die Einstellungen für Ihren SMTP-Server in config/email.yml vor und starten Sie die Applikation neu."
|
text_email_delivery_not_configured: "Der SMTP-Server ist nicht konfiguriert und Mailbenachrichtigungen sind ausgeschaltet.\nNehmen Sie die Einstellungen für Ihren SMTP-Server in config/email.yml vor und starten Sie die Applikation neu."
|
||||||
text_repository_usernames_mapping: "Bitte legen Sie die Zuordnung der Redmine-Benutzer zu den Benutzernamen der Commit-Log-Meldungen des Projektarchivs fest.\nBenutzer mit identischen Redmine- und Projektarchiv-Benutzernamen oder -E-Mail-Adressen werden automatisch zugeordnet."
|
text_repository_usernames_mapping: "Bitte legen Sie die Zuordnung der Redmine-Benutzer zu den Benutzernamen der Commit-Log-Meldungen des Projektarchivs fest.\nBenutzer mit identischen Redmine- und Projektarchiv-Benutzernamen oder -E-Mail-Adressen werden automatisch zugeordnet."
|
||||||
|
text_diff_truncated: '... Dieser Diff wurde abgeschnitten, weil er die maximale Anzahl anzuzeigender Zeilen überschreitet.'
|
||||||
|
|
||||||
default_role_manager: Manager
|
default_role_manager: Manager
|
||||||
default_role_developper: Entwickler
|
default_role_developper: Entwickler
|
||||||
@@ -694,5 +698,6 @@ default_activity_development: Entwicklung
|
|||||||
enumeration_issue_priorities: Ticket-Prioritäten
|
enumeration_issue_priorities: Ticket-Prioritäten
|
||||||
enumeration_doc_categories: Dokumentenkategorien
|
enumeration_doc_categories: Dokumentenkategorien
|
||||||
enumeration_activities: Aktivitäten (Zeiterfassung)
|
enumeration_activities: Aktivitäten (Zeiterfassung)
|
||||||
label_user_activity: "%s's activity"
|
text_plugin_assets_writable: Plugin assets directory writable
|
||||||
label_updated_time_by: Updated by %s %s ago
|
warning_attachments_not_saved: "%d file(s) could not be saved."
|
||||||
|
button_create_and_continue: Create and continue
|
||||||
|
|||||||
+7
-1
@@ -85,6 +85,8 @@ error_scm_command_failed: "An error occurred when trying to access the repositor
|
|||||||
error_scm_annotate: "The entry does not exist or can not be annotated."
|
error_scm_annotate: "The entry does not exist or can not be annotated."
|
||||||
error_issue_not_found_in_project: 'The issue was not found or does not belong to this project'
|
error_issue_not_found_in_project: 'The issue was not found or does not belong to this project'
|
||||||
|
|
||||||
|
warning_attachments_not_saved: "%d file(s) could not be saved."
|
||||||
|
|
||||||
mail_subject_lost_password: Your %s password
|
mail_subject_lost_password: Your %s password
|
||||||
mail_body_lost_password: 'To change your password, click on the following link:'
|
mail_body_lost_password: 'To change your password, click on the following link:'
|
||||||
mail_subject_register: Your %s account activation
|
mail_subject_register: Your %s account activation
|
||||||
@@ -223,6 +225,7 @@ setting_mail_handler_api_enabled: Enable WS for incoming emails
|
|||||||
setting_mail_handler_api_key: API key
|
setting_mail_handler_api_key: API key
|
||||||
setting_sequential_project_identifiers: Generate sequential project identifiers
|
setting_sequential_project_identifiers: Generate sequential project identifiers
|
||||||
setting_gravatar_enabled: Use Gravatar user icons
|
setting_gravatar_enabled: Use Gravatar user icons
|
||||||
|
setting_diff_max_lines_displayed: Max number of diff lines displayed
|
||||||
|
|
||||||
permission_edit_project: Edit project
|
permission_edit_project: Edit project
|
||||||
permission_select_project_modules: Select project modules
|
permission_select_project_modules: Select project modules
|
||||||
@@ -589,6 +592,7 @@ button_check_all: Check all
|
|||||||
button_uncheck_all: Uncheck all
|
button_uncheck_all: Uncheck all
|
||||||
button_delete: Delete
|
button_delete: Delete
|
||||||
button_create: Create
|
button_create: Create
|
||||||
|
button_create_and_continue: Create and continue
|
||||||
button_test: Test
|
button_test: Test
|
||||||
button_edit: Edit
|
button_edit: Edit
|
||||||
button_add: Add
|
button_add: Add
|
||||||
@@ -659,7 +663,8 @@ text_status_changed_by_changeset: Applied in changeset %s.
|
|||||||
text_issues_destroy_confirmation: 'Are you sure you want to delete the selected issue(s) ?'
|
text_issues_destroy_confirmation: 'Are you sure you want to delete the selected issue(s) ?'
|
||||||
text_select_project_modules: 'Select modules to enable for this project:'
|
text_select_project_modules: 'Select modules to enable for this project:'
|
||||||
text_default_administrator_account_changed: Default administrator account changed
|
text_default_administrator_account_changed: Default administrator account changed
|
||||||
text_file_repository_writable: File repository writable
|
text_file_repository_writable: Attachments directory writable
|
||||||
|
text_plugin_assets_writable: Plugin assets directory writable
|
||||||
text_rmagick_available: RMagick available (optional)
|
text_rmagick_available: RMagick available (optional)
|
||||||
text_destroy_time_entries_question: %.02f hours were reported on the issues you are about to delete. What do you want to do ?
|
text_destroy_time_entries_question: %.02f hours were reported on the issues you are about to delete. What do you want to do ?
|
||||||
text_destroy_time_entries: Delete reported hours
|
text_destroy_time_entries: Delete reported hours
|
||||||
@@ -670,6 +675,7 @@ text_enumeration_destroy_question: '%d objects are assigned to this value.'
|
|||||||
text_enumeration_category_reassign_to: 'Reassign them to this value:'
|
text_enumeration_category_reassign_to: 'Reassign them to this value:'
|
||||||
text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/email.yml and restart the application to enable them."
|
text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/email.yml and restart the application to enable them."
|
||||||
text_repository_usernames_mapping: "Select or update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped."
|
text_repository_usernames_mapping: "Select or update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped."
|
||||||
|
text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
|
||||||
|
|
||||||
default_role_manager: Manager
|
default_role_manager: Manager
|
||||||
default_role_developper: Developer
|
default_role_developper: Developer
|
||||||
|
|||||||
+45
-40
@@ -19,11 +19,11 @@ actionview_datehelper_time_in_words_second_less_than_plural: menos de %d segundo
|
|||||||
actionview_instancetag_blank_option: Por favor seleccione
|
actionview_instancetag_blank_option: Por favor seleccione
|
||||||
activerecord_error_accepted: debe ser aceptado
|
activerecord_error_accepted: debe ser aceptado
|
||||||
activerecord_error_blank: no puede estar en blanco
|
activerecord_error_blank: no puede estar en blanco
|
||||||
activerecord_error_circular_dependency: Esta relación podría crear una dependencia anidada
|
activerecord_error_circular_dependency: Esta relación podría crear una dependencia circular
|
||||||
activerecord_error_confirmation: la confirmación no coincide
|
activerecord_error_confirmation: la confirmación no coincide
|
||||||
activerecord_error_empty: no puede estar vacío
|
activerecord_error_empty: no puede estar vacío
|
||||||
activerecord_error_exclusion: está reservado
|
activerecord_error_exclusion: está reservado
|
||||||
activerecord_error_greater_than_start_date: debe ser la fecha mayor que del comienzo
|
activerecord_error_greater_than_start_date: debe ser posterior a la fecha de comienzo
|
||||||
activerecord_error_inclusion: no está incluído en la lista
|
activerecord_error_inclusion: no está incluído en la lista
|
||||||
activerecord_error_invalid: no es válido
|
activerecord_error_invalid: no es válido
|
||||||
activerecord_error_not_a_date: no es una fecha válida
|
activerecord_error_not_a_date: no es una fecha válida
|
||||||
@@ -140,11 +140,11 @@ field_is_default: Estado por defecto
|
|||||||
field_is_filter: Usado como filtro
|
field_is_filter: Usado como filtro
|
||||||
field_is_for_all: Para todos los proyectos
|
field_is_for_all: Para todos los proyectos
|
||||||
field_is_in_chlog: Consultar las peticiones en el histórico
|
field_is_in_chlog: Consultar las peticiones en el histórico
|
||||||
field_is_in_roadmap: Consultar las peticiones en el roadmap
|
field_is_in_roadmap: Consultar las peticiones en la planificación
|
||||||
field_is_public: Público
|
field_is_public: Público
|
||||||
field_is_required: Obligatorio
|
field_is_required: Obligatorio
|
||||||
field_issue: Petición
|
field_issue: Petición
|
||||||
field_issue_to_id: Petición Relacionada
|
field_issue_to_id: Petición relacionada
|
||||||
field_language: Idioma
|
field_language: Idioma
|
||||||
field_last_login_on: Última conexión
|
field_last_login_on: Última conexión
|
||||||
field_lastname: Apellido
|
field_lastname: Apellido
|
||||||
@@ -178,7 +178,7 @@ field_subproject: Proyecto secundario
|
|||||||
field_summary: Resumen
|
field_summary: Resumen
|
||||||
field_time_zone: Zona horaria
|
field_time_zone: Zona horaria
|
||||||
field_title: Título
|
field_title: Título
|
||||||
field_tracker: Tracker
|
field_tracker: Tipo
|
||||||
field_type: Tipo
|
field_type: Tipo
|
||||||
field_updated_on: Actualizado
|
field_updated_on: Actualizado
|
||||||
field_url: URL
|
field_url: URL
|
||||||
@@ -215,7 +215,7 @@ label_ago: hace
|
|||||||
label_all: todos
|
label_all: todos
|
||||||
label_all_time: todo el tiempo
|
label_all_time: todo el tiempo
|
||||||
label_all_words: Todas las palabras
|
label_all_words: Todas las palabras
|
||||||
label_and_its_subprojects: %s y sus subproyectos
|
label_and_its_subprojects: %s y proyectos secundarios
|
||||||
label_applied_status: Aplicar estado
|
label_applied_status: Aplicar estado
|
||||||
label_assigned_to_me_issues: Peticiones que me están asignadas
|
label_assigned_to_me_issues: Peticiones que me están asignadas
|
||||||
label_associated_revisions: Revisiones asociadas
|
label_associated_revisions: Revisiones asociadas
|
||||||
@@ -234,7 +234,7 @@ label_blocks: bloquea a
|
|||||||
label_board: Foro
|
label_board: Foro
|
||||||
label_board_new: Nuevo foro
|
label_board_new: Nuevo foro
|
||||||
label_board_plural: Foros
|
label_board_plural: Foros
|
||||||
label_boolean: Boleano
|
label_boolean: Booleano
|
||||||
label_browse: Hojear
|
label_browse: Hojear
|
||||||
label_bulk_edit_selected_issues: Editar las peticiones seleccionadas
|
label_bulk_edit_selected_issues: Editar las peticiones seleccionadas
|
||||||
label_calendar: Calendario
|
label_calendar: Calendario
|
||||||
@@ -293,7 +293,7 @@ label_enumerations: Listas de valores
|
|||||||
label_environment: Entorno
|
label_environment: Entorno
|
||||||
label_equals: igual
|
label_equals: igual
|
||||||
label_example: Ejemplo
|
label_example: Ejemplo
|
||||||
label_export_to: Exportar a
|
label_export_to: 'Exportar a:'
|
||||||
label_f_hour: %.2f hora
|
label_f_hour: %.2f hora
|
||||||
label_f_hour_plural: %.2f horas
|
label_f_hour_plural: %.2f horas
|
||||||
label_feed_plural: Feeds
|
label_feed_plural: Feeds
|
||||||
@@ -327,7 +327,7 @@ label_issue_category_new: Nueva categoría
|
|||||||
label_issue_category_plural: Categorías de las peticiones
|
label_issue_category_plural: Categorías de las peticiones
|
||||||
label_issue_new: Nueva petición
|
label_issue_new: Nueva petición
|
||||||
label_issue_plural: Peticiones
|
label_issue_plural: Peticiones
|
||||||
label_issue_status: Estado de petición
|
label_issue_status: Estado de la petición
|
||||||
label_issue_status_new: Nuevo estado
|
label_issue_status_new: Nuevo estado
|
||||||
label_issue_status_plural: Estados de las peticiones
|
label_issue_status_plural: Estados de las peticiones
|
||||||
label_issue_tracking: Peticiones
|
label_issue_tracking: Peticiones
|
||||||
@@ -337,7 +337,7 @@ label_issue_watchers: Seguidores
|
|||||||
label_issues_by: Peticiones por %s
|
label_issues_by: Peticiones por %s
|
||||||
label_jump_to_a_project: Ir al proyecto...
|
label_jump_to_a_project: Ir al proyecto...
|
||||||
label_language_based: Basado en el idioma
|
label_language_based: Basado en el idioma
|
||||||
label_last_changes: %d cambios del último
|
label_last_changes: últimos %d cambios
|
||||||
label_last_login: Última conexión
|
label_last_login: Última conexión
|
||||||
label_last_month: último mes
|
label_last_month: último mes
|
||||||
label_last_n_days: últimos %d días
|
label_last_n_days: últimos %d días
|
||||||
@@ -384,7 +384,7 @@ label_news_plural: Noticias
|
|||||||
label_news_view_all: Ver todas las noticias
|
label_news_view_all: Ver todas las noticias
|
||||||
label_next: Siguiente
|
label_next: Siguiente
|
||||||
label_no_change_option: (Sin cambios)
|
label_no_change_option: (Sin cambios)
|
||||||
label_no_data: Ningun dato a mostrar
|
label_no_data: Ningún dato a mostrar
|
||||||
label_nobody: nadie
|
label_nobody: nadie
|
||||||
label_none: ninguno
|
label_none: ninguno
|
||||||
label_not_contains: no contiene
|
label_not_contains: no contiene
|
||||||
@@ -397,7 +397,7 @@ label_options: Opciones
|
|||||||
label_overall_activity: Actividad global
|
label_overall_activity: Actividad global
|
||||||
label_overview: Vistazo
|
label_overview: Vistazo
|
||||||
label_password_lost: ¿Olvidaste la contraseña?
|
label_password_lost: ¿Olvidaste la contraseña?
|
||||||
label_per_page: Por la página
|
label_per_page: Por página
|
||||||
label_permissions: Permisos
|
label_permissions: Permisos
|
||||||
label_permissions_report: Informe de permisos
|
label_permissions_report: Informe de permisos
|
||||||
label_personalize_page: Personalizar esta página
|
label_personalize_page: Personalizar esta página
|
||||||
@@ -438,7 +438,7 @@ label_result_plural: Resultados
|
|||||||
label_reverse_chronological_order: En orden cronológico inverso
|
label_reverse_chronological_order: En orden cronológico inverso
|
||||||
label_revision: Revisión
|
label_revision: Revisión
|
||||||
label_revision_plural: Revisiones
|
label_revision_plural: Revisiones
|
||||||
label_roadmap: Roadmap
|
label_roadmap: Planificación
|
||||||
label_roadmap_due_in: Finaliza en %s
|
label_roadmap_due_in: Finaliza en %s
|
||||||
label_roadmap_no_issues: No hay peticiones para esta versión
|
label_roadmap_no_issues: No hay peticiones para esta versión
|
||||||
label_roadmap_overdue: %s tarde
|
label_roadmap_overdue: %s tarde
|
||||||
@@ -452,7 +452,7 @@ label_search_titles_only: Buscar sólo en títulos
|
|||||||
label_send_information: Enviar información de la cuenta al usuario
|
label_send_information: Enviar información de la cuenta al usuario
|
||||||
label_send_test_email: Enviar un correo de prueba
|
label_send_test_email: Enviar un correo de prueba
|
||||||
label_settings: Configuración
|
label_settings: Configuración
|
||||||
label_show_completed_versions: Muestra las versiones completas
|
label_show_completed_versions: Muestra las versiones terminadas
|
||||||
label_sort_by: Ordenar por %s
|
label_sort_by: Ordenar por %s
|
||||||
label_sort_higher: Subir
|
label_sort_higher: Subir
|
||||||
label_sort_highest: Primero
|
label_sort_highest: Primero
|
||||||
@@ -474,16 +474,18 @@ label_time_tracking: Control de tiempo
|
|||||||
label_today: hoy
|
label_today: hoy
|
||||||
label_topic_plural: Temas
|
label_topic_plural: Temas
|
||||||
label_total: Total
|
label_total: Total
|
||||||
label_tracker: Tracker
|
label_tracker: Tipo
|
||||||
label_tracker_new: Nuevo tracker
|
label_tracker_new: Nuevo tipo
|
||||||
label_tracker_plural: Trackers
|
label_tracker_plural: Tipos de peticiones
|
||||||
label_updated_time: Actualizado hace %s
|
label_updated_time: Actualizado hace %s
|
||||||
|
label_updated_time_by: Actualizado por %s hace %s
|
||||||
label_used_by: Utilizado por
|
label_used_by: Utilizado por
|
||||||
label_user: Usuario
|
label_user: Usuario
|
||||||
|
label_user_activity: "Actividad de %s"
|
||||||
label_user_mail_no_self_notified: "No quiero ser avisado de cambios hechos por mí"
|
label_user_mail_no_self_notified: "No quiero ser avisado de cambios hechos por mí"
|
||||||
label_user_mail_option_all: "Para cualquier evento en todos mis proyectos"
|
label_user_mail_option_all: "Para cualquier evento en todos mis proyectos"
|
||||||
label_user_mail_option_none: "Sólo para elementos monitorizados o relacionados conmigo"
|
label_user_mail_option_none: "Sólo para elementos monitorizados o relacionados conmigo"
|
||||||
label_user_mail_option_selected: "Para cualquier evento del proyecto seleccionado..."
|
label_user_mail_option_selected: "Para cualquier evento de los proyectos seleccionados..."
|
||||||
label_user_new: Nuevo usuario
|
label_user_new: Nuevo usuario
|
||||||
label_user_plural: Usuarios
|
label_user_plural: Usuarios
|
||||||
label_version: Versión
|
label_version: Versión
|
||||||
@@ -501,22 +503,22 @@ label_wiki_page_plural: Wiki páginas
|
|||||||
label_workflow: Flujo de trabajo
|
label_workflow: Flujo de trabajo
|
||||||
label_year: Año
|
label_year: Año
|
||||||
label_yesterday: ayer
|
label_yesterday: ayer
|
||||||
mail_body_account_activation_request: "Un nuevo usuario (%s) ha sido registrado. Esta cuenta está pendiende de aprobación"
|
mail_body_account_activation_request: 'Se ha inscrito un nuevo usuario (%s). La cuenta está pendiende de aprobación:'
|
||||||
mail_body_account_information: Información sobre su cuenta
|
mail_body_account_information: Información sobre su cuenta
|
||||||
mail_body_account_information_external: Puede usar su cuenta "%s" para conectarse.
|
mail_body_account_information_external: Puede usar su cuenta "%s" para conectarse.
|
||||||
mail_body_lost_password: 'Para cambiar su contraseña, haga click en el siguiente enlace:'
|
mail_body_lost_password: 'Para cambiar su contraseña, haga clic en el siguiente enlace:'
|
||||||
mail_body_register: 'Para activar su cuenta, haga click en el siguiente enlace:'
|
mail_body_register: 'Para activar su cuenta, haga clic en el siguiente enlace:'
|
||||||
mail_body_reminder: "%d peticion(es) asignadas a tí finalizan en los próximos %d días:"
|
mail_body_reminder: "%d peticion(es) asignadas a tí finalizan en los próximos %d días:"
|
||||||
mail_subject_account_activation_request: Petición de activación de cuenta %s
|
mail_subject_account_activation_request: Petición de activación de cuenta %s
|
||||||
mail_subject_lost_password: Tu contraseña del %s
|
mail_subject_lost_password: Tu contraseña del %s
|
||||||
mail_subject_register: Activación de la cuenta del %s
|
mail_subject_register: Activación de la cuenta del %s
|
||||||
mail_subject_reminder: "%d peticion(es) finalizan en los próximos días"
|
mail_subject_reminder: "%d peticion(es) finalizan en los próximos días"
|
||||||
notice_account_activated: Su cuenta ha sido activada. Ahora se encuentra conectado.
|
notice_account_activated: Su cuenta ha sido activada. Ya puede conectarse.
|
||||||
notice_account_invalid_creditentials: Usuario o contraseña inválido.
|
notice_account_invalid_creditentials: Usuario o contraseña inválido.
|
||||||
notice_account_lost_email_sent: Se le ha enviado un correo con instrucciones para elegir una nueva contraseña.
|
notice_account_lost_email_sent: Se le ha enviado un correo con instrucciones para elegir una nueva contraseña.
|
||||||
notice_account_password_updated: Contraseña modificada correctamente.
|
notice_account_password_updated: Contraseña modificada correctamente.
|
||||||
notice_account_pending: "Su cuenta ha sido creada y está pendiende de la aprobación por parte de administrador"
|
notice_account_pending: "Su cuenta ha sido creada y está pendiende de la aprobación por parte del administrador."
|
||||||
notice_account_register_done: Cuenta creada correctamente.
|
notice_account_register_done: Cuenta creada correctamente. Para activarla, haga clic sobre el enlace que le ha sido enviado por correo.
|
||||||
notice_account_unknown_email: Usuario desconocido.
|
notice_account_unknown_email: Usuario desconocido.
|
||||||
notice_account_updated: Cuenta actualizada correctamente.
|
notice_account_updated: Cuenta actualizada correctamente.
|
||||||
notice_account_wrong_password: Contraseña incorrecta.
|
notice_account_wrong_password: Contraseña incorrecta.
|
||||||
@@ -524,9 +526,9 @@ notice_can_t_change_password: Esta cuenta utiliza una fuente de autenticación e
|
|||||||
notice_default_data_loaded: Configuración por defecto cargada correctamente.
|
notice_default_data_loaded: Configuración por defecto cargada correctamente.
|
||||||
notice_email_error: Ha ocurrido un error mientras enviando el correo (%s)
|
notice_email_error: Ha ocurrido un error mientras enviando el correo (%s)
|
||||||
notice_email_sent: Se ha enviado un correo a %s
|
notice_email_sent: Se ha enviado un correo a %s
|
||||||
notice_failed_to_save_issues: "Imposible salvar %s peticion(es) en %d seleccionado: %s."
|
notice_failed_to_save_issues: "Imposible grabar %s peticion(es) en %d seleccionado: %s."
|
||||||
notice_feeds_access_key_reseted: Su clave de acceso para RSS ha sido reiniciada
|
notice_feeds_access_key_reseted: Su clave de acceso para RSS ha sido reiniciada.
|
||||||
notice_file_not_found: La página a la que intentas acceder no existe.
|
notice_file_not_found: La página a la que intenta acceder no existe.
|
||||||
notice_locking_conflict: Los datos han sido modificados por otro usuario.
|
notice_locking_conflict: Los datos han sido modificados por otro usuario.
|
||||||
notice_no_issue_selected: "Ninguna petición seleccionada. Por favor, compruebe la petición que quiere modificar"
|
notice_no_issue_selected: "Ninguna petición seleccionada. Por favor, compruebe la petición que quiere modificar"
|
||||||
notice_not_authorized: No tiene autorización para acceder a esta página.
|
notice_not_authorized: No tiene autorización para acceder a esta página.
|
||||||
@@ -544,9 +546,9 @@ permission_comment_news: Comentar noticias
|
|||||||
permission_commit_access: Acceso de escritura
|
permission_commit_access: Acceso de escritura
|
||||||
permission_delete_issues: Borrar peticiones
|
permission_delete_issues: Borrar peticiones
|
||||||
permission_delete_messages: Borrar mensajes
|
permission_delete_messages: Borrar mensajes
|
||||||
|
permission_delete_own_messages: Borrar mensajes propios
|
||||||
permission_delete_wiki_pages: Borrar páginas wiki
|
permission_delete_wiki_pages: Borrar páginas wiki
|
||||||
permission_delete_wiki_pages_attachments: Borrar ficheros
|
permission_delete_wiki_pages_attachments: Borrar ficheros
|
||||||
permission_delete_own_messages: Borrar mensajes propios
|
|
||||||
permission_edit_issue_notes: Modificar notas
|
permission_edit_issue_notes: Modificar notas
|
||||||
permission_edit_issues: Modificar peticiones
|
permission_edit_issues: Modificar peticiones
|
||||||
permission_edit_messages: Modificar mensajes
|
permission_edit_messages: Modificar mensajes
|
||||||
@@ -602,15 +604,16 @@ setting_commit_fix_keywords: Palabras clave para la corrección
|
|||||||
setting_commit_logs_encoding: Codificación de los mensajes de commit
|
setting_commit_logs_encoding: Codificación de los mensajes de commit
|
||||||
setting_commit_ref_keywords: Palabras clave para la referencia
|
setting_commit_ref_keywords: Palabras clave para la referencia
|
||||||
setting_cross_project_issue_relations: Permitir relacionar peticiones de distintos proyectos
|
setting_cross_project_issue_relations: Permitir relacionar peticiones de distintos proyectos
|
||||||
setting_date_format: Formato de la fecha
|
setting_date_format: Formato de fecha
|
||||||
setting_default_language: Idioma por defecto
|
setting_default_language: Idioma por defecto
|
||||||
setting_default_projects_public: Los proyectos nuevos son públicos por defecto
|
setting_default_projects_public: Los proyectos nuevos son públicos por defecto
|
||||||
setting_display_subprojects_issues: Mostrar peticiones de un subproyecto en el proyecto padre por defecto
|
setting_diff_max_lines_displayed: Número máximo de diferencias mostradas
|
||||||
|
setting_display_subprojects_issues: Mostrar por defecto peticiones de proy. secundarios en el principal
|
||||||
setting_emails_footer: Pie de mensajes
|
setting_emails_footer: Pie de mensajes
|
||||||
setting_enabled_scm: Activar SCM
|
setting_enabled_scm: Activar SCM
|
||||||
setting_feeds_limit: Límite de contenido para sindicación
|
setting_feeds_limit: Límite de contenido para sindicación
|
||||||
setting_gravatar_enabled: Usar iconos de usuario (Gravatar)
|
setting_gravatar_enabled: Usar iconos de usuario (Gravatar)
|
||||||
setting_host_name: Nombre de host
|
setting_host_name: Nombre y ruta del servidor
|
||||||
setting_issue_list_default_columns: Columnas por defecto para la lista de peticiones
|
setting_issue_list_default_columns: Columnas por defecto para la lista de peticiones
|
||||||
setting_issues_export_limit: Límite de exportación de peticiones
|
setting_issues_export_limit: Límite de exportación de peticiones
|
||||||
setting_login_required: Se requiere identificación
|
setting_login_required: Se requiere identificación
|
||||||
@@ -632,7 +635,7 @@ setting_wiki_compression: Compresión del historial del Wiki
|
|||||||
status_active: activo
|
status_active: activo
|
||||||
status_locked: bloqueado
|
status_locked: bloqueado
|
||||||
status_registered: registrado
|
status_registered: registrado
|
||||||
text_are_you_sure: ¿ Estás seguro ?
|
text_are_you_sure: ¿Está seguro?
|
||||||
text_assign_time_entries_to_project: Asignar las horas al proyecto
|
text_assign_time_entries_to_project: Asignar las horas al proyecto
|
||||||
text_caracters_maximum: %d caracteres como máximo.
|
text_caracters_maximum: %d caracteres como máximo.
|
||||||
text_caracters_minimum: %d caracteres como mínimo
|
text_caracters_minimum: %d caracteres como mínimo
|
||||||
@@ -640,11 +643,12 @@ text_comma_separated: Múltiples valores permitidos (separados por coma).
|
|||||||
text_default_administrator_account_changed: Cuenta de administrador por defecto modificada
|
text_default_administrator_account_changed: Cuenta de administrador por defecto modificada
|
||||||
text_destroy_time_entries: Borrar las horas
|
text_destroy_time_entries: Borrar las horas
|
||||||
text_destroy_time_entries_question: Existen %.02f horas asignadas a la petición que quiere borrar. ¿Qué quiere hacer ?
|
text_destroy_time_entries_question: Existen %.02f horas asignadas a la petición que quiere borrar. ¿Qué quiere hacer ?
|
||||||
|
text_diff_truncated: '... Diferencia truncada por exceder el máximo tamaño visualizable.'
|
||||||
text_email_delivery_not_configured: "El envío de correos no está configurado, y las notificaciones se han desactivado. \n Configure el servidor de SMTP en config/email.yml y reinicie la aplicación para activar los cambios."
|
text_email_delivery_not_configured: "El envío de correos no está configurado, y las notificaciones se han desactivado. \n Configure el servidor de SMTP en config/email.yml y reinicie la aplicación para activar los cambios."
|
||||||
text_enumeration_category_reassign_to: 'Reasignar al siguiente valor:'
|
text_enumeration_category_reassign_to: 'Reasignar al siguiente valor:'
|
||||||
text_enumeration_destroy_question: '%d objetos con este valor asignado.'
|
text_enumeration_destroy_question: '%d objetos con este valor asignado.'
|
||||||
text_file_repository_writable: Se puede escribir en el repositorio
|
text_file_repository_writable: Se puede escribir en el repositorio
|
||||||
text_issue_added: Petición añadida por %s.
|
text_issue_added: Petición %s añadida por %s.
|
||||||
text_issue_category_destroy_assignments: Dejar las peticiones sin categoría
|
text_issue_category_destroy_assignments: Dejar las peticiones sin categoría
|
||||||
text_issue_category_destroy_question: Algunas peticiones (%d) están asignadas a esta categoría. ¿Qué desea hacer?
|
text_issue_category_destroy_question: Algunas peticiones (%d) están asignadas a esta categoría. ¿Qué desea hacer?
|
||||||
text_issue_category_reassign_to: Reasignar las peticiones a la categoría
|
text_issue_category_reassign_to: Reasignar las peticiones a la categoría
|
||||||
@@ -657,25 +661,26 @@ text_journal_set_to: fijado a %s
|
|||||||
text_length_between: Longitud entre %d y %d caracteres.
|
text_length_between: Longitud entre %d y %d caracteres.
|
||||||
text_load_default_configuration: Cargar la configuración por defecto
|
text_load_default_configuration: Cargar la configuración por defecto
|
||||||
text_min_max_length_info: 0 para ninguna restricción
|
text_min_max_length_info: 0 para ninguna restricción
|
||||||
text_no_configuration_data: "Todavía no se han configurado roles, ni trackers, ni estados y flujo de trabajo asociado a peticiones. Se recomiendo encarecidamente cargar la configuración por defecto. Una vez cargada, podrá modificarla."
|
text_no_configuration_data: "Todavía no se han configurado perfiles, ni tipos, estados y flujo de trabajo asociado a peticiones. Se recomiendo encarecidamente cargar la configuración por defecto. Una vez cargada, podrá modificarla."
|
||||||
text_project_destroy_confirmation: ¿Estás seguro de querer eliminar el proyecto?
|
text_project_destroy_confirmation: ¿Estás seguro de querer eliminar el proyecto?
|
||||||
text_project_identifier_info: 'Letras minúsculas (a-z), números y signos de puntuación permitidos.<br />Una vez guardado, el identificador no puede modificarse.'
|
text_project_identifier_info: 'Letras minúsculas (a-z), números y signos de puntuación permitidos.<br />Una vez guardado, el identificador no puede modificarse.'
|
||||||
text_reassign_time_entries: 'Reasignar las horas a esta petición:'
|
text_reassign_time_entries: 'Reasignar las horas a esta petición:'
|
||||||
text_regexp_info: ej. ^[A-Z0-9]+$
|
text_regexp_info: ej. ^[A-Z0-9]+$
|
||||||
text_repository_usernames_mapping: "Select or update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped."
|
text_repository_usernames_mapping: "Establezca la correspondencia entre los usuarios de Redmine y los presentes en el log del repositorio.\nLos usuarios con el mismo nombre o correo en Redmine y en el repositorio serán asociados automáticamente."
|
||||||
text_rmagick_available: RMagick disponible (opcional)
|
text_rmagick_available: RMagick disponible (opcional)
|
||||||
text_select_mail_notifications: Seleccionar los eventos a notificar
|
text_select_mail_notifications: Seleccionar los eventos a notificar
|
||||||
text_select_project_modules: 'Seleccione los módulos a activar para este proyecto:'
|
text_select_project_modules: 'Seleccione los módulos a activar para este proyecto:'
|
||||||
text_status_changed_by_changeset: Aplicado en los cambios %s
|
text_status_changed_by_changeset: Aplicado en los cambios %s
|
||||||
text_subprojects_destroy_warning: 'Los subproyectos: %s también se eliminarán'
|
text_subprojects_destroy_warning: 'Los proyectos secundarios: %s también se eliminarán'
|
||||||
text_tip_task_begin_day: tarea que comienza este día
|
text_tip_task_begin_day: tarea que comienza este día
|
||||||
text_tip_task_begin_end_day: tarea que comienza y termina este día
|
text_tip_task_begin_end_day: tarea que comienza y termina este día
|
||||||
text_tip_task_end_day: tarea que termina este día
|
text_tip_task_end_day: tarea que termina este día
|
||||||
text_tracker_no_workflow: No hay ningún flujo de trabajo definido para este tracker
|
text_tracker_no_workflow: No hay ningún flujo de trabajo definido para este tipo de petición
|
||||||
text_unallowed_characters: Caracteres no permitidos
|
text_unallowed_characters: Caracteres no permitidos
|
||||||
text_user_mail_option: "En los proyectos no seleccionados, sólo recibirá notificaciones sobre elementos monitorizados o elementos en los que esté involucrado (por ejemplo, peticiones de las que usted sea autor o asignadas a usted)."
|
text_user_mail_option: "De los proyectos no seleccionados, sólo recibirá notificaciones sobre elementos monitorizados o elementos en los que esté involucrado (por ejemplo, peticiones de las que usted sea autor o asignadas a usted)."
|
||||||
text_user_wrote: '%s escribió:'
|
text_user_wrote: '%s escribió:'
|
||||||
text_wiki_destroy_confirmation: ¿Seguro que quiere borrar el wiki y todo su contenido?
|
text_wiki_destroy_confirmation: ¿Seguro que quiere borrar el wiki y todo su contenido?
|
||||||
text_workflow_edit: Seleccionar un flujo de trabajo para actualizar
|
text_workflow_edit: Seleccionar un flujo de trabajo para actualizar
|
||||||
label_user_activity: "%s's activity"
|
text_plugin_assets_writable: Plugin assets directory writable
|
||||||
label_updated_time_by: Updated by %s %s ago
|
warning_attachments_not_saved: "%d file(s) could not be saved."
|
||||||
|
button_create_and_continue: Create and continue
|
||||||
|
|||||||
@@ -694,3 +694,8 @@ permission_edit_own_messages: Muokkaa omia viestejä
|
|||||||
permission_delete_own_messages: Poista omia viestejä
|
permission_delete_own_messages: Poista omia viestejä
|
||||||
label_user_activity: "Käyttäjän %s historia"
|
label_user_activity: "Käyttäjän %s historia"
|
||||||
label_updated_time_by: Updated by %s %s ago
|
label_updated_time_by: Updated by %s %s ago
|
||||||
|
text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
|
||||||
|
setting_diff_max_lines_displayed: Max number of diff lines displayed
|
||||||
|
text_plugin_assets_writable: Plugin assets directory writable
|
||||||
|
warning_attachments_not_saved: "%d file(s) could not be saved."
|
||||||
|
button_create_and_continue: Create and continue
|
||||||
|
|||||||
+7
-1
@@ -85,6 +85,8 @@ error_scm_command_failed: "Une erreur s'est produite lors de l'accès au dépôt
|
|||||||
error_scm_annotate: "L'entrée n'existe pas ou ne peut pas être annotée."
|
error_scm_annotate: "L'entrée n'existe pas ou ne peut pas être annotée."
|
||||||
error_issue_not_found_in_project: "La demande n'existe pas ou n'appartient pas à ce projet"
|
error_issue_not_found_in_project: "La demande n'existe pas ou n'appartient pas à ce projet"
|
||||||
|
|
||||||
|
warning_attachments_not_saved: "%d fichier(s) n'ont pas pu être sauvegardés."
|
||||||
|
|
||||||
mail_subject_lost_password: Votre mot de passe %s
|
mail_subject_lost_password: Votre mot de passe %s
|
||||||
mail_body_lost_password: 'Pour changer votre mot de passe, cliquez sur le lien suivant:'
|
mail_body_lost_password: 'Pour changer votre mot de passe, cliquez sur le lien suivant:'
|
||||||
mail_subject_register: Activation de votre compte %s
|
mail_subject_register: Activation de votre compte %s
|
||||||
@@ -223,6 +225,7 @@ setting_mail_handler_api_enabled: "Activer le WS pour la réception d'emails"
|
|||||||
setting_mail_handler_api_key: Clé de protection de l'API
|
setting_mail_handler_api_key: Clé de protection de l'API
|
||||||
setting_sequential_project_identifiers: Générer des identifiants de projet séquentiels
|
setting_sequential_project_identifiers: Générer des identifiants de projet séquentiels
|
||||||
setting_gravatar_enabled: Afficher les Gravatar des utilisateurs
|
setting_gravatar_enabled: Afficher les Gravatar des utilisateurs
|
||||||
|
setting_diff_max_lines_displayed: Nombre maximum de lignes de diff affichées
|
||||||
|
|
||||||
permission_edit_project: Modifier le projet
|
permission_edit_project: Modifier le projet
|
||||||
permission_select_project_modules: Choisir les modules
|
permission_select_project_modules: Choisir les modules
|
||||||
@@ -579,7 +582,7 @@ label_reverse_chronological_order: Dans l'ordre chronologique inverse
|
|||||||
label_planning: Planning
|
label_planning: Planning
|
||||||
label_incoming_emails: Emails entrants
|
label_incoming_emails: Emails entrants
|
||||||
label_generate_key: Générer une clé
|
label_generate_key: Générer une clé
|
||||||
label_issue_watchers: Utilisateurs surveillant cette demande
|
label_issue_watchers: Observateurs
|
||||||
label_example: Exemple
|
label_example: Exemple
|
||||||
|
|
||||||
button_login: Connexion
|
button_login: Connexion
|
||||||
@@ -589,6 +592,7 @@ button_check_all: Tout cocher
|
|||||||
button_uncheck_all: Tout décocher
|
button_uncheck_all: Tout décocher
|
||||||
button_delete: Supprimer
|
button_delete: Supprimer
|
||||||
button_create: Créer
|
button_create: Créer
|
||||||
|
button_create_and_continue: Créer et continuer
|
||||||
button_test: Tester
|
button_test: Tester
|
||||||
button_edit: Modifier
|
button_edit: Modifier
|
||||||
button_add: Ajouter
|
button_add: Ajouter
|
||||||
@@ -660,6 +664,7 @@ text_issues_destroy_confirmation: 'Etes-vous sûr de vouloir supprimer le(s) dem
|
|||||||
text_select_project_modules: 'Selectionner les modules à activer pour ce project:'
|
text_select_project_modules: 'Selectionner les modules à activer pour ce project:'
|
||||||
text_default_administrator_account_changed: Compte administrateur par défaut changé
|
text_default_administrator_account_changed: Compte administrateur par défaut changé
|
||||||
text_file_repository_writable: Répertoire de stockage des fichiers accessible en écriture
|
text_file_repository_writable: Répertoire de stockage des fichiers accessible en écriture
|
||||||
|
text_plugin_assets_writable: Répertoire public des plugins accessible en écriture
|
||||||
text_rmagick_available: Bibliothèque RMagick présente (optionnelle)
|
text_rmagick_available: Bibliothèque RMagick présente (optionnelle)
|
||||||
text_destroy_time_entries_question: %.02f heures ont été enregistrées sur les demandes à supprimer. Que voulez-vous faire ?
|
text_destroy_time_entries_question: %.02f heures ont été enregistrées sur les demandes à supprimer. Que voulez-vous faire ?
|
||||||
text_destroy_time_entries: Supprimer les heures
|
text_destroy_time_entries: Supprimer les heures
|
||||||
@@ -670,6 +675,7 @@ text_enumeration_destroy_question: 'Cette valeur est affectée à %d objets.'
|
|||||||
text_enumeration_category_reassign_to: 'Réaffecter les objets à cette valeur:'
|
text_enumeration_category_reassign_to: 'Réaffecter les objets à cette valeur:'
|
||||||
text_email_delivery_not_configured: "L'envoi de mail n'est pas configuré, les notifications sont désactivées.\nConfigurez votre serveur SMTP dans config/email.yml et redémarrez l'application pour les activer."
|
text_email_delivery_not_configured: "L'envoi de mail n'est pas configuré, les notifications sont désactivées.\nConfigurez votre serveur SMTP dans config/email.yml et redémarrez l'application pour les activer."
|
||||||
text_repository_usernames_mapping: "Vous pouvez sélectionner ou modifier l'utilisateur Redmine associé à chaque nom d'utilisateur figurant dans l'historique du dépôt.\nLes utilisateurs avec le même identifiant ou la même adresse mail seront automatiquement associés."
|
text_repository_usernames_mapping: "Vous pouvez sélectionner ou modifier l'utilisateur Redmine associé à chaque nom d'utilisateur figurant dans l'historique du dépôt.\nLes utilisateurs avec le même identifiant ou la même adresse mail seront automatiquement associés."
|
||||||
|
text_diff_truncated: '... Ce différentiel a été tronqué car il excède la taille maximale pouvant être affichée.'
|
||||||
|
|
||||||
default_role_manager: Manager
|
default_role_manager: Manager
|
||||||
default_role_developper: Développeur
|
default_role_developper: Développeur
|
||||||
|
|||||||
+79
-74
@@ -236,7 +236,7 @@ label_register: הרשמה
|
|||||||
label_password_lost: אבדה הסיסמה?
|
label_password_lost: אבדה הסיסמה?
|
||||||
label_home: דף הבית
|
label_home: דף הבית
|
||||||
label_my_page: הדף שלי
|
label_my_page: הדף שלי
|
||||||
label_my_account: השבון שלי
|
label_my_account: החשבון שלי
|
||||||
label_my_projects: הפרויקטים שלי
|
label_my_projects: הפרויקטים שלי
|
||||||
label_administration: אדמיניסטרציה
|
label_administration: אדמיניסטרציה
|
||||||
label_login: התחבר
|
label_login: התחבר
|
||||||
@@ -292,7 +292,7 @@ label_confirmation: אישור
|
|||||||
label_export_to: יצא ל
|
label_export_to: יצא ל
|
||||||
label_read: קרא...
|
label_read: קרא...
|
||||||
label_public_projects: פרויקטים פומביים
|
label_public_projects: פרויקטים פומביים
|
||||||
label_open_issues: פותח
|
label_open_issues: פתוח
|
||||||
label_open_issues_plural: פתוחים
|
label_open_issues_plural: פתוחים
|
||||||
label_closed_issues: סגור
|
label_closed_issues: סגור
|
||||||
label_closed_issues_plural: סגורים
|
label_closed_issues_plural: סגורים
|
||||||
@@ -308,7 +308,7 @@ label_used_by: בשימוש ע"י
|
|||||||
label_details: פרטים
|
label_details: פרטים
|
||||||
label_add_note: הוסף הערה
|
label_add_note: הוסף הערה
|
||||||
label_per_page: לכל דף
|
label_per_page: לכל דף
|
||||||
label_calendar: לו"ח שנה
|
label_calendar: לוח שנה
|
||||||
label_months_from: חודשים מ
|
label_months_from: חודשים מ
|
||||||
label_gantt: גאנט
|
label_gantt: גאנט
|
||||||
label_internal: פנימי
|
label_internal: פנימי
|
||||||
@@ -357,7 +357,7 @@ label_sort_higher: הזז למעלה
|
|||||||
label_sort_lower: הזז למטה
|
label_sort_lower: הזז למטה
|
||||||
label_sort_lowest: הזז לתחתית
|
label_sort_lowest: הזז לתחתית
|
||||||
label_roadmap: מפת הדרכים
|
label_roadmap: מפת הדרכים
|
||||||
label_roadmap_due_in: %s נגמר בעוד
|
label_roadmap_due_in: נגמר בעוד %s
|
||||||
label_roadmap_overdue: %s מאחר
|
label_roadmap_overdue: %s מאחר
|
||||||
label_roadmap_no_issues: אין נושאים לגירסא זו
|
label_roadmap_no_issues: אין נושאים לגירסא זו
|
||||||
label_search: חפש
|
label_search: חפש
|
||||||
@@ -421,8 +421,8 @@ label_send_information: שלח מידע על חשבון למשתמש
|
|||||||
label_year: שנה
|
label_year: שנה
|
||||||
label_month: חודש
|
label_month: חודש
|
||||||
label_week: שבוע
|
label_week: שבוע
|
||||||
label_date_from: מאת
|
label_date_from: מתאריך
|
||||||
label_date_to: אל
|
label_date_to: עד
|
||||||
label_language_based: מבוסס שפה
|
label_language_based: מבוסס שפה
|
||||||
label_sort_by: מין לפי %s
|
label_sort_by: מין לפי %s
|
||||||
label_send_test_email: שלח דו"ל בדיקה
|
label_send_test_email: שלח דו"ל בדיקה
|
||||||
@@ -487,7 +487,7 @@ text_journal_set_to: שונה ל %s
|
|||||||
text_journal_deleted: נמחק
|
text_journal_deleted: נמחק
|
||||||
text_tip_task_begin_day: מטלה המתחילה היום
|
text_tip_task_begin_day: מטלה המתחילה היום
|
||||||
text_tip_task_end_day: מטלה המסתיימת היום
|
text_tip_task_end_day: מטלה המסתיימת היום
|
||||||
text_tip_task_begin_end_day: מתלה המתחילה ומסתיימת היום
|
text_tip_task_begin_end_day: מטלה המתחילה ומסתיימת היום
|
||||||
text_project_identifier_info: 'אותיות לטיניות (a-z), מספרים ומקפים.<br />ברגע שנשמר, לא ניתן לשנות את המזהה.'
|
text_project_identifier_info: 'אותיות לטיניות (a-z), מספרים ומקפים.<br />ברגע שנשמר, לא ניתן לשנות את המזהה.'
|
||||||
text_caracters_maximum: מקסימום %d תווים.
|
text_caracters_maximum: מקסימום %d תווים.
|
||||||
text_length_between: אורך בין %d ל %d תווים.
|
text_length_between: אורך בין %d ל %d תווים.
|
||||||
@@ -618,79 +618,84 @@ label_overall_activity: פעילות כוללת
|
|||||||
setting_default_projects_public: פרויקטים חדשים הינם פומביים כברירת מחדל
|
setting_default_projects_public: פרויקטים חדשים הינם פומביים כברירת מחדל
|
||||||
error_scm_annotate: "הכניסה לא קיימת או שלא ניתן לתאר אותה."
|
error_scm_annotate: "הכניסה לא קיימת או שלא ניתן לתאר אותה."
|
||||||
label_planning: תכנון
|
label_planning: תכנון
|
||||||
text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'
|
text_subprojects_destroy_warning: 'תת הפרויקט\ים: %s ימחקו גם כן.'
|
||||||
label_and_its_subprojects: %s and its subprojects
|
label_and_its_subprojects: %s וכל תת הפרויקטים שלו
|
||||||
mail_body_reminder: "%d issue(s) that are assigned to you are due in the next %d days:"
|
mail_body_reminder: "%d נושאים שמיועדים אליך מיועדים להגשה בתוך %d ימים:"
|
||||||
mail_subject_reminder: "%d issue(s) due in the next days"
|
mail_subject_reminder: "%d נושאים מיעדים להגשה בימים הקרובים"
|
||||||
text_user_wrote: '%s wrote:'
|
text_user_wrote: '%s כתב:'
|
||||||
label_duplicated_by: duplicated by
|
label_duplicated_by: שוכפל ע"י
|
||||||
setting_enabled_scm: Enabled SCM
|
setting_enabled_scm: אפשר SCM
|
||||||
text_enumeration_category_reassign_to: 'Reassign them to this value:'
|
text_enumeration_category_reassign_to: 'הצב מחדש לערך הזה:'
|
||||||
text_enumeration_destroy_question: '%d objects are assigned to this value.'
|
text_enumeration_destroy_question: '%d אוביקטים מוצבים לערך זה.'
|
||||||
label_incoming_emails: Incoming emails
|
label_incoming_emails: דוא"ל נכנס
|
||||||
label_generate_key: Generate a key
|
label_generate_key: יצר מפתח
|
||||||
setting_mail_handler_api_enabled: Enable WS for incoming emails
|
setting_mail_handler_api_enabled: Enable WS for incoming emails
|
||||||
setting_mail_handler_api_key: API key
|
setting_mail_handler_api_key: מפתח API
|
||||||
text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/email.yml and restart the application to enable them."
|
text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/email.yml and restart the application to enable them."
|
||||||
field_parent_title: Parent page
|
field_parent_title: דף אב
|
||||||
label_issue_watchers: Watchers
|
label_issue_watchers: צופים
|
||||||
setting_commit_logs_encoding: Commit messages encoding
|
setting_commit_logs_encoding: Commit messages encoding
|
||||||
button_quote: Quote
|
button_quote: צטט
|
||||||
setting_sequential_project_identifiers: Generate sequential project identifiers
|
setting_sequential_project_identifiers: Generate sequential project identifiers
|
||||||
notice_unable_delete_version: Unable to delete version
|
notice_unable_delete_version: לא ניתן למחוק גירסא
|
||||||
label_renamed: renamed
|
label_renamed: השם שונה
|
||||||
label_copied: copied
|
label_copied: הועתק
|
||||||
setting_plain_text_mail: plain text only (no HTML)
|
setting_plain_text_mail: טקסט פשוט בלבד (ללא HTML)
|
||||||
permission_view_files: View files
|
permission_view_files: צפה בקבצים
|
||||||
permission_edit_issues: Edit issues
|
permission_edit_issues: ערוך נושאים
|
||||||
permission_edit_own_time_entries: Edit own time logs
|
permission_edit_own_time_entries: ערוך את לוג הזמן של עצמך
|
||||||
permission_manage_public_queries: Manage public queries
|
permission_manage_public_queries: נהל שאילתות פומביות
|
||||||
permission_add_issues: Add issues
|
permission_add_issues: הוסף נושא
|
||||||
permission_log_time: Log spent time
|
permission_log_time: תעד זמן שבוזבז
|
||||||
permission_view_changesets: View changesets
|
permission_view_changesets: צפה בקבוצות שינויים
|
||||||
permission_view_time_entries: View spent time
|
permission_view_time_entries: צפה בזמן שבוזבז
|
||||||
permission_manage_versions: Manage versions
|
permission_manage_versions: נהל גירסאות
|
||||||
permission_manage_wiki: Manage wiki
|
permission_manage_wiki: נהל wiki
|
||||||
permission_manage_categories: Manage issue categories
|
permission_manage_categories: נהל קטגוריות נושאים
|
||||||
permission_protect_wiki_pages: Protect wiki pages
|
permission_protect_wiki_pages: הגן כל דפי wiki
|
||||||
permission_comment_news: Comment news
|
permission_comment_news: הגב על החדשות
|
||||||
permission_delete_messages: Delete messages
|
permission_delete_messages: מחק הודעות
|
||||||
permission_select_project_modules: Select project modules
|
permission_select_project_modules: בחר מודולי פרויקט
|
||||||
permission_manage_documents: Manage documents
|
permission_manage_documents: נהל מסמכים
|
||||||
permission_edit_wiki_pages: Edit wiki pages
|
permission_edit_wiki_pages: ערוך דפי wiki
|
||||||
permission_add_issue_watchers: Add watchers
|
permission_add_issue_watchers: הוסף צופים
|
||||||
permission_view_gantt: View gantt chart
|
permission_view_gantt: צפה בגאנט
|
||||||
permission_move_issues: Move issues
|
permission_move_issues: הזז נושאים
|
||||||
permission_manage_issue_relations: Manage issue relations
|
permission_manage_issue_relations: נהל יחס בין נושאים
|
||||||
permission_delete_wiki_pages: Delete wiki pages
|
permission_delete_wiki_pages: מחק דפי wiki
|
||||||
permission_manage_boards: Manage boards
|
permission_manage_boards: נהל לוחות
|
||||||
permission_delete_wiki_pages_attachments: Delete attachments
|
permission_delete_wiki_pages_attachments: מחק דבוקות
|
||||||
permission_view_wiki_edits: View wiki history
|
permission_view_wiki_edits: צפה בהיסטורית wiki
|
||||||
permission_add_messages: Post messages
|
permission_add_messages: הצב הודעות
|
||||||
permission_view_messages: View messages
|
permission_view_messages: צפה בהודעות
|
||||||
permission_manage_files: Manage files
|
permission_manage_files: נהל קבצים
|
||||||
permission_edit_issue_notes: Edit notes
|
permission_edit_issue_notes: ערוך רשימות
|
||||||
permission_manage_news: Manage news
|
permission_manage_news: נהל חדשות
|
||||||
permission_view_calendar: View calendrier
|
permission_view_calendar: צפה בלוח השנה
|
||||||
permission_manage_members: Manage members
|
permission_manage_members: נהל חברים
|
||||||
permission_edit_messages: Edit messages
|
permission_edit_messages: ערוך הודעות
|
||||||
permission_delete_issues: Delete issues
|
permission_delete_issues: מחק נושאים
|
||||||
permission_view_issue_watchers: View watchers list
|
permission_view_issue_watchers: צפה ברשימה צופים
|
||||||
permission_manage_repository: Manage repository
|
permission_manage_repository: נהל מאגר
|
||||||
permission_commit_access: Commit access
|
permission_commit_access: Commit access
|
||||||
permission_browse_repository: Browse repository
|
permission_browse_repository: סייר במאגר
|
||||||
permission_view_documents: View documents
|
permission_view_documents: צפה במסמכים
|
||||||
permission_edit_project: Edit project
|
permission_edit_project: ערוך פרויקט
|
||||||
permission_add_issue_notes: Add notes
|
permission_add_issue_notes: Add notes
|
||||||
permission_save_queries: Save queries
|
permission_save_queries: שמור שאילתות
|
||||||
permission_view_wiki_pages: View wiki
|
permission_view_wiki_pages: צפה ב-wiki
|
||||||
permission_rename_wiki_pages: Rename wiki pages
|
permission_rename_wiki_pages: שנה שם של דפי wiki
|
||||||
permission_edit_time_entries: Edit time logs
|
permission_edit_time_entries: ערוך רישום זמנים
|
||||||
permission_edit_own_issue_notes: Edit own notes
|
permission_edit_own_issue_notes: Edit own notes
|
||||||
setting_gravatar_enabled: Use Gravatar user icons
|
setting_gravatar_enabled: Use Gravatar user icons
|
||||||
label_example: Example
|
label_example: דוגמא
|
||||||
text_repository_usernames_mapping: "Select ou update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped."
|
text_repository_usernames_mapping: "Select ou update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped."
|
||||||
permission_edit_own_messages: Edit own messages
|
permission_edit_own_messages: ערוך הודעות של עצמך
|
||||||
permission_delete_own_messages: Delete own messages
|
permission_delete_own_messages: מחק הודעות של עצמך
|
||||||
label_user_activity: "%s's activity"
|
label_user_activity: "הפעילות של %s"
|
||||||
label_updated_time_by: Updated by %s %s ago
|
label_updated_time_by: עודכן ע"י %s לפני %s
|
||||||
|
setting_diff_max_lines_displayed: Max number of diff lines displayed
|
||||||
|
text_plugin_assets_writable: Plugin assets directory writable
|
||||||
|
text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
|
||||||
|
warning_attachments_not_saved: "%d file(s) could not be saved."
|
||||||
|
button_create_and_continue: Create and continue
|
||||||
|
|||||||
+6
-1
@@ -694,4 +694,9 @@ text_repository_usernames_mapping: "Állítsd be a felhasználó összerendelés
|
|||||||
permission_edit_own_messages: Saját üzenetek szerkesztése
|
permission_edit_own_messages: Saját üzenetek szerkesztése
|
||||||
permission_delete_own_messages: Saját üzenetek törlése
|
permission_delete_own_messages: Saját üzenetek törlése
|
||||||
label_user_activity: "%s tevékenységei"
|
label_user_activity: "%s tevékenységei"
|
||||||
label_updated_time_by: Updated by %s %s ago
|
label_updated_time_by: "Módosította %s ennyivel ezelőtt: %s"
|
||||||
|
text_diff_truncated: '... A diff fájl vége nem jelenik meg, mert hosszab, mint a megjeleníthető sorok száma.'
|
||||||
|
setting_diff_max_lines_displayed: A megjelenítendő sorok száma (maximum) a diff fájloknál
|
||||||
|
text_plugin_assets_writable: Plugin assets directory writable
|
||||||
|
warning_attachments_not_saved: "%d file(s) could not be saved."
|
||||||
|
button_create_and_continue: Create and continue
|
||||||
|
|||||||
@@ -694,3 +694,8 @@ permission_edit_own_messages: Modifica propri messaggi
|
|||||||
permission_delete_own_messages: Elimina propri messaggi
|
permission_delete_own_messages: Elimina propri messaggi
|
||||||
label_user_activity: "%s's activity"
|
label_user_activity: "%s's activity"
|
||||||
label_updated_time_by: Updated by %s %s ago
|
label_updated_time_by: Updated by %s %s ago
|
||||||
|
text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
|
||||||
|
setting_diff_max_lines_displayed: Max number of diff lines displayed
|
||||||
|
text_plugin_assets_writable: Plugin assets directory writable
|
||||||
|
warning_attachments_not_saved: "%d file(s) could not be saved."
|
||||||
|
button_create_and_continue: Create and continue
|
||||||
|
|||||||
@@ -695,3 +695,8 @@ permission_edit_own_messages: Edit own messages
|
|||||||
permission_delete_own_messages: Delete own messages
|
permission_delete_own_messages: Delete own messages
|
||||||
label_user_activity: "%s's activity"
|
label_user_activity: "%s's activity"
|
||||||
label_updated_time_by: Updated by %s %s ago
|
label_updated_time_by: Updated by %s %s ago
|
||||||
|
text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
|
||||||
|
setting_diff_max_lines_displayed: Max number of diff lines displayed
|
||||||
|
text_plugin_assets_writable: Plugin assets directory writable
|
||||||
|
warning_attachments_not_saved: "%d file(s) could not be saved."
|
||||||
|
button_create_and_continue: Create and continue
|
||||||
|
|||||||
+39
-34
@@ -97,7 +97,7 @@ field_mail: 메일
|
|||||||
field_filename: 파일
|
field_filename: 파일
|
||||||
field_filesize: 크기
|
field_filesize: 크기
|
||||||
field_downloads: 다운로드
|
field_downloads: 다운로드
|
||||||
field_author: 보고자
|
field_author: 저자
|
||||||
field_created_on: 보고시간
|
field_created_on: 보고시간
|
||||||
field_updated_on: 변경시간
|
field_updated_on: 변경시간
|
||||||
field_field_format: 포맷
|
field_field_format: 포맷
|
||||||
@@ -120,18 +120,18 @@ field_subject: 제목
|
|||||||
field_due_date: 완료 기한
|
field_due_date: 완료 기한
|
||||||
field_assigned_to: 담당자
|
field_assigned_to: 담당자
|
||||||
field_priority: 우선순위
|
field_priority: 우선순위
|
||||||
field_fixed_version: 목표 버전
|
field_fixed_version: 목표버전
|
||||||
field_user: 사용자
|
field_user: 사용자
|
||||||
field_role: 역할
|
field_role: 역할
|
||||||
field_homepage: 홈페이지
|
field_homepage: 홈페이지
|
||||||
field_is_public: 공개
|
field_is_public: 공개
|
||||||
field_parent: 상위 프로젝트
|
field_parent: 상위 프로젝트
|
||||||
field_is_in_chlog: 변경이력(changelog)에서 보여지는 일감들
|
field_is_in_chlog: 변경이력(changelog)에서 표시할 일감들
|
||||||
field_is_in_roadmap: 로드맵에서 보여지는 일감들
|
field_is_in_roadmap: 로드맵에서표시할 일감들
|
||||||
field_login: 로그인
|
field_login: 로그인
|
||||||
field_mail_notification: 메일 알림
|
field_mail_notification: 메일 알림
|
||||||
field_admin: 관리자
|
field_admin: 관리자
|
||||||
field_last_login_on: 최종 접속
|
field_last_login_on: 마지막 로그인
|
||||||
field_language: 언어
|
field_language: 언어
|
||||||
field_effective_date: 일자
|
field_effective_date: 일자
|
||||||
field_password: 비밀번호
|
field_password: 비밀번호
|
||||||
@@ -188,7 +188,7 @@ setting_commit_ref_keywords: 일감 참조에 사용할 키워드들
|
|||||||
setting_commit_fix_keywords: 일감 해결에 사용할 키워드들
|
setting_commit_fix_keywords: 일감 해결에 사용할 키워드들
|
||||||
setting_autologin: 자동 로그인
|
setting_autologin: 자동 로그인
|
||||||
setting_date_format: 날짜 형식
|
setting_date_format: 날짜 형식
|
||||||
setting_cross_project_issue_relations: 프로젝트간 일감에 관련을 맺는 것을 허용
|
setting_cross_project_issue_relations: 프로젝트간 일감에 관계을 맺는 것을 허용
|
||||||
setting_issue_list_default_columns: 일감 목록에 보여줄 기본 컬럼들
|
setting_issue_list_default_columns: 일감 목록에 보여줄 기본 컬럼들
|
||||||
setting_repositories_encodings: 저장소 인코딩
|
setting_repositories_encodings: 저장소 인코딩
|
||||||
setting_emails_footer: 메일 꼬리
|
setting_emails_footer: 메일 꼬리
|
||||||
@@ -201,9 +201,9 @@ label_project_new: 새 프로젝트
|
|||||||
label_project_plural: 프로젝트
|
label_project_plural: 프로젝트
|
||||||
label_project_all: 모든 프로젝트
|
label_project_all: 모든 프로젝트
|
||||||
label_project_latest: 최근 프로젝트
|
label_project_latest: 최근 프로젝트
|
||||||
label_issue: 일감 보기
|
label_issue: 일감
|
||||||
label_issue_new: 새 일감만들기
|
label_issue_new: 새 일감만들기
|
||||||
label_issue_plural: 일감 보기
|
label_issue_plural: 일감
|
||||||
label_issue_view_all: 모든 일감 보기
|
label_issue_view_all: 모든 일감 보기
|
||||||
label_document: 문서
|
label_document: 문서
|
||||||
label_document_new: 새 문서
|
label_document_new: 새 문서
|
||||||
@@ -243,15 +243,15 @@ label_administration: 관리자
|
|||||||
label_login: 로그인
|
label_login: 로그인
|
||||||
label_logout: 로그아웃
|
label_logout: 로그아웃
|
||||||
label_help: 도움말
|
label_help: 도움말
|
||||||
label_reported_issues: 보고된 일감
|
label_reported_issues: 보고한 일감
|
||||||
label_assigned_to_me_issues: 나에게 할당된 일감
|
label_assigned_to_me_issues: 나에게 할당된 일감
|
||||||
label_last_login: 최종 접속
|
label_last_login: 최종 접속
|
||||||
label_last_updates: 최종 변경 내역
|
label_last_updates: 최종 변경 내역
|
||||||
label_last_updates_plural: 최종변경 %d
|
label_last_updates_plural: 최종변경 %d
|
||||||
label_registered_on: 등록시각
|
label_registered_on: 등록시각
|
||||||
label_activity: 진행중인 작업
|
label_activity: 작업내역
|
||||||
label_new: 신규
|
label_new: 새로 만들기
|
||||||
label_logged_as: ▶
|
label_logged_as: '로그인계정:'
|
||||||
label_environment: 환경
|
label_environment: 환경
|
||||||
label_authentication: 인증설정
|
label_authentication: 인증설정
|
||||||
label_auth_source: 인증 모드
|
label_auth_source: 인증 모드
|
||||||
@@ -280,7 +280,7 @@ label_attachment_plural: 관련파일
|
|||||||
label_report: 보고서
|
label_report: 보고서
|
||||||
label_report_plural: 보고서
|
label_report_plural: 보고서
|
||||||
label_news: 뉴스
|
label_news: 뉴스
|
||||||
label_news_new: 뉴스추가
|
label_news_new: 새 뉴스
|
||||||
label_news_plural: 뉴스
|
label_news_plural: 뉴스
|
||||||
label_news_latest: 최근 뉴스
|
label_news_latest: 최근 뉴스
|
||||||
label_news_view_all: 모든 뉴스
|
label_news_view_all: 모든 뉴스
|
||||||
@@ -298,7 +298,7 @@ label_open_issues: 진행중
|
|||||||
label_open_issues_plural: 진행중
|
label_open_issues_plural: 진행중
|
||||||
label_closed_issues: 완료됨
|
label_closed_issues: 완료됨
|
||||||
label_closed_issues_plural: 완료됨
|
label_closed_issues_plural: 완료됨
|
||||||
label_total: Total
|
label_total: 합계
|
||||||
label_permissions: 허가권한
|
label_permissions: 허가권한
|
||||||
label_current_status: 일감 상태
|
label_current_status: 일감 상태
|
||||||
label_new_statuses_allowed: 허용되는 일감 상태
|
label_new_statuses_allowed: 허용되는 일감 상태
|
||||||
@@ -307,7 +307,7 @@ label_none: 없음
|
|||||||
label_next: 다음
|
label_next: 다음
|
||||||
label_previous: 이전
|
label_previous: 이전
|
||||||
label_used_by: 사용됨
|
label_used_by: 사용됨
|
||||||
label_details: 상세
|
label_details: 자세히
|
||||||
label_add_note: 일감덧글 추가
|
label_add_note: 일감덧글 추가
|
||||||
label_per_page: 페이지별
|
label_per_page: 페이지별
|
||||||
label_calendar: 달력
|
label_calendar: 달력
|
||||||
@@ -316,7 +316,7 @@ label_gantt: Gantt 챠트
|
|||||||
label_internal: 내부
|
label_internal: 내부
|
||||||
label_last_changes: 지난 변경사항 %d 건
|
label_last_changes: 지난 변경사항 %d 건
|
||||||
label_change_view_all: 모든 변경 내역 보기
|
label_change_view_all: 모든 변경 내역 보기
|
||||||
label_personalize_page: 입맛대로 구성하기(Drag & Drop)
|
label_personalize_page: 입맛대로 구성하기
|
||||||
label_comment: 댓글
|
label_comment: 댓글
|
||||||
label_comment_plural: 댓글
|
label_comment_plural: 댓글
|
||||||
label_comment_add: 댓글 추가
|
label_comment_add: 댓글 추가
|
||||||
@@ -353,7 +353,7 @@ label_latest_revision: 최근 개정판
|
|||||||
label_latest_revision_plural: 최근 개정판
|
label_latest_revision_plural: 최근 개정판
|
||||||
label_view_revisions: 개정판 보기
|
label_view_revisions: 개정판 보기
|
||||||
label_max_size: 최대 크기
|
label_max_size: 최대 크기
|
||||||
label_on: 'on'
|
label_on: '전체: '
|
||||||
label_sort_highest: 최상단으로
|
label_sort_highest: 최상단으로
|
||||||
label_sort_higher: 위로
|
label_sort_higher: 위로
|
||||||
label_sort_lower: 아래로
|
label_sort_lower: 아래로
|
||||||
@@ -361,7 +361,7 @@ label_sort_lowest: 최하단으로
|
|||||||
label_roadmap: 로드맵
|
label_roadmap: 로드맵
|
||||||
label_roadmap_due_in: 기한 %s
|
label_roadmap_due_in: 기한 %s
|
||||||
label_roadmap_overdue: %s 지연
|
label_roadmap_overdue: %s 지연
|
||||||
label_roadmap_no_issues: 이버전에 해당하는 일감 없음
|
label_roadmap_no_issues: 이 버전에 해당하는 일감 없음
|
||||||
label_search: 검색
|
label_search: 검색
|
||||||
label_result_plural: 결과
|
label_result_plural: 결과
|
||||||
label_all_words: 모든 단어
|
label_all_words: 모든 단어
|
||||||
@@ -412,19 +412,19 @@ label_disabled: 비활성화
|
|||||||
label_show_completed_versions: 완료된 버전 보기
|
label_show_completed_versions: 완료된 버전 보기
|
||||||
label_me: 나
|
label_me: 나
|
||||||
label_board: 게시판
|
label_board: 게시판
|
||||||
label_board_new: 신규 게시판
|
label_board_new: 새 게시판
|
||||||
label_board_plural: 게시판
|
label_board_plural: 게시판
|
||||||
label_topic_plural: 주제
|
label_topic_plural: 주제
|
||||||
label_message_plural: 관련글
|
label_message_plural: 관련글
|
||||||
label_message_last: 최종 글
|
label_message_last: 마지막 글
|
||||||
label_message_new: 새글쓰기
|
label_message_new: 새글쓰기
|
||||||
label_reply_plural: 답글
|
label_reply_plural: 답글
|
||||||
label_send_information: 사용자에게 계정정보를 보냄
|
label_send_information: 사용자에게 계정정보를 보냄
|
||||||
label_year: 년
|
label_year: 년
|
||||||
label_month: 월
|
label_month: 월
|
||||||
label_week: 주
|
label_week: 주
|
||||||
label_date_from: 에서
|
label_date_from: '기간:'
|
||||||
label_date_to: (으)로
|
label_date_to: ' ~ '
|
||||||
label_language_based: 언어설정에 따름
|
label_language_based: 언어설정에 따름
|
||||||
label_sort_by: 정렬방법(%s)
|
label_sort_by: 정렬방법(%s)
|
||||||
label_send_test_email: 테스트 메일 보내기
|
label_send_test_email: 테스트 메일 보내기
|
||||||
@@ -533,7 +533,7 @@ default_activity_development: 개발
|
|||||||
|
|
||||||
enumeration_issue_priorities: 일감 우선순위
|
enumeration_issue_priorities: 일감 우선순위
|
||||||
enumeration_doc_categories: 문서 카테고리
|
enumeration_doc_categories: 문서 카테고리
|
||||||
enumeration_activities: 진행활동(시간 추적)
|
enumeration_activities: 작업분류(시간추적)
|
||||||
button_copy: 복사
|
button_copy: 복사
|
||||||
mail_body_account_information_external: 레드마인에 로그인할 때 "%s" 계정을 사용하실 수 있습니다.
|
mail_body_account_information_external: 레드마인에 로그인할 때 "%s" 계정을 사용하실 수 있습니다.
|
||||||
button_change_password: 비밀번호 변경
|
button_change_password: 비밀번호 변경
|
||||||
@@ -555,7 +555,7 @@ button_annotate: 주석달기(annotate)
|
|||||||
label_issues_by: 일감분류 방식 %s
|
label_issues_by: 일감분류 방식 %s
|
||||||
field_searchable: 검색가능
|
field_searchable: 검색가능
|
||||||
label_display_per_page: '페이지당: %s'
|
label_display_per_page: '페이지당: %s'
|
||||||
setting_per_page_options: 페이지당 표시할 객채 수
|
setting_per_page_options: 페이지당 표시할 객체 수
|
||||||
label_age: 마지막 수정일
|
label_age: 마지막 수정일
|
||||||
notice_default_data_loaded: 기본 설정을 성공적으로 로드하였습니다.
|
notice_default_data_loaded: 기본 설정을 성공적으로 로드하였습니다.
|
||||||
text_load_default_configuration: 기본 설정을 로딩하기
|
text_load_default_configuration: 기본 설정을 로딩하기
|
||||||
@@ -585,20 +585,20 @@ project_module_files: 관련파일
|
|||||||
project_module_documents: 문서
|
project_module_documents: 문서
|
||||||
project_module_repository: 저장소
|
project_module_repository: 저장소
|
||||||
project_module_news: 뉴스
|
project_module_news: 뉴스
|
||||||
project_module_time_tracking: 진행중인 작업
|
project_module_time_tracking: 시간추적
|
||||||
text_file_repository_writable: 파일 저장소 쓰기 가능
|
text_file_repository_writable: 파일 저장소 쓰기 가능
|
||||||
text_default_administrator_account_changed: 기본 관리자 계정이 변경되었습니다.
|
text_default_administrator_account_changed: 기본 관리자 계정이 변경되었습니다.
|
||||||
text_rmagick_available: RMagick available (optional)
|
text_rmagick_available: RMagick 사용가능(옵션)
|
||||||
button_configure: 설정
|
button_configure: 설정
|
||||||
label_plugins: 플러그인
|
label_plugins: 플러그인
|
||||||
label_ldap_authentication: LDAP 인증
|
label_ldap_authentication: LDAP 인증
|
||||||
label_downloads_abbr: D/L
|
label_downloads_abbr: D/L
|
||||||
label_add_another_file: 다른 파일 추가
|
label_add_another_file: 다른 파일 추가
|
||||||
label_this_month: 이번 달
|
label_this_month: 이번 달
|
||||||
text_destroy_time_entries_question: %.02f hours were reported on the issues you are about to delete. What do you want to do ?
|
text_destroy_time_entries_question: 삭제하려는 일감에 %.02f 시간이 보고되어 있습니다. 어떻게 하시겠습니까?
|
||||||
label_last_n_days: 지난 %d 일
|
label_last_n_days: 지난 %d 일
|
||||||
label_all_time: 모든 시간
|
label_all_time: 모든 시간
|
||||||
error_issue_not_found_in_project: 'The issue was not found or does not belong to this project'
|
error_issue_not_found_in_project: '일감이 없거나 이 프로젝트의 것이 아닙니다.'
|
||||||
label_this_year: 올해
|
label_this_year: 올해
|
||||||
text_assign_time_entries_to_project: 보고된 시간을 프로젝트에 할당하기
|
text_assign_time_entries_to_project: 보고된 시간을 프로젝트에 할당하기
|
||||||
label_date_range: 날짜 범위
|
label_date_range: 날짜 범위
|
||||||
@@ -608,15 +608,15 @@ label_optional_description: 부가적인 설명
|
|||||||
label_last_month: 지난 달
|
label_last_month: 지난 달
|
||||||
text_destroy_time_entries: 보고된 시간을 삭제하기
|
text_destroy_time_entries: 보고된 시간을 삭제하기
|
||||||
text_reassign_time_entries: '이 알림에 보고된 시간을 재할당하기:'
|
text_reassign_time_entries: '이 알림에 보고된 시간을 재할당하기:'
|
||||||
setting_activity_days_default: 프로젝트 활동에 보여질 날수
|
setting_activity_days_default: 프로젝트 작업내역에 보여줄 날수
|
||||||
label_chronological_order: 시간 순으로 정렬
|
label_chronological_order: 시간 순으로 정렬
|
||||||
field_comments_sorting: 히스토리 정렬 설정
|
field_comments_sorting: 히스토리 정렬 설정
|
||||||
label_reverse_chronological_order: 시간 역순으로 정렬
|
label_reverse_chronological_order: 시간 역순으로 정렬
|
||||||
label_preferences: Preferences
|
label_preferences: 설정
|
||||||
setting_display_subprojects_issues: 하위 프로젝트의 일감을 최상위 프로젝트에서 표시
|
setting_display_subprojects_issues: 하위 프로젝트의 일감을 최상위 프로젝트에서 표시
|
||||||
label_overall_activity: 전체 진행 상황
|
label_overall_activity: 전체 작업내역
|
||||||
setting_default_projects_public: 새 프로젝트를 공개로 설정
|
setting_default_projects_public: 새 프로젝트를 공개로 설정
|
||||||
error_scm_annotate: "The entry does not exist or can not be annotated."
|
error_scm_annotate: "항목이 없거나 주석을 달 수 없습니다."
|
||||||
label_planning: 프로젝트계획(Planning)
|
label_planning: 프로젝트계획(Planning)
|
||||||
text_subprojects_destroy_warning: '서브프로젝트(%s)가 자동으로 지워질 것입니다.'
|
text_subprojects_destroy_warning: '서브프로젝트(%s)가 자동으로 지워질 것입니다.'
|
||||||
label_and_its_subprojects: %s와 서브프로젝트들
|
label_and_its_subprojects: %s와 서브프로젝트들
|
||||||
@@ -692,5 +692,10 @@ label_example: 예
|
|||||||
text_repository_usernames_mapping: "저장소 로그에서 발견된 각 사용자에 레드마인 사용자를 업데이트할때 선택합니다.\n레드마인과 저장소의 이름이나 이메일이 같은 사용자가 자동으로 연결됩니다."
|
text_repository_usernames_mapping: "저장소 로그에서 발견된 각 사용자에 레드마인 사용자를 업데이트할때 선택합니다.\n레드마인과 저장소의 이름이나 이메일이 같은 사용자가 자동으로 연결됩니다."
|
||||||
permission_edit_own_messages: 자기 메시지 편집
|
permission_edit_own_messages: 자기 메시지 편집
|
||||||
permission_delete_own_messages: 자기 메시지 삭제
|
permission_delete_own_messages: 자기 메시지 삭제
|
||||||
label_user_activity: "%s의 활동"
|
label_user_activity: "%s의 작업내역"
|
||||||
label_updated_time_by: Updated by %s %s ago
|
label_updated_time_by: %s가 %s 전에 변경
|
||||||
|
text_diff_truncated: '... 이 차이점은 표시할 수 있는 최대 줄수를 초과해서 이 차이점은 잘렸습니다.'
|
||||||
|
setting_diff_max_lines_displayed: 차이점보기에 표시할 최대 줄수
|
||||||
|
text_plugin_assets_writable: Plugin assets directory writable
|
||||||
|
warning_attachments_not_saved: "%d file(s) could not be saved."
|
||||||
|
button_create_and_continue: Create and continue
|
||||||
|
|||||||
+572
-567
File diff suppressed because it is too large
Load Diff
@@ -696,3 +696,8 @@ permission_edit_own_messages: Edit own messages
|
|||||||
permission_delete_own_messages: Delete own messages
|
permission_delete_own_messages: Delete own messages
|
||||||
label_user_activity: "%s's activity"
|
label_user_activity: "%s's activity"
|
||||||
label_updated_time_by: Updated by %s %s ago
|
label_updated_time_by: Updated by %s %s ago
|
||||||
|
text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
|
||||||
|
setting_diff_max_lines_displayed: Max number of diff lines displayed
|
||||||
|
text_plugin_assets_writable: Plugin assets directory writable
|
||||||
|
warning_attachments_not_saved: "%d file(s) could not be saved."
|
||||||
|
button_create_and_continue: Create and continue
|
||||||
|
|||||||
@@ -695,3 +695,8 @@ permission_edit_own_messages: Edit own messages
|
|||||||
permission_delete_own_messages: Delete own messages
|
permission_delete_own_messages: Delete own messages
|
||||||
label_user_activity: "%s's activity"
|
label_user_activity: "%s's activity"
|
||||||
label_updated_time_by: Updated by %s %s ago
|
label_updated_time_by: Updated by %s %s ago
|
||||||
|
text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
|
||||||
|
setting_diff_max_lines_displayed: Max number of diff lines displayed
|
||||||
|
text_plugin_assets_writable: Plugin assets directory writable
|
||||||
|
warning_attachments_not_saved: "%d file(s) could not be saved."
|
||||||
|
button_create_and_continue: Create and continue
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user