Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b5cfe79044 | ||
|
|
38a2beb2c0 | ||
|
|
77ba8bbfc0 | ||
|
|
7bbf4af0c1 | ||
|
|
babcd39918 | ||
|
|
924bb8da0b | ||
|
|
2c91d15c58 | ||
|
|
dd91dc4cb7 | ||
|
|
98eaff414f | ||
|
|
eb05880717 | ||
|
|
25b2ffb8fd | ||
|
|
c4e123b2f0 | ||
|
|
324baf60a6 | ||
|
|
22bcce63aa | ||
|
|
ef90132cf3 | ||
|
|
3909d2c8ba | ||
|
|
5e7e11440c | ||
|
|
7d55572bd1 | ||
|
|
945cd3933e | ||
|
|
47b969de00 | ||
|
|
c51f9b8907 | ||
|
|
65b6b7f5a9 | ||
|
|
d44a90045a | ||
|
|
1c63c443b6 | ||
|
|
b0b321bd11 | ||
|
|
8bd0ff03a0 | ||
|
|
7dbc8b4f97 | ||
|
|
019ea4adf3 | ||
|
|
0a62a9187c | ||
|
|
e450c124d9 | ||
|
|
e1a557fa58 | ||
|
|
b35bc6d93c | ||
|
|
4593d97472 | ||
|
|
d99d2efcca | ||
|
|
1c62645270 | ||
|
|
60caea006a | ||
|
|
5003152542 | ||
|
|
2149add25c | ||
|
|
b5bbc93325 | ||
|
|
7ad17f92b1 | ||
|
|
066f648949 | ||
|
|
46fc878396 | ||
|
|
d1952aefb8 | ||
|
|
4a5dce41e2 | ||
|
|
f74d9809fd | ||
|
|
f219a92c1f | ||
|
|
f8e46cfd30 | ||
|
|
9321ffde39 | ||
|
|
1e370f2c5a | ||
|
|
d2f9a726bb | ||
|
|
00423307ce | ||
|
|
5a639173de | ||
|
|
823fd16c3a | ||
|
|
e32fc44dc2 | ||
|
|
934221337d | ||
|
|
c48e40af31 | ||
|
|
47e12f12cc | ||
|
|
897258289a | ||
|
|
67867d99fe | ||
|
|
32b2e84477 | ||
|
|
1f278a0221 | ||
|
|
5e49df04d2 | ||
|
|
973c54d49b | ||
|
|
d2a4265f86 | ||
|
|
771723c595 | ||
|
|
8de76de8a1 | ||
|
|
f2711afe65 | ||
|
|
8fa5019e69 | ||
|
|
7b472a605d | ||
|
|
56fba472a7 | ||
|
|
af5d9ca907 | ||
|
|
8a42ca81a9 | ||
|
|
ada4c889be | ||
|
|
6fe600b163 | ||
|
|
b2e82fd5a0 | ||
|
|
cee0dce6b7 | ||
|
|
d090e539f6 | ||
|
|
29f9f3feff | ||
|
|
2bea4b30a5 | ||
|
|
00b53286fd | ||
|
|
c8c4fb130c | ||
|
|
0d7cead479 | ||
|
|
b5d64b9a2f | ||
|
|
519069b867 | ||
|
|
7443f2a310 | ||
|
|
b419deb907 | ||
|
|
b8d5a05b20 | ||
|
|
e29244652c | ||
|
|
27ef72c35e | ||
|
|
86e986f014 | ||
|
|
d60cc50d99 | ||
|
|
9e5d2100b6 | ||
|
|
ccbc9f8ff9 | ||
|
|
047bf692b3 | ||
|
|
3e692a908b | ||
|
|
d457f90fcd | ||
|
|
b9f23bedb7 | ||
|
|
d1a9f81fc6 | ||
|
|
80e833cd88 | ||
|
|
a12a073a6e | ||
|
|
bc57078b12 | ||
|
|
1c93f99a55 | ||
|
|
758feaccab | ||
|
|
2012c60bfd | ||
|
|
8ca6941a33 | ||
|
|
10a76f5e73 | ||
|
|
6e5f567346 | ||
|
|
7af610631f | ||
|
|
fab5064643 | ||
|
|
ab5ce45b43 | ||
|
|
5345a2dd89 | ||
|
|
7ca197b37f | ||
|
|
72ce3e18f8 | ||
|
|
358ee2ef2e | ||
|
|
b5b8d34d94 | ||
|
|
597266e5a2 | ||
|
|
36ad597b69 | ||
|
|
c67272599c | ||
|
|
b6bc3a3665 | ||
|
|
a96eb375ec | ||
|
|
c7e719fc4b | ||
|
|
18d841553e | ||
|
|
31d233e567 | ||
|
|
4ff6070126 | ||
|
|
dfe44017b6 | ||
|
|
7cae43314a | ||
|
|
2f529fd834 | ||
|
|
9892ede7b7 | ||
|
|
102e845391 | ||
|
|
7bdf0ab729 | ||
|
|
4426fd695e | ||
|
|
3f1c3fa020 | ||
|
|
19bbb6e2cb | ||
|
|
b02463184a | ||
|
|
a6408945e5 | ||
|
|
c20e85e4dd | ||
|
|
7a9fab7748 | ||
|
|
acaa223cf8 | ||
|
|
8dde6e019d | ||
|
|
ae3d542664 | ||
|
|
c731d11209 | ||
|
|
8458dc23d4 | ||
|
|
9af4cb5c38 | ||
|
|
df120e43cd | ||
|
|
59f98693ae | ||
|
|
677fee310a | ||
|
|
0843b188fb | ||
|
|
8f64938b9e | ||
|
|
29e7ae9698 | ||
|
|
f682be8468 | ||
|
|
e771fc03bd | ||
|
|
52a12aaca8 | ||
|
|
8146e096f4 | ||
|
|
41e38483a6 | ||
|
|
41c6d3cef6 | ||
|
|
ec526c1261 | ||
|
|
b4122707f6 | ||
|
|
f70a8cde88 | ||
|
|
69f34a595d | ||
|
|
be52ccf01f | ||
|
|
8a1d45ffd6 | ||
|
|
4b52b7a8df | ||
|
|
6ed2e003a1 | ||
|
|
1cc116fe5c | ||
|
|
619c148719 | ||
|
|
0ae9cc7d07 | ||
|
|
a2a3dae974 | ||
|
|
4f5dc94170 | ||
|
|
4775864d69 |
+1
-1
@@ -2,4 +2,4 @@
|
|||||||
|
|
||||||
Redmine is a flexible project management web application written using Ruby on Rails framework.
|
Redmine is a flexible project management web application written using Ruby on Rails framework.
|
||||||
|
|
||||||
More details can be found at http://www.redmine.org
|
More details can be found at in the doc directory or on the official website http://www.redmine.org
|
||||||
|
|||||||
@@ -83,9 +83,9 @@ class AccountController < ApplicationController
|
|||||||
else
|
else
|
||||||
@user = User.new(params[:user])
|
@user = User.new(params[:user])
|
||||||
@user.admin = false
|
@user.admin = false
|
||||||
@user.status = User::STATUS_REGISTERED
|
@user.register
|
||||||
if session[:auth_source_registration]
|
if session[:auth_source_registration]
|
||||||
@user.status = User::STATUS_ACTIVE
|
@user.activate
|
||||||
@user.login = session[:auth_source_registration][:login]
|
@user.login = session[:auth_source_registration][:login]
|
||||||
@user.auth_source_id = session[:auth_source_registration][:auth_source_id]
|
@user.auth_source_id = session[:auth_source_registration][:auth_source_id]
|
||||||
if @user.save
|
if @user.save
|
||||||
@@ -116,8 +116,8 @@ class AccountController < ApplicationController
|
|||||||
token = Token.find_by_action_and_value('register', params[:token])
|
token = Token.find_by_action_and_value('register', params[:token])
|
||||||
redirect_to(home_url) && return unless token and !token.expired?
|
redirect_to(home_url) && return unless token and !token.expired?
|
||||||
user = token.user
|
user = token.user
|
||||||
redirect_to(home_url) && return unless user.status == User::STATUS_REGISTERED
|
redirect_to(home_url) && return unless user.registered?
|
||||||
user.status = User::STATUS_ACTIVE
|
user.activate
|
||||||
if user.save
|
if user.save
|
||||||
token.destroy
|
token.destroy
|
||||||
flash[:notice] = l(:notice_account_activated)
|
flash[:notice] = l(:notice_account_activated)
|
||||||
@@ -170,7 +170,7 @@ class AccountController < ApplicationController
|
|||||||
user.mail = registration['email'] unless registration['email'].nil?
|
user.mail = registration['email'] unless registration['email'].nil?
|
||||||
user.firstname, user.lastname = registration['fullname'].split(' ') unless registration['fullname'].nil?
|
user.firstname, user.lastname = registration['fullname'].split(' ') unless registration['fullname'].nil?
|
||||||
user.random_password
|
user.random_password
|
||||||
user.status = User::STATUS_REGISTERED
|
user.register
|
||||||
|
|
||||||
case Setting.self_registration
|
case Setting.self_registration
|
||||||
when '1'
|
when '1'
|
||||||
@@ -241,7 +241,7 @@ class AccountController < ApplicationController
|
|||||||
# Pass a block for behavior when a user fails to save
|
# Pass a block for behavior when a user fails to save
|
||||||
def register_automatically(user, &block)
|
def register_automatically(user, &block)
|
||||||
# Automatic activation
|
# Automatic activation
|
||||||
user.status = User::STATUS_ACTIVE
|
user.activate
|
||||||
user.last_login_on = Time.now
|
user.last_login_on = Time.now
|
||||||
if user.save
|
if user.save
|
||||||
self.logged_user = user
|
self.logged_user = user
|
||||||
|
|||||||
@@ -0,0 +1,59 @@
|
|||||||
|
class ActivitiesController < ApplicationController
|
||||||
|
menu_item :activity
|
||||||
|
before_filter :find_optional_project
|
||||||
|
accept_key_auth :index
|
||||||
|
|
||||||
|
def index
|
||||||
|
@days = Setting.activity_days_default.to_i
|
||||||
|
|
||||||
|
if params[:from]
|
||||||
|
begin; @date_to = params[:from].to_date + 1; rescue; end
|
||||||
|
end
|
||||||
|
|
||||||
|
@date_to ||= Date.today + 1
|
||||||
|
@date_from = @date_to - @days
|
||||||
|
@with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1')
|
||||||
|
@author = (params[:user_id].blank? ? nil : User.active.find(params[:user_id]))
|
||||||
|
|
||||||
|
@activity = Redmine::Activity::Fetcher.new(User.current, :project => @project,
|
||||||
|
:with_subprojects => @with_subprojects,
|
||||||
|
:author => @author)
|
||||||
|
@activity.scope_select {|t| !params["show_#{t}"].nil?}
|
||||||
|
@activity.scope = (@author.nil? ? :default : :all) if @activity.scope.empty?
|
||||||
|
|
||||||
|
events = @activity.events(@date_from, @date_to)
|
||||||
|
|
||||||
|
if events.empty? || stale?(:etag => [events.first, User.current])
|
||||||
|
respond_to do |format|
|
||||||
|
format.html {
|
||||||
|
@events_by_day = events.group_by(&:event_date)
|
||||||
|
render :layout => false if request.xhr?
|
||||||
|
}
|
||||||
|
format.atom {
|
||||||
|
title = l(:label_activity)
|
||||||
|
if @author
|
||||||
|
title = @author.name
|
||||||
|
elsif @activity.scope.size == 1
|
||||||
|
title = l("label_#{@activity.scope.first.singularize}_plural")
|
||||||
|
end
|
||||||
|
render_feed(events, :title => "#{@project || Setting.app_title}: #{title}")
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
rescue ActiveRecord::RecordNotFound
|
||||||
|
render_404
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
# TODO: refactor, duplicated in projects_controller
|
||||||
|
def find_optional_project
|
||||||
|
return true unless params[:id]
|
||||||
|
@project = Project.find(params[:id])
|
||||||
|
authorize
|
||||||
|
rescue ActiveRecord::RecordNotFound
|
||||||
|
render_404
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
@@ -201,7 +201,23 @@ class ApplicationController < ActionController::Base
|
|||||||
def self.model_object(model)
|
def self.model_object(model)
|
||||||
write_inheritable_attribute('model_object', model)
|
write_inheritable_attribute('model_object', model)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Filter for bulk issue operations
|
||||||
|
def find_issues
|
||||||
|
@issues = Issue.find_all_by_id(params[:id] || params[:ids])
|
||||||
|
raise ActiveRecord::RecordNotFound if @issues.empty?
|
||||||
|
projects = @issues.collect(&:project).compact.uniq
|
||||||
|
if projects.size == 1
|
||||||
|
@project = projects.first
|
||||||
|
else
|
||||||
|
# TODO: let users bulk edit/move/destroy issues from different projects
|
||||||
|
render_error 'Can not bulk edit/move/destroy issues from different projects'
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
rescue ActiveRecord::RecordNotFound
|
||||||
|
render_404
|
||||||
|
end
|
||||||
|
|
||||||
# make sure that the user is a member of the project (or admin) if project is private
|
# make sure that the user is a member of the project (or admin) if project is private
|
||||||
# used as a before_filter for actions that do not require any particular permission on the project
|
# used as a before_filter for actions that do not require any particular permission on the project
|
||||||
def check_project_privacy
|
def check_project_privacy
|
||||||
@@ -218,6 +234,10 @@ class ApplicationController < ActionController::Base
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def back_url
|
||||||
|
params[:back_url] || request.env['HTTP_REFERER']
|
||||||
|
end
|
||||||
|
|
||||||
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?
|
||||||
@@ -238,7 +258,7 @@ class ApplicationController < ActionController::Base
|
|||||||
def render_403
|
def render_403
|
||||||
@project = nil
|
@project = nil
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.html { render :template => "common/403", :layout => (request.xhr? ? false : 'base'), :status => 403 }
|
format.html { render :template => "common/403", :layout => use_layout, :status => 403 }
|
||||||
format.atom { head 403 }
|
format.atom { head 403 }
|
||||||
format.xml { head 403 }
|
format.xml { head 403 }
|
||||||
format.js { head 403 }
|
format.js { head 403 }
|
||||||
@@ -249,7 +269,7 @@ class ApplicationController < ActionController::Base
|
|||||||
|
|
||||||
def render_404
|
def render_404
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.html { render :template => "common/404", :layout => !request.xhr?, :status => 404 }
|
format.html { render :template => "common/404", :layout => use_layout, :status => 404 }
|
||||||
format.atom { head 404 }
|
format.atom { head 404 }
|
||||||
format.xml { head 404 }
|
format.xml { head 404 }
|
||||||
format.js { head 404 }
|
format.js { head 404 }
|
||||||
@@ -262,7 +282,7 @@ class ApplicationController < ActionController::Base
|
|||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.html {
|
format.html {
|
||||||
flash.now[:error] = msg
|
flash.now[:error] = msg
|
||||||
render :text => '', :layout => !request.xhr?, :status => 500
|
render :text => '', :layout => use_layout, :status => 500
|
||||||
}
|
}
|
||||||
format.atom { head 500 }
|
format.atom { head 500 }
|
||||||
format.xml { head 500 }
|
format.xml { head 500 }
|
||||||
@@ -270,6 +290,13 @@ class ApplicationController < ActionController::Base
|
|||||||
format.json { head 500 }
|
format.json { head 500 }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Picks which layout to use based on the request
|
||||||
|
#
|
||||||
|
# @return [boolean, string] name of the layout to use or false for no layout
|
||||||
|
def use_layout
|
||||||
|
request.xhr? ? false : 'base'
|
||||||
|
end
|
||||||
|
|
||||||
def invalid_authenticity_token
|
def invalid_authenticity_token
|
||||||
if api_request?
|
if api_request?
|
||||||
@@ -345,6 +372,21 @@ class ApplicationController < ActionController::Base
|
|||||||
flash[:warning] = l(:warning_attachments_not_saved, obj.unsaved_attachments.size) if obj.unsaved_attachments.present?
|
flash[:warning] = l(:warning_attachments_not_saved, obj.unsaved_attachments.size) if obj.unsaved_attachments.present?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Sets the `flash` notice or error based the number of issues that did not save
|
||||||
|
#
|
||||||
|
# @param [Array, Issue] issues all of the saved and unsaved Issues
|
||||||
|
# @param [Array, Integer] unsaved_issue_ids the issue ids that were not saved
|
||||||
|
def set_flash_from_bulk_issue_save(issues, unsaved_issue_ids)
|
||||||
|
if unsaved_issue_ids.empty?
|
||||||
|
flash[:notice] = l(:notice_successful_update) unless issues.empty?
|
||||||
|
else
|
||||||
|
flash[:error] = l(:notice_failed_to_save_issues,
|
||||||
|
:count => unsaved_issue_ids.size,
|
||||||
|
:total => issues.size,
|
||||||
|
:ids => '#' + unsaved_issue_ids.join(', #'))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# Rescues an invalid query statement. Just in case...
|
# Rescues an invalid query statement. Just in case...
|
||||||
def query_statement_invalid(exception)
|
def query_statement_invalid(exception)
|
||||||
logger.error "Query::StatementInvalid: #{exception.message}" if logger
|
logger.error "Query::StatementInvalid: #{exception.message}" if logger
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
class AutoCompletesController < ApplicationController
|
||||||
|
before_filter :find_project
|
||||||
|
|
||||||
|
def issues
|
||||||
|
@issues = []
|
||||||
|
q = params[:q].to_s
|
||||||
|
if q.match(/^\d+$/)
|
||||||
|
@issues << @project.issues.visible.find_by_id(q.to_i)
|
||||||
|
end
|
||||||
|
unless q.blank?
|
||||||
|
@issues += @project.issues.visible.find(:all, :conditions => ["LOWER(#{Issue.table_name}.subject) LIKE ?", "%#{q.downcase}%"], :limit => 10)
|
||||||
|
end
|
||||||
|
render :layout => false
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def find_project
|
||||||
|
project_id = (params[:issue] && params[:issue][:project_id]) || params[:project_id]
|
||||||
|
@project = Project.find(project_id)
|
||||||
|
rescue ActiveRecord::RecordNotFound
|
||||||
|
render_404
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
@@ -18,6 +18,7 @@
|
|||||||
class BoardsController < ApplicationController
|
class BoardsController < ApplicationController
|
||||||
default_search_scope :messages
|
default_search_scope :messages
|
||||||
before_filter :find_project, :find_board_if_available, :authorize
|
before_filter :find_project, :find_board_if_available, :authorize
|
||||||
|
accept_key_auth :index, :show
|
||||||
|
|
||||||
helper :messages
|
helper :messages
|
||||||
include MessagesHelper
|
include MessagesHelper
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
class CalendarsController < ApplicationController
|
class CalendarsController < ApplicationController
|
||||||
|
menu_item :calendar
|
||||||
before_filter :find_optional_project
|
before_filter :find_optional_project
|
||||||
|
|
||||||
rescue_from Query::StatementInvalid, :with => :query_statement_invalid
|
rescue_from Query::StatementInvalid, :with => :query_statement_invalid
|
||||||
|
|||||||
@@ -0,0 +1,39 @@
|
|||||||
|
class ContextMenusController < ApplicationController
|
||||||
|
helper :watchers
|
||||||
|
|
||||||
|
def issues
|
||||||
|
@issues = Issue.find_all_by_id(params[:ids], :include => :project)
|
||||||
|
if (@issues.size == 1)
|
||||||
|
@issue = @issues.first
|
||||||
|
@allowed_statuses = @issue.new_statuses_allowed_to(User.current)
|
||||||
|
else
|
||||||
|
@allowed_statuses = @issues.map do |i|
|
||||||
|
i.new_statuses_allowed_to(User.current)
|
||||||
|
end.inject do |memo,s|
|
||||||
|
memo & s
|
||||||
|
end
|
||||||
|
end
|
||||||
|
@projects = @issues.collect(&:project).compact.uniq
|
||||||
|
@project = @projects.first if @projects.size == 1
|
||||||
|
|
||||||
|
@can = {:edit => (@project && User.current.allowed_to?(:edit_issues, @project)),
|
||||||
|
:log_time => (@project && User.current.allowed_to?(:log_time, @project)),
|
||||||
|
:update => (@project && (User.current.allowed_to?(:edit_issues, @project) || (User.current.allowed_to?(:change_status, @project) && @allowed_statuses && !@allowed_statuses.empty?))),
|
||||||
|
:move => (@project && User.current.allowed_to?(:move_issues, @project)),
|
||||||
|
:copy => (@issue && @project.trackers.include?(@issue.tracker) && User.current.allowed_to?(:add_issues, @project)),
|
||||||
|
:delete => (@project && User.current.allowed_to?(:delete_issues, @project))
|
||||||
|
}
|
||||||
|
if @project
|
||||||
|
@assignables = @project.assignable_users
|
||||||
|
@assignables << @issue.assigned_to if @issue && @issue.assigned_to && !@assignables.include?(@issue.assigned_to)
|
||||||
|
@trackers = @project.trackers
|
||||||
|
end
|
||||||
|
|
||||||
|
@priorities = IssuePriority.all.reverse
|
||||||
|
@statuses = IssueStatus.find(:all, :order => 'position')
|
||||||
|
@back = back_url
|
||||||
|
|
||||||
|
render :layout => false
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
class FilesController < ApplicationController
|
||||||
|
menu_item :files
|
||||||
|
|
||||||
|
before_filter :find_project
|
||||||
|
before_filter :authorize
|
||||||
|
|
||||||
|
helper :sort
|
||||||
|
include SortHelper
|
||||||
|
|
||||||
|
def index
|
||||||
|
sort_init 'filename', 'asc'
|
||||||
|
sort_update 'filename' => "#{Attachment.table_name}.filename",
|
||||||
|
'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?
|
||||||
|
end
|
||||||
|
|
||||||
|
# TODO: split method into new (GET) and create (POST)
|
||||||
|
def new
|
||||||
|
if request.post?
|
||||||
|
container = (params[:version_id].blank? ? @project : @project.versions.find_by_id(params[:version_id]))
|
||||||
|
attachments = Attachment.attach_files(container, params[:attachments])
|
||||||
|
render_attachment_warning_if_needed(container)
|
||||||
|
|
||||||
|
if !attachments.empty? && !attachments[:files].blank? && Setting.notified_events.include?('file_added')
|
||||||
|
Mailer.deliver_attachments_added(attachments[:files])
|
||||||
|
end
|
||||||
|
redirect_to :controller => 'files', :action => 'index', :id => @project
|
||||||
|
return
|
||||||
|
end
|
||||||
|
@versions = @project.versions.sort
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
class GanttsController < ApplicationController
|
class GanttsController < ApplicationController
|
||||||
|
menu_item :gantt
|
||||||
before_filter :find_optional_project
|
before_filter :find_optional_project
|
||||||
|
|
||||||
rescue_from Query::StatementInvalid, :with => :query_statement_invalid
|
rescue_from Query::StatementInvalid, :with => :query_statement_invalid
|
||||||
@@ -37,7 +38,7 @@ class GanttsController < ApplicationController
|
|||||||
|
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.html { render :action => "show", :layout => !request.xhr? }
|
format.html { render :action => "show", :layout => !request.xhr? }
|
||||||
format.png { send_data(@gantt.to_image, :disposition => 'inline', :type => 'image/png', :filename => "#{basename}.png") } if @gantt.respond_to?('to_image')
|
format.png { send_data(@gantt.to_image(@project), :disposition => 'inline', :type => 'image/png', :filename => "#{basename}.png") } if @gantt.respond_to?('to_image')
|
||||||
format.pdf { send_data(gantt_to_pdf(@gantt, @project), :type => 'application/pdf', :filename => "#{basename}.pdf") }
|
format.pdf { send_data(gantt_to_pdf(@gantt, @project), :type => 'application/pdf', :filename => "#{basename}.pdf") }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -141,14 +141,22 @@ class GroupsController < ApplicationController
|
|||||||
@membership = Member.edit_membership(params[:membership_id], params[:membership], @group)
|
@membership = Member.edit_membership(params[:membership_id], params[:membership], @group)
|
||||||
@membership.save if request.post?
|
@membership.save if request.post?
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.html { redirect_to :controller => 'groups', :action => 'edit', :id => @group, :tab => 'memberships' }
|
if @membership.valid?
|
||||||
format.js {
|
format.html { redirect_to :controller => 'groups', :action => 'edit', :id => @group, :tab => 'memberships' }
|
||||||
render(:update) {|page|
|
format.js {
|
||||||
page.replace_html "tab-content-memberships", :partial => 'groups/memberships'
|
render(:update) {|page|
|
||||||
page.visual_effect(:highlight, "member-#{@membership.id}")
|
page.replace_html "tab-content-memberships", :partial => 'groups/memberships'
|
||||||
}
|
page.visual_effect(:highlight, "member-#{@membership.id}")
|
||||||
}
|
}
|
||||||
end
|
}
|
||||||
|
else
|
||||||
|
format.js {
|
||||||
|
render(:update) {|page|
|
||||||
|
page.alert(l(:notice_failed_to_save_members, :errors => @membership.errors.full_messages.join(', ')))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def destroy_membership
|
def destroy_membership
|
||||||
|
|||||||
@@ -0,0 +1,65 @@
|
|||||||
|
class IssueMovesController < ApplicationController
|
||||||
|
default_search_scope :issues
|
||||||
|
before_filter :find_issues
|
||||||
|
before_filter :authorize
|
||||||
|
|
||||||
|
def new
|
||||||
|
prepare_for_issue_move
|
||||||
|
render :layout => false if request.xhr?
|
||||||
|
end
|
||||||
|
|
||||||
|
def create
|
||||||
|
prepare_for_issue_move
|
||||||
|
|
||||||
|
if request.post?
|
||||||
|
new_tracker = params[:new_tracker_id].blank? ? nil : @target_project.trackers.find_by_id(params[:new_tracker_id])
|
||||||
|
unsaved_issue_ids = []
|
||||||
|
moved_issues = []
|
||||||
|
@issues.each do |issue|
|
||||||
|
issue.reload
|
||||||
|
issue.init_journal(User.current)
|
||||||
|
call_hook(:controller_issues_move_before_save, { :params => params, :issue => issue, :target_project => @target_project, :copy => !!@copy })
|
||||||
|
if r = issue.move_to_project(@target_project, new_tracker, {:copy => @copy, :attributes => extract_changed_attributes_for_move(params)})
|
||||||
|
moved_issues << r
|
||||||
|
else
|
||||||
|
unsaved_issue_ids << issue.id
|
||||||
|
end
|
||||||
|
end
|
||||||
|
set_flash_from_bulk_issue_save(@issues, unsaved_issue_ids)
|
||||||
|
|
||||||
|
if params[:follow]
|
||||||
|
if @issues.size == 1 && moved_issues.size == 1
|
||||||
|
redirect_to :controller => 'issues', :action => 'show', :id => moved_issues.first
|
||||||
|
else
|
||||||
|
redirect_to :controller => 'issues', :action => 'index', :project_id => (@target_project || @project)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
redirect_to :controller => 'issues', :action => 'index', :project_id => @project
|
||||||
|
end
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def prepare_for_issue_move
|
||||||
|
@issues.sort!
|
||||||
|
@copy = params[:copy_options] && params[:copy_options][:copy]
|
||||||
|
@allowed_projects = Issue.allowed_target_projects_on_move
|
||||||
|
@target_project = @allowed_projects.detect {|p| p.id.to_s == params[:new_project_id]} if params[:new_project_id]
|
||||||
|
@target_project ||= @project
|
||||||
|
@trackers = @target_project.trackers
|
||||||
|
@available_statuses = Workflow.available_statuses(@project)
|
||||||
|
end
|
||||||
|
|
||||||
|
def extract_changed_attributes_for_move(params)
|
||||||
|
changed_attributes = {}
|
||||||
|
[:assigned_to_id, :status_id, :start_date, :due_date].each do |valid_attribute|
|
||||||
|
unless params[valid_attribute].blank?
|
||||||
|
changed_attributes[valid_attribute] = (params[valid_attribute] == 'none' ? nil : params[valid_attribute])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
changed_attributes
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
@@ -19,14 +19,14 @@ class IssuesController < ApplicationController
|
|||||||
menu_item :new_issue, :only => [:new, :create]
|
menu_item :new_issue, :only => [:new, :create]
|
||||||
default_search_scope :issues
|
default_search_scope :issues
|
||||||
|
|
||||||
before_filter :find_issue, :only => [:show, :edit, :update, :reply]
|
before_filter :find_issue, :only => [:show, :edit, :update]
|
||||||
before_filter :find_issues, :only => [:bulk_edit, :move, :destroy]
|
before_filter :find_issues, :only => [:bulk_edit, :bulk_update, :move, :perform_move, :destroy]
|
||||||
before_filter :find_project, :only => [:new, :create, :update_form, :preview, :auto_complete]
|
before_filter :find_project, :only => [:new, :create]
|
||||||
before_filter :authorize, :except => [:index, :changes, :preview, :context_menu]
|
before_filter :authorize, :except => [:index]
|
||||||
before_filter :find_optional_project, :only => [:index, :changes]
|
before_filter :find_optional_project, :only => [:index]
|
||||||
before_filter :check_for_default_issue_status, :only => [:new, :create]
|
before_filter :check_for_default_issue_status, :only => [:new, :create]
|
||||||
before_filter :build_new_issue_from_params, :only => [:new, :create]
|
before_filter :build_new_issue_from_params, :only => [:new, :create]
|
||||||
accept_key_auth :index, :show, :changes
|
accept_key_auth :index, :show
|
||||||
|
|
||||||
rescue_from Query::StatementInvalid, :with => :query_statement_invalid
|
rescue_from Query::StatementInvalid, :with => :query_statement_invalid
|
||||||
|
|
||||||
@@ -54,6 +54,7 @@ class IssuesController < ApplicationController
|
|||||||
:render => { :nothing => true, :status => :method_not_allowed }
|
:render => { :nothing => true, :status => :method_not_allowed }
|
||||||
|
|
||||||
verify :method => :post, :only => :create, :render => {:nothing => true, :status => :method_not_allowed }
|
verify :method => :post, :only => :create, :render => {:nothing => true, :status => :method_not_allowed }
|
||||||
|
verify :method => :post, :only => :bulk_update, :render => {:nothing => true, :status => :method_not_allowed }
|
||||||
verify :method => :put, :only => :update, :render => {:nothing => true, :status => :method_not_allowed }
|
verify :method => :put, :only => :update, :render => {:nothing => true, :status => :method_not_allowed }
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@@ -95,21 +96,6 @@ class IssuesController < ApplicationController
|
|||||||
render_404
|
render_404
|
||||||
end
|
end
|
||||||
|
|
||||||
def changes
|
|
||||||
retrieve_query
|
|
||||||
sort_init 'id', 'desc'
|
|
||||||
sort_update(@query.sortable_columns)
|
|
||||||
|
|
||||||
if @query.valid?
|
|
||||||
@journals = @query.journals(:order => "#{Journal.table_name}.created_on DESC",
|
|
||||||
:limit => 25)
|
|
||||||
end
|
|
||||||
@title = (@project ? @project.name : Setting.app_title) + ": " + (@query.new_record? ? l(:label_changes_details) : @query.name)
|
|
||||||
render :layout => false, :content_type => 'application/atom+xml'
|
|
||||||
rescue ActiveRecord::RecordNotFound
|
|
||||||
render_404
|
|
||||||
end
|
|
||||||
|
|
||||||
def show
|
def show
|
||||||
@journals = @issue.journals.find(:all, :include => [:user, :details], :order => "#{Journal.table_name}.created_on ASC")
|
@journals = @issue.journals.find(:all, :include => [:user, :details], :order => "#{Journal.table_name}.created_on ASC")
|
||||||
@journals.each_with_index {|j,i| j.indice = i+1}
|
@journals.each_with_index {|j,i| j.indice = i+1}
|
||||||
@@ -124,7 +110,7 @@ class IssuesController < ApplicationController
|
|||||||
format.html { render :template => 'issues/show.rhtml' }
|
format.html { render :template => 'issues/show.rhtml' }
|
||||||
format.xml { render :layout => false }
|
format.xml { render :layout => false }
|
||||||
format.json { render :text => @issue.to_json, :layout => false }
|
format.json { render :text => @issue.to_json, :layout => false }
|
||||||
format.atom { render :action => 'changes', :layout => false, :content_type => 'application/atom+xml' }
|
format.atom { render :template => 'journals/index', :layout => false, :content_type => 'application/atom+xml' }
|
||||||
format.pdf { send_data(issue_to_pdf(@issue), :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
|
||||||
@@ -132,7 +118,10 @@ class IssuesController < ApplicationController
|
|||||||
# Add a new issue
|
# Add a new issue
|
||||||
# The new issue will be created from an existing one if copy_from parameter is given
|
# The new issue will be created from an existing one if copy_from parameter is given
|
||||||
def new
|
def new
|
||||||
render :action => 'new', :layout => !request.xhr?
|
respond_to do |format|
|
||||||
|
format.html { render :action => 'new', :layout => !request.xhr? }
|
||||||
|
format.js { render :partial => 'attributes' }
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def create
|
def create
|
||||||
@@ -144,7 +133,7 @@ class IssuesController < ApplicationController
|
|||||||
call_hook(:controller_issues_new_after_save, { :params => params, :issue => @issue})
|
call_hook(:controller_issues_new_after_save, { :params => params, :issue => @issue})
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.html {
|
format.html {
|
||||||
redirect_to(params[:continue] ? { :action => 'new', :issue => {:tracker_id => @issue.tracker, :parent_issue_id => @issue.parent_issue_id}.reject {|k,v| v.nil?} } :
|
redirect_to(params[:continue] ? { :action => 'new', :project_id => @project, :issue => {:tracker_id => @issue.tracker, :parent_issue_id => @issue.parent_issue_id}.reject {|k,v| v.nil?} } :
|
||||||
{ :action => 'show', :id => @issue })
|
{ :action => 'show', :id => @issue })
|
||||||
}
|
}
|
||||||
format.xml { render :action => 'show', :status => :created, :location => url_for(:controller => 'issues', :action => 'show', :id => @issue) }
|
format.xml { render :action => 'show', :status => :created, :location => url_for(:controller => 'issues', :action => 'show', :id => @issue) }
|
||||||
@@ -200,98 +189,30 @@ class IssuesController < ApplicationController
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def reply
|
|
||||||
journal = Journal.find(params[:journal_id]) if params[:journal_id]
|
|
||||||
if journal
|
|
||||||
user = journal.user
|
|
||||||
text = journal.notes
|
|
||||||
else
|
|
||||||
user = @issue.author
|
|
||||||
text = @issue.description
|
|
||||||
end
|
|
||||||
# Replaces pre blocks with [...]
|
|
||||||
text = text.to_s.strip.gsub(%r{<pre>((.|\s)*?)</pre>}m, '[...]')
|
|
||||||
content = "#{ll(Setting.default_language, :text_user_wrote, user)}\n> "
|
|
||||||
content << text.gsub(/(\r?\n|\r\n?)/, "\n> ") + "\n\n"
|
|
||||||
|
|
||||||
render(:update) { |page|
|
|
||||||
page.<< "$('notes').value = \"#{escape_javascript content}\";"
|
|
||||||
page.show 'update'
|
|
||||||
page << "Form.Element.focus('notes');"
|
|
||||||
page << "Element.scrollTo('update');"
|
|
||||||
page << "$('notes').scrollTop = $('notes').scrollHeight - $('notes').clientHeight;"
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
# Bulk edit a set of issues
|
# Bulk edit a set of issues
|
||||||
def bulk_edit
|
def bulk_edit
|
||||||
@issues.sort!
|
@issues.sort!
|
||||||
if request.post?
|
|
||||||
attributes = (params[:issue] || {}).reject {|k,v| v.blank?}
|
|
||||||
attributes.keys.each {|k| attributes[k] = '' if attributes[k] == 'none'}
|
|
||||||
attributes[:custom_field_values].reject! {|k,v| v.blank?} if attributes[:custom_field_values]
|
|
||||||
|
|
||||||
unsaved_issue_ids = []
|
|
||||||
@issues.each do |issue|
|
|
||||||
issue.reload
|
|
||||||
journal = issue.init_journal(User.current, params[:notes])
|
|
||||||
issue.safe_attributes = attributes
|
|
||||||
call_hook(:controller_issues_bulk_edit_before_save, { :params => params, :issue => issue })
|
|
||||||
unless issue.save
|
|
||||||
# Keep unsaved issue ids to display them in flash error
|
|
||||||
unsaved_issue_ids << issue.id
|
|
||||||
end
|
|
||||||
end
|
|
||||||
set_flash_from_bulk_issue_save(@issues, unsaved_issue_ids)
|
|
||||||
redirect_back_or_default({:controller => 'issues', :action => 'index', :project_id => @project})
|
|
||||||
return
|
|
||||||
end
|
|
||||||
@available_statuses = Workflow.available_statuses(@project)
|
@available_statuses = Workflow.available_statuses(@project)
|
||||||
@custom_fields = @project.all_issue_custom_fields
|
@custom_fields = @project.all_issue_custom_fields
|
||||||
end
|
end
|
||||||
|
|
||||||
def move
|
def bulk_update
|
||||||
@issues.sort!
|
@issues.sort!
|
||||||
@copy = params[:copy_options] && params[:copy_options][:copy]
|
attributes = parse_params_for_bulk_issue_attributes(params)
|
||||||
@allowed_projects = Issue.allowed_target_projects_on_move
|
|
||||||
@target_project = @allowed_projects.detect {|p| p.id.to_s == params[:new_project_id]} if params[:new_project_id]
|
|
||||||
@target_project ||= @project
|
|
||||||
@trackers = @target_project.trackers
|
|
||||||
@available_statuses = Workflow.available_statuses(@project)
|
|
||||||
if request.post?
|
|
||||||
new_tracker = params[:new_tracker_id].blank? ? nil : @target_project.trackers.find_by_id(params[:new_tracker_id])
|
|
||||||
unsaved_issue_ids = []
|
|
||||||
moved_issues = []
|
|
||||||
@issues.each do |issue|
|
|
||||||
issue.reload
|
|
||||||
changed_attributes = {}
|
|
||||||
[:assigned_to_id, :status_id, :start_date, :due_date].each do |valid_attribute|
|
|
||||||
unless params[valid_attribute].blank?
|
|
||||||
changed_attributes[valid_attribute] = (params[valid_attribute] == 'none' ? nil : params[valid_attribute])
|
|
||||||
end
|
|
||||||
end
|
|
||||||
issue.init_journal(User.current)
|
|
||||||
call_hook(:controller_issues_move_before_save, { :params => params, :issue => issue, :target_project => @target_project, :copy => !!@copy })
|
|
||||||
if r = issue.move_to_project(@target_project, new_tracker, {:copy => @copy, :attributes => changed_attributes})
|
|
||||||
moved_issues << r
|
|
||||||
else
|
|
||||||
unsaved_issue_ids << issue.id
|
|
||||||
end
|
|
||||||
end
|
|
||||||
set_flash_from_bulk_issue_save(@issues, unsaved_issue_ids)
|
|
||||||
|
|
||||||
if params[:follow]
|
unsaved_issue_ids = []
|
||||||
if @issues.size == 1 && moved_issues.size == 1
|
@issues.each do |issue|
|
||||||
redirect_to :controller => 'issues', :action => 'show', :id => moved_issues.first
|
issue.reload
|
||||||
else
|
journal = issue.init_journal(User.current, params[:notes])
|
||||||
redirect_to :controller => 'issues', :action => 'index', :project_id => (@target_project || @project)
|
issue.safe_attributes = attributes
|
||||||
end
|
call_hook(:controller_issues_bulk_edit_before_save, { :params => params, :issue => issue })
|
||||||
else
|
unless issue.save
|
||||||
redirect_to :controller => 'issues', :action => 'index', :project_id => @project
|
# Keep unsaved issue ids to display them in flash error
|
||||||
|
unsaved_issue_ids << issue.id
|
||||||
end
|
end
|
||||||
return
|
|
||||||
end
|
end
|
||||||
render :layout => false if request.xhr?
|
set_flash_from_bulk_issue_save(@issues, unsaved_issue_ids)
|
||||||
|
redirect_back_or_default({:controller => 'issues', :action => 'index', :project_id => @project})
|
||||||
end
|
end
|
||||||
|
|
||||||
def destroy
|
def destroy
|
||||||
@@ -324,77 +245,7 @@ class IssuesController < ApplicationController
|
|||||||
format.json { head :ok }
|
format.json { head :ok }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def context_menu
|
|
||||||
@issues = Issue.find_all_by_id(params[:ids], :include => :project)
|
|
||||||
if (@issues.size == 1)
|
|
||||||
@issue = @issues.first
|
|
||||||
@allowed_statuses = @issue.new_statuses_allowed_to(User.current)
|
|
||||||
end
|
|
||||||
projects = @issues.collect(&:project).compact.uniq
|
|
||||||
@project = projects.first if projects.size == 1
|
|
||||||
|
|
||||||
@can = {:edit => (@project && User.current.allowed_to?(:edit_issues, @project)),
|
|
||||||
:log_time => (@project && User.current.allowed_to?(:log_time, @project)),
|
|
||||||
:update => (@project && (User.current.allowed_to?(:edit_issues, @project) || (User.current.allowed_to?(:change_status, @project) && @allowed_statuses && !@allowed_statuses.empty?))),
|
|
||||||
:move => (@project && User.current.allowed_to?(:move_issues, @project)),
|
|
||||||
:copy => (@issue && @project.trackers.include?(@issue.tracker) && User.current.allowed_to?(:add_issues, @project)),
|
|
||||||
:delete => (@project && User.current.allowed_to?(:delete_issues, @project))
|
|
||||||
}
|
|
||||||
if @project
|
|
||||||
@assignables = @project.assignable_users
|
|
||||||
@assignables << @issue.assigned_to if @issue && @issue.assigned_to && !@assignables.include?(@issue.assigned_to)
|
|
||||||
@trackers = @project.trackers
|
|
||||||
end
|
|
||||||
|
|
||||||
@priorities = IssuePriority.all.reverse
|
|
||||||
@statuses = IssueStatus.find(:all, :order => 'position')
|
|
||||||
@back = params[:back_url] || request.env['HTTP_REFERER']
|
|
||||||
|
|
||||||
render :layout => false
|
|
||||||
end
|
|
||||||
|
|
||||||
def update_form
|
|
||||||
if params[:id].blank?
|
|
||||||
@issue = Issue.new
|
|
||||||
@issue.project = @project
|
|
||||||
else
|
|
||||||
@issue = @project.issues.visible.find(params[:id])
|
|
||||||
end
|
|
||||||
@issue.attributes = params[:issue]
|
|
||||||
@allowed_statuses = ([@issue.status] + @issue.status.find_new_statuses_allowed_to(User.current.roles_for_project(@project), @issue.tracker)).uniq
|
|
||||||
@priorities = IssuePriority.all
|
|
||||||
|
|
||||||
render :partial => 'attributes'
|
|
||||||
end
|
|
||||||
|
|
||||||
def preview
|
|
||||||
@issue = @project.issues.find_by_id(params[:id]) unless params[:id].blank?
|
|
||||||
if @issue
|
|
||||||
@attachements = @issue.attachments
|
|
||||||
@description = params[:issue] && params[:issue][:description]
|
|
||||||
if @description && @description.gsub(/(\r?\n|\n\r?)/, "\n") == @issue.description.to_s.gsub(/(\r?\n|\n\r?)/, "\n")
|
|
||||||
@description = nil
|
|
||||||
end
|
|
||||||
@notes = params[:notes]
|
|
||||||
else
|
|
||||||
@description = (params[:issue] ? params[:issue][:description] : nil)
|
|
||||||
end
|
|
||||||
render :layout => false
|
|
||||||
end
|
|
||||||
|
|
||||||
def auto_complete
|
|
||||||
@issues = []
|
|
||||||
q = params[:q].to_s
|
|
||||||
if q.match(/^\d+$/)
|
|
||||||
@issues << @project.issues.visible.find_by_id(q.to_i)
|
|
||||||
end
|
|
||||||
unless q.blank?
|
|
||||||
@issues += @project.issues.visible.find(:all, :conditions => ["LOWER(#{Issue.table_name}.subject) LIKE ?", "%#{q.downcase}%"], :limit => 10)
|
|
||||||
end
|
|
||||||
render :layout => false
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
private
|
||||||
def find_issue
|
def find_issue
|
||||||
@issue = Issue.find(params[:id], :include => [:project, :tracker, :status, :author, :priority, :category])
|
@issue = Issue.find(params[:id], :include => [:project, :tracker, :status, :author, :priority, :category])
|
||||||
@@ -403,22 +254,6 @@ private
|
|||||||
render_404
|
render_404
|
||||||
end
|
end
|
||||||
|
|
||||||
# Filter for bulk operations
|
|
||||||
def find_issues
|
|
||||||
@issues = Issue.find_all_by_id(params[:id] || params[:ids])
|
|
||||||
raise ActiveRecord::RecordNotFound if @issues.empty?
|
|
||||||
projects = @issues.collect(&:project).compact.uniq
|
|
||||||
if projects.size == 1
|
|
||||||
@project = projects.first
|
|
||||||
else
|
|
||||||
# TODO: let users bulk edit/move/destroy issues from different projects
|
|
||||||
render_error 'Can not bulk edit/move/destroy issues from different projects'
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
rescue ActiveRecord::RecordNotFound
|
|
||||||
render_404
|
|
||||||
end
|
|
||||||
|
|
||||||
def find_project
|
def find_project
|
||||||
project_id = (params[:issue] && params[:issue][:project_id]) || params[:project_id]
|
project_id = (params[:issue] && params[:issue][:project_id]) || params[:project_id]
|
||||||
@project = Project.find(project_id)
|
@project = Project.find(project_id)
|
||||||
@@ -435,7 +270,7 @@ private
|
|||||||
@edit_allowed = User.current.allowed_to?(:edit_issues, @project)
|
@edit_allowed = User.current.allowed_to?(:edit_issues, @project)
|
||||||
@time_entry = TimeEntry.new
|
@time_entry = TimeEntry.new
|
||||||
|
|
||||||
@notes = params[:notes]
|
@notes = params[:notes] || (params[:issue].present? ? params[:issue][:notes] : nil)
|
||||||
@issue.init_journal(User.current, @notes)
|
@issue.init_journal(User.current, @notes)
|
||||||
# User can change issue attributes only if he has :edit permission or if a workflow transition is allowed
|
# User can change issue attributes only if he has :edit permission or if a workflow transition is allowed
|
||||||
if (@edit_allowed || !@allowed_statuses.empty?) && params[:issue]
|
if (@edit_allowed || !@allowed_statuses.empty?) && params[:issue]
|
||||||
@@ -448,9 +283,16 @@ private
|
|||||||
end
|
end
|
||||||
|
|
||||||
# TODO: Refactor, lots of extra code in here
|
# TODO: Refactor, lots of extra code in here
|
||||||
|
# TODO: Changing tracker on an existing issue should not trigger this
|
||||||
def build_new_issue_from_params
|
def build_new_issue_from_params
|
||||||
@issue = Issue.new
|
if params[:id].blank?
|
||||||
@issue.copy_from(params[:copy_from]) if params[:copy_from]
|
@issue = Issue.new
|
||||||
|
@issue.copy_from(params[:copy_from]) if params[:copy_from]
|
||||||
|
@issue.project = @project
|
||||||
|
else
|
||||||
|
@issue = @project.issues.visible.find(params[:id])
|
||||||
|
end
|
||||||
|
|
||||||
@issue.project = @project
|
@issue.project = @project
|
||||||
# Tracker must be set before custom field values
|
# Tracker must be set before custom field values
|
||||||
@issue.tracker ||= @project.trackers.find((params[:issue] && params[:issue][:tracker_id]) || params[:tracker_id] || :first)
|
@issue.tracker ||= @project.trackers.find((params[:issue] && params[:issue][:tracker_id]) || params[:tracker_id] || :first)
|
||||||
@@ -460,7 +302,9 @@ private
|
|||||||
end
|
end
|
||||||
if params[:issue].is_a?(Hash)
|
if params[:issue].is_a?(Hash)
|
||||||
@issue.safe_attributes = params[:issue]
|
@issue.safe_attributes = params[:issue]
|
||||||
@issue.watcher_user_ids = params[:issue]['watcher_user_ids'] if User.current.allowed_to?(:add_issue_watchers, @project)
|
if User.current.allowed_to?(:add_issue_watchers, @project) && @issue.new_record?
|
||||||
|
@issue.watcher_user_ids = params[:issue]['watcher_user_ids']
|
||||||
|
end
|
||||||
end
|
end
|
||||||
@issue.author = User.current
|
@issue.author = User.current
|
||||||
@issue.start_date ||= Date.today
|
@issue.start_date ||= Date.today
|
||||||
@@ -468,21 +312,17 @@ private
|
|||||||
@allowed_statuses = @issue.new_statuses_allowed_to(User.current, true)
|
@allowed_statuses = @issue.new_statuses_allowed_to(User.current, true)
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_flash_from_bulk_issue_save(issues, unsaved_issue_ids)
|
|
||||||
if unsaved_issue_ids.empty?
|
|
||||||
flash[:notice] = l(:notice_successful_update) unless issues.empty?
|
|
||||||
else
|
|
||||||
flash[:error] = l(:notice_failed_to_save_issues,
|
|
||||||
:count => unsaved_issue_ids.size,
|
|
||||||
:total => issues.size,
|
|
||||||
:ids => '#' + unsaved_issue_ids.join(', #'))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def check_for_default_issue_status
|
def check_for_default_issue_status
|
||||||
if IssueStatus.default.nil?
|
if IssueStatus.default.nil?
|
||||||
render_error l(:error_no_default_issue_status)
|
render_error l(:error_no_default_issue_status)
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def parse_params_for_bulk_issue_attributes(params)
|
||||||
|
attributes = (params[:issue] || {}).reject {|k,v| v.blank?}
|
||||||
|
attributes.keys.each {|k| attributes[k] = '' if attributes[k] == 'none'}
|
||||||
|
attributes[:custom_field_values].reject! {|k,v| v.blank?} if attributes[:custom_field_values]
|
||||||
|
attributes
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -16,7 +16,54 @@
|
|||||||
# 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 JournalsController < ApplicationController
|
class JournalsController < ApplicationController
|
||||||
before_filter :find_journal
|
before_filter :find_journal, :only => [:edit]
|
||||||
|
before_filter :find_issue, :only => [:new]
|
||||||
|
before_filter :find_optional_project, :only => [:index]
|
||||||
|
accept_key_auth :index
|
||||||
|
|
||||||
|
helper :issues
|
||||||
|
helper :queries
|
||||||
|
include QueriesHelper
|
||||||
|
helper :sort
|
||||||
|
include SortHelper
|
||||||
|
|
||||||
|
def index
|
||||||
|
retrieve_query
|
||||||
|
sort_init 'id', 'desc'
|
||||||
|
sort_update(@query.sortable_columns)
|
||||||
|
|
||||||
|
if @query.valid?
|
||||||
|
@journals = @query.journals(:order => "#{Journal.table_name}.created_on DESC",
|
||||||
|
:limit => 25)
|
||||||
|
end
|
||||||
|
@title = (@project ? @project.name : Setting.app_title) + ": " + (@query.new_record? ? l(:label_changes_details) : @query.name)
|
||||||
|
render :layout => false, :content_type => 'application/atom+xml'
|
||||||
|
rescue ActiveRecord::RecordNotFound
|
||||||
|
render_404
|
||||||
|
end
|
||||||
|
|
||||||
|
def new
|
||||||
|
journal = Journal.find(params[:journal_id]) if params[:journal_id]
|
||||||
|
if journal
|
||||||
|
user = journal.user
|
||||||
|
text = journal.notes
|
||||||
|
else
|
||||||
|
user = @issue.author
|
||||||
|
text = @issue.description
|
||||||
|
end
|
||||||
|
# Replaces pre blocks with [...]
|
||||||
|
text = text.to_s.strip.gsub(%r{<pre>((.|\s)*?)</pre>}m, '[...]')
|
||||||
|
content = "#{ll(Setting.default_language, :text_user_wrote, user)}\n> "
|
||||||
|
content << text.gsub(/(\r?\n|\r\n?)/, "\n> ") + "\n\n"
|
||||||
|
|
||||||
|
render(:update) { |page|
|
||||||
|
page.<< "$('notes').value = \"#{escape_javascript content}\";"
|
||||||
|
page.show 'update'
|
||||||
|
page << "Form.Element.focus('notes');"
|
||||||
|
page << "Element.scrollTo('update');"
|
||||||
|
page << "$('notes').scrollTop = $('notes').scrollHeight - $('notes').clientHeight;"
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
def edit
|
def edit
|
||||||
if request.post?
|
if request.post?
|
||||||
@@ -38,4 +85,12 @@ private
|
|||||||
rescue ActiveRecord::RecordNotFound
|
rescue ActiveRecord::RecordNotFound
|
||||||
render_404
|
render_404
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# TODO: duplicated in IssuesController
|
||||||
|
def find_issue
|
||||||
|
@issue = Issue.find(params[:id], :include => [:project, :tracker, :status, :author, :priority, :category])
|
||||||
|
@project = @issue.project
|
||||||
|
rescue ActiveRecord::RecordNotFound
|
||||||
|
render_404
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
class PreviewsController < ApplicationController
|
||||||
|
before_filter :find_project
|
||||||
|
|
||||||
|
def issue
|
||||||
|
@issue = @project.issues.find_by_id(params[:id]) unless params[:id].blank?
|
||||||
|
if @issue
|
||||||
|
@attachements = @issue.attachments
|
||||||
|
@description = params[:issue] && params[:issue][:description]
|
||||||
|
if @description && @description.gsub(/(\r?\n|\n\r?)/, "\n") == @issue.description.to_s.gsub(/(\r?\n|\n\r?)/, "\n")
|
||||||
|
@description = nil
|
||||||
|
end
|
||||||
|
@notes = params[:notes]
|
||||||
|
else
|
||||||
|
@description = (params[:issue] ? params[:issue][:description] : nil)
|
||||||
|
end
|
||||||
|
render :layout => false
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def find_project
|
||||||
|
project_id = (params[:issue] && params[:issue][:project_id]) || params[:project_id]
|
||||||
|
@project = Project.find(project_id)
|
||||||
|
rescue ActiveRecord::RecordNotFound
|
||||||
|
render_404
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
class ProjectEnumerationsController < ApplicationController
|
||||||
|
before_filter :find_project
|
||||||
|
before_filter :authorize
|
||||||
|
|
||||||
|
def save
|
||||||
|
if request.post? && params[:enumerations]
|
||||||
|
Project.transaction do
|
||||||
|
params[:enumerations].each do |id, activity|
|
||||||
|
@project.update_or_create_time_entry_activity(id, activity)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
flash[:notice] = l(:notice_successful_update)
|
||||||
|
end
|
||||||
|
|
||||||
|
redirect_to :controller => 'projects', :action => 'settings', :tab => 'activities', :id => @project
|
||||||
|
end
|
||||||
|
|
||||||
|
def destroy
|
||||||
|
@project.time_entry_activities.each do |time_entry_activity|
|
||||||
|
time_entry_activity.destroy(time_entry_activity.parent)
|
||||||
|
end
|
||||||
|
flash[:notice] = l(:notice_successful_update)
|
||||||
|
redirect_to :controller => 'projects', :action => 'settings', :tab => 'activities', :id => @project
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
@@ -17,24 +17,24 @@
|
|||||||
|
|
||||||
class ProjectsController < ApplicationController
|
class ProjectsController < ApplicationController
|
||||||
menu_item :overview
|
menu_item :overview
|
||||||
menu_item :activity, :only => :activity
|
|
||||||
menu_item :roadmap, :only => :roadmap
|
menu_item :roadmap, :only => :roadmap
|
||||||
menu_item :files, :only => [:list_files, :add_file]
|
|
||||||
menu_item :settings, :only => :settings
|
menu_item :settings, :only => :settings
|
||||||
|
|
||||||
before_filter :find_project, :except => [ :index, :list, :add, :copy, :activity ]
|
before_filter :find_project, :except => [ :index, :list, :new, :create, :copy ]
|
||||||
before_filter :find_optional_project, :only => :activity
|
before_filter :authorize, :except => [ :index, :list, :new, :create, :copy, :archive, :unarchive, :destroy]
|
||||||
before_filter :authorize, :except => [ :index, :list, :add, :copy, :archive, :unarchive, :destroy, :activity ]
|
before_filter :authorize_global, :only => [:new, :create]
|
||||||
before_filter :authorize_global, :only => :add
|
|
||||||
before_filter :require_admin, :only => [ :copy, :archive, :unarchive, :destroy ]
|
before_filter :require_admin, :only => [ :copy, :archive, :unarchive, :destroy ]
|
||||||
accept_key_auth :activity, :index
|
accept_key_auth :index
|
||||||
|
|
||||||
after_filter :only => [:add, :edit, :archive, :unarchive, :destroy] do |controller|
|
after_filter :only => [:create, :edit, :update, :archive, :unarchive, :destroy] do |controller|
|
||||||
if controller.request.post?
|
if controller.request.post?
|
||||||
controller.send :expire_action, :controller => 'welcome', :action => 'robots.txt'
|
controller.send :expire_action, :controller => 'welcome', :action => 'robots.txt'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# TODO: convert to PUT only
|
||||||
|
verify :method => [:post, :put], :only => :update, :render => {:nothing => true, :status => :method_not_allowed }
|
||||||
|
|
||||||
helper :sort
|
helper :sort
|
||||||
include SortHelper
|
include SortHelper
|
||||||
helper :custom_fields
|
helper :custom_fields
|
||||||
@@ -63,40 +63,45 @@ class ProjectsController < ApplicationController
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Add a new project
|
def new
|
||||||
def add
|
|
||||||
@issue_custom_fields = IssueCustomField.find(:all, :order => "#{CustomField.table_name}.position")
|
@issue_custom_fields = IssueCustomField.find(:all, :order => "#{CustomField.table_name}.position")
|
||||||
@trackers = Tracker.all
|
@trackers = Tracker.all
|
||||||
@project = Project.new(params[:project])
|
@project = Project.new(params[:project])
|
||||||
if request.get?
|
|
||||||
@project.identifier = Project.next_identifier if Setting.sequential_project_identifiers?
|
@project.identifier = Project.next_identifier if Setting.sequential_project_identifiers?
|
||||||
@project.trackers = Tracker.all
|
@project.trackers = Tracker.all
|
||||||
@project.is_public = Setting.default_projects_public?
|
@project.is_public = Setting.default_projects_public?
|
||||||
@project.enabled_module_names = Setting.default_projects_modules
|
@project.enabled_module_names = Setting.default_projects_modules
|
||||||
else
|
end
|
||||||
@project.enabled_module_names = params[:enabled_modules]
|
|
||||||
if validate_parent_id && @project.save
|
def create
|
||||||
@project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id')
|
@issue_custom_fields = IssueCustomField.find(:all, :order => "#{CustomField.table_name}.position")
|
||||||
# Add current user as a project member if he is not admin
|
@trackers = Tracker.all
|
||||||
unless User.current.admin?
|
@project = Project.new(params[:project])
|
||||||
r = Role.givable.find_by_id(Setting.new_project_user_role_id.to_i) || Role.givable.first
|
|
||||||
m = Member.new(:user => User.current, :roles => [r])
|
@project.enabled_module_names = params[:enabled_modules]
|
||||||
@project.members << m
|
if validate_parent_id && @project.save
|
||||||
end
|
@project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id')
|
||||||
respond_to do |format|
|
# Add current user as a project member if he is not admin
|
||||||
format.html {
|
unless User.current.admin?
|
||||||
flash[:notice] = l(:notice_successful_create)
|
r = Role.givable.find_by_id(Setting.new_project_user_role_id.to_i) || Role.givable.first
|
||||||
redirect_to :controller => 'projects', :action => 'settings', :id => @project
|
m = Member.new(:user => User.current, :roles => [r])
|
||||||
}
|
@project.members << m
|
||||||
format.xml { head :created, :location => url_for(:controller => 'projects', :action => 'show', :id => @project.id) }
|
|
||||||
end
|
|
||||||
else
|
|
||||||
respond_to do |format|
|
|
||||||
format.html
|
|
||||||
format.xml { render :xml => @project.errors, :status => :unprocessable_entity }
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
respond_to do |format|
|
||||||
|
format.html {
|
||||||
|
flash[:notice] = l(:notice_successful_create)
|
||||||
|
redirect_to :controller => 'projects', :action => 'settings', :id => @project
|
||||||
|
}
|
||||||
|
format.xml { head :created, :location => url_for(:controller => 'projects', :action => 'show', :id => @project.id) }
|
||||||
|
end
|
||||||
|
else
|
||||||
|
respond_to do |format|
|
||||||
|
format.html { render :action => 'new' }
|
||||||
|
format.xml { render :xml => @project.errors, :status => :unprocessable_entity }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def copy
|
def copy
|
||||||
@@ -120,13 +125,13 @@ class ProjectsController < ApplicationController
|
|||||||
if validate_parent_id && @project.copy(@source_project, :only => params[:only])
|
if validate_parent_id && @project.copy(@source_project, :only => params[:only])
|
||||||
@project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id')
|
@project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id')
|
||||||
flash[:notice] = l(:notice_successful_create)
|
flash[:notice] = l(:notice_successful_create)
|
||||||
redirect_to :controller => 'admin', :action => 'projects'
|
redirect_to :controller => 'projects', :action => 'settings'
|
||||||
elsif !@project.new_record?
|
elsif !@project.new_record?
|
||||||
# Project was created
|
# Project was created
|
||||||
# But some objects were not copied due to validation failures
|
# But some objects were not copied due to validation failures
|
||||||
# (eg. issues from disabled trackers)
|
# (eg. issues from disabled trackers)
|
||||||
# TODO: inform about that
|
# TODO: inform about that
|
||||||
redirect_to :controller => 'admin', :action => 'projects'
|
redirect_to :controller => 'projects', :action => 'settings'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -177,28 +182,27 @@ class ProjectsController < ApplicationController
|
|||||||
@wiki ||= @project.wiki
|
@wiki ||= @project.wiki
|
||||||
end
|
end
|
||||||
|
|
||||||
# Edit @project
|
|
||||||
def edit
|
def edit
|
||||||
if request.get?
|
end
|
||||||
|
|
||||||
|
def update
|
||||||
|
@project.attributes = params[:project]
|
||||||
|
if validate_parent_id && @project.save
|
||||||
|
@project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id')
|
||||||
|
respond_to do |format|
|
||||||
|
format.html {
|
||||||
|
flash[:notice] = l(:notice_successful_update)
|
||||||
|
redirect_to :action => 'settings', :id => @project
|
||||||
|
}
|
||||||
|
format.xml { head :ok }
|
||||||
|
end
|
||||||
else
|
else
|
||||||
@project.attributes = params[:project]
|
respond_to do |format|
|
||||||
if validate_parent_id && @project.save
|
format.html {
|
||||||
@project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id')
|
settings
|
||||||
respond_to do |format|
|
render :action => 'settings'
|
||||||
format.html {
|
}
|
||||||
flash[:notice] = l(:notice_successful_update)
|
format.xml { render :xml => @project.errors, :status => :unprocessable_entity }
|
||||||
redirect_to :action => 'settings', :id => @project
|
|
||||||
}
|
|
||||||
format.xml { head :ok }
|
|
||||||
end
|
|
||||||
else
|
|
||||||
respond_to do |format|
|
|
||||||
format.html {
|
|
||||||
settings
|
|
||||||
render :action => 'settings'
|
|
||||||
}
|
|
||||||
format.xml { render :xml => @project.errors, :status => :unprocessable_entity }
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -241,120 +245,6 @@ class ProjectsController < ApplicationController
|
|||||||
@project = nil
|
@project = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
def add_file
|
|
||||||
if request.post?
|
|
||||||
container = (params[:version_id].blank? ? @project : @project.versions.find_by_id(params[:version_id]))
|
|
||||||
attachments = Attachment.attach_files(container, params[:attachments])
|
|
||||||
render_attachment_warning_if_needed(container)
|
|
||||||
|
|
||||||
if !attachments.empty? && Setting.notified_events.include?('file_added')
|
|
||||||
Mailer.deliver_attachments_added(attachments[:files])
|
|
||||||
end
|
|
||||||
redirect_to :controller => 'projects', :action => 'list_files', :id => @project
|
|
||||||
return
|
|
||||||
end
|
|
||||||
@versions = @project.versions.sort
|
|
||||||
end
|
|
||||||
|
|
||||||
def save_activities
|
|
||||||
if request.post? && params[:enumerations]
|
|
||||||
Project.transaction do
|
|
||||||
params[:enumerations].each do |id, activity|
|
|
||||||
@project.update_or_create_time_entry_activity(id, activity)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
flash[:notice] = l(:notice_successful_update)
|
|
||||||
end
|
|
||||||
|
|
||||||
redirect_to :controller => 'projects', :action => 'settings', :tab => 'activities', :id => @project
|
|
||||||
end
|
|
||||||
|
|
||||||
def reset_activities
|
|
||||||
@project.time_entry_activities.each do |time_entry_activity|
|
|
||||||
time_entry_activity.destroy(time_entry_activity.parent)
|
|
||||||
end
|
|
||||||
flash[:notice] = l(:notice_successful_update)
|
|
||||||
redirect_to :controller => 'projects', :action => 'settings', :tab => 'activities', :id => @project
|
|
||||||
end
|
|
||||||
|
|
||||||
def list_files
|
|
||||||
sort_init 'filename', 'asc'
|
|
||||||
sort_update 'filename' => "#{Attachment.table_name}.filename",
|
|
||||||
'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?
|
|
||||||
end
|
|
||||||
|
|
||||||
def roadmap
|
|
||||||
@trackers = @project.trackers.find(:all, :order => 'position')
|
|
||||||
retrieve_selected_tracker_ids(@trackers, @trackers.select {|t| t.is_in_roadmap?})
|
|
||||||
@with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1')
|
|
||||||
project_ids = @with_subprojects ? @project.self_and_descendants.collect(&:id) : [@project.id]
|
|
||||||
|
|
||||||
@versions = @project.shared_versions || []
|
|
||||||
@versions += @project.rolled_up_versions.visible if @with_subprojects
|
|
||||||
@versions = @versions.uniq.sort
|
|
||||||
@versions.reject! {|version| version.closed? || version.completed? } unless params[:completed]
|
|
||||||
|
|
||||||
@issues_by_version = {}
|
|
||||||
unless @selected_tracker_ids.empty?
|
|
||||||
@versions.each do |version|
|
|
||||||
issues = version.fixed_issues.visible.find(:all,
|
|
||||||
:include => [:project, :status, :tracker, :priority],
|
|
||||||
:conditions => {:tracker_id => @selected_tracker_ids, :project_id => project_ids},
|
|
||||||
:order => "#{Project.table_name}.lft, #{Tracker.table_name}.position, #{Issue.table_name}.id")
|
|
||||||
@issues_by_version[version] = issues
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@versions.reject! {|version| !project_ids.include?(version.project_id) && @issues_by_version[version].blank?}
|
|
||||||
end
|
|
||||||
|
|
||||||
def activity
|
|
||||||
@days = Setting.activity_days_default.to_i
|
|
||||||
|
|
||||||
if params[:from]
|
|
||||||
begin; @date_to = params[:from].to_date + 1; rescue; end
|
|
||||||
end
|
|
||||||
|
|
||||||
@date_to ||= Date.today + 1
|
|
||||||
@date_from = @date_to - @days
|
|
||||||
@with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1')
|
|
||||||
@author = (params[:user_id].blank? ? nil : User.active.find(params[:user_id]))
|
|
||||||
|
|
||||||
@activity = Redmine::Activity::Fetcher.new(User.current, :project => @project,
|
|
||||||
:with_subprojects => @with_subprojects,
|
|
||||||
:author => @author)
|
|
||||||
@activity.scope_select {|t| !params["show_#{t}"].nil?}
|
|
||||||
@activity.scope = (@author.nil? ? :default : :all) if @activity.scope.empty?
|
|
||||||
|
|
||||||
events = @activity.events(@date_from, @date_to)
|
|
||||||
|
|
||||||
if events.empty? || stale?(:etag => [events.first, User.current])
|
|
||||||
respond_to do |format|
|
|
||||||
format.html {
|
|
||||||
@events_by_day = events.group_by(&:event_date)
|
|
||||||
render :layout => false if request.xhr?
|
|
||||||
}
|
|
||||||
format.atom {
|
|
||||||
title = l(:label_activity)
|
|
||||||
if @author
|
|
||||||
title = @author.name
|
|
||||||
elsif @activity.scope.size == 1
|
|
||||||
title = l("label_#{@activity.scope.first.singularize}_plural")
|
|
||||||
end
|
|
||||||
render_feed(events, :title => "#{@project || Setting.app_title}: #{title}")
|
|
||||||
}
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
rescue ActiveRecord::RecordNotFound
|
|
||||||
render_404
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
private
|
||||||
def find_optional_project
|
def find_optional_project
|
||||||
return true unless params[:id]
|
return true unless params[:id]
|
||||||
@@ -364,14 +254,6 @@ private
|
|||||||
render_404
|
render_404
|
||||||
end
|
end
|
||||||
|
|
||||||
def retrieve_selected_tracker_ids(selectable_trackers, default_trackers=nil)
|
|
||||||
if ids = params[:tracker_ids]
|
|
||||||
@selected_tracker_ids = (ids.is_a? Array) ? ids.collect { |id| id.to_i.to_s } : ids.split('/').collect { |id| id.to_i.to_s }
|
|
||||||
else
|
|
||||||
@selected_tracker_ids = (default_trackers || selectable_trackers).collect {|t| t.id.to_s }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# Validates parent_id param according to user's permissions
|
# Validates parent_id param according to user's permissions
|
||||||
# TODO: move it to Project model in a validation that depends on User.current
|
# TODO: move it to Project model in a validation that depends on User.current
|
||||||
def validate_parent_id
|
def validate_parent_id
|
||||||
|
|||||||
@@ -55,8 +55,7 @@ class TimelogController < ApplicationController
|
|||||||
|
|
||||||
sql = "SELECT #{sql_select}, tyear, tmonth, tweek, spent_on, SUM(hours) AS hours"
|
sql = "SELECT #{sql_select}, tyear, tmonth, tweek, spent_on, SUM(hours) AS hours"
|
||||||
sql << " FROM #{TimeEntry.table_name}"
|
sql << " FROM #{TimeEntry.table_name}"
|
||||||
sql << " LEFT JOIN #{Issue.table_name} ON #{TimeEntry.table_name}.issue_id = #{Issue.table_name}.id"
|
sql << time_report_joins
|
||||||
sql << " LEFT JOIN #{Project.table_name} ON #{TimeEntry.table_name}.project_id = #{Project.table_name}.id"
|
|
||||||
sql << " WHERE"
|
sql << " WHERE"
|
||||||
sql << " (%s) AND" % sql_condition
|
sql << " (%s) AND" % sql_condition
|
||||||
sql << " (spent_on BETWEEN '%s' AND '%s')" % [ActiveRecord::Base.connection.quoted_date(@from), ActiveRecord::Base.connection.quoted_date(@to)]
|
sql << " (spent_on BETWEEN '%s' AND '%s')" % [ActiveRecord::Base.connection.quoted_date(@from), ActiveRecord::Base.connection.quoted_date(@to)]
|
||||||
@@ -261,8 +260,8 @@ private
|
|||||||
end
|
end
|
||||||
|
|
||||||
@from, @to = @to, @from if @from && @to && @from > @to
|
@from, @to = @to, @from if @from && @to && @from > @to
|
||||||
@from ||= (TimeEntry.minimum(:spent_on, :include => :project, :conditions => Project.allowed_to_condition(User.current, :view_time_entries)) || Date.today) - 1
|
@from ||= (TimeEntry.earilest_date_for_project(@project) || Date.today)
|
||||||
@to ||= (TimeEntry.maximum(:spent_on, :include => :project, :conditions => Project.allowed_to_condition(User.current, :view_time_entries)) || Date.today)
|
@to ||= (TimeEntry.latest_date_for_project(@project) || Date.today)
|
||||||
end
|
end
|
||||||
|
|
||||||
def load_available_criterias
|
def load_available_criterias
|
||||||
@@ -314,4 +313,12 @@ private
|
|||||||
call_hook(:controller_timelog_available_criterias, { :available_criterias => @available_criterias, :project => @project })
|
call_hook(:controller_timelog_available_criterias, { :available_criterias => @available_criterias, :project => @project })
|
||||||
@available_criterias
|
@available_criterias
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def time_report_joins
|
||||||
|
sql = ''
|
||||||
|
sql << " LEFT JOIN #{Issue.table_name} ON #{TimeEntry.table_name}.issue_id = #{Issue.table_name}.id"
|
||||||
|
sql << " LEFT JOIN #{Project.table_name} ON #{TimeEntry.table_name}.project_id = #{Project.table_name}.id"
|
||||||
|
call_hook(:controller_timelog_time_report_joins, {:sql => sql} )
|
||||||
|
sql
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -53,10 +53,8 @@ class UsersController < ApplicationController
|
|||||||
@user = User.find(params[:id])
|
@user = User.find(params[:id])
|
||||||
@custom_values = @user.custom_values
|
@custom_values = @user.custom_values
|
||||||
|
|
||||||
# show only public projects and private projects that the logged in user is also a member of
|
# show projects based on current user visibility
|
||||||
@memberships = @user.memberships.select do |membership|
|
@memberships = @user.memberships.all(:conditions => Project.visible_by(User.current))
|
||||||
membership.project.is_public? || (User.current.member_of?(membership.project))
|
|
||||||
end
|
|
||||||
|
|
||||||
events = Redmine::Activity::Fetcher.new(User.current, :author => @user).events(nil, nil, :limit => 10)
|
events = Redmine::Activity::Fetcher.new(User.current, :author => @user).events(nil, nil, :limit => 10)
|
||||||
@events_by_day = events.group_by(&:event_date)
|
@events_by_day = events.group_by(&:event_date)
|
||||||
@@ -97,7 +95,9 @@ class UsersController < ApplicationController
|
|||||||
if request.post?
|
if request.post?
|
||||||
@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
|
if params[:password].present? && (@user.auth_source_id.nil? || params[:user][:auth_source_id].blank?)
|
||||||
|
@user.password, @user.password_confirmation = params[:password], params[:password_confirmation]
|
||||||
|
end
|
||||||
@user.group_ids = params[:user][:group_ids] if params[:user][:group_ids]
|
@user.group_ids = params[:user][:group_ids] if params[:user][:group_ids]
|
||||||
@user.attributes = params[:user]
|
@user.attributes = params[:user]
|
||||||
# Was the account actived ? (do it before User#save clears the change)
|
# Was the account actived ? (do it before User#save clears the change)
|
||||||
@@ -123,14 +123,22 @@ class UsersController < ApplicationController
|
|||||||
@membership = Member.edit_membership(params[:membership_id], params[:membership], @user)
|
@membership = Member.edit_membership(params[:membership_id], params[:membership], @user)
|
||||||
@membership.save if request.post?
|
@membership.save if request.post?
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.html { redirect_to :controller => 'users', :action => 'edit', :id => @user, :tab => 'memberships' }
|
if @membership.valid?
|
||||||
format.js {
|
format.html { redirect_to :controller => 'users', :action => 'edit', :id => @user, :tab => 'memberships' }
|
||||||
render(:update) {|page|
|
format.js {
|
||||||
page.replace_html "tab-content-memberships", :partial => 'users/memberships'
|
render(:update) {|page|
|
||||||
page.visual_effect(:highlight, "member-#{@membership.id}")
|
page.replace_html "tab-content-memberships", :partial => 'users/memberships'
|
||||||
}
|
page.visual_effect(:highlight, "member-#{@membership.id}")
|
||||||
}
|
}
|
||||||
end
|
}
|
||||||
|
else
|
||||||
|
format.js {
|
||||||
|
render(:update) {|page|
|
||||||
|
page.alert(l(:notice_failed_to_save_members, :errors => @membership.errors.full_messages.join(', ')))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def destroy_membership
|
def destroy_membership
|
||||||
|
|||||||
@@ -18,15 +18,42 @@
|
|||||||
class VersionsController < ApplicationController
|
class VersionsController < ApplicationController
|
||||||
menu_item :roadmap
|
menu_item :roadmap
|
||||||
model_object Version
|
model_object Version
|
||||||
before_filter :find_model_object, :except => [:new, :close_completed]
|
before_filter :find_model_object, :except => [:index, :new, :create, :close_completed]
|
||||||
before_filter :find_project_from_association, :except => [:new, :close_completed]
|
before_filter :find_project_from_association, :except => [:index, :new, :create, :close_completed]
|
||||||
before_filter :find_project, :only => [:new, :close_completed]
|
before_filter :find_project, :only => [:index, :new, :create, :close_completed]
|
||||||
before_filter :authorize
|
before_filter :authorize
|
||||||
|
|
||||||
helper :custom_fields
|
helper :custom_fields
|
||||||
helper :projects
|
helper :projects
|
||||||
|
|
||||||
|
def index
|
||||||
|
@trackers = @project.trackers.find(:all, :order => 'position')
|
||||||
|
retrieve_selected_tracker_ids(@trackers, @trackers.select {|t| t.is_in_roadmap?})
|
||||||
|
@with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1')
|
||||||
|
project_ids = @with_subprojects ? @project.self_and_descendants.collect(&:id) : [@project.id]
|
||||||
|
|
||||||
|
@versions = @project.shared_versions || []
|
||||||
|
@versions += @project.rolled_up_versions.visible if @with_subprojects
|
||||||
|
@versions = @versions.uniq.sort
|
||||||
|
@versions.reject! {|version| version.closed? || version.completed? } unless params[:completed]
|
||||||
|
|
||||||
|
@issues_by_version = {}
|
||||||
|
unless @selected_tracker_ids.empty?
|
||||||
|
@versions.each do |version|
|
||||||
|
issues = version.fixed_issues.visible.find(:all,
|
||||||
|
:include => [:project, :status, :tracker, :priority],
|
||||||
|
:conditions => {:tracker_id => @selected_tracker_ids, :project_id => project_ids},
|
||||||
|
:order => "#{Project.table_name}.lft, #{Tracker.table_name}.position, #{Issue.table_name}.id")
|
||||||
|
@issues_by_version[version] = issues
|
||||||
|
end
|
||||||
|
end
|
||||||
|
@versions.reject! {|version| !project_ids.include?(version.project_id) && @issues_by_version[version].blank?}
|
||||||
|
end
|
||||||
|
|
||||||
def show
|
def show
|
||||||
|
@issues = @version.fixed_issues.visible.find(:all,
|
||||||
|
:include => [:status, :tracker, :priority],
|
||||||
|
:order => "#{Tracker.table_name}.position, #{Issue.table_name}.id")
|
||||||
end
|
end
|
||||||
|
|
||||||
def new
|
def new
|
||||||
@@ -36,6 +63,17 @@ class VersionsController < ApplicationController
|
|||||||
attributes.delete('sharing') unless attributes.nil? || @version.allowed_sharings.include?(attributes['sharing'])
|
attributes.delete('sharing') unless attributes.nil? || @version.allowed_sharings.include?(attributes['sharing'])
|
||||||
@version.attributes = attributes
|
@version.attributes = attributes
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def create
|
||||||
|
# TODO: refactor with code above in #new
|
||||||
|
@version = @project.versions.build
|
||||||
|
if params[:version]
|
||||||
|
attributes = params[:version].dup
|
||||||
|
attributes.delete('sharing') unless attributes.nil? || @version.allowed_sharings.include?(attributes['sharing'])
|
||||||
|
@version.attributes = attributes
|
||||||
|
end
|
||||||
|
|
||||||
if request.post?
|
if request.post?
|
||||||
if @version.save
|
if @version.save
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
@@ -52,7 +90,7 @@ class VersionsController < ApplicationController
|
|||||||
end
|
end
|
||||||
else
|
else
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.html
|
format.html { render :action => 'new' }
|
||||||
format.js do
|
format.js do
|
||||||
render(:update) {|page| page.alert(@version.errors.full_messages.join('\n')) }
|
render(:update) {|page| page.alert(@version.errors.full_messages.join('\n')) }
|
||||||
end
|
end
|
||||||
@@ -60,8 +98,11 @@ class VersionsController < ApplicationController
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def edit
|
def edit
|
||||||
|
end
|
||||||
|
|
||||||
|
def update
|
||||||
if request.post? && params[:version]
|
if request.post? && params[:version]
|
||||||
attributes = params[:version].dup
|
attributes = params[:version].dup
|
||||||
attributes.delete('sharing') unless @version.allowed_sharings.include?(attributes['sharing'])
|
attributes.delete('sharing') unless @version.allowed_sharings.include?(attributes['sharing'])
|
||||||
@@ -102,4 +143,13 @@ private
|
|||||||
rescue ActiveRecord::RecordNotFound
|
rescue ActiveRecord::RecordNotFound
|
||||||
render_404
|
render_404
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def retrieve_selected_tracker_ids(selectable_trackers, default_trackers=nil)
|
||||||
|
if ids = params[:tracker_ids]
|
||||||
|
@selected_tracker_ids = (ids.is_a? Array) ? ids.collect { |id| id.to_i.to_s } : ids.split('/').collect { |id| id.to_i.to_s }
|
||||||
|
else
|
||||||
|
@selected_tracker_ids = (default_trackers || selectable_trackers).collect {|t| t.id.to_s }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -20,12 +20,4 @@ module AdminHelper
|
|||||||
options_for_select([[l(:label_all), ''],
|
options_for_select([[l(:label_all), ''],
|
||||||
[l(:status_active), 1]], selected)
|
[l(:status_active), 1]], selected)
|
||||||
end
|
end
|
||||||
|
|
||||||
def css_project_classes(project)
|
|
||||||
s = 'project'
|
|
||||||
s << ' root' if project.root?
|
|
||||||
s << ' child' if project.child?
|
|
||||||
s << (project.leaf? ? ' leaf' : ' parent')
|
|
||||||
s
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -32,8 +32,27 @@ module ApplicationHelper
|
|||||||
end
|
end
|
||||||
|
|
||||||
# Display a link if user is authorized
|
# Display a link if user is authorized
|
||||||
|
#
|
||||||
|
# @param [String] name Anchor text (passed to link_to)
|
||||||
|
# @param [Hash, String] options Hash params or url for the link target (passed to link_to).
|
||||||
|
# This will checked by authorize_for to see if the user is authorized
|
||||||
|
# @param [optional, Hash] html_options Options passed to link_to
|
||||||
|
# @param [optional, Hash] parameters_for_method_reference Extra parameters for link_to
|
||||||
def link_to_if_authorized(name, options = {}, html_options = nil, *parameters_for_method_reference)
|
def link_to_if_authorized(name, options = {}, html_options = nil, *parameters_for_method_reference)
|
||||||
link_to(name, options, html_options, *parameters_for_method_reference) if authorize_for(options[:controller] || params[:controller], options[:action])
|
if options.is_a?(String)
|
||||||
|
begin
|
||||||
|
route = ActionController::Routing::Routes.recognize_path(options.gsub(/\?.*/,''), :method => options[:method] || :get)
|
||||||
|
link_controller = route[:controller]
|
||||||
|
link_action = route[:action]
|
||||||
|
rescue ActionController::RoutingError # Parse failed, not a route
|
||||||
|
link_controller, link_action = nil, nil
|
||||||
|
end
|
||||||
|
else
|
||||||
|
link_controller = options[:controller] || params[:controller]
|
||||||
|
link_action = options[:action]
|
||||||
|
end
|
||||||
|
|
||||||
|
link_to(name, options, html_options, *parameters_for_method_reference) if authorize_for(link_controller, link_action)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Display a link to remote if user is authorized
|
# Display a link to remote if user is authorized
|
||||||
@@ -103,6 +122,23 @@ module ApplicationHelper
|
|||||||
link_to(text, {:controller => 'repositories', :action => 'revision', :id => project, :rev => revision}, :title => l(:label_revision_id, revision))
|
link_to(text, {:controller => 'repositories', :action => 'revision', :id => project, :rev => revision}, :title => l(:label_revision_id, revision))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Generates a link to a project if active
|
||||||
|
# Examples:
|
||||||
|
#
|
||||||
|
# link_to_project(project) # => link to the specified project overview
|
||||||
|
# link_to_project(project, :action=>'settings') # => link to project settings
|
||||||
|
# link_to_project(project, {:only_path => false}, :class => "project") # => 3rd arg adds html options
|
||||||
|
# link_to_project(project, {}, :class => "project") # => html options with default url (project overview)
|
||||||
|
#
|
||||||
|
def link_to_project(project, options={}, html_options = nil)
|
||||||
|
if project.active?
|
||||||
|
url = {:controller => 'projects', :action => 'show', :id => project}.merge(options)
|
||||||
|
link_to(h(project), url, html_options)
|
||||||
|
else
|
||||||
|
h(project)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def toggle_link(name, id, options={})
|
def toggle_link(name, id, options={})
|
||||||
onclick = "Element.toggle('#{id}'); "
|
onclick = "Element.toggle('#{id}'); "
|
||||||
onclick << (options[:focus] ? "Form.Element.focus('#{options[:focus]}'); " : "this.blur(); ")
|
onclick << (options[:focus] ? "Form.Element.focus('#{options[:focus]}'); " : "this.blur(); ")
|
||||||
@@ -285,7 +321,7 @@ module ApplicationHelper
|
|||||||
def time_tag(time)
|
def time_tag(time)
|
||||||
text = distance_of_time_in_words(Time.now, time)
|
text = distance_of_time_in_words(Time.now, time)
|
||||||
if @project
|
if @project
|
||||||
link_to(text, {:controller => 'projects', :action => 'activity', :id => @project, :from => time.to_date}, :title => format_time(time))
|
link_to(text, {:controller => 'activities', :action => 'index', :id => @project, :from => time.to_date}, :title => format_time(time))
|
||||||
else
|
else
|
||||||
content_tag('acronym', text, :title => format_time(time))
|
content_tag('acronym', text, :title => format_time(time))
|
||||||
end
|
end
|
||||||
@@ -368,12 +404,12 @@ module ApplicationHelper
|
|||||||
ancestors = (@project.root? ? [] : @project.ancestors.visible)
|
ancestors = (@project.root? ? [] : @project.ancestors.visible)
|
||||||
if ancestors.any?
|
if ancestors.any?
|
||||||
root = ancestors.shift
|
root = ancestors.shift
|
||||||
b << link_to(h(root), {:controller => 'projects', :action => 'show', :id => root, :jump => current_menu_item}, :class => 'root')
|
b << link_to_project(root, {:jump => current_menu_item}, :class => 'root')
|
||||||
if ancestors.size > 2
|
if ancestors.size > 2
|
||||||
b << '…'
|
b << '…'
|
||||||
ancestors = ancestors[-2, 2]
|
ancestors = ancestors[-2, 2]
|
||||||
end
|
end
|
||||||
b += ancestors.collect {|p| link_to(h(p), {:controller => 'projects', :action => 'show', :id => p, :jump => current_menu_item}, :class => 'ancestor') }
|
b += ancestors.collect {|p| link_to_project(p, {:jump => current_menu_item}, :class => 'ancestor') }
|
||||||
end
|
end
|
||||||
b << h(@project)
|
b << h(@project)
|
||||||
b.join(' » ')
|
b.join(' » ')
|
||||||
@@ -393,6 +429,19 @@ module ApplicationHelper
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Returns the theme, controller name, and action as css classes for the
|
||||||
|
# HTML body.
|
||||||
|
def body_css_classes
|
||||||
|
css = []
|
||||||
|
if theme = Redmine::Themes.theme(Setting.ui_theme)
|
||||||
|
css << 'theme-' + theme.name
|
||||||
|
end
|
||||||
|
|
||||||
|
css << 'controller-' + params[:controller]
|
||||||
|
css << 'action-' + params[:action]
|
||||||
|
css.join(' ')
|
||||||
|
end
|
||||||
|
|
||||||
def accesskey(s)
|
def accesskey(s)
|
||||||
Redmine::AccessKeys.key_for s
|
Redmine::AccessKeys.key_for s
|
||||||
end
|
end
|
||||||
@@ -592,8 +641,7 @@ module ApplicationHelper
|
|||||||
end
|
end
|
||||||
when 'project'
|
when 'project'
|
||||||
if p = Project.visible.find_by_id(oid)
|
if p = Project.visible.find_by_id(oid)
|
||||||
link = link_to h(p.name), {:only_path => only_path, :controller => 'projects', :action => 'show', :id => p},
|
link = link_to_project(p, {:only_path => only_path}, :class => 'project')
|
||||||
:class => 'project'
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
elsif sep == ':'
|
elsif sep == ':'
|
||||||
@@ -635,8 +683,7 @@ module ApplicationHelper
|
|||||||
end
|
end
|
||||||
when 'project'
|
when 'project'
|
||||||
if p = Project.visible.find(:first, :conditions => ["identifier = :s OR LOWER(name) = :s", {:s => name.downcase}])
|
if p = Project.visible.find(:first, :conditions => ["identifier = :s OR LOWER(name) = :s", {:s => name.downcase}])
|
||||||
link = link_to h(p.name), {:only_path => only_path, :controller => 'projects', :action => 'show', :id => p},
|
link = link_to_project(p, {:only_path => only_path}, :class => 'project')
|
||||||
:class => 'project'
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -709,6 +756,11 @@ module ApplicationHelper
|
|||||||
javascript_include_tag('context_menu') +
|
javascript_include_tag('context_menu') +
|
||||||
stylesheet_link_tag('context_menu')
|
stylesheet_link_tag('context_menu')
|
||||||
end
|
end
|
||||||
|
if l(:direction) == 'rtl'
|
||||||
|
content_for :header_tags do
|
||||||
|
stylesheet_link_tag('context_menu_rtl')
|
||||||
|
end
|
||||||
|
end
|
||||||
@context_menu_included = true
|
@context_menu_included = true
|
||||||
end
|
end
|
||||||
javascript_tag "new ContextMenu('#{ url_for(url) }')"
|
javascript_tag "new ContextMenu('#{ url_for(url) }')"
|
||||||
@@ -772,7 +824,7 @@ module ApplicationHelper
|
|||||||
# +user+ can be a User or a string that will be scanned for an email address (eg. 'joe <joe@foo.bar>')
|
# +user+ can be a User or a string that will be scanned for an email address (eg. 'joe <joe@foo.bar>')
|
||||||
def avatar(user, options = { })
|
def avatar(user, options = { })
|
||||||
if Setting.gravatar_enabled?
|
if Setting.gravatar_enabled?
|
||||||
options.merge!({:ssl => Setting.protocol == 'https', :default => Setting.gravatar_default})
|
options.merge!({:ssl => (defined?(request) && request.ssl?), :default => Setting.gravatar_default})
|
||||||
email = nil
|
email = nil
|
||||||
if user.respond_to?(:mail)
|
if user.respond_to?(:mail)
|
||||||
email = user.mail
|
email = user.mail
|
||||||
@@ -783,6 +835,10 @@ module ApplicationHelper
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def favicon
|
||||||
|
"<link rel='shortcut icon' href='#{image_path('/favicon.ico')}' />"
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def wiki_helper
|
def wiki_helper
|
||||||
|
|||||||
@@ -0,0 +1,38 @@
|
|||||||
|
module CalendarsHelper
|
||||||
|
def link_to_previous_month(year, month)
|
||||||
|
target_year, target_month = if month == 1
|
||||||
|
[year - 1, 12]
|
||||||
|
else
|
||||||
|
[year, month - 1]
|
||||||
|
end
|
||||||
|
|
||||||
|
name = if target_month == 12
|
||||||
|
"#{month_name(target_month)} #{target_year}"
|
||||||
|
else
|
||||||
|
"#{month_name(target_month)}"
|
||||||
|
end
|
||||||
|
|
||||||
|
link_to_remote ('« ' + name),
|
||||||
|
{:update => "content", :url => { :year => target_year, :month => target_month }},
|
||||||
|
{:href => url_for(:action => 'show', :year => target_year, :month => target_month)}
|
||||||
|
end
|
||||||
|
|
||||||
|
def link_to_next_month(year, month)
|
||||||
|
target_year, target_month = if month == 12
|
||||||
|
[year + 1, 1]
|
||||||
|
else
|
||||||
|
[year, month + 1]
|
||||||
|
end
|
||||||
|
|
||||||
|
name = if target_month == 1
|
||||||
|
"#{month_name(target_month)} #{target_year}"
|
||||||
|
else
|
||||||
|
"#{month_name(target_month)}"
|
||||||
|
end
|
||||||
|
|
||||||
|
link_to_remote (name + ' »'),
|
||||||
|
{:update => "content", :url => { :year => target_year, :month => target_month }},
|
||||||
|
{:href => url_for(:action => 'show', :year => target_year, :month =>target_month)}
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
module IssueMovesHelper
|
||||||
|
end
|
||||||
@@ -28,14 +28,25 @@ module IssuesHelper
|
|||||||
ancestors << issue unless issue.leaf?
|
ancestors << issue unless issue.leaf?
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Renders a HTML/CSS tooltip
|
||||||
|
#
|
||||||
|
# To use, a trigger div is needed. This is a div with the class of "tooltip"
|
||||||
|
# that contains this method wrapped in a span with the class of "tip"
|
||||||
|
#
|
||||||
|
# <div class="tooltip"><%= link_to_issue(issue) %>
|
||||||
|
# <span class="tip"><%= render_issue_tooltip(issue) %></span>
|
||||||
|
# </div>
|
||||||
|
#
|
||||||
def render_issue_tooltip(issue)
|
def render_issue_tooltip(issue)
|
||||||
|
@cached_label_status ||= l(:field_status)
|
||||||
@cached_label_start_date ||= l(:field_start_date)
|
@cached_label_start_date ||= l(:field_start_date)
|
||||||
@cached_label_due_date ||= l(:field_due_date)
|
@cached_label_due_date ||= l(:field_due_date)
|
||||||
@cached_label_assigned_to ||= l(:field_assigned_to)
|
@cached_label_assigned_to ||= l(:field_assigned_to)
|
||||||
@cached_label_priority ||= l(:field_priority)
|
@cached_label_priority ||= l(:field_priority)
|
||||||
|
|
||||||
link_to_issue(issue) + "<br /><br />" +
|
link_to_issue(issue) + "<br /><br />" +
|
||||||
|
"<strong>#{@cached_label_status}</strong>: #{issue.status.name}<br />" +
|
||||||
"<strong>#{@cached_label_start_date}</strong>: #{format_date(issue.start_date)}<br />" +
|
"<strong>#{@cached_label_start_date}</strong>: #{format_date(issue.start_date)}<br />" +
|
||||||
"<strong>#{@cached_label_due_date}</strong>: #{format_date(issue.due_date)}<br />" +
|
"<strong>#{@cached_label_due_date}</strong>: #{format_date(issue.due_date)}<br />" +
|
||||||
"<strong>#{@cached_label_assigned_to}</strong>: #{issue.assigned_to}<br />" +
|
"<strong>#{@cached_label_assigned_to}</strong>: #{issue.assigned_to}<br />" +
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ module JournalsHelper
|
|||||||
links = []
|
links = []
|
||||||
if !journal.notes.blank?
|
if !journal.notes.blank?
|
||||||
links << link_to_remote(image_tag('comment.png'),
|
links << link_to_remote(image_tag('comment.png'),
|
||||||
{ :url => {:controller => 'issues', :action => 'reply', :id => issue, :journal_id => journal} },
|
{ :url => {:controller => 'journals', :action => 'new', :id => issue, :journal_id => journal} },
|
||||||
:title => l(:button_quote)) if options[:reply_links]
|
:title => l(:button_quote)) if options[:reply_links]
|
||||||
links << link_to_in_place_notes_editor(image_tag('edit.png'), "journal-#{journal.id}-notes",
|
links << link_to_in_place_notes_editor(image_tag('edit.png'), "journal-#{journal.id}-notes",
|
||||||
{ :controller => 'journals', :action => 'edit', :id => journal },
|
{ :controller => 'journals', :action => 'edit', :id => journal },
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ module ProjectsHelper
|
|||||||
end
|
end
|
||||||
classes = (ancestors.empty? ? 'root' : 'child')
|
classes = (ancestors.empty? ? 'root' : 'child')
|
||||||
s << "<li class='#{classes}'><div class='#{classes}'>" +
|
s << "<li class='#{classes}'><div class='#{classes}'>" +
|
||||||
link_to(h(project), {:controller => 'projects', :action => 'show', :id => project}, :class => "project #{User.current.member_of?(project) ? 'my-project' : nil}")
|
link_to_project(project, {}, :class => "project #{User.current.member_of?(project) ? 'my-project' : nil}")
|
||||||
s << "<div class='wiki description'>#{textilizable(project.short_description, :project => project)}</div>" unless project.description.blank?
|
s << "<div class='wiki description'>#{textilizable(project.short_description, :project => project)}</div>" unless project.description.blank?
|
||||||
s << "</div>\n"
|
s << "</div>\n"
|
||||||
ancestors << project
|
ancestors << project
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ module QueriesHelper
|
|||||||
when 'User'
|
when 'User'
|
||||||
link_to_user value
|
link_to_user value
|
||||||
when 'Project'
|
when 'Project'
|
||||||
link_to(h(value), :controller => 'projects', :action => 'show', :id => value)
|
link_to_project value
|
||||||
when 'Version'
|
when 'Version'
|
||||||
link_to(h(value), :controller => 'versions', :action => 'show', :id => value)
|
link_to(h(value), :controller => 'versions', :action => 'show', :id => value)
|
||||||
when 'TrueClass'
|
when 'TrueClass'
|
||||||
|
|||||||
@@ -19,12 +19,13 @@ class Change < ActiveRecord::Base
|
|||||||
belongs_to :changeset
|
belongs_to :changeset
|
||||||
|
|
||||||
validates_presence_of :changeset_id, :action, :path
|
validates_presence_of :changeset_id, :action, :path
|
||||||
|
before_save :init_path
|
||||||
|
|
||||||
def relative_path
|
def relative_path
|
||||||
changeset.repository.relative_path(path)
|
changeset.repository.relative_path(path)
|
||||||
end
|
end
|
||||||
|
|
||||||
def before_save
|
def init_path
|
||||||
path ||= ""
|
self.path ||= ""
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -76,7 +76,6 @@ class Changeset < ActiveRecord::Base
|
|||||||
def after_create
|
def after_create
|
||||||
scan_comment_for_issue_ids
|
scan_comment_for_issue_ids
|
||||||
end
|
end
|
||||||
require 'pp'
|
|
||||||
|
|
||||||
def scan_comment_for_issue_ids
|
def scan_comment_for_issue_ids
|
||||||
return if comments.blank?
|
return if comments.blank?
|
||||||
|
|||||||
+9
-4
@@ -245,7 +245,7 @@ class Issue < ActiveRecord::Base
|
|||||||
end
|
end
|
||||||
|
|
||||||
def done_ratio
|
def done_ratio
|
||||||
if Issue.use_status_for_done_ratio? && status && status.default_done_ratio?
|
if Issue.use_status_for_done_ratio? && status && status.default_done_ratio
|
||||||
status.default_done_ratio
|
status.default_done_ratio
|
||||||
else
|
else
|
||||||
read_attribute(:done_ratio)
|
read_attribute(:done_ratio)
|
||||||
@@ -308,7 +308,7 @@ class Issue < ActiveRecord::Base
|
|||||||
# Set the done_ratio using the status if that setting is set. This will keep the done_ratios
|
# Set the done_ratio using the status if that setting is set. This will keep the done_ratios
|
||||||
# even if the user turns off the setting later
|
# even if the user turns off the setting later
|
||||||
def update_done_ratio_from_issue_status
|
def update_done_ratio_from_issue_status
|
||||||
if Issue.use_status_for_done_ratio? && status && status.default_done_ratio?
|
if Issue.use_status_for_done_ratio? && status && status.default_done_ratio
|
||||||
self.done_ratio = status.default_done_ratio
|
self.done_ratio = status.default_done_ratio
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -357,6 +357,11 @@ class Issue < ActiveRecord::Base
|
|||||||
def overdue?
|
def overdue?
|
||||||
!due_date.nil? && (due_date < Date.today) && !status.is_closed?
|
!due_date.nil? && (due_date < Date.today) && !status.is_closed?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Does this issue have children?
|
||||||
|
def children?
|
||||||
|
!leaf?
|
||||||
|
end
|
||||||
|
|
||||||
# Users the issue can be assigned to
|
# Users the issue can be assigned to
|
||||||
def assignable_users
|
def assignable_users
|
||||||
@@ -684,7 +689,7 @@ class Issue < ActiveRecord::Base
|
|||||||
end
|
end
|
||||||
|
|
||||||
# done ratio = weighted average ratio of leaves
|
# done ratio = weighted average ratio of leaves
|
||||||
unless Issue.use_status_for_done_ratio? && p.status && p.status.default_done_ratio?
|
unless Issue.use_status_for_done_ratio? && p.status && p.status.default_done_ratio
|
||||||
leaves_count = p.leaves.count
|
leaves_count = p.leaves.count
|
||||||
if leaves_count > 0
|
if leaves_count > 0
|
||||||
average = p.leaves.average(:estimated_hours).to_f
|
average = p.leaves.average(:estimated_hours).to_f
|
||||||
@@ -821,7 +826,7 @@ class Issue < ActiveRecord::Base
|
|||||||
j.id as #{select_field},
|
j.id as #{select_field},
|
||||||
count(i.id) as total
|
count(i.id) as total
|
||||||
from
|
from
|
||||||
#{Issue.table_name} i, #{IssueStatus.table_name} s, #{joins} as j
|
#{Issue.table_name} i, #{IssueStatus.table_name} s, #{joins} j
|
||||||
where
|
where
|
||||||
i.status_id=s.id
|
i.status_id=s.id
|
||||||
and #{where}
|
and #{where}
|
||||||
|
|||||||
@@ -17,8 +17,10 @@
|
|||||||
|
|
||||||
class IssueStatus < ActiveRecord::Base
|
class IssueStatus < ActiveRecord::Base
|
||||||
before_destroy :check_integrity
|
before_destroy :check_integrity
|
||||||
has_many :workflows, :foreign_key => "old_status_id", :dependent => :delete_all
|
has_many :workflows, :foreign_key => "old_status_id"
|
||||||
acts_as_list
|
acts_as_list
|
||||||
|
|
||||||
|
before_destroy :delete_workflows
|
||||||
|
|
||||||
validates_presence_of :name
|
validates_presence_of :name
|
||||||
validates_uniqueness_of :name
|
validates_uniqueness_of :name
|
||||||
@@ -89,4 +91,9 @@ private
|
|||||||
def check_integrity
|
def check_integrity
|
||||||
raise "Can't delete status" if Issue.find(:first, :conditions => ["status_id=?", self.id])
|
raise "Can't delete status" if Issue.find(:first, :conditions => ["status_id=?", self.id])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Deletes associated workflows
|
||||||
|
def delete_workflows
|
||||||
|
Workflow.delete_all(["old_status_id = :id OR new_status_id = :id", {:id => id}])
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -65,4 +65,12 @@ class Journal < ActiveRecord::Base
|
|||||||
def attachments
|
def attachments
|
||||||
journalized.respond_to?(:attachments) ? journalized.attachments : nil
|
journalized.respond_to?(:attachments) ? journalized.attachments : nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Returns a string of css classes
|
||||||
|
def css_classes
|
||||||
|
s = 'journal'
|
||||||
|
s << ' has-notes' unless notes.blank?
|
||||||
|
s << ' has-details' unless details.blank?
|
||||||
|
s
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -15,6 +15,8 @@
|
|||||||
# along with this program; if not, write to the Free Software
|
# along with this program; if not, write to the Free Software
|
||||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
|
||||||
|
require 'ar_condition'
|
||||||
|
|
||||||
class Mailer < ActionMailer::Base
|
class Mailer < ActionMailer::Base
|
||||||
layout 'mailer'
|
layout 'mailer'
|
||||||
helper :application
|
helper :application
|
||||||
@@ -80,7 +82,7 @@ class Mailer < ActionMailer::Base
|
|||||||
def reminder(user, issues, days)
|
def reminder(user, issues, days)
|
||||||
set_language_if_valid user.language
|
set_language_if_valid user.language
|
||||||
recipients user.mail
|
recipients user.mail
|
||||||
subject l(:mail_subject_reminder, issues.size)
|
subject l(:mail_subject_reminder, :count => issues.size, :days => days)
|
||||||
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 => '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')
|
||||||
@@ -306,13 +308,16 @@ class Mailer < ActionMailer::Base
|
|||||||
# * :days => how many days in the future to remind about (defaults to 7)
|
# * :days => how many days in the future to remind about (defaults to 7)
|
||||||
# * :tracker => id of tracker for filtering issues (defaults to all trackers)
|
# * :tracker => id of tracker for filtering issues (defaults to all trackers)
|
||||||
# * :project => id or identifier of project to process (defaults to all projects)
|
# * :project => id or identifier of project to process (defaults to all projects)
|
||||||
|
# * :users => array of user ids who should be reminded
|
||||||
def self.reminders(options={})
|
def self.reminders(options={})
|
||||||
days = options[:days] || 7
|
days = options[:days] || 7
|
||||||
project = options[:project] ? Project.find(options[:project]) : nil
|
project = options[:project] ? Project.find(options[:project]) : nil
|
||||||
tracker = options[:tracker] ? Tracker.find(options[:tracker]) : nil
|
tracker = options[:tracker] ? Tracker.find(options[:tracker]) : nil
|
||||||
|
user_ids = options[:users]
|
||||||
|
|
||||||
s = ARCondition.new ["#{IssueStatus.table_name}.is_closed = ? AND #{Issue.table_name}.due_date <= ?", false, days.day.from_now.to_date]
|
s = ARCondition.new ["#{IssueStatus.table_name}.is_closed = ? AND #{Issue.table_name}.due_date <= ?", false, days.day.from_now.to_date]
|
||||||
s << "#{Issue.table_name}.assigned_to_id IS NOT NULL"
|
s << "#{Issue.table_name}.assigned_to_id IS NOT NULL"
|
||||||
|
s << ["#{Issue.table_name}.assigned_to_id IN (?)", user_ids] if user_ids.present?
|
||||||
s << "#{Project.table_name}.status = #{Project::STATUS_ACTIVE}"
|
s << "#{Project.table_name}.status = #{Project::STATUS_ACTIVE}"
|
||||||
s << "#{Issue.table_name}.project_id = #{project.id}" if project
|
s << "#{Issue.table_name}.project_id = #{project.id}" if project
|
||||||
s << "#{Issue.table_name}.tracker_id = #{tracker.id}" if tracker
|
s << "#{Issue.table_name}.tracker_id = #{tracker.id}" if tracker
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ class Member < ActiveRecord::Base
|
|||||||
protected
|
protected
|
||||||
|
|
||||||
def validate
|
def validate
|
||||||
errors.add_to_base "Role can't be blank" if member_roles.empty? && roles.empty?
|
errors.add_on_empty :role if member_roles.empty? && roles.empty?
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|||||||
@@ -33,7 +33,11 @@ class Principal < ActiveRecord::Base
|
|||||||
}
|
}
|
||||||
|
|
||||||
before_create :set_default_empty_values
|
before_create :set_default_empty_values
|
||||||
|
|
||||||
|
def name(formatter = nil)
|
||||||
|
to_s
|
||||||
|
end
|
||||||
|
|
||||||
def <=>(principal)
|
def <=>(principal)
|
||||||
if self.class.name == principal.class.name
|
if self.class.name == principal.class.name
|
||||||
self.to_s.downcase <=> principal.to_s.downcase
|
self.to_s.downcase <=> principal.to_s.downcase
|
||||||
|
|||||||
+18
-1
@@ -412,7 +412,15 @@ class Project < ActiveRecord::Base
|
|||||||
def short_description(length = 255)
|
def short_description(length = 255)
|
||||||
description.gsub(/^(.{#{length}}[^\n\r]*).*$/m, '\1...').strip if description
|
description.gsub(/^(.{#{length}}[^\n\r]*).*$/m, '\1...').strip if description
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def css_classes
|
||||||
|
s = 'project'
|
||||||
|
s << ' root' if root?
|
||||||
|
s << ' child' if child?
|
||||||
|
s << (leaf? ? ' leaf' : ' parent')
|
||||||
|
s
|
||||||
|
end
|
||||||
|
|
||||||
# Return true if this project is allowed to do the specified action.
|
# Return true if this project is allowed to do the specified action.
|
||||||
# action can be:
|
# action can be:
|
||||||
# * a parameter-like Hash (eg. :controller => 'projects', :action => 'edit')
|
# * a parameter-like Hash (eg. :controller => 'projects', :action => 'edit')
|
||||||
@@ -441,6 +449,15 @@ class Project < ActiveRecord::Base
|
|||||||
enabled_modules.clear
|
enabled_modules.clear
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Returns an array of projects that are in this project's hierarchy
|
||||||
|
#
|
||||||
|
# Example: parents, children, siblings
|
||||||
|
def hierarchy
|
||||||
|
parents = project.self_and_ancestors || []
|
||||||
|
descendants = project.descendants || []
|
||||||
|
project_hierarchy = parents | descendants # Set union
|
||||||
|
end
|
||||||
|
|
||||||
# Returns an auto-generated project identifier based on the last identifier used
|
# Returns an auto-generated project identifier based on the last identifier used
|
||||||
def self.next_identifier
|
def self.next_identifier
|
||||||
|
|||||||
+7
-1
@@ -187,7 +187,7 @@ class Query < ActiveRecord::Base
|
|||||||
if project
|
if project
|
||||||
user_values += project.users.sort.collect{|s| [s.name, s.id.to_s] }
|
user_values += project.users.sort.collect{|s| [s.name, s.id.to_s] }
|
||||||
else
|
else
|
||||||
project_ids = User.current.projects.collect(&:id)
|
project_ids = Project.all(:conditions => Project.visible_by(User.current)).collect(&:id)
|
||||||
if project_ids.any?
|
if project_ids.any?
|
||||||
# members of the user's projects
|
# members of the user's projects
|
||||||
user_values += User.active.find(:all, :conditions => ["#{User.table_name}.id IN (SELECT DISTINCT user_id FROM members WHERE project_id IN (?))", project_ids]).sort.collect{|s| [s.name, s.id.to_s] }
|
user_values += User.active.find(:all, :conditions => ["#{User.table_name}.id IN (SELECT DISTINCT user_id FROM members WHERE project_id IN (?))", project_ids]).sort.collect{|s| [s.name, s.id.to_s] }
|
||||||
@@ -219,6 +219,12 @@ class Query < ActiveRecord::Base
|
|||||||
@available_filters["fixed_version_id"] = { :type => :list_optional, :order => 7, :values => system_shared_versions.sort.collect{|s| ["#{s.project.name} - #{s.name}", s.id.to_s] } }
|
@available_filters["fixed_version_id"] = { :type => :list_optional, :order => 7, :values => system_shared_versions.sort.collect{|s| ["#{s.project.name} - #{s.name}", s.id.to_s] } }
|
||||||
end
|
end
|
||||||
add_custom_fields_filters(IssueCustomField.find(:all, :conditions => {:is_filter => true, :is_for_all => true}))
|
add_custom_fields_filters(IssueCustomField.find(:all, :conditions => {:is_filter => true, :is_for_all => true}))
|
||||||
|
# project filter
|
||||||
|
project_values = Project.all(:conditions => Project.visible_by(User.current), :order => 'lft').map do |p|
|
||||||
|
pre = (p.level > 0 ? ('--' * p.level + ' ') : '')
|
||||||
|
["#{pre}#{p.name}",p.id.to_s]
|
||||||
|
end
|
||||||
|
@available_filters["project_id"] = { :type => :list, :order => 1, :values => project_values}
|
||||||
end
|
end
|
||||||
@available_filters
|
@available_filters
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -81,4 +81,20 @@ class TimeEntry < ActiveRecord::Base
|
|||||||
yield
|
yield
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.earilest_date_for_project(project=nil)
|
||||||
|
finder_conditions = ARCondition.new(Project.allowed_to_condition(User.current, :view_time_entries))
|
||||||
|
if project
|
||||||
|
finder_conditions << ["project_id IN (?)", project.hierarchy.collect(&:id)]
|
||||||
|
end
|
||||||
|
TimeEntry.minimum(:spent_on, :include => :project, :conditions => finder_conditions.conditions)
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.latest_date_for_project(project=nil)
|
||||||
|
finder_conditions = ARCondition.new(Project.allowed_to_condition(User.current, :view_time_entries))
|
||||||
|
if project
|
||||||
|
finder_conditions << ["project_id IN (?)", project.hierarchy.collect(&:id)]
|
||||||
|
end
|
||||||
|
TimeEntry.maximum(:spent_on, :include => :project, :conditions => finder_conditions.conditions)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -79,6 +79,10 @@ class User < Principal
|
|||||||
super
|
super
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def mail=(arg)
|
||||||
|
write_attribute(:mail, arg.to_s.strip)
|
||||||
|
end
|
||||||
|
|
||||||
def identity_url=(url)
|
def identity_url=(url)
|
||||||
if url.blank?
|
if url.blank?
|
||||||
write_attribute(:identity_url, '')
|
write_attribute(:identity_url, '')
|
||||||
@@ -160,6 +164,30 @@ class User < Principal
|
|||||||
self.status == STATUS_LOCKED
|
self.status == STATUS_LOCKED
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def activate
|
||||||
|
self.status = STATUS_ACTIVE
|
||||||
|
end
|
||||||
|
|
||||||
|
def register
|
||||||
|
self.status = STATUS_REGISTERED
|
||||||
|
end
|
||||||
|
|
||||||
|
def lock
|
||||||
|
self.status = STATUS_LOCKED
|
||||||
|
end
|
||||||
|
|
||||||
|
def activate!
|
||||||
|
update_attribute(:status, STATUS_ACTIVE)
|
||||||
|
end
|
||||||
|
|
||||||
|
def register!
|
||||||
|
update_attribute(:status, STATUS_REGISTERED)
|
||||||
|
end
|
||||||
|
|
||||||
|
def lock!
|
||||||
|
update_attribute(:status, STATUS_LOCKED)
|
||||||
|
end
|
||||||
|
|
||||||
def check_password?(clear_password)
|
def check_password?(clear_password)
|
||||||
if auth_source_id.present?
|
if auth_source_id.present?
|
||||||
auth_source.authenticate(self.login, clear_password)
|
auth_source.authenticate(self.login, clear_password)
|
||||||
@@ -324,6 +352,12 @@ class User < Principal
|
|||||||
false
|
false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Is the user allowed to do the specified action on any project?
|
||||||
|
# See allowed_to? for the actions and valid options.
|
||||||
|
def allowed_to_globally?(action, options)
|
||||||
|
allowed_to?(action, nil, options.reverse_merge(:global => true))
|
||||||
|
end
|
||||||
|
|
||||||
def self.current=(user)
|
def self.current=(user)
|
||||||
@current_user = user
|
@current_user = user
|
||||||
|
|||||||
@@ -1,20 +1,5 @@
|
|||||||
<div id="admin-menu">
|
<div id="admin-menu">
|
||||||
<ul>
|
<ul>
|
||||||
<li><%= link_to l(:label_project_plural), {:controller => 'admin', :action => 'projects'}, :class => 'projects' %></li>
|
<%= render_menu :admin_menu %>
|
||||||
<li><%= link_to l(:label_user_plural), {:controller => 'users'}, :class => 'users' %></li>
|
</ul>
|
||||||
<li><%= link_to l(:label_group_plural), {:controller => 'groups'}, :class => 'groups' %></li>
|
|
||||||
<li><%= link_to l(:label_ldap_authentication), :controller => 'ldap_auth_sources', :action => 'index' %></li>
|
|
||||||
<li><%= link_to l(:label_role_and_permissions), {:controller => 'roles'}, :class => 'roles' %></li>
|
|
||||||
<li><%= link_to l(:label_tracker_plural), {:controller => 'trackers'}, :class => 'trackers' %></li>
|
|
||||||
<li><%= link_to l(:label_issue_status_plural), {:controller => 'issue_statuses'}, :class => 'issue_statuses' %></li>
|
|
||||||
<li><%= link_to l(:label_workflow), {:controller => 'workflows', :action => 'edit'}, :class => 'workflows' %></li>
|
|
||||||
<li><%= link_to l(:label_custom_field_plural), {:controller => 'custom_fields'}, :class => 'custom_fields' %></li>
|
|
||||||
<li><%= link_to l(:label_enumerations), {:controller => 'enumerations'}, :class => 'enumerations' %></li>
|
|
||||||
<li><%= link_to l(:label_settings), {:controller => 'settings'}, :class => 'settings' %></li>
|
|
||||||
<% menu_items_for(:admin_menu) do |item| -%>
|
|
||||||
<li><%= link_to h(item.caption), item.url, item.html_options %></li>
|
|
||||||
<% end -%>
|
|
||||||
<li><%= link_to l(:label_plugins), {:controller => 'admin', :action => 'plugins'}, :class => 'plugins' %></li>
|
|
||||||
<li><%= link_to l(:label_information_plural), {:controller => 'admin', :action => 'info'}, :class => 'info' %></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<div class="contextual">
|
<div class="contextual">
|
||||||
<%= link_to l(:label_project_new), {:controller => 'projects', :action => 'add'}, :class => 'icon icon-add' %>
|
<%= link_to l(:label_project_new), {:controller => 'projects', :action => 'new'}, :class => 'icon icon-add' %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h2><%=l(:label_project_plural)%></h2>
|
<h2><%=l(:label_project_plural)%></h2>
|
||||||
@@ -26,8 +26,8 @@
|
|||||||
</tr></thead>
|
</tr></thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<% project_tree(@projects) do |project, level| %>
|
<% project_tree(@projects) do |project, level| %>
|
||||||
<tr class="<%= cycle("odd", "even") %> <%= css_project_classes(project) %> <%= level > 0 ? "idnt idnt-#{level}" : nil %>">
|
<tr class="<%= cycle("odd", "even") %> <%= project.css_classes %> <%= level > 0 ? "idnt idnt-#{level}" : nil %>">
|
||||||
<td class="name"><%= project.active? ? link_to(h(project.name), :controller => 'projects', :action => 'settings', :id => project) : h(project.name) %></td>
|
<td class="name"><%= link_to_project(project, :action => 'settings') %></td>
|
||||||
<td><%= textilizable project.short_description, :project => project %></td>
|
<td><%= textilizable project.short_description, :project => project %></td>
|
||||||
<td align="center"><%= checked_image project.is_public? %></td>
|
<td align="center"><%= checked_image project.is_public? %></td>
|
||||||
<td align="center"><%= format_date(project.created_on) %></td>
|
<td align="center"><%= format_date(project.created_on) %></td>
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
<span id="attachments_fields">
|
<span id="attachments_fields">
|
||||||
<%= file_field_tag 'attachments[1][file]', :size => 30, :id => nil -%>
|
<%= file_field_tag 'attachments[1][file]', :size => 30, :id => nil -%><label class="inline"><span id="attachment_description_label_content"><%= l(:label_optional_description) %></span><%= text_field_tag 'attachments[1][description]', '', :size => 60, :id => nil %>
|
||||||
<label class="inline"><span id="attachment_description_label_content"><%= l(:label_optional_description) %></span><%= text_field_tag 'attachments[1][description]', '', :size => 60, :id => nil %>
|
|
||||||
</label>
|
</label>
|
||||||
</span>
|
</span>
|
||||||
<br />
|
<br />
|
||||||
|
|||||||
@@ -30,11 +30,11 @@
|
|||||||
</table>
|
</table>
|
||||||
|
|
||||||
<% other_formats_links do |f| %>
|
<% other_formats_links do |f| %>
|
||||||
<%= f.link_to 'Atom', :url => {:controller => 'projects', :action => 'activity', :id => @project, :show_messages => 1, :key => User.current.rss_key} %>
|
<%= f.link_to 'Atom', :url => {:controller => 'activities', :action => 'index', :id => @project, :show_messages => 1, :key => User.current.rss_key} %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<% content_for :header_tags do %>
|
<% content_for :header_tags do %>
|
||||||
<%= auto_discovery_link_tag(:atom, {:controller => 'projects', :action => 'activity', :id => @project, :format => 'atom', :show_messages => 1, :key => User.current.rss_key}) %>
|
<%= auto_discovery_link_tag(:atom, {:controller => 'activities', :action => 'index', :id => @project, :format => 'atom', :show_messages => 1, :key => User.current.rss_key}) %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<% html_title l(:label_board_plural) %>
|
<% html_title l(:label_board_plural) %>
|
||||||
|
|||||||
@@ -9,14 +9,7 @@
|
|||||||
</fieldset>
|
</fieldset>
|
||||||
|
|
||||||
<p style="float:right;">
|
<p style="float:right;">
|
||||||
<%= link_to_remote ('« ' + (@month==1 ? "#{month_name(12)} #{@year-1}" : "#{month_name(@month-1)}")),
|
<%= link_to_previous_month(@year, @month) %> | <%= link_to_next_month(@year, @month) %>
|
||||||
{:update => "content", :url => { :year => (@month==1 ? @year-1 : @year), :month =>(@month==1 ? 12 : @month-1) }},
|
|
||||||
{:href => url_for(:action => 'show', :year => (@month==1 ? @year-1 : @year), :month =>(@month==1 ? 12 : @month-1))}
|
|
||||||
%> |
|
|
||||||
<%= link_to_remote ((@month==12 ? "#{month_name(1)} #{@year+1}" : "#{month_name(@month+1)}") + ' »'),
|
|
||||||
{:update => "content", :url => { :year => (@month==12 ? @year+1 : @year), :month =>(@month==12 ? 1 : @month+1) }},
|
|
||||||
{:href => url_for(:action => 'show', :year => (@month==12 ? @year+1 : @year), :month =>(@month==12 ? 1 : @month+1))}
|
|
||||||
%>
|
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p class="buttons">
|
<p class="buttons">
|
||||||
|
|||||||
@@ -4,20 +4,23 @@
|
|||||||
<% if !@issue.nil? -%>
|
<% if !@issue.nil? -%>
|
||||||
<li><%= context_menu_link l(:button_edit), {:controller => 'issues', :action => 'edit', :id => @issue},
|
<li><%= context_menu_link l(:button_edit), {:controller => 'issues', :action => 'edit', :id => @issue},
|
||||||
:class => 'icon-edit', :disabled => !@can[:edit] %></li>
|
:class => 'icon-edit', :disabled => !@can[:edit] %></li>
|
||||||
<li class="folder">
|
|
||||||
<a href="#" class="submenu" onclick="return false;"><%= l(:field_status) %></a>
|
|
||||||
<ul>
|
|
||||||
<% @statuses.each do |s| -%>
|
|
||||||
<li><%= context_menu_link s.name, {:controller => 'issues', :action => 'edit', :id => @issue, :issue => {:status_id => s}, :back_url => @back}, :method => :post,
|
|
||||||
:selected => (s == @issue.status), :disabled => !(@can[:update] && @allowed_statuses.include?(s)) %></li>
|
|
||||||
<% end -%>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
<% else %>
|
<% else %>
|
||||||
<li><%= context_menu_link l(:button_edit), {:controller => 'issues', :action => 'bulk_edit', :ids => @issues.collect(&:id)},
|
<li><%= context_menu_link l(:button_edit), {:controller => 'issues', :action => 'bulk_edit', :ids => @issues.collect(&:id)},
|
||||||
:class => 'icon-edit', :disabled => !@can[:edit] %></li>
|
:class => 'icon-edit', :disabled => !@can[:edit] %></li>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
|
<% unless @allowed_statuses.empty? %>
|
||||||
|
<li class="folder">
|
||||||
|
<a href="#" class="submenu" onclick="return false;"><%= l(:field_status) %></a>
|
||||||
|
<ul>
|
||||||
|
<% @statuses.each do |s| -%>
|
||||||
|
<li><%= context_menu_link s.name, {:controller => 'issues', :action => 'bulk_edit', :ids => @issues.collect(&:id), :issue => {:status_id => s}, :back_url => @back}, :method => :post,
|
||||||
|
:selected => (@issue && s == @issue.status), :disabled => !(@can[:update] && @allowed_statuses.include?(s)) %></li>
|
||||||
|
<% end -%>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
<% unless @trackers.nil? %>
|
<% unless @trackers.nil? %>
|
||||||
<li class="folder">
|
<li class="folder">
|
||||||
<a href="#" class="submenu"><%= l(:field_tracker) %></a>
|
<a href="#" class="submenu"><%= l(:field_tracker) %></a>
|
||||||
@@ -29,15 +32,19 @@
|
|||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
|
<% if @projects.size == 1 %>
|
||||||
<li class="folder">
|
<li class="folder">
|
||||||
<a href="#" class="submenu"><%= l(:field_priority) %></a>
|
<a href="#" class="submenu"><%= l(:field_priority) %></a>
|
||||||
<ul>
|
<ul>
|
||||||
<% @priorities.each do |p| -%>
|
<% @priorities.each do |p| -%>
|
||||||
<li><%= context_menu_link p.name, {:controller => 'issues', :action => 'bulk_edit', :ids => @issues.collect(&:id), :issue => {'priority_id' => p}, :back_url => @back}, :method => :post,
|
<li><%= context_menu_link p.name, {:controller => 'issues', :action => 'bulk_edit', :ids => @issues.collect(&:id), :issue => {'priority_id' => p}, :back_url => @back}, :method => :post,
|
||||||
:selected => (@issue && p == @issue.priority), :disabled => !@can[:edit] %></li>
|
:selected => (@issue && p == @issue.priority), :disabled => (!@can[:edit] || @issues.detect {|i| !i.leaf?}) %></li>
|
||||||
<% end -%>
|
<% end -%>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
<% unless @project.nil? || @project.shared_versions.open.empty? -%>
|
<% unless @project.nil? || @project.shared_versions.open.empty? -%>
|
||||||
<li class="folder">
|
<li class="folder">
|
||||||
<a href="#" class="submenu"><%= l(:field_fixed_version) %></a>
|
<a href="#" class="submenu"><%= l(:field_fixed_version) %></a>
|
||||||
@@ -77,17 +84,19 @@
|
|||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<% end -%>
|
<% end -%>
|
||||||
<% if Issue.use_field_for_done_ratio? %>
|
|
||||||
|
<% if Issue.use_field_for_done_ratio? && @projects.size == 1 %>
|
||||||
<li class="folder">
|
<li class="folder">
|
||||||
<a href="#" class="submenu"><%= l(:field_done_ratio) %></a>
|
<a href="#" class="submenu"><%= l(:field_done_ratio) %></a>
|
||||||
<ul>
|
<ul>
|
||||||
<% (0..10).map{|x|x*10}.each do |p| -%>
|
<% (0..10).map{|x|x*10}.each do |p| -%>
|
||||||
<li><%= context_menu_link "#{p}%", {:controller => 'issues', :action => 'bulk_edit', :ids => @issues.collect(&:id), :issue => {'done_ratio' => p}, :back_url => @back}, :method => :post,
|
<li><%= context_menu_link "#{p}%", {:controller => 'issues', :action => 'bulk_edit', :ids => @issues.collect(&:id), :issue => {'done_ratio' => p}, :back_url => @back}, :method => :post,
|
||||||
:selected => (@issue && p == @issue.done_ratio), :disabled => !@can[:edit] %></li>
|
:selected => (@issue && p == @issue.done_ratio), :disabled => (!@can[:edit] || @issues.detect {|i| !i.leaf?}) %></li>
|
||||||
<% end -%>
|
<% end -%>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<% if !@issue.nil? %>
|
<% if !@issue.nil? %>
|
||||||
<% if @can[:log_time] -%>
|
<% if @can[:log_time] -%>
|
||||||
<li><%= context_menu_link l(:button_log_time), {:controller => 'timelog', :action => 'edit', :issue_id => @issue},
|
<li><%= context_menu_link l(:button_log_time), {:controller => 'timelog', :action => 'edit', :issue_id => @issue},
|
||||||
@@ -102,9 +111,9 @@
|
|||||||
<li><%= context_menu_link l(:button_duplicate), {:controller => 'issues', :action => 'new', :project_id => @project, :copy_from => @issue},
|
<li><%= context_menu_link l(:button_duplicate), {:controller => 'issues', :action => 'new', :project_id => @project, :copy_from => @issue},
|
||||||
:class => 'icon-duplicate', :disabled => !@can[:copy] %></li>
|
:class => 'icon-duplicate', :disabled => !@can[:copy] %></li>
|
||||||
<% end %>
|
<% end %>
|
||||||
<li><%= context_menu_link l(:button_copy), {:controller => 'issues', :action => 'move', :ids => @issues.collect(&:id), :copy_options => {:copy => 't'}},
|
<li><%= context_menu_link l(:button_copy), new_issue_move_path(:ids => @issues.collect(&:id), :copy_options => {:copy => 't'}),
|
||||||
:class => 'icon-copy', :disabled => !@can[:move] %></li>
|
:class => 'icon-copy', :disabled => !@can[:move] %></li>
|
||||||
<li><%= context_menu_link l(:button_move), {:controller => 'issues', :action => 'move', :ids => @issues.collect(&:id)},
|
<li><%= context_menu_link l(:button_move), new_issue_move_path(:ids => @issues.collect(&:id)),
|
||||||
:class => 'icon-move', :disabled => !@can[:move] %></li>
|
:class => 'icon-move', :disabled => !@can[:move] %></li>
|
||||||
<li><%= context_menu_link l(:button_delete), {:controller => 'issues', :action => 'destroy', :ids => @issues.collect(&:id)},
|
<li><%= context_menu_link l(:button_delete), {:controller => 'issues', :action => 'destroy', :ids => @issues.collect(&:id)},
|
||||||
:method => :post, :confirm => l(:text_issues_destroy_confirmation), :class => 'icon-del', :disabled => !@can[:delete] %></li>
|
:method => :post, :confirm => l(:text_issues_destroy_confirmation), :class => 'icon-del', :disabled => !@can[:delete] %></li>
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
<div class="contextual">
|
<div class="contextual">
|
||||||
<%= link_to_if_authorized l(:label_attachment_new), {:controller => 'projects', :action => 'add_file', :id => @project}, :class => 'icon icon-add' %>
|
<%= link_to_if_authorized l(:label_attachment_new), {:controller => 'files', :action => 'new', :id => @project}, :class => 'icon icon-add' %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h2><%=l(:label_attachment_plural)%></h2>
|
<h2><%=l(:label_attachment_plural)%></h2>
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<%= error_messages_for 'attachment' %>
|
<%= error_messages_for 'attachment' %>
|
||||||
<div class="box">
|
<div class="box">
|
||||||
<% form_tag({ :action => 'add_file', :id => @project }, :multipart => true, :class => "tabular") do %>
|
<% form_tag({ :action => 'new', :id => @project }, :multipart => true, :class => "tabular") do %>
|
||||||
|
|
||||||
<% if @versions.any? %>
|
<% if @versions.any? %>
|
||||||
<p><label for="version_id"><%=l(:field_version)%></label>
|
<p><label for="version_id"><%=l(:field_version)%></label>
|
||||||
@@ -6,14 +6,14 @@
|
|||||||
<% end -%>
|
<% end -%>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<% form_tag({}, :id => 'move_form') do %>
|
<% form_tag({:action => 'create'}, :id => 'move_form') do %>
|
||||||
<%= @issues.collect {|i| hidden_field_tag('ids[]', i.id)}.join %>
|
<%= @issues.collect {|i| hidden_field_tag('ids[]', i.id)}.join %>
|
||||||
|
|
||||||
<div class="box tabular">
|
<div class="box tabular">
|
||||||
<p><label for="new_project_id"><%=l(:field_project)%>:</label>
|
<p><label for="new_project_id"><%=l(:field_project)%>:</label>
|
||||||
<%= select_tag "new_project_id",
|
<%= select_tag "new_project_id",
|
||||||
project_tree_options_for_select(@allowed_projects, :selected => @target_project),
|
project_tree_options_for_select(@allowed_projects, :selected => @target_project),
|
||||||
:onchange => remote_function(:url => { :action => 'move' },
|
:onchange => remote_function(:url => { :action => 'new' },
|
||||||
:method => :get,
|
:method => :get,
|
||||||
:update => 'content',
|
:update => 'content',
|
||||||
:with => "Form.serialize('move_form')") %></p>
|
:with => "Form.serialize('move_form')") %></p>
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
<% replace_watcher ||= 'watcher' %>
|
<% replace_watcher ||= 'watcher' %>
|
||||||
<%= watcher_tag(@issue, User.current, {:id => replace_watcher, :replace => ['watcher','watcher2']}) %>
|
<%= watcher_tag(@issue, User.current, {:id => replace_watcher, :replace => ['watcher','watcher2']}) %>
|
||||||
<%= link_to_if_authorized l(:button_duplicate), {:controller => 'issues', :action => 'new', :project_id => @project, :copy_from => @issue }, :class => 'icon icon-duplicate' %>
|
<%= link_to_if_authorized l(:button_duplicate), {:controller => 'issues', :action => 'new', :project_id => @project, :copy_from => @issue }, :class => 'icon icon-duplicate' %>
|
||||||
<%= link_to_if_authorized l(:button_copy), {:controller => 'issues', :action => 'move', :id => @issue, :copy_options => {:copy => 't'} }, :class => 'icon icon-copy' %>
|
<%= link_to_if_authorized l(:button_copy), new_issue_move_path(:id => @issue, :copy_options => {:copy => 't'}), :class => 'icon icon-copy' %>
|
||||||
<%= link_to_if_authorized l(:button_move), {:controller => 'issues', :action => 'move', :id => @issue }, :class => 'icon icon-move' %>
|
<%= link_to_if_authorized l(:button_move), new_issue_move_path(:id => @issue), :class => 'icon icon-move' %>
|
||||||
<%= link_to_if_authorized l(:button_delete), {:controller => 'issues', :action => 'destroy', :id => @issue}, :confirm => l(:text_are_you_sure), :method => :post, :class => 'icon icon-del' %>
|
<%= link_to_if_authorized l(:button_delete), {:controller => 'issues', :action => 'destroy', :id => @issue}, :confirm => (@issue.leaf? ? l(:text_are_you_sure) : l(:text_are_you_sure_with_children)), :method => :post, :class => 'icon icon-del' %>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
<%= prompt_to_remote(image_tag('add.png', :style => 'vertical-align: middle;'),
|
<%= prompt_to_remote(image_tag('add.png', :style => 'vertical-align: middle;'),
|
||||||
l(:label_version_new),
|
l(:label_version_new),
|
||||||
'version[name]',
|
'version[name]',
|
||||||
{:controller => 'versions', :action => 'new', :project_id => @project},
|
{:controller => 'versions', :action => 'create', :project_id => @project},
|
||||||
:title => l(:label_version_new),
|
:title => l(:label_version_new),
|
||||||
:tabindex => 200) if authorize_for('versions', 'new') %>
|
:tabindex => 200) if authorize_for('versions', 'new') %>
|
||||||
</p>
|
</p>
|
||||||
@@ -40,6 +40,6 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div style="clear:both;"> </div>
|
<div style="clear:both;"> </div>
|
||||||
<%= render :partial => 'form_custom_fields' %>
|
<%= render :partial => 'issues/form_custom_fields' %>
|
||||||
|
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|||||||
@@ -3,6 +3,8 @@
|
|||||||
<p><%= link_to("#{l(:label_revision)} #{changeset.revision}",
|
<p><%= link_to("#{l(:label_revision)} #{changeset.revision}",
|
||||||
:controller => 'repositories', :action => 'revision', :id => changeset.project, :rev => changeset.revision) %><br />
|
:controller => 'repositories', :action => 'revision', :id => changeset.project, :rev => changeset.revision) %><br />
|
||||||
<span class="author"><%= authoring(changeset.committed_on, changeset.author) %></span></p>
|
<span class="author"><%= authoring(changeset.committed_on, changeset.author) %></span></p>
|
||||||
<%= textilizable(changeset, :comments) %>
|
<div class="changeset-changes">
|
||||||
|
<%= textilizable(changeset, :comments) %>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|||||||
@@ -44,7 +44,7 @@
|
|||||||
<%= f.hidden_field :lock_version %>
|
<%= f.hidden_field :lock_version %>
|
||||||
<%= submit_tag l(:button_submit) %>
|
<%= submit_tag l(:button_submit) %>
|
||||||
<%= link_to_remote l(:label_preview),
|
<%= link_to_remote l(:label_preview),
|
||||||
{ :url => { :controller => 'issues', :action => 'preview', :project_id => @project, :id => @issue },
|
{ :url => preview_issue_path(:project_id => @project, :id => @issue),
|
||||||
:method => 'post',
|
:method => 'post',
|
||||||
:update => 'preview',
|
:update => 'preview',
|
||||||
:with => 'Form.serialize("issue-form")',
|
:with => 'Form.serialize("issue-form")',
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
|
<%= call_hook(:view_issues_form_details_top, { :issue => @issue, :form => f }) %>
|
||||||
|
|
||||||
<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.select :tracker_id, @project.trackers.collect {|t| [t.name, t.id]}, :required => true %></p>
|
<p><%= f.select :tracker_id, @project.trackers.collect {|t| [t.name, t.id]}, :required => true %></p>
|
||||||
<%= observe_field :issue_tracker_id, :url => { :action => :update_form, :project_id => @project, :id => @issue },
|
<%= observe_field :issue_tracker_id, :url => { :action => :new, :project_id => @project, :id => @issue },
|
||||||
:update => :attributes,
|
:update => :attributes,
|
||||||
:with => "Form.serialize('issue-form')" %>
|
:with => "Form.serialize('issue-form')" %>
|
||||||
|
|
||||||
@@ -9,10 +11,7 @@
|
|||||||
<% unless (@issue.new_record? && @issue.parent_issue_id.nil?) || !User.current.allowed_to?(:manage_subtasks, @project) %>
|
<% unless (@issue.new_record? && @issue.parent_issue_id.nil?) || !User.current.allowed_to?(:manage_subtasks, @project) %>
|
||||||
<p><%= f.text_field :parent_issue_id, :size => 10 %></p>
|
<p><%= f.text_field :parent_issue_id, :size => 10 %></p>
|
||||||
<div id="parent_issue_candidates" class="autocomplete"></div>
|
<div id="parent_issue_candidates" class="autocomplete"></div>
|
||||||
<%= javascript_tag "observeParentIssueField('#{url_for(:controller => :issues,
|
<%= javascript_tag "observeParentIssueField('#{auto_complete_issues_path(:id => @issue, :project_id => @project) }')" %>
|
||||||
:action => :auto_complete,
|
|
||||||
:id => @issue,
|
|
||||||
:project_id => @project) }')" %>
|
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<p><%= f.text_area :description,
|
<p><%= f.text_area :description,
|
||||||
@@ -23,7 +22,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="attributes" class="attributes">
|
<div id="attributes" class="attributes">
|
||||||
<%= render :partial => 'attributes' %>
|
<%= render :partial => 'issues/attributes' %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<% if @issue.new_record? %>
|
<% if @issue.new_record? %>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<% reply_links = authorize_for('issues', 'edit') -%>
|
<% reply_links = authorize_for('issues', 'edit') -%>
|
||||||
<% for journal in journals %>
|
<% for journal in journals %>
|
||||||
<div id="change-<%= journal.id %>" class="journal">
|
<div id="change-<%= journal.id %>" class="<%= journal.css_classes %>">
|
||||||
<h4><div style="float:right;"><%= link_to "##{journal.indice}", :anchor => "note-#{journal.indice}" %></div>
|
<h4><div class="journal-link"><%= link_to "##{journal.indice}", :anchor => "note-#{journal.indice}" %></div>
|
||||||
<%= avatar(journal.user, :size => "24") %>
|
<%= avatar(journal.user, :size => "24") %>
|
||||||
<%= content_tag('a', '', :name => "note-#{journal.indice}")%>
|
<%= content_tag('a', '', :name => "note-#{journal.indice}")%>
|
||||||
<%= authoring journal.created_on, journal.user, :label => :label_updated_time_by %></h4>
|
<%= authoring journal.created_on, journal.user, :label => :label_updated_time_by %></h4>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<div class="autoscroll">
|
<div class="autoscroll">
|
||||||
<table class="list issues">
|
<table class="list issues">
|
||||||
<thead><tr>
|
<thead><tr>
|
||||||
<th><%= link_to image_tag('toggle_check.png'), {}, :onclick => 'toggleIssuesSelection(Element.up(this, "form")); return false;',
|
<th class="checkbox hide-when-print"><%= 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('id', :caption => '#', :default_order => 'desc') %>
|
<%= sort_header_tag('id', :caption => '#', :default_order => 'desc') %>
|
||||||
@@ -25,7 +25,7 @@
|
|||||||
<% previous_group = group %>
|
<% previous_group = group %>
|
||||||
<% end %>
|
<% end %>
|
||||||
<tr id="issue-<%= issue.id %>" class="hascontextmenu <%= cycle('odd', 'even') %> <%= issue.css_classes %> <%= level > 0 ? "idnt idnt-#{level}" : nil %>">
|
<tr id="issue-<%= issue.id %>" class="hascontextmenu <%= cycle('odd', 'even') %> <%= issue.css_classes %> <%= level > 0 ? "idnt idnt-#{level}" : nil %>">
|
||||||
<td class="checkbox"><%= check_box_tag("ids[]", issue.id, false, :id => nil) %></td>
|
<td class="checkbox hide-when-print"><%= check_box_tag("ids[]", issue.id, false, :id => nil) %></td>
|
||||||
<td class="id"><%= link_to issue.id, :controller => 'issues', :action => 'show', :id => issue %></td>
|
<td class="id"><%= 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 %>
|
||||||
</tr>
|
</tr>
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
<%= 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 %>
|
||||||
</td>
|
</td>
|
||||||
<td class="project"><%= link_to(h(issue.project), :controller => 'projects', :action => 'show', :id => issue.project) %></td>
|
<td class="project"><%= link_to_project(issue.project) %></td>
|
||||||
<td class="tracker"><%=h issue.tracker %></td>
|
<td class="tracker"><%=h issue.tracker %></td>
|
||||||
<td class="subject">
|
<td class="subject">
|
||||||
<%= link_to h(truncate(issue.subject, :length => 60)), :controller => 'issues', :action => 'show', :id => issue %> (<%=h issue.status %>)
|
<%= link_to h(truncate(issue.subject, :length => 60)), :controller => 'issues', :action => 'show', :id => issue %> (<%=h issue.status %>)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<div class="contextual">
|
<div class="contextual">
|
||||||
<% if authorize_for('issue_relations', 'new') %>
|
<% if authorize_for('issue_relations', 'new') %>
|
||||||
<%= toggle_link l(:button_add), 'new-relation-form'%>
|
<%= toggle_link l(:button_add), 'new-relation-form', {:focus => 'relation_issue_to_id'} %>
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -28,6 +28,7 @@
|
|||||||
<% remote_form_for(:relation, @relation,
|
<% remote_form_for(:relation, @relation,
|
||||||
:url => {:controller => 'issue_relations', :action => 'new', :issue_id => @issue},
|
:url => {:controller => 'issue_relations', :action => 'new', :issue_id => @issue},
|
||||||
:method => :post,
|
:method => :post,
|
||||||
|
:complete => "Form.Element.focus('relation_issue_to_id');",
|
||||||
:html => {:id => 'new-relation-form', :style => (@relation ? '' : 'display: none;')}) do |f| %>
|
:html => {:id => 'new-relation-form', :style => (@relation ? '' : 'display: none;')}) do |f| %>
|
||||||
<%= render :partial => 'issue_relations/form', :locals => {:f => f}%>
|
<%= render :partial => 'issue_relations/form', :locals => {:f => f}%>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
<%= call_hook(:view_issues_sidebar_issues_bottom) %>
|
<%= call_hook(:view_issues_sidebar_issues_bottom) %>
|
||||||
|
|
||||||
<% if User.current.allowed_to?(:view_calendar, @project, :global => true) %>
|
<% if User.current.allowed_to?(:view_calendar, @project, :global => true) %>
|
||||||
<%= link_to(l(:label_calendar), :controller => 'issues', :action => 'calendar', :project_id => @project) %><br />
|
<%= link_to(l(:label_calendar), :controller => 'calendars', :action => 'show', :project_id => @project) %><br />
|
||||||
<% end %>
|
<% end %>
|
||||||
<% if User.current.allowed_to?(:view_gantt, @project, :global => true) %>
|
<% if User.current.allowed_to?(:view_gantt, @project, :global => true) %>
|
||||||
<%= link_to(l(:label_gantt), :controller => 'gantts', :action => 'show', :project_id => @project) %><br />
|
<%= link_to(l(:label_gantt), :controller => 'gantts', :action => 'show', :project_id => @project) %><br />
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<ul><%= @issues.collect {|i| content_tag('li', link_to(h("#{i.tracker} ##{i.id}"), { :action => 'show', :id => i }) + h(": #{i.subject}")) }.join("\n") %></ul>
|
<ul><%= @issues.collect {|i| content_tag('li', link_to(h("#{i.tracker} ##{i.id}"), { :action => 'show', :id => i }) + h(": #{i.subject}")) }.join("\n") %></ul>
|
||||||
|
|
||||||
<% form_tag() do %>
|
<% form_tag(:action => 'bulk_update') do %>
|
||||||
<%= @issues.collect {|i| hidden_field_tag('ids[]', i.id)}.join %>
|
<%= @issues.collect {|i| hidden_field_tag('ids[]', i.id)}.join %>
|
||||||
<div class="box tabular">
|
<div class="box tabular">
|
||||||
<fieldset class="attributes">
|
<fieldset class="attributes">
|
||||||
|
|||||||
@@ -39,6 +39,7 @@
|
|||||||
{ :url => { :set_filter => 1 },
|
{ :url => { :set_filter => 1 },
|
||||||
:before => 'selectAllOptions("selected_columns");',
|
:before => 'selectAllOptions("selected_columns");',
|
||||||
:update => "content",
|
:update => "content",
|
||||||
|
:complete => "apply_filters_observer()",
|
||||||
:with => "Form.serialize('query_form')"
|
:with => "Form.serialize('query_form')"
|
||||||
}, :class => 'icon icon-checked' %>
|
}, :class => 'icon icon-checked' %>
|
||||||
|
|
||||||
@@ -78,7 +79,7 @@
|
|||||||
|
|
||||||
<% content_for :header_tags do %>
|
<% content_for :header_tags do %>
|
||||||
<%= auto_discovery_link_tag(:atom, {:query_id => @query, :format => 'atom', :page => nil, :key => User.current.rss_key}, :title => l(:label_issue_plural)) %>
|
<%= auto_discovery_link_tag(:atom, {:query_id => @query, :format => 'atom', :page => nil, :key => User.current.rss_key}, :title => l(:label_issue_plural)) %>
|
||||||
<%= auto_discovery_link_tag(:atom, {:action => 'changes', :query_id => @query, :format => 'atom', :page => nil, :key => User.current.rss_key}, :title => l(:label_changes_details)) %>
|
<%= auto_discovery_link_tag(:atom, {:controller => 'journals', :action => 'index', :query_id => @query, :format => 'atom', :page => nil, :key => User.current.rss_key}, :title => l(:label_changes_details)) %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<%= context_menu :controller => 'issues', :action => 'context_menu' %>
|
<%= context_menu issues_context_menu_path %>
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
<%= submit_tag l(:button_create) %>
|
<%= submit_tag l(:button_create) %>
|
||||||
<%= submit_tag l(:button_create_and_continue), :name => 'continue' %>
|
<%= 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 => preview_issue_path(:project_id => @project),
|
||||||
:method => 'post',
|
:method => 'post',
|
||||||
:update => 'preview',
|
:update => 'preview',
|
||||||
:with => "Form.serialize('issue-form')",
|
:with => "Form.serialize('issue-form')",
|
||||||
|
|||||||
@@ -128,6 +128,7 @@
|
|||||||
<%= stylesheet_link_tag 'scm' %>
|
<%= stylesheet_link_tag 'scm' %>
|
||||||
<%= javascript_include_tag 'context_menu' %>
|
<%= javascript_include_tag 'context_menu' %>
|
||||||
<%= stylesheet_link_tag 'context_menu' %>
|
<%= stylesheet_link_tag 'context_menu' %>
|
||||||
|
<%= stylesheet_link_tag 'context_menu_rtl' if l(:direction) == 'rtl' %>
|
||||||
<% end %>
|
<% end %>
|
||||||
<div id="context-menu" style="display: none;"></div>
|
<div id="context-menu" style="display: none;"></div>
|
||||||
<%= javascript_tag "new ContextMenu('#{url_for(:controller => 'issues', :action => 'context_menu')}')" %>
|
<%= javascript_tag "new ContextMenu('#{issues_context_menu_path}')" %>
|
||||||
|
|||||||
@@ -5,7 +5,9 @@
|
|||||||
<title><%=h html_title %></title>
|
<title><%=h html_title %></title>
|
||||||
<meta name="description" content="<%= Redmine::Info.app_name %>" />
|
<meta name="description" content="<%= Redmine::Info.app_name %>" />
|
||||||
<meta name="keywords" content="issue,bug,tracker" />
|
<meta name="keywords" content="issue,bug,tracker" />
|
||||||
|
<%= favicon %>
|
||||||
<%= stylesheet_link_tag 'application', :media => 'all' %>
|
<%= stylesheet_link_tag 'application', :media => 'all' %>
|
||||||
|
<%= stylesheet_link_tag 'rtl', :media => 'all' if l(:direction) == 'rtl' %>
|
||||||
<%= javascript_include_tag :defaults %>
|
<%= javascript_include_tag :defaults %>
|
||||||
<%= heads_for_wiki_formatter %>
|
<%= heads_for_wiki_formatter %>
|
||||||
<!--[if IE]>
|
<!--[if IE]>
|
||||||
@@ -18,7 +20,7 @@
|
|||||||
<!-- page specific tags -->
|
<!-- page specific tags -->
|
||||||
<%= yield :header_tags -%>
|
<%= yield :header_tags -%>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body class="<%= body_css_classes %>">
|
||||||
<div id="wrapper">
|
<div id="wrapper">
|
||||||
<div id="wrapper2">
|
<div id="wrapper2">
|
||||||
<div id="top-menu">
|
<div id="top-menu">
|
||||||
|
|||||||
@@ -30,7 +30,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<h4>
|
<h4>
|
||||||
<%= avatar(message.author, :size => "24") %>
|
<%= avatar(message.author, :size => "24") %>
|
||||||
<%= link_to h(message.subject), { :controller => 'messages', :action => 'show', :board_id => @board, :id => @topic, :anchor => "message-#{message.id}" } %>
|
<%= link_to h(message.subject), { :controller => 'messages', :action => 'show', :board_id => @board, :id => @topic, :r => message, :anchor => "message-#{message.id}" } %>
|
||||||
-
|
-
|
||||||
<%= authoring message.created_on, message.author %>
|
<%= authoring message.created_on, message.author %>
|
||||||
</h4>
|
</h4>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<p><%= link_to(h(news.project.name), :controller => 'projects', :action => 'show', :id => news.project) + ': ' unless @project %>
|
<p><%= link_to_project(news.project) + ': ' unless @project %>
|
||||||
<%= link_to h(news.title), :controller => 'news', :action => 'show', :id => news %>
|
<%= link_to h(news.title), :controller => 'news', :action => 'show', :id => news %>
|
||||||
<%= "(#{l(:label_x_comments, :count => news.comments_count)})" if news.comments_count > 0 %>
|
<%= "(#{l(:label_x_comments, :count => news.comments_count)})" if news.comments_count > 0 %>
|
||||||
<br />
|
<br />
|
||||||
|
|||||||
@@ -12,3 +12,7 @@
|
|||||||
}, :accesskey => accesskey(:preview) %>
|
}, :accesskey => accesskey(:preview) %>
|
||||||
<% end %>
|
<% end %>
|
||||||
<div id="preview" class="wiki"></div>
|
<div id="preview" class="wiki"></div>
|
||||||
|
|
||||||
|
<% content_for :header_tags do %>
|
||||||
|
<%= stylesheet_link_tag 'scm' %>
|
||||||
|
<% end %>
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
<p class="nodata"><%= l(:label_no_data) %></p>
|
<p class="nodata"><%= l(:label_no_data) %></p>
|
||||||
<% else %>
|
<% else %>
|
||||||
<% @newss.each do |news| %>
|
<% @newss.each do |news| %>
|
||||||
<h3><%= link_to(h(news.project.name), :controller => 'projects', :action => 'show', :id => news.project) + ': ' unless news.project == @project %>
|
<h3><%= link_to_project(news.project) + ': ' unless news.project == @project %>
|
||||||
<%= link_to h(news.title), :controller => 'news', :action => 'show', :id => news %>
|
<%= link_to h(news.title), :controller => 'news', :action => 'show', :id => news %>
|
||||||
<%= "(#{l(:label_x_comments, :count => news.comments_count)})" if news.comments_count > 0 %></h3>
|
<%= "(#{l(:label_x_comments, :count => news.comments_count)})" if news.comments_count > 0 %></h3>
|
||||||
<p class="author"><%= authoring news.created_on, news.author %></p>
|
<p class="author"><%= authoring news.created_on, news.author %></p>
|
||||||
@@ -45,6 +45,7 @@
|
|||||||
|
|
||||||
<% content_for :header_tags do %>
|
<% content_for :header_tags do %>
|
||||||
<%= auto_discovery_link_tag(:atom, params.merge({:format => 'atom', :page => nil, :key => User.current.rss_key})) %>
|
<%= auto_discovery_link_tag(:atom, params.merge({:format => 'atom', :page => nil, :key => User.current.rss_key})) %>
|
||||||
|
<%= stylesheet_link_tag 'scm' %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<% html_title(l(:label_news_plural)) -%>
|
<% html_title(l(:label_news_plural)) -%>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<% labelled_tabular_form_for :project, @project, :url => { :action => "edit", :id => @project } do |f| %>
|
<% labelled_tabular_form_for :project, @project, :url => { :action => "update", :id => @project } do |f| %>
|
||||||
<%= render :partial => 'form', :locals => { :f => f } %>
|
<%= render :partial => 'form', :locals => { :f => f } %>
|
||||||
<%= submit_tag l(:button_save) %>
|
<%= submit_tag l(:button_save) %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|||||||
@@ -2,14 +2,14 @@
|
|||||||
|
|
||||||
<div class="box">
|
<div class="box">
|
||||||
<!--[form:project]-->
|
<!--[form:project]-->
|
||||||
<p><%= f.text_field :name, :required => true %><br /><em><%= l(:text_caracters_maximum, 30) %></em></p>
|
<p><%= f.text_field :name, :required => true, :maxlength => 30 %><br /><em><%= l(:text_caracters_maximum, 30) %></em></p>
|
||||||
|
|
||||||
<% unless @project.allowed_parents.compact.empty? %>
|
<% unless @project.allowed_parents.compact.empty? %>
|
||||||
<p><%= label(:project, :parent_id, l(:field_parent)) %><%= parent_project_select_tag(@project) %></p>
|
<p><%= label(:project, :parent_id, l(:field_parent)) %><%= parent_project_select_tag(@project) %></p>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<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?, :maxlength => 20 %>
|
||||||
<% unless @project.identifier_frozen? %>
|
<% unless @project.identifier_frozen? %>
|
||||||
<br /><em><%= l(:text_length_between, :min => 1, :max => 20) %> <%= l(:text_project_identifier_info) %></em>
|
<br /><em><%= l(:text_length_between, :min => 1, :max => 20) %> <%= l(:text_project_identifier_info) %></em>
|
||||||
<% end %></p>
|
<% end %></p>
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
<% if @users_by_role.any? %>
|
||||||
|
<div class="members box">
|
||||||
|
<h3><%=l(:label_member_plural)%></h3>
|
||||||
|
<p><% @users_by_role.keys.sort.each do |role| %>
|
||||||
|
<%=h role %>: <%= @users_by_role[role].sort.collect{|u| link_to_user u}.join(", ") %><br />
|
||||||
|
<% end %></p>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
@@ -3,10 +3,10 @@
|
|||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<div class="contextual">
|
<div class="contextual">
|
||||||
<%= link_to(l(:label_project_new), {:controller => 'projects', :action => 'add'}, :class => 'icon icon-add') + ' |' if User.current.allowed_to?(:add_project, nil, :global => true) %>
|
<%= link_to(l(:label_project_new), {:controller => 'projects', :action => 'new'}, :class => 'icon icon-add') + ' |' if User.current.allowed_to?(:add_project, nil, :global => true) %>
|
||||||
<%= link_to(l(:label_issue_view_all), { :controller => 'issues' }) + ' |' if User.current.allowed_to?(:view_issues, nil, :global => true) %>
|
<%= link_to(l(:label_issue_view_all), { :controller => 'issues' }) + ' |' if User.current.allowed_to?(:view_issues, nil, :global => true) %>
|
||||||
<%= link_to(l(:label_overall_spent_time), { :controller => 'time_entries' }) + ' |' if User.current.allowed_to?(:view_time_entries, nil, :global => true) %>
|
<%= link_to(l(:label_overall_spent_time), { :controller => 'time_entries' }) + ' |' if User.current.allowed_to?(:view_time_entries, nil, :global => true) %>
|
||||||
<%= link_to l(:label_overall_activity), { :controller => 'projects', :action => 'activity' }%>
|
<%= link_to l(:label_overall_activity), { :controller => 'activities', :action => 'index' }%>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h2><%=l(:label_project_plural)%></h2>
|
<h2><%=l(:label_project_plural)%></h2>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<h2><%=l(:label_project_new)%></h2>
|
<h2><%=l(:label_project_new)%></h2>
|
||||||
|
|
||||||
<% labelled_tabular_form_for :project, @project, :url => { :action => "add" } do |f| %>
|
<% labelled_tabular_form_for :project, @project, :url => { :action => "create" } do |f| %>
|
||||||
<%= render :partial => 'form', :locals => { :f => f } %>
|
<%= render :partial => 'form', :locals => { :f => f } %>
|
||||||
|
|
||||||
<fieldset class="box"><legend><%= l(:label_module_plural) %></legend>
|
<fieldset class="box"><legend><%= l(:label_module_plural) %></legend>
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
<% form_tag({:controller => 'projects', :action => 'save_activities', :id => @project}, :class => "tabular") do %>
|
<% form_tag({:controller => 'project_enumerations', :action => 'save', :id => @project}, :class => "tabular") do %>
|
||||||
|
|
||||||
<table class="list">
|
<table class="list">
|
||||||
<thead><tr>
|
<thead><tr>
|
||||||
@@ -32,7 +32,7 @@
|
|||||||
</table>
|
</table>
|
||||||
|
|
||||||
<div class="contextual">
|
<div class="contextual">
|
||||||
<%= link_to(l(:button_reset), {:controller => 'projects', :action => 'reset_activities', :id => @project},
|
<%= link_to(l(:button_reset), {:controller => 'project_enumerations', :action => 'destroy', :id => @project},
|
||||||
:method => :delete,
|
:method => :delete,
|
||||||
:confirm => l(:text_are_you_sure),
|
:confirm => l(:text_are_you_sure),
|
||||||
:class => 'icon icon-del') %>
|
:class => 'icon icon-del') %>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<div class="contextual">
|
<div class="contextual">
|
||||||
<% if User.current.allowed_to?(:add_subprojects, @project) %>
|
<% if User.current.allowed_to?(:add_subprojects, @project) %>
|
||||||
<%= link_to l(:label_subproject_new), {:controller => 'projects', :action => 'add', :parent_id => @project}, :class => 'icon icon-add' %>
|
<%= link_to l(:label_subproject_new), {:controller => 'projects', :action => 'new', :parent_id => @project}, :class => 'icon icon-add' %>
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -51,14 +51,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="splitcontentright">
|
<div class="splitcontentright">
|
||||||
<% if @users_by_role.any? %>
|
<%= render :partial => 'members_box' %>
|
||||||
<div class="members box">
|
|
||||||
<h3><%=l(:label_member_plural)%></h3>
|
|
||||||
<p><% @users_by_role.keys.sort.each do |role| %>
|
|
||||||
<%=h role %>: <%= @users_by_role[role].sort.collect{|u| link_to_user u}.join(", ") %><br />
|
|
||||||
<% end %></p>
|
|
||||||
</div>
|
|
||||||
<% end %>
|
|
||||||
|
|
||||||
<% if @news.any? && authorize_for('news', 'index') %>
|
<% if @news.any? && authorize_for('news', 'index') %>
|
||||||
<div class="news box">
|
<div class="news box">
|
||||||
@@ -81,7 +74,7 @@
|
|||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<% content_for :header_tags do %>
|
<% content_for :header_tags do %>
|
||||||
<%= auto_discovery_link_tag(:atom, {:action => 'activity', :id => @project, :format => 'atom', :key => User.current.rss_key}) %>
|
<%= auto_discovery_link_tag(:atom, {:controller => 'activities', :action => 'index', :id => @project, :format => 'atom', :key => User.current.rss_key}) %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<% html_title(l(:label_overview)) -%>
|
<% html_title(l(:label_overview)) -%>
|
||||||
|
|||||||
@@ -53,6 +53,18 @@ function toggle_multi_select(field) {
|
|||||||
select.multiple = true;
|
select.multiple = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function apply_filters_observer() {
|
||||||
|
$$("#query_form input[type=text]").invoke("observe", "keypress", function(e){
|
||||||
|
if(e.keyCode == Event.KEY_RETURN) {
|
||||||
|
<%= remote_function(:url => { :set_filter => 1},
|
||||||
|
:update => "content",
|
||||||
|
:with => "Form.serialize('query_form')",
|
||||||
|
:complete => "e.stop(); apply_filters_observer()") %>
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
Event.observe(document,"dom:loaded", apply_filters_observer);
|
||||||
//]]>
|
//]]>
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<h2><%= l(:label_revision) %> <%= format_revision(@rev_to) + ':' if @rev_to %><%= format_revision(@rev) %> <%=h @path %></h2>
|
<h2><%= l(:label_revision) %> <%= format_revision(@rev_to) + ':' if @rev_to %><%= format_revision(@rev) %> <%=h @path %></h2>
|
||||||
|
|
||||||
<!-- Choose view type -->
|
<!-- Choose view type -->
|
||||||
<% form_tag({}, :method => 'get') do %>
|
<% form_tag({:path => to_path_param(@path)}, :method => 'get') do %>
|
||||||
<%= hidden_field_tag('rev', params[:rev]) if params[:rev] %>
|
<%= hidden_field_tag('rev', params[:rev]) if params[:rev] %>
|
||||||
<%= hidden_field_tag('rev_to', params[:rev_to]) if params[:rev_to] %>
|
<%= hidden_field_tag('rev_to', params[:rev_to]) if params[:rev_to] %>
|
||||||
<p><label><%= l(:label_view_diff) %></label>
|
<p><label><%= l(:label_view_diff) %></label>
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div style="float:right;">
|
<div style="float:right;">
|
||||||
<%= link_to l(:label_ldap_authentication), :controller => 'ldap_auth_sources', :action => 'index' %>
|
<%= link_to l(:label_ldap_authentication), {:controller => 'ldap_auth_sources', :action => 'index'}, :class => 'icon icon-server-authentication' %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<%= submit_tag l(:button_save) %>
|
<%= submit_tag l(:button_save) %>
|
||||||
|
|||||||
@@ -14,7 +14,9 @@
|
|||||||
<% @user.memberships.each do |membership| %>
|
<% @user.memberships.each do |membership| %>
|
||||||
<% next if membership.new_record? %>
|
<% next if membership.new_record? %>
|
||||||
<tr id="member-<%= membership.id %>" class="<%= cycle 'odd', 'even' %> class">
|
<tr id="member-<%= membership.id %>" class="<%= cycle 'odd', 'even' %> class">
|
||||||
<td class="project"><%=h membership.project %></td>
|
<td class="project">
|
||||||
|
<%= link_to_project membership.project %>
|
||||||
|
</td>
|
||||||
<td class="roles">
|
<td class="roles">
|
||||||
<span id="member-<%= membership.id %>-roles"><%=h membership.roles.sort.collect(&:to_s).join(', ') %></span>
|
<span id="member-<%= membership.id %>-roles"><%=h membership.roles.sort.collect(&:to_s).join(', ') %></span>
|
||||||
<% remote_form_for(:membership, :url => { :action => 'edit_membership', :id => @user, :membership_id => membership },
|
<% remote_form_for(:membership, :url => { :action => 'edit_membership', :id => @user, :membership_id => membership },
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
<h3><%=l(:label_project_plural)%></h3>
|
<h3><%=l(:label_project_plural)%></h3>
|
||||||
<ul>
|
<ul>
|
||||||
<% for membership in @memberships %>
|
<% for membership in @memberships %>
|
||||||
<li><%= link_to(h(membership.project.name), :controller => 'projects', :action => 'show', :id => membership.project) %>
|
<li><%= link_to_project(membership.project) %>
|
||||||
(<%=h membership.roles.sort.collect(&:to_s).join(', ') %>, <%= format_date(membership.created_on) %>)</li>
|
(<%=h membership.roles.sort.collect(&:to_s).join(', ') %>, <%= format_date(membership.created_on) %>)</li>
|
||||||
<% end %>
|
<% end %>
|
||||||
</ul>
|
</ul>
|
||||||
@@ -35,7 +35,7 @@
|
|||||||
<div class="splitcontentright">
|
<div class="splitcontentright">
|
||||||
|
|
||||||
<% unless @events_by_day.empty? %>
|
<% unless @events_by_day.empty? %>
|
||||||
<h3><%= link_to l(:label_activity), :controller => 'projects', :action => 'activity', :id => nil, :user_id => @user, :from => @events_by_day.keys.first %></h3>
|
<h3><%= link_to l(:label_activity), :controller => 'activities', :action => 'index', :id => nil, :user_id => @user, :from => @events_by_day.keys.first %></h3>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<%=l(:label_reported_issues)%>: <%= Issue.count(:conditions => ["author_id=?", @user.id]) %>
|
<%=l(:label_reported_issues)%>: <%= Issue.count(:conditions => ["author_id=?", @user.id]) %>
|
||||||
@@ -57,11 +57,11 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<% other_formats_links do |f| %>
|
<% other_formats_links do |f| %>
|
||||||
<%= f.link_to 'Atom', :url => {:controller => 'projects', :action => 'activity', :id => nil, :user_id => @user, :key => User.current.rss_key} %>
|
<%= f.link_to 'Atom', :url => {:controller => 'activities', :action => 'index', :id => nil, :user_id => @user, :key => User.current.rss_key} %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<% content_for :header_tags do %>
|
<% content_for :header_tags do %>
|
||||||
<%= auto_discovery_link_tag(:atom, :controller => 'projects', :action => 'activity', :user_id => @user, :format => :atom, :key => User.current.rss_key) %>
|
<%= auto_discovery_link_tag(:atom, :controller => 'activities', :action => 'index', :user_id => @user, :format => :atom, :key => User.current.rss_key) %>
|
||||||
<% end %>
|
<% end %>
|
||||||
<% end %>
|
<% end %>
|
||||||
<%= call_hook :view_account_right_bottom, :user => @user %>
|
<%= call_hook :view_account_right_bottom, :user => @user %>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<h2><%=l(:label_version)%></h2>
|
<h2><%=l(:label_version)%></h2>
|
||||||
|
|
||||||
<% labelled_tabular_form_for :version, @version, :url => { :action => 'edit' } do |f| %>
|
<% labelled_tabular_form_for :version, @version, :url => { :action => 'update', :id => @version } do |f| %>
|
||||||
<%= render :partial => 'form', :locals => { :f => f } %>
|
<%= render :partial => 'form', :locals => { :f => f } %>
|
||||||
<%= submit_tag l(:button_save) %>
|
<%= submit_tag l(:button_save) %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|||||||
@@ -51,4 +51,4 @@
|
|||||||
|
|
||||||
<% html_title(l(:label_roadmap)) %>
|
<% html_title(l(:label_roadmap)) %>
|
||||||
|
|
||||||
<%= context_menu :controller => 'issues', :action => 'context_menu' %>
|
<%= context_menu issues_context_menu_path %>
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
<h2><%=l(:label_version_new)%></h2>
|
<h2><%=l(:label_version_new)%></h2>
|
||||||
|
|
||||||
<% labelled_tabular_form_for :version, @version, :url => { :action => 'new' } do |f| %>
|
<% labelled_tabular_form_for :version, @version, :url => { :action => 'create', :project_id => @project } do |f| %>
|
||||||
<%= render :partial => 'versions/form', :locals => { :f => f } %>
|
<%= render :partial => 'versions/form', :locals => { :f => f } %>
|
||||||
<%= submit_tag l(:button_create) %>
|
<%= submit_tag l(:button_create) %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|||||||
@@ -32,13 +32,10 @@
|
|||||||
<%= render :partial => 'versions/overview', :locals => {:version => @version} %>
|
<%= render :partial => 'versions/overview', :locals => {:version => @version} %>
|
||||||
<%= render(:partial => "wiki/content", :locals => {:content => @version.wiki_page.content}) if @version.wiki_page %>
|
<%= render(:partial => "wiki/content", :locals => {:content => @version.wiki_page.content}) if @version.wiki_page %>
|
||||||
|
|
||||||
<% issues = @version.fixed_issues.find(:all,
|
<% if @issues.present? %>
|
||||||
:include => [:status, :tracker, :priority],
|
|
||||||
:order => "#{Tracker.table_name}.position, #{Issue.table_name}.id") %>
|
|
||||||
<% if issues.size > 0 %>
|
|
||||||
<fieldset class="related-issues"><legend><%= l(:label_related_issues) %></legend>
|
<fieldset class="related-issues"><legend><%= l(:label_related_issues) %></legend>
|
||||||
<ul>
|
<ul>
|
||||||
<% issues.each do |issue| -%>
|
<% @issues.each do |issue| -%>
|
||||||
<li><%= link_to_issue(issue) %></li>
|
<li><%= link_to_issue(issue) %></li>
|
||||||
<% end -%>
|
<% end -%>
|
||||||
</ul>
|
</ul>
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
<% for project in @projects %>
|
<% for project in @projects %>
|
||||||
<% @project = project %>
|
<% @project = project %>
|
||||||
<li>
|
<li>
|
||||||
<%= link_to h(project.name), :controller => 'projects', :action => 'show', :id => project %> (<%= format_time(project.created_on) %>)
|
<%= link_to_project project %> (<%= format_time(project.created_on) %>)
|
||||||
<%= textilizable project.short_description, :project => project %>
|
<%= textilizable project.short_description, :project => project %>
|
||||||
</li>
|
</li>
|
||||||
<% end %>
|
<% end %>
|
||||||
@@ -34,6 +34,6 @@
|
|||||||
<% content_for :header_tags do %>
|
<% content_for :header_tags do %>
|
||||||
<%= auto_discovery_link_tag(:atom, {:controller => 'news', :action => 'index', :key => User.current.rss_key, :format => 'atom'},
|
<%= auto_discovery_link_tag(:atom, {:controller => 'news', :action => 'index', :key => User.current.rss_key, :format => 'atom'},
|
||||||
:title => "#{Setting.app_title}: #{l(:label_news_latest)}") %>
|
:title => "#{Setting.app_title}: #{l(:label_news_latest)}") %>
|
||||||
<%= auto_discovery_link_tag(:atom, {:controller => 'projects', :action => 'activity', :key => User.current.rss_key, :format => 'atom'},
|
<%= auto_discovery_link_tag(:atom, {:controller => 'activities', :action => 'index', :key => User.current.rss_key, :format => 'atom'},
|
||||||
:title => "#{Setting.app_title}: #{l(:label_activity)}") %>
|
:title => "#{Setting.app_title}: #{l(:label_activity)}") %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|||||||
@@ -23,11 +23,11 @@
|
|||||||
|
|
||||||
<% unless @pages.empty? %>
|
<% unless @pages.empty? %>
|
||||||
<% other_formats_links do |f| %>
|
<% other_formats_links do |f| %>
|
||||||
<%= f.link_to 'Atom', :url => {:controller => 'projects', :action => 'activity', :id => @project, :show_wiki_edits => 1, :key => User.current.rss_key} %>
|
<%= f.link_to 'Atom', :url => {:controller => 'activities', :action => 'index', :id => @project, :show_wiki_edits => 1, :key => User.current.rss_key} %>
|
||||||
<%= f.link_to('HTML', :url => {:action => 'special', :page => 'export'}) if User.current.allowed_to?(:export_wiki_pages, @project) %>
|
<%= f.link_to('HTML', :url => {:action => 'special', :page => 'export'}) if User.current.allowed_to?(:export_wiki_pages, @project) %>
|
||||||
<% end %>
|
<% end %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<% content_for :header_tags do %>
|
<% content_for :header_tags do %>
|
||||||
<%= auto_discovery_link_tag(:atom, :controller => 'projects', :action => 'activity', :id => @project, :show_wiki_edits => 1, :format => 'atom', :key => User.current.rss_key) %>
|
<%= auto_discovery_link_tag(:atom, :controller => 'activities', :action => 'index', :id => @project, :show_wiki_edits => 1, :format => 'atom', :key => User.current.rss_key) %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|||||||
@@ -16,11 +16,11 @@
|
|||||||
|
|
||||||
<% unless @pages.empty? %>
|
<% unless @pages.empty? %>
|
||||||
<% other_formats_links do |f| %>
|
<% other_formats_links do |f| %>
|
||||||
<%= f.link_to 'Atom', :url => {:controller => 'projects', :action => 'activity', :id => @project, :show_wiki_edits => 1, :key => User.current.rss_key} %>
|
<%= f.link_to 'Atom', :url => {:controller => 'activities', :action => 'index', :id => @project, :show_wiki_edits => 1, :key => User.current.rss_key} %>
|
||||||
<%= f.link_to('HTML', :url => {:action => 'special', :page => 'export'}) if User.current.allowed_to?(:export_wiki_pages, @project) %>
|
<%= f.link_to('HTML', :url => {:action => 'special', :page => 'export'}) if User.current.allowed_to?(:export_wiki_pages, @project) %>
|
||||||
<% end %>
|
<% end %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<% content_for :header_tags do %>
|
<% content_for :header_tags do %>
|
||||||
<%= auto_discovery_link_tag(:atom, :controller => 'projects', :action => 'activity', :id => @project, :show_wiki_edits => 1, :format => 'atom', :key => User.current.rss_key) %>
|
<%= auto_discovery_link_tag(:atom, :controller => 'activities', :action => 'index', :id => @project, :show_wiki_edits => 1, :format => 'atom', :key => User.current.rss_key) %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|||||||
@@ -4,9 +4,17 @@
|
|||||||
# Code is not reloaded between requests
|
# Code is not reloaded between requests
|
||||||
config.cache_classes = true
|
config.cache_classes = true
|
||||||
|
|
||||||
|
#####
|
||||||
|
# Customize the default logger (http://ruby-doc.org/core/classes/Logger.html)
|
||||||
|
#
|
||||||
# Use a different logger for distributed setups
|
# Use a different logger for distributed setups
|
||||||
# config.logger = SyslogLogger.new
|
# config.logger = SyslogLogger.new
|
||||||
|
#
|
||||||
|
# Rotate logs bigger than 1MB, keeps no more than 7 rotated logs around.
|
||||||
|
# When setting a new Logger, make sure to set it's log level too.
|
||||||
|
#
|
||||||
|
# config.logger = Logger.new(config.log_path, 7, 1048576)
|
||||||
|
# config.logger.level = Logger::INFO
|
||||||
|
|
||||||
# Full error reports are disabled and caching is turned on
|
# Full error reports are disabled and caching is turned on
|
||||||
config.action_controller.consider_all_requests_local = false
|
config.action_controller.consider_all_requests_local = false
|
||||||
|
|||||||
@@ -78,3 +78,17 @@ module AsynchronousMailer
|
|||||||
end
|
end
|
||||||
|
|
||||||
ActionMailer::Base.send :include, AsynchronousMailer
|
ActionMailer::Base.send :include, AsynchronousMailer
|
||||||
|
|
||||||
|
# TODO: Hack to support i18n 4.x on Rails 2.3.5. Remove post 2.3.6.
|
||||||
|
# See http://www.redmine.org/issues/6428 and http://www.redmine.org/issues/5608
|
||||||
|
module I18n
|
||||||
|
module Backend
|
||||||
|
module Base
|
||||||
|
def warn_syntax_deprecation!
|
||||||
|
return if @skip_syntax_deprecation
|
||||||
|
warn "The {{key}} interpolation syntax in I18n messages is deprecated. Please use %{key} instead.\nDowngrade your i18n gem to 0.3.7 (everything above must be deinstalled) to remove this warning, see http://www.redmine.org/issues/5608 for more information."
|
||||||
|
@skip_syntax_deprecation = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|||||||
+21
-6
@@ -1,4 +1,5 @@
|
|||||||
bg:
|
bg:
|
||||||
|
direction: ltr
|
||||||
date:
|
date:
|
||||||
formats:
|
formats:
|
||||||
# Use the strftime parameters for formats.
|
# Use the strftime parameters for formats.
|
||||||
@@ -63,7 +64,11 @@ bg:
|
|||||||
one: "almost 1 year"
|
one: "almost 1 year"
|
||||||
other: "almost {{count}} years"
|
other: "almost {{count}} years"
|
||||||
|
|
||||||
number:
|
number:
|
||||||
|
format:
|
||||||
|
separator: "."
|
||||||
|
delimiter: ""
|
||||||
|
precision: 3
|
||||||
human:
|
human:
|
||||||
format:
|
format:
|
||||||
precision: 1
|
precision: 1
|
||||||
@@ -71,13 +76,13 @@ bg:
|
|||||||
storage_units:
|
storage_units:
|
||||||
format: "%n %u"
|
format: "%n %u"
|
||||||
units:
|
units:
|
||||||
kb: KB
|
|
||||||
tb: TB
|
|
||||||
gb: GB
|
|
||||||
byte:
|
byte:
|
||||||
one: Byte
|
one: Byte
|
||||||
other: Bytes
|
other: Bytes
|
||||||
mb: 'MB'
|
kb: "KB"
|
||||||
|
mb: "MB"
|
||||||
|
gb: "GB"
|
||||||
|
tb: "TB"
|
||||||
|
|
||||||
# Used in array.to_sentence.
|
# Used in array.to_sentence.
|
||||||
support:
|
support:
|
||||||
@@ -111,6 +116,7 @@ bg:
|
|||||||
greater_than_start_date: "трябва да е след началната дата"
|
greater_than_start_date: "трябва да е след началната дата"
|
||||||
not_same_project: "не е от същия проект"
|
not_same_project: "не е от същия проект"
|
||||||
circular_dependency: "Тази релация ще доведе до безкрайна зависимост"
|
circular_dependency: "Тази релация ще доведе до безкрайна зависимост"
|
||||||
|
cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks"
|
||||||
|
|
||||||
actionview_instancetag_blank_option: Изберете
|
actionview_instancetag_blank_option: Изберете
|
||||||
|
|
||||||
@@ -704,7 +710,7 @@ bg:
|
|||||||
text_subprojects_destroy_warning: "Its subproject(s): {{value}} will be also deleted."
|
text_subprojects_destroy_warning: "Its subproject(s): {{value}} will be also deleted."
|
||||||
label_and_its_subprojects: "{{value}} and its subprojects"
|
label_and_its_subprojects: "{{value}} and its subprojects"
|
||||||
mail_body_reminder: "{{count}} issue(s) that are assigned to you are due in the next {{days}} days:"
|
mail_body_reminder: "{{count}} issue(s) that are assigned to you are due in the next {{days}} days:"
|
||||||
mail_subject_reminder: "{{count}} issue(s) due in the next days"
|
mail_subject_reminder: "{{count}} issue(s) due in the next {{days}} days"
|
||||||
text_user_wrote: "{{value}} wrote:"
|
text_user_wrote: "{{value}} wrote:"
|
||||||
label_duplicated_by: duplicated by
|
label_duplicated_by: duplicated by
|
||||||
setting_enabled_scm: Enabled SCM
|
setting_enabled_scm: Enabled SCM
|
||||||
@@ -898,3 +904,12 @@ bg:
|
|||||||
text_zoom_in: Zoom in
|
text_zoom_in: Zoom in
|
||||||
notice_unable_delete_time_entry: Unable to delete time log entry.
|
notice_unable_delete_time_entry: Unable to delete time log entry.
|
||||||
label_overall_spent_time: Overall spent time
|
label_overall_spent_time: Overall spent time
|
||||||
|
field_time_entries: Log time
|
||||||
|
project_module_gantt: Gantt
|
||||||
|
project_module_calendar: Calendar
|
||||||
|
field_member_of_group: Member of Group
|
||||||
|
field_assigned_to_role: Member of Role
|
||||||
|
button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}"
|
||||||
|
text_are_you_sure_with_children: Delete issue and all child issues?
|
||||||
|
field_text: Text field
|
||||||
|
|
||||||
|
|||||||
+12
-1
@@ -1,6 +1,7 @@
|
|||||||
#Ernad Husremovic hernad@bring.out.ba
|
#Ernad Husremovic hernad@bring.out.ba
|
||||||
|
|
||||||
bs:
|
bs:
|
||||||
|
direction: ltr
|
||||||
date:
|
date:
|
||||||
formats:
|
formats:
|
||||||
default: "%d.%m.%Y"
|
default: "%d.%m.%Y"
|
||||||
@@ -129,6 +130,7 @@ bs:
|
|||||||
greater_than_start_date: "mora biti veći nego početni datum"
|
greater_than_start_date: "mora biti veći nego početni datum"
|
||||||
not_same_project: "ne pripada istom projektu"
|
not_same_project: "ne pripada istom projektu"
|
||||||
circular_dependency: "Ova relacija stvar cirkularnu zavisnost"
|
circular_dependency: "Ova relacija stvar cirkularnu zavisnost"
|
||||||
|
cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks"
|
||||||
|
|
||||||
actionview_instancetag_blank_option: Molimo odaberite
|
actionview_instancetag_blank_option: Molimo odaberite
|
||||||
|
|
||||||
@@ -184,7 +186,7 @@ bs:
|
|||||||
mail_body_account_information: Informacija o vašem korisničkom računu
|
mail_body_account_information: Informacija o vašem korisničkom računu
|
||||||
mail_subject_account_activation_request: "{{value}} zahtjev za aktivaciju korisničkog računa"
|
mail_subject_account_activation_request: "{{value}} zahtjev za aktivaciju korisničkog računa"
|
||||||
mail_body_account_activation_request: "Novi korisnik ({{value}}) se registrovao. Korisnički račun čeka vaše odobrenje za aktivaciju:"
|
mail_body_account_activation_request: "Novi korisnik ({{value}}) se registrovao. Korisnički račun čeka vaše odobrenje za aktivaciju:"
|
||||||
mail_subject_reminder: "{{count}} aktivnost(i) u kašnjenju u narednim danima"
|
mail_subject_reminder: "{{count}} aktivnost(i) u kašnjenju u narednim {{days}} danima"
|
||||||
mail_body_reminder: "{{count}} aktivnost(i) koje su dodjeljenje vama u narednim {{days}} danima:"
|
mail_body_reminder: "{{count}} aktivnost(i) koje su dodjeljenje vama u narednim {{days}} danima:"
|
||||||
|
|
||||||
gui_validation_error: 1 greška
|
gui_validation_error: 1 greška
|
||||||
@@ -922,3 +924,12 @@ bs:
|
|||||||
text_zoom_in: Zoom in
|
text_zoom_in: Zoom in
|
||||||
notice_unable_delete_time_entry: Unable to delete time log entry.
|
notice_unable_delete_time_entry: Unable to delete time log entry.
|
||||||
label_overall_spent_time: Overall spent time
|
label_overall_spent_time: Overall spent time
|
||||||
|
field_time_entries: Log time
|
||||||
|
project_module_gantt: Gantt
|
||||||
|
project_module_calendar: Calendar
|
||||||
|
field_member_of_group: Member of Group
|
||||||
|
field_assigned_to_role: Member of Role
|
||||||
|
button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}"
|
||||||
|
text_are_you_sure_with_children: Delete issue and all child issues?
|
||||||
|
field_text: Text field
|
||||||
|
|
||||||
|
|||||||
+132
-112
@@ -1,4 +1,9 @@
|
|||||||
|
# Redmine catalan translation:
|
||||||
|
# by Joan Duran
|
||||||
|
|
||||||
ca:
|
ca:
|
||||||
|
# Text direction: Left-to-Right (ltr) or Right-to-Left (rtl)
|
||||||
|
direction: ltr
|
||||||
date:
|
date:
|
||||||
formats:
|
formats:
|
||||||
# Use the strftime parameters for formats.
|
# Use the strftime parameters for formats.
|
||||||
@@ -64,6 +69,11 @@ ca:
|
|||||||
other: "almost {{count}} years"
|
other: "almost {{count}} years"
|
||||||
|
|
||||||
number:
|
number:
|
||||||
|
# Default format for numbers
|
||||||
|
format:
|
||||||
|
separator: "."
|
||||||
|
delimiter: ""
|
||||||
|
precision: 3
|
||||||
human:
|
human:
|
||||||
format:
|
format:
|
||||||
delimiter: ""
|
delimiter: ""
|
||||||
@@ -78,6 +88,7 @@ ca:
|
|||||||
mb: "MB"
|
mb: "MB"
|
||||||
gb: "GB"
|
gb: "GB"
|
||||||
tb: "TB"
|
tb: "TB"
|
||||||
|
|
||||||
|
|
||||||
# Used in array.to_sentence.
|
# Used in array.to_sentence.
|
||||||
support:
|
support:
|
||||||
@@ -111,6 +122,7 @@ ca:
|
|||||||
greater_than_start_date: "ha de ser superior que la data inicial"
|
greater_than_start_date: "ha de ser superior que la data inicial"
|
||||||
not_same_project: "no pertany al mateix projecte"
|
not_same_project: "no pertany al mateix projecte"
|
||||||
circular_dependency: "Aquesta relació crearia una dependència circular"
|
circular_dependency: "Aquesta relació crearia una dependència circular"
|
||||||
|
cant_link_an_issue_with_a_descendant: "Un assumpte no es pot enllaçar a una de les seves subtasques"
|
||||||
|
|
||||||
actionview_instancetag_blank_option: Seleccioneu
|
actionview_instancetag_blank_option: Seleccioneu
|
||||||
|
|
||||||
@@ -144,18 +156,33 @@ ca:
|
|||||||
notice_email_sent: "S'ha enviat un correu electrònic a {{value}}"
|
notice_email_sent: "S'ha enviat un correu electrònic a {{value}}"
|
||||||
notice_email_error: "S'ha produït un error en enviar el correu ({{value}})"
|
notice_email_error: "S'ha produït un error en enviar el correu ({{value}})"
|
||||||
notice_feeds_access_key_reseted: "S'ha reiniciat la clau d'accés del RSS."
|
notice_feeds_access_key_reseted: "S'ha reiniciat la clau d'accés del RSS."
|
||||||
|
notice_api_access_key_reseted: "S'ha reiniciat la clau d'accés a l'API."
|
||||||
notice_failed_to_save_issues: "No s'han pogut desar %s assumptes de {{count}} seleccionats: {{ids}}."
|
notice_failed_to_save_issues: "No s'han pogut desar %s assumptes de {{count}} seleccionats: {{ids}}."
|
||||||
|
notice_failed_to_save_members: "No s'han pogut desar els membres: {{errors}}."
|
||||||
notice_no_issue_selected: "No s'ha seleccionat cap assumpte. Activeu els assumptes que voleu editar."
|
notice_no_issue_selected: "No s'ha seleccionat cap assumpte. Activeu els assumptes que voleu editar."
|
||||||
notice_account_pending: "S'ha creat el compte i ara està pendent de l'aprovació de l'administrador."
|
notice_account_pending: "S'ha creat el compte i ara està pendent de l'aprovació de l'administrador."
|
||||||
notice_default_data_loaded: "S'ha carregat correctament la configuració predeterminada."
|
notice_default_data_loaded: "S'ha carregat correctament la configuració predeterminada."
|
||||||
notice_unable_delete_version: "No s'ha pogut suprimir la versió."
|
notice_unable_delete_version: "No s'ha pogut suprimir la versió."
|
||||||
|
notice_unable_delete_time_entry: "No s'ha pogut suprimir l'entrada del registre de temps."
|
||||||
|
notice_issue_done_ratios_updated: "S'ha actualitzat el tant per cent dels assumptes."
|
||||||
|
|
||||||
error_can_t_load_default_data: "No s'ha pogut carregar la configuració predeterminada: {{value}} "
|
error_can_t_load_default_data: "No s'ha pogut carregar la configuració predeterminada: {{value}} "
|
||||||
error_scm_not_found: "No s'ha trobat l'entrada o la revisió en el dipòsit."
|
error_scm_not_found: "No s'ha trobat l'entrada o la revisió en el dipòsit."
|
||||||
error_scm_command_failed: "S'ha produït un error en intentar accedir al dipòsit: {{value}}"
|
error_scm_command_failed: "S'ha produït un error en intentar accedir al dipòsit: {{value}}"
|
||||||
error_scm_annotate: "L'entrada no existeix o no s'ha pogut anotar."
|
error_scm_annotate: "L'entrada no existeix o no s'ha pogut anotar."
|
||||||
error_issue_not_found_in_project: "No s'ha trobat l'assumpte o no pertany a aquest projecte"
|
error_issue_not_found_in_project: "No s'ha trobat l'assumpte o no pertany a aquest projecte"
|
||||||
|
error_no_tracker_in_project: "Aquest projecte no té seguidor associat. Comproveu els paràmetres del projecte."
|
||||||
|
error_no_default_issue_status: "No s'ha definit cap estat d'assumpte predeterminat. Comproveu la configuració (aneu a «Administració -> Estats de l'assumpte»)."
|
||||||
|
error_can_not_delete_custom_field: "No s'ha pogut suprimir el camp personalitat"
|
||||||
|
error_can_not_delete_tracker: "Aquest seguidor conté assumptes i no es pot suprimir."
|
||||||
|
error_can_not_remove_role: "Aquest rol s'està utilitzant i no es pot suprimir."
|
||||||
|
error_can_not_reopen_issue_on_closed_version: "Un assumpte assignat a una versió tancada no es pot tornar a obrir"
|
||||||
|
error_can_not_archive_project: "Aquest projecte no es pot arxivar"
|
||||||
|
error_issue_done_ratios_not_updated: "No s'ha actualitza el tant per cent dels assumptes."
|
||||||
|
error_workflow_copy_source: "Seleccioneu un seguidor o rol font"
|
||||||
|
error_workflow_copy_target: "Seleccioneu seguidors i rols objectiu"
|
||||||
|
error_unable_delete_issue_status: "No s'ha pogut suprimir l'estat de l'assumpte"
|
||||||
|
error_unable_to_connect: "No s'ha pogut connectar ({{value}})"
|
||||||
warning_attachments_not_saved: "No s'han pogut desar {{count}} fitxers."
|
warning_attachments_not_saved: "No s'han pogut desar {{count}} fitxers."
|
||||||
|
|
||||||
mail_subject_lost_password: "Contrasenya de {{value}}"
|
mail_subject_lost_password: "Contrasenya de {{value}}"
|
||||||
@@ -166,8 +193,12 @@ ca:
|
|||||||
mail_body_account_information: Informació del compte
|
mail_body_account_information: Informació del compte
|
||||||
mail_subject_account_activation_request: "Sol·licitud d'activació del compte de {{value}}"
|
mail_subject_account_activation_request: "Sol·licitud d'activació del compte de {{value}}"
|
||||||
mail_body_account_activation_request: "S'ha registrat un usuari nou ({{value}}). El seu compte està pendent d'aprovació:"
|
mail_body_account_activation_request: "S'ha registrat un usuari nou ({{value}}). El seu compte està pendent d'aprovació:"
|
||||||
mail_subject_reminder: "%d assumptes venceran els següents {{count}} dies"
|
mail_subject_reminder: "{{count}} assumptes venceran els següents {{days}} dies"
|
||||||
mail_body_reminder: "{{count}} assumptes que teniu assignades venceran els següents {{days}} dies:"
|
mail_body_reminder: "{{count}} assumptes que teniu assignades venceran els següents {{days}} dies:"
|
||||||
|
mail_subject_wiki_content_added: "S'ha afegit la pàgina wiki «{{page}}»"
|
||||||
|
mail_body_wiki_content_added: "En {{author}} ha afegit la pàgina wiki «{{page}}»."
|
||||||
|
mail_subject_wiki_content_updated: "S'ha actualitzat la pàgina wiki «{{page}}»"
|
||||||
|
mail_body_wiki_content_updated: "En {{author}} ha actualitzat la pàgina wiki «{{page}}»."
|
||||||
|
|
||||||
gui_validation_error: 1 error
|
gui_validation_error: 1 error
|
||||||
gui_validation_error_plural: "{{count}} errors"
|
gui_validation_error_plural: "{{count}} errors"
|
||||||
@@ -207,6 +238,7 @@ ca:
|
|||||||
field_priority: Prioritat
|
field_priority: Prioritat
|
||||||
field_fixed_version: Versió objectiu
|
field_fixed_version: Versió objectiu
|
||||||
field_user: Usuari
|
field_user: Usuari
|
||||||
|
field_principal: Principal
|
||||||
field_role: Rol
|
field_role: Rol
|
||||||
field_homepage: Pàgina web
|
field_homepage: Pàgina web
|
||||||
field_is_public: Públic
|
field_is_public: Públic
|
||||||
@@ -251,6 +283,7 @@ ca:
|
|||||||
field_redirect_existing_links: Redirigeix els enllaços existents
|
field_redirect_existing_links: Redirigeix els enllaços existents
|
||||||
field_estimated_hours: Temps previst
|
field_estimated_hours: Temps previst
|
||||||
field_column_names: Columnes
|
field_column_names: Columnes
|
||||||
|
field_time_entries: "Registre de temps"
|
||||||
field_time_zone: Zona horària
|
field_time_zone: Zona horària
|
||||||
field_searchable: Es pot cercar
|
field_searchable: Es pot cercar
|
||||||
field_default_value: Valor predeterminat
|
field_default_value: Valor predeterminat
|
||||||
@@ -260,6 +293,9 @@ ca:
|
|||||||
field_watcher: Vigilància
|
field_watcher: Vigilància
|
||||||
field_identity_url: URL OpenID
|
field_identity_url: URL OpenID
|
||||||
field_content: Contingut
|
field_content: Contingut
|
||||||
|
field_group_by: "Agrupa els resultats per"
|
||||||
|
field_sharing: Compartició
|
||||||
|
field_parent_issue: "Tasca pare"
|
||||||
|
|
||||||
setting_app_title: "Títol de l'aplicació"
|
setting_app_title: "Títol de l'aplicació"
|
||||||
setting_app_subtitle: "Subtítol de l'aplicació"
|
setting_app_subtitle: "Subtítol de l'aplicació"
|
||||||
@@ -295,20 +331,35 @@ ca:
|
|||||||
setting_activity_days_default: "Dies a mostrar l'activitat del projecte"
|
setting_activity_days_default: "Dies a mostrar l'activitat del projecte"
|
||||||
setting_display_subprojects_issues: "Mostra els assumptes d'un subprojecte en el projecte pare per defecte"
|
setting_display_subprojects_issues: "Mostra els assumptes d'un subprojecte en el projecte pare per defecte"
|
||||||
setting_enabled_scm: "Habilita l'SCM"
|
setting_enabled_scm: "Habilita l'SCM"
|
||||||
|
setting_mail_handler_body_delimiters: "Trunca els correus electrònics després d'una d'aquestes línies"
|
||||||
setting_mail_handler_api_enabled: "Habilita el WS per correus electrònics d'entrada"
|
setting_mail_handler_api_enabled: "Habilita el WS per correus electrònics d'entrada"
|
||||||
setting_mail_handler_api_key: Clau API
|
setting_mail_handler_api_key: Clau API
|
||||||
setting_sequential_project_identifiers: Genera identificadors de projecte seqüencials
|
setting_sequential_project_identifiers: Genera identificadors de projecte seqüencials
|
||||||
setting_gravatar_enabled: "Utilitza les icones d'usuari Gravatar"
|
setting_gravatar_enabled: "Utilitza les icones d'usuari Gravatar"
|
||||||
|
setting_gravatar_default: "Imatge Gravatar predeterminada"
|
||||||
setting_diff_max_lines_displayed: Número màxim de línies amb diferències mostrades
|
setting_diff_max_lines_displayed: Número màxim de línies amb diferències mostrades
|
||||||
setting_file_max_size_displayed: Mida màxima dels fitxers de text mostrats en línia
|
setting_file_max_size_displayed: Mida màxima dels fitxers de text mostrats en línia
|
||||||
setting_repository_log_display_limit: Número màxim de revisions que es mostren al registre de fitxers
|
setting_repository_log_display_limit: Número màxim de revisions que es mostren al registre de fitxers
|
||||||
setting_openid: "Permet entrar i registrar-se amb l'OpenID"
|
setting_openid: "Permet entrar i registrar-se amb l'OpenID"
|
||||||
|
setting_password_min_length: "Longitud mínima de la contrasenya"
|
||||||
|
setting_new_project_user_role_id: "Aquest rol es dóna a un usuari no administrador per a crear projectes"
|
||||||
|
setting_default_projects_modules: "Mòduls activats per defecte en els projectes nous"
|
||||||
|
setting_issue_done_ratio: "Calcula tant per cent realitzat de l'assumpte amb"
|
||||||
|
setting_issue_done_ratio_issue_status: "Utilitza l'estat de l'assumpte"
|
||||||
|
setting_issue_done_ratio_issue_field: "Utilitza el camp de l'assumpte"
|
||||||
|
setting_start_of_week: "Inicia les setmanes en"
|
||||||
|
setting_rest_api_enabled: "Habilita el servei web REST"
|
||||||
|
setting_cache_formatted_text: Cache formatted text
|
||||||
|
|
||||||
|
permission_add_project: "Crea projectes"
|
||||||
|
permission_add_subprojects: "Crea subprojectes"
|
||||||
permission_edit_project: Edita el projecte
|
permission_edit_project: Edita el projecte
|
||||||
permission_select_project_modules: Selecciona els mòduls del projecte
|
permission_select_project_modules: Selecciona els mòduls del projecte
|
||||||
permission_manage_members: Gestiona els membres
|
permission_manage_members: Gestiona els membres
|
||||||
|
permission_manage_project_activities: "Gestiona les activitats del projecte"
|
||||||
permission_manage_versions: Gestiona les versions
|
permission_manage_versions: Gestiona les versions
|
||||||
permission_manage_categories: Gestiona les categories dels assumptes
|
permission_manage_categories: Gestiona les categories dels assumptes
|
||||||
|
permission_view_issues: "Visualitza els assumptes"
|
||||||
permission_add_issues: Afegeix assumptes
|
permission_add_issues: Afegeix assumptes
|
||||||
permission_edit_issues: Edita els assumptes
|
permission_edit_issues: Edita els assumptes
|
||||||
permission_manage_issue_relations: Gestiona les relacions dels assumptes
|
permission_manage_issue_relations: Gestiona les relacions dels assumptes
|
||||||
@@ -323,6 +374,7 @@ ca:
|
|||||||
permission_view_calendar: Visualitza el calendari
|
permission_view_calendar: Visualitza el calendari
|
||||||
permission_view_issue_watchers: Visualitza la llista de vigilàncies
|
permission_view_issue_watchers: Visualitza la llista de vigilàncies
|
||||||
permission_add_issue_watchers: Afegeix vigilàncies
|
permission_add_issue_watchers: Afegeix vigilàncies
|
||||||
|
permission_delete_issue_watchers: Suprimeix els vigilants
|
||||||
permission_log_time: Registra el temps invertit
|
permission_log_time: Registra el temps invertit
|
||||||
permission_view_time_entries: Visualitza el temps invertit
|
permission_view_time_entries: Visualitza el temps invertit
|
||||||
permission_edit_time_entries: Edita els registres de temps
|
permission_edit_time_entries: Edita els registres de temps
|
||||||
@@ -352,6 +404,8 @@ ca:
|
|||||||
permission_edit_own_messages: Edita els missatges propis
|
permission_edit_own_messages: Edita els missatges propis
|
||||||
permission_delete_messages: Suprimeix els missatges
|
permission_delete_messages: Suprimeix els missatges
|
||||||
permission_delete_own_messages: Suprimeix els missatges propis
|
permission_delete_own_messages: Suprimeix els missatges propis
|
||||||
|
permission_export_wiki_pages: "Exporta les pàgines wiki"
|
||||||
|
permission_manage_subtasks: "Gestiona subtasques"
|
||||||
|
|
||||||
project_module_issue_tracking: "Seguidor d'assumptes"
|
project_module_issue_tracking: "Seguidor d'assumptes"
|
||||||
project_module_time_tracking: Seguidor de temps
|
project_module_time_tracking: Seguidor de temps
|
||||||
@@ -361,10 +415,13 @@ ca:
|
|||||||
project_module_wiki: Wiki
|
project_module_wiki: Wiki
|
||||||
project_module_repository: Dipòsit
|
project_module_repository: Dipòsit
|
||||||
project_module_boards: Taulers
|
project_module_boards: Taulers
|
||||||
|
project_module_calendar: Calendari
|
||||||
|
project_module_gantt: Gantt
|
||||||
|
|
||||||
label_user: Usuari
|
label_user: Usuari
|
||||||
label_user_plural: Usuaris
|
label_user_plural: Usuaris
|
||||||
label_user_new: Usuari nou
|
label_user_new: Usuari nou
|
||||||
|
label_user_anonymous: Anònim
|
||||||
label_project: Projecte
|
label_project: Projecte
|
||||||
label_project_new: Projecte nou
|
label_project_new: Projecte nou
|
||||||
label_project_plural: Projectes
|
label_project_plural: Projectes
|
||||||
@@ -411,12 +468,13 @@ ca:
|
|||||||
label_information_plural: Informació
|
label_information_plural: Informació
|
||||||
label_please_login: Entreu
|
label_please_login: Entreu
|
||||||
label_register: Registre
|
label_register: Registre
|
||||||
label_login_with_open_id_option: o entra amb l'OpenID
|
label_login_with_open_id_option: "o entra amb l'OpenID"
|
||||||
label_password_lost: Contrasenya perduda
|
label_password_lost: Contrasenya perduda
|
||||||
label_home: Inici
|
label_home: Inici
|
||||||
label_my_page: La meva pàgina
|
label_my_page: La meva pàgina
|
||||||
label_my_account: El meu compte
|
label_my_account: El meu compte
|
||||||
label_my_projects: Els meus projectes
|
label_my_projects: Els meus projectes
|
||||||
|
label_my_page_block: "Els meus blocs de pàgina"
|
||||||
label_administration: Administració
|
label_administration: Administració
|
||||||
label_login: Entra
|
label_login: Entra
|
||||||
label_logout: Surt
|
label_logout: Surt
|
||||||
@@ -436,6 +494,7 @@ ca:
|
|||||||
label_auth_source_new: "Mode d'autenticació nou"
|
label_auth_source_new: "Mode d'autenticació nou"
|
||||||
label_auth_source_plural: "Modes d'autenticació"
|
label_auth_source_plural: "Modes d'autenticació"
|
||||||
label_subproject_plural: Subprojectes
|
label_subproject_plural: Subprojectes
|
||||||
|
label_subproject_new: "Subprojecte nou"
|
||||||
label_and_its_subprojects: "{{value}} i els seus subprojectes"
|
label_and_its_subprojects: "{{value}} i els seus subprojectes"
|
||||||
label_min_max_length: Longitud mín - max
|
label_min_max_length: Longitud mín - max
|
||||||
label_list: Llist
|
label_list: Llist
|
||||||
@@ -470,8 +529,9 @@ ca:
|
|||||||
label_version: Versió
|
label_version: Versió
|
||||||
label_version_new: Versió nova
|
label_version_new: Versió nova
|
||||||
label_version_plural: Versions
|
label_version_plural: Versions
|
||||||
|
label_close_versions: "Tanca les versions completades"
|
||||||
label_confirmation: Confirmació
|
label_confirmation: Confirmació
|
||||||
label_export_to: 'També disponible a:'
|
label_export_to: "També disponible a:"
|
||||||
label_read: Llegeix...
|
label_read: Llegeix...
|
||||||
label_public_projects: Projectes públics
|
label_public_projects: Projectes públics
|
||||||
label_open_issues: obert
|
label_open_issues: obert
|
||||||
@@ -528,6 +588,8 @@ ca:
|
|||||||
label_not_equals: no és
|
label_not_equals: no és
|
||||||
label_in_less_than: en menys de
|
label_in_less_than: en menys de
|
||||||
label_in_more_than: en més de
|
label_in_more_than: en més de
|
||||||
|
label_greater_or_equal: ">="
|
||||||
|
label_less_or_equal: <=
|
||||||
label_in: en
|
label_in: en
|
||||||
label_today: avui
|
label_today: avui
|
||||||
label_all_time: tot el temps
|
label_all_time: tot el temps
|
||||||
@@ -550,17 +612,21 @@ ca:
|
|||||||
label_browse: Navega
|
label_browse: Navega
|
||||||
label_modification: "{{count}} canvi"
|
label_modification: "{{count}} canvi"
|
||||||
label_modification_plural: "{{count}} canvis"
|
label_modification_plural: "{{count}} canvis"
|
||||||
|
label_branch: Branca
|
||||||
|
label_tag: Etiqueta
|
||||||
label_revision: Revisió
|
label_revision: Revisió
|
||||||
label_revision_plural: Revisions
|
label_revision_plural: Revisions
|
||||||
|
label_revision_id: "Revisió {{value}}"
|
||||||
label_associated_revisions: Revisions associades
|
label_associated_revisions: Revisions associades
|
||||||
label_added: afegit
|
label_added: afegit
|
||||||
label_modified: modificat
|
label_modified: modificat
|
||||||
label_renamed: reanomenat
|
|
||||||
label_copied: copiat
|
label_copied: copiat
|
||||||
|
label_renamed: reanomenat
|
||||||
label_deleted: suprimit
|
label_deleted: suprimit
|
||||||
label_latest_revision: Última revisió
|
label_latest_revision: Última revisió
|
||||||
label_latest_revision_plural: Últimes revisions
|
label_latest_revision_plural: Últimes revisions
|
||||||
label_view_revisions: Visualitza les revisions
|
label_view_revisions: Visualitza les revisions
|
||||||
|
label_view_all_revisions: "Visualitza totes les revisions"
|
||||||
label_max_size: Mida màxima
|
label_max_size: Mida màxima
|
||||||
label_sort_highest: Mou a la part superior
|
label_sort_highest: Mou a la part superior
|
||||||
label_sort_higher: Mou cap amunt
|
label_sort_higher: Mou cap amunt
|
||||||
@@ -586,6 +652,7 @@ ca:
|
|||||||
label_changes_details: Detalls de tots els canvis
|
label_changes_details: Detalls de tots els canvis
|
||||||
label_issue_tracking: "Seguiment d'assumptes"
|
label_issue_tracking: "Seguiment d'assumptes"
|
||||||
label_spent_time: Temps invertit
|
label_spent_time: Temps invertit
|
||||||
|
label_overall_spent_time: "Temps total invertit"
|
||||||
label_f_hour: "{{value}} hora"
|
label_f_hour: "{{value}} hora"
|
||||||
label_f_hour_plural: "{{value}} hores"
|
label_f_hour_plural: "{{value}} hores"
|
||||||
label_time_tracking: Temps de seguiment
|
label_time_tracking: Temps de seguiment
|
||||||
@@ -623,6 +690,8 @@ ca:
|
|||||||
label_board: Fòrum
|
label_board: Fòrum
|
||||||
label_board_new: Fòrum nou
|
label_board_new: Fòrum nou
|
||||||
label_board_plural: Fòrums
|
label_board_plural: Fòrums
|
||||||
|
label_board_locked: Bloquejat
|
||||||
|
label_board_sticky: Sticky
|
||||||
label_topic_plural: Temes
|
label_topic_plural: Temes
|
||||||
label_message_plural: Missatges
|
label_message_plural: Missatges
|
||||||
label_message_last: Últim missatge
|
label_message_last: Últim missatge
|
||||||
@@ -638,6 +707,8 @@ ca:
|
|||||||
label_language_based: "Basat en l'idioma de l'usuari"
|
label_language_based: "Basat en l'idioma de l'usuari"
|
||||||
label_sort_by: "Ordena per {{value}}"
|
label_sort_by: "Ordena per {{value}}"
|
||||||
label_send_test_email: Envia un correu electrònic de prova
|
label_send_test_email: Envia un correu electrònic de prova
|
||||||
|
label_feeds_access_key: "Clau d'accés del RSS"
|
||||||
|
label_missing_feeds_access_key: "Falta una clau d'accés del RSS"
|
||||||
label_feeds_access_key_created_on: "Clau d'accés del RSS creada fa {{value}}"
|
label_feeds_access_key_created_on: "Clau d'accés del RSS creada fa {{value}}"
|
||||||
label_module_plural: Mòduls
|
label_module_plural: Mòduls
|
||||||
label_added_time_by: "Afegit per {{author}} fa {{age}}"
|
label_added_time_by: "Afegit per {{author}} fa {{age}}"
|
||||||
@@ -683,6 +754,28 @@ ca:
|
|||||||
label_ascending: Ascendent
|
label_ascending: Ascendent
|
||||||
label_descending: Descendent
|
label_descending: Descendent
|
||||||
label_date_from_to: Des de {{start}} a {{end}}
|
label_date_from_to: Des de {{start}} a {{end}}
|
||||||
|
label_wiki_content_added: "S'ha afegit la pàgina wiki"
|
||||||
|
label_wiki_content_updated: "S'ha actualitzat la pàgina wiki"
|
||||||
|
label_group: Grup
|
||||||
|
label_group_plural: Grups
|
||||||
|
label_group_new: Grup nou
|
||||||
|
label_time_entry_plural: Temps invertit
|
||||||
|
label_version_sharing_hierarchy: "Amb la jerarquia del projecte"
|
||||||
|
label_version_sharing_system: "Amb tots els projectes"
|
||||||
|
label_version_sharing_descendants: "Amb tots els subprojectes"
|
||||||
|
label_version_sharing_tree: "Amb l'arbre del projecte"
|
||||||
|
label_version_sharing_none: "Sense compartir"
|
||||||
|
label_update_issue_done_ratios: "Actualitza el tant per cent dels assumptes realitzats"
|
||||||
|
label_copy_source: Font
|
||||||
|
label_copy_target: Objectiu
|
||||||
|
label_copy_same_as_target: "El mateix que l'objectiu"
|
||||||
|
label_display_used_statuses_only: "Mostra només els estats que utilitza aquest seguidor"
|
||||||
|
label_api_access_key: "Clau d'accés a l'API"
|
||||||
|
label_missing_api_access_key: "Falta una clau d'accés de l'API"
|
||||||
|
label_api_access_key_created_on: "Clau d'accés de l'API creada fa {{value}}"
|
||||||
|
label_profile: Perfil
|
||||||
|
label_subtask_plural: Subtasques
|
||||||
|
label_project_copy_notifications: "Envia notificacions de correu electrònic durant la còpia del projecte"
|
||||||
|
|
||||||
button_login: Entra
|
button_login: Entra
|
||||||
button_submit: Tramet
|
button_submit: Tramet
|
||||||
@@ -704,11 +797,12 @@ ca:
|
|||||||
button_list: Llista
|
button_list: Llista
|
||||||
button_view: Visualitza
|
button_view: Visualitza
|
||||||
button_move: Mou
|
button_move: Mou
|
||||||
|
button_move_and_follow: "Mou i segueix"
|
||||||
button_back: Enrere
|
button_back: Enrere
|
||||||
button_cancel: Cancel·la
|
button_cancel: Cancel·la
|
||||||
button_activate: Activa
|
button_activate: Activa
|
||||||
button_sort: Ordena
|
button_sort: Ordena
|
||||||
button_log_time: "Hora d'entrada"
|
button_log_time: "Registre de temps"
|
||||||
button_rollback: Torna a aquesta versió
|
button_rollback: Torna a aquesta versió
|
||||||
button_watch: Vigila
|
button_watch: Vigila
|
||||||
button_unwatch: No vigilis
|
button_unwatch: No vigilis
|
||||||
@@ -719,15 +813,24 @@ ca:
|
|||||||
button_rename: Reanomena
|
button_rename: Reanomena
|
||||||
button_change_password: Canvia la contrasenya
|
button_change_password: Canvia la contrasenya
|
||||||
button_copy: Copia
|
button_copy: Copia
|
||||||
|
button_copy_and_follow: "Copia i segueix"
|
||||||
button_annotate: Anota
|
button_annotate: Anota
|
||||||
button_update: Actualitza
|
button_update: Actualitza
|
||||||
button_configure: Configura
|
button_configure: Configura
|
||||||
button_quote: Cita
|
button_quote: Cita
|
||||||
|
button_duplicate: Duplica
|
||||||
|
button_show: Mostra
|
||||||
|
|
||||||
status_active: actiu
|
status_active: actiu
|
||||||
status_registered: informat
|
status_registered: informat
|
||||||
status_locked: bloquejat
|
status_locked: bloquejat
|
||||||
|
|
||||||
|
version_status_open: oberta
|
||||||
|
version_status_locked: bloquejada
|
||||||
|
version_status_closed: tancada
|
||||||
|
|
||||||
|
field_active: Actiu
|
||||||
|
|
||||||
text_select_mail_notifications: "Seleccioneu les accions per les quals s'hauria d'enviar una notificació per correu electrònic."
|
text_select_mail_notifications: "Seleccioneu les accions per les quals s'hauria d'enviar una notificació per correu electrònic."
|
||||||
text_regexp_info: ex. ^[A-Z0-9]+$
|
text_regexp_info: ex. ^[A-Z0-9]+$
|
||||||
text_min_max_length_info: 0 significa sense restricció
|
text_min_max_length_info: 0 significa sense restricció
|
||||||
@@ -735,6 +838,10 @@ ca:
|
|||||||
text_subprojects_destroy_warning: "També seran suprimits els seus subprojectes: {{value}}."
|
text_subprojects_destroy_warning: "També seran suprimits els seus subprojectes: {{value}}."
|
||||||
text_workflow_edit: Seleccioneu un rol i un seguidor per a editar el flux de treball
|
text_workflow_edit: Seleccioneu un rol i un seguidor per a editar el flux de treball
|
||||||
text_are_you_sure: Segur?
|
text_are_you_sure: Segur?
|
||||||
|
text_journal_changed: "{{label}} ha canviat de {{old}} a {{new}}"
|
||||||
|
text_journal_set_to: "{{label}} s'ha establert a {{value}}"
|
||||||
|
text_journal_deleted: "{{label}} s'ha suprimit ({{old}})"
|
||||||
|
text_journal_added: "S'ha afegit {{label}} {{value}}"
|
||||||
text_tip_task_begin_day: "tasca que s'inicia aquest dia"
|
text_tip_task_begin_day: "tasca que s'inicia aquest dia"
|
||||||
text_tip_task_end_day: tasca que finalitza aquest dia
|
text_tip_task_end_day: tasca que finalitza aquest dia
|
||||||
text_tip_task_begin_end_day: "tasca que s'inicia i finalitza aquest dia"
|
text_tip_task_begin_end_day: "tasca que s'inicia i finalitza aquest dia"
|
||||||
@@ -745,6 +852,7 @@ ca:
|
|||||||
text_tracker_no_workflow: "No s'ha definit cap flux de treball per a aquest seguidor"
|
text_tracker_no_workflow: "No s'ha definit cap flux de treball per a aquest seguidor"
|
||||||
text_unallowed_characters: Caràcters no permesos
|
text_unallowed_characters: Caràcters no permesos
|
||||||
text_comma_separated: Es permeten valors múltiples (separats per una coma).
|
text_comma_separated: Es permeten valors múltiples (separats per una coma).
|
||||||
|
text_line_separated: "Es permeten diversos valors (una línia per cada valor)."
|
||||||
text_issues_ref_in_commit_messages: Referència i soluciona els assumptes en els missatges publicats
|
text_issues_ref_in_commit_messages: Referència i soluciona els assumptes en els missatges publicats
|
||||||
text_issue_added: "L'assumpte {{id}} ha sigut informat per {{author}}."
|
text_issue_added: "L'assumpte {{id}} ha sigut informat per {{author}}."
|
||||||
text_issue_updated: "L'assumpte {{id}} ha sigut actualitzat per {{author}}."
|
text_issue_updated: "L'assumpte {{id}} ha sigut actualitzat per {{author}}."
|
||||||
@@ -765,14 +873,21 @@ ca:
|
|||||||
text_destroy_time_entries_question: "S'han informat {{hours}} hores en els assumptes que aneu a suprimir. Què voleu fer?"
|
text_destroy_time_entries_question: "S'han informat {{hours}} hores en els assumptes que aneu a suprimir. Què voleu fer?"
|
||||||
text_destroy_time_entries: Suprimeix les hores informades
|
text_destroy_time_entries: Suprimeix les hores informades
|
||||||
text_assign_time_entries_to_project: Assigna les hores informades al projecte
|
text_assign_time_entries_to_project: Assigna les hores informades al projecte
|
||||||
text_reassign_time_entries: 'Torna a assignar les hores informades a aquest assumpte:'
|
text_reassign_time_entries: "Torna a assignar les hores informades a aquest assumpte:"
|
||||||
text_user_wrote: "{{value}} va escriure:"
|
text_user_wrote: "{{value}} va escriure:"
|
||||||
text_enumeration_destroy_question: "{{count}} objectes estan assignats a aquest valor."
|
text_enumeration_destroy_question: "{{count}} objectes estan assignats a aquest valor."
|
||||||
text_enumeration_category_reassign_to: 'Torna a assignar-los a aquest valor:'
|
text_enumeration_category_reassign_to: "Torna a assignar-los a aquest valor:"
|
||||||
text_email_delivery_not_configured: "El lliurament per correu electrònic no està configurat i les notificacions estan inhabilitades.\nConfigureu el servidor SMTP a config/email.yml i reinicieu l'aplicació per habilitar-lo."
|
text_email_delivery_not_configured: "El lliurament per correu electrònic no està configurat i les notificacions estan inhabilitades.\nConfigureu el servidor SMTP a config/email.yml i reinicieu l'aplicació per habilitar-lo."
|
||||||
text_repository_usernames_mapping: "Seleccioneu l'assignació entre els usuaris del Redmine i cada nom d'usuari trobat al dipòsit.\nEls usuaris amb el mateix nom d'usuari o correu del Redmine i del dipòsit s'assignaran automàticament."
|
text_repository_usernames_mapping: "Seleccioneu l'assignació entre els usuaris del Redmine i cada nom d'usuari trobat al dipòsit.\nEls usuaris amb el mateix nom d'usuari o correu del Redmine i del dipòsit s'assignaran automàticament."
|
||||||
text_diff_truncated: "... Aquestes diferències s'han trucat perquè excedeixen la mida màxima que es pot mostrar."
|
text_diff_truncated: "... Aquestes diferències s'han trucat perquè excedeixen la mida màxima que es pot mostrar."
|
||||||
text_custom_field_possible_values_info: 'Una línia per a cada valor'
|
text_custom_field_possible_values_info: "Una línia per a cada valor"
|
||||||
|
text_wiki_page_destroy_question: "Aquesta pàgina té {{descendants}} pàgines fill i descendents. Què voleu fer?"
|
||||||
|
text_wiki_page_nullify_children: "Deixa les pàgines fill com a pàgines arrel"
|
||||||
|
text_wiki_page_destroy_children: "Suprimeix les pàgines fill i tots els seus descendents"
|
||||||
|
text_wiki_page_reassign_children: "Reasigna les pàgines fill a aquesta pàgina pare"
|
||||||
|
text_own_membership_delete_confirmation: "Esteu a punt de suprimir algun o tots els vostres permisos i potser no podreu editar més aquest projecte.\nSegur que voleu continuar?"
|
||||||
|
text_zoom_in: Redueix
|
||||||
|
text_zoom_out: Amplia
|
||||||
|
|
||||||
default_role_manager: Gestor
|
default_role_manager: Gestor
|
||||||
default_role_developer: Desenvolupador
|
default_role_developer: Desenvolupador
|
||||||
@@ -799,105 +914,10 @@ ca:
|
|||||||
enumeration_issue_priorities: Prioritat dels assumptes
|
enumeration_issue_priorities: Prioritat dels assumptes
|
||||||
enumeration_doc_categories: Categories del document
|
enumeration_doc_categories: Categories del document
|
||||||
enumeration_activities: Activitats (seguidor de temps)
|
enumeration_activities: Activitats (seguidor de temps)
|
||||||
label_greater_or_equal: ">="
|
enumeration_system_activity: Activitat del sistema
|
||||||
label_less_or_equal: <=
|
field_member_of_group: Member of Group
|
||||||
text_wiki_page_destroy_question: This page has {{descendants}} child page(s) and descendant(s). What do you want to do?
|
field_assigned_to_role: Member of Role
|
||||||
text_wiki_page_reassign_children: Reassign child pages to this parent page
|
button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}"
|
||||||
text_wiki_page_nullify_children: Keep child pages as root pages
|
text_are_you_sure_with_children: Delete issue and all child issues?
|
||||||
text_wiki_page_destroy_children: Delete child pages and all their descendants
|
field_text: Text field
|
||||||
setting_password_min_length: Minimum password length
|
|
||||||
field_group_by: Group results by
|
|
||||||
mail_subject_wiki_content_updated: "'{{page}}' wiki page has been updated"
|
|
||||||
label_wiki_content_added: Wiki page added
|
|
||||||
mail_subject_wiki_content_added: "'{{page}}' wiki page has been added"
|
|
||||||
mail_body_wiki_content_added: The '{{page}}' wiki page has been added by {{author}}.
|
|
||||||
label_wiki_content_updated: Wiki page updated
|
|
||||||
mail_body_wiki_content_updated: The '{{page}}' wiki page has been updated by {{author}}.
|
|
||||||
permission_add_project: Create project
|
|
||||||
setting_new_project_user_role_id: Role given to a non-admin user who creates a project
|
|
||||||
label_view_all_revisions: View all revisions
|
|
||||||
label_tag: Tag
|
|
||||||
label_branch: Branch
|
|
||||||
error_no_tracker_in_project: No tracker is associated to this project. Please check the Project settings.
|
|
||||||
error_no_default_issue_status: No default issue status is defined. Please check your configuration (Go to "Administration -> Issue statuses").
|
|
||||||
text_journal_changed: "{{label}} changed from {{old}} to {{new}}"
|
|
||||||
text_journal_set_to: "{{label}} set to {{value}}"
|
|
||||||
text_journal_deleted: "{{label}} deleted ({{old}})"
|
|
||||||
label_group_plural: Groups
|
|
||||||
label_group: Group
|
|
||||||
label_group_new: New group
|
|
||||||
label_time_entry_plural: Spent time
|
|
||||||
text_journal_added: "{{label}} {{value}} added"
|
|
||||||
field_active: Active
|
|
||||||
enumeration_system_activity: System Activity
|
|
||||||
permission_delete_issue_watchers: Delete watchers
|
|
||||||
version_status_closed: closed
|
|
||||||
version_status_locked: locked
|
|
||||||
version_status_open: open
|
|
||||||
error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened
|
|
||||||
label_user_anonymous: Anonymous
|
|
||||||
button_move_and_follow: Move and follow
|
|
||||||
setting_default_projects_modules: Default enabled modules for new projects
|
|
||||||
setting_gravatar_default: Default Gravatar image
|
|
||||||
field_sharing: Sharing
|
|
||||||
label_version_sharing_hierarchy: With project hierarchy
|
|
||||||
label_version_sharing_system: With all projects
|
|
||||||
label_version_sharing_descendants: With subprojects
|
|
||||||
label_version_sharing_tree: With project tree
|
|
||||||
label_version_sharing_none: Not shared
|
|
||||||
error_can_not_archive_project: This project can not be archived
|
|
||||||
button_duplicate: Duplicate
|
|
||||||
button_copy_and_follow: Copy and follow
|
|
||||||
label_copy_source: Source
|
|
||||||
setting_issue_done_ratio: Calculate the issue done ratio with
|
|
||||||
setting_issue_done_ratio_issue_status: Use the issue status
|
|
||||||
error_issue_done_ratios_not_updated: Issue done ratios not updated.
|
|
||||||
error_workflow_copy_target: Please select target tracker(s) and role(s)
|
|
||||||
setting_issue_done_ratio_issue_field: Use the issue field
|
|
||||||
label_copy_same_as_target: Same as target
|
|
||||||
label_copy_target: Target
|
|
||||||
notice_issue_done_ratios_updated: Issue done ratios updated.
|
|
||||||
error_workflow_copy_source: Please select a source tracker or role
|
|
||||||
label_update_issue_done_ratios: Update issue done ratios
|
|
||||||
setting_start_of_week: Start calendars on
|
|
||||||
permission_view_issues: View Issues
|
|
||||||
label_display_used_statuses_only: Only display statuses that are used by this tracker
|
|
||||||
label_revision_id: Revision {{value}}
|
|
||||||
label_api_access_key: API access key
|
|
||||||
label_api_access_key_created_on: API access key created {{value}} ago
|
|
||||||
label_feeds_access_key: RSS access key
|
|
||||||
notice_api_access_key_reseted: Your API access key was reset.
|
|
||||||
setting_rest_api_enabled: Enable REST web service
|
|
||||||
label_missing_api_access_key: Missing an API access key
|
|
||||||
label_missing_feeds_access_key: Missing a RSS access key
|
|
||||||
button_show: Show
|
|
||||||
text_line_separated: Multiple values allowed (one line for each value).
|
|
||||||
setting_mail_handler_body_delimiters: Truncate emails after one of these lines
|
|
||||||
permission_add_subprojects: Create subprojects
|
|
||||||
label_subproject_new: New subproject
|
|
||||||
text_own_membership_delete_confirmation: |-
|
|
||||||
You are about to remove some or all of your permissions and may no longer be able to edit this project after that.
|
|
||||||
Are you sure you want to continue?
|
|
||||||
label_close_versions: Close completed versions
|
|
||||||
label_board_sticky: Sticky
|
|
||||||
label_board_locked: Locked
|
|
||||||
permission_export_wiki_pages: Export wiki pages
|
|
||||||
setting_cache_formatted_text: Cache formatted text
|
|
||||||
permission_manage_project_activities: Manage project activities
|
|
||||||
error_unable_delete_issue_status: Unable to delete issue status
|
|
||||||
label_profile: Profile
|
|
||||||
permission_manage_subtasks: Manage subtasks
|
|
||||||
field_parent_issue: Parent task
|
|
||||||
label_subtask_plural: Subtasks
|
|
||||||
label_project_copy_notifications: Send email notifications during the project copy
|
|
||||||
error_can_not_delete_custom_field: Unable to delete custom field
|
|
||||||
error_unable_to_connect: Unable to connect ({{value}})
|
|
||||||
error_can_not_remove_role: This role is in use and can not be deleted.
|
|
||||||
error_can_not_delete_tracker: This tracker contains issues and can't be deleted.
|
|
||||||
field_principal: Principal
|
|
||||||
label_my_page_block: My page block
|
|
||||||
notice_failed_to_save_members: "Failed to save member(s): {{errors}}."
|
|
||||||
text_zoom_out: Zoom out
|
|
||||||
text_zoom_in: Zoom in
|
|
||||||
notice_unable_delete_time_entry: Unable to delete time log entry.
|
|
||||||
label_overall_spent_time: Overall spent time
|
|
||||||
|
|||||||
+179
-165
@@ -1,4 +1,5 @@
|
|||||||
cs:
|
cs:
|
||||||
|
direction: ltr
|
||||||
date:
|
date:
|
||||||
formats:
|
formats:
|
||||||
# Use the strftime parameters for formats.
|
# Use the strftime parameters for formats.
|
||||||
@@ -23,8 +24,8 @@ cs:
|
|||||||
time: "%H:%M"
|
time: "%H:%M"
|
||||||
short: "%d %b %H:%M"
|
short: "%d %b %H:%M"
|
||||||
long: "%B %d, %Y %H:%M"
|
long: "%B %d, %Y %H:%M"
|
||||||
am: "am"
|
am: "dop."
|
||||||
pm: "pm"
|
pm: "odp."
|
||||||
|
|
||||||
datetime:
|
datetime:
|
||||||
distance_in_words:
|
distance_in_words:
|
||||||
@@ -60,10 +61,14 @@ cs:
|
|||||||
one: "více než 1 rok"
|
one: "více než 1 rok"
|
||||||
other: "více než {{count}} roky"
|
other: "více než {{count}} roky"
|
||||||
almost_x_years:
|
almost_x_years:
|
||||||
one: "almost 1 year"
|
one: "témeř 1 rok"
|
||||||
other: "almost {{count}} years"
|
other: "téměř {{count}} roky"
|
||||||
|
|
||||||
number:
|
number:
|
||||||
|
format:
|
||||||
|
separator: "."
|
||||||
|
delimiter: ""
|
||||||
|
precision: 3
|
||||||
human:
|
human:
|
||||||
format:
|
format:
|
||||||
precision: 1
|
precision: 1
|
||||||
@@ -111,6 +116,7 @@ cs:
|
|||||||
greater_than_start_date: "musí být větší než počáteční datum"
|
greater_than_start_date: "musí být větší než počáteční datum"
|
||||||
not_same_project: "nepatří stejnému projektu"
|
not_same_project: "nepatří stejnému projektu"
|
||||||
circular_dependency: "Tento vztah by vytvořil cyklickou závislost"
|
circular_dependency: "Tento vztah by vytvořil cyklickou závislost"
|
||||||
|
cant_link_an_issue_with_a_descendant: "Úkol nemůže být spojen s jedním z jeho dílčích úkolů"
|
||||||
|
|
||||||
# Updated by Josef Liška <jl@chl.cz>
|
# Updated by Josef Liška <jl@chl.cz>
|
||||||
# CZ translation by Maxim Krušina | Massimo Filippi, s.r.o. | maxim@mxm.cz
|
# CZ translation by Maxim Krušina | Massimo Filippi, s.r.o. | maxim@mxm.cz
|
||||||
@@ -144,19 +150,19 @@ cs:
|
|||||||
notice_successful_connection: Úspěšné připojení.
|
notice_successful_connection: Úspěšné připojení.
|
||||||
notice_file_not_found: Stránka na kterou se snažíte zobrazit neexistuje nebo byla smazána.
|
notice_file_not_found: Stránka na kterou se snažíte zobrazit neexistuje nebo byla smazána.
|
||||||
notice_locking_conflict: Údaje byly změněny jiným uživatelem.
|
notice_locking_conflict: Údaje byly změněny jiným uživatelem.
|
||||||
notice_scm_error: Entry and/or revision doesn't exist in the repository.
|
notice_scm_error: Záznam a/nebo revize neexistuje v repozitáři.
|
||||||
notice_not_authorized: Nemáte dostatečná práva pro zobrazení této stránky.
|
notice_not_authorized: Nemáte dostatečná práva pro zobrazení této stránky.
|
||||||
notice_email_sent: "Na adresu {{value}} byl odeslán email"
|
notice_email_sent: "Na adresu {{value}} byl odeslán email"
|
||||||
notice_email_error: "Při odesílání emailu nastala chyba ({{value}})"
|
notice_email_error: "Při odesílání emailu nastala chyba ({{value}})"
|
||||||
notice_feeds_access_key_reseted: Váš klíč pro přístup k RSS byl resetován.
|
notice_feeds_access_key_reseted: Váš klíč pro přístup k RSS byl resetován.
|
||||||
notice_failed_to_save_issues: "Failed to save {{count}} issue(s) on {{total}} selected: {{ids}}."
|
notice_failed_to_save_issues: "Chyba při uložení {{count}} úkolu(ů) z {{total}} vybraných: {{ids}}."
|
||||||
notice_no_issue_selected: "Nebyl zvolen žádný úkol. Prosím, zvolte úkoly, které chcete editovat"
|
notice_no_issue_selected: "Nebyl zvolen žádný úkol. Prosím, zvolte úkoly, které chcete editovat"
|
||||||
notice_account_pending: "Váš účet byl vytvořen, nyní čeká na schválení administrátorem."
|
notice_account_pending: "Váš účet byl vytvořen, nyní čeká na schválení administrátorem."
|
||||||
notice_default_data_loaded: Výchozí konfigurace úspěšně nahrána.
|
notice_default_data_loaded: Výchozí konfigurace úspěšně nahrána.
|
||||||
|
|
||||||
error_can_t_load_default_data: "Výchozí konfigurace nebyla nahrána: {{value}}"
|
error_can_t_load_default_data: "Výchozí konfigurace nebyla nahrána: {{value}}"
|
||||||
error_scm_not_found: "Položka a/nebo revize neexistují v repository."
|
error_scm_not_found: "Položka a/nebo revize neexistují v repozitáři."
|
||||||
error_scm_command_failed: "Při pokusu o přístup k repository došlo k chybě: {{value}}"
|
error_scm_command_failed: "Při pokusu o přístup k repozitáři došlo k chybě: {{value}}"
|
||||||
error_issue_not_found_in_project: 'Úkol nebyl nalezen nebo nepatří k tomuto projektu'
|
error_issue_not_found_in_project: 'Úkol nebyl nalezen nebo nepatří k tomuto projektu'
|
||||||
|
|
||||||
mail_subject_lost_password: "Vaše heslo ({{value}})"
|
mail_subject_lost_password: "Vaše heslo ({{value}})"
|
||||||
@@ -204,10 +210,10 @@ cs:
|
|||||||
field_due_date: Uzavřít do
|
field_due_date: Uzavřít do
|
||||||
field_assigned_to: Přiřazeno
|
field_assigned_to: Přiřazeno
|
||||||
field_priority: Priorita
|
field_priority: Priorita
|
||||||
field_fixed_version: Přiřazeno k verzi
|
field_fixed_version: Cílová verze
|
||||||
field_user: Uživatel
|
field_user: Uživatel
|
||||||
field_role: Role
|
field_role: Role
|
||||||
field_homepage: Homepage
|
field_homepage: Domovská stránka
|
||||||
field_is_public: Veřejný
|
field_is_public: Veřejný
|
||||||
field_parent: Nadřazený projekt
|
field_parent: Nadřazený projekt
|
||||||
field_is_in_roadmap: Úkoly zobrazené v plánu
|
field_is_in_roadmap: Úkoly zobrazené v plánu
|
||||||
@@ -259,18 +265,18 @@ cs:
|
|||||||
setting_app_subtitle: Podtitulek aplikace
|
setting_app_subtitle: Podtitulek aplikace
|
||||||
setting_welcome_text: Uvítací text
|
setting_welcome_text: Uvítací text
|
||||||
setting_default_language: Výchozí jazyk
|
setting_default_language: Výchozí jazyk
|
||||||
setting_login_required: Auten. vyžadována
|
setting_login_required: Autentifikace vyžadována
|
||||||
setting_self_registration: Povolena automatická registrace
|
setting_self_registration: Povolena automatická registrace
|
||||||
setting_attachment_max_size: Maximální velikost přílohy
|
setting_attachment_max_size: Maximální velikost přílohy
|
||||||
setting_issues_export_limit: Limit pro export úkolů
|
setting_issues_export_limit: Limit pro export úkolů
|
||||||
setting_mail_from: Odesílat emaily z adresy
|
setting_mail_from: Odesílat emaily z adresy
|
||||||
setting_bcc_recipients: Příjemci skryté kopie (bcc)
|
setting_bcc_recipients: Příjemci skryté kopie (bcc)
|
||||||
setting_host_name: Host name
|
setting_host_name: Jméno serveru
|
||||||
setting_text_formatting: Formátování textu
|
setting_text_formatting: Formátování textu
|
||||||
setting_wiki_compression: Komperese historie Wiki
|
setting_wiki_compression: Komprese historie Wiki
|
||||||
setting_feeds_limit: Feed content limit
|
setting_feeds_limit: Limit obsahu příspěvků
|
||||||
setting_default_projects_public: Nové projekty nastavovat jako veřejné
|
setting_default_projects_public: Nové projekty nastavovat jako veřejné
|
||||||
setting_autofetch_changesets: Autofetch commits
|
setting_autofetch_changesets: Automaticky stahovat commity
|
||||||
setting_sys_api_enabled: Povolit WS pro správu repozitory
|
setting_sys_api_enabled: Povolit WS pro správu repozitory
|
||||||
setting_commit_ref_keywords: Klíčová slova pro odkazy
|
setting_commit_ref_keywords: Klíčová slova pro odkazy
|
||||||
setting_commit_fix_keywords: Klíčová slova pro uzavření
|
setting_commit_fix_keywords: Klíčová slova pro uzavření
|
||||||
@@ -284,8 +290,8 @@ cs:
|
|||||||
setting_protocol: Protokol
|
setting_protocol: Protokol
|
||||||
setting_per_page_options: Povolené počty řádků na stránce
|
setting_per_page_options: Povolené počty řádků na stránce
|
||||||
setting_user_format: Formát zobrazení uživatele
|
setting_user_format: Formát zobrazení uživatele
|
||||||
setting_activity_days_default: Days displayed on project activity
|
setting_activity_days_default: Dny zobrazené v činnosti projektu
|
||||||
setting_display_subprojects_issues: Display subprojects issues on main projects by default
|
setting_display_subprojects_issues: Automaticky zobrazit úkoly podprojektu v hlavním projektu
|
||||||
|
|
||||||
project_module_issue_tracking: Sledování úkolů
|
project_module_issue_tracking: Sledování úkolů
|
||||||
project_module_time_tracking: Sledování času
|
project_module_time_tracking: Sledování času
|
||||||
@@ -293,7 +299,7 @@ cs:
|
|||||||
project_module_documents: Dokumenty
|
project_module_documents: Dokumenty
|
||||||
project_module_files: Soubory
|
project_module_files: Soubory
|
||||||
project_module_wiki: Wiki
|
project_module_wiki: Wiki
|
||||||
project_module_repository: Repository
|
project_module_repository: Repozitář
|
||||||
project_module_boards: Diskuse
|
project_module_boards: Diskuse
|
||||||
|
|
||||||
label_user: Uživatel
|
label_user: Uživatel
|
||||||
@@ -303,16 +309,16 @@ cs:
|
|||||||
label_project_new: Nový projekt
|
label_project_new: Nový projekt
|
||||||
label_project_plural: Projekty
|
label_project_plural: Projekty
|
||||||
label_x_projects:
|
label_x_projects:
|
||||||
zero: no projects
|
zero: žádné projekty
|
||||||
one: 1 project
|
one: 1 projekt
|
||||||
other: "{{count}} projects"
|
other: "{{count}} projekty(ů)"
|
||||||
label_project_all: Všechny projekty
|
label_project_all: Všechny projekty
|
||||||
label_project_latest: Poslední projekty
|
label_project_latest: Poslední projekty
|
||||||
label_issue: Úkol
|
label_issue: Úkol
|
||||||
label_issue_new: Nový úkol
|
label_issue_new: Nový úkol
|
||||||
label_issue_plural: Úkoly
|
label_issue_plural: Úkoly
|
||||||
label_issue_view_all: Všechny úkoly
|
label_issue_view_all: Všechny úkoly
|
||||||
label_issues_by: "Úkoly od uživatele {{value}}"
|
label_issues_by: "Úkoly podle {{value}}"
|
||||||
label_issue_added: Úkol přidán
|
label_issue_added: Úkol přidán
|
||||||
label_issue_updated: Úkol aktualizován
|
label_issue_updated: Úkol aktualizován
|
||||||
label_document: Dokument
|
label_document: Dokument
|
||||||
@@ -329,7 +335,7 @@ cs:
|
|||||||
label_tracker: Fronta
|
label_tracker: Fronta
|
||||||
label_tracker_plural: Fronty
|
label_tracker_plural: Fronty
|
||||||
label_tracker_new: Nová fronta
|
label_tracker_new: Nová fronta
|
||||||
label_workflow: Workflow
|
label_workflow: Průběh práce
|
||||||
label_issue_status: Stav úkolu
|
label_issue_status: Stav úkolu
|
||||||
label_issue_status_plural: Stavy úkolů
|
label_issue_status_plural: Stavy úkolů
|
||||||
label_issue_status_new: Nový stav
|
label_issue_status_new: Nový stav
|
||||||
@@ -372,14 +378,14 @@ cs:
|
|||||||
label_list: Seznam
|
label_list: Seznam
|
||||||
label_date: Datum
|
label_date: Datum
|
||||||
label_integer: Celé číslo
|
label_integer: Celé číslo
|
||||||
label_float: Desetiné číslo
|
label_float: Desetinné číslo
|
||||||
label_boolean: Ano/Ne
|
label_boolean: Ano/Ne
|
||||||
label_string: Text
|
label_string: Text
|
||||||
label_text: Dlouhý text
|
label_text: Dlouhý text
|
||||||
label_attribute: Atribut
|
label_attribute: Atribut
|
||||||
label_attribute_plural: Atributy
|
label_attribute_plural: Atributy
|
||||||
label_download: "{{count}} Download"
|
label_download: "{{count}} stažení"
|
||||||
label_download_plural: "{{count}} Downloads"
|
label_download_plural: "{{count}} stažení"
|
||||||
label_no_data: Žádné položky
|
label_no_data: Žádné položky
|
||||||
label_change_status: Změnit stav
|
label_change_status: Změnit stav
|
||||||
label_history: Historie
|
label_history: Historie
|
||||||
@@ -388,7 +394,7 @@ cs:
|
|||||||
label_attachment_delete: Odstranit soubor
|
label_attachment_delete: Odstranit soubor
|
||||||
label_attachment_plural: Soubory
|
label_attachment_plural: Soubory
|
||||||
label_file_added: Soubor přidán
|
label_file_added: Soubor přidán
|
||||||
label_report: Přeheled
|
label_report: Přehled
|
||||||
label_report_plural: Přehledy
|
label_report_plural: Přehledy
|
||||||
label_news: Novinky
|
label_news: Novinky
|
||||||
label_news_new: Přidat novinku
|
label_news_new: Přidat novinku
|
||||||
@@ -410,17 +416,17 @@ cs:
|
|||||||
label_closed_issues: uzavřený
|
label_closed_issues: uzavřený
|
||||||
label_closed_issues_plural: uzavřené
|
label_closed_issues_plural: uzavřené
|
||||||
label_x_open_issues_abbr_on_total:
|
label_x_open_issues_abbr_on_total:
|
||||||
zero: 0 open / {{total}}
|
zero: 0 otevřených / {{total}}
|
||||||
one: 1 open / {{total}}
|
one: 1 otevřený / {{total}}
|
||||||
other: "{{count}} open / {{total}}"
|
other: "{{count}} otevřených / {{total}}"
|
||||||
label_x_open_issues_abbr:
|
label_x_open_issues_abbr:
|
||||||
zero: 0 open
|
zero: 0 otevřených
|
||||||
one: 1 open
|
one: 1 otevřený
|
||||||
other: "{{count}} open"
|
other: "{{count}} otevřených"
|
||||||
label_x_closed_issues_abbr:
|
label_x_closed_issues_abbr:
|
||||||
zero: 0 closed
|
zero: 0 uzavřených
|
||||||
one: 1 closed
|
one: 1 uzavřený
|
||||||
other: "{{count}} closed"
|
other: "{{count}} uzavřených"
|
||||||
label_total: Celkem
|
label_total: Celkem
|
||||||
label_permissions: Práva
|
label_permissions: Práva
|
||||||
label_current_status: Aktuální stav
|
label_current_status: Aktuální stav
|
||||||
@@ -444,9 +450,9 @@ cs:
|
|||||||
label_comment: Komentář
|
label_comment: Komentář
|
||||||
label_comment_plural: Komentáře
|
label_comment_plural: Komentáře
|
||||||
label_x_comments:
|
label_x_comments:
|
||||||
zero: no comments
|
zero: žádné komentáře
|
||||||
one: 1 comment
|
one: 1 komentář
|
||||||
other: "{{count}} comments"
|
other: "{{count}} komentářů"
|
||||||
label_comment_add: Přidat komentáře
|
label_comment_add: Přidat komentáře
|
||||||
label_comment_added: Komentář přidán
|
label_comment_added: Komentář přidán
|
||||||
label_comment_delete: Odstranit komentář
|
label_comment_delete: Odstranit komentář
|
||||||
@@ -476,8 +482,8 @@ cs:
|
|||||||
label_contains: obsahuje
|
label_contains: obsahuje
|
||||||
label_not_contains: neobsahuje
|
label_not_contains: neobsahuje
|
||||||
label_day_plural: dny
|
label_day_plural: dny
|
||||||
label_repository: Repository
|
label_repository: Repozitář
|
||||||
label_repository_plural: Repository
|
label_repository_plural: Repozitáře
|
||||||
label_browse: Procházet
|
label_browse: Procházet
|
||||||
label_modification: "{{count}} změna"
|
label_modification: "{{count}} změna"
|
||||||
label_modification_plural: "{{count}} změn"
|
label_modification_plural: "{{count}} změn"
|
||||||
@@ -526,7 +532,7 @@ cs:
|
|||||||
label_diff_inline: uvnitř
|
label_diff_inline: uvnitř
|
||||||
label_diff_side_by_side: vedle sebe
|
label_diff_side_by_side: vedle sebe
|
||||||
label_options: Nastavení
|
label_options: Nastavení
|
||||||
label_copy_workflow_from: Kopírovat workflow z
|
label_copy_workflow_from: Kopírovat průběh práce z
|
||||||
label_permissions_report: Přehled práv
|
label_permissions_report: Přehled práv
|
||||||
label_watched_issues: Sledované úkoly
|
label_watched_issues: Sledované úkoly
|
||||||
label_related_issues: Související úkoly
|
label_related_issues: Související úkoly
|
||||||
@@ -547,7 +553,7 @@ cs:
|
|||||||
label_stay_logged_in: Zůstat přihlášený
|
label_stay_logged_in: Zůstat přihlášený
|
||||||
label_disabled: zakázán
|
label_disabled: zakázán
|
||||||
label_show_completed_versions: Ukázat dokončené verze
|
label_show_completed_versions: Ukázat dokončené verze
|
||||||
label_me: mě
|
label_me: já
|
||||||
label_board: Fórum
|
label_board: Fórum
|
||||||
label_board_new: Nové fórum
|
label_board_new: Nové fórum
|
||||||
label_board_plural: Fóra
|
label_board_plural: Fóra
|
||||||
@@ -570,12 +576,12 @@ cs:
|
|||||||
label_module_plural: Moduly
|
label_module_plural: Moduly
|
||||||
label_added_time_by: "Přidáno uživatelem {{author}} před {{age}}"
|
label_added_time_by: "Přidáno uživatelem {{author}} před {{age}}"
|
||||||
label_updated_time: "Aktualizováno před {{value}}"
|
label_updated_time: "Aktualizováno před {{value}}"
|
||||||
label_jump_to_a_project: Zvolit projekt...
|
label_jump_to_a_project: Vyberte projekt...
|
||||||
label_file_plural: Soubory
|
label_file_plural: Soubory
|
||||||
label_changeset_plural: Changesety
|
label_changeset_plural: Changesety
|
||||||
label_default_columns: Výchozí sloupce
|
label_default_columns: Výchozí sloupce
|
||||||
label_no_change_option: (beze změny)
|
label_no_change_option: (beze změny)
|
||||||
label_bulk_edit_selected_issues: Bulk edit selected issues
|
label_bulk_edit_selected_issues: Hromadná úprava vybraných úkolů
|
||||||
label_theme: Téma
|
label_theme: Téma
|
||||||
label_default: Výchozí
|
label_default: Výchozí
|
||||||
label_search_titles_only: Vyhledávat pouze v názvech
|
label_search_titles_only: Vyhledávat pouze v názvech
|
||||||
@@ -594,7 +600,7 @@ cs:
|
|||||||
label_scm: SCM
|
label_scm: SCM
|
||||||
label_plugins: Doplňky
|
label_plugins: Doplňky
|
||||||
label_ldap_authentication: Autentifikace LDAP
|
label_ldap_authentication: Autentifikace LDAP
|
||||||
label_downloads_abbr: D/L
|
label_downloads_abbr: Staž.
|
||||||
label_optional_description: Volitelný popis
|
label_optional_description: Volitelný popis
|
||||||
label_add_another_file: Přidat další soubor
|
label_add_another_file: Přidat další soubor
|
||||||
label_preferences: Nastavení
|
label_preferences: Nastavení
|
||||||
@@ -647,7 +653,7 @@ cs:
|
|||||||
text_regexp_info: např. ^[A-Z0-9]+$
|
text_regexp_info: např. ^[A-Z0-9]+$
|
||||||
text_min_max_length_info: 0 znamená bez limitu
|
text_min_max_length_info: 0 znamená bez limitu
|
||||||
text_project_destroy_confirmation: Jste si jisti, že chcete odstranit tento projekt a všechna související data ?
|
text_project_destroy_confirmation: Jste si jisti, že chcete odstranit tento projekt a všechna související data ?
|
||||||
text_workflow_edit: Vyberte roli a frontu k editaci workflow
|
text_workflow_edit: Vyberte roli a frontu k editaci průběhu práce
|
||||||
text_are_you_sure: Jste si jisti?
|
text_are_you_sure: Jste si jisti?
|
||||||
text_tip_task_begin_day: úkol začíná v tento den
|
text_tip_task_begin_day: úkol začíná v tento den
|
||||||
text_tip_task_end_day: úkol končí v tento den
|
text_tip_task_end_day: úkol končí v tento den
|
||||||
@@ -656,24 +662,24 @@ cs:
|
|||||||
text_caracters_maximum: "{{count}} znaků maximálně."
|
text_caracters_maximum: "{{count}} znaků maximálně."
|
||||||
text_caracters_minimum: "Musí být alespoň {{count}} znaků dlouhé."
|
text_caracters_minimum: "Musí být alespoň {{count}} znaků dlouhé."
|
||||||
text_length_between: "Délka mezi {{min}} a {{max}} znaky."
|
text_length_between: "Délka mezi {{min}} a {{max}} znaky."
|
||||||
text_tracker_no_workflow: Pro tuto frontu není definován žádný workflow
|
text_tracker_no_workflow: Pro tuto frontu není definován žádný průběh práce
|
||||||
text_unallowed_characters: Nepovolené znaky
|
text_unallowed_characters: Nepovolené znaky
|
||||||
text_comma_separated: Povoleno více hodnot (oddělěné čárkou).
|
text_comma_separated: Povoleno více hodnot (oddělěné čárkou).
|
||||||
text_issues_ref_in_commit_messages: Referencing and fixing issues in commit messages
|
text_issues_ref_in_commit_messages: Odkazování a opravování úkolů ve zprávách commitů
|
||||||
text_issue_added: "Úkol {{id}} byl vytvořen uživatelem {{author}}."
|
text_issue_added: "Úkol {{id}} byl vytvořen uživatelem {{author}}."
|
||||||
text_issue_updated: "Úkol {{id}} byl aktualizován uživatelem {{author}}."
|
text_issue_updated: "Úkol {{id}} byl aktualizován uživatelem {{author}}."
|
||||||
text_wiki_destroy_confirmation: Opravdu si přejete odstranit tuto WIKI a celý její obsah?
|
text_wiki_destroy_confirmation: Opravdu si přejete odstranit tuto Wiki a celý její obsah?
|
||||||
text_issue_category_destroy_question: "Některé úkoly ({{count}}) jsou přiřazeny k této kategorii. Co s nimi chtete udělat?"
|
text_issue_category_destroy_question: "Některé úkoly ({{count}}) jsou přiřazeny k této kategorii. Co s nimi chtete udělat?"
|
||||||
text_issue_category_destroy_assignments: Zrušit přiřazení ke kategorii
|
text_issue_category_destroy_assignments: Zrušit přiřazení ke kategorii
|
||||||
text_issue_category_reassign_to: Přiřadit úkoly do této kategorie
|
text_issue_category_reassign_to: Přiřadit úkoly do této kategorie
|
||||||
text_user_mail_option: "U projektů, které nebyly vybrány, budete dostávat oznámení pouze o vašich či o sledovaných položkách (např. o položkách jejichž jste autor nebo ke kterým jste přiřazen(a))."
|
text_user_mail_option: "U projektů, které nebyly vybrány, budete dostávat oznámení pouze o vašich či o sledovaných položkách (např. o položkách jejichž jste autor nebo ke kterým jste přiřazen(a))."
|
||||||
text_no_configuration_data: "Role, fronty, stavy úkolů ani workflow nebyly zatím nakonfigurovány.\nVelice doporučujeme nahrát výchozí konfiguraci.Po té si můžete vše upravit"
|
text_no_configuration_data: "Role, fronty, stavy úkolů ani průběh práce nebyly zatím nakonfigurovány.\nVelice doporučujeme nahrát výchozí konfiguraci. Po té si můžete vše upravit"
|
||||||
text_load_default_configuration: Nahrát výchozí konfiguraci
|
text_load_default_configuration: Nahrát výchozí konfiguraci
|
||||||
text_status_changed_by_changeset: "Použito v changesetu {{value}}."
|
text_status_changed_by_changeset: "Použito v changesetu {{value}}."
|
||||||
text_issues_destroy_confirmation: 'Opravdu si přejete odstranit všechny zvolené úkoly?'
|
text_issues_destroy_confirmation: 'Opravdu si přejete odstranit všechny zvolené úkoly?'
|
||||||
text_select_project_modules: 'Aktivní moduly v tomto projektu:'
|
text_select_project_modules: 'Aktivní moduly v tomto projektu:'
|
||||||
text_default_administrator_account_changed: Výchozí nastavení administrátorského účtu změněno
|
text_default_administrator_account_changed: Výchozí nastavení administrátorského účtu změněno
|
||||||
text_file_repository_writable: Povolen zápis do repository
|
text_file_repository_writable: Povolen zápis do adresáře ukládání souborů
|
||||||
text_rmagick_available: RMagick k dispozici (volitelné)
|
text_rmagick_available: RMagick k dispozici (volitelné)
|
||||||
text_destroy_time_entries_question: "U úkolů, které chcete odstranit je evidováno {{hours}} práce. Co chete udělat?"
|
text_destroy_time_entries_question: "U úkolů, které chcete odstranit je evidováno {{hours}} práce. Co chete udělat?"
|
||||||
text_destroy_time_entries: Odstranit evidované hodiny.
|
text_destroy_time_entries: Odstranit evidované hodiny.
|
||||||
@@ -687,7 +693,7 @@ cs:
|
|||||||
default_tracker_feature: Požadavek
|
default_tracker_feature: Požadavek
|
||||||
default_tracker_support: Podpora
|
default_tracker_support: Podpora
|
||||||
default_issue_status_new: Nový
|
default_issue_status_new: Nový
|
||||||
default_issue_status_in_progress: In Progress
|
default_issue_status_in_progress: Ve vývoji
|
||||||
default_issue_status_resolved: Vyřešený
|
default_issue_status_resolved: Vyřešený
|
||||||
default_issue_status_feedback: Čeká se
|
default_issue_status_feedback: Čeká se
|
||||||
default_issue_status_closed: Uzavřený
|
default_issue_status_closed: Uzavřený
|
||||||
@@ -699,7 +705,7 @@ cs:
|
|||||||
default_priority_high: Vysoká
|
default_priority_high: Vysoká
|
||||||
default_priority_urgent: Urgentní
|
default_priority_urgent: Urgentní
|
||||||
default_priority_immediate: Okamžitá
|
default_priority_immediate: Okamžitá
|
||||||
default_activity_design: Design
|
default_activity_design: Návhr
|
||||||
default_activity_development: Vývoj
|
default_activity_development: Vývoj
|
||||||
|
|
||||||
enumeration_issue_priorities: Priority úkolů
|
enumeration_issue_priorities: Priority úkolů
|
||||||
@@ -710,10 +716,10 @@ cs:
|
|||||||
text_subprojects_destroy_warning: "Jeho podprojek(y): {{value}} budou také smazány."
|
text_subprojects_destroy_warning: "Jeho podprojek(y): {{value}} budou také smazány."
|
||||||
label_and_its_subprojects: "{{value}} a jeho podprojekty"
|
label_and_its_subprojects: "{{value}} a jeho podprojekty"
|
||||||
mail_body_reminder: "{{count}} úkol(ů), které máte přiřazeny má termín během několik dní ({{days}}):"
|
mail_body_reminder: "{{count}} úkol(ů), které máte přiřazeny má termín během několik dní ({{days}}):"
|
||||||
mail_subject_reminder: "{{count}} úkol(ů) má termín během několik dní"
|
mail_subject_reminder: "{{count}} úkol(ů) má termín během několik dní ({{days}})"
|
||||||
text_user_wrote: "{{value}} napsal:"
|
text_user_wrote: "{{value}} napsal:"
|
||||||
label_duplicated_by: duplicated by
|
label_duplicated_by: duplikováno od
|
||||||
setting_enabled_scm: Povoleno SCM
|
setting_enabled_scm: Povolené SCM
|
||||||
text_enumeration_category_reassign_to: 'Přeřadit je do této:'
|
text_enumeration_category_reassign_to: 'Přeřadit je do této:'
|
||||||
text_enumeration_destroy_question: "Několik ({{count}}) objektů je přiřazeno k této hodnotě."
|
text_enumeration_destroy_question: "Několik ({{count}}) objektů je přiřazeno k této hodnotě."
|
||||||
label_incoming_emails: Příchozí e-maily
|
label_incoming_emails: Příchozí e-maily
|
||||||
@@ -739,22 +745,22 @@ cs:
|
|||||||
permission_view_changesets: Zobrazování sady změn
|
permission_view_changesets: Zobrazování sady změn
|
||||||
permission_view_time_entries: Zobrazení stráveného času
|
permission_view_time_entries: Zobrazení stráveného času
|
||||||
permission_manage_versions: Spravování verzí
|
permission_manage_versions: Spravování verzí
|
||||||
permission_manage_wiki: Spravování wiki
|
permission_manage_wiki: Spravování Wiki
|
||||||
permission_manage_categories: Spravování kategorií úkolů
|
permission_manage_categories: Spravování kategorií úkolů
|
||||||
permission_protect_wiki_pages: Zabezpečení wiki stránek
|
permission_protect_wiki_pages: Zabezpečení Wiki stránek
|
||||||
permission_comment_news: Komentování novinek
|
permission_comment_news: Komentování novinek
|
||||||
permission_delete_messages: Mazání zpráv
|
permission_delete_messages: Mazání zpráv
|
||||||
permission_select_project_modules: Výběr modulů projektu
|
permission_select_project_modules: Výběr modulů projektu
|
||||||
permission_manage_documents: Správa dokumentů
|
permission_manage_documents: Správa dokumentů
|
||||||
permission_edit_wiki_pages: Upravování stránek wiki
|
permission_edit_wiki_pages: Upravování stránek Wiki
|
||||||
permission_add_issue_watchers: Přidání sledujících uživatelů
|
permission_add_issue_watchers: Přidání sledujících uživatelů
|
||||||
permission_view_gantt: Zobrazené Ganttova diagramu
|
permission_view_gantt: Zobrazené Ganttova diagramu
|
||||||
permission_move_issues: Přesouvání úkolů
|
permission_move_issues: Přesouvání úkolů
|
||||||
permission_manage_issue_relations: Spravování vztahů mezi úkoly
|
permission_manage_issue_relations: Spravování vztahů mezi úkoly
|
||||||
permission_delete_wiki_pages: Mazání stránek na wiki
|
permission_delete_wiki_pages: Mazání stránek na Wiki
|
||||||
permission_manage_boards: Správa diskusních fór
|
permission_manage_boards: Správa diskusních fór
|
||||||
permission_delete_wiki_pages_attachments: Mazání příloh
|
permission_delete_wiki_pages_attachments: Mazání příloh
|
||||||
permission_view_wiki_edits: Prohlížení historie wiki
|
permission_view_wiki_edits: Prohlížení historie Wiki
|
||||||
permission_add_messages: Posílání zpráv
|
permission_add_messages: Posílání zpráv
|
||||||
permission_view_messages: Prohlížení zpráv
|
permission_view_messages: Prohlížení zpráv
|
||||||
permission_manage_files: Spravování souborů
|
permission_manage_files: Spravování souborů
|
||||||
@@ -766,26 +772,26 @@ cs:
|
|||||||
permission_delete_issues: Mazání úkolů
|
permission_delete_issues: Mazání úkolů
|
||||||
permission_view_issue_watchers: Zobrazení seznamu sledujícíh uživatelů
|
permission_view_issue_watchers: Zobrazení seznamu sledujícíh uživatelů
|
||||||
permission_manage_repository: Spravování repozitáře
|
permission_manage_repository: Spravování repozitáře
|
||||||
permission_commit_access: Commit access
|
permission_commit_access: Commit přístup
|
||||||
permission_browse_repository: Procházení repozitáře
|
permission_browse_repository: Procházení repozitáře
|
||||||
permission_view_documents: Prohlížení dokumentů
|
permission_view_documents: Prohlížení dokumentů
|
||||||
permission_edit_project: Úprava projektů
|
permission_edit_project: Úprava projektů
|
||||||
permission_add_issue_notes: Přidávání poznámek
|
permission_add_issue_notes: Přidávání poznámek
|
||||||
permission_save_queries: Ukládání dotazů
|
permission_save_queries: Ukládání dotazů
|
||||||
permission_view_wiki_pages: Prohlížení wiki
|
permission_view_wiki_pages: Prohlížení Wiki
|
||||||
permission_rename_wiki_pages: Přejmenovávání wiki stránek
|
permission_rename_wiki_pages: Přejmenovávání Wiki stránek
|
||||||
permission_edit_time_entries: Upravování záznamů o stráveném času
|
permission_edit_time_entries: Upravování záznamů o stráveném času
|
||||||
permission_edit_own_issue_notes: Upravování vlastních poznámek
|
permission_edit_own_issue_notes: Upravování vlastních poznámek
|
||||||
setting_gravatar_enabled: Použít uživatelské ikony Gravatar
|
setting_gravatar_enabled: Použít uživatelské ikony Gravatar
|
||||||
label_example: Příklad
|
label_example: Příklad
|
||||||
text_repository_usernames_mapping: "Vybrat nebo upravit mapování mezi Redmine uživateli a uživatelskými jmény nalezenými v logu repozitáře.\nUživatelé se shodným Redmine uživateslkým jménem a uživatelským jménem v repozitáři jsou mapovaní automaticky."
|
text_repository_usernames_mapping: "Vybrat nebo upravit mapování mezi Redmine uživateli a uživatelskými jmény nalezenými v logu repozitáře.\nUživatelé se shodným Redmine uživatelským jménem a uživatelským jménem v repozitáři jsou mapovaní automaticky."
|
||||||
permission_edit_own_messages: Upravit vlastní zprávy
|
permission_edit_own_messages: Upravit vlastní zprávy
|
||||||
permission_delete_own_messages: Smazat vlastní zprávy
|
permission_delete_own_messages: Smazat vlastní zprávy
|
||||||
label_user_activity: "Aktivita uživatele: {{value}}"
|
label_user_activity: "Aktivita uživatele: {{value}}"
|
||||||
label_updated_time_by: "Akutualizováno: {{author}} před: {{age}}"
|
label_updated_time_by: "Akutualizováno: {{author}} před: {{age}}"
|
||||||
text_diff_truncated: '... Rozdílový soubor je zkrácen, protože jeho délka přesahuje max. limit.'
|
text_diff_truncated: '... Rozdílový soubor je zkrácen, protože jeho délka přesahuje max. limit.'
|
||||||
setting_diff_max_lines_displayed: Maximální počet zobrazenách řádků rozdílů
|
setting_diff_max_lines_displayed: Maximální počet zobrazenách řádků rozdílů
|
||||||
text_plugin_assets_writable: Plugin assets directory writable
|
text_plugin_assets_writable: Možnost zápisu do adresáře plugin assets
|
||||||
warning_attachments_not_saved: "{{count}} soubor(ů) nebylo možné uložit."
|
warning_attachments_not_saved: "{{count}} soubor(ů) nebylo možné uložit."
|
||||||
button_create_and_continue: Vytvořit a pokračovat
|
button_create_and_continue: Vytvořit a pokračovat
|
||||||
text_custom_field_possible_values_info: 'Každá hodnota na novém řádku'
|
text_custom_field_possible_values_info: 'Každá hodnota na novém řádku'
|
||||||
@@ -804,103 +810,111 @@ cs:
|
|||||||
label_date_from_to: Od {{start}} do {{end}}
|
label_date_from_to: Od {{start}} do {{end}}
|
||||||
label_greater_or_equal: ">="
|
label_greater_or_equal: ">="
|
||||||
label_less_or_equal: <=
|
label_less_or_equal: <=
|
||||||
text_wiki_page_destroy_question: This page has {{descendants}} child page(s) and descendant(s). What do you want to do?
|
text_wiki_page_destroy_question: Tato stránka má {{descendants}} podstránek a potomků. Co chcete udělat?
|
||||||
text_wiki_page_reassign_children: Reassign child pages to this parent page
|
text_wiki_page_reassign_children: Přiřadit podstránky k tomuto rodiči
|
||||||
text_wiki_page_nullify_children: Keep child pages as root pages
|
text_wiki_page_nullify_children: Ponechat podstránky jako kořenové stránky
|
||||||
text_wiki_page_destroy_children: Delete child pages and all their descendants
|
text_wiki_page_destroy_children: Smazat podstránky a všechny jejich potomky
|
||||||
setting_password_min_length: Minimum password length
|
setting_password_min_length: Minimální délka hesla
|
||||||
field_group_by: Group results by
|
field_group_by: Seskupovat výsledky podle
|
||||||
mail_subject_wiki_content_updated: "'{{page}}' wiki page has been updated"
|
mail_subject_wiki_content_updated: "'{{page}}' Wiki stránka byla aktualizována"
|
||||||
label_wiki_content_added: Wiki page added
|
label_wiki_content_added: Wiki stránka přidána
|
||||||
mail_subject_wiki_content_added: "'{{page}}' wiki page has been added"
|
mail_subject_wiki_content_added: "'{{page}}' Wiki stránka byla přidána"
|
||||||
mail_body_wiki_content_added: The '{{page}}' wiki page has been added by {{author}}.
|
mail_body_wiki_content_added: "'{{page}}' Wiki stránka byla přidána od {{author}}."
|
||||||
label_wiki_content_updated: Wiki page updated
|
label_wiki_content_updated: Wiki stránka aktualizována
|
||||||
mail_body_wiki_content_updated: The '{{page}}' wiki page has been updated by {{author}}.
|
mail_body_wiki_content_updated: "'{{page}}' Wiki stránka byla aktualizována od {{author}}."
|
||||||
permission_add_project: Create project
|
permission_add_project: Vytvořit projekt
|
||||||
setting_new_project_user_role_id: Role given to a non-admin user who creates a project
|
setting_new_project_user_role_id: Role přiřazená uživateli bez práv administrátora, který projekt vytvořil
|
||||||
label_view_all_revisions: View all revisions
|
label_view_all_revisions: Zobrazit všechny revize
|
||||||
label_tag: Tag
|
label_tag: Tag
|
||||||
label_branch: Branch
|
label_branch: Branch
|
||||||
error_no_tracker_in_project: No tracker is associated to this project. Please check the Project settings.
|
error_no_tracker_in_project: Žádná fronta nebyla přiřazena tomuto projektu. Prosím zkontroluje nastavení projektu.
|
||||||
error_no_default_issue_status: No default issue status is defined. Please check your configuration (Go to "Administration -> Issue statuses").
|
error_no_default_issue_status: Není nastaven výchozí stav úkolu. Prosím zkontrolujte nastavení ("Administrace -> Stavy úkolů").
|
||||||
text_journal_changed: "{{label}} changed from {{old}} to {{new}}"
|
text_journal_changed: "{{label}} změněn z {{old}} na {{new}}"
|
||||||
text_journal_set_to: "{{label}} set to {{value}}"
|
text_journal_set_to: "{{label}} nastaven na {{value}}"
|
||||||
text_journal_deleted: "{{label}} deleted ({{old}})"
|
text_journal_deleted: "{{label}} smazán ({{old}})"
|
||||||
label_group_plural: Groups
|
label_group_plural: Skupiny
|
||||||
label_group: Group
|
label_group: Skupina
|
||||||
label_group_new: New group
|
label_group_new: Nová skupina
|
||||||
label_time_entry_plural: Spent time
|
label_time_entry_plural: Strávený čas
|
||||||
text_journal_added: "{{label}} {{value}} added"
|
text_journal_added: "{{label}} {{value}} přidán"
|
||||||
field_active: Active
|
field_active: Aktivní
|
||||||
enumeration_system_activity: System Activity
|
enumeration_system_activity: Systémová aktivita
|
||||||
permission_delete_issue_watchers: Delete watchers
|
permission_delete_issue_watchers: Smazat přihlížející
|
||||||
version_status_closed: closed
|
version_status_closed: zavřený
|
||||||
version_status_locked: locked
|
version_status_locked: uzamčený
|
||||||
version_status_open: open
|
version_status_open: otevřený
|
||||||
error_can_not_reopen_issue_on_closed_version: An issue assigned to a closed version can not be reopened
|
error_can_not_reopen_issue_on_closed_version: Úkol přiřazený k uzavřené verzi nemůže být znovu otevřen
|
||||||
label_user_anonymous: Anonymous
|
label_user_anonymous: Anonymní
|
||||||
button_move_and_follow: Move and follow
|
button_move_and_follow: Přesunout a následovat
|
||||||
setting_default_projects_modules: Default enabled modules for new projects
|
setting_default_projects_modules: Výchozí zapnutné moduly pro nový projekt
|
||||||
setting_gravatar_default: Default Gravatar image
|
setting_gravatar_default: Výchozí Gravatar
|
||||||
field_sharing: Sharing
|
field_sharing: Sdílení
|
||||||
label_version_sharing_hierarchy: With project hierarchy
|
label_version_sharing_hierarchy: S hierarchií projektu
|
||||||
label_version_sharing_system: With all projects
|
label_version_sharing_system: Se všemi projekty
|
||||||
label_version_sharing_descendants: With subprojects
|
label_version_sharing_descendants: S podprojekty
|
||||||
label_version_sharing_tree: With project tree
|
label_version_sharing_tree: Se stromem projektu
|
||||||
label_version_sharing_none: Not shared
|
label_version_sharing_none: Nesdíleno
|
||||||
error_can_not_archive_project: This project can not be archived
|
error_can_not_archive_project: Tento projekt nemůže být archivován
|
||||||
button_duplicate: Duplicate
|
button_duplicate: Duplikát
|
||||||
button_copy_and_follow: Copy and follow
|
button_copy_and_follow: Kopírovat a následovat
|
||||||
label_copy_source: Source
|
label_copy_source: Zdroj
|
||||||
setting_issue_done_ratio: Calculate the issue done ratio with
|
setting_issue_done_ratio: Spočítat koeficient dokončení úkolu s
|
||||||
setting_issue_done_ratio_issue_status: Use the issue status
|
setting_issue_done_ratio_issue_status: Použít stav úkolu
|
||||||
error_issue_done_ratios_not_updated: Issue done ratios not updated.
|
error_issue_done_ratios_not_updated: Koeficient dokončení úkolu nebyl aktualizován.
|
||||||
error_workflow_copy_target: Please select target tracker(s) and role(s)
|
error_workflow_copy_target: Prosím vyberte cílovou frontu(y) a roly(e)
|
||||||
setting_issue_done_ratio_issue_field: Use the issue field
|
setting_issue_done_ratio_issue_field: Použít pole úkolu
|
||||||
label_copy_same_as_target: Same as target
|
label_copy_same_as_target: Stejný jako cíl
|
||||||
label_copy_target: Target
|
label_copy_target: Cíl
|
||||||
notice_issue_done_ratios_updated: Issue done ratios updated.
|
notice_issue_done_ratios_updated: Koeficienty dokončení úkolu byly aktualizovány.
|
||||||
error_workflow_copy_source: Please select a source tracker or role
|
error_workflow_copy_source: Prosím vyberte zdrojovou frontu nebo roly
|
||||||
label_update_issue_done_ratios: Update issue done ratios
|
label_update_issue_done_ratios: Aktualizovat koeficienty dokončení úkolů
|
||||||
setting_start_of_week: Start calendars on
|
setting_start_of_week: Začínat kalendáře
|
||||||
permission_view_issues: View Issues
|
permission_view_issues: Zobrazit úkoly
|
||||||
label_display_used_statuses_only: Only display statuses that are used by this tracker
|
label_display_used_statuses_only: Zobrazit pouze stavy které jsou použité touto frontou
|
||||||
label_revision_id: Revision {{value}}
|
label_revision_id: Revize {{value}}
|
||||||
label_api_access_key: API access key
|
label_api_access_key: API přístupový klíč
|
||||||
label_api_access_key_created_on: API access key created {{value}} ago
|
label_api_access_key_created_on: API přístupový klíč vytvořen {{value}}
|
||||||
label_feeds_access_key: RSS access key
|
label_feeds_access_key: RSS přístupový klíč
|
||||||
notice_api_access_key_reseted: Your API access key was reset.
|
notice_api_access_key_reseted: Váš API přístupový klíč byl resetován.
|
||||||
setting_rest_api_enabled: Enable REST web service
|
setting_rest_api_enabled: Zapnout službu REST
|
||||||
label_missing_api_access_key: Missing an API access key
|
label_missing_api_access_key: Chybějící přístupový klíč API
|
||||||
label_missing_feeds_access_key: Missing a RSS access key
|
label_missing_feeds_access_key: Chybějící přístupový klíč RSS
|
||||||
button_show: Show
|
button_show: Zobrazit
|
||||||
text_line_separated: Multiple values allowed (one line for each value).
|
text_line_separated: Více hodnot povoleno (jeden řádek pro každou hodnotu).
|
||||||
setting_mail_handler_body_delimiters: Truncate emails after one of these lines
|
setting_mail_handler_body_delimiters: Zkrátit e-maily po jednom z těchto řádků
|
||||||
permission_add_subprojects: Create subprojects
|
permission_add_subprojects: Vytvořit podprojekty
|
||||||
label_subproject_new: New subproject
|
label_subproject_new: Nový podprojekt
|
||||||
text_own_membership_delete_confirmation: |-
|
text_own_membership_delete_confirmation: |-
|
||||||
You are about to remove some or all of your permissions and may no longer be able to edit this project after that.
|
Chystáte se odebrat si některá nebo všechny svá oprávnění a potom již nemusíte být schopni upravit tento projekt.
|
||||||
Are you sure you want to continue?
|
Opravdu chcete pokračovat?
|
||||||
label_close_versions: Close completed versions
|
label_close_versions: Zavřít dokončené verze
|
||||||
label_board_sticky: Sticky
|
label_board_sticky: Nálepka
|
||||||
label_board_locked: Locked
|
label_board_locked: Uzamčeno
|
||||||
permission_export_wiki_pages: Export wiki pages
|
permission_export_wiki_pages: Exportovat Wiki stránky
|
||||||
setting_cache_formatted_text: Cache formatted text
|
setting_cache_formatted_text: Ukládat formátovaný text do vyrovnávací paměti
|
||||||
permission_manage_project_activities: Manage project activities
|
permission_manage_project_activities: Spravovat aktivity projektu
|
||||||
error_unable_delete_issue_status: Unable to delete issue status
|
error_unable_delete_issue_status: Nelze smazat stavy úkolů
|
||||||
label_profile: Profile
|
label_profile: Profil
|
||||||
permission_manage_subtasks: Manage subtasks
|
permission_manage_subtasks: Spravovat podúkoly
|
||||||
field_parent_issue: Parent task
|
field_parent_issue: Rodičovský úkol
|
||||||
label_subtask_plural: Subtasks
|
label_subtask_plural: Podúkol
|
||||||
label_project_copy_notifications: Send email notifications during the project copy
|
label_project_copy_notifications: Odeslat email oznámení v průběhu kopie projektu
|
||||||
error_can_not_delete_custom_field: Unable to delete custom field
|
error_can_not_delete_custom_field: Nelze smazat volitelné pole
|
||||||
error_unable_to_connect: Unable to connect ({{value}})
|
error_unable_to_connect: Nelze se připojit ({{value}})
|
||||||
error_can_not_remove_role: This role is in use and can not be deleted.
|
error_can_not_remove_role: Tato role je právě používaná a nelze ji smazat.
|
||||||
error_can_not_delete_tracker: This tracker contains issues and can't be deleted.
|
error_can_not_delete_tracker: Tato fronta obsahuje úkoly a nemůže být smazán.
|
||||||
field_principal: Principal
|
field_principal: Hlavní
|
||||||
label_my_page_block: My page block
|
label_my_page_block: Bloky na mé stránce
|
||||||
notice_failed_to_save_members: "Failed to save member(s): {{errors}}."
|
notice_failed_to_save_members: "Nepodařilo se uložit člena(y): {{errors}}."
|
||||||
text_zoom_out: Zoom out
|
text_zoom_out: Oddálit
|
||||||
text_zoom_in: Zoom in
|
text_zoom_in: Přiblížit
|
||||||
notice_unable_delete_time_entry: Unable to delete time log entry.
|
notice_unable_delete_time_entry: Nelze smazat čas ze záznamu.
|
||||||
label_overall_spent_time: Overall spent time
|
label_overall_spent_time: Celkově strávený čas
|
||||||
|
field_time_entries: Zaznamenaný čas
|
||||||
|
project_module_gantt: Gantt
|
||||||
|
project_module_calendar: Kalendář
|
||||||
|
field_member_of_group: Člen skupiny
|
||||||
|
field_assigned_to_role: Člen role
|
||||||
|
button_edit_associated_wikipage: "Upravit přiřazenou Wiki stránku: {{page_title}}"
|
||||||
|
text_are_you_sure_with_children: Smazat úkol včetně všech podúkolů?
|
||||||
|
field_text: Textové pole
|
||||||
|
|||||||
+12
-1
@@ -3,6 +3,7 @@
|
|||||||
# updated and upgraded to 0.9 by Morten Krogh Andersen (http://www.krogh.net)
|
# updated and upgraded to 0.9 by Morten Krogh Andersen (http://www.krogh.net)
|
||||||
|
|
||||||
da:
|
da:
|
||||||
|
direction: ltr
|
||||||
date:
|
date:
|
||||||
formats:
|
formats:
|
||||||
default: "%d.%m.%Y"
|
default: "%d.%m.%Y"
|
||||||
@@ -129,6 +130,7 @@ da:
|
|||||||
greater_than_start_date: "skal være senere end startdatoen"
|
greater_than_start_date: "skal være senere end startdatoen"
|
||||||
not_same_project: "hører ikke til samme projekt"
|
not_same_project: "hører ikke til samme projekt"
|
||||||
circular_dependency: "Denne relation vil skabe et afhængighedsforhold"
|
circular_dependency: "Denne relation vil skabe et afhængighedsforhold"
|
||||||
|
cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks"
|
||||||
|
|
||||||
template:
|
template:
|
||||||
header:
|
header:
|
||||||
@@ -791,7 +793,7 @@ da:
|
|||||||
permission_browse_repository: Gennemse repository
|
permission_browse_repository: Gennemse repository
|
||||||
permission_manage_repository: Administrér repository
|
permission_manage_repository: Administrér repository
|
||||||
permission_manage_members: Administrér medlemmer
|
permission_manage_members: Administrér medlemmer
|
||||||
mail_subject_reminder: "{{count}} sag(er) har deadline i de kommende dage"
|
mail_subject_reminder: "{{count}} sag(er) har deadline i de kommende dage ({{days}})"
|
||||||
permission_add_issue_notes: Tilføj noter
|
permission_add_issue_notes: Tilføj noter
|
||||||
permission_edit_messages: Redigér beskeder
|
permission_edit_messages: Redigér beskeder
|
||||||
permission_view_issue_watchers: Se liste over overvågere
|
permission_view_issue_watchers: Se liste over overvågere
|
||||||
@@ -924,3 +926,12 @@ da:
|
|||||||
text_zoom_in: Zoom in
|
text_zoom_in: Zoom in
|
||||||
notice_unable_delete_time_entry: Unable to delete time log entry.
|
notice_unable_delete_time_entry: Unable to delete time log entry.
|
||||||
label_overall_spent_time: Overall spent time
|
label_overall_spent_time: Overall spent time
|
||||||
|
field_time_entries: Log time
|
||||||
|
project_module_gantt: Gantt
|
||||||
|
project_module_calendar: Calendar
|
||||||
|
field_member_of_group: Member of Group
|
||||||
|
field_assigned_to_role: Member of Role
|
||||||
|
button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}"
|
||||||
|
text_are_you_sure_with_children: Delete issue and all child issues?
|
||||||
|
field_text: Text field
|
||||||
|
|
||||||
|
|||||||
+56
-39
@@ -2,6 +2,7 @@
|
|||||||
# by Clemens Kofler (clemens@railway.at)
|
# by Clemens Kofler (clemens@railway.at)
|
||||||
|
|
||||||
de:
|
de:
|
||||||
|
direction: ltr
|
||||||
date:
|
date:
|
||||||
formats:
|
formats:
|
||||||
# Use the strftime parameters for formats.
|
# Use the strftime parameters for formats.
|
||||||
@@ -67,10 +68,11 @@ de:
|
|||||||
other: "fast {{count}} Jahren"
|
other: "fast {{count}} Jahren"
|
||||||
|
|
||||||
number:
|
number:
|
||||||
|
# Default format for numbers
|
||||||
format:
|
format:
|
||||||
precision: 2
|
|
||||||
separator: ','
|
separator: ','
|
||||||
delimiter: '.'
|
delimiter: '.'
|
||||||
|
precision: 2
|
||||||
currency:
|
currency:
|
||||||
format:
|
format:
|
||||||
unit: '€'
|
unit: '€'
|
||||||
@@ -99,13 +101,13 @@ de:
|
|||||||
gb: "GB"
|
gb: "GB"
|
||||||
tb: "TB"
|
tb: "TB"
|
||||||
|
|
||||||
|
|
||||||
# Used in array.to_sentence.
|
# Used in array.to_sentence.
|
||||||
support:
|
support:
|
||||||
array:
|
array:
|
||||||
sentence_connector: "und"
|
sentence_connector: "und"
|
||||||
skip_last_comma: true
|
skip_last_comma: true
|
||||||
|
|
||||||
activerecord:
|
activerecord:
|
||||||
errors:
|
errors:
|
||||||
template:
|
template:
|
||||||
@@ -136,9 +138,10 @@ de:
|
|||||||
greater_than_start_date: "muss größer als Anfangsdatum sein"
|
greater_than_start_date: "muss größer als Anfangsdatum sein"
|
||||||
not_same_project: "gehört nicht zum selben Projekt"
|
not_same_project: "gehört nicht zum selben Projekt"
|
||||||
circular_dependency: "Diese Beziehung würde eine zyklische Abhängigkeit erzeugen"
|
circular_dependency: "Diese Beziehung würde eine zyklische Abhängigkeit erzeugen"
|
||||||
|
cant_link_an_issue_with_a_descendant: "Ein Ticket kann nicht mit einer ihrer Unteraufgaben verlinkt werden"
|
||||||
|
|
||||||
actionview_instancetag_blank_option: Bitte auswählen
|
actionview_instancetag_blank_option: Bitte auswählen
|
||||||
|
|
||||||
general_text_No: 'Nein'
|
general_text_No: 'Nein'
|
||||||
general_text_Yes: 'Ja'
|
general_text_Yes: 'Ja'
|
||||||
general_text_no: 'nein'
|
general_text_no: 'nein'
|
||||||
@@ -171,6 +174,7 @@ de:
|
|||||||
notice_feeds_access_key_reseted: Ihr Atom-Zugriffsschlüssel wurde zurückgesetzt.
|
notice_feeds_access_key_reseted: Ihr Atom-Zugriffsschlüssel wurde zurückgesetzt.
|
||||||
notice_api_access_key_reseted: Ihr API-Zugriffsschlüssel wurde zurückgesetzt.
|
notice_api_access_key_reseted: Ihr API-Zugriffsschlüssel wurde zurückgesetzt.
|
||||||
notice_failed_to_save_issues: "{{count}} von {{total}} ausgewählten Tickets konnte(n) nicht gespeichert werden: {{ids}}."
|
notice_failed_to_save_issues: "{{count}} von {{total}} ausgewählten Tickets konnte(n) nicht gespeichert werden: {{ids}}."
|
||||||
|
notice_failed_to_save_members: "Benutzer konnte nicht gespeichert werden: {{errors}}."
|
||||||
notice_no_issue_selected: "Kein Ticket ausgewählt! Bitte wählen Sie die Tickets, die Sie bearbeiten möchten."
|
notice_no_issue_selected: "Kein Ticket ausgewählt! Bitte wählen Sie die Tickets, die Sie bearbeiten möchten."
|
||||||
notice_account_pending: "Ihr Konto wurde erstellt und wartet jetzt auf die Genehmigung des Administrators."
|
notice_account_pending: "Ihr Konto wurde erstellt und wartet jetzt auf die Genehmigung des Administrators."
|
||||||
notice_default_data_loaded: Die Standard-Konfiguration wurde erfolgreich geladen.
|
notice_default_data_loaded: Die Standard-Konfiguration wurde erfolgreich geladen.
|
||||||
@@ -185,17 +189,18 @@ de:
|
|||||||
error_issue_not_found_in_project: 'Das Ticket wurde nicht gefunden oder gehört nicht zu diesem Projekt.'
|
error_issue_not_found_in_project: 'Das Ticket wurde nicht gefunden oder gehört nicht zu diesem Projekt.'
|
||||||
error_no_tracker_in_project: Diesem Projekt ist kein Tracker zugeordnet. Bitte überprüfen Sie die Projekteinstellungen.
|
error_no_tracker_in_project: Diesem Projekt ist kein Tracker zugeordnet. Bitte überprüfen Sie die Projekteinstellungen.
|
||||||
error_no_default_issue_status: Es ist kein Status als Standard definiert. Bitte überprüfen Sie Ihre Konfiguration (unter "Administration -> Ticket-Status").
|
error_no_default_issue_status: Es ist kein Status als Standard definiert. Bitte überprüfen Sie Ihre Konfiguration (unter "Administration -> Ticket-Status").
|
||||||
|
error_can_not_delete_custom_field: Kann das benutzerdefinierte Feld nicht löschen.
|
||||||
|
error_can_not_delete_tracker: Dieser Tracker enthält Tickets und kann nicht gelöscht werden.
|
||||||
|
error_can_not_remove_role: Diese Rolle wird verwendet und kann nicht gelöscht werden.
|
||||||
error_can_not_reopen_issue_on_closed_version: Das Ticket ist einer abgeschlossenen Version zugeordnet und kann daher nicht wieder geöffnet werden.
|
error_can_not_reopen_issue_on_closed_version: Das Ticket ist einer abgeschlossenen Version zugeordnet und kann daher nicht wieder geöffnet werden.
|
||||||
error_can_not_archive_project: Dieses Projekt kann nicht archiviert werden.
|
error_can_not_archive_project: Dieses Projekt kann nicht archiviert werden.
|
||||||
error_issue_done_ratios_not_updated: Der Ticket-Fortschritt wurde nicht aktualisiert.
|
error_issue_done_ratios_not_updated: Der Ticket-Fortschritt wurde nicht aktualisiert.
|
||||||
error_workflow_copy_source: Bitte wählen Sie einen Quell-Tracker und eine Quell-Rolle.
|
error_workflow_copy_source: Bitte wählen Sie einen Quell-Tracker und eine Quell-Rolle.
|
||||||
error_workflow_copy_target: Bitte wählen Sie die Ziel-Tracker und -Rollen.
|
error_workflow_copy_target: Bitte wählen Sie die Ziel-Tracker und -Rollen.
|
||||||
error_unable_delete_issue_status: "Der Ticket-Status konnte nicht gelöscht werden."
|
error_unable_delete_issue_status: "Der Ticket-Status konnte nicht gelöscht werden."
|
||||||
|
error_unable_to_connect: Fehler beim Verbinden ({{value}})
|
||||||
warning_attachments_not_saved:
|
warning_attachments_not_saved: "{{count}} Datei(en) konnten nicht gespeichert werden."
|
||||||
one: "1 Datei konnte nicht gespeichert werden."
|
|
||||||
other: "{{count}} Dateien konnten nicht gespeichert werden."
|
|
||||||
|
|
||||||
mail_subject_lost_password: "Ihr {{value}} Kennwort"
|
mail_subject_lost_password: "Ihr {{value}} Kennwort"
|
||||||
mail_body_lost_password: 'Benutzen Sie den folgenden Link, um Ihr Kennwort zu ändern:'
|
mail_body_lost_password: 'Benutzen Sie den folgenden Link, um Ihr Kennwort zu ändern:'
|
||||||
mail_subject_register: "{{value}} Kontoaktivierung"
|
mail_subject_register: "{{value}} Kontoaktivierung"
|
||||||
@@ -204,7 +209,7 @@ de:
|
|||||||
mail_body_account_information: Ihre Konto-Informationen
|
mail_body_account_information: Ihre Konto-Informationen
|
||||||
mail_subject_account_activation_request: "Antrag auf {{value}} Kontoaktivierung"
|
mail_subject_account_activation_request: "Antrag auf {{value}} Kontoaktivierung"
|
||||||
mail_body_account_activation_request: "Ein neuer Benutzer ({{value}}) hat sich registriert. Sein Konto wartet auf Ihre Genehmigung:"
|
mail_body_account_activation_request: "Ein neuer Benutzer ({{value}}) hat sich registriert. Sein Konto wartet auf Ihre Genehmigung:"
|
||||||
mail_subject_reminder: "{{count}} Tickets müssen in den nächsten Tagen abgegeben werden"
|
mail_subject_reminder: "{{count}} Tickets müssen in den nächsten {{days}} Tagen abgegeben werden"
|
||||||
mail_body_reminder: "{{count}} Tickets, die Ihnen zugewiesen sind, müssen in den nächsten {{days}} Tagen abgegeben werden:"
|
mail_body_reminder: "{{count}} Tickets, die Ihnen zugewiesen sind, müssen in den nächsten {{days}} Tagen abgegeben werden:"
|
||||||
mail_subject_wiki_content_added: "Wiki-Seite '{{page}}' hinzugefügt"
|
mail_subject_wiki_content_added: "Wiki-Seite '{{page}}' hinzugefügt"
|
||||||
mail_body_wiki_content_added: "Die Wiki-Seite '{{page}}' wurde von {{author}} hinzugefügt."
|
mail_body_wiki_content_added: "Die Wiki-Seite '{{page}}' wurde von {{author}} hinzugefügt."
|
||||||
@@ -249,6 +254,7 @@ de:
|
|||||||
field_priority: Priorität
|
field_priority: Priorität
|
||||||
field_fixed_version: Zielversion
|
field_fixed_version: Zielversion
|
||||||
field_user: Benutzer
|
field_user: Benutzer
|
||||||
|
field_principal: Auftraggeber
|
||||||
field_role: Rolle
|
field_role: Rolle
|
||||||
field_homepage: Projekt-Homepage
|
field_homepage: Projekt-Homepage
|
||||||
field_is_public: Öffentlich
|
field_is_public: Öffentlich
|
||||||
@@ -293,6 +299,7 @@ de:
|
|||||||
field_redirect_existing_links: Existierende Links umleiten
|
field_redirect_existing_links: Existierende Links umleiten
|
||||||
field_estimated_hours: Geschätzter Aufwand
|
field_estimated_hours: Geschätzter Aufwand
|
||||||
field_column_names: Spalten
|
field_column_names: Spalten
|
||||||
|
field_time_entries: Logzeit
|
||||||
field_time_zone: Zeitzone
|
field_time_zone: Zeitzone
|
||||||
field_searchable: Durchsuchbar
|
field_searchable: Durchsuchbar
|
||||||
field_default_value: Standardwert
|
field_default_value: Standardwert
|
||||||
@@ -304,6 +311,7 @@ de:
|
|||||||
field_content: Inhalt
|
field_content: Inhalt
|
||||||
field_group_by: Gruppiere Ergebnisse nach
|
field_group_by: Gruppiere Ergebnisse nach
|
||||||
field_sharing: Gemeinsame Verwendung
|
field_sharing: Gemeinsame Verwendung
|
||||||
|
field_parent_issue: Übergeordnete Aufgabe
|
||||||
|
|
||||||
setting_app_title: Applikations-Titel
|
setting_app_title: Applikations-Titel
|
||||||
setting_app_subtitle: Applikations-Untertitel
|
setting_app_subtitle: Applikations-Untertitel
|
||||||
@@ -413,6 +421,7 @@ de:
|
|||||||
permission_delete_messages: Forenbeiträge löschen
|
permission_delete_messages: Forenbeiträge löschen
|
||||||
permission_delete_own_messages: Eigene Forenbeiträge löschen
|
permission_delete_own_messages: Eigene Forenbeiträge löschen
|
||||||
permission_export_wiki_pages: Wiki-Seiten exportieren
|
permission_export_wiki_pages: Wiki-Seiten exportieren
|
||||||
|
permission_manage_subtasks: Unteraufgaben verwalten
|
||||||
|
|
||||||
project_module_issue_tracking: Ticket-Verfolgung
|
project_module_issue_tracking: Ticket-Verfolgung
|
||||||
project_module_time_tracking: Zeiterfassung
|
project_module_time_tracking: Zeiterfassung
|
||||||
@@ -422,7 +431,9 @@ de:
|
|||||||
project_module_wiki: Wiki
|
project_module_wiki: Wiki
|
||||||
project_module_repository: Projektarchiv
|
project_module_repository: Projektarchiv
|
||||||
project_module_boards: Foren
|
project_module_boards: Foren
|
||||||
|
project_module_calendar: Kalender
|
||||||
|
project_module_gantt: Gantt
|
||||||
|
|
||||||
label_user: Benutzer
|
label_user: Benutzer
|
||||||
label_user_plural: Benutzer
|
label_user_plural: Benutzer
|
||||||
label_user_new: Neuer Benutzer
|
label_user_new: Neuer Benutzer
|
||||||
@@ -479,6 +490,7 @@ de:
|
|||||||
label_my_page: Meine Seite
|
label_my_page: Meine Seite
|
||||||
label_my_account: Mein Konto
|
label_my_account: Mein Konto
|
||||||
label_my_projects: Meine Projekte
|
label_my_projects: Meine Projekte
|
||||||
|
label_my_page_block: Bereich "Meine Seite"
|
||||||
label_administration: Administration
|
label_administration: Administration
|
||||||
label_login: Anmelden
|
label_login: Anmelden
|
||||||
label_logout: Abmelden
|
label_logout: Abmelden
|
||||||
@@ -492,7 +504,7 @@ de:
|
|||||||
label_user_activity: "Aktivität von {{value}}"
|
label_user_activity: "Aktivität von {{value}}"
|
||||||
label_new: Neu
|
label_new: Neu
|
||||||
label_logged_as: Angemeldet als
|
label_logged_as: Angemeldet als
|
||||||
label_environment: Environment
|
label_environment: Umgebung
|
||||||
label_authentication: Authentifizierung
|
label_authentication: Authentifizierung
|
||||||
label_auth_source: Authentifizierungs-Modus
|
label_auth_source: Authentifizierungs-Modus
|
||||||
label_auth_source_new: Neuer Authentifizierungs-Modus
|
label_auth_source_new: Neuer Authentifizierungs-Modus
|
||||||
@@ -542,9 +554,18 @@ de:
|
|||||||
label_open_issues_plural: offen
|
label_open_issues_plural: offen
|
||||||
label_closed_issues: geschlossen
|
label_closed_issues: geschlossen
|
||||||
label_closed_issues_plural: geschlossen
|
label_closed_issues_plural: geschlossen
|
||||||
label_x_open_issues_abbr_on_total: "{{count}} offen / {{total}}"
|
label_x_open_issues_abbr_on_total:
|
||||||
label_x_open_issues_abbr: "{{count}} offen"
|
zero: 0 offen / {{total}}
|
||||||
label_x_closed_issues_abbr: "{{count}} geschlossen"
|
one: 1 offen / {{total}}
|
||||||
|
other: "{{count}} offen / {{total}}"
|
||||||
|
label_x_open_issues_abbr:
|
||||||
|
zero: 0 offen
|
||||||
|
one: 1 offen
|
||||||
|
other: "{{count}} offen"
|
||||||
|
label_x_closed_issues_abbr:
|
||||||
|
zero: 0 geschlossen
|
||||||
|
one: 1 geschlossen
|
||||||
|
other: "{{count}} geschlossen"
|
||||||
label_total: Gesamtzahl
|
label_total: Gesamtzahl
|
||||||
label_permissions: Berechtigungen
|
label_permissions: Berechtigungen
|
||||||
label_current_status: Gegenwärtiger Status
|
label_current_status: Gegenwärtiger Status
|
||||||
@@ -768,7 +789,10 @@ de:
|
|||||||
label_api_access_key: API-Zugriffsschlüssel
|
label_api_access_key: API-Zugriffsschlüssel
|
||||||
label_missing_api_access_key: Der API-Zugriffsschlüssel fehlt.
|
label_missing_api_access_key: Der API-Zugriffsschlüssel fehlt.
|
||||||
label_api_access_key_created_on: Der API-Zugriffsschlüssel wurde vor {{value}} erstellt
|
label_api_access_key_created_on: Der API-Zugriffsschlüssel wurde vor {{value}} erstellt
|
||||||
|
label_profile: Profil
|
||||||
|
label_subtask_plural: Unteraufgaben
|
||||||
|
label_project_copy_notifications: Sende Mailbenachrichtigungen beim Kopieren des Projekts.
|
||||||
|
|
||||||
button_login: Anmelden
|
button_login: Anmelden
|
||||||
button_submit: OK
|
button_submit: OK
|
||||||
button_save: Speichern
|
button_save: Speichern
|
||||||
@@ -812,17 +836,17 @@ de:
|
|||||||
button_quote: Zitieren
|
button_quote: Zitieren
|
||||||
button_duplicate: Duplizieren
|
button_duplicate: Duplizieren
|
||||||
button_show: Anzeigen
|
button_show: Anzeigen
|
||||||
|
|
||||||
status_active: aktiv
|
status_active: aktiv
|
||||||
status_registered: angemeldet
|
status_registered: angemeldet
|
||||||
status_locked: gesperrt
|
status_locked: gesperrt
|
||||||
|
|
||||||
version_status_closed: abgeschlossen
|
|
||||||
version_status_locked: gesperrt
|
|
||||||
version_status_open: offen
|
version_status_open: offen
|
||||||
|
version_status_locked: gesperrt
|
||||||
|
version_status_closed: abgeschlossen
|
||||||
|
|
||||||
field_active: Aktiv
|
field_active: Aktiv
|
||||||
|
|
||||||
text_select_mail_notifications: Bitte wählen Sie die Aktionen aus, für die eine Mailbenachrichtigung gesendet werden soll.
|
text_select_mail_notifications: Bitte wählen Sie die Aktionen aus, für die eine Mailbenachrichtigung gesendet werden soll.
|
||||||
text_regexp_info: z. B. ^[A-Z0-9]+$
|
text_regexp_info: z. B. ^[A-Z0-9]+$
|
||||||
text_min_max_length_info: 0 heißt keine Beschränkung
|
text_min_max_length_info: 0 heißt keine Beschränkung
|
||||||
@@ -877,10 +901,10 @@ de:
|
|||||||
text_wiki_page_nullify_children: Verschiebe die Unterseiten auf die oberste Ebene
|
text_wiki_page_nullify_children: Verschiebe die Unterseiten auf die oberste Ebene
|
||||||
text_wiki_page_destroy_children: Lösche alle Unterseiten
|
text_wiki_page_destroy_children: Lösche alle Unterseiten
|
||||||
text_wiki_page_reassign_children: Ordne die Unterseiten dieser Seite zu
|
text_wiki_page_reassign_children: Ordne die Unterseiten dieser Seite zu
|
||||||
text_own_membership_delete_confirmation: |-
|
text_own_membership_delete_confirmation: "Sie sind dabei, einige oder alle Ihre Berechtigungen zu entfernen. Es ist möglich, dass Sie danach das Projekt nicht mehr ansehen oder bearbeiten dürfen.\nSind Sie sicher, dass Sie dies tun möchten?"
|
||||||
Sie sind dabei, einige oder alle Ihre Berechtigungen zu entfernen. Es ist möglich, dass Sie danach das Projekt nicht mehr ansehen oder bearbeiten dürfen.
|
text_zoom_in: Zoom in
|
||||||
Sind Sie sicher, dass Sie dies tun möchten?
|
text_zoom_out: Zoom out
|
||||||
|
|
||||||
default_role_manager: Manager
|
default_role_manager: Manager
|
||||||
default_role_developer: Entwickler
|
default_role_developer: Entwickler
|
||||||
default_role_reporter: Reporter
|
default_role_reporter: Reporter
|
||||||
@@ -902,21 +926,14 @@ de:
|
|||||||
default_priority_immediate: Sofort
|
default_priority_immediate: Sofort
|
||||||
default_activity_design: Design
|
default_activity_design: Design
|
||||||
default_activity_development: Entwicklung
|
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)
|
||||||
enumeration_system_activity: System-Aktivität
|
enumeration_system_activity: System-Aktivität
|
||||||
label_profile: Profil
|
|
||||||
permission_manage_subtasks: Unteraufgaben verwalten
|
field_member_of_group: Member of Group
|
||||||
field_parent_issue: Übergeordnete Aufgabe
|
field_assigned_to_role: Member of Role
|
||||||
label_subtask_plural: Unteraufgaben
|
text_are_you_sure_with_children: Delete issue and all child issues?
|
||||||
label_project_copy_notifications: Sende Mailbenachrichtigungen beim Kopieren des Projekts.
|
field_text: Text field
|
||||||
error_can_not_delete_custom_field: Kann das benutzerdefinierte Feld nicht löschen.
|
|
||||||
error_unable_to_connect: Fehler beim Verbinden ({{value}})
|
|
||||||
error_can_not_remove_role: Diese Rolle wird verwendet und kann nicht gelöscht werden.
|
|
||||||
error_can_not_delete_tracker: Dieser Tracker enthält Tickets und kann nicht gelöscht werden.
|
|
||||||
field_principal: Principal
|
|
||||||
label_my_page_block: My page block
|
|
||||||
notice_failed_to_save_members: "Failed to save member(s): {{errors}}."
|
|
||||||
text_zoom_out: Zoom out
|
|
||||||
text_zoom_in: Zoom in
|
|
||||||
|
|||||||
+17
-2
@@ -2,6 +2,7 @@
|
|||||||
# by Vaggelis Typaldos (vtypal@gmail.com), Spyros Raptis (spirosrap@gmail.com)
|
# by Vaggelis Typaldos (vtypal@gmail.com), Spyros Raptis (spirosrap@gmail.com)
|
||||||
|
|
||||||
el:
|
el:
|
||||||
|
direction: ltr
|
||||||
date:
|
date:
|
||||||
formats:
|
formats:
|
||||||
# Use the strftime parameters for formats.
|
# Use the strftime parameters for formats.
|
||||||
@@ -66,7 +67,11 @@ el:
|
|||||||
one: "almost 1 year"
|
one: "almost 1 year"
|
||||||
other: "almost {{count}} years"
|
other: "almost {{count}} years"
|
||||||
|
|
||||||
number:
|
number:
|
||||||
|
format:
|
||||||
|
separator: "."
|
||||||
|
delimiter: ""
|
||||||
|
precision: 3
|
||||||
human:
|
human:
|
||||||
format:
|
format:
|
||||||
precision: 1
|
precision: 1
|
||||||
@@ -114,6 +119,7 @@ el:
|
|||||||
greater_than_start_date: "πρέπει να είναι αργότερα από την ημερομηνία έναρξης"
|
greater_than_start_date: "πρέπει να είναι αργότερα από την ημερομηνία έναρξης"
|
||||||
not_same_project: "δεν ανήκει στο ίδιο έργο"
|
not_same_project: "δεν ανήκει στο ίδιο έργο"
|
||||||
circular_dependency: "Αυτή η σχέση θα δημιουργήσει κυκλικές εξαρτήσεις"
|
circular_dependency: "Αυτή η σχέση θα δημιουργήσει κυκλικές εξαρτήσεις"
|
||||||
|
cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks"
|
||||||
|
|
||||||
actionview_instancetag_blank_option: Παρακαλώ επιλέξτε
|
actionview_instancetag_blank_option: Παρακαλώ επιλέξτε
|
||||||
|
|
||||||
@@ -171,7 +177,7 @@ el:
|
|||||||
mail_body_account_information: Πληροφορίες του λογαριασμού σας
|
mail_body_account_information: Πληροφορίες του λογαριασμού σας
|
||||||
mail_subject_account_activation_request: "αίτημα ενεργοποίησης λογαριασμού {{value}}"
|
mail_subject_account_activation_request: "αίτημα ενεργοποίησης λογαριασμού {{value}}"
|
||||||
mail_body_account_activation_request: "'Ένας νέος χρήστης ({{value}}) έχει εγγραφεί. Ο λογαριασμός είναι σε στάδιο αναμονής της έγκρισης σας:"
|
mail_body_account_activation_request: "'Ένας νέος χρήστης ({{value}}) έχει εγγραφεί. Ο λογαριασμός είναι σε στάδιο αναμονής της έγκρισης σας:"
|
||||||
mail_subject_reminder: "{{count}} θέμα(τα) με προθεσμία στις επόμενες ημέρες"
|
mail_subject_reminder: "{{count}} θέμα(τα) με προθεσμία στις επόμενες {{days}} ημέρες"
|
||||||
mail_body_reminder: "{{count}}θέμα(τα) που έχουν ανατεθεί σε σας, με προθεσμία στις επόμενες {{days}} ημέρες:"
|
mail_body_reminder: "{{count}}θέμα(τα) που έχουν ανατεθεί σε σας, με προθεσμία στις επόμενες {{days}} ημέρες:"
|
||||||
mail_subject_wiki_content_added: "'προστέθηκε η σελίδα wiki {{page}}' "
|
mail_subject_wiki_content_added: "'προστέθηκε η σελίδα wiki {{page}}' "
|
||||||
mail_body_wiki_content_added: "Η σελίδα wiki '{{page}}' προστέθηκε από τον {{author}}."
|
mail_body_wiki_content_added: "Η σελίδα wiki '{{page}}' προστέθηκε από τον {{author}}."
|
||||||
@@ -904,3 +910,12 @@ el:
|
|||||||
text_zoom_in: Zoom in
|
text_zoom_in: Zoom in
|
||||||
notice_unable_delete_time_entry: Unable to delete time log entry.
|
notice_unable_delete_time_entry: Unable to delete time log entry.
|
||||||
label_overall_spent_time: Overall spent time
|
label_overall_spent_time: Overall spent time
|
||||||
|
field_time_entries: Log time
|
||||||
|
project_module_gantt: Gantt
|
||||||
|
project_module_calendar: Calendar
|
||||||
|
field_member_of_group: Member of Group
|
||||||
|
field_assigned_to_role: Member of Role
|
||||||
|
button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}"
|
||||||
|
text_are_you_sure_with_children: Delete issue and all child issues?
|
||||||
|
field_text: Text field
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user