/* * AngularJS integration with the HTML5 Sortable jQuery Plugin * https://github.com/voidberg/html5sortable * * Copyright 2013, Alexandru Badiu * * Thanks to the following contributors: samantp. * * Released under the MIT license. */ ;(function(angular) { 'use strict'; angular.module('htmlSortable', []) .directive('htmlSortable', [ '$timeout', '$parse', function($timeout, $parse) { return { require: '?ngModel', // TODO: fix this, if you know angular link: function(scope, element, attrs, ngModel) { // jshint ignore:line var opts; var model; var scallback = angular.noop; if (attrs.htmlSortableCallback) { scallback = $parse(attrs.htmlSortableCallback); } opts = angular.extend({}, scope.$eval(attrs.htmlSortable)); element.sortable(opts); if (ngModel) { model = $parse(attrs.ngModel); ngModel.$render = function() { $timeout(function() { element.sortable('reload'); }, 50); }; scope.$watch(model, function() { $timeout(function() { element.sortable('reload'); }, 50); }, true); element.sortable().bind('sortupdate', function(e, data) { var $source = data.startparent.attr('ng-model'); var $dest = data.endparent.attr('ng-model'); var $sourceModel = $parse($source); var $destModel = $parse($dest); var $start = data.oldindex; var $end = data.item.index(); scope.$apply(function() { // TODO: fix this, if you know angular //jscs:disable if ($sourceModel(data.startparent.scope()) === $destModel(data.endparent.scope())) { //jscs:enable var $items = $sourceModel(data.startparent.scope()); $items.splice($end, 0, $items.splice($start, 1)[0]); $sourceModel.assign(scope, $items); } else { var $item = $sourceModel(data.startparent.scope())[$start]; var $sourceItems = $sourceModel(data.startparent.scope()); var $destItems = $destModel(data.endparent.scope()) || []; $sourceItems.splice($start, 1); $destItems.splice($end, 0, $item); $sourceModel.assign(scope, $sourceItems); $destModel.assign(scope, $destItems); } }); scallback(scope, { startModel: $sourceModel(data.startparent.scope()), destModel: $destModel(data.endparent.scope()), start: $start, end: $end }); }); } } }; } ]); }(angular));