summaryrefslogtreecommitdiffstats
path: root/app
diff options
context:
space:
mode:
authorJean-Philippe Lang <jp_lang@yahoo.fr>2009-04-21 12:19:56 +0000
committerJean-Philippe Lang <jp_lang@yahoo.fr>2009-04-21 12:19:56 +0000
commitbb44430b631eba1d33b218c97cb5d506073aeb08 (patch)
tree7e37b43149c5fceebb2a61a08f4c0d814c009615 /app
parent65cbd94e422ed7119edc474f2c66bdb675f32f98 (diff)
downloadredmine-bb44430b631eba1d33b218c97cb5d506073aeb08.tar.gz
redmine-bb44430b631eba1d33b218c97cb5d506073aeb08.zip
Ask user what to do with child pages when deleting a parent wiki page (#3202).
3 options are available: * move child pages as root pages * move child pages to another parent page * delete all descendants git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2676 e93f8b46-1217-0410-a6f0-8f06a7374b81
Diffstat (limited to 'app')
-rw-r--r--app/controllers/wiki_controller.rb24
-rw-r--r--app/helpers/wiki_helper.rb13
-rw-r--r--app/models/wiki_page.rb2
-rw-r--r--app/views/wiki/destroy.rhtml19
-rw-r--r--app/views/wiki/edit.rhtml2
5 files changed, 57 insertions, 3 deletions
diff --git a/app/controllers/wiki_controller.rb b/app/controllers/wiki_controller.rb
index 1a480e4bd..9c624462a 100644
--- a/app/controllers/wiki_controller.rb
+++ b/app/controllers/wiki_controller.rb
@@ -131,9 +131,31 @@ class WikiController < ApplicationController
render_404 unless @annotate
end
- # remove a wiki page and its history
+ # Removes a wiki page and its history
+ # Children can be either set as root pages, removed or reassigned to another parent page
def destroy
return render_403 unless editable?
+
+ @descendants_count = @page.descendants.size
+ if @descendants_count > 0
+ case params[:todo]
+ when 'nullify'
+ # Nothing to do
+ when 'destroy'
+ # Removes all its descendants
+ @page.descendants.each(&:destroy)
+ when 'reassign'
+ # Reassign children to another parent page
+ reassign_to = @wiki.pages.find_by_id(params[:reassign_to_id].to_i)
+ return unless reassign_to
+ @page.children.each do |child|
+ child.update_attribute(:parent, reassign_to)
+ end
+ else
+ @reassignable_to = @wiki.pages - @page.self_and_descendants
+ return
+ end
+ end
@page.destroy
redirect_to :action => 'special', :id => @project, :page => 'Page_index'
end
diff --git a/app/helpers/wiki_helper.rb b/app/helpers/wiki_helper.rb
index c692c748b..009d6f8cb 100644
--- a/app/helpers/wiki_helper.rb
+++ b/app/helpers/wiki_helper.rb
@@ -17,6 +17,19 @@
module WikiHelper
+ def wiki_page_options_for_select(pages, selected = nil, parent = nil, level = 0)
+ s = ''
+ pages.select {|p| p.parent == parent}.each do |page|
+ attrs = "value='#{page.id}'"
+ attrs << " selected='selected'" if selected == page
+ indent = (level > 0) ? ('&nbsp;' * level * 2 + '&#187; ') : nil
+
+ s << "<option value='#{page.id}'>#{indent}#{h page.pretty_title}</option>\n" +
+ wiki_page_options_for_select(pages, selected, page, level + 1)
+ end
+ s
+ end
+
def html_diff(wdiff)
words = wdiff.words.collect{|word| h(word)}
words_add = 0
diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb
index f8bbcdebd..19858dbd4 100644
--- a/app/models/wiki_page.rb
+++ b/app/models/wiki_page.rb
@@ -22,7 +22,7 @@ class WikiPage < ActiveRecord::Base
belongs_to :wiki
has_one :content, :class_name => 'WikiContent', :foreign_key => 'page_id', :dependent => :destroy
acts_as_attachable :delete_permission => :delete_wiki_pages_attachments
- acts_as_tree :order => 'title'
+ acts_as_tree :dependent => :nullify, :order => 'title'
acts_as_event :title => Proc.new {|o| "#{l(:label_wiki)}: #{o.title}"},
:description => :text,
diff --git a/app/views/wiki/destroy.rhtml b/app/views/wiki/destroy.rhtml
new file mode 100644
index 000000000..f552c69a5
--- /dev/null
+++ b/app/views/wiki/destroy.rhtml
@@ -0,0 +1,19 @@
+<h2><%=h @page.pretty_title %></h2>
+
+<% form_tag({}) do %>
+<div class="box">
+<p><strong><%= l(:text_wiki_page_destroy_question, :descendants => @descendants_count) %></strong></p>
+<p><label><%= radio_button_tag 'todo', 'nullify', true %> <%= l(:text_wiki_page_nullify_children) %></label><br />
+<label><%= radio_button_tag 'todo', 'destroy', false %> <%= l(:text_wiki_page_destroy_children) %></label>
+<% if @reassignable_to.any? %>
+<br />
+<label><%= radio_button_tag 'todo', 'reassign', false %> <%= l(:text_wiki_page_reassign_children) %></label>:
+<%= select_tag 'reassign_to_id', wiki_page_options_for_select(@reassignable_to),
+ :onclick => "$('todo_reassign').checked = true;" %>
+<% end %>
+</p>
+</div>
+
+<%= submit_tag l(:button_apply) %>
+<%= link_to l(:button_cancel), :controller => 'wiki', :action => 'index', :id => @project, :page => @page.title %>
+<% end %>
diff --git a/app/views/wiki/edit.rhtml b/app/views/wiki/edit.rhtml
index 19f3bd5ae..6a949e2aa 100644
--- a/app/views/wiki/edit.rhtml
+++ b/app/views/wiki/edit.rhtml
@@ -1,4 +1,4 @@
-<h2><%= @page.pretty_title %></h2>
+<h2><%=h @page.pretty_title %></h2>
<% form_for :content, @content, :url => {:action => 'edit', :page => @page.title}, :html => {:id => 'wiki_form'} do |f| %>
<%= f.hidden_field :version %>