@@ -56,13 +56,14 @@ export default function Canvas() {
56
56
bulkSelectedElements,
57
57
setBulkSelectedElements,
58
58
} = useSelect ( ) ;
59
- const [ dragging , setDragging ] = useState ( {
59
+ const notDragging = {
60
60
element : ObjectType . NONE ,
61
61
id : null ,
62
62
prevX : 0 ,
63
63
prevY : 0 ,
64
64
initialPositions : [ ] ,
65
- } ) ;
65
+ } ;
66
+ const [ dragging , setDragging ] = useState ( notDragging ) ;
66
67
const [ linking , setLinking ] = useState ( false ) ;
67
68
const [ linkingLine , setLinkingLine ] = useState ( {
68
69
startTableId : - 1 ,
@@ -181,7 +182,7 @@ export default function Canvas() {
181
182
case ObjectType . NOTE :
182
183
return notes [ element . id ] ;
183
184
default :
184
- return { x : 0 , y : 0 } ;
185
+ return { x : 0 , y : 0 , locked : false } ;
185
186
}
186
187
} ;
187
188
@@ -195,67 +196,45 @@ export default function Canvas() {
195
196
196
197
if ( ! e . isPrimary ) return ;
197
198
198
- let locked = false ;
199
- let prevCoords = { prevX : 0 , prevY : 0 } ;
199
+ const element = getElement ( { id, type } ) ;
200
200
201
- if ( type === ObjectType . TABLE ) {
202
- const table = tables . find ( ( t ) => t . id === id ) ;
203
- locked = table . locked ;
201
+ setSelectedElement ( ( prev ) => ( {
202
+ ...prev ,
203
+ element : type ,
204
+ id : id ,
205
+ open : false ,
206
+ } ) ) ;
204
207
205
- setGrabOffset ( {
206
- x : table . x - pointer . spaces . diagram . x ,
207
- y : table . y - pointer . spaces . diagram . y ,
208
- } ) ;
209
- prevCoords = { prevX : table . x , prevY : table . y } ;
210
- } else if ( type === ObjectType . AREA ) {
211
- const area = areas . find ( ( t ) => t . id === id ) ;
212
- locked = area . locked ;
213
-
214
- setGrabOffset ( {
215
- x : area . x - pointer . spaces . diagram . x ,
216
- y : area . y - pointer . spaces . diagram . y ,
217
- } ) ;
218
- prevCoords = { prevX : area . x , prevY : area . y } ;
219
- } else if ( type === ObjectType . NOTE ) {
220
- const note = notes . find ( ( t ) => t . id === id ) ;
221
- locked = note . locked ;
222
-
223
- setGrabOffset ( {
224
- x : note . x - pointer . spaces . diagram . x ,
225
- y : note . y - pointer . spaces . diagram . y ,
226
- } ) ;
227
- prevCoords = { prevX : note . x , prevY : note . y } ;
208
+ if ( element . locked ) {
209
+ setBulkSelectedElements ( [ ] ) ;
210
+ return ;
228
211
}
229
212
230
- if ( ! locked ) {
231
- setDragging ( ( prev ) => ( {
232
- ...prev ,
233
- id,
234
- element : type ,
235
- ...prevCoords ,
236
- } ) ) ;
237
- setSelectedElement ( ( prev ) => ( {
238
- ...prev ,
239
- element : type ,
240
- id : id ,
241
- open : false ,
242
- } ) ) ;
243
- }
213
+ let prevCoords = { prevX : element . x , prevY : element . y } ;
214
+ setGrabOffset ( {
215
+ x : element . x - pointer . spaces . diagram . x ,
216
+ y : element . y - pointer . spaces . diagram . y ,
217
+ } ) ;
244
218
245
- if ( bulkSelectedElements . length ) {
246
- setDragging ( ( prev ) => ( {
247
- ...prev ,
248
- initialPositions : bulkSelectedElements . map ( ( element ) => ( {
249
- ...element ,
250
- undo : {
251
- x : getElement ( element ) . x ,
252
- y : getElement ( element ) . y ,
253
- } ,
254
- } ) ) ,
255
- } ) ) ;
219
+ let newBulkSelectedElements ;
220
+ if ( bulkSelectedElements . some ( ( el ) => el . id === id && el . type === type ) ) {
221
+ newBulkSelectedElements = bulkSelectedElements ;
222
+ } else {
223
+ newBulkSelectedElements = [ { id, type } ] ;
224
+ setBulkSelectedElements ( newBulkSelectedElements ) ;
256
225
}
257
- } ;
258
226
227
+ setDragging ( ( prev ) => ( {
228
+ ...prev ,
229
+ id,
230
+ element : type ,
231
+ ...prevCoords ,
232
+ initialPositions : newBulkSelectedElements . map ( ( el ) => {
233
+ const { x, y } = getElement ( el ) ;
234
+ return { ...el , undo : { x, y } } ;
235
+ } ) ,
236
+ } ) ) ;
237
+ } ;
259
238
/**
260
239
* @param {PointerEvent } e
261
240
*/
@@ -302,39 +281,30 @@ export default function Canvas() {
302
281
endX : pointer . spaces . diagram . x ,
303
282
endY : pointer . spaces . diagram . y ,
304
283
} ) ;
305
- } else if (
306
- dragging . element !== ObjectType . NONE &&
307
- dragging . id !== null &&
308
- bulkSelectedElements . length &&
309
- bulkSelectedElements . some (
310
- ( element ) =>
311
- element . id === dragging . id && element . type === dragging . element ,
312
- )
313
- ) {
314
- for ( const element of bulkSelectedElements ) {
315
- if ( element . type === ObjectType . TABLE ) {
316
- const table = tables . find ( ( e ) => e . id === element . id ) ;
317
- if ( table . locked ) continue ;
318
- const { x, y } = table ;
319
- updateTable ( element . id , {
284
+ return ;
285
+ }
286
+
287
+ if ( isDragging ) {
288
+ for ( const el of bulkSelectedElements ) {
289
+ const element = getElement ( el ) ;
290
+ const { type } = el ;
291
+ if ( element . locked ) continue ;
292
+ const { x, y } = element ;
293
+
294
+ if ( type === ObjectType . TABLE ) {
295
+ updateTable ( el . id , {
320
296
x : x + deltaX ,
321
297
y : y + deltaY ,
322
298
} ) ;
323
299
}
324
- if ( element . type === ObjectType . AREA ) {
325
- const area = areas [ element . id ] ;
326
- if ( area . locked ) continue ;
327
- const { x, y } = area ;
328
- updateArea ( element . id , {
300
+ if ( type === ObjectType . AREA ) {
301
+ updateArea ( el . id , {
329
302
x : x + deltaX ,
330
303
y : y + deltaY ,
331
304
} ) ;
332
305
}
333
- if ( element . type === ObjectType . NOTE ) {
334
- const note = notes [ element . id ] ;
335
- if ( note . locked ) continue ;
336
- const { x, y } = note ;
337
- updateNote ( element . id , {
306
+ if ( type === ObjectType . NOTE ) {
307
+ updateNote ( el . id , {
338
308
x : x + deltaX ,
339
309
y : y + deltaY ,
340
310
} ) ;
@@ -346,35 +316,10 @@ export default function Canvas() {
346
316
prevX : finalX ,
347
317
prevY : finalY ,
348
318
} ) ) ;
349
- } else if ( dragging . element === ObjectType . TABLE && dragging . id !== null ) {
350
- const table = tables . find ( ( t ) => t . id === dragging . id ) ;
351
- if ( table . locked ) return ;
352
-
353
- updateTable ( dragging . id , {
354
- x : finalX ,
355
- y : finalY ,
356
- } ) ;
357
- } else if (
358
- dragging . element === ObjectType . AREA &&
359
- dragging . id !== null &&
360
- areaResize . id === - 1
361
- ) {
362
- const area = areas . find ( ( t ) => t . id === dragging . id ) ;
363
- if ( area . locked ) return ;
364
-
365
- updateArea ( dragging . id , {
366
- x : finalX ,
367
- y : finalY ,
368
- } ) ;
369
- } else if ( dragging . element === ObjectType . NOTE && dragging . id !== null ) {
370
- const note = notes . find ( ( t ) => t . id === dragging . id ) ;
371
- if ( note . locked ) return ;
319
+ return ;
320
+ }
372
321
373
- updateNote ( dragging . id , {
374
- x : finalX ,
375
- y : finalY ,
376
- } ) ;
377
- } else if ( areaResize . id !== - 1 ) {
322
+ if ( areaResize . id !== - 1 ) {
378
323
if ( areaResize . dir === "none" ) return ;
379
324
let newDims = { ...initCoords } ;
380
325
delete newDims . pointerX ;
@@ -405,7 +350,10 @@ export default function Canvas() {
405
350
}
406
351
407
352
updateArea ( areaResize . id , { ...newDims } ) ;
408
- } else if ( bulkSelectRectPts . show ) {
353
+ return ;
354
+ }
355
+
356
+ if ( bulkSelectRectPts . show ) {
409
357
setBulkSelectRectPts ( ( prev ) => ( {
410
358
...prev ,
411
359
x2 : finalX ,
@@ -452,7 +400,8 @@ export default function Canvas() {
452
400
}
453
401
} ;
454
402
455
- const coordsDidUpdate = ( element ) => {
403
+ const coordsDidUpdate = ( ) => {
404
+ const element = { id : dragging . id , type : dragging . element } ;
456
405
const elementData = getElement ( element ) ;
457
406
const updated = ! (
458
407
dragging . prevX === elementData . x && dragging . prevY === elementData . y
@@ -489,60 +438,24 @@ export default function Canvas() {
489
438
490
439
if ( ! e . isPrimary ) return ;
491
440
492
- let bulkMoved = false ;
441
+ const coordinatesDidUpdate = coordsDidUpdate ( ) ;
493
442
494
- if ( coordsDidUpdate ( { id : dragging . id , type : dragging . element } ) ) {
495
- if ( bulkSelectedElements . length ) {
496
- setUndoStack ( ( prev ) => [
497
- ...prev ,
498
- {
499
- action : Action . MOVE ,
500
- bulk : true ,
501
- message : t ( "bulk_update" ) ,
502
- elements : dragging . initialPositions . map ( ( element ) => ( {
503
- ...element ,
504
- redo : {
505
- x : getElement ( element ) . x ,
506
- y : getElement ( element ) . y ,
507
- } ,
508
- } ) ) ,
509
- } ,
510
- ] ) ;
511
- bulkMoved = true ;
512
- } else {
513
- const element = getElement ( {
514
- id : dragging . id ,
515
- type : dragging . element ,
516
- } ) ;
517
- setUndoStack ( ( prev ) => [
518
- ...prev ,
519
- {
520
- action : Action . MOVE ,
521
- element : dragging . element ,
522
- x : dragging . prevX ,
523
- y : dragging . prevY ,
524
- toX : element . x ,
525
- toY : element . y ,
526
- id : dragging . id ,
527
- message : t ( "move_element" , {
528
- coords : `(${ element . x } , ${ element . y } )` ,
529
- name : getElement ( {
530
- id : dragging . id ,
531
- type : dragging . element ,
532
- } ) . name ,
533
- } ) ,
534
- } ,
535
- ] ) ;
536
- }
443
+ if ( coordinatesDidUpdate ) {
444
+ setUndoStack ( ( prev ) => [
445
+ ...prev ,
446
+ {
447
+ action : Action . MOVE ,
448
+ bulk : true ,
449
+ message : t ( "bulk_update" ) ,
450
+ elements : dragging . initialPositions . map ( ( element ) => {
451
+ const { x, y } = getElement ( element ) ;
452
+ return { ...element , redo : { x, y } } ;
453
+ } ) ,
454
+ } ,
455
+ ] ) ;
537
456
setRedoStack ( [ ] ) ;
538
457
}
539
- setDragging ( {
540
- element : ObjectType . NONE ,
541
- id : null ,
542
- prevX : 0 ,
543
- prevY : 0 ,
544
- initialPositions : [ ] ,
545
- } ) ;
458
+ setDragging ( notDragging ) ;
546
459
547
460
if ( bulkSelectRectPts . show ) {
548
461
setBulkSelectRectPts ( ( prev ) => ( {
@@ -551,7 +464,7 @@ export default function Canvas() {
551
464
y2 : pointer . spaces . diagram . y ,
552
465
show : false ,
553
466
} ) ) ;
554
- if ( ! bulkMoved ) {
467
+ if ( ! coordinatesDidUpdate ) {
555
468
collectSelectedElements ( ) ;
556
469
}
557
470
}
@@ -601,13 +514,7 @@ export default function Canvas() {
601
514
602
515
const handleGripField = ( ) => {
603
516
setPanning ( ( old ) => ( { ...old , isPanning : false } ) ) ;
604
- setDragging ( {
605
- element : ObjectType . NONE ,
606
- id : null ,
607
- prevX : 0 ,
608
- prevY : 0 ,
609
- initialPositions : [ ] ,
610
- } ) ;
517
+ setDragging ( notDragging ) ;
611
518
setLinking ( true ) ;
612
519
} ;
613
520
0 commit comments