86 lines
3.6 KiB
JavaScript
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;
|
|
}
|
|
});
|
|
})();
|