Hello Salesforce Ohana!, today we will discuss Drag and Drop (Swap) Values in LWC. Drag and Drop features enhance user experience by allowing seamless reordering or swapping of items, providing a more intuitive and engaging interface. By incorporating Drag and Drop functionality into your Lightning Web Components, you’re not just creating a more interactive interface; you’re empowering users to customize their experience and streamline their workflow.
Also, check this: Use deleteRecord in LWC Salesforce
Key Highlights :
- Intuitive User Interface: Enable users to rearrange items effortlessly with simple drag and drop actions.
- Enhanced Interactivity: Provide a more engaging user experience by allowing users to interact directly with the application interface.
- Customizable Behavior: Tailor the drag and drop functionality to match your application’s specific requirements and design aesthetics.
Code :
dragswap.HTML:
<template>
<div class="columns">
<div class="card card1" draggable="true" data-id="card" ondragstart={handleDragStart}
ondragenter={handleDragEnter} ondragover={handleDragOver} ondragleave={handleDragLeave} ondrop={handleDrop}
ondragend={handleDragEnd}>A</div>
<div class="card card2" draggable="true" data-id="card" ondragstart={handleDragStart}
ondragenter={handleDragEnter} ondragover={handleDragOver} ondragleave={handleDragLeave} ondrop={handleDrop}
ondragend={handleDragEnd}>B</div>
<div class="card card3" draggable="true" data-id="card" ondragstart={handleDragStart}
ondragenter={handleDragEnter} ondragover={handleDragOver} ondragleave={handleDragLeave} ondrop={handleDrop}
ondragend={handleDragEnd}>C</div>
</div>
</template>
dragswap.JS:
import { LightningElement } from 'lwc';
export default class Dragswap extends LightningElement {
draggingClass = 'dragging';
dragSource;
connectedCallback() {
}
handleDragStart(evt) {
this.dragSource = event.target;
console.log(event.target.innerHTML);
evt.target.classList.add(this.draggingClass);
evt.dataTransfer.effectAllowed = 'move';
evt.dataTransfer.setData('text/html', this.dragSource.innerHTML);
}
handleDragOver(evt) {
evt.dataTransfer.dropEffect = 'move';
evt.preventDefault();
}
handleDragEnter(evt) {
this.classList.add('over');
}
handleDragLeave(evt) {
this.classList.remove('over');
}
handleDrop(evt) {
evt.stopPropagation();
console.log('test', this.dragSource);
if (this.dragSource !== event.target) {
this.dragSource.innerHTML = event.target.innerHTML;
event.target.innerHTML = evt.dataTransfer.getData('text/html');
}
evt.preventDefault();
}
handleDragEnd(evt) {
let columns = this.template.querySelectorAll(`[data-id="card"]`);
Array.prototype.forEach.call(columns, (col) => {
['over', 'dragging'].forEach((className) => {
col.classList.remove(className);
});
});
}
}
dragswap.JS-meta.css:
.columns {
margin :0 auto;
background: lightgrey;
width: 800px;
padding: 20px;
}
.card{
width: 32%;
display: inline-block;
margin-right: 1.2%;
height: 120px;
font-size: 50px;
background: deeppink;
border: 3px solid deeppink;
box-sizing: border-box;
color: white;
line-height: 120px;
vertical-align: middle;
text-align: center;
}
.card3{
margin-right: 0;
}
.card2{
background: dodgerblue;
border-color: dodgerblue;
}
.card3{
background: darkturquoise;
border-color: darkturquoise;
}
.dragging{
opacity: 0.5;
}
.over{
border: 3px dashed black;
}
dragswap.JS-meta.xml:
<?xml version="1.0"?> <LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata"> <apiVersion>57.0</apiVersion> <isExposed>true</isExposed> <targets> <target>lightning__HomePage</target> </targets> </LightningComponentBundle>
Output :
Reference :
What’s your Reaction?
+1
+1
+1
+1
+1
+1
