Feature #1040 » draft-feature-1040.patch
| app/controllers/wiki_controller.rb | ||
|---|---|---|
| 33 | 33 |
# TODO: still being worked on |
| 34 | 34 |
class WikiController < ApplicationController |
| 35 | 35 |
default_search_scope :wiki_pages |
| 36 |
before_action :find_wiki, :authorize |
|
| 36 |
before_action :find_wiki, :authorize_global
|
|
| 37 | 37 |
before_action :find_existing_or_new_page, :only => [:show, :edit] |
| 38 | 38 |
before_action :find_existing_page, :only => [:rename, :protect, :history, :diff, :annotate, :add_attachment, :destroy, :destroy_version] |
| 39 | 39 |
before_action :find_attachments, :only => [:preview] |
| ... | ... | |
| 41 | 41 | |
| 42 | 42 |
helper :attachments |
| 43 | 43 |
include AttachmentsHelper |
| 44 |
include WikiHelper |
|
| 44 | 45 |
helper :watchers |
| 45 | 46 |
include Redmine::Export::PDF |
| 46 | 47 | |
| 47 | 48 |
# List of pages, sorted alphabetically and by parent (hierarchy) |
| 48 | 49 |
def index |
| 50 |
authorize if params[:project_id] |
|
| 49 | 51 |
load_pages_for_index |
| 50 | 52 | |
| 51 | 53 |
respond_to do |format| |
| ... | ... | |
| 72 | 74 |
@page.title = '' unless editable? |
| 73 | 75 |
@page.validate |
| 74 | 76 |
if @page.errors[:title].blank? |
| 75 |
path = project_wiki_page_path(@project, @page.title, :parent => params[:parent])
|
|
| 77 |
path = wiki_page_action_path('show', @page, {:parent => params[:parent]})
|
|
| 76 | 78 |
respond_to do |format| |
| 77 | 79 |
format.html { redirect_to path }
|
| 78 | 80 |
format.js { render :js => "window.location = #{path.to_json}" }
|
| ... | ... | |
| 83 | 85 | |
| 84 | 86 |
# display a page (in editing mode if it doesn't exist) |
| 85 | 87 |
def show |
| 86 |
if params[:version] && !User.current.allowed_to?(:view_wiki_edits, @project)
|
|
| 88 |
if params[:version] && !@wiki.allowed_to_permission?(:view_wiki_edits)
|
|
| 87 | 89 |
deny_access |
| 88 | 90 |
return |
| 89 | 91 |
end |
| 90 | 92 |
@content = @page.content_for_version(params[:version]) |
| 91 | 93 |
if @content.nil? |
| 92 |
if User.current.allowed_to?(:edit_wiki_pages, @project) && editable? && !api_request?
|
|
| 94 |
if @wiki.allowed_to_permission?(:view_wiki_edits) && editable? && !api_request?
|
|
| 93 | 95 |
edit |
| 94 | 96 |
render :action => 'edit' |
| 95 | 97 |
else |
| ... | ... | |
| 185 | 187 |
respond_to do |format| |
| 186 | 188 |
format.html {
|
| 187 | 189 |
anchor = @section ? "section-#{@section}" : nil
|
| 188 |
redirect_to project_wiki_page_path(@project, @page.title, :anchor => anchor)
|
|
| 190 |
redirect_to wiki_page_action_path('show', @page, {:anchor => anchor})
|
|
| 189 | 191 |
} |
| 190 | 192 |
format.api {
|
| 191 | 193 |
if was_new_page |
| 192 |
render :action => 'show', :status => :created, :location => project_wiki_page_path(@project, @page.title)
|
|
| 194 |
render :action => 'show', :status => :created, :location => wiki_page_action_path('show', @page)
|
|
| 193 | 195 |
else |
| 194 | 196 |
render_api_ok |
| 195 | 197 |
end |
| ... | ... | |
| 222 | 224 |
@page.safe_attributes = params[:wiki_page] |
| 223 | 225 |
if request.post? && @page.save |
| 224 | 226 |
flash[:notice] = l(:notice_successful_update) |
| 225 |
redirect_to project_wiki_page_path(@page.project, @page.title)
|
|
| 227 |
redirect_to wiki_page_action_path('show', @page)
|
|
| 226 | 228 |
end |
| 227 | 229 |
end |
| 228 | 230 | |
| 229 | 231 |
def protect |
| 230 | 232 |
@page.update_attribute :protected, params[:protected] |
| 231 |
redirect_to project_wiki_page_path(@project, @page.title)
|
|
| 233 |
redirect_to wiki_page_action_path('show', @page)
|
|
| 232 | 234 |
end |
| 233 | 235 | |
| 234 | 236 |
# show page history |
| ... | ... | |
| 297 | 299 | |
| 298 | 300 |
if content = @page.content.versions.find_by_version(params[:version]) |
| 299 | 301 |
content.destroy |
| 300 |
redirect_to_referer_or history_project_wiki_page_path(@project, @page.title)
|
|
| 302 |
redirect_to_referer_or wiki_page_action_path('history', @page)
|
|
| 301 | 303 |
else |
| 302 | 304 |
render_404 |
| 303 | 305 |
end |
| ... | ... | |
| 341 | 343 |
private |
| 342 | 344 | |
| 343 | 345 |
def find_wiki |
| 344 |
@project = Project.find(params[:project_id]) |
|
| 345 |
@wiki = @project.wiki |
|
| 346 |
if params[:project_id] |
|
| 347 |
@project = Project.find(params[:project_id]) |
|
| 348 |
@wiki = @project.wiki |
|
| 349 |
else |
|
| 350 |
@wiki = Wiki.find_by(:project_id => nil) |
|
| 351 |
Wiki.create(:project => nil, :start_page => 'Wiki') if @wiki.nil? |
|
| 352 |
end |
|
| 346 | 353 |
render_404 unless @wiki |
| 347 | 354 |
rescue ActiveRecord::RecordNotFound |
| 348 | 355 |
render_404 |
| 349 | 356 |
end |
| 350 | 357 | |
| 358 |
def global_wiki? |
|
| 359 |
@wiki.project.nil? |
|
| 360 |
end |
|
| 361 | ||
| 351 | 362 |
# Finds the requested page or a new page if it doesn't exist |
| 352 | 363 |
def find_existing_or_new_page |
| 353 | 364 |
@page = @wiki.find_or_new_page(params[:id]) |
| app/helpers/application_helper.rb | ||
|---|---|---|
| 203 | 203 |
'Project' => ->(project) {link_to_project(project)},
|
| 204 | 204 |
'User' => ->(user) {link_to_user(user)},
|
| 205 | 205 |
'Version' => ->(version) {link_to_version(version)},
|
| 206 |
'WikiPage' => ->(wiki_page) {link_to(wiki_page.pretty_title,project_wiki_page_path(wiki_page.project, wiki_page.title))}
|
|
| 206 |
'WikiPage' => ->(wiki_page) {link_to(wiki_page.pretty_title, url_for({:controller => 'wiki', :action => 'show', project_id: wiki_page.project, id: wiki_page.title}))}
|
|
| 207 | 207 |
} |
| 208 | 208 | |
| 209 | 209 |
def link_to_record(record) |
| ... | ... | |
| 286 | 286 |
end |
| 287 | 287 |
end |
| 288 | 288 | |
| 289 |
def wiki_page_path(page, options={})
|
|
| 290 |
url_for({:controller => 'wiki', :action => 'show', :project_id => page.project, :id => page.title}.merge(options))
|
|
| 291 |
end |
|
| 292 | ||
| 293 | 289 |
def thumbnail_tag(attachment) |
| 294 | 290 |
thumbnail_size = Setting.thumbnails_size.to_i |
| 295 | 291 |
link_to( |
| ... | ... | |
| 926 | 922 |
next link_to(title.present? ? title.html_safe : h(page), url, :class => 'wiki-page') |
| 927 | 923 |
end |
| 928 | 924 | |
| 929 |
if page =~ /^([^\:]+)\:(.*)$/
|
|
| 925 |
if page =~ /^(.*)\:(.*)$/
|
|
| 930 | 926 |
identifier, page = $1, $2 |
| 931 | 927 |
link_project = Project.find_by_identifier(identifier) || Project.find_by_name(identifier) |
| 932 | 928 |
title ||= identifier if page.blank? |
| 933 | 929 |
end |
| 934 | ||
| 935 |
if link_project && link_project.wiki && User.current.allowed_to?(:view_wiki_pages, link_project) |
|
| 930 |
wiki = Wiki.find_by(:project => link_project) |
|
| 931 |
if wiki && wiki.allowed_to_permission?(:view_wiki_pages) && |
|
| 932 |
(link_project || (wiki.global? && link_project.nil?)) |
|
| 936 | 933 |
# extract anchor |
| 937 | 934 |
anchor = nil |
| 938 | 935 |
if page =~ /^(.+?)\#(.+)$/ |
| ... | ... | |
| 940 | 937 |
end |
| 941 | 938 |
anchor = sanitize_anchor_name(anchor) if anchor.present? |
| 942 | 939 |
# check if page exists |
| 943 |
wiki_page = link_project.wiki.find_page(page)
|
|
| 940 |
wiki_page = wiki.find_page(page) |
|
| 944 | 941 |
url = |
| 945 | 942 |
if anchor.present? && wiki_page.present? && |
| 946 | 943 |
(obj.is_a?(WikiContent) || obj.is_a?(WikiContent::Version)) && |
| app/helpers/wiki_helper.rb | ||
|---|---|---|
| 56 | 56 |
def wiki_page_edit_cancel_path(page) |
| 57 | 57 |
if page.new_record? |
| 58 | 58 |
if parent = page.parent |
| 59 |
project_wiki_page_path(parent.project, parent.title)
|
|
| 59 |
wiki_page_action_path('show', parent)
|
|
| 60 | 60 |
else |
| 61 |
project_wiki_index_path(page.project) |
|
| 61 |
if page.project |
|
| 62 |
project_wiki_index_path(page.project) |
|
| 63 |
else |
|
| 64 |
wiki_index_path |
|
| 65 |
end |
|
| 62 | 66 |
end |
| 63 | 67 |
else |
| 64 |
project_wiki_page_path(page.project, page.title)
|
|
| 68 |
wiki_page_action_path('show', page)
|
|
| 65 | 69 |
end |
| 66 | 70 |
end |
| 67 | 71 | |
| 72 |
def wiki_page_action_path(action_name, page=nil, options={})
|
|
| 73 |
url_for({:controller => 'wiki', :action => action_name, :project_id => (page.wiki.project if page), :id => (page.title if page)}.merge(options))
|
|
| 74 |
end |
|
| 75 | ||
| 68 | 76 |
def wiki_content_update_info(content) |
| 69 | 77 |
l(:label_updated_time_by, :author => link_to_user(content.author), :age => time_tag(content.updated_on)).html_safe |
| 70 | 78 |
end |
| app/models/wiki.rb | ||
|---|---|---|
| 34 | 34 |
safe_attributes 'start_page' |
| 35 | 35 | |
| 36 | 36 |
def visible?(user=User.current) |
| 37 |
!user.nil? && user.allowed_to?(:view_wiki_pages, project) |
|
| 37 |
!user.nil? && user.allowed_to?(:view_wiki_pages, project, global: self.global?)
|
|
| 38 | 38 |
end |
| 39 | 39 | |
| 40 | 40 |
# Returns the wiki page that acts as the sidebar content |
| ... | ... | |
| 85 | 85 |
# Wiki.find_page("foo:bar")
|
| 86 | 86 |
def self.find_page(title, options = {})
|
| 87 | 87 |
project = options[:project] |
| 88 |
if title.to_s =~ %r{^([^\:]+)\:(.*)$}
|
|
| 88 |
if title.to_s =~ %r{^(.*):(.*)$}
|
|
| 89 | 89 |
project_identifier, title = $1, $2 |
| 90 | 90 |
project = Project.find_by_identifier(project_identifier) || Project.find_by_name(project_identifier) |
| 91 | 91 |
end |
| 92 |
if project && project.wiki |
|
| 93 |
page = project.wiki.find_page(title) |
|
| 92 |
wiki = project_identifier.present? ? (project && project.wiki) : Wiki.find_by(project: nil) |
|
| 93 |
if wiki |
|
| 94 |
page = wiki.find_page(title) |
|
| 94 | 95 |
if page && page.content |
| 95 | 96 |
page |
| 96 | 97 |
end |
| ... | ... | |
| 105 | 106 |
title = (title.slice(0..0).upcase + (title.slice(1..-1) || '')) if title |
| 106 | 107 |
title |
| 107 | 108 |
end |
| 109 | ||
| 110 |
def global? |
|
| 111 |
self.project.nil? |
|
| 112 |
end |
|
| 113 | ||
| 114 |
def allowed_to_permission?(permission, user=User.current) |
|
| 115 |
user.allowed_to?(permission, self.project, :global => self.global?) |
|
| 116 |
end |
|
| 117 | ||
| 118 |
def allowed_to_action?(action) |
|
| 119 |
User.current.allowed_to?({:controller => 'wiki', :action => action}, self.project, :global => self.global?)
|
|
| 120 |
end |
|
| 108 | 121 |
end |
| app/models/wiki_page.rb | ||
|---|---|---|
| 78 | 78 |
end |
| 79 | 79 | |
| 80 | 80 |
def visible?(user=User.current) |
| 81 |
!user.nil? && user.allowed_to?(:view_wiki_pages, project) |
|
| 81 |
!user.nil? && |
|
| 82 |
user.allowed_to?(:view_wiki_pages, self.project, global: self.wiki.global?) |
|
| 83 |
end |
|
| 84 | ||
| 85 |
def attachments_visible?(user=User.current) |
|
| 86 |
(respond_to?(:visible?) ? visible?(user) : true) && |
|
| 87 |
user.allowed_to?(self.class.attachable_options[:view_permission], self.project, global: self.wiki.global?) |
|
| 82 | 88 |
end |
| 83 | 89 | |
| 84 | 90 |
def title=(value) |
| ... | ... | |
| 203 | 209 | |
| 204 | 210 |
# Returns true if usr is allowed to edit the page, otherwise false |
| 205 | 211 |
def editable_by?(usr) |
| 206 |
!protected? || usr.allowed_to?(:protect_wiki_pages, wiki.project)
|
|
| 212 |
!protected? || self.wiki.allowed_to_permission?(:protect_wiki_pages)
|
|
| 207 | 213 |
end |
| 208 | 214 | |
| 209 | 215 |
def attachments_deletable?(usr=User.current) |
| app/views/wiki/_new_modal.html.erb | ||
|---|---|---|
| 1 | 1 |
<h3 class="title"><%=l(:label_wiki_page_new)%></h3> |
| 2 | 2 | |
| 3 | 3 |
<%= labelled_form_for :page, @page, |
| 4 |
:url => new_project_wiki_page_path(@project),
|
|
| 4 |
:url => wiki_page_action_path('new', @page),
|
|
| 5 | 5 |
:method => 'post', |
| 6 | 6 |
:remote => true do |f| %> |
| 7 | 7 | |
| app/views/wiki/annotate.html.erb | ||
|---|---|---|
| 6 | 6 | |
| 7 | 7 |
<%= wiki_page_breadcrumb(@page) %> |
| 8 | 8 | |
| 9 |
<%= title [@page.pretty_title, project_wiki_page_path(@page.project, @page.title, :version => nil)],
|
|
| 10 |
[l(:label_history), history_project_wiki_page_path(@page.project, @page.title)],
|
|
| 9 |
<%= title [@page.pretty_title, wiki_page_action_path('show', @page, {:version => nil})],
|
|
| 10 |
[l(:label_history), wiki_page_action_path('history', @page)],
|
|
| 11 | 11 |
"#{l(:label_version)} #{@annotate.content.version}" %>
|
| 12 | 12 | |
| 13 | 13 |
<p> |
| app/views/wiki/date_index.html.erb | ||
|---|---|---|
| 1 | 1 |
<div class="contextual"> |
| 2 | 2 |
<% if User.current.allowed_to?(:edit_wiki_pages, @project) %> |
| 3 |
<%= link_to l(:label_wiki_page_new), new_project_wiki_page_path(@project), :remote => true, :class => 'icon icon-add' %>
|
|
| 3 |
<%= link_to l(:label_wiki_page_new), wiki_page_action_path('new', @page), :remote => true, :class => 'icon icon-add' %>
|
|
| 4 | 4 |
<% end %> |
| 5 | 5 |
<%= watcher_link(@wiki, User.current) %> |
| 6 | 6 |
<% if User.current.allowed_to?(:manage_wiki, @project) %> |
| app/views/wiki/diff.html.erb | ||
|---|---|---|
| 5 | 5 | |
| 6 | 6 |
<%= wiki_page_breadcrumb(@page) %> |
| 7 | 7 | |
| 8 |
<%= title [@page.pretty_title, project_wiki_page_path(@page.project, @page.title, :version => nil)],
|
|
| 9 |
[l(:label_history), history_project_wiki_page_path(@page.project, @page.title)],
|
|
| 8 |
<%= title [@page.pretty_title, wiki_page_action_path('show', @page, {:version => nil})],
|
|
| 9 |
[l(:label_history), wiki_page_action_path('history', @page)],
|
|
| 10 | 10 |
"#{l(:label_revision)} #{@diff.content_to.version}" %>
|
| 11 | 11 | |
| 12 | 12 |
<p> |
| app/views/wiki/edit.html.erb | ||
|---|---|---|
| 64 | 64 |
<%= submit_tag l(:button_save) %> |
| 65 | 65 |
<%= link_to l(:button_cancel), wiki_page_edit_cancel_path(@page) %> |
| 66 | 66 |
</p> |
| 67 |
<%= wikitoolbar_for 'content_text', preview_project_wiki_page_path(:project_id => @project, :id => @page.title) %>
|
|
| 67 |
<%= wikitoolbar_for 'content_text', wiki_page_action_path('preview', @page) %>
|
|
| 68 | 68 |
<% end %> |
| 69 | 69 | |
| 70 | 70 |
<% content_for :header_tags do %> |
| app/views/wiki/history.html.erb | ||
|---|---|---|
| 1 | 1 |
<%= wiki_page_breadcrumb(@page) %> |
| 2 | 2 | |
| 3 |
<%= title [@page.pretty_title, project_wiki_page_path(@page.project, @page.title, :version => nil)], l(:label_history) %>
|
|
| 3 |
<%= title [@page.pretty_title, wiki_page_action_path('show', @page, {:version => nil})], l(:label_history) %>
|
|
| 4 | 4 | |
| 5 | 5 |
<%= form_tag({:controller => 'wiki', :action => 'diff',
|
| 6 | 6 |
:project_id => @page.project, :id => @page.title}, |
| ... | ... | |
| 31 | 31 |
<td class="comments"><%= ver.comments %></td> |
| 32 | 32 |
<td class="buttons"> |
| 33 | 33 |
<%= link_to l(:button_annotate), :action => 'annotate', :id => @page.title, :version => ver.version %> |
| 34 |
<%= delete_link wiki_page_path(@page, :version => ver.version) if User.current.allowed_to?(:delete_wiki_pages, @page.project) && @version_count > 1 %>
|
|
| 34 |
<%= delete_link wiki_page_action_path('show', @page, {:version => ver.version}) if @page.wiki.allowed_to_permission?(:delete_wiki_pages) && @version_count > 1 %>
|
|
| 35 | 35 |
</td> |
| 36 | 36 |
</tr> |
| 37 | 37 |
<% line_num += 1 %> |
| app/views/wiki/index.html.erb | ||
|---|---|---|
| 1 | 1 |
<div class="contextual"> |
| 2 | 2 |
<% if User.current.allowed_to?(:edit_wiki_pages, @project) %> |
| 3 |
<%= link_to l(:label_wiki_page_new), new_project_wiki_page_path(@project), :remote => true, :class => 'icon icon-add' %>
|
|
| 3 |
<%= link_to l(:label_wiki_page_new), wiki_page_action_path('new'), :remote => true, :class => 'icon icon-add' %>
|
|
| 4 | 4 |
<% end %> |
| 5 | 5 |
<%= watcher_link(@wiki, User.current) %> |
| 6 | 6 |
<% if User.current.allowed_to?(:manage_wiki, @project) %> |
| app/views/wiki/new.html.erb | ||
|---|---|---|
| 1 | 1 |
<%= title l(:label_wiki_page_new) %> |
| 2 | 2 | |
| 3 | 3 |
<%= labelled_form_for :page, @page, |
| 4 |
:url => new_project_wiki_page_path(@project) do |f| %>
|
|
| 4 |
:url => wiki_page_action_path('new', @page) do |f| %>
|
|
| 5 | 5 | |
| 6 | 6 |
<%= render_error_messages @page.errors.full_messages_for(:title) %> |
| 7 | 7 | |
| app/views/wiki/rename.html.erb | ||
|---|---|---|
| 30 | 30 |
<%= javascript_tag do %> |
| 31 | 31 |
$('#wiki_page_wiki_id').change(function() {
|
| 32 | 32 |
$.ajax({
|
| 33 |
url: '<%= rename_project_wiki_page_path(@wiki, :format => 'js') %>',
|
|
| 33 |
url: '<%= wiki_page_action_path('rename', @page, {:format => 'js'}) %>',
|
|
| 34 | 34 |
type: 'get', |
| 35 | 35 |
data: { 'wiki_page[wiki_id]': $('#wiki_page_wiki_id').val() }
|
| 36 | 36 |
}); |
| app/views/wiki/show.html.erb | ||
|---|---|---|
| 2 | 2 | |
| 3 | 3 |
<% if @editable %> |
| 4 | 4 |
<% if @content.current_version? %> |
| 5 |
<%= link_to_if_authorized(l(:button_edit), {:action => 'edit', :id => @page.title}, :class => 'icon icon-edit', :accesskey => accesskey(:edit)) %>
|
|
| 5 |
<%= link_to(l(:button_edit), {:action => 'edit', :id => @page.title}, :class => 'icon icon-edit', :accesskey => accesskey(:edit)) if @page.wiki.allowed_to_action?('edit') %>
|
|
| 6 | 6 |
<%= watcher_link(@page, User.current) %> |
| 7 | 7 |
<% end %> |
| 8 | 8 |
<% end %> |
| 9 | 9 | |
| 10 | 10 |
<%= actions_dropdown do %> |
| 11 |
<%= link_to_if_authorized(l(:label_history), {:action => 'history', :id => @page.title}, :class => 'icon icon-history') %>
|
|
| 11 |
<%= link_to(l(:label_history), {:action => 'history', :id => @page.title}, :class => 'icon icon-history') if @page.wiki.allowed_to_action?('history') %>
|
|
| 12 | 12 | |
| 13 | 13 |
<% if @editable %> |
| 14 | 14 |
<% if @content.current_version? %> |
| 15 |
<%= link_to_if_authorized(l(:button_lock), {:action => 'protect', :id => @page.title, :protected => 1}, :method => :post, :class => 'icon icon-lock') if !@page.protected? %>
|
|
| 16 |
<%= link_to_if_authorized(l(:button_unlock), {:action => 'protect', :id => @page.title, :protected => 0}, :method => :post, :class => 'icon icon-unlock') if @page.protected? %>
|
|
| 17 |
<%= link_to_if_authorized(l(:button_rename), {:action => 'rename', :id => @page.title}, :class => 'icon icon-move') %>
|
|
| 18 |
<%= link_to_if_authorized(l(:button_delete), {:action => 'destroy', :id => @page.title}, :method => :delete, :data => {:confirm => l(:text_are_you_sure)}, :class => 'icon icon-del') %>
|
|
| 15 |
<%= link_to(l(:button_lock), {:action => 'protect', :id => @page.title, :protected => 1}, :method => :post, :class => 'icon icon-lock') if !@page.protected? && @page.wiki.allowed_to_action?('protect') %>
|
|
| 16 |
<%= link_to(l(:button_unlock), {:action => 'protect', :id => @page.title, :protected => 0}, :method => :post, :class => 'icon icon-unlock') if @page.protected? && @page.wiki.allowed_to_action?('protect') %>
|
|
| 17 |
<%= link_to(l(:button_rename), {:action => 'rename', :id => @page.title}, :class => 'icon icon-move') if @page.wiki.allowed_to_action?('rename') %>
|
|
| 18 |
<%= link_to(l(:button_delete), {:action => 'destroy', :id => @page.title}, :method => :delete, :data => {:confirm => l(:text_are_you_sure)}, :class => 'icon icon-del') if @page.wiki.allowed_to_action?('destroy') %>
|
|
| 19 | 19 |
<% else %> |
| 20 |
<%= link_to_if_authorized(l(:button_rollback), {:action => 'edit', :id => @page.title, :version => @content.version }, :class => 'icon icon-cancel') %>
|
|
| 20 |
<%= link_to(l(:button_rollback), {:action => 'edit', :id => @page.title, :version => @content.version }, :class => 'icon icon-cancel') if @page.wiki.allowed_to_action?('edit') %>
|
|
| 21 | 21 |
<% end %> |
| 22 | 22 |
<% end %> |
| 23 | 23 | |
| 24 | 24 |
<% if User.current.allowed_to?(:edit_wiki_pages, @project) %> |
| 25 |
<%= link_to l(:label_wiki_page_new), new_project_wiki_page_path(@project, :parent => @page.title), :remote => true, :class => 'icon icon-add' %>
|
|
| 25 |
<%= link_to l(:label_wiki_page_new), wiki_page_action_path('new', @page, {:parent => @page.title}), :remote => true, :class => 'icon icon-add' %>
|
|
| 26 | 26 |
<% end %> |
| 27 | 27 |
<% end %> |
| 28 | 28 |
</div> |
| ... | ... | |
| 30 | 30 |
<%= wiki_page_breadcrumb(@page) %> |
| 31 | 31 | |
| 32 | 32 |
<% unless @content.current_version? %> |
| 33 |
<%= title [@page.pretty_title, project_wiki_page_path(@page.project, @page.title, :version => nil)],
|
|
| 34 |
[l(:label_history), history_project_wiki_page_path(@page.project, @page.title)],
|
|
| 33 |
<%= title [@page.pretty_title, wiki_page_action_path('show', @page, {:version => nil})],
|
|
| 34 |
[l(:label_history), wiki_page_action_path('history', @page)],
|
|
| 35 | 35 |
"#{l(:label_revision)} #{@content.version}" %>
|
| 36 | 36 | |
| 37 | 37 |
<p> |
| config/locales/ja.yml | ||
|---|---|---|
| 299 | 299 |
field_attr_firstname: 名の属性 |
| 300 | 300 |
field_attr_lastname: 姓の属性 |
| 301 | 301 |
field_attr_mail: メールアドレスの属性 |
| 302 |
field_onthefly: ユーザーが存在しなければ作成
|
|
| 302 |
field_onthefly: あわせてユーザーを作成
|
|
| 303 | 303 |
field_start_date: 開始日 |
| 304 | 304 |
field_done_ratio: 進捗率 |
| 305 | 305 |
field_auth_source: 認証方式 |
| config/routes.rb | ||
|---|---|---|
| 184 | 184 |
get 'wiki/:id/:version/annotate', :to => 'wiki#annotate' |
| 185 | 185 |
get 'wiki/:id/:version/diff', :to => 'wiki#diff' |
| 186 | 186 |
end |
| 187 |
match 'wiki/index', :controller => 'wiki', :action => 'index', :via => :get |
|
| 188 |
resources :wiki, :except => [:index, :create, :show], :as => 'wiki_page' do |
|
| 189 |
member do |
|
| 190 |
get 'wiki', :as => 'show_wiki_page' |
|
| 191 |
get 'rename' |
|
| 192 |
post 'rename' |
|
| 193 |
get 'history' |
|
| 194 |
get 'diff' |
|
| 195 |
match 'preview', :via => [:post, :put, :patch] |
|
| 196 |
post 'protect' |
|
| 197 |
post 'add_attachment' |
|
| 198 |
end |
|
| 199 |
collection do |
|
| 200 |
get 'export' |
|
| 201 |
get 'date_index' |
|
| 202 |
post 'new' |
|
| 203 |
end |
|
| 204 |
end |
|
| 205 |
match 'wiki', :controller => 'wiki', :action => 'show', :via => :get |
|
| 206 |
get 'wiki/:id/:version', :to => 'wiki#show', :constraints => {:version => /\d+/}
|
|
| 207 |
delete 'wiki/:id/:version', :to => 'wiki#destroy_version' |
|
| 208 |
get 'wiki/:id/:version/annotate', :to => 'wiki#annotate' |
|
| 209 |
get 'wiki/:id/:version/diff', :to => 'wiki#diff' |
|
| 210 |
match 'wiki/:id/destroy', :to => 'wikis#destroy', :via => [:get, :post] |
|
| 187 | 211 | |
| 188 | 212 |
resources :issues do |
| 189 | 213 |
member do |
| db/migrate/20200729083854_allow_wiki_project_id_to_be_nil.rb | ||
|---|---|---|
| 1 |
class AllowWikiProjectIdToBeNil < ActiveRecord::Migration[5.2] |
|
| 2 |
def up |
|
| 3 |
change_column_null :wikis, :project_id, true |
|
| 4 |
end |
|
| 5 |
def down |
|
| 6 |
change_column_null :wikis, :project_id, false |
|
| 7 |
end |
|
| 8 |
end |
|
| lib/redmine.rb | ||
|---|---|---|
| 242 | 242 |
EnabledModule.exists?(:project => Project.visible, :name => :news) |
| 243 | 243 |
}, |
| 244 | 244 |
:caption => :label_news_plural |
| 245 |
menu.push :wiki, {:controller => 'wiki', :action => 'show'},
|
|
| 246 |
:if => Proc.new {
|
|
| 247 |
User.current.allowed_to?(:view_wiki_pages, nil, :global => true) |
|
| 248 |
}, |
|
| 249 |
:caption => :label_wiki |
|
| 245 | 250 |
end |
| 246 | 251 | |
| 247 | 252 |
Redmine::MenuManager.map :admin_menu do |menu| |
| lib/redmine/wiki_formatting/macros.rb | ||
|---|---|---|
| 206 | 206 |
else |
| 207 | 207 |
raise 'With no argument, this macro can be called from wiki pages only.' |
| 208 | 208 |
end |
| 209 |
raise 'Page not found' if page.nil? || !User.current.allowed_to?(:view_wiki_pages, page.wiki.project) |
|
| 209 |
raise 'Page not found' if page.nil? || !User.current.allowed_to?(:view_wiki_pages, page.wiki.project, global: page.wiki.global?)
|
|
| 210 | 210 |
pages = page.self_and_descendants(options[:depth]).group_by(&:parent_id) |
| 211 | 211 |
render_page_hierarchy(pages, options[:parent] ? page.parent_id : page.id) |
| 212 | 212 |
end |
| ... | ... | |
| 216 | 216 |
"{{include(projectname:Foo)}} -- to include a page of a specific project wiki"
|
| 217 | 217 |
macro :include do |obj, args| |
| 218 | 218 |
page = Wiki.find_page(args.first.to_s, :project => @project) |
| 219 |
raise 'Page not found' if page.nil? || !User.current.allowed_to?(:view_wiki_pages, page.wiki.project) |
|
| 219 |
raise 'Page not found' if page.nil? || !User.current.allowed_to?(:view_wiki_pages, page.wiki.project, global: page.wiki.global?)
|
|
| 220 | 220 |
@included_wiki_pages ||= [] |
| 221 | 221 |
raise 'Circular inclusion detected' if @included_wiki_pages.include?(page.id) |
| 222 | 222 |
@included_wiki_pages << page.id |