Allow wiki pages to be renamed in the UI
This commit is contained in:
parent
43c015472b
commit
29be4e0f58
10 changed files with 96 additions and 56 deletions
|
@ -113,10 +113,10 @@ class ProjectWiki
|
|||
return false
|
||||
end
|
||||
|
||||
def update_page(page, content, format = :markdown, message = nil)
|
||||
def update_page(page, content:, title: nil, format: :markdown, message: nil)
|
||||
commit = commit_details(:updated, message, page.title)
|
||||
|
||||
wiki.update_page(page, page.name, format.to_sym, content, commit)
|
||||
wiki.update_page(page, title || page.name, format.to_sym, content, commit)
|
||||
|
||||
update_project_activity
|
||||
end
|
||||
|
|
|
@ -180,31 +180,50 @@ class WikiPage
|
|||
#
|
||||
# Returns the String SHA1 of the newly created page
|
||||
# or False if the save was unsuccessful.
|
||||
def create(attr = {})
|
||||
@attributes.merge!(attr)
|
||||
def create(attrs = {})
|
||||
@attributes.merge!(attrs)
|
||||
|
||||
save :create_page, title, content, format, message
|
||||
save(page_details: title) do
|
||||
wiki.create_page(title, content, format, message)
|
||||
end
|
||||
end
|
||||
|
||||
# Updates an existing Wiki Page, creating a new version.
|
||||
#
|
||||
# new_content - The raw markup content to replace the existing.
|
||||
# format - Optional symbol representing the content format.
|
||||
# See ProjectWiki::MARKUPS Hash for available formats.
|
||||
# message - Optional commit message to set on the new version.
|
||||
# last_commit_sha - Optional last commit sha to validate the page unchanged.
|
||||
# attrs - Hash of attributes to be updated on the page.
|
||||
# :content - The raw markup content to replace the existing.
|
||||
# :format - Optional symbol representing the content format.
|
||||
# See ProjectWiki::MARKUPS Hash for available formats.
|
||||
# :message - Optional commit message to set on the new version.
|
||||
# :last_commit_sha - Optional last commit sha to validate the page unchanged.
|
||||
# :title - The Title to replace existing title
|
||||
#
|
||||
# Returns the String SHA1 of the newly created page
|
||||
# or False if the save was unsuccessful.
|
||||
def update(new_content, format: :markdown, message: nil, last_commit_sha: nil)
|
||||
@attributes[:content] = new_content
|
||||
@attributes[:format] = format
|
||||
|
||||
def update(attrs = {})
|
||||
last_commit_sha = attrs.delete(:last_commit_sha)
|
||||
if last_commit_sha && last_commit_sha != self.last_commit_sha
|
||||
raise PageChangedError.new("You are attempting to update a page that has changed since you started editing it.")
|
||||
end
|
||||
|
||||
save :update_page, @page, content, format, message
|
||||
attrs.slice!(:content, :format, :message, :title)
|
||||
@attributes.merge!(attrs)
|
||||
page_details =
|
||||
if title.present? && @page.title != title
|
||||
title
|
||||
else
|
||||
@page.url_path
|
||||
end
|
||||
|
||||
save(page_details: page_details) do
|
||||
wiki.update_page(
|
||||
@page,
|
||||
content: content,
|
||||
format: format,
|
||||
message: attrs[:message],
|
||||
title: title
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
# Destroys the Wiki Page.
|
||||
|
@ -236,30 +255,19 @@ class WikiPage
|
|||
attributes[:format] = @page.format
|
||||
end
|
||||
|
||||
def save(method, *args)
|
||||
saved = false
|
||||
def save(page_details:)
|
||||
return unless valid?
|
||||
|
||||
project_wiki = wiki
|
||||
if valid? && project_wiki.send(method, *args)
|
||||
|
||||
page_details = if method == :update_page
|
||||
# Use url_path instead of path to omit format extension
|
||||
@page.url_path
|
||||
else
|
||||
title
|
||||
end
|
||||
|
||||
page_title, page_dir = project_wiki.page_title_and_dir(page_details)
|
||||
gollum_wiki = project_wiki.wiki
|
||||
@page = gollum_wiki.paged(page_title, page_dir)
|
||||
|
||||
set_attributes
|
||||
|
||||
@persisted = true
|
||||
saved = true
|
||||
else
|
||||
errors.add(:base, project_wiki.error_message) if project_wiki.error_message
|
||||
unless yield
|
||||
errors.add(:base, wiki.error_message)
|
||||
return false
|
||||
end
|
||||
saved
|
||||
|
||||
page_title, page_dir = wiki.page_title_and_dir(page_details)
|
||||
gollum_wiki = wiki.wiki
|
||||
@page = gollum_wiki.paged(page_title, page_dir)
|
||||
|
||||
set_attributes
|
||||
@persisted = errors.blank?
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
module WikiPages
|
||||
class UpdateService < WikiPages::BaseService
|
||||
def execute(page)
|
||||
if page.update(@params[:content], format: @params[:format], message: @params[:message], last_commit_sha: @params[:last_commit_sha])
|
||||
if page.update(@params)
|
||||
execute_hooks(page, 'update')
|
||||
end
|
||||
|
||||
|
|
|
@ -3,9 +3,12 @@
|
|||
= form_for [@project.namespace.becomes(Namespace), @project, @page], method: @page.persisted? ? :put : :post, html: { class: 'form-horizontal wiki-form common-note-form prepend-top-default js-quick-submit' } do |f|
|
||||
= form_errors(@page)
|
||||
|
||||
= f.hidden_field :title, value: @page.title
|
||||
- if @page.persisted?
|
||||
= f.hidden_field :last_commit_sha, value: @page.last_commit_sha
|
||||
|
||||
.form-group
|
||||
.col-sm-12= f.label :title, class: 'control-label-full-width'
|
||||
.col-sm-12= f.text_field :title, class: 'form-control', value: @page.title
|
||||
.form-group
|
||||
.col-sm-12= f.label :format, class: 'control-label-full-width'
|
||||
.col-sm-12
|
||||
|
|
4
changelogs/unreleased/wiki_title.yml
Normal file
4
changelogs/unreleased/wiki_title.yml
Normal file
|
@ -0,0 +1,4 @@
|
|||
---
|
||||
title: Allow wiki pages to be renamed in the UI
|
||||
merge_request: 10069
|
||||
author: wendy0402
|
|
@ -63,7 +63,7 @@ class Spinach::Features::ProjectWiki < Spinach::FeatureSteps
|
|||
end
|
||||
|
||||
step 'That page has two revisions' do
|
||||
@page.update("new content", message: "second commit")
|
||||
@page.update(content: "new content", message: "second commit")
|
||||
end
|
||||
|
||||
step 'I click the History button' do
|
||||
|
|
|
@ -55,7 +55,7 @@ feature 'Projects > Wiki > User updates wiki page' do
|
|||
scenario 'page has been updated since the user opened the edit page' do
|
||||
click_link 'Edit'
|
||||
|
||||
wiki_page.update('Update')
|
||||
wiki_page.update(content: 'Update')
|
||||
|
||||
click_button 'Save changes'
|
||||
|
||||
|
|
|
@ -223,7 +223,12 @@ describe ProjectWiki do
|
|||
before do
|
||||
create_page("update-page", "some content")
|
||||
@gollum_page = subject.wiki.paged("update-page")
|
||||
subject.update_page(@gollum_page, "some other content", :markdown, "updated page")
|
||||
subject.update_page(
|
||||
@gollum_page,
|
||||
content: "some other content",
|
||||
format: :markdown,
|
||||
message: "updated page"
|
||||
)
|
||||
@page = subject.pages.first.page
|
||||
end
|
||||
|
||||
|
@ -240,7 +245,12 @@ describe ProjectWiki do
|
|||
end
|
||||
|
||||
it 'updates project activity' do
|
||||
subject.update_page(@gollum_page, 'Yet more content', :markdown, 'Updated page again')
|
||||
subject.update_page(
|
||||
@gollum_page,
|
||||
content: 'Yet more content',
|
||||
format: :markdown,
|
||||
message: 'Updated page again'
|
||||
)
|
||||
|
||||
project.reload
|
||||
|
||||
|
|
|
@ -178,12 +178,12 @@ describe WikiPage do
|
|||
end
|
||||
|
||||
it "updates the content of the page" do
|
||||
@page.update("new content")
|
||||
@page.update(content: "new content")
|
||||
@page = wiki.find_page(title)
|
||||
end
|
||||
|
||||
it "returns true" do
|
||||
expect(@page.update("more content")).to be_truthy
|
||||
expect(@page.update(content: "more content")).to be_truthy
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -195,29 +195,42 @@ describe WikiPage do
|
|||
end
|
||||
|
||||
after do
|
||||
destroy_page("Update")
|
||||
destroy_page(@page.title)
|
||||
end
|
||||
|
||||
context "with valid attributes" do
|
||||
it "updates the content of the page" do
|
||||
@page.update("new content")
|
||||
new_content = "new content"
|
||||
|
||||
@page.update(content: new_content)
|
||||
@page = wiki.find_page("Update")
|
||||
|
||||
expect(@page.content).to eq("new content")
|
||||
end
|
||||
|
||||
it "updates the title of the page" do
|
||||
new_title = "Index v.1.2.4"
|
||||
|
||||
@page.update(title: new_title)
|
||||
@page = wiki.find_page(new_title)
|
||||
|
||||
expect(@page.title).to eq(new_title)
|
||||
end
|
||||
|
||||
it "returns true" do
|
||||
expect(@page.update("more content")).to be_truthy
|
||||
expect(@page.update(content: "more content")).to be_truthy
|
||||
end
|
||||
end
|
||||
|
||||
context 'with same last commit sha' do
|
||||
it 'returns true' do
|
||||
expect(@page.update('more content', last_commit_sha: @page.last_commit_sha)).to be_truthy
|
||||
expect(@page.update(content: 'more content', last_commit_sha: @page.last_commit_sha)).to be_truthy
|
||||
end
|
||||
end
|
||||
|
||||
context 'with different last commit sha' do
|
||||
it 'raises exception' do
|
||||
expect { @page.update('more content', last_commit_sha: 'xxx') }.to raise_error(WikiPage::PageChangedError)
|
||||
expect { @page.update(content: 'more content', last_commit_sha: 'xxx') }.to raise_error(WikiPage::PageChangedError)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -249,7 +262,7 @@ describe WikiPage do
|
|||
end
|
||||
|
||||
it "returns an array of all commits for the page" do
|
||||
3.times { |i| @page.update("content #{i}") }
|
||||
3.times { |i| @page.update(content: "content #{i}") }
|
||||
expect(@page.versions.count).to eq(4)
|
||||
end
|
||||
end
|
||||
|
@ -294,7 +307,7 @@ describe WikiPage do
|
|||
before do
|
||||
create_page('Update', 'content')
|
||||
@page = wiki.find_page('Update')
|
||||
3.times { |i| @page.update("content #{i}") }
|
||||
3.times { |i| @page.update(content: "content #{i}") }
|
||||
end
|
||||
|
||||
after do
|
||||
|
@ -338,7 +351,7 @@ describe WikiPage do
|
|||
end
|
||||
|
||||
it 'returns false for updated wiki page' do
|
||||
updated_wiki_page = original_wiki_page.update("Updated content")
|
||||
updated_wiki_page = original_wiki_page.update(content: "Updated content")
|
||||
expect(original_wiki_page).not_to eq(updated_wiki_page)
|
||||
end
|
||||
end
|
||||
|
@ -360,7 +373,7 @@ describe WikiPage do
|
|||
it 'is changed after page updated' do
|
||||
last_commit_sha_before_update = @page.last_commit_sha
|
||||
|
||||
@page.update("new content")
|
||||
@page.update(content: "new content")
|
||||
@page = wiki.find_page("Update")
|
||||
|
||||
expect(@page.last_commit_sha).not_to eq last_commit_sha_before_update
|
||||
|
|
|
@ -9,7 +9,8 @@ describe WikiPages::UpdateService do
|
|||
{
|
||||
content: 'New content for wiki page',
|
||||
format: 'markdown',
|
||||
message: 'New wiki message'
|
||||
message: 'New wiki message',
|
||||
title: 'New Title'
|
||||
}
|
||||
end
|
||||
|
||||
|
@ -27,6 +28,7 @@ describe WikiPages::UpdateService do
|
|||
expect(updated_page.message).to eq(opts[:message])
|
||||
expect(updated_page.content).to eq(opts[:content])
|
||||
expect(updated_page.format).to eq(opts[:format].to_sym)
|
||||
expect(updated_page.title).to eq(opts[:title])
|
||||
end
|
||||
|
||||
it 'executes webhooks' do
|
||||
|
|
Loading…
Reference in a new issue