angularjs-rails 1.3.4 → 1.3.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/angularjs-rails/version.rb +2 -2
- data/vendor/assets/javascripts/angular-animate.js +121 -120
- data/vendor/assets/javascripts/angular-aria.js +39 -28
- data/vendor/assets/javascripts/angular-cookies.js +1 -1
- data/vendor/assets/javascripts/angular-loader.js +2 -2
- data/vendor/assets/javascripts/angular-messages.js +1 -1
- data/vendor/assets/javascripts/angular-mocks.js +10 -8
- data/vendor/assets/javascripts/angular-resource.js +1 -1
- data/vendor/assets/javascripts/angular-route.js +2 -3
- data/vendor/assets/javascripts/angular-sanitize.js +7 -5
- data/vendor/assets/javascripts/angular-scenario.js +316 -231
- data/vendor/assets/javascripts/angular-touch.js +1 -1
- data/vendor/assets/javascripts/angular.js +314 -229
- data/vendor/assets/javascripts/unstable/angular-animate.js +121 -120
- data/vendor/assets/javascripts/unstable/angular-aria.js +39 -28
- data/vendor/assets/javascripts/unstable/angular-cookies.js +1 -1
- data/vendor/assets/javascripts/unstable/angular-loader.js +2 -2
- data/vendor/assets/javascripts/unstable/angular-messages.js +1 -1
- data/vendor/assets/javascripts/unstable/angular-mocks.js +10 -8
- data/vendor/assets/javascripts/unstable/angular-resource.js +1 -1
- data/vendor/assets/javascripts/unstable/angular-route.js +2 -3
- data/vendor/assets/javascripts/unstable/angular-sanitize.js +7 -5
- data/vendor/assets/javascripts/unstable/angular-scenario.js +316 -231
- data/vendor/assets/javascripts/unstable/angular-touch.js +1 -1
- data/vendor/assets/javascripts/unstable/angular.js +314 -229
- metadata +2 -2
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.3.
|
2
|
+
* @license AngularJS v1.3.36
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -55,7 +55,7 @@ function minErr(module, ErrorConstructor) {
|
|
55
55
|
return match;
|
56
56
|
});
|
57
57
|
|
58
|
-
message = message + '\nhttp://errors.angularjs.org/1.3.
|
58
|
+
message = message + '\nhttp://errors.angularjs.org/1.3.36/' +
|
59
59
|
(module ? module + '/' : '') + code;
|
60
60
|
for (i = 2; i < arguments.length; i++) {
|
61
61
|
message = message + (i == 2 ? '?' : '&') + 'p' + (i - 2) + '=' +
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.3.
|
2
|
+
* @license AngularJS v1.3.36
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -1119,7 +1119,7 @@ angular.mock.dump = function(object) {
|
|
1119
1119
|
```
|
1120
1120
|
*/
|
1121
1121
|
angular.mock.$HttpBackendProvider = function() {
|
1122
|
-
this.$get = ['$rootScope', createHttpBackendMock];
|
1122
|
+
this.$get = ['$rootScope', '$timeout', createHttpBackendMock];
|
1123
1123
|
};
|
1124
1124
|
|
1125
1125
|
/**
|
@@ -1136,7 +1136,7 @@ angular.mock.$HttpBackendProvider = function() {
|
|
1136
1136
|
* @param {Object=} $browser Auto-flushing enabled if specified
|
1137
1137
|
* @return {Object} Instance of $httpBackend mock
|
1138
1138
|
*/
|
1139
|
-
function createHttpBackendMock($rootScope, $delegate, $browser) {
|
1139
|
+
function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
|
1140
1140
|
var definitions = [],
|
1141
1141
|
expectations = [],
|
1142
1142
|
responses = [],
|
@@ -1149,7 +1149,7 @@ function createHttpBackendMock($rootScope, $delegate, $browser) {
|
|
1149
1149
|
return function() {
|
1150
1150
|
return angular.isNumber(status)
|
1151
1151
|
? [status, data, headers, statusText]
|
1152
|
-
: [200, status, data];
|
1152
|
+
: [200, status, data, headers];
|
1153
1153
|
};
|
1154
1154
|
}
|
1155
1155
|
|
@@ -1166,7 +1166,9 @@ function createHttpBackendMock($rootScope, $delegate, $browser) {
|
|
1166
1166
|
}
|
1167
1167
|
|
1168
1168
|
function wrapResponse(wrapped) {
|
1169
|
-
if (!$browser && timeout
|
1169
|
+
if (!$browser && timeout) {
|
1170
|
+
timeout.then ? timeout.then(handleTimeout) : $timeout(handleTimeout, timeout);
|
1171
|
+
}
|
1170
1172
|
|
1171
1173
|
return handleResponse;
|
1172
1174
|
|
@@ -2040,7 +2042,7 @@ angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) {
|
|
2040
2042
|
*/
|
2041
2043
|
angular.mock.e2e = {};
|
2042
2044
|
angular.mock.e2e.$httpBackendDecorator =
|
2043
|
-
['$rootScope', '$delegate', '$browser', createHttpBackendMock];
|
2045
|
+
['$rootScope', '$timeout', '$delegate', '$browser', createHttpBackendMock];
|
2044
2046
|
|
2045
2047
|
|
2046
2048
|
/**
|
@@ -2054,7 +2056,7 @@ angular.mock.e2e.$httpBackendDecorator =
|
|
2054
2056
|
*
|
2055
2057
|
* In addition to all the regular `Scope` methods, the following helper methods are available:
|
2056
2058
|
*/
|
2057
|
-
angular.mock.$RootScopeDecorator = function($delegate) {
|
2059
|
+
angular.mock.$RootScopeDecorator = ['$delegate', function($delegate) {
|
2058
2060
|
|
2059
2061
|
var $rootScopePrototype = Object.getPrototypeOf($delegate);
|
2060
2062
|
|
@@ -2126,7 +2128,7 @@ angular.mock.$RootScopeDecorator = function($delegate) {
|
|
2126
2128
|
|
2127
2129
|
return count;
|
2128
2130
|
}
|
2129
|
-
};
|
2131
|
+
}];
|
2130
2132
|
|
2131
2133
|
|
2132
2134
|
if (window.jasmine || window.mocha) {
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.3.
|
2
|
+
* @license AngularJS v1.3.36
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -180,7 +180,7 @@ function $RouteProvider() {
|
|
180
180
|
* @description
|
181
181
|
*
|
182
182
|
* A boolean property indicating if routes defined
|
183
|
-
* using this provider should be matched using a case
|
183
|
+
* using this provider should be matched using a case insensitive
|
184
184
|
* algorithm. Defaults to `false`.
|
185
185
|
*/
|
186
186
|
this.caseInsensitiveMatch = false;
|
@@ -788,7 +788,6 @@ ngRouteModule.directive('ngView', ngViewFillContentFactory);
|
|
788
788
|
.view-animate-container {
|
789
789
|
position:relative;
|
790
790
|
height:100px!important;
|
791
|
-
position:relative;
|
792
791
|
background:white;
|
793
792
|
border:1px solid black;
|
794
793
|
height:40px;
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.3.
|
2
|
+
* @license AngularJS v1.3.36
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -628,7 +628,7 @@ angular.module('ngSanitize', []).provider('$sanitize', $SanitizeProvider);
|
|
628
628
|
*/
|
629
629
|
angular.module('ngSanitize').filter('linky', ['$sanitize', function($sanitize) {
|
630
630
|
var LINKY_URL_REGEXP =
|
631
|
-
/((ftp|https?):\/\/|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>"]/,
|
631
|
+
/((ftp|https?):\/\/|(www\.)|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>"”’]/,
|
632
632
|
MAILTO_REGEXP = /^mailto:/;
|
633
633
|
|
634
634
|
return function(text, target) {
|
@@ -641,8 +641,10 @@ angular.module('ngSanitize').filter('linky', ['$sanitize', function($sanitize) {
|
|
641
641
|
while ((match = raw.match(LINKY_URL_REGEXP))) {
|
642
642
|
// We can not end in these as they are sometimes found at the end of the sentence
|
643
643
|
url = match[0];
|
644
|
-
// if we did not match ftp/http/mailto then assume mailto
|
645
|
-
if (match[2]
|
644
|
+
// if we did not match ftp/http/www/mailto then assume mailto
|
645
|
+
if (!match[2] && !match[4]) {
|
646
|
+
url = (match[3] ? 'http://' : 'mailto:') + url;
|
647
|
+
}
|
646
648
|
i = match.index;
|
647
649
|
addText(raw.substr(0, i));
|
648
650
|
addLink(url, match[0].replace(MAILTO_REGEXP, ''));
|
@@ -666,7 +668,7 @@ angular.module('ngSanitize').filter('linky', ['$sanitize', function($sanitize) {
|
|
666
668
|
'" ');
|
667
669
|
}
|
668
670
|
html.push('href="',
|
669
|
-
url.replace(
|
671
|
+
url.replace(/"/g, '"'),
|
670
672
|
'">');
|
671
673
|
addText(text);
|
672
674
|
html.push('</a>');
|
@@ -9190,7 +9190,7 @@ return jQuery;
|
|
9190
9190
|
}));
|
9191
9191
|
|
9192
9192
|
/**
|
9193
|
-
* @license AngularJS v1.3.
|
9193
|
+
* @license AngularJS v1.3.36
|
9194
9194
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
9195
9195
|
* License: MIT
|
9196
9196
|
*/
|
@@ -9246,7 +9246,7 @@ function minErr(module, ErrorConstructor) {
|
|
9246
9246
|
return match;
|
9247
9247
|
});
|
9248
9248
|
|
9249
|
-
message = message + '\nhttp://errors.angularjs.org/1.3.
|
9249
|
+
message = message + '\nhttp://errors.angularjs.org/1.3.36/' +
|
9250
9250
|
(module ? module + '/' : '') + code;
|
9251
9251
|
for (i = 2; i < arguments.length; i++) {
|
9252
9252
|
message = message + (i == 2 ? '?' : '&') + 'p' + (i - 2) + '=' +
|
@@ -9418,8 +9418,8 @@ if ('i' !== 'I'.toLowerCase()) {
|
|
9418
9418
|
}
|
9419
9419
|
|
9420
9420
|
|
9421
|
-
var
|
9422
|
-
msie,
|
9421
|
+
var
|
9422
|
+
msie, // holds major version number for IE, or NaN if UA is not IE.
|
9423
9423
|
jqLite, // delay binding since jQuery could be loaded after us.
|
9424
9424
|
jQuery, // delay binding
|
9425
9425
|
slice = [].slice,
|
@@ -10220,12 +10220,16 @@ function toJsonReplacer(key, value) {
|
|
10220
10220
|
* stripped since angular uses this notation internally.
|
10221
10221
|
*
|
10222
10222
|
* @param {Object|Array|Date|string|number} obj Input to be serialized into JSON.
|
10223
|
-
* @param {boolean=} pretty If set to true, the JSON output will contain newlines and whitespace.
|
10223
|
+
* @param {boolean|number=} pretty If set to true, the JSON output will contain newlines and whitespace.
|
10224
|
+
* If set to an integer, the JSON output will contain that many spaces per indentation (the default is 2).
|
10224
10225
|
* @returns {string|undefined} JSON-ified string representing `obj`.
|
10225
10226
|
*/
|
10226
10227
|
function toJson(obj, pretty) {
|
10227
10228
|
if (typeof obj === 'undefined') return undefined;
|
10228
|
-
|
10229
|
+
if (!isNumber(pretty)) {
|
10230
|
+
pretty = pretty ? 2 : null;
|
10231
|
+
}
|
10232
|
+
return JSON.stringify(obj, toJsonReplacer, pretty);
|
10229
10233
|
}
|
10230
10234
|
|
10231
10235
|
|
@@ -11273,7 +11277,8 @@ function toDebugString(obj) {
|
|
11273
11277
|
$TimeoutProvider,
|
11274
11278
|
$$RAFProvider,
|
11275
11279
|
$$AsyncCallbackProvider,
|
11276
|
-
$WindowProvider
|
11280
|
+
$WindowProvider,
|
11281
|
+
$$jqLiteProvider
|
11277
11282
|
*/
|
11278
11283
|
|
11279
11284
|
|
@@ -11292,11 +11297,11 @@ function toDebugString(obj) {
|
|
11292
11297
|
* - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
|
11293
11298
|
*/
|
11294
11299
|
var version = {
|
11295
|
-
full: '1.3.
|
11300
|
+
full: '1.3.36', // all of these placeholder strings will be replaced by grunt's
|
11296
11301
|
major: 1, // package task
|
11297
11302
|
minor: 3,
|
11298
|
-
dot:
|
11299
|
-
codeName: '
|
11303
|
+
dot: 36,
|
11304
|
+
codeName: 'robofunky-danceblaster'
|
11300
11305
|
};
|
11301
11306
|
|
11302
11307
|
|
@@ -11426,7 +11431,8 @@ function publishExternalAPI(angular) {
|
|
11426
11431
|
$timeout: $TimeoutProvider,
|
11427
11432
|
$window: $WindowProvider,
|
11428
11433
|
$$rAF: $$RAFProvider,
|
11429
|
-
$$asyncCallback: $$AsyncCallbackProvider
|
11434
|
+
$$asyncCallback: $$AsyncCallbackProvider,
|
11435
|
+
$$jqLite: $$jqLiteProvider
|
11430
11436
|
});
|
11431
11437
|
}
|
11432
11438
|
]);
|
@@ -12436,6 +12442,27 @@ forEach({
|
|
12436
12442
|
JQLite.prototype.unbind = JQLite.prototype.off;
|
12437
12443
|
});
|
12438
12444
|
|
12445
|
+
|
12446
|
+
// Provider for private $$jqLite service
|
12447
|
+
function $$jqLiteProvider() {
|
12448
|
+
this.$get = function $$jqLite() {
|
12449
|
+
return extend(JQLite, {
|
12450
|
+
hasClass: function(node, classes) {
|
12451
|
+
if (node.attr) node = node[0];
|
12452
|
+
return jqLiteHasClass(node, classes);
|
12453
|
+
},
|
12454
|
+
addClass: function(node, classes) {
|
12455
|
+
if (node.attr) node = node[0];
|
12456
|
+
return jqLiteAddClass(node, classes);
|
12457
|
+
},
|
12458
|
+
removeClass: function(node, classes) {
|
12459
|
+
if (node.attr) node = node[0];
|
12460
|
+
return jqLiteRemoveClass(node, classes);
|
12461
|
+
}
|
12462
|
+
});
|
12463
|
+
};
|
12464
|
+
}
|
12465
|
+
|
12439
12466
|
/**
|
12440
12467
|
* Computes a hash of an 'obj'.
|
12441
12468
|
* Hash of a:
|
@@ -12688,6 +12715,7 @@ function annotate(fn, strictDi, name) {
|
|
12688
12715
|
* Return an instance of the service.
|
12689
12716
|
*
|
12690
12717
|
* @param {string} name The name of the instance to retrieve.
|
12718
|
+
* @param {string} caller An optional string to provide the origin of the function call for error messages.
|
12691
12719
|
* @return {*} The instance.
|
12692
12720
|
*/
|
12693
12721
|
|
@@ -13138,14 +13166,17 @@ function createInjector(modulesToLoad, strictDi) {
|
|
13138
13166
|
}
|
13139
13167
|
},
|
13140
13168
|
providerInjector = (providerCache.$injector =
|
13141
|
-
createInternalInjector(providerCache, function() {
|
13169
|
+
createInternalInjector(providerCache, function(serviceName, caller) {
|
13170
|
+
if (angular.isString(caller)) {
|
13171
|
+
path.push(caller);
|
13172
|
+
}
|
13142
13173
|
throw $injectorMinErr('unpr', "Unknown provider: {0}", path.join(' <- '));
|
13143
13174
|
})),
|
13144
13175
|
instanceCache = {},
|
13145
13176
|
instanceInjector = (instanceCache.$injector =
|
13146
|
-
createInternalInjector(instanceCache, function(
|
13147
|
-
var provider = providerInjector.get(
|
13148
|
-
return instanceInjector.invoke(provider.$get, provider, undefined,
|
13177
|
+
createInternalInjector(instanceCache, function(serviceName, caller) {
|
13178
|
+
var provider = providerInjector.get(serviceName + providerSuffix, caller);
|
13179
|
+
return instanceInjector.invoke(provider.$get, provider, undefined, serviceName);
|
13149
13180
|
}));
|
13150
13181
|
|
13151
13182
|
|
@@ -13180,7 +13211,7 @@ function createInjector(modulesToLoad, strictDi) {
|
|
13180
13211
|
|
13181
13212
|
function enforceReturnValue(name, factory) {
|
13182
13213
|
return function enforcedReturnValue() {
|
13183
|
-
var result = instanceInjector.invoke(factory, this
|
13214
|
+
var result = instanceInjector.invoke(factory, this);
|
13184
13215
|
if (isUndefined(result)) {
|
13185
13216
|
throw $injectorMinErr('undef', "Provider '{0}' must return a value from $get factory method.", name);
|
13186
13217
|
}
|
@@ -13275,7 +13306,7 @@ function createInjector(modulesToLoad, strictDi) {
|
|
13275
13306
|
|
13276
13307
|
function createInternalInjector(cache, factory) {
|
13277
13308
|
|
13278
|
-
function getService(serviceName) {
|
13309
|
+
function getService(serviceName, caller) {
|
13279
13310
|
if (cache.hasOwnProperty(serviceName)) {
|
13280
13311
|
if (cache[serviceName] === INSTANTIATING) {
|
13281
13312
|
throw $injectorMinErr('cdep', 'Circular dependency found: {0}',
|
@@ -13286,7 +13317,7 @@ function createInjector(modulesToLoad, strictDi) {
|
|
13286
13317
|
try {
|
13287
13318
|
path.unshift(serviceName);
|
13288
13319
|
cache[serviceName] = INSTANTIATING;
|
13289
|
-
return cache[serviceName] = factory(serviceName);
|
13320
|
+
return cache[serviceName] = factory(serviceName, caller);
|
13290
13321
|
} catch (err) {
|
13291
13322
|
if (cache[serviceName] === INSTANTIATING) {
|
13292
13323
|
delete cache[serviceName];
|
@@ -13318,7 +13349,7 @@ function createInjector(modulesToLoad, strictDi) {
|
|
13318
13349
|
args.push(
|
13319
13350
|
locals && locals.hasOwnProperty(key)
|
13320
13351
|
? locals[key]
|
13321
|
-
: getService(key)
|
13352
|
+
: getService(key, serviceName)
|
13322
13353
|
);
|
13323
13354
|
}
|
13324
13355
|
if (isArray(fn)) {
|
@@ -14062,6 +14093,11 @@ function Browser(window, document, $log, $sniffer) {
|
|
14062
14093
|
}
|
14063
14094
|
}
|
14064
14095
|
|
14096
|
+
function getHash(url) {
|
14097
|
+
var index = url.indexOf('#');
|
14098
|
+
return index === -1 ? '' : url.substr(index + 1);
|
14099
|
+
}
|
14100
|
+
|
14065
14101
|
/**
|
14066
14102
|
* @private
|
14067
14103
|
* Note: this method is used only by scenario runner
|
@@ -14191,8 +14227,10 @@ function Browser(window, document, $log, $sniffer) {
|
|
14191
14227
|
}
|
14192
14228
|
if (replace) {
|
14193
14229
|
location.replace(url);
|
14194
|
-
} else {
|
14230
|
+
} else if (!sameBase) {
|
14195
14231
|
location.href = url;
|
14232
|
+
} else {
|
14233
|
+
location.hash = getHash(url);
|
14196
14234
|
}
|
14197
14235
|
}
|
14198
14236
|
return self;
|
@@ -14971,7 +15009,7 @@ function $TemplateCacheProvider() {
|
|
14971
15009
|
* #### `multiElement`
|
14972
15010
|
* When this property is set to true, the HTML compiler will collect DOM nodes between
|
14973
15011
|
* nodes with the attributes `directive-name-start` and `directive-name-end`, and group them
|
14974
|
-
* together as the directive elements. It is
|
15012
|
+
* together as the directive elements. It is recommended that this feature be used on directives
|
14975
15013
|
* which are not strictly behavioural (such as {@link ngClick}), and which
|
14976
15014
|
* do not manipulate or replace child nodes (such as {@link ngInclude}).
|
14977
15015
|
*
|
@@ -15659,7 +15697,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
15659
15697
|
* Retrieves or overrides the default regular expression that is used for whitelisting of safe
|
15660
15698
|
* urls during a[href] sanitization.
|
15661
15699
|
*
|
15662
|
-
* The sanitization is a security measure aimed at
|
15700
|
+
* The sanitization is a security measure aimed at preventing XSS attacks via html links.
|
15663
15701
|
*
|
15664
15702
|
* Any url about to be assigned to a[href] via data-binding is first normalized and turned into
|
15665
15703
|
* an absolute url. Afterwards, the url is matched against the `aHrefSanitizationWhitelist`
|
@@ -15726,7 +15764,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
15726
15764
|
* * `ng-binding` CSS class
|
15727
15765
|
* * `$binding` data property containing an array of the binding expressions
|
15728
15766
|
*
|
15729
|
-
* You may want to
|
15767
|
+
* You may want to disable this in production for a significant performance boost. See
|
15730
15768
|
* {@link guide/production#disabling-debug-data Disabling Debug Data} for more.
|
15731
15769
|
*
|
15732
15770
|
* The default value is true.
|
@@ -15763,6 +15801,21 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
15763
15801
|
};
|
15764
15802
|
|
15765
15803
|
Attributes.prototype = {
|
15804
|
+
/**
|
15805
|
+
* @ngdoc method
|
15806
|
+
* @name $compile.directive.Attributes#$normalize
|
15807
|
+
* @kind function
|
15808
|
+
*
|
15809
|
+
* @description
|
15810
|
+
* Converts an attribute name (e.g. dash/colon/underscore-delimited string, optionally prefixed with `x-` or
|
15811
|
+
* `data-`) to its normalized, camelCase form.
|
15812
|
+
*
|
15813
|
+
* Also there is special case for Moz prefix starting with upper case letter.
|
15814
|
+
*
|
15815
|
+
* For further information check out the guide on {@link guide/directive#matching-directives Matching Directives}
|
15816
|
+
*
|
15817
|
+
* @param {string} name Name to normalize
|
15818
|
+
*/
|
15766
15819
|
$normalize: directiveNormalize,
|
15767
15820
|
|
15768
15821
|
|
@@ -17341,13 +17394,6 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
17341
17394
|
var PREFIX_REGEXP = /^((?:x|data)[\:\-_])/i;
|
17342
17395
|
/**
|
17343
17396
|
* Converts all accepted directives format into proper directive name.
|
17344
|
-
* All of these will become 'myDirective':
|
17345
|
-
* my:Directive
|
17346
|
-
* my-directive
|
17347
|
-
* x-my-directive
|
17348
|
-
* data-my:directive
|
17349
|
-
*
|
17350
|
-
* Also there is special case for Moz prefix starting with upper case letter.
|
17351
17397
|
* @param name Name to normalize
|
17352
17398
|
*/
|
17353
17399
|
function directiveNormalize(name) {
|
@@ -18283,12 +18329,14 @@ function $HttpProvider() {
|
|
18283
18329
|
* `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` –
|
18284
18330
|
* transform function or an array of such functions. The transform function takes the http
|
18285
18331
|
* request body and headers and returns its transformed (typically serialized) version.
|
18286
|
-
* See {@link #overriding-the-default-transformations-per-request
|
18332
|
+
* See {@link ng.$http#overriding-the-default-transformations-per-request
|
18333
|
+
* Overriding the Default Transformations}
|
18287
18334
|
* - **transformResponse** –
|
18288
18335
|
* `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` –
|
18289
18336
|
* transform function or an array of such functions. The transform function takes the http
|
18290
18337
|
* response body and headers and returns its transformed (typically deserialized) version.
|
18291
|
-
* See {@link #overriding-the-default-transformations-per-request
|
18338
|
+
* See {@link ng.$http#overriding-the-default-transformations-per-request
|
18339
|
+
* Overriding the Default Transformations}
|
18292
18340
|
* - **cache** – `{boolean|Cache}` – If true, a default $http cache will be used to cache the
|
18293
18341
|
* GET request, otherwise if a cache instance built with
|
18294
18342
|
* {@link ng.$cacheFactory $cacheFactory}, this cache will be used for
|
@@ -18698,8 +18746,7 @@ function $HttpProvider() {
|
|
18698
18746
|
if (isDefined(cachedResp)) {
|
18699
18747
|
if (isPromiseLike(cachedResp)) {
|
18700
18748
|
// cached request has already been sent, but there is no response yet
|
18701
|
-
cachedResp.then(
|
18702
|
-
return cachedResp;
|
18749
|
+
cachedResp.then(resolvePromiseWithResult, resolvePromiseWithResult);
|
18703
18750
|
} else {
|
18704
18751
|
// serving from cache
|
18705
18752
|
if (isArray(cachedResp)) {
|
@@ -18777,6 +18824,9 @@ function $HttpProvider() {
|
|
18777
18824
|
});
|
18778
18825
|
}
|
18779
18826
|
|
18827
|
+
function resolvePromiseWithResult(result) {
|
18828
|
+
resolvePromise(result.data, result.status, shallowCopy(result.headers()), result.statusText);
|
18829
|
+
}
|
18780
18830
|
|
18781
18831
|
function removePendingReq() {
|
18782
18832
|
var idx = $http.pendingRequests.indexOf(config);
|
@@ -18938,7 +18988,9 @@ function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDoc
|
|
18938
18988
|
|
18939
18989
|
function completeRequest(callback, status, response, headersString, statusText) {
|
18940
18990
|
// cancel timeout and subsequent timeout promise resolution
|
18941
|
-
timeoutId
|
18991
|
+
if (timeoutId !== undefined) {
|
18992
|
+
$browserDefer.cancel(timeoutId);
|
18993
|
+
}
|
18942
18994
|
jsonpDone = xhr = null;
|
18943
18995
|
|
18944
18996
|
callback(status, response, headersString, statusText);
|
@@ -19386,33 +19438,33 @@ function $IntervalProvider() {
|
|
19386
19438
|
* // Don't start a new fight if we are already fighting
|
19387
19439
|
* if ( angular.isDefined(stop) ) return;
|
19388
19440
|
*
|
19389
|
-
*
|
19390
|
-
*
|
19391
|
-
*
|
19392
|
-
*
|
19393
|
-
*
|
19394
|
-
*
|
19395
|
-
*
|
19396
|
-
*
|
19397
|
-
*
|
19441
|
+
* stop = $interval(function() {
|
19442
|
+
* if ($scope.blood_1 > 0 && $scope.blood_2 > 0) {
|
19443
|
+
* $scope.blood_1 = $scope.blood_1 - 3;
|
19444
|
+
* $scope.blood_2 = $scope.blood_2 - 4;
|
19445
|
+
* } else {
|
19446
|
+
* $scope.stopFight();
|
19447
|
+
* }
|
19448
|
+
* }, 100);
|
19449
|
+
* };
|
19398
19450
|
*
|
19399
|
-
*
|
19400
|
-
*
|
19401
|
-
*
|
19402
|
-
*
|
19403
|
-
*
|
19404
|
-
*
|
19451
|
+
* $scope.stopFight = function() {
|
19452
|
+
* if (angular.isDefined(stop)) {
|
19453
|
+
* $interval.cancel(stop);
|
19454
|
+
* stop = undefined;
|
19455
|
+
* }
|
19456
|
+
* };
|
19405
19457
|
*
|
19406
|
-
*
|
19407
|
-
*
|
19408
|
-
*
|
19409
|
-
*
|
19458
|
+
* $scope.resetFight = function() {
|
19459
|
+
* $scope.blood_1 = 100;
|
19460
|
+
* $scope.blood_2 = 120;
|
19461
|
+
* };
|
19410
19462
|
*
|
19411
|
-
*
|
19412
|
-
*
|
19413
|
-
*
|
19414
|
-
*
|
19415
|
-
*
|
19463
|
+
* $scope.$on('$destroy', function() {
|
19464
|
+
* // Make sure that the interval is destroyed too
|
19465
|
+
* $scope.stopFight();
|
19466
|
+
* });
|
19467
|
+
* }])
|
19416
19468
|
* // Register the 'myCurrentTime' directive factory method.
|
19417
19469
|
* // We inject $interval and dateFilter service since the factory method is DI.
|
19418
19470
|
* .directive('myCurrentTime', ['$interval', 'dateFilter',
|
@@ -19655,6 +19707,10 @@ function stripHash(url) {
|
|
19655
19707
|
return index == -1 ? url : url.substr(0, index);
|
19656
19708
|
}
|
19657
19709
|
|
19710
|
+
function trimEmptyHash(url) {
|
19711
|
+
return url.replace(/(#.+)|#$/, '$1');
|
19712
|
+
}
|
19713
|
+
|
19658
19714
|
|
19659
19715
|
function stripFile(url) {
|
19660
19716
|
return url.substr(0, stripHash(url).lastIndexOf('/') + 1);
|
@@ -19766,16 +19822,25 @@ function LocationHashbangUrl(appBase, hashPrefix) {
|
|
19766
19822
|
*/
|
19767
19823
|
this.$$parse = function(url) {
|
19768
19824
|
var withoutBaseUrl = beginsWith(appBase, url) || beginsWith(appBaseNoFile, url);
|
19769
|
-
var withoutHashUrl
|
19770
|
-
|
19771
|
-
|
19772
|
-
? withoutBaseUrl
|
19773
|
-
: '';
|
19825
|
+
var withoutHashUrl;
|
19826
|
+
|
19827
|
+
if (withoutBaseUrl.charAt(0) === '#') {
|
19774
19828
|
|
19775
|
-
|
19776
|
-
|
19777
|
-
|
19829
|
+
// The rest of the url starts with a hash so we have
|
19830
|
+
// got either a hashbang path or a plain hash fragment
|
19831
|
+
withoutHashUrl = beginsWith(hashPrefix, withoutBaseUrl);
|
19832
|
+
if (isUndefined(withoutHashUrl)) {
|
19833
|
+
// There was no hashbang prefix so we just have a hash fragment
|
19834
|
+
withoutHashUrl = withoutBaseUrl;
|
19835
|
+
}
|
19836
|
+
|
19837
|
+
} else {
|
19838
|
+
// There was no hashbang path nor hash fragment:
|
19839
|
+
// If we are in HTML5 mode we use what is left as the path;
|
19840
|
+
// Otherwise we ignore what is left
|
19841
|
+
withoutHashUrl = this.$$html5 ? withoutBaseUrl : '';
|
19778
19842
|
}
|
19843
|
+
|
19779
19844
|
parseAppUrl(withoutHashUrl, this);
|
19780
19845
|
|
19781
19846
|
this.$$path = removeWindowsDriveName(this.$$path, withoutHashUrl, appBase);
|
@@ -20138,7 +20203,7 @@ var locationPrototype = {
|
|
20138
20203
|
*
|
20139
20204
|
*
|
20140
20205
|
* ```js
|
20141
|
-
* // given url http://example.com
|
20206
|
+
* // given url http://example.com/#/some/path?foo=bar&baz=xoxo#hashValue
|
20142
20207
|
* var hash = $location.hash();
|
20143
20208
|
* // => "hashValue"
|
20144
20209
|
* ```
|
@@ -20490,10 +20555,11 @@ function $LocationProvider() {
|
|
20490
20555
|
|
20491
20556
|
// update browser
|
20492
20557
|
$rootScope.$watch(function $locationWatch() {
|
20493
|
-
var oldUrl = $browser.url();
|
20558
|
+
var oldUrl = trimEmptyHash($browser.url());
|
20559
|
+
var newUrl = trimEmptyHash($location.absUrl());
|
20494
20560
|
var oldState = $browser.state();
|
20495
20561
|
var currentReplace = $location.$$replace;
|
20496
|
-
var urlOrStateChanged = oldUrl !==
|
20562
|
+
var urlOrStateChanged = oldUrl !== newUrl ||
|
20497
20563
|
($location.$$html5 && $sniffer.history && oldState !== $location.$$state);
|
20498
20564
|
|
20499
20565
|
if (initializing || urlOrStateChanged) {
|
@@ -21296,8 +21362,8 @@ Parser.prototype = {
|
|
21296
21362
|
logicalAND: function() {
|
21297
21363
|
var left = this.equality();
|
21298
21364
|
var token;
|
21299
|
-
|
21300
|
-
left = this.binaryFn(left, token.text, this.
|
21365
|
+
while ((token = this.expect('&&'))) {
|
21366
|
+
left = this.binaryFn(left, token.text, this.equality(), true);
|
21301
21367
|
}
|
21302
21368
|
return left;
|
21303
21369
|
},
|
@@ -21305,8 +21371,8 @@ Parser.prototype = {
|
|
21305
21371
|
equality: function() {
|
21306
21372
|
var left = this.relational();
|
21307
21373
|
var token;
|
21308
|
-
|
21309
|
-
left = this.binaryFn(left, token.text, this.
|
21374
|
+
while ((token = this.expect('==','!=','===','!=='))) {
|
21375
|
+
left = this.binaryFn(left, token.text, this.relational());
|
21310
21376
|
}
|
21311
21377
|
return left;
|
21312
21378
|
},
|
@@ -21314,8 +21380,8 @@ Parser.prototype = {
|
|
21314
21380
|
relational: function() {
|
21315
21381
|
var left = this.additive();
|
21316
21382
|
var token;
|
21317
|
-
|
21318
|
-
left = this.binaryFn(left, token.text, this.
|
21383
|
+
while ((token = this.expect('<', '>', '<=', '>='))) {
|
21384
|
+
left = this.binaryFn(left, token.text, this.additive());
|
21319
21385
|
}
|
21320
21386
|
return left;
|
21321
21387
|
},
|
@@ -21407,7 +21473,7 @@ Parser.prototype = {
|
|
21407
21473
|
var args = argsFn.length ? [] : null;
|
21408
21474
|
|
21409
21475
|
return function $parseFunctionCall(scope, locals) {
|
21410
|
-
var context = contextGetter ? contextGetter(scope, locals) : scope;
|
21476
|
+
var context = contextGetter ? contextGetter(scope, locals) : isDefined(contextGetter) ? undefined : scope;
|
21411
21477
|
var fn = fnGetter(scope, locals, context) || noop;
|
21412
21478
|
|
21413
21479
|
if (args) {
|
@@ -21420,13 +21486,13 @@ Parser.prototype = {
|
|
21420
21486
|
ensureSafeObject(context, expressionText);
|
21421
21487
|
ensureSafeFunction(fn, expressionText);
|
21422
21488
|
|
21423
|
-
// IE
|
21489
|
+
// IE doesn't have apply for some native functions
|
21424
21490
|
var v = fn.apply
|
21425
21491
|
? fn.apply(context, args)
|
21426
21492
|
: fn(args[0], args[1], args[2], args[3], args[4]);
|
21427
21493
|
|
21428
21494
|
return ensureSafeObject(v, expressionText);
|
21429
|
-
|
21495
|
+
};
|
21430
21496
|
},
|
21431
21497
|
|
21432
21498
|
// This is used with json array declaration
|
@@ -25062,7 +25128,9 @@ function $SnifferProvider() {
|
|
25062
25128
|
// IE9 implements 'input' event it's so fubared that we rather pretend that it doesn't have
|
25063
25129
|
// it. In particular the event is not fired when backspace or delete key are pressed or
|
25064
25130
|
// when cut operation is performed.
|
25065
|
-
|
25131
|
+
// IE10+ implements 'input' event but it erroneously fires under various situations,
|
25132
|
+
// e.g. when placeholder changes, or a form is focused.
|
25133
|
+
if (event === 'input' && msie <= 11) return false;
|
25066
25134
|
|
25067
25135
|
if (isUndefined(eventSupport[event])) {
|
25068
25136
|
var divElm = document.createElement('div');
|
@@ -25108,14 +25176,9 @@ function $TemplateRequestProvider() {
|
|
25108
25176
|
var transformResponse = $http.defaults && $http.defaults.transformResponse;
|
25109
25177
|
|
25110
25178
|
if (isArray(transformResponse)) {
|
25111
|
-
|
25112
|
-
|
25113
|
-
|
25114
|
-
var transformer = original[i];
|
25115
|
-
if (transformer !== defaultHttpResponseTransform) {
|
25116
|
-
transformResponse.push(transformer);
|
25117
|
-
}
|
25118
|
-
}
|
25179
|
+
transformResponse = transformResponse.filter(function(transformer) {
|
25180
|
+
return transformer !== defaultHttpResponseTransform;
|
25181
|
+
});
|
25119
25182
|
} else if (transformResponse === defaultHttpResponseTransform) {
|
25120
25183
|
transformResponse = null;
|
25121
25184
|
}
|
@@ -25127,18 +25190,16 @@ function $TemplateRequestProvider() {
|
|
25127
25190
|
|
25128
25191
|
return $http.get(tpl, httpOptions)
|
25129
25192
|
.then(function(response) {
|
25130
|
-
var html = response.data;
|
25131
25193
|
self.totalPendingRequests--;
|
25132
|
-
|
25133
|
-
return html;
|
25194
|
+
return response.data;
|
25134
25195
|
}, handleError);
|
25135
25196
|
|
25136
|
-
function handleError() {
|
25197
|
+
function handleError(resp) {
|
25137
25198
|
self.totalPendingRequests--;
|
25138
25199
|
if (!ignoreRequestError) {
|
25139
25200
|
throw $compileMinErr('tpload', 'Failed to load template: {0}', tpl);
|
25140
25201
|
}
|
25141
|
-
return $q.reject();
|
25202
|
+
return $q.reject(resp);
|
25142
25203
|
}
|
25143
25204
|
}
|
25144
25205
|
|
@@ -25761,106 +25822,103 @@ function filterFilter() {
|
|
25761
25822
|
return function(array, expression, comparator) {
|
25762
25823
|
if (!isArray(array)) return array;
|
25763
25824
|
|
25764
|
-
var
|
25765
|
-
|
25825
|
+
var predicateFn;
|
25826
|
+
var matchAgainstAnyProp;
|
25766
25827
|
|
25767
|
-
predicates.check = function(value, index) {
|
25768
|
-
for (var j = 0; j < predicates.length; j++) {
|
25769
|
-
if (!predicates[j](value, index)) {
|
25770
|
-
return false;
|
25771
|
-
}
|
25772
|
-
}
|
25773
|
-
return true;
|
25774
|
-
};
|
25775
|
-
|
25776
|
-
if (comparatorType !== 'function') {
|
25777
|
-
if (comparatorType === 'boolean' && comparator) {
|
25778
|
-
comparator = function(obj, text) {
|
25779
|
-
return angular.equals(obj, text);
|
25780
|
-
};
|
25781
|
-
} else {
|
25782
|
-
comparator = function(obj, text) {
|
25783
|
-
if (obj && text && typeof obj === 'object' && typeof text === 'object') {
|
25784
|
-
for (var objKey in obj) {
|
25785
|
-
if (objKey.charAt(0) !== '$' && hasOwnProperty.call(obj, objKey) &&
|
25786
|
-
comparator(obj[objKey], text[objKey])) {
|
25787
|
-
return true;
|
25788
|
-
}
|
25789
|
-
}
|
25790
|
-
return false;
|
25791
|
-
}
|
25792
|
-
text = ('' + text).toLowerCase();
|
25793
|
-
return ('' + obj).toLowerCase().indexOf(text) > -1;
|
25794
|
-
};
|
25795
|
-
}
|
25796
|
-
}
|
25797
|
-
|
25798
|
-
var search = function(obj, text) {
|
25799
|
-
if (typeof text === 'string' && text.charAt(0) === '!') {
|
25800
|
-
return !search(obj, text.substr(1));
|
25801
|
-
}
|
25802
|
-
switch (typeof obj) {
|
25803
|
-
case 'boolean':
|
25804
|
-
case 'number':
|
25805
|
-
case 'string':
|
25806
|
-
return comparator(obj, text);
|
25807
|
-
case 'object':
|
25808
|
-
switch (typeof text) {
|
25809
|
-
case 'object':
|
25810
|
-
return comparator(obj, text);
|
25811
|
-
default:
|
25812
|
-
for (var objKey in obj) {
|
25813
|
-
if (objKey.charAt(0) !== '$' && search(obj[objKey], text)) {
|
25814
|
-
return true;
|
25815
|
-
}
|
25816
|
-
}
|
25817
|
-
break;
|
25818
|
-
}
|
25819
|
-
return false;
|
25820
|
-
case 'array':
|
25821
|
-
for (var i = 0; i < obj.length; i++) {
|
25822
|
-
if (search(obj[i], text)) {
|
25823
|
-
return true;
|
25824
|
-
}
|
25825
|
-
}
|
25826
|
-
return false;
|
25827
|
-
default:
|
25828
|
-
return false;
|
25829
|
-
}
|
25830
|
-
};
|
25831
25828
|
switch (typeof expression) {
|
25829
|
+
case 'function':
|
25830
|
+
predicateFn = expression;
|
25831
|
+
break;
|
25832
25832
|
case 'boolean':
|
25833
25833
|
case 'number':
|
25834
25834
|
case 'string':
|
25835
|
-
|
25836
|
-
|
25837
|
-
// jshint -W086
|
25835
|
+
matchAgainstAnyProp = true;
|
25836
|
+
//jshint -W086
|
25838
25837
|
case 'object':
|
25839
|
-
//
|
25840
|
-
|
25841
|
-
(function(path) {
|
25842
|
-
if (typeof expression[path] === 'undefined') return;
|
25843
|
-
predicates.push(function(value) {
|
25844
|
-
return search(path == '$' ? value : (value && value[path]), expression[path]);
|
25845
|
-
});
|
25846
|
-
})(key);
|
25847
|
-
}
|
25848
|
-
break;
|
25849
|
-
case 'function':
|
25850
|
-
predicates.push(expression);
|
25838
|
+
//jshint +W086
|
25839
|
+
predicateFn = createPredicateFn(expression, comparator, matchAgainstAnyProp);
|
25851
25840
|
break;
|
25852
25841
|
default:
|
25853
25842
|
return array;
|
25854
25843
|
}
|
25855
|
-
|
25856
|
-
|
25857
|
-
|
25858
|
-
|
25859
|
-
|
25844
|
+
|
25845
|
+
return array.filter(predicateFn);
|
25846
|
+
};
|
25847
|
+
}
|
25848
|
+
|
25849
|
+
// Helper functions for `filterFilter`
|
25850
|
+
function createPredicateFn(expression, comparator, matchAgainstAnyProp) {
|
25851
|
+
var predicateFn;
|
25852
|
+
|
25853
|
+
if (comparator === true) {
|
25854
|
+
comparator = equals;
|
25855
|
+
} else if (!isFunction(comparator)) {
|
25856
|
+
comparator = function(actual, expected) {
|
25857
|
+
if (isObject(actual) || isObject(expected)) {
|
25858
|
+
// Prevent an object to be considered equal to a string like `'[object'`
|
25859
|
+
return false;
|
25860
25860
|
}
|
25861
|
-
|
25862
|
-
|
25861
|
+
|
25862
|
+
actual = lowercase('' + actual);
|
25863
|
+
expected = lowercase('' + expected);
|
25864
|
+
return actual.indexOf(expected) !== -1;
|
25865
|
+
};
|
25866
|
+
}
|
25867
|
+
|
25868
|
+
predicateFn = function(item) {
|
25869
|
+
return deepCompare(item, expression, comparator, matchAgainstAnyProp);
|
25863
25870
|
};
|
25871
|
+
|
25872
|
+
return predicateFn;
|
25873
|
+
}
|
25874
|
+
|
25875
|
+
function deepCompare(actual, expected, comparator, matchAgainstAnyProp) {
|
25876
|
+
var actualType = typeof actual;
|
25877
|
+
var expectedType = typeof expected;
|
25878
|
+
|
25879
|
+
if ((expectedType === 'string') && (expected.charAt(0) === '!')) {
|
25880
|
+
return !deepCompare(actual, expected.substring(1), comparator, matchAgainstAnyProp);
|
25881
|
+
} else if (actualType === 'array') {
|
25882
|
+
// In case `actual` is an array, consider it a match
|
25883
|
+
// if ANY of it's items matches `expected`
|
25884
|
+
return actual.some(function(item) {
|
25885
|
+
return deepCompare(item, expected, comparator, matchAgainstAnyProp);
|
25886
|
+
});
|
25887
|
+
}
|
25888
|
+
|
25889
|
+
switch (actualType) {
|
25890
|
+
case 'object':
|
25891
|
+
var key;
|
25892
|
+
if (matchAgainstAnyProp) {
|
25893
|
+
for (key in actual) {
|
25894
|
+
if ((key.charAt(0) !== '$') && deepCompare(actual[key], expected, comparator)) {
|
25895
|
+
return true;
|
25896
|
+
}
|
25897
|
+
}
|
25898
|
+
return false;
|
25899
|
+
} else if (expectedType === 'object') {
|
25900
|
+
for (key in expected) {
|
25901
|
+
var expectedVal = expected[key];
|
25902
|
+
if (isFunction(expectedVal)) {
|
25903
|
+
continue;
|
25904
|
+
}
|
25905
|
+
|
25906
|
+
var keyIsDollar = key === '$';
|
25907
|
+
var actualVal = keyIsDollar ? actual : actual[key];
|
25908
|
+
if (!deepCompare(actualVal, expectedVal, comparator, keyIsDollar)) {
|
25909
|
+
return false;
|
25910
|
+
}
|
25911
|
+
}
|
25912
|
+
return true;
|
25913
|
+
} else {
|
25914
|
+
return comparator(actual, expected);
|
25915
|
+
}
|
25916
|
+
break;
|
25917
|
+
case 'function':
|
25918
|
+
return false;
|
25919
|
+
default:
|
25920
|
+
return comparator(actual, expected);
|
25921
|
+
}
|
25864
25922
|
}
|
25865
25923
|
|
25866
25924
|
/**
|
@@ -26013,7 +26071,6 @@ function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {
|
|
26013
26071
|
if (numStr.indexOf('e') !== -1) {
|
26014
26072
|
var match = numStr.match(/([\d\.]+)e(-?)(\d+)/);
|
26015
26073
|
if (match && match[2] == '-' && match[3] > fractionSize + 1) {
|
26016
|
-
numStr = '0';
|
26017
26074
|
number = 0;
|
26018
26075
|
} else {
|
26019
26076
|
formatedText = numStr;
|
@@ -26034,10 +26091,6 @@ function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {
|
|
26034
26091
|
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round
|
26035
26092
|
number = +(Math.round(+(number.toString() + 'e' + fractionSize)).toString() + 'e' + -fractionSize);
|
26036
26093
|
|
26037
|
-
if (number === 0) {
|
26038
|
-
isNegative = false;
|
26039
|
-
}
|
26040
|
-
|
26041
26094
|
var fraction = ('' + number).split(DECIMAL_SEP);
|
26042
26095
|
var whole = fraction[0];
|
26043
26096
|
fraction = fraction[1] || '';
|
@@ -26070,12 +26123,16 @@ function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {
|
|
26070
26123
|
|
26071
26124
|
if (fractionSize && fractionSize !== "0") formatedText += decimalSep + fraction.substr(0, fractionSize);
|
26072
26125
|
} else {
|
26073
|
-
|
26074
|
-
if (fractionSize > 0 && number > -1 && number < 1) {
|
26126
|
+
if (fractionSize > 0 && number < 1) {
|
26075
26127
|
formatedText = number.toFixed(fractionSize);
|
26128
|
+
number = parseFloat(formatedText);
|
26076
26129
|
}
|
26077
26130
|
}
|
26078
26131
|
|
26132
|
+
if (number === 0) {
|
26133
|
+
isNegative = false;
|
26134
|
+
}
|
26135
|
+
|
26079
26136
|
parts.push(isNegative ? pattern.negPre : pattern.posPre,
|
26080
26137
|
formatedText,
|
26081
26138
|
isNegative ? pattern.negSuf : pattern.posSuf);
|
@@ -26365,25 +26422,31 @@ function dateFilter($locale) {
|
|
26365
26422
|
* the binding is automatically converted to JSON.
|
26366
26423
|
*
|
26367
26424
|
* @param {*} object Any JavaScript object (including arrays and primitive types) to filter.
|
26425
|
+
* @param {number=} spacing The number of spaces to use per indentation, defaults to 2.
|
26368
26426
|
* @returns {string} JSON string.
|
26369
26427
|
*
|
26370
26428
|
*
|
26371
26429
|
* @example
|
26372
26430
|
<example>
|
26373
26431
|
<file name="index.html">
|
26374
|
-
<pre>{{ {'name':'value'} | json }}</pre>
|
26432
|
+
<pre id="default-spacing">{{ {'name':'value'} | json }}</pre>
|
26433
|
+
<pre id="custom-spacing">{{ {'name':'value'} | json:4 }}</pre>
|
26375
26434
|
</file>
|
26376
26435
|
<file name="protractor.js" type="protractor">
|
26377
26436
|
it('should jsonify filtered objects', function() {
|
26378
|
-
expect(element(by.
|
26437
|
+
expect(element(by.id('default-spacing')).getText()).toMatch(/\{\n "name": ?"value"\n}/);
|
26438
|
+
expect(element(by.id('custom-spacing')).getText()).toMatch(/\{\n "name": ?"value"\n}/);
|
26379
26439
|
});
|
26380
26440
|
</file>
|
26381
26441
|
</example>
|
26382
26442
|
*
|
26383
26443
|
*/
|
26384
26444
|
function jsonFilter() {
|
26385
|
-
return function(object) {
|
26386
|
-
|
26445
|
+
return function(object, spacing) {
|
26446
|
+
if (isUndefined(spacing)) {
|
26447
|
+
spacing = 2;
|
26448
|
+
}
|
26449
|
+
return toJson(object, spacing);
|
26387
26450
|
};
|
26388
26451
|
}
|
26389
26452
|
|
@@ -26703,12 +26766,29 @@ function orderByFilter($parse) {
|
|
26703
26766
|
function compare(v1, v2) {
|
26704
26767
|
var t1 = typeof v1;
|
26705
26768
|
var t2 = typeof v2;
|
26706
|
-
|
26707
|
-
|
26708
|
-
|
26709
|
-
|
26710
|
-
|
26711
|
-
|
26769
|
+
// Prepare values for Abstract Relational Comparison
|
26770
|
+
// (http://www.ecma-international.org/ecma-262/5.1/#sec-11.8.5):
|
26771
|
+
// If the resulting values are identical, return 0 to prevent
|
26772
|
+
// incorrect re-ordering.
|
26773
|
+
if (t1 === t2 && t1 === "object") {
|
26774
|
+
// If types are both numbers, emulate abstract ToPrimitive() operation
|
26775
|
+
// in order to get primitive values suitable for comparison
|
26776
|
+
t1 = typeof (v1.valueOf ? v1 = v1.valueOf() : v1);
|
26777
|
+
t2 = typeof (v2.valueOf ? v2 = v2.valueOf() : v2);
|
26778
|
+
if (t1 === t2 && t1 === "object") {
|
26779
|
+
// Object.prototype.valueOf will return the original object, by
|
26780
|
+
// default. If we do not receive a primitive value, use ToString()
|
26781
|
+
// instead.
|
26782
|
+
t1 = typeof (v1.toString ? v1 = v1.toString() : v1);
|
26783
|
+
t2 = typeof (v2.toString ? v2 = v2.toString() : v2);
|
26784
|
+
|
26785
|
+
// If the end result of toString() for each item is the same, do not
|
26786
|
+
// perform relational comparison, and do not re-order objects.
|
26787
|
+
if (t1 === t2 && v1 === v2 || t1 === "object") return 0;
|
26788
|
+
}
|
26789
|
+
}
|
26790
|
+
if (t1 === t2) {
|
26791
|
+
if (t1 === "string") {
|
26712
26792
|
v1 = v1.toLowerCase();
|
26713
26793
|
v2 = v2.toLowerCase();
|
26714
26794
|
}
|
@@ -26774,9 +26854,8 @@ var htmlAnchorDirective = valueFn({
|
|
26774
26854
|
* make the link go to the wrong URL if the user clicks it before
|
26775
26855
|
* Angular has a chance to replace the `{{hash}}` markup with its
|
26776
26856
|
* value. Until Angular replaces the markup the link will be broken
|
26777
|
-
* and will most likely return a 404 error.
|
26778
|
-
*
|
26779
|
-
* The `ngHref` directive solves this problem.
|
26857
|
+
* and will most likely return a 404 error. The `ngHref` directive
|
26858
|
+
* solves this problem.
|
26780
26859
|
*
|
26781
26860
|
* The wrong way to write it:
|
26782
26861
|
* ```html
|
@@ -28658,7 +28737,6 @@ function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
|
|
28658
28737
|
}
|
28659
28738
|
|
28660
28739
|
function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) {
|
28661
|
-
var placeholder = element[0].placeholder, noevent = {};
|
28662
28740
|
var type = lowercase(element[0].type);
|
28663
28741
|
|
28664
28742
|
// In composition mode, users are still inputing intermediate text buffer,
|
@@ -28678,19 +28756,14 @@ function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) {
|
|
28678
28756
|
}
|
28679
28757
|
|
28680
28758
|
var listener = function(ev) {
|
28759
|
+
if (timeout) {
|
28760
|
+
$browser.defer.cancel(timeout);
|
28761
|
+
timeout = null;
|
28762
|
+
}
|
28681
28763
|
if (composing) return;
|
28682
28764
|
var value = element.val(),
|
28683
28765
|
event = ev && ev.type;
|
28684
28766
|
|
28685
|
-
// IE (11 and under) seem to emit an 'input' event if the placeholder value changes.
|
28686
|
-
// We don't want to dirty the value when this happens, so we abort here. Unfortunately,
|
28687
|
-
// IE also sends input events for other non-input-related things, (such as focusing on a
|
28688
|
-
// form control), so this change is not entirely enough to solve this.
|
28689
|
-
if (msie && (ev || noevent).type === 'input' && element[0].placeholder !== placeholder) {
|
28690
|
-
placeholder = element[0].placeholder;
|
28691
|
-
return;
|
28692
|
-
}
|
28693
|
-
|
28694
28767
|
// By default we will trim the value
|
28695
28768
|
// If the attribute ng-trim exists we will avoid trimming
|
28696
28769
|
// If input type is 'password', the value is never trimmed
|
@@ -28713,11 +28786,13 @@ function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) {
|
|
28713
28786
|
} else {
|
28714
28787
|
var timeout;
|
28715
28788
|
|
28716
|
-
var deferListener = function(ev) {
|
28789
|
+
var deferListener = function(ev, input, origValue) {
|
28717
28790
|
if (!timeout) {
|
28718
28791
|
timeout = $browser.defer(function() {
|
28719
|
-
listener(ev);
|
28720
28792
|
timeout = null;
|
28793
|
+
if (!input || input.value !== origValue) {
|
28794
|
+
listener(ev);
|
28795
|
+
}
|
28721
28796
|
});
|
28722
28797
|
}
|
28723
28798
|
};
|
@@ -28729,7 +28804,7 @@ function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) {
|
|
28729
28804
|
// command modifiers arrows
|
28730
28805
|
if (key === 91 || (15 < key && key < 19) || (37 <= key && key <= 40)) return;
|
28731
28806
|
|
28732
|
-
deferListener(event);
|
28807
|
+
deferListener(event, this, this.value);
|
28733
28808
|
});
|
28734
28809
|
|
28735
28810
|
// if user modifies input value using context menu in IE, we need "paste" and "cut" events to catch it
|
@@ -29904,11 +29979,15 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
|
|
29904
29979
|
var prevModelValue = ctrl.$modelValue;
|
29905
29980
|
var allowInvalid = ctrl.$options && ctrl.$options.allowInvalid;
|
29906
29981
|
ctrl.$$rawModelValue = modelValue;
|
29982
|
+
|
29907
29983
|
if (allowInvalid) {
|
29908
29984
|
ctrl.$modelValue = modelValue;
|
29909
29985
|
writeToModelIfNeeded();
|
29910
29986
|
}
|
29911
|
-
|
29987
|
+
|
29988
|
+
// Pass the $$lastCommittedViewValue here, because the cached viewValue might be out of date.
|
29989
|
+
// This can happen if e.g. $setViewValue is called from inside a parser
|
29990
|
+
ctrl.$$runValidators(parserValid, modelValue, ctrl.$$lastCommittedViewValue, function(allValid) {
|
29912
29991
|
if (!allowInvalid) {
|
29913
29992
|
// Note: Don't check ctrl.$valid here, as we could have
|
29914
29993
|
// external validators (e.g. calculated on the server),
|
@@ -34250,7 +34329,7 @@ var ngSwitchDefaultDirective = ngDirective({
|
|
34250
34329
|
}]);
|
34251
34330
|
</script>
|
34252
34331
|
<div ng-controller="ExampleController">
|
34253
|
-
<input ng-model="title"
|
34332
|
+
<input ng-model="title"> <br/>
|
34254
34333
|
<textarea ng-model="text"></textarea> <br/>
|
34255
34334
|
<pane title="{{title}}">{{text}}</pane>
|
34256
34335
|
</div>
|
@@ -34328,7 +34407,6 @@ var scriptDirective = ['$templateCache', function($templateCache) {
|
|
34328
34407
|
compile: function(element, attr) {
|
34329
34408
|
if (attr.type == 'text/ng-template') {
|
34330
34409
|
var templateUrl = attr.id,
|
34331
|
-
// IE is not consistent, in scripts we have to read .text but in other nodes we have to read .textContent
|
34332
34410
|
text = element[0].text;
|
34333
34411
|
|
34334
34412
|
$templateCache.put(templateUrl, text);
|
@@ -34379,9 +34457,9 @@ var ngOptionsMinErr = minErr('ngOptions');
|
|
34379
34457
|
* or property name (for object data sources) of the value within the collection. If a `track by` expression
|
34380
34458
|
* is used, the result of that expression will be set as the value of the `option` and `select` elements.
|
34381
34459
|
*
|
34382
|
-
* ### `select as` with `
|
34460
|
+
* ### `select as` with `track by`
|
34383
34461
|
*
|
34384
|
-
* Using `select as` together with `
|
34462
|
+
* Using `select as` together with `track by` is not recommended. Reasoning:
|
34385
34463
|
*
|
34386
34464
|
* - Example: <select ng-options="item.subItem as item.label for item in values track by item.id" ng-model="selected">
|
34387
34465
|
* values: [{id: 1, label: 'aLabel', subItem: {name: 'aSubItem'}}, {id: 2, label: 'bLabel', subItem: {name: 'bSubItem'}}],
|
@@ -34406,8 +34484,10 @@ var ngOptionsMinErr = minErr('ngOptions');
|
|
34406
34484
|
* * for array data sources:
|
34407
34485
|
* * `label` **`for`** `value` **`in`** `array`
|
34408
34486
|
* * `select` **`as`** `label` **`for`** `value` **`in`** `array`
|
34409
|
-
* * `label`
|
34410
|
-
* * `
|
34487
|
+
* * `label` **`group by`** `group` **`for`** `value` **`in`** `array`
|
34488
|
+
* * `label` **`group by`** `group` **`for`** `value` **`in`** `array` **`track by`** `trackexpr`
|
34489
|
+
* * `label` **`for`** `value` **`in`** `array` | orderBy:`orderexpr` **`track by`** `trackexpr`
|
34490
|
+
* (for including a filter with `track by`)
|
34411
34491
|
* * for object data sources:
|
34412
34492
|
* * `label` **`for (`**`key` **`,`** `value`**`) in`** `object`
|
34413
34493
|
* * `select` **`as`** `label` **`for (`**`key` **`,`** `value`**`) in`** `object`
|
@@ -34549,7 +34629,7 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) {
|
|
34549
34629
|
self.removeOption = function(value) {
|
34550
34630
|
if (this.hasOption(value)) {
|
34551
34631
|
delete optionsMap[value];
|
34552
|
-
if (ngModelCtrl.$viewValue
|
34632
|
+
if (ngModelCtrl.$viewValue === value) {
|
34553
34633
|
this.renderUnknownOption(value);
|
34554
34634
|
}
|
34555
34635
|
}
|
@@ -35016,18 +35096,23 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) {
|
|
35016
35096
|
updateLabelMap(labelMap, option.label, false);
|
35017
35097
|
option.element.remove();
|
35018
35098
|
}
|
35019
|
-
forEach(labelMap, function(count, label) {
|
35020
|
-
if (count > 0) {
|
35021
|
-
selectCtrl.addOption(label);
|
35022
|
-
} else if (count < 0) {
|
35023
|
-
selectCtrl.removeOption(label);
|
35024
|
-
}
|
35025
|
-
});
|
35026
35099
|
}
|
35027
35100
|
// remove any excessive OPTGROUPs from select
|
35028
35101
|
while (optionGroupsCache.length > groupIndex) {
|
35029
|
-
|
35102
|
+
// remove all the labels in the option group
|
35103
|
+
optionGroup = optionGroupsCache.pop();
|
35104
|
+
for (index = 1; index < optionGroup.length; ++index) {
|
35105
|
+
updateLabelMap(labelMap, optionGroup[index].label, false);
|
35106
|
+
}
|
35107
|
+
optionGroup[0].element.remove();
|
35030
35108
|
}
|
35109
|
+
forEach(labelMap, function(count, label) {
|
35110
|
+
if (count > 0) {
|
35111
|
+
selectCtrl.addOption(label);
|
35112
|
+
} else if (count < 0) {
|
35113
|
+
selectCtrl.removeOption(label);
|
35114
|
+
}
|
35115
|
+
});
|
35031
35116
|
}
|
35032
35117
|
}
|
35033
35118
|
}
|
@@ -36688,7 +36773,7 @@ angular.scenario.dsl('binding', function() {
|
|
36688
36773
|
*/
|
36689
36774
|
angular.scenario.dsl('input', function() {
|
36690
36775
|
var chain = {};
|
36691
|
-
var supportInputEvent =
|
36776
|
+
var supportInputEvent = 'oninput' in document.createElement('div') && !(msie && msie <= 11);
|
36692
36777
|
|
36693
36778
|
chain.enter = function(value, event) {
|
36694
36779
|
return this.addFutureAction("input '" + this.name + "' enter '" + value + "'",
|