praxis 0.0.1 → 0.9
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/.gitignore +11 -0
- data/.rspec +3 -0
- data/.ruby-version +1 -0
- data/.simplecov +7 -0
- data/.travis.yml +4 -0
- data/CONTRIBUTING.md +183 -0
- data/Gemfile +3 -0
- data/Guardfile +8 -0
- data/LICENSE +22 -0
- data/MAINTAINERS +2 -0
- data/MAINTAINERS.md +86 -0
- data/README.md +69 -3
- data/Rakefile +18 -0
- data/bin/praxis +10 -0
- data/lib/api_browser/.bowerrc +3 -0
- data/lib/api_browser/.editorconfig +21 -0
- data/lib/api_browser/Gruntfile.js +264 -0
- data/lib/api_browser/app/bower_components/angular/.bower.json +16 -0
- data/lib/api_browser/app/bower_components/angular/README.md +48 -0
- data/lib/api_browser/app/bower_components/angular/angular-csp.css +18 -0
- data/lib/api_browser/app/bower_components/angular/angular.js +21464 -0
- data/lib/api_browser/app/bower_components/angular/angular.min.js +210 -0
- data/lib/api_browser/app/bower_components/angular/angular.min.js.gzip +0 -0
- data/lib/api_browser/app/bower_components/angular/angular.min.js.map +8 -0
- data/lib/api_browser/app/bower_components/angular/bower.json +7 -0
- data/lib/api_browser/app/bower_components/angular-sanitize/.bower.json +19 -0
- data/lib/api_browser/app/bower_components/angular-sanitize/README.md +54 -0
- data/lib/api_browser/app/bower_components/angular-sanitize/angular-sanitize.js +624 -0
- data/lib/api_browser/app/bower_components/angular-sanitize/angular-sanitize.min.js +14 -0
- data/lib/api_browser/app/bower_components/angular-sanitize/angular-sanitize.min.js.map +8 -0
- data/lib/api_browser/app/bower_components/angular-sanitize/bower.json +8 -0
- data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/.bower.json +24 -0
- data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/bower.json +11 -0
- data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/ui-bootstrap-tpls.js +4116 -0
- data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/ui-bootstrap-tpls.min.js +10 -0
- data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/ui-bootstrap.js +3799 -0
- data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/ui-bootstrap.min.js +9 -0
- data/lib/api_browser/app/bower_components/angular-ui-router/.bower.json +34 -0
- data/lib/api_browser/app/bower_components/angular-ui-router/CHANGELOG.md +23 -0
- data/lib/api_browser/app/bower_components/angular-ui-router/LICENSE +21 -0
- data/lib/api_browser/app/bower_components/angular-ui-router/README.md +280 -0
- data/lib/api_browser/app/bower_components/angular-ui-router/bower.json +23 -0
- data/lib/api_browser/app/bower_components/angular-ui-router/release/angular-ui-router.js +3223 -0
- data/lib/api_browser/app/bower_components/angular-ui-router/release/angular-ui-router.min.js +7 -0
- data/lib/api_browser/app/bower_components/angular-ui-router/src/common.js +246 -0
- data/lib/api_browser/app/bower_components/angular-ui-router/src/compat.js +146 -0
- data/lib/api_browser/app/bower_components/angular-ui-router/src/resolve.js +242 -0
- data/lib/api_browser/app/bower_components/angular-ui-router/src/state.js +1204 -0
- data/lib/api_browser/app/bower_components/angular-ui-router/src/stateDirectives.js +226 -0
- data/lib/api_browser/app/bower_components/angular-ui-router/src/stateFilters.js +35 -0
- data/lib/api_browser/app/bower_components/angular-ui-router/src/templateFactory.js +110 -0
- data/lib/api_browser/app/bower_components/angular-ui-router/src/urlMatcherFactory.js +325 -0
- data/lib/api_browser/app/bower_components/angular-ui-router/src/urlRouter.js +273 -0
- data/lib/api_browser/app/bower_components/angular-ui-router/src/view.js +71 -0
- data/lib/api_browser/app/bower_components/angular-ui-router/src/viewDirective.js +290 -0
- data/lib/api_browser/app/bower_components/angular-ui-router/src/viewScroll.js +52 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/.bower.json +26 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/CNAME +1 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/CONTRIBUTING.md +61 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/DOCS-LICENSE +319 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/Gemfile +5 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/Gemfile.lock +14 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/Gruntfile.js +244 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/LICENSE +176 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/LICENSE-MIT +21 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/README.md +277 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/Rakefile +44 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/_config.yml +25 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/ads.html +1 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/footer.html +34 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/header.html +42 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-about.html +12 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-components.html +137 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-css.html +99 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-customize.html +40 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-getting-started.html +44 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-javascript.html +88 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-main.html +37 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/old-bs-docs.html +8 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/social-buttons.html +16 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/_layouts/default.html +79 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/_layouts/home.html +47 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/about.html +93 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/bower.json +11 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/browserstack.json +37 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/components.html +3689 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/composer.json +28 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/css.html +2674 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/customize.html +1715 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/dist/css/bootstrap-theme.css +427 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/dist/css/bootstrap-theme.min.css +1 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/dist/css/bootstrap.css +6350 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/dist/css/bootstrap.min.css +1 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/dist/fonts/glyphicons-halflings-regular.eot +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/dist/fonts/glyphicons-halflings-regular.svg +229 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/dist/fonts/glyphicons-halflings-regular.ttf +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/dist/fonts/glyphicons-halflings-regular.woff +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/dist/js/bootstrap.js +2002 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/dist/js/bootstrap.min.js +9 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/css/docs.css +1195 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/css/pygments-manni.css +66 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/ico/apple-touch-icon-144-precomposed.png +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/ico/favicon.png +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/application.js +103 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/customizer.js +332 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/filesaver.js +169 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/holder.js +404 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/ie8-responsive-file-warning.js +12 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/jszip.js +1467 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/less.js +9 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/raw-files.js +3 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/uglify.js +14 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/carousel/carousel.css +148 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/carousel/index.html +206 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/grid/grid.css +28 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/grid/index.html +148 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/jumbotron/index.html +99 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/jumbotron/jumbotron.css +5 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/jumbotron-narrow/index.html +82 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/jumbotron-narrow/jumbotron-narrow.css +79 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/justified-nav/index.html +83 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/justified-nav/justified-nav.css +88 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/navbar/index.html +88 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/navbar/navbar.css +8 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/navbar-fixed-top/index.html +91 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/navbar-fixed-top/navbar-fixed-top.css +4 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/navbar-static-top/index.html +92 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/navbar-static-top/navbar-static-top.css +7 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/non-responsive/index.html +101 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/non-responsive/non-responsive.css +116 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/offcanvas/index.html +130 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/offcanvas/offcanvas.css +50 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/offcanvas/offcanvas.js +5 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/carousel.jpg +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/grid.jpg +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/jumbotron-narrow.jpg +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/jumbotron.jpg +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/justified-nav.jpg +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/navbar-fixed.jpg +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/navbar-static.jpg +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/navbar.jpg +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/non-responsive.jpg +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/offcanvas.jpg +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/sign-in.jpg +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/starter-template.jpg +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/sticky-footer-navbar.jpg +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/sticky-footer.jpg +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/screenshots/theme.jpg +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/signin/index.html +50 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/signin/signin.css +40 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/starter-template/index.html +68 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/starter-template/starter-template.css +7 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/sticky-footer/index.html +55 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/sticky-footer/sticky-footer.css +38 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/sticky-footer-navbar/index.html +91 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/sticky-footer-navbar/sticky-footer-navbar.css +45 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/theme/index.html +384 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/theme/theme.css +14 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/fonts/glyphicons-halflings-regular.eot +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/fonts/glyphicons-halflings-regular.svg +229 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/fonts/glyphicons-halflings-regular.ttf +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/fonts/glyphicons-halflings-regular.woff +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/getting-started.html +1021 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/index.html +16 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/javascript.html +1983 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/affix.js +126 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/alert.js +98 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/button.js +109 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/carousel.js +217 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/collapse.js +179 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/dropdown.js +154 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/modal.js +246 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/popover.js +117 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/scrollspy.js +158 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tab.js +135 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/index.html +52 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/affix.js +25 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/alert.js +62 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/button.js +116 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/carousel.js +87 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/collapse.js +164 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/dropdown.js +219 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/modal.js +196 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/phantom.js +69 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/popover.js +133 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/scrollspy.js +37 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/tab.js +86 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/tooltip.js +437 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/transition.js +13 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/vendor/jquery.js +6 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/vendor/qunit.css +232 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/vendor/qunit.js +1510 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tooltip.js +386 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/transition.js +56 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_alerts.scss +67 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_badges.scss +51 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_breadcrumbs.scss +23 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_button-groups.scss +253 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_buttons.scss +158 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_carousel.scss +231 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_close.scss +35 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_code.scss +53 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_component-animations.scss +29 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_dropdowns.scss +193 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_forms.scss +363 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_glyphicons.scss +237 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_grid.scss +93 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_input-groups.scss +136 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_jumbotron.scss +40 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_labels.scss +58 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_list-group.scss +88 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_media.scss +56 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_mixins.scss +861 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_modals.scss +132 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_navbar.scss +628 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_navs.scss +262 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_normalize.scss +406 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_pager.scss +55 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_pagination.scss +85 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_panels.scss +172 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_popovers.scss +133 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_print.scss +105 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_progress-bars.scss +92 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_responsive-utilities.scss +198 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_scaffolding.scss +119 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_tables.scss +244 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_theme.scss +247 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_thumbnails.scss +32 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_tooltip.scss +95 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_type.scss +279 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_utilities.scss +56 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_variables.scss +637 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/lib/_wells.scss +29 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/lib/bootstrap.scss +49 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/package.json +40 -0
- data/lib/api_browser/app/bower_components/jquery/.bower.json +38 -0
- data/lib/api_browser/app/bower_components/jquery/MIT-LICENSE.txt +21 -0
- data/lib/api_browser/app/bower_components/jquery/bower.json +27 -0
- data/lib/api_browser/app/bower_components/jquery/dist/jquery.js +9190 -0
- data/lib/api_browser/app/bower_components/jquery/dist/jquery.min.js +5 -0
- data/lib/api_browser/app/bower_components/jquery/dist/jquery.min.map +1 -0
- data/lib/api_browser/app/bower_components/jquery/src/ajax/jsonp.js +89 -0
- data/lib/api_browser/app/bower_components/jquery/src/ajax/load.js +75 -0
- data/lib/api_browser/app/bower_components/jquery/src/ajax/parseJSON.js +13 -0
- data/lib/api_browser/app/bower_components/jquery/src/ajax/parseXML.js +28 -0
- data/lib/api_browser/app/bower_components/jquery/src/ajax/script.js +64 -0
- data/lib/api_browser/app/bower_components/jquery/src/ajax/var/nonce.js +5 -0
- data/lib/api_browser/app/bower_components/jquery/src/ajax/var/rquery.js +3 -0
- data/lib/api_browser/app/bower_components/jquery/src/ajax/xhr.js +135 -0
- data/lib/api_browser/app/bower_components/jquery/src/ajax.js +806 -0
- data/lib/api_browser/app/bower_components/jquery/src/attributes/attr.js +143 -0
- data/lib/api_browser/app/bower_components/jquery/src/attributes/classes.js +158 -0
- data/lib/api_browser/app/bower_components/jquery/src/attributes/prop.js +96 -0
- data/lib/api_browser/app/bower_components/jquery/src/attributes/support.js +35 -0
- data/lib/api_browser/app/bower_components/jquery/src/attributes/val.js +163 -0
- data/lib/api_browser/app/bower_components/jquery/src/attributes.js +11 -0
- data/lib/api_browser/app/bower_components/jquery/src/callbacks.js +205 -0
- data/lib/api_browser/app/bower_components/jquery/src/core/access.js +60 -0
- data/lib/api_browser/app/bower_components/jquery/src/core/init.js +123 -0
- data/lib/api_browser/app/bower_components/jquery/src/core/parseHTML.js +39 -0
- data/lib/api_browser/app/bower_components/jquery/src/core/ready.js +97 -0
- data/lib/api_browser/app/bower_components/jquery/src/core/var/rsingleTag.js +4 -0
- data/lib/api_browser/app/bower_components/jquery/src/core.js +498 -0
- data/lib/api_browser/app/bower_components/jquery/src/css/addGetHookIf.js +24 -0
- data/lib/api_browser/app/bower_components/jquery/src/css/curCSS.js +57 -0
- data/lib/api_browser/app/bower_components/jquery/src/css/defaultDisplay.js +70 -0
- data/lib/api_browser/app/bower_components/jquery/src/css/hiddenVisibleSelectors.js +15 -0
- data/lib/api_browser/app/bower_components/jquery/src/css/support.js +91 -0
- data/lib/api_browser/app/bower_components/jquery/src/css/swap.js +28 -0
- data/lib/api_browser/app/bower_components/jquery/src/css/var/cssExpand.js +3 -0
- data/lib/api_browser/app/bower_components/jquery/src/css/var/getStyles.js +5 -0
- data/lib/api_browser/app/bower_components/jquery/src/css/var/isHidden.js +13 -0
- data/lib/api_browser/app/bower_components/jquery/src/css/var/rmargin.js +3 -0
- data/lib/api_browser/app/bower_components/jquery/src/css/var/rnumnonpx.js +5 -0
- data/lib/api_browser/app/bower_components/jquery/src/css.js +451 -0
- data/lib/api_browser/app/bower_components/jquery/src/data/Data.js +181 -0
- data/lib/api_browser/app/bower_components/jquery/src/data/accepts.js +20 -0
- data/lib/api_browser/app/bower_components/jquery/src/data/var/data_priv.js +5 -0
- data/lib/api_browser/app/bower_components/jquery/src/data/var/data_user.js +5 -0
- data/lib/api_browser/app/bower_components/jquery/src/data.js +179 -0
- data/lib/api_browser/app/bower_components/jquery/src/deferred.js +149 -0
- data/lib/api_browser/app/bower_components/jquery/src/deprecated.js +13 -0
- data/lib/api_browser/app/bower_components/jquery/src/dimensions.js +50 -0
- data/lib/api_browser/app/bower_components/jquery/src/effects/Tween.js +114 -0
- data/lib/api_browser/app/bower_components/jquery/src/effects/animatedSelector.js +13 -0
- data/lib/api_browser/app/bower_components/jquery/src/effects.js +649 -0
- data/lib/api_browser/app/bower_components/jquery/src/event/alias.js +39 -0
- data/lib/api_browser/app/bower_components/jquery/src/event/support.js +9 -0
- data/lib/api_browser/app/bower_components/jquery/src/event.js +868 -0
- data/lib/api_browser/app/bower_components/jquery/src/exports/amd.js +24 -0
- data/lib/api_browser/app/bower_components/jquery/src/exports/global.js +32 -0
- data/lib/api_browser/app/bower_components/jquery/src/intro.js +44 -0
- data/lib/api_browser/app/bower_components/jquery/src/jquery.js +36 -0
- data/lib/api_browser/app/bower_components/jquery/src/manipulation/_evalUrl.js +18 -0
- data/lib/api_browser/app/bower_components/jquery/src/manipulation/support.js +31 -0
- data/lib/api_browser/app/bower_components/jquery/src/manipulation/var/rcheckableType.js +3 -0
- data/lib/api_browser/app/bower_components/jquery/src/manipulation.js +582 -0
- data/lib/api_browser/app/bower_components/jquery/src/offset.js +204 -0
- data/lib/api_browser/app/bower_components/jquery/src/outro.js +1 -0
- data/lib/api_browser/app/bower_components/jquery/src/queue/delay.js +22 -0
- data/lib/api_browser/app/bower_components/jquery/src/queue.js +142 -0
- data/lib/api_browser/app/bower_components/jquery/src/selector-native.js +172 -0
- data/lib/api_browser/app/bower_components/jquery/src/selector-sizzle.js +14 -0
- data/lib/api_browser/app/bower_components/jquery/src/selector.js +1 -0
- data/lib/api_browser/app/bower_components/jquery/src/serialize.js +111 -0
- data/lib/api_browser/app/bower_components/jquery/src/sizzle/dist/sizzle.js +2044 -0
- data/lib/api_browser/app/bower_components/jquery/src/sizzle/dist/sizzle.min.js +3 -0
- data/lib/api_browser/app/bower_components/jquery/src/sizzle/dist/sizzle.min.map +1 -0
- data/lib/api_browser/app/bower_components/jquery/src/traversing/findFilter.js +100 -0
- data/lib/api_browser/app/bower_components/jquery/src/traversing/var/rneedsContext.js +6 -0
- data/lib/api_browser/app/bower_components/jquery/src/traversing.js +200 -0
- data/lib/api_browser/app/bower_components/jquery/src/var/arr.js +3 -0
- data/lib/api_browser/app/bower_components/jquery/src/var/class2type.js +4 -0
- data/lib/api_browser/app/bower_components/jquery/src/var/concat.js +5 -0
- data/lib/api_browser/app/bower_components/jquery/src/var/hasOwn.js +5 -0
- data/lib/api_browser/app/bower_components/jquery/src/var/indexOf.js +5 -0
- data/lib/api_browser/app/bower_components/jquery/src/var/pnum.js +3 -0
- data/lib/api_browser/app/bower_components/jquery/src/var/push.js +5 -0
- data/lib/api_browser/app/bower_components/jquery/src/var/rnotwhite.js +3 -0
- data/lib/api_browser/app/bower_components/jquery/src/var/slice.js +5 -0
- data/lib/api_browser/app/bower_components/jquery/src/var/strundefined.js +3 -0
- data/lib/api_browser/app/bower_components/jquery/src/var/support.js +4 -0
- data/lib/api_browser/app/bower_components/jquery/src/var/toString.js +5 -0
- data/lib/api_browser/app/bower_components/jquery/src/wrap.js +78 -0
- data/lib/api_browser/app/bower_components/lodash/.bower.json +34 -0
- data/lib/api_browser/app/bower_components/lodash/LICENSE.txt +22 -0
- data/lib/api_browser/app/bower_components/lodash/bower.json +23 -0
- data/lib/api_browser/app/bower_components/lodash/dist/lodash.compat.js +7157 -0
- data/lib/api_browser/app/bower_components/lodash/dist/lodash.compat.min.js +61 -0
- data/lib/api_browser/app/bower_components/lodash/dist/lodash.js +6785 -0
- data/lib/api_browser/app/bower_components/lodash/dist/lodash.min.js +56 -0
- data/lib/api_browser/app/bower_components/lodash/dist/lodash.underscore.js +4979 -0
- data/lib/api_browser/app/bower_components/lodash/dist/lodash.underscore.min.js +39 -0
- data/lib/api_browser/app/css/main.css +4510 -0
- data/lib/api_browser/app/index.html +51 -0
- data/lib/api_browser/app/js/app.js +32 -0
- data/lib/api_browser/app/js/controllers/action.js +51 -0
- data/lib/api_browser/app/js/controllers/controller.js +10 -0
- data/lib/api_browser/app/js/controllers/menu.js +49 -0
- data/lib/api_browser/app/js/controllers/type.js +28 -0
- data/lib/api_browser/app/js/directives/attribute_description.js +43 -0
- data/lib/api_browser/app/js/directives/attribute_table.js +27 -0
- data/lib/api_browser/app/js/directives/attribute_table_row.js +17 -0
- data/lib/api_browser/app/js/directives/no_container.js +8 -0
- data/lib/api_browser/app/js/directives/request_body.js +25 -0
- data/lib/api_browser/app/js/directives/request_headers.js +20 -0
- data/lib/api_browser/app/js/directives/request_parameters.js +20 -0
- data/lib/api_browser/app/js/directives/type_label.js +53 -0
- data/lib/api_browser/app/js/factories/Documentation.js +16 -0
- data/lib/api_browser/app/js/factories/PayloadTemplates.js +10 -0
- data/lib/api_browser/app/js/factories/TemplateProvider.js +45 -0
- data/lib/api_browser/app/js/factories/TypeTemplates.js +11 -0
- data/lib/api_browser/app/js/filters/attribute_name.js +9 -0
- data/lib/api_browser/app/js/filters/friendly_json.js +5 -0
- data/lib/api_browser/app/js/filters/is_empty.js +8 -0
- data/lib/api_browser/app/js/filters/resource_name.js +5 -0
- data/lib/api_browser/app/sass/main.scss +59 -0
- data/lib/api_browser/app/sass/modules/_body.scss +11 -0
- data/lib/api_browser/app/sass/modules/_cloke.scss +8 -0
- data/lib/api_browser/app/sass/modules/_header.scss +15 -0
- data/lib/api_browser/app/sass/modules/_nav.scss +7 -0
- data/lib/api_browser/app/sass/modules/_sidebar.scss +26 -0
- data/lib/api_browser/app/sass/modules/_switch.scss +55 -0
- data/lib/api_browser/app/sass/modules/_table.scss +13 -0
- data/lib/api_browser/app/sass/variables/_bootstrap-variables.scss +762 -0
- data/lib/api_browser/app/views/action.html +83 -0
- data/lib/api_browser/app/views/controller.html +24 -0
- data/lib/api_browser/app/views/directives/attribute_description/_default.html +2 -0
- data/lib/api_browser/app/views/directives/attribute_description/_example.html +8 -0
- data/lib/api_browser/app/views/directives/attribute_description/_headers.html +8 -0
- data/lib/api_browser/app/views/directives/attribute_description.html +2 -0
- data/lib/api_browser/app/views/directives/attribute_table.html +23 -0
- data/lib/api_browser/app/views/directives/attribute_table_row/_default.html +10 -0
- data/lib/api_browser/app/views/directives/attribute_table_row/_links.html +10 -0
- data/lib/api_browser/app/views/directives/attribute_table_row/_struct.html +2 -0
- data/lib/api_browser/app/views/directives/request_body/_default.html +20 -0
- data/lib/api_browser/app/views/directives/request_body/_struct.html +1 -0
- data/lib/api_browser/app/views/home.html +7 -0
- data/lib/api_browser/app/views/layout.html +50 -0
- data/lib/api_browser/app/views/resource/_actions.html +23 -0
- data/lib/api_browser/app/views/type/_details.html +29 -0
- data/lib/api_browser/app/views/type.html +25 -0
- data/lib/api_browser/bower.json +26 -0
- data/lib/api_browser/package.json +30 -0
- data/lib/praxis/action_definition/headers_dsl_compiler.rb +36 -0
- data/lib/praxis/action_definition.rb +153 -0
- data/lib/praxis/api_definition.rb +59 -0
- data/lib/praxis/application.rb +65 -0
- data/lib/praxis/bootloader.rb +91 -0
- data/lib/praxis/bootloader_stages/environment.rb +57 -0
- data/lib/praxis/bootloader_stages/file_loader.rb +31 -0
- data/lib/praxis/bootloader_stages/routing.rb +34 -0
- data/lib/praxis/bootloader_stages/subgroup_loader.rb +27 -0
- data/lib/praxis/bootloader_stages/warn_unloaded_files.rb +40 -0
- data/lib/praxis/config.rb +92 -0
- data/lib/praxis/content_type_parser.rb +62 -0
- data/lib/praxis/controller.rb +59 -0
- data/lib/praxis/dispatcher.rb +102 -0
- data/lib/praxis/exception.rb +4 -0
- data/lib/praxis/exceptions/config.rb +6 -0
- data/lib/praxis/exceptions/config_load.rb +9 -0
- data/lib/praxis/exceptions/config_validation.rb +9 -0
- data/lib/praxis/exceptions/invalid_configuration.rb +6 -0
- data/lib/praxis/exceptions/invalid_response.rb +6 -0
- data/lib/praxis/exceptions/invalid_trait.rb +6 -0
- data/lib/praxis/exceptions/stage_not_found.rb +6 -0
- data/lib/praxis/exceptions/validation.rb +6 -0
- data/lib/praxis/file_group.rb +39 -0
- data/lib/praxis/links.rb +110 -0
- data/lib/praxis/media_type.rb +40 -0
- data/lib/praxis/media_type_collection.rb +120 -0
- data/lib/praxis/multipart/parser.rb +213 -0
- data/lib/praxis/multipart/part.rb +26 -0
- data/lib/praxis/plugin.rb +30 -0
- data/lib/praxis/request.rb +131 -0
- data/lib/praxis/request_stages/action.rb +20 -0
- data/lib/praxis/request_stages/load_request.rb +13 -0
- data/lib/praxis/request_stages/request_stage.rb +52 -0
- data/lib/praxis/request_stages/response.rb +26 -0
- data/lib/praxis/request_stages/validate.rb +20 -0
- data/lib/praxis/request_stages/validate_params_and_headers.rb +38 -0
- data/lib/praxis/request_stages/validate_payload.rb +32 -0
- data/lib/praxis/resource_definition.rb +89 -0
- data/lib/praxis/response.rb +107 -0
- data/lib/praxis/response_definition.rb +264 -0
- data/lib/praxis/response_template.rb +34 -0
- data/lib/praxis/responses/http.rb +166 -0
- data/lib/praxis/responses/validation_error.rb +36 -0
- data/lib/praxis/route.rb +27 -0
- data/lib/praxis/router.rb +89 -0
- data/lib/praxis/simple_media_type.rb +24 -0
- data/lib/praxis/skeletor/restful_routing_config.rb +45 -0
- data/lib/praxis/stage.rb +94 -0
- data/lib/praxis/tasks/api_docs.rb +336 -0
- data/lib/praxis/tasks/console.rb +11 -0
- data/lib/praxis/tasks/environment.rb +5 -0
- data/lib/praxis/tasks/routes.rb +45 -0
- data/lib/praxis/tasks.rb +4 -0
- data/lib/praxis/types/collection.rb +17 -0
- data/lib/praxis/types/multipart.rb +69 -0
- data/lib/praxis/version.rb +3 -0
- data/lib/praxis.rb +119 -1
- data/praxis.gemspec +50 -0
- data/spec/functional_spec.rb +186 -0
- data/spec/praxis/action_definition_spec.rb +134 -0
- data/spec/praxis/api_resource_spec.rb +0 -0
- data/spec/praxis/application_spec.rb +46 -0
- data/spec/praxis/bootloader_spec.rb +58 -0
- data/spec/praxis/config_spec.rb +118 -0
- data/spec/praxis/content_type_parser_spec.rb +91 -0
- data/spec/praxis/controller_spec.rb +73 -0
- data/spec/praxis/dispatcher_spec.rb +0 -0
- data/spec/praxis/file_group_spec.rb +34 -0
- data/spec/praxis/links_spec.rb +45 -0
- data/spec/praxis/media_type_collection_spec.rb +145 -0
- data/spec/praxis/media_type_spec.rb +80 -0
- data/spec/praxis/multipart/parser_spec.rb +54 -0
- data/spec/praxis/request_spec.rb +109 -0
- data/spec/praxis/request_stages_validate_spec.rb +34 -0
- data/spec/praxis/resource_definition_spec.rb +116 -0
- data/spec/praxis/response_definition_spec.rb +500 -0
- data/spec/praxis/response_spec.rb +166 -0
- data/spec/praxis/restful_routing_config_spec.rb +88 -0
- data/spec/praxis/route_spec.rb +42 -0
- data/spec/praxis/router_spec.rb +148 -0
- data/spec/praxis/stage_spec.rb +110 -0
- data/spec/praxis/types/multipart_spec.rb +81 -0
- data/spec/spec_app/app/controllers/instances.rb +63 -0
- data/spec/spec_app/app/responses/bulk_response.rb +6 -0
- data/spec/spec_app/app/responses/multipart.rb +10 -0
- data/spec/spec_app/app/responses/other_response.rb +6 -0
- data/spec/spec_app/config/environment.rb +17 -0
- data/spec/spec_app/config.ru +17 -0
- data/spec/spec_app/design/api.rb +27 -0
- data/spec/spec_app/design/media_types/instance.rb +35 -0
- data/spec/spec_app/design/media_types/volume.rb +34 -0
- data/spec/spec_app/design/media_types/volume_snapshot.rb +38 -0
- data/spec/spec_app/design/resources/instances.rb +161 -0
- data/spec/spec_helper.rb +39 -0
- data/spec/support/spec_media_types.rb +46 -0
- data/spec/support/spec_resource_definitions.rb +33 -0
- data/tasks/praxis_app_generator.thor +307 -0
- metadata +847 -12
|
@@ -0,0 +1,1204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @ngdoc object
|
|
3
|
+
* @name ui.router.state.$stateProvider
|
|
4
|
+
*
|
|
5
|
+
* @requires ui.router.router.$urlRouterProvider
|
|
6
|
+
* @requires ui.router.util.$urlMatcherFactoryProvider
|
|
7
|
+
* @requires $locationProvider
|
|
8
|
+
*
|
|
9
|
+
* @description
|
|
10
|
+
* The new `$stateProvider` works similar to Angular's v1 router, but it focuses purely
|
|
11
|
+
* on state.
|
|
12
|
+
*
|
|
13
|
+
* A state corresponds to a "place" in the application in terms of the overall UI and
|
|
14
|
+
* navigation. A state describes (via the controller / template / view properties) what
|
|
15
|
+
* the UI looks like and does at that place.
|
|
16
|
+
*
|
|
17
|
+
* States often have things in common, and the primary way of factoring out these
|
|
18
|
+
* commonalities in this model is via the state hierarchy, i.e. parent/child states aka
|
|
19
|
+
* nested states.
|
|
20
|
+
*
|
|
21
|
+
* The `$stateProvider` provides interfaces to declare these states for your app.
|
|
22
|
+
*/
|
|
23
|
+
$StateProvider.$inject = ['$urlRouterProvider', '$urlMatcherFactoryProvider', '$locationProvider'];
|
|
24
|
+
function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $locationProvider) {
|
|
25
|
+
|
|
26
|
+
var root, states = {}, $state, queue = {}, abstractKey = 'abstract';
|
|
27
|
+
|
|
28
|
+
// Builds state properties from definition passed to registerState()
|
|
29
|
+
var stateBuilder = {
|
|
30
|
+
|
|
31
|
+
// Derive parent state from a hierarchical name only if 'parent' is not explicitly defined.
|
|
32
|
+
// state.children = [];
|
|
33
|
+
// if (parent) parent.children.push(state);
|
|
34
|
+
parent: function(state) {
|
|
35
|
+
if (isDefined(state.parent) && state.parent) return findState(state.parent);
|
|
36
|
+
// regex matches any valid composite state name
|
|
37
|
+
// would match "contact.list" but not "contacts"
|
|
38
|
+
var compositeName = /^(.+)\.[^.]+$/.exec(state.name);
|
|
39
|
+
return compositeName ? findState(compositeName[1]) : root;
|
|
40
|
+
},
|
|
41
|
+
|
|
42
|
+
// inherit 'data' from parent and override by own values (if any)
|
|
43
|
+
data: function(state) {
|
|
44
|
+
if (state.parent && state.parent.data) {
|
|
45
|
+
state.data = state.self.data = extend({}, state.parent.data, state.data);
|
|
46
|
+
}
|
|
47
|
+
return state.data;
|
|
48
|
+
},
|
|
49
|
+
|
|
50
|
+
// Build a URLMatcher if necessary, either via a relative or absolute URL
|
|
51
|
+
url: function(state) {
|
|
52
|
+
var url = state.url;
|
|
53
|
+
|
|
54
|
+
if (isString(url)) {
|
|
55
|
+
if (url.charAt(0) == '^') {
|
|
56
|
+
return $urlMatcherFactory.compile(url.substring(1));
|
|
57
|
+
}
|
|
58
|
+
return (state.parent.navigable || root).url.concat(url);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if ($urlMatcherFactory.isMatcher(url) || url == null) {
|
|
62
|
+
return url;
|
|
63
|
+
}
|
|
64
|
+
throw new Error("Invalid url '" + url + "' in state '" + state + "'");
|
|
65
|
+
},
|
|
66
|
+
|
|
67
|
+
// Keep track of the closest ancestor state that has a URL (i.e. is navigable)
|
|
68
|
+
navigable: function(state) {
|
|
69
|
+
return state.url ? state : (state.parent ? state.parent.navigable : null);
|
|
70
|
+
},
|
|
71
|
+
|
|
72
|
+
// Derive parameters for this state and ensure they're a super-set of parent's parameters
|
|
73
|
+
params: function(state) {
|
|
74
|
+
if (!state.params) {
|
|
75
|
+
return state.url ? state.url.parameters() : state.parent.params;
|
|
76
|
+
}
|
|
77
|
+
if (!isArray(state.params)) throw new Error("Invalid params in state '" + state + "'");
|
|
78
|
+
if (state.url) throw new Error("Both params and url specicified in state '" + state + "'");
|
|
79
|
+
return state.params;
|
|
80
|
+
},
|
|
81
|
+
|
|
82
|
+
// If there is no explicit multi-view configuration, make one up so we don't have
|
|
83
|
+
// to handle both cases in the view directive later. Note that having an explicit
|
|
84
|
+
// 'views' property will mean the default unnamed view properties are ignored. This
|
|
85
|
+
// is also a good time to resolve view names to absolute names, so everything is a
|
|
86
|
+
// straight lookup at link time.
|
|
87
|
+
views: function(state) {
|
|
88
|
+
var views = {};
|
|
89
|
+
|
|
90
|
+
forEach(isDefined(state.views) ? state.views : { '': state }, function (view, name) {
|
|
91
|
+
if (name.indexOf('@') < 0) name += '@' + state.parent.name;
|
|
92
|
+
views[name] = view;
|
|
93
|
+
});
|
|
94
|
+
return views;
|
|
95
|
+
},
|
|
96
|
+
|
|
97
|
+
ownParams: function(state) {
|
|
98
|
+
if (!state.parent) {
|
|
99
|
+
return state.params;
|
|
100
|
+
}
|
|
101
|
+
var paramNames = {}; forEach(state.params, function (p) { paramNames[p] = true; });
|
|
102
|
+
|
|
103
|
+
forEach(state.parent.params, function (p) {
|
|
104
|
+
if (!paramNames[p]) {
|
|
105
|
+
throw new Error("Missing required parameter '" + p + "' in state '" + state.name + "'");
|
|
106
|
+
}
|
|
107
|
+
paramNames[p] = false;
|
|
108
|
+
});
|
|
109
|
+
var ownParams = [];
|
|
110
|
+
|
|
111
|
+
forEach(paramNames, function (own, p) {
|
|
112
|
+
if (own) ownParams.push(p);
|
|
113
|
+
});
|
|
114
|
+
return ownParams;
|
|
115
|
+
},
|
|
116
|
+
|
|
117
|
+
// Keep a full path from the root down to this state as this is needed for state activation.
|
|
118
|
+
path: function(state) {
|
|
119
|
+
return state.parent ? state.parent.path.concat(state) : []; // exclude root from path
|
|
120
|
+
},
|
|
121
|
+
|
|
122
|
+
// Speed up $state.contains() as it's used a lot
|
|
123
|
+
includes: function(state) {
|
|
124
|
+
var includes = state.parent ? extend({}, state.parent.includes) : {};
|
|
125
|
+
includes[state.name] = true;
|
|
126
|
+
return includes;
|
|
127
|
+
},
|
|
128
|
+
|
|
129
|
+
$delegates: {}
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
function isRelative(stateName) {
|
|
133
|
+
return stateName.indexOf(".") === 0 || stateName.indexOf("^") === 0;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function findState(stateOrName, base) {
|
|
137
|
+
var isStr = isString(stateOrName),
|
|
138
|
+
name = isStr ? stateOrName : stateOrName.name,
|
|
139
|
+
path = isRelative(name);
|
|
140
|
+
|
|
141
|
+
if (path) {
|
|
142
|
+
if (!base) throw new Error("No reference point given for path '" + name + "'");
|
|
143
|
+
var rel = name.split("."), i = 0, pathLength = rel.length, current = base;
|
|
144
|
+
|
|
145
|
+
for (; i < pathLength; i++) {
|
|
146
|
+
if (rel[i] === "" && i === 0) {
|
|
147
|
+
current = base;
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
if (rel[i] === "^") {
|
|
151
|
+
if (!current.parent) throw new Error("Path '" + name + "' not valid for state '" + base.name + "'");
|
|
152
|
+
current = current.parent;
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
rel = rel.slice(i).join(".");
|
|
158
|
+
name = current.name + (current.name && rel ? "." : "") + rel;
|
|
159
|
+
}
|
|
160
|
+
var state = states[name];
|
|
161
|
+
|
|
162
|
+
if (state && (isStr || (!isStr && (state === stateOrName || state.self === stateOrName)))) {
|
|
163
|
+
return state;
|
|
164
|
+
}
|
|
165
|
+
return undefined;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
function queueState(parentName, state) {
|
|
169
|
+
if (!queue[parentName]) {
|
|
170
|
+
queue[parentName] = [];
|
|
171
|
+
}
|
|
172
|
+
queue[parentName].push(state);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
function registerState(state) {
|
|
176
|
+
// Wrap a new object around the state so we can store our private details easily.
|
|
177
|
+
state = inherit(state, {
|
|
178
|
+
self: state,
|
|
179
|
+
resolve: state.resolve || {},
|
|
180
|
+
toString: function() { return this.name; }
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
var name = state.name;
|
|
184
|
+
if (!isString(name) || name.indexOf('@') >= 0) throw new Error("State must have a valid name");
|
|
185
|
+
if (states.hasOwnProperty(name)) throw new Error("State '" + name + "'' is already defined");
|
|
186
|
+
|
|
187
|
+
// Get parent name
|
|
188
|
+
var parentName = (name.indexOf('.') !== -1) ? name.substring(0, name.lastIndexOf('.'))
|
|
189
|
+
: (isString(state.parent)) ? state.parent
|
|
190
|
+
: '';
|
|
191
|
+
|
|
192
|
+
// If parent is not registered yet, add state to queue and register later
|
|
193
|
+
if (parentName && !states[parentName]) {
|
|
194
|
+
return queueState(parentName, state.self);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
for (var key in stateBuilder) {
|
|
198
|
+
if (isFunction(stateBuilder[key])) state[key] = stateBuilder[key](state, stateBuilder.$delegates[key]);
|
|
199
|
+
}
|
|
200
|
+
states[name] = state;
|
|
201
|
+
|
|
202
|
+
// Register the state in the global state list and with $urlRouter if necessary.
|
|
203
|
+
if (!state[abstractKey] && state.url) {
|
|
204
|
+
$urlRouterProvider.when(state.url, ['$match', '$stateParams', function ($match, $stateParams) {
|
|
205
|
+
if ($state.$current.navigable != state || !equalForKeys($match, $stateParams)) {
|
|
206
|
+
$state.transitionTo(state, $match, { location: false });
|
|
207
|
+
}
|
|
208
|
+
}]);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// Register any queued children
|
|
212
|
+
if (queue[name]) {
|
|
213
|
+
for (var i = 0; i < queue[name].length; i++) {
|
|
214
|
+
registerState(queue[name][i]);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
return state;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// Checks text to see if it looks like a glob.
|
|
222
|
+
function isGlob (text) {
|
|
223
|
+
return text.indexOf('*') > -1;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// Returns true if glob matches current $state name.
|
|
227
|
+
function doesStateMatchGlob (glob) {
|
|
228
|
+
var globSegments = glob.split('.'),
|
|
229
|
+
segments = $state.$current.name.split('.');
|
|
230
|
+
|
|
231
|
+
//match greedy starts
|
|
232
|
+
if (globSegments[0] === '**') {
|
|
233
|
+
segments = segments.slice(segments.indexOf(globSegments[1]));
|
|
234
|
+
segments.unshift('**');
|
|
235
|
+
}
|
|
236
|
+
//match greedy ends
|
|
237
|
+
if (globSegments[globSegments.length - 1] === '**') {
|
|
238
|
+
segments.splice(segments.indexOf(globSegments[globSegments.length - 2]) + 1, Number.MAX_VALUE);
|
|
239
|
+
segments.push('**');
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
if (globSegments.length != segments.length) {
|
|
243
|
+
return false;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
//match single stars
|
|
247
|
+
for (var i = 0, l = globSegments.length; i < l; i++) {
|
|
248
|
+
if (globSegments[i] === '*') {
|
|
249
|
+
segments[i] = '*';
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
return segments.join('') === globSegments.join('');
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
// Implicit root state that is always active
|
|
258
|
+
root = registerState({
|
|
259
|
+
name: '',
|
|
260
|
+
url: '^',
|
|
261
|
+
views: null,
|
|
262
|
+
'abstract': true
|
|
263
|
+
});
|
|
264
|
+
root.navigable = null;
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* @ngdoc function
|
|
269
|
+
* @name ui.router.state.$stateProvider#decorator
|
|
270
|
+
* @methodOf ui.router.state.$stateProvider
|
|
271
|
+
*
|
|
272
|
+
* @description
|
|
273
|
+
* Allows you to extend (carefully) or override (at your own peril) the
|
|
274
|
+
* `stateBuilder` object used internally by `$stateProvider`. This can be used
|
|
275
|
+
* to add custom functionality to ui-router, for example inferring templateUrl
|
|
276
|
+
* based on the state name.
|
|
277
|
+
*
|
|
278
|
+
* When passing only a name, it returns the current (original or decorated) builder
|
|
279
|
+
* function that matches `name`.
|
|
280
|
+
*
|
|
281
|
+
* The builder functions that can be decorated are listed below. Though not all
|
|
282
|
+
* necessarily have a good use case for decoration, that is up to you to decide.
|
|
283
|
+
*
|
|
284
|
+
* In addition, users can attach custom decorators, which will generate new
|
|
285
|
+
* properties within the state's internal definition. There is currently no clear
|
|
286
|
+
* use-case for this beyond accessing internal states (i.e. $state.$current),
|
|
287
|
+
* however, expect this to become increasingly relevant as we introduce additional
|
|
288
|
+
* meta-programming features.
|
|
289
|
+
*
|
|
290
|
+
* **Warning**: Decorators should not be interdependent because the order of
|
|
291
|
+
* execution of the builder functions in non-deterministic. Builder functions
|
|
292
|
+
* should only be dependent on the state definition object and super function.
|
|
293
|
+
*
|
|
294
|
+
*
|
|
295
|
+
* Existing builder functions and current return values:
|
|
296
|
+
*
|
|
297
|
+
* - **parent** `{object}` - returns the parent state object.
|
|
298
|
+
* - **data** `{object}` - returns state data, including any inherited data that is not
|
|
299
|
+
* overridden by own values (if any).
|
|
300
|
+
* - **url** `{object}` - returns a {link ui.router.util.type:UrlMatcher} or null.
|
|
301
|
+
* - **navigable** `{object}` - returns closest ancestor state that has a URL (aka is
|
|
302
|
+
* navigable).
|
|
303
|
+
* - **params** `{object}` - returns an array of state params that are ensured to
|
|
304
|
+
* be a super-set of parent's params.
|
|
305
|
+
* - **views** `{object}` - returns a views object where each key is an absolute view
|
|
306
|
+
* name (i.e. "viewName@stateName") and each value is the config object
|
|
307
|
+
* (template, controller) for the view. Even when you don't use the views object
|
|
308
|
+
* explicitly on a state config, one is still created for you internally.
|
|
309
|
+
* So by decorating this builder function you have access to decorating template
|
|
310
|
+
* and controller properties.
|
|
311
|
+
* - **ownParams** `{object}` - returns an array of params that belong to the state,
|
|
312
|
+
* not including any params defined by ancestor states.
|
|
313
|
+
* - **path** `{string}` - returns the full path from the root down to this state.
|
|
314
|
+
* Needed for state activation.
|
|
315
|
+
* - **includes** `{object}` - returns an object that includes every state that
|
|
316
|
+
* would pass a '$state.includes()' test.
|
|
317
|
+
*
|
|
318
|
+
* @example
|
|
319
|
+
* <pre>
|
|
320
|
+
* // Override the internal 'views' builder with a function that takes the state
|
|
321
|
+
* // definition, and a reference to the internal function being overridden:
|
|
322
|
+
* $stateProvider.decorator('views', function ($state, parent) {
|
|
323
|
+
* var result = {},
|
|
324
|
+
* views = parent(state);
|
|
325
|
+
*
|
|
326
|
+
* angular.forEach(view, function (config, name) {
|
|
327
|
+
* var autoName = (state.name + '.' + name).replace('.', '/');
|
|
328
|
+
* config.templateUrl = config.templateUrl || '/partials/' + autoName + '.html';
|
|
329
|
+
* result[name] = config;
|
|
330
|
+
* });
|
|
331
|
+
* return result;
|
|
332
|
+
* });
|
|
333
|
+
*
|
|
334
|
+
* $stateProvider.state('home', {
|
|
335
|
+
* views: {
|
|
336
|
+
* 'contact.list': { controller: 'ListController' },
|
|
337
|
+
* 'contact.item': { controller: 'ItemController' }
|
|
338
|
+
* }
|
|
339
|
+
* });
|
|
340
|
+
*
|
|
341
|
+
* // ...
|
|
342
|
+
*
|
|
343
|
+
* $state.go('home');
|
|
344
|
+
* // Auto-populates list and item views with /partials/home/contact/list.html,
|
|
345
|
+
* // and /partials/home/contact/item.html, respectively.
|
|
346
|
+
* </pre>
|
|
347
|
+
*
|
|
348
|
+
* @param {string} name The name of the builder function to decorate.
|
|
349
|
+
* @param {object} func A function that is responsible for decorating the original
|
|
350
|
+
* builder function. The function receives two parameters:
|
|
351
|
+
*
|
|
352
|
+
* - `{object}` - state - The state config object.
|
|
353
|
+
* - `{object}` - super - The original builder function.
|
|
354
|
+
*
|
|
355
|
+
* @return {object} $stateProvider - $stateProvider instance
|
|
356
|
+
*/
|
|
357
|
+
this.decorator = decorator;
|
|
358
|
+
function decorator(name, func) {
|
|
359
|
+
/*jshint validthis: true */
|
|
360
|
+
if (isString(name) && !isDefined(func)) {
|
|
361
|
+
return stateBuilder[name];
|
|
362
|
+
}
|
|
363
|
+
if (!isFunction(func) || !isString(name)) {
|
|
364
|
+
return this;
|
|
365
|
+
}
|
|
366
|
+
if (stateBuilder[name] && !stateBuilder.$delegates[name]) {
|
|
367
|
+
stateBuilder.$delegates[name] = stateBuilder[name];
|
|
368
|
+
}
|
|
369
|
+
stateBuilder[name] = func;
|
|
370
|
+
return this;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
/**
|
|
374
|
+
* @ngdoc function
|
|
375
|
+
* @name ui.router.state.$stateProvider#state
|
|
376
|
+
* @methodOf ui.router.state.$stateProvider
|
|
377
|
+
*
|
|
378
|
+
* @description
|
|
379
|
+
* Registers a state configuration under a given state name. The stateConfig object
|
|
380
|
+
* has the following acceptable properties.
|
|
381
|
+
*
|
|
382
|
+
* <a id='template'></a>
|
|
383
|
+
*
|
|
384
|
+
* - **`template`** - {string|function=} - html template as a string or a function that returns
|
|
385
|
+
* an html template as a string which should be used by the uiView directives. This property
|
|
386
|
+
* takes precedence over templateUrl.
|
|
387
|
+
*
|
|
388
|
+
* If `template` is a function, it will be called with the following parameters:
|
|
389
|
+
*
|
|
390
|
+
* - {array.<object>} - state parameters extracted from the current $location.path() by
|
|
391
|
+
* applying the current state
|
|
392
|
+
*
|
|
393
|
+
* <a id='templateUrl'></a>
|
|
394
|
+
*
|
|
395
|
+
* - **`templateUrl`** - {string|function=} - path or function that returns a path to an html
|
|
396
|
+
* template that should be used by uiView.
|
|
397
|
+
*
|
|
398
|
+
* If `templateUrl` is a function, it will be called with the following parameters:
|
|
399
|
+
*
|
|
400
|
+
* - {array.<object>} - state parameters extracted from the current $location.path() by
|
|
401
|
+
* applying the current state
|
|
402
|
+
*
|
|
403
|
+
* <a id='templateProvider'></a>
|
|
404
|
+
*
|
|
405
|
+
* - **`templateProvider`** - {function=} - Provider function that returns HTML content
|
|
406
|
+
* string.
|
|
407
|
+
*
|
|
408
|
+
* <a id='controller'></a>
|
|
409
|
+
*
|
|
410
|
+
* - **`controller`** - {string|function=} - Controller fn that should be associated with newly
|
|
411
|
+
* related scope or the name of a registered controller if passed as a string.
|
|
412
|
+
*
|
|
413
|
+
* <a id='controllerProvider'></a>
|
|
414
|
+
*
|
|
415
|
+
* - **`controllerProvider`** - {function=} - Injectable provider function that returns
|
|
416
|
+
* the actual controller or string.
|
|
417
|
+
*
|
|
418
|
+
* <a id='controllerAs'></a>
|
|
419
|
+
*
|
|
420
|
+
* - **`controllerAs`** – {string=} – A controller alias name. If present the controller will be
|
|
421
|
+
* published to scope under the controllerAs name.
|
|
422
|
+
*
|
|
423
|
+
* <a id='resolve'></a>
|
|
424
|
+
*
|
|
425
|
+
* - **`resolve`** - {object.<string, function>=} - An optional map of dependencies which
|
|
426
|
+
* should be injected into the controller. If any of these dependencies are promises,
|
|
427
|
+
* the router will wait for them all to be resolved or one to be rejected before the
|
|
428
|
+
* controller is instantiated. If all the promises are resolved successfully, the values
|
|
429
|
+
* of the resolved promises are injected and $stateChangeSuccess event is fired. If any
|
|
430
|
+
* of the promises are rejected the $stateChangeError event is fired. The map object is:
|
|
431
|
+
*
|
|
432
|
+
* - key - {string}: name of dependency to be injected into controller
|
|
433
|
+
* - factory - {string|function}: If string then it is alias for service. Otherwise if function,
|
|
434
|
+
* it is injected and return value it treated as dependency. If result is a promise, it is
|
|
435
|
+
* resolved before its value is injected into controller.
|
|
436
|
+
*
|
|
437
|
+
* <a id='url'></a>
|
|
438
|
+
*
|
|
439
|
+
* - **`url`** - {string=} - A url with optional parameters. When a state is navigated or
|
|
440
|
+
* transitioned to, the `$stateParams` service will be populated with any
|
|
441
|
+
* parameters that were passed.
|
|
442
|
+
*
|
|
443
|
+
* <a id='params'></a>
|
|
444
|
+
*
|
|
445
|
+
* - **`params`** - {object=} - An array of parameter names or regular expressions. Only
|
|
446
|
+
* use this within a state if you are not using url. Otherwise you can specify your
|
|
447
|
+
* parameters within the url. When a state is navigated or transitioned to, the
|
|
448
|
+
* $stateParams service will be populated with any parameters that were passed.
|
|
449
|
+
*
|
|
450
|
+
* <a id='views'></a>
|
|
451
|
+
*
|
|
452
|
+
* - **`views`** - {object=} - Use the views property to set up multiple views or to target views
|
|
453
|
+
* manually/explicitly.
|
|
454
|
+
*
|
|
455
|
+
* <a id='abstract'></a>
|
|
456
|
+
*
|
|
457
|
+
* - **`abstract`** - {boolean=} - An abstract state will never be directly activated,
|
|
458
|
+
* but can provide inherited properties to its common children states.
|
|
459
|
+
*
|
|
460
|
+
* <a id='onEnter'></a>
|
|
461
|
+
*
|
|
462
|
+
* - **`onEnter`** - {object=} - Callback function for when a state is entered. Good way
|
|
463
|
+
* to trigger an action or dispatch an event, such as opening a dialog.
|
|
464
|
+
*
|
|
465
|
+
* <a id='onExit'></a>
|
|
466
|
+
*
|
|
467
|
+
* - **`onExit`** - {object=} - Callback function for when a state is exited. Good way to
|
|
468
|
+
* trigger an action or dispatch an event, such as opening a dialog.
|
|
469
|
+
*
|
|
470
|
+
* <a id='reloadOnSearch'></a>
|
|
471
|
+
*
|
|
472
|
+
* - **`reloadOnSearch = true`** - {boolean=} - If `false`, will not retrigger the same state
|
|
473
|
+
* just because a search/query parameter has changed (via $location.search() or $location.hash()).
|
|
474
|
+
* Useful for when you'd like to modify $location.search() without triggering a reload.
|
|
475
|
+
*
|
|
476
|
+
* <a id='data'></a>
|
|
477
|
+
*
|
|
478
|
+
* - **`data`** - {object=} - Arbitrary data object, useful for custom configuration.
|
|
479
|
+
*
|
|
480
|
+
* @example
|
|
481
|
+
* <pre>
|
|
482
|
+
* // Some state name examples
|
|
483
|
+
*
|
|
484
|
+
* // stateName can be a single top-level name (must be unique).
|
|
485
|
+
* $stateProvider.state("home", {});
|
|
486
|
+
*
|
|
487
|
+
* // Or it can be a nested state name. This state is a child of the
|
|
488
|
+
* // above "home" state.
|
|
489
|
+
* $stateProvider.state("home.newest", {});
|
|
490
|
+
*
|
|
491
|
+
* // Nest states as deeply as needed.
|
|
492
|
+
* $stateProvider.state("home.newest.abc.xyz.inception", {});
|
|
493
|
+
*
|
|
494
|
+
* // state() returns $stateProvider, so you can chain state declarations.
|
|
495
|
+
* $stateProvider
|
|
496
|
+
* .state("home", {})
|
|
497
|
+
* .state("about", {})
|
|
498
|
+
* .state("contacts", {});
|
|
499
|
+
* </pre>
|
|
500
|
+
*
|
|
501
|
+
* @param {string} name A unique state name, e.g. "home", "about", "contacts".
|
|
502
|
+
* To create a parent/child state use a dot, e.g. "about.sales", "home.newest".
|
|
503
|
+
* @param {object} definition State configuration object.
|
|
504
|
+
*/
|
|
505
|
+
this.state = state;
|
|
506
|
+
function state(name, definition) {
|
|
507
|
+
/*jshint validthis: true */
|
|
508
|
+
if (isObject(name)) definition = name;
|
|
509
|
+
else definition.name = name;
|
|
510
|
+
registerState(definition);
|
|
511
|
+
return this;
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
/**
|
|
515
|
+
* @ngdoc object
|
|
516
|
+
* @name ui.router.state.$state
|
|
517
|
+
*
|
|
518
|
+
* @requires $rootScope
|
|
519
|
+
* @requires $q
|
|
520
|
+
* @requires ui.router.state.$view
|
|
521
|
+
* @requires $injector
|
|
522
|
+
* @requires ui.router.util.$resolve
|
|
523
|
+
* @requires ui.router.state.$stateParams
|
|
524
|
+
*
|
|
525
|
+
* @property {object} params A param object, e.g. {sectionId: section.id)}, that
|
|
526
|
+
* you'd like to test against the current active state.
|
|
527
|
+
* @property {object} current A reference to the state's config object. However
|
|
528
|
+
* you passed it in. Useful for accessing custom data.
|
|
529
|
+
* @property {object} transition Currently pending transition. A promise that'll
|
|
530
|
+
* resolve or reject.
|
|
531
|
+
*
|
|
532
|
+
* @description
|
|
533
|
+
* `$state` service is responsible for representing states as well as transitioning
|
|
534
|
+
* between them. It also provides interfaces to ask for current state or even states
|
|
535
|
+
* you're coming from.
|
|
536
|
+
*/
|
|
537
|
+
// $urlRouter is injected just to ensure it gets instantiated
|
|
538
|
+
this.$get = $get;
|
|
539
|
+
$get.$inject = ['$rootScope', '$q', '$view', '$injector', '$resolve', '$stateParams', '$location', '$urlRouter', '$browser'];
|
|
540
|
+
function $get( $rootScope, $q, $view, $injector, $resolve, $stateParams, $location, $urlRouter, $browser) {
|
|
541
|
+
|
|
542
|
+
var TransitionSuperseded = $q.reject(new Error('transition superseded'));
|
|
543
|
+
var TransitionPrevented = $q.reject(new Error('transition prevented'));
|
|
544
|
+
var TransitionAborted = $q.reject(new Error('transition aborted'));
|
|
545
|
+
var TransitionFailed = $q.reject(new Error('transition failed'));
|
|
546
|
+
var currentLocation = $location.url();
|
|
547
|
+
var baseHref = $browser.baseHref();
|
|
548
|
+
|
|
549
|
+
function syncUrl() {
|
|
550
|
+
if ($location.url() !== currentLocation) {
|
|
551
|
+
$location.url(currentLocation);
|
|
552
|
+
$location.replace();
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
root.locals = { resolve: null, globals: { $stateParams: {} } };
|
|
557
|
+
$state = {
|
|
558
|
+
params: {},
|
|
559
|
+
current: root.self,
|
|
560
|
+
$current: root,
|
|
561
|
+
transition: null
|
|
562
|
+
};
|
|
563
|
+
|
|
564
|
+
/**
|
|
565
|
+
* @ngdoc function
|
|
566
|
+
* @name ui.router.state.$state#reload
|
|
567
|
+
* @methodOf ui.router.state.$state
|
|
568
|
+
*
|
|
569
|
+
* @description
|
|
570
|
+
* A method that force reloads the current state. All resolves are re-resolved, events are not re-fired,
|
|
571
|
+
* and controllers reinstantiated (bug with controllers reinstantiating right now, fixing soon).
|
|
572
|
+
*
|
|
573
|
+
* @example
|
|
574
|
+
* <pre>
|
|
575
|
+
* var app angular.module('app', ['ui.router']);
|
|
576
|
+
*
|
|
577
|
+
* app.controller('ctrl', function ($scope, $state) {
|
|
578
|
+
* $scope.reload = function(){
|
|
579
|
+
* $state.reload();
|
|
580
|
+
* }
|
|
581
|
+
* });
|
|
582
|
+
* </pre>
|
|
583
|
+
*
|
|
584
|
+
* `reload()` is just an alias for:
|
|
585
|
+
* <pre>
|
|
586
|
+
* $state.transitionTo($state.current, $stateParams, {
|
|
587
|
+
* reload: true, inherit: false, notify: false
|
|
588
|
+
* });
|
|
589
|
+
* </pre>
|
|
590
|
+
*/
|
|
591
|
+
$state.reload = function reload() {
|
|
592
|
+
$state.transitionTo($state.current, $stateParams, { reload: true, inherit: false, notify: false });
|
|
593
|
+
};
|
|
594
|
+
|
|
595
|
+
/**
|
|
596
|
+
* @ngdoc function
|
|
597
|
+
* @name ui.router.state.$state#go
|
|
598
|
+
* @methodOf ui.router.state.$state
|
|
599
|
+
*
|
|
600
|
+
* @description
|
|
601
|
+
* Convenience method for transitioning to a new state. `$state.go` calls
|
|
602
|
+
* `$state.transitionTo` internally but automatically sets options to
|
|
603
|
+
* `{ location: true, inherit: true, relative: $state.$current, notify: true }`.
|
|
604
|
+
* This allows you to easily use an absolute or relative to path and specify
|
|
605
|
+
* only the parameters you'd like to update (while letting unspecified parameters
|
|
606
|
+
* inherit from the currently active ancestor states).
|
|
607
|
+
*
|
|
608
|
+
* @example
|
|
609
|
+
* <pre>
|
|
610
|
+
* var app = angular.module('app', ['ui.router']);
|
|
611
|
+
*
|
|
612
|
+
* app.controller('ctrl', function ($scope, $state) {
|
|
613
|
+
* $scope.changeState = function () {
|
|
614
|
+
* $state.go('contact.detail');
|
|
615
|
+
* };
|
|
616
|
+
* });
|
|
617
|
+
* </pre>
|
|
618
|
+
* <img src='../ngdoc_assets/StateGoExamples.png'/>
|
|
619
|
+
*
|
|
620
|
+
* @param {string} to Absolute state name or relative state path. Some examples:
|
|
621
|
+
*
|
|
622
|
+
* - `$state.go('contact.detail')` - will go to the `contact.detail` state
|
|
623
|
+
* - `$state.go('^')` - will go to a parent state
|
|
624
|
+
* - `$state.go('^.sibling')` - will go to a sibling state
|
|
625
|
+
* - `$state.go('.child.grandchild')` - will go to grandchild state
|
|
626
|
+
*
|
|
627
|
+
* @param {object=} params A map of the parameters that will be sent to the state,
|
|
628
|
+
* will populate $stateParams. Any parameters that are not specified will be inherited from currently
|
|
629
|
+
* defined parameters. This allows, for example, going to a sibling state that shares parameters
|
|
630
|
+
* specified in a parent state. Parameter inheritance only works between common ancestor states, I.e.
|
|
631
|
+
* transitioning to a sibling will get you the parameters for all parents, transitioning to a child
|
|
632
|
+
* will get you all current parameters, etc.
|
|
633
|
+
* @param {object=} options Options object. The options are:
|
|
634
|
+
*
|
|
635
|
+
* - **`location`** - {boolean=true|string=} - If `true` will update the url in the location bar, if `false`
|
|
636
|
+
* will not. If string, must be `"replace"`, which will update url and also replace last history record.
|
|
637
|
+
* - **`inherit`** - {boolean=true}, If `true` will inherit url parameters from current url.
|
|
638
|
+
* - **`relative`** - {object=$state.$current}, When transitioning with relative path (e.g '^'),
|
|
639
|
+
* defines which state to be relative from.
|
|
640
|
+
* - **`notify`** - {boolean=true}, If `true` will broadcast $stateChangeStart and $stateChangeSuccess events.
|
|
641
|
+
* - **`reload`** (v0.2.5) - {boolean=false}, If `true` will force transition even if the state or params
|
|
642
|
+
* have not changed, aka a reload of the same state. It differs from reloadOnSearch because you'd
|
|
643
|
+
* use this when you want to force a reload when *everything* is the same, including search params.
|
|
644
|
+
*
|
|
645
|
+
* @returns {promise} A promise representing the state of the new transition.
|
|
646
|
+
*
|
|
647
|
+
* Possible success values:
|
|
648
|
+
*
|
|
649
|
+
* - $state.current
|
|
650
|
+
*
|
|
651
|
+
* <br/>Possible rejection values:
|
|
652
|
+
*
|
|
653
|
+
* - 'transition superseded' - when a newer transition has been started after this one
|
|
654
|
+
* - 'transition prevented' - when `event.preventDefault()` has been called in a `$stateChangeStart` listener
|
|
655
|
+
* - 'transition aborted' - when `event.preventDefault()` has been called in a `$stateNotFound` listener or
|
|
656
|
+
* when a `$stateNotFound` `event.retry` promise errors.
|
|
657
|
+
* - 'transition failed' - when a state has been unsuccessfully found after 2 tries.
|
|
658
|
+
* - *resolve error* - when an error has occurred with a `resolve`
|
|
659
|
+
*
|
|
660
|
+
*/
|
|
661
|
+
$state.go = function go(to, params, options) {
|
|
662
|
+
return this.transitionTo(to, params, extend({ inherit: true, relative: $state.$current }, options));
|
|
663
|
+
};
|
|
664
|
+
|
|
665
|
+
/**
|
|
666
|
+
* @ngdoc function
|
|
667
|
+
* @name ui.router.state.$state#transitionTo
|
|
668
|
+
* @methodOf ui.router.state.$state
|
|
669
|
+
*
|
|
670
|
+
* @description
|
|
671
|
+
* Low-level method for transitioning to a new state. {@link ui.router.state.$state#methods_go $state.go}
|
|
672
|
+
* uses `transitionTo` internally. `$state.go` is recommended in most situations.
|
|
673
|
+
*
|
|
674
|
+
* @example
|
|
675
|
+
* <pre>
|
|
676
|
+
* var app = angular.module('app', ['ui.router']);
|
|
677
|
+
*
|
|
678
|
+
* app.controller('ctrl', function ($scope, $state) {
|
|
679
|
+
* $scope.changeState = function () {
|
|
680
|
+
* $state.transitionTo('contact.detail');
|
|
681
|
+
* };
|
|
682
|
+
* });
|
|
683
|
+
* </pre>
|
|
684
|
+
*
|
|
685
|
+
* @param {string} to State name.
|
|
686
|
+
* @param {object=} toParams A map of the parameters that will be sent to the state,
|
|
687
|
+
* will populate $stateParams.
|
|
688
|
+
* @param {object=} options Options object. The options are:
|
|
689
|
+
*
|
|
690
|
+
* - **`location`** - {boolean=true|string=} - If `true` will update the url in the location bar, if `false`
|
|
691
|
+
* will not. If string, must be `"replace"`, which will update url and also replace last history record.
|
|
692
|
+
* - **`inherit`** - {boolean=false}, If `true` will inherit url parameters from current url.
|
|
693
|
+
* - **`relative`** - {object=}, When transitioning with relative path (e.g '^'),
|
|
694
|
+
* defines which state to be relative from.
|
|
695
|
+
* - **`notify`** - {boolean=true}, If `true` will broadcast $stateChangeStart and $stateChangeSuccess events.
|
|
696
|
+
* - **`reload`** (v0.2.5) - {boolean=false}, If `true` will force transition even if the state or params
|
|
697
|
+
* have not changed, aka a reload of the same state. It differs from reloadOnSearch because you'd
|
|
698
|
+
* use this when you want to force a reload when *everything* is the same, including search params.
|
|
699
|
+
*
|
|
700
|
+
* @returns {promise} A promise representing the state of the new transition. See
|
|
701
|
+
* {@link ui.router.state.$state#methods_go $state.go}.
|
|
702
|
+
*/
|
|
703
|
+
$state.transitionTo = function transitionTo(to, toParams, options) {
|
|
704
|
+
toParams = toParams || {};
|
|
705
|
+
options = extend({
|
|
706
|
+
location: true, inherit: false, relative: null, notify: true, reload: false, $retry: false
|
|
707
|
+
}, options || {});
|
|
708
|
+
|
|
709
|
+
var from = $state.$current, fromParams = $state.params, fromPath = from.path;
|
|
710
|
+
var evt, toState = findState(to, options.relative);
|
|
711
|
+
|
|
712
|
+
if (!isDefined(toState)) {
|
|
713
|
+
// Broadcast not found event and abort the transition if prevented
|
|
714
|
+
var redirect = { to: to, toParams: toParams, options: options };
|
|
715
|
+
|
|
716
|
+
/**
|
|
717
|
+
* @ngdoc event
|
|
718
|
+
* @name ui.router.state.$state#$stateNotFound
|
|
719
|
+
* @eventOf ui.router.state.$state
|
|
720
|
+
* @eventType broadcast on root scope
|
|
721
|
+
* @description
|
|
722
|
+
* Fired when a requested state **cannot be found** using the provided state name during transition.
|
|
723
|
+
* The event is broadcast allowing any handlers a single chance to deal with the error (usually by
|
|
724
|
+
* lazy-loading the unfound state). A special `unfoundState` object is passed to the listener handler,
|
|
725
|
+
* you can see its three properties in the example. You can use `event.preventDefault()` to abort the
|
|
726
|
+
* transition and the promise returned from `go` will be rejected with a `'transition aborted'` value.
|
|
727
|
+
*
|
|
728
|
+
* @param {Object} event Event object.
|
|
729
|
+
* @param {Object} unfoundState Unfound State information. Contains: `to, toParams, options` properties.
|
|
730
|
+
* @param {State} fromState Current state object.
|
|
731
|
+
* @param {Object} fromParams Current state params.
|
|
732
|
+
*
|
|
733
|
+
* @example
|
|
734
|
+
*
|
|
735
|
+
* <pre>
|
|
736
|
+
* // somewhere, assume lazy.state has not been defined
|
|
737
|
+
* $state.go("lazy.state", {a:1, b:2}, {inherit:false});
|
|
738
|
+
*
|
|
739
|
+
* // somewhere else
|
|
740
|
+
* $scope.$on('$stateNotFound',
|
|
741
|
+
* function(event, unfoundState, fromState, fromParams){
|
|
742
|
+
* console.log(unfoundState.to); // "lazy.state"
|
|
743
|
+
* console.log(unfoundState.toParams); // {a:1, b:2}
|
|
744
|
+
* console.log(unfoundState.options); // {inherit:false} + default options
|
|
745
|
+
* })
|
|
746
|
+
* </pre>
|
|
747
|
+
*/
|
|
748
|
+
evt = $rootScope.$broadcast('$stateNotFound', redirect, from.self, fromParams);
|
|
749
|
+
if (evt.defaultPrevented) {
|
|
750
|
+
syncUrl();
|
|
751
|
+
return TransitionAborted;
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
// Allow the handler to return a promise to defer state lookup retry
|
|
755
|
+
if (evt.retry) {
|
|
756
|
+
if (options.$retry) {
|
|
757
|
+
syncUrl();
|
|
758
|
+
return TransitionFailed;
|
|
759
|
+
}
|
|
760
|
+
var retryTransition = $state.transition = $q.when(evt.retry);
|
|
761
|
+
retryTransition.then(function() {
|
|
762
|
+
if (retryTransition !== $state.transition) return TransitionSuperseded;
|
|
763
|
+
redirect.options.$retry = true;
|
|
764
|
+
return $state.transitionTo(redirect.to, redirect.toParams, redirect.options);
|
|
765
|
+
}, function() {
|
|
766
|
+
return TransitionAborted;
|
|
767
|
+
});
|
|
768
|
+
syncUrl();
|
|
769
|
+
return retryTransition;
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
// Always retry once if the $stateNotFound was not prevented
|
|
773
|
+
// (handles either redirect changed or state lazy-definition)
|
|
774
|
+
to = redirect.to;
|
|
775
|
+
toParams = redirect.toParams;
|
|
776
|
+
options = redirect.options;
|
|
777
|
+
toState = findState(to, options.relative);
|
|
778
|
+
if (!isDefined(toState)) {
|
|
779
|
+
if (options.relative) throw new Error("Could not resolve '" + to + "' from state '" + options.relative + "'");
|
|
780
|
+
throw new Error("No such state '" + to + "'");
|
|
781
|
+
}
|
|
782
|
+
}
|
|
783
|
+
if (toState[abstractKey]) throw new Error("Cannot transition to abstract state '" + to + "'");
|
|
784
|
+
if (options.inherit) toParams = inheritParams($stateParams, toParams || {}, $state.$current, toState);
|
|
785
|
+
to = toState;
|
|
786
|
+
|
|
787
|
+
var toPath = to.path;
|
|
788
|
+
|
|
789
|
+
// Starting from the root of the path, keep all levels that haven't changed
|
|
790
|
+
var keep, state, locals = root.locals, toLocals = [];
|
|
791
|
+
for (keep = 0, state = toPath[keep];
|
|
792
|
+
state && state === fromPath[keep] && equalForKeys(toParams, fromParams, state.ownParams) && !options.reload;
|
|
793
|
+
keep++, state = toPath[keep]) {
|
|
794
|
+
locals = toLocals[keep] = state.locals;
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
// If we're going to the same state and all locals are kept, we've got nothing to do.
|
|
798
|
+
// But clear 'transition', as we still want to cancel any other pending transitions.
|
|
799
|
+
// TODO: We may not want to bump 'transition' if we're called from a location change that we've initiated ourselves,
|
|
800
|
+
// because we might accidentally abort a legitimate transition initiated from code?
|
|
801
|
+
if (shouldTriggerReload(to, from, locals, options) ) {
|
|
802
|
+
if ( to.self.reloadOnSearch !== false )
|
|
803
|
+
syncUrl();
|
|
804
|
+
$state.transition = null;
|
|
805
|
+
return $q.when($state.current);
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
// Normalize/filter parameters before we pass them to event handlers etc.
|
|
809
|
+
toParams = normalize(to.params, toParams || {});
|
|
810
|
+
|
|
811
|
+
// Broadcast start event and cancel the transition if requested
|
|
812
|
+
if (options.notify) {
|
|
813
|
+
/**
|
|
814
|
+
* @ngdoc event
|
|
815
|
+
* @name ui.router.state.$state#$stateChangeStart
|
|
816
|
+
* @eventOf ui.router.state.$state
|
|
817
|
+
* @eventType broadcast on root scope
|
|
818
|
+
* @description
|
|
819
|
+
* Fired when the state transition **begins**. You can use `event.preventDefault()`
|
|
820
|
+
* to prevent the transition from happening and then the transition promise will be
|
|
821
|
+
* rejected with a `'transition prevented'` value.
|
|
822
|
+
*
|
|
823
|
+
* @param {Object} event Event object.
|
|
824
|
+
* @param {State} toState The state being transitioned to.
|
|
825
|
+
* @param {Object} toParams The params supplied to the `toState`.
|
|
826
|
+
* @param {State} fromState The current state, pre-transition.
|
|
827
|
+
* @param {Object} fromParams The params supplied to the `fromState`.
|
|
828
|
+
*
|
|
829
|
+
* @example
|
|
830
|
+
*
|
|
831
|
+
* <pre>
|
|
832
|
+
* $rootScope.$on('$stateChangeStart',
|
|
833
|
+
* function(event, toState, toParams, fromState, fromParams){
|
|
834
|
+
* event.preventDefault();
|
|
835
|
+
* // transitionTo() promise will be rejected with
|
|
836
|
+
* // a 'transition prevented' error
|
|
837
|
+
* })
|
|
838
|
+
* </pre>
|
|
839
|
+
*/
|
|
840
|
+
evt = $rootScope.$broadcast('$stateChangeStart', to.self, toParams, from.self, fromParams);
|
|
841
|
+
if (evt.defaultPrevented) {
|
|
842
|
+
syncUrl();
|
|
843
|
+
return TransitionPrevented;
|
|
844
|
+
}
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
// Resolve locals for the remaining states, but don't update any global state just
|
|
848
|
+
// yet -- if anything fails to resolve the current state needs to remain untouched.
|
|
849
|
+
// We also set up an inheritance chain for the locals here. This allows the view directive
|
|
850
|
+
// to quickly look up the correct definition for each view in the current state. Even
|
|
851
|
+
// though we create the locals object itself outside resolveState(), it is initially
|
|
852
|
+
// empty and gets filled asynchronously. We need to keep track of the promise for the
|
|
853
|
+
// (fully resolved) current locals, and pass this down the chain.
|
|
854
|
+
var resolved = $q.when(locals);
|
|
855
|
+
for (var l=keep; l<toPath.length; l++, state=toPath[l]) {
|
|
856
|
+
locals = toLocals[l] = inherit(locals);
|
|
857
|
+
resolved = resolveState(state, toParams, state===to, resolved, locals);
|
|
858
|
+
}
|
|
859
|
+
|
|
860
|
+
// Once everything is resolved, we are ready to perform the actual transition
|
|
861
|
+
// and return a promise for the new state. We also keep track of what the
|
|
862
|
+
// current promise is, so that we can detect overlapping transitions and
|
|
863
|
+
// keep only the outcome of the last transition.
|
|
864
|
+
var transition = $state.transition = resolved.then(function () {
|
|
865
|
+
var l, entering, exiting;
|
|
866
|
+
|
|
867
|
+
if ($state.transition !== transition) return TransitionSuperseded;
|
|
868
|
+
|
|
869
|
+
// Exit 'from' states not kept
|
|
870
|
+
for (l=fromPath.length-1; l>=keep; l--) {
|
|
871
|
+
exiting = fromPath[l];
|
|
872
|
+
if (exiting.self.onExit) {
|
|
873
|
+
$injector.invoke(exiting.self.onExit, exiting.self, exiting.locals.globals);
|
|
874
|
+
}
|
|
875
|
+
exiting.locals = null;
|
|
876
|
+
}
|
|
877
|
+
|
|
878
|
+
// Enter 'to' states not kept
|
|
879
|
+
for (l=keep; l<toPath.length; l++) {
|
|
880
|
+
entering = toPath[l];
|
|
881
|
+
entering.locals = toLocals[l];
|
|
882
|
+
if (entering.self.onEnter) {
|
|
883
|
+
$injector.invoke(entering.self.onEnter, entering.self, entering.locals.globals);
|
|
884
|
+
}
|
|
885
|
+
}
|
|
886
|
+
|
|
887
|
+
// Run it again, to catch any transitions in callbacks
|
|
888
|
+
if ($state.transition !== transition) return TransitionSuperseded;
|
|
889
|
+
|
|
890
|
+
// Update globals in $state
|
|
891
|
+
$state.$current = to;
|
|
892
|
+
$state.current = to.self;
|
|
893
|
+
$state.params = toParams;
|
|
894
|
+
copy($state.params, $stateParams);
|
|
895
|
+
$state.transition = null;
|
|
896
|
+
|
|
897
|
+
// Update $location
|
|
898
|
+
var toNav = to.navigable;
|
|
899
|
+
if (options.location && toNav) {
|
|
900
|
+
$location.url(toNav.url.format(toNav.locals.globals.$stateParams));
|
|
901
|
+
|
|
902
|
+
if (options.location === 'replace') {
|
|
903
|
+
$location.replace();
|
|
904
|
+
}
|
|
905
|
+
}
|
|
906
|
+
|
|
907
|
+
if (options.notify) {
|
|
908
|
+
/**
|
|
909
|
+
* @ngdoc event
|
|
910
|
+
* @name ui.router.state.$state#$stateChangeSuccess
|
|
911
|
+
* @eventOf ui.router.state.$state
|
|
912
|
+
* @eventType broadcast on root scope
|
|
913
|
+
* @description
|
|
914
|
+
* Fired once the state transition is **complete**.
|
|
915
|
+
*
|
|
916
|
+
* @param {Object} event Event object.
|
|
917
|
+
* @param {State} toState The state being transitioned to.
|
|
918
|
+
* @param {Object} toParams The params supplied to the `toState`.
|
|
919
|
+
* @param {State} fromState The current state, pre-transition.
|
|
920
|
+
* @param {Object} fromParams The params supplied to the `fromState`.
|
|
921
|
+
*/
|
|
922
|
+
$rootScope.$broadcast('$stateChangeSuccess', to.self, toParams, from.self, fromParams);
|
|
923
|
+
}
|
|
924
|
+
currentLocation = $location.url();
|
|
925
|
+
|
|
926
|
+
return $state.current;
|
|
927
|
+
}, function (error) {
|
|
928
|
+
if ($state.transition !== transition) return TransitionSuperseded;
|
|
929
|
+
|
|
930
|
+
$state.transition = null;
|
|
931
|
+
/**
|
|
932
|
+
* @ngdoc event
|
|
933
|
+
* @name ui.router.state.$state#$stateChangeError
|
|
934
|
+
* @eventOf ui.router.state.$state
|
|
935
|
+
* @eventType broadcast on root scope
|
|
936
|
+
* @description
|
|
937
|
+
* Fired when an **error occurs** during transition. It's important to note that if you
|
|
938
|
+
* have any errors in your resolve functions (javascript errors, non-existent services, etc)
|
|
939
|
+
* they will not throw traditionally. You must listen for this $stateChangeError event to
|
|
940
|
+
* catch **ALL** errors.
|
|
941
|
+
*
|
|
942
|
+
* @param {Object} event Event object.
|
|
943
|
+
* @param {State} toState The state being transitioned to.
|
|
944
|
+
* @param {Object} toParams The params supplied to the `toState`.
|
|
945
|
+
* @param {State} fromState The current state, pre-transition.
|
|
946
|
+
* @param {Object} fromParams The params supplied to the `fromState`.
|
|
947
|
+
* @param {Error} error The resolve error object.
|
|
948
|
+
*/
|
|
949
|
+
$rootScope.$broadcast('$stateChangeError', to.self, toParams, from.self, fromParams, error);
|
|
950
|
+
syncUrl();
|
|
951
|
+
|
|
952
|
+
return $q.reject(error);
|
|
953
|
+
});
|
|
954
|
+
|
|
955
|
+
return transition;
|
|
956
|
+
};
|
|
957
|
+
|
|
958
|
+
/**
|
|
959
|
+
* @ngdoc function
|
|
960
|
+
* @name ui.router.state.$state#is
|
|
961
|
+
* @methodOf ui.router.state.$state
|
|
962
|
+
*
|
|
963
|
+
* @description
|
|
964
|
+
* Similar to {@link ui.router.state.$state#methods_includes $state.includes},
|
|
965
|
+
* but only checks for the full state name. If params is supplied then it will be
|
|
966
|
+
* tested for strict equality against the current active params object, so all params
|
|
967
|
+
* must match with none missing and no extras.
|
|
968
|
+
*
|
|
969
|
+
* @example
|
|
970
|
+
* <pre>
|
|
971
|
+
* $state.is('contact.details.item'); // returns true
|
|
972
|
+
* $state.is(contactDetailItemStateObject); // returns true
|
|
973
|
+
*
|
|
974
|
+
* // everything else would return false
|
|
975
|
+
* </pre>
|
|
976
|
+
*
|
|
977
|
+
* @param {string|object} stateName The state name or state object you'd like to check.
|
|
978
|
+
* @param {object=} params A param object, e.g. `{sectionId: section.id}`, that you'd like
|
|
979
|
+
* to test against the current active state.
|
|
980
|
+
* @returns {boolean} Returns true if it is the state.
|
|
981
|
+
*/
|
|
982
|
+
$state.is = function is(stateOrName, params) {
|
|
983
|
+
var state = findState(stateOrName);
|
|
984
|
+
|
|
985
|
+
if (!isDefined(state)) {
|
|
986
|
+
return undefined;
|
|
987
|
+
}
|
|
988
|
+
|
|
989
|
+
if ($state.$current !== state) {
|
|
990
|
+
return false;
|
|
991
|
+
}
|
|
992
|
+
|
|
993
|
+
return isDefined(params) && params !== null ? angular.equals($stateParams, params) : true;
|
|
994
|
+
};
|
|
995
|
+
|
|
996
|
+
/**
|
|
997
|
+
* @ngdoc function
|
|
998
|
+
* @name ui.router.state.$state#includes
|
|
999
|
+
* @methodOf ui.router.state.$state
|
|
1000
|
+
*
|
|
1001
|
+
* @description
|
|
1002
|
+
* A method to determine if the current active state is equal to or is the child of the
|
|
1003
|
+
* state stateName. If any params are passed then they will be tested for a match as well.
|
|
1004
|
+
* Not all the parameters need to be passed, just the ones you'd like to test for equality.
|
|
1005
|
+
*
|
|
1006
|
+
* @example
|
|
1007
|
+
* <pre>
|
|
1008
|
+
* $state.$current.name = 'contacts.details.item';
|
|
1009
|
+
*
|
|
1010
|
+
* $state.includes("contacts"); // returns true
|
|
1011
|
+
* $state.includes("contacts.details"); // returns true
|
|
1012
|
+
* $state.includes("contacts.details.item"); // returns true
|
|
1013
|
+
* $state.includes("contacts.list"); // returns false
|
|
1014
|
+
* $state.includes("about"); // returns false
|
|
1015
|
+
* </pre>
|
|
1016
|
+
*
|
|
1017
|
+
* @description
|
|
1018
|
+
* Basic globing patterns will also work.
|
|
1019
|
+
*
|
|
1020
|
+
* @example
|
|
1021
|
+
* <pre>
|
|
1022
|
+
* $state.$current.name = 'contacts.details.item.url';
|
|
1023
|
+
*
|
|
1024
|
+
* $state.includes("*.details.*.*"); // returns true
|
|
1025
|
+
* $state.includes("*.details.**"); // returns true
|
|
1026
|
+
* $state.includes("**.item.**"); // returns true
|
|
1027
|
+
* $state.includes("*.details.item.url"); // returns true
|
|
1028
|
+
* $state.includes("*.details.*.url"); // returns true
|
|
1029
|
+
* $state.includes("*.details.*"); // returns false
|
|
1030
|
+
* $state.includes("item.**"); // returns false
|
|
1031
|
+
* </pre>
|
|
1032
|
+
*
|
|
1033
|
+
* @param {string} stateOrName A partial name to be searched for within the current state name.
|
|
1034
|
+
* @param {object} params A param object, e.g. `{sectionId: section.id}`,
|
|
1035
|
+
* that you'd like to test against the current active state.
|
|
1036
|
+
* @returns {boolean} Returns true if it does include the state
|
|
1037
|
+
*/
|
|
1038
|
+
|
|
1039
|
+
$state.includes = function includes(stateOrName, params) {
|
|
1040
|
+
if (isString(stateOrName) && isGlob(stateOrName)) {
|
|
1041
|
+
if (doesStateMatchGlob(stateOrName)) {
|
|
1042
|
+
stateOrName = $state.$current.name;
|
|
1043
|
+
} else {
|
|
1044
|
+
return false;
|
|
1045
|
+
}
|
|
1046
|
+
}
|
|
1047
|
+
|
|
1048
|
+
var state = findState(stateOrName);
|
|
1049
|
+
if (!isDefined(state)) {
|
|
1050
|
+
return undefined;
|
|
1051
|
+
}
|
|
1052
|
+
|
|
1053
|
+
if (!isDefined($state.$current.includes[state.name])) {
|
|
1054
|
+
return false;
|
|
1055
|
+
}
|
|
1056
|
+
|
|
1057
|
+
var validParams = true;
|
|
1058
|
+
angular.forEach(params, function(value, key) {
|
|
1059
|
+
if (!isDefined($stateParams[key]) || $stateParams[key] !== value) {
|
|
1060
|
+
validParams = false;
|
|
1061
|
+
}
|
|
1062
|
+
});
|
|
1063
|
+
return validParams;
|
|
1064
|
+
};
|
|
1065
|
+
|
|
1066
|
+
|
|
1067
|
+
/**
|
|
1068
|
+
* @ngdoc function
|
|
1069
|
+
* @name ui.router.state.$state#href
|
|
1070
|
+
* @methodOf ui.router.state.$state
|
|
1071
|
+
*
|
|
1072
|
+
* @description
|
|
1073
|
+
* A url generation method that returns the compiled url for the given state populated with the given params.
|
|
1074
|
+
*
|
|
1075
|
+
* @example
|
|
1076
|
+
* <pre>
|
|
1077
|
+
* expect($state.href("about.person", { person: "bob" })).toEqual("/about/bob");
|
|
1078
|
+
* </pre>
|
|
1079
|
+
*
|
|
1080
|
+
* @param {string|object} stateOrName The state name or state object you'd like to generate a url from.
|
|
1081
|
+
* @param {object=} params An object of parameter values to fill the state's required parameters.
|
|
1082
|
+
* @param {object=} options Options object. The options are:
|
|
1083
|
+
*
|
|
1084
|
+
* - **`lossy`** - {boolean=true} - If true, and if there is no url associated with the state provided in the
|
|
1085
|
+
* first parameter, then the constructed href url will be built from the first navigable ancestor (aka
|
|
1086
|
+
* ancestor with a valid url).
|
|
1087
|
+
* - **`inherit`** - {boolean=false}, If `true` will inherit url parameters from current url.
|
|
1088
|
+
* - **`relative`** - {object=$state.$current}, When transitioning with relative path (e.g '^'),
|
|
1089
|
+
* defines which state to be relative from.
|
|
1090
|
+
* - **`absolute`** - {boolean=false}, If true will generate an absolute url, e.g. "http://www.example.com/fullurl".
|
|
1091
|
+
*
|
|
1092
|
+
* @returns {string} compiled state url
|
|
1093
|
+
*/
|
|
1094
|
+
$state.href = function href(stateOrName, params, options) {
|
|
1095
|
+
options = extend({ lossy: true, inherit: false, absolute: false, relative: $state.$current }, options || {});
|
|
1096
|
+
var state = findState(stateOrName, options.relative);
|
|
1097
|
+
if (!isDefined(state)) return null;
|
|
1098
|
+
|
|
1099
|
+
params = inheritParams($stateParams, params || {}, $state.$current, state);
|
|
1100
|
+
var nav = (state && options.lossy) ? state.navigable : state;
|
|
1101
|
+
var url = (nav && nav.url) ? nav.url.format(normalize(state.params, params || {})) : null;
|
|
1102
|
+
if (!$locationProvider.html5Mode() && url) {
|
|
1103
|
+
url = "#" + $locationProvider.hashPrefix() + url;
|
|
1104
|
+
}
|
|
1105
|
+
|
|
1106
|
+
if (baseHref !== '/') {
|
|
1107
|
+
if ($locationProvider.html5Mode()) {
|
|
1108
|
+
url = baseHref.slice(0, -1) + url;
|
|
1109
|
+
} else if (options.absolute){
|
|
1110
|
+
url = baseHref.slice(1) + url;
|
|
1111
|
+
}
|
|
1112
|
+
}
|
|
1113
|
+
|
|
1114
|
+
if (options.absolute && url) {
|
|
1115
|
+
url = $location.protocol() + '://' +
|
|
1116
|
+
$location.host() +
|
|
1117
|
+
($location.port() == 80 || $location.port() == 443 ? '' : ':' + $location.port()) +
|
|
1118
|
+
(!$locationProvider.html5Mode() && url ? '/' : '') +
|
|
1119
|
+
url;
|
|
1120
|
+
}
|
|
1121
|
+
return url;
|
|
1122
|
+
};
|
|
1123
|
+
|
|
1124
|
+
/**
|
|
1125
|
+
* @ngdoc function
|
|
1126
|
+
* @name ui.router.state.$state#get
|
|
1127
|
+
* @methodOf ui.router.state.$state
|
|
1128
|
+
*
|
|
1129
|
+
* @description
|
|
1130
|
+
* Returns the state configuration object for any specific state or all states.
|
|
1131
|
+
*
|
|
1132
|
+
* @param {string|object=} stateOrName If provided, will only get the config for
|
|
1133
|
+
* the requested state. If not provided, returns an array of ALL state configs.
|
|
1134
|
+
* @returns {object|array} State configuration object or array of all objects.
|
|
1135
|
+
*/
|
|
1136
|
+
$state.get = function (stateOrName, context) {
|
|
1137
|
+
if (!isDefined(stateOrName)) {
|
|
1138
|
+
var list = [];
|
|
1139
|
+
forEach(states, function(state) { list.push(state.self); });
|
|
1140
|
+
return list;
|
|
1141
|
+
}
|
|
1142
|
+
var state = findState(stateOrName, context);
|
|
1143
|
+
return (state && state.self) ? state.self : null;
|
|
1144
|
+
};
|
|
1145
|
+
|
|
1146
|
+
function resolveState(state, params, paramsAreFiltered, inherited, dst) {
|
|
1147
|
+
// Make a restricted $stateParams with only the parameters that apply to this state if
|
|
1148
|
+
// necessary. In addition to being available to the controller and onEnter/onExit callbacks,
|
|
1149
|
+
// we also need $stateParams to be available for any $injector calls we make during the
|
|
1150
|
+
// dependency resolution process.
|
|
1151
|
+
var $stateParams = (paramsAreFiltered) ? params : filterByKeys(state.params, params);
|
|
1152
|
+
var locals = { $stateParams: $stateParams };
|
|
1153
|
+
|
|
1154
|
+
// Resolve 'global' dependencies for the state, i.e. those not specific to a view.
|
|
1155
|
+
// We're also including $stateParams in this; that way the parameters are restricted
|
|
1156
|
+
// to the set that should be visible to the state, and are independent of when we update
|
|
1157
|
+
// the global $state and $stateParams values.
|
|
1158
|
+
dst.resolve = $resolve.resolve(state.resolve, locals, dst.resolve, state);
|
|
1159
|
+
var promises = [ dst.resolve.then(function (globals) {
|
|
1160
|
+
dst.globals = globals;
|
|
1161
|
+
}) ];
|
|
1162
|
+
if (inherited) promises.push(inherited);
|
|
1163
|
+
|
|
1164
|
+
// Resolve template and dependencies for all views.
|
|
1165
|
+
forEach(state.views, function (view, name) {
|
|
1166
|
+
var injectables = (view.resolve && view.resolve !== state.resolve ? view.resolve : {});
|
|
1167
|
+
injectables.$template = [ function () {
|
|
1168
|
+
return $view.load(name, { view: view, locals: locals, params: $stateParams, notify: false }) || '';
|
|
1169
|
+
}];
|
|
1170
|
+
|
|
1171
|
+
promises.push($resolve.resolve(injectables, locals, dst.resolve, state).then(function (result) {
|
|
1172
|
+
// References to the controller (only instantiated at link time)
|
|
1173
|
+
if (isFunction(view.controllerProvider) || isArray(view.controllerProvider)) {
|
|
1174
|
+
var injectLocals = angular.extend({}, injectables, locals);
|
|
1175
|
+
result.$$controller = $injector.invoke(view.controllerProvider, null, injectLocals);
|
|
1176
|
+
} else {
|
|
1177
|
+
result.$$controller = view.controller;
|
|
1178
|
+
}
|
|
1179
|
+
// Provide access to the state itself for internal use
|
|
1180
|
+
result.$$state = state;
|
|
1181
|
+
result.$$controllerAs = view.controllerAs;
|
|
1182
|
+
dst[name] = result;
|
|
1183
|
+
}));
|
|
1184
|
+
});
|
|
1185
|
+
|
|
1186
|
+
// Wait for all the promises and then return the activation object
|
|
1187
|
+
return $q.all(promises).then(function (values) {
|
|
1188
|
+
return dst;
|
|
1189
|
+
});
|
|
1190
|
+
}
|
|
1191
|
+
|
|
1192
|
+
return $state;
|
|
1193
|
+
}
|
|
1194
|
+
|
|
1195
|
+
function shouldTriggerReload(to, from, locals, options) {
|
|
1196
|
+
if ( to === from && ((locals === from.locals && !options.reload) || (to.self.reloadOnSearch === false)) ) {
|
|
1197
|
+
return true;
|
|
1198
|
+
}
|
|
1199
|
+
}
|
|
1200
|
+
}
|
|
1201
|
+
|
|
1202
|
+
angular.module('ui.router.state')
|
|
1203
|
+
.value('$stateParams', {})
|
|
1204
|
+
.provider('$state', $StateProvider);
|