]> source.dussan.org Git - redmine.git/commitdiff
Administrators can edit issue notes.
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Sat, 2 Feb 2008 10:50:31 +0000 (10:50 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Sat, 2 Feb 2008 10:50:31 +0000 (10:50 +0000)
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1105 e93f8b46-1217-0410-a6f0-8f06a7374b81

13 files changed:
app/controllers/issues_controller.rb
app/controllers/journals_controller.rb [new file with mode: 0644]
app/helpers/journals_helper.rb [new file with mode: 0644]
app/models/journal.rb
app/views/issues/_history.rhtml
app/views/journals/_notes_form.rhtml [new file with mode: 0644]
app/views/journals/edit.rjs [new file with mode: 0644]
app/views/journals/update.rjs [new file with mode: 0644]
public/images/delete.png
public/images/edit.png
public/stylesheets/application.css
test/fixtures/journals.yml
test/functional/journals_controller_test.rb [new file with mode: 0644]

index fdece9e1a2c596502aa301b45b927992b00d1d07..dfee538413b3f815414c985590be9bb4aba38539 100644 (file)
@@ -27,6 +27,7 @@ class IssuesController < ApplicationController
   
   cache_sweeper :issue_sweeper, :only => [ :new, :edit, :update, :destroy ]
 
+  helper :journals
   helper :projects
   include ProjectsHelper   
   helper :custom_fields
diff --git a/app/controllers/journals_controller.rb b/app/controllers/journals_controller.rb
new file mode 100644 (file)
index 0000000..b867b4a
--- /dev/null
@@ -0,0 +1,40 @@
+# redMine - project management software
+# Copyright (C) 2006-2008  Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+class JournalsController < ApplicationController
+  layout 'base'
+  before_filter :find_journal
+  
+  def edit
+    if request.post?
+      @journal.update_attributes(:notes => params[:notes]) if params[:notes]
+      respond_to do |format|
+        format.html { redirect_to :controller => 'issues', :action => 'show', :id => @journal.journalized_id }
+        format.js { render :action => 'update' }
+      end
+      return
+    end
+  end
+  
+private
+  def find_journal
+    @journal = Journal.find(params[:id])
+    render_403 and return false unless @journal.editable_by?(User.current)
+  rescue ActiveRecord::RecordNotFound
+    render_404
+  end
+end
diff --git a/app/helpers/journals_helper.rb b/app/helpers/journals_helper.rb
new file mode 100644 (file)
index 0000000..c974464
--- /dev/null
@@ -0,0 +1,37 @@
+# redMine - project management software
+# Copyright (C) 2006-2008  Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+module JournalsHelper
+  def render_notes(journal, options={})
+    content = ''
+    editable = journal.editable_by?(User.current)
+    if editable
+      links = []
+      links << link_to_in_place_notes_editor(image_tag('edit.png'), "journal-#{journal.id}-notes", 
+                                             { :controller => 'journals', :action => 'edit', :id => journal },
+                                                :title => l(:button_edit))
+      content << content_tag('div', links.join(' '), :class => 'contextual')
+    end
+    content << textilizable(journal, :notes)
+    content_tag('div', content, :id => "journal-#{journal.id}-notes", :class => (editable ? 'editable' : nil))
+  end
+  
+  def link_to_in_place_notes_editor(text, field_id, url, options={})
+    onclick = "new Ajax.Request('#{url_for(url)}', {asynchronous:true, evalScripts:true, method:'get'}); return false;"
+    link_to text, '#', options.merge(:onclick => onclick)
+  end
+end
index d02067a9df5c712a8eb6a059ee9a82bf0174d34c..df73084357e7ecfaddd7bd4284cce1c3ff793b95 100644 (file)
@@ -49,4 +49,8 @@ class Journal < ActiveRecord::Base
     c = details.detect {|detail| detail.prop_key == prop}
     c ? c.value : nil
   end
+  
+  def editable_by?(usr)
+    usr && usr.admin?
+  end
 end
index bab37b4fd4431006dbfa1e1edad70ab451a958f2..edfb9b94d9a2dafd200e20675b030e8f660a5bf7 100644 (file)
@@ -8,6 +8,6 @@
           <li><%= show_detail(detail) %></li>
        <% end %>
        </ul>
-       <%= textilizable(journal.notes) unless journal.notes.blank? %>
+       <%= render_notes(journal) unless journal.notes.blank? %>
        <% note_id += 1 %>
 <% end %>
diff --git a/app/views/journals/_notes_form.rhtml b/app/views/journals/_notes_form.rhtml
new file mode 100644 (file)
index 0000000..9baec03
--- /dev/null
@@ -0,0 +1,7 @@
+<% form_remote_tag(:url => {}, :html => { :id => "journal-#{@journal.id}-form" }) do %>
+    <%= text_area_tag :notes, @journal.notes, :class => 'wiki-edit', 
+                                              :rows => (@journal.notes.blank? ? 10 : [[10, @journal.notes.length / 50].max, 100].min) %>
+    <p><%= submit_tag l(:button_save) %>
+    <%= link_to l(:button_cancel), '#', :onclick => "Element.remove('journal-#{@journal.id}-form'); " +
+                                                    "Element.show('journal-#{@journal.id}-notes'); return false;" %></p>
+<% end %>
diff --git a/app/views/journals/edit.rjs b/app/views/journals/edit.rjs
new file mode 100644 (file)
index 0000000..798cb0f
--- /dev/null
@@ -0,0 +1,3 @@
+page.hide "journal-#{@journal.id}-notes"
+page.insert_html :after, "journal-#{@journal.id}-notes",
+                 :partial => 'notes_form'
diff --git a/app/views/journals/update.rjs b/app/views/journals/update.rjs
new file mode 100644 (file)
index 0000000..9da0ebe
--- /dev/null
@@ -0,0 +1,3 @@
+page.replace "journal-#{@journal.id}-notes", render_notes(@journal)
+page.show "journal-#{@journal.id}-notes"
+page.remove "journal-#{@journal.id}-form"
index 137baa68eac092124487651cd173a02c67f5a940..a1af31d8334a2d5ee776711876b58dd6c9f27581 100644 (file)
Binary files a/public/images/delete.png and b/public/images/delete.png differ
index 0275d91e4f0835a14c4afcf635cd7ec4def637cc..1b6a9e31539358ed27fd3cd99f0effec145da1f8 100644 (file)
Binary files a/public/images/edit.png and b/public/images/edit.png differ
index ec3ae159d060494db08eaa30582ec3d58c4dc2e0..eb4e855b43b232fd64413ff501b8bdc540eb4e11 100644 (file)
@@ -122,7 +122,7 @@ div.square {
  width: .6em; height: .6em;
 }
 
-.contextual {float:right; white-space: nowrap; line-height:1.4em;margin-top:5px;font-size:0.9em;}
+.contextual {float:right; white-space: nowrap; line-height:1.4em;margin-top:5px; padding-left: 10px; font-size:0.9em;}
 .contextual input {font-size:0.9em;}
 
 .splitcontentleft{float:left; width:49%;}
@@ -227,7 +227,6 @@ text-align:center;
 padding:0.6em;
 z-index:100;
 filter:alpha(opacity=50);
--moz-opacity:0.5;
 opacity: 0.5;
 -khtml-opacity: 0.5;
 }
index 0de938168ef40da39d755cd4c61bab8b6bbe473a..169713fc5984f0af2b5b05f4e2a0f8d71f4e0ce6 100644 (file)
@@ -6,3 +6,11 @@ journals_001:
   journalized_type: Issue\r
   user_id: 1\r
   journalized_id: 1\r
+journals_002: \r
+  created_on: <%= 1.days.ago.to_date.to_s(:db) %>\r
+  notes: "Some notes"\r
+  id: 2\r
+  journalized_type: Issue\r
+  user_id: 2\r
+  journalized_id: 1\r
+  
\ No newline at end of file
diff --git a/test/functional/journals_controller_test.rb b/test/functional/journals_controller_test.rb
new file mode 100644 (file)
index 0000000..f231d10
--- /dev/null
@@ -0,0 +1,51 @@
+# redMine - project management software
+# Copyright (C) 2006-2008  Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+require File.dirname(__FILE__) + '/../test_helper'
+require 'journals_controller'
+
+# Re-raise errors caught by the controller.
+class JournalsController; def rescue_action(e) raise e end; end
+
+class JournalsControllerTest < ActionController::TestCase
+  fixtures :projects, :users, :members, :roles, :issues, :journals, :journal_details, :enabled_modules
+  
+  def setup
+    @controller = JournalsController.new
+    @request    = ActionController::TestRequest.new
+    @response   = ActionController::TestResponse.new
+    User.current = nil
+  end
+  
+  def test_get_edit
+    @request.session[:user_id] = 1
+    xhr :get, :edit, :id => 2
+    assert_response :success
+    assert_select_rjs :insert, :after, 'journal-2-notes' do
+      assert_select 'form[id=journal-2-form]'
+      assert_select 'textarea'
+    end
+  end
+  
+  def test_post_edit
+    @request.session[:user_id] = 1
+    xhr :post, :edit, :id => 2, :notes => 'Updated notes'
+    assert_response :success
+    assert_select_rjs :replace, 'journal-2-notes'
+    assert_equal 'Updated notes', Journal.find(2).notes
+  end
+end