angular-ui-sortable
Version:
This directive allows you to jQueryUI Sortable.
133 lines (113 loc) • 5.54 kB
JavaScript
;
describe('uiSortable', function() {
beforeEach(module(function($compileProvider) {
if (typeof $compileProvider.debugInfoEnabled === 'function') {
$compileProvider.debugInfoEnabled(false);
}
}));
// Ensure the sortable angular module is loaded
beforeEach(module('ui.sortable'));
beforeEach(module('ui.sortable.testHelper'));
var EXTRA_DY_PERCENTAGE, listInnerContent, simulateElementDrag;
beforeEach(inject(function (sortableTestHelper) {
EXTRA_DY_PERCENTAGE = sortableTestHelper.EXTRA_DY_PERCENTAGE;
listInnerContent = sortableTestHelper.listInnerContent;
simulateElementDrag = sortableTestHelper.simulateElementDrag;
}));
describe('Nested sortables related', function() {
var host;
beforeEach(inject(function() {
host = $('<div id="test-host"></div>');
$('body').append(host);
}));
afterEach(function() {
host.remove();
host = null;
});
it('should update model when sorting between nested sortables', function() {
inject(function($compile, $rootScope) {
var elementTree, li1, li2;
elementTree = $compile(''.concat(
'<ul ui-sortable="sortableOptions" ng-model="items" class="nested-sortable outterList" style="float: left;margin-left: 10px;padding-bottom: 10px;">',
'<li ng-repeat="item in items">',
'<div>',
'<span class="itemContent lvl1ItemContent">{{item.text}}</span>',
'<ul ui-sortable="sortableOptions" ng-model="item.items" class="nested-sortable innerList" style="margin-left: 10px;padding-bottom: 10px;">',
'<li ng-repeat="i in item.items">',
'<span class="itemContent lvl2ItemContent">{{i.text}}</span>',
'</li>',
'</ul>',
'</div>',
'</li>',
'</ul>',
'<div style="clear: both;"></div>'))($rootScope);
$rootScope.$apply(function() {
$rootScope.items = [
{
text: 'Item 1',
items: []
},
{
text: 'Item 2',
items: [
{ text: 'Item 2.1', items: [] },
{ text: 'Item 2.2', items: [] }
]
}
];
$rootScope.sortableOptions = {
connectWith: '.nested-sortable'
};
});
host.append(elementTree);
// this should drag the item out of the list and
// the item should return back to its original position
li1 = elementTree.find('.innerList:last').find('li:last');
li1.simulate('drag', { dx: -200, moves: 30 });
expect($rootScope.items.map(function(x){ return x.text; }))
.toEqual(['Item 1', 'Item 2']);
expect($rootScope.items.map(function(x){ return x.text; }))
.toEqual(listInnerContent(elementTree, '.lvl1ItemContent'));
expect($rootScope.items[0].items.map(function(x){ return x.text; }))
.toEqual([]);
expect($rootScope.items[0].items.map(function(x){ return x.text; }))
.toEqual(listInnerContent(elementTree.find('.innerList:eq(0)'), '.lvl2ItemContent'));
expect($rootScope.items[1].items.map(function(x){ return x.text; }))
.toEqual(['Item 2.1', 'Item 2.2']);
expect($rootScope.items[1].items.map(function(x){ return x.text; }))
.toEqual(listInnerContent(elementTree.find('.innerList:eq(1)'), '.lvl2ItemContent'));
// this should drag the item from the outter list and
// drop it to the inner list
li1 = elementTree.find('> li:first');
li2 = elementTree.find('.innerList:last').find('li:last');
simulateElementDrag(li1, li2, { place: 'above', extradx: 10, extrady: -5 });
expect($rootScope.items.map(function(x){ return x.text; }))
.toEqual(['Item 2']);
expect($rootScope.items.map(function(x){ return x.text; }))
.toEqual(listInnerContent(elementTree, '.lvl1ItemContent'));
expect($rootScope.items[0].items.map(function(x){ return x.text; }))
.toEqual(['Item 2.1', 'Item 1', 'Item 2.2']);
expect($rootScope.items[0].items.map(function(x){ return x.text; }))
.toEqual(listInnerContent(elementTree.find('.innerList:eq(0)'), '.lvl2ItemContent'));
// this should drag the item from the inner list and
// drop it to the outter list
li1 = elementTree.find('.innerList:last').find('li:last');
li2 = elementTree.find('> li:first');
simulateElementDrag(li1, li2, { place: 'above', extradx: -10, extrady: -6 });
expect($rootScope.items.map(function(x){ return x.text; }))
.toEqual(['Item 2.2', 'Item 2']);
expect($rootScope.items.map(function(x){ return x.text; }))
.toEqual(listInnerContent(elementTree, '.lvl1ItemContent'));
expect($rootScope.items[0].items.map(function(x){ return x.text; }))
.toEqual([]);
expect($rootScope.items[0].items.map(function(x){ return x.text; }))
.toEqual(listInnerContent(elementTree.find('.innerList:eq(0)'), '.lvl2ItemContent'));
expect($rootScope.items[1].items.map(function(x){ return x.text; }))
.toEqual(['Item 2.1', 'Item 1']);
expect($rootScope.items[1].items.map(function(x){ return x.text; }))
.toEqual(listInnerContent(elementTree.find('.innerList:eq(1)'), '.lvl2ItemContent'));
$(elementTree).remove();
});
});
});
});