What it is
Too many times I have encountered clients who need arbitrary sorts on their data. Silverstripe currently doesn’t support reordering in table lists, and even if it did, if the data bleeds over one page it would be a serious pain.
The SortableData extension makes any SortableDataObject sortable through drag-and-drop on the front end for admin users. As an example, let's consider an AboutPage that has a $has_many relation to StaffMember. The StaffMember objects are not pages -- just components of the AboutPage.
How it works
By changing the parent class from DataObject to SortableDataObject, the StaffMember table now has a Sort field and all the other built-in functionality to sort itself.
Now just add some minor enhancements to the template, we can make them sortable. There are two options for this. To keep it simple, use a UL. If your layout is more complex, use DIVs.
SortableDataObjects in a UL:
<h3>Our Staff</h3>
<% if StaffMembers %>
{$StaffMembers.BeginSortableUL}
<% control StaffMembers %>
{$LI}$Name, <em>$Title</em>{$_LI}
<% end_control %>
{$StaffMembers.EndSortableUL}
<% end_if %>
SortableDataObjects in DIVs:
<h3>Our Staff</h3>
<% if StaffMembers %>
{$StaffMembers.BeginSortableDIV}
<% control StaffMembers %>
{$DIV}
<div class="staffProfile clearfix">
$Photo.SetWidth(100)
<div>
<h4>$Name</h4>
<h5>$Title</h5>
<p>$Description</p>
</div>
</div>
{$_DIV}
<% end_control %>
{$StaffMembers.EndSortableDIV}
<% end_if %>
Anything within the {$LI} or {$DIV} pseudo-tag will drag as a single entity.
Note: The curly braces are not necessary, but they help to distinguish variables that contain content from those that contain structure only.
Well, have at it. It's super-beta!