forked from mgcrea/angular-strap
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathparse-options.js
More file actions
58 lines (57 loc) · 2.21 KB
/
parse-options.js
File metadata and controls
58 lines (57 loc) · 2.21 KB
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
/**
* angular-strap
* @version v2.3.6 - 2015-11-14
* @link http://mgcrea.github.io/angular-strap
* @author Olivier Louvignes <olivier@mg-crea.com> (https://github.com/mgcrea)
* @license MIT License, http://www.opensource.org/licenses/MIT
*/
'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 = [ '$parse', '$q', function($parse, $q) {
function ParseOptionsFactory(attr, config) {
var $parseOptions = {};
var options = angular.extend({}, defaults, config);
$parseOptions.$values = [];
var match, displayFn, valueName, keyName, groupByFn, valueFn, 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) {
if (!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);
};
function parseValues(values, scope) {
return values.map(function(match, index) {
var locals = {}, label, 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;
} ];
});