블록 메뉴와 드래그 이동 안정화

This commit is contained in:
2026-05-07 15:31:57 +09:00
parent 4e5ccb2726
commit 0f60039126
8 changed files with 76 additions and 27 deletions

View File

@@ -1236,6 +1236,46 @@ const updateBlockDropTarget = (event, targetIndex) => {
dragTargetPosition.value = event.clientY < rect.top + rect.height / 2 ? 'before' : 'after'
}
/**
* 블록 드래그 상태 초기화
* @returns {void}
*/
const clearBlockDragState = () => {
draggingBlockId.value = ''
dragTargetIndex.value = -1
dragTargetPosition.value = ''
}
/**
* 현재 드롭 위치 기준으로 블록 이동
* @param {string} draggedId - 이동할 블록 ID
* @param {number} targetIndex - 이동 대상 인덱스
* @param {string} targetPosition - 이동 위치
* @returns {boolean} 이동 여부
*/
const moveDraggedBlock = (draggedId, targetIndex, targetPosition) => {
const sourceIndex = getBlockIndex(draggedId)
const insertionIndex = targetPosition === 'after' ? targetIndex + 1 : targetIndex
if (sourceIndex < 0 || targetIndex < 0) {
return false
}
const nextTargetIndex = sourceIndex < insertionIndex ? insertionIndex - 1 : insertionIndex
if (sourceIndex === nextTargetIndex) {
return false
}
const [draggedBlock] = editorBlocks.value.splice(sourceIndex, 1)
editorBlocks.value.splice(nextTargetIndex, 0, draggedBlock)
selectedBlockId.value = draggedBlock.id
normalizeTrailingTextBlock()
emitContent()
return true
}
/**
* 블록 드롭 이동 처리
* @param {DragEvent} event - 드롭 이벤트
@@ -1245,26 +1285,10 @@ const updateBlockDropTarget = (event, targetIndex) => {
const dropBlock = (event, targetIndex) => {
event.preventDefault()
const draggedId = event.dataTransfer.getData('text/plain') || draggingBlockId.value
const sourceIndex = getBlockIndex(draggedId)
const targetPosition = dragTargetIndex.value === targetIndex ? dragTargetPosition.value : 'after'
const insertionIndex = targetPosition === 'after' ? targetIndex + 1 : targetIndex
if (sourceIndex < 0 || targetIndex < 0) {
draggingBlockId.value = ''
dragTargetIndex.value = -1
dragTargetPosition.value = ''
return
}
const [draggedBlock] = editorBlocks.value.splice(sourceIndex, 1)
const nextTargetIndex = sourceIndex < insertionIndex ? insertionIndex - 1 : insertionIndex
editorBlocks.value.splice(nextTargetIndex, 0, draggedBlock)
draggingBlockId.value = ''
dragTargetIndex.value = -1
dragTargetPosition.value = ''
selectedBlockId.value = draggedBlock.id
normalizeTrailingTextBlock()
emitContent()
moveDraggedBlock(draggedId, targetIndex, targetPosition)
clearBlockDragState()
}
/**
@@ -1272,9 +1296,11 @@ const dropBlock = (event, targetIndex) => {
* @returns {void}
*/
const finishBlockDrag = () => {
draggingBlockId.value = ''
dragTargetIndex.value = -1
dragTargetPosition.value = ''
if (draggingBlockId.value && dragTargetIndex.value >= 0 && dragTargetPosition.value) {
moveDraggedBlock(draggingBlockId.value, dragTargetIndex.value, dragTargetPosition.value)
}
clearBlockDragState()
}
/**
@@ -1350,6 +1376,7 @@ defineExpose({
'admin-block-editor__row--dragging opacity-50': draggingBlockId === block.id,
'admin-block-editor__row--drop-before': dragTargetIndex === index && dragTargetPosition === 'before',
'admin-block-editor__row--drop-after': dragTargetIndex === index && dragTargetPosition === 'after',
'admin-block-editor__row--menu-open z-30': visibleCommands.length && activeBlockId === block.id,
'admin-block-editor__row--text': isTextBlock(block),
'admin-block-editor__row--structure': !isTextBlock(block)
}"