fix local folder resource lifecycle and workspace switch
This commit is contained in:
@@ -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"
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user