Patch #243 ยป AddWikiHierarchy.patch
| app/controllers/wiki_controller.rb (working copy) | ||
|---|---|---|
| 58 | 58 |
|
| 59 | 59 |
@content = @page.content_for_version(params[:version]) |
| 60 | 60 |
@content.text = "h1. #{@page.pretty_title}" if @content.text.blank?
|
| 61 |
@page.parent_id = params[:parent_id] if params[:parent_id] |
|
| 62 |
@content.parent_id = @page.parent_id |
|
| 63 |
@content.page = @page |
|
| 61 | 64 |
# don't keep previous comment |
| 62 | 65 |
@content.comments = nil |
| 63 | 66 |
if request.post? |
| 64 |
if !@page.new_record? && @content.text == params[:content][:text] |
|
| 65 |
# don't save if text wasn't changed |
|
| 67 |
#if the parent id changes we'll need to save |
|
| 68 |
if @page.parent_id.to_s != params[:content][:parent_id] |
|
| 69 |
@page.parent_id = params[:content][:parent_id] |
|
| 70 |
@parent_changed = true |
|
| 71 |
end |
|
| 72 |
if !@page.new_record? && @content.text == params[:content][:text] && !@parent_changed |
|
| 73 |
# don't save if text or parent wasn't changed |
|
| 66 | 74 |
redirect_to :action => 'index', :id => @project, :page => @page.title |
| 67 | 75 |
return |
| 68 | 76 |
end |
| ... | ... | |
| 71 | 79 |
@content.attributes = params[:content] |
| 72 | 80 |
@content.author = User.current |
| 73 | 81 |
# if page is new @page.save will also save content, but not if page isn't a new record |
| 74 |
if (@page.new_record? ? @page.save : @content.save) |
|
| 82 |
if (@page.new_record? || @parent_changed == true ? @page.save : @content.save)
|
|
| 75 | 83 |
redirect_to :action => 'index', :id => @project, :page => @page.title |
| 76 | 84 |
end |
| 77 | 85 |
end |
| app/helpers/application_helper.rb (working copy) | ||
|---|---|---|
| 194 | 194 |
else |
| 195 | 195 |
format_wiki_link = Proc.new {|project, title| url_for :controller => 'wiki', :action => 'index', :id => project, :page => title }
|
| 196 | 196 |
end |
| 197 |
format_new_wiki_link = Proc.new {|project, title, parent_id| url_for :controller => 'wiki', :action => 'edit', :id => project, :page => title, :parent_id => parent_id}
|
|
| 197 | 198 |
|
| 198 | 199 |
project = options[:project] || @project |
| 199 | 200 |
|
| ... | ... | |
| 219 | 220 |
if link_project && link_project.wiki |
| 220 | 221 |
# check if page exists |
| 221 | 222 |
wiki_page = link_project.wiki.find_page(page) |
| 222 |
link_to((title || page), format_wiki_link.call(link_project, Wiki.titleize(page)), |
|
| 223 |
:class => ('wiki-page' + (wiki_page ? '' : ' new')))
|
|
| 223 |
if wiki_page |
|
| 224 |
link_to((title || page), format_wiki_link.call(link_project, Wiki.titleize(page) + (wiki_page ? '' : '/edit/' + page_id)), |
|
| 225 |
:class => ('wiki-page' + (wiki_page ? '' : ' new')))
|
|
| 226 |
else |
|
| 227 |
parent_id = options[:page].id.to_s if options[:page] |
|
| 228 |
link_to((title || page), format_new_wiki_link.call(link_project, Wiki.titleize(page), parent_id), |
|
| 229 |
:class => ('wiki-page' + (wiki_page ? '' : ' new')))
|
|
| 230 |
end |
|
| 224 | 231 |
else |
| 225 | 232 |
# project or wiki doesn't exist |
| 226 | 233 |
title || page |
| ... | ... | |
| 248 | 255 |
end |
| 249 | 256 |
leading + (link || "#{otype}#{oid}")
|
| 250 | 257 |
end |
| 258 |
|
|
| 259 |
#convert {{child_pages}} tags into a table of links
|
|
| 260 |
#this should really be a macro but not sure how to make :page visible to it |
|
| 261 |
text = text.gsub(/\{\{(>|<)?child_pages\}\}/) do |m|
|
|
| 262 |
if options[:page] && options[:page].children |
|
| 263 |
div_class = 'toc' |
|
| 264 |
div_class << ' right' if $1 == '>' |
|
| 265 |
div_class << ' left' if $1 == '<' |
|
| 266 |
out = "<div class=\"#{div_class}\"><strong>" + l(:label_wiki_child_pages) + ":</strong>"
|
|
| 267 |
for page in options[:page].children |
|
| 268 |
out << link_to(page.pretty_title, format_wiki_link.call(project, page.title)) |
|
| 269 |
end |
|
| 270 |
out << '</div>' |
|
| 271 |
out |
|
| 272 |
else |
|
| 273 |
"" |
|
| 274 |
end |
|
| 275 |
end |
|
| 251 | 276 |
|
| 252 | 277 |
text |
| 253 | 278 |
end |
| app/helpers/wiki_helper.rb (working copy) | ||
|---|---|---|
| 17 | 17 | |
| 18 | 18 |
module WikiHelper |
| 19 | 19 | |
| 20 |
def link_to_pages(pages, options = {})
|
|
| 21 |
if pages.any? |
|
| 22 |
render :partial => 'wiki/links', :locals => {:pages => pages, :options => options}
|
|
| 23 |
end |
|
| 24 |
end |
|
| 25 | ||
| 20 | 26 |
def html_diff(wdiff) |
| 21 | 27 |
words = wdiff.words.collect{|word| h(word)}
|
| 22 | 28 |
words_add = 0 |
| app/models/wiki_content.rb (working copy) | ||
|---|---|---|
| 23 | 23 |
belongs_to :author, :class_name => 'User', :foreign_key => 'author_id' |
| 24 | 24 |
validates_presence_of :text |
| 25 | 25 |
|
| 26 |
attr_accessor :parent_id |
|
| 27 |
|
|
| 26 | 28 |
acts_as_versioned |
| 27 | 29 |
class Version |
| 28 | 30 |
belongs_to :page, :class_name => '::WikiPage', :foreign_key => 'page_id' |
| app/models/wiki_page.rb (working copy) | ||
|---|---|---|
| 21 | 21 |
class WikiPage < ActiveRecord::Base |
| 22 | 22 |
belongs_to :wiki |
| 23 | 23 |
has_one :content, :class_name => 'WikiContent', :foreign_key => 'page_id', :dependent => :destroy |
| 24 |
has_one :parent, :class_name => 'WikiPage', :foreign_key => 'page_id' |
|
| 24 | 25 |
has_many :attachments, :as => :container, :dependent => :destroy |
| 25 | 26 | |
| 26 | 27 |
acts_as_event :title => Proc.new {|o| "#{l(:label_wiki)}: #{o.title}"},
|
| ... | ... | |
| 32 | 33 |
:include => [:wiki, :content], |
| 33 | 34 |
:project_key => "#{Wiki.table_name}.project_id"
|
| 34 | 35 | |
| 36 |
acts_as_tree :order => "id" |
|
| 37 |
|
|
| 35 | 38 |
attr_accessor :redirect_existing_links |
| 36 | 39 |
|
| 37 | 40 |
validates_presence_of :title |
| ... | ... | |
| 105 | 108 |
def text |
| 106 | 109 |
content.text if content |
| 107 | 110 |
end |
| 111 |
|
|
| 112 |
def parents |
|
| 113 |
@parents = [] |
|
| 114 |
@parent = parent |
|
| 115 |
while @parent |
|
| 116 |
logger.info(@parent.title) |
|
| 117 |
@parents = [parent] + @parents |
|
| 118 |
@parent = @parent.parent |
|
| 119 |
end |
|
| 120 |
@parents |
|
| 121 |
end |
|
| 108 | 122 |
end |
| 109 | 123 | |
| 110 | 124 |
class WikiDiff |
| app/views/wiki/_content.rhtml (working copy) | ||
|---|---|---|
| 1 | 1 |
<div class="wiki"> |
| 2 |
<%= textilizable content, :text, :attachments => content.page.attachments %> |
|
| 2 |
<%= textilizable content, :text, :attachments => content.page.attachments, :page => @page %>
|
|
| 3 | 3 |
</div> |
| app/views/wiki/_links.rhtml (revision 0) | ||
|---|---|---|
| 1 |
<% |
|
| 2 |
@first = true |
|
| 3 |
for page in pages %> |
|
| 4 |
<%=" > " if !@first%><%= link_to page.pretty_title, {:controller => 'wiki', :action => 'index', :page => page.title} %>
|
|
| 5 |
<% |
|
| 6 |
@first = false |
|
| 7 |
end %> |
|
| 8 |
|
|
| app/views/wiki/edit.rhtml (working copy) | ||
|---|---|---|
| 4 | 4 |
<%= f.hidden_field :version %> |
| 5 | 5 |
<%= error_messages_for 'content' %> |
| 6 | 6 |
<div class="contextual"> |
| 7 |
<%= l(:label_wiki_parent_page) %>: <%= f.select :parent_id, (@page.wiki.pages.collect {|p| [p.pretty_title, p.id]}).sort, :include_blank => true %>
|
|
| 8 |
|
|
| 7 | 9 |
<%= l(:setting_text_formatting) %>: |
| 8 | 10 |
<%= link_to l(:label_help), '/help/wiki_syntax.html', |
| 9 | 11 |
:onclick => "window.open('#{ url_for '/help/wiki_syntax.html' }', '', 'resizable=yes, location=no, width=300, height=640, menubar=no, status=no, scrollbars=yes'); return false;" %>
|
| app/views/wiki/show.rhtml (working copy) | ||
|---|---|---|
| 1 |
<p class="breadcrumbs"> |
|
| 2 |
<%= link_to_pages @page.parents, nil if @page.parent%> |
|
| 3 |
</p> |
|
| 1 | 4 |
<div class="contextual"> |
| 2 |
<%= link_to_if_authorized(l(:button_edit), {:action => 'edit', :page => @page.title}, :class => 'icon icon-edit', :accesskey => accesskey(:edit)) if @content.version == @page.content.version %>
|
|
| 5 |
<%= link_to_if_authorized(l(:button_edit), {:action => 'edit', :page => @page.title, :parent_id => @page.parent_id}, :class => 'icon icon-edit', :accesskey => accesskey(:edit)) if @content.version == @page.content.version %>
|
|
| 3 | 6 |
<%= link_to_if_authorized(l(:button_rename), {:action => 'rename', :page => @page.title}, :class => 'icon icon-move') if @content.version == @page.content.version %>
|
| 4 | 7 |
<%= link_to_if_authorized(l(:button_delete), {:action => 'destroy', :page => @page.title}, :method => :post, :confirm => l(:text_are_you_sure), :class => 'icon icon-del') %>
|
| 5 | 8 |
<%= link_to_if_authorized(l(:button_rollback), {:action => 'edit', :page => @page.title, :version => @content.version }, :class => 'icon icon-cancel') if @content.version < @page.content.version %>
|
| config/routes.rb (working copy) | ||
|---|---|---|
| 9 | 9 |
map.home '', :controller => 'welcome' |
| 10 | 10 | |
| 11 | 11 |
map.connect 'wiki/:id/:page/:action', :controller => 'wiki', :page => nil |
| 12 |
map.connect 'wiki/:id/:page/:action/:parent_id', :controller => 'wiki', :page => nil |
|
| 12 | 13 |
map.connect 'roles/workflow/:id/:role_id/:tracker_id', :controller => 'roles', :action => 'workflow' |
| 13 | 14 |
map.connect 'help/:ctrl/:page', :controller => 'help' |
| 14 | 15 |
#map.connect ':controller/:action/:id/:sort_key/:sort_order' |
| db/migrate/1001_wiki_hierarchy.rb (revision 0) | ||
|---|---|---|
| 1 |
class WikiHierarchy < ActiveRecord::Migration |
|
| 2 |
def self.up |
|
| 3 |
add_column(:wiki_pages, :parent_id, :integer) |
|
| 4 |
end |
|
| 5 |
|
|
| 6 |
def self.down |
|
| 7 |
remove_column :wiki_pages, :parent_id |
|
| 8 |
end |
|
| 9 |
end |
|
| lang/en.yml (working copy) | ||
|---|---|---|
| 378 | 378 |
label_wiki_edit_plural: Wiki edits |
| 379 | 379 |
label_wiki_page: Wiki page |
| 380 | 380 |
label_wiki_page_plural: Wiki pages |
| 381 |
label_wiki_parent_page: Parent Page |
|
| 382 |
label_wiki_child_pages: Child Pages |
|
| 381 | 383 |
label_index_by_title: Index by title |
| 382 | 384 |
label_index_by_date: Index by date |
| 383 | 385 |
label_current_version: Current version |
| public/stylesheets/application.css (working copy) | ||
|---|---|---|
| 109 | 109 |
overflow: hidden; |
| 110 | 110 |
width: .6em; height: .6em; |
| 111 | 111 |
} |
| 112 | ||
| 112 |
.breadcrumbs {white-space: nowrap; line-height:0.2em;margin-top:5px;font-size:0.9em;}
|
|
| 113 | 113 |
.contextual {float:right; white-space: nowrap; line-height:1.4em;margin-top:5px;font-size:0.9em;}
|
| 114 | 114 |
.contextual input {font-size:0.9em;}
|
| 115 | 115 | |