fix(svg-draw): реально отключаем перетаскивание карточки при рисовании
Прошлый гард не работал: dragstart срабатывает на самой карточке (draggable=true), а не на svg, поэтому e.target.closest(.svgdraw-host) был null. Теперь на pointerdown снимаем draggable с ближайшего предка-карточки и возвращаем на pointerup — холст рисует, а не тащит блок. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -200,8 +200,23 @@
|
|||||||
/* ── drawing interaction ──────────────────────────────────────── */
|
/* ── drawing interaction ──────────────────────────────────────── */
|
||||||
let drawing = false, startP = null, curEl = null, penPts = null, dragMode = null, dragStart = null, selStartXY = null;
|
let drawing = false, startP = null, curEl = null, penPts = null, dragMode = null, dragStart = null, selStartXY = null;
|
||||||
|
|
||||||
|
/* The host lesson block-card is draggable=true and hijacks mouse-drag on the
|
||||||
|
canvas — and its dragstart fires on the CARD (not the svg), so it can't be
|
||||||
|
cancelled here. Fix: disable the nearest draggable ancestor while a pointer
|
||||||
|
is down on the canvas, restore on release. */
|
||||||
|
let _dragAnc = null;
|
||||||
|
function suppressAncestorDrag() {
|
||||||
|
const a = svg.closest && svg.closest('[draggable="true"]');
|
||||||
|
if (a) { _dragAnc = a; a.setAttribute('draggable', 'false'); }
|
||||||
|
}
|
||||||
|
function restoreAncestorDrag() {
|
||||||
|
if (_dragAnc) { _dragAnc.setAttribute('draggable', 'true'); _dragAnc = null; }
|
||||||
|
}
|
||||||
|
document.addEventListener('pointerup', restoreAncestorDrag);
|
||||||
|
|
||||||
svg.addEventListener('pointerdown', function (evt) {
|
svg.addEventListener('pointerdown', function (evt) {
|
||||||
if (evt.button !== 0) return;
|
if (evt.button !== 0) return;
|
||||||
|
suppressAncestorDrag();
|
||||||
const p = svgPoint(evt);
|
const p = svgPoint(evt);
|
||||||
|
|
||||||
if (state.tool === 'select') {
|
if (state.tool === 'select') {
|
||||||
@@ -274,6 +289,7 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
function endDraw(evt) {
|
function endDraw(evt) {
|
||||||
|
restoreAncestorDrag();
|
||||||
if (dragMode === 'move') { dragMode = null; commit(); return; }
|
if (dragMode === 'move') { dragMode = null; commit(); return; }
|
||||||
if (!drawing) return;
|
if (!drawing) return;
|
||||||
drawing = false;
|
drawing = false;
|
||||||
@@ -466,6 +482,7 @@
|
|||||||
|
|
||||||
function destroy() {
|
function destroy() {
|
||||||
document.removeEventListener('keydown', onKey);
|
document.removeEventListener('keydown', onKey);
|
||||||
|
document.removeEventListener('pointerup', restoreAncestorDrag);
|
||||||
if (root.parentNode) root.parentNode.removeChild(root);
|
if (root.parentNode) root.parentNode.removeChild(root);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user