parse-options.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. /**
  2. * angular-strap
  3. * @version v2.3.9 - 2016-06-10
  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;
  19. var displayFn;
  20. var valueName;
  21. var keyName;
  22. var groupByFn;
  23. var valueFn;
  24. var valuesFn;
  25. $parseOptions.init = function() {
  26. $parseOptions.$match = match = attr.match(options.regexp);
  27. displayFn = $parse(match[2] || match[1]);
  28. valueName = match[4] || match[6];
  29. keyName = match[5];
  30. groupByFn = $parse(match[3] || '');
  31. valueFn = $parse(match[2] ? match[1] : valueName);
  32. valuesFn = $parse(match[7]);
  33. };
  34. $parseOptions.valuesFn = function(scope, controller) {
  35. return $q.when(valuesFn(scope, controller)).then(function(values) {
  36. if (!angular.isArray(values)) {
  37. values = [];
  38. }
  39. $parseOptions.$values = values.length ? parseValues(values, scope) : [];
  40. return $parseOptions.$values;
  41. });
  42. };
  43. $parseOptions.displayValue = function(modelValue) {
  44. var scope = {};
  45. scope[valueName] = modelValue;
  46. return displayFn(scope);
  47. };
  48. function parseValues(values, scope) {
  49. return values.map(function(match, index) {
  50. var locals = {};
  51. var label;
  52. var value;
  53. locals[valueName] = match;
  54. label = displayFn(scope, locals);
  55. value = valueFn(scope, locals);
  56. return {
  57. label: label,
  58. value: value,
  59. index: index
  60. };
  61. });
  62. }
  63. $parseOptions.init();
  64. return $parseOptions;
  65. }
  66. return ParseOptionsFactory;
  67. } ];
  68. });