Merge branch 'master' into backbone.ws
This commit is contained in:
commit
1e908da66c
|
@ -31,3 +31,4 @@ doc/app
|
|||
/.rvmrc*
|
||||
/*.iml
|
||||
/.idea
|
||||
.rbx
|
||||
|
|
|
@ -0,0 +1,34 @@
|
|||
language: ruby
|
||||
rvm:
|
||||
- 1.8.7
|
||||
- 1.9.2
|
||||
- 1.9.3
|
||||
- rbx-18mode
|
||||
env:
|
||||
- "RAILS_ENV=test DB=mysql BUNDLE_WITHOUT=rmagick:mysql2:postgres:sqlite"
|
||||
- "RAILS_ENV=test DB=mysql2 BUNDLE_WITHOUT=rmagick:mysql:postgres:sqlite"
|
||||
- "RAILS_ENV=test DB=postgres BUNDLE_WITHOUT=rmagick:mysql:mysql2:sqlite"
|
||||
- "RAILS_ENV=test DB=sqlite BUNDLE_WITHOUT=rmagick:mysql:mysql2:postgres"
|
||||
matrix:
|
||||
exclude:
|
||||
- rvm: 1.9.2
|
||||
env: "RAILS_ENV=test DB=mysql BUNDLE_WITHOUT=rmagick:mysql2:postgres:sqlite"
|
||||
- rvm: 1.9.3
|
||||
env: "RAILS_ENV=test DB=mysql BUNDLE_WITHOUT=rmagick:mysql2:postgres:sqlite"
|
||||
- rvm: rbx-18mode
|
||||
env: "RAILS_ENV=test DB=mysql BUNDLE_WITHOUT=rmagick:mysql2:postgres:sqlite"
|
||||
allow_failures:
|
||||
- rvm: rbx-18mode
|
||||
before_script:
|
||||
- "sudo apt-get --no-install-recommends install bzr cvs darcs git mercurial subversion"
|
||||
- "rake ci:travis:prepare"
|
||||
branches:
|
||||
only:
|
||||
- unstable
|
||||
- master
|
||||
- stable
|
||||
- /^stable-.*$/
|
||||
- /^release-.*$/
|
||||
notifications:
|
||||
email: false
|
||||
irc: "irc.freenode.org#chiliproject"
|
7
Gemfile
7
Gemfile
|
@ -9,6 +9,7 @@ gem "rubytree", "~> 0.5.2", :require => 'tree'
|
|||
gem "rdoc", ">= 2.4.2"
|
||||
gem "liquid", "~> 2.3.0"
|
||||
gem "acts-as-taggable-on", "= 2.1.0"
|
||||
gem 'gravatarify', '~> 3.0.0'
|
||||
# Needed only on RUBY_VERSION = 1.8, ruby 1.9+ compatible interpreters should bring their csv
|
||||
gem "fastercsv", "~> 1.5.0", :platforms => [:ruby_18, :jruby, :mingw_18]
|
||||
# need for automatic encoding detection in diff,annotate and cat
|
||||
|
@ -17,6 +18,8 @@ gem "tzinfo", "~> 0.3.31" # Fixes #903. Not required for Rails >= 3.2
|
|||
|
||||
group :test do
|
||||
gem 'shoulda', '~> 2.10.3'
|
||||
# Shoulda doesn't work nice on 1.9.3 and seems to need test-unit explicitely…
|
||||
gem 'test-unit', :platforms => [:mri_19]
|
||||
gem 'edavis10-object_daddy', :require => 'object_daddy'
|
||||
gem 'mocha'
|
||||
gem 'capybara'
|
||||
|
@ -54,7 +57,7 @@ end
|
|||
# orders of magnitude compared to their native counterparts. You have been
|
||||
# warned.
|
||||
|
||||
platforms :mri, :mingw do
|
||||
platforms :mri, :mingw, :rbx do
|
||||
group :mysql2 do
|
||||
gem "mysql2", "~> 0.2.7"
|
||||
end
|
||||
|
@ -76,7 +79,7 @@ platforms :mri_18, :mingw_18 do
|
|||
end
|
||||
end
|
||||
|
||||
platforms :mri_19, :mingw_19 do
|
||||
platforms :mri_19, :mingw_19, :rbx do
|
||||
group :sqlite do
|
||||
gem "sqlite3"
|
||||
end
|
||||
|
|
|
@ -77,7 +77,7 @@ class AdminController < ApplicationController
|
|||
def info
|
||||
@db_adapter_name = ActiveRecord::Base.connection.adapter_name
|
||||
@checklist = [
|
||||
[:text_default_administrator_account_changed, User.find(:first, :conditions => ["login=? and hashed_password=?", 'admin', User.hash_password('admin')]).nil?],
|
||||
[:text_default_administrator_account_changed, !User.find_by_login("admin").try(:check_password?, "admin")],
|
||||
[:text_file_repository_writable, File.writable?(Attachment.storage_path)],
|
||||
[:text_plugin_assets_writable, File.writable?(Engines.public_directory)],
|
||||
[:text_rmagick_available, Object.const_defined?(:Magick)]
|
||||
|
|
|
@ -31,18 +31,6 @@ class ApplicationController < ActionController::Base
|
|||
cookies.delete(:autologin)
|
||||
end
|
||||
|
||||
# Remove broken cookie after upgrade from 0.8.x (#4292)
|
||||
# See https://rails.lighthouseapp.com/projects/8994/tickets/3360
|
||||
# TODO: remove it when Rails is fixed
|
||||
before_filter :delete_broken_cookies
|
||||
def delete_broken_cookies
|
||||
if cookies['_chiliproject_session'] && cookies['_chiliproject_session'] !~ /--/
|
||||
cookies.delete '_chiliproject_session'
|
||||
redirect_to home_path
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
# FIXME: Remove this when all of Rack and Rails have learned how to
|
||||
# properly use encodings
|
||||
before_filter :params_filter
|
||||
|
|
|
@ -85,7 +85,7 @@ class DocumentsController < ApplicationController
|
|||
|
||||
if attachments.present? && attachments[:files].present? && Setting.notified_events.include?('document_added')
|
||||
# TODO: refactor
|
||||
attachments.first.container.recipients.each do |recipient|
|
||||
@document.recipients.each do |recipient|
|
||||
Mailer.deliver_attachments_added(attachments[:files], recipient)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -17,7 +17,7 @@ require 'cgi'
|
|||
|
||||
module ApplicationHelper
|
||||
include Redmine::I18n
|
||||
include GravatarHelper::PublicMethods
|
||||
include Gravatarify::Helper
|
||||
|
||||
extend Forwardable
|
||||
def_delegators :wiki_helper, :wikitoolbar_for, :heads_for_wiki_formatter
|
||||
|
@ -954,6 +954,19 @@ module ApplicationHelper
|
|||
(@has_content && @has_content[name]) || false
|
||||
end
|
||||
|
||||
# Returns the gravatar image tag for the given email
|
||||
# +email+ is a string with an email address
|
||||
def gravatar(email, options={})
|
||||
gravatarify_options = {}
|
||||
gravatarify_options[:secure] = options.delete :ssl
|
||||
[:default, :size, :rating, :filetype].each {|key| gravatarify_options[key] = options.delete key}
|
||||
# Default size is 50x50 px
|
||||
gravatarify_options[:size] ||= 50
|
||||
options[:class] ||= 'gravatar'
|
||||
gravatarify_options[:html] = options
|
||||
gravatar_tag email, gravatarify_options
|
||||
end
|
||||
|
||||
# Returns the avatar image tag for the given +user+ if avatars are enabled
|
||||
# +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 = { })
|
||||
|
|
|
@ -712,7 +712,7 @@ class Issue < ActiveRecord::Base
|
|||
# The default assumption is that journals have the same permissions
|
||||
# as the journaled object, issue notes have separate permissions though
|
||||
def journal_editable_by?(journal, user)
|
||||
return true if journal.author == user && user.allowed_to?(:edit_own_issue_notes, project)
|
||||
return true if journal.user == user && user.allowed_to?(:edit_own_issue_notes, project)
|
||||
user.allowed_to? :edit_issue_notes, project
|
||||
end
|
||||
|
||||
|
|
|
@ -41,7 +41,6 @@ class Message < ActiveRecord::Base
|
|||
|
||||
acts_as_watchable
|
||||
|
||||
attr_protected :locked, :sticky
|
||||
validates_presence_of :board, :subject, :content
|
||||
validates_length_of :subject, :maximum => 255
|
||||
|
||||
|
@ -51,7 +50,7 @@ class Message < ActiveRecord::Base
|
|||
:conditions => Project.allowed_to_condition(args.first || User.current, :view_messages) } }
|
||||
|
||||
safe_attributes 'subject', 'content'
|
||||
safe_attributes 'locked', 'sticky',
|
||||
safe_attributes 'locked', 'sticky', 'board_id',
|
||||
:if => lambda {|message, user|
|
||||
user.allowed_to?(:edit_messages, message.project)
|
||||
}
|
||||
|
@ -81,9 +80,15 @@ class Message < ActiveRecord::Base
|
|||
end
|
||||
|
||||
def after_destroy
|
||||
parent.reset_last_reply_id! if parent
|
||||
board.reset_counters!
|
||||
end
|
||||
|
||||
def reset_last_reply_id!
|
||||
clid = children.present? ? children.last.id : nil
|
||||
self.update_attribute(:last_reply_id, clid)
|
||||
end
|
||||
|
||||
def sticky=(arg)
|
||||
write_attribute :sticky, (arg == true || arg.to_s == '1' ? 1 : 0)
|
||||
end
|
||||
|
|
|
@ -27,7 +27,7 @@ class Version < ActiveRecord::Base
|
|||
validates_presence_of :name
|
||||
validates_uniqueness_of :name, :scope => [:project_id]
|
||||
validates_length_of :name, :maximum => 60
|
||||
validates_format_of :effective_date, :with => /^\d{4}-\d{2}-\d{2}$/, :message => :not_a_date, :allow_nil => true
|
||||
validates_format_of :start_date, :effective_date, :with => /^\d{4}-\d{2}-\d{2}$/, :message => :not_a_date, :allow_nil => true
|
||||
validates_inclusion_of :status, :in => VERSION_STATUSES
|
||||
validates_inclusion_of :sharing, :in => VERSION_SHARINGS
|
||||
|
||||
|
@ -37,6 +37,7 @@ class Version < ActiveRecord::Base
|
|||
|
||||
safe_attributes 'name',
|
||||
'description',
|
||||
'start_date',
|
||||
'effective_date',
|
||||
'due_date',
|
||||
'wiki_page_title',
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<h2><%=l(:label_register)%> <%=link_to l(:label_login_with_open_id_option), signin_url if Setting.openid? %></h2>
|
||||
|
||||
<% form_tag({:action => 'register'}, :class => "tabular") do %>
|
||||
<% form_tag({:action => 'register'}, :class => "tabular", :autocomplete => :off) do %>
|
||||
<%= error_messages_for 'user' %>
|
||||
|
||||
<div class="box">
|
||||
|
|
|
@ -3,8 +3,7 @@
|
|||
<div class="autoscroll">
|
||||
<table class="list issues">
|
||||
<thead><tr>
|
||||
<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)}" %>
|
||||
<th class="checkbox hide-when-print"><%= link_to image_tag('toggle_check.png'), {}, :title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}" %>
|
||||
</th>
|
||||
<%= sort_header_tag('id', :caption => '#', :default_order => 'desc') %>
|
||||
<% query.columns.each do |column| %>
|
||||
|
|
|
@ -3,5 +3,4 @@
|
|||
|
||||
<%= call_hook(:view_issues_sidebar_planning_bottom) %>
|
||||
|
||||
<%= render_sidebar_queries %>
|
||||
<%= call_hook(:view_issues_sidebar_queries_bottom) %>
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
<p><%= l(:mail_body_wiki_content_added, :id => link_to(h(@wiki_content.page.pretty_title), @wiki_content_url),
|
||||
:author => h(@wiki_content.author)) %><br />
|
||||
<em><%=h @wiki_content.comments %></em></p>
|
||||
<em><%=h @wiki_content.last_journal.notes %></em></p>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<%= l(:mail_body_wiki_content_added, :id => h(@wiki_content.page.pretty_title),
|
||||
:author => h(@wiki_content.author)) %>
|
||||
<%= @wiki_content.comments %>
|
||||
<%= @wiki_content.last_journal.notes %>
|
||||
|
||||
<%= @wiki_content_url %>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<p><%= l(:mail_body_wiki_content_updated, :id => link_to(h(@wiki_content.page.pretty_title), @wiki_content_url),
|
||||
:author => h(@wiki_content.author)) %><br />
|
||||
<em><%=h @wiki_content.comments %></em></p>
|
||||
<em><%=h @wiki_content.last_journal.notes %></em></p>
|
||||
|
||||
<p><%= l(:label_view_diff) %>:<br />
|
||||
<%= link_to h(@wiki_diff_url), @wiki_diff_url %></p>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<%= l(:mail_body_wiki_content_updated, :id => h(@wiki_content.page.pretty_title),
|
||||
:author => h(@wiki_content.author)) %>
|
||||
<%= @wiki_content.comments %>
|
||||
<%= @wiki_content.last_journal.notes %>
|
||||
|
||||
<%= @wiki_content.page.pretty_title %>:
|
||||
<%= @wiki_content_url %>
|
||||
|
|
|
@ -115,4 +115,78 @@ module ActionController
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
# Backported fix for
|
||||
# CVE-2012-2660
|
||||
# https://groups.google.com/group/rubyonrails-security/browse_thread/thread/f1203e3376acec0f
|
||||
#
|
||||
# CVE-2012-2694
|
||||
# https://groups.google.com/group/rubyonrails-security/browse_thread/thread/8c82d9df8b401c5e
|
||||
#
|
||||
# TODO: Remove this once we are on Rails >= 3.2.6
|
||||
require 'action_controller/request'
|
||||
class Request
|
||||
protected
|
||||
|
||||
# Remove nils from the params hash
|
||||
def deep_munge(hash)
|
||||
keys = hash.keys.find_all { |k| hash[k] == [nil] }
|
||||
keys.each { |k| hash[k] = nil }
|
||||
|
||||
hash.each_value do |v|
|
||||
case v
|
||||
when Array
|
||||
v.grep(Hash) { |x| deep_munge(x) }
|
||||
v.compact!
|
||||
when Hash
|
||||
deep_munge(v)
|
||||
end
|
||||
end
|
||||
|
||||
hash
|
||||
end
|
||||
|
||||
def parse_query(qs)
|
||||
deep_munge(super)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# Backported fix for CVE-2012-2695
|
||||
# https://groups.google.com/group/rubyonrails-security/browse_thread/thread/9782f44c4540cf59
|
||||
# TODO: Remove this once we are on Rails >= 3.2.6
|
||||
require 'active_record/base'
|
||||
module ActiveRecord
|
||||
class Base
|
||||
class << self
|
||||
def sanitize_sql_hash_for_conditions(attrs, default_table_name = quoted_table_name, top_level = true)
|
||||
attrs = expand_hash_conditions_for_aggregates(attrs)
|
||||
|
||||
conditions = attrs.map do |attr, value|
|
||||
table_name = default_table_name
|
||||
|
||||
if not value.is_a?(Hash)
|
||||
attr = attr.to_s
|
||||
|
||||
# Extract table name from qualified attribute names.
|
||||
if attr.include?('.') and top_level
|
||||
attr_table_name, attr = attr.split('.', 2)
|
||||
attr_table_name = connection.quote_table_name(attr_table_name)
|
||||
else
|
||||
attr_table_name = table_name
|
||||
end
|
||||
|
||||
attribute_condition("#{attr_table_name}.#{connection.quote_column_name(attr)}", value)
|
||||
elsif top_level
|
||||
sanitize_sql_hash_for_conditions(value, connection.quote_table_name(attr.to_s), false)
|
||||
else
|
||||
raise ActiveRecord::StatementInvalid
|
||||
end
|
||||
end.join(' AND ')
|
||||
|
||||
replace_bind_variables(conditions, expand_range_bind_variables(attrs.values))
|
||||
end
|
||||
alias_method :sanitize_sql_hash, :sanitize_sql_hash_for_conditions
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -983,22 +983,22 @@ bg:
|
|||
description_choose_project: Проекти
|
||||
description_date_from: Въведете начална дата
|
||||
label_deleted_custom_field: (изтрито потребителско поле)
|
||||
field_custom_filter: Custom LDAP filter
|
||||
text_display_subprojects: Display subprojects
|
||||
text_current_project: Current project
|
||||
label_toc: Contents
|
||||
search_input_placeholder: search ...
|
||||
setting_mail_handler_confirmation_on_success: Send confirmation email on successful incoming email
|
||||
label_mail_handler_confirmation: "Confirmation of email submission: %{subject}"
|
||||
label_mail_handler_errors_with_submission: "There were errors with your email submission:"
|
||||
label_document_watchers: Watchers
|
||||
setting_mail_handler_confirmation_on_failure: Send confirmation email on failed incoming email
|
||||
field_custom_filter: Потребителски LDAP филтър
|
||||
text_display_subprojects: Показване на подпроекти
|
||||
text_current_project: Текущ проект
|
||||
label_toc: Съдържание
|
||||
search_input_placeholder: търсене ...
|
||||
setting_mail_handler_confirmation_on_success: Изпращане на е-мейл за потвърждение при успешен входен е-мейл
|
||||
label_mail_handler_confirmation: "Потвърждение на изпратено с е-мейл: %{subject}"
|
||||
label_mail_handler_errors_with_submission: "Има грешки във вашия е-мейл:"
|
||||
label_document_watchers: Наблюдатели
|
||||
setting_mail_handler_confirmation_on_failure: Изпращане на е-мейл за потвърждение при неуспешен входен е-мейл
|
||||
label_between: between
|
||||
label_mail_handler_failure: "Failed email submission: %{subject}"
|
||||
notice_not_authorized_action: You are not authorized to perform this action.
|
||||
text_mail_handler_confirmation_successful: Your email has been successful added at the following url
|
||||
field_issue_summary: Issue summary
|
||||
field_new_saved_query: New saved query
|
||||
field_issue_view_all_open: View all open issues
|
||||
label_subtask_add: Add a subtask
|
||||
label_issue_hierarchy: Issue hierarchy
|
||||
label_mail_handler_failure: "Пропаднал е-мейл: %{subject}"
|
||||
notice_not_authorized_action: Вие нямате разрешение да изпълните това действие.
|
||||
text_mail_handler_confirmation_successful: Вашият е-мейл беше успешно добавен на следващия адрес
|
||||
field_issue_summary: Заглавие на задачата
|
||||
field_new_saved_query: Нова записана заявка
|
||||
field_issue_view_all_open: Разглеждане на всички отворени задачи
|
||||
label_subtask_add: Добавяне на подзадача
|
||||
label_issue_hierarchy: Йерархия на задачите
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -963,28 +963,28 @@ de:
|
|||
notice_gantt_chart_truncated: Die Grafik ist unvollständig, da das Maximum der anzeigbaren Aufgaben überschritten wurde (%{max})
|
||||
setting_gantt_items_limit: Maximale Anzahl von Aufgaben die im Gantt-Chart angezeigt werden.
|
||||
text_powered_by: Powered by %{link}
|
||||
label_cvs_module: Module
|
||||
label_filesystem_path: Root directory
|
||||
label_darcs_path: Root directory
|
||||
label_bazaar_path: Root directory
|
||||
label_cvs_module: Modul
|
||||
label_filesystem_path: Wurzelverzeichnis
|
||||
label_darcs_path: Wurzelverzeichnis
|
||||
label_bazaar_path: Wurzelverzeichnis
|
||||
label_cvs_path: CVSROOT
|
||||
label_git_path: Path to .git directory
|
||||
label_mercurial_path: Root directory
|
||||
label_my_queries: My custom queries
|
||||
label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee
|
||||
text_journal_changed_no_detail: "%{label} updated"
|
||||
button_expand_all: Expand all
|
||||
button_collapse_all: Collapse all
|
||||
label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author
|
||||
field_effective_date: Due date
|
||||
label_news_comment_added: Comment added to a news
|
||||
field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
|
||||
text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
|
||||
text_default_encoding: "Default: UTF-8"
|
||||
text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo)
|
||||
label_notify_member_plural: Email issue updates
|
||||
label_path_encoding: Path encoding
|
||||
text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo)
|
||||
label_git_path: Pfad zum .git Verzeichnis
|
||||
label_mercurial_path: Wurzelverzeichnis
|
||||
label_my_queries: Meine benutzerdefinierten Abfragen
|
||||
label_additional_workflow_transitions_for_assignee: Zusätzliche Workflow-Übergänge wenn das Ticket an den Benutzer zugewiesen ist
|
||||
text_journal_changed_no_detail: "%{label} aktualisiert"
|
||||
button_expand_all: Alles ausklappen
|
||||
button_collapse_all: Alles einklappen
|
||||
label_additional_workflow_transitions_for_author: Zusätzliche Workflow-Übergänge wenn der Benutzer der Autor ist
|
||||
field_effective_date: Abshlussdatum
|
||||
label_news_comment_added: "Kommentar erfolgreich hinzugefügt"
|
||||
field_warn_on_leaving_unsaved: "Warnen wenn eine Seite mit ungespeichertem Text verlassen wird"
|
||||
text_warn_on_leaving_unsaved: "Die aktuelle Seite enthält ungespeicherten Text er verloren geht wenn Sie diese Seite verlassen."
|
||||
text_default_encoding: "Standard: UTF-8"
|
||||
text_git_repo_example: Ein lokales "bare Repository" (z.B. /gitrepo, c:\gitrepo)
|
||||
label_notify_member_plural: Benachrichtigungen verschicken
|
||||
label_path_encoding: Pfadkodierung
|
||||
text_mercurial_repo_example: Lokales Projektarchiv (z.B. /hgrepo, c:\hgrepo)
|
||||
label_diff: diff
|
||||
description_filter: Filter
|
||||
description_search: Suchfeld
|
||||
|
@ -1003,19 +1003,19 @@ de:
|
|||
description_date_range_interval: Zeitraum durch Start- und Enddatum festlegen
|
||||
description_date_from: Startdatum eintragen
|
||||
description_date_to: Enddatum eintragen
|
||||
field_custom_filter: Custom LDAP filter
|
||||
field_custom_filter: Benutzerdefinierter LDAP-Filter
|
||||
label_toc: "Inhaltsverzeichnis"
|
||||
text_display_subprojects: Display subprojects
|
||||
text_current_project: Current project
|
||||
setting_mail_handler_confirmation_on_success: Send confirmation email on successful incoming email
|
||||
label_mail_handler_confirmation: "Confirmation of email submission: %{subject}"
|
||||
label_mail_handler_errors_with_submission: "There were errors with your email submission:"
|
||||
label_document_watchers: Watchers
|
||||
setting_mail_handler_confirmation_on_failure: Send confirmation email on failed incoming email
|
||||
label_between: between
|
||||
label_mail_handler_failure: "Failed email submission: %{subject}"
|
||||
notice_not_authorized_action: You are not authorized to perform this action.
|
||||
text_mail_handler_confirmation_successful: Your email has been successful added at the following url
|
||||
field_issue_summary: Issue summary
|
||||
field_new_saved_query: New saved query
|
||||
field_issue_view_all_open: View all open issues
|
||||
text_display_subprojects: Unterprojekte anzeigen
|
||||
text_current_project: Aktuelles Project
|
||||
setting_mail_handler_confirmation_on_success: Bestätigungs-E-Mail bei erfolgreich eingegangenen E-Mails versenden
|
||||
label_mail_handler_confirmation: "Bestätigung der E-Mail-Verarbeitung: %{subject}"
|
||||
label_mail_handler_errors_with_submission: "Es traten Fehler bei der E-Mail verarbeitung auf:"
|
||||
label_document_watchers: Beobachter
|
||||
setting_mail_handler_confirmation_on_failure: Bestätigungs-E-Mail bei fehlgeschlagenen eingehenden E-Mails versenden
|
||||
label_between: zwischen
|
||||
label_mail_handler_failure: "E-Mail-Versand fehlgeschlagen: %{subject}"
|
||||
notice_not_authorized_action: Sie sind für diese Aktion nicht autorisiert.
|
||||
text_mail_handler_confirmation_successful: Ihre E-Mil wurde erfolgreich zu folgender URL hinzugefügt
|
||||
field_issue_summary: Ticketübersicht
|
||||
field_new_saved_query: Neue gespeicherte Abfrage
|
||||
field_issue_view_all_open: Alle offen Tickets
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
# French translations for Ruby on Rails
|
||||
# French translations for Ruby on Rails and ChiliProject
|
||||
# by Christian Lescuyer (christian@flyingcoders.com)
|
||||
# contributor: Sebastien Grosjean - ZenCocoon.com
|
||||
# contributor: Thibaut Cuvelier - Developpez.com
|
||||
# contributor: Sébastien Santoro aka Dereckson
|
||||
|
||||
fr:
|
||||
direction: ltr
|
||||
|
@ -174,8 +175,8 @@ fr:
|
|||
notice_locking_conflict: Les données ont été mises à jour par un autre utilisateur. Mise à jour impossible.
|
||||
notice_not_authorized: "Vous n'êtes pas autorisé à accéder à cette page."
|
||||
notice_not_authorized_archived_project: Le projet auquel vous tentez d'accéder a été archivé.
|
||||
notice_email_sent: "Un email a été envoyé à %{value}"
|
||||
notice_email_error: "Erreur lors de l'envoi de l'email (%{value})"
|
||||
notice_email_sent: "Un e-mail a été envoyé à %{value}"
|
||||
notice_email_error: "Erreur lors de l'envoi de l'e-mail (%{value})"
|
||||
notice_feeds_access_key_reseted: "Votre clé d'accès aux flux RSS a été réinitialisée."
|
||||
notice_failed_to_save_issues: "%{count} demande(s) sur les %{total} sélectionnées n'ont pas pu être mise(s) à jour : %{ids}."
|
||||
notice_no_issue_selected: "Aucune demande sélectionnée ! Cochez les demandes que vous voulez mettre à jour."
|
||||
|
@ -223,7 +224,7 @@ fr:
|
|||
field_is_required: Obligatoire
|
||||
field_firstname: Prénom
|
||||
field_lastname: Nom
|
||||
field_mail: "Email "
|
||||
field_mail: "E-mail "
|
||||
field_filename: Fichier
|
||||
field_filesize: Taille
|
||||
field_downloads: Téléchargements
|
||||
|
@ -253,12 +254,12 @@ fr:
|
|||
field_fixed_version: Version cible
|
||||
field_user: Utilisateur
|
||||
field_role: Rôle
|
||||
field_homepage: "Site web "
|
||||
field_homepage: "Site Web "
|
||||
field_is_public: Public
|
||||
field_parent: Sous-projet de
|
||||
field_is_in_roadmap: Demandes affichées dans la roadmap
|
||||
field_is_in_roadmap: Demandes affichées dans la feuille de route
|
||||
field_login: "Identifiant "
|
||||
field_mail_notification: Notifications par mail
|
||||
field_mail_notification: Notifications par e-mail
|
||||
field_admin: Administrateur
|
||||
field_last_login_on: "Dernière connexion "
|
||||
field_language: Langue
|
||||
|
@ -279,7 +280,7 @@ fr:
|
|||
field_start_date: Début
|
||||
field_done_ratio: "% réalisé"
|
||||
field_auth_source: Mode d'authentification
|
||||
field_hide_mail: Cacher mon adresse mail
|
||||
field_hide_mail: Cacher mon adresse e-mail
|
||||
field_comments: Commentaire
|
||||
field_url: URL
|
||||
field_start_page: Page de démarrage
|
||||
|
@ -321,10 +322,10 @@ fr:
|
|||
setting_issues_export_limit: Limite export demandes
|
||||
setting_mail_from: Adresse d'émission
|
||||
setting_bcc_recipients: Destinataires en copie cachée (cci)
|
||||
setting_plain_text_mail: Mail texte brut (non HTML)
|
||||
setting_plain_text_mail: Mail texte brut (sans HTML)
|
||||
setting_host_name: Nom d'hôte et chemin
|
||||
setting_text_formatting: Formatage du texte
|
||||
setting_wiki_compression: Compression historique wiki
|
||||
setting_wiki_compression: Compression de l'historique du wiki
|
||||
setting_feeds_limit: Limite du contenu des flux RSS
|
||||
setting_default_projects_public: Définir les nouveaux projets comme publics par défaut
|
||||
setting_autofetch_changesets: Récupération auto. des commits
|
||||
|
@ -338,15 +339,15 @@ fr:
|
|||
setting_issue_list_default_columns: Colonnes affichées par défaut sur la liste des demandes
|
||||
setting_repositories_encodings: Encodages des dépôts
|
||||
setting_commit_logs_encoding: Encodage des messages de commit
|
||||
setting_emails_footer: Pied-de-page des emails
|
||||
setting_emails_footer: Pied-de-page des e-mails
|
||||
setting_protocol: Protocole
|
||||
setting_per_page_options: Options d'objets affichés par page
|
||||
setting_user_format: Format d'affichage des utilisateurs
|
||||
setting_activity_days_default: Nombre de jours affichés sur l'activité des projets
|
||||
setting_display_subprojects_issues: Afficher par défaut les demandes des sous-projets sur les projets principaux
|
||||
setting_enabled_scm: SCM activés
|
||||
setting_mail_handler_body_delimiters: "Tronquer les emails après l'une de ces lignes"
|
||||
setting_mail_handler_api_enabled: "Activer le WS pour la réception d'emails"
|
||||
setting_mail_handler_body_delimiters: "Tronquer les e-mails après l'une de ces lignes"
|
||||
setting_mail_handler_api_enabled: "Activer le WS pour la réception d'e-mails"
|
||||
setting_mail_handler_api_key: Clé de protection de l'API
|
||||
setting_sequential_project_identifiers: Générer des identifiants de projet séquentiels
|
||||
setting_gravatar_enabled: Afficher les Gravatar des utilisateurs
|
||||
|
@ -472,8 +473,8 @@ fr:
|
|||
label_tracker_plural: Trackers
|
||||
label_tracker_new: Nouveau tracker
|
||||
label_workflow: Workflow
|
||||
label_issue_status: Statut de demandes
|
||||
label_issue_status_plural: Statuts de demandes
|
||||
label_issue_status: Statut de demande
|
||||
label_issue_status_plural: Statuts de demande
|
||||
label_issue_status_new: Nouveau statut
|
||||
label_issue_category: Catégorie de demandes
|
||||
label_issue_category_plural: Catégories de demandes
|
||||
|
@ -646,7 +647,7 @@ fr:
|
|||
label_sort_higher: Remonter
|
||||
label_sort_lower: Descendre
|
||||
label_sort_lowest: Descendre en dernier
|
||||
label_roadmap: Roadmap
|
||||
label_roadmap: Feuille de route
|
||||
label_roadmap_due_in: "Échéance dans %{value}"
|
||||
label_roadmap_overdue: "En retard de %{value}"
|
||||
label_roadmap_no_issues: Aucune demande pour cette version
|
||||
|
@ -718,7 +719,7 @@ fr:
|
|||
label_date_to: Au
|
||||
label_language_based: Basé sur la langue de l'utilisateur
|
||||
label_sort_by: "Trier par %{value}"
|
||||
label_send_test_email: Envoyer un email de test
|
||||
label_send_test_email: Envoyer un e-mail de test
|
||||
label_feeds_access_key_created_on: "Clé d'accès RSS créée il y a %{value}"
|
||||
label_module_plural: Modules
|
||||
label_added_time_by: "Ajouté par %{author} il y a %{age}"
|
||||
|
@ -736,7 +737,7 @@ fr:
|
|||
label_user_mail_option_all: "Pour tous les événements de tous mes projets"
|
||||
label_user_mail_option_selected: "Pour tous les événements des projets sélectionnés..."
|
||||
label_user_mail_no_self_notified: "Je ne veux pas être notifié des changements que j'effectue"
|
||||
label_registration_activation_by_email: activation du compte par email
|
||||
label_registration_activation_by_email: activation du compte par e-mail
|
||||
label_registration_manual_activation: activation manuelle du compte
|
||||
label_registration_automatic_activation: activation automatique du compte
|
||||
label_display_per_page: "Par page : %{value}"
|
||||
|
@ -754,7 +755,7 @@ fr:
|
|||
label_chronological_order: Dans l'ordre chronologique
|
||||
label_reverse_chronological_order: Dans l'ordre chronologique inverse
|
||||
label_planning: Planning
|
||||
label_incoming_emails: Emails entrants
|
||||
label_incoming_emails: E-mails entrants
|
||||
label_generate_key: Générer une clé
|
||||
label_issue_watchers: Observateurs
|
||||
label_example: Exemple
|
||||
|
@ -909,7 +910,7 @@ fr:
|
|||
default_role_non_member: "Non membre "
|
||||
default_role_anonymous: "Anonyme "
|
||||
default_tracker_bug: Anomalie
|
||||
default_tracker_feature: Evolution
|
||||
default_tracker_feature: Évolution
|
||||
default_tracker_support: Assistance
|
||||
default_issue_status_new: Nouveau
|
||||
default_issue_status_in_progress: En cours
|
||||
|
@ -943,13 +944,13 @@ fr:
|
|||
text_journal_deleted: "%{label} %{old} supprimé"
|
||||
text_journal_added: "%{label} %{value} ajouté"
|
||||
enumeration_system_activity: Activité système
|
||||
label_board_sticky: Sticky
|
||||
label_board_sticky: Post-it
|
||||
label_board_locked: Verrouillé
|
||||
error_unable_delete_issue_status: Impossible de supprimer le statut de demande
|
||||
error_can_not_delete_custom_field: Impossible de supprimer le champ personnalisé
|
||||
error_unable_to_connect: Connexion impossible (%{value})
|
||||
error_can_not_remove_role: Ce rôle est utilisé et ne peut pas être supprimé.
|
||||
error_can_not_delete_tracker: Ce tracker contient des demandes et ne peut pas être supprimé.
|
||||
error_can_not_delete_tracker: "Ce tracker contenant des demandes, il ne peut pas être supprimé."
|
||||
field_principal: Principal
|
||||
notice_failed_to_save_members: "Erreur lors de la sauvegarde des membres: %{errors}."
|
||||
text_zoom_out: Zoom arrière
|
||||
|
@ -959,7 +960,7 @@ fr:
|
|||
field_time_entries: Log time
|
||||
project_module_gantt: Gantt
|
||||
project_module_calendar: Calendrier
|
||||
button_edit_associated_wikipage: "Modifier la page wiki associée: %{page_title}"
|
||||
button_edit_associated_wikipage: "Modifier la page wiki associée : %{page_title}"
|
||||
text_are_you_sure_with_children: Supprimer la demande et toutes ses sous-demandes ?
|
||||
field_text: Champ texte
|
||||
label_user_mail_option_only_owner: Seulement pour ce que j'ai créé
|
||||
|
@ -970,53 +971,53 @@ fr:
|
|||
field_member_of_group: Groupe de l'assigné
|
||||
field_assigned_to_role: Rôle de l'assigné
|
||||
setting_emails_header: En-tête des emails
|
||||
text_powered_by: Powered by %{link}
|
||||
text_powered_by: Propulsé par %{link}
|
||||
label_cvs_module: Module
|
||||
label_filesystem_path: Root directory
|
||||
label_darcs_path: Root directory
|
||||
label_bazaar_path: Root directory
|
||||
label_filesystem_path: Dossier parent
|
||||
label_darcs_path: Dossier parent
|
||||
label_bazaar_path: Dossier parent
|
||||
label_cvs_path: CVSROOT
|
||||
label_git_path: Path to .git directory
|
||||
label_mercurial_path: Root directory
|
||||
field_effective_date: Due date
|
||||
text_default_encoding: "Default: UTF-8"
|
||||
text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo)
|
||||
label_git_path: Dossier .git
|
||||
label_mercurial_path: Dossier parent
|
||||
field_effective_date: Échéance
|
||||
text_default_encoding: "par défaut, UTF-8"
|
||||
text_git_repo_example: un dépôt local et nu (ex. /gitrepo, c:\gitrepo)
|
||||
label_notify_member_plural: Email issue updates
|
||||
label_path_encoding: Path encoding
|
||||
text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo)
|
||||
description_search: Searchfield
|
||||
label_path_encoding: Encodage du dossier
|
||||
text_mercurial_repo_example: dépôt local (ex. /hgrepo, c:\hgrepo)
|
||||
description_search: Case de recherche
|
||||
description_user_mail_notification: Mail notification settings
|
||||
description_date_range_list: Choose range from list
|
||||
description_date_to: Enter end date
|
||||
description_query_sort_criteria_attribute: Sort attribute
|
||||
description_message_content: Message content
|
||||
description_message_content: Contenu du message
|
||||
description_wiki_subpages_reassign: Choose new parent page
|
||||
description_available_columns: Available Columns
|
||||
description_selected_columns: Selected Columns
|
||||
description_date_range_interval: Choose range by selecting start and end date
|
||||
description_project_scope: Search scope
|
||||
description_issue_category_reassign: Choose issue category
|
||||
description_query_sort_criteria_direction: Sort direction
|
||||
description_available_columns: Colonnes disponibles
|
||||
description_selected_columns: Colonnes sélectionnées
|
||||
description_date_range_interval: Choisissez l'intervalle de date en sélectionnant une date de début et une date de fin
|
||||
description_project_scope: Portée de recherche
|
||||
description_issue_category_reassign: Sélectionnez la catégorie de la demande
|
||||
description_query_sort_criteria_direction: Tri par direction
|
||||
description_notes: Notes
|
||||
description_filter: Filter
|
||||
description_choose_project: Projects
|
||||
description_date_from: Enter start date
|
||||
field_custom_filter: Custom LDAP filter
|
||||
text_display_subprojects: Display subprojects
|
||||
text_current_project: Current project
|
||||
label_toc: Contents
|
||||
search_input_placeholder: search ...
|
||||
setting_mail_handler_confirmation_on_success: Send confirmation email on successful incoming email
|
||||
label_mail_handler_confirmation: "Confirmation of email submission: %{subject}"
|
||||
label_mail_handler_errors_with_submission: "There were errors with your email submission:"
|
||||
label_document_watchers: Watchers
|
||||
setting_mail_handler_confirmation_on_failure: Send confirmation email on failed incoming email
|
||||
label_between: between
|
||||
label_mail_handler_failure: "Failed email submission: %{subject}"
|
||||
notice_not_authorized_action: You are not authorized to perform this action.
|
||||
text_mail_handler_confirmation_successful: Your email has been successful added at the following url
|
||||
field_issue_summary: Issue summary
|
||||
field_new_saved_query: New saved query
|
||||
field_issue_view_all_open: View all open issues
|
||||
label_subtask_add: Add a subtask
|
||||
label_issue_hierarchy: Issue hierarchy
|
||||
description_filter: Filtrer
|
||||
description_choose_project: Projets
|
||||
description_date_from: Entrer la date du début
|
||||
field_custom_filter: Filtre LDAP personnalisé
|
||||
text_display_subprojects: Afficher les sous-projets
|
||||
text_current_project: Project en cours
|
||||
label_toc: Table des matières
|
||||
search_input_placeholder: recherche ...
|
||||
setting_mail_handler_confirmation_on_success: Envoyer un e-mail
|
||||
label_mail_handler_confirmation: "Confirmation de l 'envoi d'un e-mail : %{subject}"
|
||||
label_mail_handler_errors_with_submission: "Des erreurs sont survenues lors de l'envoi de votre e-mail :"
|
||||
label_document_watchers: Observateurs
|
||||
setting_mail_handler_confirmation_on_failure: Envoyez une confirmation en cas d'erreur d'e-mail entrant
|
||||
label_between: entre
|
||||
label_mail_handler_failure: "Erreur d'envoi d'e-mail : %{subject}"
|
||||
notice_not_authorized_action: Vous n'êtes pas autoriser à effectuer cette action.
|
||||
text_mail_handler_confirmation_successful: Votre e-mail a été ajouté avec succès à l'adresse suivante
|
||||
field_issue_summary: Rapports
|
||||
field_new_saved_query: Nouveau rapport
|
||||
field_issue_view_all_open: Demandes ouvertes
|
||||
label_subtask_add: Ajouter une sous-tâche
|
||||
label_issue_hierarchy: Hiérarchie de la demande
|
||||
|
|
|
@ -154,7 +154,7 @@ pt-BR:
|
|||
general_text_Yes: 'Sim'
|
||||
general_text_no: 'não'
|
||||
general_text_yes: 'sim'
|
||||
general_lang_name: 'Português(Brasil)'
|
||||
general_lang_name: 'Português (Brasil)'
|
||||
general_csv_separator: ';'
|
||||
general_csv_decimal_separator: ','
|
||||
general_csv_encoding: ISO-8859-1
|
||||
|
@ -245,7 +245,7 @@ pt-BR:
|
|||
field_role: Cargo
|
||||
field_homepage: Página do projeto
|
||||
field_is_public: Público
|
||||
field_parent: Sub-projeto de
|
||||
field_parent: Subprojeto de
|
||||
field_is_in_roadmap: Exibir no planejamento
|
||||
field_login: Usuário
|
||||
field_mail_notification: Notificações por e-mail
|
||||
|
@ -273,7 +273,7 @@ pt-BR:
|
|||
field_comments: Comentário
|
||||
field_url: URL
|
||||
field_start_page: Página inicial
|
||||
field_subproject: Sub-projeto
|
||||
field_subproject: Subprojeto
|
||||
field_hours: Horas
|
||||
field_activity: Atividade
|
||||
field_spent_on: Data
|
||||
|
@ -411,8 +411,8 @@ pt-BR:
|
|||
label_auth_source: Modo de autenticação
|
||||
label_auth_source_new: Novo modo de autenticação
|
||||
label_auth_source_plural: Modos de autenticação
|
||||
label_subproject_plural: Sub-projetos
|
||||
label_and_its_subprojects: "%{value} e seus sub-projetos"
|
||||
label_subproject_plural: Subprojetos
|
||||
label_and_its_subprojects: "%{value} e seus subprojetos"
|
||||
label_min_max_length: Tamanho mín-máx
|
||||
label_list: Lista
|
||||
label_date: Data
|
||||
|
@ -879,7 +879,7 @@ pt-BR:
|
|||
field_sharing: Compartilhamento
|
||||
label_version_sharing_hierarchy: Com a hierarquia do projeto
|
||||
label_version_sharing_system: Com todos os projetos
|
||||
label_version_sharing_descendants: Com sub-projetos
|
||||
label_version_sharing_descendants: Com subprojetos
|
||||
label_version_sharing_tree: Com a árvore do projeto
|
||||
label_version_sharing_none: Sem compartilhamento
|
||||
error_can_not_archive_project: Este projeto não pode ser arquivado
|
||||
|
@ -989,7 +989,7 @@ pt-BR:
|
|||
label_mercurial_path: Diretório raiz
|
||||
|
||||
label_diff: diff
|
||||
description_search: Searchfield
|
||||
description_search: Campo de pesquisa
|
||||
description_user_mail_notification: Configuração de notificações por e-mail
|
||||
description_date_range_list: Escolha um período a partira da lista
|
||||
description_date_to: Digite a data final
|
||||
|
@ -1008,21 +1008,21 @@ pt-BR:
|
|||
description_date_from: Digita a data inicial
|
||||
label_deleted_custom_field: (campo personalizado excluído)
|
||||
field_custom_filter: Custom LDAP filter
|
||||
text_display_subprojects: Display subprojects
|
||||
text_current_project: Current project
|
||||
label_toc: Contents
|
||||
search_input_placeholder: search ...
|
||||
setting_mail_handler_confirmation_on_success: Send confirmation email on successful incoming email
|
||||
label_mail_handler_confirmation: "Confirmation of email submission: %{subject}"
|
||||
label_mail_handler_errors_with_submission: "There were errors with your email submission:"
|
||||
label_document_watchers: Watchers
|
||||
setting_mail_handler_confirmation_on_failure: Send confirmation email on failed incoming email
|
||||
text_display_subprojects: Exibir subprojetos
|
||||
text_current_project: Projeto atual
|
||||
label_toc: Conteúdo
|
||||
search_input_placeholder: pesquisar ...
|
||||
setting_mail_handler_confirmation_on_success: Enviar confirmação ao receber um e-mail
|
||||
label_mail_handler_confirmation: "Confirmação de envio de e-mail: %{subject}"
|
||||
label_mail_handler_errors_with_submission: "Seu envio de email falhou:"
|
||||
label_document_watchers: Observadores
|
||||
setting_mail_handler_confirmation_on_failure: Enviar confirmação ao falhar o recebimento de um e-mail
|
||||
label_between: between
|
||||
label_mail_handler_failure: "Failed email submission: %{subject}"
|
||||
notice_not_authorized_action: You are not authorized to perform this action.
|
||||
text_mail_handler_confirmation_successful: Your email has been successful added at the following url
|
||||
field_issue_summary: Issue summary
|
||||
field_new_saved_query: New saved query
|
||||
field_issue_view_all_open: View all open issues
|
||||
label_subtask_add: Add a subtask
|
||||
label_issue_hierarchy: Issue hierarchy
|
||||
label_mail_handler_failure: "Envio de e-mail falhou: %{subject}"
|
||||
notice_not_authorized_action: Você não tem permissão para fazer isto.
|
||||
text_mail_handler_confirmation_successful: Seu e-mail foi adicionado com sucesso a URL a seguir
|
||||
field_issue_summary: Relatório
|
||||
field_new_saved_query: Nova consulta
|
||||
field_issue_view_all_open: Ver tarefas abertas
|
||||
label_subtask_add: Adicionar
|
||||
label_issue_hierarchy: Subtarefas
|
||||
|
|
|
@ -1,65 +1,42 @@
|
|||
# Swedish translation for Ruby on Rails
|
||||
# Swedish translation for Ruby on Rails and ChiliProject
|
||||
# by Johan Lundström (johanlunds@gmail.com),
|
||||
# with parts taken from http://github.com/daniel/swe_rails
|
||||
#
|
||||
# contributor: Björn Blissing
|
||||
|
||||
sv:
|
||||
number:
|
||||
# Used in number_with_delimiter()
|
||||
# These are also the defaults for 'currency', 'percentage', 'precision', and 'human'
|
||||
format:
|
||||
# Sets the separator between the units, for more precision (e.g. 1.0 / 2.0 == 0.5)
|
||||
separator: ","
|
||||
# Delimets thousands (e.g. 1,000,000 is a million) (always in groups of three)
|
||||
delimiter: "."
|
||||
# Number of decimals, behind the separator (the number 1 with a precision of 2 gives: 1.00)
|
||||
precision: 2
|
||||
# Text direction: Left-to-Right (ltr) or Right-to-Left (rtl)
|
||||
direction: ltr
|
||||
date:
|
||||
formats:
|
||||
# Use the strftime parameters for formats.
|
||||
# When no format has been given, it uses default.
|
||||
# You can provide other formats here if you like!
|
||||
default: "%Y-%m-%d"
|
||||
short: "%e %b"
|
||||
long: "%e %B, %Y"
|
||||
|
||||
# Used in number_to_currency()
|
||||
currency:
|
||||
format:
|
||||
# Where is the currency sign? %u is the currency unit, %n the number (default: $5.00)
|
||||
format: "%n %u"
|
||||
unit: "kr"
|
||||
# These three are to override number.format and are optional
|
||||
# separator: "."
|
||||
# delimiter: ","
|
||||
# precision: 2
|
||||
day_names: [söndag, måndag, tisdag, onsdag, torsdag, fredag, lördag]
|
||||
abbr_day_names: [sön, mån, tis, ons, tor, fre, lör]
|
||||
|
||||
# Used in number_to_percentage()
|
||||
percentage:
|
||||
format:
|
||||
# These three are to override number.format and are optional
|
||||
# separator:
|
||||
delimiter: ""
|
||||
# precision:
|
||||
# Don't forget the nil at the beginning; there's no such thing as a 0th month
|
||||
month_names: [~, januari, februari, mars, april, maj, juni, juli, augusti, september, oktober, november, december]
|
||||
abbr_month_names: [~, jan, feb, mar, apr, maj, jun, jul, aug, sep, okt, nov, dec]
|
||||
# Used in date_select and datime_select.
|
||||
order:
|
||||
- :day
|
||||
- :month
|
||||
- :year
|
||||
|
||||
# Used in number_to_precision()
|
||||
precision:
|
||||
format:
|
||||
# These three are to override number.format and are optional
|
||||
# separator:
|
||||
delimiter: ""
|
||||
# precision:
|
||||
time:
|
||||
formats:
|
||||
default: "%Y-%m-%d %H:%M"
|
||||
time: "%H:%M"
|
||||
short: "%d %b %H:%M"
|
||||
long: "%d %B, %Y %H:%M"
|
||||
am: ""
|
||||
pm: ""
|
||||
|
||||
# Used in number_to_human_size()
|
||||
human:
|
||||
format:
|
||||
# These three are to override number.format and are optional
|
||||
# separator:
|
||||
delimiter: ""
|
||||
# precision: 1
|
||||
storage_units:
|
||||
format: "%n %u"
|
||||
units:
|
||||
byte:
|
||||
one: "Byte"
|
||||
other: "Bytes"
|
||||
kb: "kB"
|
||||
mb: "MB"
|
||||
gb: "GB"
|
||||
tb: "TB"
|
||||
|
||||
# Used in distance_of_time_in_words(), distance_of_time_in_words_to_now(), time_ago_in_words()
|
||||
datetime:
|
||||
distance_in_words:
|
||||
half_a_minute: "en halv minut"
|
||||
|
@ -97,16 +74,67 @@ sv:
|
|||
one: "nästan 1 år"
|
||||
other: "nästan %{count} år"
|
||||
|
||||
number:
|
||||
format:
|
||||
separator: ","
|
||||
delimiter: "."
|
||||
precision: 2
|
||||
|
||||
# Used in number_to_currency()
|
||||
currency:
|
||||
format:
|
||||
# Where is the currency sign? %u is the currency unit, %n the number (default: $5.00)
|
||||
format: "%n %u"
|
||||
unit: "SEK"
|
||||
# These three are to override number.format and are optional
|
||||
# separator: "."
|
||||
# delimiter: ","
|
||||
# precision: 2
|
||||
|
||||
# Used in number_to_percentage()
|
||||
percentage:
|
||||
format:
|
||||
# These three are to override number.format and are optional
|
||||
# separator:
|
||||
delimiter: ""
|
||||
# precision:
|
||||
|
||||
# Used in number_to_precision()
|
||||
precision:
|
||||
format:
|
||||
# These three are to override number.format and are optional
|
||||
# separator:
|
||||
delimiter: ""
|
||||
# precision:
|
||||
|
||||
human:
|
||||
format:
|
||||
delimiter: ""
|
||||
precision: 1
|
||||
storage_units:
|
||||
format: "%n %u"
|
||||
units:
|
||||
byte:
|
||||
one: "Byte"
|
||||
other: "Bytes"
|
||||
kb: "kB"
|
||||
mb: "MB"
|
||||
gb: "GB"
|
||||
tb: "TB"
|
||||
|
||||
|
||||
# Used in array.to_sentence.
|
||||
support:
|
||||
array:
|
||||
sentence_connector: "och"
|
||||
skip_last_comma: true
|
||||
|
||||
activerecord:
|
||||
errors:
|
||||
template:
|
||||
header:
|
||||
one: "Ett fel förhindrade denna %{model} från att sparas"
|
||||
other: "%{count} fel förhindrade denna %{model} från att sparas"
|
||||
# The variable :count is also available
|
||||
body: "Det var problem med följande fält:"
|
||||
# The values :model, :attribute and :value are always available for interpolation
|
||||
# The value :count is available when applicable. Can be used for pluralization.
|
||||
messages:
|
||||
inclusion: "finns inte i listan"
|
||||
exclusion: "är reserverat"
|
||||
|
@ -120,6 +148,7 @@ sv:
|
|||
wrong_length: "har fel längd (ska vara %{count} tecken)"
|
||||
taken: "har redan tagits"
|
||||
not_a_number: "är inte ett nummer"
|
||||
not_a_date: "är inte ett giltigt datum"
|
||||
greater_than: "måste vara större än %{count}"
|
||||
greater_than_or_equal_to: "måste vara större än eller lika med %{count}"
|
||||
equal_to: "måste vara samma som"
|
||||
|
@ -132,43 +161,6 @@ sv:
|
|||
circular_dependency: "Denna relation skulle skapa ett cirkulärt beroende"
|
||||
cant_link_an_issue_with_a_descendant: "An issue can not be linked to one of its subtasks"
|
||||
|
||||
direction: ltr
|
||||
date:
|
||||
formats:
|
||||
# Use the strftime parameters for formats.
|
||||
# When no format has been given, it uses default.
|
||||
# You can provide other formats here if you like!
|
||||
default: "%Y-%m-%d"
|
||||
short: "%e %b"
|
||||
long: "%e %B, %Y"
|
||||
|
||||
day_names: [söndag, måndag, tisdag, onsdag, torsdag, fredag, lördag]
|
||||
abbr_day_names: [sön, mån, tis, ons, tor, fre, lör]
|
||||
|
||||
# Don't forget the nil at the beginning; there's no such thing as a 0th month
|
||||
month_names: [~, januari, februari, mars, april, maj, juni, juli, augusti, september, oktober, november, december]
|
||||
abbr_month_names: [~, jan, feb, mar, apr, maj, jun, jul, aug, sep, okt, nov, dec]
|
||||
# Used in date_select and datime_select.
|
||||
order:
|
||||
- :day
|
||||
- :month
|
||||
- :year
|
||||
|
||||
time:
|
||||
formats:
|
||||
default: "%Y-%m-%d %H:%M"
|
||||
time: "%H:%M"
|
||||
short: "%d %b %H:%M"
|
||||
long: "%d %B, %Y %H:%M"
|
||||
am: ""
|
||||
pm: ""
|
||||
|
||||
# Used in array.to_sentence.
|
||||
support:
|
||||
array:
|
||||
sentence_connector: "och"
|
||||
skip_last_comma: true
|
||||
|
||||
actionview_instancetag_blank_option: Var god välj
|
||||
|
||||
general_text_No: 'Nej'
|
||||
|
@ -198,6 +190,7 @@ sv:
|
|||
notice_file_not_found: Sidan du försökte komma åt existerar inte eller är borttagen.
|
||||
notice_locking_conflict: Data har uppdaterats av en annan användare.
|
||||
notice_not_authorized: Du saknar behörighet att komma åt den här sidan.
|
||||
notice_not_authorized_action: Du saknar behörighet att utföra denna handling.
|
||||
notice_not_authorized_archived_project: Projektet du försöker komma åt har arkiverats.
|
||||
notice_email_sent: "Ett mail skickades till %{value}"
|
||||
notice_email_error: "Ett fel inträffade när mail skickades (%{value})"
|
||||
|
@ -230,7 +223,6 @@ sv:
|
|||
error_workflow_copy_target: 'Vänligen välj ärendetyp(er) och roll(er) för mål'
|
||||
error_unable_delete_issue_status: 'Ärendestatus kunde inte tas bort'
|
||||
error_unable_to_connect: "Kan inte ansluta (%{value})"
|
||||
|
||||
warning_attachments_not_saved: "%{count} fil(er) kunde inte sparas."
|
||||
|
||||
mail_subject_lost_password: "Ditt %{value} lösenord"
|
||||
|
@ -243,8 +235,8 @@ sv:
|
|||
mail_body_account_activation_request: "En ny användare (%{value}) har registrerat sig och avvaktar ditt godkännande:"
|
||||
mail_subject_reminder: "%{count} ärende(n) har deadline under de kommande %{days} dagarna"
|
||||
mail_body_reminder: "%{count} ärende(n) som är tilldelat dig har deadline under de %{days} dagarna:"
|
||||
mail_subject_wiki_content_added: "'%{id}' wikisida has lagts till"
|
||||
mail_body_wiki_content_added: "The '%{id}' wikisida has lagts till av %{author}."
|
||||
mail_subject_wiki_content_added: "'%{id}' wikisida har lagts till"
|
||||
mail_body_wiki_content_added: "The '%{id}' wikisida har lagts till av %{author}."
|
||||
mail_subject_wiki_content_updated: "'%{id}' wikisida har uppdaterats"
|
||||
mail_body_wiki_content_updated: "The '%{id}' wikisida har uppdaterats av %{author}."
|
||||
|
||||
|
@ -286,7 +278,7 @@ sv:
|
|||
field_priority: Prioritet
|
||||
field_fixed_version: Versionsmål
|
||||
field_user: Användare
|
||||
field_principal: Principal
|
||||
field_principal: Huvudsaklig
|
||||
field_role: Roll
|
||||
field_homepage: Hemsida
|
||||
field_is_public: Publik
|
||||
|
@ -297,6 +289,7 @@ sv:
|
|||
field_admin: Administratör
|
||||
field_last_login_on: Senaste inloggning
|
||||
field_language: Språk
|
||||
field_effective_date: Förfallodag
|
||||
field_password: Lösenord
|
||||
field_new_password: Nytt lösenord
|
||||
field_password_confirmation: Bekräfta lösenord
|
||||
|
@ -348,6 +341,10 @@ sv:
|
|||
field_text: Textfält
|
||||
field_visible: Synlig
|
||||
field_warn_on_leaving_unsaved: Varna om jag lämnar en sida med osparad text
|
||||
field_custom_filter: Anpassat LDAP filter
|
||||
field_issue_summary: Sammanfattning av ärendet
|
||||
field_new_saved_query: Skapa ny förfrågan
|
||||
field_issue_view_all_open: Visa alla öppna ärenden
|
||||
|
||||
setting_app_title: Applikationsrubrik
|
||||
setting_app_subtitle: Applikationsunderrubrik
|
||||
|
@ -407,6 +404,9 @@ sv:
|
|||
setting_commit_logtime_enabled: Aktivera tidloggning
|
||||
setting_commit_logtime_activity_id: Aktivitet för loggad tid
|
||||
setting_gantt_items_limit: Maximalt antal aktiviteter som visas i gantt-schemat
|
||||
setting_issue_startdate_is_adddate: Använd nuvarande datum som startdatum för nya ärenden
|
||||
setting_mail_handler_confirmation_on_success: "Skicka e-postbekräftelse på framgångsrika inkommande e-post"
|
||||
setting_mail_handler_confirmation_on_failure: "Skicka e-postbekräftelse vid misslyckade inkommande e-post"
|
||||
|
||||
permission_add_project: Skapa projekt
|
||||
permission_add_subprojects: Skapa underprojekt
|
||||
|
@ -416,9 +416,9 @@ sv:
|
|||
permission_manage_project_activities: Hantera projektaktiviteter
|
||||
permission_manage_versions: Hantera versioner
|
||||
permission_manage_categories: Hantera ärendekategorier
|
||||
permission_view_issues: Visa ärenden
|
||||
permission_add_issues: Lägga till ärenden
|
||||
permission_edit_issues: Ändra ärenden
|
||||
permission_view_issues: Visa ärenden
|
||||
permission_manage_issue_relations: Hantera ärenderelationer
|
||||
permission_add_issue_notes: Lägga till ärendenotering
|
||||
permission_edit_issue_notes: Ändra ärendenoteringar
|
||||
|
@ -581,6 +581,7 @@ sv:
|
|||
label_news_latest: Senaste nyheterna
|
||||
label_news_view_all: Visa alla nyheter
|
||||
label_news_added: Nyhet tillagd
|
||||
label_news_comment_added: Kommentar tillagd till en nyhet
|
||||
label_settings: Inställningar
|
||||
label_overview: Översikt
|
||||
label_version: Version
|
||||
|
@ -648,6 +649,7 @@ sv:
|
|||
label_in_more_than: om mer än
|
||||
label_greater_or_equal: '>='
|
||||
label_less_or_equal: '<='
|
||||
label_between: "mellan"
|
||||
label_in: om
|
||||
label_today: idag
|
||||
label_all_time: närsom
|
||||
|
@ -670,8 +672,8 @@ sv:
|
|||
label_browse: Bläddra
|
||||
label_modification: "%{count} ändring"
|
||||
label_modification_plural: "%{count} ändringar"
|
||||
label_branch: Branch
|
||||
label_tag: Tag
|
||||
label_branch: Gren
|
||||
label_tag: Tagg
|
||||
label_revision: Revision
|
||||
label_revision_plural: Revisioner
|
||||
label_revision_id: "Revision %{value}"
|
||||
|
@ -695,6 +697,7 @@ sv:
|
|||
label_roadmap_overdue: "%{value} sen"
|
||||
label_roadmap_no_issues: Inga ärenden för denna version
|
||||
label_search: Sök
|
||||
search_input_placeholder: sök ...
|
||||
label_result_plural: Resultat
|
||||
label_all_words: Alla ord
|
||||
label_wiki: Wiki
|
||||
|
@ -706,7 +709,7 @@ sv:
|
|||
label_index_by_date: Innehåll efter datum
|
||||
label_current_version: Nuvarande version
|
||||
label_preview: Förhandsgranska
|
||||
label_feed_plural: Feeds
|
||||
label_feed_plural: Flöde
|
||||
label_changes_details: Detaljer om alla ändringar
|
||||
label_issue_tracking: Ärendeuppföljning
|
||||
label_spent_time: Spenderad tid
|
||||
|
@ -718,6 +721,7 @@ sv:
|
|||
label_statistics: Statistik
|
||||
label_commits_per_month: Commits per månad
|
||||
label_commits_per_author: Commits per författare
|
||||
label_diff: Skillnad
|
||||
label_view_diff: Visa skillnader
|
||||
label_diff_inline: i texten
|
||||
label_diff_side_by_side: sida vid sida
|
||||
|
@ -749,7 +753,7 @@ sv:
|
|||
label_board_new: Nytt forum
|
||||
label_board_plural: Forum
|
||||
label_board_locked: Låst
|
||||
label_board_sticky: Sticky
|
||||
label_board_sticky: Viktigt
|
||||
label_topic_plural: Ämnen
|
||||
label_message_plural: Meddelanden
|
||||
label_message_last: Senaste meddelande
|
||||
|
@ -796,7 +800,7 @@ sv:
|
|||
label_change_properties: Ändra inställningar
|
||||
label_general: Allmänt
|
||||
label_more: Mer
|
||||
label_scm: SCM
|
||||
label_scm: Versionshantering
|
||||
label_plugins: Tillägg
|
||||
label_ldap_authentication: LDAP-autentisering
|
||||
label_downloads_abbr: Nerl.
|
||||
|
@ -809,6 +813,7 @@ sv:
|
|||
label_incoming_emails: Inkommande mail
|
||||
label_generate_key: Generera en nyckel
|
||||
label_issue_watchers: Bevakare
|
||||
label_document_watchers: Bevakare
|
||||
label_example: Exempel
|
||||
label_display: Visa
|
||||
label_sort: Sortera
|
||||
|
@ -836,15 +841,35 @@ sv:
|
|||
label_api_access_key_created_on: "API-nyckel skapad för %{value} sedan"
|
||||
label_profile: Profil
|
||||
label_subtask_plural: Underaktiviteter
|
||||
label_subtask_add: Lägg till en underaktivitet
|
||||
label_issue_hierarchy: Ärendehierarki
|
||||
label_project_copy_notifications: Skicka mailnotifieringar när projektet kopieras
|
||||
label_principal_search: "Sök efter användare eller grupp:"
|
||||
label_user_search: "Sök efter användare:"
|
||||
label_git_path: Sökväg till .git katalog
|
||||
label_darcs_path: Rotkatalog
|
||||
label_mercurial_path: Rotkatalog
|
||||
label_cvs_path: CVSROOT
|
||||
label_cvs_module: Modul
|
||||
label_bazaar_path: Rotkatalog
|
||||
label_filesystem_path: Rotkatalog
|
||||
label_additional_workflow_transitions_for_assignee: Ytterligare övergångar tillåtna för tilldelad användare
|
||||
label_additional_workflow_transitions_for_author: Ytterligare övergångar tillåtna när användaren är författaren
|
||||
label_notify_member_plural: E-posta uppdateringar för ärende
|
||||
label_path_encoding: Kodning av sökväg
|
||||
label_deleted_custom_field: '(tog bort anpassat fält)'
|
||||
label_toc: "Innehåll"
|
||||
label_mail_handler_confirmation: "Bekräftelse inskickning via e-post: %{subject}"
|
||||
label_mail_handler_failure: "Inskickning via e-post misslyckades: %{subject}"
|
||||
label_mail_handler_errors_with_submission: "Det fanns fel med din inskickning via e-post:"
|
||||
|
||||
button_login: Logga in
|
||||
button_submit: Skicka
|
||||
button_save: Spara
|
||||
button_check_all: Markera alla
|
||||
button_uncheck_all: Avmarkera alla
|
||||
button_collapse_all: Minimera alla
|
||||
button_expand_all: Maximera alla
|
||||
button_delete: Ta bort
|
||||
button_create: Skapa
|
||||
button_create_and_continue: Skapa och fortsätt
|
||||
|
@ -953,20 +978,27 @@ sv:
|
|||
text_wiki_page_destroy_children: "Ta bort alla underliggande sidor"
|
||||
text_wiki_page_reassign_children: "Flytta undersidor till denna föräldersida"
|
||||
text_own_membership_delete_confirmation: "Några av, eller alla, dina behörigheter kommer att tas bort och du kanske inte längre kommer kunna göra ändringar i det här projektet.\nVill du verkligen fortsätta?"
|
||||
text_zoom_out: Zooma ut
|
||||
text_zoom_in: Zooma in
|
||||
text_zoom_out: Zooma ut
|
||||
text_powered_by: "Powered by %{link}"
|
||||
text_warn_on_leaving_unsaved: Nuvarande sida innehåller osparad text som kommer försvinna om du lämnar sidan.
|
||||
text_default_encoding: "Standard: UTF-8"
|
||||
text_mercurial_repo_example: "Lokalt arkiv (t.ex. /hgrepo, c:\\hgrepo)"
|
||||
text_git_repo_example: "Ett lokalt bare git arkiv (t.ex. /gitrepo, c:\\gitrepo)"
|
||||
text_display_subprojects: Visa underprojekt
|
||||
text_current_project: Nuvarande project
|
||||
text_mail_handler_confirmation_successful: "Din e-post har framgångsrikt lagts till på följande webbadress"
|
||||
|
||||
default_role_manager: Projektledare
|
||||
default_role_developer: Utvecklare
|
||||
default_role_reporter: Rapportör
|
||||
default_role_non_member: Non member
|
||||
default_role_anonymous: Anonymous
|
||||
default_role_non_member: Icke-medlem
|
||||
default_role_anonymous: Anonym
|
||||
default_tracker_bug: Bugg
|
||||
default_tracker_feature: Funktionalitet
|
||||
default_tracker_support: Support
|
||||
default_issue_status_new: Ny
|
||||
default_issue_status_in_progress: Pågår
|
||||
default_issue_status_in_progress: Pågående
|
||||
default_issue_status_resolved: Löst
|
||||
default_issue_status_feedback: Återkoppling
|
||||
default_issue_status_closed: Stängd
|
||||
|
@ -985,62 +1017,20 @@ sv:
|
|||
enumeration_doc_categories: Dokumentkategorier
|
||||
enumeration_activities: Aktiviteter (tidsuppföljning)
|
||||
enumeration_system_activity: Systemaktivitet
|
||||
text_powered_by: Powered by %{link}
|
||||
label_cvs_module: Module
|
||||
label_filesystem_path: Root directory
|
||||
label_darcs_path: Root directory
|
||||
label_bazaar_path: Root directory
|
||||
label_cvs_path: CVSROOT
|
||||
label_git_path: Path to .git directory
|
||||
label_mercurial_path: Root directory
|
||||
|
||||
label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee
|
||||
button_expand_all: Expand all
|
||||
button_collapse_all: Collapse all
|
||||
label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author
|
||||
field_effective_date: Due date
|
||||
label_news_comment_added: Comment added to a news
|
||||
text_default_encoding: "Default: UTF-8"
|
||||
text_git_repo_example: a bare and local repository (e.g. /gitrepo, c:\gitrepo)
|
||||
label_notify_member_plural: Email issue updates
|
||||
label_path_encoding: Path encoding
|
||||
text_mercurial_repo_example: local repository (e.g. /hgrepo, c:\hgrepo)
|
||||
label_diff: diff
|
||||
setting_issue_startdate_is_adddate: Use current date as start date for new issues
|
||||
description_search: Searchfield
|
||||
description_user_mail_notification: Mail notification settings
|
||||
description_date_range_list: Choose range from list
|
||||
description_date_to: Enter end date
|
||||
description_query_sort_criteria_attribute: Sort attribute
|
||||
description_message_content: Message content
|
||||
description_wiki_subpages_reassign: Choose new parent page
|
||||
description_available_columns: Available Columns
|
||||
description_selected_columns: Selected Columns
|
||||
description_date_range_interval: Choose range by selecting start and end date
|
||||
description_project_scope: Search scope
|
||||
description_issue_category_reassign: Choose issue category
|
||||
description_query_sort_criteria_direction: Sort direction
|
||||
description_notes: Notes
|
||||
description_filter: Filter
|
||||
description_choose_project: Projects
|
||||
description_date_from: Enter start date
|
||||
label_deleted_custom_field: (deleted custom field)
|
||||
field_custom_filter: Custom LDAP filter
|
||||
text_display_subprojects: Display subprojects
|
||||
text_current_project: Current project
|
||||
label_toc: Contents
|
||||
search_input_placeholder: search ...
|
||||
setting_mail_handler_confirmation_on_success: Send confirmation email on successful incoming email
|
||||
label_mail_handler_confirmation: "Confirmation of email submission: %{subject}"
|
||||
label_mail_handler_errors_with_submission: "There were errors with your email submission:"
|
||||
label_document_watchers: Watchers
|
||||
setting_mail_handler_confirmation_on_failure: Send confirmation email on failed incoming email
|
||||
label_between: between
|
||||
label_mail_handler_failure: "Failed email submission: %{subject}"
|
||||
notice_not_authorized_action: You are not authorized to perform this action.
|
||||
text_mail_handler_confirmation_successful: Your email has been successful added at the following url
|
||||
field_issue_summary: Issue summary
|
||||
field_new_saved_query: New saved query
|
||||
field_issue_view_all_open: View all open issues
|
||||
label_subtask_add: Add a subtask
|
||||
label_issue_hierarchy: Issue hierarchy
|
||||
description_search: Sökfält
|
||||
description_choose_project: Projekt
|
||||
description_project_scope: Sökomfång
|
||||
description_notes: Noteringar
|
||||
description_message_content: Meddelandeinnehåll
|
||||
description_query_sort_criteria_attribute: Sorteringsattribut
|
||||
description_query_sort_criteria_direction: Sorteringsordning
|
||||
description_user_mail_notification: E-post notifieringsinställningar
|
||||
description_available_columns: Tillängliga kolumner
|
||||
description_selected_columns: Valda kolumner
|
||||
description_issue_category_reassign: Välj ärendekategori
|
||||
description_wiki_subpages_reassign: Välj ny huvudsida
|
||||
description_date_range_list: Välj omfång ifrån lista
|
||||
description_date_range_interval: Välj omfång genom att ange start- och slutdatum
|
||||
description_date_from: Ange startdatum
|
||||
description_date_to: Ange slutdatum
|
||||
|
|
|
@ -12,6 +12,8 @@
|
|||
# See doc/COPYRIGHT.rdoc for more details.
|
||||
#++
|
||||
|
||||
require 'wiki_content'
|
||||
|
||||
class MergeWikiVersionsWithJournals < ActiveRecord::Migration
|
||||
# This is provided here for migrating up after the WikiContent::Version class has been removed
|
||||
class WikiContent < ActiveRecord::Base
|
||||
|
|
|
@ -1,5 +1,41 @@
|
|||
= ChiliProject Changelog
|
||||
|
||||
== 2012-06-13 v3.2.2
|
||||
|
||||
* Bug #1036: Ruby on Rails Unsafe Query Generation Risk in Ruby on Rails (CVE-2012-2694)
|
||||
* Bug #1037: SQL Injection Vulnerability in Ruby on Rails (CVE-2012-2695)
|
||||
|
||||
== 2012-06-10 v3.2.1
|
||||
|
||||
* Bug #1034: Gravatar
|
||||
|
||||
== 2012-06-09 v3.2.0
|
||||
|
||||
* Bug #844: Set autocomplete=off for some fields in Registration form
|
||||
* Bug #863: missing journals fixture at test/unit/issue_test.rb
|
||||
* Bug #950: jQuery AJAX requests don't include CSRF token
|
||||
* Bug #966: "edit own notes" fails since 3.1.0
|
||||
* Bug #967: Menu - Missing translations (French)
|
||||
* Bug #968: Forum threads aren't always displaying "Last Message"
|
||||
* Bug #969: Forum URLs in the menu are missing the project_id
|
||||
* Bug #970: Long version titles extend outside the group menu when expanding Roadmap
|
||||
* Bug #974: menu link broken in duplicate issue mode
|
||||
* Bug #975: Start Date is not saved for Versions
|
||||
* Bug #984: Cannot unlock a forum thread
|
||||
* Bug #986: Notification Mail for Wiki-Changes doesn't contain change comment
|
||||
* Bug #994: select all in issue list isn't working
|
||||
* Bug #1007: Right clicking on item in roadmap displays menu at incorrect position
|
||||
* Bug #1008: error 500 when uploading a new file to an existing document
|
||||
* Bug #1024: Select multiple issues with shift key in issue list
|
||||
* Bug #1025: Rails: Unsafe Query Generation Risk in Ruby on Rails (CVE-2012-2660)
|
||||
* Bug #1033: Replace vendored gravatar lib by gem
|
||||
* Feature #749: Git Integration: Property Main Branch
|
||||
* Feature #947: Reformat the CSS files to use a standard
|
||||
* Feature #983: Bulgarian translation of several strings
|
||||
* Feature #988: Swedish translation of several strings
|
||||
* Feature #1016: Limit height of project drop down menu
|
||||
* Task #982: Updated czech localization for chiliproject 3.1
|
||||
|
||||
== 2012-04-04 v3.1.0
|
||||
|
||||
* Bug #739: Relative textile links not converted to full URLs in emails
|
||||
|
|
|
@ -1 +1,3 @@
|
|||
.icon-example-works { background-image: url(../images/it_works.png); }
|
||||
.icon-example-works {
|
||||
background-image: url(../images/it_works.png);
|
||||
}
|
||||
|
|
|
@ -18,8 +18,8 @@ module ChiliProject
|
|||
module VERSION #:nodoc:
|
||||
|
||||
MAJOR = 3
|
||||
MINOR = 1
|
||||
PATCH = 0
|
||||
MINOR = 2
|
||||
PATCH = 2
|
||||
TINY = PATCH # Redmine compat
|
||||
|
||||
# Used by semver to define the special version (if any).
|
||||
|
|
|
@ -259,7 +259,7 @@ Redmine::MenuManager.map :project_menu do |menu|
|
|||
:caption => :label_issue_plural,
|
||||
:children => issue_query_proc
|
||||
})
|
||||
menu.push(:new_issue, { :controller => 'issues', :action => 'new' }, {
|
||||
menu.push(:new_issue, { :controller => 'issues', :action => 'new', :copy_from => nil }, {
|
||||
:param => :project_id,
|
||||
:caption => :label_issue_new,
|
||||
:parent => :issues,
|
||||
|
@ -345,7 +345,7 @@ Redmine::MenuManager.map :project_menu do |menu|
|
|||
project.boards.collect do |board|
|
||||
Redmine::MenuManager::MenuItem.new(
|
||||
"board-#{board.id}".to_sym,
|
||||
{ :controller => 'boards', :action => 'show', :id => board },
|
||||
{ :controller => 'boards', :action => 'show', :project_id => project, :id => board },
|
||||
{
|
||||
:caption => board.name # is h() in menu_helper.rb
|
||||
})
|
||||
|
|
|
@ -100,6 +100,13 @@ module Redmine
|
|||
def default_branch
|
||||
bras = self.branches
|
||||
return nil if bras.nil?
|
||||
head = nil
|
||||
scm_cmd('symbolic-ref', 'HEAD') do |io|
|
||||
head = io.readline
|
||||
end
|
||||
/^refs\/heads\/(.*)$/.match(head)
|
||||
bras.include?($1) ? $1 : bras.first
|
||||
rescue ScmCommandAborted, EOFError
|
||||
bras.include?('master') ? 'master' : bras.first
|
||||
end
|
||||
|
||||
|
|
|
@ -307,7 +307,8 @@ module Redmine
|
|||
end
|
||||
blame
|
||||
rescue HgCommandAborted
|
||||
nil # means not found or cannot be annotated
|
||||
# means not found or cannot be annotated
|
||||
Annotate.new
|
||||
end
|
||||
|
||||
class Revision < Redmine::Scm::Adapters::Revision
|
||||
|
|
|
@ -24,6 +24,41 @@ end
|
|||
|
||||
# Tasks can be hooked into by redefining them in a plugin
|
||||
namespace :ci do
|
||||
namespace :travis do
|
||||
desc "Prepare a TRAVIS run"
|
||||
task :prepare do
|
||||
ENV['RAILS_ENV'] = 'test'
|
||||
RAILS_ENV = 'test'
|
||||
|
||||
database_yml = {"database" => "chiliproject_test"}
|
||||
database_yml.merge! case ENV['DB']
|
||||
when 'mysql'
|
||||
{"adapter" => "mysql", "username" => "root"}
|
||||
when 'mysql2'
|
||||
{"adapter" => "mysql2", "username" => "root"}
|
||||
when 'postgres'
|
||||
{"adapter" => "postgresql", "username" => "postgres"}
|
||||
when 'sqlite'
|
||||
{"adapter" => "sqlite3", "database" => "db/test.sqlite3"}
|
||||
end
|
||||
|
||||
File.open("config/database.yml", 'w') do |f|
|
||||
YAML.dump({"test" => database_yml}, f)
|
||||
end
|
||||
|
||||
Rake::Task["generate_session_store"].invoke
|
||||
|
||||
# Create and migrate the database
|
||||
Rake::Task["db:create"].invoke
|
||||
Rake::Task["db:migrate"].invoke
|
||||
Rake::Task["db:migrate:plugins"].invoke
|
||||
Rake::Task["db:schema:dump"].invoke
|
||||
|
||||
# Create test repositories
|
||||
Rake::Task["test:scm:setup:all"].invoke
|
||||
end
|
||||
end
|
||||
|
||||
desc "Setup Redmine for a new build."
|
||||
task :setup do
|
||||
Rake::Task["ci:dump_environment"].invoke
|
||||
|
|
|
@ -467,7 +467,15 @@ jQuery.viewportHeight = function() {
|
|||
|
||||
// Automatically use format.js for jQuery Ajax
|
||||
jQuery.ajaxSetup({
|
||||
'beforeSend': function(xhr) {xhr.setRequestHeader("Accept", "text/javascript")}
|
||||
'beforeSend': function(xhr) {
|
||||
xhr.setRequestHeader("Accept", "text/javascript");
|
||||
|
||||
// TODO: Remove once jquery-rails (Rails 3) has been added a dependency
|
||||
var csrf_meta_tag = jQuery('meta[name="csrf-token"]');
|
||||
if (csrf_meta_tag) {
|
||||
xhr.setRequestHeader('X-CSRF-Token', csrf_meta_tag.attr('content'));
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
/* TODO: integrate with existing code and/or refactor */
|
||||
|
@ -563,6 +571,13 @@ jQuery(document).ready(function($) {
|
|||
// Click on the menu header with a dropdown menu
|
||||
$('#account-nav .drop-down').live('click', function(event) {
|
||||
var menuItem = $(this);
|
||||
var menuUl = menuItem.find('> ul');
|
||||
|
||||
menuUl.css('height', 'auto');
|
||||
if(menuUl.height() > $.viewportHeight()) {
|
||||
var windowHeight = $.viewportHeight() - 150;
|
||||
menuUl.css({'height': windowHeight});
|
||||
}
|
||||
|
||||
toggleTopMenu(menuItem);
|
||||
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
var element = el;
|
||||
var opts = options;
|
||||
var observingContextMenuClick;
|
||||
var observingToggleAllClick;
|
||||
var lastSelected = null;
|
||||
var menu;
|
||||
var menuId = 'context-menu';
|
||||
|
@ -68,18 +69,17 @@
|
|||
if (lastSelected !== null)
|
||||
{
|
||||
var toggling = false;
|
||||
var rows = $(selectorName);
|
||||
for (i = 0; i < rows.length; i++)
|
||||
{
|
||||
if (toggling || rows[i] == tr)
|
||||
{
|
||||
methods.addSelection(rows[i]);
|
||||
var rows = $('.' + selectorName);
|
||||
rows.each(function() {
|
||||
var self = $(this);
|
||||
if(toggling || (self.get(0) == tr.get(0))) {
|
||||
methods.addSelection(self);
|
||||
}
|
||||
if (rows[i] == tr || rows[i] == lastSelected)
|
||||
{
|
||||
if(((self.get(0) == tr.get(0)) || (self.get(0) == lastSelected.get(0)))
|
||||
&& (tr.get(0) !== lastSelected.get(0))) {
|
||||
toggling = !toggling;
|
||||
}
|
||||
}
|
||||
});
|
||||
} else {
|
||||
methods.addSelection(tr);
|
||||
}
|
||||
|
@ -153,7 +153,7 @@
|
|||
}
|
||||
|
||||
if(maxHeight > $(window).height()) {
|
||||
renderY =+ menu.height();
|
||||
renderY -= menu.height();
|
||||
menu.addClass(reverseYClass);
|
||||
} else {
|
||||
menu.removeClass(reverseYClass);
|
||||
|
@ -174,6 +174,7 @@
|
|||
addSelection: function(element) {
|
||||
element.addClass(contextMenuSelectionClass);
|
||||
methods.checkSelectionBox(element, true);
|
||||
methods.clearDocumentSelection();
|
||||
},
|
||||
isSelected: function(element) {
|
||||
return element.hasClass(contextMenuSelectionClass);
|
||||
|
@ -194,6 +195,27 @@
|
|||
inputs.each(function() {
|
||||
inputs.attr('checked', checked ? 'checked' : false);
|
||||
});
|
||||
},
|
||||
toggleIssuesSelection: function(e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
var issues = $(this).parents('form').find('tr.issue');
|
||||
var checked = methods.isSelected(issues.eq(0));
|
||||
issues.each(function() {
|
||||
var self = $(this);
|
||||
if(checked) {
|
||||
methods.removeSelection(self)
|
||||
} else {
|
||||
methods.addSelection(self);
|
||||
}
|
||||
});
|
||||
},
|
||||
clearDocumentSelection: function() {
|
||||
if(document.selection) {
|
||||
document.selection.clear();
|
||||
} else {
|
||||
window.getSelection().removeAllRanges();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -205,6 +227,11 @@
|
|||
observingContextMenuClick = true;
|
||||
}
|
||||
|
||||
if(!observingToggleAllClick) {
|
||||
element.find('.issues img[alt="Toggle_check"]').bind('click', methods.toggleIssuesSelection);
|
||||
observingToggleAllClick = true;
|
||||
}
|
||||
|
||||
methods.unselectAll();
|
||||
};
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,14 +1,17 @@
|
|||
/* The main calendar widget. DIV containing a table. */
|
||||
|
||||
/* The main calendar widget. DIV containing a table. */
|
||||
img.calendar-trigger {
|
||||
cursor: pointer;
|
||||
vertical-align: middle;
|
||||
margin-left: 4px;
|
||||
cursor: pointer;
|
||||
vertical-align: middle;
|
||||
margin-left: 4px;
|
||||
}
|
||||
|
||||
div.calendar { position: relative; z-index: 30;}
|
||||
div.calendar {
|
||||
position: relative;
|
||||
z-index: 30;
|
||||
}
|
||||
|
||||
div.calendar, div.calendar table {
|
||||
div.calendar,
|
||||
div.calendar table {
|
||||
border: 1px solid #556;
|
||||
font-size: 11px;
|
||||
color: #000;
|
||||
|
@ -18,10 +21,9 @@ div.calendar, div.calendar table {
|
|||
}
|
||||
|
||||
/* Header part -- contains navigation buttons and day names. */
|
||||
|
||||
div.calendar .button { /* "<<", "<", ">", ">>" buttons have this class */
|
||||
text-align: center; /* They are the navigation buttons */
|
||||
padding: 2px; /* Make the buttons seem like they're pressing */
|
||||
text-align: center; /* They are the navigation buttons */
|
||||
padding: 2px; /* Make the buttons seem like they're pressing */
|
||||
}
|
||||
|
||||
div.calendar .nav {
|
||||
|
@ -29,7 +31,7 @@ div.calendar .nav {
|
|||
}
|
||||
|
||||
div.calendar thead .title { /* This holds the current "month, year" */
|
||||
font-weight: bold; /* Pressing it will take you to the current date */
|
||||
font-weight: bold; /* Pressing it will take you to the current date */
|
||||
text-align: center;
|
||||
background: #fff;
|
||||
color: #000;
|
||||
|
@ -68,17 +70,18 @@ div.calendar thead .active { /* Active (pressed) buttons in header */
|
|||
}
|
||||
|
||||
/* The body part -- contains all the days in month. */
|
||||
|
||||
div.calendar tbody .day { /* Cells <TD> containing month days dates */
|
||||
width: 2em;
|
||||
color: #456;
|
||||
text-align: right;
|
||||
padding: 2px 4px 2px 2px;
|
||||
}
|
||||
|
||||
div.calendar tbody .day.othermonth {
|
||||
font-size: 80%;
|
||||
color: #bbb;
|
||||
}
|
||||
|
||||
div.calendar tbody .day.othermonth.oweekend {
|
||||
color: #fbb;
|
||||
}
|
||||
|
@ -125,7 +128,9 @@ div.calendar tbody td.today { /* Cell showing selected date */
|
|||
color: #f00;
|
||||
}
|
||||
|
||||
div.calendar tbody .disabled { color: #999; }
|
||||
div.calendar tbody .disabled {
|
||||
color: #999;
|
||||
}
|
||||
|
||||
div.calendar tbody .emptycell { /* Empty cells (the best is to hide them) */
|
||||
visibility: hidden;
|
||||
|
@ -136,7 +141,6 @@ div.calendar tbody .emptyrow { /* Empty row (some months need less than 6 rows)
|
|||
}
|
||||
|
||||
/* The footer part -- status bar and "Close" button */
|
||||
|
||||
div.calendar tfoot .footrow { /* The <TR> in footer (only one right now) */
|
||||
text-align: center;
|
||||
background: #556;
|
||||
|
@ -163,7 +167,6 @@ div.calendar tfoot .active { /* Active (pressed) style for buttons in footer */
|
|||
}
|
||||
|
||||
/* Combo boxes (menus that display months/years for direct selection) */
|
||||
|
||||
div.calendar .combo {
|
||||
position: absolute;
|
||||
display: none;
|
||||
|
|
|
@ -1,53 +1,112 @@
|
|||
#context-menu { position: absolute; z-index: 40; }
|
||||
#context-menu {
|
||||
position: absolute;
|
||||
z-index: 40;
|
||||
}
|
||||
|
||||
#context-menu ul, #context-menu li, #context-menu a {
|
||||
display:block;
|
||||
margin:0;
|
||||
padding:0;
|
||||
border:0;
|
||||
#context-menu ul,
|
||||
#context-menu li,
|
||||
#context-menu a {
|
||||
display: block;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
#context-menu ul {
|
||||
width:150px;
|
||||
border-top:1px solid #ddd;
|
||||
border-left:1px solid #ddd;
|
||||
border-bottom:1px solid #777;
|
||||
border-right:1px solid #777;
|
||||
background:white;
|
||||
list-style:none;
|
||||
width: 150px;
|
||||
border-top: 1px solid #ddd;
|
||||
border-left: 1px solid #ddd;
|
||||
border-bottom: 1px solid #777;
|
||||
border-right: 1px solid #777;
|
||||
background: white;
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
#context-menu li {
|
||||
position:relative;
|
||||
padding:1px;
|
||||
z-index:39;
|
||||
border:1px solid white;
|
||||
position: relative;
|
||||
padding: 1px;
|
||||
z-index: 39;
|
||||
border: 1px solid white;
|
||||
}
|
||||
#context-menu li.folder ul { position:absolute; left:168px; /* IE6 */ top:-2px; max-height:300px; overflow:hidden; overflow-y: auto; }
|
||||
#context-menu li.folder>ul { left:148px; }
|
||||
|
||||
#context-menu.reverse-y li.folder>ul { top:auto; bottom:0; }
|
||||
#context-menu.reverse-x li.folder ul { left:auto; right:168px; /* IE6 */ }
|
||||
#context-menu.reverse-x li.folder>ul { right:148px; }
|
||||
#context-menu li.folder ul {
|
||||
position: absolute;
|
||||
left: 168px; /* ie6 */
|
||||
top: -2px;
|
||||
max-height: 300px;
|
||||
overflow: hidden;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
#context-menu li.folder > ul {
|
||||
left: 148px;
|
||||
}
|
||||
|
||||
#context-menu.reverse-y li.folder > ul {
|
||||
top: auto;
|
||||
bottom: 0;
|
||||
}
|
||||
|
||||
#context-menu.reverse-x li.folder ul {
|
||||
left: auto;
|
||||
right: 168px; /* IE6 */
|
||||
}
|
||||
|
||||
#context-menu.reverse-x li.folder > ul {
|
||||
right: 148px;
|
||||
}
|
||||
|
||||
#context-menu a {
|
||||
text-decoration:none !important;
|
||||
background-repeat: no-repeat;
|
||||
background-position: 1px 50%;
|
||||
padding: 1px 0px 1px 20px;
|
||||
width:100%; /* IE */
|
||||
text-decoration: none !important;
|
||||
background-repeat: no-repeat;
|
||||
background-position: 1px 50%;
|
||||
padding: 1px 0px 1px 20px;
|
||||
width: 100%; /* IE */
|
||||
}
|
||||
|
||||
#context-menu li > a {
|
||||
width: auto;
|
||||
}
|
||||
|
||||
/* others */
|
||||
#context-menu a.disabled,
|
||||
#context-menu a.disabled:hover {
|
||||
color: #ccc;
|
||||
}
|
||||
|
||||
#context-menu li:hover {
|
||||
border: 1px solid gray;
|
||||
background-color: #eee;
|
||||
}
|
||||
|
||||
#context-menu a:hover {
|
||||
color: #2A5685;
|
||||
}
|
||||
|
||||
#context-menu li.folder:hover {
|
||||
z-index: 40;
|
||||
}
|
||||
|
||||
#context-menu ul ul,
|
||||
#context-menu li:hover ul ul {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#context-menu li:hover ul,
|
||||
#context-menu li:hover li:hover ul {
|
||||
display: block;
|
||||
}
|
||||
#context-menu li>a { width:auto; } /* others */
|
||||
#context-menu a.disabled, #context-menu a.disabled:hover {color: #ccc;}
|
||||
#context-menu li:hover { border:1px solid gray; background-color:#eee; }
|
||||
#context-menu a:hover {color:#2A5685;}
|
||||
#context-menu li.folder:hover { z-index:40; }
|
||||
#context-menu ul ul, #context-menu li:hover ul ul { display:none; }
|
||||
#context-menu li:hover ul, #context-menu li:hover li:hover ul { display:block; }
|
||||
|
||||
/* selected element */
|
||||
.context-menu-selection { background-color:#507AAA !important; color:#000 !important; }
|
||||
.context-menu-selection:hover { background-color:#507AAA !important; color:#000 !important; }
|
||||
.context-menu-selection {
|
||||
background-color: #507AAA !important;
|
||||
color: #000 !important;
|
||||
}
|
||||
|
||||
.context-menu-selection:hover {
|
||||
background-color: #507AAA !important;
|
||||
color: #000 !important;
|
||||
}
|
||||
|
||||
#context-menu .submenu {
|
||||
border: transparent solid 5px;
|
||||
|
|
|
@ -1,6 +1,16 @@
|
|||
#context-menu li.folder ul { left:auto; right:168px; }
|
||||
#context-menu li.folder>ul { left:auto; right:148px; }
|
||||
#context-menu li a.submenu { background:url("../images/bullet_arrow_left.png") left no-repeat; }
|
||||
#context-menu li.folder ul {
|
||||
left: auto;
|
||||
right: 168px;
|
||||
}
|
||||
|
||||
#context-menu li.folder > ul {
|
||||
left: auto;
|
||||
right: 148px;
|
||||
}
|
||||
|
||||
#context-menu li a.submenu {
|
||||
background: url("../images/bullet_arrow_left.png") left no-repeat;
|
||||
}
|
||||
|
||||
#context-menu a {
|
||||
background-position: 100% 40%;
|
||||
|
|
|
@ -1,46 +1,58 @@
|
|||
/* IE6 how i love to hate thee */
|
||||
|
||||
#account-nav li a {
|
||||
width:45px;
|
||||
width: 45px;
|
||||
}
|
||||
|
||||
#account-nav li li a {
|
||||
width:150px;
|
||||
width: 150px;
|
||||
}
|
||||
|
||||
.title-bar {
|
||||
zoom:1;
|
||||
zoom: 1;
|
||||
}
|
||||
|
||||
.title-bar-extras label {
|
||||
float:none;
|
||||
display:inline;
|
||||
padding-right:10px;
|
||||
float: none;
|
||||
display: inline;
|
||||
padding-right: 10px;
|
||||
}
|
||||
|
||||
.issue-dropdown li.hover {
|
||||
background-color:#fff;
|
||||
background-color: #fff;
|
||||
}
|
||||
|
||||
.issue-dropdown li.hover ul {
|
||||
display:block;
|
||||
left:112px;
|
||||
display: block;
|
||||
left: 112px;
|
||||
}
|
||||
|
||||
body .file-thumbs a {
|
||||
width:150px;
|
||||
width: 150px;
|
||||
}
|
||||
|
||||
#history .journal {
|
||||
zoom:1;
|
||||
zoom: 1;
|
||||
}
|
||||
|
||||
body #history .wiki {
|
||||
overflow:hidden;
|
||||
zoom:1;
|
||||
overflow: hidden;
|
||||
zoom: 1;
|
||||
}
|
||||
|
||||
#main-menu li li {
|
||||
height:30px;
|
||||
height: 30px;
|
||||
}
|
||||
|
||||
#main-menu li li li {
|
||||
height:auto;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
a.has-thumb.active {
|
||||
background:none;
|
||||
background: none;
|
||||
}
|
||||
|
||||
.title-bar-extras ul {
|
||||
background-image:none;
|
||||
border-top:1px solid #154E5D;
|
||||
background-image: none;
|
||||
border-top: 1px solid #154E5D;
|
||||
}
|
|
@ -1,48 +1,56 @@
|
|||
/* These will be included for IE6 & IE7 */
|
||||
|
||||
.title-bar h2 {
|
||||
height:21px;
|
||||
height: 21px;
|
||||
}
|
||||
|
||||
td.dropdown {
|
||||
z-index:50;
|
||||
position:relative;
|
||||
z-index: 50;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
body .title-bar-extras {
|
||||
overflow:hidden;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
#main-menu, .title-bar {
|
||||
z-index:4;
|
||||
#main-menu,
|
||||
.title-bar {
|
||||
z-index: 4;
|
||||
}
|
||||
|
||||
.title-bar .button-large ul {
|
||||
z-index:15;
|
||||
z-index: 15;
|
||||
}
|
||||
|
||||
form.tooltip-active {
|
||||
z-index:14;
|
||||
z-index: 14;
|
||||
}
|
||||
|
||||
#main-menu li li a span {
|
||||
position:absolute;
|
||||
right:0;
|
||||
top:0;
|
||||
display:block;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 0;
|
||||
display: block;
|
||||
}
|
||||
|
||||
#main-menu li li li a span {
|
||||
right:10px;
|
||||
right: 10px;
|
||||
}
|
||||
|
||||
body .file-thumbs a {
|
||||
max-width:150px;
|
||||
max-width: 150px;
|
||||
}
|
||||
|
||||
#watchers {
|
||||
position:relative;
|
||||
z-index:5;
|
||||
position: relative;
|
||||
z-index: 5;
|
||||
}
|
||||
|
||||
div.attachments {
|
||||
position:relative;
|
||||
z-index:4;
|
||||
position: relative;
|
||||
z-index: 4;
|
||||
}
|
||||
|
||||
fieldset.collapsible.header_collapsible legend {
|
||||
margin-left:-15px;
|
||||
margin-left: -15px;
|
||||
}
|
||||
|
|
|
@ -1,96 +1,123 @@
|
|||
.jstEditor {
|
||||
padding-left: 0px;
|
||||
padding-left: 0px;
|
||||
}
|
||||
|
||||
.jstEditor textarea, .jstEditor iframe {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.jstHandle {
|
||||
height: 10px;
|
||||
font-size: 0.1em;
|
||||
cursor: s-resize;
|
||||
/*background: transparent url(img/resizer.png) no-repeat 45% 50%;*/
|
||||
height: 10px;
|
||||
font-size: 0.1em;
|
||||
cursor: s-resize;
|
||||
/*background: transparent url(img/resizer.png) no-repeat 45% 50%;*/
|
||||
}
|
||||
|
||||
.jstElements {
|
||||
padding: 3px 3px;
|
||||
padding: 3px 3px;
|
||||
}
|
||||
|
||||
.jstElements button {
|
||||
margin-right : 6px;
|
||||
width : 24px;
|
||||
height: 24px;
|
||||
padding: 4px;
|
||||
border-style: solid;
|
||||
border-width: 1px;
|
||||
border-color: #ddd;
|
||||
background-color : #f7f7f7;
|
||||
background-position : 50% 50%;
|
||||
background-repeat: no-repeat;
|
||||
margin-right: 6px;
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
padding: 4px;
|
||||
border-style: solid;
|
||||
border-width: 1px;
|
||||
border-color: #ddd;
|
||||
background-color: #f7f7f7;
|
||||
background-position: 50% 50%;
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
|
||||
.jstElements button:hover {
|
||||
border-color : #000;
|
||||
border-color: #000;
|
||||
}
|
||||
|
||||
.jstElements button span {
|
||||
display : none;
|
||||
display: none;
|
||||
}
|
||||
|
||||
.jstElements span {
|
||||
display : inline;
|
||||
display: inline;
|
||||
}
|
||||
|
||||
.jstSpacer {
|
||||
width : 0px;
|
||||
font-size: 1px;
|
||||
margin-right: 4px;
|
||||
width: 0px;
|
||||
font-size: 1px;
|
||||
margin-right: 4px;
|
||||
}
|
||||
|
||||
.jstElements .help { float: right; margin-right: 0.5em; padding-top: 8px; font-size: 0.9em; }
|
||||
.jstElements .help a {padding: 2px 0 2px 20px; background: url(../images/help.png) no-repeat 0 50%;}
|
||||
.jstElements .help {
|
||||
float: right;
|
||||
margin-right: 0.5em;
|
||||
padding-top: 8px;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
.jstElements .help a {
|
||||
padding: 2px 0 2px 20px;
|
||||
background: url(../images/help.png) no-repeat 0 50%;
|
||||
}
|
||||
|
||||
/* Buttons
|
||||
-------------------------------------------------------- */
|
||||
.jstb_strong {
|
||||
background-image: url(../images/jstoolbar/bt_strong.png);
|
||||
background-image: url(../images/jstoolbar/bt_strong.png);
|
||||
}
|
||||
|
||||
.jstb_em {
|
||||
background-image: url(../images/jstoolbar/bt_em.png);
|
||||
background-image: url(../images/jstoolbar/bt_em.png);
|
||||
}
|
||||
|
||||
.jstb_ins {
|
||||
background-image: url(../images/jstoolbar/bt_ins.png);
|
||||
background-image: url(../images/jstoolbar/bt_ins.png);
|
||||
}
|
||||
|
||||
.jstb_del {
|
||||
background-image: url(../images/jstoolbar/bt_del.png);
|
||||
background-image: url(../images/jstoolbar/bt_del.png);
|
||||
}
|
||||
|
||||
.jstb_code {
|
||||
background-image: url(../images/jstoolbar/bt_code.png);
|
||||
background-image: url(../images/jstoolbar/bt_code.png);
|
||||
}
|
||||
|
||||
.jstb_h1 {
|
||||
background-image: url(../images/jstoolbar/bt_h1.png);
|
||||
background-image: url(../images/jstoolbar/bt_h1.png);
|
||||
}
|
||||
|
||||
.jstb_h2 {
|
||||
background-image: url(../images/jstoolbar/bt_h2.png);
|
||||
background-image: url(../images/jstoolbar/bt_h2.png);
|
||||
}
|
||||
|
||||
.jstb_h3 {
|
||||
background-image: url(../images/jstoolbar/bt_h3.png);
|
||||
background-image: url(../images/jstoolbar/bt_h3.png);
|
||||
}
|
||||
|
||||
.jstb_ul {
|
||||
background-image: url(../images/jstoolbar/bt_ul.png);
|
||||
background-image: url(../images/jstoolbar/bt_ul.png);
|
||||
}
|
||||
|
||||
.jstb_ol {
|
||||
background-image: url(../images/jstoolbar/bt_ol.png);
|
||||
background-image: url(../images/jstoolbar/bt_ol.png);
|
||||
}
|
||||
|
||||
.jstb_bq {
|
||||
background-image: url(../images/jstoolbar/bt_bq.png);
|
||||
background-image: url(../images/jstoolbar/bt_bq.png);
|
||||
}
|
||||
|
||||
.jstb_unbq {
|
||||
background-image: url(../images/jstoolbar/bt_bq_remove.png);
|
||||
background-image: url(../images/jstoolbar/bt_bq_remove.png);
|
||||
}
|
||||
|
||||
.jstb_pre {
|
||||
background-image: url(../images/jstoolbar/bt_pre.png);
|
||||
background-image: url(../images/jstoolbar/bt_pre.png);
|
||||
}
|
||||
|
||||
.jstb_link {
|
||||
background-image: url(../images/jstoolbar/bt_link.png);
|
||||
background-image: url(../images/jstoolbar/bt_link.png);
|
||||
}
|
||||
|
||||
.jstb_img {
|
||||
background-image: url(../images/jstoolbar/bt_img.png);
|
||||
background-image: url(../images/jstoolbar/bt_img.png);
|
||||
}
|
||||
|
|
|
@ -1,11 +1,46 @@
|
|||
/***** Media print specific styles *****/
|
||||
@media print {
|
||||
#top-menu, #header, #main-menu, #sidebar, #footer, .contextual, .other-formats { display:none; }
|
||||
#main { background: #fff; }
|
||||
#content { width: 99%; margin: 0; padding: 0; border: 0; background: #fff; overflow: visible !important;}
|
||||
#wiki_add_attachment { display:none; }
|
||||
.hide-when-print { display: none; }
|
||||
.autoscroll {overflow-x: visible;}
|
||||
table.list {margin-top:0.5em;}
|
||||
table.list th, table.list td {border: 1px solid #aaa;}
|
||||
#top-menu,
|
||||
#header,
|
||||
#main-menu,
|
||||
#sidebar,
|
||||
#footer,
|
||||
.contextual,
|
||||
.other-formats {
|
||||
display:none;
|
||||
}
|
||||
|
||||
#main {
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
#content {
|
||||
width: 99%;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
border: 0;
|
||||
background: #fff;
|
||||
overflow: visible !important;
|
||||
}
|
||||
|
||||
#wiki_add_attachment {
|
||||
display:none;
|
||||
}
|
||||
|
||||
.hide-when-print {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.autoscroll {
|
||||
overflow-x: visible;
|
||||
}
|
||||
|
||||
table.list {
|
||||
margin-top:0.5em;
|
||||
}
|
||||
|
||||
table.list th,
|
||||
table.list td {
|
||||
border: 1px solid #aaa;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,37 +2,101 @@
|
|||
* CSS Reset
|
||||
* Based on http://meyerweb.com/eric/tools/css/reset/
|
||||
*/
|
||||
html,
|
||||
body,
|
||||
div,
|
||||
span,
|
||||
applet,
|
||||
object,
|
||||
iframe,
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6,
|
||||
p,
|
||||
blockquote,
|
||||
pre,
|
||||
a,
|
||||
abbr,
|
||||
acronym,
|
||||
address,
|
||||
big,
|
||||
cite,
|
||||
code,
|
||||
del,
|
||||
dfn,
|
||||
em,
|
||||
font,
|
||||
img,
|
||||
ins,
|
||||
kbd,
|
||||
q,
|
||||
s,
|
||||
samp,
|
||||
small,
|
||||
strike,
|
||||
strong,
|
||||
sub,
|
||||
sup,
|
||||
tt,
|
||||
var,
|
||||
b,
|
||||
u,
|
||||
i,
|
||||
center,
|
||||
dl,
|
||||
dt,
|
||||
dd,
|
||||
ol,
|
||||
ul,
|
||||
li,
|
||||
fieldset,
|
||||
form,
|
||||
label,
|
||||
legend,
|
||||
table,
|
||||
caption,
|
||||
tbody,
|
||||
tfoot,
|
||||
thead,
|
||||
tr,
|
||||
th,
|
||||
td {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
border: 0;
|
||||
outline: 0;
|
||||
font-size: 100%;
|
||||
vertical-align: baseline;
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, font, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
border: 0;
|
||||
outline: 0;
|
||||
font-size: 100%;
|
||||
vertical-align: baseline;
|
||||
background: transparent;
|
||||
}
|
||||
body {
|
||||
line-height: 1;
|
||||
line-height: 1;
|
||||
}
|
||||
ol, ul {
|
||||
list-style: none;
|
||||
|
||||
ol,
|
||||
ul {
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
ins {
|
||||
text-decoration: underline;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
del {
|
||||
text-decoration: line-through;
|
||||
text-decoration: line-through;
|
||||
}
|
||||
|
||||
/* tables still need 'cellspacing="0"' in the markup */
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0;
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0;
|
||||
}
|
||||
|
||||
/* Helper classes */
|
||||
.clearfix {
|
||||
clear:both;
|
||||
clear: both;
|
||||
}
|
|
@ -1,63 +1,179 @@
|
|||
body, #wrapper { direction: rtl;}
|
||||
body,
|
||||
#wrapper {
|
||||
direction: rtl;
|
||||
}
|
||||
|
||||
#quick-search { float: left; }
|
||||
#main-menu { margin-left: -500px; left: auto; right: 6px; margin-right: 0px;}
|
||||
#main-menu li { float: right; }
|
||||
#top-menu ul { float: right; }
|
||||
#account { float: left; }
|
||||
#top-menu #loggedas { float: left; }
|
||||
#top-menu li { float: right; }
|
||||
.tabular label.floating
|
||||
{
|
||||
margin-right: 0;
|
||||
margin-left: auto;
|
||||
text-align: right;
|
||||
#quick-search {
|
||||
float: left;
|
||||
}
|
||||
.tabular label
|
||||
{
|
||||
float: right;
|
||||
margin-left: auto;
|
||||
}
|
||||
.tabular p
|
||||
{
|
||||
clear: right;
|
||||
}
|
||||
.tabular label.block { text-align: right; }
|
||||
.icon
|
||||
{
|
||||
background-position: 100% 40%;
|
||||
padding-right: 20px;
|
||||
padding-left: 0px;
|
||||
}
|
||||
div#activity dt, #search-results dt
|
||||
{
|
||||
background-position: 100% 50%;
|
||||
padding-right: 20px;
|
||||
padding-left: 0px;
|
||||
}
|
||||
#content .tabs ul li { float: right; }
|
||||
#content .tabs ul { padding-left: auto; padding-right: 1em; }
|
||||
table.progress { float: right; }
|
||||
.contextual { float: left; }
|
||||
.icon22 { background-position: 100% 40%; padding-right: 26px; padding-left: auto; }
|
||||
h3, .wiki h2 { padding: 10px 2px 1px 0; }
|
||||
.tooltip span.tip { text-align: right; }
|
||||
tr.issue td.subject { text-align: right; }
|
||||
tr.time-entry td.subject, tr.time-entry td.comments { text-align: right; }
|
||||
#sidebar { float: left; }
|
||||
#main.nosidebar #content { border-width: 1px; border-style: solid; border-color: #D7D7D7 #BBBBBB #BBBBBB #D7D7D7;}
|
||||
.tabular.settings label { margin-left: auto; }
|
||||
.splitcontentleft { float: right; }
|
||||
.splitcontentright { float: left; }
|
||||
p.progress-info { clear: right; }
|
||||
table.list td.buttons a { padding-right: 20px; }
|
||||
.filecontent { direction: ltr; }
|
||||
.entries { direction: ltr; }
|
||||
.changeset-changes { direction: ltr; padding-left: 2em }
|
||||
.changesets { direction: ltr; }
|
||||
div#issue-changesets { float: left; margin-right: 1em; margin-left: 0 }
|
||||
div#issue-changesets div.wiki { direction: ltr; padding-left: 2em }
|
||||
#activity dt, .journal { clear: right; }
|
||||
.journal-link { float: left; }
|
||||
div.wiki pre { direction: ltr; }
|
||||
|
||||
#main-menu {
|
||||
margin-left: -500px;
|
||||
left: auto;
|
||||
right: 6px;
|
||||
margin-right: 0px;
|
||||
}
|
||||
|
||||
#main-menu li {
|
||||
float: right;
|
||||
}
|
||||
|
||||
#top-menu ul {
|
||||
float: right;
|
||||
}
|
||||
|
||||
#account {
|
||||
float: left;
|
||||
}
|
||||
|
||||
#top-menu #loggedas {
|
||||
float: left;
|
||||
}
|
||||
|
||||
#top-menu li {
|
||||
float: right;
|
||||
}
|
||||
|
||||
.tabular label.floating {
|
||||
margin-right: 0;
|
||||
margin-left: auto;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.tabular label {
|
||||
float: right;
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
.tabular p {
|
||||
clear: right;
|
||||
}
|
||||
|
||||
.tabular label.block {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.icon {
|
||||
background-position: 100% 40%;
|
||||
padding-right: 20px;
|
||||
padding-left: 0px;
|
||||
}
|
||||
|
||||
div#activity dt,
|
||||
#search-results dt {
|
||||
background-position: 100% 50%;
|
||||
padding-right: 20px;
|
||||
padding-left: 0px;
|
||||
}
|
||||
|
||||
#content .tabs ul li {
|
||||
float: right;
|
||||
}
|
||||
|
||||
#content .tabs ul {
|
||||
padding-left: auto;
|
||||
padding-right: 1em;
|
||||
}
|
||||
|
||||
table.progress {
|
||||
float: right;
|
||||
}
|
||||
|
||||
.contextual {
|
||||
float: left;
|
||||
}
|
||||
|
||||
.icon22 {
|
||||
background-position: 100% 40%;
|
||||
padding-right: 26px;
|
||||
padding-left: auto;
|
||||
}
|
||||
|
||||
h3,
|
||||
.wiki h2 {
|
||||
padding: 10px 2px 1px 0;
|
||||
}
|
||||
|
||||
.tooltip span.tip {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
tr.issue td.subject {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
tr.time-entry td.subject,
|
||||
tr.time-entry td.comments {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
#sidebar {
|
||||
float: left;
|
||||
}
|
||||
|
||||
#main.nosidebar #content {
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
border-color: #D7D7D7 #BBBBBB #BBBBBB #D7D7D7;
|
||||
}
|
||||
|
||||
.tabular.settings label {
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
.splitcontentleft {
|
||||
float: right;
|
||||
}
|
||||
|
||||
.splitcontentright {
|
||||
float: left;
|
||||
}
|
||||
|
||||
p.progress-info {
|
||||
clear: right;
|
||||
}
|
||||
|
||||
table.list td.buttons a {
|
||||
padding-right: 20px;
|
||||
}
|
||||
|
||||
.filecontent {
|
||||
direction: ltr;
|
||||
}
|
||||
|
||||
.entries {
|
||||
direction: ltr;
|
||||
}
|
||||
|
||||
.changeset-changes {
|
||||
direction: ltr;
|
||||
padding-left: 2em;
|
||||
}
|
||||
|
||||
.changesets {
|
||||
direction: ltr;
|
||||
}
|
||||
|
||||
div#issue-changesets {
|
||||
float: left;
|
||||
margin-right: 1em;
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
div#issue-changesets div.wiki {
|
||||
direction: ltr;
|
||||
padding-left: 2em;
|
||||
}
|
||||
|
||||
#activity dt,
|
||||
.journal {
|
||||
clear: right;
|
||||
}
|
||||
|
||||
.journal-link {
|
||||
float: left;
|
||||
}
|
||||
|
||||
div.wiki pre {
|
||||
direction: ltr;
|
||||
}
|
||||
|
|
|
@ -1,181 +1,583 @@
|
|||
div.changeset-changes ul {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
div.changeset-changes ul { margin: 0; padding: 0; }
|
||||
div.changeset-changes ul > ul { margin-left: 18px; padding: 0; }
|
||||
div.changeset-changes ul > ul {
|
||||
margin-left: 18px;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
li.change {
|
||||
list-style-type:none;
|
||||
background-image: url(../images/bullet_black.png);
|
||||
background-position: 1px 1px;
|
||||
background-repeat: no-repeat;
|
||||
padding-top: 1px;
|
||||
padding-bottom: 1px;
|
||||
padding-left: 20px;
|
||||
margin: 0;
|
||||
list-style-type: none;
|
||||
background-image: url(../images/bullet_black.png);
|
||||
background-position: 1px 1px;
|
||||
background-repeat: no-repeat;
|
||||
padding-top: 1px;
|
||||
padding-bottom: 1px;
|
||||
padding-left: 20px;
|
||||
margin: 0;
|
||||
}
|
||||
li.change.folder { background-image: url(../images/folder_open.png); }
|
||||
li.change.folder.change-A { background-image: url(../images/folder_open_add.png); }
|
||||
li.change.folder.change-M { background-image: url(../images/folder_open_orange.png); }
|
||||
li.change.change-A { background-image: url(../images/bullet_add.png); }
|
||||
li.change.change-M { background-image: url(../images/bullet_orange.png); }
|
||||
li.change.change-C { background-image: url(../images/bullet_blue.png); }
|
||||
li.change.change-R { background-image: url(../images/bullet_purple.png); }
|
||||
li.change.change-D { background-image: url(../images/bullet_delete.png); }
|
||||
|
||||
li.change .copied-from { font-style: italic; color: #999; font-size: 0.9em; }
|
||||
li.change .copied-from:before { content: " - "}
|
||||
li.change.folder {
|
||||
background-image: url(../images/folder_open.png);
|
||||
}
|
||||
|
||||
#changes-legend { float: right; font-size: 0.8em; margin: 0; }
|
||||
#changes-legend li { float: left; background-position: 5px 0; }
|
||||
li.change.folder.change-A {
|
||||
background-image: url(../images/folder_open_add.png);
|
||||
}
|
||||
|
||||
li.change.folder.change-M {
|
||||
background-image: url(../images/folder_open_orange.png);
|
||||
}
|
||||
|
||||
li.change.change-A {
|
||||
background-image: url(../images/bullet_add.png);
|
||||
}
|
||||
|
||||
li.change.change-M {
|
||||
background-image: url(../images/bullet_orange.png);
|
||||
}
|
||||
|
||||
li.change.change-C {
|
||||
background-image: url(../images/bullet_blue.png);
|
||||
}
|
||||
|
||||
li.change.change-R {
|
||||
background-image: url(../images/bullet_purple.png);
|
||||
}
|
||||
|
||||
li.change.change-D {
|
||||
background-image: url(../images/bullet_delete.png);
|
||||
}
|
||||
|
||||
li.change .copied-from {
|
||||
font-style: italic;
|
||||
color: #999;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
li.change .copied-from:before {
|
||||
content: " - ";
|
||||
}
|
||||
|
||||
#changes-legend {
|
||||
float: right;
|
||||
font-size: 0.8em;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
#changes-legend li {
|
||||
float: left;
|
||||
background-position: 5px 0;
|
||||
}
|
||||
|
||||
table.filecontent {
|
||||
border: 1px solid #ccc;
|
||||
border-collapse: collapse;
|
||||
width: 98%;
|
||||
background-color: #fafafa;
|
||||
}
|
||||
|
||||
table.filecontent th {
|
||||
border: 1px solid #ccc;
|
||||
background-color: #eee;
|
||||
}
|
||||
|
||||
table.filecontent th.filename {
|
||||
background-color: #e4e4d4;
|
||||
text-align: left;
|
||||
padding: 0.2em;
|
||||
}
|
||||
|
||||
table.filecontent tr.spacing th {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
table.filecontent tr.spacing td {
|
||||
height: 0.4em;
|
||||
background: #EAF2F5;
|
||||
}
|
||||
|
||||
table.filecontent { border: 1px solid #ccc; border-collapse: collapse; width:98%; background-color: #fafafa; }
|
||||
table.filecontent th { border: 1px solid #ccc; background-color: #eee; }
|
||||
table.filecontent th.filename { background-color: #e4e4d4; text-align: left; padding: 0.2em;}
|
||||
table.filecontent tr.spacing th { text-align:center; }
|
||||
table.filecontent tr.spacing td { height: 0.4em; background: #EAF2F5;}
|
||||
table.filecontent th.line-num {
|
||||
border: 1px solid #d7d7d7;
|
||||
font-size: 0.8em;
|
||||
text-align: right;
|
||||
width: 2%;
|
||||
padding-right: 3px;
|
||||
color: #999;
|
||||
border: 1px solid #d7d7d7;
|
||||
font-size: 0.8em;
|
||||
text-align: right;
|
||||
width: 2%;
|
||||
padding-right: 3px;
|
||||
color: #999;
|
||||
}
|
||||
|
||||
table.filecontent th.line-num a {
|
||||
text-decoration: none;
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
table.filecontent td.line-code pre {
|
||||
margin: 0px;
|
||||
white-space: pre-wrap; /* CSS2.1 compliant */
|
||||
white-space: -moz-pre-wrap; /* Mozilla-based browsers */
|
||||
white-space: -o-pre-wrap; /* Opera 7+ */
|
||||
margin: 0px;
|
||||
white-space: pre-wrap; /* CSS2.1 compliant */
|
||||
white-space: -moz-pre-wrap; /* Mozilla-based browsers */
|
||||
white-space: -o-pre-wrap; /* Opera 7+ */
|
||||
}
|
||||
|
||||
/* 12 different colors for the annonate view */
|
||||
table.annotate tr.bloc-0 {background: #FFFFBF;}
|
||||
table.annotate tr.bloc-1 {background: #EABFFF;}
|
||||
table.annotate tr.bloc-2 {background: #BFFFFF;}
|
||||
table.annotate tr.bloc-3 {background: #FFD9BF;}
|
||||
table.annotate tr.bloc-4 {background: #E6FFBF;}
|
||||
table.annotate tr.bloc-5 {background: #BFCFFF;}
|
||||
table.annotate tr.bloc-6 {background: #FFBFEF;}
|
||||
table.annotate tr.bloc-7 {background: #FFE6BF;}
|
||||
table.annotate tr.bloc-8 {background: #FFE680;}
|
||||
table.annotate tr.bloc-9 {background: #AA80FF;}
|
||||
table.annotate tr.bloc-10 {background: #FFBFDC;}
|
||||
table.annotate tr.bloc-11 {background: #BFE4FF;}
|
||||
table.annotate tr.bloc-0 {
|
||||
background: #FFFFBF;
|
||||
}
|
||||
|
||||
table.annotate tr.bloc-1 {
|
||||
background: #EABFFF;
|
||||
}
|
||||
|
||||
table.annotate tr.bloc-2 {
|
||||
background: #BFFFFF;
|
||||
}
|
||||
|
||||
table.annotate tr.bloc-3 {
|
||||
background: #FFD9BF;
|
||||
}
|
||||
|
||||
table.annotate tr.bloc-4 {
|
||||
background: #E6FFBF;
|
||||
}
|
||||
|
||||
table.annotate tr.bloc-5 {
|
||||
background: #BFCFFF;
|
||||
}
|
||||
|
||||
table.annotate tr.bloc-6 {
|
||||
background: #FFBFEF;
|
||||
}
|
||||
|
||||
table.annotate tr.bloc-7 {
|
||||
background: #FFE6BF;
|
||||
}
|
||||
|
||||
table.annotate tr.bloc-8 {
|
||||
background: #FFE680;
|
||||
}
|
||||
|
||||
table.annotate tr.bloc-9 {
|
||||
background: #AA80FF;
|
||||
}
|
||||
|
||||
table.annotate tr.bloc-10 {
|
||||
background: #FFBFDC;
|
||||
}
|
||||
|
||||
table.annotate tr.bloc-11 {
|
||||
background: #BFE4FF;
|
||||
}
|
||||
|
||||
table.annotate td.revision {
|
||||
text-align: center;
|
||||
width: 2%;
|
||||
padding-left: 1em;
|
||||
background: inherit;
|
||||
text-align: center;
|
||||
width: 2%;
|
||||
padding-left: 1em;
|
||||
background: inherit;
|
||||
}
|
||||
|
||||
table.annotate td.author {
|
||||
text-align: center;
|
||||
border-right: 1px solid #d7d7d7;
|
||||
white-space: nowrap;
|
||||
padding-left: 1em;
|
||||
padding-right: 1em;
|
||||
width: 3%;
|
||||
background: inherit;
|
||||
font-size: 90%;
|
||||
text-align: center;
|
||||
border-right: 1px solid #d7d7d7;
|
||||
white-space: nowrap;
|
||||
padding-left: 1em;
|
||||
padding-right: 1em;
|
||||
width: 3%;
|
||||
background: inherit;
|
||||
font-size: 90%;
|
||||
}
|
||||
|
||||
table.annotate td.line-code { background-color: #fafafa; }
|
||||
table.annotate td.line-code {
|
||||
background-color: #fafafa;
|
||||
}
|
||||
|
||||
div.action_M { background: #fd8 }
|
||||
div.action_D { background: #f88 }
|
||||
div.action_A { background: #bfb }
|
||||
div.action_M {
|
||||
background: #fd8;
|
||||
}
|
||||
|
||||
div.action_D {
|
||||
background: #f88;
|
||||
}
|
||||
|
||||
div.action_A {
|
||||
background: #bfb;
|
||||
}
|
||||
|
||||
/************* CodeRay styles *************/
|
||||
.syntaxhl div {display: inline;}
|
||||
.syntaxhl .line-numbers { padding: 2px 4px 2px 4px; background-color: #eee; margin: 0 7px 0 0; }
|
||||
.syntaxhl .code pre { overflow: auto }
|
||||
.syntaxhl .debug { color:white ! important; background:blue ! important; }
|
||||
.syntaxhl div {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
.syntaxhl .annotation { color:#007 }
|
||||
.syntaxhl .attribute-name { color:#b48 }
|
||||
.syntaxhl .attribute-value { color:#700 }
|
||||
.syntaxhl .binary { color:#509 }
|
||||
.syntaxhl .char .content { color:#D20 }
|
||||
.syntaxhl .char .delimiter { color:#710 }
|
||||
.syntaxhl .char { color:#D20 }
|
||||
.syntaxhl .class { color:#B06; font-weight:bold }
|
||||
.syntaxhl .class-variable { color:#369 }
|
||||
.syntaxhl .color { color:#0A0 }
|
||||
.syntaxhl .comment { color:#777 }
|
||||
.syntaxhl .comment .char { color:#444 }
|
||||
.syntaxhl .comment .delimiter { color:#444 }
|
||||
.syntaxhl .complex { color:#A08 }
|
||||
.syntaxhl .constant { color:#036; font-weight:bold }
|
||||
.syntaxhl .decorator { color:#B0B }
|
||||
.syntaxhl .definition { color:#099; font-weight:bold }
|
||||
.syntaxhl .delimiter { color:black }
|
||||
.syntaxhl .directive { color:#088; font-weight:bold }
|
||||
.syntaxhl .doc { color:#970 }
|
||||
.syntaxhl .doc-string { color:#D42; font-weight:bold }
|
||||
.syntaxhl .doctype { color:#34b }
|
||||
.syntaxhl .entity { color:#800; font-weight:bold }
|
||||
.syntaxhl .error { color:#F00; background-color:#FAA }
|
||||
.syntaxhl .escape { color:#666 }
|
||||
.syntaxhl .exception { color:#C00; font-weight:bold }
|
||||
.syntaxhl .float { color:#60E }
|
||||
.syntaxhl .function { color:#06B; font-weight:bold }
|
||||
.syntaxhl .global-variable { color:#d70 }
|
||||
.syntaxhl .hex { color:#02b }
|
||||
.syntaxhl .imaginary { color:#f00 }
|
||||
.syntaxhl .include { color:#B44; font-weight:bold }
|
||||
.syntaxhl .inline { background-color: hsla(0,0%,0%,0.07); color: black }
|
||||
.syntaxhl .inline-delimiter { font-weight: bold; color: #666 }
|
||||
.syntaxhl .instance-variable { color:#33B }
|
||||
.syntaxhl .integer { color:#00D }
|
||||
.syntaxhl .key .char { color: #60f }
|
||||
.syntaxhl .key .delimiter { color: #404 }
|
||||
.syntaxhl .key { color: #606 }
|
||||
.syntaxhl .keyword { color:#080; font-weight:bold }
|
||||
.syntaxhl .label { color:#970; font-weight:bold }
|
||||
.syntaxhl .local-variable { color:#963 }
|
||||
.syntaxhl .namespace { color:#707; font-weight:bold }
|
||||
.syntaxhl .octal { color:#40E }
|
||||
.syntaxhl .operator { }
|
||||
.syntaxhl .predefined { color:#369; font-weight:bold }
|
||||
.syntaxhl .predefined-constant { color:#069 }
|
||||
.syntaxhl .predefined-type { color:#0a5; font-weight:bold }
|
||||
.syntaxhl .preprocessor { color:#579 }
|
||||
.syntaxhl .pseudo-class { color:#00C; font-weight:bold }
|
||||
.syntaxhl .regexp .content { color:#808 }
|
||||
.syntaxhl .regexp .delimiter { color:#404 }
|
||||
.syntaxhl .regexp .modifier { color:#C2C }
|
||||
.syntaxhl .regexp { background-color:hsla(300,100%,50%,0.06); }
|
||||
.syntaxhl .reserved { color:#080; font-weight:bold }
|
||||
.syntaxhl .shell .content { color:#2B2 }
|
||||
.syntaxhl .shell .delimiter { color:#161 }
|
||||
.syntaxhl .shell { background-color:hsla(120,100%,50%,0.06); }
|
||||
.syntaxhl .string .char { color: #b0b }
|
||||
.syntaxhl .string .content { color: #D20 }
|
||||
.syntaxhl .string .delimiter { color: #710 }
|
||||
.syntaxhl .string .modifier { color: #E40 }
|
||||
.syntaxhl .string { background-color:hsla(0,100%,50%,0.05); }
|
||||
.syntaxhl .symbol .content { color:#A60 }
|
||||
.syntaxhl .symbol .delimiter { color:#630 }
|
||||
.syntaxhl .symbol { color:#A60 }
|
||||
.syntaxhl .tag { color:#070 }
|
||||
.syntaxhl .type { color:#339; font-weight:bold }
|
||||
.syntaxhl .value { color: #088; }
|
||||
.syntaxhl .variable { color:#037 }
|
||||
.syntaxhl .line-numbers {
|
||||
padding: 2px 4px 2px 4px;
|
||||
background-color: #eee;
|
||||
margin: 0 7px 0 0;
|
||||
}
|
||||
|
||||
.syntaxhl .insert { background: hsla(120,100%,50%,0.12) }
|
||||
.syntaxhl .delete { background: hsla(0,100%,50%,0.12) }
|
||||
.syntaxhl .change { color: #bbf; background: #007; }
|
||||
.syntaxhl .head { color: #f8f; background: #505 }
|
||||
.syntaxhl .head .filename { color: white; }
|
||||
.syntaxhl .code pre {
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
.syntaxhl .delete .eyecatcher { background-color: hsla(0,100%,50%,0.2); border: 1px solid hsla(0,100%,45%,0.5); margin: -1px; border-bottom: none; border-top-left-radius: 5px; border-top-right-radius: 5px; }
|
||||
.syntaxhl .insert .eyecatcher { background-color: hsla(120,100%,50%,0.2); border: 1px solid hsla(120,100%,25%,0.5); margin: -1px; border-top: none; border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; }
|
||||
.syntaxhl .debug {
|
||||
color: white ! important;
|
||||
background: blue ! important;
|
||||
}
|
||||
|
||||
.syntaxhl .insert .insert { color: #0c0; background:transparent; font-weight:bold }
|
||||
.syntaxhl .delete .delete { color: #c00; background:transparent; font-weight:bold }
|
||||
.syntaxhl .change .change { color: #88f }
|
||||
.syntaxhl .head .head { color: #f4f }
|
||||
.syntaxhl .annotation {
|
||||
color: #007;
|
||||
}
|
||||
|
||||
.syntaxhl .attribute-name {
|
||||
color: #b48;
|
||||
}
|
||||
|
||||
.syntaxhl .attribute-value {
|
||||
color: #700;
|
||||
}
|
||||
|
||||
.syntaxhl .binary {
|
||||
color: #509;
|
||||
}
|
||||
|
||||
.syntaxhl .char .content {
|
||||
color: #D20;
|
||||
}
|
||||
|
||||
.syntaxhl .char .delimiter {
|
||||
color: #710;
|
||||
}
|
||||
|
||||
.syntaxhl .char {
|
||||
color: #D20;
|
||||
}
|
||||
|
||||
.syntaxhl .class {
|
||||
color: #B06;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.syntaxhl .class-variable {
|
||||
color: #369;
|
||||
}
|
||||
|
||||
.syntaxhl .color {
|
||||
color: #0A0;
|
||||
}
|
||||
|
||||
.syntaxhl .comment {
|
||||
color: #777;
|
||||
}
|
||||
|
||||
.syntaxhl .comment .char {
|
||||
color: #444;
|
||||
}
|
||||
|
||||
.syntaxhl .comment .delimiter {
|
||||
color: #444;
|
||||
}
|
||||
|
||||
.syntaxhl .complex {
|
||||
color: #A08;
|
||||
}
|
||||
|
||||
.syntaxhl .constant {
|
||||
color: #036;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.syntaxhl .decorator {
|
||||
color: #B0B;
|
||||
}
|
||||
|
||||
.syntaxhl .definition {
|
||||
color: #099;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.syntaxhl .delimiter {
|
||||
color: black;
|
||||
}
|
||||
|
||||
.syntaxhl .directive {
|
||||
color: #088;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.syntaxhl .doc {
|
||||
color: #970;
|
||||
}
|
||||
|
||||
.syntaxhl .doc-string {
|
||||
color: #D42;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.syntaxhl .doctype {
|
||||
color: #34b;
|
||||
}
|
||||
|
||||
.syntaxhl .entity {
|
||||
color: #800;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.syntaxhl .error {
|
||||
color: #F00;
|
||||
background-color: #FAA;
|
||||
}
|
||||
|
||||
.syntaxhl .escape {
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.syntaxhl .exception {
|
||||
color: #C00;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.syntaxhl .float {
|
||||
color: #60E;
|
||||
}
|
||||
|
||||
.syntaxhl .function {
|
||||
color: #06B;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.syntaxhl .global-variable {
|
||||
color: #d70;
|
||||
}
|
||||
|
||||
.syntaxhl .hex {
|
||||
color: #02b;
|
||||
}
|
||||
|
||||
.syntaxhl .imaginary {
|
||||
color: #f00;
|
||||
}
|
||||
|
||||
.syntaxhl .include {
|
||||
color: #B44;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.syntaxhl .inline {
|
||||
background-color: hsla(0,0%,0%,0.07);
|
||||
color: black;
|
||||
}
|
||||
|
||||
.syntaxhl .inline-delimiter {
|
||||
font-weight: bold;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.syntaxhl .instance-variable {
|
||||
color: #33B;
|
||||
}
|
||||
|
||||
.syntaxhl .integer {
|
||||
color: #00D;
|
||||
}
|
||||
|
||||
.syntaxhl .key .char {
|
||||
color: #60f;
|
||||
}
|
||||
|
||||
.syntaxhl .key .delimiter {
|
||||
color: #404;
|
||||
}
|
||||
|
||||
.syntaxhl .key {
|
||||
color: #606;
|
||||
}
|
||||
|
||||
.syntaxhl .keyword {
|
||||
color: #080;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.syntaxhl .label {
|
||||
color: #970;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.syntaxhl .local-variable {
|
||||
color: #963;
|
||||
}
|
||||
|
||||
.syntaxhl .namespace {
|
||||
color: #707;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.syntaxhl .octal {
|
||||
color: #40E;
|
||||
}
|
||||
|
||||
.syntaxhl .operator {
|
||||
}
|
||||
|
||||
.syntaxhl .predefined {
|
||||
color: #369;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.syntaxhl .predefined-constant {
|
||||
color: #069;
|
||||
}
|
||||
|
||||
.syntaxhl .predefined-type {
|
||||
color: #0a5;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.syntaxhl .preprocessor {
|
||||
color: #579;
|
||||
}
|
||||
|
||||
.syntaxhl .pseudo-class {
|
||||
color: #00C;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.syntaxhl .regexp .content {
|
||||
color: #808;
|
||||
}
|
||||
|
||||
.syntaxhl .regexp .delimiter {
|
||||
color: #404;
|
||||
}
|
||||
|
||||
.syntaxhl .regexp .modifier {
|
||||
color: #C2C;
|
||||
}
|
||||
|
||||
.syntaxhl .regexp {
|
||||
background-color: hsla(300,100%,50%,0.06);
|
||||
}
|
||||
|
||||
.syntaxhl .reserved {
|
||||
color: #080;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.syntaxhl .shell .content {
|
||||
color: #2B2;
|
||||
}
|
||||
|
||||
.syntaxhl .shell .delimiter {
|
||||
color: #161;
|
||||
}
|
||||
|
||||
.syntaxhl .shell {
|
||||
background-color: hsla(120,100%,50%,0.06);
|
||||
}
|
||||
|
||||
.syntaxhl .string .char {
|
||||
color: #b0b;
|
||||
}
|
||||
|
||||
.syntaxhl .string .content {
|
||||
color: #D20;
|
||||
}
|
||||
|
||||
.syntaxhl .string .delimiter {
|
||||
color: #710;
|
||||
}
|
||||
|
||||
.syntaxhl .string .modifier {
|
||||
color: #E40;
|
||||
}
|
||||
|
||||
.syntaxhl .string {
|
||||
background-color: hsla(0,100%,50%,0.05);
|
||||
}
|
||||
|
||||
.syntaxhl .symbol .content {
|
||||
color: #A60;
|
||||
}
|
||||
|
||||
.syntaxhl .symbol .delimiter {
|
||||
color: #630;
|
||||
}
|
||||
|
||||
.syntaxhl .symbol {
|
||||
color: #A60;
|
||||
}
|
||||
|
||||
.syntaxhl .tag {
|
||||
color: #070;
|
||||
}
|
||||
|
||||
.syntaxhl .type {
|
||||
color: #339;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.syntaxhl .value {
|
||||
color: #088;
|
||||
}
|
||||
|
||||
.syntaxhl .variable {
|
||||
color: #037;
|
||||
}
|
||||
|
||||
.syntaxhl .insert {
|
||||
background: hsla(120,100%,50%,0.12);
|
||||
}
|
||||
|
||||
.syntaxhl .delete {
|
||||
background: hsla(0,100%,50%,0.12);
|
||||
}
|
||||
|
||||
.syntaxhl .change {
|
||||
color: #bbf;
|
||||
background: #007;
|
||||
}
|
||||
|
||||
.syntaxhl .head {
|
||||
color: #f8f;
|
||||
background: #505;
|
||||
}
|
||||
|
||||
.syntaxhl .head .filename {
|
||||
color: white;
|
||||
}
|
||||
|
||||
.syntaxhl .delete .eyecatcher {
|
||||
background-color: hsla(0,100%,50%,0.2);
|
||||
border: 1px solid hsla(0,100%,45%,0.5);
|
||||
margin: -1px;
|
||||
border-bottom: none;
|
||||
border-top-left-radius: 5px;
|
||||
border-top-right-radius: 5px;
|
||||
}
|
||||
|
||||
.syntaxhl .insert .eyecatcher {
|
||||
background-color: hsla(120,100%,50%,0.2);
|
||||
border: 1px solid hsla(120,100%,25%,0.5);
|
||||
margin: -1px;
|
||||
border-top: none;
|
||||
border-bottom-left-radius: 5px;
|
||||
border-bottom-right-radius: 5px;
|
||||
}
|
||||
|
||||
.syntaxhl .insert .insert {
|
||||
color: #0c0;
|
||||
background: transparent;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.syntaxhl .delete .delete {
|
||||
color: #c00;
|
||||
background: transparent;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.syntaxhl .change .change {
|
||||
color: #88f;
|
||||
}
|
||||
|
||||
.syntaxhl .head .head {
|
||||
color: #f4f;
|
||||
}
|
||||
|
|
|
@ -147,6 +147,28 @@ LOREM
|
|||
end
|
||||
end
|
||||
|
||||
context "#add_attachment" do
|
||||
setup do
|
||||
@request.session[:user_id] = 2
|
||||
set_tmp_attachments_directory
|
||||
@document = Document.generate!(:project => Project.find('ecookbook'),
|
||||
:title => 'Test')
|
||||
end
|
||||
|
||||
should "send a notification mail" do
|
||||
ActionMailer::Base.deliveries.clear
|
||||
Setting.notified_events = Setting.notified_events.dup << 'document_added'
|
||||
|
||||
post :add_attachment,
|
||||
:id => @document.id,
|
||||
:attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain')}}
|
||||
|
||||
@document.reload
|
||||
assert_not_nil @document
|
||||
assert_equal 2, ActionMailer::Base.deliveries.size
|
||||
end
|
||||
end
|
||||
|
||||
def test_destroy
|
||||
@request.session[:user_id] = 2
|
||||
post :destroy, :id => 1
|
||||
|
|
|
@ -121,6 +121,30 @@ class MessagesControllerTest < ActionController::TestCase
|
|||
assert_equal 'New body', message.content
|
||||
end
|
||||
|
||||
def test_post_edit_sticky_and_locked
|
||||
@request.session[:user_id] = 2
|
||||
post :edit, :board_id => 1, :id => 1,
|
||||
:message => { :subject => 'New subject',
|
||||
:content => 'New body',
|
||||
:locked => '1',
|
||||
:sticky => '1'}
|
||||
assert_redirected_to '/boards/1/topics/1'
|
||||
message = Message.find(1)
|
||||
assert_equal true, message.sticky?
|
||||
assert_equal true, message.locked?
|
||||
end
|
||||
|
||||
def test_post_edit_should_allow_to_change_board
|
||||
@request.session[:user_id] = 2
|
||||
post :edit, :board_id => 1, :id => 1,
|
||||
:message => { :subject => 'New subject',
|
||||
:content => 'New body',
|
||||
:board_id => 2}
|
||||
assert_redirected_to '/boards/2/topics/1'
|
||||
message = Message.find(1)
|
||||
assert_equal Board.find(2), message.board
|
||||
end
|
||||
|
||||
def test_reply
|
||||
@request.session[:user_id] = 2
|
||||
post :reply, :board_id => 1, :id => 1, :reply => { :content => 'This is a test reply', :subject => 'Test reply' }
|
||||
|
|
|
@ -131,6 +131,10 @@ class ProjectEnumerationsControllerTest < ActionController::TestCase
|
|||
end
|
||||
|
||||
def test_update_when_creating_new_activities_will_not_convert_existing_data_if_an_exception_is_raised
|
||||
# SQLite doesn't support nested transactions, thus we can't test transaction-
|
||||
# based features in a test wrapped in a transaction.
|
||||
return if ChiliProject::Database.sqlite?
|
||||
|
||||
# TODO: Need to cause an exception on create but these tests
|
||||
# aren't setup for mocking. Just create a record now so the
|
||||
# second one is a dupicate
|
||||
|
|
|
@ -112,13 +112,18 @@ class VersionsControllerTest < ActionController::TestCase
|
|||
|
||||
def test_post_update
|
||||
@request.session[:user_id] = 2
|
||||
|
||||
today = Date.today
|
||||
put :update, :id => 2,
|
||||
:version => { :name => 'New version name',
|
||||
:effective_date => Date.today.strftime("%Y-%m-%d")}
|
||||
:start_date => today.yesterday.strftime("%Y-%m-%d"),
|
||||
:effective_date => today.strftime("%Y-%m-%d"),
|
||||
}
|
||||
assert_redirected_to :controller => 'projects', :action => 'settings', :tab => 'versions', :id => 'ecookbook'
|
||||
version = Version.find(2)
|
||||
assert_equal 'New version name', version.name
|
||||
assert_equal Date.today, version.effective_date
|
||||
assert_equal today.yesterday, version.start_date
|
||||
assert_equal today, version.effective_date
|
||||
end
|
||||
|
||||
def test_post_update_with_validation_failure
|
||||
|
|
|
@ -664,6 +664,14 @@ RAW
|
|||
Setting.gravatar_enabled = '1'
|
||||
assert avatar(User.find_by_mail('jsmith@somenet.foo')).include?(Digest::MD5.hexdigest('jsmith@somenet.foo'))
|
||||
assert avatar('jsmith <jsmith@somenet.foo>').include?(Digest::MD5.hexdigest('jsmith@somenet.foo'))
|
||||
# Default size is 50
|
||||
assert avatar('jsmith <jsmith@somenet.foo>').include?('s=50')
|
||||
assert avatar('jsmith <jsmith@somenet.foo>', :size => 24).include?('s=24')
|
||||
# Non-avatar options should be considered html options
|
||||
assert avatar('jsmith <jsmith@somenet.foo>', :title => 'John Smith').include?('title="John Smith"')
|
||||
# The default class of the img tag should be gravatar
|
||||
assert avatar('jsmith <jsmith@somenet.foo>').include?('class="gravatar"')
|
||||
assert !avatar('jsmith <jsmith@somenet.foo>', :class => 'picture').include?('class="gravatar"')
|
||||
assert_nil avatar('jsmith')
|
||||
assert_nil avatar(nil)
|
||||
|
||||
|
|
|
@ -21,6 +21,7 @@ class IssueTest < ActiveSupport::TestCase
|
|||
:issue_statuses, :issue_categories, :issue_relations, :workflows,
|
||||
:enumerations,
|
||||
:issues,
|
||||
:journals,
|
||||
:custom_fields, :custom_fields_projects, :custom_fields_trackers, :custom_values,
|
||||
:time_entries
|
||||
|
||||
|
|
|
@ -14,7 +14,9 @@
|
|||
require File.expand_path('../../test_helper', __FILE__)
|
||||
|
||||
class JournalTest < ActiveSupport::TestCase
|
||||
fixtures :issues, :issue_statuses, :journals, :enumerations
|
||||
fixtures :issues, :issue_statuses, :journals, :enumerations,\
|
||||
:users, :trackers, :projects, :members, :member_roles, :roles,\
|
||||
:enabled_modules
|
||||
|
||||
def setup
|
||||
@journal = IssueJournal.find(1)
|
||||
|
@ -35,23 +37,17 @@ class JournalTest < ActiveSupport::TestCase
|
|||
|
||||
def test_create_should_send_email_notification
|
||||
ActionMailer::Base.deliveries.clear
|
||||
issue = Issue.find(:first)
|
||||
if issue.journals.empty?
|
||||
issue.init_journal(User.current, "This journal represents the creationa of journal version 1")
|
||||
issue.save
|
||||
end
|
||||
user = User.find(:first)
|
||||
issue = issues :issues_001
|
||||
|
||||
assert_equal 0, ActionMailer::Base.deliveries.size
|
||||
issue.reload
|
||||
issue.update_attribute(:subject, "New subject to trigger automatic journal entry")
|
||||
assert_equal 2, ActionMailer::Base.deliveries.size
|
||||
end
|
||||
|
||||
def test_create_should_not_send_email_notification_if_told_not_to
|
||||
ActionMailer::Base.deliveries.clear
|
||||
issue = Issue.find(:first)
|
||||
user = User.find(:first)
|
||||
issue = issues :issues_001
|
||||
user = users :users_001
|
||||
journal = issue.init_journal(user, "A note")
|
||||
JournalObserver.instance.send_notification = false
|
||||
|
||||
|
|
|
@ -231,6 +231,13 @@ begin
|
|||
end
|
||||
end
|
||||
|
||||
def test_default_branch
|
||||
@adapter.send :scm_cmd, 'branch', '-m', 'master', 'non-master-default-branch'
|
||||
assert_equal 'non-master-default-branch', @adapter.default_branch
|
||||
ensure
|
||||
@adapter.send :scm_cmd, 'branch', '-m', 'non-master-default-branch', 'master'
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def test_scm_version_for(scm_command_version, version)
|
||||
|
|
|
@ -101,6 +101,18 @@ class MessageTest < ActiveSupport::TestCase
|
|||
# Watchers removed
|
||||
end
|
||||
|
||||
def test_destroy_last_reply
|
||||
message = Message.find(4)
|
||||
last_reply = message.last_reply
|
||||
penultimate_reply = message.children[-2]
|
||||
|
||||
assert last_reply.destroy
|
||||
|
||||
message.reload
|
||||
|
||||
assert_equal penultimate_reply, message.last_reply
|
||||
end
|
||||
|
||||
def test_destroy_reply
|
||||
message = Message.find(5)
|
||||
board = message.board
|
||||
|
|
|
@ -17,7 +17,7 @@ class NewsTest < ActiveSupport::TestCase
|
|||
fixtures :projects, :users, :roles, :members, :member_roles, :enabled_modules, :news
|
||||
|
||||
def valid_news
|
||||
{ :title => 'Test news', :description => 'Lorem ipsum etc', :author => User.find(:first) }
|
||||
{ :title => 'Test news', :description => 'Lorem ipsum etc', :author => users(:users_001) }
|
||||
end
|
||||
|
||||
|
||||
|
@ -28,7 +28,7 @@ class NewsTest < ActiveSupport::TestCase
|
|||
def test_create_should_send_email_notification
|
||||
ActionMailer::Base.deliveries.clear
|
||||
Setting.notified_events = Setting.notified_events.dup << 'news_added'
|
||||
news = Project.find(:first).news.new(valid_news)
|
||||
news = projects(:projects_001).news.new(valid_news)
|
||||
|
||||
assert news.save
|
||||
assert_equal 2, ActionMailer::Base.deliveries.size
|
||||
|
|
|
@ -82,7 +82,7 @@ class ProjectTest < ActiveSupport::TestCase
|
|||
end
|
||||
|
||||
assert_equal Tracker.all, Project.new.trackers
|
||||
assert_equal Tracker.find(1, 3), Project.new(:tracker_ids => [1, 3]).trackers
|
||||
assert_equal Tracker.find(1, 3).sort_by(&:id), Project.new(:tracker_ids => [1, 3]).trackers.sort_by(&:id)
|
||||
end
|
||||
|
||||
def test_update
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
coverage
|
|
@ -1,20 +0,0 @@
|
|||
Copyright (c) 2007 West Arete Computing, Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@ -1,55 +0,0 @@
|
|||
== Gravatar Plugin
|
||||
|
||||
This plugin provides a handful of view helpers for displaying gravatars
|
||||
(globally-recognized avatars).
|
||||
|
||||
Gravatars allow users to configure an avatar to go with their email address at
|
||||
a central location: http://gravatar.com. Gravatar-aware websites (such
|
||||
as yours) can then look up and display each user's preferred avatar, without
|
||||
having to handle avatar management. The user gets the benefit of not having to
|
||||
set up an avatar for each site that they post on.
|
||||
|
||||
== Installation
|
||||
|
||||
cd ~/myapp
|
||||
ruby script/plugin install git://github.com/woods/gravatar-plugin.git
|
||||
|
||||
or, if you're using piston[http://piston.rubyforge.org] (worth it!):
|
||||
|
||||
cd ~/myapp/vendor/plugins
|
||||
piston import git://github.com/woods/gravatar-plugin.git
|
||||
|
||||
== Example
|
||||
|
||||
If you represent your users with a model that has an +email+ method (typical
|
||||
for most rails authentication setups), then you can simply use this method
|
||||
in your views:
|
||||
|
||||
<%= gravatar_for @user %>
|
||||
|
||||
This will be replaced with the full HTML +img+ tag necessary for displaying
|
||||
that user's gravatar.
|
||||
|
||||
Other helpers are documented under GravatarHelper::PublicMethods.
|
||||
|
||||
== Acknowledgments
|
||||
|
||||
Thanks to Magnus Bergmark (http://github.com/Mange), who contributed the SSL
|
||||
support in this plugin, as well as a few minor fixes.
|
||||
|
||||
The following people have also written gravatar-related Ruby libraries:
|
||||
* Seth Rasmussen created the gravatar gem[http://gravatar.rubyforge.org]
|
||||
* Matt McCray has also created a gravatar
|
||||
plugin[http://mattmccray.com/svn/rails/plugins/gravatar_helper]
|
||||
|
||||
== Author
|
||||
|
||||
Scott A. Woods
|
||||
West Arete Computing, Inc.
|
||||
http://westarete.com
|
||||
scott at westarete dot com
|
||||
|
||||
== TODO
|
||||
|
||||
* Add specs for ssl support
|
||||
* Finish rdoc documentation
|
|
@ -1,32 +0,0 @@
|
|||
require 'spec/rake/spectask'
|
||||
require 'rake/rdoctask'
|
||||
|
||||
desc 'Default: run all specs'
|
||||
task :default => :spec
|
||||
|
||||
desc 'Run all application-specific specs'
|
||||
Spec::Rake::SpecTask.new(:spec) do |t|
|
||||
# t.rcov = true
|
||||
end
|
||||
|
||||
desc "Report code statistics (KLOCs, etc) from the application"
|
||||
task :stats do
|
||||
RAILS_ROOT = File.dirname(__FILE__)
|
||||
STATS_DIRECTORIES = [
|
||||
%w(Libraries lib/),
|
||||
%w(Specs spec/),
|
||||
].collect { |name, dir| [ name, "#{RAILS_ROOT}/#{dir}" ] }.select { |name, dir| File.directory?(dir) }
|
||||
require 'code_statistics'
|
||||
CodeStatistics.new(*STATS_DIRECTORIES).to_s
|
||||
end
|
||||
|
||||
namespace :doc do
|
||||
desc 'Generate documentation for the assert_request plugin.'
|
||||
Rake::RDocTask.new(:plugin) do |rdoc|
|
||||
rdoc.rdoc_dir = 'rdoc'
|
||||
rdoc.title = 'Gravatar Rails Plugin'
|
||||
rdoc.options << '--line-numbers' << '--inline-source' << '--accessor' << 'cattr_accessor=rw'
|
||||
rdoc.rdoc_files.include('README')
|
||||
rdoc.rdoc_files.include('lib/**/*.rb')
|
||||
end
|
||||
end
|
|
@ -1,7 +0,0 @@
|
|||
author: Scott Woods, West Arete Computing
|
||||
summary: View helpers for displaying gravatars.
|
||||
homepage: http://github.com/woods/gravatar-plugin/
|
||||
plugin: git://github.com/woods/gravatar-plugin.git
|
||||
license: MIT
|
||||
version: 0.1
|
||||
rails_version: 1.0+
|
|
@ -1,3 +0,0 @@
|
|||
#-- encoding: UTF-8
|
||||
require 'gravatar'
|
||||
ActionView::Base.send :include, GravatarHelper::PublicMethods
|
|
@ -1,89 +0,0 @@
|
|||
#-- encoding: UTF-8
|
||||
require 'digest/md5'
|
||||
require 'cgi'
|
||||
|
||||
module GravatarHelper
|
||||
|
||||
# These are the options that control the default behavior of the public
|
||||
# methods. They can be overridden during the actual call to the helper,
|
||||
# or you can set them in your environment.rb as such:
|
||||
#
|
||||
# # Allow racier gravatars
|
||||
# GravatarHelper::DEFAULT_OPTIONS[:rating] = 'R'
|
||||
#
|
||||
DEFAULT_OPTIONS = {
|
||||
# The URL of a default image to display if the given email address does
|
||||
# not have a gravatar.
|
||||
:default => nil,
|
||||
|
||||
# The default size in pixels for the gravatar image (they're square).
|
||||
:size => 50,
|
||||
|
||||
# The maximum allowed MPAA rating for gravatars. This allows you to
|
||||
# exclude gravatars that may be out of character for your site.
|
||||
:rating => 'PG',
|
||||
|
||||
# The alt text to use in the img tag for the gravatar. Since it's a
|
||||
# decorational picture, the alt text should be empty according to the
|
||||
# XHTML specs.
|
||||
:alt => '',
|
||||
|
||||
# The title text to use for the img tag for the gravatar.
|
||||
:title => '',
|
||||
|
||||
# The class to assign to the img tag for the gravatar.
|
||||
:class => 'gravatar',
|
||||
|
||||
# Whether or not to display the gravatars using HTTPS instead of HTTP
|
||||
:ssl => false,
|
||||
}
|
||||
|
||||
# The methods that will be made available to your views.
|
||||
module PublicMethods
|
||||
|
||||
# Return the HTML img tag for the given user's gravatar. Presumes that
|
||||
# the given user object will respond_to "email", and return the user's
|
||||
# email address.
|
||||
def gravatar_for(user, options={})
|
||||
gravatar(user.email, options)
|
||||
end
|
||||
|
||||
# Return the HTML img tag for the given email address's gravatar.
|
||||
def gravatar(email, options={})
|
||||
src = h(gravatar_url(email, options))
|
||||
options = DEFAULT_OPTIONS.merge(options)
|
||||
[:class, :alt, :size, :title].each { |opt| options[opt] = h(options[opt]) }
|
||||
"<img class=\"#{options[:class]}\" alt=\"#{options[:alt]}\" title=\"#{options[:title]}\" width=\"#{options[:size]}\" height=\"#{options[:size]}\" src=\"#{src}\" />"
|
||||
end
|
||||
|
||||
# Returns the base Gravatar URL for the given email hash. If ssl evaluates to true,
|
||||
# a secure URL will be used instead. This is required when the gravatar is to be
|
||||
# displayed on a HTTPS site.
|
||||
def gravatar_api_url(hash, ssl=false)
|
||||
if ssl
|
||||
"https://secure.gravatar.com/avatar/#{hash}"
|
||||
else
|
||||
"http://www.gravatar.com/avatar/#{hash}"
|
||||
end
|
||||
end
|
||||
|
||||
# Return the gravatar URL for the given email address.
|
||||
def gravatar_url(email, options={})
|
||||
email_hash = Digest::MD5.hexdigest(email)
|
||||
options = DEFAULT_OPTIONS.merge(options)
|
||||
options[:default] = CGI::escape(options[:default]) unless options[:default].nil?
|
||||
gravatar_api_url(email_hash, options.delete(:ssl)).tap do |url|
|
||||
opts = []
|
||||
[:rating, :size, :default].each do |opt|
|
||||
unless options[opt].nil?
|
||||
value = h(options[opt])
|
||||
opts << [opt, value].join('=')
|
||||
end
|
||||
end
|
||||
url << "?#{opts.join('&')}" unless opts.empty?
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
|
@ -1,44 +0,0 @@
|
|||
#-- encoding: UTF-8
|
||||
require 'rubygems'
|
||||
require 'erb' # to get "h"
|
||||
require 'active_support' # to get "returning"
|
||||
require File.dirname(__FILE__) + '/../lib/gravatar'
|
||||
include GravatarHelper, GravatarHelper::PublicMethods, ERB::Util
|
||||
|
||||
describe "gravatar_url with a custom default URL" do
|
||||
before(:each) do
|
||||
@original_options = DEFAULT_OPTIONS.dup
|
||||
DEFAULT_OPTIONS[:default] = "no_avatar.png"
|
||||
@url = gravatar_url("somewhere")
|
||||
end
|
||||
|
||||
it "should include the \"default\" argument in the result" do
|
||||
@url.should match(/&default=no_avatar.png/)
|
||||
end
|
||||
|
||||
after(:each) do
|
||||
DEFAULT_OPTIONS.merge!(@original_options)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
describe "gravatar_url with default settings" do
|
||||
before(:each) do
|
||||
@url = gravatar_url("somewhere")
|
||||
end
|
||||
|
||||
it "should have a nil default URL" do
|
||||
DEFAULT_OPTIONS[:default].should be_nil
|
||||
end
|
||||
|
||||
it "should not include the \"default\" argument in the result" do
|
||||
@url.should_not match(/&default=/)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
describe "gravatar with a custom title option" do
|
||||
it "should include the title in the result" do
|
||||
gravatar('example@example.com', :title => "This is a title attribute").should match(/This is a title attribute/)
|
||||
end
|
||||
end
|
Loading…
Reference in New Issue