diff --git a/src/hooks/useCanvasEvent.js b/src/hooks/useCanvasEvent.js index 4293c15f..43fbb3cf 100644 --- a/src/hooks/useCanvasEvent.js +++ b/src/hooks/useCanvasEvent.js @@ -196,9 +196,14 @@ export function useCanvasEvent() { const selectionEvent = { created: (e) => { - const target = e.selected[0] - setCurrentObject(target) const { selected } = e + // [DEL-DRAG-FIX 2026-06-12] 드래그 박스로 roof/surface 등이 섞여 잡히면 e.selected[0] 가 비-module 이 되어 + // currentObject 가 module 로 안 잡힘 → contextMenu 에 module remove 미세팅 → Del 무반응. + // 모듈 기본설정 메뉴에서는 module 을 우선해 currentObject 로 설정. + const selectedModules = selected?.filter((o) => o.name === POLYGON_TYPE.MODULE) ?? [] + const target = + currentMenu === MENU.MODULE_CIRCUIT_SETTING.BASIC_SETTING && selectedModules.length > 0 ? selectedModules[0] : e.selected[0] + setCurrentObject(target) if (selected?.length > 0) { selected.forEach((obj) => { @@ -212,7 +217,12 @@ export function useCanvasEvent() { obj.set({ strokeWidth: 3 }) } if (obj.name === POLYGON_TYPE.ROOF) { - canvas.discardActiveObject() + // [DEL-DRAG-FIX 2026-06-12] 드래그 박스 복수선택에 roof 가 섞이면 discardActiveObject 가 전체 선택을 해제하고 + // selection:cleared → currentObject=null 로 만들어 Del 리스너가 제거됨(삭제 불가). 복수선택은 + // refineModuleSelection 이 모듈만 정제하므로, 단일 roof 클릭일 때만 해제한다. + if (selected.length === 1) { + canvas.discardActiveObject() + } obj.set({ stroke: originStroke }) } } @@ -245,9 +255,12 @@ export function useCanvasEvent() { canvas.renderAll() }, updated: (e) => { - const target = e.selected[0] - setCurrentObject(target) const { selected, deselected } = e + // [DEL-DRAG-FIX 2026-06-12] created 와 동일: 모듈 기본설정 메뉴에서는 module 우선으로 currentObject 설정 + const selectedModules = selected?.filter((o) => o.name === POLYGON_TYPE.MODULE) ?? [] + const target = + currentMenu === MENU.MODULE_CIRCUIT_SETTING.BASIC_SETTING && selectedModules.length > 0 ? selectedModules[0] : e.selected[0] + setCurrentObject(target) if (deselected?.length > 0) { deselected.forEach((obj) => {