블록 메뉴와 드래그 이동 안정화
This commit is contained in:
@@ -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)
|
||||
}"
|
||||
|
||||
Reference in New Issue
Block a user