diff options
author | Jean-Philippe Lang <jp_lang@yahoo.fr> | 2012-02-05 10:56:27 +0000 |
---|---|---|
committer | Jean-Philippe Lang <jp_lang@yahoo.fr> | 2012-02-05 10:56:27 +0000 |
commit | 1d4ef8964def4ecbe7a11485f72d7fbe61c55724 (patch) | |
tree | 4986d5f51daebd1ff66ac58cdf56042624e2edc3 /app | |
parent | c4ea429acbc09205155509e9c41e111294bc8f82 (diff) | |
download | redmine-1d4ef8964def4ecbe7a11485f72d7fbe61c55724.tar.gz redmine-1d4ef8964def4ecbe7a11485f72d7fbe61c55724.zip |
Adds a "Manage related isses" permission to add/remove commits/issues relations manually from the changeset view (#2009).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@8777 e93f8b46-1217-0410-a6f0-8f06a7374b81
Diffstat (limited to 'app')
-rw-r--r-- | app/controllers/repositories_controller.rb | 60 | ||||
-rw-r--r-- | app/models/changeset.rb | 4 | ||||
-rw-r--r-- | app/views/repositories/_related_issues.html.erb | 34 | ||||
-rw-r--r-- | app/views/repositories/revision.html.erb | 9 |
4 files changed, 92 insertions, 15 deletions
diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index cd467d2d7..73892b1d8 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -30,6 +30,7 @@ class RepositoriesController < ApplicationController before_filter :find_project_by_project_id, :only => [:new, :create] before_filter :find_repository, :only => [:edit, :update, :destroy, :committers] before_filter :find_project_repository, :except => [:new, :create, :edit, :update, :destroy, :committers] + before_filter :find_changeset, :only => [:revision, :add_related_issue, :remove_related_issue] before_filter :authorize accept_rss_auth :revisions @@ -185,16 +186,56 @@ class RepositoriesController < ApplicationController end def revision - raise ChangesetNotFound if @rev.blank? - @changeset = @repository.find_changeset_by_name(@rev) - raise ChangesetNotFound unless @changeset - respond_to do |format| format.html format.js {render :layout => false} end - rescue ChangesetNotFound - show_error_not_found + end + + # Adds a related issue to a changeset + # POST /projects/:project_id/repository/(:repository_id/)revisions/:rev/issues + def add_related_issue + @issue = @changeset.find_referenced_issue_by_id(params[:issue_id]) + if @issue && (!@issue.visible? || @changeset.issues.include?(@issue)) + @issue = nil + end + + if @issue + @changeset.issues << @issue + respond_to do |format| + format.js { + render :update do |page| + page.replace_html "related-issues", :partial => "related_issues" + page.visual_effect :highlight, "related-issue-#{@issue.id}" + end + } + end + else + respond_to do |format| + format.js { + render :update do |page| + page.alert(l(:label_issue) + ' ' + l('activerecord.errors.messages.invalid')) + end + } + end + end + end + + # Removes a related issue from a changeset + # DELETE /projects/:project_id/repository/(:repository_id/)revisions/:rev/issues/:issue_id + def remove_related_issue + @issue = Issue.visible.find_by_id(params[:issue_id]) + if @issue + @changeset.issues.delete(@issue) + end + + respond_to do |format| + format.js { + render :update do |page| + page.remove "related-issue-#{@issue.id}" + end if @issue + } + end end def diff @@ -282,6 +323,13 @@ class RepositoriesController < ApplicationController show_error_not_found end + def find_changeset + if @rev.present? + @changeset = @repository.find_changeset_by_name(@rev) + end + show_error_not_found unless @changeset + end + def show_error_not_found render_error :message => l(:error_scm_not_found), :status => 404 end diff --git a/app/models/changeset.rb b/app/models/changeset.rb index d017ad03b..1e9a12e7c 100644 --- a/app/models/changeset.rb +++ b/app/models/changeset.rb @@ -184,8 +184,6 @@ class Changeset < ActiveRecord::Base :from_revision => change[:from_revision]) end - private - # Finds an issue that can be referenced by the commit message def find_referenced_issue_by_id(id) return nil if id.blank? @@ -203,6 +201,8 @@ class Changeset < ActiveRecord::Base issue end + private + def fix_issue(issue) status = IssueStatus.find_by_id(Setting.commit_fix_status_id.to_i) if status.nil? diff --git a/app/views/repositories/_related_issues.html.erb b/app/views/repositories/_related_issues.html.erb new file mode 100644 index 000000000..d65d07945 --- /dev/null +++ b/app/views/repositories/_related_issues.html.erb @@ -0,0 +1,34 @@ +<% manage_allowed = User.current.allowed_to?(:manage_related_issues, @repository.project) %> + +<div id="related-issues"> +<% if manage_allowed %> + <div class="contextual"> + <%= toggle_link l(:button_add), 'new-relation-form', {:focus => 'issue_id'} %> + </div> +<% end %> + +<h3><%= l(:label_related_issues) %></h3> +<ul> +<% @changeset.issues.visible.each do |issue| %> + <li id="<%= "related-issue-#{issue.id}" %>"><%= link_to_issue issue %> + <%= link_to_remote(image_tag('link_break.png'), + {:url => {:controller => 'repositories', :action => 'remove_related_issue', :id => @project, :repository_id => @repository.identifier_param, :rev => @changeset.identifier, :issue_id => issue}, + :method => :delete, + }, :title => l(:label_relation_delete)) if manage_allowed %> + + </li> +<% end %> +</ul> + +<% if manage_allowed %> + <% remote_form_for(:issue, @issue, + :url => {:controller => 'repositories', :action => 'add_related_issue', :id => @project, :repository_id => @repository.identifier_param, :rev => @changeset.identifier}, + :method => :post, + :complete => "Form.Element.focus('issue_id');", + :html => {:id => 'new-relation-form', :style => (@issue ? '' : 'display: none;')}) do |f| %> + <%= l(:label_issue) %> #<%= text_field_tag 'issue_id', '', :size => 10 %> + <%= submit_tag l(:button_add) %> + <%= toggle_link l(:button_cancel), 'new-relation-form'%> + <% end %> +<% end %> +</div> diff --git a/app/views/repositories/revision.html.erb b/app/views/repositories/revision.html.erb index 7c44cd674..4e7ad4c2a 100644 --- a/app/views/repositories/revision.html.erb +++ b/app/views/repositories/revision.html.erb @@ -64,13 +64,8 @@ <%= textilizable @changeset.comments %> -<% if @changeset.issues.visible.any? %> -<h3><%= l(:label_related_issues) %></h3> -<ul> -<% @changeset.issues.visible.each do |issue| %> - <li><%= link_to_issue issue %></li> -<% end %> -</ul> +<% if @changeset.issues.visible.any? || User.current.allowed_to?(:manage_related_issues, @repository.project) %> + <%= render :partial => 'related_issues' %> <% end %> <% if User.current.allowed_to?(:browse_repository, @project) %> |