Skip to content

Commit 10c0fba

Browse files
committed
fix the issue with clicking on overlapping objects
1 parent 215c947 commit 10c0fba

File tree

4 files changed

+66
-58
lines changed

4 files changed

+66
-58
lines changed

src/components/EditorCanvas/Area.jsx

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,12 @@ import {
1919
import { useTranslation } from "react-i18next";
2020
import { useHover } from "usehooks-ts";
2121

22-
export default function Area({ data, setResize, setInitDimensions }) {
22+
export default function Area({
23+
data,
24+
onPointerDown,
25+
setResize,
26+
setInitDimensions,
27+
}) {
2328
const ref = useRef(null);
2429
const isHovered = useHover(ref);
2530
const { layout } = useLayout();
@@ -60,16 +65,19 @@ export default function Area({ data, setResize, setInitDimensions }) {
6065
};
6166

6267
const unlockArea = () => {
68+
const elementInBulk = {
69+
id: data.id,
70+
type: ObjectType.AREA,
71+
initialCoords: { x: data.x, y: data.y },
72+
currentCoords: { x: data.x, y: data.y },
73+
};
6374
if (e.ctrlKey) {
6475
setBulkSelectedElements((prev) => [
6576
...prev,
66-
{
67-
id: data.id,
68-
type: ObjectType.AREA,
69-
initialCoords: { x: data.x, y: data.y },
70-
currentCoords: { x: data.x, y: data.y },
71-
},
77+
elementInBulk,
7278
]);
79+
} else {
80+
setBulkSelectedElements([elementInBulk]);
7381
}
7482
setSelectedElement((prev) => ({
7583
...prev,
@@ -147,6 +155,7 @@ export default function Area({ data, setResize, setInitDimensions }) {
147155
y={data.y}
148156
width={data.width > 0 ? data.width : 0}
149157
height={data.height > 0 ? data.height : 0}
158+
onPointerDown={onPointerDown}
150159
>
151160
<div
152161
className={`w-full h-full p-2 rounded cursor-move border-2 ${

src/components/EditorCanvas/Canvas.jsx

Lines changed: 28 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,9 @@ export default function Canvas() {
104104
show: false,
105105
ctrlKey: false,
106106
});
107+
// this is used to store the element that is clicked on
108+
// at the moment, and shouldn't be a part of the state
109+
let elementPointerDown = null;
107110

108111
const isSameElement = (el1, el2) => {
109112
return el1.id === el2.id && el1.type === el2.type;
@@ -172,39 +175,6 @@ export default function Canvas() {
172175
}
173176
};
174177

175-
const getElementFromCoords = (coords) => {
176-
for (const table of tables) {
177-
if (pointIsInsideRect(coords, tableRect(table, settings))) {
178-
return {
179-
element: table,
180-
type: ObjectType.TABLE,
181-
};
182-
}
183-
}
184-
for (const area of areas) {
185-
if (pointIsInsideRect(coords, areaRect(area))) {
186-
return {
187-
element: area,
188-
type: ObjectType.AREA,
189-
};
190-
}
191-
}
192-
for (const note of notes) {
193-
if (pointIsInsideRect(coords, noteRect(note))) {
194-
return {
195-
element: note,
196-
type: ObjectType.NOTE,
197-
};
198-
}
199-
}
200-
return null;
201-
};
202-
203-
/**
204-
* @param {PointerEvent} e
205-
* @param {number} id
206-
* @param {ObjectType[keyof ObjectType]} type
207-
*/
208178
const handlePointerDownOnElement = (e, { element, type }) => {
209179
if (selectedElement.open && !layout.sidebar) return;
210180

@@ -422,17 +392,16 @@ export default function Canvas() {
422392
const isMouseMiddleButton = e.button === 1;
423393

424394
if (isMouseLeftButton) {
425-
const elementAndType = getElementFromCoords(pointer.spaces.diagram);
426395
setBulkSelectRectPts({
427396
x1: pointer.spaces.diagram.x,
428397
y1: pointer.spaces.diagram.y,
429398
x2: pointer.spaces.diagram.x,
430399
y2: pointer.spaces.diagram.y,
431-
show: elementAndType === null || !elementAndType.element.locked,
400+
show: elementPointerDown === null || !elementPointerDown.element.locked,
432401
ctrlKey: e.ctrlKey,
433402
});
434-
if (elementAndType !== null) {
435-
handlePointerDownOnElement(e, elementAndType);
403+
if (elementPointerDown !== null) {
404+
handlePointerDownOnElement(e, elementPointerDown);
436405
}
437406
pointer.setStyle("crosshair");
438407
} else if (isMouseMiddleButton) {
@@ -711,6 +680,12 @@ export default function Canvas() {
711680
data={a}
712681
setResize={setAreaResize}
713682
setInitDimensions={setAreaInitDimensions}
683+
onPointerDown={() => {
684+
elementPointerDown = {
685+
element: a,
686+
type: ObjectType.AREA,
687+
};
688+
}}
714689
/>
715690
))}
716691
{relationships.map((e, i) => (
@@ -723,6 +698,12 @@ export default function Canvas() {
723698
setHoveredTable={setHoveredTable}
724699
handleGripField={handleGripField}
725700
setLinkingLine={setLinkingLine}
701+
onPointerDown={() => {
702+
elementPointerDown = {
703+
element: table,
704+
type: ObjectType.TABLE,
705+
};
706+
}}
726707
/>
727708
))}
728709
{linking && (
@@ -734,7 +715,16 @@ export default function Canvas() {
734715
/>
735716
)}
736717
{notes.map((n) => (
737-
<Note key={n.id} data={n} />
718+
<Note
719+
key={n.id}
720+
data={n}
721+
onPointerDown={() => {
722+
elementPointerDown = {
723+
element: n,
724+
type: ObjectType.NOTE,
725+
};
726+
}}
727+
/>
738728
))}
739729
{bulkSelectRectPts.show && (
740730
<rect

src/components/EditorCanvas/Note.jsx

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import {
1818
import { useTranslation } from "react-i18next";
1919
import { noteWidth, noteRadius, noteFold } from "../../data/constants";
2020

21-
export default function Note({ data }) {
21+
export default function Note({ data, onPointerDown }) {
2222
const [editField, setEditField] = useState({});
2323
const [hovered, setHovered] = useState(false);
2424
const { layout } = useLayout();
@@ -117,16 +117,19 @@ export default function Note({ data }) {
117117
};
118118

119119
const unlockNote = () => {
120+
const elementInBulk = {
121+
id: data.id,
122+
type: ObjectType.NOTE,
123+
initialCoords: { x: data.x, y: data.y },
124+
currentCoords: { x: data.x, y: data.y },
125+
};
120126
if (e.ctrlKey) {
121127
setBulkSelectedElements((prev) => [
122128
...prev,
123-
{
124-
id: data.id,
125-
type: ObjectType.NOTE,
126-
initialCoords: { x: data.x, y: data.y },
127-
currentCoords: { x: data.x, y: data.y },
128-
},
129+
elementInBulk,
129130
]);
131+
} else {
132+
setBulkSelectedElements([elementInBulk]);
130133
}
131134
setSelectedElement((prev) => ({
132135
...prev,
@@ -225,6 +228,7 @@ export default function Note({ data }) {
225228
y={data.y}
226229
width={noteWidth}
227230
height={data.height}
231+
onPointerDown={onPointerDown}
228232
>
229233
<div className="text-gray-900 select-none w-full h-full cursor-move px-3 py-2">
230234
<div className="flex justify-between gap-1 w-full">

src/components/EditorCanvas/Table.jsx

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import { getTableHeight } from "../../utils/utils";
2626

2727
export default function Table({
2828
tableData,
29+
onPointerDown,
2930
setHoveredTable,
3031
handleGripField,
3132
setLinkingLine,
@@ -79,16 +80,19 @@ export default function Table({
7980
};
8081

8182
const unlockTable = () => {
83+
const elementInBulk = {
84+
id: tableData.id,
85+
type: ObjectType.TABLE,
86+
initialCoords: { x: tableData.x, y: tableData.y },
87+
currentCoords: { x: tableData.x, y: tableData.y },
88+
};
8289
if (e.ctrlKey) {
8390
setBulkSelectedElements((prev) => [
8491
...prev,
85-
{
86-
id: tableData.id,
87-
type: ObjectType.TABLE,
88-
initialCoords: { x: tableData.x, y: tableData.y },
89-
currentCoords: { x: tableData.x, y: tableData.y },
90-
},
92+
elementInBulk,
9193
]);
94+
} else {
95+
setBulkSelectedElements([elementInBulk]);
9296
}
9397
setSelectedElement((prev) => ({
9498
...prev,
@@ -137,6 +141,7 @@ export default function Table({
137141
width={settings.tableWidth}
138142
height={height}
139143
className="group drop-shadow-lg rounded-md cursor-move"
144+
onPointerDown={onPointerDown}
140145
>
141146
<div
142147
onDoubleClick={openEditor}

0 commit comments

Comments
 (0)