diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 000000000..e5eb945ba --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,23 @@ + +### v0.2.8 (2014-01-16) + + +#### Bug Fixes + +* **$state:** allow null to be passed as 'params' param ([094dc30e](https://github.com/angular-ui/ui-router/commit/094dc30e883e1bd14e50a475553bafeaade3b178)) +* **$state.go:** param inheritance shouldn't inherit from siblings ([aea872e0](https://github.com/angular-ui/ui-router/commit/aea872e0b983cb433436ce5875df10c838fccedb)) +* **uiSrefActive:** annotate controller injection ([85921422](https://github.com/angular-ui/ui-router/commit/85921422ff7fb0effed358136426d616cce3d583), closes [#671](https://github.com/angular-ui/ui-router/issues/671)) +* **uiView:** + * autoscroll tests pass on 1.2.4 & 1.1.5 ([86eacac0](https://github.com/angular-ui/ui-router/commit/86eacac09ca5e9000bd3b9c7ba6e2cc95d883a3a)) + * don't animate initial load ([83b6634d](https://github.com/angular-ui/ui-router/commit/83b6634d27942ca74766b2b1244a7fc52c5643d9)) + * test pass against 1.0.8 and 1.2.4 ([a402415a](https://github.com/angular-ui/ui-router/commit/a402415a2a28b360c43b9fe8f4f54c540f6c33de)) + * it should autoscroll when expr is missing. ([8bb9e27a](https://github.com/angular-ui/ui-router/commit/8bb9e27a2986725f45daf44c4c9f846385095aff)) + + +#### Features + +* **uiSref:** add target attribute behaviour ([c12bf9a5](https://github.com/angular-ui/ui-router/commit/c12bf9a520d30d70294e3d82de7661900f8e394e)) +* **uiView:** + * merge autoscroll expression test. ([b89e0f87](https://github.com/angular-ui/ui-router/commit/b89e0f871d5cc35c10925ede986c10684d5c9252)) + * cache and test autoscroll expression ([ee262282](https://github.com/angular-ui/ui-router/commit/ee2622828c2ce83807f006a459ac4e11406d9258)) + diff --git a/Gruntfile.js b/Gruntfile.js index 9b2aec011..b2b2a3263 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -117,17 +117,11 @@ module.exports = function (grunt) { grunt.registerTask('integrate', ['build', 'jshint', 'karma:unit', 'karma:past', 'karma:unstable']); grunt.registerTask('default', ['build', 'jshint', 'karma:unit']); grunt.registerTask('build', 'Perform a normal build', ['concat', 'uglify']); - grunt.registerTask('dist', 'Perform a clean build and generate documentation', ['clean', 'build', 'jsdoc']); + grunt.registerTask('dist', 'Perform a clean build and generate documentation', ['clean', 'build', 'ngdocs']); grunt.registerTask('release', 'Tag and perform a release', ['prepare-release', 'dist', 'perform-release']); grunt.registerTask('dev', 'Run dev server and watch for changes', ['build', 'connect:server', 'karma:background', 'watch']); grunt.registerTask('sample', 'Run connect server with keepalive:true for sample app development', ['connect:sample']); - grunt.registerTask('jsdoc', 'Generate documentation', function () { - promising(this, - system('node_modules/jsdoc/jsdoc -c config/jsdoc.js -d \'' + grunt.config('builddir') + '\'/doc src') - ); - }); - grunt.registerTask('publish-pages', 'Publish a clean build, docs, and sample to github.io', function () { promising(this, ensureCleanMaster().then(function () { diff --git a/README.md b/README.md index aa3856d36..df70cb5b9 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ #### The de-facto solution to flexible routing with nested views --- -**[Download 0.2.7](http://angular-ui.github.io/ui-router/release/angular-ui-router.js)** (or **[Minified](http://angular-ui.github.io/ui-router/release/angular-ui-router.min.js)**) **|** +**[Download 0.2.8](http://angular-ui.github.io/ui-router/release/angular-ui-router.js)** (or **[Minified](http://angular-ui.github.io/ui-router/release/angular-ui-router.min.js)**) **|** **[Learn](#resources) |** **[Discuss](https://groups.google.com/forum/#!categories/angular-ui/router) |** **[Get Help](http://stackoverflow.com/questions/ask?tags=angularjs,angular-ui-router) |** diff --git a/bower.json b/bower.json index b6694f5fb..3d8324156 100644 --- a/bower.json +++ b/bower.json @@ -1,9 +1,9 @@ { "name": "angular-ui-router", - "version": "0.2.7", + "version": "0.2.8", "main": "./release/angular-ui-router.js", "dependencies": { - "angular": ">= 1.1.5" + "angular": ">= 1.0.8" }, "ignore": [ "**/.*", diff --git a/component.json b/component.json index 3ccd6544e..76495b8c1 100644 --- a/component.json +++ b/component.json @@ -1,6 +1,6 @@ { "name": "angular-ui-router", - "version": "0.2.7", + "version": "0.2.8", "description": "State-based routing for AngularJS", "keywords": [ "angular", diff --git a/package.json b/package.json index 7dd3a92eb..7fbba2e6b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "angular-ui-router", "description": "State-based routing for AngularJS", - "version": "0.2.7", + "version": "0.2.8", "homepage": "http://angular-ui.github.com/", "contributors": [ { diff --git a/release/angular-ui-router.js b/release/angular-ui-router.js index 109b5d053..4a0e8157a 100644 --- a/release/angular-ui-router.js +++ b/release/angular-ui-router.js @@ -1,6 +1,6 @@ /** * State-based routing for AngularJS - * @version v0.2.7 + * @version v0.2.8 * @link http://angular-ui.github.com/ * @license MIT License, http://www.opensource.org/licenses/MIT */ @@ -50,8 +50,7 @@ function ancestors(first, second) { var path = []; for (var n in first.path) { - if (first.path[n] === "") continue; - if (!second.path[n]) break; + if (first.path[n] !== second.path[n]) break; path.push(first.path[n]); } return path; @@ -177,18 +176,68 @@ function filterByKeys(keys, values) { return filtered; } +/** + * @ngdoc overview + * @name ui.router.util + * + * @description + * + */ angular.module('ui.router.util', ['ng']); + +/** + * @ngdoc overview + * @name ui.router.router + * + * @requires ui.router.util + * + * @description + * + */ angular.module('ui.router.router', ['ui.router.util']); + +/** + * @ngdoc overview + * @name ui.router.router + * + * @requires ui.router.router + * @requires ui.router.util + * + * @description + * + */ angular.module('ui.router.state', ['ui.router.router', 'ui.router.util']); + +/** + * @ngdoc overview + * @name ui.router + * + * @requires ui.router.state + * + * @description + * + */ angular.module('ui.router', ['ui.router.state']); +/** + * @ngdoc overview + * @name ui.router.compat + * + * @requires ui.router + * + * @description + * + */ angular.module('ui.router.compat', ['ui.router']); - /** - * Service (`ui-util`). Manages resolution of (acyclic) graphs of promises. - * @module $resolve + * @ngdoc object + * @name ui.router.util.$resolve + * * @requires $q * @requires $injector + * + * @description + * Manages resolution of (acyclic) graphs of promises. */ $Resolve.$inject = ['$q', '$injector']; function $Resolve( $q, $injector) { @@ -202,15 +251,24 @@ function $Resolve( $q, $injector) { /** + * @ngdoc function + * @name ui.router.util.$resolve#study + * @methodOf ui.router.util.$resolve + * + * @description * Studies a set of invocables that are likely to be used multiple times. - * $resolve.study(invocables)(locals, parent, self) + *
+ * $resolve.study(invocables)(locals, parent, self) + ** is equivalent to - * $resolve.resolve(invocables, locals, parent, self) - * but the former is more efficient (in fact `resolve` just calls `study` internally). - * See {@link module:$resolve/resolve} for details. - * @function - * @param {Object} invocables - * @return {Function} + *
+ * $resolve.resolve(invocables, locals, parent, self) + *+ * but the former is more efficient (in fact `resolve` just calls `study` + * internally). + * + * @param {object} invocables Invocable objects + * @return {function} a function to pass in locals, parent and self */ this.study = function (invocables) { if (!isObject(invocables)) throw new Error("'invocables' must be an object"); @@ -346,51 +404,65 @@ function $Resolve( $q, $injector) { }; /** - * Resolves a set of invocables. An invocable is a function to be invoked via `$injector.invoke()`, - * and can have an arbitrary number of dependencies. An invocable can either return a value directly, - * or a `$q` promise. If a promise is returned it will be resolved and the resulting value will be - * used instead. Dependencies of invocables are resolved (in this order of precedence) + * @ngdoc function + * @name ui.router.util.$resolve#resolve + * @methodOf ui.router.util.$resolve + * + * @description + * Resolves a set of invocables. An invocable is a function to be invoked via + * `$injector.invoke()`, and can have an arbitrary number of dependencies. + * An invocable can either return a value directly, + * or a `$q` promise. If a promise is returned it will be resolved and the + * resulting value will be used instead. Dependencies of invocables are resolved + * (in this order of precedence) * * - from the specified `locals` * - from another invocable that is part of this `$resolve` call - * - from an invocable that is inherited from a `parent` call to `$resolve` (or recursively - * from any ancestor `$resolve` of that parent). + * - from an invocable that is inherited from a `parent` call to `$resolve` + * (or recursively + * - from any ancestor `$resolve` of that parent). * - * The return value of `$resolve` is a promise for an object that contains (in this order of precedence) + * The return value of `$resolve` is a promise for an object that contains + * (in this order of precedence) * * - any `locals` (if specified) * - the resolved return values of all injectables * - any values inherited from a `parent` call to `$resolve` (if specified) * - * The promise will resolve after the `parent` promise (if any) and all promises returned by injectables - * have been resolved. If any invocable (or `$injector.invoke`) throws an exception, or if a promise - * returned by an invocable is rejected, the `$resolve` promise is immediately rejected with the same error. - * A rejection of a `parent` promise (if specified) will likewise be propagated immediately. Once the - * `$resolve` promise has been rejected, no further invocables will be called. + * The promise will resolve after the `parent` promise (if any) and all promises + * returned by injectables have been resolved. If any invocable + * (or `$injector.invoke`) throws an exception, or if a promise returned by an + * invocable is rejected, the `$resolve` promise is immediately rejected with the + * same error. A rejection of a `parent` promise (if specified) will likewise be + * propagated immediately. Once the `$resolve` promise has been rejected, no + * further invocables will be called. * - * Cyclic dependencies between invocables are not permitted and will caues `$resolve` to throw an - * error. As a special case, an injectable can depend on a parameter with the same name as the injectable, - * which will be fulfilled from the `parent` injectable of the same name. This allows inherited values - * to be decorated. Note that in this case any other injectable in the same `$resolve` with the same + * Cyclic dependencies between invocables are not permitted and will caues `$resolve` + * to throw an error. As a special case, an injectable can depend on a parameter + * with the same name as the injectable, which will be fulfilled from the `parent` + * injectable of the same name. This allows inherited values to be decorated. + * Note that in this case any other injectable in the same `$resolve` with the same * dependency would see the decorated value, not the inherited value. * - * Note that missing dependencies -- unlike cyclic dependencies -- will cause an (asynchronous) rejection - * of the `$resolve` promise rather than a (synchronous) exception. + * Note that missing dependencies -- unlike cyclic dependencies -- will cause an + * (asynchronous) rejection of the `$resolve` promise rather than a (synchronous) + * exception. * - * Invocables are invoked eagerly as soon as all dependencies are available. This is true even for - * dependencies inherited from a `parent` call to `$resolve`. + * Invocables are invoked eagerly as soon as all dependencies are available. + * This is true even for dependencies inherited from a `parent` call to `$resolve`. * - * As a special case, an invocable can be a string, in which case it is taken to be a service name - * to be passed to `$injector.get()`. This is supported primarily for backwards-compatibility with the - * `resolve` property of `$routeProvider` routes. + * As a special case, an invocable can be a string, in which case it is taken to + * be a service name to be passed to `$injector.get()`. This is supported primarily + * for backwards-compatibility with the `resolve` property of `$routeProvider` + * routes. * - * @function - * @param {Object.