fix: validate modal session state
This commit is contained in:
parent
a117a29b0d
commit
4b6c78105e
@ -436,7 +436,6 @@
|
||||
selectDescendantsButton: document.getElementById("modal-select-descendants-button"),
|
||||
clearSelectionButton: document.getElementById("modal-clear-selection-button"),
|
||||
importSelectedItemsButton: document.getElementById("modal-import-selected-items-button"),
|
||||
previewPopover: document.getElementById("item-preview-popover"),
|
||||
currentProjectLabel: document.getElementById("current-project-label"),
|
||||
cardList: document.getElementById("card-list"),
|
||||
cardDetail: document.getElementById("card-detail"),
|
||||
@ -613,6 +612,24 @@
|
||||
return lookup;
|
||||
}
|
||||
|
||||
function normalizeSelectedCollectionKey() {
|
||||
if (!state.collectionTree.length) {
|
||||
state.selectedCollectionKey = null;
|
||||
state.expandedCollectionKeys.clear();
|
||||
persistImportSessionState();
|
||||
return null;
|
||||
}
|
||||
const parentLookup = collectCollectionParents(state.collectionTree);
|
||||
if (!state.selectedCollectionKey || !parentLookup.has(state.selectedCollectionKey)) {
|
||||
state.selectedCollectionKey = state.collectionTree[0].collection_key;
|
||||
}
|
||||
state.expandedCollectionKeys = new Set(
|
||||
Array.from(state.expandedCollectionKeys).filter((key) => parentLookup.has(key))
|
||||
);
|
||||
persistImportSessionState();
|
||||
return state.selectedCollectionKey;
|
||||
}
|
||||
|
||||
function ensureSelectedCollectionExpanded() {
|
||||
if (!state.selectedCollectionKey) {
|
||||
return;
|
||||
@ -733,9 +750,7 @@
|
||||
setStatus(elements.collectionStatus, "正在加载 collection...");
|
||||
const payload = await api("/api/zotero/collections/tree");
|
||||
state.collectionTree = Array.isArray(payload.collections) ? payload.collections : [];
|
||||
if (!state.selectedCollectionKey && state.collectionTree.length) {
|
||||
state.selectedCollectionKey = state.collectionTree[0].collection_key;
|
||||
}
|
||||
normalizeSelectedCollectionKey();
|
||||
ensureSelectedCollectionExpanded();
|
||||
persistImportSessionState();
|
||||
renderCollectionTree();
|
||||
@ -750,6 +765,16 @@
|
||||
|
||||
async function loadCollectionItems(collectionKey) {
|
||||
state.selectedCollectionKey = collectionKey;
|
||||
if (normalizeSelectedCollectionKey() !== collectionKey) {
|
||||
state.visibleCollectionItems = [];
|
||||
renderCollectionTree();
|
||||
renderCollectionItems();
|
||||
setStatus(elements.collectionStatus, state.selectedCollectionKey ? "已切换到可用 collection。" : "");
|
||||
if (state.selectedCollectionKey) {
|
||||
await loadCollectionItems(state.selectedCollectionKey);
|
||||
}
|
||||
return;
|
||||
}
|
||||
ensureSelectedCollectionExpanded();
|
||||
persistImportSessionState();
|
||||
renderCollectionTree();
|
||||
@ -815,8 +840,6 @@
|
||||
elements.importModal.hidden = false;
|
||||
elements.importModal.setAttribute("aria-hidden", "false");
|
||||
document.body.classList.toggle("modal-open", true);
|
||||
elements.previewPopover.hidden = true;
|
||||
elements.previewPopover.textContent = "";
|
||||
updateImportActionState();
|
||||
if (!state.collectionTree.length) {
|
||||
try {
|
||||
@ -841,8 +864,6 @@
|
||||
elements.importModal.hidden = true;
|
||||
elements.importModal.setAttribute("aria-hidden", "true");
|
||||
document.body.classList.toggle("modal-open", false);
|
||||
elements.previewPopover.hidden = true;
|
||||
elements.previewPopover.textContent = "";
|
||||
}
|
||||
|
||||
async function loadProjects() {
|
||||
|
||||
@ -45,5 +45,5 @@ def test_index_contains_import_modal_controls(tmp_path) -> None:
|
||||
assert "function openImportModal()" in html
|
||||
assert "function closeImportModal()" in html
|
||||
assert "function updateImportActionState()" in html
|
||||
assert "function normalizeSelectedCollectionKey()" in html
|
||||
assert 'document.body.classList.toggle("modal-open"' in html
|
||||
assert "${item.abstract" not in html
|
||||
|
||||
Loading…
Reference in New Issue
Block a user