angularjs-rails 1.3.15 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
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);