##// END OF EJS Templates
Added the ability to login via OpenID....
Eric Davis -
r2381:896e64b759ae
parent child
Show More
1 NO CONTENT: new file 100644, binary diff hidden
@@ -1,194 +1,235
1 1 # Redmine - project management software
2 2 # Copyright (C) 2006-2008 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 class AccountController < ApplicationController
19 19 helper :custom_fields
20 20 include CustomFieldsHelper
21 21
22 22 # prevents login action to be filtered by check_if_login_required application scope filter
23 23 skip_before_filter :check_if_login_required, :only => [:login, :lost_password, :register, :activate]
24 24
25 25 # Show user's account
26 26 def show
27 27 @user = User.active.find(params[:id])
28 28 @custom_values = @user.custom_values
29 29
30 30 # show only public projects and private projects that the logged in user is also a member of
31 31 @memberships = @user.memberships.select do |membership|
32 32 membership.project.is_public? || (User.current.member_of?(membership.project))
33 33 end
34 34
35 35 events = Redmine::Activity::Fetcher.new(User.current, :author => @user).events(nil, nil, :limit => 10)
36 36 @events_by_day = events.group_by(&:event_date)
37 37
38 38 rescue ActiveRecord::RecordNotFound
39 39 render_404
40 40 end
41 41
42 42 # Login request and validation
43 43 def login
44 44 if request.get?
45 45 # Logout user
46 46 self.logged_user = nil
47 47 else
48 48 # Authenticate user
49 user = User.try_to_login(params[:username], params[:password])
50 if user.nil?
51 # Invalid credentials
52 flash.now[:error] = l(:notice_account_invalid_creditentials)
53 elsif user.new_record?
54 # Onthefly creation failed, display the registration form to fill/fix attributes
55 @user = user
56 session[:auth_source_registration] = {:login => user.login, :auth_source_id => user.auth_source_id }
57 render :action => 'register'
49 unless using_open_id?
50 password_authentication
58 51 else
59 # Valid user
60 self.logged_user = user
61 # generate a key and set cookie if autologin
62 if params[:autologin] && Setting.autologin?
63 token = Token.create(:user => user, :action => 'autologin')
64 cookies[:autologin] = { :value => token.value, :expires => 1.year.from_now }
65 end
66 redirect_back_or_default :controller => 'my', :action => 'page'
52 open_id_authenticate(params[:openid_url])
67 53 end
68 54 end
69 55 end
70 56
71 57 # Log out current user and redirect to welcome page
72 58 def logout
73 59 cookies.delete :autologin
74 60 Token.delete_all(["user_id = ? AND action = ?", User.current.id, 'autologin']) if User.current.logged?
75 61 self.logged_user = nil
76 62 redirect_to home_url
77 63 end
78 64
79 65 # Enable user to choose a new password
80 66 def lost_password
81 67 redirect_to(home_url) && return unless Setting.lost_password?
82 68 if params[:token]
83 69 @token = Token.find_by_action_and_value("recovery", params[:token])
84 70 redirect_to(home_url) && return unless @token and !@token.expired?
85 71 @user = @token.user
86 72 if request.post?
87 73 @user.password, @user.password_confirmation = params[:new_password], params[:new_password_confirmation]
88 74 if @user.save
89 75 @token.destroy
90 76 flash[:notice] = l(:notice_account_password_updated)
91 77 redirect_to :action => 'login'
92 78 return
93 79 end
94 80 end
95 81 render :template => "account/password_recovery"
96 82 return
97 83 else
98 84 if request.post?
99 85 user = User.find_by_mail(params[:mail])
100 86 # user not found in db
101 87 flash.now[:error] = l(:notice_account_unknown_email) and return unless user
102 88 # user uses an external authentification
103 89 flash.now[:error] = l(:notice_can_t_change_password) and return if user.auth_source_id
104 90 # create a new token for password recovery
105 91 token = Token.new(:user => user, :action => "recovery")
106 92 if token.save
107 93 Mailer.deliver_lost_password(token)
108 94 flash[:notice] = l(:notice_account_lost_email_sent)
109 95 redirect_to :action => 'login'
110 96 return
111 97 end
112 98 end
113 99 end
114 100 end
115 101
116 102 # User self-registration
117 103 def register
118 104 redirect_to(home_url) && return unless Setting.self_registration? || session[:auth_source_registration]
119 105 if request.get?
120 106 session[:auth_source_registration] = nil
121 107 @user = User.new(:language => Setting.default_language)
122 108 else
123 109 @user = User.new(params[:user])
124 110 @user.admin = false
125 111 @user.status = User::STATUS_REGISTERED
126 112 if session[:auth_source_registration]
127 113 @user.status = User::STATUS_ACTIVE
128 114 @user.login = session[:auth_source_registration][:login]
129 115 @user.auth_source_id = session[:auth_source_registration][:auth_source_id]
130 116 if @user.save
131 117 session[:auth_source_registration] = nil
132 118 self.logged_user = @user
133 119 flash[:notice] = l(:notice_account_activated)
134 120 redirect_to :controller => 'my', :action => 'account'
135 121 end
136 122 else
137 123 @user.login = params[:user][:login]
138 124 @user.password, @user.password_confirmation = params[:password], params[:password_confirmation]
139 125 case Setting.self_registration
140 126 when '1'
141 127 # Email activation
142 128 token = Token.new(:user => @user, :action => "register")
143 129 if @user.save and token.save
144 130 Mailer.deliver_register(token)
145 131 flash[:notice] = l(:notice_account_register_done)
146 132 redirect_to :action => 'login'
147 133 end
148 134 when '3'
149 135 # Automatic activation
150 136 @user.status = User::STATUS_ACTIVE
151 137 if @user.save
152 138 self.logged_user = @user
153 139 flash[:notice] = l(:notice_account_activated)
154 140 redirect_to :controller => 'my', :action => 'account'
155 141 end
156 142 else
157 143 # Manual activation by the administrator
158 144 if @user.save
159 145 # Sends an email to the administrators
160 146 Mailer.deliver_account_activation_request(@user)
161 147 flash[:notice] = l(:notice_account_pending)
162 148 redirect_to :action => 'login'
163 149 end
164 150 end
165 151 end
166 152 end
167 153 end
168 154
169 155 # Token based account activation
170 156 def activate
171 157 redirect_to(home_url) && return unless Setting.self_registration? && params[:token]
172 158 token = Token.find_by_action_and_value('register', params[:token])
173 159 redirect_to(home_url) && return unless token and !token.expired?
174 160 user = token.user
175 161 redirect_to(home_url) && return unless user.status == User::STATUS_REGISTERED
176 162 user.status = User::STATUS_ACTIVE
177 163 if user.save
178 164 token.destroy
179 165 flash[:notice] = l(:notice_account_activated)
180 166 end
181 167 redirect_to :action => 'login'
182 168 end
183 169
184 170 private
185 171 def logged_user=(user)
186 172 if user && user.is_a?(User)
187 173 User.current = user
188 174 session[:user_id] = user.id
189 175 else
190 176 User.current = User.anonymous
191 177 session[:user_id] = nil
192 178 end
193 179 end
180
181 def password_authentication
182 user = User.try_to_login(params[:username], params[:password])
183 if user.nil?
184 # Invalid credentials
185 flash.now[:error] = l(:notice_account_invalid_creditentials)
186 elsif user.new_record?
187 # Onthefly creation failed, display the registration form to fill/fix attributes
188 @user = user
189 session[:auth_source_registration] = {:login => user.login, :auth_source_id => user.auth_source_id }
190 render :action => 'register'
191 else
192 # Valid user
193 successful_authentication(user)
194 end
195 end
196
197
198 def open_id_authenticate(openid_url)
199 user = nil
200 authenticate_with_open_id(openid_url, :required => [:nickname, :fullname, :email], :return_to => signin_url) do |result, identity_url, registration|
201 if result.successful?
202 user = User.find_or_initialize_by_identity_url(identity_url)
203 if user.new_record?
204 # Create on the fly
205 # TODO: name
206 user.login = registration['nickname']
207 user.mail = registration['email']
208 user.save
209 end
210
211 user.reload
212 if user.new_record?
213 # Onthefly creation failed, display the registration form to fill/fix attributes
214 @user = user
215 session[:auth_source_registration] = {:login => user.login, :identity_url => identity_url }
216 render :action => 'register'
217 else
218 successful_authentication(user)
219 end
220 end
221 end
222 end
223
224 def successful_authentication(user)
225 # Valid user
226 self.logged_user = user
227 # generate a key and set cookie if autologin
228 if params[:autologin] && Setting.autologin?
229 token = Token.create(:user => user, :action => 'autologin')
230 cookies[:autologin] = { :value => token.value, :expires => 1.year.from_now }
231 end
232 redirect_back_or_default :controller => 'my', :action => 'page'
233 end
234
194 235 end
@@ -1,34 +1,38
1 1 <div id="login-form">
2 2 <% form_tag({:action=> "login"}) do %>
3 3 <%= back_url_hidden_field_tag %>
4 4 <table>
5 5 <tr>
6 6 <td align="right"><label for="username"><%=l(:field_login)%>:</label></td>
7 7 <td align="left"><p><%= text_field_tag 'username', nil, :size => 40 %></p></td>
8 8 </tr>
9 9 <tr>
10 10 <td align="right"><label for="password"><%=l(:field_password)%>:</label></td>
11 11 <td align="left"><%= password_field_tag 'password', nil, :size => 40 %></td>
12 12 </tr>
13 13 <tr>
14 <td align="right"><label for="openid_url"><%=l(:field_identity_url)%></label></td>
15 <td align="left"><%= text_field_tag "openid_url" %></td>
16 </tr>
17 <tr>
14 18 <td></td>
15 19 <td align="left">
16 20 <% if Setting.autologin? %>
17 21 <label for="autologin"><%= check_box_tag 'autologin' %> <%= l(:label_stay_logged_in) %></label>
18 22 <% end %>
19 23 </td>
20 24 </tr>
21 25 <tr>
22 26 <td align="left">
23 27 <% if Setting.lost_password? %>
24 28 <%= link_to l(:label_password_lost), :controller => 'account', :action => 'lost_password' %>
25 29 <% end %>
26 30 </td>
27 31 <td align="right">
28 32 <input type="submit" name="login" value="<%=l(:button_login)%> &#187;" />
29 33 </td>
30 34 </tr>
31 35 </table>
32 36 <%= javascript_tag "Form.Element.focus('username');" %>
33 37 <% end %>
34 38 </div>
@@ -1,39 +1,42
1 <h2><%=l(:label_register)%></h2>
1 <h2><%=l(:label_register)%> <%=link_to l(:label_login_with_open_id_option), signin_url %></h2>
2 2
3 3 <% form_tag({:action => 'register'}, :class => "tabular") do %>
4 4 <%= error_messages_for 'user' %>
5 5
6 6 <div class="box">
7 7 <!--[form:user]-->
8 8 <% if @user.auth_source_id.nil? %>
9 9 <p><label for="user_login"><%=l(:field_login)%> <span class="required">*</span></label>
10 10 <%= text_field 'user', 'login', :size => 25 %></p>
11 11
12 12 <p><label for="password"><%=l(:field_password)%> <span class="required">*</span></label>
13 13 <%= password_field_tag 'password', nil, :size => 25 %><br />
14 14 <em><%= l(:text_caracters_minimum, 4) %></em></p>
15 15
16 16 <p><label for="password_confirmation"><%=l(:field_password_confirmation)%> <span class="required">*</span></label>
17 17 <%= password_field_tag 'password_confirmation', nil, :size => 25 %></p>
18 18 <% end %>
19 19
20 20 <p><label for="user_firstname"><%=l(:field_firstname)%> <span class="required">*</span></label>
21 21 <%= text_field 'user', 'firstname' %></p>
22 22
23 23 <p><label for="user_lastname"><%=l(:field_lastname)%> <span class="required">*</span></label>
24 24 <%= text_field 'user', 'lastname' %></p>
25 25
26 26 <p><label for="user_mail"><%=l(:field_mail)%> <span class="required">*</span></label>
27 27 <%= text_field 'user', 'mail' %></p>
28 28
29 29 <p><label for="user_language"><%=l(:field_language)%></label>
30 30 <%= select("user", "language", lang_options_for_select) %></p>
31 31
32 <p><label for="user_identity_url"><%=l(:field_identity_url)%></label>
33 <%= text_field 'user', 'identity_url' %></p>
34
32 35 <% @user.custom_field_values.select {|v| v.editable? || v.required?}.each do |value| %>
33 36 <p><%= custom_field_tag_with_label :user, value %></p>
34 37 <% end %>
35 38 <!--[eoform:user]-->
36 39 </div>
37 40
38 41 <%= submit_tag l(:button_submit) %>
39 42 <% end %>
@@ -1,56 +1,57
1 1 <div class="contextual">
2 2 <%= link_to(l(:button_change_password), :action => 'password') unless @user.auth_source_id %>
3 3 </div>
4 4 <h2><%=l(:label_my_account)%></h2>
5 5 <%= error_messages_for 'user' %>
6 6
7 7 <% form_for :user, @user, :url => { :action => "account" },
8 8 :builder => TabularFormBuilder,
9 9 :lang => current_language,
10 10 :html => { :id => 'my_account_form' } do |f| %>
11 11 <div class="splitcontentleft">
12 12 <h3><%=l(:label_information_plural)%></h3>
13 13 <div class="box tabular">
14 14 <p><%= f.text_field :firstname, :required => true %></p>
15 15 <p><%= f.text_field :lastname, :required => true %></p>
16 16 <p><%= f.text_field :mail, :required => true %></p>
17 17 <p><%= f.select :language, lang_options_for_select %></p>
18 <p><%= f.text_field :identity_url %></p>
18 19
19 20 <% @user.custom_field_values.select(&:editable?).each do |value| %>
20 21 <p><%= custom_field_tag_with_label :user, value %></p>
21 22 <% end %>
22 23 </div>
23 24
24 25 <%= submit_tag l(:button_save) %>
25 26 </div>
26 27
27 28 <div class="splitcontentright">
28 29 <h3><%=l(:field_mail_notification)%></h3>
29 30 <div class="box">
30 31 <%= select_tag 'notification_option', options_for_select(@notification_options, @notification_option),
31 32 :onchange => 'if ($("notification_option").value == "selected") {Element.show("notified-projects")} else {Element.hide("notified-projects")}' %>
32 33 <% content_tag 'div', :id => 'notified-projects', :style => (@notification_option == 'selected' ? '' : 'display:none;') do %>
33 34 <p><% User.current.projects.each do |project| %>
34 35 <label><%= check_box_tag 'notified_project_ids[]', project.id, @user.notified_projects_ids.include?(project.id) %> <%=h project.name %></label><br />
35 36 <% end %></p>
36 37 <p><em><%= l(:text_user_mail_option) %></em></p>
37 38 <% end %>
38 39 <p><label><%= check_box_tag 'no_self_notified', 1, @user.pref[:no_self_notified] %> <%= l(:label_user_mail_no_self_notified) %></label></p>
39 40 </div>
40 41
41 42 <h3><%=l(:label_preferences)%></h3>
42 43 <div class="box tabular">
43 44 <% fields_for :pref, @user.pref, :builder => TabularFormBuilder, :lang => current_language do |pref_fields| %>
44 45 <p><%= pref_fields.check_box :hide_mail %></p>
45 46 <p><%= pref_fields.select :time_zone, ActiveSupport::TimeZone.all.collect {|z| [ z.to_s, z.name ]}, :include_blank => true %></p>
46 47 <p><%= pref_fields.select :comments_sorting, [[l(:label_chronological_order), 'asc'], [l(:label_reverse_chronological_order), 'desc']] %></p>
47 48 <% end %>
48 49 </div>
49 50 </div>
50 51 <% end %>
51 52
52 53 <% content_for :sidebar do %>
53 54 <%= render :partial => 'sidebar' %>
54 55 <% end %>
55 56
56 57 <% html_title(l(:label_my_account)) -%>
@@ -1,31 +1,32
1 1 <%= error_messages_for 'user' %>
2 2
3 3 <!--[form:user]-->
4 4 <div class="box">
5 5 <p><%= f.text_field :login, :required => true, :size => 25 %></p>
6 6 <p><%= f.text_field :firstname, :required => true %></p>
7 7 <p><%= f.text_field :lastname, :required => true %></p>
8 8 <p><%= f.text_field :mail, :required => true %></p>
9 9 <p><%= f.select :language, lang_options_for_select %></p>
10 <p><%= f.text_field :identity_url %></p>
10 11
11 12 <% @user.custom_field_values.each do |value| %>
12 13 <p><%= custom_field_tag_with_label :user, value %></p>
13 14 <% end %>
14 15
15 16 <p><%= f.check_box :admin, :disabled => (@user == User.current) %></p>
16 17 </div>
17 18
18 19 <div class="box">
19 20 <h3><%=l(:label_authentication)%></h3>
20 21 <% unless @auth_sources.empty? %>
21 22 <p><%= f.select :auth_source_id, ([[l(:label_internal), ""]] + @auth_sources.collect { |a| [a.name, a.id] }), {}, :onchange => "if (this.value=='') {Element.show('password_fields');} else {Element.hide('password_fields');}" %></p>
22 23 <% end %>
23 24 <div id="password_fields" style="<%= 'display:none;' if @user.auth_source %>">
24 25 <p><label for="password"><%=l(:field_password)%><span class="required"> *</span></label>
25 26 <%= password_field_tag 'password', nil, :size => 25 %><br />
26 27 <em><%= l(:text_caracters_minimum, 4) %></em></p>
27 28 <p><label for="password_confirmation"><%=l(:field_password_confirmation)%><span class="required"> *</span></label>
28 29 <%= password_field_tag 'password_confirmation', nil, :size => 25 %></p>
29 30 </div>
30 31 </div>
31 32 <!--[eoform:user]-->
@@ -1,258 +1,260
1 1 ActionController::Routing::Routes.draw do |map|
2 2 # Add your own custom routes here.
3 3 # The priority is based upon order of creation: first created -> highest priority.
4 4
5 5 # Here's a sample route:
6 6 # map.connect 'products/:id', :controller => 'catalog', :action => 'view'
7 7 # Keep in mind you can assign values other than :controller and :action
8 8
9 9 # Allow Redmine plugins to map routes and potentially override them
10 10 Rails.plugins.each do |plugin|
11 11 map.from_plugin plugin.name.to_sym
12 12 end
13 13
14 14 map.home '', :controller => 'welcome'
15 15
16 16 map.signin 'login', :controller => 'account', :action => 'login'
17 17 map.signout 'logout', :controller => 'account', :action => 'logout'
18 18
19 19 map.connect 'roles/workflow/:id/:role_id/:tracker_id', :controller => 'roles', :action => 'workflow'
20 20 map.connect 'help/:ctrl/:page', :controller => 'help'
21 21
22 22 map.connect 'time_entries/:id/edit', :action => 'edit', :controller => 'timelog'
23 23 map.connect 'projects/:project_id/time_entries/new', :action => 'edit', :controller => 'timelog'
24 24 map.connect 'projects/:project_id/issues/:issue_id/time_entries/new', :action => 'edit', :controller => 'timelog'
25 25
26 26 map.with_options :controller => 'timelog' do |timelog|
27 27 timelog.connect 'projects/:project_id/time_entries', :action => 'details'
28 28
29 29 timelog.with_options :action => 'details', :conditions => {:method => :get} do |time_details|
30 30 time_details.connect 'time_entries'
31 31 time_details.connect 'time_entries.:format'
32 32 time_details.connect 'issues/:issue_id/time_entries'
33 33 time_details.connect 'issues/:issue_id/time_entries.:format'
34 34 time_details.connect 'projects/:project_id/time_entries.:format'
35 35 time_details.connect 'projects/:project_id/issues/:issue_id/time_entries'
36 36 time_details.connect 'projects/:project_id/issues/:issue_id/time_entries.:format'
37 37 end
38 38 timelog.connect 'projects/:project_id/time_entries/report', :action => 'report'
39 39 timelog.with_options :action => 'report',:conditions => {:method => :get} do |time_report|
40 40 time_report.connect 'time_entries/report'
41 41 time_report.connect 'time_entries/report.:format'
42 42 time_report.connect 'projects/:project_id/time_entries/report.:format'
43 43 end
44 44
45 45 timelog.with_options :action => 'edit', :conditions => {:method => :get} do |time_edit|
46 46 time_edit.connect 'issues/:issue_id/time_entries/new'
47 47 end
48 48
49 49 timelog.connect 'time_entries/:id/destroy', :action => 'destroy', :conditions => {:method => :post}
50 50 end
51 51
52 52 map.connect 'projects/:id/wiki', :controller => 'wikis', :action => 'edit', :conditions => {:method => :post}
53 53 map.connect 'projects/:id/wiki/destroy', :controller => 'wikis', :action => 'destroy', :conditions => {:method => :get}
54 54 map.connect 'projects/:id/wiki/destroy', :controller => 'wikis', :action => 'destroy', :conditions => {:method => :post}
55 55 map.with_options :controller => 'wiki' do |wiki_routes|
56 56 wiki_routes.with_options :conditions => {:method => :get} do |wiki_views|
57 57 wiki_views.connect 'projects/:id/wiki/:page', :action => 'special', :page => /page_index|date_index|export/i
58 58 wiki_views.connect 'projects/:id/wiki/:page', :action => 'index', :page => nil
59 59 wiki_views.connect 'projects/:id/wiki/:page/edit', :action => 'edit'
60 60 wiki_views.connect 'projects/:id/wiki/:page/rename', :action => 'rename'
61 61 wiki_views.connect 'projects/:id/wiki/:page/history', :action => 'history'
62 62 wiki_views.connect 'projects/:id/wiki/:page/diff/:version/vs/:version_from', :action => 'diff'
63 63 wiki_views.connect 'projects/:id/wiki/:page/annotate/:version', :action => 'annotate'
64 64 end
65 65
66 66 wiki_routes.connect 'projects/:id/wiki/:page/:action',
67 67 :action => /edit|rename|destroy|preview|protect/,
68 68 :conditions => {:method => :post}
69 69 end
70 70
71 71 map.with_options :controller => 'messages' do |messages_routes|
72 72 messages_routes.with_options :conditions => {:method => :get} do |messages_views|
73 73 messages_views.connect 'boards/:board_id/topics/new', :action => 'new'
74 74 messages_views.connect 'boards/:board_id/topics/:id', :action => 'show'
75 75 messages_views.connect 'boards/:board_id/topics/:id/edit', :action => 'edit'
76 76 end
77 77 messages_routes.with_options :conditions => {:method => :post} do |messages_actions|
78 78 messages_actions.connect 'boards/:board_id/topics/new', :action => 'new'
79 79 messages_actions.connect 'boards/:board_id/topics/:id/replies', :action => 'reply'
80 80 messages_actions.connect 'boards/:board_id/topics/:id/:action', :action => /edit|destroy/
81 81 end
82 82 end
83 83
84 84 map.with_options :controller => 'boards' do |board_routes|
85 85 board_routes.with_options :conditions => {:method => :get} do |board_views|
86 86 board_views.connect 'projects/:project_id/boards', :action => 'index'
87 87 board_views.connect 'projects/:project_id/boards/new', :action => 'new'
88 88 board_views.connect 'projects/:project_id/boards/:id', :action => 'show'
89 89 board_views.connect 'projects/:project_id/boards/:id/edit', :action => 'edit'
90 90 end
91 91 board_routes.with_options :conditions => {:method => :post} do |board_actions|
92 92 board_actions.connect 'projects/:project_id/boards', :action => 'new'
93 93 board_actions.connect 'projects/:project_id/boards/:id/:action', :action => /edit|destroy/
94 94 end
95 95 end
96 96
97 97 map.with_options :controller => 'documents' do |document_routes|
98 98 document_routes.with_options :conditions => {:method => :get} do |document_views|
99 99 document_views.connect 'projects/:project_id/documents', :action => 'index'
100 100 document_views.connect 'projects/:project_id/documents/new', :action => 'new'
101 101 document_views.connect 'documents/:id', :action => 'show'
102 102 document_views.connect 'documents/:id/edit', :action => 'edit'
103 103 end
104 104 document_routes.with_options :conditions => {:method => :post} do |document_actions|
105 105 document_actions.connect 'projects/:project_id/documents', :action => 'new'
106 106 document_actions.connect 'documents/:id/:action', :action => /destroy|edit/
107 107 end
108 108 end
109 109
110 110 map.with_options :controller => 'issues' do |issues_routes|
111 111 issues_routes.with_options :conditions => {:method => :get} do |issues_views|
112 112 issues_views.connect 'issues', :action => 'index'
113 113 issues_views.connect 'issues.:format', :action => 'index'
114 114 issues_views.connect 'projects/:project_id/issues', :action => 'index'
115 115 issues_views.connect 'projects/:project_id/issues.:format', :action => 'index'
116 116 issues_views.connect 'projects/:project_id/issues/new', :action => 'new'
117 117 issues_views.connect 'projects/:project_id/issues/gantt', :action => 'gantt'
118 118 issues_views.connect 'projects/:project_id/issues/calendar', :action => 'calendar'
119 119 issues_views.connect 'projects/:project_id/issues/:copy_from/copy', :action => 'new'
120 120 issues_views.connect 'issues/:id', :action => 'show', :id => /\d+/
121 121 issues_views.connect 'issues/:id.:format', :action => 'show', :id => /\d+/
122 122 issues_views.connect 'issues/:id/edit', :action => 'edit', :id => /\d+/
123 123 issues_views.connect 'issues/:id/move', :action => 'move', :id => /\d+/
124 124 end
125 125 issues_routes.with_options :conditions => {:method => :post} do |issues_actions|
126 126 issues_actions.connect 'projects/:project_id/issues', :action => 'new'
127 127 issues_actions.connect 'issues/:id/quoted', :action => 'reply', :id => /\d+/
128 128 issues_actions.connect 'issues/:id/:action', :action => /edit|move|destroy/, :id => /\d+/
129 129 end
130 130 issues_routes.connect 'issues/:action'
131 131 end
132 132
133 133 map.with_options :controller => 'issue_relations', :conditions => {:method => :post} do |relations|
134 134 relations.connect 'issues/:issue_id/relations/:id', :action => 'new'
135 135 relations.connect 'issues/:issue_id/relations/:id/destroy', :action => 'destroy'
136 136 end
137 137
138 138 map.with_options :controller => 'reports', :action => 'issue_report', :conditions => {:method => :get} do |reports|
139 139 reports.connect 'projects/:id/issues/report'
140 140 reports.connect 'projects/:id/issues/report/:detail'
141 141 end
142 142
143 143 map.with_options :controller => 'news' do |news_routes|
144 144 news_routes.with_options :conditions => {:method => :get} do |news_views|
145 145 news_views.connect 'news', :action => 'index'
146 146 news_views.connect 'projects/:project_id/news', :action => 'index'
147 147 news_views.connect 'projects/:project_id/news.:format', :action => 'index'
148 148 news_views.connect 'news.:format', :action => 'index'
149 149 news_views.connect 'projects/:project_id/news/new', :action => 'new'
150 150 news_views.connect 'news/:id', :action => 'show'
151 151 news_views.connect 'news/:id/edit', :action => 'edit'
152 152 end
153 153 news_routes.with_options do |news_actions|
154 154 news_actions.connect 'projects/:project_id/news', :action => 'new'
155 155 news_actions.connect 'news/:id/edit', :action => 'edit'
156 156 news_actions.connect 'news/:id/destroy', :action => 'destroy'
157 157 end
158 158 end
159 159
160 160 map.connect 'projects/:id/members/new', :controller => 'members', :action => 'new'
161 161
162 162 map.with_options :controller => 'users' do |users|
163 163 users.with_options :conditions => {:method => :get} do |user_views|
164 164 user_views.connect 'users', :action => 'list'
165 165 user_views.connect 'users', :action => 'index'
166 166 user_views.connect 'users/new', :action => 'add'
167 167 user_views.connect 'users/:id/edit/:tab', :action => 'edit', :tab => nil
168 168 end
169 169 users.with_options :conditions => {:method => :post} do |user_actions|
170 170 user_actions.connect 'users', :action => 'add'
171 171 user_actions.connect 'users/new', :action => 'add'
172 172 user_actions.connect 'users/:id/edit', :action => 'edit'
173 173 user_actions.connect 'users/:id/memberships', :action => 'edit_membership'
174 174 user_actions.connect 'users/:id/memberships/:membership_id', :action => 'edit_membership'
175 175 user_actions.connect 'users/:id/memberships/:membership_id/destroy', :action => 'destroy_membership'
176 176 end
177 177 end
178 178
179 179 map.with_options :controller => 'projects' do |projects|
180 180 projects.with_options :conditions => {:method => :get} do |project_views|
181 181 project_views.connect 'projects', :action => 'index'
182 182 project_views.connect 'projects.:format', :action => 'index'
183 183 project_views.connect 'projects/new', :action => 'add'
184 184 project_views.connect 'projects/:id', :action => 'show'
185 185 project_views.connect 'projects/:id/:action', :action => /roadmap|changelog|destroy|settings/
186 186 project_views.connect 'projects/:id/files', :action => 'list_files'
187 187 project_views.connect 'projects/:id/files/new', :action => 'add_file'
188 188 project_views.connect 'projects/:id/versions/new', :action => 'add_version'
189 189 project_views.connect 'projects/:id/categories/new', :action => 'add_issue_category'
190 190 project_views.connect 'projects/:id/settings/:tab', :action => 'settings'
191 191 end
192 192
193 193 projects.with_options :action => 'activity', :conditions => {:method => :get} do |activity|
194 194 activity.connect 'projects/:id/activity'
195 195 activity.connect 'projects/:id/activity.:format'
196 196 activity.connect 'activity'
197 197 activity.connect 'activity.:format'
198 198 end
199 199
200 200 projects.with_options :conditions => {:method => :post} do |project_actions|
201 201 project_actions.connect 'projects/new', :action => 'add'
202 202 project_actions.connect 'projects', :action => 'add'
203 203 project_actions.connect 'projects/:id/:action', :action => /destroy|archive|unarchive/
204 204 project_actions.connect 'projects/:id/files/new', :action => 'add_file'
205 205 project_actions.connect 'projects/:id/versions/new', :action => 'add_version'
206 206 project_actions.connect 'projects/:id/categories/new', :action => 'add_issue_category'
207 207 end
208 208 end
209 209
210 210 map.with_options :controller => 'repositories' do |repositories|
211 211 repositories.with_options :conditions => {:method => :get} do |repository_views|
212 212 repositories.connect 'projects/:id/repository', :action => 'show'
213 213 repositories.connect 'projects/:id/repository/edit', :action => 'edit'
214 214 repositories.connect 'projects/:id/repository/statistics', :action => 'stats'
215 215 repositories.connect 'projects/:id/repository/revisions', :action => 'revisions'
216 216 repositories.connect 'projects/:id/repository/revisions.:format', :action => 'revisions'
217 217 repositories.connect 'projects/:id/repository/revisions/:rev', :action => 'revision'
218 218 repositories.connect 'projects/:id/repository/revisions/:rev/diff', :action => 'diff'
219 219 repositories.connect 'projects/:id/repository/revisions/:rev/diff.:format', :action => 'diff'
220 220 repositories.connect 'projects/:id/repository/revisions/:rev/:action/*path'
221 221 repositories.connect 'projects/:id/repository/:action/*path'
222 222 end
223 223
224 224 repositories.connect 'projects/:id/repository/edit', :action => 'edit', :conditions => {:method => :post}
225 225 end
226 226
227 227 map.connect 'attachments/:id', :controller => 'attachments', :action => 'show', :id => /\d+/
228 228 map.connect 'attachments/:id/:filename', :controller => 'attachments', :action => 'show', :id => /\d+/, :filename => /.*/
229 229 map.connect 'attachments/download/:id/:filename', :controller => 'attachments', :action => 'download', :id => /\d+/, :filename => /.*/
230 230
231 231
232 232 #left old routes at the bottom for backwards compat
233 233 map.connect 'projects/:project_id/issues/:action', :controller => 'issues'
234 234 map.connect 'projects/:project_id/documents/:action', :controller => 'documents'
235 235 map.connect 'projects/:project_id/boards/:action/:id', :controller => 'boards'
236 236 map.connect 'boards/:board_id/topics/:action/:id', :controller => 'messages'
237 237 map.connect 'wiki/:id/:page/:action', :page => nil, :controller => 'wiki'
238 238 map.connect 'issues/:issue_id/relations/:action/:id', :controller => 'issue_relations'
239 239 map.connect 'projects/:project_id/news/:action', :controller => 'news'
240 240 map.connect 'projects/:project_id/timelog/:action/:id', :controller => 'timelog', :project_id => /.+/
241 241 map.with_options :controller => 'repositories' do |omap|
242 242 omap.repositories_show 'repositories/browse/:id/*path', :action => 'browse'
243 243 omap.repositories_changes 'repositories/changes/:id/*path', :action => 'changes'
244 244 omap.repositories_diff 'repositories/diff/:id/*path', :action => 'diff'
245 245 omap.repositories_entry 'repositories/entry/:id/*path', :action => 'entry'
246 246 omap.repositories_entry 'repositories/annotate/:id/*path', :action => 'annotate'
247 247 omap.connect 'repositories/revision/:id/:rev', :action => 'revision'
248 248 end
249 249
250 250 map.with_options :controller => 'sys' do |sys|
251 251 sys.connect 'sys/projects.:format', :action => 'projects', :conditions => {:method => :get}
252 252 sys.connect 'sys/projects/:id/repository.:format', :action => 'create_project_repository', :conditions => {:method => :post}
253 253 end
254 254
255 255 # Install the default route as the lowest priority.
256 256 map.connect ':controller/:action/:id'
257 257 map.connect 'robots.txt', :controller => 'welcome', :action => 'robots'
258 # Used for OpenID
259 map.root :controller => 'account', :action => 'login'
258 260 end
@@ -1,708 +1,710
1 1 _gloc_rule_default: '|n| n==1 ? "" : "_plural" '
2 2
3 3 actionview_datehelper_select_day_prefix:
4 4 actionview_datehelper_select_month_names: January,February,March,April,May,June,July,August,September,October,November,December
5 5 actionview_datehelper_select_month_names_abbr: Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec
6 6 actionview_datehelper_select_month_prefix:
7 7 actionview_datehelper_select_year_prefix:
8 8 actionview_datehelper_time_in_words_day: 1 day
9 9 actionview_datehelper_time_in_words_day_plural: %d days
10 10 actionview_datehelper_time_in_words_hour_about: about an hour
11 11 actionview_datehelper_time_in_words_hour_about_plural: about %d hours
12 12 actionview_datehelper_time_in_words_hour_about_single: about an hour
13 13 actionview_datehelper_time_in_words_minute: 1 minute
14 14 actionview_datehelper_time_in_words_minute_half: half a minute
15 15 actionview_datehelper_time_in_words_minute_less_than: less than a minute
16 16 actionview_datehelper_time_in_words_minute_plural: %d minutes
17 17 actionview_datehelper_time_in_words_minute_single: 1 minute
18 18 actionview_datehelper_time_in_words_second_less_than: less than a second
19 19 actionview_datehelper_time_in_words_second_less_than_plural: less than %d seconds
20 20 actionview_instancetag_blank_option: Please select
21 21
22 22 activerecord_error_inclusion: is not included in the list
23 23 activerecord_error_exclusion: is reserved
24 24 activerecord_error_invalid: is invalid
25 25 activerecord_error_confirmation: doesn't match confirmation
26 26 activerecord_error_accepted: must be accepted
27 27 activerecord_error_empty: can't be empty
28 28 activerecord_error_blank: can't be blank
29 29 activerecord_error_too_long: is too long
30 30 activerecord_error_too_short: is too short
31 31 activerecord_error_wrong_length: is the wrong length
32 32 activerecord_error_taken: has already been taken
33 33 activerecord_error_not_a_number: is not a number
34 34 activerecord_error_not_a_date: is not a valid date
35 35 activerecord_error_greater_than_start_date: must be greater than start date
36 36 activerecord_error_not_same_project: doesn't belong to the same project
37 37 activerecord_error_circular_dependency: This relation would create a circular dependency
38 38
39 39 general_fmt_age: %d yr
40 40 general_fmt_age_plural: %d yrs
41 41 general_fmt_date: %%m/%%d/%%Y
42 42 general_fmt_datetime: %%m/%%d/%%Y %%I:%%M %%p
43 43 general_fmt_datetime_short: %%b %%d, %%I:%%M %%p
44 44 general_fmt_time: %%I:%%M %%p
45 45 general_text_No: 'No'
46 46 general_text_Yes: 'Yes'
47 47 general_text_no: 'no'
48 48 general_text_yes: 'yes'
49 49 general_lang_name: 'English'
50 50 general_csv_separator: ','
51 51 general_csv_decimal_separator: '.'
52 52 general_csv_encoding: ISO-8859-1
53 53 general_pdf_encoding: ISO-8859-1
54 54 general_day_names: Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday
55 55 general_first_day_of_week: '7'
56 56
57 57 notice_account_updated: Account was successfully updated.
58 58 notice_account_invalid_creditentials: Invalid user or password
59 59 notice_account_password_updated: Password was successfully updated.
60 60 notice_account_wrong_password: Wrong password
61 61 notice_account_register_done: Account was successfully created. To activate your account, click on the link that was emailed to you.
62 62 notice_account_unknown_email: Unknown user.
63 63 notice_can_t_change_password: This account uses an external authentication source. Impossible to change the password.
64 64 notice_account_lost_email_sent: An email with instructions to choose a new password has been sent to you.
65 65 notice_account_activated: Your account has been activated. You can now log in.
66 66 notice_successful_create: Successful creation.
67 67 notice_successful_update: Successful update.
68 68 notice_successful_delete: Successful deletion.
69 69 notice_successful_connection: Successful connection.
70 70 notice_file_not_found: The page you were trying to access doesn't exist or has been removed.
71 71 notice_locking_conflict: Data has been updated by another user.
72 72 notice_not_authorized: You are not authorized to access this page.
73 73 notice_email_sent: An email was sent to %s
74 74 notice_email_error: An error occurred while sending mail (%s)
75 75 notice_feeds_access_key_reseted: Your RSS access key was reset.
76 76 notice_failed_to_save_issues: "Failed to save %d issue(s) on %d selected: %s."
77 77 notice_no_issue_selected: "No issue is selected! Please, check the issues you want to edit."
78 78 notice_account_pending: "Your account was created and is now pending administrator approval."
79 79 notice_default_data_loaded: Default configuration successfully loaded.
80 80 notice_unable_delete_version: Unable to delete version.
81 81
82 82 error_can_t_load_default_data: "Default configuration could not be loaded: %s"
83 83 error_scm_not_found: "The entry or revision was not found in the repository."
84 84 error_scm_command_failed: "An error occurred when trying to access the repository: %s"
85 85 error_scm_annotate: "The entry does not exist or can not be annotated."
86 86 error_issue_not_found_in_project: 'The issue was not found or does not belong to this project'
87 87
88 88 warning_attachments_not_saved: "%d file(s) could not be saved."
89 89
90 90 mail_subject_lost_password: Your %s password
91 91 mail_body_lost_password: 'To change your password, click on the following link:'
92 92 mail_subject_register: Your %s account activation
93 93 mail_body_register: 'To activate your account, click on the following link:'
94 94 mail_body_account_information_external: You can use your "%s" account to log in.
95 95 mail_body_account_information: Your account information
96 96 mail_subject_account_activation_request: %s account activation request
97 97 mail_body_account_activation_request: 'A new user (%s) has registered. The account is pending your approval:'
98 98 mail_subject_reminder: "%d issue(s) due in the next days"
99 99 mail_body_reminder: "%d issue(s) that are assigned to you are due in the next %d days:"
100 100
101 101 gui_validation_error: 1 error
102 102 gui_validation_error_plural: %d errors
103 103
104 104 field_name: Name
105 105 field_description: Description
106 106 field_summary: Summary
107 107 field_is_required: Required
108 108 field_firstname: Firstname
109 109 field_lastname: Lastname
110 110 field_mail: Email
111 111 field_filename: File
112 112 field_filesize: Size
113 113 field_downloads: Downloads
114 114 field_author: Author
115 115 field_created_on: Created
116 116 field_updated_on: Updated
117 117 field_field_format: Format
118 118 field_is_for_all: For all projects
119 119 field_possible_values: Possible values
120 120 field_regexp: Regular expression
121 121 field_min_length: Minimum length
122 122 field_max_length: Maximum length
123 123 field_value: Value
124 124 field_category: Category
125 125 field_title: Title
126 126 field_project: Project
127 127 field_issue: Issue
128 128 field_status: Status
129 129 field_notes: Notes
130 130 field_is_closed: Issue closed
131 131 field_is_default: Default value
132 132 field_tracker: Tracker
133 133 field_subject: Subject
134 134 field_due_date: Due date
135 135 field_assigned_to: Assigned to
136 136 field_priority: Priority
137 137 field_fixed_version: Target version
138 138 field_user: User
139 139 field_role: Role
140 140 field_homepage: Homepage
141 141 field_is_public: Public
142 142 field_parent: Subproject of
143 143 field_is_in_chlog: Issues displayed in changelog
144 144 field_is_in_roadmap: Issues displayed in roadmap
145 145 field_login: Login
146 146 field_mail_notification: Email notifications
147 147 field_admin: Administrator
148 148 field_last_login_on: Last connection
149 149 field_language: Language
150 field_identity_url: OpenID URL
150 151 field_effective_date: Date
151 152 field_password: Password
152 153 field_new_password: New password
153 154 field_password_confirmation: Confirmation
154 155 field_version: Version
155 156 field_type: Type
156 157 field_host: Host
157 158 field_port: Port
158 159 field_account: Account
159 160 field_base_dn: Base DN
160 161 field_attr_login: Login attribute
161 162 field_attr_firstname: Firstname attribute
162 163 field_attr_lastname: Lastname attribute
163 164 field_attr_mail: Email attribute
164 165 field_onthefly: On-the-fly user creation
165 166 field_start_date: Start
166 167 field_done_ratio: %% Done
167 168 field_auth_source: Authentication mode
168 169 field_hide_mail: Hide my email address
169 170 field_comments: Comment
170 171 field_url: URL
171 172 field_start_page: Start page
172 173 field_subproject: Subproject
173 174 field_hours: Hours
174 175 field_activity: Activity
175 176 field_spent_on: Date
176 177 field_identifier: Identifier
177 178 field_is_filter: Used as a filter
178 179 field_issue_to_id: Related issue
179 180 field_delay: Delay
180 181 field_assignable: Issues can be assigned to this role
181 182 field_redirect_existing_links: Redirect existing links
182 183 field_estimated_hours: Estimated time
183 184 field_column_names: Columns
184 185 field_time_zone: Time zone
185 186 field_searchable: Searchable
186 187 field_default_value: Default value
187 188 field_comments_sorting: Display comments
188 189 field_parent_title: Parent page
189 190 field_editable: Editable
190 191
191 192 setting_app_title: Application title
192 193 setting_app_subtitle: Application subtitle
193 194 setting_welcome_text: Welcome text
194 195 setting_default_language: Default language
195 196 setting_login_required: Authentication required
196 197 setting_self_registration: Self-registration
197 198 setting_attachment_max_size: Attachment max. size
198 199 setting_issues_export_limit: Issues export limit
199 200 setting_mail_from: Emission email address
200 201 setting_bcc_recipients: Blind carbon copy recipients (bcc)
201 202 setting_plain_text_mail: Plain text mail (no HTML)
202 203 setting_host_name: Host name and path
203 204 setting_text_formatting: Text formatting
204 205 setting_wiki_compression: Wiki history compression
205 206 setting_feeds_limit: Feed content limit
206 207 setting_default_projects_public: New projects are public by default
207 208 setting_autofetch_changesets: Autofetch commits
208 209 setting_sys_api_enabled: Enable WS for repository management
209 210 setting_commit_ref_keywords: Referencing keywords
210 211 setting_commit_fix_keywords: Fixing keywords
211 212 setting_autologin: Autologin
212 213 setting_date_format: Date format
213 214 setting_time_format: Time format
214 215 setting_cross_project_issue_relations: Allow cross-project issue relations
215 216 setting_issue_list_default_columns: Default columns displayed on the issue list
216 217 setting_repositories_encodings: Repositories encodings
217 218 setting_commit_logs_encoding: Commit messages encoding
218 219 setting_emails_footer: Emails footer
219 220 setting_protocol: Protocol
220 221 setting_per_page_options: Objects per page options
221 222 setting_user_format: Users display format
222 223 setting_activity_days_default: Days displayed on project activity
223 224 setting_display_subprojects_issues: Display subprojects issues on main projects by default
224 225 setting_enabled_scm: Enabled SCM
225 226 setting_mail_handler_api_enabled: Enable WS for incoming emails
226 227 setting_mail_handler_api_key: API key
227 228 setting_sequential_project_identifiers: Generate sequential project identifiers
228 229 setting_gravatar_enabled: Use Gravatar user icons
229 230 setting_diff_max_lines_displayed: Max number of diff lines displayed
230 231 setting_repository_log_display_limit: Maximum number of revisions displayed on file log
231 232
232 233 permission_edit_project: Edit project
233 234 permission_select_project_modules: Select project modules
234 235 permission_manage_members: Manage members
235 236 permission_manage_versions: Manage versions
236 237 permission_manage_categories: Manage issue categories
237 238 permission_add_issues: Add issues
238 239 permission_edit_issues: Edit issues
239 240 permission_manage_issue_relations: Manage issue relations
240 241 permission_add_issue_notes: Add notes
241 242 permission_edit_issue_notes: Edit notes
242 243 permission_edit_own_issue_notes: Edit own notes
243 244 permission_move_issues: Move issues
244 245 permission_delete_issues: Delete issues
245 246 permission_manage_public_queries: Manage public queries
246 247 permission_save_queries: Save queries
247 248 permission_view_gantt: View gantt chart
248 249 permission_view_calendar: View calender
249 250 permission_view_issue_watchers: View watchers list
250 251 permission_add_issue_watchers: Add watchers
251 252 permission_log_time: Log spent time
252 253 permission_view_time_entries: View spent time
253 254 permission_edit_time_entries: Edit time logs
254 255 permission_edit_own_time_entries: Edit own time logs
255 256 permission_manage_news: Manage news
256 257 permission_comment_news: Comment news
257 258 permission_manage_documents: Manage documents
258 259 permission_view_documents: View documents
259 260 permission_manage_files: Manage files
260 261 permission_view_files: View files
261 262 permission_manage_wiki: Manage wiki
262 263 permission_rename_wiki_pages: Rename wiki pages
263 264 permission_delete_wiki_pages: Delete wiki pages
264 265 permission_view_wiki_pages: View wiki
265 266 permission_view_wiki_edits: View wiki history
266 267 permission_edit_wiki_pages: Edit wiki pages
267 268 permission_delete_wiki_pages_attachments: Delete attachments
268 269 permission_protect_wiki_pages: Protect wiki pages
269 270 permission_manage_repository: Manage repository
270 271 permission_browse_repository: Browse repository
271 272 permission_view_changesets: View changesets
272 273 permission_commit_access: Commit access
273 274 permission_manage_boards: Manage boards
274 275 permission_view_messages: View messages
275 276 permission_add_messages: Post messages
276 277 permission_edit_messages: Edit messages
277 278 permission_edit_own_messages: Edit own messages
278 279 permission_delete_messages: Delete messages
279 280 permission_delete_own_messages: Delete own messages
280 281
281 282 project_module_issue_tracking: Issue tracking
282 283 project_module_time_tracking: Time tracking
283 284 project_module_news: News
284 285 project_module_documents: Documents
285 286 project_module_files: Files
286 287 project_module_wiki: Wiki
287 288 project_module_repository: Repository
288 289 project_module_boards: Boards
289 290
290 291 label_user: User
291 292 label_user_plural: Users
292 293 label_user_new: New user
293 294 label_project: Project
294 295 label_project_new: New project
295 296 label_project_plural: Projects
296 297 label_project_all: All Projects
297 298 label_project_latest: Latest projects
298 299 label_issue: Issue
299 300 label_issue_new: New issue
300 301 label_issue_plural: Issues
301 302 label_issue_view_all: View all issues
302 303 label_issues_by: Issues by %s
303 304 label_issue_added: Issue added
304 305 label_issue_updated: Issue updated
305 306 label_document: Document
306 307 label_document_new: New document
307 308 label_document_plural: Documents
308 309 label_document_added: Document added
309 310 label_role: Role
310 311 label_role_plural: Roles
311 312 label_role_new: New role
312 313 label_role_and_permissions: Roles and permissions
313 314 label_member: Member
314 315 label_member_new: New member
315 316 label_member_plural: Members
316 317 label_tracker: Tracker
317 318 label_tracker_plural: Trackers
318 319 label_tracker_new: New tracker
319 320 label_workflow: Workflow
320 321 label_issue_status: Issue status
321 322 label_issue_status_plural: Issue statuses
322 323 label_issue_status_new: New status
323 324 label_issue_category: Issue category
324 325 label_issue_category_plural: Issue categories
325 326 label_issue_category_new: New category
326 327 label_custom_field: Custom field
327 328 label_custom_field_plural: Custom fields
328 329 label_custom_field_new: New custom field
329 330 label_enumerations: Enumerations
330 331 label_enumeration_new: New value
331 332 label_information: Information
332 333 label_information_plural: Information
333 334 label_please_login: Please log in
334 335 label_register: Register
336 label_login_with_open_id_option: or login with OpenID
335 337 label_password_lost: Lost password
336 338 label_home: Home
337 339 label_my_page: My page
338 340 label_my_account: My account
339 341 label_my_projects: My projects
340 342 label_administration: Administration
341 343 label_login: Sign in
342 344 label_logout: Sign out
343 345 label_help: Help
344 346 label_reported_issues: Reported issues
345 347 label_assigned_to_me_issues: Issues assigned to me
346 348 label_last_login: Last connection
347 349 label_last_updates: Last updated
348 350 label_last_updates_plural: %d last updated
349 351 label_registered_on: Registered on
350 352 label_activity: Activity
351 353 label_overall_activity: Overall activity
352 354 label_user_activity: "%s's activity"
353 355 label_new: New
354 356 label_logged_as: Logged in as
355 357 label_environment: Environment
356 358 label_authentication: Authentication
357 359 label_auth_source: Authentication mode
358 360 label_auth_source_new: New authentication mode
359 361 label_auth_source_plural: Authentication modes
360 362 label_subproject_plural: Subprojects
361 363 label_and_its_subprojects: %s and its subprojects
362 364 label_min_max_length: Min - Max length
363 365 label_list: List
364 366 label_date: Date
365 367 label_integer: Integer
366 368 label_float: Float
367 369 label_boolean: Boolean
368 370 label_string: Text
369 371 label_text: Long text
370 372 label_attribute: Attribute
371 373 label_attribute_plural: Attributes
372 374 label_download: %d Download
373 375 label_download_plural: %d Downloads
374 376 label_no_data: No data to display
375 377 label_change_status: Change status
376 378 label_history: History
377 379 label_attachment: File
378 380 label_attachment_new: New file
379 381 label_attachment_delete: Delete file
380 382 label_attachment_plural: Files
381 383 label_file_added: File added
382 384 label_report: Report
383 385 label_report_plural: Reports
384 386 label_news: News
385 387 label_news_new: Add news
386 388 label_news_plural: News
387 389 label_news_latest: Latest news
388 390 label_news_view_all: View all news
389 391 label_news_added: News added
390 392 label_change_log: Change log
391 393 label_settings: Settings
392 394 label_overview: Overview
393 395 label_version: Version
394 396 label_version_new: New version
395 397 label_version_plural: Versions
396 398 label_confirmation: Confirmation
397 399 label_export_to: 'Also available in:'
398 400 label_read: Read...
399 401 label_public_projects: Public projects
400 402 label_open_issues: open
401 403 label_open_issues_plural: open
402 404 label_closed_issues: closed
403 405 label_closed_issues_plural: closed
404 406 label_total: Total
405 407 label_permissions: Permissions
406 408 label_current_status: Current status
407 409 label_new_statuses_allowed: New statuses allowed
408 410 label_all: all
409 411 label_none: none
410 412 label_nobody: nobody
411 413 label_next: Next
412 414 label_previous: Previous
413 415 label_used_by: Used by
414 416 label_details: Details
415 417 label_add_note: Add a note
416 418 label_per_page: Per page
417 419 label_calendar: Calendar
418 420 label_months_from: months from
419 421 label_gantt: Gantt
420 422 label_internal: Internal
421 423 label_last_changes: last %d changes
422 424 label_change_view_all: View all changes
423 425 label_personalize_page: Personalize this page
424 426 label_comment: Comment
425 427 label_comment_plural: Comments
426 428 label_comment_add: Add a comment
427 429 label_comment_added: Comment added
428 430 label_comment_delete: Delete comments
429 431 label_query: Custom query
430 432 label_query_plural: Custom queries
431 433 label_query_new: New query
432 434 label_filter_add: Add filter
433 435 label_filter_plural: Filters
434 436 label_equals: is
435 437 label_not_equals: is not
436 438 label_in_less_than: in less than
437 439 label_in_more_than: in more than
438 440 label_in: in
439 441 label_today: today
440 442 label_all_time: all time
441 443 label_yesterday: yesterday
442 444 label_this_week: this week
443 445 label_last_week: last week
444 446 label_last_n_days: last %d days
445 447 label_this_month: this month
446 448 label_last_month: last month
447 449 label_this_year: this year
448 450 label_date_range: Date range
449 451 label_less_than_ago: less than days ago
450 452 label_more_than_ago: more than days ago
451 453 label_ago: days ago
452 454 label_contains: contains
453 455 label_not_contains: doesn't contain
454 456 label_day_plural: days
455 457 label_repository: Repository
456 458 label_repository_plural: Repositories
457 459 label_browse: Browse
458 460 label_modification: %d change
459 461 label_modification_plural: %d changes
460 462 label_revision: Revision
461 463 label_revision_plural: Revisions
462 464 label_associated_revisions: Associated revisions
463 465 label_added: added
464 466 label_modified: modified
465 467 label_copied: copied
466 468 label_renamed: renamed
467 469 label_deleted: deleted
468 470 label_latest_revision: Latest revision
469 471 label_latest_revision_plural: Latest revisions
470 472 label_view_revisions: View revisions
471 473 label_max_size: Maximum size
472 474 label_on: 'on'
473 475 label_sort_highest: Move to top
474 476 label_sort_higher: Move up
475 477 label_sort_lower: Move down
476 478 label_sort_lowest: Move to bottom
477 479 label_roadmap: Roadmap
478 480 label_roadmap_due_in: Due in %s
479 481 label_roadmap_overdue: %s late
480 482 label_roadmap_no_issues: No issues for this version
481 483 label_search: Search
482 484 label_result_plural: Results
483 485 label_all_words: All words
484 486 label_wiki: Wiki
485 487 label_wiki_edit: Wiki edit
486 488 label_wiki_edit_plural: Wiki edits
487 489 label_wiki_page: Wiki page
488 490 label_wiki_page_plural: Wiki pages
489 491 label_index_by_title: Index by title
490 492 label_index_by_date: Index by date
491 493 label_current_version: Current version
492 494 label_preview: Preview
493 495 label_feed_plural: Feeds
494 496 label_changes_details: Details of all changes
495 497 label_issue_tracking: Issue tracking
496 498 label_spent_time: Spent time
497 499 label_f_hour: %.2f hour
498 500 label_f_hour_plural: %.2f hours
499 501 label_time_tracking: Time tracking
500 502 label_change_plural: Changes
501 503 label_statistics: Statistics
502 504 label_commits_per_month: Commits per month
503 505 label_commits_per_author: Commits per author
504 506 label_view_diff: View differences
505 507 label_diff_inline: inline
506 508 label_diff_side_by_side: side by side
507 509 label_options: Options
508 510 label_copy_workflow_from: Copy workflow from
509 511 label_permissions_report: Permissions report
510 512 label_watched_issues: Watched issues
511 513 label_related_issues: Related issues
512 514 label_applied_status: Applied status
513 515 label_loading: Loading...
514 516 label_relation_new: New relation
515 517 label_relation_delete: Delete relation
516 518 label_relates_to: related to
517 519 label_duplicates: duplicates
518 520 label_duplicated_by: duplicated by
519 521 label_blocks: blocks
520 522 label_blocked_by: blocked by
521 523 label_precedes: precedes
522 524 label_follows: follows
523 525 label_end_to_start: end to start
524 526 label_end_to_end: end to end
525 527 label_start_to_start: start to start
526 528 label_start_to_end: start to end
527 529 label_stay_logged_in: Stay logged in
528 530 label_disabled: disabled
529 531 label_show_completed_versions: Show completed versions
530 532 label_me: me
531 533 label_board: Forum
532 534 label_board_new: New forum
533 535 label_board_plural: Forums
534 536 label_topic_plural: Topics
535 537 label_message_plural: Messages
536 538 label_message_last: Last message
537 539 label_message_new: New message
538 540 label_message_posted: Message added
539 541 label_reply_plural: Replies
540 542 label_send_information: Send account information to the user
541 543 label_year: Year
542 544 label_month: Month
543 545 label_week: Week
544 546 label_date_from: From
545 547 label_date_to: To
546 548 label_language_based: Based on user's language
547 549 label_sort_by: Sort by %s
548 550 label_send_test_email: Send a test email
549 551 label_feeds_access_key_created_on: RSS access key created %s ago
550 552 label_module_plural: Modules
551 553 label_added_time_by: Added by %s %s ago
552 554 label_updated_time_by: Updated by %s %s ago
553 555 label_updated_time: Updated %s ago
554 556 label_jump_to_a_project: Jump to a project...
555 557 label_file_plural: Files
556 558 label_changeset_plural: Changesets
557 559 label_default_columns: Default columns
558 560 label_no_change_option: (No change)
559 561 label_bulk_edit_selected_issues: Bulk edit selected issues
560 562 label_theme: Theme
561 563 label_default: Default
562 564 label_search_titles_only: Search titles only
563 565 label_user_mail_option_all: "For any event on all my projects"
564 566 label_user_mail_option_selected: "For any event on the selected projects only..."
565 567 label_user_mail_option_none: "Only for things I watch or I'm involved in"
566 568 label_user_mail_no_self_notified: "I don't want to be notified of changes that I make myself"
567 569 label_registration_activation_by_email: account activation by email
568 570 label_registration_manual_activation: manual account activation
569 571 label_registration_automatic_activation: automatic account activation
570 572 label_display_per_page: 'Per page: %s'
571 573 label_age: Age
572 574 label_change_properties: Change properties
573 575 label_general: General
574 576 label_more: More
575 577 label_scm: SCM
576 578 label_plugins: Plugins
577 579 label_ldap_authentication: LDAP authentication
578 580 label_downloads_abbr: D/L
579 581 label_optional_description: Optional description
580 582 label_add_another_file: Add another file
581 583 label_preferences: Preferences
582 584 label_chronological_order: In chronological order
583 585 label_reverse_chronological_order: In reverse chronological order
584 586 label_planning: Planning
585 587 label_incoming_emails: Incoming emails
586 588 label_generate_key: Generate a key
587 589 label_issue_watchers: Watchers
588 590 label_example: Example
589 591 label_display: Display
590 592
591 593 button_login: Login
592 594 button_submit: Submit
593 595 button_save: Save
594 596 button_check_all: Check all
595 597 button_uncheck_all: Uncheck all
596 598 button_delete: Delete
597 599 button_create: Create
598 600 button_create_and_continue: Create and continue
599 601 button_test: Test
600 602 button_edit: Edit
601 603 button_add: Add
602 604 button_change: Change
603 605 button_apply: Apply
604 606 button_clear: Clear
605 607 button_lock: Lock
606 608 button_unlock: Unlock
607 609 button_download: Download
608 610 button_list: List
609 611 button_view: View
610 612 button_move: Move
611 613 button_back: Back
612 614 button_cancel: Cancel
613 615 button_activate: Activate
614 616 button_sort: Sort
615 617 button_log_time: Log time
616 618 button_rollback: Rollback to this version
617 619 button_watch: Watch
618 620 button_unwatch: Unwatch
619 621 button_reply: Reply
620 622 button_archive: Archive
621 623 button_unarchive: Unarchive
622 624 button_reset: Reset
623 625 button_rename: Rename
624 626 button_change_password: Change password
625 627 button_copy: Copy
626 628 button_annotate: Annotate
627 629 button_update: Update
628 630 button_configure: Configure
629 631 button_quote: Quote
630 632
631 633 status_active: active
632 634 status_registered: registered
633 635 status_locked: locked
634 636
635 637 text_select_mail_notifications: Select actions for which email notifications should be sent.
636 638 text_regexp_info: eg. ^[A-Z0-9]+$
637 639 text_min_max_length_info: 0 means no restriction
638 640 text_project_destroy_confirmation: Are you sure you want to delete this project and related data ?
639 641 text_subprojects_destroy_warning: 'Its subproject(s): %s will be also deleted.'
640 642 text_workflow_edit: Select a role and a tracker to edit the workflow
641 643 text_are_you_sure: Are you sure ?
642 644 text_journal_changed: changed from %s to %s
643 645 text_journal_set_to: set to %s
644 646 text_journal_deleted: deleted
645 647 text_tip_task_begin_day: task beginning this day
646 648 text_tip_task_end_day: task ending this day
647 649 text_tip_task_begin_end_day: task beginning and ending this day
648 650 text_project_identifier_info: 'Only lower case letters (a-z), numbers and dashes are allowed.<br />Once saved, the identifier can not be changed.'
649 651 text_caracters_maximum: %d characters maximum.
650 652 text_caracters_minimum: Must be at least %d characters long.
651 653 text_length_between: Length between %d and %d characters.
652 654 text_tracker_no_workflow: No workflow defined for this tracker
653 655 text_unallowed_characters: Unallowed characters
654 656 text_comma_separated: Multiple values allowed (comma separated).
655 657 text_issues_ref_in_commit_messages: Referencing and fixing issues in commit messages
656 658 text_issue_added: Issue %s has been reported by %s.
657 659 text_issue_updated: Issue %s has been updated by %s.
658 660 text_wiki_destroy_confirmation: Are you sure you want to delete this wiki and all its content ?
659 661 text_issue_category_destroy_question: Some issues (%d) are assigned to this category. What do you want to do ?
660 662 text_issue_category_destroy_assignments: Remove category assignments
661 663 text_issue_category_reassign_to: Reassign issues to this category
662 664 text_user_mail_option: "For unselected projects, you will only receive notifications about things you watch or you're involved in (eg. issues you're the author or assignee)."
663 665 text_no_configuration_data: "Roles, trackers, issue statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded."
664 666 text_load_default_configuration: Load the default configuration
665 667 text_status_changed_by_changeset: Applied in changeset %s.
666 668 text_issues_destroy_confirmation: 'Are you sure you want to delete the selected issue(s) ?'
667 669 text_select_project_modules: 'Select modules to enable for this project:'
668 670 text_default_administrator_account_changed: Default administrator account changed
669 671 text_file_repository_writable: Attachments directory writable
670 672 text_plugin_assets_writable: Plugin assets directory writable
671 673 text_rmagick_available: RMagick available (optional)
672 674 text_destroy_time_entries_question: %.02f hours were reported on the issues you are about to delete. What do you want to do ?
673 675 text_destroy_time_entries: Delete reported hours
674 676 text_assign_time_entries_to_project: Assign reported hours to the project
675 677 text_reassign_time_entries: 'Reassign reported hours to this issue:'
676 678 text_user_wrote: '%s wrote:'
677 679 text_enumeration_destroy_question: '%d objects are assigned to this value.'
678 680 text_enumeration_category_reassign_to: 'Reassign them to this value:'
679 681 text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server in config/email.yml and restart the application to enable them."
680 682 text_repository_usernames_mapping: "Select or update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped."
681 683 text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
682 684 text_custom_field_possible_values_info: 'One line for each value'
683 685
684 686 default_role_manager: Manager
685 687 default_role_developper: Developer
686 688 default_role_reporter: Reporter
687 689 default_tracker_bug: Bug
688 690 default_tracker_feature: Feature
689 691 default_tracker_support: Support
690 692 default_issue_status_new: New
691 693 default_issue_status_assigned: Assigned
692 694 default_issue_status_resolved: Resolved
693 695 default_issue_status_feedback: Feedback
694 696 default_issue_status_closed: Closed
695 697 default_issue_status_rejected: Rejected
696 698 default_doc_category_user: User documentation
697 699 default_doc_category_tech: Technical documentation
698 700 default_priority_low: Low
699 701 default_priority_normal: Normal
700 702 default_priority_high: High
701 703 default_priority_urgent: Urgent
702 704 default_priority_immediate: Immediate
703 705 default_activity_design: Design
704 706 default_activity_development: Development
705 707
706 708 enumeration_issue_priorities: Issue priorities
707 709 enumeration_doc_categories: Document categories
708 710 enumeration_activities: Activities (time tracking)
@@ -1,706 +1,708
1 1 body { font-family: Verdana, sans-serif; font-size: 12px; color:#484848; margin: 0; padding: 0; min-width: 900px; }
2 2
3 3 h1, h2, h3, h4 { font-family: "Trebuchet MS", Verdana, sans-serif;}
4 4 h1 {margin:0; padding:0; font-size: 24px;}
5 5 h2, .wiki h1 {font-size: 20px;padding: 2px 10px 1px 0px;margin: 0 0 10px 0; border-bottom: 1px solid #bbbbbb; color: #444;}
6 6 h3, .wiki h2 {font-size: 16px;padding: 2px 10px 1px 0px;margin: 0 0 10px 0; border-bottom: 1px solid #bbbbbb; color: #444;}
7 7 h4, .wiki h3 {font-size: 13px;padding: 2px 10px 1px 0px;margin-bottom: 5px; border-bottom: 1px dotted #bbbbbb; color: #444;}
8 8
9 9 /***** Layout *****/
10 10 #wrapper {background: white;}
11 11
12 12 #top-menu {background: #2C4056; color: #fff; height:1.8em; font-size: 0.8em; padding: 2px 2px 0px 6px;}
13 13 #top-menu ul {margin: 0; padding: 0;}
14 14 #top-menu li {
15 15 float:left;
16 16 list-style-type:none;
17 17 margin: 0px 0px 0px 0px;
18 18 padding: 0px 0px 0px 0px;
19 19 white-space:nowrap;
20 20 }
21 21 #top-menu a {color: #fff; margin-right: 8px; font-weight: bold;}
22 22 #top-menu #loggedas { float: right; margin-right: 0.5em; color: #fff; }
23 23
24 24 #account {float:right;}
25 25
26 26 #header {height:5.3em;margin:0;background-color:#507AAA;color:#f8f8f8; padding: 4px 8px 0px 6px; position:relative;}
27 27 #header a {color:#f8f8f8;}
28 28 #quick-search {float:right;}
29 29
30 30 #main-menu {position: absolute; bottom: 0px; left:6px; margin-right: -500px;}
31 31 #main-menu ul {margin: 0; padding: 0;}
32 32 #main-menu li {
33 33 float:left;
34 34 list-style-type:none;
35 35 margin: 0px 2px 0px 0px;
36 36 padding: 0px 0px 0px 0px;
37 37 white-space:nowrap;
38 38 }
39 39 #main-menu li a {
40 40 display: block;
41 41 color: #fff;
42 42 text-decoration: none;
43 43 font-weight: bold;
44 44 margin: 0;
45 45 padding: 4px 10px 4px 10px;
46 46 }
47 47 #main-menu li a:hover {background:#759FCF; color:#fff;}
48 48 #main-menu li a.selected, #main-menu li a.selected:hover {background:#fff; color:#555;}
49 49
50 50 #main {background-color:#EEEEEE;}
51 51
52 52 #sidebar{ float: right; width: 17%; position: relative; z-index: 9; min-height: 600px; padding: 0; margin: 0;}
53 53 * html #sidebar{ width: 17%; }
54 54 #sidebar h3{ font-size: 14px; margin-top:14px; color: #666; }
55 55 #sidebar hr{ width: 100%; margin: 0 auto; height: 1px; background: #ccc; border: 0; }
56 56 * html #sidebar hr{ width: 95%; position: relative; left: -6px; color: #ccc; }
57 57
58 58 #content { width: 80%; background-color: #fff; margin: 0px; border-right: 1px solid #ddd; padding: 6px 10px 10px 10px; z-index: 10; }
59 59 * html #content{ width: 80%; padding-left: 0; margin-top: 0px; padding: 6px 10px 10px 10px;}
60 60 html>body #content { min-height: 600px; }
61 61 * html body #content { height: 600px; } /* IE */
62 62
63 63 #main.nosidebar #sidebar{ display: none; }
64 64 #main.nosidebar #content{ width: auto; border-right: 0; }
65 65
66 66 #footer {clear: both; border-top: 1px solid #bbb; font-size: 0.9em; color: #aaa; padding: 5px; text-align:center; background:#fff;}
67 67
68 68 #login-form table {margin-top:5em; padding:1em; margin-left: auto; margin-right: auto; border: 2px solid #FDBF3B; background-color:#FFEBC1; }
69 69 #login-form table td {padding: 6px;}
70 70 #login-form label {font-weight: bold;}
71 71
72 input#openid_url { background: url(../images/openid-bg.gif) no-repeat; background-color: #fff; background-position: 0 50%; padding-left: 18px; }
73
72 74 .clear:after{ content: "."; display: block; height: 0; clear: both; visibility: hidden; }
73 75
74 76 /***** Links *****/
75 77 a, a:link, a:visited{ color: #2A5685; text-decoration: none; }
76 78 a:hover, a:active{ color: #c61a1a; text-decoration: underline;}
77 79 a img{ border: 0; }
78 80
79 81 a.issue.closed { text-decoration: line-through; }
80 82
81 83 /***** Tables *****/
82 84 table.list { border: 1px solid #e4e4e4; border-collapse: collapse; width: 100%; margin-bottom: 4px; }
83 85 table.list th { background-color:#EEEEEE; padding: 4px; white-space:nowrap; }
84 86 table.list td { vertical-align: top; }
85 87 table.list td.id { width: 2%; text-align: center;}
86 88 table.list td.checkbox { width: 15px; padding: 0px;}
87 89
88 90 tr.project td.name a { padding-left: 16px; white-space:nowrap; }
89 91 tr.project.parent td.name a { background: url('../images/bullet_toggle_minus.png') no-repeat; }
90 92
91 93 tr.issue { text-align: center; white-space: nowrap; }
92 94 tr.issue td.subject, tr.issue td.category, td.assigned_to { white-space: normal; }
93 95 tr.issue td.subject { text-align: left; }
94 96 tr.issue td.done_ratio table.progress { margin-left:auto; margin-right: auto;}
95 97
96 98 tr.entry { border: 1px solid #f8f8f8; }
97 99 tr.entry td { white-space: nowrap; }
98 100 tr.entry td.filename { width: 30%; }
99 101 tr.entry td.size { text-align: right; font-size: 90%; }
100 102 tr.entry td.revision, tr.entry td.author { text-align: center; }
101 103 tr.entry td.age { text-align: right; }
102 104
103 105 tr.entry span.expander {background-image: url(../images/bullet_toggle_plus.png); padding-left: 8px; margin-left: 0; cursor: pointer;}
104 106 tr.entry.open span.expander {background-image: url(../images/bullet_toggle_minus.png);}
105 107 tr.entry.file td.filename a { margin-left: 16px; }
106 108
107 109 tr.changeset td.author { text-align: center; width: 15%; }
108 110 tr.changeset td.committed_on { text-align: center; width: 15%; }
109 111
110 112 tr.message { height: 2.6em; }
111 113 tr.message td.last_message { font-size: 80%; }
112 114 tr.message.locked td.subject a { background-image: url(../images/locked.png); }
113 115 tr.message.sticky td.subject a { background-image: url(../images/sticky.png); font-weight: bold; }
114 116
115 117 tr.user td { width:13%; }
116 118 tr.user td.email { width:18%; }
117 119 tr.user td { white-space: nowrap; }
118 120 tr.user.locked, tr.user.registered { color: #aaa; }
119 121 tr.user.locked a, tr.user.registered a { color: #aaa; }
120 122
121 123 tr.time-entry { text-align: center; white-space: nowrap; }
122 124 tr.time-entry td.subject, tr.time-entry td.comments { text-align: left; white-space: normal; }
123 125 td.hours { text-align: right; font-weight: bold; padding-right: 0.5em; }
124 126 td.hours .hours-dec { font-size: 0.9em; }
125 127
126 128 table.plugins td { vertical-align: middle; }
127 129 table.plugins td.configure { text-align: right; padding-right: 1em; }
128 130 table.plugins span.name { font-weight: bold; display: block; margin-bottom: 6px; }
129 131 table.plugins span.description { display: block; font-size: 0.9em; }
130 132 table.plugins span.url { display: block; font-size: 0.9em; }
131 133
132 134 table.list tbody tr:hover { background-color:#ffffdd; }
133 135 table td {padding:2px;}
134 136 table p {margin:0;}
135 137 .odd {background-color:#f6f7f8;}
136 138 .even {background-color: #fff;}
137 139
138 140 .highlight { background-color: #FCFD8D;}
139 141 .highlight.token-1 { background-color: #faa;}
140 142 .highlight.token-2 { background-color: #afa;}
141 143 .highlight.token-3 { background-color: #aaf;}
142 144
143 145 .box{
144 146 padding:6px;
145 147 margin-bottom: 10px;
146 148 background-color:#f6f6f6;
147 149 color:#505050;
148 150 line-height:1.5em;
149 151 border: 1px solid #e4e4e4;
150 152 }
151 153
152 154 div.square {
153 155 border: 1px solid #999;
154 156 float: left;
155 157 margin: .3em .4em 0 .4em;
156 158 overflow: hidden;
157 159 width: .6em; height: .6em;
158 160 }
159 161 .contextual {float:right; white-space: nowrap; line-height:1.4em;margin-top:5px; padding-left: 10px; font-size:0.9em;}
160 162 .contextual input {font-size:0.9em;}
161 163 .message .contextual { margin-top: 0; }
162 164
163 165 .splitcontentleft{float:left; width:49%;}
164 166 .splitcontentright{float:right; width:49%;}
165 167 form {display: inline;}
166 168 input, select {vertical-align: middle; margin-top: 1px; margin-bottom: 1px;}
167 169 fieldset {border: 1px solid #e4e4e4; margin:0;}
168 170 legend {color: #484848;}
169 171 hr { width: 100%; height: 1px; background: #ccc; border: 0;}
170 172 blockquote { font-style: italic; border-left: 3px solid #e0e0e0; padding-left: 0.6em; margin-left: 2.4em;}
171 173 blockquote blockquote { margin-left: 0;}
172 174 textarea.wiki-edit { width: 99%; }
173 175 li p {margin-top: 0;}
174 176 div.issue {background:#ffffdd; padding:6px; margin-bottom:6px;border: 1px solid #d7d7d7;}
175 177 p.breadcrumb { font-size: 0.9em; margin: 4px 0 4px 0;}
176 178 p.subtitle { font-size: 0.9em; margin: -6px 0 12px 0; font-style: italic; }
177 179 p.footnote { font-size: 0.9em; margin-top: 0px; margin-bottom: 0px; }
178 180
179 181 fieldset#filters, fieldset#date-range { padding: 0.7em; margin-bottom: 8px; }
180 182 fieldset#filters p { margin: 1.2em 0 0.8em 2px; }
181 183 fieldset#filters table { border-collapse: collapse; }
182 184 fieldset#filters table td { padding: 0; vertical-align: middle; }
183 185 fieldset#filters tr.filter { height: 2em; }
184 186 fieldset#filters td.add-filter { text-align: right; vertical-align: top; }
185 187 .buttons { font-size: 0.9em; }
186 188
187 189 div#issue-changesets {float:right; width:45%; margin-left: 1em; margin-bottom: 1em; background: #fff; padding-left: 1em; font-size: 90%;}
188 190 div#issue-changesets .changeset { padding: 4px;}
189 191 div#issue-changesets .changeset { border-bottom: 1px solid #ddd; }
190 192 div#issue-changesets p { margin-top: 0; margin-bottom: 1em;}
191 193
192 194 div#activity dl, #search-results { margin-left: 2em; }
193 195 div#activity dd, #search-results dd { margin-bottom: 1em; padding-left: 18px; font-size: 0.9em; }
194 196 div#activity dt, #search-results dt { margin-bottom: 0px; padding-left: 20px; line-height: 18px; background-position: 0 50%; background-repeat: no-repeat; }
195 197 div#activity dt.me .time { border-bottom: 1px solid #999; }
196 198 div#activity dt .time { color: #777; font-size: 80%; }
197 199 div#activity dd .description, #search-results dd .description { font-style: italic; }
198 200 div#activity span.project:after, #search-results span.project:after { content: " -"; }
199 201 div#activity dd span.description, #search-results dd span.description { display:block; color: #808080; }
200 202
201 203 #search-results dd { margin-bottom: 1em; padding-left: 20px; margin-left:0px; }
202 204
203 205 div#search-results-counts {float:right;}
204 206 div#search-results-counts ul { margin-top: 0.5em; }
205 207 div#search-results-counts li { list-style-type:none; float: left; margin-left: 1em; }
206 208
207 209 dt.issue { background-image: url(../images/ticket.png); }
208 210 dt.issue-edit { background-image: url(../images/ticket_edit.png); }
209 211 dt.issue-closed { background-image: url(../images/ticket_checked.png); }
210 212 dt.issue-note { background-image: url(../images/ticket_note.png); }
211 213 dt.changeset { background-image: url(../images/changeset.png); }
212 214 dt.news { background-image: url(../images/news.png); }
213 215 dt.message { background-image: url(../images/message.png); }
214 216 dt.reply { background-image: url(../images/comments.png); }
215 217 dt.wiki-page { background-image: url(../images/wiki_edit.png); }
216 218 dt.attachment { background-image: url(../images/attachment.png); }
217 219 dt.document { background-image: url(../images/document.png); }
218 220 dt.project { background-image: url(../images/projects.png); }
219 221
220 222 #search-results dt.issue.closed { background-image: url(../images/ticket_checked.png); }
221 223
222 224 div#roadmap fieldset.related-issues { margin-bottom: 1em; }
223 225 div#roadmap fieldset.related-issues ul { margin-top: 0.3em; margin-bottom: 0.3em; }
224 226 div#roadmap .wiki h1:first-child { display: none; }
225 227 div#roadmap .wiki h1 { font-size: 120%; }
226 228 div#roadmap .wiki h2 { font-size: 110%; }
227 229
228 230 div#version-summary { float:right; width:380px; margin-left: 16px; margin-bottom: 16px; background-color: #fff; }
229 231 div#version-summary fieldset { margin-bottom: 1em; }
230 232 div#version-summary .total-hours { text-align: right; }
231 233
232 234 table#time-report td.hours, table#time-report th.period, table#time-report th.total { text-align: right; padding-right: 0.5em; }
233 235 table#time-report tbody tr { font-style: italic; color: #777; }
234 236 table#time-report tbody tr.last-level { font-style: normal; color: #555; }
235 237 table#time-report tbody tr.total { font-style: normal; font-weight: bold; color: #555; background-color:#EEEEEE; }
236 238 table#time-report .hours-dec { font-size: 0.9em; }
237 239
238 240 form#issue-form .attributes { margin-bottom: 8px; }
239 241 form#issue-form .attributes p { padding-top: 1px; padding-bottom: 2px; }
240 242 form#issue-form .attributes select { min-width: 30%; }
241 243
242 244 ul.projects { margin: 0; padding-left: 1em; }
243 245 ul.projects.root { margin: 0; padding: 0; }
244 246 ul.projects ul { border-left: 3px solid #e0e0e0; }
245 247 ul.projects li { list-style-type:none; }
246 248 ul.projects li.root { margin-bottom: 1em; }
247 249 ul.projects li.child { margin-top: 1em;}
248 250 ul.projects div.root a.project { font-family: "Trebuchet MS", Verdana, sans-serif; font-weight: bold; font-size: 16px; margin: 0 0 10px 0; }
249 251 .my-project { padding-left: 18px; background: url(../images/fav.png) no-repeat 0 50%; }
250 252
251 253 #tracker_project_ids ul { margin: 0; padding-left: 1em; }
252 254 #tracker_project_ids li { list-style-type:none; }
253 255
254 256 ul.properties {padding:0; font-size: 0.9em; color: #777;}
255 257 ul.properties li {list-style-type:none;}
256 258 ul.properties li span {font-style:italic;}
257 259
258 260 .total-hours { font-size: 110%; font-weight: bold; }
259 261 .total-hours span.hours-int { font-size: 120%; }
260 262
261 263 .autoscroll {overflow-x: auto; padding:1px; margin-bottom: 1.2em;}
262 264 #user_firstname, #user_lastname, #user_mail, #my_account_form select { width: 90%; }
263 265
264 266 .pagination {font-size: 90%}
265 267 p.pagination {margin-top:8px;}
266 268
267 269 /***** Tabular forms ******/
268 270 .tabular p{
269 271 margin: 0;
270 272 padding: 5px 0 8px 0;
271 273 padding-left: 180px; /*width of left column containing the label elements*/
272 274 height: 1%;
273 275 clear:left;
274 276 }
275 277
276 278 html>body .tabular p {overflow:hidden;}
277 279
278 280 .tabular label{
279 281 font-weight: bold;
280 282 float: left;
281 283 text-align: right;
282 284 margin-left: -180px; /*width of left column*/
283 285 width: 175px; /*width of labels. Should be smaller than left column to create some right
284 286 margin*/
285 287 }
286 288
287 289 .tabular label.floating{
288 290 font-weight: normal;
289 291 margin-left: 0px;
290 292 text-align: left;
291 293 width: 270px;
292 294 }
293 295
294 296 input#time_entry_comments { width: 90%;}
295 297
296 298 #preview fieldset {margin-top: 1em; background: url(../images/draft.png)}
297 299
298 300 .tabular.settings p{ padding-left: 300px; }
299 301 .tabular.settings label{ margin-left: -300px; width: 295px; }
300 302
301 303 .required {color: #bb0000;}
302 304 .summary {font-style: italic;}
303 305
304 306 #attachments_fields input[type=text] {margin-left: 8px; }
305 307
306 308 div.attachments { margin-top: 12px; }
307 309 div.attachments p { margin:4px 0 2px 0; }
308 310 div.attachments img { vertical-align: middle; }
309 311 div.attachments span.author { font-size: 0.9em; color: #888; }
310 312
311 313 p.other-formats { text-align: right; font-size:0.9em; color: #666; }
312 314 .other-formats span + span:before { content: "| "; }
313 315
314 316 a.atom { background: url(../images/feed.png) no-repeat 1px 50%; padding: 2px 0px 3px 16px; }
315 317
316 318 /***** Flash & error messages ****/
317 319 #errorExplanation, div.flash, .nodata, .warning {
318 320 padding: 4px 4px 4px 30px;
319 321 margin-bottom: 12px;
320 322 font-size: 1.1em;
321 323 border: 2px solid;
322 324 }
323 325
324 326 div.flash {margin-top: 8px;}
325 327
326 328 div.flash.error, #errorExplanation {
327 329 background: url(../images/false.png) 8px 5px no-repeat;
328 330 background-color: #ffe3e3;
329 331 border-color: #dd0000;
330 332 color: #550000;
331 333 }
332 334
333 335 div.flash.notice {
334 336 background: url(../images/true.png) 8px 5px no-repeat;
335 337 background-color: #dfffdf;
336 338 border-color: #9fcf9f;
337 339 color: #005f00;
338 340 }
339 341
340 342 div.flash.warning {
341 343 background: url(../images/warning.png) 8px 5px no-repeat;
342 344 background-color: #FFEBC1;
343 345 border-color: #FDBF3B;
344 346 color: #A6750C;
345 347 text-align: left;
346 348 }
347 349
348 350 .nodata, .warning {
349 351 text-align: center;
350 352 background-color: #FFEBC1;
351 353 border-color: #FDBF3B;
352 354 color: #A6750C;
353 355 }
354 356
355 357 #errorExplanation ul { font-size: 0.9em;}
356 358
357 359 /***** Ajax indicator ******/
358 360 #ajax-indicator {
359 361 position: absolute; /* fixed not supported by IE */
360 362 background-color:#eee;
361 363 border: 1px solid #bbb;
362 364 top:35%;
363 365 left:40%;
364 366 width:20%;
365 367 font-weight:bold;
366 368 text-align:center;
367 369 padding:0.6em;
368 370 z-index:100;
369 371 filter:alpha(opacity=50);
370 372 opacity: 0.5;
371 373 }
372 374
373 375 html>body #ajax-indicator { position: fixed; }
374 376
375 377 #ajax-indicator span {
376 378 background-position: 0% 40%;
377 379 background-repeat: no-repeat;
378 380 background-image: url(../images/loading.gif);
379 381 padding-left: 26px;
380 382 vertical-align: bottom;
381 383 }
382 384
383 385 /***** Calendar *****/
384 386 table.cal {border-collapse: collapse; width: 100%; margin: 0px 0 6px 0;border: 1px solid #d7d7d7;}
385 387 table.cal thead th {width: 14%;}
386 388 table.cal tbody tr {height: 100px;}
387 389 table.cal th { background-color:#EEEEEE; padding: 4px; }
388 390 table.cal td {border: 1px solid #d7d7d7; vertical-align: top; font-size: 0.9em;}
389 391 table.cal td p.day-num {font-size: 1.1em; text-align:right;}
390 392 table.cal td.odd p.day-num {color: #bbb;}
391 393 table.cal td.today {background:#ffffdd;}
392 394 table.cal td.today p.day-num {font-weight: bold;}
393 395
394 396 /***** Tooltips ******/
395 397 .tooltip{position:relative;z-index:24;}
396 398 .tooltip:hover{z-index:25;color:#000;}
397 399 .tooltip span.tip{display: none; text-align:left;}
398 400
399 401 div.tooltip:hover span.tip{
400 402 display:block;
401 403 position:absolute;
402 404 top:12px; left:24px; width:270px;
403 405 border:1px solid #555;
404 406 background-color:#fff;
405 407 padding: 4px;
406 408 font-size: 0.8em;
407 409 color:#505050;
408 410 }
409 411
410 412 /***** Progress bar *****/
411 413 table.progress {
412 414 border: 1px solid #D7D7D7;
413 415 border-collapse: collapse;
414 416 border-spacing: 0pt;
415 417 empty-cells: show;
416 418 text-align: center;
417 419 float:left;
418 420 margin: 1px 6px 1px 0px;
419 421 }
420 422
421 423 table.progress td { height: 0.9em; }
422 424 table.progress td.closed { background: #BAE0BA none repeat scroll 0%; }
423 425 table.progress td.done { background: #DEF0DE none repeat scroll 0%; }
424 426 table.progress td.open { background: #FFF none repeat scroll 0%; }
425 427 p.pourcent {font-size: 80%;}
426 428 p.progress-info {clear: left; font-style: italic; font-size: 80%;}
427 429
428 430 /***** Tabs *****/
429 431 #content .tabs {height: 2.6em; border-bottom: 1px solid #bbbbbb; margin-bottom:1.2em; position:relative;}
430 432 #content .tabs ul {margin:0; position:absolute; bottom:-2px; padding-left:1em;}
431 433 #content .tabs>ul { bottom:-1px; } /* others */
432 434 #content .tabs ul li {
433 435 float:left;
434 436 list-style-type:none;
435 437 white-space:nowrap;
436 438 margin-right:8px;
437 439 background:#fff;
438 440 }
439 441 #content .tabs ul li a{
440 442 display:block;
441 443 font-size: 0.9em;
442 444 text-decoration:none;
443 445 line-height:1.3em;
444 446 padding:4px 6px 4px 6px;
445 447 border: 1px solid #ccc;
446 448 border-bottom: 1px solid #bbbbbb;
447 449 background-color: #eeeeee;
448 450 color:#777;
449 451 font-weight:bold;
450 452 }
451 453
452 454 #content .tabs ul li a:hover {
453 455 background-color: #ffffdd;
454 456 text-decoration:none;
455 457 }
456 458
457 459 #content .tabs ul li a.selected {
458 460 background-color: #fff;
459 461 border: 1px solid #bbbbbb;
460 462 border-bottom: 1px solid #fff;
461 463 }
462 464
463 465 #content .tabs ul li a.selected:hover {
464 466 background-color: #fff;
465 467 }
466 468
467 469 /***** Diff *****/
468 470 .diff_out { background: #fcc; }
469 471 .diff_in { background: #cfc; }
470 472
471 473 /***** Wiki *****/
472 474 div.wiki table {
473 475 border: 1px solid #505050;
474 476 border-collapse: collapse;
475 477 margin-bottom: 1em;
476 478 }
477 479
478 480 div.wiki table, div.wiki td, div.wiki th {
479 481 border: 1px solid #bbb;
480 482 padding: 4px;
481 483 }
482 484
483 485 div.wiki .external {
484 486 background-position: 0% 60%;
485 487 background-repeat: no-repeat;
486 488 padding-left: 12px;
487 489 background-image: url(../images/external.png);
488 490 }
489 491
490 492 div.wiki a.new {
491 493 color: #b73535;
492 494 }
493 495
494 496 div.wiki pre {
495 497 margin: 1em 1em 1em 1.6em;
496 498 padding: 2px;
497 499 background-color: #fafafa;
498 500 border: 1px solid #dadada;
499 501 width:95%;
500 502 overflow-x: auto;
501 503 }
502 504
503 505 div.wiki ul.toc {
504 506 background-color: #ffffdd;
505 507 border: 1px solid #e4e4e4;
506 508 padding: 4px;
507 509 line-height: 1.2em;
508 510 margin-bottom: 12px;
509 511 margin-right: 12px;
510 512 margin-left: 0;
511 513 display: table
512 514 }
513 515 * html div.wiki ul.toc { width: 50%; } /* IE6 doesn't autosize div */
514 516
515 517 div.wiki ul.toc.right { float: right; margin-left: 12px; margin-right: 0; width: auto; }
516 518 div.wiki ul.toc.left { float: left; margin-right: 12px; margin-left: 0; width: auto; }
517 519 div.wiki ul.toc li { list-style-type:none;}
518 520 div.wiki ul.toc li.heading2 { margin-left: 6px; }
519 521 div.wiki ul.toc li.heading3 { margin-left: 12px; font-size: 0.8em; }
520 522
521 523 div.wiki ul.toc a {
522 524 font-size: 0.9em;
523 525 font-weight: normal;
524 526 text-decoration: none;
525 527 color: #606060;
526 528 }
527 529 div.wiki ul.toc a:hover { color: #c61a1a; text-decoration: underline;}
528 530
529 531 a.wiki-anchor { display: none; margin-left: 6px; text-decoration: none; }
530 532 a.wiki-anchor:hover { color: #aaa !important; text-decoration: none; }
531 533 h1:hover a.wiki-anchor, h2:hover a.wiki-anchor, h3:hover a.wiki-anchor { display: inline; color: #ddd; }
532 534
533 535 /***** My page layout *****/
534 536 .block-receiver {
535 537 border:1px dashed #c0c0c0;
536 538 margin-bottom: 20px;
537 539 padding: 15px 0 15px 0;
538 540 }
539 541
540 542 .mypage-box {
541 543 margin:0 0 20px 0;
542 544 color:#505050;
543 545 line-height:1.5em;
544 546 }
545 547
546 548 .handle {
547 549 cursor: move;
548 550 }
549 551
550 552 a.close-icon {
551 553 display:block;
552 554 margin-top:3px;
553 555 overflow:hidden;
554 556 width:12px;
555 557 height:12px;
556 558 background-repeat: no-repeat;
557 559 cursor:pointer;
558 560 background-image:url('../images/close.png');
559 561 }
560 562
561 563 a.close-icon:hover {
562 564 background-image:url('../images/close_hl.png');
563 565 }
564 566
565 567 /***** Gantt chart *****/
566 568 .gantt_hdr {
567 569 position:absolute;
568 570 top:0;
569 571 height:16px;
570 572 border-top: 1px solid #c0c0c0;
571 573 border-bottom: 1px solid #c0c0c0;
572 574 border-right: 1px solid #c0c0c0;
573 575 text-align: center;
574 576 overflow: hidden;
575 577 }
576 578
577 579 .task {
578 580 position: absolute;
579 581 height:8px;
580 582 font-size:0.8em;
581 583 color:#888;
582 584 padding:0;
583 585 margin:0;
584 586 line-height:0.8em;
585 587 }
586 588
587 589 .task_late { background:#f66 url(../images/task_late.png); border: 1px solid #f66; }
588 590 .task_done { background:#66f url(../images/task_done.png); border: 1px solid #66f; }
589 591 .task_todo { background:#aaa url(../images/task_todo.png); border: 1px solid #aaa; }
590 592 .milestone { background-image:url(../images/milestone.png); background-repeat: no-repeat; border: 0; }
591 593
592 594 /***** Icons *****/
593 595 .icon {
594 596 background-position: 0% 40%;
595 597 background-repeat: no-repeat;
596 598 padding-left: 20px;
597 599 padding-top: 2px;
598 600 padding-bottom: 3px;
599 601 }
600 602
601 603 .icon22 {
602 604 background-position: 0% 40%;
603 605 background-repeat: no-repeat;
604 606 padding-left: 26px;
605 607 line-height: 22px;
606 608 vertical-align: middle;
607 609 }
608 610
609 611 .icon-add { background-image: url(../images/add.png); }
610 612 .icon-edit { background-image: url(../images/edit.png); }
611 613 .icon-copy { background-image: url(../images/copy.png); }
612 614 .icon-del { background-image: url(../images/delete.png); }
613 615 .icon-move { background-image: url(../images/move.png); }
614 616 .icon-save { background-image: url(../images/save.png); }
615 617 .icon-cancel { background-image: url(../images/cancel.png); }
616 618 .icon-file { background-image: url(../images/file.png); }
617 619 .icon-folder { background-image: url(../images/folder.png); }
618 620 .open .icon-folder { background-image: url(../images/folder_open.png); }
619 621 .icon-package { background-image: url(../images/package.png); }
620 622 .icon-home { background-image: url(../images/home.png); }
621 623 .icon-user { background-image: url(../images/user.png); }
622 624 .icon-mypage { background-image: url(../images/user_page.png); }
623 625 .icon-admin { background-image: url(../images/admin.png); }
624 626 .icon-projects { background-image: url(../images/projects.png); }
625 627 .icon-help { background-image: url(../images/help.png); }
626 628 .icon-attachment { background-image: url(../images/attachment.png); }
627 629 .icon-index { background-image: url(../images/index.png); }
628 630 .icon-history { background-image: url(../images/history.png); }
629 631 .icon-time { background-image: url(../images/time.png); }
630 632 .icon-time-add { background-image: url(../images/time_add.png); }
631 633 .icon-stats { background-image: url(../images/stats.png); }
632 634 .icon-warning { background-image: url(../images/warning.png); }
633 635 .icon-fav { background-image: url(../images/fav.png); }
634 636 .icon-fav-off { background-image: url(../images/fav_off.png); }
635 637 .icon-reload { background-image: url(../images/reload.png); }
636 638 .icon-lock { background-image: url(../images/locked.png); }
637 639 .icon-unlock { background-image: url(../images/unlock.png); }
638 640 .icon-checked { background-image: url(../images/true.png); }
639 641 .icon-details { background-image: url(../images/zoom_in.png); }
640 642 .icon-report { background-image: url(../images/report.png); }
641 643 .icon-comment { background-image: url(../images/comment.png); }
642 644
643 645 .icon22-projects { background-image: url(../images/22x22/projects.png); }
644 646 .icon22-users { background-image: url(../images/22x22/users.png); }
645 647 .icon22-tracker { background-image: url(../images/22x22/tracker.png); }
646 648 .icon22-role { background-image: url(../images/22x22/role.png); }
647 649 .icon22-workflow { background-image: url(../images/22x22/workflow.png); }
648 650 .icon22-options { background-image: url(../images/22x22/options.png); }
649 651 .icon22-notifications { background-image: url(../images/22x22/notifications.png); }
650 652 .icon22-authent { background-image: url(../images/22x22/authent.png); }
651 653 .icon22-info { background-image: url(../images/22x22/info.png); }
652 654 .icon22-comment { background-image: url(../images/22x22/comment.png); }
653 655 .icon22-package { background-image: url(../images/22x22/package.png); }
654 656 .icon22-settings { background-image: url(../images/22x22/settings.png); }
655 657 .icon22-plugin { background-image: url(../images/22x22/plugin.png); }
656 658
657 659 img.gravatar {
658 660 padding: 2px;
659 661 border: solid 1px #d5d5d5;
660 662 background: #fff;
661 663 }
662 664
663 665 div.issue img.gravatar {
664 666 float: right;
665 667 margin: 0 0 0 1em;
666 668 padding: 5px;
667 669 }
668 670
669 671 div.issue table img.gravatar {
670 672 height: 14px;
671 673 width: 14px;
672 674 padding: 2px;
673 675 float: left;
674 676 margin: 0 0.5em 0 0;
675 677 }
676 678
677 679 #history img.gravatar {
678 680 padding: 3px;
679 681 margin: 0 1.5em 1em 0;
680 682 float: left;
681 683 }
682 684
683 685 td.username img.gravatar {
684 686 float: left;
685 687 margin: 0 1em 0 0;
686 688 }
687 689
688 690 #activity dt img.gravatar {
689 691 float: left;
690 692 margin: 0 1em 1em 0;
691 693 }
692 694
693 695 #activity dt,
694 696 .journal {
695 697 clear: left;
696 698 }
697 699
698 700 h2 img { vertical-align:middle; }
699 701
700 702
701 703 /***** Media print specific styles *****/
702 704 @media print {
703 705 #top-menu, #header, #main-menu, #sidebar, #footer, .contextual, .other-formats { display:none; }
704 706 #main { background: #fff; }
705 707 #content { width: 99%; margin: 0; padding: 0; border: 0; background: #fff; overflow: visible !important;}
706 708 }
General Comments 0
You need to be logged in to leave comments. Login now