Compare commits
45
Commits
2.2-stable
...
0.8.2
| 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 | ||
|
|
644f03b834 | ||
|
|
1154141ee7 | ||
|
|
bf42d9b706 |
@@ -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 %>
|
||||||
|
|||||||
@@ -10,7 +10,8 @@
|
|||||||
<table style="width:100%">
|
<table style="width:100%">
|
||||||
<% @issue.relations.each do |relation| %>
|
<% @issue.relations.each do |relation| %>
|
||||||
<tr>
|
<tr>
|
||||||
<td><%= l(relation.label_for(@issue)) %> <%= "(#{lwr(:actionview_datehelper_time_in_words_day, relation.delay)})" if relation.delay && relation.delay != 0 %> <%= link_to_issue relation.other_issue(@issue) %></td>
|
<td><%= l(relation.label_for(@issue)) %> <%= "(#{lwr(:actionview_datehelper_time_in_words_day, relation.delay)})" if relation.delay && relation.delay != 0 %>
|
||||||
|
<%= h(relation.other_issue(@issue).project) + ' - ' if Setting.cross_project_issue_relations? %> <%= link_to_issue relation.other_issue(@issue) %></td>
|
||||||
<td><%=h relation.other_issue(@issue).subject %></td>
|
<td><%=h relation.other_issue(@issue).subject %></td>
|
||||||
<td><%= relation.other_issue(@issue).status.name %></td>
|
<td><%= relation.other_issue(@issue).status.name %></td>
|
||||||
<td><%= format_date(relation.other_issue(@issue).start_date) %></td>
|
<td><%= format_date(relation.other_issue(@issue).start_date) %></td>
|
||||||
|
|||||||
@@ -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;",
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
# ENV['RAILS_ENV'] ||= 'production'
|
# ENV['RAILS_ENV'] ||= 'production'
|
||||||
|
|
||||||
# Specifies gem version of Rails to use when vendor/rails is not present
|
# Specifies gem version of Rails to use when vendor/rails is not present
|
||||||
RAILS_GEM_VERSION = '2.1.0' unless defined? RAILS_GEM_VERSION
|
RAILS_GEM_VERSION = '2.1.2' unless defined? RAILS_GEM_VERSION
|
||||||
|
|
||||||
# Bootstrap the Rails environment, frameworks, and default configuration
|
# Bootstrap the Rails environment, frameworks, and default configuration
|
||||||
require File.join(File.dirname(__FILE__), 'boot')
|
require File.join(File.dirname(__FILE__), 'boot')
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
+236
-1
@@ -1,10 +1,245 @@
|
|||||||
== 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
|
||||||
|
|
||||||
|
* Wiki page protection
|
||||||
|
* Wiki page hierarchy. Parent page can be assigned on the Rename screen
|
||||||
|
* Adds support for issue creation via email
|
||||||
|
* Adds support for free ticket filtering and custom queries on Gantt chart and calendar
|
||||||
|
* Cross-project search
|
||||||
|
* Ability to search a project and its subprojects
|
||||||
|
* Ability to search the projects the user belongs to
|
||||||
|
* Adds custom fields on time entries
|
||||||
|
* Adds boolean and list custom fields for time entries as criteria on time report
|
||||||
|
* Cross-project time reports
|
||||||
|
* Display latest user's activity on account/show view
|
||||||
|
* Show last connexion time on user's page
|
||||||
|
* Obfuscates email address on user's account page using javascript
|
||||||
|
* wiki TOC rendered as an unordered list
|
||||||
|
* Adds the ability to search for a user on the administration users list
|
||||||
|
* Adds the ability to search for a project name or identifier on the administration projects list
|
||||||
|
* Redirect user to the previous page after logging in
|
||||||
|
* Adds a permission 'view wiki edits' so that wiki history can be hidden to certain users
|
||||||
|
* Adds permissions for viewing the watcher list and adding new watchers on the issue detail view
|
||||||
|
* Adds permissions to let users edit and/or delete their messages
|
||||||
|
* Link to activity view when displaying dates
|
||||||
|
* Hide Redmine version in atom feeds and pdf properties
|
||||||
|
* Maps repository users to Redmine users. Users with same username or email are automatically mapped. Mapping can be manually adjusted in repository settings. Multiple usernames can be mapped to the same Redmine user.
|
||||||
|
* Sort users by their display names so that user dropdown lists are sorted alphabetically
|
||||||
|
* Adds estimated hours to issue filters
|
||||||
|
* Switch order of current and previous revisions in side-by-side diff
|
||||||
|
* Render the commit changes list as a tree
|
||||||
|
* Adds watch/unwatch functionality at forum topic level
|
||||||
|
* When moving an issue to another project, reassign it to the category with same name if any
|
||||||
|
* Adds child_pages macro for wiki pages
|
||||||
|
* Use GET instead of POST on roadmap (#718), gantt and calendar forms
|
||||||
|
* Search engine: display total results count and count by result type
|
||||||
|
* Email delivery configuration moved to an unversioned YAML file (config/email.yml, see the sample file)
|
||||||
|
* Adds icons on search results
|
||||||
|
* Adds 'Edit' link on account/show for admin users
|
||||||
|
* Adds Lock/Unlock/Activate link on user edit screen
|
||||||
|
* Adds user count in status drop down on admin user list
|
||||||
|
* Adds multi-levels blockquotes support by using > at the beginning of lines
|
||||||
|
* Adds a Reply link to each issue note
|
||||||
|
* Adds plain text only option for mail notifications
|
||||||
|
* Gravatar support for issue detail, user grid, and activity stream (disabled by default)
|
||||||
|
* Adds 'Delete wiki pages attachments' permission
|
||||||
|
* Show the most recent file when displaying an inline image
|
||||||
|
* Makes permission screens localized
|
||||||
|
* AuthSource list: display associated users count and disable 'Delete' buton if any
|
||||||
|
* Make the 'duplicates of' relation asymmetric
|
||||||
|
* Adds username to the password reminder email
|
||||||
|
* Adds links to forum messages using message#id syntax
|
||||||
|
* Allow same name for custom fields on different object types
|
||||||
|
* One-click bulk edition using the issue list context menu within the same project
|
||||||
|
* Adds support for commit logs reencoding to UTF-8 before insertion in the database. Source encoding of commit logs can be selected in Application settings -> Repositories.
|
||||||
|
* Adds checkboxes toggle links on permissions report
|
||||||
|
* Adds Trac-Like anchors on wiki headings
|
||||||
|
* Adds support for wiki links with anchor
|
||||||
|
* Adds category to the issue context menu
|
||||||
|
* Adds a workflow overview screen
|
||||||
|
* Appends the filename to the attachment url so that clients that ignore content-disposition http header get the real filename
|
||||||
|
* Dots allowed in custom field name
|
||||||
|
* Adds posts quoting functionality
|
||||||
|
* Adds an option to generate sequential project identifiers
|
||||||
|
* Adds mailto link on the user administration list
|
||||||
|
* Ability to remove enumerations (activities, priorities, document categories) that are in use. Associated objects can be reassigned to another value
|
||||||
|
* Gantt chart: display issues that don't have a due date if they are assigned to a version with a date
|
||||||
|
* Change projects homepage limit to 255 chars
|
||||||
|
* Improved on-the-fly account creation. If some attributes are missing (eg. not present in the LDAP) or are invalid, the registration form is displayed so that the user is able to fill or fix these attributes
|
||||||
|
* Adds "please select" to activity select box if no activity is set as default
|
||||||
|
* Do not silently ignore timelog validation failure on issue edit
|
||||||
|
* Adds a rake task to send reminder emails
|
||||||
|
* Allow empty cells in wiki tables
|
||||||
|
* Makes wiki text formatter pluggable
|
||||||
|
* Adds back textile acronyms support
|
||||||
|
* Remove pre tag attributes
|
||||||
|
* Plugin hooks
|
||||||
|
* Pluggable admin menu
|
||||||
|
* Plugins can provide activity content
|
||||||
|
* Moves plugin list to its own administration menu item
|
||||||
|
* Adds url and author_url plugin attributes
|
||||||
|
* Adds Plugin#requires_redmine method so that plugin compatibility can be checked against current Redmine version
|
||||||
|
* Adds atom feed on time entries details
|
||||||
|
* Adds project name to issues feed title
|
||||||
|
* Adds a css class on menu items in order to apply item specific styles (eg. icons)
|
||||||
|
* Adds a Redmine plugin generators
|
||||||
|
* Adds timelog link to the issue context menu
|
||||||
|
* Adds links to the user page on various views
|
||||||
|
* Turkish translation by Ismail Sezen
|
||||||
|
* Catalan translation
|
||||||
|
* Vietnamese translation
|
||||||
|
* Slovak translation
|
||||||
|
* Better naming of activity feed if only one kind of event is displayed
|
||||||
|
* Enable syntax highlight on issues, messages and news
|
||||||
|
* Add target version to the issue list context menu
|
||||||
|
* Hide 'Target version' filter if no version is defined
|
||||||
|
* Add filters on cross-project issue list for custom fields marked as 'For all projects'
|
||||||
|
* Turn ftp urls into links
|
||||||
|
* Hiding the View Differences button when a wiki page's history only has one version
|
||||||
|
* Messages on a Board can now be sorted by the number of replies
|
||||||
|
* Adds a class ('me') to events of the activity view created by current user
|
||||||
|
* Strip pre/code tags content from activity view events
|
||||||
|
* Display issue notes in the activity view
|
||||||
|
* Adds links to changesets atom feed on repository browser
|
||||||
|
* Track project and tracker changes in issue history
|
||||||
|
* Adds anchor to atom feed messages links
|
||||||
|
* Adds a key in lang files to set the decimal separator (point or comma) in csv exports
|
||||||
|
* Makes importer work with Trac 0.8.x
|
||||||
|
* Upgraded to Prototype 1.6.0.1
|
||||||
|
* File viewer for attached text files
|
||||||
|
* Menu mapper: add support for :before, :after and :last options to #push method and add #delete method
|
||||||
|
* Removed inconsistent revision numbers on diff view
|
||||||
|
* CVS: add support for modules names with spaces
|
||||||
|
* Log the user in after registration if account activation is not needed
|
||||||
|
* Mercurial adapter improvements
|
||||||
|
* Trac importer: read session_attribute table to find user's email and real name
|
||||||
|
* Ability to disable unused SCM adapters in application settings
|
||||||
|
* Adds Filesystem adapter
|
||||||
|
* Clear changesets and changes with raw sql when deleting a repository for performance
|
||||||
|
* Redmine.pm now uses the 'commit access' permission defined in Redmine
|
||||||
|
* Reposman can create any type of scm (--scm option)
|
||||||
|
* Reposman creates a repository if the 'repository' module is enabled at project level only
|
||||||
|
* Display svn properties in the browser, svn >= 1.5.0 only
|
||||||
|
* Reduces memory usage when importing large git repositories
|
||||||
|
* Wider SVG graphs in repository stats
|
||||||
|
* SubversionAdapter#entries performance improvement
|
||||||
|
* SCM browser: ability to download raw unified diffs
|
||||||
|
* More detailed error message in log when scm command fails
|
||||||
|
* Adds support for file viewing with Darcs 2.0+
|
||||||
|
* Check that git changeset is not in the database before creating it
|
||||||
|
* Unified diff viewer for attached files with .patch or .diff extension
|
||||||
|
* File size display with Bazaar repositories
|
||||||
|
* Git adapter: use commit time instead of author time
|
||||||
|
* Prettier url for changesets
|
||||||
|
* Makes changes link to entries on the revision view
|
||||||
|
* Adds a field on the repository view to browse at specific revision
|
||||||
|
* Adds new projects atom feed
|
||||||
|
* Added rake tasks to generate rcov code coverage reports
|
||||||
|
* Add Redcloth's :block_markdown_rule to allow horizontal rules in wiki
|
||||||
|
* Show the project hierarchy in the drop down list for new membership on user administration screen
|
||||||
|
* Split user edit screen into tabs
|
||||||
|
* Renames bundled RedCloth to RedCloth3 to avoid RedCloth 4 to be loaded instead
|
||||||
|
* Fixed: Roadmap crashes when a version has a due date > 2037
|
||||||
|
* Fixed: invalid effective date (eg. 99999-01-01) causes an error on version edition screen
|
||||||
|
* Fixed: login filter providing incorrect back_url for Redmine installed in sub-directory
|
||||||
|
* Fixed: logtime entry duplicated when edited from parent project
|
||||||
|
* Fixed: wrong digest for text files under Windows
|
||||||
|
* Fixed: associated revisions are displayed in wrong order on issue view
|
||||||
|
* Fixed: Git Adapter date parsing ignores timezone
|
||||||
|
* Fixed: Printing long roadmap doesn't split across pages
|
||||||
|
* Fixes custom fields display order at several places
|
||||||
|
* Fixed: urls containing @ are parsed as email adress by the wiki formatter
|
||||||
|
* Fixed date filters accuracy with SQLite
|
||||||
|
* Fixed: tokens not escaped in highlight_tokens regexp
|
||||||
|
* Fixed Bazaar shared repository browsing
|
||||||
|
* Fixes platform determination under JRuby
|
||||||
|
* Fixed: Estimated time in issue's journal should be rounded to two decimals
|
||||||
|
* Fixed: 'search titles only' box ignored after one search is done on titles only
|
||||||
|
* Fixed: non-ASCII subversion path can't be displayed
|
||||||
|
* Fixed: Inline images don't work if file name has upper case letters or if image is in BMP format
|
||||||
|
* Fixed: document listing shows on "my page" when viewing documents is disabled for the role
|
||||||
|
* Fixed: Latest news appear on the homepage for projects with the News module disabled
|
||||||
|
* Fixed: cross-project issue list should not show issues of projects for which the issue tracking module was disabled
|
||||||
|
* Fixed: the default status is lost when reordering issue statuses
|
||||||
|
* Fixes error with Postgresql and non-UTF8 commit logs
|
||||||
|
* Fixed: textile footnotes no longer work
|
||||||
|
* Fixed: http links containing parentheses fail to reder correctly
|
||||||
|
* Fixed: GitAdapter#get_rev should use current branch instead of hardwiring master
|
||||||
|
|
||||||
|
|
||||||
== 2008-07-06 v0.7.3
|
== 2008-07-06 v0.7.3
|
||||||
|
|
||||||
* Allow dot in firstnames and lastnames
|
* Allow dot in firstnames and lastnames
|
||||||
|
|||||||
+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)
|
||||||
|
|||||||
+1
-1
@@ -22,7 +22,7 @@ http://www.redmine.org/
|
|||||||
|
|
||||||
== Notes
|
== Notes
|
||||||
|
|
||||||
1. Rails 2.0.2 is required for version 0.7 and later.
|
1. Rails 2.1.2 is required for version 0.8.
|
||||||
|
|
||||||
2. When upgrading your code with svn update, don't forget to clear
|
2. When upgrading your code with svn update, don't forget to clear
|
||||||
the application cache (RAILS_ROOT/tmp/cache) before restarting.
|
the application cache (RAILS_ROOT/tmp/cache) before restarting.
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user