1
1
import { isPhone , isDesktop } from "@ui5/webcomponents-base/dist/Device.js" ;
2
2
import clamp from "@ui5/webcomponents-base/dist/util/clamp.js" ;
3
3
import ResizeHandler from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.js" ;
4
+ import {
5
+ isUp , isDown , isLeft , isRight ,
6
+ isUpShift , isDownShift , isLeftShift , isRightShift ,
7
+ } from "@ui5/webcomponents-base/dist/Keys.js" ;
4
8
import Popup from "./Popup.js" ;
5
9
import "@ui5/webcomponents-icons/dist/resize-corner.js" ;
6
10
import Icon from "./Icon.js" ;
@@ -12,6 +16,11 @@ import browserScrollbarCSS from "./generated/themes/BrowserScrollbar.css.js";
12
16
import PopupsCommonCss from "./generated/themes/PopupsCommon.css.js" ;
13
17
import dialogCSS from "./generated/themes/Dialog.css.js" ;
14
18
19
+ /**
20
+ * Defines the step size at which this component would change by when being dragged or resized with the keyboard.
21
+ */
22
+ const STEP_SIZE = 16 ;
23
+
15
24
/**
16
25
* @public
17
26
*/
@@ -204,6 +213,10 @@ class Dialog extends Popup {
204
213
return [ browserScrollbarCSS , PopupsCommonCss , dialogCSS ] ;
205
214
}
206
215
216
+ static _isHeader ( element ) {
217
+ return element . classList . contains ( "ui5-popup-header-root" ) || element . getAttribute ( "slot" ) === "header" ;
218
+ }
219
+
207
220
/**
208
221
* Opens the dialog
209
222
*
@@ -251,13 +264,25 @@ class Dialog extends Popup {
251
264
return "flex" ;
252
265
}
253
266
267
+ /**
268
+ * Determines if the header of the dialog should be shown.
269
+ */
254
270
get _displayHeader ( ) {
255
- return this . header . length || this . headerText ;
271
+ return this . header . length || this . headerText || this . draggable || this . resizable ;
272
+ }
273
+
274
+ get _movable ( ) {
275
+ return ! this . stretch && this . onDesktop && ( this . draggable || this . resizable ) ;
276
+ }
277
+
278
+ get _headerTabIndex ( ) {
279
+ return this . _movable ? "0" : undefined ;
256
280
}
257
281
258
282
show ( ) {
259
283
super . show ( ) ;
260
284
this . _center ( ) ;
285
+ this . _attachResizeHandlers ( ) ;
261
286
}
262
287
263
288
onBeforeRendering ( ) {
@@ -266,16 +291,17 @@ class Dialog extends Popup {
266
291
this . onDesktop = isDesktop ( ) ;
267
292
}
268
293
269
- onEnterDOM ( ) {
270
- super . onEnterDOM ( ) ;
294
+ onExitDOM ( ) {
295
+ super . onExitDOM ( ) ;
296
+ this . _detachResizeHandlers ( ) ;
297
+ }
271
298
299
+ _attachResizeHandlers ( ) {
272
300
ResizeHandler . register ( this , this . _screenResizeHandler ) ;
273
301
ResizeHandler . register ( document . body , this . _screenResizeHandler ) ;
274
302
}
275
303
276
- onExitDOM ( ) {
277
- super . onExitDOM ( ) ;
278
-
304
+ _detachResizeHandlers ( ) {
279
305
ResizeHandler . deregister ( this , this . _screenResizeHandler ) ;
280
306
ResizeHandler . deregister ( document . body , this . _screenResizeHandler ) ;
281
307
}
@@ -304,13 +330,8 @@ class Dialog extends Popup {
304
330
* Event handlers
305
331
*/
306
332
_onDragMouseDown ( event ) {
307
- if ( ! ( this . draggable && this . onDesktop ) ) {
308
- return ;
309
- }
310
-
311
- // only allow dragging on the header's whitespace
312
- if ( ! event . target . classList . contains ( "ui5-popup-header-root" )
313
- && event . target . getAttribute ( "slot" ) !== "header" ) {
333
+ // allow dragging only on the header
334
+ if ( ! this . _movable || ! this . draggable || ! Dialog . _isHeader ( event . target ) ) {
314
335
return ;
315
336
}
316
337
@@ -335,7 +356,7 @@ class Dialog extends Popup {
335
356
this . _x = event . clientX ;
336
357
this . _y = event . clientY ;
337
358
338
- this . _attachDragHandlers ( ) ;
359
+ this . _attachMouseDragHandlers ( ) ;
339
360
}
340
361
341
362
_onDragMouseMove ( event ) {
@@ -361,24 +382,115 @@ class Dialog extends Popup {
361
382
this . _x = null ;
362
383
this . _y = null ;
363
384
364
- this . _detachDragHandlers ( ) ;
385
+ this . _detachMouseDragHandlers ( ) ;
365
386
}
366
387
367
- _attachDragHandlers ( ) {
368
- ResizeHandler . deregister ( this , this . _screenResizeHandler ) ;
369
- ResizeHandler . deregister ( document . body , this . _screenResizeHandler ) ;
388
+ _onDragOrResizeKeyDown ( event ) {
389
+ if ( ! this . _movable || ! Dialog . _isHeader ( event . target ) ) {
390
+ return ;
391
+ }
392
+
393
+ if ( this . draggable && [ isUp , isDown , isLeft , isRight ] . some ( key => key ( event ) ) ) {
394
+ this . _dragWithEvent ( event ) ;
395
+ return ;
396
+ }
397
+
398
+ if ( this . resizable && [ isUpShift , isDownShift , isLeftShift , isRightShift ] . some ( key => key ( event ) ) ) {
399
+ this . _resizeWithEvent ( event ) ;
400
+ }
401
+ }
402
+
403
+ _dragWithEvent ( event ) {
404
+ const {
405
+ top,
406
+ left,
407
+ width,
408
+ height,
409
+ } = this . getBoundingClientRect ( ) ;
410
+
411
+ let newPos ,
412
+ posDirection ;
413
+
414
+ switch ( true ) {
415
+ case isUp ( event ) :
416
+ newPos = top - STEP_SIZE ;
417
+ posDirection = "top" ;
418
+ break ;
419
+ case isDown ( event ) :
420
+ newPos = top + STEP_SIZE ;
421
+ posDirection = "top" ;
422
+ break ;
423
+ case isLeft ( event ) :
424
+ newPos = left - STEP_SIZE ;
425
+ posDirection = "left" ;
426
+ break ;
427
+ case isRight ( event ) :
428
+ newPos = left + STEP_SIZE ;
429
+ posDirection = "left" ;
430
+ break ;
431
+ }
432
+
433
+ newPos = clamp (
434
+ newPos ,
435
+ 0 ,
436
+ posDirection === "left" ? window . innerWidth - width : window . innerHeight - height ,
437
+ ) ;
438
+
439
+ this . style [ posDirection ] = `${ newPos } px` ;
440
+ }
441
+
442
+ _resizeWithEvent ( event ) {
443
+ this . _detachResizeHandlers ( ) ;
444
+ this . addEventListener ( "ui5-before-close" , this . _revertSize ) ;
445
+
446
+ const { top, left } = this . getBoundingClientRect ( ) ,
447
+ style = window . getComputedStyle ( this ) ,
448
+ minWidth = Number . parseFloat ( style . minWidth ) ,
449
+ minHeight = Number . parseFloat ( style . minHeight ) ,
450
+ maxWidth = window . innerWidth - left ,
451
+ maxHeight = window . innerHeight - top ;
452
+
453
+ let width = Number . parseFloat ( style . width ) ,
454
+ height = Number . parseFloat ( style . height ) ;
455
+
456
+ switch ( true ) {
457
+ case isUpShift ( event ) :
458
+ height -= STEP_SIZE ;
459
+ break ;
460
+ case isDownShift ( event ) :
461
+ height += STEP_SIZE ;
462
+ break ;
463
+ case isLeftShift ( event ) :
464
+ width -= STEP_SIZE ;
465
+ break ;
466
+ case isRightShift ( event ) :
467
+ width += STEP_SIZE ;
468
+ break ;
469
+ }
470
+
471
+ width = clamp ( width , minWidth , maxWidth ) ;
472
+ height = clamp ( height , minHeight , maxHeight ) ;
473
+
474
+ Object . assign ( this . style , {
475
+ width : `${ width } px` ,
476
+ height : `${ height } px` ,
477
+ } ) ;
478
+ }
479
+
480
+ _attachMouseDragHandlers ( ) {
481
+ this . _detachResizeHandlers ( ) ;
370
482
371
483
window . addEventListener ( "mousemove" , this . _dragMouseMoveHandler ) ;
372
484
window . addEventListener ( "mouseup" , this . _dragMouseUpHandler ) ;
373
485
}
374
486
375
- _detachDragHandlers ( ) {
487
+ _detachMouseDragHandlers ( ) {
376
488
window . removeEventListener ( "mousemove" , this . _dragMouseMoveHandler ) ;
377
489
window . removeEventListener ( "mouseup" , this . _dragMouseUpHandler ) ;
378
490
}
379
491
380
492
_onResizeMouseDown ( event ) {
381
- if ( ! ( this . resizable && this . onDesktop ) ) {
493
+ if ( ! this . _movable || ! this . resizable ) {
382
494
return ;
383
495
}
384
496
@@ -409,14 +521,14 @@ class Dialog extends Popup {
409
521
left : `${ left } px` ,
410
522
} ) ;
411
523
412
- this . _attachResizeHandlers ( ) ;
524
+ this . _attachMouseResizeHandlers ( ) ;
413
525
}
414
526
415
527
_onResizeMouseMove ( event ) {
416
528
const { clientX, clientY } = event ;
417
529
418
- let newWidth ;
419
- let newLeft ;
530
+ let newWidth ,
531
+ newLeft ;
420
532
421
533
if ( this . _isRTL ) {
422
534
newWidth = clamp (
@@ -461,19 +573,18 @@ class Dialog extends Popup {
461
573
this . _minWidth = null ;
462
574
this . _minHeight = null ;
463
575
464
- this . _detachResizeHandlers ( ) ;
576
+ this . _detachMouseResizeHandlers ( ) ;
465
577
}
466
578
467
- _attachResizeHandlers ( ) {
468
- ResizeHandler . deregister ( this , this . _screenResizeHandler ) ;
469
- ResizeHandler . deregister ( document . body , this . _screenResizeHandler ) ;
579
+ _attachMouseResizeHandlers ( ) {
580
+ this . _detachResizeHandlers ( ) ;
470
581
471
582
window . addEventListener ( "mousemove" , this . _resizeMouseMoveHandler ) ;
472
583
window . addEventListener ( "mouseup" , this . _resizeMouseUpHandler ) ;
473
584
this . addEventListener ( "ui5-before-close" , this . _revertSize ) ;
474
585
}
475
586
476
- _detachResizeHandlers ( ) {
587
+ _detachMouseResizeHandlers ( ) {
477
588
window . removeEventListener ( "mousemove" , this . _resizeMouseMoveHandler ) ;
478
589
window . removeEventListener ( "mouseup" , this . _resizeMouseUpHandler ) ;
479
590
}
0 commit comments