fix local folder resource lifecycle and workspace switch

This commit is contained in:
lix-2026
2026-05-24 02:23:48 +08:00
parent 97953101a2
commit 6d9d8ce9cd
9 changed files with 374 additions and 65 deletions
+26 -13
View File
@@ -763,7 +763,7 @@ const SIDEBAR_TREE_JS: &str = r##"
function rememberCloudWorkspaceId(workspaceId) {
var normalized = String(workspaceId || '').trim();
if (!normalized || normalized === 'local-folder' || normalized === 'default') return;
if (!normalized || normalized === 'local-folder' || normalized === 'default' || normalized.indexOf('local-ws:') === 0) return;
try {
if (window.localStorage) window.localStorage.setItem(MNOTE_LAST_CLOUD_WORKSPACE_KEY, normalized);
} catch (_) {}
@@ -773,11 +773,11 @@ const SIDEBAR_TREE_JS: &str = r##"
if (currentSourceKind() === 'local_folder') return '';
var params = new URLSearchParams(window.location.search);
var fromUrl = (params.get('workspaceId') || '').trim();
if (fromUrl && fromUrl !== 'default') return fromUrl;
if (fromUrl && fromUrl !== 'default' && fromUrl.indexOf('local-ws:') !== 0) return fromUrl;
var fromDom = document.querySelector('[data-workspace-id]');
if (fromDom instanceof HTMLElement) {
var value = (fromDom.getAttribute('data-workspace-id') || '').trim();
if (value && value !== 'local-folder' && value !== 'default') return value;
if (value && value !== 'local-folder' && value !== 'default' && value.indexOf('local-ws:') !== 0) return value;
}
return '';
}
@@ -789,15 +789,15 @@ const SIDEBAR_TREE_JS: &str = r##"
function readLastCloudWorkspaceId() {
try {
var stored = window.localStorage ? window.localStorage.getItem(MNOTE_LAST_CLOUD_WORKSPACE_KEY) : '';
if (stored && stored.trim() && stored.trim() !== 'default') return stored.trim();
if (stored && stored.trim() && stored.trim() !== 'default' && stored.trim().indexOf('local-ws:') !== 0) return stored.trim();
} catch (_) {}
var params = new URLSearchParams(window.location.search);
var fromUrl = (params.get('workspaceId') || '').trim();
if (fromUrl && currentSourceKind() !== 'local_folder') return fromUrl;
if (fromUrl && currentSourceKind() !== 'local_folder' && fromUrl.indexOf('local-ws:') !== 0) return fromUrl;
var fromDom = document.querySelector('[data-workspace-id]');
if (fromDom instanceof HTMLElement) {
var value = (fromDom.getAttribute('data-workspace-id') || '').trim();
if (value && value !== 'local-folder') return value;
if (value && value !== 'local-folder' && value.indexOf('local-ws:') !== 0) return value;
}
return '';
}
@@ -925,9 +925,8 @@ const SIDEBAR_TREE_JS: &str = r##"
function switchToCloudWorkspace() {
var targetUrl = new URL('/', window.location.origin);
var workspaceId = readLastCloudWorkspaceId();
if (workspaceId) targetUrl.searchParams.set('workspaceId', workspaceId);
targetUrl.searchParams.set('sourceKind', 'convex_workspace');
targetUrl.searchParams.set('treeView', activeSidebarTreeMode() || 'filetree');
targetUrl.searchParams.set('mnoteHome', '1');
window.location.href = targetUrl.toString();
}
@@ -1311,6 +1310,7 @@ const SIDEBAR_TREE_JS: &str = r##"
if ((params.get('rootUri') || '').trim()) return false;
if ((params.get('workspaceId') || '').trim()) return false;
if ((params.get('pageId') || '').trim()) return false;
if ((params.get('mnoteHome') || '').trim() === '1') return false;
var recent = readRecentLocalRoots();
if (!recent.length) return false;
openLocalFolderRoot(recent[0]);
@@ -1346,7 +1346,7 @@ const SIDEBAR_TREE_JS: &str = r##"
cloudButton.className = 'mnote-workspace-source-menu__item';
cloudButton.setAttribute('data-testid', 'mnote-switch-cloud-workspace');
cloudButton.setAttribute('role', 'menuitem');
cloudButton.textContent = '';
cloudButton.textContent = '';
cloudButton.addEventListener('click', function(event) {
event.preventDefault();
closeWorkspaceSourceMenu();
@@ -10512,7 +10512,7 @@ pub fn PageLayout(
data-mnote-action="open-workspace-source-menu"
aria-haspopup="menu"
aria-expanded="false"
title="切换空间或本地文件夹"
title="切换我的空间或本地文件夹"
>
<span class="sidebar-workspace-name">{ws_name.clone()}</span>
<span class="wolai-sidebar-chevron" aria-hidden="true">""</span>
@@ -10810,11 +10810,24 @@ mod tests {
fn sidebar_workspace_source_switch_remembers_real_cloud_workspace_before_local_folder() {
assert!(
!SIDEBAR_TREE_JS.contains("rememberCloudWorkspaceId(resolveWorkspaceId(document.body))"),
"进入本地文件夹前不能用 document.body 推导云空间 workspaceId;它会在无 workspaceId URL 时回退成 default"
"进入本地文件夹前不能用 document.body 推导 workspaceId;它会在无 workspaceId URL 时回退成 default"
);
assert!(
SIDEBAR_TREE_JS.contains("rememberCurrentCloudWorkspaceId()"),
"进入本地文件夹前应从 URL 或 DOM 子树读取真实云空间 workspaceId"
"进入本地文件夹前应从 URL 或 DOM 子树读取真实 workspaceId"
);
assert!(
SIDEBAR_TREE_JS.contains("normalized.indexOf('local-ws:') === 0"),
"本地文件夹 workspaceId 不能写入 lastCloudWorkspaceId"
);
assert!(
SIDEBAR_TREE_JS.contains("stored.trim().indexOf('local-ws:') !== 0"),
"切回工作区时不能复用 local-ws:* 作为旧云 workspace"
);
assert!(
!SIDEBAR_TREE_JS
.contains("targetUrl.searchParams.set('sourceKind', 'convex_workspace')"),
"默认来源菜单不能跳到已退出 dev 主链的 convex_workspace"
);
}