##// END OF EJS Templates
Display stats about objects that can be copied....
Jean-Philippe Lang -
r2861:6dfe0395a589
parent child
Show More
@@ -1,346 +1,347
1 # redMine - project management software
1 # Redmine - project management software
2 # Copyright (C) 2006-2007 Jean-Philippe Lang
2 # Copyright (C) 2006-2009 Jean-Philippe Lang
3 #
3 #
4 # This program is free software; you can redistribute it and/or
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
7 # of the License, or (at your option) any later version.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU General Public License
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 class ProjectsController < ApplicationController
18 class ProjectsController < ApplicationController
19 menu_item :overview
19 menu_item :overview
20 menu_item :activity, :only => :activity
20 menu_item :activity, :only => :activity
21 menu_item :roadmap, :only => :roadmap
21 menu_item :roadmap, :only => :roadmap
22 menu_item :files, :only => [:list_files, :add_file]
22 menu_item :files, :only => [:list_files, :add_file]
23 menu_item :settings, :only => :settings
23 menu_item :settings, :only => :settings
24 menu_item :issues, :only => [:changelog]
24 menu_item :issues, :only => [:changelog]
25
25
26 before_filter :find_project, :except => [ :index, :list, :add, :copy, :activity ]
26 before_filter :find_project, :except => [ :index, :list, :add, :copy, :activity ]
27 before_filter :find_optional_project, :only => :activity
27 before_filter :find_optional_project, :only => :activity
28 before_filter :authorize, :except => [ :index, :list, :add, :copy, :archive, :unarchive, :destroy, :activity ]
28 before_filter :authorize, :except => [ :index, :list, :add, :copy, :archive, :unarchive, :destroy, :activity ]
29 before_filter :authorize_global, :only => :add
29 before_filter :authorize_global, :only => :add
30 before_filter :require_admin, :only => [ :copy, :archive, :unarchive, :destroy ]
30 before_filter :require_admin, :only => [ :copy, :archive, :unarchive, :destroy ]
31 accept_key_auth :activity
31 accept_key_auth :activity
32
32
33 after_filter :only => [:add, :edit, :archive, :unarchive, :destroy] do |controller|
33 after_filter :only => [:add, :edit, :archive, :unarchive, :destroy] do |controller|
34 if controller.request.post?
34 if controller.request.post?
35 controller.send :expire_action, :controller => 'welcome', :action => 'robots.txt'
35 controller.send :expire_action, :controller => 'welcome', :action => 'robots.txt'
36 end
36 end
37 end
37 end
38
38
39 helper :sort
39 helper :sort
40 include SortHelper
40 include SortHelper
41 helper :custom_fields
41 helper :custom_fields
42 include CustomFieldsHelper
42 include CustomFieldsHelper
43 helper :issues
43 helper :issues
44 helper IssuesHelper
44 helper IssuesHelper
45 helper :queries
45 helper :queries
46 include QueriesHelper
46 include QueriesHelper
47 helper :repositories
47 helper :repositories
48 include RepositoriesHelper
48 include RepositoriesHelper
49 include ProjectsHelper
49 include ProjectsHelper
50
50
51 # Lists visible projects
51 # Lists visible projects
52 def index
52 def index
53 respond_to do |format|
53 respond_to do |format|
54 format.html {
54 format.html {
55 @projects = Project.visible.find(:all, :order => 'lft')
55 @projects = Project.visible.find(:all, :order => 'lft')
56 }
56 }
57 format.atom {
57 format.atom {
58 projects = Project.visible.find(:all, :order => 'created_on DESC',
58 projects = Project.visible.find(:all, :order => 'created_on DESC',
59 :limit => Setting.feeds_limit.to_i)
59 :limit => Setting.feeds_limit.to_i)
60 render_feed(projects, :title => "#{Setting.app_title}: #{l(:label_project_latest)}")
60 render_feed(projects, :title => "#{Setting.app_title}: #{l(:label_project_latest)}")
61 }
61 }
62 end
62 end
63 end
63 end
64
64
65 # Add a new project
65 # Add a new project
66 def add
66 def add
67 @issue_custom_fields = IssueCustomField.find(:all, :order => "#{CustomField.table_name}.position")
67 @issue_custom_fields = IssueCustomField.find(:all, :order => "#{CustomField.table_name}.position")
68 @trackers = Tracker.all
68 @trackers = Tracker.all
69 @project = Project.new(params[:project])
69 @project = Project.new(params[:project])
70 if request.get?
70 if request.get?
71 @project.identifier = Project.next_identifier if Setting.sequential_project_identifiers?
71 @project.identifier = Project.next_identifier if Setting.sequential_project_identifiers?
72 @project.trackers = Tracker.all
72 @project.trackers = Tracker.all
73 @project.is_public = Setting.default_projects_public?
73 @project.is_public = Setting.default_projects_public?
74 @project.enabled_module_names = Redmine::AccessControl.available_project_modules
74 @project.enabled_module_names = Redmine::AccessControl.available_project_modules
75 else
75 else
76 @project.enabled_module_names = params[:enabled_modules]
76 @project.enabled_module_names = params[:enabled_modules]
77 if @project.save
77 if @project.save
78 @project.set_parent!(params[:project]['parent_id']) if User.current.admin? && params[:project].has_key?('parent_id')
78 @project.set_parent!(params[:project]['parent_id']) if User.current.admin? && params[:project].has_key?('parent_id')
79 # Add current user as a project member if he is not admin
79 # Add current user as a project member if he is not admin
80 unless User.current.admin?
80 unless User.current.admin?
81 r = Role.givable.find_by_id(Setting.new_project_user_role_id.to_i) || Role.givable.first
81 r = Role.givable.find_by_id(Setting.new_project_user_role_id.to_i) || Role.givable.first
82 m = Member.new(:user => User.current, :roles => [r])
82 m = Member.new(:user => User.current, :roles => [r])
83 @project.members << m
83 @project.members << m
84 end
84 end
85 flash[:notice] = l(:notice_successful_create)
85 flash[:notice] = l(:notice_successful_create)
86 redirect_to :controller => 'projects', :action => 'settings', :id => @project
86 redirect_to :controller => 'projects', :action => 'settings', :id => @project
87 end
87 end
88 end
88 end
89 end
89 end
90
90
91 def copy
91 def copy
92 @issue_custom_fields = IssueCustomField.find(:all, :order => "#{CustomField.table_name}.position")
92 @issue_custom_fields = IssueCustomField.find(:all, :order => "#{CustomField.table_name}.position")
93 @trackers = Tracker.all
93 @trackers = Tracker.all
94 @root_projects = Project.find(:all,
94 @root_projects = Project.find(:all,
95 :conditions => "parent_id IS NULL AND status = #{Project::STATUS_ACTIVE}",
95 :conditions => "parent_id IS NULL AND status = #{Project::STATUS_ACTIVE}",
96 :order => 'name')
96 :order => 'name')
97 @source_project = Project.find(params[:id])
97 if request.get?
98 if request.get?
98 @project = Project.copy_from(params[:id])
99 @project = Project.copy_from(@source_project)
99 if @project
100 if @project
100 @project.identifier = Project.next_identifier if Setting.sequential_project_identifiers?
101 @project.identifier = Project.next_identifier if Setting.sequential_project_identifiers?
101 else
102 else
102 redirect_to :controller => 'admin', :action => 'projects'
103 redirect_to :controller => 'admin', :action => 'projects'
103 end
104 end
104 else
105 else
105 @project = Project.new(params[:project])
106 @project = Project.new(params[:project])
106 @project.enabled_module_names = params[:enabled_modules]
107 @project.enabled_module_names = params[:enabled_modules]
107 if @project.copy(params[:id], :only => params[:only])
108 if @project.copy(@source_project, :only => params[:only])
108 @project.set_parent!(params[:project]['parent_id']) if User.current.admin? && params[:project].has_key?('parent_id')
109 @project.set_parent!(params[:project]['parent_id']) if User.current.admin? && params[:project].has_key?('parent_id')
109 flash[:notice] = l(:notice_successful_create)
110 flash[:notice] = l(:notice_successful_create)
110 redirect_to :controller => 'admin', :action => 'projects'
111 redirect_to :controller => 'admin', :action => 'projects'
111 end
112 end
112 end
113 end
113 end
114 end
114
115
115
116
116 # Show @project
117 # Show @project
117 def show
118 def show
118 if params[:jump]
119 if params[:jump]
119 # try to redirect to the requested menu item
120 # try to redirect to the requested menu item
120 redirect_to_project_menu_item(@project, params[:jump]) && return
121 redirect_to_project_menu_item(@project, params[:jump]) && return
121 end
122 end
122
123
123 @users_by_role = @project.users_by_role
124 @users_by_role = @project.users_by_role
124 @subprojects = @project.children.visible
125 @subprojects = @project.children.visible
125 @news = @project.news.find(:all, :limit => 5, :include => [ :author, :project ], :order => "#{News.table_name}.created_on DESC")
126 @news = @project.news.find(:all, :limit => 5, :include => [ :author, :project ], :order => "#{News.table_name}.created_on DESC")
126 @trackers = @project.rolled_up_trackers
127 @trackers = @project.rolled_up_trackers
127
128
128 cond = @project.project_condition(Setting.display_subprojects_issues?)
129 cond = @project.project_condition(Setting.display_subprojects_issues?)
129
130
130 @open_issues_by_tracker = Issue.visible.count(:group => :tracker,
131 @open_issues_by_tracker = Issue.visible.count(:group => :tracker,
131 :include => [:project, :status, :tracker],
132 :include => [:project, :status, :tracker],
132 :conditions => ["(#{cond}) AND #{IssueStatus.table_name}.is_closed=?", false])
133 :conditions => ["(#{cond}) AND #{IssueStatus.table_name}.is_closed=?", false])
133 @total_issues_by_tracker = Issue.visible.count(:group => :tracker,
134 @total_issues_by_tracker = Issue.visible.count(:group => :tracker,
134 :include => [:project, :status, :tracker],
135 :include => [:project, :status, :tracker],
135 :conditions => cond)
136 :conditions => cond)
136
137
137 TimeEntry.visible_by(User.current) do
138 TimeEntry.visible_by(User.current) do
138 @total_hours = TimeEntry.sum(:hours,
139 @total_hours = TimeEntry.sum(:hours,
139 :include => :project,
140 :include => :project,
140 :conditions => cond).to_f
141 :conditions => cond).to_f
141 end
142 end
142 @key = User.current.rss_key
143 @key = User.current.rss_key
143 end
144 end
144
145
145 def settings
146 def settings
146 @issue_custom_fields = IssueCustomField.find(:all, :order => "#{CustomField.table_name}.position")
147 @issue_custom_fields = IssueCustomField.find(:all, :order => "#{CustomField.table_name}.position")
147 @issue_category ||= IssueCategory.new
148 @issue_category ||= IssueCategory.new
148 @member ||= @project.members.new
149 @member ||= @project.members.new
149 @trackers = Tracker.all
150 @trackers = Tracker.all
150 @repository ||= @project.repository
151 @repository ||= @project.repository
151 @wiki ||= @project.wiki
152 @wiki ||= @project.wiki
152 end
153 end
153
154
154 # Edit @project
155 # Edit @project
155 def edit
156 def edit
156 if request.post?
157 if request.post?
157 @project.attributes = params[:project]
158 @project.attributes = params[:project]
158 if @project.save
159 if @project.save
159 @project.set_parent!(params[:project]['parent_id']) if User.current.admin? && params[:project].has_key?('parent_id')
160 @project.set_parent!(params[:project]['parent_id']) if User.current.admin? && params[:project].has_key?('parent_id')
160 flash[:notice] = l(:notice_successful_update)
161 flash[:notice] = l(:notice_successful_update)
161 redirect_to :action => 'settings', :id => @project
162 redirect_to :action => 'settings', :id => @project
162 else
163 else
163 settings
164 settings
164 render :action => 'settings'
165 render :action => 'settings'
165 end
166 end
166 end
167 end
167 end
168 end
168
169
169 def modules
170 def modules
170 @project.enabled_module_names = params[:enabled_modules]
171 @project.enabled_module_names = params[:enabled_modules]
171 redirect_to :action => 'settings', :id => @project, :tab => 'modules'
172 redirect_to :action => 'settings', :id => @project, :tab => 'modules'
172 end
173 end
173
174
174 def archive
175 def archive
175 @project.archive if request.post? && @project.active?
176 @project.archive if request.post? && @project.active?
176 redirect_to(url_for(:controller => 'admin', :action => 'projects', :status => params[:status]))
177 redirect_to(url_for(:controller => 'admin', :action => 'projects', :status => params[:status]))
177 end
178 end
178
179
179 def unarchive
180 def unarchive
180 @project.unarchive if request.post? && !@project.active?
181 @project.unarchive if request.post? && !@project.active?
181 redirect_to(url_for(:controller => 'admin', :action => 'projects', :status => params[:status]))
182 redirect_to(url_for(:controller => 'admin', :action => 'projects', :status => params[:status]))
182 end
183 end
183
184
184 # Delete @project
185 # Delete @project
185 def destroy
186 def destroy
186 @project_to_destroy = @project
187 @project_to_destroy = @project
187 if request.post? and params[:confirm]
188 if request.post? and params[:confirm]
188 @project_to_destroy.destroy
189 @project_to_destroy.destroy
189 redirect_to :controller => 'admin', :action => 'projects'
190 redirect_to :controller => 'admin', :action => 'projects'
190 end
191 end
191 # hide project in layout
192 # hide project in layout
192 @project = nil
193 @project = nil
193 end
194 end
194
195
195 # Add a new issue category to @project
196 # Add a new issue category to @project
196 def add_issue_category
197 def add_issue_category
197 @category = @project.issue_categories.build(params[:category])
198 @category = @project.issue_categories.build(params[:category])
198 if request.post? and @category.save
199 if request.post? and @category.save
199 respond_to do |format|
200 respond_to do |format|
200 format.html do
201 format.html do
201 flash[:notice] = l(:notice_successful_create)
202 flash[:notice] = l(:notice_successful_create)
202 redirect_to :action => 'settings', :tab => 'categories', :id => @project
203 redirect_to :action => 'settings', :tab => 'categories', :id => @project
203 end
204 end
204 format.js do
205 format.js do
205 # IE doesn't support the replace_html rjs method for select box options
206 # IE doesn't support the replace_html rjs method for select box options
206 render(:update) {|page| page.replace "issue_category_id",
207 render(:update) {|page| page.replace "issue_category_id",
207 content_tag('select', '<option></option>' + options_from_collection_for_select(@project.issue_categories, 'id', 'name', @category.id), :id => 'issue_category_id', :name => 'issue[category_id]')
208 content_tag('select', '<option></option>' + options_from_collection_for_select(@project.issue_categories, 'id', 'name', @category.id), :id => 'issue_category_id', :name => 'issue[category_id]')
208 }
209 }
209 end
210 end
210 end
211 end
211 end
212 end
212 end
213 end
213
214
214 # Add a new version to @project
215 # Add a new version to @project
215 def add_version
216 def add_version
216 @version = @project.versions.build(params[:version])
217 @version = @project.versions.build(params[:version])
217 if request.post? and @version.save
218 if request.post? and @version.save
218 flash[:notice] = l(:notice_successful_create)
219 flash[:notice] = l(:notice_successful_create)
219 redirect_to :action => 'settings', :tab => 'versions', :id => @project
220 redirect_to :action => 'settings', :tab => 'versions', :id => @project
220 end
221 end
221 end
222 end
222
223
223 def add_file
224 def add_file
224 if request.post?
225 if request.post?
225 container = (params[:version_id].blank? ? @project : @project.versions.find_by_id(params[:version_id]))
226 container = (params[:version_id].blank? ? @project : @project.versions.find_by_id(params[:version_id]))
226 attachments = attach_files(container, params[:attachments])
227 attachments = attach_files(container, params[:attachments])
227 if !attachments.empty? && Setting.notified_events.include?('file_added')
228 if !attachments.empty? && Setting.notified_events.include?('file_added')
228 Mailer.deliver_attachments_added(attachments)
229 Mailer.deliver_attachments_added(attachments)
229 end
230 end
230 redirect_to :controller => 'projects', :action => 'list_files', :id => @project
231 redirect_to :controller => 'projects', :action => 'list_files', :id => @project
231 return
232 return
232 end
233 end
233 @versions = @project.versions.sort
234 @versions = @project.versions.sort
234 end
235 end
235
236
236 def save_activities
237 def save_activities
237 if request.post? && params[:enumerations]
238 if request.post? && params[:enumerations]
238 Project.transaction do
239 Project.transaction do
239 params[:enumerations].each do |id, activity|
240 params[:enumerations].each do |id, activity|
240 @project.update_or_create_time_entry_activity(id, activity)
241 @project.update_or_create_time_entry_activity(id, activity)
241 end
242 end
242 end
243 end
243 end
244 end
244
245
245 redirect_to :controller => 'projects', :action => 'settings', :tab => 'activities', :id => @project
246 redirect_to :controller => 'projects', :action => 'settings', :tab => 'activities', :id => @project
246 end
247 end
247
248
248 def reset_activities
249 def reset_activities
249 @project.time_entry_activities.each do |time_entry_activity|
250 @project.time_entry_activities.each do |time_entry_activity|
250 time_entry_activity.destroy(time_entry_activity.parent)
251 time_entry_activity.destroy(time_entry_activity.parent)
251 end
252 end
252 redirect_to :controller => 'projects', :action => 'settings', :tab => 'activities', :id => @project
253 redirect_to :controller => 'projects', :action => 'settings', :tab => 'activities', :id => @project
253 end
254 end
254
255
255 def list_files
256 def list_files
256 sort_init 'filename', 'asc'
257 sort_init 'filename', 'asc'
257 sort_update 'filename' => "#{Attachment.table_name}.filename",
258 sort_update 'filename' => "#{Attachment.table_name}.filename",
258 'created_on' => "#{Attachment.table_name}.created_on",
259 'created_on' => "#{Attachment.table_name}.created_on",
259 'size' => "#{Attachment.table_name}.filesize",
260 'size' => "#{Attachment.table_name}.filesize",
260 'downloads' => "#{Attachment.table_name}.downloads"
261 'downloads' => "#{Attachment.table_name}.downloads"
261
262
262 @containers = [ Project.find(@project.id, :include => :attachments, :order => sort_clause)]
263 @containers = [ Project.find(@project.id, :include => :attachments, :order => sort_clause)]
263 @containers += @project.versions.find(:all, :include => :attachments, :order => sort_clause).sort.reverse
264 @containers += @project.versions.find(:all, :include => :attachments, :order => sort_clause).sort.reverse
264 render :layout => !request.xhr?
265 render :layout => !request.xhr?
265 end
266 end
266
267
267 # Show changelog for @project
268 # Show changelog for @project
268 def changelog
269 def changelog
269 @trackers = @project.trackers.find(:all, :conditions => ["is_in_chlog=?", true], :order => 'position')
270 @trackers = @project.trackers.find(:all, :conditions => ["is_in_chlog=?", true], :order => 'position')
270 retrieve_selected_tracker_ids(@trackers)
271 retrieve_selected_tracker_ids(@trackers)
271 @versions = @project.versions.sort
272 @versions = @project.versions.sort
272 end
273 end
273
274
274 def roadmap
275 def roadmap
275 @trackers = @project.trackers.find(:all, :conditions => ["is_in_roadmap=?", true])
276 @trackers = @project.trackers.find(:all, :conditions => ["is_in_roadmap=?", true])
276 retrieve_selected_tracker_ids(@trackers)
277 retrieve_selected_tracker_ids(@trackers)
277 @versions = @project.versions.sort
278 @versions = @project.versions.sort
278 @versions = @versions.select {|v| !v.completed? } unless params[:completed]
279 @versions = @versions.select {|v| !v.completed? } unless params[:completed]
279 end
280 end
280
281
281 def activity
282 def activity
282 @days = Setting.activity_days_default.to_i
283 @days = Setting.activity_days_default.to_i
283
284
284 if params[:from]
285 if params[:from]
285 begin; @date_to = params[:from].to_date + 1; rescue; end
286 begin; @date_to = params[:from].to_date + 1; rescue; end
286 end
287 end
287
288
288 @date_to ||= Date.today + 1
289 @date_to ||= Date.today + 1
289 @date_from = @date_to - @days
290 @date_from = @date_to - @days
290 @with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1')
291 @with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1')
291 @author = (params[:user_id].blank? ? nil : User.active.find(params[:user_id]))
292 @author = (params[:user_id].blank? ? nil : User.active.find(params[:user_id]))
292
293
293 @activity = Redmine::Activity::Fetcher.new(User.current, :project => @project,
294 @activity = Redmine::Activity::Fetcher.new(User.current, :project => @project,
294 :with_subprojects => @with_subprojects,
295 :with_subprojects => @with_subprojects,
295 :author => @author)
296 :author => @author)
296 @activity.scope_select {|t| !params["show_#{t}"].nil?}
297 @activity.scope_select {|t| !params["show_#{t}"].nil?}
297 @activity.scope = (@author.nil? ? :default : :all) if @activity.scope.empty?
298 @activity.scope = (@author.nil? ? :default : :all) if @activity.scope.empty?
298
299
299 events = @activity.events(@date_from, @date_to)
300 events = @activity.events(@date_from, @date_to)
300
301
301 respond_to do |format|
302 respond_to do |format|
302 format.html {
303 format.html {
303 @events_by_day = events.group_by(&:event_date)
304 @events_by_day = events.group_by(&:event_date)
304 render :layout => false if request.xhr?
305 render :layout => false if request.xhr?
305 }
306 }
306 format.atom {
307 format.atom {
307 title = l(:label_activity)
308 title = l(:label_activity)
308 if @author
309 if @author
309 title = @author.name
310 title = @author.name
310 elsif @activity.scope.size == 1
311 elsif @activity.scope.size == 1
311 title = l("label_#{@activity.scope.first.singularize}_plural")
312 title = l("label_#{@activity.scope.first.singularize}_plural")
312 end
313 end
313 render_feed(events, :title => "#{@project || Setting.app_title}: #{title}")
314 render_feed(events, :title => "#{@project || Setting.app_title}: #{title}")
314 }
315 }
315 end
316 end
316
317
317 rescue ActiveRecord::RecordNotFound
318 rescue ActiveRecord::RecordNotFound
318 render_404
319 render_404
319 end
320 end
320
321
321 private
322 private
322 # Find project of id params[:id]
323 # Find project of id params[:id]
323 # if not found, redirect to project list
324 # if not found, redirect to project list
324 # Used as a before_filter
325 # Used as a before_filter
325 def find_project
326 def find_project
326 @project = Project.find(params[:id])
327 @project = Project.find(params[:id])
327 rescue ActiveRecord::RecordNotFound
328 rescue ActiveRecord::RecordNotFound
328 render_404
329 render_404
329 end
330 end
330
331
331 def find_optional_project
332 def find_optional_project
332 return true unless params[:id]
333 return true unless params[:id]
333 @project = Project.find(params[:id])
334 @project = Project.find(params[:id])
334 authorize
335 authorize
335 rescue ActiveRecord::RecordNotFound
336 rescue ActiveRecord::RecordNotFound
336 render_404
337 render_404
337 end
338 end
338
339
339 def retrieve_selected_tracker_ids(selectable_trackers)
340 def retrieve_selected_tracker_ids(selectable_trackers)
340 if ids = params[:tracker_ids]
341 if ids = params[:tracker_ids]
341 @selected_tracker_ids = (ids.is_a? Array) ? ids.collect { |id| id.to_i.to_s } : ids.split('/').collect { |id| id.to_i.to_s }
342 @selected_tracker_ids = (ids.is_a? Array) ? ids.collect { |id| id.to_i.to_s } : ids.split('/').collect { |id| id.to_i.to_s }
342 else
343 else
343 @selected_tracker_ids = selectable_trackers.collect {|t| t.id.to_s }
344 @selected_tracker_ids = selectable_trackers.collect {|t| t.id.to_s }
344 end
345 end
345 end
346 end
346 end
347 end
@@ -1,26 +1,26
1 <h2><%=l(:label_project_new)%></h2>
1 <h2><%=l(:label_project_new)%></h2>
2
2
3 <% labelled_tabular_form_for :project, @project, :url => { :action => "copy" } do |f| %>
3 <% labelled_tabular_form_for :project, @project, :url => { :action => "copy" } do |f| %>
4 <%= render :partial => 'form', :locals => { :f => f } %>
4 <%= render :partial => 'form', :locals => { :f => f } %>
5
5
6 <fieldset class="box"><legend><%= l(:label_module_plural) %></legend>
6 <fieldset class="box"><legend><%= l(:label_module_plural) %></legend>
7 <% Redmine::AccessControl.available_project_modules.each do |m| %>
7 <% Redmine::AccessControl.available_project_modules.each do |m| %>
8 <label class="floating">
8 <label class="floating">
9 <%= check_box_tag 'enabled_modules[]', m, @project.module_enabled?(m) %>
9 <%= check_box_tag 'enabled_modules[]', m, @project.module_enabled?(m) %>
10 <%= l_or_humanize(m, :prefix => "project_module_") %>
10 <%= l_or_humanize(m, :prefix => "project_module_") %>
11 </label>
11 </label>
12 <% end %>
12 <% end %>
13 </fieldset>
13 </fieldset>
14
14
15 <fieldset class="box"><legend><%= l(:button_copy) %></legend>
15 <fieldset class="box"><legend><%= l(:button_copy) %></legend>
16 <label class="floating"><%= check_box_tag 'only[]', 'members', true %> <%= l(:label_member_plural) %></label>
16 <label class="block"><%= check_box_tag 'only[]', 'members', true %> <%= l(:label_member_plural) %> (<%= @source_project.members.count %>)</label>
17 <label class="floating"><%= check_box_tag 'only[]', 'versions', true %> <%= l(:label_version_plural) %></label>
17 <label class="block"><%= check_box_tag 'only[]', 'versions', true %> <%= l(:label_version_plural) %> (<%= @source_project.versions.count %>)</label>
18 <label class="floating"><%= check_box_tag 'only[]', 'issue_categories', true %> <%= l(:label_issue_category_plural) %></label>
18 <label class="block"><%= check_box_tag 'only[]', 'issue_categories', true %> <%= l(:label_issue_category_plural) %> (<%= @source_project.issue_categories.count %>)</label>
19 <label class="floating"><%= check_box_tag 'only[]', 'issues', true %> <%= l(:label_issue_plural) %></label>
19 <label class="block"><%= check_box_tag 'only[]', 'issues', true %> <%= l(:label_issue_plural) %> (<%= @source_project.issues.count %>)</label>
20 <label class="floating"><%= check_box_tag 'only[]', 'queries', true %> <%= l(:label_query_plural) %></label>
20 <label class="block"><%= check_box_tag 'only[]', 'queries', true %> <%= l(:label_query_plural) %> (<%= @source_project.queries.count %>)</label>
21 <label class="floating"><%= check_box_tag 'only[]', 'wiki', true %> <%= l(:label_wiki) %></label>
21 <label class="block"><%= check_box_tag 'only[]', 'wiki', true %> <%= l(:label_wiki_page_plural) %> (<%= @source_project.wiki.nil? ? 0 : @source_project.wiki.pages.count %>)</label>
22 <%= hidden_field_tag 'only[]', '' %>
22 <%= hidden_field_tag 'only[]', '' %>
23 </fieldset>
23 </fieldset>
24
24
25 <%= submit_tag l(:button_copy) %>
25 <%= submit_tag l(:button_copy) %>
26 <% end %>
26 <% end %>
@@ -1,799 +1,808
1 body { font-family: Verdana, sans-serif; font-size: 12px; color:#484848; margin: 0; padding: 0; min-width: 900px; }
1 body { font-family: Verdana, sans-serif; font-size: 12px; color:#484848; margin: 0; padding: 0; min-width: 900px; }
2
2
3 h1, h2, h3, h4 { font-family: "Trebuchet MS", Verdana, sans-serif;}
3 h1, h2, h3, h4 { font-family: "Trebuchet MS", Verdana, sans-serif;}
4 h1 {margin:0; padding:0; font-size: 24px;}
4 h1 {margin:0; padding:0; font-size: 24px;}
5 h2, .wiki h1 {font-size: 20px;padding: 2px 10px 1px 0px;margin: 0 0 10px 0; border-bottom: 1px solid #bbbbbb; color: #444;}
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 h3, .wiki h2 {font-size: 16px;padding: 2px 10px 1px 0px;margin: 0 0 10px 0; border-bottom: 1px solid #bbbbbb; color: #444;}
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 h4, .wiki h3 {font-size: 13px;padding: 2px 10px 1px 0px;margin-bottom: 5px; border-bottom: 1px dotted #bbbbbb; color: #444;}
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 /***** Layout *****/
9 /***** Layout *****/
10 #wrapper {background: white;}
10 #wrapper {background: white;}
11
11
12 #top-menu {background: #2C4056; color: #fff; height:1.8em; font-size: 0.8em; padding: 2px 2px 0px 6px;}
12 #top-menu {background: #2C4056; color: #fff; height:1.8em; font-size: 0.8em; padding: 2px 2px 0px 6px;}
13 #top-menu ul {margin: 0; padding: 0;}
13 #top-menu ul {margin: 0; padding: 0;}
14 #top-menu li {
14 #top-menu li {
15 float:left;
15 float:left;
16 list-style-type:none;
16 list-style-type:none;
17 margin: 0px 0px 0px 0px;
17 margin: 0px 0px 0px 0px;
18 padding: 0px 0px 0px 0px;
18 padding: 0px 0px 0px 0px;
19 white-space:nowrap;
19 white-space:nowrap;
20 }
20 }
21 #top-menu a {color: #fff; margin-right: 8px; font-weight: bold;}
21 #top-menu a {color: #fff; margin-right: 8px; font-weight: bold;}
22 #top-menu #loggedas { float: right; margin-right: 0.5em; color: #fff; }
22 #top-menu #loggedas { float: right; margin-right: 0.5em; color: #fff; }
23
23
24 #account {float:right;}
24 #account {float:right;}
25
25
26 #header {height:5.3em;margin:0;background-color:#507AAA;color:#f8f8f8; padding: 4px 8px 0px 6px; position:relative;}
26 #header {height:5.3em;margin:0;background-color:#507AAA;color:#f8f8f8; padding: 4px 8px 0px 6px; position:relative;}
27 #header a {color:#f8f8f8;}
27 #header a {color:#f8f8f8;}
28 #header h1 a.ancestor { font-size: 80%; }
28 #header h1 a.ancestor { font-size: 80%; }
29 #quick-search {float:right;}
29 #quick-search {float:right;}
30
30
31 #main-menu {position: absolute; bottom: 0px; left:6px; margin-right: -500px;}
31 #main-menu {position: absolute; bottom: 0px; left:6px; margin-right: -500px;}
32 #main-menu ul {margin: 0; padding: 0;}
32 #main-menu ul {margin: 0; padding: 0;}
33 #main-menu li {
33 #main-menu li {
34 float:left;
34 float:left;
35 list-style-type:none;
35 list-style-type:none;
36 margin: 0px 2px 0px 0px;
36 margin: 0px 2px 0px 0px;
37 padding: 0px 0px 0px 0px;
37 padding: 0px 0px 0px 0px;
38 white-space:nowrap;
38 white-space:nowrap;
39 }
39 }
40 #main-menu li a {
40 #main-menu li a {
41 display: block;
41 display: block;
42 color: #fff;
42 color: #fff;
43 text-decoration: none;
43 text-decoration: none;
44 font-weight: bold;
44 font-weight: bold;
45 margin: 0;
45 margin: 0;
46 padding: 4px 10px 4px 10px;
46 padding: 4px 10px 4px 10px;
47 }
47 }
48 #main-menu li a:hover {background:#759FCF; color:#fff;}
48 #main-menu li a:hover {background:#759FCF; color:#fff;}
49 #main-menu li a.selected, #main-menu li a.selected:hover {background:#fff; color:#555;}
49 #main-menu li a.selected, #main-menu li a.selected:hover {background:#fff; color:#555;}
50
50
51 #main {background-color:#EEEEEE;}
51 #main {background-color:#EEEEEE;}
52
52
53 #sidebar{ float: right; width: 17%; position: relative; z-index: 9; min-height: 600px; padding: 0; margin: 0;}
53 #sidebar{ float: right; width: 17%; position: relative; z-index: 9; min-height: 600px; padding: 0; margin: 0;}
54 * html #sidebar{ width: 17%; }
54 * html #sidebar{ width: 17%; }
55 #sidebar h3{ font-size: 14px; margin-top:14px; color: #666; }
55 #sidebar h3{ font-size: 14px; margin-top:14px; color: #666; }
56 #sidebar hr{ width: 100%; margin: 0 auto; height: 1px; background: #ccc; border: 0; }
56 #sidebar hr{ width: 100%; margin: 0 auto; height: 1px; background: #ccc; border: 0; }
57 * html #sidebar hr{ width: 95%; position: relative; left: -6px; color: #ccc; }
57 * html #sidebar hr{ width: 95%; position: relative; left: -6px; color: #ccc; }
58
58
59 #content { width: 80%; background-color: #fff; margin: 0px; border-right: 1px solid #ddd; padding: 6px 10px 10px 10px; z-index: 10; }
59 #content { width: 80%; background-color: #fff; margin: 0px; border-right: 1px solid #ddd; padding: 6px 10px 10px 10px; z-index: 10; }
60 * html #content{ width: 80%; padding-left: 0; margin-top: 0px; padding: 6px 10px 10px 10px;}
60 * html #content{ width: 80%; padding-left: 0; margin-top: 0px; padding: 6px 10px 10px 10px;}
61 html>body #content { min-height: 600px; }
61 html>body #content { min-height: 600px; }
62 * html body #content { height: 600px; } /* IE */
62 * html body #content { height: 600px; } /* IE */
63
63
64 #main.nosidebar #sidebar{ display: none; }
64 #main.nosidebar #sidebar{ display: none; }
65 #main.nosidebar #content{ width: auto; border-right: 0; }
65 #main.nosidebar #content{ width: auto; border-right: 0; }
66
66
67 #footer {clear: both; border-top: 1px solid #bbb; font-size: 0.9em; color: #aaa; padding: 5px; text-align:center; background:#fff;}
67 #footer {clear: both; border-top: 1px solid #bbb; font-size: 0.9em; color: #aaa; padding: 5px; text-align:center; background:#fff;}
68
68
69 #login-form table {margin-top:5em; padding:1em; margin-left: auto; margin-right: auto; border: 2px solid #FDBF3B; background-color:#FFEBC1; }
69 #login-form table {margin-top:5em; padding:1em; margin-left: auto; margin-right: auto; border: 2px solid #FDBF3B; background-color:#FFEBC1; }
70 #login-form table td {padding: 6px;}
70 #login-form table td {padding: 6px;}
71 #login-form label {font-weight: bold;}
71 #login-form label {font-weight: bold;}
72 #login-form input#username, #login-form input#password { width: 300px; }
72 #login-form input#username, #login-form input#password { width: 300px; }
73
73
74 input#openid_url { background: url(../images/openid-bg.gif) no-repeat; background-color: #fff; background-position: 0 50%; padding-left: 18px; }
74 input#openid_url { background: url(../images/openid-bg.gif) no-repeat; background-color: #fff; background-position: 0 50%; padding-left: 18px; }
75
75
76 .clear:after{ content: "."; display: block; height: 0; clear: both; visibility: hidden; }
76 .clear:after{ content: "."; display: block; height: 0; clear: both; visibility: hidden; }
77
77
78 /***** Links *****/
78 /***** Links *****/
79 a, a:link, a:visited{ color: #2A5685; text-decoration: none; }
79 a, a:link, a:visited{ color: #2A5685; text-decoration: none; }
80 a:hover, a:active{ color: #c61a1a; text-decoration: underline;}
80 a:hover, a:active{ color: #c61a1a; text-decoration: underline;}
81 a img{ border: 0; }
81 a img{ border: 0; }
82
82
83 a.issue.closed, a.issue.closed:link, a.issue.closed:visited { color: #999; text-decoration: line-through; }
83 a.issue.closed, a.issue.closed:link, a.issue.closed:visited { color: #999; text-decoration: line-through; }
84
84
85 /***** Tables *****/
85 /***** Tables *****/
86 table.list { border: 1px solid #e4e4e4; border-collapse: collapse; width: 100%; margin-bottom: 4px; }
86 table.list { border: 1px solid #e4e4e4; border-collapse: collapse; width: 100%; margin-bottom: 4px; }
87 table.list th { background-color:#EEEEEE; padding: 4px; white-space:nowrap; }
87 table.list th { background-color:#EEEEEE; padding: 4px; white-space:nowrap; }
88 table.list td { vertical-align: top; }
88 table.list td { vertical-align: top; }
89 table.list td.id { width: 2%; text-align: center;}
89 table.list td.id { width: 2%; text-align: center;}
90 table.list td.checkbox { width: 15px; padding: 0px;}
90 table.list td.checkbox { width: 15px; padding: 0px;}
91 table.list td.buttons { width: 15%; white-space:nowrap; text-align: right; }
91 table.list td.buttons { width: 15%; white-space:nowrap; text-align: right; }
92 table.list td.buttons a { padding-right: 0.6em; }
92 table.list td.buttons a { padding-right: 0.6em; }
93
93
94 tr.project td.name a { padding-left: 16px; white-space:nowrap; }
94 tr.project td.name a { padding-left: 16px; white-space:nowrap; }
95 tr.project.parent td.name a { background: url('../images/bullet_toggle_minus.png') no-repeat; }
95 tr.project.parent td.name a { background: url('../images/bullet_toggle_minus.png') no-repeat; }
96
96
97 tr.issue { text-align: center; white-space: nowrap; }
97 tr.issue { text-align: center; white-space: nowrap; }
98 tr.issue td.subject, tr.issue td.category, td.assigned_to { white-space: normal; }
98 tr.issue td.subject, tr.issue td.category, td.assigned_to { white-space: normal; }
99 tr.issue td.subject { text-align: left; }
99 tr.issue td.subject { text-align: left; }
100 tr.issue td.done_ratio table.progress { margin-left:auto; margin-right: auto;}
100 tr.issue td.done_ratio table.progress { margin-left:auto; margin-right: auto;}
101
101
102 tr.entry { border: 1px solid #f8f8f8; }
102 tr.entry { border: 1px solid #f8f8f8; }
103 tr.entry td { white-space: nowrap; }
103 tr.entry td { white-space: nowrap; }
104 tr.entry td.filename { width: 30%; }
104 tr.entry td.filename { width: 30%; }
105 tr.entry td.size { text-align: right; font-size: 90%; }
105 tr.entry td.size { text-align: right; font-size: 90%; }
106 tr.entry td.revision, tr.entry td.author { text-align: center; }
106 tr.entry td.revision, tr.entry td.author { text-align: center; }
107 tr.entry td.age { text-align: right; }
107 tr.entry td.age { text-align: right; }
108 tr.entry.file td.filename a { margin-left: 16px; }
108 tr.entry.file td.filename a { margin-left: 16px; }
109
109
110 tr span.expander {background-image: url(../images/bullet_toggle_plus.png); padding-left: 8px; margin-left: 0; cursor: pointer;}
110 tr span.expander {background-image: url(../images/bullet_toggle_plus.png); padding-left: 8px; margin-left: 0; cursor: pointer;}
111 tr.open span.expander {background-image: url(../images/bullet_toggle_minus.png);}
111 tr.open span.expander {background-image: url(../images/bullet_toggle_minus.png);}
112
112
113 tr.changeset td.author { text-align: center; width: 15%; }
113 tr.changeset td.author { text-align: center; width: 15%; }
114 tr.changeset td.committed_on { text-align: center; width: 15%; }
114 tr.changeset td.committed_on { text-align: center; width: 15%; }
115
115
116 table.files tr.file td { text-align: center; }
116 table.files tr.file td { text-align: center; }
117 table.files tr.file td.filename { text-align: left; padding-left: 24px; }
117 table.files tr.file td.filename { text-align: left; padding-left: 24px; }
118 table.files tr.file td.digest { font-size: 80%; }
118 table.files tr.file td.digest { font-size: 80%; }
119
119
120 table.members td.roles, table.memberships td.roles { width: 45%; }
120 table.members td.roles, table.memberships td.roles { width: 45%; }
121
121
122 tr.message { height: 2.6em; }
122 tr.message { height: 2.6em; }
123 tr.message td.last_message { font-size: 80%; }
123 tr.message td.last_message { font-size: 80%; }
124 tr.message.locked td.subject a { background-image: url(../images/locked.png); }
124 tr.message.locked td.subject a { background-image: url(../images/locked.png); }
125 tr.message.sticky td.subject a { background-image: url(../images/sticky.png); font-weight: bold; }
125 tr.message.sticky td.subject a { background-image: url(../images/sticky.png); font-weight: bold; }
126
126
127 tr.user td { width:13%; }
127 tr.user td { width:13%; }
128 tr.user td.email { width:18%; }
128 tr.user td.email { width:18%; }
129 tr.user td { white-space: nowrap; }
129 tr.user td { white-space: nowrap; }
130 tr.user.locked, tr.user.registered { color: #aaa; }
130 tr.user.locked, tr.user.registered { color: #aaa; }
131 tr.user.locked a, tr.user.registered a { color: #aaa; }
131 tr.user.locked a, tr.user.registered a { color: #aaa; }
132
132
133 tr.time-entry { text-align: center; white-space: nowrap; }
133 tr.time-entry { text-align: center; white-space: nowrap; }
134 tr.time-entry td.subject, tr.time-entry td.comments { text-align: left; white-space: normal; }
134 tr.time-entry td.subject, tr.time-entry td.comments { text-align: left; white-space: normal; }
135 td.hours { text-align: right; font-weight: bold; padding-right: 0.5em; }
135 td.hours { text-align: right; font-weight: bold; padding-right: 0.5em; }
136 td.hours .hours-dec { font-size: 0.9em; }
136 td.hours .hours-dec { font-size: 0.9em; }
137
137
138 table.plugins td { vertical-align: middle; }
138 table.plugins td { vertical-align: middle; }
139 table.plugins td.configure { text-align: right; padding-right: 1em; }
139 table.plugins td.configure { text-align: right; padding-right: 1em; }
140 table.plugins span.name { font-weight: bold; display: block; margin-bottom: 6px; }
140 table.plugins span.name { font-weight: bold; display: block; margin-bottom: 6px; }
141 table.plugins span.description { display: block; font-size: 0.9em; }
141 table.plugins span.description { display: block; font-size: 0.9em; }
142 table.plugins span.url { display: block; font-size: 0.9em; }
142 table.plugins span.url { display: block; font-size: 0.9em; }
143
143
144 table.list tbody tr.group td { padding: 0.8em 0 0.5em 0.3em; font-weight: bold; border-bottom: 1px solid #ccc; }
144 table.list tbody tr.group td { padding: 0.8em 0 0.5em 0.3em; font-weight: bold; border-bottom: 1px solid #ccc; }
145 table.list tbody tr.group span.count { color: #aaa; font-size: 80%; }
145 table.list tbody tr.group span.count { color: #aaa; font-size: 80%; }
146
146
147 table.list tbody tr:hover { background-color:#ffffdd; }
147 table.list tbody tr:hover { background-color:#ffffdd; }
148 table.list tbody tr.group:hover { background-color:inherit; }
148 table.list tbody tr.group:hover { background-color:inherit; }
149 table td {padding:2px;}
149 table td {padding:2px;}
150 table p {margin:0;}
150 table p {margin:0;}
151 .odd {background-color:#f6f7f8;}
151 .odd {background-color:#f6f7f8;}
152 .even {background-color: #fff;}
152 .even {background-color: #fff;}
153
153
154 a.sort { padding-right: 16px; background-position: 100% 50%; background-repeat: no-repeat; }
154 a.sort { padding-right: 16px; background-position: 100% 50%; background-repeat: no-repeat; }
155 a.sort.asc { background-image: url(../images/sort_asc.png); }
155 a.sort.asc { background-image: url(../images/sort_asc.png); }
156 a.sort.desc { background-image: url(../images/sort_desc.png); }
156 a.sort.desc { background-image: url(../images/sort_desc.png); }
157
157
158 table.attributes { width: 100% }
158 table.attributes { width: 100% }
159 table.attributes th { vertical-align: top; text-align: left; }
159 table.attributes th { vertical-align: top; text-align: left; }
160 table.attributes td { vertical-align: top; }
160 table.attributes td { vertical-align: top; }
161
161
162 td.center {text-align:center;}
162 td.center {text-align:center;}
163
163
164 .highlight { background-color: #FCFD8D;}
164 .highlight { background-color: #FCFD8D;}
165 .highlight.token-1 { background-color: #faa;}
165 .highlight.token-1 { background-color: #faa;}
166 .highlight.token-2 { background-color: #afa;}
166 .highlight.token-2 { background-color: #afa;}
167 .highlight.token-3 { background-color: #aaf;}
167 .highlight.token-3 { background-color: #aaf;}
168
168
169 .box{
169 .box{
170 padding:6px;
170 padding:6px;
171 margin-bottom: 10px;
171 margin-bottom: 10px;
172 background-color:#f6f6f6;
172 background-color:#f6f6f6;
173 color:#505050;
173 color:#505050;
174 line-height:1.5em;
174 line-height:1.5em;
175 border: 1px solid #e4e4e4;
175 border: 1px solid #e4e4e4;
176 }
176 }
177
177
178 div.square {
178 div.square {
179 border: 1px solid #999;
179 border: 1px solid #999;
180 float: left;
180 float: left;
181 margin: .3em .4em 0 .4em;
181 margin: .3em .4em 0 .4em;
182 overflow: hidden;
182 overflow: hidden;
183 width: .6em; height: .6em;
183 width: .6em; height: .6em;
184 }
184 }
185 .contextual {float:right; white-space: nowrap; line-height:1.4em;margin-top:5px; padding-left: 10px; font-size:0.9em;}
185 .contextual {float:right; white-space: nowrap; line-height:1.4em;margin-top:5px; padding-left: 10px; font-size:0.9em;}
186 .contextual input, .contextual select {font-size:0.9em;}
186 .contextual input, .contextual select {font-size:0.9em;}
187 .message .contextual { margin-top: 0; }
187 .message .contextual { margin-top: 0; }
188
188
189 .splitcontentleft{float:left; width:49%;}
189 .splitcontentleft{float:left; width:49%;}
190 .splitcontentright{float:right; width:49%;}
190 .splitcontentright{float:right; width:49%;}
191 form {display: inline;}
191 form {display: inline;}
192 input, select {vertical-align: middle; margin-top: 1px; margin-bottom: 1px;}
192 input, select {vertical-align: middle; margin-top: 1px; margin-bottom: 1px;}
193 fieldset {border: 1px solid #e4e4e4; margin:0;}
193 fieldset {border: 1px solid #e4e4e4; margin:0;}
194 legend {color: #484848;}
194 legend {color: #484848;}
195 hr { width: 100%; height: 1px; background: #ccc; border: 0;}
195 hr { width: 100%; height: 1px; background: #ccc; border: 0;}
196 blockquote { font-style: italic; border-left: 3px solid #e0e0e0; padding-left: 0.6em; margin-left: 2.4em;}
196 blockquote { font-style: italic; border-left: 3px solid #e0e0e0; padding-left: 0.6em; margin-left: 2.4em;}
197 blockquote blockquote { margin-left: 0;}
197 blockquote blockquote { margin-left: 0;}
198 textarea.wiki-edit { width: 99%; }
198 textarea.wiki-edit { width: 99%; }
199 li p {margin-top: 0;}
199 li p {margin-top: 0;}
200 div.issue {background:#ffffdd; padding:6px; margin-bottom:6px;border: 1px solid #d7d7d7;}
200 div.issue {background:#ffffdd; padding:6px; margin-bottom:6px;border: 1px solid #d7d7d7;}
201 p.breadcrumb { font-size: 0.9em; margin: 4px 0 4px 0;}
201 p.breadcrumb { font-size: 0.9em; margin: 4px 0 4px 0;}
202 p.subtitle { font-size: 0.9em; margin: -6px 0 12px 0; font-style: italic; }
202 p.subtitle { font-size: 0.9em; margin: -6px 0 12px 0; font-style: italic; }
203 p.footnote { font-size: 0.9em; margin-top: 0px; margin-bottom: 0px; }
203 p.footnote { font-size: 0.9em; margin-top: 0px; margin-bottom: 0px; }
204
204
205 fieldset.collapsible { border-width: 1px 0 0 0; font-size: 0.9em; }
205 fieldset.collapsible { border-width: 1px 0 0 0; font-size: 0.9em; }
206 fieldset.collapsible legend { padding-left: 16px; background: url(../images/arrow_expanded.png) no-repeat 0% 40%; cursor:pointer; }
206 fieldset.collapsible legend { padding-left: 16px; background: url(../images/arrow_expanded.png) no-repeat 0% 40%; cursor:pointer; }
207 fieldset.collapsible.collapsed legend { background-image: url(../images/arrow_collapsed.png); }
207 fieldset.collapsible.collapsed legend { background-image: url(../images/arrow_collapsed.png); }
208
208
209 fieldset#date-range p { margin: 2px 0 2px 0; }
209 fieldset#date-range p { margin: 2px 0 2px 0; }
210 fieldset#filters table { border-collapse: collapse; }
210 fieldset#filters table { border-collapse: collapse; }
211 fieldset#filters table td { padding: 0; vertical-align: middle; }
211 fieldset#filters table td { padding: 0; vertical-align: middle; }
212 fieldset#filters tr.filter { height: 2em; }
212 fieldset#filters tr.filter { height: 2em; }
213 fieldset#filters td.add-filter { text-align: right; vertical-align: top; }
213 fieldset#filters td.add-filter { text-align: right; vertical-align: top; }
214 .buttons { font-size: 0.9em; margin-bottom: 1.4em; margin-top: 1em; }
214 .buttons { font-size: 0.9em; margin-bottom: 1.4em; margin-top: 1em; }
215
215
216 div#issue-changesets {float:right; width:45%; margin-left: 1em; margin-bottom: 1em; background: #fff; padding-left: 1em; font-size: 90%;}
216 div#issue-changesets {float:right; width:45%; margin-left: 1em; margin-bottom: 1em; background: #fff; padding-left: 1em; font-size: 90%;}
217 div#issue-changesets .changeset { padding: 4px;}
217 div#issue-changesets .changeset { padding: 4px;}
218 div#issue-changesets .changeset { border-bottom: 1px solid #ddd; }
218 div#issue-changesets .changeset { border-bottom: 1px solid #ddd; }
219 div#issue-changesets p { margin-top: 0; margin-bottom: 1em;}
219 div#issue-changesets p { margin-top: 0; margin-bottom: 1em;}
220
220
221 div#activity dl, #search-results { margin-left: 2em; }
221 div#activity dl, #search-results { margin-left: 2em; }
222 div#activity dd, #search-results dd { margin-bottom: 1em; padding-left: 18px; font-size: 0.9em; }
222 div#activity dd, #search-results dd { margin-bottom: 1em; padding-left: 18px; font-size: 0.9em; }
223 div#activity dt, #search-results dt { margin-bottom: 0px; padding-left: 20px; line-height: 18px; background-position: 0 50%; background-repeat: no-repeat; }
223 div#activity dt, #search-results dt { margin-bottom: 0px; padding-left: 20px; line-height: 18px; background-position: 0 50%; background-repeat: no-repeat; }
224 div#activity dt.me .time { border-bottom: 1px solid #999; }
224 div#activity dt.me .time { border-bottom: 1px solid #999; }
225 div#activity dt .time { color: #777; font-size: 80%; }
225 div#activity dt .time { color: #777; font-size: 80%; }
226 div#activity dd .description, #search-results dd .description { font-style: italic; }
226 div#activity dd .description, #search-results dd .description { font-style: italic; }
227 div#activity span.project:after, #search-results span.project:after { content: " -"; }
227 div#activity span.project:after, #search-results span.project:after { content: " -"; }
228 div#activity dd span.description, #search-results dd span.description { display:block; color: #808080; }
228 div#activity dd span.description, #search-results dd span.description { display:block; color: #808080; }
229
229
230 #search-results dd { margin-bottom: 1em; padding-left: 20px; margin-left:0px; }
230 #search-results dd { margin-bottom: 1em; padding-left: 20px; margin-left:0px; }
231
231
232 div#search-results-counts {float:right;}
232 div#search-results-counts {float:right;}
233 div#search-results-counts ul { margin-top: 0.5em; }
233 div#search-results-counts ul { margin-top: 0.5em; }
234 div#search-results-counts li { list-style-type:none; float: left; margin-left: 1em; }
234 div#search-results-counts li { list-style-type:none; float: left; margin-left: 1em; }
235
235
236 dt.issue { background-image: url(../images/ticket.png); }
236 dt.issue { background-image: url(../images/ticket.png); }
237 dt.issue-edit { background-image: url(../images/ticket_edit.png); }
237 dt.issue-edit { background-image: url(../images/ticket_edit.png); }
238 dt.issue-closed { background-image: url(../images/ticket_checked.png); }
238 dt.issue-closed { background-image: url(../images/ticket_checked.png); }
239 dt.issue-note { background-image: url(../images/ticket_note.png); }
239 dt.issue-note { background-image: url(../images/ticket_note.png); }
240 dt.changeset { background-image: url(../images/changeset.png); }
240 dt.changeset { background-image: url(../images/changeset.png); }
241 dt.news { background-image: url(../images/news.png); }
241 dt.news { background-image: url(../images/news.png); }
242 dt.message { background-image: url(../images/message.png); }
242 dt.message { background-image: url(../images/message.png); }
243 dt.reply { background-image: url(../images/comments.png); }
243 dt.reply { background-image: url(../images/comments.png); }
244 dt.wiki-page { background-image: url(../images/wiki_edit.png); }
244 dt.wiki-page { background-image: url(../images/wiki_edit.png); }
245 dt.attachment { background-image: url(../images/attachment.png); }
245 dt.attachment { background-image: url(../images/attachment.png); }
246 dt.document { background-image: url(../images/document.png); }
246 dt.document { background-image: url(../images/document.png); }
247 dt.project { background-image: url(../images/projects.png); }
247 dt.project { background-image: url(../images/projects.png); }
248 dt.time-entry { background-image: url(../images/time.png); }
248 dt.time-entry { background-image: url(../images/time.png); }
249
249
250 #search-results dt.issue.closed { background-image: url(../images/ticket_checked.png); }
250 #search-results dt.issue.closed { background-image: url(../images/ticket_checked.png); }
251
251
252 div#roadmap fieldset.related-issues { margin-bottom: 1em; }
252 div#roadmap fieldset.related-issues { margin-bottom: 1em; }
253 div#roadmap fieldset.related-issues ul { margin-top: 0.3em; margin-bottom: 0.3em; }
253 div#roadmap fieldset.related-issues ul { margin-top: 0.3em; margin-bottom: 0.3em; }
254 div#roadmap .wiki h1:first-child { display: none; }
254 div#roadmap .wiki h1:first-child { display: none; }
255 div#roadmap .wiki h1 { font-size: 120%; }
255 div#roadmap .wiki h1 { font-size: 120%; }
256 div#roadmap .wiki h2 { font-size: 110%; }
256 div#roadmap .wiki h2 { font-size: 110%; }
257
257
258 div#version-summary { float:right; width:380px; margin-left: 16px; margin-bottom: 16px; background-color: #fff; }
258 div#version-summary { float:right; width:380px; margin-left: 16px; margin-bottom: 16px; background-color: #fff; }
259 div#version-summary fieldset { margin-bottom: 1em; }
259 div#version-summary fieldset { margin-bottom: 1em; }
260 div#version-summary .total-hours { text-align: right; }
260 div#version-summary .total-hours { text-align: right; }
261
261
262 table#time-report td.hours, table#time-report th.period, table#time-report th.total { text-align: right; padding-right: 0.5em; }
262 table#time-report td.hours, table#time-report th.period, table#time-report th.total { text-align: right; padding-right: 0.5em; }
263 table#time-report tbody tr { font-style: italic; color: #777; }
263 table#time-report tbody tr { font-style: italic; color: #777; }
264 table#time-report tbody tr.last-level { font-style: normal; color: #555; }
264 table#time-report tbody tr.last-level { font-style: normal; color: #555; }
265 table#time-report tbody tr.total { font-style: normal; font-weight: bold; color: #555; background-color:#EEEEEE; }
265 table#time-report tbody tr.total { font-style: normal; font-weight: bold; color: #555; background-color:#EEEEEE; }
266 table#time-report .hours-dec { font-size: 0.9em; }
266 table#time-report .hours-dec { font-size: 0.9em; }
267
267
268 form#issue-form .attributes { margin-bottom: 8px; }
268 form#issue-form .attributes { margin-bottom: 8px; }
269 form#issue-form .attributes p { padding-top: 1px; padding-bottom: 2px; }
269 form#issue-form .attributes p { padding-top: 1px; padding-bottom: 2px; }
270 form#issue-form .attributes select { min-width: 30%; }
270 form#issue-form .attributes select { min-width: 30%; }
271
271
272 ul.projects { margin: 0; padding-left: 1em; }
272 ul.projects { margin: 0; padding-left: 1em; }
273 ul.projects.root { margin: 0; padding: 0; }
273 ul.projects.root { margin: 0; padding: 0; }
274 ul.projects ul { border-left: 3px solid #e0e0e0; }
274 ul.projects ul { border-left: 3px solid #e0e0e0; }
275 ul.projects li { list-style-type:none; }
275 ul.projects li { list-style-type:none; }
276 ul.projects li.root { margin-bottom: 1em; }
276 ul.projects li.root { margin-bottom: 1em; }
277 ul.projects li.child { margin-top: 1em;}
277 ul.projects li.child { margin-top: 1em;}
278 ul.projects div.root a.project { font-family: "Trebuchet MS", Verdana, sans-serif; font-weight: bold; font-size: 16px; margin: 0 0 10px 0; }
278 ul.projects div.root a.project { font-family: "Trebuchet MS", Verdana, sans-serif; font-weight: bold; font-size: 16px; margin: 0 0 10px 0; }
279 .my-project { padding-left: 18px; background: url(../images/fav.png) no-repeat 0 50%; }
279 .my-project { padding-left: 18px; background: url(../images/fav.png) no-repeat 0 50%; }
280
280
281 #tracker_project_ids ul { margin: 0; padding-left: 1em; }
281 #tracker_project_ids ul { margin: 0; padding-left: 1em; }
282 #tracker_project_ids li { list-style-type:none; }
282 #tracker_project_ids li { list-style-type:none; }
283
283
284 ul.properties {padding:0; font-size: 0.9em; color: #777;}
284 ul.properties {padding:0; font-size: 0.9em; color: #777;}
285 ul.properties li {list-style-type:none;}
285 ul.properties li {list-style-type:none;}
286 ul.properties li span {font-style:italic;}
286 ul.properties li span {font-style:italic;}
287
287
288 .total-hours { font-size: 110%; font-weight: bold; }
288 .total-hours { font-size: 110%; font-weight: bold; }
289 .total-hours span.hours-int { font-size: 120%; }
289 .total-hours span.hours-int { font-size: 120%; }
290
290
291 .autoscroll {overflow-x: auto; padding:1px; margin-bottom: 1.2em;}
291 .autoscroll {overflow-x: auto; padding:1px; margin-bottom: 1.2em;}
292 #user_firstname, #user_lastname, #user_mail, #my_account_form select { width: 90%; }
292 #user_firstname, #user_lastname, #user_mail, #my_account_form select { width: 90%; }
293
293
294 .pagination {font-size: 90%}
294 .pagination {font-size: 90%}
295 p.pagination {margin-top:8px;}
295 p.pagination {margin-top:8px;}
296
296
297 /***** Tabular forms ******/
297 /***** Tabular forms ******/
298 .tabular p{
298 .tabular p{
299 margin: 0;
299 margin: 0;
300 padding: 5px 0 8px 0;
300 padding: 5px 0 8px 0;
301 padding-left: 180px; /*width of left column containing the label elements*/
301 padding-left: 180px; /*width of left column containing the label elements*/
302 height: 1%;
302 height: 1%;
303 clear:left;
303 clear:left;
304 }
304 }
305
305
306 html>body .tabular p {overflow:hidden;}
306 html>body .tabular p {overflow:hidden;}
307
307
308 .tabular label{
308 .tabular label{
309 font-weight: bold;
309 font-weight: bold;
310 float: left;
310 float: left;
311 text-align: right;
311 text-align: right;
312 margin-left: -180px; /*width of left column*/
312 margin-left: -180px; /*width of left column*/
313 width: 175px; /*width of labels. Should be smaller than left column to create some right
313 width: 175px; /*width of labels. Should be smaller than left column to create some right
314 margin*/
314 margin*/
315 }
315 }
316
316
317 .tabular label.floating{
317 .tabular label.floating{
318 font-weight: normal;
318 font-weight: normal;
319 margin-left: 0px;
319 margin-left: 0px;
320 text-align: left;
320 text-align: left;
321 width: 270px;
321 width: 270px;
322 }
322 }
323
323
324 .tabular label.block{
325 font-weight: normal;
326 margin-left: 0px;
327 text-align: left;
328 float: none;
329 display: block;
330 width: auto;
331 }
332
324 input#time_entry_comments { width: 90%;}
333 input#time_entry_comments { width: 90%;}
325
334
326 #preview fieldset {margin-top: 1em; background: url(../images/draft.png)}
335 #preview fieldset {margin-top: 1em; background: url(../images/draft.png)}
327
336
328 .tabular.settings p{ padding-left: 300px; }
337 .tabular.settings p{ padding-left: 300px; }
329 .tabular.settings label{ margin-left: -300px; width: 295px; }
338 .tabular.settings label{ margin-left: -300px; width: 295px; }
330
339
331 .required {color: #bb0000;}
340 .required {color: #bb0000;}
332 .summary {font-style: italic;}
341 .summary {font-style: italic;}
333
342
334 #attachments_fields input[type=text] {margin-left: 8px; }
343 #attachments_fields input[type=text] {margin-left: 8px; }
335
344
336 div.attachments { margin-top: 12px; }
345 div.attachments { margin-top: 12px; }
337 div.attachments p { margin:4px 0 2px 0; }
346 div.attachments p { margin:4px 0 2px 0; }
338 div.attachments img { vertical-align: middle; }
347 div.attachments img { vertical-align: middle; }
339 div.attachments span.author { font-size: 0.9em; color: #888; }
348 div.attachments span.author { font-size: 0.9em; color: #888; }
340
349
341 p.other-formats { text-align: right; font-size:0.9em; color: #666; }
350 p.other-formats { text-align: right; font-size:0.9em; color: #666; }
342 .other-formats span + span:before { content: "| "; }
351 .other-formats span + span:before { content: "| "; }
343
352
344 a.atom { background: url(../images/feed.png) no-repeat 1px 50%; padding: 2px 0px 3px 16px; }
353 a.atom { background: url(../images/feed.png) no-repeat 1px 50%; padding: 2px 0px 3px 16px; }
345
354
346 /* Project members tab */
355 /* Project members tab */
347 div#tab-content-members .splitcontentleft, div#tab-content-memberships .splitcontentleft, div#tab-content-users .splitcontentleft { width: 64% }
356 div#tab-content-members .splitcontentleft, div#tab-content-memberships .splitcontentleft, div#tab-content-users .splitcontentleft { width: 64% }
348 div#tab-content-members .splitcontentright, div#tab-content-memberships .splitcontentright, div#tab-content-users .splitcontentright { width: 34% }
357 div#tab-content-members .splitcontentright, div#tab-content-memberships .splitcontentright, div#tab-content-users .splitcontentright { width: 34% }
349 div#tab-content-members fieldset, div#tab-content-memberships fieldset, div#tab-content-users fieldset { padding:1em; margin-bottom: 1em; }
358 div#tab-content-members fieldset, div#tab-content-memberships fieldset, div#tab-content-users fieldset { padding:1em; margin-bottom: 1em; }
350 div#tab-content-members fieldset legend, div#tab-content-memberships fieldset legend, div#tab-content-users fieldset legend { font-weight: bold; }
359 div#tab-content-members fieldset legend, div#tab-content-memberships fieldset legend, div#tab-content-users fieldset legend { font-weight: bold; }
351 div#tab-content-members fieldset label, div#tab-content-memberships fieldset label, div#tab-content-users fieldset label { display: block; }
360 div#tab-content-members fieldset label, div#tab-content-memberships fieldset label, div#tab-content-users fieldset label { display: block; }
352 div#tab-content-members fieldset div, div#tab-content-users fieldset div { max-height: 400px; overflow:auto; }
361 div#tab-content-members fieldset div, div#tab-content-users fieldset div { max-height: 400px; overflow:auto; }
353
362
354 table.members td.group { padding-left: 20px; background: url(../images/users.png) no-repeat 0% 0%; }
363 table.members td.group { padding-left: 20px; background: url(../images/users.png) no-repeat 0% 0%; }
355
364
356 * html div#tab-content-members fieldset div { height: 450px; }
365 * html div#tab-content-members fieldset div { height: 450px; }
357
366
358 /***** Flash & error messages ****/
367 /***** Flash & error messages ****/
359 #errorExplanation, div.flash, .nodata, .warning {
368 #errorExplanation, div.flash, .nodata, .warning {
360 padding: 4px 4px 4px 30px;
369 padding: 4px 4px 4px 30px;
361 margin-bottom: 12px;
370 margin-bottom: 12px;
362 font-size: 1.1em;
371 font-size: 1.1em;
363 border: 2px solid;
372 border: 2px solid;
364 }
373 }
365
374
366 div.flash {margin-top: 8px;}
375 div.flash {margin-top: 8px;}
367
376
368 div.flash.error, #errorExplanation {
377 div.flash.error, #errorExplanation {
369 background: url(../images/false.png) 8px 5px no-repeat;
378 background: url(../images/false.png) 8px 5px no-repeat;
370 background-color: #ffe3e3;
379 background-color: #ffe3e3;
371 border-color: #dd0000;
380 border-color: #dd0000;
372 color: #550000;
381 color: #550000;
373 }
382 }
374
383
375 div.flash.notice {
384 div.flash.notice {
376 background: url(../images/true.png) 8px 5px no-repeat;
385 background: url(../images/true.png) 8px 5px no-repeat;
377 background-color: #dfffdf;
386 background-color: #dfffdf;
378 border-color: #9fcf9f;
387 border-color: #9fcf9f;
379 color: #005f00;
388 color: #005f00;
380 }
389 }
381
390
382 div.flash.warning {
391 div.flash.warning {
383 background: url(../images/warning.png) 8px 5px no-repeat;
392 background: url(../images/warning.png) 8px 5px no-repeat;
384 background-color: #FFEBC1;
393 background-color: #FFEBC1;
385 border-color: #FDBF3B;
394 border-color: #FDBF3B;
386 color: #A6750C;
395 color: #A6750C;
387 text-align: left;
396 text-align: left;
388 }
397 }
389
398
390 .nodata, .warning {
399 .nodata, .warning {
391 text-align: center;
400 text-align: center;
392 background-color: #FFEBC1;
401 background-color: #FFEBC1;
393 border-color: #FDBF3B;
402 border-color: #FDBF3B;
394 color: #A6750C;
403 color: #A6750C;
395 }
404 }
396
405
397 #errorExplanation ul { font-size: 0.9em;}
406 #errorExplanation ul { font-size: 0.9em;}
398 #errorExplanation h2, #errorExplanation p { display: none; }
407 #errorExplanation h2, #errorExplanation p { display: none; }
399
408
400 /***** Ajax indicator ******/
409 /***** Ajax indicator ******/
401 #ajax-indicator {
410 #ajax-indicator {
402 position: absolute; /* fixed not supported by IE */
411 position: absolute; /* fixed not supported by IE */
403 background-color:#eee;
412 background-color:#eee;
404 border: 1px solid #bbb;
413 border: 1px solid #bbb;
405 top:35%;
414 top:35%;
406 left:40%;
415 left:40%;
407 width:20%;
416 width:20%;
408 font-weight:bold;
417 font-weight:bold;
409 text-align:center;
418 text-align:center;
410 padding:0.6em;
419 padding:0.6em;
411 z-index:100;
420 z-index:100;
412 filter:alpha(opacity=50);
421 filter:alpha(opacity=50);
413 opacity: 0.5;
422 opacity: 0.5;
414 }
423 }
415
424
416 html>body #ajax-indicator { position: fixed; }
425 html>body #ajax-indicator { position: fixed; }
417
426
418 #ajax-indicator span {
427 #ajax-indicator span {
419 background-position: 0% 40%;
428 background-position: 0% 40%;
420 background-repeat: no-repeat;
429 background-repeat: no-repeat;
421 background-image: url(../images/loading.gif);
430 background-image: url(../images/loading.gif);
422 padding-left: 26px;
431 padding-left: 26px;
423 vertical-align: bottom;
432 vertical-align: bottom;
424 }
433 }
425
434
426 /***** Calendar *****/
435 /***** Calendar *****/
427 table.cal {border-collapse: collapse; width: 100%; margin: 0px 0 6px 0;border: 1px solid #d7d7d7;}
436 table.cal {border-collapse: collapse; width: 100%; margin: 0px 0 6px 0;border: 1px solid #d7d7d7;}
428 table.cal thead th {width: 14%;}
437 table.cal thead th {width: 14%;}
429 table.cal tbody tr {height: 100px;}
438 table.cal tbody tr {height: 100px;}
430 table.cal th { background-color:#EEEEEE; padding: 4px; }
439 table.cal th { background-color:#EEEEEE; padding: 4px; }
431 table.cal td {border: 1px solid #d7d7d7; vertical-align: top; font-size: 0.9em;}
440 table.cal td {border: 1px solid #d7d7d7; vertical-align: top; font-size: 0.9em;}
432 table.cal td p.day-num {font-size: 1.1em; text-align:right;}
441 table.cal td p.day-num {font-size: 1.1em; text-align:right;}
433 table.cal td.odd p.day-num {color: #bbb;}
442 table.cal td.odd p.day-num {color: #bbb;}
434 table.cal td.today {background:#ffffdd;}
443 table.cal td.today {background:#ffffdd;}
435 table.cal td.today p.day-num {font-weight: bold;}
444 table.cal td.today p.day-num {font-weight: bold;}
436
445
437 /***** Tooltips ******/
446 /***** Tooltips ******/
438 .tooltip{position:relative;z-index:24;}
447 .tooltip{position:relative;z-index:24;}
439 .tooltip:hover{z-index:25;color:#000;}
448 .tooltip:hover{z-index:25;color:#000;}
440 .tooltip span.tip{display: none; text-align:left;}
449 .tooltip span.tip{display: none; text-align:left;}
441
450
442 div.tooltip:hover span.tip{
451 div.tooltip:hover span.tip{
443 display:block;
452 display:block;
444 position:absolute;
453 position:absolute;
445 top:12px; left:24px; width:270px;
454 top:12px; left:24px; width:270px;
446 border:1px solid #555;
455 border:1px solid #555;
447 background-color:#fff;
456 background-color:#fff;
448 padding: 4px;
457 padding: 4px;
449 font-size: 0.8em;
458 font-size: 0.8em;
450 color:#505050;
459 color:#505050;
451 }
460 }
452
461
453 /***** Progress bar *****/
462 /***** Progress bar *****/
454 table.progress {
463 table.progress {
455 border: 1px solid #D7D7D7;
464 border: 1px solid #D7D7D7;
456 border-collapse: collapse;
465 border-collapse: collapse;
457 border-spacing: 0pt;
466 border-spacing: 0pt;
458 empty-cells: show;
467 empty-cells: show;
459 text-align: center;
468 text-align: center;
460 float:left;
469 float:left;
461 margin: 1px 6px 1px 0px;
470 margin: 1px 6px 1px 0px;
462 }
471 }
463
472
464 table.progress td { height: 0.9em; }
473 table.progress td { height: 0.9em; }
465 table.progress td.closed { background: #BAE0BA none repeat scroll 0%; }
474 table.progress td.closed { background: #BAE0BA none repeat scroll 0%; }
466 table.progress td.done { background: #DEF0DE none repeat scroll 0%; }
475 table.progress td.done { background: #DEF0DE none repeat scroll 0%; }
467 table.progress td.open { background: #FFF none repeat scroll 0%; }
476 table.progress td.open { background: #FFF none repeat scroll 0%; }
468 p.pourcent {font-size: 80%;}
477 p.pourcent {font-size: 80%;}
469 p.progress-info {clear: left; font-style: italic; font-size: 80%;}
478 p.progress-info {clear: left; font-style: italic; font-size: 80%;}
470
479
471 /***** Tabs *****/
480 /***** Tabs *****/
472 #content .tabs {height: 2.6em; border-bottom: 1px solid #bbbbbb; margin-bottom:1.2em; position:relative;}
481 #content .tabs {height: 2.6em; border-bottom: 1px solid #bbbbbb; margin-bottom:1.2em; position:relative;}
473 #content .tabs ul {margin:0; position:absolute; bottom:-2px; padding-left:1em;}
482 #content .tabs ul {margin:0; position:absolute; bottom:-2px; padding-left:1em;}
474 #content .tabs>ul { bottom:-1px; } /* others */
483 #content .tabs>ul { bottom:-1px; } /* others */
475 #content .tabs ul li {
484 #content .tabs ul li {
476 float:left;
485 float:left;
477 list-style-type:none;
486 list-style-type:none;
478 white-space:nowrap;
487 white-space:nowrap;
479 margin-right:8px;
488 margin-right:8px;
480 background:#fff;
489 background:#fff;
481 }
490 }
482 #content .tabs ul li a{
491 #content .tabs ul li a{
483 display:block;
492 display:block;
484 font-size: 0.9em;
493 font-size: 0.9em;
485 text-decoration:none;
494 text-decoration:none;
486 line-height:1.3em;
495 line-height:1.3em;
487 padding:4px 6px 4px 6px;
496 padding:4px 6px 4px 6px;
488 border: 1px solid #ccc;
497 border: 1px solid #ccc;
489 border-bottom: 1px solid #bbbbbb;
498 border-bottom: 1px solid #bbbbbb;
490 background-color: #eeeeee;
499 background-color: #eeeeee;
491 color:#777;
500 color:#777;
492 font-weight:bold;
501 font-weight:bold;
493 }
502 }
494
503
495 #content .tabs ul li a:hover {
504 #content .tabs ul li a:hover {
496 background-color: #ffffdd;
505 background-color: #ffffdd;
497 text-decoration:none;
506 text-decoration:none;
498 }
507 }
499
508
500 #content .tabs ul li a.selected {
509 #content .tabs ul li a.selected {
501 background-color: #fff;
510 background-color: #fff;
502 border: 1px solid #bbbbbb;
511 border: 1px solid #bbbbbb;
503 border-bottom: 1px solid #fff;
512 border-bottom: 1px solid #fff;
504 }
513 }
505
514
506 #content .tabs ul li a.selected:hover {
515 #content .tabs ul li a.selected:hover {
507 background-color: #fff;
516 background-color: #fff;
508 }
517 }
509
518
510 /***** Auto-complete *****/
519 /***** Auto-complete *****/
511 div.autocomplete {
520 div.autocomplete {
512 position:absolute;
521 position:absolute;
513 width:250px;
522 width:250px;
514 background-color:white;
523 background-color:white;
515 margin:0;
524 margin:0;
516 padding:0;
525 padding:0;
517 }
526 }
518 div.autocomplete ul {
527 div.autocomplete ul {
519 list-style-type:none;
528 list-style-type:none;
520 margin:0;
529 margin:0;
521 padding:0;
530 padding:0;
522 }
531 }
523 div.autocomplete ul li.selected { background-color: #ffb;}
532 div.autocomplete ul li.selected { background-color: #ffb;}
524 div.autocomplete ul li {
533 div.autocomplete ul li {
525 list-style-type:none;
534 list-style-type:none;
526 display:block;
535 display:block;
527 margin:0;
536 margin:0;
528 padding:2px;
537 padding:2px;
529 cursor:pointer;
538 cursor:pointer;
530 font-size: 90%;
539 font-size: 90%;
531 border-bottom: 1px solid #ccc;
540 border-bottom: 1px solid #ccc;
532 border-left: 1px solid #ccc;
541 border-left: 1px solid #ccc;
533 border-right: 1px solid #ccc;
542 border-right: 1px solid #ccc;
534 }
543 }
535 div.autocomplete ul li span.informal {
544 div.autocomplete ul li span.informal {
536 font-size: 80%;
545 font-size: 80%;
537 color: #aaa;
546 color: #aaa;
538 }
547 }
539
548
540 /***** Diff *****/
549 /***** Diff *****/
541 .diff_out { background: #fcc; }
550 .diff_out { background: #fcc; }
542 .diff_in { background: #cfc; }
551 .diff_in { background: #cfc; }
543
552
544 /***** Wiki *****/
553 /***** Wiki *****/
545 div.wiki table {
554 div.wiki table {
546 border: 1px solid #505050;
555 border: 1px solid #505050;
547 border-collapse: collapse;
556 border-collapse: collapse;
548 margin-bottom: 1em;
557 margin-bottom: 1em;
549 }
558 }
550
559
551 div.wiki table, div.wiki td, div.wiki th {
560 div.wiki table, div.wiki td, div.wiki th {
552 border: 1px solid #bbb;
561 border: 1px solid #bbb;
553 padding: 4px;
562 padding: 4px;
554 }
563 }
555
564
556 div.wiki .external {
565 div.wiki .external {
557 background-position: 0% 60%;
566 background-position: 0% 60%;
558 background-repeat: no-repeat;
567 background-repeat: no-repeat;
559 padding-left: 12px;
568 padding-left: 12px;
560 background-image: url(../images/external.png);
569 background-image: url(../images/external.png);
561 }
570 }
562
571
563 div.wiki a.new {
572 div.wiki a.new {
564 color: #b73535;
573 color: #b73535;
565 }
574 }
566
575
567 div.wiki pre {
576 div.wiki pre {
568 margin: 1em 1em 1em 1.6em;
577 margin: 1em 1em 1em 1.6em;
569 padding: 2px;
578 padding: 2px;
570 background-color: #fafafa;
579 background-color: #fafafa;
571 border: 1px solid #dadada;
580 border: 1px solid #dadada;
572 width:95%;
581 width:95%;
573 overflow-x: auto;
582 overflow-x: auto;
574 }
583 }
575
584
576 div.wiki ul.toc {
585 div.wiki ul.toc {
577 background-color: #ffffdd;
586 background-color: #ffffdd;
578 border: 1px solid #e4e4e4;
587 border: 1px solid #e4e4e4;
579 padding: 4px;
588 padding: 4px;
580 line-height: 1.2em;
589 line-height: 1.2em;
581 margin-bottom: 12px;
590 margin-bottom: 12px;
582 margin-right: 12px;
591 margin-right: 12px;
583 margin-left: 0;
592 margin-left: 0;
584 display: table
593 display: table
585 }
594 }
586 * html div.wiki ul.toc { width: 50%; } /* IE6 doesn't autosize div */
595 * html div.wiki ul.toc { width: 50%; } /* IE6 doesn't autosize div */
587
596
588 div.wiki ul.toc.right { float: right; margin-left: 12px; margin-right: 0; width: auto; }
597 div.wiki ul.toc.right { float: right; margin-left: 12px; margin-right: 0; width: auto; }
589 div.wiki ul.toc.left { float: left; margin-right: 12px; margin-left: 0; width: auto; }
598 div.wiki ul.toc.left { float: left; margin-right: 12px; margin-left: 0; width: auto; }
590 div.wiki ul.toc li { list-style-type:none;}
599 div.wiki ul.toc li { list-style-type:none;}
591 div.wiki ul.toc li.heading2 { margin-left: 6px; }
600 div.wiki ul.toc li.heading2 { margin-left: 6px; }
592 div.wiki ul.toc li.heading3 { margin-left: 12px; font-size: 0.8em; }
601 div.wiki ul.toc li.heading3 { margin-left: 12px; font-size: 0.8em; }
593
602
594 div.wiki ul.toc a {
603 div.wiki ul.toc a {
595 font-size: 0.9em;
604 font-size: 0.9em;
596 font-weight: normal;
605 font-weight: normal;
597 text-decoration: none;
606 text-decoration: none;
598 color: #606060;
607 color: #606060;
599 }
608 }
600 div.wiki ul.toc a:hover { color: #c61a1a; text-decoration: underline;}
609 div.wiki ul.toc a:hover { color: #c61a1a; text-decoration: underline;}
601
610
602 a.wiki-anchor { display: none; margin-left: 6px; text-decoration: none; }
611 a.wiki-anchor { display: none; margin-left: 6px; text-decoration: none; }
603 a.wiki-anchor:hover { color: #aaa !important; text-decoration: none; }
612 a.wiki-anchor:hover { color: #aaa !important; text-decoration: none; }
604 h1:hover a.wiki-anchor, h2:hover a.wiki-anchor, h3:hover a.wiki-anchor { display: inline; color: #ddd; }
613 h1:hover a.wiki-anchor, h2:hover a.wiki-anchor, h3:hover a.wiki-anchor { display: inline; color: #ddd; }
605
614
606 /***** My page layout *****/
615 /***** My page layout *****/
607 .block-receiver {
616 .block-receiver {
608 border:1px dashed #c0c0c0;
617 border:1px dashed #c0c0c0;
609 margin-bottom: 20px;
618 margin-bottom: 20px;
610 padding: 15px 0 15px 0;
619 padding: 15px 0 15px 0;
611 }
620 }
612
621
613 .mypage-box {
622 .mypage-box {
614 margin:0 0 20px 0;
623 margin:0 0 20px 0;
615 color:#505050;
624 color:#505050;
616 line-height:1.5em;
625 line-height:1.5em;
617 }
626 }
618
627
619 .handle {
628 .handle {
620 cursor: move;
629 cursor: move;
621 }
630 }
622
631
623 a.close-icon {
632 a.close-icon {
624 display:block;
633 display:block;
625 margin-top:3px;
634 margin-top:3px;
626 overflow:hidden;
635 overflow:hidden;
627 width:12px;
636 width:12px;
628 height:12px;
637 height:12px;
629 background-repeat: no-repeat;
638 background-repeat: no-repeat;
630 cursor:pointer;
639 cursor:pointer;
631 background-image:url('../images/close.png');
640 background-image:url('../images/close.png');
632 }
641 }
633
642
634 a.close-icon:hover {
643 a.close-icon:hover {
635 background-image:url('../images/close_hl.png');
644 background-image:url('../images/close_hl.png');
636 }
645 }
637
646
638 /***** Gantt chart *****/
647 /***** Gantt chart *****/
639 .gantt_hdr {
648 .gantt_hdr {
640 position:absolute;
649 position:absolute;
641 top:0;
650 top:0;
642 height:16px;
651 height:16px;
643 border-top: 1px solid #c0c0c0;
652 border-top: 1px solid #c0c0c0;
644 border-bottom: 1px solid #c0c0c0;
653 border-bottom: 1px solid #c0c0c0;
645 border-right: 1px solid #c0c0c0;
654 border-right: 1px solid #c0c0c0;
646 text-align: center;
655 text-align: center;
647 overflow: hidden;
656 overflow: hidden;
648 }
657 }
649
658
650 .task {
659 .task {
651 position: absolute;
660 position: absolute;
652 height:8px;
661 height:8px;
653 font-size:0.8em;
662 font-size:0.8em;
654 color:#888;
663 color:#888;
655 padding:0;
664 padding:0;
656 margin:0;
665 margin:0;
657 line-height:0.8em;
666 line-height:0.8em;
658 }
667 }
659
668
660 .task_late { background:#f66 url(../images/task_late.png); border: 1px solid #f66; }
669 .task_late { background:#f66 url(../images/task_late.png); border: 1px solid #f66; }
661 .task_done { background:#66f url(../images/task_done.png); border: 1px solid #66f; }
670 .task_done { background:#66f url(../images/task_done.png); border: 1px solid #66f; }
662 .task_todo { background:#aaa url(../images/task_todo.png); border: 1px solid #aaa; }
671 .task_todo { background:#aaa url(../images/task_todo.png); border: 1px solid #aaa; }
663 .milestone { background-image:url(../images/milestone.png); background-repeat: no-repeat; border: 0; }
672 .milestone { background-image:url(../images/milestone.png); background-repeat: no-repeat; border: 0; }
664
673
665 /***** Icons *****/
674 /***** Icons *****/
666 .icon {
675 .icon {
667 background-position: 0% 40%;
676 background-position: 0% 40%;
668 background-repeat: no-repeat;
677 background-repeat: no-repeat;
669 padding-left: 20px;
678 padding-left: 20px;
670 padding-top: 2px;
679 padding-top: 2px;
671 padding-bottom: 3px;
680 padding-bottom: 3px;
672 }
681 }
673
682
674 .icon22 {
683 .icon22 {
675 background-position: 0% 40%;
684 background-position: 0% 40%;
676 background-repeat: no-repeat;
685 background-repeat: no-repeat;
677 padding-left: 26px;
686 padding-left: 26px;
678 line-height: 22px;
687 line-height: 22px;
679 vertical-align: middle;
688 vertical-align: middle;
680 }
689 }
681
690
682 .icon-add { background-image: url(../images/add.png); }
691 .icon-add { background-image: url(../images/add.png); }
683 .icon-edit { background-image: url(../images/edit.png); }
692 .icon-edit { background-image: url(../images/edit.png); }
684 .icon-copy { background-image: url(../images/copy.png); }
693 .icon-copy { background-image: url(../images/copy.png); }
685 .icon-del { background-image: url(../images/delete.png); }
694 .icon-del { background-image: url(../images/delete.png); }
686 .icon-move { background-image: url(../images/move.png); }
695 .icon-move { background-image: url(../images/move.png); }
687 .icon-save { background-image: url(../images/save.png); }
696 .icon-save { background-image: url(../images/save.png); }
688 .icon-cancel { background-image: url(../images/cancel.png); }
697 .icon-cancel { background-image: url(../images/cancel.png); }
689 .icon-folder { background-image: url(../images/folder.png); }
698 .icon-folder { background-image: url(../images/folder.png); }
690 .open .icon-folder { background-image: url(../images/folder_open.png); }
699 .open .icon-folder { background-image: url(../images/folder_open.png); }
691 .icon-package { background-image: url(../images/package.png); }
700 .icon-package { background-image: url(../images/package.png); }
692 .icon-home { background-image: url(../images/home.png); }
701 .icon-home { background-image: url(../images/home.png); }
693 .icon-user { background-image: url(../images/user.png); }
702 .icon-user { background-image: url(../images/user.png); }
694 .icon-mypage { background-image: url(../images/user_page.png); }
703 .icon-mypage { background-image: url(../images/user_page.png); }
695 .icon-admin { background-image: url(../images/admin.png); }
704 .icon-admin { background-image: url(../images/admin.png); }
696 .icon-projects { background-image: url(../images/projects.png); }
705 .icon-projects { background-image: url(../images/projects.png); }
697 .icon-help { background-image: url(../images/help.png); }
706 .icon-help { background-image: url(../images/help.png); }
698 .icon-attachment { background-image: url(../images/attachment.png); }
707 .icon-attachment { background-image: url(../images/attachment.png); }
699 .icon-index { background-image: url(../images/index.png); }
708 .icon-index { background-image: url(../images/index.png); }
700 .icon-history { background-image: url(../images/history.png); }
709 .icon-history { background-image: url(../images/history.png); }
701 .icon-time { background-image: url(../images/time.png); }
710 .icon-time { background-image: url(../images/time.png); }
702 .icon-time-add { background-image: url(../images/time_add.png); }
711 .icon-time-add { background-image: url(../images/time_add.png); }
703 .icon-stats { background-image: url(../images/stats.png); }
712 .icon-stats { background-image: url(../images/stats.png); }
704 .icon-warning { background-image: url(../images/warning.png); }
713 .icon-warning { background-image: url(../images/warning.png); }
705 .icon-fav { background-image: url(../images/fav.png); }
714 .icon-fav { background-image: url(../images/fav.png); }
706 .icon-fav-off { background-image: url(../images/fav_off.png); }
715 .icon-fav-off { background-image: url(../images/fav_off.png); }
707 .icon-reload { background-image: url(../images/reload.png); }
716 .icon-reload { background-image: url(../images/reload.png); }
708 .icon-lock { background-image: url(../images/locked.png); }
717 .icon-lock { background-image: url(../images/locked.png); }
709 .icon-unlock { background-image: url(../images/unlock.png); }
718 .icon-unlock { background-image: url(../images/unlock.png); }
710 .icon-checked { background-image: url(../images/true.png); }
719 .icon-checked { background-image: url(../images/true.png); }
711 .icon-details { background-image: url(../images/zoom_in.png); }
720 .icon-details { background-image: url(../images/zoom_in.png); }
712 .icon-report { background-image: url(../images/report.png); }
721 .icon-report { background-image: url(../images/report.png); }
713 .icon-comment { background-image: url(../images/comment.png); }
722 .icon-comment { background-image: url(../images/comment.png); }
714
723
715 .icon-file { background-image: url(../images/files/default.png); }
724 .icon-file { background-image: url(../images/files/default.png); }
716 .icon-file.text-plain { background-image: url(../images/files/text.png); }
725 .icon-file.text-plain { background-image: url(../images/files/text.png); }
717 .icon-file.text-x-c { background-image: url(../images/files/c.png); }
726 .icon-file.text-x-c { background-image: url(../images/files/c.png); }
718 .icon-file.text-x-csharp { background-image: url(../images/files/csharp.png); }
727 .icon-file.text-x-csharp { background-image: url(../images/files/csharp.png); }
719 .icon-file.text-x-php { background-image: url(../images/files/php.png); }
728 .icon-file.text-x-php { background-image: url(../images/files/php.png); }
720 .icon-file.text-x-ruby { background-image: url(../images/files/ruby.png); }
729 .icon-file.text-x-ruby { background-image: url(../images/files/ruby.png); }
721 .icon-file.text-xml { background-image: url(../images/files/xml.png); }
730 .icon-file.text-xml { background-image: url(../images/files/xml.png); }
722 .icon-file.image-gif { background-image: url(../images/files/image.png); }
731 .icon-file.image-gif { background-image: url(../images/files/image.png); }
723 .icon-file.image-jpeg { background-image: url(../images/files/image.png); }
732 .icon-file.image-jpeg { background-image: url(../images/files/image.png); }
724 .icon-file.image-png { background-image: url(../images/files/image.png); }
733 .icon-file.image-png { background-image: url(../images/files/image.png); }
725 .icon-file.image-tiff { background-image: url(../images/files/image.png); }
734 .icon-file.image-tiff { background-image: url(../images/files/image.png); }
726 .icon-file.application-pdf { background-image: url(../images/files/pdf.png); }
735 .icon-file.application-pdf { background-image: url(../images/files/pdf.png); }
727 .icon-file.application-zip { background-image: url(../images/files/zip.png); }
736 .icon-file.application-zip { background-image: url(../images/files/zip.png); }
728 .icon-file.application-x-gzip { background-image: url(../images/files/zip.png); }
737 .icon-file.application-x-gzip { background-image: url(../images/files/zip.png); }
729
738
730 .icon22-projects { background-image: url(../images/22x22/projects.png); }
739 .icon22-projects { background-image: url(../images/22x22/projects.png); }
731 .icon22-users { background-image: url(../images/22x22/users.png); }
740 .icon22-users { background-image: url(../images/22x22/users.png); }
732 .icon22-groups { background-image: url(../images/22x22/groups.png); }
741 .icon22-groups { background-image: url(../images/22x22/groups.png); }
733 .icon22-tracker { background-image: url(../images/22x22/tracker.png); }
742 .icon22-tracker { background-image: url(../images/22x22/tracker.png); }
734 .icon22-role { background-image: url(../images/22x22/role.png); }
743 .icon22-role { background-image: url(../images/22x22/role.png); }
735 .icon22-workflow { background-image: url(../images/22x22/workflow.png); }
744 .icon22-workflow { background-image: url(../images/22x22/workflow.png); }
736 .icon22-options { background-image: url(../images/22x22/options.png); }
745 .icon22-options { background-image: url(../images/22x22/options.png); }
737 .icon22-notifications { background-image: url(../images/22x22/notifications.png); }
746 .icon22-notifications { background-image: url(../images/22x22/notifications.png); }
738 .icon22-authent { background-image: url(../images/22x22/authent.png); }
747 .icon22-authent { background-image: url(../images/22x22/authent.png); }
739 .icon22-info { background-image: url(../images/22x22/info.png); }
748 .icon22-info { background-image: url(../images/22x22/info.png); }
740 .icon22-comment { background-image: url(../images/22x22/comment.png); }
749 .icon22-comment { background-image: url(../images/22x22/comment.png); }
741 .icon22-package { background-image: url(../images/22x22/package.png); }
750 .icon22-package { background-image: url(../images/22x22/package.png); }
742 .icon22-settings { background-image: url(../images/22x22/settings.png); }
751 .icon22-settings { background-image: url(../images/22x22/settings.png); }
743 .icon22-plugin { background-image: url(../images/22x22/plugin.png); }
752 .icon22-plugin { background-image: url(../images/22x22/plugin.png); }
744
753
745 img.gravatar {
754 img.gravatar {
746 padding: 2px;
755 padding: 2px;
747 border: solid 1px #d5d5d5;
756 border: solid 1px #d5d5d5;
748 background: #fff;
757 background: #fff;
749 }
758 }
750
759
751 div.issue img.gravatar {
760 div.issue img.gravatar {
752 float: right;
761 float: right;
753 margin: 0 0 0 1em;
762 margin: 0 0 0 1em;
754 padding: 5px;
763 padding: 5px;
755 }
764 }
756
765
757 div.issue table img.gravatar {
766 div.issue table img.gravatar {
758 height: 14px;
767 height: 14px;
759 width: 14px;
768 width: 14px;
760 padding: 2px;
769 padding: 2px;
761 float: left;
770 float: left;
762 margin: 0 0.5em 0 0;
771 margin: 0 0.5em 0 0;
763 }
772 }
764
773
765 #history img.gravatar {
774 #history img.gravatar {
766 padding: 3px;
775 padding: 3px;
767 margin: 0 1.5em 1em 0;
776 margin: 0 1.5em 1em 0;
768 float: left;
777 float: left;
769 }
778 }
770
779
771 td.username img.gravatar {
780 td.username img.gravatar {
772 float: left;
781 float: left;
773 margin: 0 1em 0 0;
782 margin: 0 1em 0 0;
774 }
783 }
775
784
776 #activity dt img.gravatar {
785 #activity dt img.gravatar {
777 float: left;
786 float: left;
778 margin: 0 1em 1em 0;
787 margin: 0 1em 1em 0;
779 }
788 }
780
789
781 #activity dt,
790 #activity dt,
782 .journal {
791 .journal {
783 clear: left;
792 clear: left;
784 }
793 }
785
794
786 .gravatar-margin {
795 .gravatar-margin {
787 margin-left: 40px;
796 margin-left: 40px;
788 }
797 }
789
798
790 h2 img { vertical-align:middle; }
799 h2 img { vertical-align:middle; }
791
800
792
801
793 /***** Media print specific styles *****/
802 /***** Media print specific styles *****/
794 @media print {
803 @media print {
795 #top-menu, #header, #main-menu, #sidebar, #footer, .contextual, .other-formats { display:none; }
804 #top-menu, #header, #main-menu, #sidebar, #footer, .contextual, .other-formats { display:none; }
796 #main { background: #fff; }
805 #main { background: #fff; }
797 #content { width: 99%; margin: 0; padding: 0; border: 0; background: #fff; overflow: visible !important;}
806 #content { width: 99%; margin: 0; padding: 0; border: 0; background: #fff; overflow: visible !important;}
798 #wiki_add_attachment { display:none; }
807 #wiki_add_attachment { display:none; }
799 }
808 }
General Comments 0
You need to be logged in to leave comments. Login now