engine2 1.0.2 → 1.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/conf/message.yaml +7 -0
- data/conf/message_pl.yaml +7 -0
- data/engine2.gemspec +1 -1
- data/lib/engine2/action.rb +0 -5
- data/lib/engine2/core.rb +9 -8
- data/lib/engine2/handler.rb +2 -2
- data/lib/engine2/meta.rb +196 -33
- data/lib/engine2/meta/decode_meta.rb +2 -1
- data/lib/engine2/meta/form_meta.rb +3 -132
- data/lib/engine2/meta/infra_meta.rb +14 -9
- data/lib/engine2/meta/list_meta.rb +1 -4
- data/lib/engine2/meta/view_meta.rb +0 -14
- data/lib/engine2/models/UserInfo.rb +0 -4
- data/lib/engine2/scheme.rb +5 -5
- data/lib/engine2/type_info.rb +0 -1
- data/lib/engine2/version.rb +1 -1
- data/public/assets/javascripts.js +13 -13
- data/public/js/angular-animate.js +52 -20
- data/public/js/angular-cookies.js +2 -2
- data/public/js/angular-route.js +10 -7
- data/public/js/angular-sanitize.js +4 -4
- data/public/js/angular.js +322 -168
- data/public/js/lodash.custom.min.js +95 -93
- data/views/engine2.coffee +34 -29
- data/views/engine2actions.coffee +62 -60
- data/views/infra/index.slim +2 -2
- data/views/infra/inspect.slim +5 -1
- data/views/scaffold/confirm.slim +1 -1
- data/views/scaffold/list.slim +11 -23
- data/views/scaffold/message.slim +1 -1
- data/views/scaffold/search.slim +1 -2
- data/views/scaffold/view.slim +1 -1
- data/views/search_fields/checkbox2.slim +1 -1
- data/views/search_fields/checkbox_buttons.slim +3 -3
- data/views/search_fields/date_range.slim +4 -4
- data/views/search_fields/decimal_date_range.slim +4 -4
- data/views/search_fields/input_text.slim +2 -2
- data/views/search_fields/integer.slim +2 -2
- data/views/search_fields/integer_range.slim +2 -2
- data/views/search_fields/list_bsmselect.slim +2 -2
- data/views/search_fields/list_bsselect.slim +2 -2
- data/views/search_fields/list_buttons.slim +2 -2
- data/views/search_fields/list_select.slim +2 -2
- metadata +4 -4
@@ -1,9 +1,9 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.5.
|
2
|
+
* @license AngularJS v1.5.5
|
3
3
|
* (c) 2010-2016 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
6
|
-
(function(window, angular
|
6
|
+
(function(window, angular) {'use strict';
|
7
7
|
|
8
8
|
/**
|
9
9
|
* @ngdoc module
|
data/public/js/angular-route.js
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.5.
|
2
|
+
* @license AngularJS v1.5.5
|
3
3
|
* (c) 2010-2016 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
6
|
-
(function(window, angular
|
6
|
+
(function(window, angular) {'use strict';
|
7
7
|
|
8
8
|
/**
|
9
9
|
* @ngdoc module
|
@@ -22,11 +22,7 @@
|
|
22
22
|
*/
|
23
23
|
/* global -ngRouteModule */
|
24
24
|
var ngRouteModule = angular.module('ngRoute', ['ng']).
|
25
|
-
provider('$route', $RouteProvider)
|
26
|
-
// Ensure `$route` will be instantiated in time to capture the initial
|
27
|
-
// `$locationChangeSuccess` event. This is necessary in case `ngView` is
|
28
|
-
// included in an asynchronously loaded template.
|
29
|
-
run(['$route', angular.noop]),
|
25
|
+
provider('$route', $RouteProvider),
|
30
26
|
$routeMinErr = angular.$$minErr('ngRoute');
|
31
27
|
|
32
28
|
/**
|
@@ -760,6 +756,13 @@ ngRouteModule.directive('ngView', ngViewFillContentFactory);
|
|
760
756
|
*
|
761
757
|
* The enter and leave animation occur concurrently.
|
762
758
|
*
|
759
|
+
* @knownIssue If `ngView` is contained in an asynchronously loaded template (e.g. in another
|
760
|
+
* directive's templateUrl or in a template loaded using `ngInclude`), then you need to
|
761
|
+
* make sure that `$route` is instantiated in time to capture the initial
|
762
|
+
* `$locationChangeStart` event and load the appropriate view. One way to achieve this
|
763
|
+
* is to have it as a dependency in a `.run` block:
|
764
|
+
* `myModule.run(['$route', function() {}]);`
|
765
|
+
*
|
763
766
|
* @scope
|
764
767
|
* @priority 400
|
765
768
|
* @param {string=} onload Expression to evaluate whenever the view updates.
|
@@ -1,9 +1,9 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.5.
|
2
|
+
* @license AngularJS v1.5.5
|
3
3
|
* (c) 2010-2016 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
6
|
-
(function(window, angular
|
6
|
+
(function(window, angular) {'use strict';
|
7
7
|
|
8
8
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
9
9
|
* Any commits to this file should be reviewed with security in mind. *
|
@@ -349,7 +349,7 @@ function htmlParser(html, handler) {
|
|
349
349
|
mXSSAttempts--;
|
350
350
|
|
351
351
|
// strip custom-namespaced attributes on IE<=11
|
352
|
-
if (document.documentMode
|
352
|
+
if (window.document.documentMode) {
|
353
353
|
stripCustomNsAttrs(inertBodyElement);
|
354
354
|
}
|
355
355
|
html = inertBodyElement.innerHTML; //trigger mXSS
|
@@ -489,7 +489,7 @@ function htmlSanitizeWriter(buf, uriValidator) {
|
|
489
489
|
* @param node Root element to process
|
490
490
|
*/
|
491
491
|
function stripCustomNsAttrs(node) {
|
492
|
-
if (node.nodeType === Node.ELEMENT_NODE) {
|
492
|
+
if (node.nodeType === window.Node.ELEMENT_NODE) {
|
493
493
|
var attrs = node.attributes;
|
494
494
|
for (var i = 0, l = attrs.length; i < l; i++) {
|
495
495
|
var attrNode = attrs[i];
|
data/public/js/angular.js
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.5.
|
2
|
+
* @license AngularJS v1.5.5
|
3
3
|
* (c) 2010-2016 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
6
|
-
(function(window
|
6
|
+
(function(window) {'use strict';
|
7
7
|
|
8
8
|
/**
|
9
9
|
* @description
|
@@ -57,7 +57,7 @@ function minErr(module, ErrorConstructor) {
|
|
57
57
|
return match;
|
58
58
|
});
|
59
59
|
|
60
|
-
message += '\nhttp://errors.angularjs.org/1.5.
|
60
|
+
message += '\nhttp://errors.angularjs.org/1.5.5/' +
|
61
61
|
(module ? module + '/' : '') + code;
|
62
62
|
|
63
63
|
for (i = SKIP_INDEXES, paramPrefix = '?'; i < templateArgs.length; i++, paramPrefix = '&') {
|
@@ -171,6 +171,7 @@ function minErr(module, ErrorConstructor) {
|
|
171
171
|
* @ngdoc module
|
172
172
|
* @name ng
|
173
173
|
* @module ng
|
174
|
+
* @installation
|
174
175
|
* @description
|
175
176
|
*
|
176
177
|
* # ng (core module)
|
@@ -237,7 +238,7 @@ var
|
|
237
238
|
* documentMode is an IE-only property
|
238
239
|
* http://msdn.microsoft.com/en-us/library/ie/cc196988(v=vs.85).aspx
|
239
240
|
*/
|
240
|
-
msie = document.documentMode;
|
241
|
+
msie = window.document.documentMode;
|
241
242
|
|
242
243
|
|
243
244
|
/**
|
@@ -1047,6 +1048,41 @@ function shallowCopy(src, dst) {
|
|
1047
1048
|
* @param {*} o1 Object or value to compare.
|
1048
1049
|
* @param {*} o2 Object or value to compare.
|
1049
1050
|
* @returns {boolean} True if arguments are equal.
|
1051
|
+
*
|
1052
|
+
* @example
|
1053
|
+
<example module="equalsExample" name="equalsExample">
|
1054
|
+
<file name="index.html">
|
1055
|
+
<div ng-controller="ExampleController">
|
1056
|
+
<form novalidate>
|
1057
|
+
<h3>User 1</h3>
|
1058
|
+
Name: <input type="text" ng-model="user1.name">
|
1059
|
+
Age: <input type="number" ng-model="user1.age">
|
1060
|
+
|
1061
|
+
<h3>User 2</h3>
|
1062
|
+
Name: <input type="text" ng-model="user2.name">
|
1063
|
+
Age: <input type="number" ng-model="user2.age">
|
1064
|
+
|
1065
|
+
<div>
|
1066
|
+
<br/>
|
1067
|
+
<input type="button" value="Compare" ng-click="compare()">
|
1068
|
+
</div>
|
1069
|
+
User 1: <pre>{{user1 | json}}</pre>
|
1070
|
+
User 2: <pre>{{user2 | json}}</pre>
|
1071
|
+
Equal: <pre>{{result}}</pre>
|
1072
|
+
</form>
|
1073
|
+
</div>
|
1074
|
+
</file>
|
1075
|
+
<file name="script.js">
|
1076
|
+
angular.module('equalsExample', []).controller('ExampleController', ['$scope', function($scope) {
|
1077
|
+
$scope.user1 = {};
|
1078
|
+
$scope.user2 = {};
|
1079
|
+
$scope.result;
|
1080
|
+
$scope.compare = function() {
|
1081
|
+
$scope.result = angular.equals($scope.user1, $scope.user2);
|
1082
|
+
};
|
1083
|
+
}]);
|
1084
|
+
</file>
|
1085
|
+
</example>
|
1050
1086
|
*/
|
1051
1087
|
function equals(o1, o2) {
|
1052
1088
|
if (o1 === o2) return true;
|
@@ -1093,8 +1129,8 @@ var csp = function() {
|
|
1093
1129
|
if (!isDefined(csp.rules)) {
|
1094
1130
|
|
1095
1131
|
|
1096
|
-
var ngCspElement = (document.querySelector('[ng-csp]') ||
|
1097
|
-
document.querySelector('[data-ng-csp]'));
|
1132
|
+
var ngCspElement = (window.document.querySelector('[ng-csp]') ||
|
1133
|
+
window.document.querySelector('[data-ng-csp]'));
|
1098
1134
|
|
1099
1135
|
if (ngCspElement) {
|
1100
1136
|
var ngCspAttribute = ngCspElement.getAttribute('ng-csp') ||
|
@@ -1169,7 +1205,7 @@ var jq = function() {
|
|
1169
1205
|
var i, ii = ngAttrPrefixes.length, prefix, name;
|
1170
1206
|
for (i = 0; i < ii; ++i) {
|
1171
1207
|
prefix = ngAttrPrefixes[i];
|
1172
|
-
if (el = document.querySelector('[' + prefix.replace(':', '\\:') + 'jq]')) {
|
1208
|
+
if (el = window.document.querySelector('[' + prefix.replace(':', '\\:') + 'jq]')) {
|
1173
1209
|
name = el.getAttribute(prefix + 'jq');
|
1174
1210
|
break;
|
1175
1211
|
}
|
@@ -1234,7 +1270,7 @@ function toJsonReplacer(key, value) {
|
|
1234
1270
|
val = undefined;
|
1235
1271
|
} else if (isWindow(value)) {
|
1236
1272
|
val = '$WINDOW';
|
1237
|
-
} else if (value && document === value) {
|
1273
|
+
} else if (value && window.document === value) {
|
1238
1274
|
val = '$DOCUMENT';
|
1239
1275
|
} else if (isScope(value)) {
|
1240
1276
|
val = '$SCOPE';
|
@@ -1686,11 +1722,11 @@ function bootstrap(element, modules, config) {
|
|
1686
1722
|
element = jqLite(element);
|
1687
1723
|
|
1688
1724
|
if (element.injector()) {
|
1689
|
-
var tag = (element[0] === document) ? 'document' : startingTag(element);
|
1725
|
+
var tag = (element[0] === window.document) ? 'document' : startingTag(element);
|
1690
1726
|
//Encode angle brackets to prevent input from being sanitized to empty string #8683
|
1691
1727
|
throw ngMinErr(
|
1692
1728
|
'btstrpd',
|
1693
|
-
"App
|
1729
|
+
"App already bootstrapped with this element '{0}'",
|
1694
1730
|
tag.replace(/</,'<').replace(/>/,'>'));
|
1695
1731
|
}
|
1696
1732
|
|
@@ -2137,9 +2173,9 @@ function setupModuleLoader(window) {
|
|
2137
2173
|
* @ngdoc method
|
2138
2174
|
* @name angular.Module#decorator
|
2139
2175
|
* @module ng
|
2140
|
-
* @param {string} The name of the service to decorate.
|
2141
|
-
* @param {Function} This function will be invoked when the service needs to be
|
2142
|
-
*
|
2176
|
+
* @param {string} name The name of the service to decorate.
|
2177
|
+
* @param {Function} decorFn This function will be invoked when the service needs to be
|
2178
|
+
* instantiated and should return the decorated service instance.
|
2143
2179
|
* @description
|
2144
2180
|
* See {@link auto.$provide#decorator $provide.decorator()}.
|
2145
2181
|
*/
|
@@ -2443,11 +2479,11 @@ function toDebugString(obj) {
|
|
2443
2479
|
* - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
|
2444
2480
|
*/
|
2445
2481
|
var version = {
|
2446
|
-
full: '1.5.
|
2482
|
+
full: '1.5.5', // all of these placeholder strings will be replaced by grunt's
|
2447
2483
|
major: 1, // package task
|
2448
2484
|
minor: 5,
|
2449
|
-
dot:
|
2450
|
-
codeName: '
|
2485
|
+
dot: 5,
|
2486
|
+
codeName: 'material-conspiration'
|
2451
2487
|
};
|
2452
2488
|
|
2453
2489
|
|
@@ -2704,6 +2740,9 @@ function publishExternalAPI(angular) {
|
|
2704
2740
|
* - `inheritedData()` - same as `data()`, but walks up the DOM until a value is found or the top
|
2705
2741
|
* parent element is reached.
|
2706
2742
|
*
|
2743
|
+
* @knownIssue You cannot spy on `angular.element` if you are using Jasmine version 1.x. See
|
2744
|
+
* https://github.com/angular/angular.js/issues/14251 for more information.
|
2745
|
+
*
|
2707
2746
|
* @param {string|DOMElement} element HTML string or DOMElement to be wrapped into jQuery.
|
2708
2747
|
* @returns {Object} jQuery object.
|
2709
2748
|
*/
|
@@ -2830,7 +2869,7 @@ function jqLiteBuildFragment(html, context) {
|
|
2830
2869
|
}
|
2831
2870
|
|
2832
2871
|
function jqLiteParseHTML(html, context) {
|
2833
|
-
context = context || document;
|
2872
|
+
context = context || window.document;
|
2834
2873
|
var parsed;
|
2835
2874
|
|
2836
2875
|
if ((parsed = SINGLE_TAG_REGEXP.exec(html))) {
|
@@ -2856,7 +2895,7 @@ function jqLiteWrapNode(node, wrapper) {
|
|
2856
2895
|
|
2857
2896
|
|
2858
2897
|
// IE9-11 has no method "contains" in SVG element and in Node.prototype. Bug #10259.
|
2859
|
-
var jqLiteContains = Node.prototype.contains || function(arg) {
|
2898
|
+
var jqLiteContains = window.Node.prototype.contains || function(arg) {
|
2860
2899
|
// jshint bitwise: false
|
2861
2900
|
return !!(this.compareDocumentPosition(arg) & 16);
|
2862
2901
|
// jshint bitwise: true
|
@@ -3128,8 +3167,8 @@ var JQLitePrototype = JQLite.prototype = {
|
|
3128
3167
|
}
|
3129
3168
|
|
3130
3169
|
// check if document is already loaded
|
3131
|
-
if (document.readyState === 'complete') {
|
3132
|
-
setTimeout(trigger);
|
3170
|
+
if (window.document.readyState === 'complete') {
|
3171
|
+
window.setTimeout(trigger);
|
3133
3172
|
} else {
|
3134
3173
|
this.on('DOMContentLoaded', trigger); // works for modern browsers and IE9
|
3135
3174
|
// we can not use jqLite since we are not done loading and jQuery could be loaded later.
|
@@ -3819,6 +3858,7 @@ var $$HashMapProvider = [function() {
|
|
3819
3858
|
/**
|
3820
3859
|
* @ngdoc module
|
3821
3860
|
* @name auto
|
3861
|
+
* @installation
|
3822
3862
|
* @description
|
3823
3863
|
*
|
3824
3864
|
* Implicit module which gets automatically added to each {@link auto.$injector $injector}.
|
@@ -3832,7 +3872,7 @@ var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
|
|
3832
3872
|
var $injectorMinErr = minErr('$injector');
|
3833
3873
|
|
3834
3874
|
function extractArgs(fn) {
|
3835
|
-
var fnText =
|
3875
|
+
var fnText = Function.prototype.toString.call(fn).replace(STRIP_COMMENTS, ''),
|
3836
3876
|
args = fnText.match(ARROW_ARG) || fnText.match(FN_ARGS);
|
3837
3877
|
return args;
|
3838
3878
|
}
|
@@ -5252,6 +5292,9 @@ var $AnimateProvider = ['$provide', function($provide) {
|
|
5252
5292
|
* // remove all the animation event listeners listening for `enter`
|
5253
5293
|
* $animate.off('enter');
|
5254
5294
|
*
|
5295
|
+
* // remove listeners for all animation events from the container element
|
5296
|
+
* $animate.off(container);
|
5297
|
+
*
|
5255
5298
|
* // remove all the animation event listeners listening for `enter` on the given element and its children
|
5256
5299
|
* $animate.off('enter', container);
|
5257
5300
|
*
|
@@ -5260,7 +5303,9 @@ var $AnimateProvider = ['$provide', function($provide) {
|
|
5260
5303
|
* $animate.off('enter', container, callback);
|
5261
5304
|
* ```
|
5262
5305
|
*
|
5263
|
-
* @param {string} event the animation event (e.g. enter, leave, move,
|
5306
|
+
* @param {string|DOMElement} event|container the animation event (e.g. enter, leave, move,
|
5307
|
+
* addClass, removeClass, etc...), or the container element. If it is the element, all other
|
5308
|
+
* arguments are ignored.
|
5264
5309
|
* @param {DOMElement=} container the container element the event listener was placed on
|
5265
5310
|
* @param {Function=} callback the callback function that was registered as the listener
|
5266
5311
|
*/
|
@@ -6833,8 +6878,8 @@ function $TemplateCacheProvider() {
|
|
6833
6878
|
* this element). This is a good place to put initialization code for your controller.
|
6834
6879
|
* * `$onChanges(changesObj)` - Called whenever one-way (`<`) or interpolation (`@`) bindings are updated. The
|
6835
6880
|
* `changesObj` is a hash whose keys are the names of the bound properties that have changed, and the values are an
|
6836
|
-
* object of the form `{ currentValue
|
6837
|
-
* such as cloning the bound value to prevent accidental mutation of the outer value.
|
6881
|
+
* object of the form `{ currentValue, previousValue, isFirstChange() }`. Use this hook to trigger updates within a
|
6882
|
+
* component such as cloning the bound value to prevent accidental mutation of the outer value.
|
6838
6883
|
* * `$onDestroy()` - Called on a controller when its containing scope is destroyed. Use this hook for releasing
|
6839
6884
|
* external resources, watches and event handlers. Note that components have their `$onDestroy()` hooks called in
|
6840
6885
|
* the same order as the `$scope.$broadcast` events are triggered, which is top down. This means that parent
|
@@ -7381,6 +7426,9 @@ function $TemplateCacheProvider() {
|
|
7381
7426
|
|
7382
7427
|
var $compileMinErr = minErr('$compile');
|
7383
7428
|
|
7429
|
+
function UNINITIALIZED_VALUE() {}
|
7430
|
+
var _UNINITIALIZED_VALUE = new UNINITIALIZED_VALUE();
|
7431
|
+
|
7384
7432
|
/**
|
7385
7433
|
* @ngdoc provider
|
7386
7434
|
* @name $compileProvider
|
@@ -7405,7 +7453,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
7405
7453
|
function parseIsolateBindings(scope, directiveName, isController) {
|
7406
7454
|
var LOCAL_REGEXP = /^\s*([@&<]|=(\*?))(\??)\s*(\w*)\s*$/;
|
7407
7455
|
|
7408
|
-
var bindings =
|
7456
|
+
var bindings = createMap();
|
7409
7457
|
|
7410
7458
|
forEach(scope, function(definition, scopeName) {
|
7411
7459
|
if (definition in bindingCache) {
|
@@ -7579,6 +7627,9 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
7579
7627
|
* See {@link ng.$compile#-bindtocontroller- `bindToController`}.
|
7580
7628
|
* - `transclude` – `{boolean=}` – whether {@link $compile#transclusion content transclusion} is enabled.
|
7581
7629
|
* Disabled by default.
|
7630
|
+
* - `require` - `{Object<string, string>=}` - requires the controllers of other directives and binds them to
|
7631
|
+
* this component's controller. The object keys specify the property names under which the required
|
7632
|
+
* controllers (object values) will be bound. See {@link ng.$compile#-require- `require`}.
|
7582
7633
|
* - `$...` – additional properties to attach to the directive factory function and the controller
|
7583
7634
|
* constructor function. (This is used by the component router to annotate)
|
7584
7635
|
*
|
@@ -7624,7 +7675,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
7624
7675
|
* See also {@link ng.$compileProvider#directive $compileProvider.directive()}.
|
7625
7676
|
*/
|
7626
7677
|
this.component = function registerComponent(name, options) {
|
7627
|
-
var controller = options.controller ||
|
7678
|
+
var controller = options.controller || function() {};
|
7628
7679
|
|
7629
7680
|
function factory($injector) {
|
7630
7681
|
function makeInjectable(fn) {
|
@@ -7638,7 +7689,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
7638
7689
|
}
|
7639
7690
|
|
7640
7691
|
var template = (!options.template && !options.templateUrl ? '' : options.template);
|
7641
|
-
|
7692
|
+
var ddo = {
|
7642
7693
|
controller: controller,
|
7643
7694
|
controllerAs: identifierForController(options.controller) || options.controllerAs || '$ctrl',
|
7644
7695
|
template: makeInjectable(template),
|
@@ -7649,14 +7700,27 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
7649
7700
|
restrict: 'E',
|
7650
7701
|
require: options.require
|
7651
7702
|
};
|
7703
|
+
|
7704
|
+
// Copy annotations (starting with $) over to the DDO
|
7705
|
+
forEach(options, function(val, key) {
|
7706
|
+
if (key.charAt(0) === '$') ddo[key] = val;
|
7707
|
+
});
|
7708
|
+
|
7709
|
+
return ddo;
|
7652
7710
|
}
|
7653
7711
|
|
7654
|
-
//
|
7712
|
+
// TODO(pete) remove the following `forEach` before we release 1.6.0
|
7713
|
+
// The component-router@0.2.0 looks for the annotations on the controller constructor
|
7714
|
+
// Nothing in Angular looks for annotations on the factory function but we can't remove
|
7715
|
+
// it from 1.5.x yet.
|
7716
|
+
|
7717
|
+
// Copy any annotation properties (starting with $) over to the factory and controller constructor functions
|
7655
7718
|
// These could be used by libraries such as the new component router
|
7656
7719
|
forEach(options, function(val, key) {
|
7657
7720
|
if (key.charAt(0) === '$') {
|
7658
7721
|
factory[key] = val;
|
7659
|
-
|
7722
|
+
// Don't try to copy over annotations to named controller
|
7723
|
+
if (isFunction(controller)) controller[key] = val;
|
7660
7724
|
}
|
7661
7725
|
});
|
7662
7726
|
|
@@ -7793,7 +7857,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
7793
7857
|
$controller, $rootScope, $sce, $animate, $$sanitizeUri) {
|
7794
7858
|
|
7795
7859
|
var SIMPLE_ATTR_NAME = /^\w/;
|
7796
|
-
var specialAttrHolder = document.createElement('div');
|
7860
|
+
var specialAttrHolder = window.document.createElement('div');
|
7797
7861
|
|
7798
7862
|
|
7799
7863
|
|
@@ -8124,7 +8188,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
8124
8188
|
if (debugInfoEnabled) {
|
8125
8189
|
content = ' ' + (directiveName || '') + ': ' + (comment || '') + ' ';
|
8126
8190
|
}
|
8127
|
-
return document.createComment(content);
|
8191
|
+
return window.document.createComment(content);
|
8128
8192
|
};
|
8129
8193
|
|
8130
8194
|
return compile;
|
@@ -8147,7 +8211,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
8147
8211
|
var domNode = $compileNodes[i];
|
8148
8212
|
|
8149
8213
|
if (domNode.nodeType === NODE_TYPE_TEXT && domNode.nodeValue.match(NOT_EMPTY) /* non-empty */) {
|
8150
|
-
jqLiteWrapNode(domNode, $compileNodes[i] = document.createElement('span'));
|
8214
|
+
jqLiteWrapNode(domNode, $compileNodes[i] = window.document.createElement('span'));
|
8151
8215
|
}
|
8152
8216
|
}
|
8153
8217
|
|
@@ -8840,7 +8904,9 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
8840
8904
|
replaceDirective = directive;
|
8841
8905
|
}
|
8842
8906
|
|
8907
|
+
/* jshint -W021 */
|
8843
8908
|
nodeLinkFn = compileTemplateUrl(directives.splice(i, directives.length - i), $compileNode,
|
8909
|
+
/* jshint +W021 */
|
8844
8910
|
templateAttrs, jqCollection, hasTranscludeDirective && childTranscludeFn, preLinkFns, postLinkFns, {
|
8845
8911
|
controllerDirectives: controllerDirectives,
|
8846
8912
|
newScopeDirective: (newScopeDirective !== directive) && newScopeDirective,
|
@@ -8904,7 +8970,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
8904
8970
|
|
8905
8971
|
function nodeLinkFn(childLinkFn, scope, linkNode, $rootElement, boundTranscludeFn) {
|
8906
8972
|
var i, ii, linkFn, isolateScope, controllerScope, elementControllers, transcludeFn, $element,
|
8907
|
-
attrs,
|
8973
|
+
attrs, scopeBindingInfo;
|
8908
8974
|
|
8909
8975
|
if (compileNode === linkNode) {
|
8910
8976
|
attrs = templateAttrs;
|
@@ -8943,11 +9009,11 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
8943
9009
|
compile.$$addScopeClass($element, true);
|
8944
9010
|
isolateScope.$$isolateBindings =
|
8945
9011
|
newIsolateScopeDirective.$$isolateBindings;
|
8946
|
-
|
9012
|
+
scopeBindingInfo = initializeDirectiveBindings(scope, attrs, isolateScope,
|
8947
9013
|
isolateScope.$$isolateBindings,
|
8948
9014
|
newIsolateScopeDirective);
|
8949
|
-
if (
|
8950
|
-
isolateScope.$on('$destroy',
|
9015
|
+
if (scopeBindingInfo.removeWatches) {
|
9016
|
+
isolateScope.$on('$destroy', scopeBindingInfo.removeWatches);
|
8951
9017
|
}
|
8952
9018
|
}
|
8953
9019
|
|
@@ -8958,8 +9024,10 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
8958
9024
|
var bindings = controllerDirective.$$bindings.bindToController;
|
8959
9025
|
|
8960
9026
|
if (controller.identifier && bindings) {
|
8961
|
-
|
9027
|
+
controller.bindingInfo =
|
8962
9028
|
initializeDirectiveBindings(controllerScope, attrs, controller.instance, bindings, controllerDirective);
|
9029
|
+
} else {
|
9030
|
+
controller.bindingInfo = {};
|
8963
9031
|
}
|
8964
9032
|
|
8965
9033
|
var controllerResult = controller();
|
@@ -8968,8 +9036,8 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
8968
9036
|
// from setupControllers
|
8969
9037
|
controller.instance = controllerResult;
|
8970
9038
|
$element.data('$' + controllerDirective.name + 'Controller', controllerResult);
|
8971
|
-
|
8972
|
-
|
9039
|
+
controller.bindingInfo.removeWatches && controller.bindingInfo.removeWatches();
|
9040
|
+
controller.bindingInfo =
|
8973
9041
|
initializeDirectiveBindings(controllerScope, attrs, controller.instance, bindings, controllerDirective);
|
8974
9042
|
}
|
8975
9043
|
}
|
@@ -8985,6 +9053,9 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
8985
9053
|
// Handle the init and destroy lifecycle hooks on all controllers that have them
|
8986
9054
|
forEach(elementControllers, function(controller) {
|
8987
9055
|
var controllerInstance = controller.instance;
|
9056
|
+
if (isFunction(controllerInstance.$onChanges)) {
|
9057
|
+
controllerInstance.$onChanges(controller.bindingInfo.initialChanges);
|
9058
|
+
}
|
8988
9059
|
if (isFunction(controllerInstance.$onInit)) {
|
8989
9060
|
controllerInstance.$onInit();
|
8990
9061
|
}
|
@@ -9441,7 +9512,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
9441
9512
|
switch (type) {
|
9442
9513
|
case 'svg':
|
9443
9514
|
case 'math':
|
9444
|
-
var wrapper = document.createElement('div');
|
9515
|
+
var wrapper = window.document.createElement('div');
|
9445
9516
|
wrapper.innerHTML = '<' + type + '>' + template + '</' + type + '>';
|
9446
9517
|
return wrapper.childNodes[0].childNodes;
|
9447
9518
|
default:
|
@@ -9585,7 +9656,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
9585
9656
|
// - remove them from the DOM
|
9586
9657
|
// - allow them to still be traversed with .nextSibling
|
9587
9658
|
// - allow a single fragment.qSA to fetch all elements being removed
|
9588
|
-
var fragment = document.createDocumentFragment();
|
9659
|
+
var fragment = window.document.createDocumentFragment();
|
9589
9660
|
for (i = 0; i < removeCount; i++) {
|
9590
9661
|
fragment.appendChild(elementsToRemove[i]);
|
9591
9662
|
}
|
@@ -9631,6 +9702,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
9631
9702
|
// only occurs for isolate scopes and new scopes with controllerAs.
|
9632
9703
|
function initializeDirectiveBindings(scope, attrs, destination, bindings, directive) {
|
9633
9704
|
var removeWatchCollection = [];
|
9705
|
+
var initialChanges = {};
|
9634
9706
|
var changes;
|
9635
9707
|
forEach(bindings, function initializeBinding(definition, scopeName) {
|
9636
9708
|
var attrName = definition.attrName,
|
@@ -9646,7 +9718,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
9646
9718
|
destination[scopeName] = attrs[attrName] = void 0;
|
9647
9719
|
}
|
9648
9720
|
attrs.$observe(attrName, function(value) {
|
9649
|
-
if (isString(value)) {
|
9721
|
+
if (isString(value) || isBoolean(value)) {
|
9650
9722
|
var oldValue = destination[scopeName];
|
9651
9723
|
recordChanges(scopeName, value, oldValue);
|
9652
9724
|
destination[scopeName] = value;
|
@@ -9663,6 +9735,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
9663
9735
|
// the value to boolean rather than a string, so we special case this situation
|
9664
9736
|
destination[scopeName] = lastValue;
|
9665
9737
|
}
|
9738
|
+
initialChanges[scopeName] = new SimpleChange(_UNINITIALIZED_VALUE, destination[scopeName]);
|
9666
9739
|
break;
|
9667
9740
|
|
9668
9741
|
case '=':
|
@@ -9718,11 +9791,16 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
9718
9791
|
parentGet = $parse(attrs[attrName]);
|
9719
9792
|
|
9720
9793
|
destination[scopeName] = parentGet(scope);
|
9794
|
+
initialChanges[scopeName] = new SimpleChange(_UNINITIALIZED_VALUE, destination[scopeName]);
|
9721
9795
|
|
9722
|
-
removeWatch = scope.$watch(parentGet, function parentValueWatchAction(
|
9723
|
-
|
9724
|
-
|
9725
|
-
|
9796
|
+
removeWatch = scope.$watch(parentGet, function parentValueWatchAction(newValue, oldValue) {
|
9797
|
+
if (newValue === oldValue) {
|
9798
|
+
// If the new and old values are identical then this is the first time the watch has been triggered
|
9799
|
+
// So instead we use the current value on the destination as the old value
|
9800
|
+
oldValue = destination[scopeName];
|
9801
|
+
}
|
9802
|
+
recordChanges(scopeName, newValue, oldValue);
|
9803
|
+
destination[scopeName] = newValue;
|
9726
9804
|
}, parentGet.literal);
|
9727
9805
|
|
9728
9806
|
removeWatchCollection.push(removeWatch);
|
@@ -9759,7 +9837,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
9759
9837
|
previousValue = changes[key].previousValue;
|
9760
9838
|
}
|
9761
9839
|
// Store this change
|
9762
|
-
changes[key] =
|
9840
|
+
changes[key] = new SimpleChange(previousValue, currentValue);
|
9763
9841
|
}
|
9764
9842
|
}
|
9765
9843
|
|
@@ -9769,15 +9847,25 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
9769
9847
|
changes = undefined;
|
9770
9848
|
}
|
9771
9849
|
|
9772
|
-
return
|
9773
|
-
|
9774
|
-
|
9850
|
+
return {
|
9851
|
+
initialChanges: initialChanges,
|
9852
|
+
removeWatches: removeWatchCollection.length && function removeWatches() {
|
9853
|
+
for (var i = 0, ii = removeWatchCollection.length; i < ii; ++i) {
|
9854
|
+
removeWatchCollection[i]();
|
9855
|
+
}
|
9775
9856
|
}
|
9776
9857
|
};
|
9777
9858
|
}
|
9778
9859
|
}];
|
9779
9860
|
}
|
9780
9861
|
|
9862
|
+
function SimpleChange(previous, current) {
|
9863
|
+
this.previousValue = previous;
|
9864
|
+
this.currentValue = current;
|
9865
|
+
}
|
9866
|
+
SimpleChange.prototype.isFirstChange = function() { return this.previousValue === _UNINITIALIZED_VALUE; };
|
9867
|
+
|
9868
|
+
|
9781
9869
|
var PREFIX_REGEXP = /^((?:x|data)[\:\-_])/i;
|
9782
9870
|
/**
|
9783
9871
|
* Converts all accepted directives format into proper directive name.
|
@@ -10717,7 +10805,7 @@ function $HttpProvider() {
|
|
10717
10805
|
* That means changes to the properties of `data` are not local to the transform function (since Javascript passes objects by reference).
|
10718
10806
|
* For example, when calling `$http.get(url, $scope.myObject)`, modifications to the object's properties in a transformRequest
|
10719
10807
|
* function will be reflected on the scope and in any templates where the object is data-bound.
|
10720
|
-
* To prevent
|
10808
|
+
* To prevent this, transform functions should have no side-effects.
|
10721
10809
|
* If you need to modify properties, it is recommended to make a copy of the data, or create new object to return.
|
10722
10810
|
* </div>
|
10723
10811
|
*
|
@@ -10963,6 +11051,12 @@ function $HttpProvider() {
|
|
10963
11051
|
* - **headers** – `{Object}` – Map of strings or functions which return strings representing
|
10964
11052
|
* HTTP headers to send to the server. If the return value of a function is null, the
|
10965
11053
|
* header will not be sent. Functions accept a config object as an argument.
|
11054
|
+
* - **eventHandlers** - `{Object}` - Event listeners to be bound to the XMLHttpRequest object.
|
11055
|
+
* To bind events to the XMLHttpRequest upload object, use `uploadEventHandlers`.
|
11056
|
+
* The handler will be called in the context of a `$apply` block.
|
11057
|
+
* - **uploadEventHandlers** - `{Object}` - Event listeners to be bound to the XMLHttpRequest upload
|
11058
|
+
* object. To bind events to the XMLHttpRequest object, use `eventHandlers`.
|
11059
|
+
* The handler will be called in the context of a `$apply` block.
|
10966
11060
|
* - **xsrfHeaderName** – `{string}` – Name of HTTP header to populate with the XSRF token.
|
10967
11061
|
* - **xsrfCookieName** – `{string}` – Name of cookie containing the XSRF token.
|
10968
11062
|
* - **transformRequest** –
|
@@ -11421,11 +11515,35 @@ function $HttpProvider() {
|
|
11421
11515
|
}
|
11422
11516
|
|
11423
11517
|
$httpBackend(config.method, url, reqData, done, reqHeaders, config.timeout,
|
11424
|
-
config.withCredentials, config.responseType
|
11518
|
+
config.withCredentials, config.responseType,
|
11519
|
+
createApplyHandlers(config.eventHandlers),
|
11520
|
+
createApplyHandlers(config.uploadEventHandlers));
|
11425
11521
|
}
|
11426
11522
|
|
11427
11523
|
return promise;
|
11428
11524
|
|
11525
|
+
function createApplyHandlers(eventHandlers) {
|
11526
|
+
if (eventHandlers) {
|
11527
|
+
var applyHandlers = {};
|
11528
|
+
forEach(eventHandlers, function(eventHandler, key) {
|
11529
|
+
applyHandlers[key] = function(event) {
|
11530
|
+
if (useApplyAsync) {
|
11531
|
+
$rootScope.$applyAsync(callEventHandler);
|
11532
|
+
} else if ($rootScope.$$phase) {
|
11533
|
+
callEventHandler();
|
11534
|
+
} else {
|
11535
|
+
$rootScope.$apply(callEventHandler);
|
11536
|
+
}
|
11537
|
+
|
11538
|
+
function callEventHandler() {
|
11539
|
+
eventHandler(event);
|
11540
|
+
}
|
11541
|
+
};
|
11542
|
+
});
|
11543
|
+
return applyHandlers;
|
11544
|
+
}
|
11545
|
+
}
|
11546
|
+
|
11429
11547
|
|
11430
11548
|
/**
|
11431
11549
|
* Callback registered to $httpBackend():
|
@@ -11546,7 +11664,7 @@ function $HttpBackendProvider() {
|
|
11546
11664
|
|
11547
11665
|
function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDocument) {
|
11548
11666
|
// TODO(vojta): fix the signature
|
11549
|
-
return function(method, url, post, callback, headers, timeout, withCredentials, responseType) {
|
11667
|
+
return function(method, url, post, callback, headers, timeout, withCredentials, responseType, eventHandlers, uploadEventHandlers) {
|
11550
11668
|
$browser.$$incOutstandingRequestCount();
|
11551
11669
|
url = url || $browser.url();
|
11552
11670
|
|
@@ -11606,6 +11724,14 @@ function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDoc
|
|
11606
11724
|
xhr.onerror = requestError;
|
11607
11725
|
xhr.onabort = requestError;
|
11608
11726
|
|
11727
|
+
forEach(eventHandlers, function(value, key) {
|
11728
|
+
xhr.addEventListener(key, value);
|
11729
|
+
});
|
11730
|
+
|
11731
|
+
forEach(uploadEventHandlers, function(value, key) {
|
11732
|
+
xhr.upload.addEventListener(key, value);
|
11733
|
+
});
|
11734
|
+
|
11609
11735
|
if (withCredentials) {
|
11610
11736
|
xhr.withCredentials = true;
|
11611
11737
|
}
|
@@ -13584,7 +13710,7 @@ Lexer.prototype = {
|
|
13584
13710
|
this.readString(ch);
|
13585
13711
|
} else if (this.isNumber(ch) || ch === '.' && this.isNumber(this.peek())) {
|
13586
13712
|
this.readNumber();
|
13587
|
-
} else if (this.
|
13713
|
+
} else if (this.isIdentifierStart(this.peekMultichar())) {
|
13588
13714
|
this.readIdent();
|
13589
13715
|
} else if (this.is(ch, '(){}[].,;:?')) {
|
13590
13716
|
this.tokens.push({index: this.index, text: ch});
|
@@ -13628,12 +13754,49 @@ Lexer.prototype = {
|
|
13628
13754
|
ch === '\n' || ch === '\v' || ch === '\u00A0');
|
13629
13755
|
},
|
13630
13756
|
|
13631
|
-
|
13757
|
+
isIdentifierStart: function(ch) {
|
13758
|
+
return this.options.isIdentifierStart ?
|
13759
|
+
this.options.isIdentifierStart(ch, this.codePointAt(ch)) :
|
13760
|
+
this.isValidIdentifierStart(ch);
|
13761
|
+
},
|
13762
|
+
|
13763
|
+
isValidIdentifierStart: function(ch) {
|
13632
13764
|
return ('a' <= ch && ch <= 'z' ||
|
13633
13765
|
'A' <= ch && ch <= 'Z' ||
|
13634
13766
|
'_' === ch || ch === '$');
|
13635
13767
|
},
|
13636
13768
|
|
13769
|
+
isIdentifierContinue: function(ch) {
|
13770
|
+
return this.options.isIdentifierContinue ?
|
13771
|
+
this.options.isIdentifierContinue(ch, this.codePointAt(ch)) :
|
13772
|
+
this.isValidIdentifierContinue(ch);
|
13773
|
+
},
|
13774
|
+
|
13775
|
+
isValidIdentifierContinue: function(ch, cp) {
|
13776
|
+
return this.isValidIdentifierStart(ch, cp) || this.isNumber(ch);
|
13777
|
+
},
|
13778
|
+
|
13779
|
+
codePointAt: function(ch) {
|
13780
|
+
if (ch.length === 1) return ch.charCodeAt(0);
|
13781
|
+
/*jshint bitwise: false*/
|
13782
|
+
return (ch.charCodeAt(0) << 10) + ch.charCodeAt(1) - 0x35FDC00;
|
13783
|
+
/*jshint bitwise: true*/
|
13784
|
+
},
|
13785
|
+
|
13786
|
+
peekMultichar: function() {
|
13787
|
+
var ch = this.text.charAt(this.index);
|
13788
|
+
var peek = this.peek();
|
13789
|
+
if (!peek) {
|
13790
|
+
return ch;
|
13791
|
+
}
|
13792
|
+
var cp1 = ch.charCodeAt(0);
|
13793
|
+
var cp2 = peek.charCodeAt(0);
|
13794
|
+
if (cp1 >= 0xD800 && cp1 <= 0xDBFF && cp2 >= 0xDC00 && cp2 <= 0xDFFF) {
|
13795
|
+
return ch + peek;
|
13796
|
+
}
|
13797
|
+
return ch;
|
13798
|
+
},
|
13799
|
+
|
13637
13800
|
isExpOperator: function(ch) {
|
13638
13801
|
return (ch === '-' || ch === '+' || this.isNumber(ch));
|
13639
13802
|
},
|
@@ -13682,12 +13845,13 @@ Lexer.prototype = {
|
|
13682
13845
|
|
13683
13846
|
readIdent: function() {
|
13684
13847
|
var start = this.index;
|
13848
|
+
this.index += this.peekMultichar().length;
|
13685
13849
|
while (this.index < this.text.length) {
|
13686
|
-
var ch = this.
|
13687
|
-
if (!
|
13850
|
+
var ch = this.peekMultichar();
|
13851
|
+
if (!this.isIdentifierContinue(ch)) {
|
13688
13852
|
break;
|
13689
13853
|
}
|
13690
|
-
this.index
|
13854
|
+
this.index += ch.length;
|
13691
13855
|
}
|
13692
13856
|
this.tokens.push({
|
13693
13857
|
index: start,
|
@@ -14617,7 +14781,13 @@ ASTCompiler.prototype = {
|
|
14617
14781
|
},
|
14618
14782
|
|
14619
14783
|
nonComputedMember: function(left, right) {
|
14620
|
-
|
14784
|
+
var SAFE_IDENTIFIER = /[$_a-zA-Z][$_a-zA-Z0-9]*/;
|
14785
|
+
var UNSAFE_CHARACTERS = /[^$_a-zA-Z0-9]/g;
|
14786
|
+
if (SAFE_IDENTIFIER.test(right)) {
|
14787
|
+
return left + '.' + right;
|
14788
|
+
} else {
|
14789
|
+
return left + '["' + right.replace(UNSAFE_CHARACTERS, this.stringEscapeFn) + '"]';
|
14790
|
+
}
|
14621
14791
|
},
|
14622
14792
|
|
14623
14793
|
computedMember: function(left, right) {
|
@@ -15180,6 +15350,7 @@ function $ParseProvider() {
|
|
15180
15350
|
'null': null,
|
15181
15351
|
'undefined': undefined
|
15182
15352
|
};
|
15353
|
+
var identStart, identContinue;
|
15183
15354
|
|
15184
15355
|
/**
|
15185
15356
|
* @ngdoc method
|
@@ -15196,17 +15367,50 @@ function $ParseProvider() {
|
|
15196
15367
|
literals[literalName] = literalValue;
|
15197
15368
|
};
|
15198
15369
|
|
15370
|
+
/**
|
15371
|
+
* @ngdoc method
|
15372
|
+
* @name $parseProvider#setIdentifierFns
|
15373
|
+
* @description
|
15374
|
+
*
|
15375
|
+
* Allows defining the set of characters that are allowed in Angular expressions. The function
|
15376
|
+
* `identifierStart` will get called to know if a given character is a valid character to be the
|
15377
|
+
* first character for an identifier. The function `identifierContinue` will get called to know if
|
15378
|
+
* a given character is a valid character to be a follow-up identifier character. The functions
|
15379
|
+
* `identifierStart` and `identifierContinue` will receive as arguments the single character to be
|
15380
|
+
* identifier and the character code point. These arguments will be `string` and `numeric`. Keep in
|
15381
|
+
* mind that the `string` parameter can be two characters long depending on the character
|
15382
|
+
* representation. It is expected for the function to return `true` or `false`, whether that
|
15383
|
+
* character is allowed or not.
|
15384
|
+
*
|
15385
|
+
* Since this function will be called extensivelly, keep the implementation of these functions fast,
|
15386
|
+
* as the performance of these functions have a direct impact on the expressions parsing speed.
|
15387
|
+
*
|
15388
|
+
* @param {function=} identifierStart The function that will decide whether the given character is
|
15389
|
+
* a valid identifier start character.
|
15390
|
+
* @param {function=} identifierContinue The function that will decide whether the given character is
|
15391
|
+
* a valid identifier continue character.
|
15392
|
+
*/
|
15393
|
+
this.setIdentifierFns = function(identifierStart, identifierContinue) {
|
15394
|
+
identStart = identifierStart;
|
15395
|
+
identContinue = identifierContinue;
|
15396
|
+
return this;
|
15397
|
+
};
|
15398
|
+
|
15199
15399
|
this.$get = ['$filter', function($filter) {
|
15200
15400
|
var noUnsafeEval = csp().noUnsafeEval;
|
15201
15401
|
var $parseOptions = {
|
15202
15402
|
csp: noUnsafeEval,
|
15203
15403
|
expensiveChecks: false,
|
15204
|
-
literals: copy(literals)
|
15404
|
+
literals: copy(literals),
|
15405
|
+
isIdentifierStart: isFunction(identStart) && identStart,
|
15406
|
+
isIdentifierContinue: isFunction(identContinue) && identContinue
|
15205
15407
|
},
|
15206
15408
|
$parseOptionsExpensive = {
|
15207
15409
|
csp: noUnsafeEval,
|
15208
15410
|
expensiveChecks: true,
|
15209
|
-
literals: copy(literals)
|
15411
|
+
literals: copy(literals),
|
15412
|
+
isIdentifierStart: isFunction(identStart) && identStart,
|
15413
|
+
isIdentifierContinue: isFunction(identContinue) && identContinue
|
15210
15414
|
};
|
15211
15415
|
var runningChecksEnabled = false;
|
15212
15416
|
|
@@ -19001,7 +19205,7 @@ function $TimeoutProvider() {
|
|
19001
19205
|
// doesn't know about mocked locations and resolves URLs to the real document - which is
|
19002
19206
|
// exactly the behavior needed here. There is little value is mocking these out for this
|
19003
19207
|
// service.
|
19004
|
-
var urlParsingNode = document.createElement("a");
|
19208
|
+
var urlParsingNode = window.document.createElement("a");
|
19005
19209
|
var originUrl = urlResolve(window.location.href);
|
19006
19210
|
|
19007
19211
|
|
@@ -19701,7 +19905,9 @@ function currencyFilter($locale) {
|
|
19701
19905
|
* @param {(number|string)=} fractionSize Number of decimal places to round the number to.
|
19702
19906
|
* If this is not provided then the fraction size is computed from the current locale's number
|
19703
19907
|
* formatting pattern. In the case of the default locale, it will be 3.
|
19704
|
-
* @returns {string} Number rounded to fractionSize
|
19908
|
+
* @returns {string} Number rounded to `fractionSize` appropriately formatted based on the current
|
19909
|
+
* locale (e.g., in the en_US locale it will have "." as the decimal separator and
|
19910
|
+
* include "," group separators after each third digit).
|
19705
19911
|
*
|
19706
19912
|
* @example
|
19707
19913
|
<example module="numberFilterExample">
|
@@ -23930,7 +24136,11 @@ function classDirective(name, selector) {
|
|
23930
24136
|
updateClasses(oldClasses, newClasses);
|
23931
24137
|
}
|
23932
24138
|
}
|
23933
|
-
|
24139
|
+
if (isArray(newVal)) {
|
24140
|
+
oldVal = newVal.map(function(v) { return shallowCopy(v); });
|
24141
|
+
} else {
|
24142
|
+
oldVal = shallowCopy(newVal);
|
24143
|
+
}
|
23934
24144
|
}
|
23935
24145
|
}
|
23936
24146
|
};
|
@@ -25646,7 +25856,7 @@ var ngIncludeFillContentDirective = ['$compile',
|
|
25646
25856
|
// support innerHTML, so detect this here and try to generate the contents
|
25647
25857
|
// specially.
|
25648
25858
|
$element.empty();
|
25649
|
-
$compile(jqLiteBuildFragment(ctrl.template, document).childNodes)(scope,
|
25859
|
+
$compile(jqLiteBuildFragment(ctrl.template, window.document).childNodes)(scope,
|
25650
25860
|
function namespaceAdaptedClone(clone) {
|
25651
25861
|
$element.append(clone);
|
25652
25862
|
}, {futureParentElement: $element});
|
@@ -27560,7 +27770,7 @@ var NG_OPTIONS_REGEXP = /^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+group\s+by\s
|
|
27560
27770
|
// jshint maxlen: 100
|
27561
27771
|
|
27562
27772
|
|
27563
|
-
var ngOptionsDirective = ['$compile', '$parse', function($compile, $parse) {
|
27773
|
+
var ngOptionsDirective = ['$compile', '$document', '$parse', function($compile, $document, $parse) {
|
27564
27774
|
|
27565
27775
|
function parseOptionsExpression(optionsExp, selectElement, scope) {
|
27566
27776
|
|
@@ -27721,8 +27931,8 @@ var ngOptionsDirective = ['$compile', '$parse', function($compile, $parse) {
|
|
27721
27931
|
|
27722
27932
|
// we can't just jqLite('<option>') since jqLite is not smart enough
|
27723
27933
|
// to create it in <select> and IE barfs otherwise.
|
27724
|
-
var optionTemplate = document.createElement('option'),
|
27725
|
-
optGroupTemplate = document.createElement('optgroup');
|
27934
|
+
var optionTemplate = window.document.createElement('option'),
|
27935
|
+
optGroupTemplate = window.document.createElement('optgroup');
|
27726
27936
|
|
27727
27937
|
function ngOptionsPostLink(scope, selectElement, attr, ctrls) {
|
27728
27938
|
|
@@ -27747,7 +27957,10 @@ var ngOptionsDirective = ['$compile', '$parse', function($compile, $parse) {
|
|
27747
27957
|
|
27748
27958
|
var options;
|
27749
27959
|
var ngOptions = parseOptionsExpression(attr.ngOptions, selectElement, scope);
|
27750
|
-
|
27960
|
+
// This stores the newly created options before they are appended to the select.
|
27961
|
+
// Since the contents are removed from the fragment when it is appended,
|
27962
|
+
// we only need to create it once.
|
27963
|
+
var listFragment = $document[0].createDocumentFragment();
|
27751
27964
|
|
27752
27965
|
var renderEmptyOption = function() {
|
27753
27966
|
if (!providedEmptyOption) {
|
@@ -27782,7 +27995,7 @@ var ngOptionsDirective = ['$compile', '$parse', function($compile, $parse) {
|
|
27782
27995
|
selectCtrl.writeValue = function writeNgOptionsValue(value) {
|
27783
27996
|
var option = options.getOptionFromViewValue(value);
|
27784
27997
|
|
27785
|
-
if (option
|
27998
|
+
if (option) {
|
27786
27999
|
// Don't update the option when it is already selected.
|
27787
28000
|
// For example, the browser will select the first option by default. In that case,
|
27788
28001
|
// most properties are set automatically - except the `selected` attribute, which we
|
@@ -27844,7 +28057,7 @@ var ngOptionsDirective = ['$compile', '$parse', function($compile, $parse) {
|
|
27844
28057
|
if (value) {
|
27845
28058
|
value.forEach(function(item) {
|
27846
28059
|
var option = options.getOptionFromViewValue(item);
|
27847
|
-
if (option
|
28060
|
+
if (option) option.element.selected = true;
|
27848
28061
|
});
|
27849
28062
|
}
|
27850
28063
|
};
|
@@ -27896,6 +28109,8 @@ var ngOptionsDirective = ['$compile', '$parse', function($compile, $parse) {
|
|
27896
28109
|
emptyOption = jqLite(optionTemplate.cloneNode(false));
|
27897
28110
|
}
|
27898
28111
|
|
28112
|
+
selectElement.empty();
|
28113
|
+
|
27899
28114
|
// We need to do this here to ensure that the options object is defined
|
27900
28115
|
// when we first hit it in writeNgOptionsValue
|
27901
28116
|
updateOptions();
|
@@ -27905,6 +28120,12 @@ var ngOptionsDirective = ['$compile', '$parse', function($compile, $parse) {
|
|
27905
28120
|
|
27906
28121
|
// ------------------------------------------------------------------ //
|
27907
28122
|
|
28123
|
+
function addOptionElement(option, parent) {
|
28124
|
+
var optionElement = optionTemplate.cloneNode(false);
|
28125
|
+
parent.appendChild(optionElement);
|
28126
|
+
updateOptionElement(option, optionElement);
|
28127
|
+
}
|
28128
|
+
|
27908
28129
|
|
27909
28130
|
function updateOptionElement(option, element) {
|
27910
28131
|
option.element = element;
|
@@ -27921,133 +28142,66 @@ var ngOptionsDirective = ['$compile', '$parse', function($compile, $parse) {
|
|
27921
28142
|
if (option.value !== element.value) element.value = option.selectValue;
|
27922
28143
|
}
|
27923
28144
|
|
27924
|
-
function
|
27925
|
-
var
|
27926
|
-
// Check whether we can reuse the next element
|
27927
|
-
if (current && lowercase(current.nodeName) === type) {
|
27928
|
-
// The next element is the right type so reuse it
|
27929
|
-
element = current;
|
27930
|
-
} else {
|
27931
|
-
// The next element is not the right type so create a new one
|
27932
|
-
element = templateElement.cloneNode(false);
|
27933
|
-
if (!current) {
|
27934
|
-
// There are no more elements so just append it to the select
|
27935
|
-
parent.appendChild(element);
|
27936
|
-
} else {
|
27937
|
-
// The next element is not a group so insert the new one
|
27938
|
-
parent.insertBefore(element, current);
|
27939
|
-
}
|
27940
|
-
}
|
27941
|
-
return element;
|
27942
|
-
}
|
27943
|
-
|
27944
|
-
|
27945
|
-
function removeExcessElements(current) {
|
27946
|
-
var next;
|
27947
|
-
while (current) {
|
27948
|
-
next = current.nextSibling;
|
27949
|
-
jqLiteRemove(current);
|
27950
|
-
current = next;
|
27951
|
-
}
|
27952
|
-
}
|
27953
|
-
|
27954
|
-
|
27955
|
-
function skipEmptyAndUnknownOptions(current) {
|
27956
|
-
var emptyOption_ = emptyOption && emptyOption[0];
|
27957
|
-
var unknownOption_ = unknownOption && unknownOption[0];
|
28145
|
+
function updateOptions() {
|
28146
|
+
var previousValue = options && selectCtrl.readValue();
|
27958
28147
|
|
27959
|
-
// We
|
27960
|
-
//
|
27961
|
-
//
|
27962
|
-
|
27963
|
-
|
27964
|
-
|
27965
|
-
|
27966
|
-
|
27967
|
-
|
27968
|
-
|
28148
|
+
// We must remove all current options, but cannot simply set innerHTML = null
|
28149
|
+
// since the providedEmptyOption might have an ngIf on it that inserts comments which we
|
28150
|
+
// must preserve.
|
28151
|
+
// Instead, iterate over the current option elements and remove them or their optgroup
|
28152
|
+
// parents
|
28153
|
+
if (options) {
|
28154
|
+
|
28155
|
+
for (var i = options.items.length - 1; i >= 0; i--) {
|
28156
|
+
var option = options.items[i];
|
28157
|
+
if (option.group) {
|
28158
|
+
jqLiteRemove(option.element.parentNode);
|
28159
|
+
} else {
|
28160
|
+
jqLiteRemove(option.element);
|
28161
|
+
}
|
27969
28162
|
}
|
27970
28163
|
}
|
27971
|
-
return current;
|
27972
|
-
}
|
27973
|
-
|
27974
|
-
|
27975
|
-
function updateOptions() {
|
27976
|
-
|
27977
|
-
var previousValue = options && selectCtrl.readValue();
|
27978
28164
|
|
27979
28165
|
options = ngOptions.getOptions();
|
27980
28166
|
|
27981
|
-
var
|
27982
|
-
var currentElement = selectElement[0].firstChild;
|
28167
|
+
var groupElementMap = {};
|
27983
28168
|
|
27984
28169
|
// Ensure that the empty option is always there if it was explicitly provided
|
27985
28170
|
if (providedEmptyOption) {
|
27986
28171
|
selectElement.prepend(emptyOption);
|
27987
28172
|
}
|
27988
28173
|
|
27989
|
-
|
27990
|
-
|
27991
|
-
options.items.forEach(function updateOption(option) {
|
27992
|
-
var group;
|
28174
|
+
options.items.forEach(function addOption(option) {
|
27993
28175
|
var groupElement;
|
27994
|
-
var optionElement;
|
27995
28176
|
|
27996
28177
|
if (isDefined(option.group)) {
|
27997
28178
|
|
27998
28179
|
// This option is to live in a group
|
27999
28180
|
// See if we have already created this group
|
28000
|
-
|
28181
|
+
groupElement = groupElementMap[option.group];
|
28001
28182
|
|
28002
|
-
if (!
|
28183
|
+
if (!groupElement) {
|
28003
28184
|
|
28004
|
-
|
28005
|
-
groupElement
|
28006
|
-
currentElement,
|
28007
|
-
'optgroup',
|
28008
|
-
optGroupTemplate);
|
28009
|
-
// Move to the next element
|
28010
|
-
currentElement = groupElement.nextSibling;
|
28185
|
+
groupElement = optGroupTemplate.cloneNode(false);
|
28186
|
+
listFragment.appendChild(groupElement);
|
28011
28187
|
|
28012
28188
|
// Update the label on the group element
|
28013
28189
|
groupElement.label = option.group;
|
28014
28190
|
|
28015
28191
|
// Store it for use later
|
28016
|
-
|
28017
|
-
groupElement: groupElement,
|
28018
|
-
currentOptionElement: groupElement.firstChild
|
28019
|
-
};
|
28020
|
-
|
28192
|
+
groupElementMap[option.group] = groupElement;
|
28021
28193
|
}
|
28022
28194
|
|
28023
|
-
|
28024
|
-
optionElement = addOrReuseElement(group.groupElement,
|
28025
|
-
group.currentOptionElement,
|
28026
|
-
'option',
|
28027
|
-
optionTemplate);
|
28028
|
-
updateOptionElement(option, optionElement);
|
28029
|
-
// Move to the next element
|
28030
|
-
group.currentOptionElement = optionElement.nextSibling;
|
28195
|
+
addOptionElement(option, groupElement);
|
28031
28196
|
|
28032
28197
|
} else {
|
28033
28198
|
|
28034
28199
|
// This option is not in a group
|
28035
|
-
|
28036
|
-
currentElement,
|
28037
|
-
'option',
|
28038
|
-
optionTemplate);
|
28039
|
-
updateOptionElement(option, optionElement);
|
28040
|
-
// Move to the next element
|
28041
|
-
currentElement = optionElement.nextSibling;
|
28200
|
+
addOptionElement(option, listFragment);
|
28042
28201
|
}
|
28043
28202
|
});
|
28044
28203
|
|
28045
|
-
|
28046
|
-
// Now remove all excess options and group
|
28047
|
-
Object.keys(groupMap).forEach(function(key) {
|
28048
|
-
removeExcessElements(groupMap[key].currentOptionElement);
|
28049
|
-
});
|
28050
|
-
removeExcessElements(currentElement);
|
28204
|
+
selectElement[0].appendChild(listFragment);
|
28051
28205
|
|
28052
28206
|
ngModelCtrl.$render();
|
28053
28207
|
|
@@ -29742,7 +29896,7 @@ var SelectController =
|
|
29742
29896
|
//
|
29743
29897
|
// We can't just jqLite('<option>') since jqLite is not smart enough
|
29744
29898
|
// to create it in <select> and IE barfs otherwise.
|
29745
|
-
self.unknownOption = jqLite(document.createElement('option'));
|
29899
|
+
self.unknownOption = jqLite(window.document.createElement('option'));
|
29746
29900
|
self.renderUnknownOption = function(val) {
|
29747
29901
|
var unknownVal = '? ' + hashKey(val) + ' ?';
|
29748
29902
|
self.unknownOption.val(unknownVal);
|
@@ -30705,10 +30859,10 @@ $provide.value("$locale", {
|
|
30705
30859
|
});
|
30706
30860
|
}]);
|
30707
30861
|
|
30708
|
-
jqLite(document).ready(function() {
|
30709
|
-
angularInit(document, bootstrap);
|
30862
|
+
jqLite(window.document).ready(function() {
|
30863
|
+
angularInit(window.document, bootstrap);
|
30710
30864
|
});
|
30711
30865
|
|
30712
|
-
})(window
|
30866
|
+
})(window);
|
30713
30867
|
|
30714
30868
|
!window.angular.$$csp().noInlineStyle && window.angular.element(document.head).prepend('<style type="text/css">@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide:not(.ng-hide-animate){display:none !important;}ng\\:form{display:block;}.ng-animate-shim{visibility:hidden;}.ng-anchor{position:absolute;}</style>');
|