##// END OF EJS Templates
Merged r2574, r2578, r2589, r2615, r2641, r2645, r2646 from trunk....
Jean-Philippe Lang -
r2562:2679cc2045a7
parent child
Show More
@@ -1,68 +1,68
1 1 # redMine - project management software
2 2 # Copyright (C) 2006 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 Journal < ActiveRecord::Base
19 19 belongs_to :journalized, :polymorphic => true
20 20 # added as a quick fix to allow eager loading of the polymorphic association
21 21 # since always associated to an issue, for now
22 22 belongs_to :issue, :foreign_key => :journalized_id
23 23
24 24 belongs_to :user
25 25 has_many :details, :class_name => "JournalDetail", :dependent => :delete_all
26 26 attr_accessor :indice
27 27
28 28 acts_as_event :title => Proc.new {|o| status = ((s = o.new_status) ? " (#{s})" : nil); "#{o.issue.tracker} ##{o.issue.id}#{status}: #{o.issue.subject}" },
29 29 :description => :notes,
30 30 :author => :user,
31 31 :type => Proc.new {|o| (s = o.new_status) ? (s.is_closed? ? 'issue-closed' : 'issue-edit') : 'issue-note' },
32 32 :url => Proc.new {|o| {:controller => 'issues', :action => 'show', :id => o.issue.id, :anchor => "change-#{o.id}"}}
33 33
34 34 acts_as_activity_provider :type => 'issues',
35 35 :permission => :view_issues,
36 36 :author_key => :user_id,
37 37 :find_options => {:include => [{:issue => :project}, :details, :user],
38 38 :conditions => "#{Journal.table_name}.journalized_type = 'Issue' AND" +
39 39 " (#{JournalDetail.table_name}.prop_key = 'status_id' OR #{Journal.table_name}.notes <> '')"}
40 40
41 def save
41 def save(*args)
42 42 # Do not save an empty journal
43 43 (details.empty? && notes.blank?) ? false : super
44 44 end
45 45
46 46 # Returns the new status if the journal contains a status change, otherwise nil
47 47 def new_status
48 48 c = details.detect {|detail| detail.prop_key == 'status_id'}
49 49 (c && c.value) ? IssueStatus.find_by_id(c.value.to_i) : nil
50 50 end
51 51
52 52 def new_value_for(prop)
53 53 c = details.detect {|detail| detail.prop_key == prop}
54 54 c ? c.value : nil
55 55 end
56 56
57 57 def editable_by?(usr)
58 58 usr && usr.logged? && (usr.allowed_to?(:edit_issue_notes, project) || (self.user == usr && usr.allowed_to?(:edit_own_issue_notes, project)))
59 59 end
60 60
61 61 def project
62 62 journalized.respond_to?(:project) ? journalized.project : nil
63 63 end
64 64
65 65 def attachments
66 66 journalized.respond_to?(:attachments) ? journalized.attachments : nil
67 67 end
68 68 end
@@ -1,36 +1,36
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 News < ActiveRecord::Base
19 19 belongs_to :project
20 20 belongs_to :author, :class_name => 'User', :foreign_key => 'author_id'
21 21 has_many :comments, :as => :commented, :dependent => :delete_all, :order => "created_on"
22 22
23 23 validates_presence_of :title, :description
24 24 validates_length_of :title, :maximum => 60
25 25 validates_length_of :summary, :maximum => 255
26 26
27 acts_as_searchable :columns => ['title', "#{table_name}.description"], :include => :project
27 acts_as_searchable :columns => ['title', 'summary', "#{table_name}.description"], :include => :project
28 28 acts_as_event :url => Proc.new {|o| {:controller => 'news', :action => 'show', :id => o.id}}
29 29 acts_as_activity_provider :find_options => {:include => [:project, :author]},
30 30 :author_key => :author_id
31 31
32 32 # returns latest news for projects visible by user
33 33 def self.latest(user = User.current, count = 5)
34 34 find(:all, :limit => count, :conditions => Project.allowed_to_condition(user, :view_news), :include => [ :author, :project ], :order => "#{News.table_name}.created_on DESC")
35 35 end
36 36 end
@@ -1,276 +1,276
1 1 # redMine - project management software
2 2 # Copyright (C) 2006 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 Project < ActiveRecord::Base
19 19 # Project statuses
20 20 STATUS_ACTIVE = 1
21 21 STATUS_ARCHIVED = 9
22 22
23 23 has_many :members, :include => :user, :conditions => "#{User.table_name}.status=#{User::STATUS_ACTIVE}"
24 24 has_many :users, :through => :members
25 25 has_many :enabled_modules, :dependent => :delete_all
26 26 has_and_belongs_to_many :trackers, :order => "#{Tracker.table_name}.position"
27 27 has_many :issues, :dependent => :destroy, :order => "#{Issue.table_name}.created_on DESC", :include => [:status, :tracker]
28 28 has_many :issue_changes, :through => :issues, :source => :journals
29 29 has_many :versions, :dependent => :destroy, :order => "#{Version.table_name}.effective_date DESC, #{Version.table_name}.name DESC"
30 30 has_many :time_entries, :dependent => :delete_all
31 31 has_many :queries, :dependent => :delete_all
32 32 has_many :documents, :dependent => :destroy
33 33 has_many :news, :dependent => :delete_all, :include => :author
34 34 has_many :issue_categories, :dependent => :delete_all, :order => "#{IssueCategory.table_name}.name"
35 35 has_many :boards, :dependent => :destroy, :order => "position ASC"
36 36 has_one :repository, :dependent => :destroy
37 37 has_many :changesets, :through => :repository
38 38 has_one :wiki, :dependent => :destroy
39 39 # Custom field for the project issues
40 40 has_and_belongs_to_many :issue_custom_fields,
41 41 :class_name => 'IssueCustomField',
42 42 :order => "#{CustomField.table_name}.position",
43 43 :join_table => "#{table_name_prefix}custom_fields_projects#{table_name_suffix}",
44 44 :association_foreign_key => 'custom_field_id'
45 45
46 46 acts_as_tree :order => "name", :counter_cache => true
47 47 acts_as_attachable :view_permission => :view_files,
48 48 :delete_permission => :manage_files
49 49
50 50 acts_as_customizable
51 51 acts_as_searchable :columns => ['name', 'description'], :project_key => 'id', :permission => nil
52 52 acts_as_event :title => Proc.new {|o| "#{l(:label_project)}: #{o.name}"},
53 53 :url => Proc.new {|o| {:controller => 'projects', :action => 'show', :id => o.id}},
54 54 :author => nil
55 55
56 56 attr_protected :status, :enabled_module_names
57 57
58 58 validates_presence_of :name, :identifier
59 59 validates_uniqueness_of :name, :identifier
60 60 validates_associated :repository, :wiki
61 61 validates_length_of :name, :maximum => 30
62 62 validates_length_of :homepage, :maximum => 255
63 validates_length_of :identifier, :in => 2..20
63 validates_length_of :identifier, :in => 1..20
64 64 validates_format_of :identifier, :with => /^[a-z0-9\-]*$/
65 65
66 66 before_destroy :delete_all_members
67 67
68 68 named_scope :has_module, lambda { |mod| { :conditions => ["#{Project.table_name}.id IN (SELECT em.project_id FROM #{EnabledModule.table_name} em WHERE em.name=?)", mod.to_s] } }
69 69
70 70 def identifier=(identifier)
71 71 super unless identifier_frozen?
72 72 end
73 73
74 74 def identifier_frozen?
75 75 errors[:identifier].nil? && !(new_record? || identifier.blank?)
76 76 end
77 77
78 78 def issues_with_subprojects(include_subprojects=false)
79 79 conditions = nil
80 80 if include_subprojects
81 81 ids = [id] + child_ids
82 82 conditions = ["#{Project.table_name}.id IN (#{ids.join(',')}) AND #{Project.visible_by}"]
83 83 end
84 84 conditions ||= ["#{Project.table_name}.id = ?", id]
85 85 # Quick and dirty fix for Rails 2 compatibility
86 86 Issue.send(:with_scope, :find => { :conditions => conditions }) do
87 87 Version.send(:with_scope, :find => { :conditions => conditions }) do
88 88 yield
89 89 end
90 90 end
91 91 end
92 92
93 93 # returns latest created projects
94 94 # non public projects will be returned only if user is a member of those
95 95 def self.latest(user=nil, count=5)
96 96 find(:all, :limit => count, :conditions => visible_by(user), :order => "created_on DESC")
97 97 end
98 98
99 99 def self.visible_by(user=nil)
100 100 user ||= User.current
101 101 if user && user.admin?
102 102 return "#{Project.table_name}.status=#{Project::STATUS_ACTIVE}"
103 103 elsif user && user.memberships.any?
104 104 return "#{Project.table_name}.status=#{Project::STATUS_ACTIVE} AND (#{Project.table_name}.is_public = #{connection.quoted_true} or #{Project.table_name}.id IN (#{user.memberships.collect{|m| m.project_id}.join(',')}))"
105 105 else
106 106 return "#{Project.table_name}.status=#{Project::STATUS_ACTIVE} AND #{Project.table_name}.is_public = #{connection.quoted_true}"
107 107 end
108 108 end
109 109
110 110 def self.allowed_to_condition(user, permission, options={})
111 111 statements = []
112 112 base_statement = "#{Project.table_name}.status=#{Project::STATUS_ACTIVE}"
113 113 if perm = Redmine::AccessControl.permission(permission)
114 114 unless perm.project_module.nil?
115 115 # If the permission belongs to a project module, make sure the module is enabled
116 116 base_statement << " AND EXISTS (SELECT em.id FROM #{EnabledModule.table_name} em WHERE em.name='#{perm.project_module}' AND em.project_id=#{Project.table_name}.id)"
117 117 end
118 118 end
119 119 if options[:project]
120 120 project_statement = "#{Project.table_name}.id = #{options[:project].id}"
121 121 project_statement << " OR #{Project.table_name}.parent_id = #{options[:project].id}" if options[:with_subprojects]
122 122 base_statement = "(#{project_statement}) AND (#{base_statement})"
123 123 end
124 124 if user.admin?
125 125 # no restriction
126 126 else
127 127 statements << "1=0"
128 128 if user.logged?
129 129 statements << "#{Project.table_name}.is_public = #{connection.quoted_true}" if Role.non_member.allowed_to?(permission)
130 130 allowed_project_ids = user.memberships.select {|m| m.role.allowed_to?(permission)}.collect {|m| m.project_id}
131 131 statements << "#{Project.table_name}.id IN (#{allowed_project_ids.join(',')})" if allowed_project_ids.any?
132 132 elsif Role.anonymous.allowed_to?(permission)
133 133 # anonymous user allowed on public project
134 134 statements << "#{Project.table_name}.is_public = #{connection.quoted_true}"
135 135 else
136 136 # anonymous user is not authorized
137 137 end
138 138 end
139 139 statements.empty? ? base_statement : "((#{base_statement}) AND (#{statements.join(' OR ')}))"
140 140 end
141 141
142 142 def project_condition(with_subprojects)
143 143 cond = "#{Project.table_name}.id = #{id}"
144 144 cond = "(#{cond} OR #{Project.table_name}.parent_id = #{id})" if with_subprojects
145 145 cond
146 146 end
147 147
148 148 def self.find(*args)
149 149 if args.first && args.first.is_a?(String) && !args.first.match(/^\d*$/)
150 150 project = find_by_identifier(*args)
151 151 raise ActiveRecord::RecordNotFound, "Couldn't find Project with identifier=#{args.first}" if project.nil?
152 152 project
153 153 else
154 154 super
155 155 end
156 156 end
157 157
158 158 def to_param
159 159 # id is used for projects with a numeric identifier (compatibility)
160 160 @to_param ||= (identifier.to_s =~ %r{^\d*$} ? id : identifier)
161 161 end
162 162
163 163 def active?
164 164 self.status == STATUS_ACTIVE
165 165 end
166 166
167 167 def archive
168 168 # Archive subprojects if any
169 169 children.each do |subproject|
170 170 subproject.archive
171 171 end
172 172 update_attribute :status, STATUS_ARCHIVED
173 173 end
174 174
175 175 def unarchive
176 176 return false if parent && !parent.active?
177 177 update_attribute :status, STATUS_ACTIVE
178 178 end
179 179
180 180 def active_children
181 181 children.select {|child| child.active?}
182 182 end
183 183
184 184 # Returns an array of the trackers used by the project and its sub projects
185 185 def rolled_up_trackers
186 186 @rolled_up_trackers ||=
187 187 Tracker.find(:all, :include => :projects,
188 188 :select => "DISTINCT #{Tracker.table_name}.*",
189 189 :conditions => ["#{Project.table_name}.id = ? OR #{Project.table_name}.parent_id = ?", id, id],
190 190 :order => "#{Tracker.table_name}.position")
191 191 end
192 192
193 193 # Deletes all project's members
194 194 def delete_all_members
195 195 Member.delete_all(['project_id = ?', id])
196 196 end
197 197
198 198 # Users issues can be assigned to
199 199 def assignable_users
200 200 members.select {|m| m.role.assignable?}.collect {|m| m.user}.sort
201 201 end
202 202
203 203 # Returns the mail adresses of users that should be always notified on project events
204 204 def recipients
205 205 members.select {|m| m.mail_notification? || m.user.mail_notification?}.collect {|m| m.user.mail}
206 206 end
207 207
208 208 # Returns an array of all custom fields enabled for project issues
209 209 # (explictly associated custom fields and custom fields enabled for all projects)
210 210 def all_issue_custom_fields
211 211 @all_issue_custom_fields ||= (IssueCustomField.for_all + issue_custom_fields).uniq.sort
212 212 end
213 213
214 214 def project
215 215 self
216 216 end
217 217
218 218 def <=>(project)
219 219 name.downcase <=> project.name.downcase
220 220 end
221 221
222 222 def to_s
223 223 name
224 224 end
225 225
226 226 # Returns a short description of the projects (first lines)
227 227 def short_description(length = 255)
228 228 description.gsub(/^(.{#{length}}[^\n]*).*$/m, '\1').strip if description
229 229 end
230 230
231 231 def allows_to?(action)
232 232 if action.is_a? Hash
233 233 allowed_actions.include? "#{action[:controller]}/#{action[:action]}"
234 234 else
235 235 allowed_permissions.include? action
236 236 end
237 237 end
238 238
239 239 def module_enabled?(module_name)
240 240 module_name = module_name.to_s
241 241 enabled_modules.detect {|m| m.name == module_name}
242 242 end
243 243
244 244 def enabled_module_names=(module_names)
245 245 enabled_modules.clear
246 246 module_names = [] unless module_names && module_names.is_a?(Array)
247 247 module_names.each do |name|
248 248 enabled_modules << EnabledModule.new(:name => name.to_s)
249 249 end
250 250 end
251 251
252 252 # Returns an auto-generated project identifier based on the last identifier used
253 253 def self.next_identifier
254 254 p = Project.find(:first, :order => 'created_on DESC')
255 255 p.nil? ? nil : p.identifier.to_s.succ
256 256 end
257 257
258 258 protected
259 259 def validate
260 260 errors.add(parent_id, " must be a root project") if parent and parent.parent
261 261 errors.add_to_base("A project with subprojects can't be a subproject") if parent and children.size > 0
262 262 errors.add(:identifier, :activerecord_error_invalid) if !identifier.blank? && identifier.match(/^\d*$/)
263 263 end
264 264
265 265 private
266 266 def allowed_permissions
267 267 @allowed_permissions ||= begin
268 268 module_names = enabled_modules.collect {|m| m.name}
269 269 Redmine::AccessControl.modules_permissions(module_names).collect {|p| p.name}
270 270 end
271 271 end
272 272
273 273 def allowed_actions
274 274 @actions_allowed ||= allowed_permissions.inject([]) { |actions, permission| actions += Redmine::AccessControl.allowed_actions(permission) }.flatten
275 275 end
276 276 end
@@ -1,26 +1,26
1 1 <h3><%= l(:label_issue_plural) %></h3>
2 2 <%= link_to l(:label_issue_view_all), { :controller => 'issues', :action => 'index', :project_id => @project, :set_filter => 1 } %><br />
3 3 <% if @project %>
4 4 <%= link_to l(:field_summary), :controller => 'reports', :action => 'issue_report', :id => @project %><br />
5 5 <%= link_to l(:label_change_log), :controller => 'projects', :action => 'changelog', :id => @project %><br />
6 6 <% end %>
7 7 <%= call_hook(:view_issues_sidebar_issues_bottom) %>
8 8
9 9 <% planning_links = []
10 planning_links << link_to(l(:label_calendar), :action => 'calendar', :project_id => @project) if User.current.allowed_to?(:view_calendar, @project, :global => true)
11 planning_links << link_to(l(:label_gantt), :action => 'gantt', :project_id => @project) if User.current.allowed_to?(:view_gantt, @project, :global => true)
10 planning_links << link_to(l(:label_calendar), :controller => 'issues', :action => 'calendar', :project_id => @project) if User.current.allowed_to?(:view_calendar, @project, :global => true)
11 planning_links << link_to(l(:label_gantt), :controller => 'issues', :action => 'gantt', :project_id => @project) if User.current.allowed_to?(:view_gantt, @project, :global => true)
12 12 %>
13 13 <% unless planning_links.empty? %>
14 14 <h3><%= l(:label_planning) %></h3>
15 15 <p><%= planning_links.join(' | ') %></p>
16 16 <%= call_hook(:view_issues_sidebar_planning_bottom) %>
17 17 <% end %>
18 18
19 19 <% unless sidebar_queries.empty? -%>
20 20 <h3><%= l(:label_query_plural) %></h3>
21 21
22 22 <% sidebar_queries.each do |query| -%>
23 23 <%= link_to(h(query.name), :controller => 'issues', :action => 'index', :project_id => @project, :query_id => query) %><br />
24 24 <% end -%>
25 25 <%= call_hook(:view_issues_sidebar_queries_bottom) %>
26 26 <% end -%>
@@ -1,3 +1,3
1 1 <%= yield %>
2 ----------------------------------------
2 --
3 3 <%= Setting.emails_footer %>
@@ -1,49 +1,49
1 1 <%= error_messages_for 'project' %>
2 2
3 3 <div class="box">
4 4 <!--[form:project]-->
5 5 <p><%= f.text_field :name, :required => true %><br /><em><%= l(:text_caracters_maximum, 30) %></em></p>
6 6
7 7 <% if User.current.admin? and !@root_projects.empty? %>
8 8 <p><%= f.select :parent_id, (@root_projects.collect {|p| [p.name, p.id]}), { :include_blank => true } %></p>
9 9 <% end %>
10 10
11 11 <p><%= f.text_area :description, :rows => 5, :class => 'wiki-edit' %></p>
12 12 <p><%= f.text_field :identifier, :required => true, :disabled => @project.identifier_frozen? %>
13 13 <% unless @project.identifier_frozen? %>
14 <br /><em><%= l(:text_length_between, 2, 20) %> <%= l(:text_project_identifier_info) %></em>
14 <br /><em><%= l(:text_length_between, 1, 20) %> <%= l(:text_project_identifier_info) %></em>
15 15 <% end %></p>
16 16 <p><%= f.text_field :homepage, :size => 60 %></p>
17 17 <p><%= f.check_box :is_public %></p>
18 18 <%= wikitoolbar_for 'project_description' %>
19 19
20 20 <% @project.custom_field_values.each do |value| %>
21 21 <p><%= custom_field_tag_with_label :project, value %></p>
22 22 <% end %>
23 23 <%= call_hook(:view_projects_form, :project => @project, :form => f) %>
24 24 </div>
25 25
26 26 <% unless @trackers.empty? %>
27 27 <fieldset class="box"><legend><%=l(:label_tracker_plural)%></legend>
28 28 <% @trackers.each do |tracker| %>
29 29 <label class="floating">
30 30 <%= check_box_tag 'project[tracker_ids][]', tracker.id, @project.trackers.include?(tracker) %>
31 31 <%= tracker %>
32 32 </label>
33 33 <% end %>
34 34 <%= hidden_field_tag 'project[tracker_ids][]', '' %>
35 35 </fieldset>
36 36 <% end %>
37 37
38 38 <% unless @issue_custom_fields.empty? %>
39 39 <fieldset class="box"><legend><%=l(:label_custom_field_plural)%></legend>
40 40 <% @issue_custom_fields.each do |custom_field| %>
41 41 <label class="floating">
42 42 <%= check_box_tag 'project[issue_custom_field_ids][]', custom_field.id, (@project.all_issue_custom_fields.include? custom_field), (custom_field.is_for_all? ? {:disabled => "disabled"} : {}) %>
43 43 <%= custom_field.name %>
44 44 </label>
45 45 <% end %>
46 46 <%= hidden_field_tag 'project[issue_custom_field_ids][]', '' %>
47 47 </fieldset>
48 48 <% end %>
49 49 <!--[eoform:project]-->
@@ -1,59 +1,61
1 1 <div class="contextual">
2 2 <% if @editable %>
3 3 <%= link_to_if_authorized(l(:button_edit), {:action => 'edit', :page => @page.title}, :class => 'icon icon-edit', :accesskey => accesskey(:edit)) if @content.version == @page.content.version %>
4 4 <%= link_to_if_authorized(l(:button_lock), {:action => 'protect', :page => @page.title, :protected => 1}, :method => :post, :class => 'icon icon-lock') if !@page.protected? %>
5 5 <%= link_to_if_authorized(l(:button_unlock), {:action => 'protect', :page => @page.title, :protected => 0}, :method => :post, :class => 'icon icon-unlock') if @page.protected? %>
6 6 <%= link_to_if_authorized(l(:button_rename), {:action => 'rename', :page => @page.title}, :class => 'icon icon-move') if @content.version == @page.content.version %>
7 7 <%= link_to_if_authorized(l(:button_delete), {:action => 'destroy', :page => @page.title}, :method => :post, :confirm => l(:text_are_you_sure), :class => 'icon icon-del') %>
8 8 <%= link_to_if_authorized(l(:button_rollback), {:action => 'edit', :page => @page.title, :version => @content.version }, :class => 'icon icon-cancel') if @content.version < @page.content.version %>
9 9 <% end %>
10 10 <%= link_to_if_authorized(l(:label_history), {:action => 'history', :page => @page.title}, :class => 'icon icon-history') %>
11 11 </div>
12 12
13 13 <%= breadcrumb(@page.ancestors.reverse.collect {|parent| link_to h(parent.pretty_title), {:page => parent.title}}) %>
14 14
15 15 <% if @content.version != @page.content.version %>
16 16 <p>
17 17 <%= link_to(('&#171; ' + l(:label_previous)), :action => 'index', :page => @page.title, :version => (@content.version - 1)) + " - " if @content.version > 1 %>
18 18 <%= "#{l(:label_version)} #{@content.version}/#{@page.content.version}" %>
19 19 <%= '(' + link_to('diff', :controller => 'wiki', :action => 'diff', :page => @page.title, :version => @content.version) + ')' if @content.version > 1 %> -
20 20 <%= link_to((l(:label_next) + ' &#187;'), :action => 'index', :page => @page.title, :version => (@content.version + 1)) + " - " if @content.version < @page.content.version %>
21 21 <%= link_to(l(:label_current_version), :action => 'index', :page => @page.title) %>
22 22 <br />
23 23 <em><%= @content.author ? @content.author.name : "anonyme" %>, <%= format_time(@content.updated_on) %> </em><br />
24 24 <%=h @content.comments %>
25 25 </p>
26 26 <hr />
27 27 <% end %>
28 28
29 29 <%= render(:partial => "wiki/content", :locals => {:content => @content}) %>
30 30
31 31 <%= link_to_attachments @page %>
32 32
33 33 <% if @editable && authorize_for('wiki', 'add_attachment') %>
34 <div id="wiki_add_attachment">
34 35 <p><%= link_to l(:label_attachment_new), {}, :onclick => "Element.show('add_attachment_form'); Element.hide(this); Element.scrollTo('add_attachment_form'); return false;",
35 36 :id => 'attach_files_link' %></p>
36 37 <% form_tag({ :controller => 'wiki', :action => 'add_attachment', :page => @page.title }, :multipart => true, :id => "add_attachment_form", :style => "display:none;") do %>
37 38 <div class="box">
38 39 <p><%= render :partial => 'attachments/form' %></p>
39 40 </div>
40 41 <%= submit_tag l(:button_add) %>
41 42 <%= link_to l(:button_cancel), {}, :onclick => "Element.hide('add_attachment_form'); Element.show('attach_files_link'); return false;" %>
42 43 <% end %>
44 </div>
43 45 <% end %>
44 46
45 47 <p class="other-formats">
46 48 <%= l(:label_export_to) %>
47 49 <span><%= link_to 'HTML', {:page => @page.title, :export => 'html', :version => @content.version}, :class => 'html' %></span>
48 50 <span><%= link_to 'TXT', {:page => @page.title, :export => 'txt', :version => @content.version}, :class => 'text' %></span>
49 51 </p>
50 52
51 53 <% content_for :header_tags do %>
52 54 <%= stylesheet_link_tag 'scm' %>
53 55 <% end %>
54 56
55 57 <% content_for :sidebar do %>
56 58 <%= render :partial => 'sidebar' %>
57 59 <% end %>
58 60
59 61 <% html_title @page.pretty_title %>
@@ -1,888 +1,894
1 1 == Redmine changelog
2 2
3 3 Redmine - project management software
4 4 Copyright (C) 2006-2009 Jean-Philippe Lang
5 5 http://www.redmine.org/
6 6
7 7
8 8 == 2009-xx-xx v0.8.3
9 9
10 10 * Separate project field and subject in cross-project issue view
11 11 * Ability to set language for redmine:load_default_data task using REDMINE_LANG environment variable
12 12 * Rescue Redmine::DefaultData::DataAlreadyLoaded in redmine:load_default_data task
13 13 * CSS classes to highlight own and assigned issues
14 * Hide "New file" link on wiki pages from printing
14 15 * Flush buffer when asking for language in redmine:load_default_data task
16 * Minimum project identifier length set to 1
15 17 * Fixed: Time entries csv export links for all projects are malformed
16 18 * Fixed: Files without Version aren't visible in the Activity page
19 * Fixed: Commit logs are centered in the repo browser
20 * Fixed: News summary field content is not searchable
21 * Fixed: Journal#save has a wrong signature
22 * Fixed: Email footer signature convention
17 23
18 24
19 25 == 2009-03-07 v0.8.2
20 26
21 27 * Send an email to the user when an administrator activates a registered user
22 28 * Strip keywords from received email body
23 29 * Footer updated to 2009
24 30 * Show RSS-link even when no issues is found
25 31 * One click filter action in activity view
26 32 * Clickable/linkable line #'s while browsing the repo or viewing a file
27 33 * Links to versions on files list
28 34 * Added request and controller objects to the hooks by default
29 35 * Fixed: exporting an issue with attachments to PDF raises an error
30 36 * Fixed: "too few arguments" error may occur on activerecord error translation
31 37 * Fixed: "Default columns Displayed on the Issues list" setting is not easy to read
32 38 * Fixed: visited links to closed tickets are not striked through with IE6
33 39 * Fixed: MailHandler#plain_text_body returns nil if there was nothing to strip
34 40 * Fixed: MailHandler raises an error when processing an email without From header
35 41
36 42
37 43 == 2009-02-15 v0.8.1
38 44
39 45 * Select watchers on new issue form
40 46 * Issue description is no longer a required field
41 47 * Files module: ability to add files without version
42 48 * Jump to the current tab when using the project quick-jump combo
43 49 * Display a warning if some attachments were not saved
44 50 * Import custom fields values from emails on issue creation
45 51 * Show view/annotate/download links on entry and annotate views
46 52 * Admin Info Screen: Display if plugin assets directory is writable
47 53 * Adds a 'Create and continue' button on the new issue form
48 54 * IMAP: add options to move received emails
49 55 * Do not show Category field when categories are not defined
50 56 * Lower the project identifier limit to a minimum of two characters
51 57 * Add "closed" html class to closed entries in issue list
52 58 * Fixed: broken redirect URL on login failure
53 59 * Fixed: Deleted files are shown when using Darcs
54 60 * Fixed: Darcs adapter works on Win32 only
55 61 * Fixed: syntax highlight doesn't appear in new ticket preview
56 62 * Fixed: email notification for changes I make still occurs when running Repository.fetch_changesets
57 63 * Fixed: no error is raised when entering invalid hours on the issue update form
58 64 * Fixed: Details time log report CSV export doesn't honour date format from settings
59 65 * Fixed: invalid css classes on issue details
60 66 * Fixed: Trac importer creates duplicate custom values
61 67 * Fixed: inline attached image should not match partial filename
62 68
63 69
64 70 == 2008-12-30 v0.8.0
65 71
66 72 * Setting added in order to limit the number of diff lines that should be displayed
67 73 * Makes logged-in username in topbar linking to
68 74 * Mail handler: strip tags when receiving a html-only email
69 75 * Mail handler: add watchers before sending notification
70 76 * Adds a css class (overdue) to overdue issues on issue lists and detail views
71 77 * Fixed: project activity truncated after viewing user's activity
72 78 * Fixed: email address entered for password recovery shouldn't be case-sensitive
73 79 * Fixed: default flag removed when editing a default enumeration
74 80 * Fixed: default category ignored when adding a document
75 81 * Fixed: error on repository user mapping when a repository username is blank
76 82 * Fixed: Firefox cuts off large diffs
77 83 * Fixed: CVS browser should not show dead revisions (deleted files)
78 84 * Fixed: escape double-quotes in image titles
79 85 * Fixed: escape textarea content when editing a issue note
80 86 * Fixed: JS error on context menu with IE
81 87 * Fixed: bold syntax around single character in series doesn't work
82 88 * Fixed several XSS vulnerabilities
83 89 * Fixed a SQL injection vulnerability
84 90
85 91
86 92 == 2008-12-07 v0.8.0-rc1
87 93
88 94 * Wiki page protection
89 95 * Wiki page hierarchy. Parent page can be assigned on the Rename screen
90 96 * Adds support for issue creation via email
91 97 * Adds support for free ticket filtering and custom queries on Gantt chart and calendar
92 98 * Cross-project search
93 99 * Ability to search a project and its subprojects
94 100 * Ability to search the projects the user belongs to
95 101 * Adds custom fields on time entries
96 102 * Adds boolean and list custom fields for time entries as criteria on time report
97 103 * Cross-project time reports
98 104 * Display latest user's activity on account/show view
99 105 * Show last connexion time on user's page
100 106 * Obfuscates email address on user's account page using javascript
101 107 * wiki TOC rendered as an unordered list
102 108 * Adds the ability to search for a user on the administration users list
103 109 * Adds the ability to search for a project name or identifier on the administration projects list
104 110 * Redirect user to the previous page after logging in
105 111 * Adds a permission 'view wiki edits' so that wiki history can be hidden to certain users
106 112 * Adds permissions for viewing the watcher list and adding new watchers on the issue detail view
107 113 * Adds permissions to let users edit and/or delete their messages
108 114 * Link to activity view when displaying dates
109 115 * Hide Redmine version in atom feeds and pdf properties
110 116 * Maps repository users to Redmine users. Users with same username or email are automatically mapped. Mapping can be manually adjusted in repository settings. Multiple usernames can be mapped to the same Redmine user.
111 117 * Sort users by their display names so that user dropdown lists are sorted alphabetically
112 118 * Adds estimated hours to issue filters
113 119 * Switch order of current and previous revisions in side-by-side diff
114 120 * Render the commit changes list as a tree
115 121 * Adds watch/unwatch functionality at forum topic level
116 122 * When moving an issue to another project, reassign it to the category with same name if any
117 123 * Adds child_pages macro for wiki pages
118 124 * Use GET instead of POST on roadmap (#718), gantt and calendar forms
119 125 * Search engine: display total results count and count by result type
120 126 * Email delivery configuration moved to an unversioned YAML file (config/email.yml, see the sample file)
121 127 * Adds icons on search results
122 128 * Adds 'Edit' link on account/show for admin users
123 129 * Adds Lock/Unlock/Activate link on user edit screen
124 130 * Adds user count in status drop down on admin user list
125 131 * Adds multi-levels blockquotes support by using > at the beginning of lines
126 132 * Adds a Reply link to each issue note
127 133 * Adds plain text only option for mail notifications
128 134 * Gravatar support for issue detail, user grid, and activity stream (disabled by default)
129 135 * Adds 'Delete wiki pages attachments' permission
130 136 * Show the most recent file when displaying an inline image
131 137 * Makes permission screens localized
132 138 * AuthSource list: display associated users count and disable 'Delete' buton if any
133 139 * Make the 'duplicates of' relation asymmetric
134 140 * Adds username to the password reminder email
135 141 * Adds links to forum messages using message#id syntax
136 142 * Allow same name for custom fields on different object types
137 143 * One-click bulk edition using the issue list context menu within the same project
138 144 * Adds support for commit logs reencoding to UTF-8 before insertion in the database. Source encoding of commit logs can be selected in Application settings -> Repositories.
139 145 * Adds checkboxes toggle links on permissions report
140 146 * Adds Trac-Like anchors on wiki headings
141 147 * Adds support for wiki links with anchor
142 148 * Adds category to the issue context menu
143 149 * Adds a workflow overview screen
144 150 * Appends the filename to the attachment url so that clients that ignore content-disposition http header get the real filename
145 151 * Dots allowed in custom field name
146 152 * Adds posts quoting functionality
147 153 * Adds an option to generate sequential project identifiers
148 154 * Adds mailto link on the user administration list
149 155 * Ability to remove enumerations (activities, priorities, document categories) that are in use. Associated objects can be reassigned to another value
150 156 * Gantt chart: display issues that don't have a due date if they are assigned to a version with a date
151 157 * Change projects homepage limit to 255 chars
152 158 * Improved on-the-fly account creation. If some attributes are missing (eg. not present in the LDAP) or are invalid, the registration form is displayed so that the user is able to fill or fix these attributes
153 159 * Adds "please select" to activity select box if no activity is set as default
154 160 * Do not silently ignore timelog validation failure on issue edit
155 161 * Adds a rake task to send reminder emails
156 162 * Allow empty cells in wiki tables
157 163 * Makes wiki text formatter pluggable
158 164 * Adds back textile acronyms support
159 165 * Remove pre tag attributes
160 166 * Plugin hooks
161 167 * Pluggable admin menu
162 168 * Plugins can provide activity content
163 169 * Moves plugin list to its own administration menu item
164 170 * Adds url and author_url plugin attributes
165 171 * Adds Plugin#requires_redmine method so that plugin compatibility can be checked against current Redmine version
166 172 * Adds atom feed on time entries details
167 173 * Adds project name to issues feed title
168 174 * Adds a css class on menu items in order to apply item specific styles (eg. icons)
169 175 * Adds a Redmine plugin generators
170 176 * Adds timelog link to the issue context menu
171 177 * Adds links to the user page on various views
172 178 * Turkish translation by Ismail Sezen
173 179 * Catalan translation
174 180 * Vietnamese translation
175 181 * Slovak translation
176 182 * Better naming of activity feed if only one kind of event is displayed
177 183 * Enable syntax highlight on issues, messages and news
178 184 * Add target version to the issue list context menu
179 185 * Hide 'Target version' filter if no version is defined
180 186 * Add filters on cross-project issue list for custom fields marked as 'For all projects'
181 187 * Turn ftp urls into links
182 188 * Hiding the View Differences button when a wiki page's history only has one version
183 189 * Messages on a Board can now be sorted by the number of replies
184 190 * Adds a class ('me') to events of the activity view created by current user
185 191 * Strip pre/code tags content from activity view events
186 192 * Display issue notes in the activity view
187 193 * Adds links to changesets atom feed on repository browser
188 194 * Track project and tracker changes in issue history
189 195 * Adds anchor to atom feed messages links
190 196 * Adds a key in lang files to set the decimal separator (point or comma) in csv exports
191 197 * Makes importer work with Trac 0.8.x
192 198 * Upgraded to Prototype 1.6.0.1
193 199 * File viewer for attached text files
194 200 * Menu mapper: add support for :before, :after and :last options to #push method and add #delete method
195 201 * Removed inconsistent revision numbers on diff view
196 202 * CVS: add support for modules names with spaces
197 203 * Log the user in after registration if account activation is not needed
198 204 * Mercurial adapter improvements
199 205 * Trac importer: read session_attribute table to find user's email and real name
200 206 * Ability to disable unused SCM adapters in application settings
201 207 * Adds Filesystem adapter
202 208 * Clear changesets and changes with raw sql when deleting a repository for performance
203 209 * Redmine.pm now uses the 'commit access' permission defined in Redmine
204 210 * Reposman can create any type of scm (--scm option)
205 211 * Reposman creates a repository if the 'repository' module is enabled at project level only
206 212 * Display svn properties in the browser, svn >= 1.5.0 only
207 213 * Reduces memory usage when importing large git repositories
208 214 * Wider SVG graphs in repository stats
209 215 * SubversionAdapter#entries performance improvement
210 216 * SCM browser: ability to download raw unified diffs
211 217 * More detailed error message in log when scm command fails
212 218 * Adds support for file viewing with Darcs 2.0+
213 219 * Check that git changeset is not in the database before creating it
214 220 * Unified diff viewer for attached files with .patch or .diff extension
215 221 * File size display with Bazaar repositories
216 222 * Git adapter: use commit time instead of author time
217 223 * Prettier url for changesets
218 224 * Makes changes link to entries on the revision view
219 225 * Adds a field on the repository view to browse at specific revision
220 226 * Adds new projects atom feed
221 227 * Added rake tasks to generate rcov code coverage reports
222 228 * Add Redcloth's :block_markdown_rule to allow horizontal rules in wiki
223 229 * Show the project hierarchy in the drop down list for new membership on user administration screen
224 230 * Split user edit screen into tabs
225 231 * Renames bundled RedCloth to RedCloth3 to avoid RedCloth 4 to be loaded instead
226 232 * Fixed: Roadmap crashes when a version has a due date > 2037
227 233 * Fixed: invalid effective date (eg. 99999-01-01) causes an error on version edition screen
228 234 * Fixed: login filter providing incorrect back_url for Redmine installed in sub-directory
229 235 * Fixed: logtime entry duplicated when edited from parent project
230 236 * Fixed: wrong digest for text files under Windows
231 237 * Fixed: associated revisions are displayed in wrong order on issue view
232 238 * Fixed: Git Adapter date parsing ignores timezone
233 239 * Fixed: Printing long roadmap doesn't split across pages
234 240 * Fixes custom fields display order at several places
235 241 * Fixed: urls containing @ are parsed as email adress by the wiki formatter
236 242 * Fixed date filters accuracy with SQLite
237 243 * Fixed: tokens not escaped in highlight_tokens regexp
238 244 * Fixed Bazaar shared repository browsing
239 245 * Fixes platform determination under JRuby
240 246 * Fixed: Estimated time in issue's journal should be rounded to two decimals
241 247 * Fixed: 'search titles only' box ignored after one search is done on titles only
242 248 * Fixed: non-ASCII subversion path can't be displayed
243 249 * Fixed: Inline images don't work if file name has upper case letters or if image is in BMP format
244 250 * Fixed: document listing shows on "my page" when viewing documents is disabled for the role
245 251 * Fixed: Latest news appear on the homepage for projects with the News module disabled
246 252 * Fixed: cross-project issue list should not show issues of projects for which the issue tracking module was disabled
247 253 * Fixed: the default status is lost when reordering issue statuses
248 254 * Fixes error with Postgresql and non-UTF8 commit logs
249 255 * Fixed: textile footnotes no longer work
250 256 * Fixed: http links containing parentheses fail to reder correctly
251 257 * Fixed: GitAdapter#get_rev should use current branch instead of hardwiring master
252 258
253 259
254 260 == 2008-07-06 v0.7.3
255 261
256 262 * Allow dot in firstnames and lastnames
257 263 * Add project name to cross-project Atom feeds
258 264 * Encoding set to utf8 in example database.yml
259 265 * HTML titles on forums related views
260 266 * Fixed: various XSS vulnerabilities
261 267 * Fixed: Entourage (and some old client) fails to correctly render notification styles
262 268 * Fixed: Fixed: timelog redirects inappropriately when :back_url is blank
263 269 * Fixed: wrong relative paths to images in wiki_syntax.html
264 270
265 271
266 272 == 2008-06-15 v0.7.2
267 273
268 274 * "New Project" link on Projects page
269 275 * Links to repository directories on the repo browser
270 276 * Move status to front in Activity View
271 277 * Remove edit step from Status context menu
272 278 * Fixed: No way to do textile horizontal rule
273 279 * Fixed: Repository: View differences doesn't work
274 280 * Fixed: attachement's name maybe invalid.
275 281 * Fixed: Error when creating a new issue
276 282 * Fixed: NoMethodError on @available_filters.has_key?
277 283 * Fixed: Check All / Uncheck All in Email Settings
278 284 * Fixed: "View differences" of one file at /repositories/revision/ fails
279 285 * Fixed: Column width in "my page"
280 286 * Fixed: private subprojects are listed on Issues view
281 287 * Fixed: Textile: bold, italics, underline, etc... not working after parentheses
282 288 * Fixed: Update issue form: comment field from log time end out of screen
283 289 * Fixed: Editing role: "issue can be assigned to this role" out of box
284 290 * Fixed: Unable use angular braces after include word
285 291 * Fixed: Using '*' as keyword for repository referencing keywords doesn't work
286 292 * Fixed: Subversion repository "View differences" on each file rise ERROR
287 293 * Fixed: View differences for individual file of a changeset fails if the repository URL doesn't point to the repository root
288 294 * Fixed: It is possible to lock out the last admin account
289 295 * Fixed: Wikis are viewable for anonymous users on public projects, despite not granting access
290 296 * Fixed: Issue number display clipped on 'my issues'
291 297 * Fixed: Roadmap version list links not carrying state
292 298 * Fixed: Log Time fieldset in IssueController#edit doesn't set default Activity as default
293 299 * Fixed: git's "get_rev" API should use repo's current branch instead of hardwiring "master"
294 300 * Fixed: browser's language subcodes ignored
295 301 * Fixed: Error on project selection with numeric (only) identifier.
296 302 * Fixed: Link to PDF doesn't work after creating new issue
297 303 * Fixed: "Replies" should not be shown on forum threads that are locked
298 304 * Fixed: SVN errors lead to svn username/password being displayed to end users (security issue)
299 305 * Fixed: http links containing hashes don't display correct
300 306 * Fixed: Allow ampersands in Enumeration names
301 307 * Fixed: Atom link on saved query does not include query_id
302 308 * Fixed: Logtime info lost when there's an error updating an issue
303 309 * Fixed: TOC does not parse colorization markups
304 310 * Fixed: CVS: add support for modules names with spaces
305 311 * Fixed: Bad rendering on projects/add
306 312 * Fixed: exception when viewing differences on cvs
307 313 * Fixed: export issue to pdf will messup when use Chinese language
308 314 * Fixed: Redmine::Scm::Adapters::GitAdapter#get_rev ignored GIT_BIN constant
309 315 * Fixed: Adding non-ASCII new issue type in the New Issue page have encoding error using IE
310 316 * Fixed: Importing from trac : some wiki links are messed
311 317 * Fixed: Incorrect weekend definition in Hebrew calendar locale
312 318 * Fixed: Atom feeds don't provide author section for repository revisions
313 319 * Fixed: In Activity views, changesets titles can be multiline while they should not
314 320 * Fixed: Ignore unreadable subversion directories (read disabled using authz)
315 321 * Fixed: lib/SVG/Graph/Graph.rb can't externalize stylesheets
316 322 * Fixed: Close statement handler in Redmine.pm
317 323
318 324
319 325 == 2008-05-04 v0.7.1
320 326
321 327 * Thai translation added (Gampol Thitinilnithi)
322 328 * Translations updates
323 329 * Escape HTML comment tags
324 330 * Prevent "can't convert nil into String" error when :sort_order param is not present
325 331 * Fixed: Updating tickets add a time log with zero hours
326 332 * Fixed: private subprojects names are revealed on the project overview
327 333 * Fixed: Search for target version of "none" fails with postgres 8.3
328 334 * Fixed: Home, Logout, Login links shouldn't be absolute links
329 335 * Fixed: 'Latest projects' box on the welcome screen should be hidden if there are no projects
330 336 * Fixed: error when using upcase language name in coderay
331 337 * Fixed: error on Trac import when :due attribute is nil
332 338
333 339
334 340 == 2008-04-28 v0.7.0
335 341
336 342 * Forces Redmine to use rails 2.0.2 gem when vendor/rails is not present
337 343 * Queries can be marked as 'For all projects'. Such queries will be available on all projects and on the global issue list.
338 344 * Add predefined date ranges to the time report
339 345 * Time report can be done at issue level
340 346 * Various timelog report enhancements
341 347 * Accept the following formats for "hours" field: 1h, 1 h, 1 hour, 2 hours, 30m, 30min, 1h30, 1h30m, 1:30
342 348 * Display the context menu above and/or to the left of the click if needed
343 349 * Make the admin project files list sortable
344 350 * Mercurial: display working directory files sizes unless browsing a specific revision
345 351 * Preserve status filter and page number when using lock/unlock/activate links on the users list
346 352 * Redmine.pm support for LDAP authentication
347 353 * Better error message and AR errors in log for failed LDAP on-the-fly user creation
348 354 * Redirected user to where he is coming from after logging hours
349 355 * Warn user that subprojects are also deleted when deleting a project
350 356 * Include subprojects versions on calendar and gantt
351 357 * Notify project members when a message is posted if they want to receive notifications
352 358 * Fixed: Feed content limit setting has no effect
353 359 * Fixed: Priorities not ordered when displayed as a filter in issue list
354 360 * Fixed: can not display attached images inline in message replies
355 361 * Fixed: Boards are not deleted when project is deleted
356 362 * Fixed: trying to preview a new issue raises an exception with postgresql
357 363 * Fixed: single file 'View difference' links do not work because of duplicate slashes in url
358 364 * Fixed: inline image not displayed when including a wiki page
359 365 * Fixed: CVS duplicate key violation
360 366 * Fixed: ActiveRecord::StaleObjectError exception on closing a set of circular duplicate issues
361 367 * Fixed: custom field filters behaviour
362 368 * Fixed: Postgresql 8.3 compatibility
363 369 * Fixed: Links to repository directories don't work
364 370
365 371
366 372 == 2008-03-29 v0.7.0-rc1
367 373
368 374 * Overall activity view and feed added, link is available on the project list
369 375 * Git VCS support
370 376 * Rails 2.0 sessions cookie store compatibility
371 377 * Use project identifiers in urls instead of ids
372 378 * Default configuration data can now be loaded from the administration screen
373 379 * Administration settings screen split to tabs (email notifications options moved to 'Settings')
374 380 * Project description is now unlimited and optional
375 381 * Wiki annotate view
376 382 * Escape HTML tag in textile content
377 383 * Add Redmine links to documents, versions, attachments and repository files
378 384 * New setting to specify how many objects should be displayed on paginated lists. There are 2 ways to select a set of issues on the issue list:
379 385 * by using checkbox and/or the little pencil that will select/unselect all issues
380 386 * by clicking on the rows (but not on the links), Ctrl and Shift keys can be used to select multiple issues
381 387 * Context menu disabled on links so that the default context menu of the browser is displayed when right-clicking on a link (click anywhere else on the row to display the context menu)
382 388 * User display format is now configurable in administration settings
383 389 * Issue list now supports bulk edit/move/delete (for a set of issues that belong to the same project)
384 390 * Merged 'change status', 'edit issue' and 'add note' actions:
385 391 * Users with 'edit issues' permission can now update any property including custom fields when adding a note or changing the status
386 392 * 'Change issue status' permission removed. To change an issue status, a user just needs to have either 'Edit' or 'Add note' permissions and some workflow transitions allowed
387 393 * Details by assignees on issue summary view
388 394 * 'New issue' link in the main menu (accesskey 7). The drop-down lists to add an issue on the project overview and the issue list are removed
389 395 * Change status select box default to current status
390 396 * Preview for issue notes, news and messages
391 397 * Optional description for attachments
392 398 * 'Fixed version' label changed to 'Target version'
393 399 * Let the user choose when deleting issues with reported hours to:
394 400 * delete the hours
395 401 * assign the hours to the project
396 402 * reassign the hours to another issue
397 403 * Date range filter and pagination on time entries detail view
398 404 * Propagate time tracking to the parent project
399 405 * Switch added on the project activity view to include subprojects
400 406 * Display total estimated and spent hours on the version detail view
401 407 * Weekly time tracking block for 'My page'
402 408 * Permissions to edit time entries
403 409 * Include subprojects on the issue list, calendar, gantt and timelog by default (can be turned off is administration settings)
404 410 * Roadmap enhancements (separate related issues from wiki contents, leading h1 in version wiki pages is hidden, smaller wiki headings)
405 411 * Make versions with same date sorted by name
406 412 * Allow issue list to be sorted by target version
407 413 * Related changesets messages displayed on the issue details view
408 414 * Create a journal and send an email when an issue is closed by commit
409 415 * Add 'Author' to the available columns for the issue list
410 416 * More appropriate default sort order on sortable columns
411 417 * Add issue subject to the time entries view and issue subject, description and tracker to the csv export
412 418 * Permissions to edit issue notes
413 419 * Display date/time instead of date on files list
414 420 * Do not show Roadmap menu item if the project doesn't define any versions
415 421 * Allow longer version names (60 chars)
416 422 * Ability to copy an existing workflow when creating a new role
417 423 * Display custom fields in two columns on the issue form
418 424 * Added 'estimated time' in the csv export of the issue list
419 425 * Display the last 30 days on the activity view rather than the current month (number of days can be configured in the application settings)
420 426 * Setting for whether new projects should be public by default
421 427 * User preference to choose how comments/replies are displayed: in chronological or reverse chronological order
422 428 * Added default value for custom fields
423 429 * Added tabindex property on wiki toolbar buttons (to easily move from field to field using the tab key)
424 430 * Redirect to issue page after creating a new issue
425 431 * Wiki toolbar improvements (mainly for Firefox)
426 432 * Display wiki syntax quick ref link on all wiki textareas
427 433 * Display links to Atom feeds
428 434 * Breadcrumb nav for the forums
429 435 * Show replies when choosing to display messages in the activity
430 436 * Added 'include' macro to include another wiki page
431 437 * RedmineWikiFormatting page available as a static HTML file locally
432 438 * Wrap diff content
433 439 * Strip out email address from authors in repository screens
434 440 * Highlight the current item of the main menu
435 441 * Added simple syntax highlighters for php and java languages
436 442 * Do not show empty diffs
437 443 * Show explicit error message when the scm command failed (eg. when svn binary is not available)
438 444 * Lithuanian translation added (Sergej Jegorov)
439 445 * Ukrainan translation added (Natalia Konovka & Mykhaylo Sorochan)
440 446 * Danish translation added (Mads Vestergaard)
441 447 * Added i18n support to the jstoolbar and various settings screen
442 448 * RedCloth's glyphs no longer user
443 449 * New icons for the wiki toolbar (from http://www.famfamfam.com/lab/icons/silk/)
444 450 * The following menus can now be extended by plugins: top_menu, account_menu, application_menu
445 451 * Added a simple rake task to fetch changesets from the repositories: rake redmine:fetch_changesets
446 452 * Remove hardcoded "Redmine" strings in account related emails and use application title instead
447 453 * Mantis importer preserve bug ids
448 454 * Trac importer: Trac guide wiki pages skipped
449 455 * Trac importer: wiki attachments migration added
450 456 * Trac importer: support database schema for Trac migration
451 457 * Trac importer: support CamelCase links
452 458 * Removes the Redmine version from the footer (can be viewed on admin -> info)
453 459 * Rescue and display an error message when trying to delete a role that is in use
454 460 * Add various 'X-Redmine' headers to email notifications: X-Redmine-Host, X-Redmine-Site, X-Redmine-Project, X-Redmine-Issue-Id, -Author, -Assignee, X-Redmine-Topic-Id
455 461 * Add "--encoding utf8" option to the Mercurial "hg log" command in order to get utf8 encoded commit logs
456 462 * Fixed: Gantt and calendar not properly refreshed (fragment caching removed)
457 463 * Fixed: Textile image with style attribute cause internal server error
458 464 * Fixed: wiki TOC not rendered properly when used in an issue or document description
459 465 * Fixed: 'has already been taken' error message on username and email fields if left empty
460 466 * Fixed: non-ascii attachement filename with IE
461 467 * Fixed: wrong url for wiki syntax pop-up when Redmine urls are prefixed
462 468 * Fixed: search for all words doesn't work
463 469 * Fixed: Do not show sticky and locked checkboxes when replying to a message
464 470 * Fixed: Mantis importer: do not duplicate Mantis username in firstname and lastname if realname is blank
465 471 * Fixed: Date custom fields not displayed as specified in application settings
466 472 * Fixed: titles not escaped in the activity view
467 473 * Fixed: issue queries can not use custom fields marked as 'for all projects' in a project context
468 474 * Fixed: on calendar, gantt and in the tracker filter on the issue list, only active trackers of the project (and its sub projects) should be available
469 475 * Fixed: locked users should not receive email notifications
470 476 * Fixed: custom field selection is not saved when unchecking them all on project settings
471 477 * Fixed: can not lock a topic when creating it
472 478 * Fixed: Incorrect filtering for unset values when using 'is not' filter
473 479 * Fixed: PostgreSQL issues_seq_id not updated when using Trac importer
474 480 * Fixed: ajax pagination does not scroll up
475 481 * Fixed: error when uploading a file with no content-type specified by the browser
476 482 * Fixed: wiki and changeset links not displayed when previewing issue description or notes
477 483 * Fixed: 'LdapError: no bind result' error when authenticating
478 484 * Fixed: 'LdapError: invalid binding information' when no username/password are set on the LDAP account
479 485 * Fixed: CVS repository doesn't work if port is used in the url
480 486 * Fixed: Email notifications: host name is missing in generated links
481 487 * Fixed: Email notifications: referenced changesets, wiki pages, attachments... are not turned into links
482 488 * Fixed: Do not clear issue relations when moving an issue to another project if cross-project issue relations are allowed
483 489 * Fixed: "undefined method 'textilizable'" error on email notification when running Repository#fetch_changesets from the console
484 490 * Fixed: Do not send an email with no recipient, cc or bcc
485 491 * Fixed: fetch_changesets fails on commit comments that close 2 duplicates issues.
486 492 * Fixed: Mercurial browsing under unix-like os and for directory depth > 2
487 493 * Fixed: Wiki links with pipe can not be used in wiki tables
488 494 * Fixed: migrate_from_trac doesn't import timestamps of wiki and tickets
489 495 * Fixed: when bulk editing, setting "Assigned to" to "nobody" causes an sql error with Postgresql
490 496
491 497
492 498 == 2008-03-12 v0.6.4
493 499
494 500 * Fixed: private projects name are displayed on account/show even if the current user doesn't have access to these private projects
495 501 * Fixed: potential LDAP authentication security flaw
496 502 * Fixed: context submenus on the issue list don't show up with IE6.
497 503 * Fixed: Themes are not applied with Rails 2.0
498 504 * Fixed: crash when fetching Mercurial changesets if changeset[:files] is nil
499 505 * Fixed: Mercurial repository browsing
500 506 * Fixed: undefined local variable or method 'log' in CvsAdapter when a cvs command fails
501 507 * Fixed: not null constraints not removed with Postgresql
502 508 * Doctype set to transitional
503 509
504 510
505 511 == 2007-12-18 v0.6.3
506 512
507 513 * Fixed: upload doesn't work in 'Files' section
508 514
509 515
510 516 == 2007-12-16 v0.6.2
511 517
512 518 * Search engine: issue custom fields can now be searched
513 519 * News comments are now textilized
514 520 * Updated Japanese translation (Satoru Kurashiki)
515 521 * Updated Chinese translation (Shortie Lo)
516 522 * Fixed Rails 2.0 compatibility bugs:
517 523 * Unable to create a wiki
518 524 * Gantt and calendar error
519 525 * Trac importer error (readonly? is defined by ActiveRecord)
520 526 * Fixed: 'assigned to me' filter broken
521 527 * Fixed: crash when validation fails on issue edition with no custom fields
522 528 * Fixed: reposman "can't find group" error
523 529 * Fixed: 'LDAP account password is too long' error when leaving the field empty on creation
524 530 * Fixed: empty lines when displaying repository files with Windows style eol
525 531 * Fixed: missing body closing tag in repository annotate and entry views
526 532
527 533
528 534 == 2007-12-10 v0.6.1
529 535
530 536 * Rails 2.0 compatibility
531 537 * Custom fields can now be displayed as columns on the issue list
532 538 * Added version details view (accessible from the roadmap)
533 539 * Roadmap: more accurate completion percentage calculation (done ratio of open issues is now taken into account)
534 540 * Added per-project tracker selection. Trackers can be selected on project settings
535 541 * Anonymous users can now be allowed to create, edit, comment issues, comment news and post messages in the forums
536 542 * Forums: messages can now be edited/deleted (explicit permissions need to be given)
537 543 * Forums: topics can be locked so that no reply can be added
538 544 * Forums: topics can be marked as sticky so that they always appear at the top of the list
539 545 * Forums: attachments can now be added to replies
540 546 * Added time zone support
541 547 * Added a setting to choose the account activation strategy (available in application settings)
542 548 * Added 'Classic' theme (inspired from the v0.51 design)
543 549 * Added an alternate theme which provides issue list colorization based on issues priority
544 550 * Added Bazaar SCM adapter
545 551 * Added Annotate/Blame view in the repository browser (except for Darcs SCM)
546 552 * Diff style (inline or side by side) automatically saved as a user preference
547 553 * Added issues status changes on the activity view (by Cyril Mougel)
548 554 * Added forums topics on the activity view (disabled by default)
549 555 * Added an option on 'My account' for users who don't want to be notified of changes that they make
550 556 * Trac importer now supports mysql and postgresql databases
551 557 * Trac importer improvements (by Mat Trudel)
552 558 * 'fixed version' field can now be displayed on the issue list
553 559 * Added a couple of new formats for the 'date format' setting
554 560 * Added Traditional Chinese translation (by Shortie Lo)
555 561 * Added Russian translation (iGor kMeta)
556 562 * Project name format limitation removed (name can now contain any character)
557 563 * Project identifier maximum length changed from 12 to 20
558 564 * Changed the maximum length of LDAP account to 255 characters
559 565 * Removed the 12 characters limit on passwords
560 566 * Added wiki macros support
561 567 * Performance improvement on workflow setup screen
562 568 * More detailed html title on several views
563 569 * Custom fields can now be reordered
564 570 * Search engine: search can be restricted to an exact phrase by using quotation marks
565 571 * Added custom fields marked as 'For all projects' to the csv export of the cross project issue list
566 572 * Email notifications are now sent as Blind carbon copy by default
567 573 * Fixed: all members (including non active) should be deleted when deleting a project
568 574 * Fixed: Error on wiki syntax link (accessible from wiki/edit)
569 575 * Fixed: 'quick jump to a revision' form on the revisions list
570 576 * Fixed: error on admin/info if there's more than 1 plugin installed
571 577 * Fixed: svn or ldap password can be found in clear text in the html source in editing mode
572 578 * Fixed: 'Assigned to' drop down list is not sorted
573 579 * Fixed: 'View all issues' link doesn't work on issues/show
574 580 * Fixed: error on account/register when validation fails
575 581 * Fixed: Error when displaying the issue list if a float custom field is marked as 'used as filter'
576 582 * Fixed: Mercurial adapter breaks on missing :files entry in changeset hash (James Britt)
577 583 * Fixed: Wrong feed URLs on the home page
578 584 * Fixed: Update of time entry fails when the issue has been moved to an other project
579 585 * Fixed: Error when moving an issue without changing its tracker (Postgresql)
580 586 * Fixed: Changes not recorded when using :pserver string (CVS adapter)
581 587 * Fixed: admin should be able to move issues to any project
582 588 * Fixed: adding an attachment is not possible when changing the status of an issue
583 589 * Fixed: No mime-types in documents/files downloading
584 590 * Fixed: error when sorting the messages if there's only one board for the project
585 591 * Fixed: 'me' doesn't appear in the drop down filters on a project issue list.
586 592
587 593 == 2007-11-04 v0.6.0
588 594
589 595 * Permission model refactoring.
590 596 * Permissions: there are now 2 builtin roles that can be used to specify permissions given to other users than members of projects
591 597 * Permissions: some permissions (eg. browse the repository) can be removed for certain roles
592 598 * Permissions: modules (eg. issue tracking, news, documents...) can be enabled/disabled at project level
593 599 * Added Mantis and Trac importers
594 600 * New application layout
595 601 * Added "Bulk edit" functionality on the issue list
596 602 * More flexible mail notifications settings at user level
597 603 * Added AJAX based context menu on the project issue list that provide shortcuts for editing, re-assigning, changing the status or the priority, moving or deleting an issue
598 604 * Added the hability to copy an issue. It can be done from the "issue/show" view or from the context menu on the issue list
599 605 * Added the ability to customize issue list columns (at application level or for each saved query)
600 606 * Overdue versions (date reached and open issues > 0) are now always displayed on the roadmap
601 607 * Added the ability to rename wiki pages (specific permission required)
602 608 * Search engines now supports pagination. Results are sorted in reverse chronological order
603 609 * Added "Estimated hours" attribute on issues
604 610 * A category with assigned issue can now be deleted. 2 options are proposed: remove assignments or reassign issues to another category
605 611 * Forum notifications are now also sent to the authors of the thread, even if they donοΏ½t watch the board
606 612 * Added an application setting to specify the application protocol (http or https) used to generate urls in emails
607 613 * Gantt chart: now starts at the current month by default
608 614 * Gantt chart: month count and zoom factor are automatically saved as user preferences
609 615 * Wiki links can now refer to other project wikis
610 616 * Added wiki index by date
611 617 * Added preview on add/edit issue form
612 618 * Emails footer can now be customized from the admin interface (Admin -> Email notifications)
613 619 * Default encodings for repository files can now be set in application settings (used to convert files content and diff to UTF-8 so that theyοΏ½re properly displayed)
614 620 * Calendar: first day of week can now be set in lang files
615 621 * Automatic closing of duplicate issues
616 622 * Added a cross-project issue list
617 623 * AJAXified the SCM browser (tree view)
618 624 * Pretty URL for the repository browser (Cyril Mougel)
619 625 * Search engine: added a checkbox to search titles only
620 626 * Added "% done" in the filter list
621 627 * Enumerations: values can now be reordered and a default value can be specified (eg. default issue priority)
622 628 * Added some accesskeys
623 629 * Added "Float" as a custom field format
624 630 * Added basic Theme support
625 631 * Added the ability to set the οΏ½done ratioοΏ½ of issues fixed by commit (Nikolay Solakov)
626 632 * Added custom fields in issue related mail notifications
627 633 * Email notifications are now sent in plain text and html
628 634 * Gantt chart can now be exported to a graphic file (png). This functionality is only available if RMagick is installed.
629 635 * Added syntax highlightment for repository files and wiki
630 636 * Improved automatic Redmine links
631 637 * Added automatic table of content support on wiki pages
632 638 * Added radio buttons on the documents list to sort documents by category, date, title or author
633 639 * Added basic plugin support, with a sample plugin
634 640 * Added a link to add a new category when creating or editing an issue
635 641 * Added a "Assignable" boolean on the Role model. If unchecked, issues can not be assigned to users having this role.
636 642 * Added an option to be able to relate issues in different projects
637 643 * Added the ability to move issues (to another project) without changing their trackers.
638 644 * Atom feeds added on project activity, news and changesets
639 645 * Added the ability to reset its own RSS access key
640 646 * Main project list now displays root projects with their subprojects
641 647 * Added anchor links to issue notes
642 648 * Added reposman Ruby version. This script can now register created repositories in Redmine (Nicolas Chuche)
643 649 * Issue notes are now included in search
644 650 * Added email sending test functionality
645 651 * Added LDAPS support for LDAP authentication
646 652 * Removed hard-coded URLs in mail templates
647 653 * Subprojects are now grouped by projects in the navigation drop-down menu
648 654 * Added a new value for date filters: this week
649 655 * Added cache for application settings
650 656 * Added Polish translation (Tomasz Gawryl)
651 657 * Added Czech translation (Jan Kadlecek)
652 658 * Added Romanian translation (Csongor Bartus)
653 659 * Added Hebrew translation (Bob Builder)
654 660 * Added Serbian translation (Dragan Matic)
655 661 * Added Korean translation (Choi Jong Yoon)
656 662 * Fixed: the link to delete issue relations is displayed even if the user is not authorized to delete relations
657 663 * Performance improvement on calendar and gantt
658 664 * Fixed: wiki preview doesnοΏ½t work on long entries
659 665 * Fixed: queries with multiple custom fields return no result
660 666 * Fixed: Can not authenticate user against LDAP if its DN contains non-ascii characters
661 667 * Fixed: URL with ~ broken in wiki formatting
662 668 * Fixed: some quotation marks are rendered as strange characters in pdf
663 669
664 670
665 671 == 2007-07-15 v0.5.1
666 672
667 673 * per project forums added
668 674 * added the ability to archive projects
669 675 * added οΏ½WatchοΏ½ functionality on issues. It allows users to receive notifications about issue changes
670 676 * custom fields for issues can now be used as filters on issue list
671 677 * added per user custom queries
672 678 * commit messages are now scanned for referenced or fixed issue IDs (keywords defined in Admin -> Settings)
673 679 * projects list now shows the list of public projects and private projects for which the user is a member
674 680 * versions can now be created with no date
675 681 * added issue count details for versions on Reports view
676 682 * added time report, by member/activity/tracker/version and year/month/week for the selected period
677 683 * each category can now be associated to a user, so that new issues in that category are automatically assigned to that user
678 684 * added autologin feature (disabled by default)
679 685 * optimistic locking added for wiki edits
680 686 * added wiki diff
681 687 * added the ability to destroy wiki pages (requires permission)
682 688 * a wiki page can now be attached to each version, and displayed on the roadmap
683 689 * attachments can now be added to wiki pages (original patch by Pavol Murin) and displayed online
684 690 * added an option to see all versions in the roadmap view (including completed ones)
685 691 * added basic issue relations
686 692 * added the ability to log time when changing an issue status
687 693 * account information can now be sent to the user when creating an account
688 694 * author and assignee of an issue always receive notifications (even if they turned of mail notifications)
689 695 * added a quick search form in page header
690 696 * added 'me' value for 'assigned to' and 'author' query filters
691 697 * added a link on revision screen to see the entire diff for the revision
692 698 * added last commit message for each entry in repository browser
693 699 * added the ability to view a file diff with free to/from revision selection.
694 700 * text files can now be viewed online when browsing the repository
695 701 * added basic support for other SCM: CVS (Ralph Vater), Mercurial and Darcs
696 702 * added fragment caching for svn diffs
697 703 * added fragment caching for calendar and gantt views
698 704 * login field automatically focused on login form
699 705 * subproject name displayed on issue list, calendar and gantt
700 706 * added an option to choose the date format: language based or ISO 8601
701 707 * added a simple mail handler. It lets users add notes to an existing issue by replying to the initial notification email.
702 708 * a 403 error page is now displayed (instead of a blank page) when trying to access a protected page
703 709 * added portuguese translation (Joao Carlos Clementoni)
704 710 * added partial online help japanese translation (Ken Date)
705 711 * added bulgarian translation (Nikolay Solakov)
706 712 * added dutch translation (Linda van den Brink)
707 713 * added swedish translation (Thomas Habets)
708 714 * italian translation update (Alessio Spadaro)
709 715 * japanese translation update (Satoru Kurashiki)
710 716 * fixed: error on history atom feed when thereοΏ½s no notes on an issue change
711 717 * fixed: error in journalizing an issue with longtext custom fields (Postgresql)
712 718 * fixed: creation of Oracle schema
713 719 * fixed: last day of the month not included in project activity
714 720 * fixed: files with an apostrophe in their names can't be accessed in SVN repository
715 721 * fixed: performance issue on RepositoriesController#revisions when a changeset has a great number of changes (eg. 100,000)
716 722 * fixed: open/closed issue counts are always 0 on reports view (postgresql)
717 723 * fixed: date query filters (wrong results and sql error with postgresql)
718 724 * fixed: confidentiality issue on account/show (private project names displayed to anyone)
719 725 * fixed: Long text custom fields displayed without line breaks
720 726 * fixed: Error when editing the wokflow after deleting a status
721 727 * fixed: SVN commit dates are now stored as local time
722 728
723 729
724 730 == 2007-04-11 v0.5.0
725 731
726 732 * added per project Wiki
727 733 * added rss/atom feeds at project level (custom queries can be used as feeds)
728 734 * added search engine (search in issues, news, commits, wiki pages, documents)
729 735 * simple time tracking functionality added
730 736 * added version due dates on calendar and gantt
731 737 * added subprojects issue count on project Reports page
732 738 * added the ability to copy an existing workflow when creating a new tracker
733 739 * added the ability to include subprojects on calendar and gantt
734 740 * added the ability to select trackers to display on calendar and gantt (Jeffrey Jones)
735 741 * added side by side svn diff view (Cyril Mougel)
736 742 * added back subproject filter on issue list
737 743 * added permissions report in admin area
738 744 * added a status filter on users list
739 745 * support for password-protected SVN repositories
740 746 * SVN commits are now stored in the database
741 747 * added simple svn statistics SVG graphs
742 748 * progress bars for roadmap versions (Nick Read)
743 749 * issue history now shows file uploads and deletions
744 750 * #id patterns are turned into links to issues in descriptions and commit messages
745 751 * japanese translation added (Satoru Kurashiki)
746 752 * chinese simplified translation added (Andy Wu)
747 753 * italian translation added (Alessio Spadaro)
748 754 * added scripts to manage SVN repositories creation and user access control using ssh+svn (Nicolas Chuche)
749 755 * better calendar rendering time
750 756 * fixed migration scripts to work with mysql 5 running in strict mode
751 757 * fixed: error when clicking "add" with no block selected on my/page_layout
752 758 * fixed: hard coded links in navigation bar
753 759 * fixed: table_name pre/suffix support
754 760
755 761
756 762 == 2007-02-18 v0.4.2
757 763
758 764 * Rails 1.2 is now required
759 765 * settings are now stored in the database and editable through the application in: Admin -> Settings (config_custom.rb is no longer used)
760 766 * added project roadmap view
761 767 * mail notifications added when a document, a file or an attachment is added
762 768 * tooltips added on Gantt chart and calender to view the details of the issues
763 769 * ability to set the sort order for roles, trackers, issue statuses
764 770 * added missing fields to csv export: priority, start date, due date, done ratio
765 771 * added total number of issues per tracker on project overview
766 772 * all icons replaced (new icons are based on GPL icon set: "KDE Crystal Diamond 2.5" -by paolino- and "kNeu! Alpha v0.1" -by Pablo Fabregat-)
767 773 * added back "fixed version" field on issue screen and in filters
768 774 * project settings screen split in 4 tabs
769 775 * custom fields screen split in 3 tabs (one for each kind of custom field)
770 776 * multiple issues pdf export now rendered as a table
771 777 * added a button on users/list to manually activate an account
772 778 * added a setting option to disable "password lost" functionality
773 779 * added a setting option to set max number of issues in csv/pdf exports
774 780 * fixed: subprojects count is always 0 on projects list
775 781 * fixed: locked users are proposed when adding a member to a project
776 782 * fixed: setting an issue status as default status leads to an sql error with SQLite
777 783 * fixed: unable to delete an issue status even if it's not used yet
778 784 * fixed: filters ignored when exporting a predefined query to csv/pdf
779 785 * fixed: crash when french "issue_edit" email notification is sent
780 786 * fixed: hide mail preference not saved (my/account)
781 787 * fixed: crash when a new user try to edit its "my page" layout
782 788
783 789
784 790 == 2007-01-03 v0.4.1
785 791
786 792 * fixed: emails have no recipient when one of the project members has notifications disabled
787 793
788 794
789 795 == 2007-01-02 v0.4.0
790 796
791 797 * simple SVN browser added (just needs svn binaries in PATH)
792 798 * comments can now be added on news
793 799 * "my page" is now customizable
794 800 * more powerfull and savable filters for issues lists
795 801 * improved issues change history
796 802 * new functionality: move an issue to another project or tracker
797 803 * new functionality: add a note to an issue
798 804 * new report: project activity
799 805 * "start date" and "% done" fields added on issues
800 806 * project calendar added
801 807 * gantt chart added (exportable to pdf)
802 808 * single/multiple issues pdf export added
803 809 * issues reports improvements
804 810 * multiple file upload for issues, documents and files
805 811 * option to set maximum size of uploaded files
806 812 * textile formating of issue and news descritions (RedCloth required)
807 813 * integration of DotClear jstoolbar for textile formatting
808 814 * calendar date picker for date fields (LGPL DHTML Calendar http://sourceforge.net/projects/jscalendar)
809 815 * new filter in issues list: Author
810 816 * ajaxified paginators
811 817 * news rss feed added
812 818 * option to set number of results per page on issues list
813 819 * localized csv separator (comma/semicolon)
814 820 * csv output encoded to ISO-8859-1
815 821 * user custom field displayed on account/show
816 822 * default configuration improved (default roles, trackers, status, permissions and workflows)
817 823 * language for default configuration data can now be chosen when running 'load_default_data' task
818 824 * javascript added on custom field form to show/hide fields according to the format of custom field
819 825 * fixed: custom fields not in csv exports
820 826 * fixed: project settings now displayed according to user's permissions
821 827 * fixed: application error when no version is selected on projects/add_file
822 828 * fixed: public actions not authorized for members of non public projects
823 829 * fixed: non public projects were shown on welcome screen even if current user is not a member
824 830
825 831
826 832 == 2006-10-08 v0.3.0
827 833
828 834 * user authentication against multiple LDAP (optional)
829 835 * token based "lost password" functionality
830 836 * user self-registration functionality (optional)
831 837 * custom fields now available for issues, users and projects
832 838 * new custom field format "text" (displayed as a textarea field)
833 839 * project & administration drop down menus in navigation bar for quicker access
834 840 * text formatting is preserved for long text fields (issues, projects and news descriptions)
835 841 * urls and emails are turned into clickable links in long text fields
836 842 * "due date" field added on issues
837 843 * tracker selection filter added on change log
838 844 * Localization plugin replaced with GLoc 1.1.0 (iconv required)
839 845 * error messages internationalization
840 846 * german translation added (thanks to Karim Trott)
841 847 * data locking for issues to prevent update conflicts (using ActiveRecord builtin optimistic locking)
842 848 * new filter in issues list: "Fixed version"
843 849 * active filters are displayed with colored background on issues list
844 850 * custom configuration is now defined in config/config_custom.rb
845 851 * user object no more stored in session (only user_id)
846 852 * news summary field is no longer required
847 853 * tables and forms redesign
848 854 * Fixed: boolean custom field not working
849 855 * Fixed: error messages for custom fields are not displayed
850 856 * Fixed: invalid custom fields should have a red border
851 857 * Fixed: custom fields values are not validated on issue update
852 858 * Fixed: unable to choose an empty value for 'List' custom fields
853 859 * Fixed: no issue categories sorting
854 860 * Fixed: incorrect versions sorting
855 861
856 862
857 863 == 2006-07-12 - v0.2.2
858 864
859 865 * Fixed: bug in "issues list"
860 866
861 867
862 868 == 2006-07-09 - v0.2.1
863 869
864 870 * new databases supported: Oracle, PostgreSQL, SQL Server
865 871 * projects/subprojects hierarchy (1 level of subprojects only)
866 872 * environment information display in admin/info
867 873 * more filter options in issues list (rev6)
868 874 * default language based on browser settings (Accept-Language HTTP header)
869 875 * issues list exportable to CSV (rev6)
870 876 * simple_format and auto_link on long text fields
871 877 * more data validations
872 878 * Fixed: error when all mail notifications are unchecked in admin/mail_options
873 879 * Fixed: all project news are displayed on project summary
874 880 * Fixed: Can't change user password in users/edit
875 881 * Fixed: Error on tables creation with PostgreSQL (rev5)
876 882 * Fixed: SQL error in "issue reports" view with PostgreSQL (rev5)
877 883
878 884
879 885 == 2006-06-25 - v0.1.0
880 886
881 887 * multiple users/multiple projects
882 888 * role based access control
883 889 * issue tracking system
884 890 * fully customizable workflow
885 891 * documents/files repository
886 892 * email notifications on issue creation and update
887 893 * multilanguage support (except for error messages):english, french, spanish
888 894 * online manual in french (unfinished)
@@ -1,686 +1,687
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 72 .clear:after{ content: "."; display: block; height: 0; clear: both; visibility: hidden; }
73 73
74 74 /***** Links *****/
75 75 a, a:link, a:visited{ color: #2A5685; text-decoration: none; }
76 76 a:hover, a:active{ color: #c61a1a; text-decoration: underline;}
77 77 a img{ border: 0; }
78 78
79 79 a.issue.closed, a.issue.closed:link, a.issue.closed:visited { text-decoration: line-through; }
80 80
81 81 /***** Tables *****/
82 82 table.list { border: 1px solid #e4e4e4; border-collapse: collapse; width: 100%; margin-bottom: 4px; }
83 83 table.list th { background-color:#EEEEEE; padding: 4px; white-space:nowrap; }
84 84 table.list td { vertical-align: top; }
85 85 table.list td.id { width: 2%; text-align: center;}
86 86 table.list td.checkbox { width: 15px; padding: 0px;}
87 87
88 88 tr.issue { text-align: center; white-space: nowrap; }
89 89 tr.issue td.subject, tr.issue td.category, td.assigned_to { white-space: normal; }
90 90 tr.issue td.subject { text-align: left; }
91 91 tr.issue td.done_ratio table.progress { margin-left:auto; margin-right: auto;}
92 92
93 93 tr.entry { border: 1px solid #f8f8f8; }
94 94 tr.entry td { white-space: nowrap; }
95 95 tr.entry td.filename { width: 30%; }
96 96 tr.entry td.size { text-align: right; font-size: 90%; }
97 97 tr.entry td.revision, tr.entry td.author { text-align: center; }
98 98 tr.entry td.age { text-align: right; }
99 99
100 100 tr.entry span.expander {background-image: url(../images/bullet_toggle_plus.png); padding-left: 8px; margin-left: 0; cursor: pointer;}
101 101 tr.entry.open span.expander {background-image: url(../images/bullet_toggle_minus.png);}
102 102 tr.entry.file td.filename a { margin-left: 16px; }
103 103
104 104 tr.changeset td.author { text-align: center; width: 15%; }
105 105 tr.changeset td.committed_on { text-align: center; width: 15%; }
106 106
107 tr.file td { text-align: center; }
108 tr.file td.filename { text-align: left; padding-left: 24px; }
109 tr.file td.digest { font-size: 80%; }
107 table.files tr.file td { text-align: center; }
108 table.files tr.file td.filename { text-align: left; padding-left: 24px; }
109 table.files tr.file td.digest { font-size: 80%; }
110 110
111 111 tr.message { height: 2.6em; }
112 112 tr.message td.last_message { font-size: 80%; }
113 113 tr.message.locked td.subject a { background-image: url(../images/locked.png); }
114 114 tr.message.sticky td.subject a { background-image: url(../images/sticky.png); font-weight: bold; }
115 115
116 116 tr.user td { width:13%; }
117 117 tr.user td.email { width:18%; }
118 118 tr.user td { white-space: nowrap; }
119 119 tr.user.locked, tr.user.registered { color: #aaa; }
120 120 tr.user.locked a, tr.user.registered a { color: #aaa; }
121 121
122 122 tr.time-entry { text-align: center; white-space: nowrap; }
123 123 tr.time-entry td.subject, tr.time-entry td.comments { text-align: left; white-space: normal; }
124 124 td.hours { text-align: right; font-weight: bold; padding-right: 0.5em; }
125 125 td.hours .hours-dec { font-size: 0.9em; }
126 126
127 127 table.plugins td { vertical-align: middle; }
128 128 table.plugins td.configure { text-align: right; padding-right: 1em; }
129 129 table.plugins span.name { font-weight: bold; display: block; margin-bottom: 6px; }
130 130 table.plugins span.description { display: block; font-size: 0.9em; }
131 131 table.plugins span.url { display: block; font-size: 0.9em; }
132 132
133 133 table.list tbody tr:hover { background-color:#ffffdd; }
134 134 table td {padding:2px;}
135 135 table p {margin:0;}
136 136 .odd {background-color:#f6f7f8;}
137 137 .even {background-color: #fff;}
138 138
139 139 .highlight { background-color: #FCFD8D;}
140 140 .highlight.token-1 { background-color: #faa;}
141 141 .highlight.token-2 { background-color: #afa;}
142 142 .highlight.token-3 { background-color: #aaf;}
143 143
144 144 .box{
145 145 padding:6px;
146 146 margin-bottom: 10px;
147 147 background-color:#f6f6f6;
148 148 color:#505050;
149 149 line-height:1.5em;
150 150 border: 1px solid #e4e4e4;
151 151 }
152 152
153 153 div.square {
154 154 border: 1px solid #999;
155 155 float: left;
156 156 margin: .3em .4em 0 .4em;
157 157 overflow: hidden;
158 158 width: .6em; height: .6em;
159 159 }
160 160 .contextual {float:right; white-space: nowrap; line-height:1.4em;margin-top:5px; padding-left: 10px; font-size:0.9em;}
161 161 .contextual input {font-size:0.9em;}
162 162
163 163 .splitcontentleft{float:left; width:49%;}
164 164 .splitcontentright{float:right; width:49%;}
165 165 form {display: inline;}
166 166 input, select {vertical-align: middle; margin-top: 1px; margin-bottom: 1px;}
167 167 fieldset {border: 1px solid #e4e4e4; margin:0;}
168 168 legend {color: #484848;}
169 169 hr { width: 100%; height: 1px; background: #ccc; border: 0;}
170 170 blockquote { font-style: italic; border-left: 3px solid #e0e0e0; padding-left: 0.6em; margin-left: 2.4em;}
171 171 blockquote blockquote { margin-left: 0;}
172 172 textarea.wiki-edit { width: 99%; }
173 173 li p {margin-top: 0;}
174 174 div.issue {background:#ffffdd; padding:6px; margin-bottom:6px;border: 1px solid #d7d7d7;}
175 175 p.breadcrumb { font-size: 0.9em; margin: 4px 0 4px 0;}
176 176 p.subtitle { font-size: 0.9em; margin: -6px 0 12px 0; font-style: italic; }
177 177 p.footnote { font-size: 0.9em; margin-top: 0px; margin-bottom: 0px; }
178 178
179 179 fieldset#filters, fieldset#date-range { padding: 0.7em; margin-bottom: 8px; }
180 180 fieldset#filters p { margin: 1.2em 0 0.8em 2px; }
181 181 fieldset#filters table { border-collapse: collapse; }
182 182 fieldset#filters table td { padding: 0; vertical-align: middle; }
183 183 fieldset#filters tr.filter { height: 2em; }
184 184 fieldset#filters td.add-filter { text-align: right; vertical-align: top; }
185 185 .buttons { font-size: 0.9em; }
186 186
187 187 div#issue-changesets {float:right; width:45%; margin-left: 1em; margin-bottom: 1em; background: #fff; padding-left: 1em; font-size: 90%;}
188 188 div#issue-changesets .changeset { padding: 4px;}
189 189 div#issue-changesets .changeset { border-bottom: 1px solid #ddd; }
190 190 div#issue-changesets p { margin-top: 0; margin-bottom: 1em;}
191 191
192 192 div#activity dl, #search-results { margin-left: 2em; }
193 193 div#activity dd, #search-results dd { margin-bottom: 1em; padding-left: 18px; font-size: 0.9em; }
194 194 div#activity dt, #search-results dt { margin-bottom: 0px; padding-left: 20px; line-height: 18px; background-position: 0 50%; background-repeat: no-repeat; }
195 195 div#activity dt.me .time { border-bottom: 1px solid #999; }
196 196 div#activity dt .time { color: #777; font-size: 80%; }
197 197 div#activity dd .description, #search-results dd .description { font-style: italic; }
198 198 div#activity span.project:after, #search-results span.project:after { content: " -"; }
199 199 div#activity dd span.description, #search-results dd span.description { display:block; }
200 200
201 201 #search-results dd { margin-bottom: 1em; padding-left: 20px; margin-left:0px; }
202 202 div#search-results-counts {float:right;}
203 203 div#search-results-counts ul { margin-top: 0.5em; }
204 204 div#search-results-counts li { list-style-type:none; float: left; margin-left: 1em; }
205 205
206 206 dt.issue { background-image: url(../images/ticket.png); }
207 207 dt.issue-edit { background-image: url(../images/ticket_edit.png); }
208 208 dt.issue-closed { background-image: url(../images/ticket_checked.png); }
209 209 dt.issue-note { background-image: url(../images/ticket_note.png); }
210 210 dt.changeset { background-image: url(../images/changeset.png); }
211 211 dt.news { background-image: url(../images/news.png); }
212 212 dt.message { background-image: url(../images/message.png); }
213 213 dt.reply { background-image: url(../images/comments.png); }
214 214 dt.wiki-page { background-image: url(../images/wiki_edit.png); }
215 215 dt.attachment { background-image: url(../images/attachment.png); }
216 216 dt.document { background-image: url(../images/document.png); }
217 217 dt.project { background-image: url(../images/projects.png); }
218 218
219 219 div#roadmap fieldset.related-issues { margin-bottom: 1em; }
220 220 div#roadmap fieldset.related-issues ul { margin-top: 0.3em; margin-bottom: 0.3em; }
221 221 div#roadmap .wiki h1:first-child { display: none; }
222 222 div#roadmap .wiki h1 { font-size: 120%; }
223 223 div#roadmap .wiki h2 { font-size: 110%; }
224 224
225 225 div#version-summary { float:right; width:380px; margin-left: 16px; margin-bottom: 16px; background-color: #fff; }
226 226 div#version-summary fieldset { margin-bottom: 1em; }
227 227 div#version-summary .total-hours { text-align: right; }
228 228
229 229 table#time-report td.hours, table#time-report th.period, table#time-report th.total { text-align: right; padding-right: 0.5em; }
230 230 table#time-report tbody tr { font-style: italic; color: #777; }
231 231 table#time-report tbody tr.last-level { font-style: normal; color: #555; }
232 232 table#time-report tbody tr.total { font-style: normal; font-weight: bold; color: #555; background-color:#EEEEEE; }
233 233 table#time-report .hours-dec { font-size: 0.9em; }
234 234
235 235 ul.properties {padding:0; font-size: 0.9em; color: #777;}
236 236 ul.properties li {list-style-type:none;}
237 237 ul.properties li span {font-style:italic;}
238 238
239 239 .total-hours { font-size: 110%; font-weight: bold; }
240 240 .total-hours span.hours-int { font-size: 120%; }
241 241
242 242 .autoscroll {overflow-x: auto; padding:1px; margin-bottom: 1.2em;}
243 243 #user_firstname, #user_lastname, #user_mail, #my_account_form select { width: 90%; }
244 244
245 245 .pagination {font-size: 90%}
246 246 p.pagination {margin-top:8px;}
247 247
248 248 /***** Tabular forms ******/
249 249 .tabular p{
250 250 margin: 0;
251 251 padding: 5px 0 8px 0;
252 252 padding-left: 180px; /*width of left column containing the label elements*/
253 253 height: 1%;
254 254 clear:left;
255 255 }
256 256
257 257 html>body .tabular p {overflow:hidden;}
258 258
259 259 .tabular label{
260 260 font-weight: bold;
261 261 float: left;
262 262 text-align: right;
263 263 margin-left: -180px; /*width of left column*/
264 264 width: 175px; /*width of labels. Should be smaller than left column to create some right
265 265 margin*/
266 266 }
267 267
268 268 .tabular label.floating{
269 269 font-weight: normal;
270 270 margin-left: 0px;
271 271 text-align: left;
272 272 width: 270px;
273 273 }
274 274
275 275 input#time_entry_comments { width: 90%;}
276 276
277 277 #preview fieldset {margin-top: 1em; background: url(../images/draft.png)}
278 278
279 279 .tabular.settings p{ padding-left: 300px; }
280 280 .tabular.settings label{ margin-left: -300px; width: 295px; }
281 281
282 282 .required {color: #bb0000;}
283 283 .summary {font-style: italic;}
284 284
285 285 #attachments_fields input[type=text] {margin-left: 8px; }
286 286
287 287 div.attachments { margin-top: 12px; }
288 288 div.attachments p { margin:4px 0 2px 0; }
289 289 div.attachments img { vertical-align: middle; }
290 290 div.attachments span.author { font-size: 0.9em; color: #888; }
291 291
292 292 p.other-formats { text-align: right; font-size:0.9em; color: #666; }
293 293 .other-formats span + span:before { content: "| "; }
294 294
295 295 a.feed { background: url(../images/feed.png) no-repeat 1px 50%; padding: 2px 0px 3px 16px; }
296 296
297 297 /***** Flash & error messages ****/
298 298 #errorExplanation, div.flash, .nodata, .warning {
299 299 padding: 4px 4px 4px 30px;
300 300 margin-bottom: 12px;
301 301 font-size: 1.1em;
302 302 border: 2px solid;
303 303 }
304 304
305 305 div.flash {margin-top: 8px;}
306 306
307 307 div.flash.error, #errorExplanation {
308 308 background: url(../images/false.png) 8px 5px no-repeat;
309 309 background-color: #ffe3e3;
310 310 border-color: #dd0000;
311 311 color: #550000;
312 312 }
313 313
314 314 div.flash.notice {
315 315 background: url(../images/true.png) 8px 5px no-repeat;
316 316 background-color: #dfffdf;
317 317 border-color: #9fcf9f;
318 318 color: #005f00;
319 319 }
320 320
321 321 div.flash.warning {
322 322 background: url(../images/warning.png) 8px 5px no-repeat;
323 323 background-color: #FFEBC1;
324 324 border-color: #FDBF3B;
325 325 color: #A6750C;
326 326 text-align: left;
327 327 }
328 328
329 329 .nodata, .warning {
330 330 text-align: center;
331 331 background-color: #FFEBC1;
332 332 border-color: #FDBF3B;
333 333 color: #A6750C;
334 334 }
335 335
336 336 #errorExplanation ul { font-size: 0.9em;}
337 337
338 338 /***** Ajax indicator ******/
339 339 #ajax-indicator {
340 340 position: absolute; /* fixed not supported by IE */
341 341 background-color:#eee;
342 342 border: 1px solid #bbb;
343 343 top:35%;
344 344 left:40%;
345 345 width:20%;
346 346 font-weight:bold;
347 347 text-align:center;
348 348 padding:0.6em;
349 349 z-index:100;
350 350 filter:alpha(opacity=50);
351 351 opacity: 0.5;
352 352 }
353 353
354 354 html>body #ajax-indicator { position: fixed; }
355 355
356 356 #ajax-indicator span {
357 357 background-position: 0% 40%;
358 358 background-repeat: no-repeat;
359 359 background-image: url(../images/loading.gif);
360 360 padding-left: 26px;
361 361 vertical-align: bottom;
362 362 }
363 363
364 364 /***** Calendar *****/
365 365 table.cal {border-collapse: collapse; width: 100%; margin: 0px 0 6px 0;border: 1px solid #d7d7d7;}
366 366 table.cal thead th {width: 14%;}
367 367 table.cal tbody tr {height: 100px;}
368 368 table.cal th { background-color:#EEEEEE; padding: 4px; }
369 369 table.cal td {border: 1px solid #d7d7d7; vertical-align: top; font-size: 0.9em;}
370 370 table.cal td p.day-num {font-size: 1.1em; text-align:right;}
371 371 table.cal td.odd p.day-num {color: #bbb;}
372 372 table.cal td.today {background:#ffffdd;}
373 373 table.cal td.today p.day-num {font-weight: bold;}
374 374
375 375 /***** Tooltips ******/
376 376 .tooltip{position:relative;z-index:24;}
377 377 .tooltip:hover{z-index:25;color:#000;}
378 378 .tooltip span.tip{display: none; text-align:left;}
379 379
380 380 div.tooltip:hover span.tip{
381 381 display:block;
382 382 position:absolute;
383 383 top:12px; left:24px; width:270px;
384 384 border:1px solid #555;
385 385 background-color:#fff;
386 386 padding: 4px;
387 387 font-size: 0.8em;
388 388 color:#505050;
389 389 }
390 390
391 391 /***** Progress bar *****/
392 392 table.progress {
393 393 border: 1px solid #D7D7D7;
394 394 border-collapse: collapse;
395 395 border-spacing: 0pt;
396 396 empty-cells: show;
397 397 text-align: center;
398 398 float:left;
399 399 margin: 1px 6px 1px 0px;
400 400 }
401 401
402 402 table.progress td { height: 0.9em; }
403 403 table.progress td.closed { background: #BAE0BA none repeat scroll 0%; }
404 404 table.progress td.done { background: #DEF0DE none repeat scroll 0%; }
405 405 table.progress td.open { background: #FFF none repeat scroll 0%; }
406 406 p.pourcent {font-size: 80%;}
407 407 p.progress-info {clear: left; font-style: italic; font-size: 80%;}
408 408
409 409 /***** Tabs *****/
410 410 #content .tabs {height: 2.6em; border-bottom: 1px solid #bbbbbb; margin-bottom:1.2em; position:relative;}
411 411 #content .tabs ul {margin:0; position:absolute; bottom:-2px; padding-left:1em;}
412 412 #content .tabs>ul { bottom:-1px; } /* others */
413 413 #content .tabs ul li {
414 414 float:left;
415 415 list-style-type:none;
416 416 white-space:nowrap;
417 417 margin-right:8px;
418 418 background:#fff;
419 419 }
420 420 #content .tabs ul li a{
421 421 display:block;
422 422 font-size: 0.9em;
423 423 text-decoration:none;
424 424 line-height:1.3em;
425 425 padding:4px 6px 4px 6px;
426 426 border: 1px solid #ccc;
427 427 border-bottom: 1px solid #bbbbbb;
428 428 background-color: #eeeeee;
429 429 color:#777;
430 430 font-weight:bold;
431 431 }
432 432
433 433 #content .tabs ul li a:hover {
434 434 background-color: #ffffdd;
435 435 text-decoration:none;
436 436 }
437 437
438 438 #content .tabs ul li a.selected {
439 439 background-color: #fff;
440 440 border: 1px solid #bbbbbb;
441 441 border-bottom: 1px solid #fff;
442 442 }
443 443
444 444 #content .tabs ul li a.selected:hover {
445 445 background-color: #fff;
446 446 }
447 447
448 448 /***** Diff *****/
449 449 .diff_out { background: #fcc; }
450 450 .diff_in { background: #cfc; }
451 451
452 452 /***** Wiki *****/
453 453 div.wiki table {
454 454 border: 1px solid #505050;
455 455 border-collapse: collapse;
456 456 margin-bottom: 1em;
457 457 }
458 458
459 459 div.wiki table, div.wiki td, div.wiki th {
460 460 border: 1px solid #bbb;
461 461 padding: 4px;
462 462 }
463 463
464 464 div.wiki .external {
465 465 background-position: 0% 60%;
466 466 background-repeat: no-repeat;
467 467 padding-left: 12px;
468 468 background-image: url(../images/external.png);
469 469 }
470 470
471 471 div.wiki a.new {
472 472 color: #b73535;
473 473 }
474 474
475 475 div.wiki pre {
476 476 margin: 1em 1em 1em 1.6em;
477 477 padding: 2px;
478 478 background-color: #fafafa;
479 479 border: 1px solid #dadada;
480 480 width:95%;
481 481 overflow-x: auto;
482 482 }
483 483
484 484 div.wiki ul.toc {
485 485 background-color: #ffffdd;
486 486 border: 1px solid #e4e4e4;
487 487 padding: 4px;
488 488 line-height: 1.2em;
489 489 margin-bottom: 12px;
490 490 margin-right: 12px;
491 491 margin-left: 0;
492 492 display: table
493 493 }
494 494 * html div.wiki ul.toc { width: 50%; } /* IE6 doesn't autosize div */
495 495
496 496 div.wiki ul.toc.right { float: right; margin-left: 12px; margin-right: 0; width: auto; }
497 497 div.wiki ul.toc.left { float: left; margin-right: 12px; margin-left: 0; width: auto; }
498 498 div.wiki ul.toc li { list-style-type:none;}
499 499 div.wiki ul.toc li.heading2 { margin-left: 6px; }
500 500 div.wiki ul.toc li.heading3 { margin-left: 12px; font-size: 0.8em; }
501 501
502 502 div.wiki ul.toc a {
503 503 font-size: 0.9em;
504 504 font-weight: normal;
505 505 text-decoration: none;
506 506 color: #606060;
507 507 }
508 508 div.wiki ul.toc a:hover { color: #c61a1a; text-decoration: underline;}
509 509
510 510 a.wiki-anchor { display: none; margin-left: 6px; text-decoration: none; }
511 511 a.wiki-anchor:hover { color: #aaa !important; text-decoration: none; }
512 512 h1:hover a.wiki-anchor, h2:hover a.wiki-anchor, h3:hover a.wiki-anchor { display: inline; color: #ddd; }
513 513
514 514 /***** My page layout *****/
515 515 .block-receiver {
516 516 border:1px dashed #c0c0c0;
517 517 margin-bottom: 20px;
518 518 padding: 15px 0 15px 0;
519 519 }
520 520
521 521 .mypage-box {
522 522 margin:0 0 20px 0;
523 523 color:#505050;
524 524 line-height:1.5em;
525 525 }
526 526
527 527 .handle {
528 528 cursor: move;
529 529 }
530 530
531 531 a.close-icon {
532 532 display:block;
533 533 margin-top:3px;
534 534 overflow:hidden;
535 535 width:12px;
536 536 height:12px;
537 537 background-repeat: no-repeat;
538 538 cursor:pointer;
539 539 background-image:url('../images/close.png');
540 540 }
541 541
542 542 a.close-icon:hover {
543 543 background-image:url('../images/close_hl.png');
544 544 }
545 545
546 546 /***** Gantt chart *****/
547 547 .gantt_hdr {
548 548 position:absolute;
549 549 top:0;
550 550 height:16px;
551 551 border-top: 1px solid #c0c0c0;
552 552 border-bottom: 1px solid #c0c0c0;
553 553 border-right: 1px solid #c0c0c0;
554 554 text-align: center;
555 555 overflow: hidden;
556 556 }
557 557
558 558 .task {
559 559 position: absolute;
560 560 height:8px;
561 561 font-size:0.8em;
562 562 color:#888;
563 563 padding:0;
564 564 margin:0;
565 565 line-height:0.8em;
566 566 }
567 567
568 568 .task_late { background:#f66 url(../images/task_late.png); border: 1px solid #f66; }
569 569 .task_done { background:#66f url(../images/task_done.png); border: 1px solid #66f; }
570 570 .task_todo { background:#aaa url(../images/task_todo.png); border: 1px solid #aaa; }
571 571 .milestone { background-image:url(../images/milestone.png); background-repeat: no-repeat; border: 0; }
572 572
573 573 /***** Icons *****/
574 574 .icon {
575 575 background-position: 0% 40%;
576 576 background-repeat: no-repeat;
577 577 padding-left: 20px;
578 578 padding-top: 2px;
579 579 padding-bottom: 3px;
580 580 }
581 581
582 582 .icon22 {
583 583 background-position: 0% 40%;
584 584 background-repeat: no-repeat;
585 585 padding-left: 26px;
586 586 line-height: 22px;
587 587 vertical-align: middle;
588 588 }
589 589
590 590 .icon-add { background-image: url(../images/add.png); }
591 591 .icon-edit { background-image: url(../images/edit.png); }
592 592 .icon-copy { background-image: url(../images/copy.png); }
593 593 .icon-del { background-image: url(../images/delete.png); }
594 594 .icon-move { background-image: url(../images/move.png); }
595 595 .icon-save { background-image: url(../images/save.png); }
596 596 .icon-cancel { background-image: url(../images/cancel.png); }
597 597 .icon-file { background-image: url(../images/file.png); }
598 598 .icon-folder { background-image: url(../images/folder.png); }
599 599 .open .icon-folder { background-image: url(../images/folder_open.png); }
600 600 .icon-package { background-image: url(../images/package.png); }
601 601 .icon-home { background-image: url(../images/home.png); }
602 602 .icon-user { background-image: url(../images/user.png); }
603 603 .icon-mypage { background-image: url(../images/user_page.png); }
604 604 .icon-admin { background-image: url(../images/admin.png); }
605 605 .icon-projects { background-image: url(../images/projects.png); }
606 606 .icon-help { background-image: url(../images/help.png); }
607 607 .icon-attachment { background-image: url(../images/attachment.png); }
608 608 .icon-index { background-image: url(../images/index.png); }
609 609 .icon-history { background-image: url(../images/history.png); }
610 610 .icon-time { background-image: url(../images/time.png); }
611 611 .icon-stats { background-image: url(../images/stats.png); }
612 612 .icon-warning { background-image: url(../images/warning.png); }
613 613 .icon-fav { background-image: url(../images/fav.png); }
614 614 .icon-fav-off { background-image: url(../images/fav_off.png); }
615 615 .icon-reload { background-image: url(../images/reload.png); }
616 616 .icon-lock { background-image: url(../images/locked.png); }
617 617 .icon-unlock { background-image: url(../images/unlock.png); }
618 618 .icon-checked { background-image: url(../images/true.png); }
619 619 .icon-details { background-image: url(../images/zoom_in.png); }
620 620 .icon-report { background-image: url(../images/report.png); }
621 621 .icon-comment { background-image: url(../images/comment.png); }
622 622
623 623 .icon22-projects { background-image: url(../images/22x22/projects.png); }
624 624 .icon22-users { background-image: url(../images/22x22/users.png); }
625 625 .icon22-tracker { background-image: url(../images/22x22/tracker.png); }
626 626 .icon22-role { background-image: url(../images/22x22/role.png); }
627 627 .icon22-workflow { background-image: url(../images/22x22/workflow.png); }
628 628 .icon22-options { background-image: url(../images/22x22/options.png); }
629 629 .icon22-notifications { background-image: url(../images/22x22/notifications.png); }
630 630 .icon22-authent { background-image: url(../images/22x22/authent.png); }
631 631 .icon22-info { background-image: url(../images/22x22/info.png); }
632 632 .icon22-comment { background-image: url(../images/22x22/comment.png); }
633 633 .icon22-package { background-image: url(../images/22x22/package.png); }
634 634 .icon22-settings { background-image: url(../images/22x22/settings.png); }
635 635 .icon22-plugin { background-image: url(../images/22x22/plugin.png); }
636 636
637 637 img.gravatar {
638 638 padding: 2px;
639 639 border: solid 1px #d5d5d5;
640 640 background: #fff;
641 641 }
642 642
643 643 div.issue img.gravatar {
644 644 float: right;
645 645 margin: 0 0 0 1em;
646 646 padding: 5px;
647 647 }
648 648
649 649 div.issue table img.gravatar {
650 650 height: 14px;
651 651 width: 14px;
652 652 padding: 2px;
653 653 float: left;
654 654 margin: 0 0.5em 0 0;
655 655 }
656 656
657 657 #history img.gravatar {
658 658 padding: 3px;
659 659 margin: 0 1.5em 1em 0;
660 660 float: left;
661 661 }
662 662
663 663 td.username img.gravatar {
664 664 float: left;
665 665 margin: 0 1em 0 0;
666 666 }
667 667
668 668 #activity dt img.gravatar {
669 669 float: left;
670 670 margin: 0 1em 1em 0;
671 671 }
672 672
673 673 #activity dt,
674 674 .journal {
675 675 clear: left;
676 676 }
677 677
678 678 h2 img { vertical-align:middle; }
679 679
680 680
681 681 /***** Media print specific styles *****/
682 682 @media print {
683 683 #top-menu, #header, #main-menu, #sidebar, #footer, .contextual, .other-formats { display:none; }
684 684 #main { background: #fff; }
685 685 #content { width: 99%; margin: 0; padding: 0; border: 0; background: #fff; overflow: visible !important;}
686 #wiki_add_attachment { display:none; }
686 687 }
General Comments 0
You need to be logged in to leave comments. Login now