/* 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; } }); })();