Advertisement
Guest User

Untitled

a guest
Nov 24th, 2014
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.66 KB | None | 0 0
  1. angular.module('multiselect', ['template/multiselect/multiselect.html'])
  2.  
  3. .controller('MultiselectController', ['$scope', function ($scope) {
  4. $scope.$select = function () {
  5. $scope.selected.push.apply($scope.selected, _.filter($scope.selection, function (obj) {
  6. var filter = _.filter($scope.add, function (objAdd) { return objAdd.key == obj.key; });
  7.  
  8. if (filter.length) return true;
  9. return false;
  10. }));
  11. $scope.selection = _.difference($scope.selection, $scope.selected);
  12. };
  13.  
  14. $scope.$delete = function () {
  15. $scope.selection.push.apply($scope.selection, _.filter($scope.selected, function (obj) {
  16. var filter = _.filter($scope.remove, function (objRemove) { return objRemove.key == obj.key; });
  17.  
  18. if (filter.length) return true;
  19. return false;
  20. }));
  21. $scope.selected = _.difference($scope.selected, $scope.selection);
  22. };
  23.  
  24. $scope.$watchCollection('selected', function (val) {
  25. $scope.model = _.pluck($scope.selected, 'model');
  26. });
  27.  
  28. $scope.$up = function () {
  29. $scope.$broadcast('getSelectedOptions', 'up');
  30. }
  31.  
  32. $scope.$down = function () {
  33. $scope.$broadcast('getSelectedOptions', 'down');
  34. }
  35.  
  36. this.sorting = function (values, type) {
  37. if (!type) { type = 'up'; }
  38.  
  39. var sorted = [];
  40. if (type == 'down') $scope.selected.reverse();
  41. angular.forEach($scope.selected, function (selected, index) {
  42. if (values.indexOf(selected.key.toString()) >= 0 && sorted.indexOf(selected.key) == -1) {
  43. var indexSorted = index-1;
  44.  
  45. if (indexSorted >= 0 && indexSorted < $scope.selected.length) {
  46. var tmp = $scope.selected[indexSorted];
  47.  
  48. if ((values.indexOf(tmp.key.toString()) == -1)) {
  49. $scope.selected[indexSorted] = selected;
  50. $scope.selected[index] = tmp;
  51. }
  52. }
  53.  
  54. sorted.push(selected.key);
  55. }
  56. });
  57. if (type == 'down') $scope.selected.reverse();
  58. }
  59. }])
  60.  
  61. .factory('optionParser', ['$parse', function ($parse) {
  62. var MULTISELECT_REGEXP = /^\s*(.*?)(?:\s+as\s+(.*?))?\s+for\s+(?:([\$\w][\$\w\d]*))\s+in\s+(.*)$/;
  63.  
  64. return {
  65. parse: function (input) {
  66. var match = input.match(MULTISELECT_REGEXP), modelMapper, viewMapper, source;
  67. if (!match) {
  68. throw new Error(
  69. "Invalid syntax (options): '_modelIdentifier_ (as _label_) for _item_ in _collection_'"
  70. );
  71. }
  72.  
  73. return {
  74. itemName: match[3],
  75. source: $parse(match[4]),
  76. viewMapper: $parse(match[2] || match[1]),
  77. modelMapper: $parse(match[1])
  78. };
  79. }
  80. };
  81. }])
  82.  
  83. .directive('multiselect', ['$parse', '$document', 'optionParser', function ($parse, $document, optionParser) {
  84. return {
  85. restrict: 'E',
  86. replace: true,
  87. require: 'ngModel',
  88. templateUrl: function (tElement, tAttributes) {
  89. if (tAttributes.template) {
  90. return tAttributes.template;
  91. } else {
  92. return 'template/multiselect/multiselect.html';
  93. }
  94. },
  95. scope: {
  96. model: '=ngModel'
  97. },
  98. controller: 'MultiselectController',
  99. link: function (scope, element, attrs, ctrl) {
  100. var expression = attrs.options, // expression
  101. parsedResult = optionParser.parse(expression); // parsed expression
  102.  
  103. scope.selection = [];
  104. scope.selected = [];
  105.  
  106. scope.$parent.$on('$destroy', function () {
  107. scope.$destroy();
  108. });
  109.  
  110. function parseModel () {
  111. var model = parsedResult.source(scope.$parent);
  112. if(!angular.isDefined(model)) return;
  113. _.each(model, function (value, key) {
  114. var local = {};
  115. local[parsedResult.itemName] = model[key];
  116. var uniqModel = {
  117. key: parsedResult.modelMapper(local),
  118. label: parsedResult.viewMapper(local),
  119. model: value
  120. };
  121.  
  122. if (_.findWhere(scope.model, model[key])) {
  123. scope.selected.push(uniqModel);
  124. } else {
  125. scope.selection.push(uniqModel);
  126. }
  127.  
  128. });
  129. }
  130.  
  131. //shortcut bindings
  132. element.bind('keyup', function (event) {
  133. if (event.keyCode == 37) {
  134. scope.delete();
  135. scope.$apply();
  136. }
  137.  
  138. if (event.keyCode == 39) {
  139. scope.select();
  140. scope.$apply();
  141. }
  142. });
  143.  
  144. parseModel();
  145. }
  146. };
  147. }]).
  148.  
  149. directive('optionsSortable', [
  150. function() {
  151. return {
  152. restrict: 'A',
  153. replace: false,
  154. require: '^multiselect',
  155. link: function (scope, element, attributes, controller) {
  156. var getSelectedOptions = function () {
  157. var selected = element.find('option:selected');
  158. var values = [];
  159.  
  160. angular.forEach(selected, function (HTMLoption) {
  161. values.push(HTMLoption.value);
  162. });
  163.  
  164. return values;
  165. };
  166.  
  167. scope.$on('getSelectedOptions', function (event, type) {
  168. var values = getSelectedOptions();
  169. controller.sorting(values, type);
  170. });
  171. }
  172. }
  173. }
  174. ]);
  175.  
  176. angular.module("template/multiselect/multiselect.html", []).run(["$templateCache", function($templateCache) {
  177. $templateCache.put("template/multiselect/multiselect.html",
  178. '<div class="row">' +
  179. '<div class="col-md-5">' +
  180. '<select multiple class="form-control" ng-model="add" ng-dblclick="$select()" ng-options="i.label for i in selection track by i.key"></select>' +
  181. '</div>' +
  182. '<div class="col-md-2 button-bar text-center">' +
  183. '<div class="up">' +
  184. '<button role="button" class="btn btn-default" ng-click="$up()">' +
  185. 'Up' +
  186. '</button>' +
  187. '</div>' +
  188. '<div class="select">' +
  189. '<button role="button" class="btn btn-default text-center" ng-click="$select()">' +
  190. 'Add' +
  191. '</button>' +
  192. '</div>' +
  193. '<div class="delete">' +
  194. '<button role="button" class="btn btn-default" ng-click="$delete()">' +
  195. 'Delete' +
  196. '</button>' +
  197. '</div>' +
  198. '<div class="down">' +
  199. '<button role="button" class="btn btn-default" ng-click="$down()">' +
  200. 'Down' +
  201. '</button>' +
  202. '</div>' +
  203. '</div>' +
  204. '<div class="col-md-5">' +
  205. '<select multiple class="form-control selected" ng-model="remove" ng-dblclick="$delete()" ng-options="i.label for i in selected track by i.key" options-sortable></select>' +
  206. '</div>' +
  207. '</div>' +
  208. '');
  209. }]);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement