Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
70b93c5865 | ||
|
|
4bf0c59416 | ||
|
|
8cc20c66c9 | ||
|
|
e9e7463225 | ||
|
|
e2877d9287 | ||
|
|
2873a703cc | ||
|
|
a472f86bfa | ||
|
|
60af09793d | ||
|
|
2cf5656ad0 | ||
|
|
39cc1276cd | ||
|
|
86ee82384a | ||
|
|
0ceea88453 | ||
|
|
17ccc33e74 | ||
|
|
93fae41512 | ||
|
|
aba28ff068 | ||
|
|
004f9eaf73 | ||
|
|
01728eaf7a | ||
|
|
3a401f78ac | ||
|
|
7c485cd387 | ||
|
|
cbacc0ce30 | ||
|
|
1ee7954f44 | ||
|
|
527cd5734a | ||
|
|
e2266a92da | ||
|
|
a04bbfb165 | ||
|
|
494c149df6 | ||
|
|
1b4012323f | ||
|
|
a8e4e703fb | ||
|
|
2b69a96d6d | ||
|
|
50cb1be8fd | ||
|
|
79a0d92421 | ||
|
|
0093e08a44 | ||
|
|
95ecc56e06 | ||
|
|
0078d40ba1 | ||
|
|
a63c92388f | ||
|
|
05432cfc3d | ||
|
|
e29696ea37 | ||
|
|
c18d96bd8b | ||
|
|
a8eef8366c | ||
|
|
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
|
||||||
@@ -7,6 +8,8 @@ class CalendarsController < ApplicationController
|
|||||||
helper :projects
|
helper :projects
|
||||||
helper :queries
|
helper :queries
|
||||||
include QueriesHelper
|
include QueriesHelper
|
||||||
|
helper :sort
|
||||||
|
include SortHelper
|
||||||
|
|
||||||
def show
|
def show
|
||||||
if params[:year] and params[:year].to_i > 1900
|
if params[:year] and params[:year].to_i > 1900
|
||||||
|
|||||||
@@ -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,68 @@
|
|||||||
|
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)
|
||||||
|
issue.current_journal.notes = @notes if @notes.present?
|
||||||
|
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)
|
||||||
|
@notes = params[:notes]
|
||||||
|
@notes ||= ''
|
||||||
|
end
|
||||||
|
|
||||||
|
def extract_changed_attributes_for_move(params)
|
||||||
|
changed_attributes = {}
|
||||||
|
[:assigned_to_id, :status_id, :start_date, :due_date, :priority_id].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,6 +32,11 @@ 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] options Hash params. 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])
|
link_to(name, options, html_options, *parameters_for_method_reference) if authorize_for(options[:controller] || params[:controller], options[:action])
|
||||||
end
|
end
|
||||||
@@ -103,6 +108,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 +307,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 +390,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 +415,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 +627,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 +669,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 +742,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 +810,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 +821,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?
|
||||||
|
|||||||
+14
-7
@@ -68,8 +68,8 @@ class Issue < ActiveRecord::Base
|
|||||||
:conditions => ["#{Project.table_name}.status=#{Project::STATUS_ACTIVE}"]
|
:conditions => ["#{Project.table_name}.status=#{Project::STATUS_ACTIVE}"]
|
||||||
|
|
||||||
before_create :default_assign
|
before_create :default_assign
|
||||||
before_save :reschedule_following_issues, :close_duplicates, :update_done_ratio_from_issue_status
|
before_save :close_duplicates, :update_done_ratio_from_issue_status
|
||||||
after_save :update_nested_set_attributes, :update_parent_attributes, :create_journal
|
after_save :reschedule_following_issues, :update_nested_set_attributes, :update_parent_attributes, :create_journal
|
||||||
after_destroy :destroy_children
|
after_destroy :destroy_children
|
||||||
after_destroy :update_parent_attributes
|
after_destroy :update_parent_attributes
|
||||||
|
|
||||||
@@ -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,10 +357,17 @@ 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
|
||||||
project.assignable_users
|
users = project.assignable_users
|
||||||
|
users << author if author
|
||||||
|
users.uniq.sort
|
||||||
end
|
end
|
||||||
|
|
||||||
# Versions that the issue can be assigned to
|
# Versions that the issue can be assigned to
|
||||||
@@ -684,7 +691,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 +828,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">
|
||||||
@@ -43,9 +36,9 @@
|
|||||||
<%= render :partial => 'common/calendar', :locals => {:calendar => @calendar} %>
|
<%= render :partial => 'common/calendar', :locals => {:calendar => @calendar} %>
|
||||||
|
|
||||||
<p class="legend cal">
|
<p class="legend cal">
|
||||||
<span class="starting"><%= l(:text_tip_task_begin_day) %></span>
|
<span class="starting"><%= l(:text_tip_issue_begin_day) %></span>
|
||||||
<span class="ending"><%= l(:text_tip_task_end_day) %></span>
|
<span class="ending"><%= l(:text_tip_issue_end_day) %></span>
|
||||||
<span class="starting ending"><%= l(:text_tip_task_begin_end_day) %></span>
|
<span class="starting ending"><%= l(:text_tip_issue_begin_end_day) %></span>
|
||||||
</p>
|
</p>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
|
|||||||
@@ -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 %>
|
||||||
|
|
||||||
|
<% if @allowed_statuses.present? %>
|
||||||
|
<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>
|
||||||
@@ -51,7 +58,7 @@
|
|||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<% end %>
|
<% end %>
|
||||||
<% unless @assignables.nil? || @assignables.empty? -%>
|
<% if @assignables.present? -%>
|
||||||
<li class="folder">
|
<li class="folder">
|
||||||
<a href="#" class="submenu"><%= l(:field_assigned_to) %></a>
|
<a href="#" class="submenu"><%= l(:field_assigned_to) %></a>
|
||||||
<ul>
|
<ul>
|
||||||
@@ -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>
|
||||||
@@ -29,7 +29,7 @@
|
|||||||
<% remote_form_for(:group, @group, :url => {:controller => 'groups', :action => 'add_users', :id => @group}, :method => :post) do |f| %>
|
<% remote_form_for(:group, @group, :url => {:controller => 'groups', :action => 'add_users', :id => @group}, :method => :post) do |f| %>
|
||||||
<fieldset><legend><%=l(:label_user_new)%></legend>
|
<fieldset><legend><%=l(:label_user_new)%></legend>
|
||||||
|
|
||||||
<p><%= text_field_tag 'user_search', nil %></p>
|
<p><%= label_tag "user_search", l(:label_user_search) %><%= text_field_tag 'user_search', nil %></p>
|
||||||
<%= observe_field(:user_search,
|
<%= observe_field(:user_search,
|
||||||
:frequency => 0.5,
|
:frequency => 0.5,
|
||||||
:update => :users,
|
:update => :users,
|
||||||
|
|||||||
@@ -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>
|
||||||
@@ -33,6 +33,11 @@
|
|||||||
<%= select_tag('status_id', "<option value=\"\">#{l(:label_no_change_option)}</option>" + options_from_collection_for_select(@available_statuses, :id, :name)) %>
|
<%= select_tag('status_id', "<option value=\"\">#{l(:label_no_change_option)}</option>" + options_from_collection_for_select(@available_statuses, :id, :name)) %>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<label><%= l(:field_priority) %></label>
|
||||||
|
<%= select_tag('priority_id', "<option value=\"\">#{l(:label_no_change_option)}</option>" + options_from_collection_for_select(IssuePriority.all, :id, :name)) %>
|
||||||
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<label><%= l(:field_start_date) %></label>
|
<label><%= l(:field_start_date) %></label>
|
||||||
<%= text_field_tag 'start_date', '', :size => 10 %><%= calendar_for('start_date') %>
|
<%= text_field_tag 'start_date', '', :size => 10 %><%= calendar_for('start_date') %>
|
||||||
@@ -43,6 +48,11 @@
|
|||||||
<%= text_field_tag 'due_date', '', :size => 10 %><%= calendar_for('due_date') %>
|
<%= text_field_tag 'due_date', '', :size => 10 %><%= calendar_for('due_date') %>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<fieldset><legend><%= l(:field_notes) %></legend>
|
||||||
|
<%= text_area_tag 'notes', @notes, :cols => 60, :rows => 10, :class => 'wiki-edit' %>
|
||||||
|
<%= wikitoolbar_for 'notes' %>
|
||||||
|
</fieldset>
|
||||||
|
|
||||||
<%= call_hook(:view_issues_move_bottom, :issues => @issues, :target_project => @target_project, :copy => !!@copy) %>
|
<%= call_hook(:view_issues_move_bottom, :issues => @issues, :target_project => @target_project, :copy => !!@copy) %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -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), {:controller => 'issue_moves', :action => 'new', :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), {:controller => 'issue_moves', :action => 'new', :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,18 +1,17 @@
|
|||||||
|
<%= 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')" %>
|
||||||
|
|
||||||
<p><%= f.text_field :subject, :size => 80, :required => true %></p>
|
<p><%= f.text_field :subject, :size => 80, :required => true %></p>
|
||||||
|
|
||||||
<% unless (@issue.new_record? && @issue.parent_issue_id.nil?) || !User.current.allowed_to?(:manage_subtasks, @project) %>
|
<% if User.current.allowed_to?(:manage_subtasks, @project) %>
|
||||||
<p><%= f.text_field :parent_issue_id, :size => 10 %></p>
|
<p id="parent_issue"><%= 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,15 +22,15 @@
|
|||||||
</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? %>
|
||||||
<p><%= label_tag('attachments[1][file]', l(:label_attachment_plural))%><%= render :partial => 'attachments/form' %></p>
|
<p id="attachments_form"><%= label_tag('attachments[1][file]', l(:label_attachment_plural))%><%= render :partial => 'attachments/form' %></p>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<% if @issue.new_record? && User.current.allowed_to?(:add_issue_watchers, @project) -%>
|
<% if @issue.new_record? && User.current.allowed_to?(:add_issue_watchers, @project) -%>
|
||||||
<p><label><%= l(:label_issue_watchers) %></label>
|
<p id="watchers_form"><label><%= l(:label_issue_watchers) %></label>
|
||||||
<% @issue.project.users.sort.each do |user| -%>
|
<% @issue.project.users.sort.each do |user| -%>
|
||||||
<label class="floating"><%= check_box_tag 'issue[watcher_user_ids][]', user.id, @issue.watched_by?(user) %> <%=h user %></label>
|
<label class="floating"><%= check_box_tag 'issue[watcher_user_ids][]', user.id, @issue.watched_by?(user) %> <%=h user %></label>
|
||||||
<% end -%>
|
<% end -%>
|
||||||
|
|||||||
@@ -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 %>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<h2><%=l(:label_issue_new)%></h2>
|
<h2><%=l(:label_issue_new)%></h2>
|
||||||
|
|
||||||
<% labelled_tabular_form_for :issue, @issue, :url => {:controller => 'issues', :action => 'create', :project_id => @project},
|
<% labelled_tabular_form_for :issue, @issue, :url => {:controller => 'issues', :action => 'create', :project_id => @project},
|
||||||
:html => {:multipart => true, :id => 'issue-form'} do |f| %>
|
:html => {:multipart => true, :id => 'issue-form', :class => 'tabular new-issue-form'} do |f| %>
|
||||||
<%= error_messages_for 'issue' %>
|
<%= error_messages_for 'issue' %>
|
||||||
<div class="box">
|
<div class="box">
|
||||||
<%= render :partial => 'issues/form', :locals => {:f => f} %>
|
<%= render :partial => 'issues/form', :locals => {:f => f} %>
|
||||||
@@ -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') %>
|
||||||
|
|||||||
@@ -58,7 +58,7 @@
|
|||||||
<% remote_form_for(:member, @member, :url => {:controller => 'members', :action => 'new', :id => @project}, :method => :post) do |f| %>
|
<% remote_form_for(:member, @member, :url => {:controller => 'members', :action => 'new', :id => @project}, :method => :post) do |f| %>
|
||||||
<fieldset><legend><%=l(:label_member_new)%></legend>
|
<fieldset><legend><%=l(:label_member_new)%></legend>
|
||||||
|
|
||||||
<p><%= text_field_tag 'principal_search', nil %></p>
|
<p><%= label_tag "principal_search", l(:label_principal_search) %><%= text_field_tag 'principal_search', nil %></p>
|
||||||
<%= observe_field(:principal_search,
|
<%= observe_field(:principal_search,
|
||||||
:frequency => 0.5,
|
:frequency => 0.5,
|
||||||
:update => :principals,
|
:update => :principals,
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
<th><%= l(:field_description) %></th>
|
<th><%= l(:field_description) %></th>
|
||||||
<th><%= l(:field_status) %></th>
|
<th><%= l(:field_status) %></th>
|
||||||
<th><%= l(:field_sharing) %></th>
|
<th><%= l(:field_sharing) %></th>
|
||||||
<th><%= l(:label_wiki_page) unless @project.wiki.nil? %></th>
|
<th><%= l(:label_wiki_page) %></th>
|
||||||
<th style="width:15%"></th>
|
<th style="width:15%"></th>
|
||||||
</tr></thead>
|
</tr></thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
<td class="description"><%=h version.description %></td>
|
<td class="description"><%=h version.description %></td>
|
||||||
<td class="status"><%= l("version_status_#{version.status}") %></td>
|
<td class="status"><%= l("version_status_#{version.status}") %></td>
|
||||||
<td class="sharing"><%=h format_version_sharing(version.sharing) %></td>
|
<td class="sharing"><%=h format_version_sharing(version.sharing) %></td>
|
||||||
<td><%= link_to(h(version.wiki_page_title), :controller => 'wiki', :page => Wiki.titleize(version.wiki_page_title)) unless version.wiki_page_title.blank? || @project.wiki.nil? %></td>
|
<td><%= link_to_if_authorized(h(version.wiki_page_title), {:controller => 'wiki', :action => 'index', :id => version.project, :page => Wiki.titleize(version.wiki_page_title)}) || h(version.wiki_page_title) unless version.wiki_page_title.blank? || version.project.wiki.nil? %></td>
|
||||||
<td class="buttons">
|
<td class="buttons">
|
||||||
<% if version.project == @project %>
|
<% if version.project == @project %>
|
||||||
<%= link_to_if_authorized l(:button_edit), {:controller => 'versions', :action => 'edit', :id => version }, :class => 'icon icon-edit' %>
|
<%= link_to_if_authorized l(:button_edit), {:controller => 'versions', :action => 'edit', :id => version }, :class => 'icon icon-edit' %>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<div class="box tabular settings">
|
<div class="box tabular settings">
|
||||||
<p><%= setting_check_box :login_required %></p>
|
<p><%= setting_check_box :login_required %></p>
|
||||||
|
|
||||||
<p><%= setting_select :autologin, [1, 7, 30, 365].collect{|days| [l('datetime.distance_in_words.x_days', :count => days), days.to_s]}, :blank => :label_disabled %></p>
|
<p><%= setting_select :autologin, [[l(:label_disabled), 0]] + [1, 7, 30, 365].collect{|days| [l('datetime.distance_in_words.x_days', :count => days), days.to_s]} %></p>
|
||||||
|
|
||||||
<p><%= setting_select :self_registration, [[l(:label_disabled), "0"],
|
<p><%= setting_select :self_registration, [[l(:label_disabled), "0"],
|
||||||
[l(:label_registration_activation_by_email), "1"],
|
[l(:label_registration_activation_by_email), "1"],
|
||||||
@@ -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) %>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<% labelled_tabular_form_for :user, @user, :url => { :controller => 'users', :action => "edit", :tab => nil }, :html => { :class => nil } do |f| %>
|
<% labelled_tabular_form_for :user, @user, :url => { :controller => 'users', :action => "edit", :tab => nil }, :html => { :class => nil } do |f| %>
|
||||||
<%= render :partial => 'form', :locals => { :f => f } %>
|
<%= render :partial => 'form', :locals => { :f => f } %>
|
||||||
<% if @user.active? -%>
|
<% if @user.active? -%>
|
||||||
<p><label><%= check_box_tag 'send_information', 1, true %> <%= l(:label_send_information) %></label>
|
<p><label><%= check_box_tag 'send_information', 1, true %> <%= l(:label_send_information) %></label></p>
|
||||||
<% end -%>
|
<% end -%>
|
||||||
<p><%= submit_tag l(:button_save) %></p>
|
<p><%= submit_tag l(:button_save) %></p>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|||||||
@@ -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 %>
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
<div class="contextual">
|
<div class="contextual">
|
||||||
<%= link_to_if_authorized l(:button_edit), {:controller => 'versions', :action => 'edit', :id => @version}, :class => 'icon icon-edit' %>
|
<%= link_to_if_authorized l(:button_edit), {:controller => 'versions', :action => 'edit', :id => @version}, :class => 'icon icon-edit' %>
|
||||||
|
<%= link_to_if_authorized(l(:button_edit_associated_wikipage, :page_title => @version.wiki_page_title), {:controller => 'wiki', :action => 'edit', :id => @version.project, :page => Wiki.titleize(@version.wiki_page_title)}, :class => 'icon icon-edit') unless @version.wiki_page_title.blank? || @version.project.wiki.nil? %>
|
||||||
<%= call_hook(:view_versions_show_contextual, { :version => @version, :project => @project }) %>
|
<%= call_hook(:view_versions_show_contextual, { :version => @version, :project => @project }) %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -32,13 +33,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
|
||||||
|
|||||||
+296
-273
@@ -1,4 +1,5 @@
|
|||||||
bg:
|
bg:
|
||||||
|
direction: ltr
|
||||||
date:
|
date:
|
||||||
formats:
|
formats:
|
||||||
# Use the strftime parameters for formats.
|
# Use the strftime parameters for formats.
|
||||||
@@ -8,12 +9,12 @@ bg:
|
|||||||
short: "%b %d"
|
short: "%b %d"
|
||||||
long: "%B %d, %Y"
|
long: "%B %d, %Y"
|
||||||
|
|
||||||
day_names: [Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday]
|
day_names: [Неделя, Понеделник, Вторник, Сряда, Четвъртък, Петък, Събота]
|
||||||
abbr_day_names: [Sun, Mon, Tue, Wed, Thu, Fri, Sat]
|
abbr_day_names: [Нед, Пон, Вто, Сря, Чет, Пет, Съб]
|
||||||
|
|
||||||
# Don't forget the nil at the beginning; there's no such thing as a 0th month
|
# Don't forget the nil at the beginning; there's no such thing as a 0th month
|
||||||
month_names: [~, January, February, March, April, May, June, July, August, September, October, November, December]
|
month_names: [~, Януари, Февруари, Март, Април, Май, Юни, Юли, Август, Септември, Октомври, Ноември, Декември]
|
||||||
abbr_month_names: [~, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec]
|
abbr_month_names: [~, Яну, Фев, Мар, Апр, Май, Юни, Юли, Авг, Сеп, Окт, Ное, Дек]
|
||||||
# Used in date_select and datime_select.
|
# Used in date_select and datime_select.
|
||||||
order: [ :year, :month, :day ]
|
order: [ :year, :month, :day ]
|
||||||
|
|
||||||
@@ -30,40 +31,44 @@ bg:
|
|||||||
distance_in_words:
|
distance_in_words:
|
||||||
half_a_minute: "half a minute"
|
half_a_minute: "half a minute"
|
||||||
less_than_x_seconds:
|
less_than_x_seconds:
|
||||||
one: "less than 1 second"
|
one: "по-малко от 1 секунда"
|
||||||
other: "less than {{count}} seconds"
|
other: "по-малко от {{count}} секунди"
|
||||||
x_seconds:
|
x_seconds:
|
||||||
one: "1 second"
|
one: "1 секунда"
|
||||||
other: "{{count}} seconds"
|
other: "{{count}} секунди"
|
||||||
less_than_x_minutes:
|
less_than_x_minutes:
|
||||||
one: "less than a minute"
|
one: "по-малко от 1 минута"
|
||||||
other: "less than {{count}} minutes"
|
other: "по-малко от {{count}} минути"
|
||||||
x_minutes:
|
x_minutes:
|
||||||
one: "1 minute"
|
one: "1 минута"
|
||||||
other: "{{count}} minutes"
|
other: "{{count}} минути"
|
||||||
about_x_hours:
|
about_x_hours:
|
||||||
one: "about 1 hour"
|
one: "около 1 час"
|
||||||
other: "about {{count}} hours"
|
other: "около {{count}} часа"
|
||||||
x_days:
|
x_days:
|
||||||
one: "1 day"
|
one: "1 ден"
|
||||||
other: "{{count}} days"
|
other: "{{count}} дена"
|
||||||
about_x_months:
|
about_x_months:
|
||||||
one: "about 1 month"
|
one: "около 1 месец"
|
||||||
other: "about {{count}} months"
|
other: "около {{count}} месеца"
|
||||||
x_months:
|
x_months:
|
||||||
one: "1 month"
|
one: "1 месец"
|
||||||
other: "{{count}} months"
|
other: "{{count}} месеца"
|
||||||
about_x_years:
|
about_x_years:
|
||||||
one: "about 1 year"
|
one: "около 1 година"
|
||||||
other: "about {{count}} years"
|
other: "около {{count}} години"
|
||||||
over_x_years:
|
over_x_years:
|
||||||
one: "over 1 year"
|
one: "над 1 година"
|
||||||
other: "over {{count}} years"
|
other: "над {{count}} години"
|
||||||
almost_x_years:
|
almost_x_years:
|
||||||
one: "almost 1 year"
|
one: "почти 1 година"
|
||||||
other: "almost {{count}} years"
|
other: "почти {{count}} години"
|
||||||
|
|
||||||
number:
|
number:
|
||||||
|
format:
|
||||||
|
separator: "."
|
||||||
|
delimiter: ""
|
||||||
|
precision: 3
|
||||||
human:
|
human:
|
||||||
format:
|
format:
|
||||||
precision: 1
|
precision: 1
|
||||||
@@ -71,18 +76,18 @@ 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:
|
||||||
array:
|
array:
|
||||||
sentence_connector: "and"
|
sentence_connector: "и"
|
||||||
skip_last_comma: false
|
skip_last_comma: false
|
||||||
|
|
||||||
activerecord:
|
activerecord:
|
||||||
@@ -101,13 +106,13 @@ bg:
|
|||||||
taken: "вече съществува"
|
taken: "вече съществува"
|
||||||
not_a_number: "не е число"
|
not_a_number: "не е число"
|
||||||
not_a_date: "е невалидна дата"
|
not_a_date: "е невалидна дата"
|
||||||
greater_than: "must be greater than {{count}}"
|
greater_than: "трябва да бъде по-голям[a/о] от {{count}}"
|
||||||
greater_than_or_equal_to: "must be greater than or equal to {{count}}"
|
greater_than_or_equal_to: "трябва да бъде по-голям[a/о] от или равен[a/o] на {{count}}"
|
||||||
equal_to: "must be equal to {{count}}"
|
equal_to: "трябва да бъде равен[a/o] на {{count}}"
|
||||||
less_than: "must be less than {{count}}"
|
less_than: "трябва да бъде по-малък[a/o] от {{count}}"
|
||||||
less_than_or_equal_to: "must be less than or equal to {{count}}"
|
less_than_or_equal_to: "трябва да бъде по-малък[a/o] от или равен[a/o] на {{count}}"
|
||||||
odd: "must be odd"
|
odd: "трябва да бъде нечетен[a/o]"
|
||||||
even: "must be even"
|
even: "трябва да бъде четен[a/o]"
|
||||||
greater_than_start_date: "трябва да е след началната дата"
|
greater_than_start_date: "трябва да е след началната дата"
|
||||||
not_same_project: "не е от същия проект"
|
not_same_project: "не е от същия проект"
|
||||||
circular_dependency: "Тази релация ще доведе до безкрайна зависимост"
|
circular_dependency: "Тази релация ще доведе до безкрайна зависимост"
|
||||||
@@ -165,7 +170,7 @@ bg:
|
|||||||
field_mail: Email
|
field_mail: Email
|
||||||
field_filename: Файл
|
field_filename: Файл
|
||||||
field_filesize: Големина
|
field_filesize: Големина
|
||||||
field_downloads: Downloads
|
field_downloads: Изтеглени файлове
|
||||||
field_author: Автор
|
field_author: Автор
|
||||||
field_created_on: От дата
|
field_created_on: От дата
|
||||||
field_updated_on: Обновена
|
field_updated_on: Обновена
|
||||||
@@ -180,10 +185,10 @@ bg:
|
|||||||
field_title: Заглавие
|
field_title: Заглавие
|
||||||
field_project: Проект
|
field_project: Проект
|
||||||
field_issue: Задача
|
field_issue: Задача
|
||||||
field_status: Статус
|
field_status: Състояние
|
||||||
field_notes: Бележка
|
field_notes: Бележка
|
||||||
field_is_closed: Затворена задача
|
field_is_closed: Затворена задача
|
||||||
field_is_default: Статус по подразбиране
|
field_is_default: Състояние по подразбиране
|
||||||
field_tracker: Тракер
|
field_tracker: Тракер
|
||||||
field_subject: Относно
|
field_subject: Относно
|
||||||
field_due_date: Крайна дата
|
field_due_date: Крайна дата
|
||||||
@@ -211,12 +216,11 @@ bg:
|
|||||||
field_port: Порт
|
field_port: Порт
|
||||||
field_account: Профил
|
field_account: Профил
|
||||||
field_base_dn: Base DN
|
field_base_dn: Base DN
|
||||||
field_attr_login: Login attribute
|
field_attr_login: Атрибут Login
|
||||||
field_attr_firstname: Firstname attribute
|
field_attr_firstname: Атрибут Първо име (Firstname)
|
||||||
field_attr_lastname: Lastname attribute
|
field_attr_lastname: Атрибут Фамилия (Lastname)
|
||||||
field_attr_mail: Email attribute
|
field_attr_mail: Атрибут Email
|
||||||
field_onthefly: Динамично създаване на потребител
|
field_onthefly: Динамично създаване на потребител
|
||||||
field_start_date: Начална дата
|
|
||||||
field_done_ratio: % Прогрес
|
field_done_ratio: % Прогрес
|
||||||
field_auth_source: Начин на оторизация
|
field_auth_source: Начин на оторизация
|
||||||
field_hide_mail: Скрий e-mail адреса ми
|
field_hide_mail: Скрий e-mail адреса ми
|
||||||
@@ -243,12 +247,12 @@ bg:
|
|||||||
setting_login_required: Изискване за вход в системата
|
setting_login_required: Изискване за вход в системата
|
||||||
setting_self_registration: Регистрация от потребители
|
setting_self_registration: Регистрация от потребители
|
||||||
setting_attachment_max_size: Максимална големина на прикачен файл
|
setting_attachment_max_size: Максимална големина на прикачен файл
|
||||||
setting_issues_export_limit: Лимит за експорт на задачи
|
setting_issues_export_limit: Максимален брой задачи за експорт
|
||||||
setting_mail_from: E-mail адрес за емисии
|
setting_mail_from: E-mail адрес за емисии
|
||||||
setting_host_name: Хост
|
setting_host_name: Хост
|
||||||
setting_text_formatting: Форматиране на текста
|
setting_text_formatting: Форматиране на текста
|
||||||
setting_wiki_compression: Wiki компресиране на историята
|
setting_wiki_compression: Wiki компресиране на историята
|
||||||
setting_feeds_limit: Лимит на Feeds
|
setting_feeds_limit: Максимален брой за емисии
|
||||||
setting_autofetch_changesets: Автоматично обработване на ревизиите
|
setting_autofetch_changesets: Автоматично обработване на ревизиите
|
||||||
setting_sys_api_enabled: Разрешаване на WS за управление
|
setting_sys_api_enabled: Разрешаване на WS за управление
|
||||||
setting_commit_ref_keywords: Отбелязващи ключови думи
|
setting_commit_ref_keywords: Отбелязващи ключови думи
|
||||||
@@ -264,9 +268,9 @@ bg:
|
|||||||
label_project_new: Нов проект
|
label_project_new: Нов проект
|
||||||
label_project_plural: Проекти
|
label_project_plural: Проекти
|
||||||
label_x_projects:
|
label_x_projects:
|
||||||
zero: no projects
|
zero: 0 проекти
|
||||||
one: 1 project
|
one: 1 проект
|
||||||
other: "{{count}} projects"
|
other: "{{count}} проекта"
|
||||||
label_project_all: Всички проекти
|
label_project_all: Всички проекти
|
||||||
label_project_latest: Последни проекти
|
label_project_latest: Последни проекти
|
||||||
label_issue: Задача
|
label_issue: Задача
|
||||||
@@ -287,9 +291,9 @@ bg:
|
|||||||
label_tracker_plural: Тракери
|
label_tracker_plural: Тракери
|
||||||
label_tracker_new: Нов тракер
|
label_tracker_new: Нов тракер
|
||||||
label_workflow: Работен процес
|
label_workflow: Работен процес
|
||||||
label_issue_status: Статус на задача
|
label_issue_status: Състояние на задача
|
||||||
label_issue_status_plural: Статуси на задачи
|
label_issue_status_plural: Състояния на задачи
|
||||||
label_issue_status_new: Нов статус
|
label_issue_status_new: Ново състояние
|
||||||
label_issue_category: Категория задача
|
label_issue_category: Категория задача
|
||||||
label_issue_category_plural: Категории задачи
|
label_issue_category_plural: Категории задачи
|
||||||
label_issue_category_new: Нова категория
|
label_issue_category_new: Нова категория
|
||||||
@@ -317,14 +321,14 @@ bg:
|
|||||||
label_registered_on: Регистрация
|
label_registered_on: Регистрация
|
||||||
label_activity: Дейност
|
label_activity: Дейност
|
||||||
label_new: Нов
|
label_new: Нов
|
||||||
label_logged_as: Логнат като
|
label_logged_as: Влязъл като
|
||||||
label_environment: Среда
|
label_environment: Среда
|
||||||
label_authentication: Оторизация
|
label_authentication: Оторизация
|
||||||
label_auth_source: Начин на оторозация
|
label_auth_source: Начин на оторозация
|
||||||
label_auth_source_new: Нов начин на оторизация
|
label_auth_source_new: Нов начин на оторизация
|
||||||
label_auth_source_plural: Начини на оторизация
|
label_auth_source_plural: Начини на оторизация
|
||||||
label_subproject_plural: Подпроекти
|
label_subproject_plural: Подпроекти
|
||||||
label_min_max_length: Мин. - Макс. дължина
|
label_min_max_length: Минимална - максимална дължина
|
||||||
label_list: Списък
|
label_list: Списък
|
||||||
label_date: Дата
|
label_date: Дата
|
||||||
label_integer: Целочислен
|
label_integer: Целочислен
|
||||||
@@ -333,10 +337,10 @@ bg:
|
|||||||
label_text: Дълъг текст
|
label_text: Дълъг текст
|
||||||
label_attribute: Атрибут
|
label_attribute: Атрибут
|
||||||
label_attribute_plural: Атрибути
|
label_attribute_plural: Атрибути
|
||||||
label_download: "{{count}} Download"
|
label_download: "{{count}} изтегляне"
|
||||||
label_download_plural: "{{count}} Downloads"
|
label_download_plural: "{{count}} изтегляния"
|
||||||
label_no_data: Няма изходни данни
|
label_no_data: Няма изходни данни
|
||||||
label_change_status: Промяна на статуса
|
label_change_status: Промяна на състоянието
|
||||||
label_history: История
|
label_history: История
|
||||||
label_attachment: Файл
|
label_attachment: Файл
|
||||||
label_attachment_new: Нов файл
|
label_attachment_new: Нов файл
|
||||||
@@ -363,21 +367,21 @@ bg:
|
|||||||
label_closed_issues: затворена
|
label_closed_issues: затворена
|
||||||
label_closed_issues_plural: затворени
|
label_closed_issues_plural: затворени
|
||||||
label_x_open_issues_abbr_on_total:
|
label_x_open_issues_abbr_on_total:
|
||||||
zero: 0 open / {{total}}
|
zero: 0 отворени / {{total}}
|
||||||
one: 1 open / {{total}}
|
one: 1 отворена / {{total}}
|
||||||
other: "{{count}} open / {{total}}"
|
other: "{{count}} отворени / {{total}}"
|
||||||
label_x_open_issues_abbr:
|
label_x_open_issues_abbr:
|
||||||
zero: 0 open
|
zero: 0 отворени
|
||||||
one: 1 open
|
one: 1 отворена
|
||||||
other: "{{count}} open"
|
other: "{{count}} отворени"
|
||||||
label_x_closed_issues_abbr:
|
label_x_closed_issues_abbr:
|
||||||
zero: 0 closed
|
zero: 0 затворени
|
||||||
one: 1 closed
|
one: 1 затворена
|
||||||
other: "{{count}} closed"
|
other: "{{count}} затворени"
|
||||||
label_total: Общо
|
label_total: Общо
|
||||||
label_permissions: Права
|
label_permissions: Права
|
||||||
label_current_status: Текущ статус
|
label_current_status: Текущо състояние
|
||||||
label_new_statuses_allowed: Позволени статуси
|
label_new_statuses_allowed: Позволени състояния
|
||||||
label_all: всички
|
label_all: всички
|
||||||
label_none: никакви
|
label_none: никакви
|
||||||
label_next: Следващ
|
label_next: Следващ
|
||||||
@@ -388,7 +392,7 @@ bg:
|
|||||||
label_per_page: На страница
|
label_per_page: На страница
|
||||||
label_calendar: Календар
|
label_calendar: Календар
|
||||||
label_months_from: месеца от
|
label_months_from: месеца от
|
||||||
label_gantt: Gantt
|
label_gantt: Мрежов график
|
||||||
label_internal: Вътрешен
|
label_internal: Вътрешен
|
||||||
label_last_changes: "последни {{count}} промени"
|
label_last_changes: "последни {{count}} промени"
|
||||||
label_change_view_all: Виж всички промени
|
label_change_view_all: Виж всички промени
|
||||||
@@ -396,9 +400,9 @@ bg:
|
|||||||
label_comment: Коментар
|
label_comment: Коментар
|
||||||
label_comment_plural: Коментари
|
label_comment_plural: Коментари
|
||||||
label_x_comments:
|
label_x_comments:
|
||||||
zero: no comments
|
zero: 0 коментари
|
||||||
one: 1 comment
|
one: 1 коментар
|
||||||
other: "{{count}} comments"
|
other: "{{count}} коментари"
|
||||||
label_comment_add: Добавяне на коментар
|
label_comment_add: Добавяне на коментар
|
||||||
label_comment_added: Добавен коментар
|
label_comment_added: Добавен коментар
|
||||||
label_comment_delete: Изтриване на коментари
|
label_comment_delete: Изтриване на коментари
|
||||||
@@ -447,13 +451,13 @@ bg:
|
|||||||
label_wiki: Wiki
|
label_wiki: Wiki
|
||||||
label_wiki_edit: Wiki редакция
|
label_wiki_edit: Wiki редакция
|
||||||
label_wiki_edit_plural: Wiki редакции
|
label_wiki_edit_plural: Wiki редакции
|
||||||
label_wiki_page: Wiki page
|
label_wiki_page: Wiki страница
|
||||||
label_wiki_page_plural: Wiki pages
|
label_wiki_page_plural: Wiki страници
|
||||||
label_index_by_title: Индекс
|
label_index_by_title: Индекс
|
||||||
label_index_by_date: Индекс по дата
|
label_index_by_date: Индекс по дата
|
||||||
label_current_version: Текуща версия
|
label_current_version: Текуща версия
|
||||||
label_preview: Преглед
|
label_preview: Преглед
|
||||||
label_feed_plural: Feeds
|
label_feed_plural: Емисии
|
||||||
label_changes_details: Подробни промени
|
label_changes_details: Подробни промени
|
||||||
label_issue_tracking: Тракинг
|
label_issue_tracking: Тракинг
|
||||||
label_spent_time: Отделено време
|
label_spent_time: Отделено време
|
||||||
@@ -472,7 +476,7 @@ bg:
|
|||||||
label_permissions_report: Справка за права
|
label_permissions_report: Справка за права
|
||||||
label_watched_issues: Наблюдавани задачи
|
label_watched_issues: Наблюдавани задачи
|
||||||
label_related_issues: Свързани задачи
|
label_related_issues: Свързани задачи
|
||||||
label_applied_status: Промени статуса на
|
label_applied_status: Установено състояние
|
||||||
label_loading: Зареждане...
|
label_loading: Зареждане...
|
||||||
label_relation_new: Нова релация
|
label_relation_new: Нова релация
|
||||||
label_relation_delete: Изтриване на релация
|
label_relation_delete: Изтриване на релация
|
||||||
@@ -482,10 +486,10 @@ bg:
|
|||||||
label_blocked_by: блокирана от
|
label_blocked_by: блокирана от
|
||||||
label_precedes: предшества
|
label_precedes: предшества
|
||||||
label_follows: изпълнява се след
|
label_follows: изпълнява се след
|
||||||
label_end_to_start: end to start
|
label_end_to_start: край към начало
|
||||||
label_end_to_end: end to end
|
label_end_to_end: край към край
|
||||||
label_start_to_start: start to start
|
label_start_to_start: начало към начало
|
||||||
label_start_to_end: start to end
|
label_start_to_end: начало към край
|
||||||
label_stay_logged_in: Запомни ме
|
label_stay_logged_in: Запомни ме
|
||||||
label_disabled: забранено
|
label_disabled: забранено
|
||||||
label_show_completed_versions: Показване на реализирани версии
|
label_show_completed_versions: Показване на реализирани версии
|
||||||
@@ -528,7 +532,7 @@ bg:
|
|||||||
button_clear: Изчисти
|
button_clear: Изчисти
|
||||||
button_lock: Заключване
|
button_lock: Заключване
|
||||||
button_unlock: Отключване
|
button_unlock: Отключване
|
||||||
button_download: Download
|
button_download: Изтегляне
|
||||||
button_list: Списък
|
button_list: Списък
|
||||||
button_view: Преглед
|
button_view: Преглед
|
||||||
button_move: Преместване
|
button_move: Преместване
|
||||||
@@ -538,8 +542,8 @@ bg:
|
|||||||
button_sort: Сортиране
|
button_sort: Сортиране
|
||||||
button_log_time: Отделяне на време
|
button_log_time: Отделяне на време
|
||||||
button_rollback: Върни се към тази ревизия
|
button_rollback: Върни се към тази ревизия
|
||||||
button_watch: Наблюдавай
|
button_watch: Наблюдаване
|
||||||
button_unwatch: Спри наблюдението
|
button_unwatch: Край на наблюдението
|
||||||
button_reply: Отговор
|
button_reply: Отговор
|
||||||
button_archive: Архивиране
|
button_archive: Архивиране
|
||||||
button_unarchive: Разархивиране
|
button_unarchive: Разархивиране
|
||||||
@@ -576,11 +580,11 @@ bg:
|
|||||||
default_role_manager: Мениджър
|
default_role_manager: Мениджър
|
||||||
default_role_developer: Разработчик
|
default_role_developer: Разработчик
|
||||||
default_role_reporter: Публикуващ
|
default_role_reporter: Публикуващ
|
||||||
default_tracker_bug: Бъг
|
default_tracker_bug: Грешка
|
||||||
default_tracker_feature: Функционалност
|
default_tracker_feature: Функционалност
|
||||||
default_tracker_support: Поддръжка
|
default_tracker_support: Поддръжка
|
||||||
default_issue_status_new: Нова
|
default_issue_status_new: Нова
|
||||||
default_issue_status_in_progress: In Progress
|
default_issue_status_in_progress: Изпълнение
|
||||||
default_issue_status_resolved: Приключена
|
default_issue_status_resolved: Приключена
|
||||||
default_issue_status_feedback: Обратна връзка
|
default_issue_status_feedback: Обратна връзка
|
||||||
default_issue_status_closed: Затворена
|
default_issue_status_closed: Затворена
|
||||||
@@ -642,7 +646,7 @@ bg:
|
|||||||
label_age: Възраст
|
label_age: Възраст
|
||||||
notice_default_data_loaded: Примерната информацията е успешно заредена.
|
notice_default_data_loaded: Примерната информацията е успешно заредена.
|
||||||
text_load_default_configuration: Зареждане на примерна информация
|
text_load_default_configuration: Зареждане на примерна информация
|
||||||
text_no_configuration_data: "Все още не са конфигурирани Роли, тракери, статуси на задачи и работен процес.\nСтрого се препоръчва зареждането на примерната информация. Веднъж заредена ще имате възможност да я редактирате."
|
text_no_configuration_data: "Все още не са конфигурирани Роли, тракери, състояния на задачи и работен процес.\nСтрого се препоръчва зареждането на примерната информация. Веднъж заредена ще имате възможност да я редактирате."
|
||||||
error_can_t_load_default_data: "Грешка при зареждане на примерната информация: {{value}}"
|
error_can_t_load_default_data: "Грешка при зареждане на примерната информация: {{value}}"
|
||||||
button_update: Обновяване
|
button_update: Обновяване
|
||||||
label_change_properties: Промяна на настройки
|
label_change_properties: Промяна на настройки
|
||||||
@@ -701,200 +705,219 @@ bg:
|
|||||||
setting_default_projects_public: Новите проекти са публични по подразбиране
|
setting_default_projects_public: Новите проекти са публични по подразбиране
|
||||||
error_scm_annotate: "Обектът не съществува или не може да бъде анотиран."
|
error_scm_annotate: "Обектът не съществува или не може да бъде анотиран."
|
||||||
label_planning: Планиране
|
label_planning: Планиране
|
||||||
text_subprojects_destroy_warning: "Its subproject(s): {{value}} will be also deleted."
|
text_subprojects_destroy_warning: "Неговите подпроекти: {{value}} също ще бъдат изтрити."
|
||||||
label_and_its_subprojects: "{{value}} and its subprojects"
|
label_and_its_subprojects: "{{value}} и неговите подпроекти"
|
||||||
mail_body_reminder: "{{count}} issue(s) that are assigned to you are due in the next {{days}} days:"
|
mail_body_reminder: "{{count}} задачи, назначени на вас са с краен срок в следващите {{days}} дни:"
|
||||||
mail_subject_reminder: "{{count}} issue(s) due in the next days"
|
mail_subject_reminder: "{{count}} задачи с краен срок с следващите {{days}} дни"
|
||||||
text_user_wrote: "{{value}} wrote:"
|
text_user_wrote: "{{value}} написа:"
|
||||||
label_duplicated_by: duplicated by
|
label_duplicated_by: дублирана от
|
||||||
setting_enabled_scm: Enabled SCM
|
setting_enabled_scm: Разрешена SCM
|
||||||
text_enumeration_category_reassign_to: 'Reassign them to this value:'
|
text_enumeration_category_reassign_to: 'Пресвържете ги към тази стойност:'
|
||||||
text_enumeration_destroy_question: "{{count}} objects are assigned to this value."
|
text_enumeration_destroy_question: "{{count}} обекта са свързани с тази стойност."
|
||||||
label_incoming_emails: Incoming emails
|
label_incoming_emails: Входящи e-mail-и
|
||||||
label_generate_key: Generate a key
|
label_generate_key: Генериране на ключ
|
||||||
setting_mail_handler_api_enabled: Enable WS for incoming emails
|
setting_mail_handler_api_enabled: Разрешаване на WS за входящи e-mail-и
|
||||||
setting_mail_handler_api_key: API key
|
setting_mail_handler_api_key: API ключ
|
||||||
text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/email.yml and restart the application to enable them."
|
text_email_delivery_not_configured: "Изпращането на e-mail-и не е конфигурирано и известията не са разрешени.\nКонфигурирайте вашия SMTP сървър в config/email.yml и рестартирайте Redmine, за да ги разрешите."
|
||||||
field_parent_title: Parent page
|
field_parent_title: Родителска страница
|
||||||
label_issue_watchers: Watchers
|
label_issue_watchers: Наблюдатели
|
||||||
setting_commit_logs_encoding: Commit messages encoding
|
setting_commit_logs_encoding: Кодова таблица на съобщенията при поверяване
|
||||||
button_quote: Quote
|
button_quote: Цитат
|
||||||
setting_sequential_project_identifiers: Generate sequential project identifiers
|
setting_sequential_project_identifiers: Генериране на последователни проектни идентификатори
|
||||||
notice_unable_delete_version: Unable to delete version
|
notice_unable_delete_version: Невъзможност за изтриване на версия
|
||||||
label_renamed: renamed
|
label_renamed: преименуван
|
||||||
label_copied: copied
|
label_copied: копиран
|
||||||
setting_plain_text_mail: plain text only (no HTML)
|
setting_plain_text_mail: само чист текст (без HTML)
|
||||||
permission_view_files: View files
|
permission_view_files: Разглеждане на файлове
|
||||||
permission_edit_issues: Edit issues
|
permission_edit_issues: Редактиране на задачи
|
||||||
permission_edit_own_time_entries: Edit own time logs
|
permission_edit_own_time_entries: Редактиране на собствените time logs
|
||||||
permission_manage_public_queries: Manage public queries
|
permission_manage_public_queries: Управление на публичните заявки
|
||||||
permission_add_issues: Add issues
|
permission_add_issues: Добавяне на задачи
|
||||||
permission_log_time: Log spent time
|
permission_log_time: Log spent time
|
||||||
permission_view_changesets: View changesets
|
permission_view_changesets: Разглеждане на changesets
|
||||||
permission_view_time_entries: View spent time
|
permission_view_time_entries: Разглеждане на изразходваното време
|
||||||
permission_manage_versions: Manage versions
|
permission_manage_versions: Управление на версиите
|
||||||
permission_manage_wiki: Manage wiki
|
permission_manage_wiki: Управление на wiki
|
||||||
permission_manage_categories: Manage issue categories
|
permission_manage_categories: Управление на категориите задачи
|
||||||
permission_protect_wiki_pages: Protect wiki pages
|
permission_protect_wiki_pages: Заключване на wiki страници
|
||||||
permission_comment_news: Comment news
|
permission_comment_news: Коментиране на новини
|
||||||
permission_delete_messages: Delete messages
|
permission_delete_messages: Изтриване на съобщения
|
||||||
permission_select_project_modules: Select project modules
|
permission_select_project_modules: Избор на проектни модули
|
||||||
permission_manage_documents: Manage documents
|
permission_manage_documents: Управление на документи
|
||||||
permission_edit_wiki_pages: Edit wiki pages
|
permission_edit_wiki_pages: Редактиране на wiki страници
|
||||||
permission_add_issue_watchers: Add watchers
|
permission_add_issue_watchers: Добавяне на наблюдатели
|
||||||
permission_view_gantt: View gantt chart
|
permission_view_gantt: Разглеждане на мрежов график
|
||||||
permission_move_issues: Move issues
|
permission_move_issues: Преместване на задачи
|
||||||
permission_manage_issue_relations: Manage issue relations
|
permission_manage_issue_relations: Управление на връзките между задачите
|
||||||
permission_delete_wiki_pages: Delete wiki pages
|
permission_delete_wiki_pages: Изтриване на wiki страници
|
||||||
permission_manage_boards: Manage boards
|
permission_manage_boards: Управление на boards
|
||||||
permission_delete_wiki_pages_attachments: Delete attachments
|
permission_delete_wiki_pages_attachments: Изтриване на прикачени файлове
|
||||||
permission_view_wiki_edits: View wiki history
|
permission_view_wiki_edits: Разглеждане на wiki история
|
||||||
permission_add_messages: Post messages
|
permission_add_messages: Публикуване на съобщения
|
||||||
permission_view_messages: View messages
|
permission_view_messages: Разглеждане на съобщения
|
||||||
permission_manage_files: Manage files
|
permission_manage_files: Управление на файлове
|
||||||
permission_edit_issue_notes: Edit notes
|
permission_edit_issue_notes: Редактиране на бележки
|
||||||
permission_manage_news: Manage news
|
permission_manage_news: Управление на новини
|
||||||
permission_view_calendar: View calendrier
|
permission_view_calendar: Разглеждане на календари
|
||||||
permission_manage_members: Manage members
|
permission_manage_members: Управление на членовете (на екип)
|
||||||
permission_edit_messages: Edit messages
|
permission_edit_messages: Редактиране на съобщения
|
||||||
permission_delete_issues: Delete issues
|
permission_delete_issues: Изтриване на задачи
|
||||||
permission_view_issue_watchers: View watchers list
|
permission_view_issue_watchers: Разглеждане на списък с наблюдатели
|
||||||
permission_manage_repository: Manage repository
|
permission_manage_repository: Управление на хранилища
|
||||||
permission_commit_access: Commit access
|
permission_commit_access: Поверяване
|
||||||
permission_browse_repository: Browse repository
|
permission_browse_repository: Разглеждане на хранилища
|
||||||
permission_view_documents: View documents
|
permission_view_documents: Разглеждане на документи
|
||||||
permission_edit_project: Edit project
|
permission_edit_project: Редактиране на проект
|
||||||
permission_add_issue_notes: Add notes
|
permission_add_issue_notes: Добаване на бележки
|
||||||
permission_save_queries: Save queries
|
permission_save_queries: Запис на запитвания (queries)
|
||||||
permission_view_wiki_pages: View wiki
|
permission_view_wiki_pages: Разглеждане на wiki
|
||||||
permission_rename_wiki_pages: Rename wiki pages
|
permission_rename_wiki_pages: Преименуване на wiki страници
|
||||||
permission_edit_time_entries: Edit time logs
|
permission_edit_time_entries: Редактиране на time logs
|
||||||
permission_edit_own_issue_notes: Edit own notes
|
permission_edit_own_issue_notes: Редактиране на собствени бележки
|
||||||
setting_gravatar_enabled: Use Gravatar user icons
|
setting_gravatar_enabled: Използване на портребителски икони от Gravatar
|
||||||
label_example: Example
|
label_example: Пример
|
||||||
text_repository_usernames_mapping: "Select ou update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped."
|
text_repository_usernames_mapping: "Select ou update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped."
|
||||||
permission_edit_own_messages: Edit own messages
|
permission_edit_own_messages: Редактиране на собствени съобщения
|
||||||
permission_delete_own_messages: Delete own messages
|
permission_delete_own_messages: Изтриване на собствени съобщения
|
||||||
label_user_activity: "{{value}}'s activity"
|
label_user_activity: "Активност на {{value}}"
|
||||||
label_updated_time_by: "Updated by {{author}} {{age}} ago"
|
label_updated_time_by: "Обновена от {{author}} преди {{age}}"
|
||||||
text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
|
text_diff_truncated: '... Този diff не е пълен, понеже е надхвърля максималния размер, който може да бъде показан.'
|
||||||
setting_diff_max_lines_displayed: Max number of diff lines displayed
|
setting_diff_max_lines_displayed: Максимален брой показани diff редове
|
||||||
text_plugin_assets_writable: Plugin assets directory writable
|
text_plugin_assets_writable: Папката на приставките е разрешена за запис
|
||||||
warning_attachments_not_saved: "{{count}} file(s) could not be saved."
|
warning_attachments_not_saved: "{{count}} файла не бяха записани."
|
||||||
button_create_and_continue: Create and continue
|
button_create_and_continue: Създаване и продължаване
|
||||||
text_custom_field_possible_values_info: 'One line for each value'
|
text_custom_field_possible_values_info: 'Една стойност на ред'
|
||||||
label_display: Display
|
label_display: Display
|
||||||
field_editable: Editable
|
field_editable: Editable
|
||||||
setting_repository_log_display_limit: Maximum number of revisions displayed on file log
|
setting_repository_log_display_limit: Максимален брой на показванете ревизии в лог файла
|
||||||
setting_file_max_size_displayed: Max size of text files displayed inline
|
setting_file_max_size_displayed: Максимален размер на текстовите файлове, показвани inline
|
||||||
field_watcher: Watcher
|
field_watcher: Наблюдател
|
||||||
setting_openid: Allow OpenID login and registration
|
setting_openid: Рарешаване на OpenID вход и регистрация
|
||||||
field_identity_url: OpenID URL
|
field_identity_url: OpenID URL
|
||||||
label_login_with_open_id_option: or login with OpenID
|
label_login_with_open_id_option: или вход чрез OpenID
|
||||||
field_content: Content
|
field_content: Съдържание
|
||||||
label_descending: Descending
|
label_descending: Намаляващ
|
||||||
label_sort: Sort
|
label_sort: Сортиране
|
||||||
label_ascending: Ascending
|
label_ascending: Нарастващ
|
||||||
label_date_from_to: From {{start}} to {{end}}
|
label_date_from_to: От {{start}} до {{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: Тази страница има {{descendants}} страници деца и descendant(s). Какво желаете да правите?
|
||||||
text_wiki_page_reassign_children: Reassign child pages to this parent page
|
text_wiki_page_reassign_children: Преназначаване на страниците деца на тази родителска страница
|
||||||
text_wiki_page_nullify_children: Keep child pages as root pages
|
text_wiki_page_nullify_children: Запазване на тези страници като коренни страници
|
||||||
text_wiki_page_destroy_children: Delete child pages and all their descendants
|
text_wiki_page_destroy_children: Изтриване на страниците деца и всички техни descendants
|
||||||
setting_password_min_length: Minimum password length
|
setting_password_min_length: Минимална дължина на парола
|
||||||
field_group_by: Group results by
|
field_group_by: Групиране на резултатите по
|
||||||
mail_subject_wiki_content_updated: "'{{page}}' wiki page has been updated"
|
mail_subject_wiki_content_updated: "Wiki страницата '{{id}}' не беше обновена"
|
||||||
label_wiki_content_added: Wiki page added
|
label_wiki_content_added: Wiki страница беше добавена
|
||||||
mail_subject_wiki_content_added: "'{{page}}' wiki page has been added"
|
mail_subject_wiki_content_added: "Wiki страницата '{{id}}' беше добавена"
|
||||||
mail_body_wiki_content_added: The '{{page}}' wiki page has been added by {{author}}.
|
mail_body_wiki_content_added: Wiki страницата '{{id}}' беше добавена от {{author}}.
|
||||||
label_wiki_content_updated: Wiki page updated
|
label_wiki_content_updated: Wiki страница беше обновена
|
||||||
mail_body_wiki_content_updated: The '{{page}}' wiki page has been updated by {{author}}.
|
mail_body_wiki_content_updated: Wiki страницата '{{id}}' беше обновена от {{author}}.
|
||||||
permission_add_project: Create project
|
permission_add_project: Създаване на проект
|
||||||
setting_new_project_user_role_id: Role given to a non-admin user who creates a project
|
setting_new_project_user_role_id: Роля, давана на потребител, създаващ проекти, който не е администратор
|
||||||
label_view_all_revisions: View all revisions
|
label_view_all_revisions: Разглеждане на всички ревизии
|
||||||
label_tag: Tag
|
label_tag: Версия
|
||||||
label_branch: Branch
|
label_branch: работен вариант
|
||||||
error_no_tracker_in_project: No tracker is associated to this project. Please check the Project settings.
|
error_no_tracker_in_project: Няма асоциирани тракери с този проект. Проверете настройките на проекта.
|
||||||
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: Няма установено подразбиращо се състояние за задачите. Моля проверете вашата конфигурация (Вижте "Администрация -> Състояния на задачи").
|
||||||
text_journal_changed: "{{label}} changed from {{old}} to {{new}}"
|
text_journal_changed: "{{label}} променен от {{old}} на {{new}}"
|
||||||
text_journal_set_to: "{{label}} set to {{value}}"
|
text_journal_set_to: "{{label}} установен на {{value}}"
|
||||||
text_journal_deleted: "{{label}} deleted ({{old}})"
|
text_journal_deleted: "{{label}} изтрит ({{old}})"
|
||||||
label_group_plural: Groups
|
label_group_plural: Групи
|
||||||
label_group: Group
|
label_group: Група
|
||||||
label_group_new: New group
|
label_group_new: Нова група
|
||||||
label_time_entry_plural: Spent time
|
label_time_entry_plural: Използвано време
|
||||||
text_journal_added: "{{label}} {{value}} added"
|
text_journal_added: "Добавено {{label}} {{value}}"
|
||||||
field_active: Active
|
field_active: Активен
|
||||||
enumeration_system_activity: System Activity
|
enumeration_system_activity: Системна активност
|
||||||
permission_delete_issue_watchers: Delete watchers
|
permission_delete_issue_watchers: Изтриване на наблюдатели
|
||||||
version_status_closed: closed
|
version_status_closed: затворена
|
||||||
version_status_locked: locked
|
version_status_locked: заключена
|
||||||
version_status_open: open
|
version_status_open: отворена
|
||||||
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: Задача, асоциирана със затворена версия не може да бъде отворена отново
|
||||||
label_user_anonymous: Anonymous
|
label_user_anonymous: Анонимен
|
||||||
button_move_and_follow: Move and follow
|
button_move_and_follow: Преместване и продължаване
|
||||||
setting_default_projects_modules: Default enabled modules for new projects
|
setting_default_projects_modules: Активирани модули по подразбиране за нов проект
|
||||||
setting_gravatar_default: Default Gravatar image
|
setting_gravatar_default: Подразбиращо се изображение от Gravatar
|
||||||
field_sharing: Sharing
|
field_sharing: Sharing
|
||||||
label_version_sharing_hierarchy: With project hierarchy
|
label_version_sharing_hierarchy: С проектна йерархия
|
||||||
label_version_sharing_system: With all projects
|
label_version_sharing_system: С всички проекти
|
||||||
label_version_sharing_descendants: With subprojects
|
label_version_sharing_descendants: С подпроекти
|
||||||
label_version_sharing_tree: With project tree
|
label_version_sharing_tree: С дърво на проектите
|
||||||
label_version_sharing_none: Not shared
|
label_version_sharing_none: Не споделен
|
||||||
error_can_not_archive_project: This project can not be archived
|
error_can_not_archive_project: Този проект не може да бъде архивиран
|
||||||
button_duplicate: Duplicate
|
button_duplicate: Дублиране
|
||||||
button_copy_and_follow: Copy and follow
|
button_copy_and_follow: Копиране и продължаване
|
||||||
label_copy_source: Source
|
label_copy_source: Източник
|
||||||
setting_issue_done_ratio: Calculate the issue done ratio with
|
setting_issue_done_ratio: Изчисление на процента на готово задачи с
|
||||||
setting_issue_done_ratio_issue_status: Use the issue status
|
setting_issue_done_ratio_issue_status: Използване на състояниетона задачите
|
||||||
error_issue_done_ratios_not_updated: Issue done ratios not updated.
|
error_issue_done_ratios_not_updated: Процентът на завършените задачи не е обновен.
|
||||||
error_workflow_copy_target: Please select target tracker(s) and role(s)
|
error_workflow_copy_target: Моля изберете тракер(и) и роля (роли).
|
||||||
setting_issue_done_ratio_issue_field: Use the issue field
|
setting_issue_done_ratio_issue_field: Използване на поле 'задача'
|
||||||
label_copy_same_as_target: Same as target
|
label_copy_same_as_target: Също като целта
|
||||||
label_copy_target: Target
|
label_copy_target: Цел
|
||||||
notice_issue_done_ratios_updated: Issue done ratios updated.
|
notice_issue_done_ratios_updated: Обновен процент на завършените задачи.
|
||||||
error_workflow_copy_source: Please select a source tracker or role
|
error_workflow_copy_source: Моля изберете source тракер или роля
|
||||||
label_update_issue_done_ratios: Update issue done ratios
|
label_update_issue_done_ratios: Обновяване на процента на завършените задачи
|
||||||
setting_start_of_week: Start calendars on
|
setting_start_of_week: Първи ден на седмицата
|
||||||
permission_view_issues: View Issues
|
permission_view_issues: Разглеждане на задачите
|
||||||
label_display_used_statuses_only: Only display statuses that are used by this tracker
|
label_display_used_statuses_only: Показване само на състоянията, използвани от този тракер
|
||||||
label_revision_id: Revision {{value}}
|
label_revision_id: Ревизия {{value}}
|
||||||
label_api_access_key: API access key
|
label_api_access_key: API ключ за достъп
|
||||||
label_api_access_key_created_on: API access key created {{value}} ago
|
label_api_access_key_created_on: API ключ за достъп е създаден преди {{value}}
|
||||||
label_feeds_access_key: RSS access key
|
label_feeds_access_key: RSS access ключ
|
||||||
notice_api_access_key_reseted: Your API access key was reset.
|
notice_api_access_key_reseted: Вашият API ключ за достъп беше изчистен.
|
||||||
setting_rest_api_enabled: Enable REST web service
|
setting_rest_api_enabled: Разрешаване на REST web сървис
|
||||||
label_missing_api_access_key: Missing an API access key
|
label_missing_api_access_key: Липсващ API ключ
|
||||||
label_missing_feeds_access_key: Missing a RSS access key
|
label_missing_feeds_access_key: Липсващ RSS ключ за достъп
|
||||||
button_show: Show
|
button_show: Показване
|
||||||
text_line_separated: Multiple values allowed (one line for each value).
|
text_line_separated: Позволени са много стойности (по едно на ред).
|
||||||
setting_mail_handler_body_delimiters: Truncate emails after one of these lines
|
setting_mail_handler_body_delimiters: Отрязване на e-mail-ите след един от тези редове
|
||||||
permission_add_subprojects: Create subprojects
|
permission_add_subprojects: Създаване на подпроекти
|
||||||
label_subproject_new: New subproject
|
label_subproject_new: Нов подпроект
|
||||||
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.
|
Вие сте на път да премахнете някои или всички ваши разрешения и е възможно след това на да не можете да редатирате този проект.
|
||||||
Are you sure you want to continue?
|
Сигурен ли сте, че искате да продължите?
|
||||||
label_close_versions: Close completed versions
|
label_close_versions: Затваряне на завършените версии
|
||||||
label_board_sticky: Sticky
|
label_board_sticky: Sticky
|
||||||
label_board_locked: Locked
|
label_board_locked: Заключена
|
||||||
permission_export_wiki_pages: Export wiki pages
|
permission_export_wiki_pages: Експорт на wiki страници
|
||||||
setting_cache_formatted_text: Cache formatted text
|
setting_cache_formatted_text: Cache formatted text
|
||||||
permission_manage_project_activities: Manage project activities
|
permission_manage_project_activities: Управление на дейностите на проекта
|
||||||
error_unable_delete_issue_status: Unable to delete issue status
|
error_unable_delete_issue_status: Невъзможност за изтриване на състояние на задача
|
||||||
label_profile: Profile
|
label_profile: Профил
|
||||||
permission_manage_subtasks: Manage subtasks
|
permission_manage_subtasks: Управление на подзадачите
|
||||||
field_parent_issue: Parent task
|
field_parent_issue: Родителска задача
|
||||||
label_subtask_plural: Subtasks
|
label_subtask_plural: Подзадачи
|
||||||
label_project_copy_notifications: Send email notifications during the project copy
|
label_project_copy_notifications: Изпращане на Send e-mail известия по време на копирането на проекта
|
||||||
error_can_not_delete_custom_field: Unable to delete custom field
|
error_can_not_delete_custom_field: Невъзможност за изтриване на потребителско поле
|
||||||
error_unable_to_connect: Unable to connect ({{value}})
|
error_unable_to_connect: Невъзможност за свързване с ({{value}})
|
||||||
error_can_not_remove_role: This role is in use and can not be deleted.
|
error_can_not_remove_role: Тази роля се използва и не може да бъде изтрита.
|
||||||
error_can_not_delete_tracker: This tracker contains issues and can't be deleted.
|
error_can_not_delete_tracker: Този тракер съдържа задачи и не може да бъде изтрит.
|
||||||
field_principal: Principal
|
field_principal: Principal
|
||||||
label_my_page_block: My page block
|
label_my_page_block: My page block
|
||||||
notice_failed_to_save_members: "Failed to save member(s): {{errors}}."
|
notice_failed_to_save_members: "Невъзможност за запис на член(ове): {{errors}}."
|
||||||
text_zoom_out: Zoom out
|
text_zoom_out: Намаляване
|
||||||
text_zoom_in: Zoom in
|
text_zoom_in: Увеличаване
|
||||||
notice_unable_delete_time_entry: Unable to delete time log entry.
|
notice_unable_delete_time_entry: Невъзможност за изтриване на запис на time log.
|
||||||
label_overall_spent_time: Overall spent time
|
label_overall_spent_time: Общо употребено време
|
||||||
|
field_time_entries: Log time
|
||||||
|
notice_not_authorized_archived_project: The project you're trying to access has been archived.
|
||||||
|
text_tip_issue_end_day: issue ending this day
|
||||||
|
field_text: Text field
|
||||||
|
label_user_mail_option_only_owner: Only for things I am the owner of
|
||||||
|
field_member_of_group: Assignee's group
|
||||||
|
project_module_gantt: Gantt
|
||||||
|
text_are_you_sure_with_children: Delete issue and all child issues?
|
||||||
|
text_tip_issue_begin_end_day: issue beginning and ending this day
|
||||||
|
setting_default_notification_option: Default notification option
|
||||||
|
project_module_calendar: Calendar
|
||||||
|
label_user_mail_option_only_my_events: Only for things I watch or I'm involved in
|
||||||
|
text_tip_issue_begin_day: issue beginning this day
|
||||||
|
label_user_mail_option_only_assigned: Only for things I am assigned to
|
||||||
|
button_edit_associated_wikipage: "Edit associated Wiki page: {{page_title}}"
|
||||||
|
field_assigned_to_role: Assignee's role
|
||||||
|
field_start_date: Start date
|
||||||
|
label_principal_search: "Search for user or group:"
|
||||||
|
label_user_search: "Search for user:"
|
||||||
|
|||||||
+18
-5
@@ -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
|
||||||
@@ -250,7 +252,6 @@ bs:
|
|||||||
field_attr_lastname: Atribut za prezime
|
field_attr_lastname: Atribut za prezime
|
||||||
field_attr_mail: Atribut za email
|
field_attr_mail: Atribut za email
|
||||||
field_onthefly: 'Kreiranje korisnika "On-the-fly"'
|
field_onthefly: 'Kreiranje korisnika "On-the-fly"'
|
||||||
field_start_date: Početak
|
|
||||||
field_done_ratio: % Realizovano
|
field_done_ratio: % Realizovano
|
||||||
field_auth_source: Mod za authentifikaciju
|
field_auth_source: Mod za authentifikaciju
|
||||||
field_hide_mail: Sakrij moju email adresu
|
field_hide_mail: Sakrij moju email adresu
|
||||||
@@ -748,9 +749,9 @@ bs:
|
|||||||
text_subprojects_destroy_warning: "Podprojekt(i): {{value}} će takođe biti izbrisani."
|
text_subprojects_destroy_warning: "Podprojekt(i): {{value}} će takođe biti izbrisani."
|
||||||
text_workflow_edit: Odaberite ulogu i područje aktivnosti za ispravku toka promjena na aktivnosti
|
text_workflow_edit: Odaberite ulogu i područje aktivnosti za ispravku toka promjena na aktivnosti
|
||||||
text_are_you_sure: Da li ste sigurni ?
|
text_are_you_sure: Da li ste sigurni ?
|
||||||
text_tip_task_begin_day: zadatak počinje danas
|
text_tip_issue_begin_day: zadatak počinje danas
|
||||||
text_tip_task_end_day: zadatak završava danas
|
text_tip_issue_end_day: zadatak završava danas
|
||||||
text_tip_task_begin_end_day: zadatak započinje i završava danas
|
text_tip_issue_begin_end_day: zadatak započinje i završava danas
|
||||||
text_project_identifier_info: 'Samo mala slova (a-z), brojevi i crtice su dozvoljeni.<br />Nakon snimanja, identifikator se ne može mijenjati.'
|
text_project_identifier_info: 'Samo mala slova (a-z), brojevi i crtice su dozvoljeni.<br />Nakon snimanja, identifikator se ne može mijenjati.'
|
||||||
text_caracters_maximum: "maksimum {{count}} karaktera."
|
text_caracters_maximum: "maksimum {{count}} karaktera."
|
||||||
text_caracters_minimum: "Dužina mora biti najmanje {{count}} znakova."
|
text_caracters_minimum: "Dužina mora biti najmanje {{count}} znakova."
|
||||||
@@ -922,3 +923,15 @@ 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
|
||||||
|
|
||||||
|
field_start_date: Start date
|
||||||
|
label_principal_search: "Search for user or group:"
|
||||||
|
label_user_search: "Search for user:"
|
||||||
|
|||||||
+138
-116
@@ -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
|
||||||
@@ -232,7 +264,6 @@ ca:
|
|||||||
field_attr_lastname: Atribut del cognom
|
field_attr_lastname: Atribut del cognom
|
||||||
field_attr_mail: Atribut del correu electrònic
|
field_attr_mail: Atribut del correu electrònic
|
||||||
field_onthefly: "Creació de l'usuari «al vol»"
|
field_onthefly: "Creació de l'usuari «al vol»"
|
||||||
field_start_date: Inici
|
|
||||||
field_done_ratio: % realitzat
|
field_done_ratio: % realitzat
|
||||||
field_auth_source: "Mode d'autenticació"
|
field_auth_source: "Mode d'autenticació"
|
||||||
field_hide_mail: "Oculta l'adreça de correu electrònic"
|
field_hide_mail: "Oculta l'adreça de correu electrònic"
|
||||||
@@ -251,6 +282,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 +292,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 +330,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 +373,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 +403,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 +414,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 +467,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 +493,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 +528,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 +587,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 +611,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 +651,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 +689,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 +706,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 +753,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 +796,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 +812,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,9 +837,13 @@ 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_tip_task_begin_day: "tasca que s'inicia aquest dia"
|
text_journal_changed: "{{label}} ha canviat de {{old}} a {{new}}"
|
||||||
text_tip_task_end_day: tasca que finalitza aquest dia
|
text_journal_set_to: "{{label}} s'ha establert a {{value}}"
|
||||||
text_tip_task_begin_end_day: "tasca que s'inicia i finalitza aquest dia"
|
text_journal_deleted: "{{label}} s'ha suprimit ({{old}})"
|
||||||
|
text_journal_added: "S'ha afegit {{label}} {{value}}"
|
||||||
|
text_tip_issue_begin_day: "tasca que s'inicia aquest dia"
|
||||||
|
text_tip_issue_end_day: tasca que finalitza aquest dia
|
||||||
|
text_tip_issue_begin_end_day: "tasca que s'inicia i finalitza aquest dia"
|
||||||
text_project_identifier_info: "Es permeten lletres en minúscules (a-z), números i guions.<br />Un cop desat, l'identificador no es pot modificar."
|
text_project_identifier_info: "Es permeten lletres en minúscules (a-z), números i guions.<br />Un cop desat, l'identificador no es pot modificar."
|
||||||
text_caracters_maximum: "{{count}} caràcters com a màxim."
|
text_caracters_maximum: "{{count}} caràcters com a màxim."
|
||||||
text_caracters_minimum: "Com a mínim ha de tenir {{count}} caràcters."
|
text_caracters_minimum: "Com a mínim ha de tenir {{count}} caràcters."
|
||||||
@@ -745,6 +851,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 +872,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 +913,13 @@ 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
|
field_start_date: Start date
|
||||||
mail_subject_wiki_content_updated: "'{{page}}' wiki page has been updated"
|
label_principal_search: "Search for user or group:"
|
||||||
label_wiki_content_added: Wiki page added
|
label_user_search: "Search for user:"
|
||||||
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
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user