Drag and Drop List
Allows users to create vertically sortable lists supporting drag and drop, touch or keyboard input.
When to use
- When a user wants to change a collection order.
Accessibility
tab
andshift+tab
to focus itemsspace
tolift
or drop the itemj
orarrow down
to move the lifted item downk
orarrow up
to move the lifted item upescape
to cancel the lift and return the item to its initial position
This component also supports iOS and Android browsers and screen readers.
Examples
Drag and Drop with varying heights
- Lorem ipsum dolor sit amet, consectetur adipiscing elit.
- Donec ornare.
- Morbi malesuada id ante ac tincidunt. Phasellus at varius enim, fringilla pretium lorem. Integer placerat, est in aliquam tempus, ex urna hendrerit quam, eu sagittis nulla lorem eu magna.
- Morbi nibh nunc.
- Nunc consequat erat id ante mollis tincidunt in a nulla.
Overrides
Additionally, you can fully customize any part of the Drag and Drop List through the overrides prop. The Drag and Drop List consists of multiple subcomponents that are listed bellow and you can override each one of them. To help you identify the names of these subcomponents, you can highlight them through this selector:
- Item 1
- Item 2
- Item 3
- Item 4
Note: You should always use longhand CSS properties. Mixing shorthands and longhands will lead into strange behaviors!
API
List API
removable
boolean
Set if the list items should be removable
removableByMove
boolean
Set if the list items should be removable by dragging them far left or right
items
Array<Node>
= []
Items (labels) to be rendered
ArrayNode
onChange
function
= () => undefined
Handler for when drag and drop is finished and order changed or item is deleted (newIndex would be -1 in that case)
oldIndex number required newIndex number required => mixed
overrides
object
Root { component: ?ComponentType<<T> & { children: Node }>, props: ?{} | ({}) => ?{}, style: ?{} | ({}) => ?{} }<<T>> | ComponentType<<T> & { children: Node }>$isDragged boolean required $isSelected boolean required $isRemovable boolean required $isRemovableByMove boolean required $isOutOfBounds boolean required $value required NodeList { component: ?ComponentType<<T> & { children: Node }>, props: ?{} | ({}) => ?{}, style: ?{} | ({}) => ?{} }<<T>> | ComponentType<<T> & { children: Node }>$isDragged boolean required $isSelected boolean required $isRemovable boolean required $isRemovableByMove boolean required $isOutOfBounds boolean required $value required NodeItem { component: ?ComponentType<<T> & { children: Node }>, props: ?{} | ({}) => ?{}, style: ?{} | ({}) => ?{} }<<T>> | ComponentType<<T> & { children: Node }>$isDragged boolean required $isSelected boolean required $isRemovable boolean required $isRemovableByMove boolean required $isOutOfBounds boolean required $value required NodeDragHandle { component: ?ComponentType<<T> & { children: Node }>, props: ?{} | ({}) => ?{}, style: ?{} | ({}) => ?{} }<<T>> | ComponentType<<T> & { children: Node }>$isDragged boolean required $isSelected boolean required $isRemovable boolean required $isRemovableByMove boolean required $isOutOfBounds boolean required $value required NodeCloseHandle { component: ?ComponentType<<T> & { children: Node }>, props: ?{} | ({}) => ?{}, style: ?{} | ({}) => ?{} }<<T>> | ComponentType<<T> & { children: Node }>$isDragged boolean required $isSelected boolean required $isRemovable boolean required $isRemovableByMove boolean required $isOutOfBounds boolean required $value required NodeLabel { component: ?ComponentType<<T> & { children: Node }>, props: ?{} | ({}) => ?{}, style: ?{} | ({}) => ?{} }<<T>> | ComponentType<<T> & { children: Node }>$isDragged boolean required $isSelected boolean required $isRemovable boolean required $isRemovableByMove boolean required $isOutOfBounds boolean required $value required Node
Stateful List API
initialState
object
= { items: [] }
Initial state populated into the component
items required ArrayNode
stateReducer
function
= (type, nextState) => undefined
Reducer function to manipulate internal state updates.
function $Values{ change: "change" }, items required ArrayNode, items required ArrayNode => items required ArrayNode
removable
boolean
Set if the list items should be removable
removableByMove
boolean
Set if the list items should be removable by dragging them far left or right
onChange
function
Handler for when drag and drop is finished and order changed or item is deleted (newIndex would be -1 in that case)
newState required ArrayNodeoldIndex number required newIndex number required targetRect required ClientRect => mixed
overrides
object
Root { component: ?ComponentType<<T> & { children: Node }>, props: ?{} | ({}) => ?{}, style: ?{} | ({}) => ?{} }<<T>> | ComponentType<<T> & { children: Node }>$isDragged boolean required $isSelected boolean required $isRemovable boolean required $isRemovableByMove boolean required $isOutOfBounds boolean required $value required NodeList { component: ?ComponentType<<T> & { children: Node }>, props: ?{} | ({}) => ?{}, style: ?{} | ({}) => ?{} }<<T>> | ComponentType<<T> & { children: Node }>$isDragged boolean required $isSelected boolean required $isRemovable boolean required $isRemovableByMove boolean required $isOutOfBounds boolean required $value required NodeItem { component: ?ComponentType<<T> & { children: Node }>, props: ?{} | ({}) => ?{}, style: ?{} | ({}) => ?{} }<<T>> | ComponentType<<T> & { children: Node }>$isDragged boolean required $isSelected boolean required $isRemovable boolean required $isRemovableByMove boolean required $isOutOfBounds boolean required $value required NodeDragHandle { component: ?ComponentType<<T> & { children: Node }>, props: ?{} | ({}) => ?{}, style: ?{} | ({}) => ?{} }<<T>> | ComponentType<<T> & { children: Node }>$isDragged boolean required $isSelected boolean required $isRemovable boolean required $isRemovableByMove boolean required $isOutOfBounds boolean required $value required NodeCloseHandle { component: ?ComponentType<<T> & { children: Node }>, props: ?{} | ({}) => ?{}, style: ?{} | ({}) => ?{} }<<T>> | ComponentType<<T> & { children: Node }>$isDragged boolean required $isSelected boolean required $isRemovable boolean required $isRemovableByMove boolean required $isOutOfBounds boolean required $value required NodeLabel { component: ?ComponentType<<T> & { children: Node }>, props: ?{} | ({}) => ?{}, style: ?{} | ({}) => ?{} }<<T>> | ComponentType<<T> & { children: Node }>$isDragged boolean required $isSelected boolean required $isRemovable boolean required $isRemovableByMove boolean required $isOutOfBounds boolean required $value required Node
Stateful List Container API
initialState
object
= { items: [] }
items required ArrayNode
children
function
required
$Diffremovable boolean removableByMove boolean items required ArrayNodeonChange function required oldIndex number required newIndex number required => mixedoverrides Root { component: ?ComponentType<<T> & { children: Node }>, props: ?{} | ({}) => ?{}, style: ?{} | ({}) => ?{} }<<T>> | ComponentType<<T> & { children: Node }>$isDragged boolean required $isSelected boolean required $isRemovable boolean required $isRemovableByMove boolean required $isOutOfBounds boolean required $value required NodeList { component: ?ComponentType<<T> & { children: Node }>, props: ?{} | ({}) => ?{}, style: ?{} | ({}) => ?{} }<<T>> | ComponentType<<T> & { children: Node }>$isDragged boolean required $isSelected boolean required $isRemovable boolean required $isRemovableByMove boolean required $isOutOfBounds boolean required $value required NodeItem { component: ?ComponentType<<T> & { children: Node }>, props: ?{} | ({}) => ?{}, style: ?{} | ({}) => ?{} }<<T>> | ComponentType<<T> & { children: Node }>$isDragged boolean required $isSelected boolean required $isRemovable boolean required $isRemovableByMove boolean required $isOutOfBounds boolean required $value required NodeDragHandle { component: ?ComponentType<<T> & { children: Node }>, props: ?{} | ({}) => ?{}, style: ?{} | ({}) => ?{} }<<T>> | ComponentType<<T> & { children: Node }>$isDragged boolean required $isSelected boolean required $isRemovable boolean required $isRemovableByMove boolean required $isOutOfBounds boolean required $value required NodeCloseHandle { component: ?ComponentType<<T> & { children: Node }>, props: ?{} | ({}) => ?{}, style: ?{} | ({}) => ?{} }<<T>> | ComponentType<<T> & { children: Node }>$isDragged boolean required $isSelected boolean required $isRemovable boolean required $isRemovableByMove boolean required $isOutOfBounds boolean required $value required NodeLabel { component: ?ComponentType<<T> & { children: Node }>, props: ?{} | ({}) => ?{}, style: ?{} | ({}) => ?{} }<<T>> | ComponentType<<T> & { children: Node }>$isDragged boolean required $isSelected boolean required $isRemovable boolean required $isRemovableByMove boolean required $isOutOfBounds boolean required $value required Node, children required ArrayNode => Node
DnD exports
You can import this module like so:
import {arrayMove} from 'baseui/dnd-list'
It exports the following components or utility functions:
- arrayMove
- arrayRemove
- StatefulList
- StatefulListContainer
- List
- STATE_CHANGE_TYPE
- StyledRoot
- StyledList
- StyledItem
- StyledDragHandle
- StyledCloseHandle
- StyledLabel