Commit 02261356 authored by Markus Koller's avatar Markus Koller

Include invalid directories in wiki title message

Since the directory names can get very long and break the layout if they
don't contain spaces, we tweak the `form_errors` helper to optionally
truncate some error messages.
parent 796cd50d
...@@ -3,18 +3,23 @@ ...@@ -3,18 +3,23 @@
module FormHelper module FormHelper
prepend_if_ee('::EE::FormHelper') # rubocop: disable Cop/InjectEnterpriseEditionModule prepend_if_ee('::EE::FormHelper') # rubocop: disable Cop/InjectEnterpriseEditionModule
def form_errors(model, type: 'form') def form_errors(model, type: 'form', truncate: [])
return unless model.errors.any? return unless model.errors.any?
headline = n_('The %{type} contains the following error:', 'The %{type} contains the following errors:', model.errors.count) % { type: type } headline = n_('The %{type} contains the following error:', 'The %{type} contains the following errors:', model.errors.count) % { type: type }
truncate = Array.wrap(truncate)
content_tag(:div, class: 'alert alert-danger', id: 'error_explanation') do content_tag(:div, class: 'alert alert-danger', id: 'error_explanation') do
content_tag(:h4, headline) << content_tag(:h4, headline) <<
content_tag(:ul) do content_tag(:ul) do
model.errors.full_messages messages = model.errors.map do |attribute, message|
.map { |msg| content_tag(:li, msg) } message = model.errors.full_message(attribute, message)
.join message = content_tag(:span, message, class: 'str-truncated-100') if truncate.include?(attribute)
.html_safe
content_tag(:li, message)
end
messages.join.html_safe
end end
end end
end end
......
...@@ -333,11 +333,15 @@ class WikiPage ...@@ -333,11 +333,15 @@ class WikiPage
*dirnames, title = @attributes[:title].split('/') *dirnames, title = @attributes[:title].split('/')
if title.bytesize > MAX_TITLE_BYTES if title.bytesize > MAX_TITLE_BYTES
errors.add(:title, _("exceeds the limit of %{bytes} bytes for page titles") % { bytes: MAX_TITLE_BYTES }) errors.add(:title, _("exceeds the limit of %{bytes} bytes") % { bytes: MAX_TITLE_BYTES })
end end
if dirnames.any? { |d| d.bytesize > MAX_DIRECTORY_BYTES } invalid_dirnames = dirnames.select { |d| d.bytesize > MAX_DIRECTORY_BYTES }
errors.add(:title, _("exceeds the limit of %{bytes} bytes for directory names") % { bytes: MAX_DIRECTORY_BYTES }) invalid_dirnames.each do |dirname|
errors.add(:title, _('exceeds the limit of %{bytes} bytes for directory name "%{dirname}"') % {
bytes: MAX_DIRECTORY_BYTES,
dirname: dirname
})
end end
end end
end end
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
= form_for [@project.namespace.becomes(Namespace), @project, @page], method: @page.persisted? ? :put : :post, = form_for [@project.namespace.becomes(Namespace), @project, @page], method: @page.persisted? ? :put : :post,
html: { class: form_classes }, html: { class: form_classes },
data: { uploads_path: uploads_path } do |f| data: { uploads_path: uploads_path } do |f|
= form_errors(@page) = form_errors(@page, truncate: :title)
- if @page.persisted? - if @page.persisted?
= f.hidden_field :last_commit_sha, value: @page.last_commit_sha = f.hidden_field :last_commit_sha, value: @page.last_commit_sha
......
---
title: Include invalid directories in wiki title message
merge_request: 25376
author:
type: changed
...@@ -23227,10 +23227,10 @@ msgstr "" ...@@ -23227,10 +23227,10 @@ msgstr ""
msgid "estimateCommand|%{slash_command} will update the estimated time with the latest command." msgid "estimateCommand|%{slash_command} will update the estimated time with the latest command."
msgstr "" msgstr ""
msgid "exceeds the limit of %{bytes} bytes for directory names" msgid "exceeds the limit of %{bytes} bytes"
msgstr "" msgstr ""
msgid "exceeds the limit of %{bytes} bytes for page titles" msgid "exceeds the limit of %{bytes} bytes for directory name \"%{dirname}\""
msgstr "" msgstr ""
msgid "expired on %{milestone_due_date}" msgid "expired on %{milestone_due_date}"
......
...@@ -39,6 +39,25 @@ describe FormHelper do ...@@ -39,6 +39,25 @@ describe FormHelper do
end end
end end
it 'renders messages truncated if requested' do
model = double(errors: errors_stub('Error 1', 'Error 2'))
model.errors.add(:title, 'is truncated')
model.errors.add(:base, 'Error 3')
expect(model.class).to receive(:human_attribute_name) do |attribute|
attribute.to_s.capitalize
end
errors = helper.form_errors(model, truncate: :title)
aggregate_failures do
expect(errors).to include('<li>Error 1</li>')
expect(errors).to include('<li>Error 2</li>')
expect(errors).to include('<li><span class="str-truncated-100">Title is truncated</span></li>')
expect(errors).to include('<li>Error 3</li>')
end
end
def errors_stub(*messages) def errors_stub(*messages)
ActiveModel::Errors.new(double).tap do |errors| ActiveModel::Errors.new(double).tap do |errors|
messages.each { |msg| errors.add(:base, msg) } messages.each { |msg| errors.add(:base, msg) }
......
...@@ -192,16 +192,17 @@ describe WikiPage do ...@@ -192,16 +192,17 @@ describe WikiPage do
expect(subject).not_to be_valid expect(subject).not_to be_valid
expect(subject.errors[:title]).to contain_exactly( expect(subject.errors[:title]).to contain_exactly(
"exceeds the limit of #{max_title} bytes for page titles" "exceeds the limit of #{max_title} bytes"
) )
end end
it 'rejects directories exceeding the limit' do it 'rejects directories exceeding the limit' do
subject.title = invalid_directory + '/foo' subject.title = "#{invalid_directory}/#{invalid_directory}2/foo"
expect(subject).not_to be_valid expect(subject).not_to be_valid
expect(subject.errors[:title]).to contain_exactly( expect(subject.errors[:title]).to contain_exactly(
"exceeds the limit of #{max_directory} bytes for directory names" "exceeds the limit of #{max_directory} bytes for directory name \"#{invalid_directory}\"",
"exceeds the limit of #{max_directory} bytes for directory name \"#{invalid_directory}2\""
) )
end end
...@@ -210,8 +211,8 @@ describe WikiPage do ...@@ -210,8 +211,8 @@ describe WikiPage do
expect(subject).not_to be_valid expect(subject).not_to be_valid
expect(subject.errors[:title]).to contain_exactly( expect(subject.errors[:title]).to contain_exactly(
"exceeds the limit of #{max_title} bytes for page titles", "exceeds the limit of #{max_title} bytes",
"exceeds the limit of #{max_directory} bytes for directory names" "exceeds the limit of #{max_directory} bytes for directory name \"#{invalid_directory}\""
) )
end end
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment