Table of Contents
Note

This documentation describes the v-neos-dragdrop Vue directive for native UI views. For Xml templates see dragdrop

v-neos-dragdrop

Enables drag-and-drop interactions on any element. The directive is split into multiple argument-based bindings that each handle a different phase of the drag lifecycle.

Import

import { NeosDragdrop } from '@neos/app'

Registration:

// in your app setup
app.directive('neos-dragdrop', NeosDragdrop)

Syntax

<div v-neos-dragdrop:[arg]="value" />

Arguments & Values

Argument Value type Description
draggable boolean Makes the element draggable
data unknown Data payload attached to the drag operation
dragstart (args: DragStartEventArgs) => void Called when the drag starts
dragover (args: DragEventArgs) => boolean Called on every drag-over. Return true to allow drop
dragenter (args: DragEventArgs) => void Called when a dragged element enters this target
dragleave (args: DragEventArgs) => void Called when a dragged element leaves this target
dragend (args: DragEventArgs) => void Called when the drag operation ends (on the source)
drop (args: DropEventArgs) => void Called when an element is dropped on this target

Types

import type {
  DragEventArgs,
  DragStartEventArgs,
  DropEventArgs,
  TreeViewDragEventArgs
} from '@neos/app'

interface DragStartEventArgs {
  nativeEvent: DragEvent
  sourceElement: HTMLElement
}

interface DropEventArgs {
  nativeEvent: DragEvent
  sourceData: unknown
  targetElement: HTMLElement
}

Usage Examples

Draggable card

<Card
  v-neos-dragdrop:draggable="true"
  v-neos-dragdrop:data="item"
  v-neos-dragdrop:dragstart="onDragStart"
>
  {{ item.name }}
</Card>

Drop target

<div v-neos-dragdrop:dragover="canDrop" v-neos-dragdrop:drop="onDrop" class="drop-zone">
  Drop here
</div>
function canDrop({ sourceData }) {
  return sourceData.type === 'task'
}

function onDrop({ sourceData, targetElement }) {
  moveItem(sourceData, targetElement.dataset.id)
}

Combined draggable + droppable (tree reorder)

<div
  v-for="item in items"
  :key="item.id"
  v-neos-dragdrop:draggable="true"
  v-neos-dragdrop:data="item"
  v-neos-dragdrop:dragover="() => true"
  v-neos-dragdrop:drop="onDrop"
>
  {{ item.label }}
</div>