feat(tree): checkpoint resource lifecycle work

提交当前顶层 mnote Git 工作区,范围集中在 04-tree-domain 的 resource/trash/filetree 生命周期、mnote-web resource_trash 路由、Convex/Next 兼容接口、sidebar/file-tree 客户端适配、smoke 脚本与对应设计/bug 记录。

不包含被 ignore 的 design/05-editor-mainline/reference-code/leptos-tiptap 嵌套仓库改动。新增 smoke 的测试密码改为运行时读取 MNOTE_E2E_PASSWORD,避免提交明文 credential assignment。
This commit is contained in:
lix-2026
2026-05-16 07:38:45 +08:00
parent 274779c0d8
commit 384da4e44c
85 changed files with 12570 additions and 394 deletions
@@ -47,10 +47,16 @@ pub async fn mindmap_object_shell(
load_sidebar_tree_html(state.config(), &context, workspace_id, Some(&doc_id))
.await
.unwrap_or_default();
let file_tree_html =
load_file_tree_html(state.config(), &context, workspace_id, Some(&doc_id))
.await
.unwrap_or_default();
let active_filetree_row_id = format!("asset:{mindmap_id}");
let file_tree_html = load_file_tree_html(
state.config(),
&context,
workspace_id,
Some(&doc_id),
Some(active_filetree_row_id.as_str()),
)
.await
.unwrap_or_default();
let workspace_name = workspace_projection.workspace_name.clone();
let workspace_sidebar_html = render_workspace_shell_sidebar_html(
&workspace_projection,
@@ -282,7 +288,52 @@ mod tests {
convex_url: None,
convex_admin_key: None,
allow_dev_fixtures: true,
query_fixtures_json: None,
query_fixtures_json: Some(
serde_json::json!({
"sidebar:datasetList": {
"active_workspace_id": "ws_demo",
"documents": [
{
"id": "doc_1",
"workspace_id": "ws_demo",
"title": "页面",
"parent_id": null,
"sort_order": 0
}
],
"media_assets": [],
"mindmap_assets": [
{
"id": "mind_1",
"workspace_id": "ws_demo",
"document_id": "doc_1",
"asset_type": "mindmap",
"file_name": "思维导图.json",
"mime_type": "application/json"
}
],
"table_assets": [],
"trashed_documents": [],
"trashed_media_assets": [],
"trashed_mindmap_assets": [],
"trashed_table_assets": [],
"mindmap_docs": [],
"mindmap_asset_children": {}
},
"documents:getMeta": {
"id": "doc_1",
"workspace_id": "ws_demo",
"title": "页面"
},
"documents:getContent": {
"content": [],
"revision": 1,
"conflict_detection_key": "doc_1:1",
"pageSubtree": {"rootNodeId": "doc_1", "outline": []}
}
})
.to_string(),
),
mutation_fixtures_json: None,
dev_user_id: "dev-user".into(),
dev_user_name: "开发用户".into(),
@@ -374,6 +425,9 @@ mod tests {
assert!(html.contains("\"standaloneObject\""));
assert!(html.contains("\"documentId\":\"doc_1\""));
assert!(html.contains("\"mindmapId\":\"mind_1\""));
assert!(html.contains("data-row-id=\"asset:mind_1\""));
assert!(html.contains("data-selected=\"true\""));
assert!(!html.contains("data-row-id=\"doc:doc_1\" data-row-kind=\"document\" data-node-id=\"doc_1\" data-document-id=\"doc_1\" data-doc-id=\"doc_1\" data-asset-id=\"\" data-object-identity=\"{"objectKind":"page","documentId":"doc_1","blockId":null,"assetId":null}\" data-shell-mode=\"filetree\" data-selected=\"true\""));
assert!(html.contains("runtimeModule.mount(mountTarget, bootstrap)"));
assert!(html.contains("/api/leptos-tiptap-runtime/manifest.json"));
assert!(!html.contains("react_mindmap_runtime"));