praxis 0.19.0 → 0.20.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (266) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +5 -0
  3. data/CHANGELOG.md +16 -0
  4. data/lib/api_browser/Gruntfile.js +125 -16
  5. data/lib/api_browser/app/index.html +5 -1
  6. data/lib/api_browser/app/js/directives/fixed_if_fits.js +28 -17
  7. data/lib/api_browser/app/js/directives/highlight.js +14 -0
  8. data/lib/api_browser/app/js/directives/request_examples.js +29 -0
  9. data/lib/api_browser/app/js/factories/Documentation.js +6 -0
  10. data/lib/api_browser/app/js/factories/Example.js +47 -0
  11. data/lib/api_browser/app/js/factories/prepare_template.js +15 -0
  12. data/lib/api_browser/app/js/factories/template_for.js +2 -12
  13. data/lib/api_browser/app/sass/modules/_sidebar.scss +2 -0
  14. data/lib/api_browser/app/views/action.html +6 -24
  15. data/lib/api_browser/app/views/examples/general.html +26 -0
  16. data/lib/api_browser/{bower.json → bower_template.json} +13 -3
  17. data/lib/api_browser/package.json +3 -1
  18. data/lib/praxis/application.rb +2 -0
  19. data/lib/praxis/docs/generator.rb +4 -2
  20. data/lib/praxis/extensions/field_selection/field_selector.rb +1 -0
  21. data/lib/praxis/media_type.rb +1 -1
  22. data/lib/praxis/plugin.rb +4 -0
  23. data/lib/praxis/plugin_concern.rb +2 -1
  24. data/lib/praxis/tasks/api_docs.rb +9 -2
  25. data/lib/praxis/version.rb +1 -1
  26. data/praxis.gemspec +2 -2
  27. data/spec/praxis/action_definition_spec.rb +26 -1
  28. data/spec/praxis/extensions/field_selection/field_selector_spec.rb +4 -0
  29. data/spec/praxis/media_type_spec.rb +4 -3
  30. data/spec/support/spec_media_types.rb +5 -1
  31. metadata +12 -242
  32. data/lib/api_browser/app/bower_components/angular-mocks/.bower.json +0 -19
  33. data/lib/api_browser/app/bower_components/angular-mocks/README.md +0 -63
  34. data/lib/api_browser/app/bower_components/angular-mocks/angular-mocks.js +0 -2452
  35. data/lib/api_browser/app/bower_components/angular-mocks/bower.json +0 -9
  36. data/lib/api_browser/app/bower_components/angular-mocks/ngAnimateMock.js +0 -2
  37. data/lib/api_browser/app/bower_components/angular-mocks/ngMock.js +0 -2
  38. data/lib/api_browser/app/bower_components/angular-mocks/ngMockE2E.js +0 -2
  39. data/lib/api_browser/app/bower_components/angular-mocks/package.json +0 -27
  40. data/lib/api_browser/app/bower_components/angular-sanitize/.bower.json +0 -19
  41. data/lib/api_browser/app/bower_components/angular-sanitize/README.md +0 -68
  42. data/lib/api_browser/app/bower_components/angular-sanitize/angular-sanitize.js +0 -683
  43. data/lib/api_browser/app/bower_components/angular-sanitize/angular-sanitize.min.js +0 -16
  44. data/lib/api_browser/app/bower_components/angular-sanitize/angular-sanitize.min.js.map +0 -8
  45. data/lib/api_browser/app/bower_components/angular-sanitize/bower.json +0 -9
  46. data/lib/api_browser/app/bower_components/angular-sanitize/index.js +0 -2
  47. data/lib/api_browser/app/bower_components/angular-sanitize/package.json +0 -26
  48. data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/.bower.json +0 -31
  49. data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/bower.json +0 -19
  50. data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/ui-bootstrap-csp.css +0 -6
  51. data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/ui-bootstrap-tpls.js +0 -4840
  52. data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/ui-bootstrap-tpls.min.js +0 -10
  53. data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/ui-bootstrap.js +0 -4461
  54. data/lib/api_browser/app/bower_components/angular-ui-bootstrap-bower/ui-bootstrap.min.js +0 -9
  55. data/lib/api_browser/app/bower_components/angular-ui-router/.bower.json +0 -33
  56. data/lib/api_browser/app/bower_components/angular-ui-router/CHANGELOG.md +0 -228
  57. data/lib/api_browser/app/bower_components/angular-ui-router/CONTRIBUTING.md +0 -65
  58. data/lib/api_browser/app/bower_components/angular-ui-router/LICENSE +0 -21
  59. data/lib/api_browser/app/bower_components/angular-ui-router/README.md +0 -245
  60. data/lib/api_browser/app/bower_components/angular-ui-router/api/angular-ui-router.d.ts +0 -126
  61. data/lib/api_browser/app/bower_components/angular-ui-router/bower.json +0 -23
  62. data/lib/api_browser/app/bower_components/angular-ui-router/release/angular-ui-router.js +0 -4370
  63. data/lib/api_browser/app/bower_components/angular-ui-router/release/angular-ui-router.min.js +0 -7
  64. data/lib/api_browser/app/bower_components/angular-ui-router/src/common.js +0 -292
  65. data/lib/api_browser/app/bower_components/angular-ui-router/src/resolve.js +0 -252
  66. data/lib/api_browser/app/bower_components/angular-ui-router/src/state.js +0 -1465
  67. data/lib/api_browser/app/bower_components/angular-ui-router/src/stateDirectives.js +0 -285
  68. data/lib/api_browser/app/bower_components/angular-ui-router/src/stateFilters.js +0 -39
  69. data/lib/api_browser/app/bower_components/angular-ui-router/src/templateFactory.js +0 -110
  70. data/lib/api_browser/app/bower_components/angular-ui-router/src/urlMatcherFactory.js +0 -1050
  71. data/lib/api_browser/app/bower_components/angular-ui-router/src/urlRouter.js +0 -427
  72. data/lib/api_browser/app/bower_components/angular-ui-router/src/view.js +0 -71
  73. data/lib/api_browser/app/bower_components/angular-ui-router/src/viewDirective.js +0 -303
  74. data/lib/api_browser/app/bower_components/angular-ui-router/src/viewScroll.js +0 -52
  75. data/lib/api_browser/app/bower_components/angular/.bower.json +0 -17
  76. data/lib/api_browser/app/bower_components/angular/README.md +0 -64
  77. data/lib/api_browser/app/bower_components/angular/angular-csp.css +0 -21
  78. data/lib/api_browser/app/bower_components/angular/angular.js +0 -28133
  79. data/lib/api_browser/app/bower_components/angular/angular.min.js +0 -289
  80. data/lib/api_browser/app/bower_components/angular/angular.min.js.gzip +0 -0
  81. data/lib/api_browser/app/bower_components/angular/angular.min.js.map +0 -8
  82. data/lib/api_browser/app/bower_components/angular/bower.json +0 -8
  83. data/lib/api_browser/app/bower_components/angular/index.js +0 -2
  84. data/lib/api_browser/app/bower_components/angular/package.json +0 -25
  85. data/lib/api_browser/app/bower_components/bootstrap-sass/.bower.json +0 -41
  86. data/lib/api_browser/app/bower_components/bootstrap-sass/CHANGELOG.md +0 -108
  87. data/lib/api_browser/app/bower_components/bootstrap-sass/CONTRIBUTING.md +0 -79
  88. data/lib/api_browser/app/bower_components/bootstrap-sass/README.md +0 -218
  89. data/lib/api_browser/app/bower_components/bootstrap-sass/bower.json +0 -22
  90. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/fonts/bootstrap/glyphicons-halflings-regular.eot +0 -0
  91. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/fonts/bootstrap/glyphicons-halflings-regular.svg +0 -229
  92. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/fonts/bootstrap/glyphicons-halflings-regular.ttf +0 -0
  93. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/fonts/bootstrap/glyphicons-halflings-regular.woff +0 -0
  94. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/javascripts/bootstrap.js +0 -12
  95. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/javascripts/bootstrap/affix.js +0 -126
  96. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/javascripts/bootstrap/alert.js +0 -98
  97. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/javascripts/bootstrap/button.js +0 -115
  98. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/javascripts/bootstrap/carousel.js +0 -217
  99. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/javascripts/bootstrap/collapse.js +0 -179
  100. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/javascripts/bootstrap/dropdown.js +0 -154
  101. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/javascripts/bootstrap/modal.js +0 -246
  102. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/javascripts/bootstrap/popover.js +0 -117
  103. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/javascripts/bootstrap/scrollspy.js +0 -158
  104. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/javascripts/bootstrap/tab.js +0 -135
  105. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/javascripts/bootstrap/tooltip.js +0 -386
  106. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/javascripts/bootstrap/transition.js +0 -56
  107. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap.scss +0 -1
  108. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap/_alerts.scss +0 -67
  109. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap/_badges.scss +0 -51
  110. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap/_breadcrumbs.scss +0 -23
  111. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap/_button-groups.scss +0 -227
  112. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap/_buttons.scss +0 -155
  113. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap/_carousel.scss +0 -232
  114. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap/_close.scss +0 -35
  115. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap/_code.scss +0 -53
  116. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap/_component-animations.scss +0 -29
  117. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap/_dropdowns.scss +0 -188
  118. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap/_forms.scss +0 -374
  119. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap/_glyphicons.scss +0 -237
  120. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap/_grid.scss +0 -79
  121. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap/_input-groups.scss +0 -136
  122. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap/_jumbotron.scss +0 -46
  123. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap/_labels.scss +0 -64
  124. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap/_list-group.scss +0 -88
  125. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap/_media.scss +0 -56
  126. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap/_mixins.scss +0 -848
  127. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap/_modals.scss +0 -129
  128. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap/_navbar.scss +0 -616
  129. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap/_navs.scss +0 -242
  130. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap/_normalize.scss +0 -406
  131. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap/_pager.scss +0 -55
  132. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap/_pagination.scss +0 -85
  133. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap/_panels.scss +0 -182
  134. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap/_popovers.scss +0 -133
  135. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap/_print.scss +0 -105
  136. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap/_progress-bars.scss +0 -80
  137. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap/_responsive-utilities.scss +0 -198
  138. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap/_scaffolding.scss +0 -119
  139. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap/_tables.scss +0 -231
  140. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap/_theme.scss +0 -247
  141. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap/_thumbnails.scss +0 -38
  142. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap/_tooltip.scss +0 -95
  143. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap/_type.scss +0 -281
  144. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap/_utilities.scss +0 -56
  145. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap/_variables.scss +0 -646
  146. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap/_wells.scss +0 -29
  147. data/lib/api_browser/app/bower_components/bootstrap-sass/vendor/assets/stylesheets/bootstrap/bootstrap.scss +0 -49
  148. data/lib/api_browser/app/bower_components/jquery/.bower.json +0 -38
  149. data/lib/api_browser/app/bower_components/jquery/MIT-LICENSE.txt +0 -21
  150. data/lib/api_browser/app/bower_components/jquery/bower.json +0 -27
  151. data/lib/api_browser/app/bower_components/jquery/dist/jquery.js +0 -9190
  152. data/lib/api_browser/app/bower_components/jquery/dist/jquery.min.js +0 -5
  153. data/lib/api_browser/app/bower_components/jquery/dist/jquery.min.map +0 -1
  154. data/lib/api_browser/app/bower_components/jquery/src/ajax.js +0 -806
  155. data/lib/api_browser/app/bower_components/jquery/src/ajax/jsonp.js +0 -89
  156. data/lib/api_browser/app/bower_components/jquery/src/ajax/load.js +0 -75
  157. data/lib/api_browser/app/bower_components/jquery/src/ajax/parseJSON.js +0 -13
  158. data/lib/api_browser/app/bower_components/jquery/src/ajax/parseXML.js +0 -28
  159. data/lib/api_browser/app/bower_components/jquery/src/ajax/script.js +0 -64
  160. data/lib/api_browser/app/bower_components/jquery/src/ajax/var/nonce.js +0 -5
  161. data/lib/api_browser/app/bower_components/jquery/src/ajax/var/rquery.js +0 -3
  162. data/lib/api_browser/app/bower_components/jquery/src/ajax/xhr.js +0 -135
  163. data/lib/api_browser/app/bower_components/jquery/src/attributes.js +0 -11
  164. data/lib/api_browser/app/bower_components/jquery/src/attributes/attr.js +0 -143
  165. data/lib/api_browser/app/bower_components/jquery/src/attributes/classes.js +0 -158
  166. data/lib/api_browser/app/bower_components/jquery/src/attributes/prop.js +0 -96
  167. data/lib/api_browser/app/bower_components/jquery/src/attributes/support.js +0 -35
  168. data/lib/api_browser/app/bower_components/jquery/src/attributes/val.js +0 -163
  169. data/lib/api_browser/app/bower_components/jquery/src/callbacks.js +0 -205
  170. data/lib/api_browser/app/bower_components/jquery/src/core.js +0 -498
  171. data/lib/api_browser/app/bower_components/jquery/src/core/access.js +0 -60
  172. data/lib/api_browser/app/bower_components/jquery/src/core/init.js +0 -123
  173. data/lib/api_browser/app/bower_components/jquery/src/core/parseHTML.js +0 -39
  174. data/lib/api_browser/app/bower_components/jquery/src/core/ready.js +0 -97
  175. data/lib/api_browser/app/bower_components/jquery/src/core/var/rsingleTag.js +0 -4
  176. data/lib/api_browser/app/bower_components/jquery/src/css.js +0 -451
  177. data/lib/api_browser/app/bower_components/jquery/src/css/addGetHookIf.js +0 -24
  178. data/lib/api_browser/app/bower_components/jquery/src/css/curCSS.js +0 -57
  179. data/lib/api_browser/app/bower_components/jquery/src/css/defaultDisplay.js +0 -70
  180. data/lib/api_browser/app/bower_components/jquery/src/css/hiddenVisibleSelectors.js +0 -15
  181. data/lib/api_browser/app/bower_components/jquery/src/css/support.js +0 -91
  182. data/lib/api_browser/app/bower_components/jquery/src/css/swap.js +0 -28
  183. data/lib/api_browser/app/bower_components/jquery/src/css/var/cssExpand.js +0 -3
  184. data/lib/api_browser/app/bower_components/jquery/src/css/var/getStyles.js +0 -5
  185. data/lib/api_browser/app/bower_components/jquery/src/css/var/isHidden.js +0 -13
  186. data/lib/api_browser/app/bower_components/jquery/src/css/var/rmargin.js +0 -3
  187. data/lib/api_browser/app/bower_components/jquery/src/css/var/rnumnonpx.js +0 -5
  188. data/lib/api_browser/app/bower_components/jquery/src/data.js +0 -179
  189. data/lib/api_browser/app/bower_components/jquery/src/data/Data.js +0 -181
  190. data/lib/api_browser/app/bower_components/jquery/src/data/accepts.js +0 -20
  191. data/lib/api_browser/app/bower_components/jquery/src/data/var/data_priv.js +0 -5
  192. data/lib/api_browser/app/bower_components/jquery/src/data/var/data_user.js +0 -5
  193. data/lib/api_browser/app/bower_components/jquery/src/deferred.js +0 -149
  194. data/lib/api_browser/app/bower_components/jquery/src/deprecated.js +0 -13
  195. data/lib/api_browser/app/bower_components/jquery/src/dimensions.js +0 -50
  196. data/lib/api_browser/app/bower_components/jquery/src/effects.js +0 -649
  197. data/lib/api_browser/app/bower_components/jquery/src/effects/Tween.js +0 -114
  198. data/lib/api_browser/app/bower_components/jquery/src/effects/animatedSelector.js +0 -13
  199. data/lib/api_browser/app/bower_components/jquery/src/event.js +0 -868
  200. data/lib/api_browser/app/bower_components/jquery/src/event/alias.js +0 -39
  201. data/lib/api_browser/app/bower_components/jquery/src/event/support.js +0 -9
  202. data/lib/api_browser/app/bower_components/jquery/src/exports/amd.js +0 -24
  203. data/lib/api_browser/app/bower_components/jquery/src/exports/global.js +0 -32
  204. data/lib/api_browser/app/bower_components/jquery/src/intro.js +0 -44
  205. data/lib/api_browser/app/bower_components/jquery/src/jquery.js +0 -36
  206. data/lib/api_browser/app/bower_components/jquery/src/manipulation.js +0 -582
  207. data/lib/api_browser/app/bower_components/jquery/src/manipulation/_evalUrl.js +0 -18
  208. data/lib/api_browser/app/bower_components/jquery/src/manipulation/support.js +0 -31
  209. data/lib/api_browser/app/bower_components/jquery/src/manipulation/var/rcheckableType.js +0 -3
  210. data/lib/api_browser/app/bower_components/jquery/src/offset.js +0 -204
  211. data/lib/api_browser/app/bower_components/jquery/src/outro.js +0 -1
  212. data/lib/api_browser/app/bower_components/jquery/src/queue.js +0 -142
  213. data/lib/api_browser/app/bower_components/jquery/src/queue/delay.js +0 -22
  214. data/lib/api_browser/app/bower_components/jquery/src/selector-native.js +0 -172
  215. data/lib/api_browser/app/bower_components/jquery/src/selector-sizzle.js +0 -14
  216. data/lib/api_browser/app/bower_components/jquery/src/selector.js +0 -1
  217. data/lib/api_browser/app/bower_components/jquery/src/serialize.js +0 -111
  218. data/lib/api_browser/app/bower_components/jquery/src/sizzle/dist/sizzle.js +0 -2044
  219. data/lib/api_browser/app/bower_components/jquery/src/sizzle/dist/sizzle.min.js +0 -3
  220. data/lib/api_browser/app/bower_components/jquery/src/sizzle/dist/sizzle.min.map +0 -1
  221. data/lib/api_browser/app/bower_components/jquery/src/traversing.js +0 -200
  222. data/lib/api_browser/app/bower_components/jquery/src/traversing/findFilter.js +0 -100
  223. data/lib/api_browser/app/bower_components/jquery/src/traversing/var/rneedsContext.js +0 -6
  224. data/lib/api_browser/app/bower_components/jquery/src/var/arr.js +0 -3
  225. data/lib/api_browser/app/bower_components/jquery/src/var/class2type.js +0 -4
  226. data/lib/api_browser/app/bower_components/jquery/src/var/concat.js +0 -5
  227. data/lib/api_browser/app/bower_components/jquery/src/var/hasOwn.js +0 -5
  228. data/lib/api_browser/app/bower_components/jquery/src/var/indexOf.js +0 -5
  229. data/lib/api_browser/app/bower_components/jquery/src/var/pnum.js +0 -3
  230. data/lib/api_browser/app/bower_components/jquery/src/var/push.js +0 -5
  231. data/lib/api_browser/app/bower_components/jquery/src/var/rnotwhite.js +0 -3
  232. data/lib/api_browser/app/bower_components/jquery/src/var/slice.js +0 -5
  233. data/lib/api_browser/app/bower_components/jquery/src/var/strundefined.js +0 -3
  234. data/lib/api_browser/app/bower_components/jquery/src/var/support.js +0 -4
  235. data/lib/api_browser/app/bower_components/jquery/src/var/toString.js +0 -5
  236. data/lib/api_browser/app/bower_components/jquery/src/wrap.js +0 -78
  237. data/lib/api_browser/app/bower_components/lodash/.bower.json +0 -30
  238. data/lib/api_browser/app/bower_components/lodash/LICENSE.txt +0 -22
  239. data/lib/api_browser/app/bower_components/lodash/bower.json +0 -20
  240. data/lib/api_browser/app/bower_components/lodash/lodash.js +0 -12235
  241. data/lib/api_browser/app/bower_components/lodash/lodash.min.js +0 -98
  242. data/lib/api_browser/app/bower_components/showdown/.bower.json +0 -39
  243. data/lib/api_browser/app/bower_components/showdown/.jshintignore +0 -2
  244. data/lib/api_browser/app/bower_components/showdown/.travis.yml +0 -8
  245. data/lib/api_browser/app/bower_components/showdown/Gruntfile.js +0 -100
  246. data/lib/api_browser/app/bower_components/showdown/README.md +0 -317
  247. data/lib/api_browser/app/bower_components/showdown/bower.json +0 -26
  248. data/lib/api_browser/app/bower_components/showdown/compressed/Showdown.js +0 -1606
  249. data/lib/api_browser/app/bower_components/showdown/compressed/Showdown.js.map +0 -1
  250. data/lib/api_browser/app/bower_components/showdown/compressed/Showdown.min.js +0 -2
  251. data/lib/api_browser/app/bower_components/showdown/compressed/extensions/github.min.js +0 -2
  252. data/lib/api_browser/app/bower_components/showdown/compressed/extensions/github.min.js.map +0 -1
  253. data/lib/api_browser/app/bower_components/showdown/compressed/extensions/prettify.min.js +0 -2
  254. data/lib/api_browser/app/bower_components/showdown/compressed/extensions/prettify.min.js.map +0 -1
  255. data/lib/api_browser/app/bower_components/showdown/compressed/extensions/table.min.js +0 -2
  256. data/lib/api_browser/app/bower_components/showdown/compressed/extensions/table.min.js.map +0 -1
  257. data/lib/api_browser/app/bower_components/showdown/compressed/extensions/twitter.min.js +0 -2
  258. data/lib/api_browser/app/bower_components/showdown/compressed/extensions/twitter.min.js.map +0 -1
  259. data/lib/api_browser/app/bower_components/showdown/license.txt +0 -34
  260. data/lib/api_browser/app/bower_components/showdown/package.json +0 -47
  261. data/lib/api_browser/app/bower_components/showdown/src/extensions/github.js +0 -25
  262. data/lib/api_browser/app/bower_components/showdown/src/extensions/prettify.js +0 -29
  263. data/lib/api_browser/app/bower_components/showdown/src/extensions/table.js +0 -106
  264. data/lib/api_browser/app/bower_components/showdown/src/extensions/twitter.js +0 -42
  265. data/lib/api_browser/app/bower_components/showdown/src/ng-showdown.js +0 -150
  266. data/lib/api_browser/app/bower_components/showdown/src/showdown.js +0 -1454
@@ -1,1465 +0,0 @@
1
- /**
2
- * @ngdoc object
3
- * @name ui.router.state.$stateProvider
4
- *
5
- * @requires ui.router.router.$urlRouterProvider
6
- * @requires ui.router.util.$urlMatcherFactoryProvider
7
- *
8
- * @description
9
- * The new `$stateProvider` works similar to Angular's v1 router, but it focuses purely
10
- * on state.
11
- *
12
- * A state corresponds to a "place" in the application in terms of the overall UI and
13
- * navigation. A state describes (via the controller / template / view properties) what
14
- * the UI looks like and does at that place.
15
- *
16
- * States often have things in common, and the primary way of factoring out these
17
- * commonalities in this model is via the state hierarchy, i.e. parent/child states aka
18
- * nested states.
19
- *
20
- * The `$stateProvider` provides interfaces to declare these states for your app.
21
- */
22
- $StateProvider.$inject = ['$urlRouterProvider', '$urlMatcherFactoryProvider'];
23
- function $StateProvider( $urlRouterProvider, $urlMatcherFactory) {
24
-
25
- var root, states = {}, $state, queue = {}, abstractKey = 'abstract';
26
-
27
- // Builds state properties from definition passed to registerState()
28
- var stateBuilder = {
29
-
30
- // Derive parent state from a hierarchical name only if 'parent' is not explicitly defined.
31
- // state.children = [];
32
- // if (parent) parent.children.push(state);
33
- parent: function(state) {
34
- if (isDefined(state.parent) && state.parent) return findState(state.parent);
35
- // regex matches any valid composite state name
36
- // would match "contact.list" but not "contacts"
37
- var compositeName = /^(.+)\.[^.]+$/.exec(state.name);
38
- return compositeName ? findState(compositeName[1]) : root;
39
- },
40
-
41
- // inherit 'data' from parent and override by own values (if any)
42
- data: function(state) {
43
- if (state.parent && state.parent.data) {
44
- state.data = state.self.data = extend({}, state.parent.data, state.data);
45
- }
46
- return state.data;
47
- },
48
-
49
- // Build a URLMatcher if necessary, either via a relative or absolute URL
50
- url: function(state) {
51
- var url = state.url, config = { params: state.params || {} };
52
-
53
- if (isString(url)) {
54
- if (url.charAt(0) == '^') return $urlMatcherFactory.compile(url.substring(1), config);
55
- return (state.parent.navigable || root).url.concat(url, config);
56
- }
57
-
58
- if (!url || $urlMatcherFactory.isMatcher(url)) return url;
59
- throw new Error("Invalid url '" + url + "' in state '" + state + "'");
60
- },
61
-
62
- // Keep track of the closest ancestor state that has a URL (i.e. is navigable)
63
- navigable: function(state) {
64
- return state.url ? state : (state.parent ? state.parent.navigable : null);
65
- },
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
-
76
- // Derive parameters for this state and ensure they're a super-set of parent's parameters
77
- params: function(state) {
78
- return state.parent && state.parent.params ? extend(state.parent.params.$$new(), state.ownParams) : new $$UMFP.ParamSet();
79
- },
80
-
81
- // If there is no explicit multi-view configuration, make one up so we don't have
82
- // to handle both cases in the view directive later. Note that having an explicit
83
- // 'views' property will mean the default unnamed view properties are ignored. This
84
- // is also a good time to resolve view names to absolute names, so everything is a
85
- // straight lookup at link time.
86
- views: function(state) {
87
- var views = {};
88
-
89
- forEach(isDefined(state.views) ? state.views : { '': state }, function (view, name) {
90
- if (name.indexOf('@') < 0) name += '@' + state.parent.name;
91
- views[name] = view;
92
- });
93
- return views;
94
- },
95
-
96
- // Keep a full path from the root down to this state as this is needed for state activation.
97
- path: function(state) {
98
- return state.parent ? state.parent.path.concat(state) : []; // exclude root from path
99
- },
100
-
101
- // Speed up $state.contains() as it's used a lot
102
- includes: function(state) {
103
- var includes = state.parent ? extend({}, state.parent.includes) : {};
104
- includes[state.name] = true;
105
- return includes;
106
- },
107
-
108
- $delegates: {}
109
- };
110
-
111
- function isRelative(stateName) {
112
- return stateName.indexOf(".") === 0 || stateName.indexOf("^") === 0;
113
- }
114
-
115
- function findState(stateOrName, base) {
116
- if (!stateOrName) return undefined;
117
-
118
- var isStr = isString(stateOrName),
119
- name = isStr ? stateOrName : stateOrName.name,
120
- path = isRelative(name);
121
-
122
- if (path) {
123
- if (!base) throw new Error("No reference point given for path '" + name + "'");
124
- base = findState(base);
125
-
126
- var rel = name.split("."), i = 0, pathLength = rel.length, current = base;
127
-
128
- for (; i < pathLength; i++) {
129
- if (rel[i] === "" && i === 0) {
130
- current = base;
131
- continue;
132
- }
133
- if (rel[i] === "^") {
134
- if (!current.parent) throw new Error("Path '" + name + "' not valid for state '" + base.name + "'");
135
- current = current.parent;
136
- continue;
137
- }
138
- break;
139
- }
140
- rel = rel.slice(i).join(".");
141
- name = current.name + (current.name && rel ? "." : "") + rel;
142
- }
143
- var state = states[name];
144
-
145
- if (state && (isStr || (!isStr && (state === stateOrName || state.self === stateOrName)))) {
146
- return state;
147
- }
148
- return undefined;
149
- }
150
-
151
- function queueState(parentName, state) {
152
- if (!queue[parentName]) {
153
- queue[parentName] = [];
154
- }
155
- queue[parentName].push(state);
156
- }
157
-
158
- function flushQueuedChildren(parentName) {
159
- var queued = queue[parentName] || [];
160
- while(queued.length) {
161
- registerState(queued.shift());
162
- }
163
- }
164
-
165
- function registerState(state) {
166
- // Wrap a new object around the state so we can store our private details easily.
167
- state = inherit(state, {
168
- self: state,
169
- resolve: state.resolve || {},
170
- toString: function() { return this.name; }
171
- });
172
-
173
- var name = state.name;
174
- if (!isString(name) || name.indexOf('@') >= 0) throw new Error("State must have a valid name");
175
- if (states.hasOwnProperty(name)) throw new Error("State '" + name + "'' is already defined");
176
-
177
- // Get parent name
178
- var parentName = (name.indexOf('.') !== -1) ? name.substring(0, name.lastIndexOf('.'))
179
- : (isString(state.parent)) ? state.parent
180
- : (isObject(state.parent) && isString(state.parent.name)) ? state.parent.name
181
- : '';
182
-
183
- // If parent is not registered yet, add state to queue and register later
184
- if (parentName && !states[parentName]) {
185
- return queueState(parentName, state.self);
186
- }
187
-
188
- for (var key in stateBuilder) {
189
- if (isFunction(stateBuilder[key])) state[key] = stateBuilder[key](state, stateBuilder.$delegates[key]);
190
- }
191
- states[name] = state;
192
-
193
- // Register the state in the global state list and with $urlRouter if necessary.
194
- if (!state[abstractKey] && state.url) {
195
- $urlRouterProvider.when(state.url, ['$match', '$stateParams', function ($match, $stateParams) {
196
- if ($state.$current.navigable != state || !equalForKeys($match, $stateParams)) {
197
- $state.transitionTo(state, $match, { inherit: true, location: false });
198
- }
199
- }]);
200
- }
201
-
202
- // Register any queued children
203
- flushQueuedChildren(name);
204
-
205
- return state;
206
- }
207
-
208
- // Checks text to see if it looks like a glob.
209
- function isGlob (text) {
210
- return text.indexOf('*') > -1;
211
- }
212
-
213
- // Returns true if glob matches current $state name.
214
- function doesStateMatchGlob (glob) {
215
- var globSegments = glob.split('.'),
216
- segments = $state.$current.name.split('.');
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
-
225
- //match greedy starts
226
- if (globSegments[0] === '**') {
227
- segments = segments.slice(indexOf(segments, globSegments[1]));
228
- segments.unshift('**');
229
- }
230
- //match greedy ends
231
- if (globSegments[globSegments.length - 1] === '**') {
232
- segments.splice(indexOf(segments, globSegments[globSegments.length - 2]) + 1, Number.MAX_VALUE);
233
- segments.push('**');
234
- }
235
-
236
- if (globSegments.length != segments.length) {
237
- return false;
238
- }
239
-
240
- return segments.join('') === globSegments.join('');
241
- }
242
-
243
-
244
- // Implicit root state that is always active
245
- root = registerState({
246
- name: '',
247
- url: '^',
248
- views: null,
249
- 'abstract': true
250
- });
251
- root.navigable = null;
252
-
253
-
254
- /**
255
- * @ngdoc function
256
- * @name ui.router.state.$stateProvider#decorator
257
- * @methodOf ui.router.state.$stateProvider
258
- *
259
- * @description
260
- * Allows you to extend (carefully) or override (at your own peril) the
261
- * `stateBuilder` object used internally by `$stateProvider`. This can be used
262
- * to add custom functionality to ui-router, for example inferring templateUrl
263
- * based on the state name.
264
- *
265
- * When passing only a name, it returns the current (original or decorated) builder
266
- * function that matches `name`.
267
- *
268
- * The builder functions that can be decorated are listed below. Though not all
269
- * necessarily have a good use case for decoration, that is up to you to decide.
270
- *
271
- * In addition, users can attach custom decorators, which will generate new
272
- * properties within the state's internal definition. There is currently no clear
273
- * use-case for this beyond accessing internal states (i.e. $state.$current),
274
- * however, expect this to become increasingly relevant as we introduce additional
275
- * meta-programming features.
276
- *
277
- * **Warning**: Decorators should not be interdependent because the order of
278
- * execution of the builder functions in non-deterministic. Builder functions
279
- * should only be dependent on the state definition object and super function.
280
- *
281
- *
282
- * Existing builder functions and current return values:
283
- *
284
- * - **parent** `{object}` - returns the parent state object.
285
- * - **data** `{object}` - returns state data, including any inherited data that is not
286
- * overridden by own values (if any).
287
- * - **url** `{object}` - returns a {@link ui.router.util.type:UrlMatcher UrlMatcher}
288
- * or `null`.
289
- * - **navigable** `{object}` - returns closest ancestor state that has a URL (aka is
290
- * navigable).
291
- * - **params** `{object}` - returns an array of state params that are ensured to
292
- * be a super-set of parent's params.
293
- * - **views** `{object}` - returns a views object where each key is an absolute view
294
- * name (i.e. "viewName@stateName") and each value is the config object
295
- * (template, controller) for the view. Even when you don't use the views object
296
- * explicitly on a state config, one is still created for you internally.
297
- * So by decorating this builder function you have access to decorating template
298
- * and controller properties.
299
- * - **ownParams** `{object}` - returns an array of params that belong to the state,
300
- * not including any params defined by ancestor states.
301
- * - **path** `{string}` - returns the full path from the root down to this state.
302
- * Needed for state activation.
303
- * - **includes** `{object}` - returns an object that includes every state that
304
- * would pass a `$state.includes()` test.
305
- *
306
- * @example
307
- * <pre>
308
- * // Override the internal 'views' builder with a function that takes the state
309
- * // definition, and a reference to the internal function being overridden:
310
- * $stateProvider.decorator('views', function (state, parent) {
311
- * var result = {},
312
- * views = parent(state);
313
- *
314
- * angular.forEach(views, function (config, name) {
315
- * var autoName = (state.name + '.' + name).replace('.', '/');
316
- * config.templateUrl = config.templateUrl || '/partials/' + autoName + '.html';
317
- * result[name] = config;
318
- * });
319
- * return result;
320
- * });
321
- *
322
- * $stateProvider.state('home', {
323
- * views: {
324
- * 'contact.list': { controller: 'ListController' },
325
- * 'contact.item': { controller: 'ItemController' }
326
- * }
327
- * });
328
- *
329
- * // ...
330
- *
331
- * $state.go('home');
332
- * // Auto-populates list and item views with /partials/home/contact/list.html,
333
- * // and /partials/home/contact/item.html, respectively.
334
- * </pre>
335
- *
336
- * @param {string} name The name of the builder function to decorate.
337
- * @param {object} func A function that is responsible for decorating the original
338
- * builder function. The function receives two parameters:
339
- *
340
- * - `{object}` - state - The state config object.
341
- * - `{object}` - super - The original builder function.
342
- *
343
- * @return {object} $stateProvider - $stateProvider instance
344
- */
345
- this.decorator = decorator;
346
- function decorator(name, func) {
347
- /*jshint validthis: true */
348
- if (isString(name) && !isDefined(func)) {
349
- return stateBuilder[name];
350
- }
351
- if (!isFunction(func) || !isString(name)) {
352
- return this;
353
- }
354
- if (stateBuilder[name] && !stateBuilder.$delegates[name]) {
355
- stateBuilder.$delegates[name] = stateBuilder[name];
356
- }
357
- stateBuilder[name] = func;
358
- return this;
359
- }
360
-
361
- /**
362
- * @ngdoc function
363
- * @name ui.router.state.$stateProvider#state
364
- * @methodOf ui.router.state.$stateProvider
365
- *
366
- * @description
367
- * Registers a state configuration under a given state name. The stateConfig object
368
- * has the following acceptable properties.
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
374
- * <a id='template'></a>
375
- * html template as a string or a function that returns
376
- * an html template as a string which should be used by the uiView directives. This property
377
- * takes precedence over templateUrl.
378
- *
379
- * If `template` is a function, it will be called with the following parameters:
380
- *
381
- * - {array.&lt;object&gt;} - state parameters extracted from the current $location.path() by
382
- * applying the current state
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
392
- * <a id='templateUrl'></a>
393
- *
394
- * path or function that returns a path to an html
395
- * template that should be used by uiView.
396
- *
397
- * If `templateUrl` is a function, it will be called with the following parameters:
398
- *
399
- * - {array.&lt;object&gt;} - state parameters extracted from the current $location.path() by
400
- * applying the current state
401
- *
402
- * <pre>templateUrl: "home.html"</pre>
403
- * <pre>templateUrl: function(params) {
404
- * return myTemplates[params.pageId]; }</pre>
405
- *
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>
413
- *
414
- * @param {string|function=} stateConfig.controller
415
- * <a id='controller'></a>
416
- *
417
- * Controller fn that should be associated with newly
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>
425
- *
426
- * @param {function=} stateConfig.controllerProvider
427
- * <a id='controllerProvider'></a>
428
- *
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>
440
- *
441
- * @param {string=} stateConfig.controllerAs
442
- * <a id='controllerAs'></a>
443
- *
444
- * A controller alias name. If present the controller will be
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>
454
- *
455
- * @param {object=} stateConfig.resolve
456
- * <a id='resolve'></a>
457
- *
458
- * An optional map&lt;string, function&gt; of dependencies which
459
- * should be injected into the controller. If any of these dependencies are promises,
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:
466
- *
467
- * - key - {string}: name of dependency to be injected into controller
468
- * - factory - {string|function}: If string then it is alias for service. Otherwise if function,
469
- * it is injected and return value it treated as dependency. If result is a promise, it is
470
- * resolved before its value is injected into controller.
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
480
- * <a id='url'></a>
481
- *
482
- * A url fragment with optional parameters. When a state is navigated or
483
- * transitioned to, the `$stateParams` service will be populated with any
484
- * parameters that were passed.
485
- *
486
- * (See {@link ui.router.util.type:UrlMatcher UrlMatcher} `UrlMatcher`} for
487
- * more details on acceptable patterns )
488
- *
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>
499
- *
500
- * @param {object=} stateConfig.views
501
- * <a id='views'></a>
502
- * an optional map&lt;string, object&gt; which defined multiple views, or targets views
503
- * manually/explicitly.
504
- *
505
- * Examples:
506
- *
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>
520
- *
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,
535
- * but can provide inherited properties to its common children states.
536
- * <pre>abstract: true</pre>
537
- *
538
- * @param {function=} stateConfig.onEnter
539
- * <a id='onEnter'></a>
540
- *
541
- * Callback function for when a state is entered. Good way
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>
549
- *
550
- * @param {function=} stateConfig.onExit
551
- * <a id='onExit'></a>
552
- *
553
- * Callback function for when a state is exited. Good way to
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.
557
- *
558
- * <pre>onExit: function(MyService, $stateParams) {
559
- * MyService.cleanup($stateParams.myParam);
560
- * }</pre>
561
- *
562
- * @param {boolean=} [stateConfig.reloadOnSearch=true]
563
- * <a id='reloadOnSearch'></a>
564
- *
565
- * If `false`, will not retrigger the same state
566
- * just because a search/query parameter has changed (via $location.search() or $location.hash()).
567
- * Useful for when you'd like to modify $location.search() without triggering a reload.
568
- * <pre>reloadOnSearch: false</pre>
569
- *
570
- * @param {object=} stateConfig.data
571
- * <a id='data'></a>
572
- *
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
- *
657
- *
658
- * @example
659
- * <pre>
660
- * // Some state name examples
661
- *
662
- * // stateName can be a single top-level name (must be unique).
663
- * $stateProvider.state("home", {});
664
- *
665
- * // Or it can be a nested state name. This state is a child of the
666
- * // above "home" state.
667
- * $stateProvider.state("home.newest", {});
668
- *
669
- * // Nest states as deeply as needed.
670
- * $stateProvider.state("home.newest.abc.xyz.inception", {});
671
- *
672
- * // state() returns $stateProvider, so you can chain state declarations.
673
- * $stateProvider
674
- * .state("home", {})
675
- * .state("about", {})
676
- * .state("contacts", {});
677
- * </pre>
678
- *
679
- */
680
- this.state = state;
681
- function state(name, definition) {
682
- /*jshint validthis: true */
683
- if (isObject(name)) definition = name;
684
- else definition.name = name;
685
- registerState(definition);
686
- return this;
687
- }
688
-
689
- /**
690
- * @ngdoc object
691
- * @name ui.router.state.$state
692
- *
693
- * @requires $rootScope
694
- * @requires $q
695
- * @requires ui.router.state.$view
696
- * @requires $injector
697
- * @requires ui.router.util.$resolve
698
- * @requires ui.router.state.$stateParams
699
- * @requires ui.router.router.$urlRouter
700
- *
701
- * @property {object} params A param object, e.g. {sectionId: section.id)}, that
702
- * you'd like to test against the current active state.
703
- * @property {object} current A reference to the state's config object. However
704
- * you passed it in. Useful for accessing custom data.
705
- * @property {object} transition Currently pending transition. A promise that'll
706
- * resolve or reject.
707
- *
708
- * @description
709
- * `$state` service is responsible for representing states as well as transitioning
710
- * between them. It also provides interfaces to ask for current state or even states
711
- * you're coming from.
712
- */
713
- this.$get = $get;
714
- $get.$inject = ['$rootScope', '$q', '$view', '$injector', '$resolve', '$stateParams', '$urlRouter', '$location', '$urlMatcherFactory'];
715
- function $get( $rootScope, $q, $view, $injector, $resolve, $stateParams, $urlRouter, $location, $urlMatcherFactory) {
716
-
717
- var TransitionSuperseded = $q.reject(new Error('transition superseded'));
718
- var TransitionPrevented = $q.reject(new Error('transition prevented'));
719
- var TransitionAborted = $q.reject(new Error('transition aborted'));
720
- var TransitionFailed = $q.reject(new Error('transition failed'));
721
-
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;
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;
785
- }
786
-
787
- root.locals = { resolve: null, globals: { $stateParams: {} } };
788
-
789
- $state = {
790
- params: {},
791
- current: root.self,
792
- $current: root,
793
- transition: null
794
- };
795
-
796
- /**
797
- * @ngdoc function
798
- * @name ui.router.state.$state#reload
799
- * @methodOf ui.router.state.$state
800
- *
801
- * @description
802
- * A method that force reloads the current state. All resolves are re-resolved,
803
- * controllers reinstantiated, and events re-fired.
804
- *
805
- * @example
806
- * <pre>
807
- * var app angular.module('app', ['ui.router']);
808
- *
809
- * app.controller('ctrl', function ($scope, $state) {
810
- * $scope.reload = function(){
811
- * $state.reload();
812
- * }
813
- * });
814
- * </pre>
815
- *
816
- * `reload()` is just an alias for:
817
- * <pre>
818
- * $state.transitionTo($state.current, $stateParams, {
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
842
- * });
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}.
847
- */
848
- $state.reload = function reload(state) {
849
- return $state.transitionTo($state.current, $stateParams, { reload: state || true, inherit: false, notify: true});
850
- };
851
-
852
- /**
853
- * @ngdoc function
854
- * @name ui.router.state.$state#go
855
- * @methodOf ui.router.state.$state
856
- *
857
- * @description
858
- * Convenience method for transitioning to a new state. `$state.go` calls
859
- * `$state.transitionTo` internally but automatically sets options to
860
- * `{ location: true, inherit: true, relative: $state.$current, notify: true }`.
861
- * This allows you to easily use an absolute or relative to path and specify
862
- * only the parameters you'd like to update (while letting unspecified parameters
863
- * inherit from the currently active ancestor states).
864
- *
865
- * @example
866
- * <pre>
867
- * var app = angular.module('app', ['ui.router']);
868
- *
869
- * app.controller('ctrl', function ($scope, $state) {
870
- * $scope.changeState = function () {
871
- * $state.go('contact.detail');
872
- * };
873
- * });
874
- * </pre>
875
- * <img src='../ngdoc_assets/StateGoExamples.png'/>
876
- *
877
- * @param {string} to Absolute state name or relative state path. Some examples:
878
- *
879
- * - `$state.go('contact.detail')` - will go to the `contact.detail` state
880
- * - `$state.go('^')` - will go to a parent state
881
- * - `$state.go('^.sibling')` - will go to a sibling state
882
- * - `$state.go('.child.grandchild')` - will go to grandchild state
883
- *
884
- * @param {object=} params A map of the parameters that will be sent to the state,
885
- * will populate $stateParams. Any parameters that are not specified will be inherited from currently
886
- * defined parameters. This allows, for example, going to a sibling state that shares parameters
887
- * specified in a parent state. Parameter inheritance only works between common ancestor states, I.e.
888
- * transitioning to a sibling will get you the parameters for all parents, transitioning to a child
889
- * will get you all current parameters, etc.
890
- * @param {object=} options Options object. The options are:
891
- *
892
- * - **`location`** - {boolean=true|string=} - If `true` will update the url in the location bar, if `false`
893
- * will not. If string, must be `"replace"`, which will update url and also replace last history record.
894
- * - **`inherit`** - {boolean=true}, If `true` will inherit url parameters from current url.
895
- * - **`relative`** - {object=$state.$current}, When transitioning with relative path (e.g '^'),
896
- * defines which state to be relative from.
897
- * - **`notify`** - {boolean=true}, If `true` will broadcast $stateChangeStart and $stateChangeSuccess events.
898
- * - **`reload`** (v0.2.5) - {boolean=false}, If `true` will force transition even if the state or params
899
- * have not changed, aka a reload of the same state. It differs from reloadOnSearch because you'd
900
- * use this when you want to force a reload when *everything* is the same, including search params.
901
- *
902
- * @returns {promise} A promise representing the state of the new transition.
903
- *
904
- * Possible success values:
905
- *
906
- * - $state.current
907
- *
908
- * <br/>Possible rejection values:
909
- *
910
- * - 'transition superseded' - when a newer transition has been started after this one
911
- * - 'transition prevented' - when `event.preventDefault()` has been called in a `$stateChangeStart` listener
912
- * - 'transition aborted' - when `event.preventDefault()` has been called in a `$stateNotFound` listener or
913
- * when a `$stateNotFound` `event.retry` promise errors.
914
- * - 'transition failed' - when a state has been unsuccessfully found after 2 tries.
915
- * - *resolve error* - when an error has occurred with a `resolve`
916
- *
917
- */
918
- $state.go = function go(to, params, options) {
919
- return $state.transitionTo(to, params, extend({ inherit: true, relative: $state.$current }, options));
920
- };
921
-
922
- /**
923
- * @ngdoc function
924
- * @name ui.router.state.$state#transitionTo
925
- * @methodOf ui.router.state.$state
926
- *
927
- * @description
928
- * Low-level method for transitioning to a new state. {@link ui.router.state.$state#methods_go $state.go}
929
- * uses `transitionTo` internally. `$state.go` is recommended in most situations.
930
- *
931
- * @example
932
- * <pre>
933
- * var app = angular.module('app', ['ui.router']);
934
- *
935
- * app.controller('ctrl', function ($scope, $state) {
936
- * $scope.changeState = function () {
937
- * $state.transitionTo('contact.detail');
938
- * };
939
- * });
940
- * </pre>
941
- *
942
- * @param {string} to State name.
943
- * @param {object=} toParams A map of the parameters that will be sent to the state,
944
- * will populate $stateParams.
945
- * @param {object=} options Options object. The options are:
946
- *
947
- * - **`location`** - {boolean=true|string=} - If `true` will update the url in the location bar, if `false`
948
- * will not. If string, must be `"replace"`, which will update url and also replace last history record.
949
- * - **`inherit`** - {boolean=false}, If `true` will inherit url parameters from current url.
950
- * - **`relative`** - {object=}, When transitioning with relative path (e.g '^'),
951
- * defines which state to be relative from.
952
- * - **`notify`** - {boolean=true}, If `true` will broadcast $stateChangeStart and $stateChangeSuccess events.
953
- * - **`reload`** (v0.2.5) - {boolean=false|string=|object=}, If `true` will force transition even if the state or params
954
- * have not changed, aka a reload of the same state. It differs from reloadOnSearch because you'd
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.
958
- *
959
- * @returns {promise} A promise representing the state of the new transition. See
960
- * {@link ui.router.state.$state#methods_go $state.go}.
961
- */
962
- $state.transitionTo = function transitionTo(to, toParams, options) {
963
- toParams = toParams || {};
964
- options = extend({
965
- location: true, inherit: false, relative: null, notify: true, reload: false, $retry: false
966
- }, options || {});
967
-
968
- var from = $state.$current, fromParams = $state.params, fromPath = from.path;
969
- var evt, toState = findState(to, options.relative);
970
-
971
- // Store the hash param for later (since it will be stripped out by various methods)
972
- var hash = toParams['#'];
973
-
974
- if (!isDefined(toState)) {
975
- var redirect = { to: to, toParams: toParams, options: options };
976
- var redirectResult = handleRedirect(redirect, from.self, fromParams, options);
977
-
978
- if (redirectResult) {
979
- return redirectResult;
980
- }
981
-
982
- // Always retry once if the $stateNotFound was not prevented
983
- // (handles either redirect changed or state lazy-definition)
984
- to = redirect.to;
985
- toParams = redirect.toParams;
986
- options = redirect.options;
987
- toState = findState(to, options.relative);
988
-
989
- if (!isDefined(toState)) {
990
- if (!options.relative) throw new Error("No such state '" + to + "'");
991
- throw new Error("Could not resolve '" + to + "' from state '" + options.relative + "'");
992
- }
993
- }
994
- if (toState[abstractKey]) throw new Error("Cannot transition to abstract state '" + to + "'");
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);
999
- to = toState;
1000
-
1001
- var toPath = to.path;
1002
-
1003
- // Starting from the root of the path, keep all levels that haven't changed
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
- }
1027
- }
1028
-
1029
- // If we're going to the same state and all locals are kept, we've got nothing to do.
1030
- // But clear 'transition', as we still want to cancel any other pending transitions.
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
- }
1044
- $state.transition = null;
1045
- return $q.when($state.current);
1046
- }
1047
-
1048
- // Filter parameters before we pass them to event handlers etc.
1049
- toParams = filterByKeys(to.params.$$keys(), toParams || {});
1050
-
1051
- // Broadcast start event and cancel the transition if requested
1052
- if (options.notify) {
1053
- /**
1054
- * @ngdoc event
1055
- * @name ui.router.state.$state#$stateChangeStart
1056
- * @eventOf ui.router.state.$state
1057
- * @eventType broadcast on root scope
1058
- * @description
1059
- * Fired when the state transition **begins**. You can use `event.preventDefault()`
1060
- * to prevent the transition from happening and then the transition promise will be
1061
- * rejected with a `'transition prevented'` value.
1062
- *
1063
- * @param {Object} event Event object.
1064
- * @param {State} toState The state being transitioned to.
1065
- * @param {Object} toParams The params supplied to the `toState`.
1066
- * @param {State} fromState The current state, pre-transition.
1067
- * @param {Object} fromParams The params supplied to the `fromState`.
1068
- *
1069
- * @example
1070
- *
1071
- * <pre>
1072
- * $rootScope.$on('$stateChangeStart',
1073
- * function(event, toState, toParams, fromState, fromParams){
1074
- * event.preventDefault();
1075
- * // transitionTo() promise will be rejected with
1076
- * // a 'transition prevented' error
1077
- * })
1078
- * </pre>
1079
- */
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();
1083
- return TransitionPrevented;
1084
- }
1085
- }
1086
-
1087
- // Resolve locals for the remaining states, but don't update any global state just
1088
- // yet -- if anything fails to resolve the current state needs to remain untouched.
1089
- // We also set up an inheritance chain for the locals here. This allows the view directive
1090
- // to quickly look up the correct definition for each view in the current state. Even
1091
- // though we create the locals object itself outside resolveState(), it is initially
1092
- // empty and gets filled asynchronously. We need to keep track of the promise for the
1093
- // (fully resolved) current locals, and pass this down the chain.
1094
- var resolved = $q.when(locals);
1095
-
1096
- for (var l = keep; l < toPath.length; l++, state = toPath[l]) {
1097
- locals = toLocals[l] = inherit(locals);
1098
- resolved = resolveState(state, toParams, state === to, resolved, locals, options);
1099
- }
1100
-
1101
- // Once everything is resolved, we are ready to perform the actual transition
1102
- // and return a promise for the new state. We also keep track of what the
1103
- // current promise is, so that we can detect overlapping transitions and
1104
- // keep only the outcome of the last transition.
1105
- var transition = $state.transition = resolved.then(function () {
1106
- var l, entering, exiting;
1107
-
1108
- if ($state.transition !== transition) return TransitionSuperseded;
1109
-
1110
- // Exit 'from' states not kept
1111
- for (l = fromPath.length - 1; l >= keep; l--) {
1112
- exiting = fromPath[l];
1113
- if (exiting.self.onExit) {
1114
- $injector.invoke(exiting.self.onExit, exiting.self, exiting.locals.globals);
1115
- }
1116
- exiting.locals = null;
1117
- }
1118
-
1119
- // Enter 'to' states not kept
1120
- for (l = keep; l < toPath.length; l++) {
1121
- entering = toPath[l];
1122
- entering.locals = toLocals[l];
1123
- if (entering.self.onEnter) {
1124
- $injector.invoke(entering.self.onEnter, entering.self, entering.locals.globals);
1125
- }
1126
- }
1127
-
1128
- // Re-add the saved hash before we start returning things
1129
- if (hash) toParams['#'] = hash;
1130
-
1131
- // Run it again, to catch any transitions in callbacks
1132
- if ($state.transition !== transition) return TransitionSuperseded;
1133
-
1134
- // Update globals in $state
1135
- $state.$current = to;
1136
- $state.current = to.self;
1137
- $state.params = toParams;
1138
- copy($state.params, $stateParams);
1139
- $state.transition = null;
1140
-
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
- });
1145
- }
1146
-
1147
- if (options.notify) {
1148
- /**
1149
- * @ngdoc event
1150
- * @name ui.router.state.$state#$stateChangeSuccess
1151
- * @eventOf ui.router.state.$state
1152
- * @eventType broadcast on root scope
1153
- * @description
1154
- * Fired once the state transition is **complete**.
1155
- *
1156
- * @param {Object} event Event object.
1157
- * @param {State} toState The state being transitioned to.
1158
- * @param {Object} toParams The params supplied to the `toState`.
1159
- * @param {State} fromState The current state, pre-transition.
1160
- * @param {Object} fromParams The params supplied to the `fromState`.
1161
- */
1162
- $rootScope.$broadcast('$stateChangeSuccess', to.self, toParams, from.self, fromParams);
1163
- }
1164
- $urlRouter.update(true);
1165
-
1166
- return $state.current;
1167
- }, function (error) {
1168
- if ($state.transition !== transition) return TransitionSuperseded;
1169
-
1170
- $state.transition = null;
1171
- /**
1172
- * @ngdoc event
1173
- * @name ui.router.state.$state#$stateChangeError
1174
- * @eventOf ui.router.state.$state
1175
- * @eventType broadcast on root scope
1176
- * @description
1177
- * Fired when an **error occurs** during transition. It's important to note that if you
1178
- * have any errors in your resolve functions (javascript errors, non-existent services, etc)
1179
- * they will not throw traditionally. You must listen for this $stateChangeError event to
1180
- * catch **ALL** errors.
1181
- *
1182
- * @param {Object} event Event object.
1183
- * @param {State} toState The state being transitioned to.
1184
- * @param {Object} toParams The params supplied to the `toState`.
1185
- * @param {State} fromState The current state, pre-transition.
1186
- * @param {Object} fromParams The params supplied to the `fromState`.
1187
- * @param {Error} error The resolve error object.
1188
- */
1189
- evt = $rootScope.$broadcast('$stateChangeError', to.self, toParams, from.self, fromParams, error);
1190
-
1191
- if (!evt.defaultPrevented) {
1192
- $urlRouter.update();
1193
- }
1194
-
1195
- return $q.reject(error);
1196
- });
1197
-
1198
- return transition;
1199
- };
1200
-
1201
- /**
1202
- * @ngdoc function
1203
- * @name ui.router.state.$state#is
1204
- * @methodOf ui.router.state.$state
1205
- *
1206
- * @description
1207
- * Similar to {@link ui.router.state.$state#methods_includes $state.includes},
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
1210
- * must match with none missing and no extras.
1211
- *
1212
- * @example
1213
- * <pre>
1214
- * $state.$current.name = 'contacts.details.item';
1215
- *
1216
- * // absolute name
1217
- * $state.is('contact.details.item'); // returns true
1218
- * $state.is(contactDetailItemStateObject); // returns true
1219
- *
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>
1223
- * </pre>
1224
- *
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
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
- *
1233
- * @returns {boolean} Returns true if it is the state.
1234
- */
1235
- $state.is = function is(stateOrName, params, options) {
1236
- options = extend({ relative: $state.$current }, options || {});
1237
- var state = findState(stateOrName, options.relative);
1238
-
1239
- if (!isDefined(state)) { return undefined; }
1240
- if ($state.$current !== state) { return false; }
1241
- return params ? equalForKeys(state.params.$$values(params), $stateParams) : true;
1242
- };
1243
-
1244
- /**
1245
- * @ngdoc function
1246
- * @name ui.router.state.$state#includes
1247
- * @methodOf ui.router.state.$state
1248
- *
1249
- * @description
1250
- * A method to determine if the current active state is equal to or is the child of the
1251
- * state stateName. If any params are passed then they will be tested for a match as well.
1252
- * Not all the parameters need to be passed, just the ones you'd like to test for equality.
1253
- *
1254
- * @example
1255
- * Partial and relative names
1256
- * <pre>
1257
- * $state.$current.name = 'contacts.details.item';
1258
- *
1259
- * // Using partial names
1260
- * $state.includes("contacts"); // returns true
1261
- * $state.includes("contacts.details"); // returns true
1262
- * $state.includes("contacts.details.item"); // returns true
1263
- * $state.includes("contacts.list"); // returns false
1264
- * $state.includes("about"); // returns false
1265
- *
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>
1270
- *
1271
- * Basic globbing patterns
1272
- * <pre>
1273
- * $state.$current.name = 'contacts.details.item.url';
1274
- *
1275
- * $state.includes("*.details.*.*"); // returns true
1276
- * $state.includes("*.details.**"); // returns true
1277
- * $state.includes("**.item.**"); // returns true
1278
- * $state.includes("*.details.item.url"); // returns true
1279
- * $state.includes("*.details.*.url"); // returns true
1280
- * $state.includes("*.details.*"); // returns false
1281
- * $state.includes("item.**"); // returns false
1282
- * </pre>
1283
- *
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}`,
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
- *
1293
- * @returns {boolean} Returns true if it does include the state
1294
- */
1295
- $state.includes = function includes(stateOrName, params, options) {
1296
- options = extend({ relative: $state.$current }, options || {});
1297
- if (isString(stateOrName) && isGlob(stateOrName)) {
1298
- if (!doesStateMatchGlob(stateOrName)) {
1299
- return false;
1300
- }
1301
- stateOrName = $state.$current.name;
1302
- }
1303
-
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;
1308
- };
1309
-
1310
-
1311
- /**
1312
- * @ngdoc function
1313
- * @name ui.router.state.$state#href
1314
- * @methodOf ui.router.state.$state
1315
- *
1316
- * @description
1317
- * A url generation method that returns the compiled url for the given state populated with the given params.
1318
- *
1319
- * @example
1320
- * <pre>
1321
- * expect($state.href("about.person", { person: "bob" })).toEqual("/about/bob");
1322
- * </pre>
1323
- *
1324
- * @param {string|object} stateOrName The state name or state object you'd like to generate a url from.
1325
- * @param {object=} params An object of parameter values to fill the state's required parameters.
1326
- * @param {object=} options Options object. The options are:
1327
- *
1328
- * - **`lossy`** - {boolean=true} - If true, and if there is no url associated with the state provided in the
1329
- * first parameter, then the constructed href url will be built from the first navigable ancestor (aka
1330
- * ancestor with a valid url).
1331
- * - **`inherit`** - {boolean=true}, If `true` will inherit url parameters from current url.
1332
- * - **`relative`** - {object=$state.$current}, When transitioning with relative path (e.g '^'),
1333
- * defines which state to be relative from.
1334
- * - **`absolute`** - {boolean=false}, If true will generate an absolute url, e.g. "http://www.example.com/fullurl".
1335
- *
1336
- * @returns {string} compiled state url
1337
- */
1338
- $state.href = function href(stateOrName, params, options) {
1339
- options = extend({
1340
- lossy: true,
1341
- inherit: true,
1342
- absolute: false,
1343
- relative: $state.$current
1344
- }, options || {});
1345
-
1346
- var state = findState(stateOrName, options.relative);
1347
-
1348
- if (!isDefined(state)) return null;
1349
- if (options.inherit) params = inheritParams($stateParams, params || {}, $state.$current, state);
1350
-
1351
- var nav = (state && options.lossy) ? state.navigable : state;
1352
-
1353
- if (!nav || nav.url === undefined || nav.url === null) {
1354
- return null;
1355
- }
1356
- return $urlRouter.href(nav.url, filterByKeys(state.params.$$keys().concat('#'), params || {}), {
1357
- absolute: options.absolute
1358
- });
1359
- };
1360
-
1361
- /**
1362
- * @ngdoc function
1363
- * @name ui.router.state.$state#get
1364
- * @methodOf ui.router.state.$state
1365
- *
1366
- * @description
1367
- * Returns the state configuration object for any specific state or all states.
1368
- *
1369
- * @param {string|object=} stateOrName (absolute or relative) If provided, will only get the config for
1370
- * the requested state. If not provided, returns an array of ALL state configs.
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.
1373
- */
1374
- $state.get = function (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);
1377
- return (state && state.self) ? state.self : null;
1378
- };
1379
-
1380
- function resolveState(state, params, paramsAreFiltered, inherited, dst, options) {
1381
- // Make a restricted $stateParams with only the parameters that apply to this state if
1382
- // necessary. In addition to being available to the controller and onEnter/onExit callbacks,
1383
- // we also need $stateParams to be available for any $injector calls we make during the
1384
- // dependency resolution process.
1385
- var $stateParams = (paramsAreFiltered) ? params : filterByKeys(state.params.$$keys(), params);
1386
- var locals = { $stateParams: $stateParams };
1387
-
1388
- // Resolve 'global' dependencies for the state, i.e. those not specific to a view.
1389
- // We're also including $stateParams in this; that way the parameters are restricted
1390
- // to the set that should be visible to the state, and are independent of when we update
1391
- // the global $state and $stateParams values.
1392
- dst.resolve = $resolve.resolve(state.resolve, locals, dst.resolve, state);
1393
- var promises = [dst.resolve.then(function (globals) {
1394
- dst.globals = globals;
1395
- })];
1396
- if (inherited) promises.push(inherited);
1397
-
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
- }
1427
-
1428
- // Wait for all the promises and then return the activation object
1429
- return $q.all(promises).then(resolveViews).then(function (values) {
1430
- return dst;
1431
- });
1432
- }
1433
-
1434
- return $state;
1435
- }
1436
-
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)))) {
1458
- return true;
1459
- }
1460
- }
1461
- }
1462
-
1463
- angular.module('ui.router.state')
1464
- .value('$stateParams', {})
1465
- .provider('$state', $StateProvider);