From 1c5b8372b99c9e23c74d5c2eba55a490768d9893 Mon Sep 17 00:00:00 2001 From: Marcel Mraz Date: Tue, 18 Mar 2025 19:12:49 +0100 Subject: [PATCH] Move group inside element --- packages/element/src/frame.ts | 7 ++----- .../{excalidraw => element/src}/groups.ts | 10 +++++----- .../tests}/frame.test.tsx | 18 ++++++++++++------ .../actions/actionDeleteSelected.tsx | 6 +++++- .../actions/actionDuplicateSelection.tsx | 11 ++++++----- packages/excalidraw/actions/actionFrame.ts | 3 ++- packages/excalidraw/actions/actionGroup.tsx | 19 ++++++++++--------- .../excalidraw/actions/actionSelectAll.ts | 3 ++- packages/excalidraw/align.ts | 4 ++-- packages/excalidraw/change.ts | 3 ++- packages/excalidraw/components/App.tsx | 19 ++++++++++--------- packages/excalidraw/distribute.ts | 4 ++-- .../excalidraw/renderer/interactiveScene.ts | 13 +++++++------ packages/excalidraw/scene/Scene.ts | 3 ++- packages/excalidraw/snapping.ts | 3 ++- packages/excalidraw/zindex.ts | 3 ++- 16 files changed, 73 insertions(+), 56 deletions(-) rename packages/{excalidraw => element/src}/groups.ts (97%) rename packages/{excalidraw => element/tests}/frame.test.tsx (97%) diff --git a/packages/element/src/frame.ts b/packages/element/src/frame.ts index bc47ebc02..1b8983e07 100644 --- a/packages/element/src/frame.ts +++ b/packages/element/src/frame.ts @@ -5,11 +5,6 @@ import { elementsOverlappingBBox, } from "@excalidraw/utils"; -import { - getElementsInGroup, - selectGroupsFromGivenElements, -} from "@excalidraw/excalidraw/groups"; - import { getElementsWithinSelection, getSelectedElements, @@ -36,6 +31,8 @@ import type { import type { ReadonlySetLike } from "@excalidraw/excalidraw/utility-types"; +import { getElementsInGroup, selectGroupsFromGivenElements } from "./groups"; + import { getElementLineSegments, getCommonBounds } from "./bounds"; import { mutateElement } from "./mutateElement"; import { getBoundTextElement, getContainerElement } from "./textElement"; diff --git a/packages/excalidraw/groups.ts b/packages/element/src/groups.ts similarity index 97% rename from packages/excalidraw/groups.ts rename to packages/element/src/groups.ts index 2bf32b101..0d0c62b4e 100644 --- a/packages/excalidraw/groups.ts +++ b/packages/element/src/groups.ts @@ -1,5 +1,8 @@ import { getBoundTextElement } from "@excalidraw/element/textElement"; +import { getSelectedElements } from "@excalidraw/excalidraw/scene"; +import { makeNextSelectedElementIds } from "@excalidraw/excalidraw/scene/selection"; + import type { GroupId, ExcalidrawElement, @@ -9,15 +12,12 @@ import type { ElementsMap, } from "@excalidraw/element/types"; -import { getSelectedElements } from "./scene"; -import { makeNextSelectedElementIds } from "./scene/selection"; - import type { AppClassProperties, AppState, InteractiveCanvasAppState, -} from "./types"; -import type { Mutable } from "./utility-types"; +} from "@excalidraw/excalidraw/types"; +import type { Mutable } from "@excalidraw/excalidraw/utility-types"; export const selectGroup = ( groupId: GroupId, diff --git a/packages/excalidraw/frame.test.tsx b/packages/element/tests/frame.test.tsx similarity index 97% rename from packages/excalidraw/frame.test.tsx rename to packages/element/tests/frame.test.tsx index dac3056e7..cd52db409 100644 --- a/packages/excalidraw/frame.test.tsx +++ b/packages/element/tests/frame.test.tsx @@ -1,11 +1,17 @@ +import { + convertToExcalidrawElements, + Excalidraw, +} from "@excalidraw/excalidraw"; + +import { API } from "@excalidraw/excalidraw/tests/helpers/api"; +import { Keyboard, Pointer } from "@excalidraw/excalidraw/tests/helpers/ui"; +import { + getCloneByOrigId, + render, +} from "@excalidraw/excalidraw/tests/test-utils"; + import type { ExcalidrawElement } from "@excalidraw/element/types"; -import { API } from "./tests/helpers/api"; -import { Keyboard, Pointer } from "./tests/helpers/ui"; -import { getCloneByOrigId, render } from "./tests/test-utils"; - -import { convertToExcalidrawElements, Excalidraw } from "./index"; - const { h } = window; const mouse = new Pointer("mouse"); diff --git a/packages/excalidraw/actions/actionDeleteSelected.tsx b/packages/excalidraw/actions/actionDeleteSelected.tsx index 3a0f86c85..98628d005 100644 --- a/packages/excalidraw/actions/actionDeleteSelected.tsx +++ b/packages/excalidraw/actions/actionDeleteSelected.tsx @@ -15,9 +15,13 @@ import { } from "@excalidraw/element/typeChecks"; import { getFrameChildren } from "@excalidraw/element/frame"; +import { + getElementsInGroup, + selectGroupsForSelectedElements, +} from "@excalidraw/element/groups"; + import type { ExcalidrawElement } from "@excalidraw/element/types"; -import { getElementsInGroup, selectGroupsForSelectedElements } from "../groups"; import { t } from "../i18n"; import { getSelectedElements, isSomeElementSelected } from "../scene"; import { CaptureUpdateAction } from "../store"; diff --git a/packages/excalidraw/actions/actionDuplicateSelection.tsx b/packages/excalidraw/actions/actionDuplicateSelection.tsx index 0eed6ecc8..7aedef1fb 100644 --- a/packages/excalidraw/actions/actionDuplicateSelection.tsx +++ b/packages/excalidraw/actions/actionDuplicateSelection.tsx @@ -33,16 +33,17 @@ import { getFrameChildren, } from "@excalidraw/element/frame"; +import { + selectGroupsForSelectedElements, + getSelectedGroupForElement, + getElementsInGroup, +} from "@excalidraw/element/groups"; + import type { ExcalidrawElement } from "@excalidraw/element/types"; import { ToolButton } from "../components/ToolButton"; import { DuplicateIcon } from "../components/icons"; -import { - selectGroupsForSelectedElements, - getSelectedGroupForElement, - getElementsInGroup, -} from "../groups"; import { t } from "../i18n"; import { isSomeElementSelected } from "../scene"; import { diff --git a/packages/excalidraw/actions/actionFrame.ts b/packages/excalidraw/actions/actionFrame.ts index 6a28060d7..ab5088edd 100644 --- a/packages/excalidraw/actions/actionFrame.ts +++ b/packages/excalidraw/actions/actionFrame.ts @@ -10,9 +10,10 @@ import { getFrameChildren } from "@excalidraw/element/frame"; import { KEYS, updateActiveTool } from "@excalidraw/common"; +import { getElementsInGroup } from "@excalidraw/element/groups"; + import type { ExcalidrawElement } from "@excalidraw/element/types"; -import { getElementsInGroup } from "../groups"; import { setCursorForShape } from "../cursor"; import { frameToolIcon } from "../components/icons"; import { getSelectedElements } from "../scene"; diff --git a/packages/excalidraw/actions/actionGroup.tsx b/packages/excalidraw/actions/actionGroup.tsx index d36e33039..291f871c6 100644 --- a/packages/excalidraw/actions/actionGroup.tsx +++ b/packages/excalidraw/actions/actionGroup.tsx @@ -16,6 +16,16 @@ import { import { KEYS, randomId, arrayToMap, getShortcutKey } from "@excalidraw/common"; +import { + getSelectedGroupIds, + selectGroup, + selectGroupsForSelectedElements, + getElementsInGroup, + addToGroup, + removeFromSelectedGroups, + isElementInGroup, +} from "@excalidraw/element/groups"; + import type { ExcalidrawElement, ExcalidrawTextElement, @@ -27,15 +37,6 @@ import { UngroupIcon, GroupIcon } from "../components/icons"; import { syncMovedIndices } from "../fractionalIndex"; -import { - getSelectedGroupIds, - selectGroup, - selectGroupsForSelectedElements, - getElementsInGroup, - addToGroup, - removeFromSelectedGroups, - isElementInGroup, -} from "../groups"; import { t } from "../i18n"; import { isSomeElementSelected } from "../scene"; diff --git a/packages/excalidraw/actions/actionSelectAll.ts b/packages/excalidraw/actions/actionSelectAll.ts index 8ed8d757c..f38e580ca 100644 --- a/packages/excalidraw/actions/actionSelectAll.ts +++ b/packages/excalidraw/actions/actionSelectAll.ts @@ -4,9 +4,10 @@ import { isLinearElement } from "@excalidraw/element/typeChecks"; import { KEYS } from "@excalidraw/common"; +import { selectGroupsForSelectedElements } from "@excalidraw/element/groups"; + import type { ExcalidrawElement } from "@excalidraw/element/types"; -import { selectGroupsForSelectedElements } from "../groups"; import { CaptureUpdateAction } from "../store"; import { selectAllIcon } from "../components/icons"; diff --git a/packages/excalidraw/align.ts b/packages/excalidraw/align.ts index b0b20a9ec..015c68dac 100644 --- a/packages/excalidraw/align.ts +++ b/packages/excalidraw/align.ts @@ -2,11 +2,11 @@ import { updateBoundElements } from "@excalidraw/element/binding"; import { getCommonBoundingBox } from "@excalidraw/element/bounds"; import { mutateElement } from "@excalidraw/element/mutateElement"; +import { getMaximumGroups } from "@excalidraw/element/groups"; + import type { BoundingBox } from "@excalidraw/element/bounds"; import type { ElementsMap, ExcalidrawElement } from "@excalidraw/element/types"; -import { getMaximumGroups } from "./groups"; - import type Scene from "./scene/Scene"; export interface Alignment { diff --git a/packages/excalidraw/change.ts b/packages/excalidraw/change.ts index 6e5e38d88..0cd9e5264 100644 --- a/packages/excalidraw/change.ts +++ b/packages/excalidraw/change.ts @@ -29,6 +29,8 @@ import { isTextElement, } from "@excalidraw/element/typeChecks"; +import { getNonDeletedGroupIds } from "@excalidraw/element/groups"; + import type { BindableProp, BindingProp } from "@excalidraw/element/binding"; import type { ElementUpdate } from "@excalidraw/element/mutateElement"; @@ -45,7 +47,6 @@ import type { } from "@excalidraw/element/types"; import { orderByFractionalIndex, syncMovedIndices } from "./fractionalIndex"; -import { getNonDeletedGroupIds } from "./groups"; import { getObservedAppState } from "./store"; import type { diff --git a/packages/excalidraw/components/App.tsx b/packages/excalidraw/components/App.tsx index 53caf2959..dfb214426 100644 --- a/packages/excalidraw/components/App.tsx +++ b/packages/excalidraw/components/App.tsx @@ -274,6 +274,16 @@ import { ShapeCache } from "@excalidraw/element/ShapeCache"; import { getRenderOpacity } from "@excalidraw/element/renderElement"; +import { + editGroupForSelectedElement, + getElementsInGroup, + getSelectedGroupIdForElement, + getSelectedGroupIds, + isElementInGroup, + isSelectedViaGroup, + selectGroupsForSelectedElements, +} from "@excalidraw/element/groups"; + import type { LocalPoint, Radians } from "@excalidraw/math"; import type { @@ -362,15 +372,6 @@ import Library, { distributeLibraryItemsOnSquareGrid } from "../data/library"; import { restore, restoreElements } from "../data/restore"; import { getCenter, getDistance } from "../gesture"; -import { - editGroupForSelectedElement, - getElementsInGroup, - getSelectedGroupIdForElement, - getSelectedGroupIds, - isElementInGroup, - isSelectedViaGroup, - selectGroupsForSelectedElements, -} from "../groups"; import { History } from "../history"; import { defaultLang, getLanguage, languages, setLanguage, t } from "../i18n"; diff --git a/packages/excalidraw/distribute.ts b/packages/excalidraw/distribute.ts index d5d23242d..deb7b4d85 100644 --- a/packages/excalidraw/distribute.ts +++ b/packages/excalidraw/distribute.ts @@ -1,9 +1,9 @@ import { getCommonBoundingBox } from "@excalidraw/element/bounds"; import { newElementWith } from "@excalidraw/element/mutateElement"; -import type { ElementsMap, ExcalidrawElement } from "@excalidraw/element/types"; +import { getMaximumGroups } from "@excalidraw/element/groups"; -import { getMaximumGroups } from "./groups"; +import type { ElementsMap, ExcalidrawElement } from "@excalidraw/element/types"; export interface Distribution { space: "between"; diff --git a/packages/excalidraw/renderer/interactiveScene.ts b/packages/excalidraw/renderer/interactiveScene.ts index 6f6820034..8ef9f859d 100644 --- a/packages/excalidraw/renderer/interactiveScene.ts +++ b/packages/excalidraw/renderer/interactiveScene.ts @@ -42,6 +42,13 @@ import { getCornerRadius } from "@excalidraw/element/shapes"; import { renderSelectionElement } from "@excalidraw/element/renderElement"; +import { + isSelectedViaGroup, + getSelectedGroupIds, + getElementsInGroup, + selectGroupsFromGivenElements, +} from "@excalidraw/element/groups"; + import type { SuggestedBinding, SuggestedPointBinding, @@ -64,12 +71,6 @@ import type { NonDeleted, } from "@excalidraw/element/types"; -import { - isSelectedViaGroup, - getSelectedGroupIds, - getElementsInGroup, - selectGroupsFromGivenElements, -} from "../groups"; import { renderSnaps } from "../renderer/renderSnaps"; import { roundRect } from "../renderer/roundRect"; import { diff --git a/packages/excalidraw/scene/Scene.ts b/packages/excalidraw/scene/Scene.ts index eb8e66e17..3602879ab 100644 --- a/packages/excalidraw/scene/Scene.ts +++ b/packages/excalidraw/scene/Scene.ts @@ -9,6 +9,8 @@ import { import { isNonDeletedElement } from "@excalidraw/element"; import { isFrameLikeElement } from "@excalidraw/element/typeChecks"; +import { getElementsInGroup } from "@excalidraw/element/groups"; + import type { LinearElementEditor } from "@excalidraw/element/linearElementEditor"; import type { ExcalidrawElement, @@ -22,7 +24,6 @@ import type { Ordered, } from "@excalidraw/element/types"; -import { getElementsInGroup } from "../groups"; import { syncInvalidIndices, syncMovedIndices, diff --git a/packages/excalidraw/snapping.ts b/packages/excalidraw/snapping.ts index 6b44e5407..042be5bbf 100644 --- a/packages/excalidraw/snapping.ts +++ b/packages/excalidraw/snapping.ts @@ -18,6 +18,8 @@ import { isFrameLikeElement, } from "@excalidraw/element/typeChecks"; +import { getMaximumGroups } from "@excalidraw/element/groups"; + import type { InclusiveRange } from "@excalidraw/math"; import type { Bounds } from "@excalidraw/element/bounds"; @@ -28,7 +30,6 @@ import type { NonDeletedExcalidrawElement, } from "@excalidraw/element/types"; -import { getMaximumGroups } from "./groups"; import { getSelectedElements, getVisibleAndNonSelectedElements, diff --git a/packages/excalidraw/zindex.ts b/packages/excalidraw/zindex.ts index d33c3166d..2d19ffe27 100644 --- a/packages/excalidraw/zindex.ts +++ b/packages/excalidraw/zindex.ts @@ -2,13 +2,14 @@ import { isFrameLikeElement } from "@excalidraw/element/typeChecks"; import { arrayToMap, findIndex, findLastIndex } from "@excalidraw/common"; +import { getElementsInGroup } from "@excalidraw/element/groups"; + import type { ExcalidrawElement, ExcalidrawFrameLikeElement, } from "@excalidraw/element/types"; import { syncMovedIndices } from "./fractionalIndex"; -import { getElementsInGroup } from "./groups"; import { getSelectedElements } from "./scene"; import Scene from "./scene/Scene";