Add an icon to each event on the activity view.
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1342 e93f8b46-1217-0410-a6f0-8f06a7374b81
|
@ -33,6 +33,7 @@ class Journal < ActiveRecord::Base
|
||||||
acts_as_event :title => Proc.new {|o| "#{o.issue.tracker.name} ##{o.issue.id}: #{o.issue.subject}" + ((s = o.new_status) ? " (#{s})" : '') },
|
acts_as_event :title => Proc.new {|o| "#{o.issue.tracker.name} ##{o.issue.id}: #{o.issue.subject}" + ((s = o.new_status) ? " (#{s})" : '') },
|
||||||
:description => :notes,
|
:description => :notes,
|
||||||
:author => :user,
|
:author => :user,
|
||||||
|
:type => Proc.new {|o| (s = o.new_status) && s.is_closed? ? 'issue-closed' : 'issue-edit' },
|
||||||
:url => Proc.new {|o| {:controller => 'issues', :action => 'show', :id => o.issue.id, :anchor => "change-#{o.id}"}}
|
:url => Proc.new {|o| {:controller => 'issues', :action => 'show', :id => o.issue.id, :anchor => "change-#{o.id}"}}
|
||||||
|
|
||||||
def save
|
def save
|
||||||
|
|
|
@ -28,6 +28,7 @@ class Message < ActiveRecord::Base
|
||||||
:date_column => 'created_on'
|
:date_column => 'created_on'
|
||||||
acts_as_event :title => Proc.new {|o| "#{o.board.name}: #{o.subject}"},
|
acts_as_event :title => Proc.new {|o| "#{o.board.name}: #{o.subject}"},
|
||||||
:description => :content,
|
:description => :content,
|
||||||
|
:type => Proc.new {|o| o.parent_id.nil? ? 'message' : 'reply'},
|
||||||
:url => Proc.new {|o| {:controller => 'messages', :action => 'show', :board_id => o.board_id, :id => o.id}}
|
:url => Proc.new {|o| {:controller => 'messages', :action => 'show', :board_id => o.board_id, :id => o.id}}
|
||||||
|
|
||||||
attr_protected :locked, :sticky
|
attr_protected :locked, :sticky
|
||||||
|
|
|
@ -32,6 +32,7 @@ class WikiContent < ActiveRecord::Base
|
||||||
acts_as_event :title => Proc.new {|o| "#{l(:label_wiki_edit)}: #{o.page.title} (##{o.version})"},
|
acts_as_event :title => Proc.new {|o| "#{l(:label_wiki_edit)}: #{o.page.title} (##{o.version})"},
|
||||||
:description => :comments,
|
:description => :comments,
|
||||||
:datetime => :updated_on,
|
:datetime => :updated_on,
|
||||||
|
:type => 'wiki-page',
|
||||||
:url => Proc.new {|o| {:controller => 'wiki', :id => o.page.wiki.project_id, :page => o.page.title, :version => o.version}}
|
:url => Proc.new {|o| {:controller => 'wiki', :id => o.page.wiki.project_id, :page => o.page.title, :version => o.version}}
|
||||||
|
|
||||||
def text=(plain)
|
def text=(plain)
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
<h3><%= format_activity_day(day) %></h3>
|
<h3><%= format_activity_day(day) %></h3>
|
||||||
<dl>
|
<dl>
|
||||||
<% @events_by_day[day].sort {|x,y| y.event_datetime <=> x.event_datetime }.each do |e| -%>
|
<% @events_by_day[day].sort {|x,y| y.event_datetime <=> x.event_datetime }.each do |e| -%>
|
||||||
<dt class="<%= e.class.name.downcase %>"><span class="time"><%= format_time(e.event_datetime, false) %></span>
|
<dt class="<%= e.event_type %>"><span class="time"><%= format_time(e.event_datetime, false) %></span>
|
||||||
<%= content_tag('span', h(e.project), :class => 'project') if @project.nil? || @project != e.project %> <%= link_to h(truncate(e.event_title, 100)), e.event_url %></dt>
|
<%= content_tag('span', h(e.project), :class => 'project') if @project.nil? || @project != e.project %> <%= link_to h(truncate(e.event_title, 100)), e.event_url %></dt>
|
||||||
<dd><% unless e.event_description.blank? -%>
|
<dd><% unless e.event_description.blank? -%>
|
||||||
<span class="description"><%= format_activity_description(e.event_description) %></span><br />
|
<span class="description"><%= format_activity_description(e.event_description) %></span><br />
|
||||||
|
|
Before Width: | Height: | Size: 259 B After Width: | Height: | Size: 995 B |
After Width: | Height: | Size: 512 B |
After Width: | Height: | Size: 557 B |
After Width: | Height: | Size: 458 B |
After Width: | Height: | Size: 521 B |
After Width: | Height: | Size: 658 B |
After Width: | Height: | Size: 500 B |
After Width: | Height: | Size: 598 B |
After Width: | Height: | Size: 731 B |
After Width: | Height: | Size: 626 B |
|
@ -169,11 +169,21 @@ div#issue-changesets .changeset { border-bottom: 1px solid #ddd; }
|
||||||
div#issue-changesets p { margin-top: 0; margin-bottom: 1em;}
|
div#issue-changesets p { margin-top: 0; margin-bottom: 1em;}
|
||||||
|
|
||||||
div#activity dl { margin-left: 2em; }
|
div#activity dl { margin-left: 2em; }
|
||||||
div#activity dd { margin-bottom: 1em; }
|
div#activity dd { margin-bottom: 1em; padding-left: 18px; }
|
||||||
div#activity dt { margin-bottom: 1px; }
|
div#activity dt { margin-bottom: 1px; padding-left: 20px; line-height: 18px; background-position: 0 50%; background-repeat: no-repeat; }
|
||||||
div#activity dt .time { color: #777; font-size: 80%; }
|
div#activity dt .time { color: #777; font-size: 80%; }
|
||||||
div#activity dd .description { font-style: italic; }
|
div#activity dd .description { font-style: italic; }
|
||||||
div#activity span.project:after { content: " -"; }
|
div#activity span.project:after { content: " -"; }
|
||||||
|
div#activity dt.issue { background-image: url(../images/ticket.png); }
|
||||||
|
div#activity dt.issue-edit { background-image: url(../images/ticket_edit.png); }
|
||||||
|
div#activity dt.issue-closed { background-image: url(../images/ticket_checked.png); }
|
||||||
|
div#activity dt.changeset { background-image: url(../images/changeset.png); }
|
||||||
|
div#activity dt.news { background-image: url(../images/news.png); }
|
||||||
|
div#activity dt.message { background-image: url(../images/message.png); }
|
||||||
|
div#activity dt.reply { background-image: url(../images/comments.png); }
|
||||||
|
div#activity dt.wiki-page { background-image: url(../images/wiki_edit.png); }
|
||||||
|
div#activity dt.attachment { background-image: url(../images/attachment.png); }
|
||||||
|
div#activity dt.document { background-image: url(../images/document.png); }
|
||||||
|
|
||||||
div#roadmap fieldset.related-issues { margin-bottom: 1em; }
|
div#roadmap fieldset.related-issues { margin-bottom: 1em; }
|
||||||
div#roadmap fieldset.related-issues ul { margin-top: 0.3em; margin-bottom: 0.3em; }
|
div#roadmap fieldset.related-issues ul { margin-top: 0.3em; margin-bottom: 0.3em; }
|
||||||
|
|
|
@ -144,7 +144,7 @@ class ProjectsControllerTest < Test::Unit::TestCase
|
||||||
:content => /#{2.days.ago.to_date.day}/,
|
:content => /#{2.days.ago.to_date.day}/,
|
||||||
:sibling => { :tag => "dl",
|
:sibling => { :tag => "dl",
|
||||||
:child => { :tag => "dt",
|
:child => { :tag => "dt",
|
||||||
:attributes => { :class => 'journal' },
|
:attributes => { :class => 'issue-edit' },
|
||||||
:child => { :tag => "a",
|
:child => { :tag => "a",
|
||||||
:content => /(#{IssueStatus.find(2).name})/,
|
:content => /(#{IssueStatus.find(2).name})/,
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,11 +25,12 @@ module Redmine
|
||||||
module ClassMethods
|
module ClassMethods
|
||||||
def acts_as_event(options = {})
|
def acts_as_event(options = {})
|
||||||
return if self.included_modules.include?(Redmine::Acts::Event::InstanceMethods)
|
return if self.included_modules.include?(Redmine::Acts::Event::InstanceMethods)
|
||||||
options[:datetime] ||= 'created_on'
|
options[:datetime] ||= :created_on
|
||||||
options[:title] ||= 'title'
|
options[:title] ||= :title
|
||||||
options[:description] ||= 'description'
|
options[:description] ||= :description
|
||||||
options[:author] ||= 'author'
|
options[:author] ||= :author
|
||||||
options[:url] ||= {:controller => 'welcome'}
|
options[:url] ||= {:controller => 'welcome'}
|
||||||
|
options[:type] ||= self.name.underscore.dasherize
|
||||||
cattr_accessor :event_options
|
cattr_accessor :event_options
|
||||||
self.event_options = options
|
self.event_options = options
|
||||||
send :include, Redmine::Acts::Event::InstanceMethods
|
send :include, Redmine::Acts::Event::InstanceMethods
|
||||||
|
@ -41,11 +42,17 @@ module Redmine
|
||||||
base.extend ClassMethods
|
base.extend ClassMethods
|
||||||
end
|
end
|
||||||
|
|
||||||
%w(datetime title description author).each do |attr|
|
%w(datetime title description author type).each do |attr|
|
||||||
src = <<-END_SRC
|
src = <<-END_SRC
|
||||||
def event_#{attr}
|
def event_#{attr}
|
||||||
option = event_options[:#{attr}]
|
option = event_options[:#{attr}]
|
||||||
option.is_a?(Proc) ? option.call(self) : send(option)
|
if option.is_a?(Proc)
|
||||||
|
option.call(self)
|
||||||
|
elsif option.is_a?(Symbol)
|
||||||
|
send(option)
|
||||||
|
else
|
||||||
|
option
|
||||||
|
end
|
||||||
end
|
end
|
||||||
END_SRC
|
END_SRC
|
||||||
class_eval src, __FILE__, __LINE__
|
class_eval src, __FILE__, __LINE__
|
||||||
|
|