Files

86 lines
3.6 KiB
JavaScript

/* Reuse server forms and existing permissions; keep edits on the current list. */
(function () {
'use strict';
var dialog = document.getElementById('tracking-dialog');
if (!dialog || typeof dialog.showModal !== 'function' || !window.fetch) return;
var content = document.getElementById('tracking-dialog-content');
var errorBox = document.getElementById('tracking-dialog-error');
var reload = document.getElementById('tracking-reload');
var close = dialog.querySelector('[data-tracking-close]');
var editorUrl = '', serial = 0, saving = false, opener;
function showError(message) {
errorBox.textContent = message;
errorBox.hidden = false;
reload.hidden = false;
}
function errorText(html) {
var doc = new DOMParser().parseFromString(html, 'text/html');
var message = doc.querySelector('.wrap .card p, body > p');
return message ? message.textContent : '暂时无法完成操作,请重新读取当前状态后再试。';
}
async function loadEditor() {
var current = ++serial;
errorBox.hidden = reload.hidden = true;
content.textContent = '正在读取最新状态…';
try {
var response = await fetch(editorUrl + '?fragment=1', {cache: 'no-store', credentials: 'same-origin'});
var html = await response.text();
if (current !== serial || !dialog.open) return;
if (response.redirected) { window.location.assign(response.url); return; }
if (!response.ok) { content.textContent = ''; showError(errorText(html)); return; }
content.innerHTML = html;
var field = content.querySelector('select, input:not([type=hidden])');
if (field) field.focus();
} catch (error) {
if (current === serial && dialog.open) { content.textContent = ''; showError('读取失败,请检查连接后重试。'); }
}
}
document.addEventListener('click', function (event) {
var link = event.target.closest('[data-quick-tracking]');
if (!link || event.ctrlKey || event.metaKey || event.shiftKey || event.altKey) return;
event.preventDefault();
opener = link;
editorUrl = link.href;
dialog.showModal();
loadEditor();
});
close.addEventListener('click', function () { if (!saving) dialog.close(); });
dialog.addEventListener('cancel', function (event) { if (saving) event.preventDefault(); });
dialog.addEventListener('close', function () {
++serial;
content.textContent = '';
if (opener) opener.focus();
});
reload.addEventListener('click', loadEditor);
dialog.addEventListener('submit', async function (event) {
var form = event.target;
event.preventDefault();
if (saving) return;
var data = new FormData(form);
var submit = form.querySelector('[type=submit]');
saving = true;
close.disabled = reload.disabled = submit.disabled = true;
errorBox.hidden = reload.hidden = true;
var retry = true;
try {
var response = await fetch(form.action, {method: 'POST', body: data,
credentials: 'same-origin', headers: {'X-Tracking-Modal': '1'}});
if (response.redirected) { window.location.assign(response.url); return; }
if (response.ok && (response.headers.get('Content-Type') || '').indexOf('application/json') >= 0) {
var result = await response.json();
if (result.ok) { window.location.reload(); return; }
}
retry = response.status === 400;
showError(errorText(await response.text()));
} catch (error) {
retry = false;
showError('连接中断,无法确认是否保存成功。请重新读取当前状态,核对后再操作。');
} finally {
saving = false;
close.disabled = reload.disabled = false;
submit.disabled = !retry;
}
});
})();