]> source.dussan.org Git - redmine.git/commitdiff
Ask user what to do with child pages when deleting a parent wiki page (#3202).
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Tue, 21 Apr 2009 12:19:56 +0000 (12:19 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Tue, 21 Apr 2009 12:19:56 +0000 (12:19 +0000)
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

42 files changed:
app/controllers/wiki_controller.rb
app/helpers/wiki_helper.rb
app/models/wiki_page.rb
app/views/wiki/destroy.rhtml [new file with mode: 0644]
app/views/wiki/edit.rhtml
config/locales/bg.yml
config/locales/bs.yml
config/locales/ca.yml
config/locales/cs.yml
config/locales/da.yml
config/locales/de.yml
config/locales/en.yml
config/locales/es.yml
config/locales/fi.yml
config/locales/fr.yml
config/locales/gl.yml
config/locales/he.yml
config/locales/hu.yml
config/locales/it.yml
config/locales/ja.yml
config/locales/ko.yml
config/locales/lt.yml
config/locales/nl.yml
config/locales/no.yml
config/locales/pl.yml
config/locales/pt-BR.yml
config/locales/pt.yml
config/locales/ro.yml
config/locales/ru.yml
config/locales/sk.yml
config/locales/sl.yml
config/locales/sr.yml
config/locales/sv.yml
config/locales/th.yml
config/locales/tr.yml
config/locales/uk.yml
config/locales/vi.yml
config/locales/zh-TW.yml
config/locales/zh.yml
test/functional/wiki_controller_test.rb
test/unit/wiki_page_test.rb
vendor/plugins/acts_as_tree/lib/active_record/acts/tree.rb

index 1a480e4bdb18ccd42ea86fc0f35137e5a8dc36fc..9c624462a6bfcfb7925162f362085ff28420074b 100644 (file)
@@ -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
index c692c748b483eb2ff5b218d74d8abe14587599b3..009d6f8cb9901a43f29ca097cd4c57bd9340e4b5 100644 (file)
 
 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
index f8bbcdebdc5abb392c0a217224343f61e3afc5e4..19858dbd427a1c7e776b435aa82c276d62faccd3 100644 (file)
@@ -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 (file)
index 0000000..f552c69
--- /dev/null
@@ -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 %>
index 19f3bd5aeac8c3a9f10d527ec1289245a5560d01..6a949e2aa3c745c35a4226ef112b2920b759d71d 100644 (file)
@@ -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 %>
index 5eb724a592536d84726de225c5d2220c5dae830b..500cc5713c19fda5dab3d3683644326fcabcfd12 100644 (file)
@@ -784,3 +784,7 @@ bg:
   label_date_from_to: From {{start}} to {{end}}
   label_greater_or_equal: ">="
   label_less_or_equal: <=
+  text_wiki_page_destroy_question: This page has {{descendants}} child page(s) and descendant(s). What do you want to do?
+  text_wiki_page_reassign_children: Reassign child pages to this parent page
+  text_wiki_page_nullify_children: Keep child pages as root pages
+  text_wiki_page_destroy_children: Delete child pages and all their descendants
index 9f7de749bc19a7907c8ac29365f01690bdddfbef..a064372efe9c6cac3a9fb0b8051fbd7f5a8ebb1a 100644 (file)
@@ -817,3 +817,7 @@ bs:
   label_descending: Opadajuće
   label_greater_or_equal: ">="
   label_less_or_equal: <=
+  text_wiki_page_destroy_question: This page has {{descendants}} child page(s) and descendant(s). What do you want to do?\r
+  text_wiki_page_reassign_children: Reassign child pages to this parent page\r
+  text_wiki_page_nullify_children: Keep child pages as root pages\r
+  text_wiki_page_destroy_children: Delete child pages and all their descendants\r
index 8ed335f08fdf7b3c58726562522a66685417774d..8d435241d315bc871c6ec29b40c283394de73fcc 100644 (file)
@@ -787,3 +787,7 @@ ca:
   enumeration_activities: Activitats (seguidor de temps)
   label_greater_or_equal: ">="
   label_less_or_equal: <=
+  text_wiki_page_destroy_question: This page has {{descendants}} child page(s) and descendant(s). What do you want to do?
+  text_wiki_page_reassign_children: Reassign child pages to this parent page
+  text_wiki_page_nullify_children: Keep child pages as root pages
+  text_wiki_page_destroy_children: Delete child pages and all their descendants
index dd8ed2747f8d8208efd6cc03c31a8f0b3c74f1c5..ab8f27fc85cd2ae45927dfd8e51d1b66797ec713 100644 (file)
@@ -790,3 +790,7 @@ cs:
   label_date_from_to: Od {{start}} do {{end}}
   label_greater_or_equal: ">="
   label_less_or_equal: <=
+  text_wiki_page_destroy_question: This page has {{descendants}} child page(s) and descendant(s). What do you want to do?
+  text_wiki_page_reassign_children: Reassign child pages to this parent page
+  text_wiki_page_nullify_children: Keep child pages as root pages
+  text_wiki_page_destroy_children: Delete child pages and all their descendants
index 7cfa199143c3b3ded539184c83acc2688f7bcc4c..704c5e4e8657b3fac5feb186030b1daa8137c042 100644 (file)
@@ -817,3 +817,7 @@ da:
   label_date_from_to: From {{start}} to {{end}}
   label_greater_or_equal: ">="
   label_less_or_equal: <=
+  text_wiki_page_destroy_question: This page has {{descendants}} child page(s) and descendant(s). What do you want to do?
+  text_wiki_page_reassign_children: Reassign child pages to this parent page
+  text_wiki_page_nullify_children: Keep child pages as root pages
+  text_wiki_page_destroy_children: Delete child pages and all their descendants
index 41e8532929d3cdd97c3455c27c2715cf7b94aeca..3f9cd17a662345ea30332b3a2ce38fa78bea467c 100644 (file)
@@ -816,3 +816,7 @@ de:
   label_date_from_to: From {{start}} to {{end}}
   label_greater_or_equal: ">="
   label_less_or_equal: <=
+  text_wiki_page_destroy_question: This page has {{descendants}} child page(s) and descendant(s). What do you want to do?
+  text_wiki_page_reassign_children: Reassign child pages to this parent page
+  text_wiki_page_nullify_children: Keep child pages as root pages
+  text_wiki_page_destroy_children: Delete child pages and all their descendants
index b60329f30005d30e410de80cc6c0e47a25da1a51..fd1ed6c51ac44d6d44fcb13b47e5036e6e5d198a 100644 (file)
@@ -761,6 +761,10 @@ en:
   text_repository_usernames_mapping: "Select or update the Redmine user mapped to each username found in the repository log.\nUsers with the same Redmine and repository username or email are automatically mapped."
   text_diff_truncated: '... This diff was truncated because it exceeds the maximum size that can be displayed.'
   text_custom_field_possible_values_info: 'One line for each value'
+  text_wiki_page_destroy_question: "This page has {{descendants}} child page(s) and descendant(s). What do you want to do?"
+  text_wiki_page_nullify_children: "Keep child pages as root pages"
+  text_wiki_page_destroy_children: "Delete child pages and all their descendants"
+  text_wiki_page_reassign_children: "Reassign child pages to this parent page"
   
   default_role_manager: Manager
   default_role_developper: Developer
index f3b9fad7a709d3b51a204e690e7cf1067a95099c..c37b96c64f518f68a747115109434a20267ad9ee 100644 (file)
@@ -837,3 +837,7 @@ es:
   label_date_from_to: From {{start}} to {{end}}
   label_greater_or_equal: ">="
   label_less_or_equal: <=
+  text_wiki_page_destroy_question: This page has {{descendants}} child page(s) and descendant(s). What do you want to do?
+  text_wiki_page_reassign_children: Reassign child pages to this parent page
+  text_wiki_page_nullify_children: Keep child pages as root pages
+  text_wiki_page_destroy_children: Delete child pages and all their descendants
index a9801aacfc4103229a58c4478fd002dbb0215a9c..9c35cb4499063d582b152fd46008347cea0038fa 100644 (file)
@@ -827,3 +827,7 @@ fi:
   label_date_from_to: From {{start}} to {{end}}
   label_greater_or_equal: ">="
   label_less_or_equal: <=
+  text_wiki_page_destroy_question: This page has {{descendants}} child page(s) and descendant(s). What do you want to do?
+  text_wiki_page_reassign_children: Reassign child pages to this parent page
+  text_wiki_page_nullify_children: Keep child pages as root pages
+  text_wiki_page_destroy_children: Delete child pages and all their descendants
index e0b18bf6756b6f7d3615c35586b3e7559ca7a63c..ddd349c69f64462b8e7e481348b63ccc762a78e9 100644 (file)
@@ -791,6 +791,10 @@ fr:
   text_repository_usernames_mapping: "Vous pouvez sélectionner ou modifier l'utilisateur Redmine associé à chaque nom d'utilisateur figurant dans l'historique du dépôt.\nLes utilisateurs avec le même identifiant ou la même adresse mail seront automatiquement associés."
   text_diff_truncated: '... Ce différentiel a été tronqué car il excède la taille maximale pouvant être affichée.'
   text_custom_field_possible_values_info: 'Une ligne par valeur'
+  text_wiki_page_destroy_question: "Cette page possède {{descendants}} sous-page(s) et descendante(s). Que voulez-vous faire ?"
+  text_wiki_page_nullify_children: "Conserver les sous-pages en tant que pages racines"
+  text_wiki_page_destroy_children: "Supprimer les sous-pages et toutes leurs descedantes"
+  text_wiki_page_reassign_children: "Réaffecter les sous-pages à cette page"
   
   default_role_manager: Manager
   default_role_developper: Développeur
index b908d7d12d5933a2d2dd220a40b81a62fe100fe7..9ccd9574ee4be1180ce9dbfee834f365ba72ded4 100644 (file)
@@ -816,3 +816,7 @@ gl:
   label_date_from_to: From {{start}} to {{end}}
   label_greater_or_equal: ">="
   label_less_or_equal: <=
+  text_wiki_page_destroy_question: This page has {{descendants}} child page(s) and descendant(s). What do you want to do?
+  text_wiki_page_reassign_children: Reassign child pages to this parent page
+  text_wiki_page_nullify_children: Keep child pages as root pages
+  text_wiki_page_destroy_children: Delete child pages and all their descendants
index 95c15423240c85aba87cc3e88bcaee4847d2574b..4941240b7ffd6bf4275f6646133449e4819a109a 100644 (file)
@@ -799,3 +799,7 @@ he:
   label_date_from_to: From {{start}} to {{end}}
   label_greater_or_equal: ">="
   label_less_or_equal: <=
+  text_wiki_page_destroy_question: This page has {{descendants}} child page(s) and descendant(s). What do you want to do?
+  text_wiki_page_reassign_children: Reassign child pages to this parent page
+  text_wiki_page_nullify_children: Keep child pages as root pages
+  text_wiki_page_destroy_children: Delete child pages and all their descendants
index 77f52dd2f07df7be361c98d8f70196714d125c6f..a4ac468e784e60389f485cd34fd4cd8b6068e118 100644 (file)
   label_date_from_to: "{{start}} -tól {{end}} -ig"
   label_greater_or_equal: ">="
   label_less_or_equal: <=
+  text_wiki_page_destroy_question: This page has {{descendants}} child page(s) and descendant(s). What do you want to do?
+  text_wiki_page_reassign_children: Reassign child pages to this parent page
+  text_wiki_page_nullify_children: Keep child pages as root pages
+  text_wiki_page_destroy_children: Delete child pages and all their descendants
index 1cb3195e649c98a4aa60488561582d0b126ce62f..58ee928abee158d5a2cba02ead27aac17dd654c1 100644 (file)
@@ -802,3 +802,7 @@ it:
   label_date_from_to: From {{start}} to {{end}}
   label_greater_or_equal: ">="
   label_less_or_equal: <=
+  text_wiki_page_destroy_question: This page has {{descendants}} child page(s) and descendant(s). What do you want to do?
+  text_wiki_page_reassign_children: Reassign child pages to this parent page
+  text_wiki_page_nullify_children: Keep child pages as root pages
+  text_wiki_page_destroy_children: Delete child pages and all their descendants
index 424775f2208008362e1766f7e1acf6266ed26d0f..5574aee63787fdc79be5cbf02ee643c6147cfc3e 100644 (file)
@@ -815,3 +815,7 @@ ja:
   label_date_from_to: From {{start}} to {{end}}
   label_greater_or_equal: ">="
   label_less_or_equal: <=
+  text_wiki_page_destroy_question: This page has {{descendants}} child page(s) and descendant(s). What do you want to do?
+  text_wiki_page_reassign_children: Reassign child pages to this parent page
+  text_wiki_page_nullify_children: Keep child pages as root pages
+  text_wiki_page_destroy_children: Delete child pages and all their descendants
index 8019d246b997cbbd3c9dfc4be444d3369f62e49e..0b323fe1e95647e7c2d401bd56931fb3efa253ef 100644 (file)
@@ -846,3 +846,7 @@ ko:
   label_date_from_to: From {{start}} to {{end}}
   label_greater_or_equal: ">="
   label_less_or_equal: <=
+  text_wiki_page_destroy_question: This page has {{descendants}} child page(s) and descendant(s). What do you want to do?
+  text_wiki_page_reassign_children: Reassign child pages to this parent page
+  text_wiki_page_nullify_children: Keep child pages as root pages
+  text_wiki_page_destroy_children: Delete child pages and all their descendants
index 09b73b73e1fbec86dd752b695dd10ef014bb628c..dd6b029cacf6aa391d419fbfa6a2256ca6bee583 100644 (file)
@@ -827,3 +827,7 @@ lt:
   label_date_from_to: From {{start}} to {{end}}
   label_greater_or_equal: ">="
   label_less_or_equal: <=
+  text_wiki_page_destroy_question: This page has {{descendants}} child page(s) and descendant(s). What do you want to do?
+  text_wiki_page_reassign_children: Reassign child pages to this parent page
+  text_wiki_page_nullify_children: Keep child pages as root pages
+  text_wiki_page_destroy_children: Delete child pages and all their descendants
index ef50eac1cd79dece58ef3be91ca948bfb2aecb62..b5728fbb3a2d9f1c14bc935e086e8c4ab05baf5d 100644 (file)
@@ -772,3 +772,7 @@ nl:
   label_date_from_to: Van {{start}} tot {{end}}
   label_greater_or_equal: ">="
   label_less_or_equal: <=
+  text_wiki_page_destroy_question: This page has {{descendants}} child page(s) and descendant(s). What do you want to do?
+  text_wiki_page_reassign_children: Reassign child pages to this parent page
+  text_wiki_page_nullify_children: Keep child pages as root pages
+  text_wiki_page_destroy_children: Delete child pages and all their descendants
index 3b4d681de844c117919b5c06608d8b175a1af1c5..3eb1dbabafc6c6d0c200c1a6f2f46043c4e87c38 100644 (file)
   label_date_from_to: From {{start}} to {{end}}
   label_greater_or_equal: ">="
   label_less_or_equal: <=
+  text_wiki_page_destroy_question: This page has {{descendants}} child page(s) and descendant(s). What do you want to do?
+  text_wiki_page_reassign_children: Reassign child pages to this parent page
+  text_wiki_page_nullify_children: Keep child pages as root pages
+  text_wiki_page_destroy_children: Delete child pages and all their descendants
index cddcad413c48e1a4712c3627561a8dbbaa847e8e..936683e8429df6f0e07488575dad3f24cfbf05b3 100644 (file)
@@ -820,3 +820,7 @@ pl:
   label_date_from_to: Od {{start}} do {{end}}
   label_greater_or_equal: ">="
   label_less_or_equal: <=
+  text_wiki_page_destroy_question: This page has {{descendants}} child page(s) and descendant(s). What do you want to do?
+  text_wiki_page_reassign_children: Reassign child pages to this parent page
+  text_wiki_page_nullify_children: Keep child pages as root pages
+  text_wiki_page_destroy_children: Delete child pages and all their descendants
index 8c4f7bd3a0f8c1da10dabae6984f0864eb449a16..bd065e5d32fae6dc3d4d263277b0ed62367c4826 100644 (file)
@@ -822,3 +822,7 @@ pt-BR:
   label_date_from_to: De {{start}} até {{end}}
   label_greater_or_equal: ">="
   label_less_or_equal: <=
+  text_wiki_page_destroy_question: This page has {{descendants}} child page(s) and descendant(s). What do you want to do?
+  text_wiki_page_reassign_children: Reassign child pages to this parent page
+  text_wiki_page_nullify_children: Keep child pages as root pages
+  text_wiki_page_destroy_children: Delete child pages and all their descendants
index 9d1c765dc799ec7b3a7bbae881511bf4700a84dd..aa8e672d566166a54d469e2677e6a7bd72b1893b 100644 (file)
@@ -808,3 +808,7 @@ pt:
   label_date_from_to: From {{start}} to {{end}}
   label_greater_or_equal: ">="
   label_less_or_equal: <=
+  text_wiki_page_destroy_question: This page has {{descendants}} child page(s) and descendant(s). What do you want to do?
+  text_wiki_page_reassign_children: Reassign child pages to this parent page
+  text_wiki_page_nullify_children: Keep child pages as root pages
+  text_wiki_page_destroy_children: Delete child pages and all their descendants
index b191bd3c62a9345d6a91b4c74f64772c0833312d..fe144c703c9eb4edd4961ad1b2097a048cf86a0c 100644 (file)
@@ -787,3 +787,7 @@ ro:
   enumeration_activities: Activitati (timp de lucru)
   label_greater_or_equal: ">="
   label_less_or_equal: <=
+  text_wiki_page_destroy_question: This page has {{descendants}} child page(s) and descendant(s). What do you want to do?
+  text_wiki_page_reassign_children: Reassign child pages to this parent page
+  text_wiki_page_nullify_children: Keep child pages as root pages
+  text_wiki_page_destroy_children: Delete child pages and all their descendants
index bdb0f6f4d39fec28e9e0bbb14e9dc2e0eedfc318..668a2c7da3adf66d6ec192b6e7df77f32ba3a88a 100644 (file)
@@ -914,3 +914,7 @@ ru:
   text_workflow_edit: Выберите роль и трекер для редактирования последовательности состояний
 
   warning_attachments_not_saved: "{{count}} файл(ов) невозможно сохранить."
+  text_wiki_page_destroy_question: This page has {{descendants}} child page(s) and descendant(s). What do you want to do?
+  text_wiki_page_reassign_children: Reassign child pages to this parent page
+  text_wiki_page_nullify_children: Keep child pages as root pages
+  text_wiki_page_destroy_children: Delete child pages and all their descendants
index e683007e6e879f822dd4635f986441c511fb6d27..6cd573fb1dfa719f1a968a7df77c177b4840c776 100644 (file)
@@ -788,3 +788,7 @@ sk:
   label_date_from_to: Od {{start}} do {{end}}
   label_greater_or_equal: ">="
   label_less_or_equal: <=
+  text_wiki_page_destroy_question: This page has {{descendants}} child page(s) and descendant(s). What do you want to do?
+  text_wiki_page_reassign_children: Reassign child pages to this parent page
+  text_wiki_page_nullify_children: Keep child pages as root pages
+  text_wiki_page_destroy_children: Delete child pages and all their descendants
index 2d9636643afbee1c23fadcf1a06f578ac13baaf0..5ccd5b7fd49f15b729ec6c649dddb091447d2bcd 100644 (file)
@@ -786,3 +786,7 @@ sl:
   label_date_from_to: From {{start}} to {{end}}
   label_greater_or_equal: ">="
   label_less_or_equal: <=
+  text_wiki_page_destroy_question: This page has {{descendants}} child page(s) and descendant(s). What do you want to do?
+  text_wiki_page_reassign_children: Reassign child pages to this parent page
+  text_wiki_page_nullify_children: Keep child pages as root pages
+  text_wiki_page_destroy_children: Delete child pages and all their descendants
index 37cb89fd0a853ad9781812d9187e3c05a720c5d3..b2b61a1c2118a628533ed3b214a56661b981dca0 100644 (file)
   label_date_from_to: From {{start}} to {{end}}
   label_greater_or_equal: ">="
   label_less_or_equal: <=
+  text_wiki_page_destroy_question: This page has {{descendants}} child page(s) and descendant(s). What do you want to do?
+  text_wiki_page_reassign_children: Reassign child pages to this parent page
+  text_wiki_page_nullify_children: Keep child pages as root pages
+  text_wiki_page_destroy_children: Delete child pages and all their descendants
index 700ed78c3f0cbb57d22dede51ebf34ba548461bc..d532d4aa3228c3030c3b7b3a9496c55cba54c9ad 100644 (file)
@@ -844,3 +844,7 @@ sv:
   enumeration_issue_priorities: Ärendeprioriteter
   enumeration_doc_categories: Dokumentkategorier
   enumeration_activities: Aktiviteter (tidsuppföljning)
+  text_wiki_page_destroy_question: This page has {{descendants}} child page(s) and descendant(s). What do you want to do?
+  text_wiki_page_reassign_children: Reassign child pages to this parent page
+  text_wiki_page_nullify_children: Keep child pages as root pages
+  text_wiki_page_destroy_children: Delete child pages and all their descendants
index b4ae5a2ae7e5c6a4982b3229f7364d1e9075e486..9de605691a9c0132e3d6ef6bba3cdb4fa283e7ee 100644 (file)
@@ -787,3 +787,7 @@ th:
   label_date_from_to: From {{start}} to {{end}}
   label_greater_or_equal: ">="
   label_less_or_equal: <=
+  text_wiki_page_destroy_question: This page has {{descendants}} child page(s) and descendant(s). What do you want to do?
+  text_wiki_page_reassign_children: Reassign child pages to this parent page
+  text_wiki_page_nullify_children: Keep child pages as root pages
+  text_wiki_page_destroy_children: Delete child pages and all their descendants
index 5a6666373a8a0014652c804a69c6c83394de1930..068c4ec4131c64dfa55626bf02e87aa6b4927f71 100644 (file)
@@ -823,3 +823,7 @@ tr:
   label_date_from_to: From {{start}} to {{end}}
   label_greater_or_equal: ">="
   label_less_or_equal: <=
+  text_wiki_page_destroy_question: This page has {{descendants}} child page(s) and descendant(s). What do you want to do?
+  text_wiki_page_reassign_children: Reassign child pages to this parent page
+  text_wiki_page_nullify_children: Keep child pages as root pages
+  text_wiki_page_destroy_children: Delete child pages and all their descendants
index 342825ffa06a8f487a6d4dda9dbda73b675d0ff8..23edbd172dcad3870a09fa05ce6fd155faf6046e 100644 (file)
@@ -786,3 +786,7 @@ uk:
   label_date_from_to: From {{start}} to {{end}}
   label_greater_or_equal: ">="
   label_less_or_equal: <=
+  text_wiki_page_destroy_question: This page has {{descendants}} child page(s) and descendant(s). What do you want to do?
+  text_wiki_page_reassign_children: Reassign child pages to this parent page
+  text_wiki_page_nullify_children: Keep child pages as root pages
+  text_wiki_page_destroy_children: Delete child pages and all their descendants
index 0bda7d995cf399f80affb8ad46c01b06ac098dd5..0a8f82156aa2ea8982ec1cdda7f03256a837253d 100644 (file)
@@ -856,3 +856,7 @@ vi:
   label_date_from_to: From {{start}} to {{end}}
   label_greater_or_equal: ">="
   label_less_or_equal: <=
+  text_wiki_page_destroy_question: This page has {{descendants}} child page(s) and descendant(s). What do you want to do?
+  text_wiki_page_reassign_children: Reassign child pages to this parent page
+  text_wiki_page_nullify_children: Keep child pages as root pages
+  text_wiki_page_destroy_children: Delete child pages and all their descendants
index 03d5a4051ed77ca27b0524e7d0823244bc38ddf5..7a322c10272895d282a8dd32aec01ac23b05984f 100644 (file)
   enumeration_issue_priorities: 項目優先權
   enumeration_doc_categories: 文件分類
   enumeration_activities: 活動 (時間追蹤)
+  text_wiki_page_destroy_question: This page has {{descendants}} child page(s) and descendant(s). What do you want to do?
+  text_wiki_page_reassign_children: Reassign child pages to this parent page
+  text_wiki_page_nullify_children: Keep child pages as root pages
+  text_wiki_page_destroy_children: Delete child pages and all their descendants
index 9ad6b8b7c06f0b8b41bbebfc5f32c52d69bd787d..5ae2411bf085ece606f338da3c660d1105b94f3f 100644 (file)
@@ -819,3 +819,7 @@ zh:
   enumeration_issue_priorities: 问题优先级
   enumeration_doc_categories: 文档类别
   enumeration_activities: 活动(时间跟踪)
+  text_wiki_page_destroy_question: This page has {{descendants}} child page(s) and descendant(s). What do you want to do?
+  text_wiki_page_reassign_children: Reassign child pages to this parent page
+  text_wiki_page_nullify_children: Keep child pages as root pages
+  text_wiki_page_destroy_children: Delete child pages and all their descendants
index 40dc04ae409732f42014779d5ce56db1825530fc..22d816e59dff6573cb3ced30b20e8a6f49b0a10c 100644 (file)
@@ -240,12 +240,50 @@ class WikiControllerTest < Test::Unit::TestCase
     )
   end
   
-  def test_destroy
+  def test_destroy_child
     @request.session[:user_id] = 2
-    post :destroy, :id => 1, :page => 'CookBook_documentation'
+    post :destroy, :id => 1, :page => 'Child_1'
     assert_redirected_to :action => 'special', :id => 'ecookbook', :page => 'Page_index'
   end
   
+  def test_destroy_parent
+    @request.session[:user_id] = 2
+    assert_no_difference('WikiPage.count') do
+      post :destroy, :id => 1, :page => 'Another_page'
+    end
+    assert_response :success
+    assert_template 'destroy'
+  end
+  
+  def test_destroy_parent_with_nullify
+    @request.session[:user_id] = 2
+    assert_difference('WikiPage.count', -1) do
+      post :destroy, :id => 1, :page => 'Another_page', :todo => 'nullify'
+    end
+    assert_redirected_to :action => 'special', :id => 'ecookbook', :page => 'Page_index'
+    assert_nil WikiPage.find_by_id(2)
+  end
+  
+  def test_destroy_parent_with_cascade
+    @request.session[:user_id] = 2
+    assert_difference('WikiPage.count', -3) do
+      post :destroy, :id => 1, :page => 'Another_page', :todo => 'destroy'
+    end
+    assert_redirected_to :action => 'special', :id => 'ecookbook', :page => 'Page_index'
+    assert_nil WikiPage.find_by_id(2)
+    assert_nil WikiPage.find_by_id(5)
+  end
+  
+  def test_destroy_parent_with_reassign
+    @request.session[:user_id] = 2
+    assert_difference('WikiPage.count', -1) do
+      post :destroy, :id => 1, :page => 'Another_page', :todo => 'reassign', :reassign_to_id => 1
+    end
+    assert_redirected_to :action => 'special', :id => 'ecookbook', :page => 'Page_index'
+    assert_nil WikiPage.find_by_id(2)
+    assert_equal WikiPage.find(1), WikiPage.find_by_id(5).parent
+  end
+  
   def test_special_routing
     assert_routing(
       {:method => :get, :path => '/projects/567/wiki/page_index'},
index f7f62aec40a78f5bfab8e790579c85b1c2df3809..df41a4a0ae3f01186cec5335609eacf7224a92e4 100644 (file)
@@ -100,4 +100,18 @@ class WikiPageTest < Test::Unit::TestCase
     assert WikiContent.find_all_by_page_id(1).empty?
     assert WikiContent.versioned_class.find_all_by_page_id(1).empty?
   end
+  
+  def test_destroy_should_not_nullify_children
+    page = WikiPage.find(2)
+    child_ids = page.child_ids
+    assert child_ids.any?
+    page.destroy
+    assert_nil WikiPage.find_by_id(2)
+    
+    children = WikiPage.find_all_by_id(child_ids)
+    assert_equal child_ids.size, children.size
+    children.each do |child|
+      assert_nil child.parent_id
+    end
+  end
 end
index 6a6827ee677f73eba58351de14c5ca17adc88b6d..54b4373efa2f5121176b3349e2dab6984dd747c7 100644 (file)
@@ -40,11 +40,11 @@ module ActiveRecord
         # * <tt>order</tt> - makes it possible to sort the children according to this SQL snippet.
         # * <tt>counter_cache</tt> - keeps a count in a +children_count+ column if set to +true+ (default: +false+).
         def acts_as_tree(options = {})
-          configuration = { :foreign_key => "parent_id", :order => nil, :counter_cache => nil }
+          configuration = { :foreign_key => "parent_id", :dependent => :destroy, :order => nil, :counter_cache => nil }
           configuration.update(options) if options.is_a?(Hash)
 
           belongs_to :parent, :class_name => name, :foreign_key => configuration[:foreign_key], :counter_cache => configuration[:counter_cache]
-          has_many :children, :class_name => name, :foreign_key => configuration[:foreign_key], :order => configuration[:order], :dependent => :destroy
+          has_many :children, :class_name => name, :foreign_key => configuration[:foreign_key], :order => configuration[:order], :dependent => configuration[:dependent]
 
           class_eval <<-EOV
             include ActiveRecord::Acts::Tree::InstanceMethods
@@ -77,6 +77,13 @@ module ActiveRecord
           children + children.collect(&:children).flatten
         end
 
+        # Returns list of descendants and a reference to the current node.
+        #
+        #   root.self_and_descendants # => [root, child1, subchild1, subchild2]
+        def self_and_descendants
+          [self] + descendants
+        end
+
         # Returns the root node of the tree.
         def root
           node = self