refactor: extract drop indicator target helpers
This commit is contained in:
@@ -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-25:Batch 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()?;
|
||||
|
||||
@@ -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> {
|
||||
|
||||
Reference in New Issue
Block a user