Search code examples
ionic-frameworkionic2dragulang2-dragula

Using Dragula with Ionic Slides


I am using Dragula within my Ionic project. This is working nicely and I can drag and drop items between the top panel and the bottom panel.

<ion-row>
    <ion-col col-12 class="active-players"  [dragula]='"my-bag"' [dragulaModel]="active">   
    </ion-col>
</ion-row>

<ion-row>
    <ion-col col-12>
          <ion-list [dragula]='"my-bag"' [dragulaModel]="example">
            <button ion-item detail-none>one</button>
            <button ion-item detail-none>two</button>
            <button ion-item detail-none>three</button>
            <button ion-item detail-none>four</button>
            <button ion-item detail-none>five</button>                                                              
          </ion-list>
    </ion-col>
</ion-row>  

I am now trying to replace by bottom panel with a slider using the built in Ionic Slides functionality (https://ionicframework.com/docs/api/components/slides/Slides/). This means that rather than a list of players I can show them side by side in a carousel style.

When I use this code then the sliding works (I can scroll left and right to reveal more players) but when I try and drag an individual <ion-slide> then the entire row of all 11 players is selected.

<ion-row>
    <ion-col col-12>
        <ion-slides [dragula]='"my-bag"' [dragulaModel]="inactive" class="players">
            <ion-slide><img src="assets/players/1.jpg"><span>De Gea</span></ion-slide>
            <ion-slide><img src="assets/players/2.jpg"><span>Rojo</span></ion-slide>                     
            <ion-slide><img src="assets/players/3.jpg"><span>Bally</span></ion-slide>       
            <ion-slide><img src="assets/players/4.jpg"><span>Lindelof</span></ion-slide>        
            <ion-slide><img src="assets/players/5.jpg"><span>Smalling</span></ion-slide>        
            <ion-slide><img src="assets/players/6.jpg"><span>Mata</span></ion-slide>        
            <ion-slide><img src="assets/players/7.jpg"><span>Pogba</span></ion-slide>       
            <ion-slide><img src="assets/players/8.jpg"><span>Mkhitaryan</span></ion-slide>      
            <ion-slide><img src="assets/players/9.jpg"><span>Lingard</span></ion-slide>     
            <ion-slide><img src="assets/players/10.jpg"><span>Lukaku</span></ion-slide>     
            <ion-slide><img src="assets/players/11.jpg"><span>Rashford</span></ion-slide>                                                                                                                   
        </ion-slides>   
    </ion-col>
</ion-row>  

How can I set Dragula up so individual players can be dragged?

In case it helps, my game.ts file is:

import { Component, ViewChild } from '@angular/core';
import { IonicPage, NavController, NavParams, Slides } from 'ionic-angular';
import { DragulaService } from 'ng2-dragula/ng2-dragula';

@IonicPage()
@Component({
  selector: 'page-game',
  templateUrl: 'game.html',
})
export class GamePage {

  @ViewChild(Slides) slides: Slides;

  constructor(public navCtrl: NavController, public navParams: NavParams, private dragulaService: DragulaService) {

    this.dragulaService.setOptions('my-bag', {
      revertOnSpill: true
    });  

    dragulaService.drop.subscribe((value) => {
        console.log('dropped', value);
    });    

  }

  ionViewDidLoad() {
    this.slides.slidesPerView = 4;
    this.slides.loop = true;
  }

}

Solution

  • I managed to solve this by using Ionic Scroll instead of Ionic Slides.

    This lets me scroll horizontally but the drag and drop works.

    <ion-scroll scrollX="true" zoom="false">
        <div class="inactive-players" [dragula]='"my-bag"' [dragulaModel]="inactive">
            <div class="player-item"><img src="assets/players/1.jpg"><span>Player1</span></div>                  
            <div class="player-item"><img src="assets/players/2.jpg"><span>Player2</span></div>                  
            <div class="player-item"><img src="assets/players/3.jpg"><span>Player3</span></div>     
            <div class="player-item"><img src="assets/players/4.jpg"><span>Player4</span></div>     
            <div class="player-item"><img src="assets/players/5.jpg"><span>Player5</span></div>     
            <div class="player-item"><img src="assets/players/6.jpg"><span>Player6</span></div>     
            <div class="player-item"><img src="assets/players/7.jpg"><span>Player7</span></div>     
            <div class="player-item"><img src="assets/players/8.jpg"><span>Player8</span></div>     
            <div class="player-item"><img src="assets/players/9.jpg"><span>Player9</span></div>     
            <div class="player-item"><img src="assets/players/10.jpg"><span>Player10</span></div>       
            <div class="player-item"><img src="assets/players/11.jpg"><span>Player11</span></div>   
        </div>                                                                  
    </ion-scroll>