fix: 修复本地文件夹垃圾箱恢复聚焦
This commit is contained in:
@@ -127,6 +127,8 @@ const SIDEBAR_TREE_JS: &str = r##"
|
||||
}
|
||||
|
||||
function currentFileTreeActiveRowId() {
|
||||
var explicitRowId = new URL(window.location.href).searchParams.get('restoreFocusRowId') || '';
|
||||
if (explicitRowId) return explicitRowId;
|
||||
var mindmapMatch = window.location.pathname.match(/^\/mindmap\/([^\/]+)\/([^\/]+)/);
|
||||
if (mindmapMatch) return 'asset:' + decodeURIComponent(mindmapMatch[2]);
|
||||
var documentId = currentDocumentId();
|
||||
@@ -1983,6 +1985,7 @@ const SIDEBAR_TREE_JS: &str = r##"
|
||||
var renderedFile = filePayload ? renderFileProjection(filePayload.result || filePayload) : false;
|
||||
if (!renderedPage && !renderedFile) return false;
|
||||
syncSidebarFileTreeSelection();
|
||||
schedulePendingLocalFolderRestoreFocus();
|
||||
restoreSidebarTreeTab();
|
||||
document.documentElement.setAttribute('data-mnote-local-folder-watch-applied', 'projection');
|
||||
return true;
|
||||
@@ -4159,6 +4162,86 @@ const SIDEBAR_TREE_JS: &str = r##"
|
||||
return true;
|
||||
}
|
||||
|
||||
function selectSidebarFileTreeRowById(rowId, options) {
|
||||
var id = String(rowId || '').trim();
|
||||
if (!id) return false;
|
||||
var row = document.querySelector('#sidebar-file-tree-root .tree-row[data-shell-mode="filetree"][data-row-id="' + cssEscape(id) + '"]');
|
||||
if (!(row instanceof HTMLElement)) return false;
|
||||
selectSidebarFileTreeRow(row, { ctrlKey: false, metaKey: false, shiftKey: false });
|
||||
document.querySelectorAll('#sidebar-file-tree-root .tree-row[data-shell-mode="filetree"][data-active="true"]').forEach(function(activeRow) {
|
||||
if (activeRow instanceof HTMLElement) activeRow.setAttribute('data-active', 'false');
|
||||
});
|
||||
row.setAttribute('data-active', 'true');
|
||||
if (options && options.scrollIntoView !== false) {
|
||||
try {
|
||||
row.scrollIntoView({ block: 'nearest' });
|
||||
} catch (_) {
|
||||
row.scrollIntoView();
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
function pendingLocalFolderRestoreRowId() {
|
||||
if (window.__mnotePendingLocalFolderRestoreFiletreeRowId) {
|
||||
return String(window.__mnotePendingLocalFolderRestoreFiletreeRowId || '').trim();
|
||||
}
|
||||
if (!window.localStorage) return '';
|
||||
var rowId = '';
|
||||
try {
|
||||
rowId = String(window.localStorage.getItem('mnote.pendingLocalFolderRestoreFiletreeRowId') || '').trim();
|
||||
} catch (_) {
|
||||
rowId = '';
|
||||
}
|
||||
if (!rowId && typeof window.name === 'string' && window.name.indexOf('mnote.pendingLocalFolderRestoreFiletreeRowId=') === 0) {
|
||||
rowId = decodeURIComponent(window.name.slice('mnote.pendingLocalFolderRestoreFiletreeRowId='.length));
|
||||
}
|
||||
if (rowId) window.__mnotePendingLocalFolderRestoreFiletreeRowId = rowId;
|
||||
return rowId;
|
||||
}
|
||||
|
||||
function clearPendingLocalFolderRestoreRowId() {
|
||||
window.__mnotePendingLocalFolderRestoreFiletreeRowId = '';
|
||||
try {
|
||||
window.localStorage.removeItem('mnote.pendingLocalFolderRestoreFiletreeRowId');
|
||||
} catch (_) {}
|
||||
if (typeof window.name === 'string' && window.name.indexOf('mnote.pendingLocalFolderRestoreFiletreeRowId=') === 0) {
|
||||
window.name = '';
|
||||
}
|
||||
}
|
||||
|
||||
function applyPendingLocalFolderRestoreFocusOnce() {
|
||||
var rowId = pendingLocalFolderRestoreRowId();
|
||||
if (!rowId) return false;
|
||||
document.documentElement.setAttribute('data-mnote-local-folder-restore-pending-row-id', rowId);
|
||||
if (!selectSidebarFileTreeRowById(rowId, { scrollIntoView: true })) {
|
||||
document.documentElement.setAttribute('data-mnote-local-folder-restore-focus-status', 'row-missing');
|
||||
return false;
|
||||
}
|
||||
document.documentElement.setAttribute('data-mnote-local-folder-restore-focused-row-id', rowId);
|
||||
document.documentElement.setAttribute('data-mnote-local-folder-restore-focus-status', 'focused');
|
||||
return true;
|
||||
}
|
||||
|
||||
function schedulePendingLocalFolderRestoreFocus() {
|
||||
if (!pendingLocalFolderRestoreRowId()) return false;
|
||||
if (window.__mnotePendingLocalFolderRestoreFocusTimer) return false;
|
||||
var attempts = 0;
|
||||
var focused = false;
|
||||
focused = applyPendingLocalFolderRestoreFocusOnce() || focused;
|
||||
window.__mnotePendingLocalFolderRestoreFocusTimer = window.setInterval(function() {
|
||||
attempts += 1;
|
||||
focused = applyPendingLocalFolderRestoreFocusOnce() || focused;
|
||||
if (attempts >= 20) {
|
||||
if (focused) clearPendingLocalFolderRestoreRowId();
|
||||
else document.documentElement.setAttribute('data-mnote-local-folder-restore-focus-status', 'timeout');
|
||||
window.clearInterval(window.__mnotePendingLocalFolderRestoreFocusTimer);
|
||||
window.__mnotePendingLocalFolderRestoreFocusTimer = 0;
|
||||
}
|
||||
}, 250);
|
||||
return focused;
|
||||
}
|
||||
|
||||
function selectedSidebarFileTreeRowIdsForDrag(row) {
|
||||
var rowId = row instanceof HTMLElement ? row.getAttribute('data-row-id') || '' : '';
|
||||
if (rowId && sidebarFileTreeSelection.selectedRowIds.has(rowId)) {
|
||||
@@ -9273,6 +9356,7 @@ const SIDEBAR_TREE_JS: &str = r##"
|
||||
sidebarFileTreeSelection.focusedRowId = rowId;
|
||||
});
|
||||
syncSidebarFileTreeSelection();
|
||||
schedulePendingLocalFolderRestoreFocus();
|
||||
window.addEventListener('mnote:primary-document-activated', function(event) {
|
||||
var detail = event && event.detail ? event.detail : {};
|
||||
selectSidebarFileTreeDocument(detail.documentId, { scrollIntoView: false });
|
||||
@@ -9910,6 +9994,13 @@ mod tests {
|
||||
assert!(SIDEBAR_TREE_JS.contains("wolai:local-assets-changed"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn sidebar_tree_runtime_focuses_restored_local_folder_row() {
|
||||
assert!(SIDEBAR_TREE_JS.contains("applyPendingLocalFolderRestoreFocusOnce"));
|
||||
assert!(SIDEBAR_TREE_JS.contains("mnote.pendingLocalFolderRestoreFiletreeRowId"));
|
||||
assert!(SIDEBAR_TREE_JS.contains("data-mnote-local-folder-restore-focused-row-id"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn sidebar_runtime_routes_local_mindmap_and_office_assets() {
|
||||
assert!(SIDEBAR_TREE_JS.contains("withLocalMindmapSourceParams"));
|
||||
|
||||
Reference in New Issue
Block a user