@@ -8,8 +8,10 @@ import {
88import { restore , spy , stub } from 'sinon' ;
99
1010import { range } from 'lit/directives/range.js' ;
11+ import IgcIconButtonComponent from '../button/icon-button.js' ;
1112import { escapeKey } from '../common/controllers/key-bindings.js' ;
1213import { defineComponents } from '../common/definitions/defineComponents.js' ;
14+ import { getCenterPoint } from '../common/util.js' ;
1315import {
1416 simulateClick ,
1517 simulateKeyboard ,
@@ -38,27 +40,32 @@ describe('Tile drag and drop', () => {
3840 return tileManager . tiles [ index ] ;
3941 }
4042
43+ function getTileContentContainer ( element : IgcTileComponent ) {
44+ return element . renderRoot . querySelector < HTMLDivElement > (
45+ '[part="content-container"]'
46+ ) ! ;
47+ }
48+
49+ function getActionButtons ( tile : IgcTileComponent ) {
50+ return Array . from (
51+ tile . renderRoot
52+ . querySelector ( '[part="header"]' )
53+ ?. querySelectorAll ( IgcIconButtonComponent . tagName ) ?? [ ]
54+ ) ;
55+ }
56+
4157 async function dragAndDrop ( tile : IgcTileComponent , target : IgcTileComponent ) {
42- const { top , left , width , height } = target . getBoundingClientRect ( ) ;
58+ const { x , y } = getCenterPoint ( target ) ;
4359
4460 simulatePointerDown ( tile ) ;
45- simulatePointerMove ( tile , {
46- clientX : left + width * 0.5 ,
47- clientY : top + height * 0.5 ,
48- } ) ;
61+ simulatePointerMove ( tile , { clientX : x , clientY : y } ) ;
4962
5063 await viewTransitionComplete ( ) ;
5164
5265 simulateLostPointerCapture ( tile ) ;
5366 await elementUpdated ( tileManager ) ;
5467 }
5568
56- function getTileContentContainer ( element : IgcTileComponent ) {
57- return element . renderRoot . querySelector < HTMLDivElement > (
58- '[part="content-container"]'
59- ) ! ;
60- }
61-
6269 function createTileManager ( mode : TileManagerDragMode = 'none' ) {
6370 const result = Array . from ( range ( 5 ) ) . map (
6471 ( i ) => html `
@@ -154,16 +161,13 @@ describe('Tile drag and drop', () => {
154161 it ( 'should cancel dragging with Escape' , async ( ) => {
155162 const draggedTile = getTile ( 0 ) ;
156163 const dropTarget = getTile ( 4 ) ;
157- const dropTargetRect = dropTarget . getBoundingClientRect ( ) ;
164+ const { x , y } = getCenterPoint ( dropTarget ) ;
158165
159166 expect ( draggedTile . position ) . to . equal ( 0 ) ;
160167 expect ( dropTarget . position ) . to . equal ( 4 ) ;
161168
162169 simulatePointerDown ( draggedTile ) ;
163- simulatePointerMove ( draggedTile , {
164- clientX : dropTargetRect . left + dropTargetRect . width * 0.5 ,
165- clientY : dropTargetRect . top + dropTargetRect . height * 0.5 ,
166- } ) ;
170+ simulatePointerMove ( draggedTile , { clientX : x , clientY : y } ) ;
167171
168172 await viewTransitionComplete ( ) ;
169173 expect ( draggedTile . position ) . to . equal ( 4 ) ;
@@ -253,12 +257,10 @@ describe('Tile drag and drop', () => {
253257 expect ( tileManager . tiles [ 1 ] . id ) . to . equal ( 'tile1' ) ;
254258 } ) ;
255259
256- // REVIEW
257260 it ( 'should swap positions only once while dragging smaller tile over bigger tile when using slide action' , async ( ) => {
258261 tileManager . columnCount = 5 ;
259262 const draggedTile = getTile ( 0 ) ;
260263 const dropTarget = getTile ( 1 ) ;
261- const dropTargetRect = dropTarget . getBoundingClientRect ( ) ;
262264
263265 draggedTile . rowSpan = 1 ;
264266 draggedTile . colSpan = 1 ;
@@ -267,22 +269,24 @@ describe('Tile drag and drop', () => {
267269 dropTarget . colSpan = 3 ;
268270 await elementUpdated ( tileManager ) ;
269271
272+ const { x, y } = getCenterPoint ( dropTarget ) ;
273+
270274 simulatePointerDown ( draggedTile ) ;
271- simulatePointerMove ( draggedTile , {
272- clientX : dropTargetRect . left + dropTargetRect . width * 0.5 ,
273- clientY : dropTargetRect . top + dropTargetRect . height * 0.5 ,
274- } ) ;
275+ simulatePointerMove ( draggedTile , { clientX : x , clientY : y } ) ;
275276 await viewTransitionComplete ( ) ;
276277
277278 // Simulate second dragover event (inside dropTarget bounds)
278279 simulatePointerMove ( draggedTile , {
279- clientX : dropTargetRect . left + dropTargetRect . width * 0.5 + 5 ,
280- clientY : dropTargetRect . top + dropTargetRect . height * 0.5 + 5 ,
280+ clientX : x + 5 ,
281+ clientY : y + 5 ,
281282 } ) ;
282283 await viewTransitionComplete ( ) ;
283284
284285 expect ( draggedTile . position ) . to . equal ( 1 ) ;
285286 expect ( dropTarget . position ) . to . equal ( 0 ) ;
287+
288+ simulateLostPointerCapture ( draggedTile ) ;
289+ await elementUpdated ( draggedTile ) ;
286290 } ) ;
287291 } ) ;
288292
@@ -299,13 +303,10 @@ describe('Tile drag and drop', () => {
299303 target : IgcTileComponent
300304 ) {
301305 const header = tile . renderRoot . querySelector ( '[part="title"]' ) ! ;
302- const { top , left , width , height } = target . getBoundingClientRect ( ) ;
306+ const { x , y } = getCenterPoint ( target ) ;
303307
304308 simulatePointerDown ( header ) ;
305- simulatePointerMove ( tile , {
306- clientX : left + width * 0.5 ,
307- clientY : top + height * 0.5 ,
308- } ) ;
309+ simulatePointerMove ( tile , { clientX : x , clientY : y } ) ;
309310
310311 await viewTransitionComplete ( ) ;
311312
@@ -342,14 +343,11 @@ describe('Tile drag and drop', () => {
342343 const eventSpy = spy ( tileManager , 'emitEvent' ) ;
343344
344345 const contentContainer = getTileContentContainer ( draggedTile ) ;
345- const dropTargetRect = dropTarget . getBoundingClientRect ( ) ;
346+ const { x , y } = getCenterPoint ( dropTarget ) ;
346347
347348 simulatePointerDown ( contentContainer ) ;
348349
349- simulatePointerMove ( draggedTile , {
350- clientX : dropTargetRect . left + dropTargetRect . width * 0.5 ,
351- clientY : dropTargetRect . top + dropTargetRect . height * 0.5 ,
352- } ) ;
350+ simulatePointerMove ( draggedTile , { clientX : x , clientY : y } ) ;
353351 await viewTransitionComplete ( ) ;
354352
355353 simulateLostPointerCapture ( draggedTile ) ;
@@ -368,6 +366,17 @@ describe('Tile drag and drop', () => {
368366 ) ;
369367 } ) ;
370368
369+ function createSlottedActionTile ( ) {
370+ const tile = document . createElement ( IgcTileComponent . tagName ) ;
371+ const button = document . createElement ( 'button' ) ;
372+
373+ button . slot = 'actions' ;
374+ button . textContent = 'Custom action' ;
375+ tile . append ( button ) ;
376+
377+ return { tile, button } ;
378+ }
379+
371380 it ( 'should disable drag and drop when tile is maximized' , async ( ) => {
372381 const eventSpy = spy ( tileManager , 'emitEvent' ) ;
373382 const draggedTile = getTile ( 0 ) ;
@@ -429,5 +438,69 @@ describe('Tile drag and drop', () => {
429438
430439 restore ( ) ;
431440 } ) ;
441+
442+ it ( 'should not start a drag operation when interacting with the default tile actions in `tile-header` drag mode' , async ( ) => {
443+ tileManager . dragMode = 'tile-header' ;
444+ const tile = getTile ( 0 ) ;
445+ const [ maximize , _ ] = getActionButtons ( tile ) ;
446+ const eventSpy = spy ( tileManager , 'emitEvent' ) ;
447+
448+ maximize . click ( ) ;
449+ await elementUpdated ( tile ) ;
450+
451+ expect ( tile . maximized ) . to . be . true ;
452+ expect ( eventSpy ) . not . calledWith ( 'igcTileDragStarted' ) ;
453+
454+ maximize . click ( ) ;
455+ await elementUpdated ( tile ) ;
456+
457+ expect ( tile . maximized ) . to . be . false ;
458+ } ) ;
459+
460+ it ( 'should not start a drag operation when interacting with the default tile actions in `tile` drag mode' , async ( ) => {
461+ tileManager . dragMode = 'tile' ;
462+ const tile = getTile ( 0 ) ;
463+ const [ maximize , _ ] = getActionButtons ( tile ) ;
464+ const eventSpy = spy ( tileManager , 'emitEvent' ) ;
465+
466+ maximize . click ( ) ;
467+ await elementUpdated ( tile ) ;
468+
469+ expect ( tile . maximized ) . to . be . true ;
470+ expect ( eventSpy ) . not . calledWith ( 'igcTileDragStarted' ) ;
471+
472+ maximize . click ( ) ;
473+ await elementUpdated ( tile ) ;
474+
475+ expect ( tile . maximized ) . to . be . false ;
476+ } ) ;
477+
478+ it ( 'should not start a drag operation when interacting with the slotted tile actions in `tile-header` drag mode' , async ( ) => {
479+ const eventSpy = spy ( tileManager , 'emitEvent' ) ;
480+ const { tile, button } = createSlottedActionTile ( ) ;
481+
482+ tileManager . dragMode = 'tile-header' ;
483+ tileManager . append ( tile ) ;
484+ await elementUpdated ( tileManager ) ;
485+
486+ button . click ( ) ;
487+ await elementUpdated ( tile ) ;
488+
489+ expect ( eventSpy ) . not . calledWith ( 'igcTileDragStarted' ) ;
490+ } ) ;
491+
492+ it ( 'should not start a drag operation when interacting with the slotted tile actions in `tile` drag mode' , async ( ) => {
493+ const eventSpy = spy ( tileManager , 'emitEvent' ) ;
494+ const { tile, button } = createSlottedActionTile ( ) ;
495+
496+ tileManager . dragMode = 'tile' ;
497+ tileManager . append ( tile ) ;
498+ await elementUpdated ( tileManager ) ;
499+
500+ button . click ( ) ;
501+ await elementUpdated ( tile ) ;
502+
503+ expect ( eventSpy ) . not . calledWith ( 'igcTileDragStarted' ) ;
504+ } ) ;
432505 } ) ;
433506} ) ;
0 commit comments