5
5
Constraint ,
6
6
darkBgTheme ,
7
7
ObjectType ,
8
- tableFieldHeight ,
9
- tableHeaderHeight ,
10
8
gridSize ,
11
9
gridCircleRadius ,
12
10
} from "../../data/constants" ;
@@ -29,7 +27,7 @@ import {
29
27
} from "../../hooks" ;
30
28
import { useTranslation } from "react-i18next" ;
31
29
import { useEventListener } from "usehooks-ts" ;
32
- import { areFieldsCompatible } from "../../utils/utils" ;
30
+ import { areFieldsCompatible , getTableHeight } from "../../utils/utils" ;
33
31
import { getRectFromEndpoints , isInsideRect } from "../../utils/rect" ;
34
32
import { noteWidth , State } from "../../data/constants" ;
35
33
@@ -117,8 +115,7 @@ export default function Canvas() {
117
115
x : table . x ,
118
116
y : table . y ,
119
117
width : settings . tableWidth ,
120
- height :
121
- table . fields . length * tableFieldHeight + tableHeaderHeight + 7 ,
118
+ height : getTableHeight ( table ) ,
122
119
} ,
123
120
rect ,
124
121
)
@@ -230,14 +227,7 @@ export default function Canvas() {
230
227
prevCoords = { prevX : note . x , prevY : note . y } ;
231
228
}
232
229
233
- if ( locked ) {
234
- setPanning ( {
235
- isPanning : true ,
236
- panStart : transform . pan ,
237
- cursorStart : pointer . spaces . screen ,
238
- } ) ;
239
- pointer . setStyle ( "grabbing" ) ;
240
- } else {
230
+ if ( ! locked ) {
241
231
setDragging ( ( prev ) => ( {
242
232
...prev ,
243
233
id,
@@ -274,6 +264,21 @@ export default function Canvas() {
274
264
275
265
if ( ! e . isPrimary ) return ;
276
266
267
+ if ( panning . isPanning ) {
268
+ setTransform ( ( prev ) => ( {
269
+ ...prev ,
270
+ pan : {
271
+ x :
272
+ panning . panStart . x +
273
+ ( panning . cursorStart . x - pointer . spaces . screen . x ) / transform . zoom ,
274
+ y :
275
+ panning . panStart . y +
276
+ ( panning . cursorStart . y - pointer . spaces . screen . y ) / transform . zoom ,
277
+ } ,
278
+ } ) ) ;
279
+ return ;
280
+ }
281
+
277
282
const isDragging =
278
283
dragging . element !== ObjectType . NONE && dragging . id !== null ;
279
284
@@ -300,26 +305,38 @@ export default function Canvas() {
300
305
} else if (
301
306
dragging . element !== ObjectType . NONE &&
302
307
dragging . id !== null &&
303
- bulkSelectedElements . length
308
+ bulkSelectedElements . length &&
309
+ bulkSelectedElements . some (
310
+ ( element ) =>
311
+ element . id === dragging . id && element . type === dragging . element ,
312
+ )
304
313
) {
305
314
for ( const element of bulkSelectedElements ) {
306
315
if ( element . type === ObjectType . TABLE ) {
307
- const { x, y } = tables . find ( ( e ) => e . id === element . id ) ;
316
+ const table = tables . find ( ( e ) => e . id === element . id ) ;
317
+ if ( table . locked ) continue ;
318
+ const { x, y } = table ;
308
319
updateTable ( element . id , {
309
320
x : x + deltaX ,
310
321
y : y + deltaY ,
311
322
} ) ;
312
323
}
313
324
if ( element . type === ObjectType . AREA ) {
325
+ const area = areas [ element . id ] ;
326
+ if ( area . locked ) continue ;
327
+ const { x, y } = area ;
314
328
updateArea ( element . id , {
315
- x : areas [ element . id ] . x + deltaX ,
316
- y : areas [ element . id ] . y + deltaY ,
329
+ x : x + deltaX ,
330
+ y : y + deltaY ,
317
331
} ) ;
318
332
}
319
333
if ( element . type === ObjectType . NOTE ) {
334
+ const note = notes [ element . id ] ;
335
+ if ( note . locked ) continue ;
336
+ const { x, y } = note ;
320
337
updateNote ( element . id , {
321
- x : notes [ element . id ] . x + deltaX ,
322
- y : notes [ element . id ] . y + deltaY ,
338
+ x : x + deltaX ,
339
+ y : y + deltaY ,
323
340
} ) ;
324
341
}
325
342
}
@@ -329,25 +346,6 @@ export default function Canvas() {
329
346
prevX : finalX ,
330
347
prevY : finalY ,
331
348
} ) ) ;
332
- } else if (
333
- panning . isPanning &&
334
- dragging . element === ObjectType . NONE &&
335
- areaResize . id === - 1
336
- ) {
337
- if ( ! settings . panning ) {
338
- return ;
339
- }
340
- setTransform ( ( prev ) => ( {
341
- ...prev ,
342
- pan : {
343
- x :
344
- panning . panStart . x +
345
- ( panning . cursorStart . x - pointer . spaces . screen . x ) / transform . zoom ,
346
- y :
347
- panning . panStart . y +
348
- ( panning . cursorStart . y - pointer . spaces . screen . y ) / transform . zoom ,
349
- } ,
350
- } ) ) ;
351
349
} else if ( dragging . element === ObjectType . TABLE && dragging . id !== null ) {
352
350
const table = tables . find ( ( t ) => t . id === dragging . id ) ;
353
351
if ( table . locked ) return ;
@@ -430,7 +428,10 @@ export default function Canvas() {
430
428
)
431
429
return ;
432
430
433
- if ( ! settings . panning ) {
431
+ const isMouseLeftButton = e . button === 0 ;
432
+ const isMouseMiddleButton = e . button === 1 ;
433
+
434
+ if ( isMouseLeftButton ) {
434
435
setBulkSelectRectPts ( {
435
436
x1 : pointer . spaces . diagram . x ,
436
437
y1 : pointer . spaces . diagram . y ,
@@ -439,7 +440,7 @@ export default function Canvas() {
439
440
show : true ,
440
441
} ) ;
441
442
pointer . setStyle ( "crosshair" ) ;
442
- } else {
443
+ } else if ( isMouseMiddleButton ) {
443
444
setPanning ( {
444
445
isPanning : true ,
445
446
panStart : transform . pan ,
@@ -488,6 +489,8 @@ export default function Canvas() {
488
489
489
490
if ( ! e . isPrimary ) return ;
490
491
492
+ let bulkMoved = false ;
493
+
491
494
if ( coordsDidUpdate ( { id : dragging . id , type : dragging . element } ) ) {
492
495
if ( bulkSelectedElements . length ) {
493
496
setUndoStack ( ( prev ) => [
@@ -505,12 +508,7 @@ export default function Canvas() {
505
508
} ) ) ,
506
509
} ,
507
510
] ) ;
508
- setSelectedElement ( ( prev ) => ( {
509
- ...prev ,
510
- element : ObjectType . NONE ,
511
- id : - 1 ,
512
- open : false ,
513
- } ) ) ;
511
+ bulkMoved = true ;
514
512
} else {
515
513
const element = getElement ( {
516
514
id : dragging . id ,
@@ -553,18 +551,13 @@ export default function Canvas() {
553
551
y2 : pointer . spaces . diagram . y ,
554
552
show : false ,
555
553
} ) ) ;
556
- collectSelectedElements ( ) ;
554
+ if ( ! bulkMoved ) {
555
+ collectSelectedElements ( ) ;
556
+ }
557
557
}
558
558
559
559
if ( panning . isPanning && didPan ( ) ) {
560
560
setSaveState ( State . SAVING ) ;
561
- setSelectedElement ( ( prev ) => ( {
562
- ...prev ,
563
- element : ObjectType . NONE ,
564
- id : - 1 ,
565
- open : false ,
566
- } ) ) ;
567
- setBulkSelectedElements ( [ ] ) ;
568
561
}
569
562
setPanning ( ( old ) => ( { ...old , isPanning : false } ) ) ;
570
563
pointer . setStyle ( "default" ) ;
@@ -708,15 +701,13 @@ export default function Canvas() {
708
701
{ passive : false } ,
709
702
) ;
710
703
711
- const theme = localStorage . getItem ( "theme" ) ;
712
-
713
704
return (
714
705
< div className = "grow h-full touch-none" id = "canvas" >
715
706
< div
716
707
className = "w-full h-full"
717
708
style = { {
718
709
cursor : pointer . style ,
719
- backgroundColor : theme === "dark" ? darkBgTheme : "white" ,
710
+ backgroundColor : settings . mode === "dark" ? darkBgTheme : "white" ,
720
711
} }
721
712
>
722
713
< svg
0 commit comments