Advertisement
Guest User

Untitled

a guest
Jun 17th, 2019
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.02 KB | None | 0 0
  1. angular.module('psi.sortable', [])
  2. .value('psiSortableConfig', {
  3. placeholder: "placeholder",
  4. opacity: 0.8,
  5. axis: "y",
  6. helper: 'clone',
  7. forcePlaceholderSize: true
  8. })
  9. .directive("psiSortable", ['psiSortableConfig', '$log', function (psiSortableConfig, $log) {
  10. return {
  11. require: '?ngModel',
  12. /*scope: {
  13. onSorted: '&'
  14. },*/
  15. link: function (scope, element, attrs, ngModel) {
  16.  
  17. if (!ngModel) {
  18. $log.error('psiSortable needs a ng-model attribute!', element);
  19. return;
  20. }
  21.  
  22. var opts = {};
  23. angular.extend(opts, psiSortableConfig);
  24. opts.update = update;
  25.  
  26. // listen for changes on psiSortable attribute
  27. scope.$watch(attrs.psiSortable, function (newVal) {
  28. angular.forEach(newVal, function (value, key) {
  29. element.sortable('option', key, value);
  30. });
  31. }, true);
  32.  
  33. // store the sortable index
  34. scope.$watch(attrs.ngModel + '.length', function () {
  35. element.children().each(function (i, elem) {
  36. jQuery(elem).attr('sortable-index', i);
  37. });
  38. });
  39.  
  40. // jQuery sortable update callback
  41. function update(event, ui) {
  42. // get model
  43. var model = ngModel.$modelValue;
  44. // remember its length
  45. var modelLength = model.length;
  46. // rember html nodes
  47. var items = [];
  48.  
  49. // loop through items in new order
  50. element.children().each(function (index) {
  51. var item = jQuery(this);
  52.  
  53. // get old item index
  54. var oldIndex = parseInt(item.attr("sortable-index"), 10);
  55.  
  56. // add item to the end of model
  57. model.push(model[oldIndex]);
  58.  
  59. if (item.attr("sortable-index")) {
  60. // items in original order to restore dom
  61. items[oldIndex] = item;
  62. // and remove item from dom
  63. item.detach();
  64. }
  65. });
  66.  
  67. model.splice(0, modelLength);
  68.  
  69. // restore original dom order, so angular does not get confused
  70. element.append.apply(element, items);
  71.  
  72. // notify angular of the change
  73. scope.$digest();
  74.  
  75. // raise the event so the user knows a sort happened
  76. //scope.$eval(attrs.onSorted, { $event: event });
  77. scope.$eval(attrs.onSorted);
  78. scope.$apply();
  79. }
  80.  
  81. element.sortable(opts);
  82. }
  83. };
  84. }]);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement