praxis 0.16.1 → 0.17.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rspec +0 -1
- data/.ruby-version +1 -1
- data/.travis.yml +2 -1
- data/CHANGELOG.md +41 -0
- data/CONTRIBUTING.md +3 -0
- data/lib/api_browser/Gruntfile.js +20 -4
- data/lib/api_browser/app/bower_components/angular-mocks/.bower.json +6 -6
- data/lib/api_browser/app/bower_components/angular-mocks/README.md +11 -5
- data/lib/api_browser/app/bower_components/angular-mocks/angular-mocks.js +475 -216
- data/lib/api_browser/app/bower_components/angular-mocks/bower.json +2 -2
- data/lib/api_browser/app/bower_components/angular-mocks/ngAnimateMock.js +2 -0
- data/lib/api_browser/app/bower_components/angular-mocks/ngMock.js +2 -0
- data/lib/api_browser/app/bower_components/angular-mocks/ngMockE2E.js +2 -0
- data/lib/api_browser/app/bower_components/angular-mocks/package.json +1 -1
- data/lib/api_browser/app/bower_components/angular-sanitize/.bower.json +8 -8
- data/lib/api_browser/app/bower_components/angular-sanitize/README.md +19 -5
- data/lib/api_browser/app/bower_components/angular-sanitize/angular-sanitize.js +186 -127
- data/lib/api_browser/app/bower_components/angular-sanitize/angular-sanitize.min.js +12 -10
- data/lib/api_browser/app/bower_components/angular-sanitize/angular-sanitize.min.js.map +3 -3
- data/lib/api_browser/app/bower_components/angular-sanitize/bower.json +3 -2
- data/lib/api_browser/app/bower_components/angular-sanitize/index.js +2 -0
- data/lib/api_browser/app/bower_components/angular-sanitize/package.json +26 -0
- data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/.bower.json +15 -8
- data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/bower.json +11 -3
- data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/ui-bootstrap-csp.css +6 -0
- data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/ui-bootstrap-tpls.js +1177 -453
- data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/ui-bootstrap-tpls.min.js +4 -4
- data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/ui-bootstrap.js +1066 -404
- data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/ui-bootstrap.min.js +3 -3
- data/lib/api_browser/app/bower_components/angular-ui-router/.bower.json +5 -6
- data/lib/api_browser/app/bower_components/angular-ui-router/CHANGELOG.md +208 -3
- data/lib/api_browser/app/bower_components/angular-ui-router/CONTRIBUTING.md +65 -0
- data/lib/api_browser/app/bower_components/angular-ui-router/LICENSE +1 -1
- data/lib/api_browser/app/bower_components/angular-ui-router/README.md +36 -71
- data/lib/api_browser/app/bower_components/angular-ui-router/api/angular-ui-router.d.ts +126 -0
- data/lib/api_browser/app/bower_components/angular-ui-router/bower.json +1 -1
- data/lib/api_browser/app/bower_components/angular-ui-router/release/angular-ui-router.js +1902 -755
- data/lib/api_browser/app/bower_components/angular-ui-router/release/angular-ui-router.min.js +2 -2
- data/lib/api_browser/app/bower_components/angular-ui-router/src/common.js +69 -23
- data/lib/api_browser/app/bower_components/angular-ui-router/src/resolve.js +15 -5
- data/lib/api_browser/app/bower_components/angular-ui-router/src/state.js +556 -295
- data/lib/api_browser/app/bower_components/angular-ui-router/src/stateDirectives.js +101 -42
- data/lib/api_browser/app/bower_components/angular-ui-router/src/stateFilters.js +6 -2
- data/lib/api_browser/app/bower_components/angular-ui-router/src/templateFactory.js +2 -2
- data/lib/api_browser/app/bower_components/angular-ui-router/src/urlMatcherFactory.js +822 -97
- data/lib/api_browser/app/bower_components/angular-ui-router/src/urlRouter.js +274 -120
- data/lib/api_browser/app/bower_components/angular-ui-router/src/viewDirective.js +33 -20
- data/lib/api_browser/app/bower_components/angular-ui-router/src/viewScroll.js +1 -1
- data/lib/api_browser/app/bower_components/angular/.bower.json +5 -5
- data/lib/api_browser/app/bower_components/angular/README.md +2 -5
- data/lib/api_browser/app/bower_components/angular/angular-csp.css +5 -8
- data/lib/api_browser/app/bower_components/angular/angular.js +12975 -6996
- data/lib/api_browser/app/bower_components/angular/angular.min.js +285 -213
- 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 +3 -3
- data/lib/api_browser/app/bower_components/angular/bower.json +1 -1
- data/lib/api_browser/app/bower_components/angular/index.js +2 -0
- data/lib/api_browser/app/bower_components/angular/package.json +2 -2
- data/lib/api_browser/app/bower_components/bootstrap-sass/.bower.json +31 -16
- data/lib/api_browser/app/bower_components/bootstrap-sass/CHANGELOG.md +108 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/CONTRIBUTING.md +55 -37
- data/lib/api_browser/app/bower_components/bootstrap-sass/README.md +147 -206
- data/lib/api_browser/app/bower_components/bootstrap-sass/bower.json +19 -8
- data/lib/api_browser/app/bower_components/bootstrap-sass/{dist/fonts → vendor/assets/fonts/bootstrap}/glyphicons-halflings-regular.eot +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{dist/fonts → vendor/assets/fonts/bootstrap}/glyphicons-halflings-regular.svg +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{dist/fonts → vendor/assets/fonts/bootstrap}/glyphicons-halflings-regular.ttf +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{dist/fonts → vendor/assets/fonts/bootstrap}/glyphicons-halflings-regular.woff +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/javascripts/bootstrap.js +12 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/affix.js +1 -1
- data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/alert.js +1 -1
- data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/button.js +11 -5
- data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/carousel.js +5 -5
- data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/collapse.js +1 -1
- data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/dropdown.js +5 -5
- data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/modal.js +1 -1
- data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/popover.js +1 -1
- data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/scrollspy.js +2 -2
- data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/tab.js +1 -1
- data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/tooltip.js +1 -1
- data/lib/api_browser/app/bower_components/bootstrap-sass/{js → vendor/assets/javascripts/bootstrap}/transition.js +1 -1
- data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap.scss +1 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_alerts.scss +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_badges.scss +6 -6
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_breadcrumbs.scss +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_button-groups.scss +7 -33
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_buttons.scss +2 -5
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_carousel.scss +1 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_close.scss +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_code.scss +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_component-animations.scss +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_dropdowns.scss +3 -8
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_forms.scss +11 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_glyphicons.scss +5 -5
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_grid.scss +12 -26
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_input-groups.scss +1 -1
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_jumbotron.scss +8 -2
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_labels.scss +6 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_list-group.scss +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_media.scss +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_mixins.scss +38 -51
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_modals.scss +2 -5
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_navbar.scss +41 -53
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_navs.scss +0 -20
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_normalize.scss +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_pager.scss +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_pagination.scss +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_panels.scss +11 -1
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_popovers.scss +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_print.scss +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_progress-bars.scss +0 -12
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_responsive-utilities.scss +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_scaffolding.scss +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_tables.scss +5 -18
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_theme.scss +2 -2
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_thumbnails.scss +9 -3
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_tooltip.scss +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_type.scss +54 -52
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_utilities.scss +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_variables.scss +20 -11
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/_wells.scss +0 -0
- data/lib/api_browser/app/bower_components/bootstrap-sass/{lib → vendor/assets/stylesheets/bootstrap}/bootstrap.scss +0 -0
- data/lib/api_browser/app/bower_components/lodash/.bower.json +9 -13
- data/lib/api_browser/app/bower_components/lodash/LICENSE.txt +3 -3
- data/lib/api_browser/app/bower_components/lodash/bower.json +4 -7
- data/lib/api_browser/app/bower_components/lodash/lodash.js +12235 -0
- data/lib/api_browser/app/bower_components/lodash/lodash.min.js +98 -0
- data/lib/api_browser/app/index.html +0 -1
- data/lib/api_browser/app/js/app.js +2 -5
- data/lib/api_browser/app/js/controllers/action.js +21 -37
- data/lib/api_browser/app/js/controllers/controller.js +23 -1
- data/lib/api_browser/app/js/controllers/menu.js +46 -14
- data/lib/api_browser/app/js/controllers/type.js +2 -9
- data/lib/api_browser/app/js/directives/attribute_description.js +15 -5
- data/lib/api_browser/app/js/directives/attribute_table.js +6 -6
- data/lib/api_browser/app/js/directives/fixed_if_fits.js +20 -0
- data/lib/api_browser/app/js/directives/no_container.js +6 -6
- data/lib/api_browser/app/js/directives/type_placeholder.js +21 -0
- data/lib/api_browser/app/js/factories/Configuration.js +13 -0
- data/lib/api_browser/app/js/factories/Documentation.js +0 -3
- data/lib/api_browser/app/js/factories/normalize_attributes.js +19 -0
- data/lib/api_browser/app/js/factories/template_for.js +113 -0
- data/lib/api_browser/app/sass/modules/_body.scss +26 -4
- data/lib/api_browser/app/sass/modules/_sidebar.scss +68 -1
- data/lib/api_browser/app/sass/praxis.scss +1 -5
- data/lib/api_browser/app/sass/variables/_bootstrap-variables.scss +13 -4
- data/lib/api_browser/app/views/action.html +13 -17
- data/lib/api_browser/app/views/controller.html +32 -4
- data/lib/api_browser/app/views/directives/attribute_description.html +1 -1
- data/lib/api_browser/app/views/directives/attribute_description/{_default.html → default.html} +0 -0
- data/lib/api_browser/app/views/directives/attribute_description/example.html +13 -0
- data/lib/api_browser/app/views/directives/attribute_description/headers.html +8 -0
- data/lib/api_browser/app/views/directives/attribute_description/member_options.html +4 -0
- data/lib/api_browser/app/views/directives/attribute_description/values.html +14 -0
- data/lib/api_browser/app/views/directives/attribute_table.html +2 -2
- data/lib/api_browser/app/views/home.html +1 -3
- data/lib/api_browser/app/views/layout.html +3 -36
- data/lib/api_browser/app/views/menu.html +45 -0
- data/lib/api_browser/app/views/navbar.html +1 -1
- data/lib/api_browser/app/views/type.html +2 -2
- data/lib/api_browser/app/views/type/{_details.html → details.html} +6 -6
- data/lib/api_browser/app/views/types/embedded/default.html +10 -0
- data/lib/api_browser/app/views/types/embedded/links.html +11 -0
- data/lib/api_browser/app/views/types/embedded/struct.html +2 -0
- data/lib/api_browser/app/views/types/label/link.html +1 -0
- data/lib/api_browser/app/views/types/label/primitive.html +1 -0
- data/lib/api_browser/app/views/types/label/primitive_collection.html +1 -0
- data/lib/api_browser/app/views/types/label/type.html +1 -0
- data/lib/api_browser/app/views/types/label/type_collection.html +1 -0
- data/lib/api_browser/app/views/{directives/request_body/_default.html → types/standalone/default.html} +1 -1
- data/lib/api_browser/app/views/types/standalone/struct.html +1 -0
- data/lib/api_browser/bower.json +9 -9
- data/lib/api_browser/package.json +1 -1
- data/lib/praxis.rb +10 -4
- data/lib/praxis/action_definition.rb +16 -4
- data/lib/praxis/action_definition/headers_dsl_compiler.rb +5 -2
- data/lib/praxis/api_definition.rb +3 -1
- data/lib/praxis/api_general_info.rb +49 -5
- data/lib/praxis/application.rb +12 -4
- data/lib/praxis/bootloader.rb +1 -0
- data/lib/praxis/bootloader_stages/environment.rb +2 -0
- data/lib/praxis/bootloader_stages/routing.rb +1 -1
- data/lib/praxis/bootloader_stages/subgroup_loader.rb +1 -0
- data/lib/praxis/exceptions/validation.rb +7 -0
- data/lib/praxis/handlers/plain.rb +16 -0
- data/lib/praxis/handlers/xml.rb +4 -4
- data/lib/praxis/links.rb +13 -3
- data/lib/praxis/media_type_identifier.rb +3 -0
- data/lib/praxis/multipart/parser.rb +41 -48
- data/lib/praxis/multipart/part.rb +196 -3
- data/lib/praxis/request.rb +14 -11
- data/lib/praxis/request_stages/request_stage.rb +4 -0
- data/lib/praxis/request_stages/response.rb +10 -9
- data/lib/praxis/request_stages/validate.rb +1 -7
- data/lib/praxis/request_stages/validate_params_and_headers.rb +30 -5
- data/lib/praxis/request_stages/validate_payload.rb +14 -5
- data/lib/praxis/resource_definition.rb +117 -15
- data/lib/praxis/response.rb +6 -5
- data/lib/praxis/response_definition.rb +51 -5
- data/lib/praxis/responses/http.rb +5 -0
- data/lib/praxis/responses/multipart_ok.rb +51 -0
- data/lib/praxis/responses/validation_error.rb +7 -7
- data/lib/praxis/restful_doc_generator.rb +9 -4
- data/lib/praxis/route.rb +3 -2
- data/lib/praxis/router.rb +26 -16
- data/lib/praxis/router/rack.rb +51 -0
- data/lib/praxis/router/simple.rb +146 -0
- data/lib/praxis/routing_config.rb +2 -2
- data/lib/praxis/trait.rb +1 -1
- data/lib/praxis/types/fuzzy_hash.rb +49 -0
- data/lib/praxis/types/media_type_common.rb +1 -1
- data/lib/praxis/types/multipart.rb +47 -12
- data/lib/praxis/types/multipart_array.rb +320 -0
- data/lib/praxis/types/multipart_array/part_definition.rb +52 -0
- data/lib/praxis/validation_handler.rb +10 -0
- data/lib/praxis/version.rb +2 -2
- data/praxis.gemspec +3 -3
- data/spec/api_browser/directives/type_placeholder_spec.js +134 -0
- data/spec/api_browser/factories/normalize_attributes_spec.js +97 -0
- data/spec/api_browser/factories/template_for_spec.js +67 -0
- data/spec/functional_spec.rb +111 -45
- data/spec/praxis/action_definition_spec.rb +31 -7
- data/spec/praxis/api_definition_spec.rb +2 -2
- data/spec/praxis/api_general_info_spec.rb +25 -0
- data/spec/praxis/application_spec.rb +24 -11
- data/spec/praxis/handlers/xml_spec.rb +55 -33
- data/spec/praxis/links_spec.rb +18 -1
- data/spec/praxis/media_type_collection_spec.rb +1 -1
- data/spec/praxis/media_type_spec.rb +2 -2
- data/spec/praxis/multipart/parser_spec.rb +21 -13
- data/spec/praxis/plugins/praxis_mapper_plugin_spec.rb +1 -1
- data/spec/praxis/request_spec.rb +52 -24
- data/spec/praxis/{request_stages_action_spec.rb → request_stages/action_spec.rb} +1 -1
- data/spec/praxis/{request_stage_spec.rb → request_stages/request_stage_spec.rb} +0 -0
- data/spec/praxis/{request_stages_validate_spec.rb → request_stages/validate_spec.rb} +1 -1
- data/spec/praxis/resource_definition_spec.rb +30 -4
- data/spec/praxis/response_definition_spec.rb +60 -19
- data/spec/praxis/response_spec.rb +2 -2
- data/spec/praxis/responses/validation_error_spec.rb +33 -16
- data/spec/praxis/route_spec.rb +4 -2
- data/spec/praxis/router_spec.rb +28 -12
- data/spec/praxis/routing_config_spec.rb +11 -5
- data/spec/praxis/types/collection_spec.rb +1 -1
- data/spec/praxis/types/fuzzy_hash_spec.rb +20 -0
- data/spec/praxis/types/multipart_array/part_definition_spec.rb +5 -0
- data/spec/praxis/types/multipart_array_spec.rb +334 -0
- data/spec/praxis/types/multipart_spec.rb +14 -5
- data/spec/spec_app/app/controllers/instances.rb +20 -10
- data/spec/spec_app/app/controllers/volumes.rb +8 -4
- data/spec/spec_app/app/responses/bulk_response.rb +0 -6
- data/spec/spec_app/config/environment.rb +13 -0
- data/spec/spec_app/design/api.rb +7 -10
- data/spec/spec_app/design/media_types/instance.rb +3 -1
- data/spec/spec_app/design/resources/instances.rb +50 -41
- data/spec/spec_app/design/resources/volume_snapshots.rb +39 -0
- data/spec/spec_app/design/resources/volumes.rb +11 -6
- data/spec/spec_helper.rb +3 -1
- metadata +125 -218
- data/lib/api_browser/app/bower_components/angular-ui-router/src/compat.js +0 -146
- data/lib/api_browser/app/bower_components/bootstrap-sass/CNAME +0 -1
- data/lib/api_browser/app/bower_components/bootstrap-sass/DOCS-LICENSE +0 -319
- data/lib/api_browser/app/bower_components/bootstrap-sass/Gemfile +0 -5
- data/lib/api_browser/app/bower_components/bootstrap-sass/Gemfile.lock +0 -14
- data/lib/api_browser/app/bower_components/bootstrap-sass/Gruntfile.js +0 -244
- data/lib/api_browser/app/bower_components/bootstrap-sass/LICENSE +0 -176
- data/lib/api_browser/app/bower_components/bootstrap-sass/LICENSE-MIT +0 -21
- data/lib/api_browser/app/bower_components/bootstrap-sass/Rakefile +0 -44
- data/lib/api_browser/app/bower_components/bootstrap-sass/_config.yml +0 -25
- data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/ads.html +0 -1
- data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/footer.html +0 -34
- data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/header.html +0 -42
- data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-about.html +0 -12
- data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-components.html +0 -137
- data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-css.html +0 -99
- data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-customize.html +0 -40
- data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-getting-started.html +0 -44
- data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-javascript.html +0 -88
- data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/nav-main.html +0 -37
- data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/old-bs-docs.html +0 -8
- data/lib/api_browser/app/bower_components/bootstrap-sass/_includes/social-buttons.html +0 -16
- data/lib/api_browser/app/bower_components/bootstrap-sass/_layouts/default.html +0 -79
- data/lib/api_browser/app/bower_components/bootstrap-sass/_layouts/home.html +0 -47
- data/lib/api_browser/app/bower_components/bootstrap-sass/about.html +0 -93
- data/lib/api_browser/app/bower_components/bootstrap-sass/browserstack.json +0 -37
- data/lib/api_browser/app/bower_components/bootstrap-sass/components.html +0 -3689
- data/lib/api_browser/app/bower_components/bootstrap-sass/composer.json +0 -28
- data/lib/api_browser/app/bower_components/bootstrap-sass/css.html +0 -2674
- data/lib/api_browser/app/bower_components/bootstrap-sass/customize.html +0 -1715
- data/lib/api_browser/app/bower_components/bootstrap-sass/dist/css/bootstrap-theme.css +0 -427
- data/lib/api_browser/app/bower_components/bootstrap-sass/dist/css/bootstrap-theme.min.css +0 -1
- data/lib/api_browser/app/bower_components/bootstrap-sass/dist/css/bootstrap.css +0 -6350
- data/lib/api_browser/app/bower_components/bootstrap-sass/dist/css/bootstrap.min.css +0 -1
- data/lib/api_browser/app/bower_components/bootstrap-sass/dist/js/bootstrap.js +0 -2002
- data/lib/api_browser/app/bower_components/bootstrap-sass/dist/js/bootstrap.min.js +0 -9
- data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/css/docs.css +0 -1195
- data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/css/pygments-manni.css +0 -66
- 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 +0 -103
- data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/customizer.js +0 -332
- data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/filesaver.js +0 -169
- data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/holder.js +0 -404
- data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/ie8-responsive-file-warning.js +0 -12
- data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/jszip.js +0 -1467
- data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/less.js +0 -9
- data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/raw-files.js +0 -3
- data/lib/api_browser/app/bower_components/bootstrap-sass/docs-assets/js/uglify.js +0 -14
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/carousel/carousel.css +0 -148
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/carousel/index.html +0 -206
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/grid/grid.css +0 -28
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/grid/index.html +0 -148
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/jumbotron-narrow/index.html +0 -82
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/jumbotron-narrow/jumbotron-narrow.css +0 -79
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/jumbotron/index.html +0 -99
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/jumbotron/jumbotron.css +0 -5
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/justified-nav/index.html +0 -83
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/justified-nav/justified-nav.css +0 -88
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/navbar-fixed-top/index.html +0 -91
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/navbar-fixed-top/navbar-fixed-top.css +0 -4
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/navbar-static-top/index.html +0 -92
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/navbar-static-top/navbar-static-top.css +0 -7
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/navbar/index.html +0 -88
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/navbar/navbar.css +0 -8
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/non-responsive/index.html +0 -101
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/non-responsive/non-responsive.css +0 -116
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/offcanvas/index.html +0 -130
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/offcanvas/offcanvas.css +0 -50
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/offcanvas/offcanvas.js +0 -5
- 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 +0 -50
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/signin/signin.css +0 -40
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/starter-template/index.html +0 -68
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/starter-template/starter-template.css +0 -7
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/sticky-footer-navbar/index.html +0 -91
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/sticky-footer-navbar/sticky-footer-navbar.css +0 -45
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/sticky-footer/index.html +0 -55
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/sticky-footer/sticky-footer.css +0 -38
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/theme/index.html +0 -384
- data/lib/api_browser/app/bower_components/bootstrap-sass/examples/theme/theme.css +0 -14
- 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 +0 -229
- 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 +0 -1021
- data/lib/api_browser/app/bower_components/bootstrap-sass/index.html +0 -16
- data/lib/api_browser/app/bower_components/bootstrap-sass/javascript.html +0 -1983
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/index.html +0 -52
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/affix.js +0 -25
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/alert.js +0 -62
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/button.js +0 -116
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/carousel.js +0 -87
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/collapse.js +0 -164
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/dropdown.js +0 -219
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/modal.js +0 -196
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/phantom.js +0 -69
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/popover.js +0 -133
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/scrollspy.js +0 -37
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/tab.js +0 -86
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/tooltip.js +0 -437
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/unit/transition.js +0 -13
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/vendor/jquery.js +0 -6
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/vendor/qunit.css +0 -232
- data/lib/api_browser/app/bower_components/bootstrap-sass/js/tests/vendor/qunit.js +0 -1510
- data/lib/api_browser/app/bower_components/bootstrap-sass/package.json +0 -40
- data/lib/api_browser/app/bower_components/lodash/dist/lodash.compat.js +0 -7157
- data/lib/api_browser/app/bower_components/lodash/dist/lodash.compat.min.js +0 -61
- data/lib/api_browser/app/bower_components/lodash/dist/lodash.js +0 -6785
- data/lib/api_browser/app/bower_components/lodash/dist/lodash.min.js +0 -56
- data/lib/api_browser/app/bower_components/lodash/dist/lodash.underscore.js +0 -4979
- data/lib/api_browser/app/bower_components/lodash/dist/lodash.underscore.min.js +0 -39
- data/lib/api_browser/app/js/directives/attribute_table_row.js +0 -17
- data/lib/api_browser/app/js/directives/request_body.js +0 -25
- data/lib/api_browser/app/js/directives/request_headers.js +0 -17
- data/lib/api_browser/app/js/directives/request_parameters.js +0 -17
- data/lib/api_browser/app/js/directives/type_label.js +0 -52
- data/lib/api_browser/app/js/factories/PayloadTemplates.js +0 -10
- data/lib/api_browser/app/js/factories/TemplateProvider.js +0 -45
- data/lib/api_browser/app/js/factories/TypeTemplates.js +0 -11
- data/lib/api_browser/app/views/directives/attribute_description/_example.html +0 -13
- data/lib/api_browser/app/views/directives/attribute_description/_headers.html +0 -8
- data/lib/api_browser/app/views/directives/attribute_table_row/_default.html +0 -10
- data/lib/api_browser/app/views/directives/attribute_table_row/_links.html +0 -11
- data/lib/api_browser/app/views/directives/attribute_table_row/_struct.html +0 -2
- data/lib/api_browser/app/views/directives/request_body/_struct.html +0 -1
- data/lib/api_browser/app/views/resource/_actions.html +0 -27
data/lib/api_browser/app/bower_components/angular-ui-router/release/angular-ui-router.min.js
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
/**
|
2
2
|
* State-based routing for AngularJS
|
3
|
-
* @version v0.2.
|
3
|
+
* @version v0.2.15
|
4
4
|
* @link http://angular-ui.github.com/
|
5
5
|
* @license MIT License, http://www.opensource.org/licenses/MIT
|
6
6
|
*/
|
7
|
-
"undefined"!=typeof module&&"undefined"!=typeof exports&&module.exports===exports&&(module.exports="ui.router"),function(a,b,c){"use strict";function d(a,b){return I(new(I(function(){},{prototype:a})),b)}function e(a){return H(arguments,function(b){b!==a&&H(b,function(b,c){a.hasOwnProperty(c)||(a[c]=b)})}),a}function f(a,b){var c=[];for(var d in a.path){if(a.path[d]!==b.path[d])break;c.push(a.path[d])}return c}function g(a,b){if(Array.prototype.indexOf)return a.indexOf(b,Number(arguments[2])||0);var c=a.length>>>0,d=Number(arguments[2])||0;for(d=0>d?Math.ceil(d):Math.floor(d),0>d&&(d+=c);c>d;d++)if(d in a&&a[d]===b)return d;return-1}function h(a,b,c,d){var e,h=f(c,d),i={},j=[];for(var k in h)if(h[k].params&&h[k].params.length){e=h[k].params;for(var l in e)g(j,e[l])>=0||(j.push(e[l]),i[e[l]]=a[e[l]])}return I({},i,b)}function i(a,b){var c={};return H(a,function(a){var d=b[a];c[a]=null!=d?String(d):null}),c}function j(a,b,c){if(!c){c=[];for(var d in a)c.push(d)}for(var e=0;e<c.length;e++){var f=c[e];if(a[f]!=b[f])return!1}return!0}function k(a,b){var c={};return H(a,function(a){c[a]=b[a]}),c}function l(a,b){var d=1,f=2,g={},h=[],i=g,j=I(a.when(g),{$$promises:g,$$values:g});this.study=function(g){function k(a,c){if(o[c]!==f){if(n.push(c),o[c]===d)throw n.splice(0,n.indexOf(c)),new Error("Cyclic dependency: "+n.join(" -> "));if(o[c]=d,E(a))m.push(c,[function(){return b.get(a)}],h);else{var e=b.annotate(a);H(e,function(a){a!==c&&g.hasOwnProperty(a)&&k(g[a],a)}),m.push(c,a,e)}n.pop(),o[c]=f}}function l(a){return F(a)&&a.then&&a.$$promises}if(!F(g))throw new Error("'invocables' must be an object");var m=[],n=[],o={};return H(g,k),g=n=o=null,function(d,f,g){function h(){--s||(t||e(r,f.$$values),p.$$values=r,p.$$promises=!0,o.resolve(r))}function k(a){p.$$failure=a,o.reject(a)}function n(c,e,f){function i(a){l.reject(a),k(a)}function j(){if(!C(p.$$failure))try{l.resolve(b.invoke(e,g,r)),l.promise.then(function(a){r[c]=a,h()},i)}catch(a){i(a)}}var l=a.defer(),m=0;H(f,function(a){q.hasOwnProperty(a)&&!d.hasOwnProperty(a)&&(m++,q[a].then(function(b){r[a]=b,--m||j()},i))}),m||j(),q[c]=l.promise}if(l(d)&&g===c&&(g=f,f=d,d=null),d){if(!F(d))throw new Error("'locals' must be an object")}else d=i;if(f){if(!l(f))throw new Error("'parent' must be a promise returned by $resolve.resolve()")}else f=j;var o=a.defer(),p=o.promise,q=p.$$promises={},r=I({},d),s=1+m.length/3,t=!1;if(C(f.$$failure))return k(f.$$failure),p;f.$$values?(t=e(r,f.$$values),h()):(I(q,f.$$promises),f.then(h,k));for(var u=0,v=m.length;v>u;u+=3)d.hasOwnProperty(m[u])?h():n(m[u],m[u+1],m[u+2]);return p}},this.resolve=function(a,b,c,d){return this.study(a)(b,c,d)}}function m(a,b,c){this.fromConfig=function(a,b,c){return C(a.template)?this.fromString(a.template,b):C(a.templateUrl)?this.fromUrl(a.templateUrl,b):C(a.templateProvider)?this.fromProvider(a.templateProvider,b,c):null},this.fromString=function(a,b){return D(a)?a(b):a},this.fromUrl=function(c,d){return D(c)&&(c=c(d)),null==c?null:a.get(c,{cache:b}).then(function(a){return a.data})},this.fromProvider=function(a,b,d){return c.invoke(a,null,d||{params:b})}}function n(a){function b(b){if(!/^\w+(-+\w+)*$/.test(b))throw new Error("Invalid parameter name '"+b+"' in pattern '"+a+"'");if(f[b])throw new Error("Duplicate parameter name '"+b+"' in pattern '"+a+"'");f[b]=!0,j.push(b)}function c(a){return a.replace(/[\\\[\]\^$*+?.()|{}]/g,"\\$&")}var d,e=/([:*])(\w+)|\{(\w+)(?:\:((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g,f={},g="^",h=0,i=this.segments=[],j=this.params=[];this.source=a;for(var k,l,m;(d=e.exec(a))&&(k=d[2]||d[3],l=d[4]||("*"==d[1]?".*":"[^/]*"),m=a.substring(h,d.index),!(m.indexOf("?")>=0));)g+=c(m)+"("+l+")",b(k),i.push(m),h=e.lastIndex;m=a.substring(h);var n=m.indexOf("?");if(n>=0){var o=this.sourceSearch=m.substring(n);m=m.substring(0,n),this.sourcePath=a.substring(0,h+n),H(o.substring(1).split(/[&?]/),b)}else this.sourcePath=a,this.sourceSearch="";g+=c(m)+"$",i.push(m),this.regexp=new RegExp(g),this.prefix=i[0]}function o(){this.compile=function(a){return new n(a)},this.isMatcher=function(a){return F(a)&&D(a.exec)&&D(a.format)&&D(a.concat)},this.$get=function(){return this}}function p(a){function b(a){var b=/^\^((?:\\[^a-zA-Z0-9]|[^\\\[\]\^$*+?.()|{}]+)*)/.exec(a.source);return null!=b?b[1].replace(/\\(.)/g,"$1"):""}function c(a,b){return a.replace(/\$(\$|\d{1,2})/,function(a,c){return b["$"===c?0:Number(c)]})}function d(a,b,c){if(!c)return!1;var d=a.invoke(b,b,{$match:c});return C(d)?d:!0}var e=[],f=null;this.rule=function(a){if(!D(a))throw new Error("'rule' must be a function");return e.push(a),this},this.otherwise=function(a){if(E(a)){var b=a;a=function(){return b}}else if(!D(a))throw new Error("'rule' must be a function");return f=a,this},this.when=function(e,f){var g,h=E(f);if(E(e)&&(e=a.compile(e)),!h&&!D(f)&&!G(f))throw new Error("invalid 'handler' in when()");var i={matcher:function(b,c){return h&&(g=a.compile(c),c=["$match",function(a){return g.format(a)}]),I(function(a,e){return d(a,c,b.exec(e.path(),e.search()))},{prefix:E(b.prefix)?b.prefix:""})},regex:function(a,e){if(a.global||a.sticky)throw new Error("when() RegExp must not be global or sticky");return h&&(g=e,e=["$match",function(a){return c(g,a)}]),I(function(b,c){return d(b,e,a.exec(c.path()))},{prefix:b(a)})}},j={matcher:a.isMatcher(e),regex:e instanceof RegExp};for(var k in j)if(j[k])return this.rule(i[k](e,f));throw new Error("invalid 'what' in when()")},this.$get=["$location","$rootScope","$injector",function(a,b,c){function d(b){function d(b){var d=b(c,a);return d?(E(d)&&a.replace().url(d),!0):!1}if(!b||!b.defaultPrevented){var g,h=e.length;for(g=0;h>g;g++)if(d(e[g]))return;f&&d(f)}}return b.$on("$locationChangeSuccess",d),{sync:function(){d()}}}]}function q(a,e,f){function g(a){return 0===a.indexOf(".")||0===a.indexOf("^")}function l(a,b){var d=E(a),e=d?a:a.name,f=g(e);if(f){if(!b)throw new Error("No reference point given for path '"+e+"'");for(var h=e.split("."),i=0,j=h.length,k=b;j>i;i++)if(""!==h[i]||0!==i){if("^"!==h[i])break;if(!k.parent)throw new Error("Path '"+e+"' not valid for state '"+b.name+"'");k=k.parent}else k=b;h=h.slice(i).join("."),e=k.name+(k.name&&h?".":"")+h}var l=w[e];return!l||!d&&(d||l!==a&&l.self!==a)?c:l}function m(a,b){x[a]||(x[a]=[]),x[a].push(b)}function n(b){b=d(b,{self:b,resolve:b.resolve||{},toString:function(){return this.name}});var c=b.name;if(!E(c)||c.indexOf("@")>=0)throw new Error("State must have a valid name");if(w.hasOwnProperty(c))throw new Error("State '"+c+"'' is already defined");var e=-1!==c.indexOf(".")?c.substring(0,c.lastIndexOf(".")):E(b.parent)?b.parent:"";if(e&&!w[e])return m(e,b.self);for(var f in z)D(z[f])&&(b[f]=z[f](b,z.$delegates[f]));if(w[c]=b,!b[y]&&b.url&&a.when(b.url,["$match","$stateParams",function(a,c){v.$current.navigable==b&&j(a,c)||v.transitionTo(b,a,{location:!1})}]),x[c])for(var g=0;g<x[c].length;g++)n(x[c][g]);return b}function o(a){return a.indexOf("*")>-1}function p(a){var b=a.split("."),c=v.$current.name.split(".");if("**"===b[0]&&(c=c.slice(c.indexOf(b[1])),c.unshift("**")),"**"===b[b.length-1]&&(c.splice(c.indexOf(b[b.length-2])+1,Number.MAX_VALUE),c.push("**")),b.length!=c.length)return!1;for(var d=0,e=b.length;e>d;d++)"*"===b[d]&&(c[d]="*");return c.join("")===b.join("")}function q(a,b){return E(a)&&!C(b)?z[a]:D(b)&&E(a)?(z[a]&&!z.$delegates[a]&&(z.$delegates[a]=z[a]),z[a]=b,this):this}function r(a,b){return F(a)?b=a:b.name=a,n(b),this}function s(a,e,g,m,n,q,r,s,x){function z(){r.url()!==M&&(r.url(M),r.replace())}function A(a,c,d,f,h){var i=d?c:k(a.params,c),j={$stateParams:i};h.resolve=n.resolve(a.resolve,j,h.resolve,a);var l=[h.resolve.then(function(a){h.globals=a})];return f&&l.push(f),H(a.views,function(c,d){var e=c.resolve&&c.resolve!==a.resolve?c.resolve:{};e.$template=[function(){return g.load(d,{view:c,locals:j,params:i,notify:!1})||""}],l.push(n.resolve(e,j,h.resolve,a).then(function(f){if(D(c.controllerProvider)||G(c.controllerProvider)){var g=b.extend({},e,j);f.$$controller=m.invoke(c.controllerProvider,null,g)}else f.$$controller=c.controller;f.$$state=a,f.$$controllerAs=c.controllerAs,h[d]=f}))}),e.all(l).then(function(){return h})}var B=e.reject(new Error("transition superseded")),F=e.reject(new Error("transition prevented")),K=e.reject(new Error("transition aborted")),L=e.reject(new Error("transition failed")),M=r.url(),N=x.baseHref();return u.locals={resolve:null,globals:{$stateParams:{}}},v={params:{},current:u.self,$current:u,transition:null},v.reload=function(){v.transitionTo(v.current,q,{reload:!0,inherit:!1,notify:!1})},v.go=function(a,b,c){return this.transitionTo(a,b,I({inherit:!0,relative:v.$current},c))},v.transitionTo=function(b,c,f){c=c||{},f=I({location:!0,inherit:!1,relative:null,notify:!0,reload:!1,$retry:!1},f||{});var g,k=v.$current,n=v.params,o=k.path,p=l(b,f.relative);if(!C(p)){var s={to:b,toParams:c,options:f};if(g=a.$broadcast("$stateNotFound",s,k.self,n),g.defaultPrevented)return z(),K;if(g.retry){if(f.$retry)return z(),L;var w=v.transition=e.when(g.retry);return w.then(function(){return w!==v.transition?B:(s.options.$retry=!0,v.transitionTo(s.to,s.toParams,s.options))},function(){return K}),z(),w}if(b=s.to,c=s.toParams,f=s.options,p=l(b,f.relative),!C(p)){if(f.relative)throw new Error("Could not resolve '"+b+"' from state '"+f.relative+"'");throw new Error("No such state '"+b+"'")}}if(p[y])throw new Error("Cannot transition to abstract state '"+b+"'");f.inherit&&(c=h(q,c||{},v.$current,p)),b=p;var x,D,E=b.path,G=u.locals,H=[];for(x=0,D=E[x];D&&D===o[x]&&j(c,n,D.ownParams)&&!f.reload;x++,D=E[x])G=H[x]=D.locals;if(t(b,k,G,f))return b.self.reloadOnSearch!==!1&&z(),v.transition=null,e.when(v.current);if(c=i(b.params,c||{}),f.notify&&(g=a.$broadcast("$stateChangeStart",b.self,c,k.self,n),g.defaultPrevented))return z(),F;for(var N=e.when(G),O=x;O<E.length;O++,D=E[O])G=H[O]=d(G),N=A(D,c,D===b,N,G);var P=v.transition=N.then(function(){var d,e,g;if(v.transition!==P)return B;for(d=o.length-1;d>=x;d--)g=o[d],g.self.onExit&&m.invoke(g.self.onExit,g.self,g.locals.globals),g.locals=null;for(d=x;d<E.length;d++)e=E[d],e.locals=H[d],e.self.onEnter&&m.invoke(e.self.onEnter,e.self,e.locals.globals);if(v.transition!==P)return B;v.$current=b,v.current=b.self,v.params=c,J(v.params,q),v.transition=null;var h=b.navigable;return f.location&&h&&(r.url(h.url.format(h.locals.globals.$stateParams)),"replace"===f.location&&r.replace()),f.notify&&a.$broadcast("$stateChangeSuccess",b.self,c,k.self,n),M=r.url(),v.current},function(d){return v.transition!==P?B:(v.transition=null,a.$broadcast("$stateChangeError",b.self,c,k.self,n,d),z(),e.reject(d))});return P},v.is=function(a,d){var e=l(a);return C(e)?v.$current!==e?!1:C(d)&&null!==d?b.equals(q,d):!0:c},v.includes=function(a,d){if(E(a)&&o(a)){if(!p(a))return!1;a=v.$current.name}var e=l(a);if(!C(e))return c;if(!C(v.$current.includes[e.name]))return!1;var f=!0;return b.forEach(d,function(a,b){C(q[b])&&q[b]===a||(f=!1)}),f},v.href=function(a,b,c){c=I({lossy:!0,inherit:!1,absolute:!1,relative:v.$current},c||{});var d=l(a,c.relative);if(!C(d))return null;b=h(q,b||{},v.$current,d);var e=d&&c.lossy?d.navigable:d,g=e&&e.url?e.url.format(i(d.params,b||{})):null;return!f.html5Mode()&&g&&(g="#"+f.hashPrefix()+g),"/"!==N&&(f.html5Mode()?g=N.slice(0,-1)+g:c.absolute&&(g=N.slice(1)+g)),c.absolute&&g&&(g=r.protocol()+"://"+r.host()+(80==r.port()||443==r.port()?"":":"+r.port())+(!f.html5Mode()&&g?"/":"")+g),g},v.get=function(a,b){if(!C(a)){var c=[];return H(w,function(a){c.push(a.self)}),c}var d=l(a,b);return d&&d.self?d.self:null},v}function t(a,b,c,d){return a!==b||(c!==b.locals||d.reload)&&a.self.reloadOnSearch!==!1?void 0:!0}var u,v,w={},x={},y="abstract",z={parent:function(a){if(C(a.parent)&&a.parent)return l(a.parent);var b=/^(.+)\.[^.]+$/.exec(a.name);return b?l(b[1]):u},data:function(a){return a.parent&&a.parent.data&&(a.data=a.self.data=I({},a.parent.data,a.data)),a.data},url:function(a){var b=a.url;if(E(b))return"^"==b.charAt(0)?e.compile(b.substring(1)):(a.parent.navigable||u).url.concat(b);if(e.isMatcher(b)||null==b)return b;throw new Error("Invalid url '"+b+"' in state '"+a+"'")},navigable:function(a){return a.url?a:a.parent?a.parent.navigable:null},params:function(a){if(!a.params)return a.url?a.url.parameters():a.parent.params;if(!G(a.params))throw new Error("Invalid params in state '"+a+"'");if(a.url)throw new Error("Both params and url specicified in state '"+a+"'");return a.params},views:function(a){var b={};return H(C(a.views)?a.views:{"":a},function(c,d){d.indexOf("@")<0&&(d+="@"+a.parent.name),b[d]=c}),b},ownParams:function(a){if(!a.parent)return a.params;var b={};H(a.params,function(a){b[a]=!0}),H(a.parent.params,function(c){if(!b[c])throw new Error("Missing required parameter '"+c+"' in state '"+a.name+"'");b[c]=!1});var c=[];return H(b,function(a,b){a&&c.push(b)}),c},path:function(a){return a.parent?a.parent.path.concat(a):[]},includes:function(a){var b=a.parent?I({},a.parent.includes):{};return b[a.name]=!0,b},$delegates:{}};u=n({name:"",url:"^",views:null,"abstract":!0}),u.navigable=null,this.decorator=q,this.state=r,this.$get=s,s.$inject=["$rootScope","$q","$view","$injector","$resolve","$stateParams","$location","$urlRouter","$browser"]}function r(){function a(a,b){return{load:function(c,d){var e,f={template:null,controller:null,view:null,locals:null,notify:!0,async:!0,params:{}};return d=I(f,d),d.view&&(e=b.fromConfig(d.view,d.params,d.locals)),e&&d.notify&&a.$broadcast("$viewContentLoading",d),e}}}this.$get=a,a.$inject=["$rootScope","$templateFactory"]}function s(){var a=!1;this.useAnchorScroll=function(){a=!0},this.$get=["$anchorScroll","$timeout",function(b,c){return a?b:function(a){c(function(){a[0].scrollIntoView()},0,!1)}}]}function t(a,c,d){function e(){return c.has?function(a){return c.has(a)?c.get(a):null}:function(a){try{return c.get(a)}catch(b){return null}}}function f(a,b){var c=function(){return{enter:function(a,b,c){b.after(a),c()},leave:function(a,b){a.remove(),b()}}};if(i)return{enter:function(a,b,c){i.enter(a,null,b,c)},leave:function(a,b){i.leave(a,b)}};if(h){var d=h&&h(b,a);return{enter:function(a,b,c){d.enter(a,null,b),c()},leave:function(a,b){d.leave(a),b()}}}return c()}var g=e(),h=g("$animator"),i=g("$animate"),j={restrict:"ECA",terminal:!0,priority:400,transclude:"element",compile:function(c,e,g){return function(c,e,h){function i(){k&&(k.remove(),k=null),m&&(m.$destroy(),m=null),l&&(q.leave(l,function(){k=null}),k=l,l=null)}function j(f){var h=c.$new(),j=l&&l.data("$uiViewName"),k=j&&a.$current&&a.$current.locals[j];if(f||k!==n){var r=g(h,function(a){q.enter(a,e,function(){(b.isDefined(p)&&!p||c.$eval(p))&&d(a)}),i()});n=a.$current.locals[r.data("$uiViewName")],l=r,m=h,m.$emit("$viewContentLoaded"),m.$eval(o)}}var k,l,m,n,o=h.onload||"",p=h.autoscroll,q=f(h,c);c.$on("$stateChangeSuccess",function(){j(!1)}),c.$on("$viewContentLoading",function(){j(!1)}),j(!0)}}};return j}function u(a,b,c){return{restrict:"ECA",priority:-400,compile:function(d){var e=d.html();return function(d,f,g){var h=g.uiView||g.name||"",i=f.inheritedData("$uiView");h.indexOf("@")<0&&(h=h+"@"+(i?i.state.name:"")),f.data("$uiViewName",h);var j=c.$current,k=j&&j.locals[h];if(k){f.data("$uiView",{name:h,state:k.$$state}),f.html(k.$template?k.$template:e);var l=a(f.contents());if(k.$$controller){k.$scope=d;var m=b(k.$$controller,k);k.$$controllerAs&&(d[k.$$controllerAs]=m),f.data("$ngControllerController",m),f.children().data("$ngControllerController",m)}l(d)}}}}}function v(a){var b=a.replace(/\n/g," ").match(/^([^(]+?)\s*(\((.*)\))?$/);if(!b||4!==b.length)throw new Error("Invalid state ref '"+a+"'");return{state:b[1],paramExpr:b[3]||null}}function w(a){var b=a.parent().inheritedData("$uiView");return b&&b.state&&b.state.name?b.state:void 0}function x(a,c){var d=["location","inherit","reload"];return{restrict:"A",require:"?^uiSrefActive",link:function(e,f,g,h){var i=v(g.uiSref),j=null,k=w(f)||a.$current,l="FORM"===f[0].nodeName,m=l?"action":"href",n=!0,o={relative:k},p=e.$eval(g.uiSrefOpts)||{};b.forEach(d,function(a){a in p&&(o[a]=p[a])});var q=function(b){if(b&&(j=b),n){var c=a.href(i.state,j,o);return h&&h.$$setStateInfo(i.state,j),c?void(f[0][m]=c):(n=!1,!1)}};i.paramExpr&&(e.$watch(i.paramExpr,function(a){a!==j&&q(a)},!0),j=e.$eval(i.paramExpr)),q(),l||f.bind("click",function(b){var d=b.which||b.button;d>1||b.ctrlKey||b.metaKey||b.shiftKey||f.attr("target")||(c(function(){a.go(i.state,j,o)}),b.preventDefault())})}}}function y(a,b,c){return{restrict:"A",controller:["$scope","$element","$attrs",function(d,e,f){function g(){a.$current.self===i&&h()?e.addClass(l):e.removeClass(l)}function h(){return!k||j(k,b)}var i,k,l;l=c(f.uiSrefActive||"",!1)(d),this.$$setStateInfo=function(b,c){i=a.get(b,w(e)),k=c,g()},d.$on("$stateChangeSuccess",g)}]}}function z(a){return function(b){return a.is(b)}}function A(a){return function(b){return a.includes(b)}}function B(a,b){function e(a){this.locals=a.locals.globals,this.params=this.locals.$stateParams}function f(){this.locals=null,this.params=null}function g(c,g){if(null!=g.redirectTo){var h,j=g.redirectTo;if(E(j))h=j;else{if(!D(j))throw new Error("Invalid 'redirectTo' in when()");h=function(a,b){return j(a,b.path(),b.search())}}b.when(c,h)}else a.state(d(g,{parent:null,name:"route:"+encodeURIComponent(c),url:c,onEnter:e,onExit:f}));return i.push(g),this}function h(a,b,d){function e(a){return""!==a.name?a:c}var f={routes:i,params:d,current:c};return b.$on("$stateChangeStart",function(a,c,d,f){b.$broadcast("$routeChangeStart",e(c),e(f))}),b.$on("$stateChangeSuccess",function(a,c,d,g){f.current=e(c),b.$broadcast("$routeChangeSuccess",e(c),e(g)),J(d,f.params)}),b.$on("$stateChangeError",function(a,c,d,f,g,h){b.$broadcast("$routeChangeError",e(c),e(f),h)}),f}var i=[];e.$inject=["$$state"],this.when=g,this.$get=h,h.$inject=["$state","$rootScope","$routeParams"]}var C=b.isDefined,D=b.isFunction,E=b.isString,F=b.isObject,G=b.isArray,H=b.forEach,I=b.extend,J=b.copy;b.module("ui.router.util",["ng"]),b.module("ui.router.router",["ui.router.util"]),b.module("ui.router.state",["ui.router.router","ui.router.util"]),b.module("ui.router",["ui.router.state"]),b.module("ui.router.compat",["ui.router"]),l.$inject=["$q","$injector"],b.module("ui.router.util").service("$resolve",l),m.$inject=["$http","$templateCache","$injector"],b.module("ui.router.util").service("$templateFactory",m),n.prototype.concat=function(a){return new n(this.sourcePath+a+this.sourceSearch)},n.prototype.toString=function(){return this.source},n.prototype.exec=function(a,b){var c=this.regexp.exec(a);if(!c)return null;var d,e=this.params,f=e.length,g=this.segments.length-1,h={};if(g!==c.length-1)throw new Error("Unbalanced capture group in route '"+this.source+"'");for(d=0;g>d;d++)h[e[d]]=c[d+1];for(;f>d;d++)h[e[d]]=b[e[d]];return h},n.prototype.parameters=function(){return this.params},n.prototype.format=function(a){var b=this.segments,c=this.params;if(!a)return b.join("");var d,e,f,g=b.length-1,h=c.length,i=b[0];for(d=0;g>d;d++)f=a[c[d]],null!=f&&(i+=encodeURIComponent(f)),i+=b[d+1];for(;h>d;d++)f=a[c[d]],null!=f&&(i+=(e?"&":"?")+c[d]+"="+encodeURIComponent(f),e=!0);return i},b.module("ui.router.util").provider("$urlMatcherFactory",o),p.$inject=["$urlMatcherFactoryProvider"],b.module("ui.router.router").provider("$urlRouter",p),q.$inject=["$urlRouterProvider","$urlMatcherFactoryProvider","$locationProvider"],b.module("ui.router.state").value("$stateParams",{}).provider("$state",q),r.$inject=[],b.module("ui.router.state").provider("$view",r),b.module("ui.router.state").provider("$uiViewScroll",s),t.$inject=["$state","$injector","$uiViewScroll"],u.$inject=["$compile","$controller","$state"],b.module("ui.router.state").directive("uiView",t),b.module("ui.router.state").directive("uiView",u),x.$inject=["$state","$timeout"],y.$inject=["$state","$stateParams","$interpolate"],b.module("ui.router.state").directive("uiSref",x).directive("uiSrefActive",y),z.$inject=["$state"],A.$inject=["$state"],b.module("ui.router.state").filter("isState",z).filter("includedByState",A),B.$inject=["$stateProvider","$urlRouterProvider"],b.module("ui.router.compat").provider("$route",B).directive("ngView",t)}(window,window.angular);
|
7
|
+
"undefined"!=typeof module&&"undefined"!=typeof exports&&module.exports===exports&&(module.exports="ui.router"),function(a,b,c){"use strict";function d(a,b){return N(new(N(function(){},{prototype:a})),b)}function e(a){return M(arguments,function(b){b!==a&&M(b,function(b,c){a.hasOwnProperty(c)||(a[c]=b)})}),a}function f(a,b){var c=[];for(var d in a.path){if(a.path[d]!==b.path[d])break;c.push(a.path[d])}return c}function g(a){if(Object.keys)return Object.keys(a);var b=[];return M(a,function(a,c){b.push(c)}),b}function h(a,b){if(Array.prototype.indexOf)return a.indexOf(b,Number(arguments[2])||0);var c=a.length>>>0,d=Number(arguments[2])||0;for(d=0>d?Math.ceil(d):Math.floor(d),0>d&&(d+=c);c>d;d++)if(d in a&&a[d]===b)return d;return-1}function i(a,b,c,d){var e,i=f(c,d),j={},k=[];for(var l in i)if(i[l].params&&(e=g(i[l].params),e.length))for(var m in e)h(k,e[m])>=0||(k.push(e[m]),j[e[m]]=a[e[m]]);return N({},j,b)}function j(a,b,c){if(!c){c=[];for(var d in a)c.push(d)}for(var e=0;e<c.length;e++){var f=c[e];if(a[f]!=b[f])return!1}return!0}function k(a,b){var c={};return M(a,function(a){c[a]=b[a]}),c}function l(a){var b={},c=Array.prototype.concat.apply(Array.prototype,Array.prototype.slice.call(arguments,1));return M(c,function(c){c in a&&(b[c]=a[c])}),b}function m(a){var b={},c=Array.prototype.concat.apply(Array.prototype,Array.prototype.slice.call(arguments,1));for(var d in a)-1==h(c,d)&&(b[d]=a[d]);return b}function n(a,b){var c=L(a),d=c?[]:{};return M(a,function(a,e){b(a,e)&&(d[c?d.length:e]=a)}),d}function o(a,b){var c=L(a)?[]:{};return M(a,function(a,d){c[d]=b(a,d)}),c}function p(a,b){var d=1,f=2,i={},j=[],k=i,l=N(a.when(i),{$$promises:i,$$values:i});this.study=function(i){function n(a,c){if(s[c]!==f){if(r.push(c),s[c]===d)throw r.splice(0,h(r,c)),new Error("Cyclic dependency: "+r.join(" -> "));if(s[c]=d,J(a))q.push(c,[function(){return b.get(a)}],j);else{var e=b.annotate(a);M(e,function(a){a!==c&&i.hasOwnProperty(a)&&n(i[a],a)}),q.push(c,a,e)}r.pop(),s[c]=f}}function o(a){return K(a)&&a.then&&a.$$promises}if(!K(i))throw new Error("'invocables' must be an object");var p=g(i||{}),q=[],r=[],s={};return M(i,n),i=r=s=null,function(d,f,g){function h(){--u||(v||e(t,f.$$values),r.$$values=t,r.$$promises=r.$$promises||!0,delete r.$$inheritedValues,n.resolve(t))}function i(a){r.$$failure=a,n.reject(a)}function j(c,e,f){function j(a){l.reject(a),i(a)}function k(){if(!H(r.$$failure))try{l.resolve(b.invoke(e,g,t)),l.promise.then(function(a){t[c]=a,h()},j)}catch(a){j(a)}}var l=a.defer(),m=0;M(f,function(a){s.hasOwnProperty(a)&&!d.hasOwnProperty(a)&&(m++,s[a].then(function(b){t[a]=b,--m||k()},j))}),m||k(),s[c]=l.promise}if(o(d)&&g===c&&(g=f,f=d,d=null),d){if(!K(d))throw new Error("'locals' must be an object")}else d=k;if(f){if(!o(f))throw new Error("'parent' must be a promise returned by $resolve.resolve()")}else f=l;var n=a.defer(),r=n.promise,s=r.$$promises={},t=N({},d),u=1+q.length/3,v=!1;if(H(f.$$failure))return i(f.$$failure),r;f.$$inheritedValues&&e(t,m(f.$$inheritedValues,p)),N(s,f.$$promises),f.$$values?(v=e(t,m(f.$$values,p)),r.$$inheritedValues=m(f.$$values,p),h()):(f.$$inheritedValues&&(r.$$inheritedValues=m(f.$$inheritedValues,p)),f.then(h,i));for(var w=0,x=q.length;x>w;w+=3)d.hasOwnProperty(q[w])?h():j(q[w],q[w+1],q[w+2]);return r}},this.resolve=function(a,b,c,d){return this.study(a)(b,c,d)}}function q(a,b,c){this.fromConfig=function(a,b,c){return H(a.template)?this.fromString(a.template,b):H(a.templateUrl)?this.fromUrl(a.templateUrl,b):H(a.templateProvider)?this.fromProvider(a.templateProvider,b,c):null},this.fromString=function(a,b){return I(a)?a(b):a},this.fromUrl=function(c,d){return I(c)&&(c=c(d)),null==c?null:a.get(c,{cache:b,headers:{Accept:"text/html"}}).then(function(a){return a.data})},this.fromProvider=function(a,b,d){return c.invoke(a,null,d||{params:b})}}function r(a,b,e){function f(b,c,d,e){if(q.push(b),o[b])return o[b];if(!/^\w+(-+\w+)*(?:\[\])?$/.test(b))throw new Error("Invalid parameter name '"+b+"' in pattern '"+a+"'");if(p[b])throw new Error("Duplicate parameter name '"+b+"' in pattern '"+a+"'");return p[b]=new P.Param(b,c,d,e),p[b]}function g(a,b,c,d){var e=["",""],f=a.replace(/[\\\[\]\^$*+?.()|{}]/g,"\\$&");if(!b)return f;switch(c){case!1:e=["(",")"+(d?"?":"")];break;case!0:e=["?(",")?"];break;default:e=["("+c+"|",")?"]}return f+e[0]+b+e[1]}function h(e,f){var g,h,i,j,k;return g=e[2]||e[3],k=b.params[g],i=a.substring(m,e.index),h=f?e[4]:e[4]||("*"==e[1]?".*":null),j=P.type(h||"string")||d(P.type("string"),{pattern:new RegExp(h,b.caseInsensitive?"i":c)}),{id:g,regexp:h,segment:i,type:j,cfg:k}}b=N({params:{}},K(b)?b:{});var i,j=/([:*])([\w\[\]]+)|\{([\w\[\]]+)(?:\:((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g,k=/([:]?)([\w\[\]-]+)|\{([\w\[\]-]+)(?:\:((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g,l="^",m=0,n=this.segments=[],o=e?e.params:{},p=this.params=e?e.params.$$new():new P.ParamSet,q=[];this.source=a;for(var r,s,t;(i=j.exec(a))&&(r=h(i,!1),!(r.segment.indexOf("?")>=0));)s=f(r.id,r.type,r.cfg,"path"),l+=g(r.segment,s.type.pattern.source,s.squash,s.isOptional),n.push(r.segment),m=j.lastIndex;t=a.substring(m);var u=t.indexOf("?");if(u>=0){var v=this.sourceSearch=t.substring(u);if(t=t.substring(0,u),this.sourcePath=a.substring(0,m+u),v.length>0)for(m=0;i=k.exec(v);)r=h(i,!0),s=f(r.id,r.type,r.cfg,"search"),m=j.lastIndex}else this.sourcePath=a,this.sourceSearch="";l+=g(t)+(b.strict===!1?"/?":"")+"$",n.push(t),this.regexp=new RegExp(l,b.caseInsensitive?"i":c),this.prefix=n[0],this.$$paramNames=q}function s(a){N(this,a)}function t(){function a(a){return null!=a?a.toString().replace(/\//g,"%2F"):a}function e(a){return null!=a?a.toString().replace(/%2F/g,"/"):a}function f(){return{strict:p,caseInsensitive:m}}function i(a){return I(a)||L(a)&&I(a[a.length-1])}function j(){for(;w.length;){var a=w.shift();if(a.pattern)throw new Error("You cannot override a type's .pattern at runtime.");b.extend(u[a.name],l.invoke(a.def))}}function k(a){N(this,a||{})}P=this;var l,m=!1,p=!0,q=!1,u={},v=!0,w=[],x={string:{encode:a,decode:e,is:function(a){return null==a||!H(a)||"string"==typeof a},pattern:/[^/]*/},"int":{encode:a,decode:function(a){return parseInt(a,10)},is:function(a){return H(a)&&this.decode(a.toString())===a},pattern:/\d+/},bool:{encode:function(a){return a?1:0},decode:function(a){return 0!==parseInt(a,10)},is:function(a){return a===!0||a===!1},pattern:/0|1/},date:{encode:function(a){return this.is(a)?[a.getFullYear(),("0"+(a.getMonth()+1)).slice(-2),("0"+a.getDate()).slice(-2)].join("-"):c},decode:function(a){if(this.is(a))return a;var b=this.capture.exec(a);return b?new Date(b[1],b[2]-1,b[3]):c},is:function(a){return a instanceof Date&&!isNaN(a.valueOf())},equals:function(a,b){return this.is(a)&&this.is(b)&&a.toISOString()===b.toISOString()},pattern:/[0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[1-2][0-9]|3[0-1])/,capture:/([0-9]{4})-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])/},json:{encode:b.toJson,decode:b.fromJson,is:b.isObject,equals:b.equals,pattern:/[^/]*/},any:{encode:b.identity,decode:b.identity,equals:b.equals,pattern:/.*/}};t.$$getDefaultValue=function(a){if(!i(a.value))return a.value;if(!l)throw new Error("Injectable functions cannot be called at configuration time");return l.invoke(a.value)},this.caseInsensitive=function(a){return H(a)&&(m=a),m},this.strictMode=function(a){return H(a)&&(p=a),p},this.defaultSquashPolicy=function(a){if(!H(a))return q;if(a!==!0&&a!==!1&&!J(a))throw new Error("Invalid squash policy: "+a+". Valid policies: false, true, arbitrary-string");return q=a,a},this.compile=function(a,b){return new r(a,N(f(),b))},this.isMatcher=function(a){if(!K(a))return!1;var b=!0;return M(r.prototype,function(c,d){I(c)&&(b=b&&H(a[d])&&I(a[d]))}),b},this.type=function(a,b,c){if(!H(b))return u[a];if(u.hasOwnProperty(a))throw new Error("A type named '"+a+"' has already been defined.");return u[a]=new s(N({name:a},b)),c&&(w.push({name:a,def:c}),v||j()),this},M(x,function(a,b){u[b]=new s(N({name:b},a))}),u=d(u,{}),this.$get=["$injector",function(a){return l=a,v=!1,j(),M(x,function(a,b){u[b]||(u[b]=new s(a))}),this}],this.Param=function(a,b,d,e){function f(a){var b=K(a)?g(a):[],c=-1===h(b,"value")&&-1===h(b,"type")&&-1===h(b,"squash")&&-1===h(b,"array");return c&&(a={value:a}),a.$$fn=i(a.value)?a.value:function(){return a.value},a}function j(b,c,d){if(b.type&&c)throw new Error("Param '"+a+"' has two type configurations.");return c?c:b.type?b.type instanceof s?b.type:new s(b.type):"config"===d?u.any:u.string}function k(){var b={array:"search"===e?"auto":!1},c=a.match(/\[\]$/)?{array:!0}:{};return N(b,c,d).array}function m(a,b){var c=a.squash;if(!b||c===!1)return!1;if(!H(c)||null==c)return q;if(c===!0||J(c))return c;throw new Error("Invalid squash policy: '"+c+"'. Valid policies: false, true, or arbitrary string")}function p(a,b,d,e){var f,g,i=[{from:"",to:d||b?c:""},{from:null,to:d||b?c:""}];return f=L(a.replace)?a.replace:[],J(e)&&f.push({from:e,to:c}),g=o(f,function(a){return a.from}),n(i,function(a){return-1===h(g,a.from)}).concat(f)}function r(){if(!l)throw new Error("Injectable functions cannot be called at configuration time");var a=l.invoke(d.$$fn);if(null!==a&&a!==c&&!w.type.is(a))throw new Error("Default value ("+a+") for parameter '"+w.id+"' is not an instance of Type ("+w.type.name+")");return a}function t(a){function b(a){return function(b){return b.from===a}}function c(a){var c=o(n(w.replace,b(a)),function(a){return a.to});return c.length?c[0]:a}return a=c(a),H(a)?w.type.$normalize(a):r()}function v(){return"{Param:"+a+" "+b+" squash: '"+z+"' optional: "+y+"}"}var w=this;d=f(d),b=j(d,b,e);var x=k();b=x?b.$asArray(x,"search"===e):b,"string"!==b.name||x||"path"!==e||d.value!==c||(d.value="");var y=d.value!==c,z=m(d,y),A=p(d,x,y,z);N(this,{id:a,type:b,location:e,array:x,squash:z,replace:A,isOptional:y,value:t,dynamic:c,config:d,toString:v})},k.prototype={$$new:function(){return d(this,N(new k,{$$parent:this}))},$$keys:function(){for(var a=[],b=[],c=this,d=g(k.prototype);c;)b.push(c),c=c.$$parent;return b.reverse(),M(b,function(b){M(g(b),function(b){-1===h(a,b)&&-1===h(d,b)&&a.push(b)})}),a},$$values:function(a){var b={},c=this;return M(c.$$keys(),function(d){b[d]=c[d].value(a&&a[d])}),b},$$equals:function(a,b){var c=!0,d=this;return M(d.$$keys(),function(e){var f=a&&a[e],g=b&&b[e];d[e].type.equals(f,g)||(c=!1)}),c},$$validates:function(a){var d,e,f,g,h,i=this.$$keys();for(d=0;d<i.length&&(e=this[i[d]],f=a[i[d]],f!==c&&null!==f||!e.isOptional);d++){if(g=e.type.$normalize(f),!e.type.is(g))return!1;if(h=e.type.encode(g),b.isString(h)&&!e.type.pattern.exec(h))return!1}return!0},$$parent:c},this.ParamSet=k}function u(a,d){function e(a){var b=/^\^((?:\\[^a-zA-Z0-9]|[^\\\[\]\^$*+?.()|{}]+)*)/.exec(a.source);return null!=b?b[1].replace(/\\(.)/g,"$1"):""}function f(a,b){return a.replace(/\$(\$|\d{1,2})/,function(a,c){return b["$"===c?0:Number(c)]})}function g(a,b,c){if(!c)return!1;var d=a.invoke(b,b,{$match:c});return H(d)?d:!0}function h(d,e,f,g){function h(a,b,c){return"/"===p?a:b?p.slice(0,-1)+a:c?p.slice(1)+a:a}function m(a){function b(a){var b=a(f,d);return b?(J(b)&&d.replace().url(b),!0):!1}if(!a||!a.defaultPrevented){o&&d.url()===o;o=c;var e,g=j.length;for(e=0;g>e;e++)if(b(j[e]))return;k&&b(k)}}function n(){return i=i||e.$on("$locationChangeSuccess",m)}var o,p=g.baseHref(),q=d.url();return l||n(),{sync:function(){m()},listen:function(){return n()},update:function(a){return a?void(q=d.url()):void(d.url()!==q&&(d.url(q),d.replace()))},push:function(a,b,e){var f=a.format(b||{});null!==f&&b&&b["#"]&&(f+="#"+b["#"]),d.url(f),o=e&&e.$$avoidResync?d.url():c,e&&e.replace&&d.replace()},href:function(c,e,f){if(!c.validates(e))return null;var g=a.html5Mode();b.isObject(g)&&(g=g.enabled);var i=c.format(e);if(f=f||{},g||null===i||(i="#"+a.hashPrefix()+i),null!==i&&e&&e["#"]&&(i+="#"+e["#"]),i=h(i,g,f.absolute),!f.absolute||!i)return i;var j=!g&&i?"/":"",k=d.port();return k=80===k||443===k?"":":"+k,[d.protocol(),"://",d.host(),k,j,i].join("")}}}var i,j=[],k=null,l=!1;this.rule=function(a){if(!I(a))throw new Error("'rule' must be a function");return j.push(a),this},this.otherwise=function(a){if(J(a)){var b=a;a=function(){return b}}else if(!I(a))throw new Error("'rule' must be a function");return k=a,this},this.when=function(a,b){var c,h=J(b);if(J(a)&&(a=d.compile(a)),!h&&!I(b)&&!L(b))throw new Error("invalid 'handler' in when()");var i={matcher:function(a,b){return h&&(c=d.compile(b),b=["$match",function(a){return c.format(a)}]),N(function(c,d){return g(c,b,a.exec(d.path(),d.search()))},{prefix:J(a.prefix)?a.prefix:""})},regex:function(a,b){if(a.global||a.sticky)throw new Error("when() RegExp must not be global or sticky");return h&&(c=b,b=["$match",function(a){return f(c,a)}]),N(function(c,d){return g(c,b,a.exec(d.path()))},{prefix:e(a)})}},j={matcher:d.isMatcher(a),regex:a instanceof RegExp};for(var k in j)if(j[k])return this.rule(i[k](a,b));throw new Error("invalid 'what' in when()")},this.deferIntercept=function(a){a===c&&(a=!0),l=a},this.$get=h,h.$inject=["$location","$rootScope","$injector","$browser"]}function v(a,e){function f(a){return 0===a.indexOf(".")||0===a.indexOf("^")}function m(a,b){if(!a)return c;var d=J(a),e=d?a:a.name,g=f(e);if(g){if(!b)throw new Error("No reference point given for path '"+e+"'");b=m(b);for(var h=e.split("."),i=0,j=h.length,k=b;j>i;i++)if(""!==h[i]||0!==i){if("^"!==h[i])break;if(!k.parent)throw new Error("Path '"+e+"' not valid for state '"+b.name+"'");k=k.parent}else k=b;h=h.slice(i).join("."),e=k.name+(k.name&&h?".":"")+h}var l=z[e];return!l||!d&&(d||l!==a&&l.self!==a)?c:l}function n(a,b){A[a]||(A[a]=[]),A[a].push(b)}function p(a){for(var b=A[a]||[];b.length;)q(b.shift())}function q(b){b=d(b,{self:b,resolve:b.resolve||{},toString:function(){return this.name}});var c=b.name;if(!J(c)||c.indexOf("@")>=0)throw new Error("State must have a valid name");if(z.hasOwnProperty(c))throw new Error("State '"+c+"'' is already defined");var e=-1!==c.indexOf(".")?c.substring(0,c.lastIndexOf(".")):J(b.parent)?b.parent:K(b.parent)&&J(b.parent.name)?b.parent.name:"";if(e&&!z[e])return n(e,b.self);for(var f in C)I(C[f])&&(b[f]=C[f](b,C.$delegates[f]));return z[c]=b,!b[B]&&b.url&&a.when(b.url,["$match","$stateParams",function(a,c){y.$current.navigable==b&&j(a,c)||y.transitionTo(b,a,{inherit:!0,location:!1})}]),p(c),b}function r(a){return a.indexOf("*")>-1}function s(a){for(var b=a.split("."),c=y.$current.name.split("."),d=0,e=b.length;e>d;d++)"*"===b[d]&&(c[d]="*");return"**"===b[0]&&(c=c.slice(h(c,b[1])),c.unshift("**")),"**"===b[b.length-1]&&(c.splice(h(c,b[b.length-2])+1,Number.MAX_VALUE),c.push("**")),b.length!=c.length?!1:c.join("")===b.join("")}function t(a,b){return J(a)&&!H(b)?C[a]:I(b)&&J(a)?(C[a]&&!C.$delegates[a]&&(C.$delegates[a]=C[a]),C[a]=b,this):this}function u(a,b){return K(a)?b=a:b.name=a,q(b),this}function v(a,e,f,h,l,n,p,q,t){function u(b,c,d,f){var g=a.$broadcast("$stateNotFound",b,c,d);if(g.defaultPrevented)return p.update(),D;if(!g.retry)return null;if(f.$retry)return p.update(),E;var h=y.transition=e.when(g.retry);return h.then(function(){return h!==y.transition?A:(b.options.$retry=!0,y.transitionTo(b.to,b.toParams,b.options))},function(){return D}),p.update(),h}function v(a,c,d,g,i,j){function m(){var c=[];return M(a.views,function(d,e){var g=d.resolve&&d.resolve!==a.resolve?d.resolve:{};g.$template=[function(){return f.load(e,{view:d,locals:i.globals,params:n,notify:j.notify})||""}],c.push(l.resolve(g,i.globals,i.resolve,a).then(function(c){if(I(d.controllerProvider)||L(d.controllerProvider)){var f=b.extend({},g,i.globals);c.$$controller=h.invoke(d.controllerProvider,null,f)}else c.$$controller=d.controller;c.$$state=a,c.$$controllerAs=d.controllerAs,i[e]=c}))}),e.all(c).then(function(){return i.globals})}var n=d?c:k(a.params.$$keys(),c),o={$stateParams:n};i.resolve=l.resolve(a.resolve,o,i.resolve,a);var p=[i.resolve.then(function(a){i.globals=a})];return g&&p.push(g),e.all(p).then(m).then(function(a){return i})}var A=e.reject(new Error("transition superseded")),C=e.reject(new Error("transition prevented")),D=e.reject(new Error("transition aborted")),E=e.reject(new Error("transition failed"));return x.locals={resolve:null,globals:{$stateParams:{}}},y={params:{},current:x.self,$current:x,transition:null},y.reload=function(a){return y.transitionTo(y.current,n,{reload:a||!0,inherit:!1,notify:!0})},y.go=function(a,b,c){return y.transitionTo(a,b,N({inherit:!0,relative:y.$current},c))},y.transitionTo=function(b,c,f){c=c||{},f=N({location:!0,inherit:!1,relative:null,notify:!0,reload:!1,$retry:!1},f||{});var g,j=y.$current,l=y.params,o=j.path,q=m(b,f.relative),r=c["#"];if(!H(q)){var s={to:b,toParams:c,options:f},t=u(s,j.self,l,f);if(t)return t;if(b=s.to,c=s.toParams,f=s.options,q=m(b,f.relative),!H(q)){if(!f.relative)throw new Error("No such state '"+b+"'");throw new Error("Could not resolve '"+b+"' from state '"+f.relative+"'")}}if(q[B])throw new Error("Cannot transition to abstract state '"+b+"'");if(f.inherit&&(c=i(n,c||{},y.$current,q)),!q.params.$$validates(c))return E;c=q.params.$$values(c),b=q;var z=b.path,D=0,F=z[D],G=x.locals,I=[];if(f.reload){if(J(f.reload)||K(f.reload)){if(K(f.reload)&&!f.reload.name)throw new Error("Invalid reload state object");var L=f.reload===!0?o[0]:m(f.reload);if(f.reload&&!L)throw new Error("No such reload state '"+(J(f.reload)?f.reload:f.reload.name)+"'");for(;F&&F===o[D]&&F!==L;)G=I[D]=F.locals,D++,F=z[D]}}else for(;F&&F===o[D]&&F.ownParams.$$equals(c,l);)G=I[D]=F.locals,D++,F=z[D];if(w(b,c,j,l,G,f))return r&&(c["#"]=r),y.params=c,O(y.params,n),f.location&&b.navigable&&b.navigable.url&&(p.push(b.navigable.url,c,{$$avoidResync:!0,replace:"replace"===f.location}),p.update(!0)),y.transition=null,e.when(y.current);if(c=k(b.params.$$keys(),c||{}),f.notify&&a.$broadcast("$stateChangeStart",b.self,c,j.self,l).defaultPrevented)return a.$broadcast("$stateChangeCancel",b.self,c,j.self,l),p.update(),C;for(var M=e.when(G),P=D;P<z.length;P++,F=z[P])G=I[P]=d(G),M=v(F,c,F===b,M,G,f);var Q=y.transition=M.then(function(){var d,e,g;if(y.transition!==Q)return A;for(d=o.length-1;d>=D;d--)g=o[d],g.self.onExit&&h.invoke(g.self.onExit,g.self,g.locals.globals),g.locals=null;for(d=D;d<z.length;d++)e=z[d],e.locals=I[d],e.self.onEnter&&h.invoke(e.self.onEnter,e.self,e.locals.globals);return r&&(c["#"]=r),y.transition!==Q?A:(y.$current=b,y.current=b.self,y.params=c,O(y.params,n),y.transition=null,f.location&&b.navigable&&p.push(b.navigable.url,b.navigable.locals.globals.$stateParams,{$$avoidResync:!0,replace:"replace"===f.location}),f.notify&&a.$broadcast("$stateChangeSuccess",b.self,c,j.self,l),p.update(!0),y.current)},function(d){return y.transition!==Q?A:(y.transition=null,g=a.$broadcast("$stateChangeError",b.self,c,j.self,l,d),g.defaultPrevented||p.update(),e.reject(d))});return Q},y.is=function(a,b,d){d=N({relative:y.$current},d||{});var e=m(a,d.relative);return H(e)?y.$current!==e?!1:b?j(e.params.$$values(b),n):!0:c},y.includes=function(a,b,d){if(d=N({relative:y.$current},d||{}),J(a)&&r(a)){if(!s(a))return!1;a=y.$current.name}var e=m(a,d.relative);return H(e)?H(y.$current.includes[e.name])?b?j(e.params.$$values(b),n,g(b)):!0:!1:c},y.href=function(a,b,d){d=N({lossy:!0,inherit:!0,absolute:!1,relative:y.$current},d||{});var e=m(a,d.relative);if(!H(e))return null;d.inherit&&(b=i(n,b||{},y.$current,e));var f=e&&d.lossy?e.navigable:e;return f&&f.url!==c&&null!==f.url?p.href(f.url,k(e.params.$$keys().concat("#"),b||{}),{absolute:d.absolute}):null},y.get=function(a,b){if(0===arguments.length)return o(g(z),function(a){return z[a].self});var c=m(a,b||y.$current);return c&&c.self?c.self:null},y}function w(a,b,c,d,e,f){function g(a,b,c){function d(b){return"search"!=a.params[b].location}var e=a.params.$$keys().filter(d),f=l.apply({},[a.params].concat(e)),g=new P.ParamSet(f);return g.$$equals(b,c)}return!f.reload&&a===c&&(e===c.locals||a.self.reloadOnSearch===!1&&g(c,d,b))?!0:void 0}var x,y,z={},A={},B="abstract",C={parent:function(a){if(H(a.parent)&&a.parent)return m(a.parent);var b=/^(.+)\.[^.]+$/.exec(a.name);return b?m(b[1]):x},data:function(a){return a.parent&&a.parent.data&&(a.data=a.self.data=N({},a.parent.data,a.data)),a.data},url:function(a){var b=a.url,c={params:a.params||{}};if(J(b))return"^"==b.charAt(0)?e.compile(b.substring(1),c):(a.parent.navigable||x).url.concat(b,c);if(!b||e.isMatcher(b))return b;throw new Error("Invalid url '"+b+"' in state '"+a+"'")},navigable:function(a){return a.url?a:a.parent?a.parent.navigable:null},ownParams:function(a){var b=a.url&&a.url.params||new P.ParamSet;return M(a.params||{},function(a,c){b[c]||(b[c]=new P.Param(c,null,a,"config"))}),b},params:function(a){return a.parent&&a.parent.params?N(a.parent.params.$$new(),a.ownParams):new P.ParamSet},views:function(a){var b={};return M(H(a.views)?a.views:{"":a},function(c,d){d.indexOf("@")<0&&(d+="@"+a.parent.name),b[d]=c}),b},path:function(a){return a.parent?a.parent.path.concat(a):[]},includes:function(a){var b=a.parent?N({},a.parent.includes):{};return b[a.name]=!0,b},$delegates:{}};x=q({name:"",url:"^",views:null,"abstract":!0}),x.navigable=null,this.decorator=t,this.state=u,this.$get=v,v.$inject=["$rootScope","$q","$view","$injector","$resolve","$stateParams","$urlRouter","$location","$urlMatcherFactory"]}function w(){function a(a,b){return{load:function(c,d){var e,f={template:null,controller:null,view:null,locals:null,notify:!0,async:!0,params:{}};return d=N(f,d),d.view&&(e=b.fromConfig(d.view,d.params,d.locals)),e&&d.notify&&a.$broadcast("$viewContentLoading",d),e}}}this.$get=a,a.$inject=["$rootScope","$templateFactory"]}function x(){var a=!1;this.useAnchorScroll=function(){a=!0},this.$get=["$anchorScroll","$timeout",function(b,c){return a?b:function(a){return c(function(){a[0].scrollIntoView()},0,!1)}}]}function y(a,c,d,e){function f(){return c.has?function(a){return c.has(a)?c.get(a):null}:function(a){try{return c.get(a)}catch(b){return null}}}function g(a,b){var c=function(){return{enter:function(a,b,c){b.after(a),c()},leave:function(a,b){a.remove(),b()}}};if(j)return{enter:function(a,b,c){var d=j.enter(a,null,b,c);d&&d.then&&d.then(c)},leave:function(a,b){var c=j.leave(a,b);c&&c.then&&c.then(b)}};if(i){var d=i&&i(b,a);return{enter:function(a,b,c){d.enter(a,null,b),c()},leave:function(a,b){d.leave(a),b()}}}return c()}var h=f(),i=h("$animator"),j=h("$animate"),k={restrict:"ECA",terminal:!0,priority:400,transclude:"element",compile:function(c,f,h){return function(c,f,i){function j(){l&&(l.remove(),l=null),n&&(n.$destroy(),n=null),m&&(r.leave(m,function(){l=null}),l=m,m=null)}function k(g){var k,l=A(c,i,f,e),s=l&&a.$current&&a.$current.locals[l];if(g||s!==o){k=c.$new(),o=a.$current.locals[l];var t=h(k,function(a){r.enter(a,f,function(){n&&n.$emit("$viewContentAnimationEnded"),(b.isDefined(q)&&!q||c.$eval(q))&&d(a)}),j()});m=t,n=k,n.$emit("$viewContentLoaded"),n.$eval(p)}}var l,m,n,o,p=i.onload||"",q=i.autoscroll,r=g(i,c);c.$on("$stateChangeSuccess",function(){k(!1)}),c.$on("$viewContentLoading",function(){k(!1)}),k(!0)}}};return k}function z(a,b,c,d){return{restrict:"ECA",priority:-400,compile:function(e){var f=e.html();return function(e,g,h){var i=c.$current,j=A(e,h,g,d),k=i&&i.locals[j];if(k){g.data("$uiView",{name:j,state:k.$$state}),g.html(k.$template?k.$template:f);var l=a(g.contents());if(k.$$controller){k.$scope=e,k.$element=g;var m=b(k.$$controller,k);k.$$controllerAs&&(e[k.$$controllerAs]=m),g.data("$ngControllerController",m),g.children().data("$ngControllerController",m)}l(e)}}}}}function A(a,b,c,d){var e=d(b.uiView||b.name||"")(a),f=c.inheritedData("$uiView");return e.indexOf("@")>=0?e:e+"@"+(f?f.state.name:"")}function B(a,b){var c,d=a.match(/^\s*({[^}]*})\s*$/);if(d&&(a=b+"("+d[1]+")"),c=a.replace(/\n/g," ").match(/^([^(]+?)\s*(\((.*)\))?$/),!c||4!==c.length)throw new Error("Invalid state ref '"+a+"'");return{state:c[1],paramExpr:c[3]||null}}function C(a){var b=a.parent().inheritedData("$uiView");return b&&b.state&&b.state.name?b.state:void 0}function D(a,c){var d=["location","inherit","reload","absolute"];return{restrict:"A",require:["?^uiSrefActive","?^uiSrefActiveEq"],link:function(e,f,g,h){var i=B(g.uiSref,a.current.name),j=null,k=C(f)||a.$current,l="[object SVGAnimatedString]"===Object.prototype.toString.call(f.prop("href"))?"xlink:href":"href",m=null,n="A"===f.prop("tagName").toUpperCase(),o="FORM"===f[0].nodeName,p=o?"action":l,q=!0,r={relative:k,inherit:!0},s=e.$eval(g.uiSrefOpts)||{};b.forEach(d,function(a){a in s&&(r[a]=s[a])});var t=function(c){if(c&&(j=b.copy(c)),q){m=a.href(i.state,j,r);var d=h[1]||h[0];return d&&d.$$addStateInfo(i.state,j),null===m?(q=!1,!1):void g.$set(p,m)}};i.paramExpr&&(e.$watch(i.paramExpr,function(a,b){a!==j&&t(a)},!0),j=b.copy(e.$eval(i.paramExpr))),t(),o||f.bind("click",function(b){var d=b.which||b.button;if(!(d>1||b.ctrlKey||b.metaKey||b.shiftKey||f.attr("target"))){var e=c(function(){a.go(i.state,j,r)});b.preventDefault();var g=n&&!m?1:0;b.preventDefault=function(){g--<=0&&c.cancel(e)}}})}}}function E(a,b,c){return{restrict:"A",controller:["$scope","$element","$attrs",function(b,d,e){function f(){g()?d.addClass(i):d.removeClass(i)}function g(){for(var a=0;a<j.length;a++)if(h(j[a].state,j[a].params))return!0;return!1}function h(b,c){return"undefined"!=typeof e.uiSrefActiveEq?a.is(b.name,c):a.includes(b.name,c)}var i,j=[];i=c(e.uiSrefActiveEq||e.uiSrefActive||"",!1)(b),this.$$addStateInfo=function(b,c){var e=a.get(b,C(d));j.push({state:e||{name:b},params:c}),f()},b.$on("$stateChangeSuccess",f)}]}}function F(a){var b=function(b){return a.is(b)};return b.$stateful=!0,b}function G(a){var b=function(b){return a.includes(b)};return b.$stateful=!0,b}var H=b.isDefined,I=b.isFunction,J=b.isString,K=b.isObject,L=b.isArray,M=b.forEach,N=b.extend,O=b.copy;b.module("ui.router.util",["ng"]),b.module("ui.router.router",["ui.router.util"]),b.module("ui.router.state",["ui.router.router","ui.router.util"]),b.module("ui.router",["ui.router.state"]),b.module("ui.router.compat",["ui.router"]),p.$inject=["$q","$injector"],b.module("ui.router.util").service("$resolve",p),q.$inject=["$http","$templateCache","$injector"],b.module("ui.router.util").service("$templateFactory",q);var P;r.prototype.concat=function(a,b){var c={caseInsensitive:P.caseInsensitive(),strict:P.strictMode(),squash:P.defaultSquashPolicy()};return new r(this.sourcePath+a+this.sourceSearch,N(c,b),this)},r.prototype.toString=function(){return this.source},r.prototype.exec=function(a,b){function c(a){function b(a){return a.split("").reverse().join("")}function c(a){return a.replace(/\\-/g,"-")}var d=b(a).split(/-(?!\\)/),e=o(d,b);return o(e,c).reverse()}var d=this.regexp.exec(a);if(!d)return null;b=b||{};var e,f,g,h=this.parameters(),i=h.length,j=this.segments.length-1,k={};if(j!==d.length-1)throw new Error("Unbalanced capture group in route '"+this.source+"'");for(e=0;j>e;e++){g=h[e];var l=this.params[g],m=d[e+1];for(f=0;f<l.replace;f++)l.replace[f].from===m&&(m=l.replace[f].to);m&&l.array===!0&&(m=c(m)),k[g]=l.value(m)}for(;i>e;e++)g=h[e],k[g]=this.params[g].value(b[g]);return k},r.prototype.parameters=function(a){return H(a)?this.params[a]||null:this.$$paramNames},r.prototype.validates=function(a){return this.params.$$validates(a)},r.prototype.format=function(a){function b(a){return encodeURIComponent(a).replace(/-/g,function(a){return"%5C%"+a.charCodeAt(0).toString(16).toUpperCase()})}a=a||{};var c=this.segments,d=this.parameters(),e=this.params;if(!this.validates(a))return null;var f,g=!1,h=c.length-1,i=d.length,j=c[0];for(f=0;i>f;f++){var k=h>f,l=d[f],m=e[l],n=m.value(a[l]),p=m.isOptional&&m.type.equals(m.value(),n),q=p?m.squash:!1,r=m.type.encode(n);if(k){var s=c[f+1];if(q===!1)null!=r&&(j+=L(r)?o(r,b).join("-"):encodeURIComponent(r)),j+=s;else if(q===!0){var t=j.match(/\/$/)?/\/?(.*)/:/(.*)/;j+=s.match(t)[1]}else J(q)&&(j+=q+s)}else{if(null==r||p&&q!==!1)continue;L(r)||(r=[r]),r=o(r,encodeURIComponent).join("&"+l+"="),j+=(g?"&":"?")+(l+"="+r),g=!0}}return j},s.prototype.is=function(a,b){return!0},s.prototype.encode=function(a,b){return a},s.prototype.decode=function(a,b){return a},s.prototype.equals=function(a,b){return a==b},s.prototype.$subPattern=function(){var a=this.pattern.toString();return a.substr(1,a.length-2)},s.prototype.pattern=/.*/,s.prototype.toString=function(){return"{Type:"+this.name+"}"},s.prototype.$normalize=function(a){return this.is(a)?a:this.decode(a)},s.prototype.$asArray=function(a,b){function d(a,b){function d(a,b){return function(){return a[b].apply(a,arguments)}}function e(a){return L(a)?a:H(a)?[a]:[]}function f(a){switch(a.length){case 0:return c;case 1:return"auto"===b?a[0]:a;default:return a}}function g(a){return!a}function h(a,b){return function(c){c=e(c);var d=o(c,a);return b===!0?0===n(d,g).length:f(d)}}function i(a){return function(b,c){var d=e(b),f=e(c);if(d.length!==f.length)return!1;for(var g=0;g<d.length;g++)if(!a(d[g],f[g]))return!1;return!0}}this.encode=h(d(a,"encode")),this.decode=h(d(a,"decode")),this.is=h(d(a,"is"),!0),this.equals=i(d(a,"equals")),this.pattern=a.pattern,this.$normalize=h(d(a,"$normalize")),this.name=a.name,this.$arrayMode=b}if(!a)return this;if("auto"===a&&!b)throw new Error("'auto' array mode is for query parameters only");return new d(this,a)},b.module("ui.router.util").provider("$urlMatcherFactory",t),b.module("ui.router.util").run(["$urlMatcherFactory",function(a){}]),u.$inject=["$locationProvider","$urlMatcherFactoryProvider"],b.module("ui.router.router").provider("$urlRouter",u),v.$inject=["$urlRouterProvider","$urlMatcherFactoryProvider"],b.module("ui.router.state").value("$stateParams",{}).provider("$state",v),w.$inject=[],b.module("ui.router.state").provider("$view",w),b.module("ui.router.state").provider("$uiViewScroll",x),y.$inject=["$state","$injector","$uiViewScroll","$interpolate"],z.$inject=["$compile","$controller","$state","$interpolate"],b.module("ui.router.state").directive("uiView",y),b.module("ui.router.state").directive("uiView",z),D.$inject=["$state","$timeout"],E.$inject=["$state","$stateParams","$interpolate"],b.module("ui.router.state").directive("uiSref",D).directive("uiSrefActive",E).directive("uiSrefActiveEq",E),F.$inject=["$state"],G.$inject=["$state"],b.module("ui.router.state").filter("isState",F).filter("includedByState",G)}(window,window.angular);
|
@@ -49,13 +49,13 @@ function ancestors(first, second) {
|
|
49
49
|
* @param {Object} object A JavaScript object.
|
50
50
|
* @return {Array} Returns the keys of the object as an array.
|
51
51
|
*/
|
52
|
-
function
|
52
|
+
function objectKeys(object) {
|
53
53
|
if (Object.keys) {
|
54
54
|
return Object.keys(object);
|
55
55
|
}
|
56
56
|
var result = [];
|
57
57
|
|
58
|
-
|
58
|
+
forEach(object, function(val, key) {
|
59
59
|
result.push(key);
|
60
60
|
});
|
61
61
|
return result;
|
@@ -68,7 +68,7 @@ function keys(object) {
|
|
68
68
|
* @param {*} value A value to search the array for.
|
69
69
|
* @return {Number} Returns the array index value of `value`, or `-1` if not present.
|
70
70
|
*/
|
71
|
-
function
|
71
|
+
function indexOf(array, value) {
|
72
72
|
if (Array.prototype.indexOf) {
|
73
73
|
return array.indexOf(value, Number(arguments[2]) || 0);
|
74
74
|
}
|
@@ -96,11 +96,12 @@ function inheritParams(currentParams, newParams, $current, $to) {
|
|
96
96
|
var parents = ancestors($current, $to), parentParams, inherited = {}, inheritList = [];
|
97
97
|
|
98
98
|
for (var i in parents) {
|
99
|
-
if (!parents[i].params
|
100
|
-
parentParams = parents[i].params;
|
99
|
+
if (!parents[i].params) continue;
|
100
|
+
parentParams = objectKeys(parents[i].params);
|
101
|
+
if (!parentParams.length) continue;
|
101
102
|
|
102
103
|
for (var j in parentParams) {
|
103
|
-
if (
|
104
|
+
if (indexOf(inheritList, parentParams[j]) >= 0) continue;
|
104
105
|
inheritList.push(parentParams[j]);
|
105
106
|
inherited[parentParams[j]] = currentParams[parentParams[j]];
|
106
107
|
}
|
@@ -108,23 +109,6 @@ function inheritParams(currentParams, newParams, $current, $to) {
|
|
108
109
|
return extend({}, inherited, newParams);
|
109
110
|
}
|
110
111
|
|
111
|
-
/**
|
112
|
-
* Normalizes a set of values to string or `null`, filtering them by a list of keys.
|
113
|
-
*
|
114
|
-
* @param {Array} keys The list of keys to normalize/return.
|
115
|
-
* @param {Object} values An object hash of values to normalize.
|
116
|
-
* @return {Object} Returns an object hash of normalized string values.
|
117
|
-
*/
|
118
|
-
function normalize(keys, values) {
|
119
|
-
var normalized = {};
|
120
|
-
|
121
|
-
forEach(keys, function (name) {
|
122
|
-
var value = values[name];
|
123
|
-
normalized[name] = (value != null) ? String(value) : null;
|
124
|
-
});
|
125
|
-
return normalized;
|
126
|
-
}
|
127
|
-
|
128
112
|
/**
|
129
113
|
* Performs a non-strict comparison of the subset of two objects, defined by a list of keys.
|
130
114
|
*
|
@@ -162,6 +146,68 @@ function filterByKeys(keys, values) {
|
|
162
146
|
});
|
163
147
|
return filtered;
|
164
148
|
}
|
149
|
+
|
150
|
+
// like _.indexBy
|
151
|
+
// when you know that your index values will be unique, or you want last-one-in to win
|
152
|
+
function indexBy(array, propName) {
|
153
|
+
var result = {};
|
154
|
+
forEach(array, function(item) {
|
155
|
+
result[item[propName]] = item;
|
156
|
+
});
|
157
|
+
return result;
|
158
|
+
}
|
159
|
+
|
160
|
+
// extracted from underscore.js
|
161
|
+
// Return a copy of the object only containing the whitelisted properties.
|
162
|
+
function pick(obj) {
|
163
|
+
var copy = {};
|
164
|
+
var keys = Array.prototype.concat.apply(Array.prototype, Array.prototype.slice.call(arguments, 1));
|
165
|
+
forEach(keys, function(key) {
|
166
|
+
if (key in obj) copy[key] = obj[key];
|
167
|
+
});
|
168
|
+
return copy;
|
169
|
+
}
|
170
|
+
|
171
|
+
// extracted from underscore.js
|
172
|
+
// Return a copy of the object omitting the blacklisted properties.
|
173
|
+
function omit(obj) {
|
174
|
+
var copy = {};
|
175
|
+
var keys = Array.prototype.concat.apply(Array.prototype, Array.prototype.slice.call(arguments, 1));
|
176
|
+
for (var key in obj) {
|
177
|
+
if (indexOf(keys, key) == -1) copy[key] = obj[key];
|
178
|
+
}
|
179
|
+
return copy;
|
180
|
+
}
|
181
|
+
|
182
|
+
function pluck(collection, key) {
|
183
|
+
var result = isArray(collection) ? [] : {};
|
184
|
+
|
185
|
+
forEach(collection, function(val, i) {
|
186
|
+
result[i] = isFunction(key) ? key(val) : val[key];
|
187
|
+
});
|
188
|
+
return result;
|
189
|
+
}
|
190
|
+
|
191
|
+
function filter(collection, callback) {
|
192
|
+
var array = isArray(collection);
|
193
|
+
var result = array ? [] : {};
|
194
|
+
forEach(collection, function(val, i) {
|
195
|
+
if (callback(val, i)) {
|
196
|
+
result[array ? result.length : i] = val;
|
197
|
+
}
|
198
|
+
});
|
199
|
+
return result;
|
200
|
+
}
|
201
|
+
|
202
|
+
function map(collection, callback) {
|
203
|
+
var result = isArray(collection) ? [] : {};
|
204
|
+
|
205
|
+
forEach(collection, function(val, i) {
|
206
|
+
result[i] = callback(val, i);
|
207
|
+
});
|
208
|
+
return result;
|
209
|
+
}
|
210
|
+
|
165
211
|
/**
|
166
212
|
* @ngdoc overview
|
167
213
|
* @name ui.router.util
|
@@ -41,6 +41,7 @@ function $Resolve( $q, $injector) {
|
|
41
41
|
*/
|
42
42
|
this.study = function (invocables) {
|
43
43
|
if (!isObject(invocables)) throw new Error("'invocables' must be an object");
|
44
|
+
var invocableKeys = objectKeys(invocables || {});
|
44
45
|
|
45
46
|
// Perform a topological sort of invocables to build an ordered plan
|
46
47
|
var plan = [], cycle = [], visited = {};
|
@@ -49,7 +50,7 @@ function $Resolve( $q, $injector) {
|
|
49
50
|
|
50
51
|
cycle.push(key);
|
51
52
|
if (visited[key] === VISIT_IN_PROGRESS) {
|
52
|
-
cycle.splice(0,
|
53
|
+
cycle.splice(0, indexOf(cycle, key));
|
53
54
|
throw new Error("Cyclic dependency: " + cycle.join(" -> "));
|
54
55
|
}
|
55
56
|
visited[key] = VISIT_IN_PROGRESS;
|
@@ -101,7 +102,8 @@ function $Resolve( $q, $injector) {
|
|
101
102
|
if (!--wait) {
|
102
103
|
if (!merged) merge(values, parent.$$values);
|
103
104
|
result.$$values = values;
|
104
|
-
result.$$promises = true; // keep for isResolve()
|
105
|
+
result.$$promises = result.$$promises || true; // keep for isResolve()
|
106
|
+
delete result.$$inheritedValues;
|
105
107
|
resolution.resolve(values);
|
106
108
|
}
|
107
109
|
}
|
@@ -110,20 +112,28 @@ function $Resolve( $q, $injector) {
|
|
110
112
|
result.$$failure = reason;
|
111
113
|
resolution.reject(reason);
|
112
114
|
}
|
113
|
-
|
115
|
+
|
114
116
|
// Short-circuit if parent has already failed
|
115
117
|
if (isDefined(parent.$$failure)) {
|
116
118
|
fail(parent.$$failure);
|
117
119
|
return result;
|
118
120
|
}
|
119
121
|
|
122
|
+
if (parent.$$inheritedValues) {
|
123
|
+
merge(values, omit(parent.$$inheritedValues, invocableKeys));
|
124
|
+
}
|
125
|
+
|
120
126
|
// Merge parent values if the parent has already resolved, or merge
|
121
127
|
// parent promises and wait if the parent resolve is still in progress.
|
128
|
+
extend(promises, parent.$$promises);
|
122
129
|
if (parent.$$values) {
|
123
|
-
merged = merge(values, parent.$$values);
|
130
|
+
merged = merge(values, omit(parent.$$values, invocableKeys));
|
131
|
+
result.$$inheritedValues = omit(parent.$$values, invocableKeys);
|
124
132
|
done();
|
125
133
|
} else {
|
126
|
-
|
134
|
+
if (parent.$$inheritedValues) {
|
135
|
+
result.$$inheritedValues = omit(parent.$$inheritedValues, invocableKeys);
|
136
|
+
}
|
127
137
|
parent.then(done, fail);
|
128
138
|
}
|
129
139
|
|
@@ -4,7 +4,6 @@
|
|
4
4
|
*
|
5
5
|
* @requires ui.router.router.$urlRouterProvider
|
6
6
|
* @requires ui.router.util.$urlMatcherFactoryProvider
|
7
|
-
* @requires $locationProvider
|
8
7
|
*
|
9
8
|
* @description
|
10
9
|
* The new `$stateProvider` works similar to Angular's v1 router, but it focuses purely
|
@@ -20,8 +19,8 @@
|
|
20
19
|
*
|
21
20
|
* The `$stateProvider` provides interfaces to declare these states for your app.
|
22
21
|
*/
|
23
|
-
$StateProvider.$inject = ['$urlRouterProvider', '$urlMatcherFactoryProvider'
|
24
|
-
function $StateProvider( $urlRouterProvider, $urlMatcherFactory
|
22
|
+
$StateProvider.$inject = ['$urlRouterProvider', '$urlMatcherFactoryProvider'];
|
23
|
+
function $StateProvider( $urlRouterProvider, $urlMatcherFactory) {
|
25
24
|
|
26
25
|
var root, states = {}, $state, queue = {}, abstractKey = 'abstract';
|
27
26
|
|
@@ -49,18 +48,14 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
|
|
49
48
|
|
50
49
|
// Build a URLMatcher if necessary, either via a relative or absolute URL
|
51
50
|
url: function(state) {
|
52
|
-
var url = state.url;
|
51
|
+
var url = state.url, config = { params: state.params || {} };
|
53
52
|
|
54
53
|
if (isString(url)) {
|
55
|
-
if (url.charAt(0) == '^')
|
56
|
-
|
57
|
-
}
|
58
|
-
return (state.parent.navigable || root).url.concat(url);
|
54
|
+
if (url.charAt(0) == '^') return $urlMatcherFactory.compile(url.substring(1), config);
|
55
|
+
return (state.parent.navigable || root).url.concat(url, config);
|
59
56
|
}
|
60
57
|
|
61
|
-
if ($urlMatcherFactory.isMatcher(url)
|
62
|
-
return url;
|
63
|
-
}
|
58
|
+
if (!url || $urlMatcherFactory.isMatcher(url)) return url;
|
64
59
|
throw new Error("Invalid url '" + url + "' in state '" + state + "'");
|
65
60
|
},
|
66
61
|
|
@@ -69,14 +64,18 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
|
|
69
64
|
return state.url ? state : (state.parent ? state.parent.navigable : null);
|
70
65
|
},
|
71
66
|
|
67
|
+
// Own parameters for this state. state.url.params is already built at this point. Create and add non-url params
|
68
|
+
ownParams: function(state) {
|
69
|
+
var params = state.url && state.url.params || new $$UMFP.ParamSet();
|
70
|
+
forEach(state.params || {}, function(config, id) {
|
71
|
+
if (!params[id]) params[id] = new $$UMFP.Param(id, null, config, "config");
|
72
|
+
});
|
73
|
+
return params;
|
74
|
+
},
|
75
|
+
|
72
76
|
// Derive parameters for this state and ensure they're a super-set of parent's parameters
|
73
77
|
params: function(state) {
|
74
|
-
|
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;
|
78
|
+
return state.parent && state.parent.params ? extend(state.parent.params.$$new(), state.ownParams) : new $$UMFP.ParamSet();
|
80
79
|
},
|
81
80
|
|
82
81
|
// If there is no explicit multi-view configuration, make one up so we don't have
|
@@ -94,26 +93,6 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
|
|
94
93
|
return views;
|
95
94
|
},
|
96
95
|
|
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
96
|
// Keep a full path from the root down to this state as this is needed for state activation.
|
118
97
|
path: function(state) {
|
119
98
|
return state.parent ? state.parent.path.concat(state) : []; // exclude root from path
|
@@ -134,12 +113,16 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
|
|
134
113
|
}
|
135
114
|
|
136
115
|
function findState(stateOrName, base) {
|
116
|
+
if (!stateOrName) return undefined;
|
117
|
+
|
137
118
|
var isStr = isString(stateOrName),
|
138
119
|
name = isStr ? stateOrName : stateOrName.name,
|
139
120
|
path = isRelative(name);
|
140
121
|
|
141
122
|
if (path) {
|
142
123
|
if (!base) throw new Error("No reference point given for path '" + name + "'");
|
124
|
+
base = findState(base);
|
125
|
+
|
143
126
|
var rel = name.split("."), i = 0, pathLength = rel.length, current = base;
|
144
127
|
|
145
128
|
for (; i < pathLength; i++) {
|
@@ -172,6 +155,13 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
|
|
172
155
|
queue[parentName].push(state);
|
173
156
|
}
|
174
157
|
|
158
|
+
function flushQueuedChildren(parentName) {
|
159
|
+
var queued = queue[parentName] || [];
|
160
|
+
while(queued.length) {
|
161
|
+
registerState(queued.shift());
|
162
|
+
}
|
163
|
+
}
|
164
|
+
|
175
165
|
function registerState(state) {
|
176
166
|
// Wrap a new object around the state so we can store our private details easily.
|
177
167
|
state = inherit(state, {
|
@@ -187,6 +177,7 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
|
|
187
177
|
// Get parent name
|
188
178
|
var parentName = (name.indexOf('.') !== -1) ? name.substring(0, name.lastIndexOf('.'))
|
189
179
|
: (isString(state.parent)) ? state.parent
|
180
|
+
: (isObject(state.parent) && isString(state.parent.name)) ? state.parent.name
|
190
181
|
: '';
|
191
182
|
|
192
183
|
// If parent is not registered yet, add state to queue and register later
|
@@ -203,17 +194,13 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
|
|
203
194
|
if (!state[abstractKey] && state.url) {
|
204
195
|
$urlRouterProvider.when(state.url, ['$match', '$stateParams', function ($match, $stateParams) {
|
205
196
|
if ($state.$current.navigable != state || !equalForKeys($match, $stateParams)) {
|
206
|
-
$state.transitionTo(state, $match, { location: false });
|
197
|
+
$state.transitionTo(state, $match, { inherit: true, location: false });
|
207
198
|
}
|
208
199
|
}]);
|
209
200
|
}
|
210
201
|
|
211
202
|
// Register any queued children
|
212
|
-
|
213
|
-
for (var i = 0; i < queue[name].length; i++) {
|
214
|
-
registerState(queue[name][i]);
|
215
|
-
}
|
216
|
-
}
|
203
|
+
flushQueuedChildren(name);
|
217
204
|
|
218
205
|
return state;
|
219
206
|
}
|
@@ -228,14 +215,21 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
|
|
228
215
|
var globSegments = glob.split('.'),
|
229
216
|
segments = $state.$current.name.split('.');
|
230
217
|
|
218
|
+
//match single stars
|
219
|
+
for (var i = 0, l = globSegments.length; i < l; i++) {
|
220
|
+
if (globSegments[i] === '*') {
|
221
|
+
segments[i] = '*';
|
222
|
+
}
|
223
|
+
}
|
224
|
+
|
231
225
|
//match greedy starts
|
232
226
|
if (globSegments[0] === '**') {
|
233
|
-
segments = segments.slice(
|
227
|
+
segments = segments.slice(indexOf(segments, globSegments[1]));
|
234
228
|
segments.unshift('**');
|
235
229
|
}
|
236
230
|
//match greedy ends
|
237
231
|
if (globSegments[globSegments.length - 1] === '**') {
|
238
|
-
segments.splice(
|
232
|
+
segments.splice(indexOf(segments, globSegments[globSegments.length - 2]) + 1, Number.MAX_VALUE);
|
239
233
|
segments.push('**');
|
240
234
|
}
|
241
235
|
|
@@ -243,13 +237,6 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
|
|
243
237
|
return false;
|
244
238
|
}
|
245
239
|
|
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
240
|
return segments.join('') === globSegments.join('');
|
254
241
|
}
|
255
242
|
|
@@ -297,7 +284,8 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
|
|
297
284
|
* - **parent** `{object}` - returns the parent state object.
|
298
285
|
* - **data** `{object}` - returns state data, including any inherited data that is not
|
299
286
|
* overridden by own values (if any).
|
300
|
-
* - **url** `{object}` - returns a {link ui.router.util.type:UrlMatcher}
|
287
|
+
* - **url** `{object}` - returns a {@link ui.router.util.type:UrlMatcher UrlMatcher}
|
288
|
+
* or `null`.
|
301
289
|
* - **navigable** `{object}` - returns closest ancestor state that has a URL (aka is
|
302
290
|
* navigable).
|
303
291
|
* - **params** `{object}` - returns an array of state params that are ensured to
|
@@ -313,17 +301,17 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
|
|
313
301
|
* - **path** `{string}` - returns the full path from the root down to this state.
|
314
302
|
* Needed for state activation.
|
315
303
|
* - **includes** `{object}` - returns an object that includes every state that
|
316
|
-
* would pass a
|
304
|
+
* would pass a `$state.includes()` test.
|
317
305
|
*
|
318
306
|
* @example
|
319
307
|
* <pre>
|
320
308
|
* // Override the internal 'views' builder with a function that takes the state
|
321
309
|
* // definition, and a reference to the internal function being overridden:
|
322
|
-
* $stateProvider.decorator('views', function (
|
310
|
+
* $stateProvider.decorator('views', function (state, parent) {
|
323
311
|
* var result = {},
|
324
312
|
* views = parent(state);
|
325
313
|
*
|
326
|
-
* angular.forEach(
|
314
|
+
* angular.forEach(views, function (config, name) {
|
327
315
|
* var autoName = (state.name + '.' + name).replace('.', '/');
|
328
316
|
* config.templateUrl = config.templateUrl || '/partials/' + autoName + '.html';
|
329
317
|
* result[name] = config;
|
@@ -379,9 +367,12 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
|
|
379
367
|
* Registers a state configuration under a given state name. The stateConfig object
|
380
368
|
* has the following acceptable properties.
|
381
369
|
*
|
370
|
+
* @param {string} name A unique state name, e.g. "home", "about", "contacts".
|
371
|
+
* To create a parent/child state use a dot, e.g. "about.sales", "home.newest".
|
372
|
+
* @param {object} stateConfig State configuration object.
|
373
|
+
* @param {string|function=} stateConfig.template
|
382
374
|
* <a id='template'></a>
|
383
|
-
*
|
384
|
-
* - **`template`** - {string|function=} - html template as a string or a function that returns
|
375
|
+
* html template as a string or a function that returns
|
385
376
|
* an html template as a string which should be used by the uiView directives. This property
|
386
377
|
* takes precedence over templateUrl.
|
387
378
|
*
|
@@ -390,9 +381,17 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
|
|
390
381
|
* - {array.<object>} - state parameters extracted from the current $location.path() by
|
391
382
|
* applying the current state
|
392
383
|
*
|
384
|
+
* <pre>template:
|
385
|
+
* "<h1>inline template definition</h1>" +
|
386
|
+
* "<div ui-view></div>"</pre>
|
387
|
+
* <pre>template: function(params) {
|
388
|
+
* return "<h1>generated template</h1>"; }</pre>
|
389
|
+
* </div>
|
390
|
+
*
|
391
|
+
* @param {string|function=} stateConfig.templateUrl
|
393
392
|
* <a id='templateUrl'></a>
|
394
393
|
*
|
395
|
-
*
|
394
|
+
* path or function that returns a path to an html
|
396
395
|
* template that should be used by uiView.
|
397
396
|
*
|
398
397
|
* If `templateUrl` is a function, it will be called with the following parameters:
|
@@ -400,82 +399,261 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
|
|
400
399
|
* - {array.<object>} - state parameters extracted from the current $location.path() by
|
401
400
|
* applying the current state
|
402
401
|
*
|
403
|
-
* <
|
402
|
+
* <pre>templateUrl: "home.html"</pre>
|
403
|
+
* <pre>templateUrl: function(params) {
|
404
|
+
* return myTemplates[params.pageId]; }</pre>
|
404
405
|
*
|
405
|
-
*
|
406
|
-
*
|
406
|
+
* @param {function=} stateConfig.templateProvider
|
407
|
+
* <a id='templateProvider'></a>
|
408
|
+
* Provider function that returns HTML content string.
|
409
|
+
* <pre> templateProvider:
|
410
|
+
* function(MyTemplateService, params) {
|
411
|
+
* return MyTemplateService.getTemplate(params.pageId);
|
412
|
+
* }</pre>
|
407
413
|
*
|
414
|
+
* @param {string|function=} stateConfig.controller
|
408
415
|
* <a id='controller'></a>
|
409
416
|
*
|
410
|
-
*
|
417
|
+
* Controller fn that should be associated with newly
|
411
418
|
* related scope or the name of a registered controller if passed as a string.
|
419
|
+
* Optionally, the ControllerAs may be declared here.
|
420
|
+
* <pre>controller: "MyRegisteredController"</pre>
|
421
|
+
* <pre>controller:
|
422
|
+
* "MyRegisteredController as fooCtrl"}</pre>
|
423
|
+
* <pre>controller: function($scope, MyService) {
|
424
|
+
* $scope.data = MyService.getData(); }</pre>
|
412
425
|
*
|
426
|
+
* @param {function=} stateConfig.controllerProvider
|
413
427
|
* <a id='controllerProvider'></a>
|
414
428
|
*
|
415
|
-
*
|
416
|
-
*
|
429
|
+
* Injectable provider function that returns the actual controller or string.
|
430
|
+
* <pre>controllerProvider:
|
431
|
+
* function(MyResolveData) {
|
432
|
+
* if (MyResolveData.foo)
|
433
|
+
* return "FooCtrl"
|
434
|
+
* else if (MyResolveData.bar)
|
435
|
+
* return "BarCtrl";
|
436
|
+
* else return function($scope) {
|
437
|
+
* $scope.baz = "Qux";
|
438
|
+
* }
|
439
|
+
* }</pre>
|
417
440
|
*
|
441
|
+
* @param {string=} stateConfig.controllerAs
|
418
442
|
* <a id='controllerAs'></a>
|
419
443
|
*
|
420
|
-
*
|
444
|
+
* A controller alias name. If present the controller will be
|
421
445
|
* published to scope under the controllerAs name.
|
446
|
+
* <pre>controllerAs: "myCtrl"</pre>
|
447
|
+
*
|
448
|
+
* @param {string|object=} stateConfig.parent
|
449
|
+
* <a id='parent'></a>
|
450
|
+
* Optionally specifies the parent state of this state.
|
451
|
+
*
|
452
|
+
* <pre>parent: 'parentState'</pre>
|
453
|
+
* <pre>parent: parentState // JS variable</pre>
|
422
454
|
*
|
455
|
+
* @param {object=} stateConfig.resolve
|
423
456
|
* <a id='resolve'></a>
|
424
457
|
*
|
425
|
-
*
|
458
|
+
* An optional map<string, function> of dependencies which
|
426
459
|
* should be injected into the controller. If any of these dependencies are promises,
|
427
|
-
* the router will wait for them all to be resolved
|
428
|
-
*
|
429
|
-
* of the resolved promises are injected
|
430
|
-
* of the promises are rejected the $stateChangeError event is fired.
|
460
|
+
* the router will wait for them all to be resolved before the controller is instantiated.
|
461
|
+
* If all the promises are resolved successfully, the $stateChangeSuccess event is fired
|
462
|
+
* and the values of the resolved promises are injected into any controllers that reference them.
|
463
|
+
* If any of the promises are rejected the $stateChangeError event is fired.
|
464
|
+
*
|
465
|
+
* The map object is:
|
431
466
|
*
|
432
467
|
* - key - {string}: name of dependency to be injected into controller
|
433
468
|
* - factory - {string|function}: If string then it is alias for service. Otherwise if function,
|
434
469
|
* it is injected and return value it treated as dependency. If result is a promise, it is
|
435
470
|
* resolved before its value is injected into controller.
|
436
471
|
*
|
472
|
+
* <pre>resolve: {
|
473
|
+
* myResolve1:
|
474
|
+
* function($http, $stateParams) {
|
475
|
+
* return $http.get("/api/foos/"+stateParams.fooID);
|
476
|
+
* }
|
477
|
+
* }</pre>
|
478
|
+
*
|
479
|
+
* @param {string=} stateConfig.url
|
437
480
|
* <a id='url'></a>
|
438
481
|
*
|
439
|
-
*
|
482
|
+
* A url fragment with optional parameters. When a state is navigated or
|
440
483
|
* transitioned to, the `$stateParams` service will be populated with any
|
441
484
|
* parameters that were passed.
|
442
485
|
*
|
443
|
-
*
|
486
|
+
* (See {@link ui.router.util.type:UrlMatcher UrlMatcher} `UrlMatcher`} for
|
487
|
+
* more details on acceptable patterns )
|
444
488
|
*
|
445
|
-
*
|
446
|
-
*
|
447
|
-
*
|
448
|
-
*
|
489
|
+
* examples:
|
490
|
+
* <pre>url: "/home"
|
491
|
+
* url: "/users/:userid"
|
492
|
+
* url: "/books/{bookid:[a-zA-Z_-]}"
|
493
|
+
* url: "/books/{categoryid:int}"
|
494
|
+
* url: "/books/{publishername:string}/{categoryid:int}"
|
495
|
+
* url: "/messages?before&after"
|
496
|
+
* url: "/messages?{before:date}&{after:date}"
|
497
|
+
* url: "/messages/:mailboxid?{before:date}&{after:date}"
|
498
|
+
* </pre>
|
449
499
|
*
|
500
|
+
* @param {object=} stateConfig.views
|
450
501
|
* <a id='views'></a>
|
502
|
+
* an optional map<string, object> which defined multiple views, or targets views
|
503
|
+
* manually/explicitly.
|
451
504
|
*
|
452
|
-
*
|
453
|
-
* manually/explicitly.
|
505
|
+
* Examples:
|
454
506
|
*
|
455
|
-
*
|
507
|
+
* Targets three named `ui-view`s in the parent state's template
|
508
|
+
* <pre>views: {
|
509
|
+
* header: {
|
510
|
+
* controller: "headerCtrl",
|
511
|
+
* templateUrl: "header.html"
|
512
|
+
* }, body: {
|
513
|
+
* controller: "bodyCtrl",
|
514
|
+
* templateUrl: "body.html"
|
515
|
+
* }, footer: {
|
516
|
+
* controller: "footCtrl",
|
517
|
+
* templateUrl: "footer.html"
|
518
|
+
* }
|
519
|
+
* }</pre>
|
456
520
|
*
|
457
|
-
*
|
521
|
+
* Targets named `ui-view="header"` from grandparent state 'top''s template, and named `ui-view="body" from parent state's template.
|
522
|
+
* <pre>views: {
|
523
|
+
* 'header@top': {
|
524
|
+
* controller: "msgHeaderCtrl",
|
525
|
+
* templateUrl: "msgHeader.html"
|
526
|
+
* }, 'body': {
|
527
|
+
* controller: "messagesCtrl",
|
528
|
+
* templateUrl: "messages.html"
|
529
|
+
* }
|
530
|
+
* }</pre>
|
531
|
+
*
|
532
|
+
* @param {boolean=} [stateConfig.abstract=false]
|
533
|
+
* <a id='abstract'></a>
|
534
|
+
* An abstract state will never be directly activated,
|
458
535
|
* but can provide inherited properties to its common children states.
|
536
|
+
* <pre>abstract: true</pre>
|
459
537
|
*
|
538
|
+
* @param {function=} stateConfig.onEnter
|
460
539
|
* <a id='onEnter'></a>
|
461
540
|
*
|
462
|
-
*
|
541
|
+
* Callback function for when a state is entered. Good way
|
463
542
|
* to trigger an action or dispatch an event, such as opening a dialog.
|
543
|
+
* If minifying your scripts, make sure to explictly annotate this function,
|
544
|
+
* because it won't be automatically annotated by your build tools.
|
545
|
+
*
|
546
|
+
* <pre>onEnter: function(MyService, $stateParams) {
|
547
|
+
* MyService.foo($stateParams.myParam);
|
548
|
+
* }</pre>
|
464
549
|
*
|
550
|
+
* @param {function=} stateConfig.onExit
|
465
551
|
* <a id='onExit'></a>
|
466
552
|
*
|
467
|
-
*
|
553
|
+
* Callback function for when a state is exited. Good way to
|
468
554
|
* trigger an action or dispatch an event, such as opening a dialog.
|
555
|
+
* If minifying your scripts, make sure to explictly annotate this function,
|
556
|
+
* because it won't be automatically annotated by your build tools.
|
469
557
|
*
|
558
|
+
* <pre>onExit: function(MyService, $stateParams) {
|
559
|
+
* MyService.cleanup($stateParams.myParam);
|
560
|
+
* }</pre>
|
561
|
+
*
|
562
|
+
* @param {boolean=} [stateConfig.reloadOnSearch=true]
|
470
563
|
* <a id='reloadOnSearch'></a>
|
471
564
|
*
|
472
|
-
*
|
565
|
+
* If `false`, will not retrigger the same state
|
473
566
|
* just because a search/query parameter has changed (via $location.search() or $location.hash()).
|
474
567
|
* Useful for when you'd like to modify $location.search() without triggering a reload.
|
568
|
+
* <pre>reloadOnSearch: false</pre>
|
475
569
|
*
|
570
|
+
* @param {object=} stateConfig.data
|
476
571
|
* <a id='data'></a>
|
477
572
|
*
|
478
|
-
*
|
573
|
+
* Arbitrary data object, useful for custom configuration. The parent state's `data` is
|
574
|
+
* prototypally inherited. In other words, adding a data property to a state adds it to
|
575
|
+
* the entire subtree via prototypal inheritance.
|
576
|
+
*
|
577
|
+
* <pre>data: {
|
578
|
+
* requiredRole: 'foo'
|
579
|
+
* } </pre>
|
580
|
+
*
|
581
|
+
* @param {object=} stateConfig.params
|
582
|
+
* <a id='params'></a>
|
583
|
+
*
|
584
|
+
* A map which optionally configures parameters declared in the `url`, or
|
585
|
+
* defines additional non-url parameters. For each parameter being
|
586
|
+
* configured, add a configuration object keyed to the name of the parameter.
|
587
|
+
*
|
588
|
+
* Each parameter configuration object may contain the following properties:
|
589
|
+
*
|
590
|
+
* - ** value ** - {object|function=}: specifies the default value for this
|
591
|
+
* parameter. This implicitly sets this parameter as optional.
|
592
|
+
*
|
593
|
+
* When UI-Router routes to a state and no value is
|
594
|
+
* specified for this parameter in the URL or transition, the
|
595
|
+
* default value will be used instead. If `value` is a function,
|
596
|
+
* it will be injected and invoked, and the return value used.
|
597
|
+
*
|
598
|
+
* *Note*: `undefined` is treated as "no default value" while `null`
|
599
|
+
* is treated as "the default value is `null`".
|
600
|
+
*
|
601
|
+
* *Shorthand*: If you only need to configure the default value of the
|
602
|
+
* parameter, you may use a shorthand syntax. In the **`params`**
|
603
|
+
* map, instead mapping the param name to a full parameter configuration
|
604
|
+
* object, simply set map it to the default parameter value, e.g.:
|
605
|
+
*
|
606
|
+
* <pre>// define a parameter's default value
|
607
|
+
* params: {
|
608
|
+
* param1: { value: "defaultValue" }
|
609
|
+
* }
|
610
|
+
* // shorthand default values
|
611
|
+
* params: {
|
612
|
+
* param1: "defaultValue",
|
613
|
+
* param2: "param2Default"
|
614
|
+
* }</pre>
|
615
|
+
*
|
616
|
+
* - ** array ** - {boolean=}: *(default: false)* If true, the param value will be
|
617
|
+
* treated as an array of values. If you specified a Type, the value will be
|
618
|
+
* treated as an array of the specified Type. Note: query parameter values
|
619
|
+
* default to a special `"auto"` mode.
|
620
|
+
*
|
621
|
+
* For query parameters in `"auto"` mode, if multiple values for a single parameter
|
622
|
+
* are present in the URL (e.g.: `/foo?bar=1&bar=2&bar=3`) then the values
|
623
|
+
* are mapped to an array (e.g.: `{ foo: [ '1', '2', '3' ] }`). However, if
|
624
|
+
* only one value is present (e.g.: `/foo?bar=1`) then the value is treated as single
|
625
|
+
* value (e.g.: `{ foo: '1' }`).
|
626
|
+
*
|
627
|
+
* <pre>params: {
|
628
|
+
* param1: { array: true }
|
629
|
+
* }</pre>
|
630
|
+
*
|
631
|
+
* - ** squash ** - {bool|string=}: `squash` configures how a default parameter value is represented in the URL when
|
632
|
+
* the current parameter value is the same as the default value. If `squash` is not set, it uses the
|
633
|
+
* configured default squash policy.
|
634
|
+
* (See {@link ui.router.util.$urlMatcherFactory#methods_defaultSquashPolicy `defaultSquashPolicy()`})
|
635
|
+
*
|
636
|
+
* There are three squash settings:
|
637
|
+
*
|
638
|
+
* - false: The parameter's default value is not squashed. It is encoded and included in the URL
|
639
|
+
* - true: The parameter's default value is omitted from the URL. If the parameter is preceeded and followed
|
640
|
+
* by slashes in the state's `url` declaration, then one of those slashes are omitted.
|
641
|
+
* This can allow for cleaner looking URLs.
|
642
|
+
* - `"<arbitrary string>"`: The parameter's default value is replaced with an arbitrary placeholder of your choice.
|
643
|
+
*
|
644
|
+
* <pre>params: {
|
645
|
+
* param1: {
|
646
|
+
* value: "defaultId",
|
647
|
+
* squash: true
|
648
|
+
* } }
|
649
|
+
* // squash "defaultValue" to "~"
|
650
|
+
* params: {
|
651
|
+
* param1: {
|
652
|
+
* value: "defaultValue",
|
653
|
+
* squash: "~"
|
654
|
+
* } }
|
655
|
+
* </pre>
|
656
|
+
*
|
479
657
|
*
|
480
658
|
* @example
|
481
659
|
* <pre>
|
@@ -484,7 +662,7 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
|
|
484
662
|
* // stateName can be a single top-level name (must be unique).
|
485
663
|
* $stateProvider.state("home", {});
|
486
664
|
*
|
487
|
-
* // Or it can be a nested state name. This state is a child of the
|
665
|
+
* // Or it can be a nested state name. This state is a child of the
|
488
666
|
* // above "home" state.
|
489
667
|
* $stateProvider.state("home.newest", {});
|
490
668
|
*
|
@@ -498,9 +676,6 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
|
|
498
676
|
* .state("contacts", {});
|
499
677
|
* </pre>
|
500
678
|
*
|
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
679
|
*/
|
505
680
|
this.state = state;
|
506
681
|
function state(name, definition) {
|
@@ -521,6 +696,7 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
|
|
521
696
|
* @requires $injector
|
522
697
|
* @requires ui.router.util.$resolve
|
523
698
|
* @requires ui.router.state.$stateParams
|
699
|
+
* @requires ui.router.router.$urlRouter
|
524
700
|
*
|
525
701
|
* @property {object} params A param object, e.g. {sectionId: section.id)}, that
|
526
702
|
* you'd like to test against the current active state.
|
@@ -534,26 +710,82 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
|
|
534
710
|
* between them. It also provides interfaces to ask for current state or even states
|
535
711
|
* you're coming from.
|
536
712
|
*/
|
537
|
-
// $urlRouter is injected just to ensure it gets instantiated
|
538
713
|
this.$get = $get;
|
539
|
-
$get.$inject = ['$rootScope', '$q', '$view', '$injector', '$resolve', '$stateParams', '$
|
540
|
-
function $get( $rootScope, $q, $view, $injector, $resolve, $stateParams, $
|
714
|
+
$get.$inject = ['$rootScope', '$q', '$view', '$injector', '$resolve', '$stateParams', '$urlRouter', '$location', '$urlMatcherFactory'];
|
715
|
+
function $get( $rootScope, $q, $view, $injector, $resolve, $stateParams, $urlRouter, $location, $urlMatcherFactory) {
|
541
716
|
|
542
717
|
var TransitionSuperseded = $q.reject(new Error('transition superseded'));
|
543
718
|
var TransitionPrevented = $q.reject(new Error('transition prevented'));
|
544
719
|
var TransitionAborted = $q.reject(new Error('transition aborted'));
|
545
720
|
var TransitionFailed = $q.reject(new Error('transition failed'));
|
546
|
-
var currentLocation = $location.url();
|
547
|
-
var baseHref = $browser.baseHref();
|
548
721
|
|
549
|
-
|
550
|
-
|
551
|
-
|
552
|
-
|
722
|
+
// Handles the case where a state which is the target of a transition is not found, and the user
|
723
|
+
// can optionally retry or defer the transition
|
724
|
+
function handleRedirect(redirect, state, params, options) {
|
725
|
+
/**
|
726
|
+
* @ngdoc event
|
727
|
+
* @name ui.router.state.$state#$stateNotFound
|
728
|
+
* @eventOf ui.router.state.$state
|
729
|
+
* @eventType broadcast on root scope
|
730
|
+
* @description
|
731
|
+
* Fired when a requested state **cannot be found** using the provided state name during transition.
|
732
|
+
* The event is broadcast allowing any handlers a single chance to deal with the error (usually by
|
733
|
+
* lazy-loading the unfound state). A special `unfoundState` object is passed to the listener handler,
|
734
|
+
* you can see its three properties in the example. You can use `event.preventDefault()` to abort the
|
735
|
+
* transition and the promise returned from `go` will be rejected with a `'transition aborted'` value.
|
736
|
+
*
|
737
|
+
* @param {Object} event Event object.
|
738
|
+
* @param {Object} unfoundState Unfound State information. Contains: `to, toParams, options` properties.
|
739
|
+
* @param {State} fromState Current state object.
|
740
|
+
* @param {Object} fromParams Current state params.
|
741
|
+
*
|
742
|
+
* @example
|
743
|
+
*
|
744
|
+
* <pre>
|
745
|
+
* // somewhere, assume lazy.state has not been defined
|
746
|
+
* $state.go("lazy.state", {a:1, b:2}, {inherit:false});
|
747
|
+
*
|
748
|
+
* // somewhere else
|
749
|
+
* $scope.$on('$stateNotFound',
|
750
|
+
* function(event, unfoundState, fromState, fromParams){
|
751
|
+
* console.log(unfoundState.to); // "lazy.state"
|
752
|
+
* console.log(unfoundState.toParams); // {a:1, b:2}
|
753
|
+
* console.log(unfoundState.options); // {inherit:false} + default options
|
754
|
+
* })
|
755
|
+
* </pre>
|
756
|
+
*/
|
757
|
+
var evt = $rootScope.$broadcast('$stateNotFound', redirect, state, params);
|
758
|
+
|
759
|
+
if (evt.defaultPrevented) {
|
760
|
+
$urlRouter.update();
|
761
|
+
return TransitionAborted;
|
762
|
+
}
|
763
|
+
|
764
|
+
if (!evt.retry) {
|
765
|
+
return null;
|
553
766
|
}
|
767
|
+
|
768
|
+
// Allow the handler to return a promise to defer state lookup retry
|
769
|
+
if (options.$retry) {
|
770
|
+
$urlRouter.update();
|
771
|
+
return TransitionFailed;
|
772
|
+
}
|
773
|
+
var retryTransition = $state.transition = $q.when(evt.retry);
|
774
|
+
|
775
|
+
retryTransition.then(function() {
|
776
|
+
if (retryTransition !== $state.transition) return TransitionSuperseded;
|
777
|
+
redirect.options.$retry = true;
|
778
|
+
return $state.transitionTo(redirect.to, redirect.toParams, redirect.options);
|
779
|
+
}, function() {
|
780
|
+
return TransitionAborted;
|
781
|
+
});
|
782
|
+
$urlRouter.update();
|
783
|
+
|
784
|
+
return retryTransition;
|
554
785
|
}
|
555
786
|
|
556
787
|
root.locals = { resolve: null, globals: { $stateParams: {} } };
|
788
|
+
|
557
789
|
$state = {
|
558
790
|
params: {},
|
559
791
|
current: root.self,
|
@@ -567,8 +799,8 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
|
|
567
799
|
* @methodOf ui.router.state.$state
|
568
800
|
*
|
569
801
|
* @description
|
570
|
-
* A method that force reloads the current state. All resolves are re-resolved,
|
571
|
-
*
|
802
|
+
* A method that force reloads the current state. All resolves are re-resolved,
|
803
|
+
* controllers reinstantiated, and events re-fired.
|
572
804
|
*
|
573
805
|
* @example
|
574
806
|
* <pre>
|
@@ -584,12 +816,37 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
|
|
584
816
|
* `reload()` is just an alias for:
|
585
817
|
* <pre>
|
586
818
|
* $state.transitionTo($state.current, $stateParams, {
|
587
|
-
* reload: true, inherit: false, notify:
|
819
|
+
* reload: true, inherit: false, notify: true
|
820
|
+
* });
|
821
|
+
* </pre>
|
822
|
+
*
|
823
|
+
* @param {string=|object=} state - A state name or a state object, which is the root of the resolves to be re-resolved.
|
824
|
+
* @example
|
825
|
+
* <pre>
|
826
|
+
* //assuming app application consists of 3 states: 'contacts', 'contacts.detail', 'contacts.detail.item'
|
827
|
+
* //and current state is 'contacts.detail.item'
|
828
|
+
* var app angular.module('app', ['ui.router']);
|
829
|
+
*
|
830
|
+
* app.controller('ctrl', function ($scope, $state) {
|
831
|
+
* $scope.reload = function(){
|
832
|
+
* //will reload 'contact.detail' and 'contact.detail.item' states
|
833
|
+
* $state.reload('contact.detail');
|
834
|
+
* }
|
835
|
+
* });
|
836
|
+
* </pre>
|
837
|
+
*
|
838
|
+
* `reload()` is just an alias for:
|
839
|
+
* <pre>
|
840
|
+
* $state.transitionTo($state.current, $stateParams, {
|
841
|
+
* reload: true, inherit: false, notify: true
|
588
842
|
* });
|
589
843
|
* </pre>
|
844
|
+
|
845
|
+
* @returns {promise} A promise representing the state of the new transition. See
|
846
|
+
* {@link ui.router.state.$state#methods_go $state.go}.
|
590
847
|
*/
|
591
|
-
$state.reload = function reload() {
|
592
|
-
$state.transitionTo($state.current, $stateParams, { reload: true, inherit: false, notify:
|
848
|
+
$state.reload = function reload(state) {
|
849
|
+
return $state.transitionTo($state.current, $stateParams, { reload: state || true, inherit: false, notify: true});
|
593
850
|
};
|
594
851
|
|
595
852
|
/**
|
@@ -659,7 +916,7 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
|
|
659
916
|
*
|
660
917
|
*/
|
661
918
|
$state.go = function go(to, params, options) {
|
662
|
-
return
|
919
|
+
return $state.transitionTo(to, params, extend({ inherit: true, relative: $state.$current }, options));
|
663
920
|
};
|
664
921
|
|
665
922
|
/**
|
@@ -693,9 +950,11 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
|
|
693
950
|
* - **`relative`** - {object=}, When transitioning with relative path (e.g '^'),
|
694
951
|
* defines which state to be relative from.
|
695
952
|
* - **`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
|
953
|
+
* - **`reload`** (v0.2.5) - {boolean=false|string=|object=}, If `true` will force transition even if the state or params
|
697
954
|
* have not changed, aka a reload of the same state. It differs from reloadOnSearch because you'd
|
698
955
|
* use this when you want to force a reload when *everything* is the same, including search params.
|
956
|
+
* if String, then will reload the state with the name given in reload, and any children.
|
957
|
+
* if Object, then a stateObj is expected, will reload the state found in stateObj, and any children.
|
699
958
|
*
|
700
959
|
* @returns {promise} A promise representing the state of the new transition. See
|
701
960
|
* {@link ui.router.state.$state#methods_go $state.go}.
|
@@ -709,64 +968,15 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
|
|
709
968
|
var from = $state.$current, fromParams = $state.params, fromPath = from.path;
|
710
969
|
var evt, toState = findState(to, options.relative);
|
711
970
|
|
971
|
+
// Store the hash param for later (since it will be stripped out by various methods)
|
972
|
+
var hash = toParams['#'];
|
973
|
+
|
712
974
|
if (!isDefined(toState)) {
|
713
|
-
// Broadcast not found event and abort the transition if prevented
|
714
975
|
var redirect = { to: to, toParams: toParams, options: options };
|
976
|
+
var redirectResult = handleRedirect(redirect, from.self, fromParams, options);
|
715
977
|
|
716
|
-
|
717
|
-
|
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;
|
978
|
+
if (redirectResult) {
|
979
|
+
return redirectResult;
|
770
980
|
}
|
771
981
|
|
772
982
|
// Always retry once if the $stateNotFound was not prevented
|
@@ -775,38 +985,68 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
|
|
775
985
|
toParams = redirect.toParams;
|
776
986
|
options = redirect.options;
|
777
987
|
toState = findState(to, options.relative);
|
988
|
+
|
778
989
|
if (!isDefined(toState)) {
|
779
|
-
if (options.relative) throw new Error("
|
780
|
-
throw new Error("
|
990
|
+
if (!options.relative) throw new Error("No such state '" + to + "'");
|
991
|
+
throw new Error("Could not resolve '" + to + "' from state '" + options.relative + "'");
|
781
992
|
}
|
782
993
|
}
|
783
994
|
if (toState[abstractKey]) throw new Error("Cannot transition to abstract state '" + to + "'");
|
784
995
|
if (options.inherit) toParams = inheritParams($stateParams, toParams || {}, $state.$current, toState);
|
996
|
+
if (!toState.params.$$validates(toParams)) return TransitionFailed;
|
997
|
+
|
998
|
+
toParams = toState.params.$$values(toParams);
|
785
999
|
to = toState;
|
786
1000
|
|
787
1001
|
var toPath = to.path;
|
788
1002
|
|
789
1003
|
// Starting from the root of the path, keep all levels that haven't changed
|
790
|
-
var keep, state, locals = root.locals, toLocals = [];
|
791
|
-
|
792
|
-
|
793
|
-
|
794
|
-
|
1004
|
+
var keep = 0, state = toPath[keep], locals = root.locals, toLocals = [];
|
1005
|
+
|
1006
|
+
if (!options.reload) {
|
1007
|
+
while (state && state === fromPath[keep] && state.ownParams.$$equals(toParams, fromParams)) {
|
1008
|
+
locals = toLocals[keep] = state.locals;
|
1009
|
+
keep++;
|
1010
|
+
state = toPath[keep];
|
1011
|
+
}
|
1012
|
+
} else if (isString(options.reload) || isObject(options.reload)) {
|
1013
|
+
if (isObject(options.reload) && !options.reload.name) {
|
1014
|
+
throw new Error('Invalid reload state object');
|
1015
|
+
}
|
1016
|
+
|
1017
|
+
var reloadState = options.reload === true ? fromPath[0] : findState(options.reload);
|
1018
|
+
if (options.reload && !reloadState) {
|
1019
|
+
throw new Error("No such reload state '" + (isString(options.reload) ? options.reload : options.reload.name) + "'");
|
1020
|
+
}
|
1021
|
+
|
1022
|
+
while (state && state === fromPath[keep] && state !== reloadState) {
|
1023
|
+
locals = toLocals[keep] = state.locals;
|
1024
|
+
keep++;
|
1025
|
+
state = toPath[keep];
|
1026
|
+
}
|
795
1027
|
}
|
796
1028
|
|
797
1029
|
// If we're going to the same state and all locals are kept, we've got nothing to do.
|
798
1030
|
// 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
|
800
|
-
// because we might accidentally abort a legitimate
|
801
|
-
|
802
|
-
|
803
|
-
|
1031
|
+
// TODO: We may not want to bump 'transition' if we're called from a location change
|
1032
|
+
// that we've initiated ourselves, because we might accidentally abort a legitimate
|
1033
|
+
// transition initiated from code?
|
1034
|
+
if (shouldSkipReload(to, toParams, from, fromParams, locals, options)) {
|
1035
|
+
if (hash) toParams['#'] = hash;
|
1036
|
+
$state.params = toParams;
|
1037
|
+
copy($state.params, $stateParams);
|
1038
|
+
if (options.location && to.navigable && to.navigable.url) {
|
1039
|
+
$urlRouter.push(to.navigable.url, toParams, {
|
1040
|
+
$$avoidResync: true, replace: options.location === 'replace'
|
1041
|
+
});
|
1042
|
+
$urlRouter.update(true);
|
1043
|
+
}
|
804
1044
|
$state.transition = null;
|
805
1045
|
return $q.when($state.current);
|
806
1046
|
}
|
807
1047
|
|
808
|
-
//
|
809
|
-
toParams =
|
1048
|
+
// Filter parameters before we pass them to event handlers etc.
|
1049
|
+
toParams = filterByKeys(to.params.$$keys(), toParams || {});
|
810
1050
|
|
811
1051
|
// Broadcast start event and cancel the transition if requested
|
812
1052
|
if (options.notify) {
|
@@ -837,9 +1077,9 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
|
|
837
1077
|
* })
|
838
1078
|
* </pre>
|
839
1079
|
*/
|
840
|
-
|
841
|
-
|
842
|
-
|
1080
|
+
if ($rootScope.$broadcast('$stateChangeStart', to.self, toParams, from.self, fromParams).defaultPrevented) {
|
1081
|
+
$rootScope.$broadcast('$stateChangeCancel', to.self, toParams, from.self, fromParams);
|
1082
|
+
$urlRouter.update();
|
843
1083
|
return TransitionPrevented;
|
844
1084
|
}
|
845
1085
|
}
|
@@ -852,9 +1092,10 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
|
|
852
1092
|
// empty and gets filled asynchronously. We need to keep track of the promise for the
|
853
1093
|
// (fully resolved) current locals, and pass this down the chain.
|
854
1094
|
var resolved = $q.when(locals);
|
855
|
-
|
1095
|
+
|
1096
|
+
for (var l = keep; l < toPath.length; l++, state = toPath[l]) {
|
856
1097
|
locals = toLocals[l] = inherit(locals);
|
857
|
-
resolved = resolveState(state, toParams, state===to, resolved, locals);
|
1098
|
+
resolved = resolveState(state, toParams, state === to, resolved, locals, options);
|
858
1099
|
}
|
859
1100
|
|
860
1101
|
// Once everything is resolved, we are ready to perform the actual transition
|
@@ -867,7 +1108,7 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
|
|
867
1108
|
if ($state.transition !== transition) return TransitionSuperseded;
|
868
1109
|
|
869
1110
|
// Exit 'from' states not kept
|
870
|
-
for (l=fromPath.length-1; l>=keep; l--) {
|
1111
|
+
for (l = fromPath.length - 1; l >= keep; l--) {
|
871
1112
|
exiting = fromPath[l];
|
872
1113
|
if (exiting.self.onExit) {
|
873
1114
|
$injector.invoke(exiting.self.onExit, exiting.self, exiting.locals.globals);
|
@@ -876,7 +1117,7 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
|
|
876
1117
|
}
|
877
1118
|
|
878
1119
|
// Enter 'to' states not kept
|
879
|
-
for (l=keep; l<toPath.length; l++) {
|
1120
|
+
for (l = keep; l < toPath.length; l++) {
|
880
1121
|
entering = toPath[l];
|
881
1122
|
entering.locals = toLocals[l];
|
882
1123
|
if (entering.self.onEnter) {
|
@@ -884,6 +1125,9 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
|
|
884
1125
|
}
|
885
1126
|
}
|
886
1127
|
|
1128
|
+
// Re-add the saved hash before we start returning things
|
1129
|
+
if (hash) toParams['#'] = hash;
|
1130
|
+
|
887
1131
|
// Run it again, to catch any transitions in callbacks
|
888
1132
|
if ($state.transition !== transition) return TransitionSuperseded;
|
889
1133
|
|
@@ -894,14 +1138,10 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
|
|
894
1138
|
copy($state.params, $stateParams);
|
895
1139
|
$state.transition = null;
|
896
1140
|
|
897
|
-
|
898
|
-
|
899
|
-
|
900
|
-
|
901
|
-
|
902
|
-
if (options.location === 'replace') {
|
903
|
-
$location.replace();
|
904
|
-
}
|
1141
|
+
if (options.location && to.navigable) {
|
1142
|
+
$urlRouter.push(to.navigable.url, to.navigable.locals.globals.$stateParams, {
|
1143
|
+
$$avoidResync: true, replace: options.location === 'replace'
|
1144
|
+
});
|
905
1145
|
}
|
906
1146
|
|
907
1147
|
if (options.notify) {
|
@@ -921,7 +1161,7 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
|
|
921
1161
|
*/
|
922
1162
|
$rootScope.$broadcast('$stateChangeSuccess', to.self, toParams, from.self, fromParams);
|
923
1163
|
}
|
924
|
-
|
1164
|
+
$urlRouter.update(true);
|
925
1165
|
|
926
1166
|
return $state.current;
|
927
1167
|
}, function (error) {
|
@@ -946,8 +1186,11 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
|
|
946
1186
|
* @param {Object} fromParams The params supplied to the `fromState`.
|
947
1187
|
* @param {Error} error The resolve error object.
|
948
1188
|
*/
|
949
|
-
$rootScope.$broadcast('$stateChangeError', to.self, toParams, from.self, fromParams, error);
|
950
|
-
|
1189
|
+
evt = $rootScope.$broadcast('$stateChangeError', to.self, toParams, from.self, fromParams, error);
|
1190
|
+
|
1191
|
+
if (!evt.defaultPrevented) {
|
1192
|
+
$urlRouter.update();
|
1193
|
+
}
|
951
1194
|
|
952
1195
|
return $q.reject(error);
|
953
1196
|
});
|
@@ -962,35 +1205,40 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
|
|
962
1205
|
*
|
963
1206
|
* @description
|
964
1207
|
* 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
|
1208
|
+
* but only checks for the full state name. If params is supplied then it will be
|
1209
|
+
* tested for strict equality against the current active params object, so all params
|
967
1210
|
* must match with none missing and no extras.
|
968
1211
|
*
|
969
1212
|
* @example
|
970
1213
|
* <pre>
|
1214
|
+
* $state.$current.name = 'contacts.details.item';
|
1215
|
+
*
|
1216
|
+
* // absolute name
|
971
1217
|
* $state.is('contact.details.item'); // returns true
|
972
1218
|
* $state.is(contactDetailItemStateObject); // returns true
|
973
1219
|
*
|
974
|
-
* //
|
1220
|
+
* // relative name (. and ^), typically from a template
|
1221
|
+
* // E.g. from the 'contacts.details' template
|
1222
|
+
* <div ng-class="{highlighted: $state.is('.item')}">Item</div>
|
975
1223
|
* </pre>
|
976
1224
|
*
|
977
|
-
* @param {string|object}
|
978
|
-
* @param {object=} params A param object, e.g. `{sectionId: section.id}`, that you'd like
|
1225
|
+
* @param {string|object} stateOrName The state name (absolute or relative) or state object you'd like to check.
|
1226
|
+
* @param {object=} params A param object, e.g. `{sectionId: section.id}`, that you'd like
|
979
1227
|
* to test against the current active state.
|
1228
|
+
* @param {object=} options An options object. The options are:
|
1229
|
+
*
|
1230
|
+
* - **`relative`** - {string|object} - If `stateOrName` is a relative state name and `options.relative` is set, .is will
|
1231
|
+
* test relative to `options.relative` state (or name).
|
1232
|
+
*
|
980
1233
|
* @returns {boolean} Returns true if it is the state.
|
981
1234
|
*/
|
982
|
-
$state.is = function is(stateOrName, params) {
|
983
|
-
|
984
|
-
|
985
|
-
if (!isDefined(state)) {
|
986
|
-
return undefined;
|
987
|
-
}
|
988
|
-
|
989
|
-
if ($state.$current !== state) {
|
990
|
-
return false;
|
991
|
-
}
|
1235
|
+
$state.is = function is(stateOrName, params, options) {
|
1236
|
+
options = extend({ relative: $state.$current }, options || {});
|
1237
|
+
var state = findState(stateOrName, options.relative);
|
992
1238
|
|
993
|
-
|
1239
|
+
if (!isDefined(state)) { return undefined; }
|
1240
|
+
if ($state.$current !== state) { return false; }
|
1241
|
+
return params ? equalForKeys(state.params.$$values(params), $stateParams) : true;
|
994
1242
|
};
|
995
1243
|
|
996
1244
|
/**
|
@@ -999,25 +1247,28 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
|
|
999
1247
|
* @methodOf ui.router.state.$state
|
1000
1248
|
*
|
1001
1249
|
* @description
|
1002
|
-
* A method to determine if the current active state is equal to or is the child of the
|
1250
|
+
* A method to determine if the current active state is equal to or is the child of the
|
1003
1251
|
* state stateName. If any params are passed then they will be tested for a match as well.
|
1004
1252
|
* Not all the parameters need to be passed, just the ones you'd like to test for equality.
|
1005
1253
|
*
|
1006
1254
|
* @example
|
1255
|
+
* Partial and relative names
|
1007
1256
|
* <pre>
|
1008
1257
|
* $state.$current.name = 'contacts.details.item';
|
1009
1258
|
*
|
1259
|
+
* // Using partial names
|
1010
1260
|
* $state.includes("contacts"); // returns true
|
1011
1261
|
* $state.includes("contacts.details"); // returns true
|
1012
1262
|
* $state.includes("contacts.details.item"); // returns true
|
1013
1263
|
* $state.includes("contacts.list"); // returns false
|
1014
1264
|
* $state.includes("about"); // returns false
|
1015
|
-
* </pre>
|
1016
1265
|
*
|
1017
|
-
*
|
1018
|
-
*
|
1266
|
+
* // Using relative names (. and ^), typically from a template
|
1267
|
+
* // E.g. from the 'contacts.details' template
|
1268
|
+
* <div ng-class="{highlighted: $state.includes('.item')}">Item</div>
|
1269
|
+
* </pre>
|
1019
1270
|
*
|
1020
|
-
*
|
1271
|
+
* Basic globbing patterns
|
1021
1272
|
* <pre>
|
1022
1273
|
* $state.$current.name = 'contacts.details.item.url';
|
1023
1274
|
*
|
@@ -1030,37 +1281,30 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
|
|
1030
1281
|
* $state.includes("item.**"); // returns false
|
1031
1282
|
* </pre>
|
1032
1283
|
*
|
1033
|
-
* @param {string} stateOrName A partial name
|
1034
|
-
*
|
1284
|
+
* @param {string} stateOrName A partial name, relative name, or glob pattern
|
1285
|
+
* to be searched for within the current state name.
|
1286
|
+
* @param {object=} params A param object, e.g. `{sectionId: section.id}`,
|
1035
1287
|
* that you'd like to test against the current active state.
|
1288
|
+
* @param {object=} options An options object. The options are:
|
1289
|
+
*
|
1290
|
+
* - **`relative`** - {string|object=} - If `stateOrName` is a relative state reference and `options.relative` is set,
|
1291
|
+
* .includes will test relative to `options.relative` state (or name).
|
1292
|
+
*
|
1036
1293
|
* @returns {boolean} Returns true if it does include the state
|
1037
1294
|
*/
|
1038
|
-
|
1039
|
-
|
1295
|
+
$state.includes = function includes(stateOrName, params, options) {
|
1296
|
+
options = extend({ relative: $state.$current }, options || {});
|
1040
1297
|
if (isString(stateOrName) && isGlob(stateOrName)) {
|
1041
|
-
if (doesStateMatchGlob(stateOrName)) {
|
1042
|
-
stateOrName = $state.$current.name;
|
1043
|
-
} else {
|
1298
|
+
if (!doesStateMatchGlob(stateOrName)) {
|
1044
1299
|
return false;
|
1045
1300
|
}
|
1301
|
+
stateOrName = $state.$current.name;
|
1046
1302
|
}
|
1047
1303
|
|
1048
|
-
var state = findState(stateOrName);
|
1049
|
-
if (!isDefined(state)) {
|
1050
|
-
|
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;
|
1304
|
+
var state = findState(stateOrName, options.relative);
|
1305
|
+
if (!isDefined(state)) { return undefined; }
|
1306
|
+
if (!isDefined($state.$current.includes[state.name])) { return false; }
|
1307
|
+
return params ? equalForKeys(state.params.$$values(params), $stateParams, objectKeys(params)) : true;
|
1064
1308
|
};
|
1065
1309
|
|
1066
1310
|
|
@@ -1084,7 +1328,7 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
|
|
1084
1328
|
* - **`lossy`** - {boolean=true} - If true, and if there is no url associated with the state provided in the
|
1085
1329
|
* first parameter, then the constructed href url will be built from the first navigable ancestor (aka
|
1086
1330
|
* ancestor with a valid url).
|
1087
|
-
* - **`inherit`** - {boolean=
|
1331
|
+
* - **`inherit`** - {boolean=true}, If `true` will inherit url parameters from current url.
|
1088
1332
|
* - **`relative`** - {object=$state.$current}, When transitioning with relative path (e.g '^'),
|
1089
1333
|
* defines which state to be relative from.
|
1090
1334
|
* - **`absolute`** - {boolean=false}, If true will generate an absolute url, e.g. "http://www.example.com/fullurl".
|
@@ -1092,33 +1336,26 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
|
|
1092
1336
|
* @returns {string} compiled state url
|
1093
1337
|
*/
|
1094
1338
|
$state.href = function href(stateOrName, params, options) {
|
1095
|
-
options = extend({
|
1339
|
+
options = extend({
|
1340
|
+
lossy: true,
|
1341
|
+
inherit: true,
|
1342
|
+
absolute: false,
|
1343
|
+
relative: $state.$current
|
1344
|
+
}, options || {});
|
1345
|
+
|
1096
1346
|
var state = findState(stateOrName, options.relative);
|
1097
|
-
if (!isDefined(state)) return null;
|
1098
1347
|
|
1099
|
-
|
1348
|
+
if (!isDefined(state)) return null;
|
1349
|
+
if (options.inherit) params = inheritParams($stateParams, params || {}, $state.$current, state);
|
1350
|
+
|
1100
1351
|
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
1352
|
|
1106
|
-
if (
|
1107
|
-
|
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;
|
1353
|
+
if (!nav || nav.url === undefined || nav.url === null) {
|
1354
|
+
return null;
|
1120
1355
|
}
|
1121
|
-
return url
|
1356
|
+
return $urlRouter.href(nav.url, filterByKeys(state.params.$$keys().concat('#'), params || {}), {
|
1357
|
+
absolute: options.absolute
|
1358
|
+
});
|
1122
1359
|
};
|
1123
1360
|
|
1124
1361
|
/**
|
@@ -1129,26 +1366,23 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
|
|
1129
1366
|
* @description
|
1130
1367
|
* Returns the state configuration object for any specific state or all states.
|
1131
1368
|
*
|
1132
|
-
* @param {string|object=} stateOrName If provided, will only get the config for
|
1369
|
+
* @param {string|object=} stateOrName (absolute or relative) If provided, will only get the config for
|
1133
1370
|
* the requested state. If not provided, returns an array of ALL state configs.
|
1134
|
-
* @
|
1371
|
+
* @param {string|object=} context When stateOrName is a relative state reference, the state will be retrieved relative to context.
|
1372
|
+
* @returns {Object|Array} State configuration object or array of all objects.
|
1135
1373
|
*/
|
1136
1374
|
$state.get = function (stateOrName, context) {
|
1137
|
-
if (
|
1138
|
-
|
1139
|
-
forEach(states, function(state) { list.push(state.self); });
|
1140
|
-
return list;
|
1141
|
-
}
|
1142
|
-
var state = findState(stateOrName, context);
|
1375
|
+
if (arguments.length === 0) return map(objectKeys(states), function(name) { return states[name].self; });
|
1376
|
+
var state = findState(stateOrName, context || $state.$current);
|
1143
1377
|
return (state && state.self) ? state.self : null;
|
1144
1378
|
};
|
1145
1379
|
|
1146
|
-
function resolveState(state, params, paramsAreFiltered, inherited, dst) {
|
1380
|
+
function resolveState(state, params, paramsAreFiltered, inherited, dst, options) {
|
1147
1381
|
// Make a restricted $stateParams with only the parameters that apply to this state if
|
1148
1382
|
// necessary. In addition to being available to the controller and onEnter/onExit callbacks,
|
1149
1383
|
// we also need $stateParams to be available for any $injector calls we make during the
|
1150
1384
|
// dependency resolution process.
|
1151
|
-
var $stateParams = (paramsAreFiltered) ? params : filterByKeys(state.params, params);
|
1385
|
+
var $stateParams = (paramsAreFiltered) ? params : filterByKeys(state.params.$$keys(), params);
|
1152
1386
|
var locals = { $stateParams: $stateParams };
|
1153
1387
|
|
1154
1388
|
// Resolve 'global' dependencies for the state, i.e. those not specific to a view.
|
@@ -1156,35 +1390,43 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
|
|
1156
1390
|
// to the set that should be visible to the state, and are independent of when we update
|
1157
1391
|
// the global $state and $stateParams values.
|
1158
1392
|
dst.resolve = $resolve.resolve(state.resolve, locals, dst.resolve, state);
|
1159
|
-
var promises = [
|
1393
|
+
var promises = [dst.resolve.then(function (globals) {
|
1160
1394
|
dst.globals = globals;
|
1161
|
-
})
|
1395
|
+
})];
|
1162
1396
|
if (inherited) promises.push(inherited);
|
1163
1397
|
|
1164
|
-
|
1165
|
-
|
1166
|
-
|
1167
|
-
|
1168
|
-
|
1169
|
-
|
1170
|
-
|
1171
|
-
|
1172
|
-
|
1173
|
-
|
1174
|
-
|
1175
|
-
|
1176
|
-
|
1177
|
-
|
1178
|
-
|
1179
|
-
|
1180
|
-
|
1181
|
-
|
1182
|
-
|
1183
|
-
|
1184
|
-
|
1398
|
+
function resolveViews() {
|
1399
|
+
var viewsPromises = [];
|
1400
|
+
|
1401
|
+
// Resolve template and dependencies for all views.
|
1402
|
+
forEach(state.views, function (view, name) {
|
1403
|
+
var injectables = (view.resolve && view.resolve !== state.resolve ? view.resolve : {});
|
1404
|
+
injectables.$template = [ function () {
|
1405
|
+
return $view.load(name, { view: view, locals: dst.globals, params: $stateParams, notify: options.notify }) || '';
|
1406
|
+
}];
|
1407
|
+
|
1408
|
+
viewsPromises.push($resolve.resolve(injectables, dst.globals, dst.resolve, state).then(function (result) {
|
1409
|
+
// References to the controller (only instantiated at link time)
|
1410
|
+
if (isFunction(view.controllerProvider) || isArray(view.controllerProvider)) {
|
1411
|
+
var injectLocals = angular.extend({}, injectables, dst.globals);
|
1412
|
+
result.$$controller = $injector.invoke(view.controllerProvider, null, injectLocals);
|
1413
|
+
} else {
|
1414
|
+
result.$$controller = view.controller;
|
1415
|
+
}
|
1416
|
+
// Provide access to the state itself for internal use
|
1417
|
+
result.$$state = state;
|
1418
|
+
result.$$controllerAs = view.controllerAs;
|
1419
|
+
dst[name] = result;
|
1420
|
+
}));
|
1421
|
+
});
|
1422
|
+
|
1423
|
+
return $q.all(viewsPromises).then(function(){
|
1424
|
+
return dst.globals;
|
1425
|
+
});
|
1426
|
+
}
|
1185
1427
|
|
1186
1428
|
// Wait for all the promises and then return the activation object
|
1187
|
-
return $q.all(promises).then(function (values) {
|
1429
|
+
return $q.all(promises).then(resolveViews).then(function (values) {
|
1188
1430
|
return dst;
|
1189
1431
|
});
|
1190
1432
|
}
|
@@ -1192,8 +1434,27 @@ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $
|
|
1192
1434
|
return $state;
|
1193
1435
|
}
|
1194
1436
|
|
1195
|
-
function
|
1196
|
-
|
1437
|
+
function shouldSkipReload(to, toParams, from, fromParams, locals, options) {
|
1438
|
+
// Return true if there are no differences in non-search (path/object) params, false if there are differences
|
1439
|
+
function nonSearchParamsEqual(fromAndToState, fromParams, toParams) {
|
1440
|
+
// Identify whether all the parameters that differ between `fromParams` and `toParams` were search params.
|
1441
|
+
function notSearchParam(key) {
|
1442
|
+
return fromAndToState.params[key].location != "search";
|
1443
|
+
}
|
1444
|
+
var nonQueryParamKeys = fromAndToState.params.$$keys().filter(notSearchParam);
|
1445
|
+
var nonQueryParams = pick.apply({}, [fromAndToState.params].concat(nonQueryParamKeys));
|
1446
|
+
var nonQueryParamSet = new $$UMFP.ParamSet(nonQueryParams);
|
1447
|
+
return nonQueryParamSet.$$equals(fromParams, toParams);
|
1448
|
+
}
|
1449
|
+
|
1450
|
+
// If reload was not explicitly requested
|
1451
|
+
// and we're transitioning to the same state we're already in
|
1452
|
+
// and the locals didn't change
|
1453
|
+
// or they changed in a way that doesn't merit reloading
|
1454
|
+
// (reloadOnParams:false, or reloadOnSearch.false and only search params changed)
|
1455
|
+
// Then return true.
|
1456
|
+
if (!options.reload && to === from &&
|
1457
|
+
(locals === from.locals || (to.self.reloadOnSearch === false && nonSearchParamsEqual(from, fromParams, toParams)))) {
|
1197
1458
|
return true;
|
1198
1459
|
}
|
1199
1460
|
}
|