summaryrefslogtreecommitdiffstats
path: root/js/vendor/angular-ui/modules/directives/sortable/sortable.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/vendor/angular-ui/modules/directives/sortable/sortable.js')
-rw-r--r--js/vendor/angular-ui/modules/directives/sortable/sortable.js112
1 files changed, 112 insertions, 0 deletions
diff --git a/js/vendor/angular-ui/modules/directives/sortable/sortable.js b/js/vendor/angular-ui/modules/directives/sortable/sortable.js
new file mode 100644
index 000000000..d2a73032e
--- /dev/null
+++ b/js/vendor/angular-ui/modules/directives/sortable/sortable.js
@@ -0,0 +1,112 @@
+/*
+ jQuery UI Sortable plugin wrapper
+
+ @param [ui-sortable] {object} Options to pass to $.fn.sortable() merged onto ui.config
+*/
+angular.module('ui.directives').directive('uiSortable', [
+ 'ui.config', function(uiConfig) {
+ return {
+ require: '?ngModel',
+ link: function(scope, element, attrs, ngModel) {
+ var onReceive, onRemove, onStart, onUpdate, opts, _receive, _remove, _start, _update;
+
+ opts = angular.extend({}, uiConfig.sortable, scope.$eval(attrs.uiSortable));
+
+ if (ngModel) {
+
+ ngModel.$render = function() {
+ element.sortable( "refresh" );
+ };
+
+ onStart = function(e, ui) {
+ // Save position of dragged item
+ ui.item.sortable = { index: ui.item.index() };
+ };
+
+ onUpdate = function(e, ui) {
+ // For some reason the reference to ngModel in stop() is wrong
+ ui.item.sortable.resort = ngModel;
+ };
+
+ onReceive = function(e, ui) {
+ ui.item.sortable.relocate = true;
+ // added item to array into correct position and set up flag
+ ngModel.$modelValue.splice(ui.item.index(), 0, ui.item.sortable.moved);
+ };
+
+ onRemove = function(e, ui) {
+ // copy data into item
+ if (ngModel.$modelValue.length === 1) {
+ ui.item.sortable.moved = ngModel.$modelValue.splice(0, 1)[0];
+ } else {
+ ui.item.sortable.moved = ngModel.$modelValue.splice(ui.item.sortable.index, 1)[0];
+ }
+ };
+
+ onStop = function(e, ui) {
+ // digest all prepared changes
+ if (ui.item.sortable.resort && !ui.item.sortable.relocate) {
+
+ // Fetch saved and current position of dropped element
+ var end, start;
+ start = ui.item.sortable.index;
+ end = ui.item.index();
+ if (start < end)
+ end--;
+
+ // Reorder array and apply change to scope
+ ui.item.sortable.resort.$modelValue.splice(end, 0, ui.item.sortable.resort.$modelValue.splice(start, 1)[0]);
+
+ }
+ if (ui.item.sortable.resort || ui.item.sortable.relocate) {
+ scope.$apply();
+ }
+ };
+
+ // If user provided 'start' callback compose it with onStart function
+ _start = opts.start;
+ opts.start = function(e, ui) {
+ onStart(e, ui);
+ if (typeof _start === "function")
+ _start(e, ui);
+ };
+
+ // If user provided 'start' callback compose it with onStart function
+ _stop = opts.stop;
+ opts.stop = function(e, ui) {
+ onStop(e, ui);
+ if (typeof _stop === "function")
+ _stop(e, ui);
+ };
+
+ // If user provided 'update' callback compose it with onUpdate function
+ _update = opts.update;
+ opts.update = function(e, ui) {
+ onUpdate(e, ui);
+ if (typeof _update === "function")
+ _update(e, ui);
+ };
+
+ // If user provided 'receive' callback compose it with onReceive function
+ _receive = opts.receive;
+ opts.receive = function(e, ui) {
+ onReceive(e, ui);
+ if (typeof _receive === "function")
+ _receive(e, ui);
+ };
+
+ // If user provided 'remove' callback compose it with onRemove function
+ _remove = opts.remove;
+ opts.remove = function(e, ui) {
+ onRemove(e, ui);
+ if (typeof _remove === "function")
+ _remove(e, ui);
+ };
+ }
+
+ // Create sortable
+ element.sortable(opts);
+ }
+ };
+ }
+]);