Notify the user when the file path contains leading or trailing spaces and fix the error message for invalid file names. (#31507)

close #31478
This commit is contained in:
charles 2024-09-25 03:06:52 +08:00 committed by GitHub
parent 6fa962f409
commit 3269b04d61
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 45 additions and 6 deletions

View File

@ -317,7 +317,7 @@ func editFilePost(ctx *context.Context, form forms.EditRepoFileForm, isNewFile b
case git.EntryModeBlob: case git.EntryModeBlob:
ctx.RenderWithErr(ctx.Tr("repo.editor.directory_is_a_file", fileErr.Path), tplEditFile, &form) ctx.RenderWithErr(ctx.Tr("repo.editor.directory_is_a_file", fileErr.Path), tplEditFile, &form)
default: default:
ctx.Error(http.StatusInternalServerError, err.Error()) ctx.RenderWithErr(ctx.Tr("repo.editor.filename_is_invalid", fileErr.Path), tplEditFile, &form)
} }
} else { } else {
ctx.Error(http.StatusInternalServerError, err.Error()) ctx.Error(http.StatusInternalServerError, err.Error())

View File

@ -75,24 +75,63 @@ export function initRepoEditor() {
} }
filenameInput.addEventListener('input', function () { filenameInput.addEventListener('input', function () {
const parts = filenameInput.value.split('/'); const parts = filenameInput.value.split('/');
const links = Array.from(document.querySelectorAll('.breadcrumb span.section'));
const dividers = Array.from(document.querySelectorAll('.breadcrumb .breadcrumb-divider'));
let warningDiv = document.querySelector('.ui.warning.message.flash-message.flash-warning.space-related');
let containSpace = false;
if (parts.length > 1) { if (parts.length > 1) {
for (let i = 0; i < parts.length; ++i) { for (let i = 0; i < parts.length; ++i) {
const value = parts[i]; const value = parts[i];
const trimValue = value.trim();
if (trimValue === '..') {
// remove previous tree path
if (links.length > 0) {
const link = links.pop();
const divider = dividers.pop();
link.remove();
divider.remove();
}
continue;
}
if (i < parts.length - 1) { if (i < parts.length - 1) {
if (value.length) { if (trimValue.length) {
filenameInput.before(createElementFromHTML( const linkElement = createElementFromHTML(
`<span class="section"><a href="#">${htmlEscape(value)}</a></span>`, `<span class="section"><a href="#">${htmlEscape(value)}</a></span>`,
)); );
filenameInput.before(createElementFromHTML( const dividerElement = createElementFromHTML(
`<div class="breadcrumb-divider">/</div>`, `<div class="breadcrumb-divider">/</div>`,
)); );
links.push(linkElement);
dividers.push(dividerElement);
filenameInput.before(linkElement);
filenameInput.before(dividerElement);
} }
} else { } else {
filenameInput.value = value; filenameInput.value = value;
} }
this.setSelectionRange(0, 0); this.setSelectionRange(0, 0);
containSpace |= (trimValue !== value && trimValue !== '');
} }
} }
containSpace |= Array.from(links).some((link) => {
const value = link.querySelector('a').textContent;
return value.trim() !== value;
});
containSpace |= parts[parts.length - 1].trim() !== parts[parts.length - 1];
if (containSpace) {
if (!warningDiv) {
warningDiv = document.createElement('div');
warningDiv.classList.add('ui', 'warning', 'message', 'flash-message', 'flash-warning', 'space-related');
warningDiv.innerHTML = '<p>File path contains leading or trailing whitespace.</p>';
// Add display 'block' because display is set to 'none' in formantic\build\semantic.css
warningDiv.style.display = 'block';
const inputContainer = document.querySelector('.repo-editor-header');
inputContainer.insertAdjacentElement('beforebegin', warningDiv);
}
showElem(warningDiv);
} else if (warningDiv) {
hideElem(warningDiv);
}
joinTreePath(); joinTreePath();
}); });
filenameInput.addEventListener('keydown', function (e) { filenameInput.addEventListener('keydown', function (e) {