Merge branch 'master' into backbone.ws

This commit is contained in:
Kolan Sh 2012-06-15 00:12:40 +04:00
commit 1e908da66c
64 changed files with 5412 additions and 3042 deletions

1
.gitignore vendored
View File

@ -31,3 +31,4 @@ doc/app
/.rvmrc*
/*.iml
/.idea
.rbx

34
.travis.yml Normal file
View File

@ -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"

View File

@ -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

View File

@ -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)]

View File

@ -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

View File

@ -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

View File

@ -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 = { })

View File

@ -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

View File

@ -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

View File

@ -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',

View File

@ -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">

View File

@ -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| %>

View File

@ -3,5 +3,4 @@
<%= call_hook(:view_issues_sidebar_planning_bottom) %>
<%= render_sidebar_queries %>
<%= call_hook(:view_issues_sidebar_queries_bottom) %>

View File

@ -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>

View File

@ -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 %>

View File

@ -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>

View File

@ -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 %>

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -1 +1,3 @@
.icon-example-works { background-image: url(../images/it_works.png); }
.icon-example-works {
background-image: url(../images/it_works.png);
}

View File

@ -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).

View File

@ -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
})

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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);

View File

@ -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

View File

@ -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;

View File

@ -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;

View File

@ -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%;

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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);
}

View File

@ -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;
}
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -1,181 +1,583 @@
div.changeset-changes ul { margin: 0; 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;
div.changeset-changes ul {
margin: 0;
padding: 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: " - "}
div.changeset-changes ul > ul {
margin-left: 18px;
padding: 0;
}
#changes-legend { float: right; font-size: 0.8em; margin: 0; }
#changes-legend li { float: left; background-position: 5px 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;
}
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: " - ";
}
#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;
}

View File

@ -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

View File

@ -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' }

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -1 +0,0 @@
coverage

View File

@ -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.

View File

@ -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

View File

@ -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

View File

@ -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+

View File

@ -1,3 +0,0 @@
#-- encoding: UTF-8
require 'gravatar'
ActionView::Base.send :include, GravatarHelper::PublicMethods

View File

@ -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

View File

@ -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