From 6d2a89142af235b5d0a9e30350859fb99ac665f3 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Sat, 12 Apr 2008 16:54:14 +0000 Subject: [PATCH] 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 --- app/models/journal.rb | 1 + app/models/message.rb | 1 + app/models/wiki_content.rb | 1 + app/views/projects/activity.rhtml | 2 +- public/images/attachment.png | Bin 259 -> 995 bytes public/images/changeset.png | Bin 0 -> 512 bytes public/images/comments.png | Bin 0 -> 557 bytes public/images/document.png | Bin 0 -> 458 bytes public/images/message.png | Bin 0 -> 521 bytes public/images/news.png | Bin 0 -> 658 bytes public/images/ticket.png | Bin 0 -> 500 bytes public/images/ticket_checked.png | Bin 0 -> 598 bytes public/images/ticket_edit.png | Bin 0 -> 731 bytes public/images/wiki_edit.png | Bin 0 -> 626 bytes public/stylesheets/application.css | 14 +++++++++++-- test/functional/projects_controller_test.rb | 2 +- .../acts_as_event/lib/acts_as_event.rb | 19 ++++++++++++------ 17 files changed, 30 insertions(+), 10 deletions(-) create mode 100644 public/images/changeset.png create mode 100644 public/images/comments.png create mode 100644 public/images/document.png create mode 100644 public/images/message.png create mode 100644 public/images/news.png create mode 100644 public/images/ticket.png create mode 100644 public/images/ticket_checked.png create mode 100644 public/images/ticket_edit.png create mode 100644 public/images/wiki_edit.png diff --git a/app/models/journal.rb b/app/models/journal.rb index 7c5e3d3bf..1376d349e 100644 --- a/app/models/journal.rb +++ b/app/models/journal.rb @@ -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})" : '') }, :description => :notes, :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}"}} def save diff --git a/app/models/message.rb b/app/models/message.rb index 12b1cd990..a18d126c9 100644 --- a/app/models/message.rb +++ b/app/models/message.rb @@ -28,6 +28,7 @@ class Message < ActiveRecord::Base :date_column => 'created_on' acts_as_event :title => Proc.new {|o| "#{o.board.name}: #{o.subject}"}, :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}} attr_protected :locked, :sticky diff --git a/app/models/wiki_content.rb b/app/models/wiki_content.rb index 13915c274..724354ad6 100644 --- a/app/models/wiki_content.rb +++ b/app/models/wiki_content.rb @@ -32,6 +32,7 @@ class WikiContent < ActiveRecord::Base acts_as_event :title => Proc.new {|o| "#{l(:label_wiki_edit)}: #{o.page.title} (##{o.version})"}, :description => :comments, :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}} def text=(plain) diff --git a/app/views/projects/activity.rhtml b/app/views/projects/activity.rhtml index 0cf7a5000..c2f2f9ebd 100644 --- a/app/views/projects/activity.rhtml +++ b/app/views/projects/activity.rhtml @@ -6,7 +6,7 @@

<%= format_activity_day(day) %>

<% @events_by_day[day].sort {|x,y| y.event_datetime <=> x.event_datetime }.each do |e| -%> -
<%= format_time(e.event_datetime, false) %> +
<%= format_time(e.event_datetime, false) %> <%= 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 %>
<% unless e.event_description.blank? -%> <%= format_activity_description(e.event_description) %>
diff --git a/public/images/attachment.png b/public/images/attachment.png index eea26921b695b377e2a51cbbb78f638514565a32..b7ce3c445ec04fa8d16a939340d070752937354a 100644 GIT binary patch literal 995 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJdx@v7EBg%=9syGYj%hhlfI^%F z9+AZi3|t>Tn9*sC$qb+%OS+@4BLl<6e(pbstPBjy3;{kNu0cUT$;rvp)zw?KZasGF z*tv7(u3fu!@7}%t3=IEA!Dt8!_Yg2}%9RCWn35pBV3=PSg8eImfP#UZE{-7;w|dVz zavd<>aJg9M!}h-Z(YA|AG8YDv|5t44xc)%e!;WE6F>}W~^9F%yc@l3oabC?}owatW wV9zVYH`jy8ny#$1%Ac_MbKAL}A7jokHqT>Qc4xX;3ea!{Pgg&ebxsLQ09njHQvd(} delta 230 zcmaFN-ppju8Q|y6%O%Cdz`(%k>ERLtqXw0>k|_bj~qF2{rdF_7cK+`2XET6>CmA==g*(Nd-pET z060kP}1CjdcE5<}x94pxPedRJH%adGQ3itM&1 zUd`B%Ecoug0gfkAI1CI#G+L~gOf^+onk;-4o^;@2UOcIj;RKJPqXHwtkrJ*2CQBj` PLH2pN`njxgN@xNAJ*rGm diff --git a/public/images/changeset.png b/public/images/changeset.png new file mode 100644 index 0000000000000000000000000000000000000000..67de2c6ccbeac17742f56cf7391e72b2bf5033ba GIT binary patch literal 512 zcmV+b0{{JqP)CQDsH?WF>AIFt zQuJ}i;w2$ZUU#3SZ6RY0Gw;kZ&ol1~2ky^QZ(fom$=jNJZt!z7w_pH~wdQ;R)Gh%BbQFCx+Nm!4SuS-vkr`vhhrX zM*>w%e+v~?m@q~ImPAgtLkR_3U<2F8LP3W5=LJ*ZN|S5p#sf4YFr$p~Q~Z*0Ngxf2 zjk#J#<7EAlhzlrV53~GF&pIzcCN_lz9@05UeoUXiK%N z#x+4o*i_c|6_Uu1+&TIho?3@y4k-#b8Y_o94zW*B3a1ne2-Y5s0uke$$|@=}OP-i= zNYZQA=>PrZu0MfSL=b8UhD_={W4IY1{b{)U)*gc45xtL%IYLY&hF;d`@GzI&7H&D# zh;z_BX$#hqh@q?AY3sJTod2%*Yd)_>YM0#q&ixGuh+PQsneK)F0000kO-!8JjERGZgNx4o8zwI5pnrkJT^AW7B+k01lLkoCLBu@bfRhnJSkT}{ z5cwz-C?AEk;`Q7|NyO0V@Jst%?>X<@)8|?6hNplZoH}p}R=_wBd4A);huvr*D{8ta zv>weaRZy(zA{a{x)NMK$oUyoq;&Q_jA9Yid>V_!Q3{lkDazCTg+2GL8fKO$yVv7pZ zw#ZdlB3o|B^q?JFdAt+nq80!As0d}1Z|KFR(*lEh^G}{es&~_I}wY;n4d5jAs0d}gj@(+ z%6*K*29I(Myv%_UPWDD&5qS@s3~ZAJGDH vT*SlN0ce3)r#d%-F%SaNZe6;L@E^Vb!Ji3~dec0&00000NkvXXu0mjflI-*P literal 0 HcmV?d00001 diff --git a/public/images/document.png b/public/images/document.png new file mode 100644 index 0000000000000000000000000000000000000000..d00b9b2f4d99145ef74ddbb5624a1afbae422a4e GIT binary patch literal 458 zcmV;*0X6=KP)WdL(wZ7v`&G9Y1gaxNe;FfceEF*rIiH###lAS*C2Ffi(UX{-PM00(qQ zO+^RT1Pl--3*6r22LJ#732;bRa{vGf5&!@T5&_cPe*6Fc00d`2O+f$vv5yP$*NQ{I&x=sL=2S*bdywvg|lc*L6+P{8k`$Oxa>e$BQNC-|+n@aKAKBM^5y{63 z&~{MlW24U9!M#W^P1DMWdLnuaxNe_AYpcLE+8^6FgPGFGCDLjIx#sQD=;xIFl)^P$N&HU2XskI zMF-df2?{V1>|QTZ00009a7bBm000XT000XT0n*)m`~Uy|1ZP1_K>z@;j|==^1poj6 zUr9tkRCwBB{Qv(y11W%sB-KE`0>odw|C+z+`iUDafb75juvn<8Ae`*3B_YHO;sBl0 zwfgLe1Gj$v`3pqHqoX|KI-%|Nb!m$-nA*0}m(b+s{A#0eu6u?AITl&i@c~5DknBAd|lQ_|3z?3ev#A z#$u!*w))VWP&*Zn6B&V?1R{pV@BhF1`d^ZtQH+;q%c%#SzWr1X=L3o}0z(QC567-Q z2Zu7q9#=!TWDhMMoVs((xWgD$)EF}_d~6|E9cYZTvaqk~9`i&BW97*P>v z@lDk@Xl;b%^t%HQ(pa0tz@5kM+;h(T<_N&ip(~wEOB0DiJ{F5{;c!^;_xs1dg=jRo z3WY*KAQ0euKA+@K0;yC=8jr^rydICoSglqd_{QV$a4whY=|O=zI1-7hhr=Og4T=Ck z5O8*O_S@lbByBd^lf44TWKv2W^LH=<&(F_6aj;k{L?;9b7K?>5nM{(sFqO3)3}ZrBV@HFj%2boa`NCnylwer*m5<6vU%rtuL2L)a!Nd zJP*qIOD>n6?i;$@!fv-8Tdme9+l?I|%bm;R7`!3)<-bP$-VIIGvB6*%vHYw+%Da)t sWG@c=a1S2nbh=||dPK1BKbT#A0Qk`HN6lbD;Q#;t07*qoM6N<$f^gU==>Px# literal 0 HcmV?d00001 diff --git a/public/images/ticket.png b/public/images/ticket.png new file mode 100644 index 0000000000000000000000000000000000000000..244e6ca045c50a130086ac388b560a12761544b4 GIT binary patch literal 500 zcmV z!-sF!^gVb+8rtpyctW0#N6uWni0LCt_6PoOdbjll_d4>B|?abUmpo8>v>h}Zj|Ya;Eu#qwvU1IVc9khP8VrtAsT2=e83P~$#!xXbw)n}FlPSEe7Hq1uCb zR8w;xqmBrUgA^pnkB=O@-lq0DPz$ay0yh_~I_IDpzxRb(4=Iy9CT||k!08w)Pe>W4 zElmH8fF;68$GMwZ#7{4ozI(ySrR%I+xs4-G1q^UxnUV7rlf9>Rn&_6Wike0000(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ-+(|@1RCwB?lRaxyK@f(Yy?$##EF`736yY>VVv#f|;;j_4idY2ELa;D`h#*Ok z%FaI^2*J)q5D`H{Gyx?6!NS5=2oj9OkeKM*J!d~&i*s@{it!8>AbC|K~0p0g8Xy+90X%Z4_nOJJZ{0Kw9Oa~mVb zm*?0ep=8Tl15yGE;*Wx9>_Fbuq!0qBm?x~hfs`W^rA-AShmu3dvVGqfl5f`t#2g4H zIgqcQzhQ?`8x&Ac6G8a7ScbgLvn3^0iC9RsbP|4T6iCtGW?vEVj}Qw`Ai5QHHhW9Y z$)RXL33cB`EIqqUY|ldUBzdk*PNL{aI5{pqyg@T-A;kXdB!gr9YOK|}`^YeUd4c7ZcS!Qw z{QQAt)?(!Kdz2g_GhaF|z|%+10gg2Q2oAHQ!JfkxQP|6s$G1C|n^}u%GxN3Z)cEuZ zBZ-Ckr{o_<^wK(Yy!u9_7Ov9YyqN~a`n4uf2X`KEvoSS3Z7Qf1t{O)F koCBkM8W`<6T6gw)03XG3+w)>+-v9sr07*qoM6N<$f|$Mh@Bjb+ literal 0 HcmV?d00001 diff --git a/public/images/ticket_edit.png b/public/images/ticket_edit.png new file mode 100644 index 0000000000000000000000000000000000000000..291bfc764709a7e595050c1ed43b675f7af29c56 GIT binary patch literal 731 zcmV<10wn#3P)IABYLga|n=&i1C^Ll$f?5eeicnA#1rn`Vw5g!~Ai_;Six%mol@YXv zpr{DSk_4&HqEGXqMs21Urx~61zW2TFJuNiKk5=8qxp3h5o#%3&zLVh3I}!7>rV zy0cveL@eMS{2@4@V#Ifsc!DulJ&DQpf%Op4v$xe?6=D@)U81WGV*SDrfWQL`Vikx# zC;D5g5L>`a_LDBIB75he%=~zQqY~|505hGQwLEXKi?wPF;-YiIct4j@Rd<3|O#|8C zTHZhC><9zcK%qYMV7$)|Xb?l7a+FlZ5nDj##-OBu%J?oaL+^+>n(`G@l&xA93j+jh z8k0*q$O-j?Nca8_zy`4G;prD4e1YrH!W$vy!p#G|OpS~5?22&Z3S zwVIa$XW=s4>S&U~r@Q#jeV*}=UW(V%W0I-yifB=D-Gvu#7REiau<_yZq|tBhQd7T= z($ZQI{e#oW)d!XmFX`aO{z|uT!vfZWdLnuaxNe_AYpcLE+8^6FgPGFGCDLhIx{&SD=;xIFfAR@hyVZp2XskI zMF-df2?{SO2?m){00009a7bBm000XT000XT0n*)m`~Uy|1ZP1_K>z@;j|==^1poj6 z$Vo&&RCwBB{Qv(y11W$7h@U)p^77@&zkmN?N{fk!$;rtvF)^WN0IJr}(P3d>K~w$b z&!1DLP5~LndO(VRW-~K0|NQwAuI}Hzf4_eH5*8L#5`OjN*tC0>bickiC}))=sNv57 z@dG0xBhUt*Iv^Wp7*G%>^8LkT=9i}>bYu7x4L{shzq@~hF;D}t8-PlIdVsb8HT-+O z@Au!ELaNs9?p|kO{Kd;B!NDU0brJ*s)j{+CUHI?g3AW!?`IX#%K3~Dc#rW{TjbDG5 zRQ&2e3eY?Xbjh!`NB@1;&#&zD M07*qoM6N<$g0&13`~Uy| literal 0 HcmV?d00001 diff --git a/public/stylesheets/application.css b/public/stylesheets/application.css index 7c3e0fde7..682e95dde 100644 --- a/public/stylesheets/application.css +++ b/public/stylesheets/application.css @@ -169,11 +169,21 @@ div#issue-changesets .changeset { border-bottom: 1px solid #ddd; } div#issue-changesets p { margin-top: 0; margin-bottom: 1em;} div#activity dl { margin-left: 2em; } -div#activity dd { margin-bottom: 1em; } -div#activity dt { margin-bottom: 1px; } +div#activity dd { margin-bottom: 1em; padding-left: 18px; } +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 dd .description { font-style: italic; } 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 ul { margin-top: 0.3em; margin-bottom: 0.3em; } diff --git a/test/functional/projects_controller_test.rb b/test/functional/projects_controller_test.rb index 75b4673a1..eb5795152 100644 --- a/test/functional/projects_controller_test.rb +++ b/test/functional/projects_controller_test.rb @@ -144,7 +144,7 @@ class ProjectsControllerTest < Test::Unit::TestCase :content => /#{2.days.ago.to_date.day}/, :sibling => { :tag => "dl", :child => { :tag => "dt", - :attributes => { :class => 'journal' }, + :attributes => { :class => 'issue-edit' }, :child => { :tag => "a", :content => /(#{IssueStatus.find(2).name})/, } diff --git a/vendor/plugins/acts_as_event/lib/acts_as_event.rb b/vendor/plugins/acts_as_event/lib/acts_as_event.rb index a0d1822ad..d7f437a5e 100644 --- a/vendor/plugins/acts_as_event/lib/acts_as_event.rb +++ b/vendor/plugins/acts_as_event/lib/acts_as_event.rb @@ -25,11 +25,12 @@ module Redmine module ClassMethods def acts_as_event(options = {}) return if self.included_modules.include?(Redmine::Acts::Event::InstanceMethods) - options[:datetime] ||= 'created_on' - options[:title] ||= 'title' - options[:description] ||= 'description' - options[:author] ||= 'author' + options[:datetime] ||= :created_on + options[:title] ||= :title + options[:description] ||= :description + options[:author] ||= :author options[:url] ||= {:controller => 'welcome'} + options[:type] ||= self.name.underscore.dasherize cattr_accessor :event_options self.event_options = options send :include, Redmine::Acts::Event::InstanceMethods @@ -41,11 +42,17 @@ module Redmine base.extend ClassMethods end - %w(datetime title description author).each do |attr| + %w(datetime title description author type).each do |attr| src = <<-END_SRC def event_#{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_SRC class_eval src, __FILE__, __LINE__ -- 2.39.5