Making a sortable list with drag-and-drop notifications.
First we need to create the HTML structure for the list. Since Sortable uses Y.DD.Delegate, we need to set up a delegation container (#demo) and the list items (li). We also set up a log list (#log) which will inform us of the drag events.
Note: This example is using CSS Grids to create a two-column layout.
<div class="yui3-g">
<div class="yui3-u-1-2">
<div id="demo">
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
<li>8</li>
<li>9</li>
<li>10</li>
</ul>
</div>
</div>
<div class="yui3-u-1-2">
<ol id="log">
<li>Waiting for a drag and drop...</li>
</ol>
</div>
</div>
Now we style the list and the log with some CSS to make them visible.
#demo li {
list-style-type: none;
padding: 3px;
margin: 6px;
width: 150px;
font-size: 114%;
background-color: #B6BFDA;
border: 1px solid #7E869D;
-moz-box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.25);
-webkit-box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.25);
box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.25);
cursor: move;
}
#log {
border: 1px dotted #999;
background-color: #FFF;
}
#log li {
padding: 0.3em;
}
Now we need to create our YUI instance and tell it to load the sortable module. Then we need to instantiate the Sortable instance on the list.
YUI().use('sortable', function (Y) {
var log, sortable;
// The node where we'll output the drag-and-drop events.
log = Y.one('#log');
// Our sortable list instance.
sortable = new Y.Sortable({
container: '#demo ul',
nodes : 'li',
opacity : '0.1'
});
});
We have sorting working but we want to know when the user picks up an element and where it ends up. We'll want to hook into drag:end event that DD.Delegate fires. Depending on whether the dragged element was dropped into the middle of the list, or the beginning, or the end, we log a slightly different message.
sortable.delegate.after('drag:end', function (e) {
var node = sortable.delegate.get('currentNode'),
prev = node.previous(),
next = node.next(),
msg = 'Moved ' + node.get('text');
// Customize the log message based on where the `node` moved to.
if (prev && next) {
msg += ' between ' + prev.get('text') + ' and ' + next.get('text');
} else if (prev) {
msg += ' to the end, after ' + prev.get('text');
} else if (next) {
msg += ' to the beginning, before ' + next.get('text');
}
// Create a new list item and append it to our log of events.
log.append(Y.Node.create('<li />').set('text', msg));
});
YUI().use('sortable', function (Y) {
var log, sortable;
// The node where we'll output the drag-and-drop events.
log = Y.one('#log');
// Our sortable list instance.
sortable = new Y.Sortable({
container: '#demo ul',
nodes : 'li',
opacity : '0.1'
});
sortable.delegate.after('drag:end', function (e) {
var node = sortable.delegate.get('currentNode'),
prev = node.previous(),
next = node.next(),
msg = 'Moved ' + node.get('text');
// Customize the log message based on where the `node` moved to.
if (prev && next) {
msg += ' between ' + prev.get('text') + ' and ' + next.get('text');
} else if (prev) {
msg += ' to the end, after ' + prev.get('text');
} else if (next) {
msg += ' to the beginning, before ' + next.get('text');
}
// Create a new list item and append it to our log of events.
log.append(Y.Node.create('<li />').set('text', msg));
});
});