Browse Source

fix: elements offset incorrectly when action-duplicated during drag (#9275)

* fix: elements offset incorrectly when action-duplicated during drag

* prevent duplicate action during drag altogether
pull/9288/head
David Luzar 9 months ago committed by GitHub
parent
commit
99d8bff175
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 4
      packages/excalidraw/actions/actionDuplicateSelection.tsx
  2. 21
      packages/excalidraw/element/dragElements.ts

4
packages/excalidraw/actions/actionDuplicateSelection.tsx

@ -52,6 +52,10 @@ export const actionDuplicateSelection = register({ @@ -52,6 +52,10 @@ export const actionDuplicateSelection = register({
icon: DuplicateIcon,
trackEvent: { category: "element" },
perform: (elements, appState, formData, app) => {
if (appState.selectedElementsAreBeingDragged) {
return false;
}
// duplicate selected point(s) if editing a line
if (appState.editingLinearElement) {
// TODO: Invariants should be checked here instead of duplicateSelectedPoints()

21
packages/excalidraw/element/dragElements.ts

@ -17,7 +17,7 @@ import { @@ -17,7 +17,7 @@ import {
} from "./typeChecks";
import type { Bounds } from "./bounds";
import type { NonDeletedExcalidrawElement } from "./types";
import type { ExcalidrawElement, NonDeletedExcalidrawElement } from "./types";
import type Scene from "../scene/Scene";
import type {
AppState,
@ -78,13 +78,20 @@ export const dragSelectedElements = ( @@ -78,13 +78,20 @@ export const dragSelectedElements = (
}
}
const commonBounds = getCommonBounds(
Array.from(elementsToUpdate).map(
(el) => pointerDownState.originalElements.get(el.id) ?? el,
),
);
const origElements: ExcalidrawElement[] = [];
for (const element of elementsToUpdate) {
const origElement = pointerDownState.originalElements.get(element.id);
// if original element is not set (e.g. when you duplicate during a drag
// operation), exit to avoid undefined behavior
if (!origElement) {
return;
}
origElements.push(origElement);
}
const adjustedOffset = calculateOffset(
commonBounds,
getCommonBounds(origElements),
offset,
snapOffset,
gridSize,

Loading…
Cancel
Save