angularjs-rails 1.3.15 → 1.4.0

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.
Files changed (29) hide show
  1. checksums.yaml +4 -4
  2. data/lib/angularjs-rails/version.rb +2 -2
  3. data/vendor/assets/javascripts/angular-animate.js +3443 -1872
  4. data/vendor/assets/javascripts/angular-aria.js +89 -75
  5. data/vendor/assets/javascripts/angular-cookies.js +255 -141
  6. data/vendor/assets/javascripts/angular-loader.js +41 -17
  7. data/vendor/assets/javascripts/angular-message-format.js +980 -0
  8. data/vendor/assets/javascripts/angular-messages.js +430 -153
  9. data/vendor/assets/javascripts/angular-mocks.js +76 -92
  10. data/vendor/assets/javascripts/angular-resource.js +6 -6
  11. data/vendor/assets/javascripts/angular-route.js +8 -6
  12. data/vendor/assets/javascripts/angular-sanitize.js +32 -28
  13. data/vendor/assets/javascripts/angular-scenario.js +4315 -2452
  14. data/vendor/assets/javascripts/angular-touch.js +26 -21
  15. data/vendor/assets/javascripts/angular.js +4314 -2490
  16. data/vendor/assets/javascripts/unstable/angular2.js +24024 -0
  17. metadata +4 -14
  18. data/vendor/assets/javascripts/unstable/angular-animate.js +0 -2137
  19. data/vendor/assets/javascripts/unstable/angular-aria.js +0 -364
  20. data/vendor/assets/javascripts/unstable/angular-cookies.js +0 -206
  21. data/vendor/assets/javascripts/unstable/angular-loader.js +0 -405
  22. data/vendor/assets/javascripts/unstable/angular-messages.js +0 -401
  23. data/vendor/assets/javascripts/unstable/angular-mocks.js +0 -2468
  24. data/vendor/assets/javascripts/unstable/angular-resource.js +0 -668
  25. data/vendor/assets/javascripts/unstable/angular-route.js +0 -989
  26. data/vendor/assets/javascripts/unstable/angular-sanitize.js +0 -679
  27. data/vendor/assets/javascripts/unstable/angular-scenario.js +0 -37678
  28. data/vendor/assets/javascripts/unstable/angular-touch.js +0 -622
  29. data/vendor/assets/javascripts/unstable/angular.js +0 -26309
@@ -1,405 +0,0 @@
1
- /**
2
- * @license AngularJS v1.3.15
3
- * (c) 2010-2014 Google, Inc. http://angularjs.org
4
- * License: MIT
5
- */
6
-
7
- (function() {'use strict';
8
-
9
- /**
10
- * @description
11
- *
12
- * This object provides a utility for producing rich Error messages within
13
- * Angular. It can be called as follows:
14
- *
15
- * var exampleMinErr = minErr('example');
16
- * throw exampleMinErr('one', 'This {0} is {1}', foo, bar);
17
- *
18
- * The above creates an instance of minErr in the example namespace. The
19
- * resulting error will have a namespaced error code of example.one. The
20
- * resulting error will replace {0} with the value of foo, and {1} with the
21
- * value of bar. The object is not restricted in the number of arguments it can
22
- * take.
23
- *
24
- * If fewer arguments are specified than necessary for interpolation, the extra
25
- * interpolation markers will be preserved in the final string.
26
- *
27
- * Since data will be parsed statically during a build step, some restrictions
28
- * are applied with respect to how minErr instances are created and called.
29
- * Instances should have names of the form namespaceMinErr for a minErr created
30
- * using minErr('namespace') . Error codes, namespaces and template strings
31
- * should all be static strings, not variables or general expressions.
32
- *
33
- * @param {string} module The namespace to use for the new minErr instance.
34
- * @param {function} ErrorConstructor Custom error constructor to be instantiated when returning
35
- * error from returned function, for cases when a particular type of error is useful.
36
- * @returns {function(code:string, template:string, ...templateArgs): Error} minErr instance
37
- */
38
-
39
- function minErr(module, ErrorConstructor) {
40
- ErrorConstructor = ErrorConstructor || Error;
41
- return function() {
42
- var code = arguments[0],
43
- prefix = '[' + (module ? module + ':' : '') + code + '] ',
44
- template = arguments[1],
45
- templateArgs = arguments,
46
-
47
- message, i;
48
-
49
- message = prefix + template.replace(/\{\d+\}/g, function(match) {
50
- var index = +match.slice(1, -1), arg;
51
-
52
- if (index + 2 < templateArgs.length) {
53
- return toDebugString(templateArgs[index + 2]);
54
- }
55
- return match;
56
- });
57
-
58
- message = message + '\nhttp://errors.angularjs.org/1.3.15/' +
59
- (module ? module + '/' : '') + code;
60
- for (i = 2; i < arguments.length; i++) {
61
- message = message + (i == 2 ? '?' : '&') + 'p' + (i - 2) + '=' +
62
- encodeURIComponent(toDebugString(arguments[i]));
63
- }
64
- return new ErrorConstructor(message);
65
- };
66
- }
67
-
68
- /**
69
- * @ngdoc type
70
- * @name angular.Module
71
- * @module ng
72
- * @description
73
- *
74
- * Interface for configuring angular {@link angular.module modules}.
75
- */
76
-
77
- function setupModuleLoader(window) {
78
-
79
- var $injectorMinErr = minErr('$injector');
80
- var ngMinErr = minErr('ng');
81
-
82
- function ensure(obj, name, factory) {
83
- return obj[name] || (obj[name] = factory());
84
- }
85
-
86
- var angular = ensure(window, 'angular', Object);
87
-
88
- // We need to expose `angular.$$minErr` to modules such as `ngResource` that reference it during bootstrap
89
- angular.$$minErr = angular.$$minErr || minErr;
90
-
91
- return ensure(angular, 'module', function() {
92
- /** @type {Object.<string, angular.Module>} */
93
- var modules = {};
94
-
95
- /**
96
- * @ngdoc function
97
- * @name angular.module
98
- * @module ng
99
- * @description
100
- *
101
- * The `angular.module` is a global place for creating, registering and retrieving Angular
102
- * modules.
103
- * All modules (angular core or 3rd party) that should be available to an application must be
104
- * registered using this mechanism.
105
- *
106
- * When passed two or more arguments, a new module is created. If passed only one argument, an
107
- * existing module (the name passed as the first argument to `module`) is retrieved.
108
- *
109
- *
110
- * # Module
111
- *
112
- * A module is a collection of services, directives, controllers, filters, and configuration information.
113
- * `angular.module` is used to configure the {@link auto.$injector $injector}.
114
- *
115
- * ```js
116
- * // Create a new module
117
- * var myModule = angular.module('myModule', []);
118
- *
119
- * // register a new service
120
- * myModule.value('appName', 'MyCoolApp');
121
- *
122
- * // configure existing services inside initialization blocks.
123
- * myModule.config(['$locationProvider', function($locationProvider) {
124
- * // Configure existing providers
125
- * $locationProvider.hashPrefix('!');
126
- * }]);
127
- * ```
128
- *
129
- * Then you can create an injector and load your modules like this:
130
- *
131
- * ```js
132
- * var injector = angular.injector(['ng', 'myModule'])
133
- * ```
134
- *
135
- * However it's more likely that you'll just use
136
- * {@link ng.directive:ngApp ngApp} or
137
- * {@link angular.bootstrap} to simplify this process for you.
138
- *
139
- * @param {!string} name The name of the module to create or retrieve.
140
- * @param {!Array.<string>=} requires If specified then new module is being created. If
141
- * unspecified then the module is being retrieved for further configuration.
142
- * @param {Function=} configFn Optional configuration function for the module. Same as
143
- * {@link angular.Module#config Module#config()}.
144
- * @returns {module} new module with the {@link angular.Module} api.
145
- */
146
- return function module(name, requires, configFn) {
147
- var assertNotHasOwnProperty = function(name, context) {
148
- if (name === 'hasOwnProperty') {
149
- throw ngMinErr('badname', 'hasOwnProperty is not a valid {0} name', context);
150
- }
151
- };
152
-
153
- assertNotHasOwnProperty(name, 'module');
154
- if (requires && modules.hasOwnProperty(name)) {
155
- modules[name] = null;
156
- }
157
- return ensure(modules, name, function() {
158
- if (!requires) {
159
- throw $injectorMinErr('nomod', "Module '{0}' is not available! You either misspelled " +
160
- "the module name or forgot to load it. If registering a module ensure that you " +
161
- "specify the dependencies as the second argument.", name);
162
- }
163
-
164
- /** @type {!Array.<Array.<*>>} */
165
- var invokeQueue = [];
166
-
167
- /** @type {!Array.<Function>} */
168
- var configBlocks = [];
169
-
170
- /** @type {!Array.<Function>} */
171
- var runBlocks = [];
172
-
173
- var config = invokeLater('$injector', 'invoke', 'push', configBlocks);
174
-
175
- /** @type {angular.Module} */
176
- var moduleInstance = {
177
- // Private state
178
- _invokeQueue: invokeQueue,
179
- _configBlocks: configBlocks,
180
- _runBlocks: runBlocks,
181
-
182
- /**
183
- * @ngdoc property
184
- * @name angular.Module#requires
185
- * @module ng
186
- *
187
- * @description
188
- * Holds the list of modules which the injector will load before the current module is
189
- * loaded.
190
- */
191
- requires: requires,
192
-
193
- /**
194
- * @ngdoc property
195
- * @name angular.Module#name
196
- * @module ng
197
- *
198
- * @description
199
- * Name of the module.
200
- */
201
- name: name,
202
-
203
-
204
- /**
205
- * @ngdoc method
206
- * @name angular.Module#provider
207
- * @module ng
208
- * @param {string} name service name
209
- * @param {Function} providerType Construction function for creating new instance of the
210
- * service.
211
- * @description
212
- * See {@link auto.$provide#provider $provide.provider()}.
213
- */
214
- provider: invokeLater('$provide', 'provider'),
215
-
216
- /**
217
- * @ngdoc method
218
- * @name angular.Module#factory
219
- * @module ng
220
- * @param {string} name service name
221
- * @param {Function} providerFunction Function for creating new instance of the service.
222
- * @description
223
- * See {@link auto.$provide#factory $provide.factory()}.
224
- */
225
- factory: invokeLater('$provide', 'factory'),
226
-
227
- /**
228
- * @ngdoc method
229
- * @name angular.Module#service
230
- * @module ng
231
- * @param {string} name service name
232
- * @param {Function} constructor A constructor function that will be instantiated.
233
- * @description
234
- * See {@link auto.$provide#service $provide.service()}.
235
- */
236
- service: invokeLater('$provide', 'service'),
237
-
238
- /**
239
- * @ngdoc method
240
- * @name angular.Module#value
241
- * @module ng
242
- * @param {string} name service name
243
- * @param {*} object Service instance object.
244
- * @description
245
- * See {@link auto.$provide#value $provide.value()}.
246
- */
247
- value: invokeLater('$provide', 'value'),
248
-
249
- /**
250
- * @ngdoc method
251
- * @name angular.Module#constant
252
- * @module ng
253
- * @param {string} name constant name
254
- * @param {*} object Constant value.
255
- * @description
256
- * Because the constant are fixed, they get applied before other provide methods.
257
- * See {@link auto.$provide#constant $provide.constant()}.
258
- */
259
- constant: invokeLater('$provide', 'constant', 'unshift'),
260
-
261
- /**
262
- * @ngdoc method
263
- * @name angular.Module#animation
264
- * @module ng
265
- * @param {string} name animation name
266
- * @param {Function} animationFactory Factory function for creating new instance of an
267
- * animation.
268
- * @description
269
- *
270
- * **NOTE**: animations take effect only if the **ngAnimate** module is loaded.
271
- *
272
- *
273
- * Defines an animation hook that can be later used with
274
- * {@link ngAnimate.$animate $animate} service and directives that use this service.
275
- *
276
- * ```js
277
- * module.animation('.animation-name', function($inject1, $inject2) {
278
- * return {
279
- * eventName : function(element, done) {
280
- * //code to run the animation
281
- * //once complete, then run done()
282
- * return function cancellationFunction(element) {
283
- * //code to cancel the animation
284
- * }
285
- * }
286
- * }
287
- * })
288
- * ```
289
- *
290
- * See {@link ng.$animateProvider#register $animateProvider.register()} and
291
- * {@link ngAnimate ngAnimate module} for more information.
292
- */
293
- animation: invokeLater('$animateProvider', 'register'),
294
-
295
- /**
296
- * @ngdoc method
297
- * @name angular.Module#filter
298
- * @module ng
299
- * @param {string} name Filter name.
300
- * @param {Function} filterFactory Factory function for creating new instance of filter.
301
- * @description
302
- * See {@link ng.$filterProvider#register $filterProvider.register()}.
303
- */
304
- filter: invokeLater('$filterProvider', 'register'),
305
-
306
- /**
307
- * @ngdoc method
308
- * @name angular.Module#controller
309
- * @module ng
310
- * @param {string|Object} name Controller name, or an object map of controllers where the
311
- * keys are the names and the values are the constructors.
312
- * @param {Function} constructor Controller constructor function.
313
- * @description
314
- * See {@link ng.$controllerProvider#register $controllerProvider.register()}.
315
- */
316
- controller: invokeLater('$controllerProvider', 'register'),
317
-
318
- /**
319
- * @ngdoc method
320
- * @name angular.Module#directive
321
- * @module ng
322
- * @param {string|Object} name Directive name, or an object map of directives where the
323
- * keys are the names and the values are the factories.
324
- * @param {Function} directiveFactory Factory function for creating new instance of
325
- * directives.
326
- * @description
327
- * See {@link ng.$compileProvider#directive $compileProvider.directive()}.
328
- */
329
- directive: invokeLater('$compileProvider', 'directive'),
330
-
331
- /**
332
- * @ngdoc method
333
- * @name angular.Module#config
334
- * @module ng
335
- * @param {Function} configFn Execute this function on module load. Useful for service
336
- * configuration.
337
- * @description
338
- * Use this method to register work which needs to be performed on module loading.
339
- * For more about how to configure services, see
340
- * {@link providers#provider-recipe Provider Recipe}.
341
- */
342
- config: config,
343
-
344
- /**
345
- * @ngdoc method
346
- * @name angular.Module#run
347
- * @module ng
348
- * @param {Function} initializationFn Execute this function after injector creation.
349
- * Useful for application initialization.
350
- * @description
351
- * Use this method to register work which should be performed when the injector is done
352
- * loading all modules.
353
- */
354
- run: function(block) {
355
- runBlocks.push(block);
356
- return this;
357
- }
358
- };
359
-
360
- if (configFn) {
361
- config(configFn);
362
- }
363
-
364
- return moduleInstance;
365
-
366
- /**
367
- * @param {string} provider
368
- * @param {string} method
369
- * @param {String=} insertMethod
370
- * @returns {angular.Module}
371
- */
372
- function invokeLater(provider, method, insertMethod, queue) {
373
- if (!queue) queue = invokeQueue;
374
- return function() {
375
- queue[insertMethod || 'push']([provider, method, arguments]);
376
- return moduleInstance;
377
- };
378
- }
379
- });
380
- };
381
- });
382
-
383
- }
384
-
385
- setupModuleLoader(window);
386
- })(window);
387
-
388
- /**
389
- * Closure compiler type information
390
- *
391
- * @typedef { {
392
- * requires: !Array.<string>,
393
- * invokeQueue: !Array.<Array.<*>>,
394
- *
395
- * service: function(string, Function):angular.Module,
396
- * factory: function(string, Function):angular.Module,
397
- * value: function(string, *):angular.Module,
398
- *
399
- * filter: function(string, Function):angular.Module,
400
- *
401
- * init: function(Function):angular.Module
402
- * } }
403
- */
404
- angular.Module;
405
-
@@ -1,401 +0,0 @@
1
- /**
2
- * @license AngularJS v1.3.15
3
- * (c) 2010-2014 Google, Inc. http://angularjs.org
4
- * License: MIT
5
- */
6
- (function(window, angular, undefined) {'use strict';
7
-
8
- /**
9
- * @ngdoc module
10
- * @name ngMessages
11
- * @description
12
- *
13
- * The `ngMessages` module provides enhanced support for displaying messages within templates
14
- * (typically within forms or when rendering message objects that return key/value data).
15
- * Instead of relying on JavaScript code and/or complex ng-if statements within your form template to
16
- * show and hide error messages specific to the state of an input field, the `ngMessages` and
17
- * `ngMessage` directives are designed to handle the complexity, inheritance and priority
18
- * sequencing based on the order of how the messages are defined in the template.
19
- *
20
- * Currently, the ngMessages module only contains the code for the `ngMessages`
21
- * and `ngMessage` directives.
22
- *
23
- * # Usage
24
- * The `ngMessages` directive listens on a key/value collection which is set on the ngMessages attribute.
25
- * Since the {@link ngModel ngModel} directive exposes an `$error` object, this error object can be
26
- * used with `ngMessages` to display control error messages in an easier way than with just regular angular
27
- * template directives.
28
- *
29
- * ```html
30
- * <form name="myForm">
31
- * <input type="text" ng-model="field" name="myField" required minlength="5" />
32
- * <div ng-messages="myForm.myField.$error">
33
- * <div ng-message="required">You did not enter a field</div>
34
- * <div ng-message="minlength">The value entered is too short</div>
35
- * </div>
36
- * </form>
37
- * ```
38
- *
39
- * Now whatever key/value entries are present within the provided object (in this case `$error`) then
40
- * the ngMessages directive will render the inner first ngMessage directive (depending if the key values
41
- * match the attribute value present on each ngMessage directive). In other words, if your errors
42
- * object contains the following data:
43
- *
44
- * ```javascript
45
- * <!-- keep in mind that ngModel automatically sets these error flags -->
46
- * myField.$error = { minlength : true, required : false };
47
- * ```
48
- *
49
- * Then the `required` message will be displayed first. When required is false then the `minlength` message
50
- * will be displayed right after (since these messages are ordered this way in the template HTML code).
51
- * The prioritization of each message is determined by what order they're present in the DOM.
52
- * Therefore, instead of having custom JavaScript code determine the priority of what errors are
53
- * present before others, the presentation of the errors are handled within the template.
54
- *
55
- * By default, ngMessages will only display one error at a time. However, if you wish to display all
56
- * messages then the `ng-messages-multiple` attribute flag can be used on the element containing the
57
- * ngMessages directive to make this happen.
58
- *
59
- * ```html
60
- * <div ng-messages="myForm.myField.$error" ng-messages-multiple>...</div>
61
- * ```
62
- *
63
- * ## Reusing and Overriding Messages
64
- * In addition to prioritization, ngMessages also allows for including messages from a remote or an inline
65
- * template. This allows for generic collection of messages to be reused across multiple parts of an
66
- * application.
67
- *
68
- * ```html
69
- * <script type="text/ng-template" id="error-messages">
70
- * <div ng-message="required">This field is required</div>
71
- * <div ng-message="minlength">This field is too short</div>
72
- * </script>
73
- * <div ng-messages="myForm.myField.$error" ng-messages-include="error-messages"></div>
74
- * ```
75
- *
76
- * However, including generic messages may not be useful enough to match all input fields, therefore,
77
- * `ngMessages` provides the ability to override messages defined in the remote template by redefining
78
- * then within the directive container.
79
- *
80
- * ```html
81
- * <!-- a generic template of error messages known as "my-custom-messages" -->
82
- * <script type="text/ng-template" id="my-custom-messages">
83
- * <div ng-message="required">This field is required</div>
84
- * <div ng-message="minlength">This field is too short</div>
85
- * </script>
86
- *
87
- * <form name="myForm">
88
- * <input type="email"
89
- * id="email"
90
- * name="myEmail"
91
- * ng-model="email"
92
- * minlength="5"
93
- * required />
94
- *
95
- * <div ng-messages="myForm.myEmail.$error" ng-messages-include="my-custom-messages">
96
- * <!-- this required message has overridden the template message -->
97
- * <div ng-message="required">You did not enter your email address</div>
98
- *
99
- * <!-- this is a brand new message and will appear last in the prioritization -->
100
- * <div ng-message="email">Your email address is invalid</div>
101
- * </div>
102
- * </form>
103
- * ```
104
- *
105
- * In the example HTML code above the message that is set on required will override the corresponding
106
- * required message defined within the remote template. Therefore, with particular input fields (such
107
- * email addresses, date fields, autocomplete inputs, etc...), specialized error messages can be applied
108
- * while more generic messages can be used to handle other, more general input errors.
109
- *
110
- * ## Animations
111
- * If the `ngAnimate` module is active within the application then both the `ngMessages` and
112
- * `ngMessage` directives will trigger animations whenever any messages are added and removed
113
- * from the DOM by the `ngMessages` directive.
114
- *
115
- * Whenever the `ngMessages` directive contains one or more visible messages then the `.ng-active` CSS
116
- * class will be added to the element. The `.ng-inactive` CSS class will be applied when there are no
117
- * animations present. Therefore, CSS transitions and keyframes as well as JavaScript animations can
118
- * hook into the animations whenever these classes are added/removed.
119
- *
120
- * Let's say that our HTML code for our messages container looks like so:
121
- *
122
- * ```html
123
- * <div ng-messages="myMessages" class="my-messages">
124
- * <div ng-message="alert" class="some-message">...</div>
125
- * <div ng-message="fail" class="some-message">...</div>
126
- * </div>
127
- * ```
128
- *
129
- * Then the CSS animation code for the message container looks like so:
130
- *
131
- * ```css
132
- * .my-messages {
133
- * transition:1s linear all;
134
- * }
135
- * .my-messages.ng-active {
136
- * // messages are visible
137
- * }
138
- * .my-messages.ng-inactive {
139
- * // messages are hidden
140
- * }
141
- * ```
142
- *
143
- * Whenever an inner message is attached (becomes visible) or removed (becomes hidden) then the enter
144
- * and leave animation is triggered for each particular element bound to the `ngMessage` directive.
145
- *
146
- * Therefore, the CSS code for the inner messages looks like so:
147
- *
148
- * ```css
149
- * .some-message {
150
- * transition:1s linear all;
151
- * }
152
- *
153
- * .some-message.ng-enter {}
154
- * .some-message.ng-enter.ng-enter-active {}
155
- *
156
- * .some-message.ng-leave {}
157
- * .some-message.ng-leave.ng-leave-active {}
158
- * ```
159
- *
160
- * {@link ngAnimate Click here} to learn how to use JavaScript animations or to learn more about ngAnimate.
161
- */
162
- angular.module('ngMessages', [])
163
-
164
- /**
165
- * @ngdoc directive
166
- * @module ngMessages
167
- * @name ngMessages
168
- * @restrict AE
169
- *
170
- * @description
171
- * `ngMessages` is a directive that is designed to show and hide messages based on the state
172
- * of a key/value object that it listens on. The directive itself compliments error message
173
- * reporting with the `ngModel` $error object (which stores a key/value state of validation errors).
174
- *
175
- * `ngMessages` manages the state of internal messages within its container element. The internal
176
- * messages use the `ngMessage` directive and will be inserted/removed from the page depending
177
- * on if they're present within the key/value object. By default, only one message will be displayed
178
- * at a time and this depends on the prioritization of the messages within the template. (This can
179
- * be changed by using the ng-messages-multiple on the directive container.)
180
- *
181
- * A remote template can also be used to promote message reusability and messages can also be
182
- * overridden.
183
- *
184
- * {@link module:ngMessages Click here} to learn more about `ngMessages` and `ngMessage`.
185
- *
186
- * @usage
187
- * ```html
188
- * <!-- using attribute directives -->
189
- * <ANY ng-messages="expression">
190
- * <ANY ng-message="keyValue1">...</ANY>
191
- * <ANY ng-message="keyValue2">...</ANY>
192
- * <ANY ng-message="keyValue3">...</ANY>
193
- * </ANY>
194
- *
195
- * <!-- or by using element directives -->
196
- * <ng-messages for="expression">
197
- * <ng-message when="keyValue1">...</ng-message>
198
- * <ng-message when="keyValue2">...</ng-message>
199
- * <ng-message when="keyValue3">...</ng-message>
200
- * </ng-messages>
201
- * ```
202
- *
203
- * @param {string} ngMessages an angular expression evaluating to a key/value object
204
- * (this is typically the $error object on an ngModel instance).
205
- * @param {string=} ngMessagesMultiple|multiple when set, all messages will be displayed with true
206
- * @param {string=} ngMessagesInclude|include when set, the specified template will be included into the ng-messages container
207
- *
208
- * @example
209
- * <example name="ngMessages-directive" module="ngMessagesExample"
210
- * deps="angular-messages.js"
211
- * animations="true" fixBase="true">
212
- * <file name="index.html">
213
- * <form name="myForm">
214
- * <label>Enter your name:</label>
215
- * <input type="text"
216
- * name="myName"
217
- * ng-model="name"
218
- * ng-minlength="5"
219
- * ng-maxlength="20"
220
- * required />
221
- *
222
- * <pre>myForm.myName.$error = {{ myForm.myName.$error | json }}</pre>
223
- *
224
- * <div ng-messages="myForm.myName.$error" style="color:maroon">
225
- * <div ng-message="required">You did not enter a field</div>
226
- * <div ng-message="minlength">Your field is too short</div>
227
- * <div ng-message="maxlength">Your field is too long</div>
228
- * </div>
229
- * </form>
230
- * </file>
231
- * <file name="script.js">
232
- * angular.module('ngMessagesExample', ['ngMessages']);
233
- * </file>
234
- * </example>
235
- */
236
- .directive('ngMessages', ['$compile', '$animate', '$templateRequest',
237
- function($compile, $animate, $templateRequest) {
238
- var ACTIVE_CLASS = 'ng-active';
239
- var INACTIVE_CLASS = 'ng-inactive';
240
-
241
- return {
242
- restrict: 'AE',
243
- controller: function() {
244
- this.$renderNgMessageClasses = angular.noop;
245
-
246
- var messages = [];
247
- this.registerMessage = function(index, message) {
248
- for (var i = 0; i < messages.length; i++) {
249
- if (messages[i].type == message.type) {
250
- if (index != i) {
251
- var temp = messages[index];
252
- messages[index] = messages[i];
253
- if (index < messages.length) {
254
- messages[i] = temp;
255
- } else {
256
- messages.splice(0, i); //remove the old one (and shift left)
257
- }
258
- }
259
- return;
260
- }
261
- }
262
- messages.splice(index, 0, message); //add the new one (and shift right)
263
- };
264
-
265
- this.renderMessages = function(values, multiple) {
266
- values = values || {};
267
-
268
- var found;
269
- angular.forEach(messages, function(message) {
270
- if ((!found || multiple) && truthyVal(values[message.type])) {
271
- message.attach();
272
- found = true;
273
- } else {
274
- message.detach();
275
- }
276
- });
277
-
278
- this.renderElementClasses(found);
279
-
280
- function truthyVal(value) {
281
- return value !== null && value !== false && value;
282
- }
283
- };
284
- },
285
- require: 'ngMessages',
286
- link: function($scope, element, $attrs, ctrl) {
287
- ctrl.renderElementClasses = function(bool) {
288
- bool ? $animate.setClass(element, ACTIVE_CLASS, INACTIVE_CLASS)
289
- : $animate.setClass(element, INACTIVE_CLASS, ACTIVE_CLASS);
290
- };
291
-
292
- //JavaScript treats empty strings as false, but ng-message-multiple by itself is an empty string
293
- var multiple = angular.isString($attrs.ngMessagesMultiple) ||
294
- angular.isString($attrs.multiple);
295
-
296
- var cachedValues, watchAttr = $attrs.ngMessages || $attrs['for']; //for is a reserved keyword
297
- $scope.$watchCollection(watchAttr, function(values) {
298
- cachedValues = values;
299
- ctrl.renderMessages(values, multiple);
300
- });
301
-
302
- var tpl = $attrs.ngMessagesInclude || $attrs.include;
303
- if (tpl) {
304
- $templateRequest(tpl)
305
- .then(function processTemplate(html) {
306
- var after, container = angular.element('<div/>').html(html);
307
- angular.forEach(container.children(), function(elm) {
308
- elm = angular.element(elm);
309
- after ? after.after(elm)
310
- : element.prepend(elm); //start of the container
311
- after = elm;
312
- $compile(elm)($scope);
313
- });
314
- ctrl.renderMessages(cachedValues, multiple);
315
- });
316
- }
317
- }
318
- };
319
- }])
320
-
321
-
322
- /**
323
- * @ngdoc directive
324
- * @name ngMessage
325
- * @restrict AE
326
- * @scope
327
- *
328
- * @description
329
- * `ngMessage` is a directive with the purpose to show and hide a particular message.
330
- * For `ngMessage` to operate, a parent `ngMessages` directive on a parent DOM element
331
- * must be situated since it determines which messages are visible based on the state
332
- * of the provided key/value map that `ngMessages` listens on.
333
- *
334
- * More information about using `ngMessage` can be found in the
335
- * {@link module:ngMessages `ngMessages` module documentation}.
336
- *
337
- * @usage
338
- * ```html
339
- * <!-- using attribute directives -->
340
- * <ANY ng-messages="expression">
341
- * <ANY ng-message="keyValue1">...</ANY>
342
- * <ANY ng-message="keyValue2">...</ANY>
343
- * <ANY ng-message="keyValue3">...</ANY>
344
- * </ANY>
345
- *
346
- * <!-- or by using element directives -->
347
- * <ng-messages for="expression">
348
- * <ng-message when="keyValue1">...</ng-message>
349
- * <ng-message when="keyValue2">...</ng-message>
350
- * <ng-message when="keyValue3">...</ng-message>
351
- * </ng-messages>
352
- * ```
353
- *
354
- * @param {string} ngMessage a string value corresponding to the message key.
355
- */
356
- .directive('ngMessage', ['$animate', function($animate) {
357
- var COMMENT_NODE = 8;
358
- return {
359
- require: '^ngMessages',
360
- transclude: 'element',
361
- terminal: true,
362
- restrict: 'AE',
363
- link: function($scope, $element, $attrs, ngMessages, $transclude) {
364
- var index, element;
365
-
366
- var commentNode = $element[0];
367
- var parentNode = commentNode.parentNode;
368
- for (var i = 0, j = 0; i < parentNode.childNodes.length; i++) {
369
- var node = parentNode.childNodes[i];
370
- if (node.nodeType == COMMENT_NODE && node.nodeValue.indexOf('ngMessage') >= 0) {
371
- if (node === commentNode) {
372
- index = j;
373
- break;
374
- }
375
- j++;
376
- }
377
- }
378
-
379
- ngMessages.registerMessage(index, {
380
- type: $attrs.ngMessage || $attrs.when,
381
- attach: function() {
382
- if (!element) {
383
- $transclude($scope, function(clone) {
384
- $animate.enter(clone, null, $element);
385
- element = clone;
386
- });
387
- }
388
- },
389
- detach: function(now) {
390
- if (element) {
391
- $animate.leave(element);
392
- element = null;
393
- }
394
- }
395
- });
396
- }
397
- };
398
- }]);
399
-
400
-
401
- })(window, window.angular);