refactor: extract drop indicator target helpers

This commit is contained in:
lix-2026
2026-05-25 08:29:19 +08:00
parent c90499b16e
commit f33807eacc
3 changed files with 38 additions and 14 deletions
@@ -291,3 +291,9 @@ UI / 浏览器可见项必须有真实浏览器截图或结构化 smoke 证据
- 修改:`editor_runtime/block_dnd.rs` 新增 `hovered_block_from_target(target, root, handle_selector)`,承接 `target_element`、handle shell 过滤、direct block index 解析和 `block_state_from_index(index)` 委托;`lib.rs` 的同名函数退化为只负责获取 `editor_root_element()` 后调用 runtime helper。
- 边界:未迁 `hovered_block_from_selection``drop_indicator_from_target``drop_indicator_from_point`、drag/drop listener、keyboard signal 分支或 block reorder 行为;本批只外置共享 target -> `HoveredBlockState` 解析层。
- 已验证:`cargo fmt --manifest-path rust/Cargo.toml --all --check``cargo check --manifest-path rust/spikes/leptos-tiptap-spike/Cargo.toml`、wasm release build、`wasm-bindgen`、临时当前源码服务 `MNOTE_WEB_BIND=127.0.0.1:3020 MNOTE_WEB_PUBLIC_BIND=127.0.0.1:3020 cargo run --manifest-path rust/Cargo.toml -p mnote-web``MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3020 NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task489-block-menu-delete-undo-smoke.js``MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3020 NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task488-local-attachment-link-delete-undo-smoke.js``MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3020 NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task479-local-folder-markdown-resource-lifecycle-smoke.js`
- 2026-05-25Batch AK 派发 1 个只读 Reasonix worker 审计 `drop_indicator_from_target` / `drop_indicator_from_point` 的最小外置边界,使用独立 worktree `/mnt/Data1T/mnote-worktrees/0525-ak-worker-a-5-29-drop-indicator-readonly`run id `reasonix-2026-05-25T00-23-12-071Z-5cb35e3f`,显式 `--no-memory-recall`
- Codex 已读取 Hindsight recall、`process-handoff.md/json`,并核对 worktree `git status --short` / `git diff --stat` 为空;只读结论经主控复核后采纳。
- 审计结论:`drop_indicator_from_target` 已具备迁入 `editor_runtime/block_dnd.rs` 的条件,`drop_indicator_from_point` 可同刀迁出;`hovered_block_from_target` 的 hover listener 壳与现有 drag/drop 调用点暂留 `lib.rs`,通过 `HANDLE_SHELL_SELECTOR` 参数注入 runtime helper。
- Codex 主控完成最小机械切片:`editor_runtime/block_dnd.rs` 新增 `drop_indicator_from_target(target, client_y, handle_selector)``drop_indicator_from_point(client_x, client_y, handle_selector)``lib.rs` 同名函数退化为只透传 `HANDLE_SHELL_SELECTOR` 的薄壳,不扩散 drag/drop listener 或 block reorder 调用点。
- 边界:未迁 `hovered_block_from_selection`、drag/drop listener、keyboard signal 分支、block reorder 行为或 `HANDLE_SHELL_SELECTOR` 常量定义;本批只外置 drop indicator 的 target/point 解析 helper。
- 已验证:`cargo fmt --manifest-path rust/Cargo.toml --all --check``cargo check --manifest-path rust/spikes/leptos-tiptap-spike/Cargo.toml`、wasm release build、`wasm-bindgen --target web --out-dir rust/spikes/leptos-tiptap-spike/generated/island --out-name mnote-leptos-tiptap-spike-island rust/spikes/leptos-tiptap-spike/target/wasm32-unknown-unknown/release/mnote_leptos_tiptap_spike.wasm`、临时当前源码服务 `MNOTE_WEB_BIND=127.0.0.1:3032 MNOTE_WEB_PUBLIC_BIND=127.0.0.1:3032 cargo run --manifest-path rust/Cargo.toml -p mnote-web``MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3032 NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task489-block-menu-delete-undo-smoke.js``MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3032 NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task488-local-attachment-link-delete-undo-smoke.js``MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3032 NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task479-local-folder-markdown-resource-lifecycle-smoke.js`
@@ -139,6 +139,32 @@ pub(crate) fn hovered_block_from_target(
block_state_from_index(index)
}
pub(crate) fn drop_indicator_from_target(
target: EventTarget,
client_y: i32,
handle_selector: &str,
) -> Option<DropIndicatorState> {
let root = editor_root_element()?;
let hovered = hovered_block_from_target(target, &root, handle_selector)?;
let block = root.children().item(hovered.index as u32)?;
let stage = editor_stage_element()?;
Some(drop_indicator_from_block_rects(
hovered.index,
&block,
&stage,
client_y,
))
}
pub(crate) fn drop_indicator_from_point(
client_x: i32,
client_y: i32,
handle_selector: &str,
) -> Option<DropIndicatorState> {
let target = event_target_from_point(client_x, client_y)?;
drop_indicator_from_target(target, client_y, handle_selector)
}
pub(crate) fn block_state_from_index(index: usize) -> Option<HoveredBlockState> {
let root = editor_root_element()?;
let stage = editor_stage_element()?;
+6 -14
View File
@@ -23,8 +23,10 @@ use web_sys::{
use editor_runtime::attachment_upload::dispatch_editor_upload_request;
use editor_runtime::block_dnd::{
block_state_from_index as block_state_from_index_runtime, direct_block_from_element,
drop_indicator_from_block_rects, element_within_handle_shell, event_target_from_point,
hovered_block_from_target as hovered_block_from_target_runtime, top_level_block_index,
drop_indicator_from_point as drop_indicator_from_point_runtime,
drop_indicator_from_target as drop_indicator_from_target_runtime,
element_within_handle_shell, hovered_block_from_target as hovered_block_from_target_runtime,
top_level_block_index,
};
use editor_runtime::block_menu_overlay;
use editor_runtime::block_menu_document::{
@@ -5031,21 +5033,11 @@ fn drop_indicator_from_target(
target: web_sys::EventTarget,
client_y: i32,
) -> Option<DropIndicatorState> {
let hovered = hovered_block_from_target(target)?;
let root = editor_root_element()?;
let block = root.children().item(hovered.index as u32)?;
let stage = editor_stage_element()?;
Some(drop_indicator_from_block_rects(
hovered.index,
&block,
&stage,
client_y,
))
drop_indicator_from_target_runtime(target, client_y, HANDLE_SHELL_SELECTOR)
}
fn drop_indicator_from_point(client_x: i32, client_y: i32) -> Option<DropIndicatorState> {
let target = event_target_from_point(client_x, client_y)?;
drop_indicator_from_target(target, client_y)
drop_indicator_from_point_runtime(client_x, client_y, HANDLE_SHELL_SELECTOR)
}
fn document_content_mut(document: &mut Value) -> Result<&mut Vec<Value>, String> {