# 4-38 文件树 mindmap 点击后选中态闪回父页面

## 状态

- 状态：done
- 分类：04-tree-domain
- 发现时间：2026-05-15
- 修复时间：2026-05-15

## 现象

点击页面树普通页面时视觉稳定；点击文件树中的思维导图资源行时，资源行会快速闪一下，随后文件树选中态回到父页面 `.md` 行。用户体感类似“点了 mindmap 文件，但文件树又跳回对应页面/index”。

## 根因

文件树资源点击路径先执行 `selectSidebarFileTreeRow()`，使 asset row 短暂 selected；随后 mindmap 资源通过 `tree.asset.open -> openConvexAssetFromFileTree()` 整页跳转到 `/mindmap/{documentId}/{mindmapId}`。

旧实现中 `/mindmap` 对象页重新渲染文件树时只按当前 `documentId` 计算选中态：

```text
rowId === 'doc:' + activeId
```

因此页面重建或 tree live snapshot 重绘后，选中态会从 `asset:{mindmapId}` 回落到 `doc:{documentId}`，形成快速闪烁。

## 修复

- `mindmap_object_shell` 加载文件树时传入 active row：`asset:{mindmapId}`。
- `collect_filetree_render_rows()` 新增 `active_row_id`，当存在 active row 时优先按 row id 选中，避免父页面 fallback 抢回 selected。
- `SIDEBAR_TREE_JS` 的 live snapshot renderer 新增 `currentFileTreeActiveRowId()`，在 `/mindmap/{doc}/{asset}` 路径下保持 `asset:{asset}` 选中，防止 SSE 重绘后再次闪回。

## 验证

Rust 定向测试：

```bash
cargo test --manifest-path rust/Cargo.toml -p mnote-web sidebar_filetree_runtime_uses_markdown_page_row_without_local_index_child -- --nocapture
cargo test --manifest-path rust/Cargo.toml -p mnote-web mindmap_shell_returns_rust_object_shell_contract -- --nocapture
cargo test --manifest-path rust/Cargo.toml -p mnote-web filetree_rows_select_active_mindmap_asset_in_object_shell -- --nocapture
```

真实浏览器 smoke：

```bash
MNOTE_UI_BASE_URL=http://127.0.0.1:3428 node scripts/task443-filetree-mindmap-click-active-row-smoke.js
```

验证结果：

- `tmp/task443-filetree-mindmap-click-active-row-smoke/result.json`
- 截图：`tmp/task443-filetree-mindmap-click-active-row-smoke/after-mindmap-click.png`
- 点击后 URL 为 `/mindmap/{documentId}/{mindmapId}`。
- 点击前 selected row 为 `doc:{documentId}`。
- 点击后 selected row 为 `asset:{mindmapId}`。
- 点击后不再出现父页面 `doc:{documentId}` selected。

## 后续口径

mindmap、附件、table 等资源对象打开后，文件树 active/selected 不能只按父 `documentId` 回落到页面行；对象页或对象视图必须优先表达资源对象身份。页面正文才选中 `doc:{documentId}`。
