all files / src/helpers/ parse-options.js

97.73% Statements 43/44
75% Branches 9/12
100% Functions 9/9
97.73% Lines 43/44
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83          113×       113×     111×     111× 111×     111× 111× 111×   111× 111×   111× 111×   111× 111× 111× 111× 111× 111× 111× 111×     111× 137×   137×     137× 137×       111× 54× 54× 54×         137× 633× 633× 633× 633× 633× 633× 633×       111× 111×       107×          
'use strict';
 
angular.module('mgcrea.ngStrap.helpers.parseOptions', [])
 
  .provider('$parseOptions', function () {
 
    var defaults = this.defaults = {
      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+(.*?))?$/
    };
 
    this.$get = function ($parse, $q) {
 
      function ParseOptionsFactory (attr, config) {
 
        var $parseOptions = {};
 
        // Common vars
        var options = angular.extend({}, defaults, config);
        $parseOptions.$values = [];
 
        // Private vars
        var match;
        var displayFn;
        var valueName;
        /* eslint-disable no-unused-vars */
        var keyName;
        var groupByFn;
        /* eslint-enable no-unused-vars */
        var valueFn;
        var valuesFn;
 
        $parseOptions.init = function () {
          $parseOptions.$match = match = attr.match(options.regexp);
          displayFn = $parse(match[2] || match[1]);
          valueName = match[4] || match[6];
          keyName = match[5];
          groupByFn = $parse(match[3] || '');
          valueFn = $parse(match[2] ? match[1] : valueName);
          valuesFn = $parse(match[7]);
        };
 
        $parseOptions.valuesFn = function (scope, controller) {
          return $q.when(valuesFn(scope, controller))
          .then(function (values) {
            Iif (!angular.isArray(values)) {
              values = [];
            }
            $parseOptions.$values = values.length ? parseValues(values, scope) : [];
            return $parseOptions.$values;
          });
        };
 
        $parseOptions.displayValue = function (modelValue) {
          var scope = {};
          scope[valueName] = modelValue;
          return displayFn(scope);
        };
 
        // Private functions
 
        function parseValues (values, scope) {
          return values.map(function (match, index) {
            var locals = {};
            var label;
            var value;
            locals[valueName] = match;
            label = displayFn(scope, locals);
            value = valueFn(scope, locals);
            return {label: label, value: value, index: index};
          });
        }
 
        $parseOptions.init();
        return $parseOptions;
 
      }
 
      return ParseOptionsFactory;
 
    };
 
  });