parse-options.js 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. /**
  2. * angular-strap
  3. * @version v2.3.5 - 2015-10-29
  4. * @link http://mgcrea.github.io/angular-strap
  5. * @author Olivier Louvignes <olivier@mg-crea.com> (https://github.com/mgcrea)
  6. * @license MIT License, http://www.opensource.org/licenses/MIT
  7. */
  8. 'use strict';
  9. angular.module('mgcrea.ngStrap.helpers.parseOptions', []).provider('$parseOptions', function() {
  10. var defaults = this.defaults = {
  11. regexp: /^\s*(.*?)(?:\s+as\s+(.*?))?(?:\s+group\s+by\s+(.*))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+(.*?)(?:\s+track\s+by\s+(.*?))?$/
  12. };
  13. this.$get = [ '$parse', '$q', function($parse, $q) {
  14. function ParseOptionsFactory(attr, config) {
  15. var $parseOptions = {};
  16. var options = angular.extend({}, defaults, config);
  17. $parseOptions.$values = [];
  18. var match, displayFn, valueName, keyName, groupByFn, valueFn, valuesFn;
  19. $parseOptions.init = function() {
  20. $parseOptions.$match = match = attr.match(options.regexp);
  21. displayFn = $parse(match[2] || match[1]), valueName = match[4] || match[6], keyName = match[5],
  22. groupByFn = $parse(match[3] || ''), valueFn = $parse(match[2] ? match[1] : valueName),
  23. valuesFn = $parse(match[7]);
  24. };
  25. $parseOptions.valuesFn = function(scope, controller) {
  26. return $q.when(valuesFn(scope, controller)).then(function(values) {
  27. if (!angular.isArray(values)) {
  28. values = [];
  29. }
  30. $parseOptions.$values = values.length ? parseValues(values, scope) : [];
  31. return $parseOptions.$values;
  32. });
  33. };
  34. $parseOptions.displayValue = function(modelValue) {
  35. var scope = {};
  36. scope[valueName] = modelValue;
  37. return displayFn(scope);
  38. };
  39. function parseValues(values, scope) {
  40. return values.map(function(match, index) {
  41. var locals = {}, label, value;
  42. locals[valueName] = match;
  43. label = displayFn(scope, locals);
  44. value = valueFn(scope, locals);
  45. return {
  46. label: label,
  47. value: value,
  48. index: index
  49. };
  50. });
  51. }
  52. $parseOptions.init();
  53. return $parseOptions;
  54. }
  55. return ParseOptionsFactory;
  56. } ];
  57. });