Allow merging when moving pages

This commit is contained in:
2026-06-16 10:00:41 +02:00
parent d719b53404
commit 404ce088f3
4 changed files with 178 additions and 14 deletions
+39 -3
View File
@@ -13,6 +13,11 @@ function encodePickedPath(p) {
// re-fetching, so a server-side mutation wouldn't be reflected. Instead,
// rewrite the current entry's URL via history.replaceState, then reload — the
// reload always re-fetches and preserves the (new) URL including its fragment.
function navigateReplace(target) {
window.history.replaceState(null, '', target);
window.location.reload();
}
function postReplace(action, body, target) {
var init = { method: 'POST', redirect: 'manual' };
if (body) {
@@ -21,8 +26,7 @@ function postReplace(action, body, target) {
}
fetch(action, init).then(function (res) {
if (res.type === 'opaqueredirect' || res.ok) {
window.history.replaceState(null, '', target);
window.location.reload();
navigateReplace(target);
return;
}
return res.text().then(function (msg) {
@@ -71,6 +75,38 @@ function newPage() {
});
}
// submitMove POSTs a move and navigates on success. When the server reports
// the destination folder already exists but can be merged (the source carries
// a page and the destination has none), it asks the user to confirm and
// retries the same move with &merge=1.
function submitMove(action, target) {
fetch(action, { method: 'POST', redirect: 'manual' }).then(function (res) {
if (res.type === 'opaqueredirect' || res.ok) {
navigateReplace(target);
return;
}
if (res.status === 409 && res.headers.get('X-Merge-Available') === '1') {
openModal({
title: 'Merge folders?',
body: 'The destination folder already exists but has no page of its own. Merge this page and its contents into it?',
confirm: {
label: 'MERGE',
onConfirm: function () {
closeModal();
submitMove(action + '&merge=1', target);
}
}
});
return;
}
return res.text().then(function (msg) {
alert(msg || ('Request failed (' + res.status + ')'));
});
}).catch(function () {
alert('Network error');
});
}
function movePage() {
var current = decodeURIComponent(window.location.pathname).replace(/\/+$/, '');
if (!current) return;
@@ -121,7 +157,7 @@ function movePage() {
if (linksCheckbox.checked) action += '&links=1';
var target = encodePickedPath(dest) + '/';
closeModal();
postReplace(action, null, target);
submitMove(action, target);
}
}
});