]> source.dussan.org Git - redmine.git/commitdiff
Merged IssuesController #edit and #update into a single actions.
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Sat, 9 Feb 2008 16:11:18 +0000 (16:11 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Sat, 9 Feb 2008 16:11:18 +0000 (16:11 +0000)
Users with 'edit issues' permission can now update any property including custom fields when adding a note or changing the status (#519, #581, #587).

git-svn-id: http://redmine.rubyforge.org/svn/trunk@1129 e93f8b46-1217-0410-a6f0-8f06a7374b81

37 files changed:
app/controllers/issues_controller.rb
app/views/issues/_edit.rhtml [new file with mode: 0644]
app/views/issues/_form.rhtml
app/views/issues/_form_update.rhtml [new file with mode: 0644]
app/views/issues/_update.rhtml [deleted file]
app/views/issues/context_menu.rhtml
app/views/issues/edit.rhtml
app/views/issues/new.rhtml
app/views/issues/show.rhtml
app/views/issues/update.rhtml [deleted file]
lang/bg.yml
lang/cs.yml
lang/de.yml
lang/en.yml
lang/es.yml
lang/fi.yml
lang/fr.yml
lang/he.yml
lang/it.yml
lang/ja.yml
lang/ko.yml
lang/lt.yml
lang/nl.yml
lang/pl.yml
lang/pt-br.yml
lang/pt.yml
lang/ro.yml
lang/ru.yml
lang/sr.yml
lang/sv.yml
lang/zh-tw.yml
lang/zh.yml
lib/redmine.rb
public/images/note.png [deleted file]
public/stylesheets/application.css
test/functional/issues_controller_test.rb
test/integration/issues_test.rb

index b722d9340cbc705b9e6bd976fb2d7bf89341ef38..dbb49405c54c8c2ead91372ed1675d520be5b3dc 100644 (file)
@@ -25,7 +25,7 @@ class IssuesController < ApplicationController
   before_filter :find_optional_project, :only => [:index, :changes]
   accept_key_auth :index, :changes
   
-  cache_sweeper :issue_sweeper, :only => [ :new, :edit, :update, :destroy ]
+  cache_sweeper :issue_sweeper, :only => [ :new, :edit, :destroy ]
 
   helper :journals
   helper :projects
@@ -85,10 +85,12 @@ class IssuesController < ApplicationController
   end
   
   def show
-    @custom_values = @issue.custom_values.find(:all, :include => :custom_field, :order => "#{CustomField.table_name}.position")
+    @custom_values = @project.custom_fields_for_issues(@issue.tracker).collect { |x| @issue.custom_values.find_by_custom_field_id(x.id) || CustomValue.new(:custom_field => x, :customized => @issue) }
     @journals = @issue.journals.find(:all, :include => [:user, :details], :order => "#{Journal.table_name}.created_on ASC")
-    @status_options = @issue.new_statuses_allowed_to(User.current)
+    @allowed_statuses = @issue.new_statuses_allowed_to(User.current)
+    @edit_allowed = User.current.allowed_to?(:edit_issues, @project)
     @activities = Enumeration::get_values('ACTI')
+    @priorities = Enumeration::get_values('IPRI')
     respond_to do |format|
       format.html { render :template => 'issues/show.rhtml' }
       format.pdf  { send_data(render(:template => 'issues/show.rfpdf', :layout => false), :type => 'application/pdf', :filename => "#{@project.identifier}-#{@issue.id}.pdf") }
@@ -140,48 +142,33 @@ class IssuesController < ApplicationController
     render :layout => !request.xhr?
   end
   
+  # Attributes that can be updated on workflow transition (without :edit permission)
+  # TODO: make it configurable (at least per role)
+  UPDATABLE_ATTRS_ON_TRANSITION = %w(status_id assigned_to_id fixed_version_id done_ratio) unless const_defined?(:UPDATABLE_ATTRS_ON_TRANSITION)
+  
   def edit
+    @allowed_statuses = @issue.new_statuses_allowed_to(User.current)
+    @activities = Enumeration::get_values('ACTI')
     @priorities = Enumeration::get_values('IPRI')
     @custom_values = []
+    @edit_allowed = User.current.allowed_to?(:edit_issues, @project)
     if request.get?
       @custom_values = @project.custom_fields_for_issues(@issue.tracker).collect { |x| @issue.custom_values.find_by_custom_field_id(x.id) || CustomValue.new(:custom_field => x, :customized => @issue) }
     else
-      begin
-        journal = @issue.init_journal(User.current)
-        # Retrieve custom fields and values
-        if params["custom_fields"]
-          @custom_values = @project.custom_fields_for_issues(@issue.tracker).collect { |x| CustomValue.new(:custom_field => x, :customized => @issue, :value => params["custom_fields"][x.id.to_s]) }
-          @issue.custom_values = @custom_values
-        end
-        @issue.attributes = params[:issue]
-        if @issue.save
-          flash[:notice] = l(:notice_successful_update)
-          Mailer.deliver_issue_edit(journal) if Setting.notified_events.include?('issue_updated')
-          redirect_to(params[:back_to] || {:action => 'show', :id => @issue})
-        end
-      rescue ActiveRecord::StaleObjectError
-        # Optimistic locking exception
-        flash[:error] = l(:notice_locking_conflict)
+      @notes = params[:notes]
+      journal = @issue.init_journal(User.current, @notes)
+      # User can change issue attributes only if he has :edit permission or if a workflow transition is allowed
+      if (@edit_allowed || !@allowed_statuses.empty?) && params[:issue]
+        attrs = params[:issue].dup
+        attrs.delete_if {|k,v| !UPDATABLE_ATTRS_ON_TRANSITION.include?(k) } unless @edit_allowed
+        attrs.delete(:status_id) unless @allowed_statuses.detect {|s| s.id.to_s == attrs[:status_id].to_s}
+        @issue.attributes = attrs
+      end
+      # Update custom fields if user has :edit permission
+      if @edit_allowed && params[:custom_fields]
+        @custom_values = @project.custom_fields_for_issues(@issue.tracker).collect { |x| CustomValue.new(:custom_field => x, :customized => @issue, :value => params["custom_fields"][x.id.to_s]) }
+        @issue.custom_values = @custom_values
       end
-    end                
-  end
-  
-  # Attributes that can be updated on workflow transition
-  # TODO: make it configurable (at least per role)
-  UPDATABLE_ATTRS_ON_TRANSITION = %w(status_id assigned_to_id fixed_version_id done_ratio) unless const_defined?(:UPDATABLE_ATTRS_ON_TRANSITION)
-  
-  def update
-    @status_options = @issue.new_statuses_allowed_to(User.current)
-    @activities = Enumeration::get_values('ACTI')
-    journal = @issue.init_journal(User.current, params[:notes])
-    # User can change issue attributes only if a workflow transition is allowed
-    if !@status_options.empty? && params[:issue]
-      attrs = params[:issue].dup
-      attrs.delete_if {|k,v| !UPDATABLE_ATTRS_ON_TRANSITION.include?(k) }
-      attrs.delete(:status_id) unless @status_options.detect {|s| s.id.to_s == attrs[:status_id].to_s}
-      @issue.attributes = attrs
-    end
-    if request.post?
       attachments = attach_files(@issue, params[:attachments])
       attachments.each {|a| journal.details << JournalDetail.new(:property => 'attachment', :prop_key => a.id, :value => a.filename)}
       if @issue.save
@@ -243,7 +230,7 @@ class IssuesController < ApplicationController
   def preview
     issue = Issue.find_by_id(params[:id])
     @attachements = issue.attachments if issue
-    @text = (params[:issue] ? params[:issue][:description] : nil) || params[:notes]
+    @text = params[:notes] || (params[:issue] ? params[:issue][:description] : nil)
     render :partial => 'common/preview'
   end
   
diff --git a/app/views/issues/_edit.rhtml b/app/views/issues/_edit.rhtml
new file mode 100644 (file)
index 0000000..0f843e8
--- /dev/null
@@ -0,0 +1,39 @@
+<% labelled_tabular_form_for :issue, @issue,
+                             :url => {:action => 'edit', :id => @issue},
+                             :html => {:id => 'issue-form',
+                                       :multipart => true} do |f| %>
+    <%= error_messages_for 'issue' %>
+    <div class="box">
+    <% if @edit_allowed || !@allowed_statuses.empty? %>
+        <fieldset>
+        <legend><%= l(:label_change_properties) %>
+        <% if !@issue.new_record? && !@issue.errors.any? && @edit_allowed %>
+        <small>(<%= link_to l(:label_more), {}, :onclick => 'Effect.toggle("issue_descr_fields", "appear", {duration:0.3}); return false;' %>)</small>
+        <% end %>
+        </legend>
+        <%= render :partial => (@edit_allowed ? 'form' : 'form_update'), :locals => {:f => f} %>
+        </fieldset>
+    <% end %>
+    
+    <fieldset><legend><%= l(:field_notes) %></legend>
+    <%= text_area_tag 'notes', @notes, :cols => 60, :rows => 10, :class => 'wiki-edit' %>
+    <%= wikitoolbar_for 'notes' %>
+    
+    <p id="attachments_p"><label><%=l(:label_attachment_new)%>
+    <%= image_to_function 'add.png', 'addFileField();return false;' %></label>
+    <%= file_field_tag 'attachments[]', :size => 30  %> <em>(<%= l(:label_max_size) %>: <%= number_to_human_size(Setting.attachment_max_size.to_i.kilobytes) %>)</em></p>
+    </fieldset>
+    </div>
+    
+    <%= f.hidden_field :lock_version %>
+    <%= submit_tag l(:button_submit) %>
+    <%= link_to_remote l(:label_preview), 
+                       { :url => { :controller => 'issues', :action => 'preview', :id => @issue },
+                         :method => 'post',
+                         :update => 'preview',
+                         :with => 'Form.serialize("issue-form")',
+                         :complete => "location.hash='preview'"
+                       }, :accesskey => accesskey(:preview) %>
+<% end %>
+
+<div id="preview" class="wiki"></div>
index d11cea84ce0a717a7bf773cabc0b409ddf36cf53..6a4cd0f5fb3fa6335bc36f787c52676966532b0d 100644 (file)
@@ -1,6 +1,3 @@
-<%= error_messages_for 'issue' %>
-<div class="box">
-
 <% if @issue.new_record? %>
 <p><%= f.select :tracker_id, @project.trackers.collect {|t| [t.name, t.id]}, :required => true %></p>
 <%= observe_field :issue_tracker_id, :url => { :action => :new },
@@ -8,15 +5,17 @@
                                      :with => "Form.serialize('issue-form')" %>
 <% end %>
 
+<div id="issue_descr_fields" <%= 'style="display:none"' unless @issue.new_record? || @issue.errors.any? %>>
 <p><%= f.text_field :subject, :size => 80, :required => true %></p>
 <p><%= f.text_area :description, :required => true,
                    :cols => 60,
                    :rows => (@issue.description.blank? ? 10 : [[10, @issue.description.length / 50].max, 100].min),
                    :accesskey => accesskey(:edit),
                    :class => 'wiki-edit' %></p>
+</div>
 
 <div class="splitcontentleft">
-<% if @issue.new_record? %>
+<% if @issue.new_record? || @allowed_statuses %>
 <p><%= f.select :status_id, (@allowed_statuses.collect {|p| [p.name, p.id]}), :required => true %></p>
 <% else %>
 <p><label><%= l(:field_status) %></label> <%= @issue.status.name %></p>
@@ -49,7 +48,6 @@
 <%= image_to_function "add.png", "addFileField();return false" %></label>
 <%= file_field_tag 'attachments[]', :size => 30  %> <em>(<%= l(:label_max_size) %>: <%= number_to_human_size(Setting.attachment_max_size.to_i.kilobytes) %>)</em></p>
 <% end %>
-</div>
 
 <%= wikitoolbar_for 'issue_description' %>
 
diff --git a/app/views/issues/_form_update.rhtml b/app/views/issues/_form_update.rhtml
new file mode 100644 (file)
index 0000000..25e81a7
--- /dev/null
@@ -0,0 +1,10 @@
+<div class="splitcontentleft">
+<p><%= f.select :status_id, (@allowed_statuses.collect {|p| [p.name, p.id]}), :required => true %></p>
+<p><%= f.select :assigned_to_id, (@issue.assignable_users.collect {|m| [m.name, m.id]}), :include_blank => true %></p>
+</div>
+<div class="splitcontentright">
+<p><%= f.select :done_ratio, ((0..10).to_a.collect {|r| ["#{r*10} %", r*10] }) %></p>
+<%= content_tag('p', f.select(:fixed_version_id, 
+                          (@project.versions.sort.collect {|v| [v.name, v.id]}),
+                          { :include_blank => true })) unless @project.versions.empty? %>
+</div>
diff --git a/app/views/issues/_update.rhtml b/app/views/issues/_update.rhtml
deleted file mode 100644 (file)
index 49d1473..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-<% labelled_tabular_form_for(:issue, @issue, :url => {:action => 'update', :id => @issue},
-                                             :html => {:multipart => true,
-                                                       :id => 'issue-form'}) do |f| %>
-
-<div class="box">
-<% unless @status_options.empty? %>
-<%= f.hidden_field :lock_version %>
-<fieldset><legend><%= l(:label_change_properties) %></legend>
-    <div class="splitcontentleft">
-    <p><%= f.select :status_id, (@status_options.collect {|p| [p.name, p.id]}), :required => true %></p>
-    <p><%= f.select :assigned_to_id, (@issue.assignable_users.collect {|m| [m.name, m.id]}), :include_blank => true %></p>
-    </div>
-    <div class="splitcontentright">
-    <p><%= f.select :done_ratio, ((0..10).to_a.collect {|r| ["#{r*10} %", r*10] }) %></p>
-    <p><%= f.select :fixed_version_id, (@project.versions.sort.collect {|v| [v.name, v.id]}), { :include_blank => true } %></p>
-    </div>
-</fieldset>
-<% end%>
-<% if authorize_for('timelog', 'edit') %>
-<fieldset><legend><%= l(:button_log_time) %></legend>
-    <% fields_for :time_entry, @time_entry, { :builder => TabularFormBuilder, :lang => current_language} do |time_entry| %>
-    <div class="splitcontentleft">
-    <p><%= time_entry.text_field :hours, :size => 6, :label => :label_spent_time %> <%= l(:field_hours) %></p>
-    </div>
-    <div class="splitcontentright">
-    <p><%= time_entry.text_field :comments, :size => 40 %></p>
-    <p><%= time_entry.select :activity_id, (@activities.collect {|p| [p.name, p.id]}) %></p>
-    </div>
-    <% end %>
-</fieldset>
-<% end %>
-
-<fieldset><legend><%= l(:field_notes) %></legend>
-<%= text_area_tag 'notes', @notes, :cols => 60, :rows => 10, :class => 'wiki-edit' %>
-<%= wikitoolbar_for 'notes' %>
-
-<p id="attachments_p"><label><%=l(:label_attachment_new)%>
-<%= image_to_function "add.png", "addFileField();return false" %></label>
-<%= file_field_tag 'attachments[]', :size => 30  %> <em>(<%= l(:label_max_size) %>: <%= number_to_human_size(Setting.attachment_max_size.to_i.kilobytes) %>)</em></p>
-</fieldset>
-</div>
-
-<%= submit_tag l(:button_submit) %>
-<%= link_to_remote l(:label_preview), 
-                   { :url => { :controller => 'issues', :action => 'preview', :id => @issue },
-                     :method => 'post',
-                     :update => 'preview',
-                     :with => "Form.serialize('issue-form')",
-                     :complete => "window.location.hash='preview'"
-                   }, :accesskey => accesskey(:preview) %> |
-<%= toggle_link l(:button_cancel), 'update' %>
-<% end %>
-
-<div id="preview" class="wiki"></div>
index 9691a7713cb121e82ddc7dd8fff472f225ce7dca..46b177067d5a2dfd8143cdf7204ea1090cb23e3a 100644 (file)
@@ -6,7 +6,7 @@
                <a href="#" class="submenu" onclick="return false;"><%= l(:field_status) %></a>
                <ul>
                <% @statuses.each do |s| %>
-                   <li><%= context_menu_link s.name, {:controller => 'issues', :action => 'update', :id => @issue, :issue => {:status_id => s}},
+                   <li><%= context_menu_link s.name, {:controller => 'issues', :action => 'edit', :id => @issue, :issue => {:status_id => s}},
                                              :selected => (s == @issue.status), :disabled => !(@allowed_statuses.include?(s)) %></li>
                <% end %>
                </ul>
                <a href="#" class="submenu"><%= l(:field_assigned_to) %></a>
                <ul>
                <% @assignables.each do |u| %>
-                   <li><%= context_menu_link u.name, {:controller => 'issues', :action => 'update', :id => @issue, :issue => {:assigned_to_id => u}, :back_to => back_to}, :method => :post,
+                   <li><%= context_menu_link u.name, {:controller => 'issues', :action => 'edit', :id => @issue, :issue => {:assigned_to_id => u}, :back_to => back_to}, :method => :post,
                                              :selected => (u == @issue.assigned_to), :disabled => !@can[:assign] %></li>
                <% end %>
-                   <li><%= context_menu_link l(:label_nobody), {:controller => 'issues', :action => 'update', :id => @issue, :issue => {:assigned_to_id => nil}, :back_to => back_to}, :method => :post,
+                   <li><%= context_menu_link l(:label_nobody), {:controller => 'issues', :action => 'edit', :id => @issue, :issue => {:assigned_to_id => nil}, :back_to => back_to}, :method => :post,
                                              :selected => @issue.assigned_to.nil?, :disabled => !@can[:assign] %></li>
                </ul>
        </li>
index 1577216edeea82f0761a7d689626453ce5d9b63e..97f26a205558e4d5c35a1246a8a43573c55ee960 100644 (file)
@@ -1,19 +1,3 @@
 <h2><%=h "#{@issue.tracker.name} ##{@issue.id}" %></h2>
 
-<% labelled_tabular_form_for :issue, @issue,
-                             :url => {:action => 'edit'},
-                             :html => {:id => 'issue-form'} do |f| %>
-    <%= render :partial => 'form', :locals => {:f => f} %>
-    <%= f.hidden_field :lock_version %>
-    <%= submit_tag l(:button_save) %>
-    <%= link_to_remote l(:label_preview), 
-                       { :url => { :controller => 'issues', :action => 'preview', :id => @issue },
-                         :method => 'post',
-                         :update => 'preview',
-                         :with => "Form.serialize('issue-form')",
-                         :complete => "location.href='#preview-top'"
-                       }, :accesskey => accesskey(:preview) %>
-<% end %>
-
-<a name="preview-top"></a>
-<div id="preview" class="wiki"></div>
+<%= render :partial => 'edit' %>
index 8ff07f2268083fa05aa46e6f852803554a4db691..1e9e323fefbb69f782ef0b00f06585a2690ec6b6 100644 (file)
@@ -2,7 +2,10 @@
 
 <% labelled_tabular_form_for :issue, @issue, 
                              :html => {:multipart => true, :id => 'issue-form'} do |f| %>
+    <%= error_messages_for 'issue' %>
+    <div class="box">
     <%= render :partial => 'issues/form', :locals => {:f => f} %>
+    </div>
     <%= submit_tag l(:button_create) %>
     <%= link_to_remote l(:label_preview), 
                        { :url => { :controller => 'issues', :action => 'preview', :id => @issue },
index d29b1b88fe395a973521da170c4684f6ef72c18c..a16dc60e033d6c6a6586473518988e297e526813 100644 (file)
@@ -1,6 +1,5 @@
 <div class="contextual">
-<%= show_and_goto_link(l(:button_update), 'update', :class => 'icon icon-note') if authorize_for('issues', 'update') %>
-<%= link_to_if_authorized l(:button_edit), {:controller => 'issues', :action => 'edit', :id => @issue}, :class => 'icon icon-edit', :accesskey => accesskey(:edit) %>
+<%= show_and_goto_link(l(:button_update), 'update', :class => 'icon icon-edit', :accesskey => accesskey(:edit)) if authorize_for('issues', 'edit') %>
 <%= link_to_if_authorized l(:button_log_time), {:controller => 'timelog', :action => 'edit', :issue_id => @issue}, :class => 'icon icon-time' %>
 <%= watcher_tag(@issue, User.current) %>
 <%= link_to_if_authorized l(:button_copy), {:controller => 'issues', :action => 'new', :project_id => @project, :copy_from => @issue }, :class => 'icon icon-copy' %>
@@ -89,11 +88,11 @@ end %>
 </div>
 <% end %>
 
-<% if authorize_for('issues', 'update') %>
+<% if authorize_for('issues', 'edit') %>
   <a name="update-anchor"></a>
   <div id="update" style="display:none;">
   <h3><%= l(:button_update) %></h3>
-  <%= render :partial => 'update' %>
+  <%= render :partial => 'edit' %>
   </div>
 <% end %>
 
diff --git a/app/views/issues/update.rhtml b/app/views/issues/update.rhtml
deleted file mode 100644 (file)
index 44e72da..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-<h2><%= @issue.tracker.name %> #<%= @issue.id %>: <%=h @issue.subject %></h2>
-
-<%= error_messages_for 'issue' %>
-<%= render :partial => 'update' %>
index 6fb1cf6de6de799d4f038f715217d1f2bd46642f..bc0e070c0aaa9db566c52b55e9a09ca720cdc000 100644 (file)
@@ -567,3 +567,4 @@ label_repository_plural: Хранилища
 label_associated_revisions: Асоциирани ревизии
 setting_user_format: Потребителски формат
 text_status_changed_by_changeset: Applied in changeset %s.
+label_more: More
index 894568f203bada15f09c935cd00009bf22e9adbb..35bda2b6a8097c651971a43a574ddd275b5d4f72 100644 (file)
@@ -567,3 +567,4 @@ label_repository_plural: Repositories
 label_associated_revisions: Associated revisions
 setting_user_format: Users display format
 text_status_changed_by_changeset: Applied in changeset %s.
+label_more: More
index 668c4333c26370d9c570f2d4edf7843ef88f6875..fd296b6006eddf9131007e84f64aad070078f12b 100644 (file)
@@ -567,3 +567,4 @@ enumeration_issue_priorities: Ticket-Prioritäten
 enumeration_doc_categories: Dokumentenkategorien
 enumeration_activities: Aktivitäten (Zeiterfassung)
 text_status_changed_by_changeset: Applied in changeset %s.
+label_more: More
index c056c6ce5aaa9159e387ba5a8b139265dff6c302..b86eeef2bdaec11e3605cbea8ab3141b5dbbf511 100644 (file)
@@ -469,6 +469,7 @@ label_display_per_page: 'Per page: %s'
 label_age: Age
 label_change_properties: Change properties
 label_general: General
+label_more: More
 
 button_login: Login
 button_submit: Submit
index b80d821782ccd02182247827cb20cd8a11d540c3..60e4a4d13d9c1c05aa0d58a485cf0038580260f7 100644 (file)
@@ -570,3 +570,4 @@ label_repository_plural: Repositories
 label_associated_revisions: Associated revisions
 setting_user_format: Users display format
 text_status_changed_by_changeset: Applied in changeset %s.
+label_more: More
index 3e297932dee2a09452984ae27c92cd8e94a09bd0..38cf19a4638159c357c029fdc58c8cad868d4d82 100644 (file)
@@ -571,3 +571,4 @@ enumeration_activities: Aktiviteetit (ajan seuranta)
 label_associated_revisions: Liittyvät versiot
 setting_user_format: Users display format
 text_status_changed_by_changeset: Applied in changeset %s.
+label_more: More
index ac615f03cbbf56e9c3cad1e2de989c0c7d075c3c..e428935afa0e44127d817457e5d6a0cdb3cd9096 100644 (file)
@@ -470,6 +470,7 @@ label_display_per_page: 'Par page: %s'
 label_age: Age
 label_change_properties: Changer les propriétés
 label_general: Général
+label_more: Plus
 
 button_login: Connexion
 button_submit: Soumettre
index 4063d2fcdd80957b71b5f3a55a8128dcb8fe6da7..ca577558a6db0a2a599582fa7846c205dfd89571 100644 (file)
@@ -567,3 +567,4 @@ label_repository_plural: Repositories
 label_associated_revisions: Associated revisions
 setting_user_format: Users display format
 text_status_changed_by_changeset: Applied in changeset %s.
+label_more: More
index 216a1ada4d3eca0d29a43b8005246cd82e13539e..f227c694205f59fa6292d19d2b45d47fcdbd0e74 100644 (file)
@@ -567,3 +567,4 @@ label_repository_plural: Repositories
 label_associated_revisions: Associated revisions
 setting_user_format: Users display format
 text_status_changed_by_changeset: Applied in changeset %s.
+label_more: More
index 7607b21ded031df99c9e3d739c473119317f332f..92b79b6efd3cb2ac6b07e833b9c29e18b8014d5b 100644 (file)
@@ -568,3 +568,4 @@ label_repository_plural: Repositories
 label_associated_revisions: Associated revisions
 setting_user_format: Users display format
 text_status_changed_by_changeset: Applied in changeset %s.
+label_more: More
index 31ac5bf9f8fcb02e42356e3f5a6e9af0a83e5950..097d7478803f2c52f46748d80b99104b3ce54142 100644 (file)
@@ -567,3 +567,4 @@ label_repository_plural: 저장소들
 label_associated_revisions: Associated revisions
 setting_user_format: Users display format
 text_status_changed_by_changeset: Applied in changeset %s.
+label_more: More
index 3aa86702a39b988a609ddc635a6ecbb9e6b3068f..3106bd764c7aaa540989329f11eff6c413d31679 100644 (file)
@@ -568,3 +568,4 @@ error_can_t_load_default_data: "Numatytoji konfiguracija negali būti užkrauta:
 label_associated_revisions: susijusios revizijos
 setting_user_format: Vartotojo atvaizdavimo formatas
 text_status_changed_by_changeset: Applied in changeset %s.
+label_more: More
index c54273873b98494fe254433422f88fd3f0722875..1c76180be7391d7489cf7375ea89c1be07f63a2b 100644 (file)
@@ -568,3 +568,4 @@ label_repository_plural: Repositories
 label_associated_revisions: Associated revisions
 setting_user_format: Users display format
 text_status_changed_by_changeset: Applied in changeset %s.
+label_more: More
index e3fc957b4df6b889df746414a572285b3f0ecb42..3ebce3e92732a00376bd98437a6243059dffa61c 100644 (file)
@@ -567,3 +567,4 @@ label_repository_plural: Repozytoria
 label_associated_revisions: Associated revisions
 setting_user_format: Users display format
 text_status_changed_by_changeset: Applied in changeset %s.
+label_more: More
index ce68c5bac1351d79a0bc1fa2abb87a7b66aac320..688ce0cfd1fcb9be6f13ea8c5782a38baa478c37 100644 (file)
@@ -567,3 +567,4 @@ label_repository_plural: Repositories
 label_associated_revisions: Associated revisions\r
 setting_user_format: Users display format\r
 text_status_changed_by_changeset: Applied in changeset %s.\r
+label_more: More\r
index 2467055994703d520503559ae16c851c66cc7d70..4734c66fc1c40ddbbc18d098dd9cf175a4def046 100644 (file)
@@ -567,3 +567,4 @@ label_repository_plural: Repositories
 label_associated_revisions: Associated revisions
 setting_user_format: Users display format
 text_status_changed_by_changeset: Applied in changeset %s.
+label_more: More
index 97bb794ddd5286d28365891870b9f1d470a0c454..be566b9596f2ee3f65a942e4f8d46ba73a248d71 100644 (file)
@@ -567,3 +567,4 @@ label_repository_plural: Repositories
 label_associated_revisions: Associated revisions
 setting_user_format: Users display format
 text_status_changed_by_changeset: Applied in changeset %s.
+label_more: More
index 1358b648df5c9fd77aea62c8d2e7d5acde18faa1..6921169ce7a2f257f32fd4838a00df12df475d4b 100644 (file)
@@ -568,3 +568,4 @@ enumeration_issue_priorities: Приоритеты задач
 enumeration_doc_categories: Категории документов
 enumeration_activities: Действия (учет времени)
 text_status_changed_by_changeset: Applied in changeset %s.
+label_more: More
index e6a2680049f5ec294fafacdd8e797eea8aa93826..ddf84a5d37fa31879ec7d4896c2da0ce7a8f204a 100644 (file)
@@ -568,3 +568,4 @@ label_repository_plural: Repositories
 label_associated_revisions: Associated revisions
 setting_user_format: Users display format
 text_status_changed_by_changeset: Applied in changeset %s.
+label_more: More
index da03bf0ba615b8f3bec7eca3b47c95144953f07a..4bec394ce6373735dc0733b71a6d5cb441303d98 100644 (file)
@@ -568,3 +568,4 @@ label_repository_plural: Repositories
 label_associated_revisions: Associated revisions
 setting_user_format: Users display format
 text_status_changed_by_changeset: Applied in changeset %s.
+label_more: More
index 833e98b0055b13fc0e12210dcec370cc8376df0b..50a6384f2646e9dcc7925c46001a9404d6c1b541 100644 (file)
@@ -567,3 +567,4 @@ enumeration_issue_priorities: 項目重要性
 enumeration_doc_categories: 文件分類
 enumeration_activities: 活動 (time tracking)
 text_status_changed_by_changeset: Applied in changeset %s.
+label_more: More
index cdaeeaa04aaabe5084447cdac1b73ce6f7ab4625..dc431f5c076788307abe9755f6c801eb7ccd2269 100644 (file)
@@ -570,3 +570,4 @@ label_repository_plural: 源代码库
 label_associated_revisions: 相关的版本
 setting_user_format: 用户显示格式
 text_status_changed_by_changeset: Applied in changeset %s.
+label_more: More
index c4c55a9324b9247551b462b93a30291105e8d770..69151012bfa9afa91798c453e2aac55eec09991c 100644 (file)
@@ -32,9 +32,9 @@ Redmine::AccessControl.map do |map|
                                   :reports => :issue_report}, :public => true                    
     map.permission :add_issues, {:issues => :new}
     map.permission :edit_issues, {:projects => :bulk_edit_issues,
-                                  :issues => [:edit, :update, :destroy_attachment]}
+                                  :issues => [:edit, :destroy_attachment]}
     map.permission :manage_issue_relations, {:issue_relations => [:new, :destroy]}
-    map.permission :add_issue_notes, {:issues => :update}
+    map.permission :add_issue_notes, {:issues => :edit}
     map.permission :move_issues, {:projects => :move_issues}, :require => :loggedin
     map.permission :delete_issues, {:issues => :destroy}, :require => :member
     # Queries
diff --git a/public/images/note.png b/public/images/note.png
deleted file mode 100644 (file)
index 2563683..0000000
Binary files a/public/images/note.png and /dev/null differ
index b3b8b341db195d9b3ea33a529316bac6d6703629..b386c32856c38af56bfa632c5b749c0fca528e25 100644 (file)
@@ -512,7 +512,6 @@ vertical-align: middle;
 .icon-reload  { background-image: url(../images/reload.png); }
 .icon-lock  { background-image: url(../images/locked.png); }
 .icon-unlock  { background-image: url(../images/unlock.png); }
-.icon-note  { background-image: url(../images/note.png); }
 .icon-checked  { background-image: url(../images/true.png); }
 
 .icon22-projects { background-image: url(../images/22x22/projects.png); }
index f4c99f1edf173db642eaa876e0a6fb9216ad336e..6fdbb0341754f34577156b697c0ea246da3be7c6 100644 (file)
@@ -217,18 +217,11 @@ class IssuesControllerTest < Test::Unit::TestCase
     assert mail.body.include?("Subject changed from #{old_subject} to #{new_subject}")
   end
   
-  def test_get_update
-    @request.session[:user_id] = 2
-    get :update, :id => 1
-    assert_response :success
-    assert_template 'update'
-  end
-  
-  def test_update_with_status_and_assignee_change
+  def test_post_edit_with_status_and_assignee_change
     issue = Issue.find(1)
     assert_equal 1, issue.status_id
     @request.session[:user_id] = 2
-    post :update,
+    post :edit,
          :id => 1,
          :issue => { :status_id => 2, :assigned_to_id => 3 },
          :notes => 'Assigned to dlopper'
@@ -243,10 +236,10 @@ class IssuesControllerTest < Test::Unit::TestCase
     assert mail.body.include?("Status changed from New to Assigned")
   end
   
-  def test_update_with_note_only
+  def test_post_edit_with_note_only
     notes = 'Note added by IssuesControllerTest#test_update_with_note_only'
     # anonymous user
-    post :update,
+    post :edit,
          :id => 1,
          :notes => notes
     assert_redirected_to 'issues/show/1'
@@ -259,10 +252,10 @@ class IssuesControllerTest < Test::Unit::TestCase
     assert mail.body.include?(notes)
   end
   
-  def test_update_with_note_and_spent_time
+  def test_post_edit_with_note_and_spent_time
     @request.session[:user_id] = 2
     spent_hours_before = Issue.find(1).spent_hours
-    post :update,
+    post :edit,
          :id => 1,
          :notes => '2.5 hours added',
          :time_entry => { :hours => '2.5', :comments => '', :activity_id => Enumeration.get_values('ACTI').first }
@@ -280,9 +273,9 @@ class IssuesControllerTest < Test::Unit::TestCase
     assert_equal spent_hours_before + 2.5, issue.spent_hours
   end
   
-  def test_update_with_attachment_only
+  def test_post_edit_with_attachment_only
     # anonymous user
-    post :update,
+    post :edit,
          :id => 1,
          :notes => '',
          :attachments => [ test_uploaded_file('testfile.txt', 'text/plain') ]
@@ -297,12 +290,12 @@ class IssuesControllerTest < Test::Unit::TestCase
     assert mail.body.include?('testfile.txt')
   end
   
-  def test_update_with_no_change
+  def test_post_edit_with_no_change
     issue = Issue.find(1)
     issue.journals.clear
     ActionMailer::Base.deliveries.clear
     
-    post :update,
+    post :edit,
          :id => 1,
          :notes => ''
     assert_redirected_to 'issues/show/1'
index 7249ed3da37c8743aeeeb139402a431683769176..eda4ef676c0ce83be1e66fd3f3ba727e3b9dde13 100644 (file)
@@ -48,7 +48,7 @@ class IssuesTest < ActionController::IntegrationTest
   def test_issue_attachements
     log_user('jsmith', 'jsmith')
 
-    post 'issues/update/1',
+    post 'issues/edit/1',
          :notes => 'Some notes',
          :attachments => ([] << ActionController::TestUploadedFile.new(Test::Unit::TestCase.fixture_path + '/files/testfile.txt', 'text/plain'))
     assert_redirected_to "issues/show/1"