katello 1.5.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of katello might be problematic. Click here for more details.

Files changed (1607) hide show
  1. data/LICENSE.txt +339 -0
  2. data/README.md +182 -0
  3. data/app/assets/images/katello/3rd-level-bg.png +0 -0
  4. data/app/assets/images/katello/960.png +0 -0
  5. data/app/assets/images/katello/biglogo.png +0 -0
  6. data/app/assets/images/katello/black_arrow.png +0 -0
  7. data/app/assets/images/katello/boxshadow.png +0 -0
  8. data/app/assets/images/katello/center-background.png +0 -0
  9. data/app/assets/images/katello/chart_overlay.png +0 -0
  10. data/app/assets/images/katello/chosen-sprite.png +0 -0
  11. data/app/assets/images/katello/cross_link.png +0 -0
  12. data/app/assets/images/katello/embed/favicon.png +0 -0
  13. data/app/assets/images/katello/footer-shade.png +0 -0
  14. data/app/assets/images/katello/headpin-login-logo.png +0 -0
  15. data/app/assets/images/katello/headpin-logo.png +0 -0
  16. data/app/assets/images/katello/icons/action-icons.png +0 -0
  17. data/app/assets/images/katello/icons/arrow_icon.png +0 -0
  18. data/app/assets/images/katello/icons/breadcrumb-icons.png +0 -0
  19. data/app/assets/images/katello/icons/check_icon.png +0 -0
  20. data/app/assets/images/katello/icons/close.png +0 -0
  21. data/app/assets/images/katello/icons/dotdotdot.png +0 -0
  22. data/app/assets/images/katello/icons/edit-hover.png +0 -0
  23. data/app/assets/images/katello/icons/edit.png +0 -0
  24. data/app/assets/images/katello/icons/expander-collapsed-left.png +0 -0
  25. data/app/assets/images/katello/icons/expander-collapsed.png +0 -0
  26. data/app/assets/images/katello/icons/expander-expanded.png +0 -0
  27. data/app/assets/images/katello/icons/favorite.png +0 -0
  28. data/app/assets/images/katello/icons/grabber.png +0 -0
  29. data/app/assets/images/katello/icons/icon_menu_arrow.gif +0 -0
  30. data/app/assets/images/katello/icons/icon_search.png +0 -0
  31. data/app/assets/images/katello/icons/info-hover.png +0 -0
  32. data/app/assets/images/katello/icons/info.png +0 -0
  33. data/app/assets/images/katello/icons/locked.png +0 -0
  34. data/app/assets/images/katello/icons/objects.png +0 -0
  35. data/app/assets/images/katello/icons/order-asc.png +0 -0
  36. data/app/assets/images/katello/icons/order-desc.png +0 -0
  37. data/app/assets/images/katello/icons/recent.png +0 -0
  38. data/app/assets/images/katello/icons/right-arrow.png +0 -0
  39. data/app/assets/images/katello/icons/simplePassMeterSprite.png +0 -0
  40. data/app/assets/images/katello/icons/spinner.gif +0 -0
  41. data/app/assets/images/katello/icons/spinner_head.gif +0 -0
  42. data/app/assets/images/katello/icons/status.png +0 -0
  43. data/app/assets/images/katello/icons/status_icons_sprite.png +0 -0
  44. data/app/assets/images/katello/icons/statusicons.png +0 -0
  45. data/app/assets/images/katello/icons/svg-source/action-icons.svg +1613 -0
  46. data/app/assets/images/katello/icons/svg-source/breadcrumb-icons.svg +289 -0
  47. data/app/assets/images/katello/icons/svg-source/objects.svg +446 -0
  48. data/app/assets/images/katello/icons/ui.totop.png +0 -0
  49. data/app/assets/images/katello/input-bg.png +0 -0
  50. data/app/assets/images/katello/katello-login-logo.png +0 -0
  51. data/app/assets/images/katello/katello-logo.png +0 -0
  52. data/app/assets/images/katello/katello.png +0 -0
  53. data/app/assets/images/katello/katello_32x32_icon.png +0 -0
  54. data/app/assets/images/katello/large-white-spinner.gif +0 -0
  55. data/app/assets/images/katello/nav_pipe.png +0 -0
  56. data/app/assets/images/katello/navtab_off.png +0 -0
  57. data/app/assets/images/katello/navtab_on.png +0 -0
  58. data/app/assets/images/katello/outer-background.png +0 -0
  59. data/app/assets/images/katello/subnav-shadow.png +0 -0
  60. data/app/assets/javascripts/katello/activation_keys/activation_key.js +336 -0
  61. data/app/assets/javascripts/katello/activation_keys/activation_key_edit.js +19 -0
  62. data/app/assets/javascripts/katello/activation_keys/activation_key_subscriptions.js +18 -0
  63. data/app/assets/javascripts/katello/activation_keys/index.js +17 -0
  64. data/app/assets/javascripts/katello/changesets/changeset.js +47 -0
  65. data/app/assets/javascripts/katello/changesets/changeset_edit.js +79 -0
  66. data/app/assets/javascripts/katello/changesets/index.js +14 -0
  67. data/app/assets/javascripts/katello/common/bastion-routes.js +2878 -0
  68. data/app/assets/javascripts/katello/common/chosen.jquery.js +907 -0
  69. data/app/assets/javascripts/katello/common/env_select.js +143 -0
  70. data/app/assets/javascripts/katello/common/env_select_scroll.js +133 -0
  71. data/app/assets/javascripts/katello/common/experimental/katello-globals.module.js +21 -0
  72. data/app/assets/javascripts/katello/common/index.js +29 -0
  73. data/app/assets/javascripts/katello/common/jquery.jeditable.custominputs.js +224 -0
  74. data/app/assets/javascripts/katello/common/katello.common.js +203 -0
  75. data/app/assets/javascripts/katello/common/katello.global.js +31 -0
  76. data/app/assets/javascripts/katello/common/katello.js +353 -0
  77. data/app/assets/javascripts/katello/common/katello_object.js +103 -0
  78. data/app/assets/javascripts/katello/common/menu.js +125 -0
  79. data/app/assets/javascripts/katello/common/notices.js +176 -0
  80. data/app/assets/javascripts/katello/common/panel.js +1078 -0
  81. data/app/assets/javascripts/katello/common/routes.js +2886 -0
  82. data/app/assets/javascripts/katello/common/search.js +376 -0
  83. data/app/assets/javascripts/katello/common/spin.min.js +2 -0
  84. data/app/assets/javascripts/katello/common/vendor.js +32 -0
  85. data/app/assets/javascripts/katello/content_search/content_search.js +904 -0
  86. data/app/assets/javascripts/katello/content_search/index.js +18 -0
  87. data/app/assets/javascripts/katello/content_view_definitions/content_view_definition.js +844 -0
  88. data/app/assets/javascripts/katello/content_view_definitions/env_content_view_selector.js +188 -0
  89. data/app/assets/javascripts/katello/content_view_definitions/index.js +19 -0
  90. data/app/assets/javascripts/katello/content_view_definitions/product_repo_selector.js +569 -0
  91. data/app/assets/javascripts/katello/content_view_definitions/repo_selector.js +47 -0
  92. data/app/assets/javascripts/katello/dashboard/dashboard.js +215 -0
  93. data/app/assets/javascripts/katello/dashboard/index.js +17 -0
  94. data/app/assets/javascripts/katello/distributors/distributor_edit.js +16 -0
  95. data/app/assets/javascripts/katello/distributors/distributor_subscriptions.js +41 -0
  96. data/app/assets/javascripts/katello/distributors/distributors.js +332 -0
  97. data/app/assets/javascripts/katello/distributors/index.js +23 -0
  98. data/app/assets/javascripts/katello/environments/environment_edit.js +63 -0
  99. data/app/assets/javascripts/katello/html5/excanvas.js +1416 -0
  100. data/app/assets/javascripts/katello/html5/html5.js +3 -0
  101. data/app/assets/javascripts/katello/html5/index.js +14 -0
  102. data/app/assets/javascripts/katello/notices/index.js +14 -0
  103. data/app/assets/javascripts/katello/notices/notices_list.js +49 -0
  104. data/app/assets/javascripts/katello/organizations/default_info.js +216 -0
  105. data/app/assets/javascripts/katello/organizations/download_certificate.js +20 -0
  106. data/app/assets/javascripts/katello/organizations/index.js +15 -0
  107. data/app/assets/javascripts/katello/organizations/organization.js +68 -0
  108. data/app/assets/javascripts/katello/organizations/organization_edit.js +46 -0
  109. data/app/assets/javascripts/katello/products/product_edit.js +76 -0
  110. data/app/assets/javascripts/katello/promotions/index.js +16 -0
  111. data/app/assets/javascripts/katello/promotions/promotion.js +1244 -0
  112. data/app/assets/javascripts/katello/providers/index.js +18 -0
  113. data/app/assets/javascripts/katello/providers/products_repos.js +46 -0
  114. data/app/assets/javascripts/katello/providers/provider.js +68 -0
  115. data/app/assets/javascripts/katello/providers/provider_create.js +21 -0
  116. data/app/assets/javascripts/katello/providers/provider_redhat.js +219 -0
  117. data/app/assets/javascripts/katello/providers/redhat/index.js +17 -0
  118. data/app/assets/javascripts/katello/providers/repo.js +27 -0
  119. data/app/assets/javascripts/katello/providers/repo_discovery.js +376 -0
  120. data/app/assets/javascripts/katello/providers/repo_discovery_create.js +17 -0
  121. data/app/assets/javascripts/katello/roles/index.js +17 -0
  122. data/app/assets/javascripts/katello/roles/role.js +16 -0
  123. data/app/assets/javascripts/katello/roles/role_edit.js +46 -0
  124. data/app/assets/javascripts/katello/roles/role_sliding_tree.js +1398 -0
  125. data/app/assets/javascripts/katello/subscriptions/headpin.sparkline.js +6 -0
  126. data/app/assets/javascripts/katello/subscriptions/index.js +17 -0
  127. data/app/assets/javascripts/katello/subscriptions/subscription.js +126 -0
  128. data/app/assets/javascripts/katello/sync_management/index.js +15 -0
  129. data/app/assets/javascripts/katello/sync_management/sync_management.js +342 -0
  130. data/app/assets/javascripts/katello/sync_plans/index.js +15 -0
  131. data/app/assets/javascripts/katello/sync_plans/sync_plan.js +32 -0
  132. data/app/assets/javascripts/katello/sync_plans/sync_plan_edit.js +128 -0
  133. data/app/assets/javascripts/katello/sync_schedules/index.js +15 -0
  134. data/app/assets/javascripts/katello/sync_schedules/sync_schedule.js +28 -0
  135. data/app/assets/javascripts/katello/system_events/index.js +15 -0
  136. data/app/assets/javascripts/katello/system_events/system_events.js +181 -0
  137. data/app/assets/javascripts/katello/system_groups/index.js +19 -0
  138. data/app/assets/javascripts/katello/system_groups/package_actions.js +316 -0
  139. data/app/assets/javascripts/katello/system_groups/system_group_events.js +23 -0
  140. data/app/assets/javascripts/katello/system_groups/system_groups.js +445 -0
  141. data/app/assets/javascripts/katello/system_groups/system_groups_pane.js +141 -0
  142. data/app/assets/javascripts/katello/system_packages/index.js +16 -0
  143. data/app/assets/javascripts/katello/system_packages/packages_filtertable.js +63 -0
  144. data/app/assets/javascripts/katello/system_packages/system_packages.js +767 -0
  145. data/app/assets/javascripts/katello/systems/custom_info.js +134 -0
  146. data/app/assets/javascripts/katello/systems/index.js +28 -0
  147. data/app/assets/javascripts/katello/systems/packages.js +34 -0
  148. data/app/assets/javascripts/katello/systems/system_edit.js +67 -0
  149. data/app/assets/javascripts/katello/systems/system_errata.js +313 -0
  150. data/app/assets/javascripts/katello/systems/system_products.js +113 -0
  151. data/app/assets/javascripts/katello/systems/system_subscriptions.js +71 -0
  152. data/app/assets/javascripts/katello/systems/systems.js +793 -0
  153. data/app/assets/javascripts/katello/users/index.js +16 -0
  154. data/app/assets/javascripts/katello/users/user.js +102 -0
  155. data/app/assets/javascripts/katello/users/user_methods.js +111 -0
  156. data/app/assets/javascripts/katello/widgets/auto_complete.js +195 -0
  157. data/app/assets/javascripts/katello/widgets/comparison_grid.js +1031 -0
  158. data/app/assets/javascripts/katello/widgets/env_content_view_selector.js +206 -0
  159. data/app/assets/javascripts/katello/widgets/filtertable/filtertable.js +36 -0
  160. data/app/assets/javascripts/katello/widgets/filtertable/index.js +15 -0
  161. data/app/assets/javascripts/katello/widgets/jquery.jeditable.helpers.js +281 -0
  162. data/app/assets/javascripts/katello/widgets/one_panel.js +68 -0
  163. data/app/assets/javascripts/katello/widgets/path_selector.js +397 -0
  164. data/app/assets/javascripts/katello/widgets/scroll_pane.js +4 -0
  165. data/app/assets/javascripts/katello/widgets/slidingtree.js +645 -0
  166. data/app/assets/javascripts/katello/widgets/subpanel_new.js +19 -0
  167. data/app/assets/javascripts/katello/widgets/tabs.js +26 -0
  168. data/app/assets/javascripts/katello/widgets/tipsy.custom.js +197 -0
  169. data/app/assets/javascripts/katello/widgets/treetable/index.js +14 -0
  170. data/app/assets/stylesheets/katello/_grid.scss +11 -0
  171. data/app/assets/stylesheets/katello/_katello_base.scss +7 -0
  172. data/app/assets/stylesheets/katello/_katello_colors.scss +109 -0
  173. data/app/assets/stylesheets/katello/_katello_mixins.scss +88 -0
  174. data/app/assets/stylesheets/katello/_katello_vars.scss +92 -0
  175. data/app/assets/stylesheets/katello/_look.scss +1 -0
  176. data/app/assets/stylesheets/katello/_overrides.scss +23 -0
  177. data/app/assets/stylesheets/katello/activation_keys.scss +16 -0
  178. data/app/assets/stylesheets/katello/content_search.scss +647 -0
  179. data/app/assets/stylesheets/katello/contents.scss +591 -0
  180. data/app/assets/stylesheets/katello/custom_info.scss +32 -0
  181. data/app/assets/stylesheets/katello/dashboard.scss +631 -0
  182. data/app/assets/stylesheets/katello/distributors.scss +183 -0
  183. data/app/assets/stylesheets/katello/fancyqueries.scss +218 -0
  184. data/app/assets/stylesheets/katello/generic.scss +20 -0
  185. data/app/assets/stylesheets/katello/header.scss +53 -0
  186. data/app/assets/stylesheets/katello/ie.scss +16 -0
  187. data/app/assets/stylesheets/katello/katello.scss +1474 -0
  188. data/app/assets/stylesheets/katello/katello_experimental.scss +90 -0
  189. data/app/assets/stylesheets/katello/katello_sprites.css.scss +45 -0
  190. data/app/assets/stylesheets/katello/loginpage.css.scss +47 -0
  191. data/app/assets/stylesheets/katello/notifications.scss +19 -0
  192. data/app/assets/stylesheets/katello/operations.scss +166 -0
  193. data/app/assets/stylesheets/katello/orgs.scss +60 -0
  194. data/app/assets/stylesheets/katello/subscriptions.scss +30 -0
  195. data/app/assets/stylesheets/katello/systems.scss +349 -0
  196. data/app/assets/stylesheets/katello/widgets/_chosen.scss +422 -0
  197. data/app/assets/stylesheets/katello/widgets/_env_select.scss +123 -0
  198. data/app/assets/stylesheets/katello/widgets/_multiselect.scss +40 -0
  199. data/app/assets/stylesheets/katello/widgets/_scrollpane.scss +66 -0
  200. data/app/assets/stylesheets/katello/widgets/_search.scss +46 -0
  201. data/app/assets/stylesheets/katello/widgets/_slidingtree.scss +347 -0
  202. data/app/assets/stylesheets/katello/widgets/path_selector.scss +178 -0
  203. data/app/assets/stylesheets/katello/widgets/tabs.scss +83 -0
  204. data/app/assets/stylesheets/katello/widgets/tipsy_custom.scss +81 -0
  205. data/app/controllers/katello/activation_keys_controller.rb +371 -0
  206. data/app/controllers/katello/api/api_controller.rb +145 -0
  207. data/app/controllers/katello/api/v1/about_controller.rb +43 -0
  208. data/app/controllers/katello/api/v1/activation_keys_controller.rb +178 -0
  209. data/app/controllers/katello/api/v1/api_controller.rb +161 -0
  210. data/app/controllers/katello/api/v1/candlepin_proxies_controller.rb +43 -0
  211. data/app/controllers/katello/api/v1/changesets_content_controller.rb +65 -0
  212. data/app/controllers/katello/api/v1/changesets_controller.rb +118 -0
  213. data/app/controllers/katello/api/v1/content_uploads_controller.rb +98 -0
  214. data/app/controllers/katello/api/v1/content_view_definitions_controller.rb +251 -0
  215. data/app/controllers/katello/api/v1/content_views_controller.rb +119 -0
  216. data/app/controllers/katello/api/v1/crls_controller.rb +29 -0
  217. data/app/controllers/katello/api/v1/custom_info_controller.rb +98 -0
  218. data/app/controllers/katello/api/v1/distributions_controller.rb +54 -0
  219. data/app/controllers/katello/api/v1/distributors_controller.rb +285 -0
  220. data/app/controllers/katello/api/v1/environments_controller.rb +246 -0
  221. data/app/controllers/katello/api/v1/errata_controller.rb +91 -0
  222. data/app/controllers/katello/api/v1/errors_controller.rb +24 -0
  223. data/app/controllers/katello/api/v1/filter_rules_controller.rb +94 -0
  224. data/app/controllers/katello/api/v1/filters_controller.rb +152 -0
  225. data/app/controllers/katello/api/v1/gpg_keys_controller.rb +107 -0
  226. data/app/controllers/katello/api/v1/organization_default_info_controller.rb +123 -0
  227. data/app/controllers/katello/api/v1/organizations_controller.rb +17 -0
  228. data/app/controllers/katello/api/v1/packages_controller.rb +67 -0
  229. data/app/controllers/katello/api/v1/permissions_controller.rb +112 -0
  230. data/app/controllers/katello/api/v1/ping_controller.rb +47 -0
  231. data/app/controllers/katello/api/v1/products_controller.rb +170 -0
  232. data/app/controllers/katello/api/v1/providers_controller.rb +237 -0
  233. data/app/controllers/katello/api/v1/proxies_controller.rb +103 -0
  234. data/app/controllers/katello/api/v1/puppet_modules_controller.rb +72 -0
  235. data/app/controllers/katello/api/v1/repositories_controller.rb +214 -0
  236. data/app/controllers/katello/api/v1/repository_sets_controller.rb +77 -0
  237. data/app/controllers/katello/api/v1/role_ldap_groups_controller.rb +59 -0
  238. data/app/controllers/katello/api/v1/roles_controller.rb +112 -0
  239. data/app/controllers/katello/api/v1/root_controller.rb +57 -0
  240. data/app/controllers/katello/api/v1/status_controller.rb +32 -0
  241. data/app/controllers/katello/api/v1/subscriptions_controller.rb +141 -0
  242. data/app/controllers/katello/api/v1/sync_controller.rb +116 -0
  243. data/app/controllers/katello/api/v1/sync_plans_controller.rb +120 -0
  244. data/app/controllers/katello/api/v1/system_group_errata_controller.rb +93 -0
  245. data/app/controllers/katello/api/v1/system_group_packages_controller.rb +125 -0
  246. data/app/controllers/katello/api/v1/system_groups_controller.rb +290 -0
  247. data/app/controllers/katello/api/v1/system_packages_controller.rb +134 -0
  248. data/app/controllers/katello/api/v1/systems_controller.rb +606 -0
  249. data/app/controllers/katello/api/v1/tasks_controller.rb +86 -0
  250. data/app/controllers/katello/api/v1/uebercerts_controller.rb +31 -0
  251. data/app/controllers/katello/api/v1/users_controller.rb +179 -0
  252. data/app/controllers/katello/api/v2/about_controller.rb +19 -0
  253. data/app/controllers/katello/api/v2/activation_keys_controller.rb +41 -0
  254. data/app/controllers/katello/api/v2/api_controller.rb +130 -0
  255. data/app/controllers/katello/api/v2/changesets_content_controller.rb +59 -0
  256. data/app/controllers/katello/api/v2/changesets_controller.rb +50 -0
  257. data/app/controllers/katello/api/v2/content_uploads_controller.rb +19 -0
  258. data/app/controllers/katello/api/v2/content_view_definitions_controller.rb +133 -0
  259. data/app/controllers/katello/api/v2/content_views_controller.rb +50 -0
  260. data/app/controllers/katello/api/v2/custom_info_controller.rb +57 -0
  261. data/app/controllers/katello/api/v2/distributions_controller.rb +19 -0
  262. data/app/controllers/katello/api/v2/distributors_controller.rb +19 -0
  263. data/app/controllers/katello/api/v2/environments_controller.rb +103 -0
  264. data/app/controllers/katello/api/v2/errata_controller.rb +88 -0
  265. data/app/controllers/katello/api/v2/filter_rules_controller.rb +55 -0
  266. data/app/controllers/katello/api/v2/filters_controller.rb +99 -0
  267. data/app/controllers/katello/api/v2/gpg_keys_controller.rb +132 -0
  268. data/app/controllers/katello/api/v2/organization_default_info_controller.rb +61 -0
  269. data/app/controllers/katello/api/v2/organizations_controller.rb +104 -0
  270. data/app/controllers/katello/api/v2/packages_controller.rb +19 -0
  271. data/app/controllers/katello/api/v2/permissions_controller.rb +62 -0
  272. data/app/controllers/katello/api/v2/ping_controller.rb +36 -0
  273. data/app/controllers/katello/api/v2/products_controller.rb +133 -0
  274. data/app/controllers/katello/api/v2/providers_controller.rb +276 -0
  275. data/app/controllers/katello/api/v2/puppet_modules_controller.rb +17 -0
  276. data/app/controllers/katello/api/v2/repositories_controller.rb +155 -0
  277. data/app/controllers/katello/api/v2/repository_sets_controller.rb +30 -0
  278. data/app/controllers/katello/api/v2/role_ldap_groups_controller.rb +32 -0
  279. data/app/controllers/katello/api/v2/roles_controller.rb +19 -0
  280. data/app/controllers/katello/api/v2/root_controller.rb +19 -0
  281. data/app/controllers/katello/api/v2/subscriptions_controller.rb +183 -0
  282. data/app/controllers/katello/api/v2/sync_controller.rb +44 -0
  283. data/app/controllers/katello/api/v2/sync_plans_controller.rb +51 -0
  284. data/app/controllers/katello/api/v2/system_errata_controller.rb +48 -0
  285. data/app/controllers/katello/api/v2/system_group_errata_controller.rb +19 -0
  286. data/app/controllers/katello/api/v2/system_group_packages_controller.rb +19 -0
  287. data/app/controllers/katello/api/v2/system_groups_controller.rb +201 -0
  288. data/app/controllers/katello/api/v2/system_packages_controller.rb +130 -0
  289. data/app/controllers/katello/api/v2/systems_bulk_actions_controller.rb +247 -0
  290. data/app/controllers/katello/api/v2/systems_controller.rb +613 -0
  291. data/app/controllers/katello/api/v2/tasks_controller.rb +67 -0
  292. data/app/controllers/katello/api/v2/uebercerts_controller.rb +19 -0
  293. data/app/controllers/katello/api/v2/users_controller.rb +74 -0
  294. data/app/controllers/katello/application_controller.rb +736 -0
  295. data/app/controllers/katello/application_info_controller.rb +41 -0
  296. data/app/controllers/katello/auto_complete_search.rb +48 -0
  297. data/app/controllers/katello/changesets_controller.rb +323 -0
  298. data/app/controllers/katello/consumers_controller_logic.rb +57 -0
  299. data/app/controllers/katello/content_search_controller.rb +756 -0
  300. data/app/controllers/katello/content_view_definitions_controller.rb +318 -0
  301. data/app/controllers/katello/content_view_versions_controller.rb +47 -0
  302. data/app/controllers/katello/content_views_controller.rb +98 -0
  303. data/app/controllers/katello/dashboard_controller.rb +113 -0
  304. data/app/controllers/katello/distributor_events_controller.rb +110 -0
  305. data/app/controllers/katello/distributors_controller.rb +503 -0
  306. data/app/controllers/katello/environments_controller.rb +196 -0
  307. data/app/controllers/katello/errata_controller.rb +75 -0
  308. data/app/controllers/katello/errors_controller.rb +36 -0
  309. data/app/controllers/katello/failed_authentication_controller.rb +66 -0
  310. data/app/controllers/katello/filter_rules_controller.rb +248 -0
  311. data/app/controllers/katello/filters_controller.rb +141 -0
  312. data/app/controllers/katello/gpg_keys_controller.rb +41 -0
  313. data/app/controllers/katello/http_errors.rb +67 -0
  314. data/app/controllers/katello/notices_controller.rb +99 -0
  315. data/app/controllers/katello/operations_controller.rb +30 -0
  316. data/app/controllers/katello/organizations_controller.rb +288 -0
  317. data/app/controllers/katello/packages_controller.rb +86 -0
  318. data/app/controllers/katello/products_controller.rb +158 -0
  319. data/app/controllers/katello/promotions_controller.rb +93 -0
  320. data/app/controllers/katello/providers_controller.rb +274 -0
  321. data/app/controllers/katello/puppet_modules_controller.rb +68 -0
  322. data/app/controllers/katello/repositories_controller.rb +150 -0
  323. data/app/controllers/katello/roles_controller.rb +287 -0
  324. data/app/controllers/katello/search_controller.rb +94 -0
  325. data/app/controllers/katello/sort_column_list.rb +33 -0
  326. data/app/controllers/katello/subscriptions_controller.rb +327 -0
  327. data/app/controllers/katello/sync_management_controller.rb +242 -0
  328. data/app/controllers/katello/sync_plans_controller.rb +159 -0
  329. data/app/controllers/katello/sync_schedules_controller.rb +94 -0
  330. data/app/controllers/katello/system_errata_controller.rb +109 -0
  331. data/app/controllers/katello/system_events_controller.rb +110 -0
  332. data/app/controllers/katello/system_group_errata_controller.rb +106 -0
  333. data/app/controllers/katello/system_group_events_controller.rb +123 -0
  334. data/app/controllers/katello/system_group_packages_controller.rb +215 -0
  335. data/app/controllers/katello/system_groups_controller.rb +293 -0
  336. data/app/controllers/katello/system_packages_controller.rb +201 -0
  337. data/app/controllers/katello/systems_controller.rb +846 -0
  338. data/app/controllers/katello/user_sessions_controller.rb +41 -0
  339. data/app/controllers/katello/users_controller.rb +360 -0
  340. data/app/helpers/katello/activation_keys_helper.rb +16 -0
  341. data/app/helpers/katello/application_helper.rb +410 -0
  342. data/app/helpers/katello/application_info_helper.rb +37 -0
  343. data/app/helpers/katello/branding_helper.rb +40 -0
  344. data/app/helpers/katello/breadcrumb_helper.rb +229 -0
  345. data/app/helpers/katello/content_search_helper.rb +62 -0
  346. data/app/helpers/katello/content_view_definitions_helper.rb +136 -0
  347. data/app/helpers/katello/dashboard_helper.rb +223 -0
  348. data/app/helpers/katello/distributors_helper.rb +71 -0
  349. data/app/helpers/katello/errata_helper.rb +33 -0
  350. data/app/helpers/katello/filter_rules_helper.rb +89 -0
  351. data/app/helpers/katello/filters_helper.rb +124 -0
  352. data/app/helpers/katello/katello_form_builder.rb +162 -0
  353. data/app/helpers/katello/katello_url_helper.rb +49 -0
  354. data/app/helpers/katello/layout_helper.rb +32 -0
  355. data/app/helpers/katello/menu.rb +112 -0
  356. data/app/helpers/katello/notices_helper.rb +23 -0
  357. data/app/helpers/katello/organizations_helper.rb +36 -0
  358. data/app/helpers/katello/packages_helper.rb +81 -0
  359. data/app/helpers/katello/products_helper.rb +72 -0
  360. data/app/helpers/katello/promotions_helper.rb +39 -0
  361. data/app/helpers/katello/providers_helper.rb +108 -0
  362. data/app/helpers/katello/repositories_helper.rb +31 -0
  363. data/app/helpers/katello/roles_helper.rb +49 -0
  364. data/app/helpers/katello/search_helper.rb +37 -0
  365. data/app/helpers/katello/subscriptions_helper.rb +45 -0
  366. data/app/helpers/katello/sync_management_helper.rb +124 -0
  367. data/app/helpers/katello/sync_schedules_helper.rb +28 -0
  368. data/app/helpers/katello/system_errata_helper.rb +28 -0
  369. data/app/helpers/katello/system_events_helper.rb +16 -0
  370. data/app/helpers/katello/system_group_events_helper.rb +19 -0
  371. data/app/helpers/katello/system_packages_helper.rb +55 -0
  372. data/app/helpers/katello/systems_helper.rb +174 -0
  373. data/app/helpers/katello/taxonomy_helper.rb +29 -0
  374. data/app/helpers/katello/translation_helper.rb +29 -0
  375. data/app/helpers/katello/users_helper.rb +45 -0
  376. data/app/lib/katello/README +2 -0
  377. data/app/lib/katello/api/constraints/activation_key_constraint.rb +19 -0
  378. data/app/lib/katello/api/mapper_extensions.rb +34 -0
  379. data/app/lib/katello/api/v1/error_handling.rb +152 -0
  380. data/app/lib/katello/api/v2/error_handling.rb +153 -0
  381. data/app/lib/katello/api/v2/rendering.rb +79 -0
  382. data/app/lib/katello/api/version1.rb +9 -0
  383. data/app/lib/katello/api/version2.rb +9 -0
  384. data/app/lib/katello/authorization_rules.rb +94 -0
  385. data/app/lib/katello/bulk_actions.rb +100 -0
  386. data/app/lib/katello/content_search/cell.rb +30 -0
  387. data/app/lib/katello/content_search/column.rb +18 -0
  388. data/app/lib/katello/content_search/container_search.rb +48 -0
  389. data/app/lib/katello/content_search/content_view_comparison.rb +206 -0
  390. data/app/lib/katello/content_search/content_view_search.rb +72 -0
  391. data/app/lib/katello/content_search/element.rb +61 -0
  392. data/app/lib/katello/content_search/metadata_row.rb +35 -0
  393. data/app/lib/katello/content_search/product_row.rb +36 -0
  394. data/app/lib/katello/content_search/product_search.rb +61 -0
  395. data/app/lib/katello/content_search/repo_row.rb +33 -0
  396. data/app/lib/katello/content_search/repo_search.rb +69 -0
  397. data/app/lib/katello/content_search/row.rb +25 -0
  398. data/app/lib/katello/content_search/search.rb +47 -0
  399. data/app/lib/katello/content_search/search_utils.rb +33 -0
  400. data/app/lib/katello/content_search/span.rb +21 -0
  401. data/app/lib/katello/content_search/unit_row.rb +56 -0
  402. data/app/lib/katello/dashboard/content_views_widget.rb +30 -0
  403. data/app/lib/katello/dashboard/errata_widget.rb +30 -0
  404. data/app/lib/katello/dashboard/layout.rb +76 -0
  405. data/app/lib/katello/dashboard/notices_widget.rb +24 -0
  406. data/app/lib/katello/dashboard/promotions_widget.rb +30 -0
  407. data/app/lib/katello/dashboard/subscriptions_totals_widget.rb +29 -0
  408. data/app/lib/katello/dashboard/subscriptions_widget.rb +25 -0
  409. data/app/lib/katello/dashboard/sync_widget.rb +29 -0
  410. data/app/lib/katello/dashboard/system_groups_widget.rb +30 -0
  411. data/app/lib/katello/dashboard/widget.rb +46 -0
  412. data/app/lib/katello/errors.rb +89 -0
  413. data/app/lib/katello/glue/event.rb +71 -0
  414. data/app/lib/katello/glue/queue.rb +88 -0
  415. data/app/lib/katello/glue/task.rb +56 -0
  416. data/app/lib/katello/http_resource.rb +219 -0
  417. data/app/lib/katello/kt_locale.rb +76 -0
  418. data/app/lib/katello/lazy_accessor.rb +157 -0
  419. data/app/lib/katello/ldap.rb +43 -0
  420. data/app/lib/katello/mapping.rb +46 -0
  421. data/app/lib/katello/navigation.rb +21 -0
  422. data/app/lib/katello/navigation/content_menu.rb +316 -0
  423. data/app/lib/katello/navigation/organization_menu.rb +72 -0
  424. data/app/lib/katello/navigation/system_menu.rb +208 -0
  425. data/app/lib/katello/notifications.rb +17 -0
  426. data/app/lib/katello/notifications/controller_helper.rb +43 -0
  427. data/app/lib/katello/notifications/notifier.rb +190 -0
  428. data/app/lib/katello/notify.rb +16 -0
  429. data/app/lib/katello/profiling.rb +61 -0
  430. data/app/lib/katello/repo_discovery.rb +89 -0
  431. data/app/lib/katello/resources/candlepin.rb +723 -0
  432. data/app/lib/katello/resources/cdn.rb +145 -0
  433. data/app/lib/katello/util/cdn_var_substitutor.rb +133 -0
  434. data/app/lib/katello/util/data.rb +54 -0
  435. data/app/lib/katello/util/errata.rb +63 -0
  436. data/app/lib/katello/util/filter_rule_clause_generator.rb +100 -0
  437. data/app/lib/katello/util/model.rb +46 -0
  438. data/app/lib/katello/util/package.rb +188 -0
  439. data/app/lib/katello/util/package_clause_generator.rb +81 -0
  440. data/app/lib/katello/util/package_filter.rb +96 -0
  441. data/app/lib/katello/util/puppet_clause_generator.rb +39 -0
  442. data/app/lib/katello/util/report_table.rb +102 -0
  443. data/app/lib/katello/util/search.rb +73 -0
  444. data/app/lib/katello/util/support.rb +101 -0
  445. data/app/lib/katello/util/task_status.rb +142 -0
  446. data/app/lib/katello/util/thread_session.rb +86 -0
  447. data/app/lib/katello/util/url_matcher.rb +111 -0
  448. data/app/lib/katello/validators/changeset_distribution_validator.rb +29 -0
  449. data/app/lib/katello/validators/changeset_erratum_validator.rb +31 -0
  450. data/app/lib/katello/validators/changeset_package_validator.rb +29 -0
  451. data/app/lib/katello/validators/content_validator.rb +23 -0
  452. data/app/lib/katello/validators/content_view_environment_validator.rb +30 -0
  453. data/app/lib/katello/validators/default_info_validator.rb +41 -0
  454. data/app/lib/katello/validators/erratum_rule_params_validator.rb +65 -0
  455. data/app/lib/katello/validators/gpg_key_content_validator.rb +54 -0
  456. data/app/lib/katello/validators/katello_description_format_validator.rb +24 -0
  457. data/app/lib/katello/validators/katello_label_format_validator.rb +34 -0
  458. data/app/lib/katello/validators/katello_name_format_validator.rb +34 -0
  459. data/app/lib/katello/validators/katello_url_format_validator.rb +33 -0
  460. data/app/lib/katello/validators/ldap_group_validator.rb +25 -0
  461. data/app/lib/katello/validators/ldap_username_validator.rb +31 -0
  462. data/app/lib/katello/validators/library_presence_validator.rb +21 -0
  463. data/app/lib/katello/validators/lock_validator.rb +25 -0
  464. data/app/lib/katello/validators/no_trailing_space_validator.rb +27 -0
  465. data/app/lib/katello/validators/non_library_environment_validator.rb +22 -0
  466. data/app/lib/katello/validators/not_in_library_validator.rb +21 -0
  467. data/app/lib/katello/validators/own_role_presence_validator.rb +25 -0
  468. data/app/lib/katello/validators/package_group_rule_params_validator.rb +34 -0
  469. data/app/lib/katello/validators/path_descendents_validator.rb +36 -0
  470. data/app/lib/katello/validators/permission_validator.rb +43 -0
  471. data/app/lib/katello/validators/prior_validator.rb +32 -0
  472. data/app/lib/katello/validators/repo_disablement_validator.rb +23 -0
  473. data/app/lib/katello/validators/rolename_validator.rb +27 -0
  474. data/app/lib/katello/validators/rule_params_validator.rb +34 -0
  475. data/app/lib/katello/validators/rule_version_validator.rb +30 -0
  476. data/app/lib/katello/validators/self_reference_environment_validator.rb +21 -0
  477. data/app/lib/katello/validators/serialized_params_validator.rb +27 -0
  478. data/app/lib/katello/validators/unique_field_in_org.rb +27 -0
  479. data/app/lib/katello/validators/username_validator.rb +23 -0
  480. data/app/mailers/katello/user_mailer.rb +31 -0
  481. data/app/models/katello/activation_key.rb +170 -0
  482. data/app/models/katello/async_operation.rb +98 -0
  483. data/app/models/katello/async_orchestration.rb +53 -0
  484. data/app/models/katello/authorization/activation_key.rb +52 -0
  485. data/app/models/katello/authorization/content_view.rb +107 -0
  486. data/app/models/katello/authorization/content_view_definition.rb +103 -0
  487. data/app/models/katello/authorization/content_view_version.rb +39 -0
  488. data/app/models/katello/authorization/distributor.rb +68 -0
  489. data/app/models/katello/authorization/enforcement.rb +204 -0
  490. data/app/models/katello/authorization/environment.rb +234 -0
  491. data/app/models/katello/authorization/gpg_key.rb +58 -0
  492. data/app/models/katello/authorization/organization.rb +162 -0
  493. data/app/models/katello/authorization/product.rb +70 -0
  494. data/app/models/katello/authorization/provider.rb +101 -0
  495. data/app/models/katello/authorization/repository.rb +97 -0
  496. data/app/models/katello/authorization/role.rb +63 -0
  497. data/app/models/katello/authorization/system.rb +116 -0
  498. data/app/models/katello/authorization/system_group.rb +124 -0
  499. data/app/models/katello/authorization/user.rb +80 -0
  500. data/app/models/katello/candlepin/content.rb +52 -0
  501. data/app/models/katello/candlepin/product_content.rb +150 -0
  502. data/app/models/katello/changeset.rb +228 -0
  503. data/app/models/katello/changeset_content_view.rb +8 -0
  504. data/app/models/katello/changeset_user.rb +21 -0
  505. data/app/models/katello/component_content_view.rb +21 -0
  506. data/app/models/katello/concerns/organization_extensions.rb +274 -0
  507. data/app/models/katello/concerns/user_extensions.rb +453 -0
  508. data/app/models/katello/content_view.rb +446 -0
  509. data/app/models/katello/content_view_definition.rb +328 -0
  510. data/app/models/katello/content_view_definition_archive.rb +21 -0
  511. data/app/models/katello/content_view_definition_base.rb +147 -0
  512. data/app/models/katello/content_view_definition_product.rb +21 -0
  513. data/app/models/katello/content_view_definition_repository.rb +20 -0
  514. data/app/models/katello/content_view_environment.rb +28 -0
  515. data/app/models/katello/content_view_version.rb +209 -0
  516. data/app/models/katello/content_view_version_environment.rb +29 -0
  517. data/app/models/katello/cp_consumer_user.rb +23 -0
  518. data/app/models/katello/custom_info.rb +91 -0
  519. data/app/models/katello/deletion_changeset.rb +81 -0
  520. data/app/models/katello/distribution.rb +17 -0
  521. data/app/models/katello/distributor.rb +141 -0
  522. data/app/models/katello/errata.rb +22 -0
  523. data/app/models/katello/erratum_rule.rb +107 -0
  524. data/app/models/katello/ext/indexed_model.rb +167 -0
  525. data/app/models/katello/ext/label_from_name.rb +29 -0
  526. data/app/models/katello/ext/permission_tag_cleanup.rb +47 -0
  527. data/app/models/katello/filter.rb +102 -0
  528. data/app/models/katello/filter_rule.rb +87 -0
  529. data/app/models/katello/glue.rb +193 -0
  530. data/app/models/katello/glue/candlepin/consumer.rb +629 -0
  531. data/app/models/katello/glue/candlepin/content.rb +144 -0
  532. data/app/models/katello/glue/candlepin/environment.rb +108 -0
  533. data/app/models/katello/glue/candlepin/owner.rb +151 -0
  534. data/app/models/katello/glue/candlepin/owner_info.rb +55 -0
  535. data/app/models/katello/glue/candlepin/pool.rb +181 -0
  536. data/app/models/katello/glue/candlepin/product.rb +365 -0
  537. data/app/models/katello/glue/elastic_search/activation_key.rb +37 -0
  538. data/app/models/katello/glue/elastic_search/changeset.rb +38 -0
  539. data/app/models/katello/glue/elastic_search/content_view.rb +63 -0
  540. data/app/models/katello/glue/elastic_search/content_view_definition.rb +33 -0
  541. data/app/models/katello/glue/elastic_search/distributor.rb +66 -0
  542. data/app/models/katello/glue/elastic_search/environment.rb +35 -0
  543. data/app/models/katello/glue/elastic_search/errata.rb +219 -0
  544. data/app/models/katello/glue/elastic_search/gpg_key.rb +34 -0
  545. data/app/models/katello/glue/elastic_search/items.rb +176 -0
  546. data/app/models/katello/glue/elastic_search/job.rb +35 -0
  547. data/app/models/katello/glue/elastic_search/marketing_product.rb +23 -0
  548. data/app/models/katello/glue/elastic_search/notice.rb +39 -0
  549. data/app/models/katello/glue/elastic_search/organization.rb +35 -0
  550. data/app/models/katello/glue/elastic_search/package.rb +192 -0
  551. data/app/models/katello/glue/elastic_search/package_group.rb +121 -0
  552. data/app/models/katello/glue/elastic_search/permission.rb +28 -0
  553. data/app/models/katello/glue/elastic_search/pool.rb +153 -0
  554. data/app/models/katello/glue/elastic_search/product.rb +66 -0
  555. data/app/models/katello/glue/elastic_search/provider.rb +45 -0
  556. data/app/models/katello/glue/elastic_search/puppet_module.rb +181 -0
  557. data/app/models/katello/glue/elastic_search/repository.rb +225 -0
  558. data/app/models/katello/glue/elastic_search/role.rb +38 -0
  559. data/app/models/katello/glue/elastic_search/sync_plan.rb +33 -0
  560. data/app/models/katello/glue/elastic_search/system.rb +164 -0
  561. data/app/models/katello/glue/elastic_search/system_group.rb +44 -0
  562. data/app/models/katello/glue/elastic_search/task_status.rb +66 -0
  563. data/app/models/katello/glue/elastic_search/user.rb +35 -0
  564. data/app/models/katello/glue/provider.rb +583 -0
  565. data/app/models/katello/glue/pulp/consumer.rb +284 -0
  566. data/app/models/katello/glue/pulp/consumer_group.rb +107 -0
  567. data/app/models/katello/glue/pulp/distribution.rb +51 -0
  568. data/app/models/katello/glue/pulp/errata.rb +156 -0
  569. data/app/models/katello/glue/pulp/package.rb +71 -0
  570. data/app/models/katello/glue/pulp/package_group.rb +61 -0
  571. data/app/models/katello/glue/pulp/pulp_errors.rb +21 -0
  572. data/app/models/katello/glue/pulp/puppet_module.rb +71 -0
  573. data/app/models/katello/glue/pulp/repo.rb +851 -0
  574. data/app/models/katello/glue/pulp/repos.rb +397 -0
  575. data/app/models/katello/glue/pulp/simple_package.rb +25 -0
  576. data/app/models/katello/glue/pulp/user.rb +95 -0
  577. data/app/models/katello/gpg_key.rb +45 -0
  578. data/app/models/katello/hash_util.rb +37 -0
  579. data/app/models/katello/help_tip.rb +20 -0
  580. data/app/models/katello/hypervisor.rb +27 -0
  581. data/app/models/katello/job.rb +216 -0
  582. data/app/models/katello/job_task.rb +20 -0
  583. data/app/models/katello/key_pool.rb +21 -0
  584. data/app/models/katello/key_system_group.rb +21 -0
  585. data/app/models/katello/kt_environment.rb +341 -0
  586. data/app/models/katello/ldap_group_role.rb +21 -0
  587. data/app/models/katello/marketing_engineering_product.rb +20 -0
  588. data/app/models/katello/marketing_product.rb +21 -0
  589. data/app/models/katello/notice.rb +76 -0
  590. data/app/models/katello/organization_destroyer.rb +63 -0
  591. data/app/models/katello/package.rb +19 -0
  592. data/app/models/katello/package_group.rb +19 -0
  593. data/app/models/katello/package_group_rule.rb +32 -0
  594. data/app/models/katello/package_rule.rb +53 -0
  595. data/app/models/katello/permission.rb +178 -0
  596. data/app/models/katello/permission_tag.rb +23 -0
  597. data/app/models/katello/ping.rb +143 -0
  598. data/app/models/katello/pool.rb +64 -0
  599. data/app/models/katello/product.rb +241 -0
  600. data/app/models/katello/promotion_changeset.rb +121 -0
  601. data/app/models/katello/provider.rb +231 -0
  602. data/app/models/katello/proxy_association_owner.rb +20 -0
  603. data/app/models/katello/pulp_sync_status.rb +188 -0
  604. data/app/models/katello/pulp_task_status.rb +119 -0
  605. data/app/models/katello/puppet_module.rb +42 -0
  606. data/app/models/katello/puppet_module_rule.rb +71 -0
  607. data/app/models/katello/repository.rb +342 -0
  608. data/app/models/katello/resource_type.rb +132 -0
  609. data/app/models/katello/role.rb +187 -0
  610. data/app/models/katello/roles_permissions/default_system_registration_permission.rb +48 -0
  611. data/app/models/katello/roles_permissions/user_own_role.rb +45 -0
  612. data/app/models/katello/roles_user.rb +20 -0
  613. data/app/models/katello/search_favorite.rb +38 -0
  614. data/app/models/katello/search_history.rb +21 -0
  615. data/app/models/katello/sync_plan.rb +91 -0
  616. data/app/models/katello/system.rb +276 -0
  617. data/app/models/katello/system_activation_key.rb +20 -0
  618. data/app/models/katello/system_group.rb +197 -0
  619. data/app/models/katello/system_system_group.rb +33 -0
  620. data/app/models/katello/tag.rb +42 -0
  621. data/app/models/katello/task_status.rb +401 -0
  622. data/app/models/katello/user_notice.rb +36 -0
  623. data/app/models/katello/user_own_role.rb +30 -0
  624. data/app/models/katello/verb.rb +51 -0
  625. data/app/models/katello/virtual_tag.rb +27 -0
  626. data/app/overrides/add_organization_attributes.rb +11 -0
  627. data/app/views/katello/activation_keys/_activation_key.html.haml +16 -0
  628. data/app/views/katello/activation_keys/_applied_subscriptions.html.haml +38 -0
  629. data/app/views/katello/activation_keys/_applied_subscriptions_update.js.haml +1 -0
  630. data/app/views/katello/activation_keys/_available_subscriptions.html.haml +29 -0
  631. data/app/views/katello/activation_keys/_available_subscriptions_update.js.haml +1 -0
  632. data/app/views/katello/activation_keys/_edit.html.haml +83 -0
  633. data/app/views/katello/activation_keys/_list_activation_keys.html.haml +5 -0
  634. data/app/views/katello/activation_keys/_new.html.haml +38 -0
  635. data/app/views/katello/activation_keys/_subscriptions.html.haml +52 -0
  636. data/app/views/katello/activation_keys/_system.html.haml +5 -0
  637. data/app/views/katello/activation_keys/_system_group_items.html.haml +7 -0
  638. data/app/views/katello/activation_keys/_system_groups.html.haml +34 -0
  639. data/app/views/katello/activation_keys/_systems.html.haml +27 -0
  640. data/app/views/katello/activation_keys/index.html.haml +16 -0
  641. data/app/views/katello/api/v2/activation_keys/show.json.rabl +9 -0
  642. data/app/views/katello/api/v2/changesets/dependencies.rabl +1 -0
  643. data/app/views/katello/api/v2/changesets/show.json.rabl +41 -0
  644. data/app/views/katello/api/v2/changesets_content/add_product.json.rabl +3 -0
  645. data/app/views/katello/api/v2/changesets_content/add_repo.json.rabl +3 -0
  646. data/app/views/katello/api/v2/changesets_content/remove_product.json.rabl +3 -0
  647. data/app/views/katello/api/v2/changesets_content/remove_repo.json.rabl +3 -0
  648. data/app/views/katello/api/v2/changesets_content/show.json.rabl +3 -0
  649. data/app/views/katello/api/v2/common/_identifier.json.rabl +3 -0
  650. data/app/views/katello/api/v2/common/_metadata.json.rabl +13 -0
  651. data/app/views/katello/api/v2/common/_org_reference.json.rabl +3 -0
  652. data/app/views/katello/api/v2/common/_readonly.json.rabl +3 -0
  653. data/app/views/katello/api/v2/common/_syncable.json.rabl +1 -0
  654. data/app/views/katello/api/v2/common/_timestamps.json.rabl +1 -0
  655. data/app/views/katello/api/v2/common/async.json.rabl +3 -0
  656. data/app/views/katello/api/v2/common/create.json.rabl +3 -0
  657. data/app/views/katello/api/v2/common/destroy.json.rabl +1 -0
  658. data/app/views/katello/api/v2/common/index.json.rabl +7 -0
  659. data/app/views/katello/api/v2/common/status.json.rabl +1 -0
  660. data/app/views/katello/api/v2/common/update.json.rabl +3 -0
  661. data/app/views/katello/api/v2/content_view_definitions/clone.json.rabl +3 -0
  662. data/app/views/katello/api/v2/content_view_definitions/content_views.json.rabl +3 -0
  663. data/app/views/katello/api/v2/content_view_definitions/list_all_products.json.rabl +3 -0
  664. data/app/views/katello/api/v2/content_view_definitions/list_products.json.rabl +3 -0
  665. data/app/views/katello/api/v2/content_view_definitions/list_repositories.json.rabl +3 -0
  666. data/app/views/katello/api/v2/content_view_definitions/show.json.rabl +18 -0
  667. data/app/views/katello/api/v2/content_view_definitions/update_content_views.json.rabl +3 -0
  668. data/app/views/katello/api/v2/content_view_definitions/update_products.json.rabl +3 -0
  669. data/app/views/katello/api/v2/content_view_definitions/update_repositories.json.rabl +3 -0
  670. data/app/views/katello/api/v2/content_views/index.json.rabl +10 -0
  671. data/app/views/katello/api/v2/content_views/show.json.rabl +20 -0
  672. data/app/views/katello/api/v2/custom_info/show.json.rabl +5 -0
  673. data/app/views/katello/api/v2/distributions/show.json.rabl +9 -0
  674. data/app/views/katello/api/v2/distributors/index.json.rabl +9 -0
  675. data/app/views/katello/api/v2/distributors/pools.json.rabl +3 -0
  676. data/app/views/katello/api/v2/distributors/show.json.rabl +3 -0
  677. data/app/views/katello/api/v2/distributors/task.json.rabl +3 -0
  678. data/app/views/katello/api/v2/distributors/tasks.json.rabl +3 -0
  679. data/app/views/katello/api/v2/environments/index.json.rabl +3 -0
  680. data/app/views/katello/api/v2/environments/paths.json.rabl +13 -0
  681. data/app/views/katello/api/v2/environments/releases.json.rabl +3 -0
  682. data/app/views/katello/api/v2/environments/repositories.json.rabl +3 -0
  683. data/app/views/katello/api/v2/environments/show.json.rabl +9 -0
  684. data/app/views/katello/api/v2/errata/_attributes.json.rabl +7 -0
  685. data/app/views/katello/api/v2/errata/index.json.rabl +3 -0
  686. data/app/views/katello/api/v2/errata/show.json.rabl +10 -0
  687. data/app/views/katello/api/v2/filter_rules/show.json.rabl +10 -0
  688. data/app/views/katello/api/v2/filters/list_products.json.rabl +3 -0
  689. data/app/views/katello/api/v2/filters/list_repositories.json.rabl +3 -0
  690. data/app/views/katello/api/v2/filters/show.json.rabl +24 -0
  691. data/app/views/katello/api/v2/filters/update_products.json.rabl +3 -0
  692. data/app/views/katello/api/v2/filters/update_repositories.json.rabl +3 -0
  693. data/app/views/katello/api/v2/gpg_keys/index.json.rabl +3 -0
  694. data/app/views/katello/api/v2/gpg_keys/show.json.rabl +39 -0
  695. data/app/views/katello/api/v2/layouts/collection.json.haml +3 -0
  696. data/app/views/katello/api/v2/layouts/resource.json.haml +5 -0
  697. data/app/views/katello/api/v2/organization_default_info/apply_to_all.json.rabl +3 -0
  698. data/app/views/katello/api/v2/organization_default_info/create.json.rabl +5 -0
  699. data/app/views/katello/api/v2/organizations/index.json.rabl +5 -0
  700. data/app/views/katello/api/v2/organizations/show.json.rabl +7 -0
  701. data/app/views/katello/api/v2/packages/show.json.rabl +15 -0
  702. data/app/views/katello/api/v2/permissions/show.json.rabl +13 -0
  703. data/app/views/katello/api/v2/ping/server_status.json.rabl +4 -0
  704. data/app/views/katello/api/v2/ping/show.json.rabl +6 -0
  705. data/app/views/katello/api/v2/ping/version.json.rabl +4 -0
  706. data/app/views/katello/api/v2/products/index.json.rabl +3 -0
  707. data/app/views/katello/api/v2/products/repositories.json.rabl +6 -0
  708. data/app/views/katello/api/v2/products/show.json.rabl +38 -0
  709. data/app/views/katello/api/v2/providers/_provider.json.rabl +14 -0
  710. data/app/views/katello/api/v2/providers/index.json.rabl +3 -0
  711. data/app/views/katello/api/v2/providers/products.json.rabl +3 -0
  712. data/app/views/katello/api/v2/providers/show.json.rabl +3 -0
  713. data/app/views/katello/api/v2/repositories/index.json.rabl +3 -0
  714. data/app/views/katello/api/v2/repositories/package_group_categories.json.rabl +5 -0
  715. data/app/views/katello/api/v2/repositories/package_groups.json.rabl +9 -0
  716. data/app/views/katello/api/v2/repositories/show.json.rabl +39 -0
  717. data/app/views/katello/api/v2/repositories/sync.json.rabl +3 -0
  718. data/app/views/katello/api/v2/repository_sets/index.json.rabl +3 -0
  719. data/app/views/katello/api/v2/repository_sets/show.json.rabl +8 -0
  720. data/app/views/katello/api/v2/role_ldap_groups/show.json.rabl +4 -0
  721. data/app/views/katello/api/v2/roles/available_verbs.json.rabl +3 -0
  722. data/app/views/katello/api/v2/roles/show.json.rabl +4 -0
  723. data/app/views/katello/api/v2/root/resource_list.json.rabl +3 -0
  724. data/app/views/katello/api/v2/subscriptions/create.json.rabl +3 -0
  725. data/app/views/katello/api/v2/subscriptions/destroy.json.rabl +1 -0
  726. data/app/views/katello/api/v2/subscriptions/destroy_all.json.rabl +1 -0
  727. data/app/views/katello/api/v2/subscriptions/destroy_by_serial.json.rabl +1 -0
  728. data/app/views/katello/api/v2/subscriptions/index.json.rabl +10 -0
  729. data/app/views/katello/api/v2/subscriptions/organization_index.json.rabl +10 -0
  730. data/app/views/katello/api/v2/subscriptions/show.json.rabl +35 -0
  731. data/app/views/katello/api/v2/sync/create.json.rabl +3 -0
  732. data/app/views/katello/api/v2/sync/index.json.rabl +3 -0
  733. data/app/views/katello/api/v2/sync_plans/show.json.rabl +8 -0
  734. data/app/views/katello/api/v2/system_errata/show.json.rabl +3 -0
  735. data/app/views/katello/api/v2/system_errata/system_task.json.rabl +3 -0
  736. data/app/views/katello/api/v2/system_group_errata/index.json.rabl +3 -0
  737. data/app/views/katello/api/v2/system_groups/_system_group.json.rabl +16 -0
  738. data/app/views/katello/api/v2/system_groups/copy.json.rabl +3 -0
  739. data/app/views/katello/api/v2/system_groups/create.json.rabl +3 -0
  740. data/app/views/katello/api/v2/system_groups/delta_systems.rabl +4 -0
  741. data/app/views/katello/api/v2/system_groups/history.json.rabl +3 -0
  742. data/app/views/katello/api/v2/system_groups/history_show.json.rabl +5 -0
  743. data/app/views/katello/api/v2/system_groups/index.json.rabl +3 -0
  744. data/app/views/katello/api/v2/system_groups/show.json.rabl +3 -0
  745. data/app/views/katello/api/v2/system_groups/systems.json.rabl +14 -0
  746. data/app/views/katello/api/v2/system_groups/update.json.rabl +3 -0
  747. data/app/views/katello/api/v2/system_packages/system_task.json.rabl +3 -0
  748. data/app/views/katello/api/v2/systems/_pool.json.rabl +6 -0
  749. data/app/views/katello/api/v2/systems/activate.json.rabl +3 -0
  750. data/app/views/katello/api/v2/systems/add_system_groups.json.rabl +3 -0
  751. data/app/views/katello/api/v2/systems/available_system_groups.json.rabl +5 -0
  752. data/app/views/katello/api/v2/systems/enabled_repos.json.rabl +3 -0
  753. data/app/views/katello/api/v2/systems/errata.json.rabl +7 -0
  754. data/app/views/katello/api/v2/systems/erratum.json.rabl +10 -0
  755. data/app/views/katello/api/v2/systems/index.json.rabl +3 -0
  756. data/app/views/katello/api/v2/systems/package.json.rabl +5 -0
  757. data/app/views/katello/api/v2/systems/package_profile.json.rabl +7 -0
  758. data/app/views/katello/api/v2/systems/pools.json.rabl +7 -0
  759. data/app/views/katello/api/v2/systems/regenerate_identity_certificates.json.rabl +3 -0
  760. data/app/views/katello/api/v2/systems/releases.json.rabl +9 -0
  761. data/app/views/katello/api/v2/systems/remove_system_groups.json.rabl +3 -0
  762. data/app/views/katello/api/v2/systems/show.json.rabl +56 -0
  763. data/app/views/katello/api/v2/systems/tasks.json.rabl +7 -0
  764. data/app/views/katello/api/v2/systems/upload_package_profile.json.rabl +3 -0
  765. data/app/views/katello/api/v2/systems_bulk_actions/applicable_errata.json.rabl +7 -0
  766. data/app/views/katello/api/v2/systems_bulk_actions/bulk_action.json.rabl +5 -0
  767. data/app/views/katello/api/v2/systems_bulk_actions/erratum.json.rabl +1 -0
  768. data/app/views/katello/api/v2/systems_bulk_actions/job.json.rabl +2 -0
  769. data/app/views/katello/api/v2/tasks/show.json.rabl +15 -0
  770. data/app/views/katello/api/v2/uebercerts/show.json.rabl +15 -0
  771. data/app/views/katello/api/v2/users/list_owners.json.rabl +4 -0
  772. data/app/views/katello/api/v2/users/list_roles.json.rabl +3 -0
  773. data/app/views/katello/api/v2/users/show.json.rabl +12 -0
  774. data/app/views/katello/application_info/about.html.haml +58 -0
  775. data/app/views/katello/changesets/_content_type.html.haml +13 -0
  776. data/app/views/katello/changesets/_dependency_list.html.haml +3 -0
  777. data/app/views/katello/changesets/_edit.html.haml +54 -0
  778. data/app/views/katello/changesets/_list.html.haml +3 -0
  779. data/app/views/katello/changesets/_name.html.haml +7 -0
  780. data/app/views/katello/changesets/_new.html.haml +35 -0
  781. data/app/views/katello/changesets/_warning.html.haml +23 -0
  782. data/app/views/katello/changesets/index.html.haml +9 -0
  783. data/app/views/katello/common/400.html.haml +5 -0
  784. data/app/views/katello/common/403.html.haml +8 -0
  785. data/app/views/katello/common/404.html.haml +7 -0
  786. data/app/views/katello/common/500.html.haml +15 -0
  787. data/app/views/katello/common/_ajax_notices.haml +5 -0
  788. data/app/views/katello/common/_common_i18n.html.haml +45 -0
  789. data/app/views/katello/common/_common_product_repo_selector.html.haml +65 -0
  790. data/app/views/katello/common/_common_products.html.haml +24 -0
  791. data/app/views/katello/common/_config.html.haml +8 -0
  792. data/app/views/katello/common/_edit_i18n.html.haml +12 -0
  793. data/app/views/katello/common/_env_select.html.haml +40 -0
  794. data/app/views/katello/common/_filter_table.html.haml +5 -0
  795. data/app/views/katello/common/_footer.haml +7 -0
  796. data/app/views/katello/common/_helptip.html.haml +4 -0
  797. data/app/views/katello/common/_helptip_button.html.haml +3 -0
  798. data/app/views/katello/common/_list_item.html.haml +6 -0
  799. data/app/views/katello/common/_list_items.html.haml +2 -0
  800. data/app/views/katello/common/_list_remove.js.haml +3 -0
  801. data/app/views/katello/common/_list_update.html.haml +4 -0
  802. data/app/views/katello/common/_notification.haml +29 -0
  803. data/app/views/katello/common/_one_panel.html.haml +15 -0
  804. data/app/views/katello/common/_one_panel_list_item.haml +5 -0
  805. data/app/views/katello/common/_package_actions_i18n.html.haml +7 -0
  806. data/app/views/katello/common/_panel.html.haml +75 -0
  807. data/app/views/katello/common/_post_action_close_subpanel.js.haml +2 -0
  808. data/app/views/katello/common/_post_delete_close_subpanel.js.haml +2 -0
  809. data/app/views/katello/common/_repo_selector.html.haml +27 -0
  810. data/app/views/katello/common/_search.html.haml +17 -0
  811. data/app/views/katello/common/_stats_line.html.haml +3 -0
  812. data/app/views/katello/common/_tupane.html.haml +10 -0
  813. data/app/views/katello/content_search/_browser_box.html.haml +159 -0
  814. data/app/views/katello/content_search/_container_hover.html.haml +32 -0
  815. data/app/views/katello/content_search/_grid.html.haml +60 -0
  816. data/app/views/katello/content_search/_repo_hover.html.haml +25 -0
  817. data/app/views/katello/content_search/index.html.haml +33 -0
  818. data/app/views/katello/content_view_definitions/_composite_definition_content.html.haml +23 -0
  819. data/app/views/katello/content_view_definitions/_edit.html.haml +24 -0
  820. data/app/views/katello/content_view_definitions/_new.html.haml +37 -0
  821. data/app/views/katello/content_view_definitions/_publish.html.haml +20 -0
  822. data/app/views/katello/content_view_definitions/_single_definition_content.html.haml +21 -0
  823. data/app/views/katello/content_view_definitions/_tupane_header.html.haml +22 -0
  824. data/app/views/katello/content_view_definitions/_view_definitions.html.haml +31 -0
  825. data/app/views/katello/content_view_definitions/filters/_edit.html.haml +46 -0
  826. data/app/views/katello/content_view_definitions/filters/_index.html.haml +38 -0
  827. data/app/views/katello/content_view_definitions/filters/_list_rules.html.haml +35 -0
  828. data/app/views/katello/content_view_definitions/filters/_new.html.haml +15 -0
  829. data/app/views/katello/content_view_definitions/filters/rules/_edit.html.haml +40 -0
  830. data/app/views/katello/content_view_definitions/filters/rules/_edit_errata.html.haml +27 -0
  831. data/app/views/katello/content_view_definitions/filters/rules/_edit_errata_parameters.html.haml +24 -0
  832. data/app/views/katello/content_view_definitions/filters/rules/_errata_item.html.haml +7 -0
  833. data/app/views/katello/content_view_definitions/filters/rules/_inclusion.html.haml +20 -0
  834. data/app/views/katello/content_view_definitions/filters/rules/_new.html.haml +26 -0
  835. data/app/views/katello/content_view_definitions/filters/rules/_package_group_item.html.haml +7 -0
  836. data/app/views/katello/content_view_definitions/filters/rules/_package_item.html.haml +11 -0
  837. data/app/views/katello/content_view_definitions/filters/rules/_parameter_list.html.haml +37 -0
  838. data/app/views/katello/content_view_definitions/filters/rules/_puppet_module_item.html.haml +20 -0
  839. data/app/views/katello/content_view_definitions/filters/rules/_version_selector.html.haml +32 -0
  840. data/app/views/katello/content_view_definitions/index.html.haml +12 -0
  841. data/app/views/katello/content_view_definitions/views/_index.html.haml +28 -0
  842. data/app/views/katello/content_view_definitions/views/_version.html.haml +21 -0
  843. data/app/views/katello/content_view_definitions/views/_view.html.haml +19 -0
  844. data/app/views/katello/content_view_versions/_content.html.haml +39 -0
  845. data/app/views/katello/content_view_versions/_show.html.haml +27 -0
  846. data/app/views/katello/custom_info/_edit.html.haml +35 -0
  847. data/app/views/katello/dashboard/_ajax_entry.html.haml +11 -0
  848. data/app/views/katello/dashboard/_content_views.haml +19 -0
  849. data/app/views/katello/dashboard/_entry.html.haml +9 -0
  850. data/app/views/katello/dashboard/_errata.haml +23 -0
  851. data/app/views/katello/dashboard/_notices.html.haml +11 -0
  852. data/app/views/katello/dashboard/_promotions.haml +22 -0
  853. data/app/views/katello/dashboard/_subscriptions.haml +45 -0
  854. data/app/views/katello/dashboard/_subscriptions_totals.haml +19 -0
  855. data/app/views/katello/dashboard/_sync.haml +37 -0
  856. data/app/views/katello/dashboard/_system_group_item.html.haml +18 -0
  857. data/app/views/katello/dashboard/_system_groups.html.haml +31 -0
  858. data/app/views/katello/dashboard/_systems.html.haml +22 -0
  859. data/app/views/katello/dashboard/index.html.haml +22 -0
  860. data/app/views/katello/distributor_events/_details.html.haml +32 -0
  861. data/app/views/katello/distributor_events/_event_items.html.haml +27 -0
  862. data/app/views/katello/distributor_events/_events.html.haml +36 -0
  863. data/app/views/katello/distributor_events/_more_events.html.haml +3 -0
  864. data/app/views/katello/distributors/_actions.html.haml +23 -0
  865. data/app/views/katello/distributors/_distributor_tupane_header_nav.html.haml +10 -0
  866. data/app/views/katello/distributors/_edit.html.haml +74 -0
  867. data/app/views/katello/distributors/_edit_custom_info.html.haml +10 -0
  868. data/app/views/katello/distributors/_list_distributor.html.haml +2 -0
  869. data/app/views/katello/distributors/_list_distributor_show.html.haml +19 -0
  870. data/app/views/katello/distributors/_list_distributors.html.haml +1 -0
  871. data/app/views/katello/distributors/_more_products.html.haml +5 -0
  872. data/app/views/katello/distributors/_new.html.haml +44 -0
  873. data/app/views/katello/distributors/_products.html.haml +23 -0
  874. data/app/views/katello/distributors/_subs.html.haml +149 -0
  875. data/app/views/katello/distributors/_subs_update.js.haml +1 -0
  876. data/app/views/katello/distributors/_subscription_details.html.haml +23 -0
  877. data/app/views/katello/distributors/_subscriptions.html.haml +22 -0
  878. data/app/views/katello/distributors/index.html.haml +11 -0
  879. data/app/views/katello/environments/_edit.html.haml +40 -0
  880. data/app/views/katello/environments/_new.html.haml +26 -0
  881. data/app/views/katello/environments/_products.html.haml +4 -0
  882. data/app/views/katello/errata/_packages.html.haml +30 -0
  883. data/app/views/katello/errata/_short_details.html.haml +44 -0
  884. data/app/views/katello/errata/_show.html.haml +85 -0
  885. data/app/views/katello/layouts/katello.haml +27 -0
  886. data/app/views/katello/layouts/tupane_layout.html.haml +39 -0
  887. data/app/views/katello/nodes/_list.html.haml +5 -0
  888. data/app/views/katello/nodes/index.html.haml +1 -0
  889. data/app/views/katello/nodes/show.html.haml +7 -0
  890. data/app/views/katello/notices/_delete_all.js.haml +1 -0
  891. data/app/views/katello/notices/show.html.haml +46 -0
  892. data/app/views/katello/operations/index.html.haml +2 -0
  893. data/app/views/katello/organizations/_default_info.html.haml +43 -0
  894. data/app/views/katello/organizations/_download_debug_certificate.html.haml +14 -0
  895. data/app/views/katello/organizations/_edit.html.haml +87 -0
  896. data/app/views/katello/organizations/_edit_override.html.erb +20 -0
  897. data/app/views/katello/organizations/_environments.html.haml +2 -0
  898. data/app/views/katello/organizations/_events.html.haml +29 -0
  899. data/app/views/katello/organizations/_footer.html.haml +15 -0
  900. data/app/views/katello/organizations/_new.html.haml +39 -0
  901. data/app/views/katello/organizations/_post_delete.js.haml +3 -0
  902. data/app/views/katello/organizations/_step_1_override.html.erb +6 -0
  903. data/app/views/katello/organizations/index.html.haml +16 -0
  904. data/app/views/katello/packages/_changelog.html.haml +15 -0
  905. data/app/views/katello/packages/_dependencies.html.haml +27 -0
  906. data/app/views/katello/packages/_details.html.haml +94 -0
  907. data/app/views/katello/packages/_filelist.html.haml +15 -0
  908. data/app/views/katello/packages/_show.html.haml +90 -0
  909. data/app/views/katello/products/_edit.html.haml +38 -0
  910. data/app/views/katello/products/_new.html.haml +27 -0
  911. data/app/views/katello/promotions/_content_views.html.haml +28 -0
  912. data/app/views/katello/promotions/_detail.html.haml +9 -0
  913. data/app/views/katello/promotions/show.html.haml +204 -0
  914. data/app/views/katello/providers/_edit.html.haml +32 -0
  915. data/app/views/katello/providers/_form.html.haml +8 -0
  916. data/app/views/katello/providers/_new.html.haml +11 -0
  917. data/app/views/katello/providers/_new_discovered_repos.html.haml +81 -0
  918. data/app/views/katello/providers/_products_repos.html.haml +50 -0
  919. data/app/views/katello/providers/_remove_item.html.haml +16 -0
  920. data/app/views/katello/providers/_repo_discovery.html.haml +57 -0
  921. data/app/views/katello/providers/index.html.haml +17 -0
  922. data/app/views/katello/providers/redhat/_children.html.haml +22 -0
  923. data/app/views/katello/providers/redhat/_repo_sets.haml +44 -0
  924. data/app/views/katello/providers/redhat/_repos.html.haml +16 -0
  925. data/app/views/katello/providers/redhat/_tab.html.haml +8 -0
  926. data/app/views/katello/providers/redhat/show.html.haml +31 -0
  927. data/app/views/katello/puppet_modules/_show.html.haml +88 -0
  928. data/app/views/katello/repositories/_edit.html.haml +64 -0
  929. data/app/views/katello/repositories/_new.html.haml +60 -0
  930. data/app/views/katello/roles/_closed_permission.html.haml +22 -0
  931. data/app/views/katello/roles/_edit.html.haml +117 -0
  932. data/app/views/katello/roles/_list_role.html.haml +6 -0
  933. data/app/views/katello/roles/_list_roles.html.haml +1 -0
  934. data/app/views/katello/roles/_new.html.haml +12 -0
  935. data/app/views/katello/roles/_permission.html.haml +47 -0
  936. data/app/views/katello/roles/_permissions.html.haml +6 -0
  937. data/app/views/katello/roles/_self_role_edit.html.haml +37 -0
  938. data/app/views/katello/roles/index.html.haml +55 -0
  939. data/app/views/katello/subscriptions/_consumers.html.haml +53 -0
  940. data/app/views/katello/subscriptions/_edit.html.haml +119 -0
  941. data/app/views/katello/subscriptions/_edit_manifest.html.haml +59 -0
  942. data/app/views/katello/subscriptions/_history.html.haml +32 -0
  943. data/app/views/katello/subscriptions/_history_items.html.haml +33 -0
  944. data/app/views/katello/subscriptions/_list_subscription.html.haml +3 -0
  945. data/app/views/katello/subscriptions/_list_subscription_show.html.haml +21 -0
  946. data/app/views/katello/subscriptions/_list_subscriptions.html.haml +1 -0
  947. data/app/views/katello/subscriptions/_new.html.haml +134 -0
  948. data/app/views/katello/subscriptions/_products.html.haml +52 -0
  949. data/app/views/katello/subscriptions/_subscriptions_tupane_header_nav.html.haml +5 -0
  950. data/app/views/katello/subscriptions/_subscriptions_tupane_header_new_nav.html.haml +2 -0
  951. data/app/views/katello/subscriptions/index.html.haml +4 -0
  952. data/app/views/katello/subscriptions/index_nutupane.html.haml +15 -0
  953. data/app/views/katello/sync_management/_children.html.haml +13 -0
  954. data/app/views/katello/sync_management/_controls.html.haml +14 -0
  955. data/app/views/katello/sync_management/_product.html.haml +21 -0
  956. data/app/views/katello/sync_management/_products.html.haml +21 -0
  957. data/app/views/katello/sync_management/_repo.html.haml +26 -0
  958. data/app/views/katello/sync_management/_sync_plans.html.haml +16 -0
  959. data/app/views/katello/sync_management/index.html.haml +22 -0
  960. data/app/views/katello/sync_management/manage.html.haml +25 -0
  961. data/app/views/katello/sync_plans/_edit.html.haml +32 -0
  962. data/app/views/katello/sync_plans/_form.html.haml +14 -0
  963. data/app/views/katello/sync_plans/_new.html.haml +9 -0
  964. data/app/views/katello/sync_plans/index.html.haml +5 -0
  965. data/app/views/katello/sync_schedules/index.html.haml +15 -0
  966. data/app/views/katello/system_events/_details.html.haml +34 -0
  967. data/app/views/katello/system_events/_event_items.html.haml +27 -0
  968. data/app/views/katello/system_events/_events.html.haml +36 -0
  969. data/app/views/katello/system_events/_more_events.html.haml +3 -0
  970. data/app/views/katello/system_groups/_edit.html.haml +52 -0
  971. data/app/views/katello/system_groups/_edit_systems.html.haml +32 -0
  972. data/app/views/katello/system_groups/_list_group.html.haml +4 -0
  973. data/app/views/katello/system_groups/_list_groups.html.haml +1 -0
  974. data/app/views/katello/system_groups/_new.html.haml +50 -0
  975. data/app/views/katello/system_groups/_system_item.html.haml +16 -0
  976. data/app/views/katello/system_groups/_systems.html.haml +67 -0
  977. data/app/views/katello/system_groups/_tupane_header.html.haml +15 -0
  978. data/app/views/katello/system_groups/errata/_index.html.haml +72 -0
  979. data/app/views/katello/system_groups/events/_index.html.haml +33 -0
  980. data/app/views/katello/system_groups/events/_items.html.haml +29 -0
  981. data/app/views/katello/system_groups/events/_more_items.html.haml +3 -0
  982. data/app/views/katello/system_groups/events/_show.html.haml +29 -0
  983. data/app/views/katello/system_groups/events/_system_items.html.haml +27 -0
  984. data/app/views/katello/system_groups/events/_systems.html.haml +15 -0
  985. data/app/views/katello/system_groups/index.html.haml +24 -0
  986. data/app/views/katello/system_groups/packages/_index.html.haml +70 -0
  987. data/app/views/katello/system_groups/packages/_items.html.haml +30 -0
  988. data/app/views/katello/system_groups/packages/_status.html.haml +5 -0
  989. data/app/views/katello/system_packages/_package_items.html.haml +43 -0
  990. data/app/views/katello/system_packages/_packages.html.haml +132 -0
  991. data/app/views/katello/systems/_actions.html.haml +96 -0
  992. data/app/views/katello/systems/_edit.html.haml +229 -0
  993. data/app/views/katello/systems/_edit_custom_info.html.haml +10 -0
  994. data/app/views/katello/systems/_facts.html.haml +33 -0
  995. data/app/views/katello/systems/_hypervisor.html.haml +7 -0
  996. data/app/views/katello/systems/_list_system.html.haml +2 -0
  997. data/app/views/katello/systems/_list_system_show.html.haml +25 -0
  998. data/app/views/katello/systems/_list_systems.html.haml +1 -0
  999. data/app/views/katello/systems/_more_products.html.haml +9 -0
  1000. data/app/views/katello/systems/_new.html.haml +20 -0
  1001. data/app/views/katello/systems/_products.html.haml +23 -0
  1002. data/app/views/katello/systems/_subs.html.haml +144 -0
  1003. data/app/views/katello/systems/_subs_update.js.haml +1 -0
  1004. data/app/views/katello/systems/_subscription_details.html.haml +23 -0
  1005. data/app/views/katello/systems/_subscriptions.html.haml +28 -0
  1006. data/app/views/katello/systems/_system_group_items.html.haml +7 -0
  1007. data/app/views/katello/systems/_system_groups.html.haml +26 -0
  1008. data/app/views/katello/systems/_system_tupane_header_nav.html.haml +10 -0
  1009. data/app/views/katello/systems/errata/_index.html.haml +62 -0
  1010. data/app/views/katello/systems/errata/_items.html.haml +21 -0
  1011. data/app/views/katello/systems/index.html.haml +47 -0
  1012. data/app/views/katello/systems/new_nutupane.html.haml +52 -0
  1013. data/app/views/katello/systems/show_nutupane.html.haml +199 -0
  1014. data/app/views/katello/user_mailer/logins.text.haml +3 -0
  1015. data/app/views/katello/users/_edit.html.haml +14 -0
  1016. data/app/views/katello/users/_edit_environment.html.haml +46 -0
  1017. data/app/views/katello/users/_edit_form.html.haml +70 -0
  1018. data/app/views/katello/users/index.html.haml +8 -0
  1019. data/app/views/katello/users/show.html.haml +3 -0
  1020. data/app/views/katello/welcome/show.html.haml +15 -0
  1021. data/config/boot.rb +18 -0
  1022. data/config/candlepin-ca.crt +15 -0
  1023. data/config/compass.rb +6 -0
  1024. data/config/database.yml +1 -0
  1025. data/config/initializers/active_record.rb +1 -0
  1026. data/config/initializers/active_resource.rb +1 -0
  1027. data/config/initializers/apipie.rb +144 -0
  1028. data/config/initializers/backtrace_silencers.rb +7 -0
  1029. data/config/initializers/db_setup_check.rb +4 -0
  1030. data/config/initializers/delayed_job.rb +16 -0
  1031. data/config/initializers/inflections.rb +13 -0
  1032. data/config/initializers/mime_types.rb +7 -0
  1033. data/config/initializers/monkeys.rb +2 -0
  1034. data/config/initializers/multipart_json_fix.rb +15 -0
  1035. data/config/initializers/openstruct.rb +12 -0
  1036. data/config/initializers/quiet_paths.rb +19 -0
  1037. data/config/initializers/rabl_init.rb +23 -0
  1038. data/config/initializers/runcible.rb +14 -0
  1039. data/config/initializers/session_store.rb +6 -0
  1040. data/config/initializers/sig_ttin_trap.rb +17 -0
  1041. data/config/initializers/simple_navigation.rb +1 -0
  1042. data/config/initializers/tire.rb +4 -0
  1043. data/config/katello.yml +0 -0
  1044. data/config/katello_defaults.yml +369 -0
  1045. data/config/locales/README +10 -0
  1046. data/config/locales/bn.yml +182 -0
  1047. data/config/locales/compare_upstream.sh +21 -0
  1048. data/config/locales/cs.yml +211 -0
  1049. data/config/locales/de.yml +203 -0
  1050. data/config/locales/en.yml +205 -0
  1051. data/config/locales/es.yml +199 -0
  1052. data/config/locales/fr.yml +222 -0
  1053. data/config/locales/gu.yml +181 -0
  1054. data/config/locales/hi.yml +199 -0
  1055. data/config/locales/it.yml +205 -0
  1056. data/config/locales/ja.yml +197 -0
  1057. data/config/locales/kn.yml +199 -0
  1058. data/config/locales/ko.yml +197 -0
  1059. data/config/locales/mr.yml +178 -0
  1060. data/config/locales/or.yml +181 -0
  1061. data/config/locales/pa.yml +181 -0
  1062. data/config/locales/pt-BR.yml +207 -0
  1063. data/config/locales/pt.yml +207 -0
  1064. data/config/locales/ru.yml +257 -0
  1065. data/config/locales/ta.yml +181 -0
  1066. data/config/locales/te.yml +181 -0
  1067. data/config/locales/update.sh +14 -0
  1068. data/config/locales/zh-CN.yml +199 -0
  1069. data/config/locales/zh-TW.yml +199 -0
  1070. data/config/navigation.rb +0 -0
  1071. data/config/routes.rb +503 -0
  1072. data/config/routes/api/v1.rb +375 -0
  1073. data/config/routes/api/v2.rb +392 -0
  1074. data/config/routes/mount_engine.rb +3 -0
  1075. data/db/migrate/20131014135042_katello_tables.rb +672 -0
  1076. data/db/migrate/20131014225132_add_users_fields.rb +13 -0
  1077. data/db/migrate/20131120225132_add_organization_fields.rb +15 -0
  1078. data/db/products.json +118 -0
  1079. data/db/seeds.rb +61 -0
  1080. data/engines/bastion/Bastion.gemspec +21 -0
  1081. data/engines/bastion/README.md +297 -0
  1082. data/engines/bastion/app/assets/bastion/bastion.js +95 -0
  1083. data/engines/bastion/app/assets/bastion/bastion.module.js +141 -0
  1084. data/engines/bastion/app/assets/bastion/content-views/content-view.factory.js +38 -0
  1085. data/engines/bastion/app/assets/bastion/content-views/content-views.module.js +25 -0
  1086. data/engines/bastion/app/assets/bastion/environments/environment.factory.js +38 -0
  1087. data/engines/bastion/app/assets/bastion/environments/environments.controller.js +58 -0
  1088. data/engines/bastion/app/assets/bastion/environments/environments.module.js +44 -0
  1089. data/engines/bastion/app/assets/bastion/environments/path.controller.js +149 -0
  1090. data/engines/bastion/app/assets/bastion/environments/views/environments.html +165 -0
  1091. data/engines/bastion/app/assets/bastion/errata/errata.module.js +23 -0
  1092. data/engines/bastion/app/assets/bastion/errata/erratum.factory.js +31 -0
  1093. data/engines/bastion/app/assets/bastion/gpg-keys/details/gpg-key-details-info.controller.js +52 -0
  1094. data/engines/bastion/app/assets/bastion/gpg-keys/details/gpg-key-details.controller.js +62 -0
  1095. data/engines/bastion/app/assets/bastion/gpg-keys/details/views/gpg-key-details.html +48 -0
  1096. data/engines/bastion/app/assets/bastion/gpg-keys/details/views/gpg-key-info.html +39 -0
  1097. data/engines/bastion/app/assets/bastion/gpg-keys/details/views/gpg-key-products.html +29 -0
  1098. data/engines/bastion/app/assets/bastion/gpg-keys/details/views/gpg-key-repositories.html +33 -0
  1099. data/engines/bastion/app/assets/bastion/gpg-keys/gpg-key.factory.js +36 -0
  1100. data/engines/bastion/app/assets/bastion/gpg-keys/gpg-keys.controller.js +64 -0
  1101. data/engines/bastion/app/assets/bastion/gpg-keys/gpg-keys.module.js +98 -0
  1102. data/engines/bastion/app/assets/bastion/gpg-keys/new/new-gpg-key.controller.js +51 -0
  1103. data/engines/bastion/app/assets/bastion/gpg-keys/new/views/gpg-key-new.html +72 -0
  1104. data/engines/bastion/app/assets/bastion/gpg-keys/views/gpg-keys-table-collapsed.html +15 -0
  1105. data/engines/bastion/app/assets/bastion/gpg-keys/views/gpg-keys-table-full.html +21 -0
  1106. data/engines/bastion/app/assets/bastion/gpg-keys/views/gpg-keys.html +14 -0
  1107. data/engines/bastion/app/assets/bastion/i18n/i18n.module.js +24 -0
  1108. data/engines/bastion/app/assets/bastion/i18n/katello.pot +968 -0
  1109. data/engines/bastion/app/assets/bastion/i18n/translations.js +3 -0
  1110. data/engines/bastion/app/assets/bastion/images/favicon.png +0 -0
  1111. data/engines/bastion/app/assets/bastion/incubator/alch-alert.directive.js +67 -0
  1112. data/engines/bastion/app/assets/bastion/incubator/alch-container-scroll.directive.js +43 -0
  1113. data/engines/bastion/app/assets/bastion/incubator/alch-dropdown.directive.js +28 -0
  1114. data/engines/bastion/app/assets/bastion/incubator/alch-edit.directive.js +348 -0
  1115. data/engines/bastion/app/assets/bastion/incubator/alch-flyout.directive.js +19 -0
  1116. data/engines/bastion/app/assets/bastion/incubator/alch-form-buttons.directive.js +56 -0
  1117. data/engines/bastion/app/assets/bastion/incubator/alch-form-group.directive.js +82 -0
  1118. data/engines/bastion/app/assets/bastion/incubator/alch-infinite-scroll.directive.js +84 -0
  1119. data/engines/bastion/app/assets/bastion/incubator/alch-menu.directive.js +56 -0
  1120. data/engines/bastion/app/assets/bastion/incubator/alch-modal.directive.js +80 -0
  1121. data/engines/bastion/app/assets/bastion/incubator/alch-save-control.directive.js +42 -0
  1122. data/engines/bastion/app/assets/bastion/incubator/alch-table.directive.js +219 -0
  1123. data/engines/bastion/app/assets/bastion/incubator/format/alch-format.module.js +21 -0
  1124. data/engines/bastion/app/assets/bastion/incubator/format/array-to-string.filter.js +30 -0
  1125. data/engines/bastion/app/assets/bastion/incubator/format/boolean-to-yes-no.filter.js +34 -0
  1126. data/engines/bastion/app/assets/bastion/incubator/format/default-number-string.filter.js +34 -0
  1127. data/engines/bastion/app/assets/bastion/incubator/format/key-value-to-string.filter.js +40 -0
  1128. data/engines/bastion/app/assets/bastion/incubator/format/unlimitedFilter.filter.js +33 -0
  1129. data/engines/bastion/app/assets/bastion/incubator/stylesheets/alch-edit.scss +34 -0
  1130. data/engines/bastion/app/assets/bastion/incubator/stylesheets/header.scss +207 -0
  1131. data/engines/bastion/app/assets/bastion/incubator/views/alch-alert.html +6 -0
  1132. data/engines/bastion/app/assets/bastion/incubator/views/alch-dropdown.html +19 -0
  1133. data/engines/bastion/app/assets/bastion/incubator/views/alch-edit-add-item.html +21 -0
  1134. data/engines/bastion/app/assets/bastion/incubator/views/alch-edit-add-remove-cancel.html +28 -0
  1135. data/engines/bastion/app/assets/bastion/incubator/views/alch-edit-checkbox.html +6 -0
  1136. data/engines/bastion/app/assets/bastion/incubator/views/alch-edit-custom.html +6 -0
  1137. data/engines/bastion/app/assets/bastion/incubator/views/alch-edit-multiselect.html +17 -0
  1138. data/engines/bastion/app/assets/bastion/incubator/views/alch-edit-save-cancel.html +20 -0
  1139. data/engines/bastion/app/assets/bastion/incubator/views/alch-edit-select.html +10 -0
  1140. data/engines/bastion/app/assets/bastion/incubator/views/alch-edit-text.html +6 -0
  1141. data/engines/bastion/app/assets/bastion/incubator/views/alch-edit-textarea.html +6 -0
  1142. data/engines/bastion/app/assets/bastion/incubator/views/alch-edit.html +18 -0
  1143. data/engines/bastion/app/assets/bastion/incubator/views/alch-flyout.html +10 -0
  1144. data/engines/bastion/app/assets/bastion/incubator/views/alch-form-buttons.html +10 -0
  1145. data/engines/bastion/app/assets/bastion/incubator/views/alch-form-group.html +9 -0
  1146. data/engines/bastion/app/assets/bastion/incubator/views/alch-menu.html +18 -0
  1147. data/engines/bastion/app/assets/bastion/incubator/views/alch-modal-remove.html +13 -0
  1148. data/engines/bastion/app/assets/bastion/layouts/details-nutupane.html +57 -0
  1149. data/engines/bastion/app/assets/bastion/layouts/nutupane.html +63 -0
  1150. data/engines/bastion/app/assets/bastion/layouts/select-all-results.html +9 -0
  1151. data/engines/bastion/app/assets/bastion/menu/menu-expander.service.js +51 -0
  1152. data/engines/bastion/app/assets/bastion/menu/menu.module.js +25 -0
  1153. data/engines/bastion/app/assets/bastion/nodes/node.factory.js +31 -0
  1154. data/engines/bastion/app/assets/bastion/nodes/nodes.module.js +23 -0
  1155. data/engines/bastion/app/assets/bastion/organizations/organization.factory.js +37 -0
  1156. data/engines/bastion/app/assets/bastion/organizations/organizations.module.js +23 -0
  1157. data/engines/bastion/app/assets/bastion/products/details/product-details-info.controller.js +71 -0
  1158. data/engines/bastion/app/assets/bastion/products/details/product-details.controller.js +51 -0
  1159. data/engines/bastion/app/assets/bastion/products/details/product-repositories.controller.js +40 -0
  1160. data/engines/bastion/app/assets/bastion/products/details/views/product-details.html +59 -0
  1161. data/engines/bastion/app/assets/bastion/products/details/views/product-info.html +45 -0
  1162. data/engines/bastion/app/assets/bastion/products/details/views/product-repositories.html +65 -0
  1163. data/engines/bastion/app/assets/bastion/products/discovery/discovery-form.controller.js +185 -0
  1164. data/engines/bastion/app/assets/bastion/products/discovery/discovery.controller.js +115 -0
  1165. data/engines/bastion/app/assets/bastion/products/discovery/views/discovery-base.html +16 -0
  1166. data/engines/bastion/app/assets/bastion/products/discovery/views/discovery-create.html +171 -0
  1167. data/engines/bastion/app/assets/bastion/products/discovery/views/discovery.html +90 -0
  1168. data/engines/bastion/app/assets/bastion/products/new/new-product.controller.js +32 -0
  1169. data/engines/bastion/app/assets/bastion/products/new/product-form.controller.js +91 -0
  1170. data/engines/bastion/app/assets/bastion/products/new/views/product-new-form.html +56 -0
  1171. data/engines/bastion/app/assets/bastion/products/new/views/product-new.html +20 -0
  1172. data/engines/bastion/app/assets/bastion/products/product.factory.js +32 -0
  1173. data/engines/bastion/app/assets/bastion/products/products.controller.js +52 -0
  1174. data/engines/bastion/app/assets/bastion/products/products.module.js +153 -0
  1175. data/engines/bastion/app/assets/bastion/products/views/products-table-collapsed.html +18 -0
  1176. data/engines/bastion/app/assets/bastion/products/views/products-table-full.html +24 -0
  1177. data/engines/bastion/app/assets/bastion/products/views/products.html +19 -0
  1178. data/engines/bastion/app/assets/bastion/providers/new/new-provider.controller.js +63 -0
  1179. data/engines/bastion/app/assets/bastion/providers/new/views/provider-new.html +28 -0
  1180. data/engines/bastion/app/assets/bastion/providers/provider.factory.js +38 -0
  1181. data/engines/bastion/app/assets/bastion/providers/providers.module.js +23 -0
  1182. data/engines/bastion/app/assets/bastion/repositories/details/repository-details-info.controller.js +113 -0
  1183. data/engines/bastion/app/assets/bastion/repositories/details/views/repository-info.html +174 -0
  1184. data/engines/bastion/app/assets/bastion/repositories/new/new-repository.controller.js +63 -0
  1185. data/engines/bastion/app/assets/bastion/repositories/new/views/repository-new.html +73 -0
  1186. data/engines/bastion/app/assets/bastion/repositories/repositories.module.js +35 -0
  1187. data/engines/bastion/app/assets/bastion/repositories/repository.factory.js +38 -0
  1188. data/engines/bastion/app/assets/bastion/stylesheets/less/bastion.less +27 -0
  1189. data/engines/bastion/app/assets/bastion/stylesheets/less/forms.less +11 -0
  1190. data/engines/bastion/app/assets/bastion/stylesheets/less/gpg-keys.less +36 -0
  1191. data/engines/bastion/app/assets/bastion/stylesheets/less/helpers.less +6 -0
  1192. data/engines/bastion/app/assets/bastion/stylesheets/less/nutupane.less +307 -0
  1193. data/engines/bastion/app/assets/bastion/stylesheets/less/overrides.less +42 -0
  1194. data/engines/bastion/app/assets/bastion/stylesheets/less/systems.less +35 -0
  1195. data/engines/bastion/app/assets/bastion/stylesheets/less/variables.less +2 -0
  1196. data/engines/bastion/app/assets/bastion/stylesheets/scss/bastion.scss +171 -0
  1197. data/engines/bastion/app/assets/bastion/stylesheets/widgets/_org-switcher.scss +114 -0
  1198. data/engines/bastion/app/assets/bastion/subscriptions/details/subscription-details.controller.js +58 -0
  1199. data/engines/bastion/app/assets/bastion/subscriptions/details/subscription-products.controller.js +35 -0
  1200. data/engines/bastion/app/assets/bastion/subscriptions/details/views/subscription-associations.html +41 -0
  1201. data/engines/bastion/app/assets/bastion/subscriptions/details/views/subscription-details.html +41 -0
  1202. data/engines/bastion/app/assets/bastion/subscriptions/details/views/subscription-info.html +92 -0
  1203. data/engines/bastion/app/assets/bastion/subscriptions/details/views/subscription-products.html +35 -0
  1204. data/engines/bastion/app/assets/bastion/subscriptions/manifest/manifest-details.controller.js +46 -0
  1205. data/engines/bastion/app/assets/bastion/subscriptions/manifest/manifest-history.controller.js +31 -0
  1206. data/engines/bastion/app/assets/bastion/subscriptions/manifest/manifest-import.controller.js +147 -0
  1207. data/engines/bastion/app/assets/bastion/subscriptions/manifest/manifest.controller.js +48 -0
  1208. data/engines/bastion/app/assets/bastion/subscriptions/manifest/views/manifest-details.html +46 -0
  1209. data/engines/bastion/app/assets/bastion/subscriptions/manifest/views/manifest-import-history.html +17 -0
  1210. data/engines/bastion/app/assets/bastion/subscriptions/manifest/views/manifest-import.html +80 -0
  1211. data/engines/bastion/app/assets/bastion/subscriptions/manifest/views/manifest.html +47 -0
  1212. data/engines/bastion/app/assets/bastion/subscriptions/subscriptions.controller.js +82 -0
  1213. data/engines/bastion/app/assets/bastion/subscriptions/subscriptions.factory.js +31 -0
  1214. data/engines/bastion/app/assets/bastion/subscriptions/subscriptions.module.js +118 -0
  1215. data/engines/bastion/app/assets/bastion/subscriptions/views/subscriptions-delete-bulk.html +4 -0
  1216. data/engines/bastion/app/assets/bastion/subscriptions/views/subscriptions-table-collapsed.html +17 -0
  1217. data/engines/bastion/app/assets/bastion/subscriptions/views/subscriptions-table-full.html +31 -0
  1218. data/engines/bastion/app/assets/bastion/subscriptions/views/subscriptions.html +13 -0
  1219. data/engines/bastion/app/assets/bastion/system-groups/details/system-group-add-systems.controller.js +78 -0
  1220. data/engines/bastion/app/assets/bastion/system-groups/details/system-group-details-info.controller.js +40 -0
  1221. data/engines/bastion/app/assets/bastion/system-groups/details/system-group-details.controller.js +82 -0
  1222. data/engines/bastion/app/assets/bastion/system-groups/details/system-group-systems.controller.js +61 -0
  1223. data/engines/bastion/app/assets/bastion/system-groups/details/views/system-group-actions.html +34 -0
  1224. data/engines/bastion/app/assets/bastion/system-groups/details/views/system-group-add-systems.html +83 -0
  1225. data/engines/bastion/app/assets/bastion/system-groups/details/views/system-group-details.html +91 -0
  1226. data/engines/bastion/app/assets/bastion/system-groups/details/views/system-group-info.html +62 -0
  1227. data/engines/bastion/app/assets/bastion/system-groups/details/views/system-group-systems-list.html +77 -0
  1228. data/engines/bastion/app/assets/bastion/system-groups/details/views/system-group-systems.html +21 -0
  1229. data/engines/bastion/app/assets/bastion/system-groups/new/new-system-group.controller.js +32 -0
  1230. data/engines/bastion/app/assets/bastion/system-groups/new/system-group-form.controller.js +75 -0
  1231. data/engines/bastion/app/assets/bastion/system-groups/new/views/system-group-new-form.html +46 -0
  1232. data/engines/bastion/app/assets/bastion/system-groups/new/views/system-group-new.html +20 -0
  1233. data/engines/bastion/app/assets/bastion/system-groups/system-group.factory.js +36 -0
  1234. data/engines/bastion/app/assets/bastion/system-groups/system-groups.controller.js +51 -0
  1235. data/engines/bastion/app/assets/bastion/system-groups/system-groups.module.js +102 -0
  1236. data/engines/bastion/app/assets/bastion/system-groups/views/system-groups-table-collapsed.html +18 -0
  1237. data/engines/bastion/app/assets/bastion/system-groups/views/system-groups-table-full.html +26 -0
  1238. data/engines/bastion/app/assets/bastion/system-groups/views/system-groups.html +14 -0
  1239. data/engines/bastion/app/assets/bastion/systems/bulk/systems-bulk-action-errata.controller.js +113 -0
  1240. data/engines/bastion/app/assets/bastion/systems/bulk/systems-bulk-action-groups.controller.js +92 -0
  1241. data/engines/bastion/app/assets/bastion/systems/bulk/systems-bulk-action-packages.controller.js +101 -0
  1242. data/engines/bastion/app/assets/bastion/systems/bulk/systems-bulk-action-subscriptions.controller.js +98 -0
  1243. data/engines/bastion/app/assets/bastion/systems/bulk/systems-bulk-action.controller.js +84 -0
  1244. data/engines/bastion/app/assets/bastion/systems/bulk/views/alter-content-bulk.html +3 -0
  1245. data/engines/bastion/app/assets/bastion/systems/bulk/views/bulk-actions-errata.html +73 -0
  1246. data/engines/bastion/app/assets/bastion/systems/bulk/views/bulk-actions-groups.html +66 -0
  1247. data/engines/bastion/app/assets/bastion/systems/bulk/views/bulk-actions-packages.html +78 -0
  1248. data/engines/bastion/app/assets/bastion/systems/bulk/views/bulk-actions-subscriptions.html +24 -0
  1249. data/engines/bastion/app/assets/bastion/systems/bulk/views/bulk-actions.html +88 -0
  1250. data/engines/bastion/app/assets/bastion/systems/bulk/views/errata-details.html +64 -0
  1251. data/engines/bastion/app/assets/bastion/systems/bulk/views/errata-systems.html +28 -0
  1252. data/engines/bastion/app/assets/bastion/systems/content/system-errata.controller.js +71 -0
  1253. data/engines/bastion/app/assets/bastion/systems/content/system-packages.controller.js +97 -0
  1254. data/engines/bastion/app/assets/bastion/systems/content/views/errata-details.html +64 -0
  1255. data/engines/bastion/app/assets/bastion/systems/content/views/system-errata.html +57 -0
  1256. data/engines/bastion/app/assets/bastion/systems/content/views/system-packages.html +94 -0
  1257. data/engines/bastion/app/assets/bastion/systems/details/system-add-system-groups.controller.js +82 -0
  1258. data/engines/bastion/app/assets/bastion/systems/details/system-details-info.controller.js +236 -0
  1259. data/engines/bastion/app/assets/bastion/systems/details/system-details.controller.js +94 -0
  1260. data/engines/bastion/app/assets/bastion/systems/details/system-event-details.controller.js +55 -0
  1261. data/engines/bastion/app/assets/bastion/systems/details/system-events.controller.js +48 -0
  1262. data/engines/bastion/app/assets/bastion/systems/details/system-subscriptions.controller.js +136 -0
  1263. data/engines/bastion/app/assets/bastion/systems/details/system-system-groups.controller.js +82 -0
  1264. data/engines/bastion/app/assets/bastion/systems/details/views/partials/system-detail-object.html +8 -0
  1265. data/engines/bastion/app/assets/bastion/systems/details/views/partials/system-detail-value.html +4 -0
  1266. data/engines/bastion/app/assets/bastion/systems/details/views/system-details.html +74 -0
  1267. data/engines/bastion/app/assets/bastion/systems/details/views/system-event-details.html +47 -0
  1268. data/engines/bastion/app/assets/bastion/systems/details/views/system-events.html +45 -0
  1269. data/engines/bastion/app/assets/bastion/systems/details/views/system-groups-table.html +81 -0
  1270. data/engines/bastion/app/assets/bastion/systems/details/views/system-groups.html +18 -0
  1271. data/engines/bastion/app/assets/bastion/systems/details/views/system-info.html +332 -0
  1272. data/engines/bastion/app/assets/bastion/systems/details/views/system-subscriptions.html +198 -0
  1273. data/engines/bastion/app/assets/bastion/systems/system-erratum.factory.js +32 -0
  1274. data/engines/bastion/app/assets/bastion/systems/system-package.factory.js +35 -0
  1275. data/engines/bastion/app/assets/bastion/systems/system-register.controller.js +38 -0
  1276. data/engines/bastion/app/assets/bastion/systems/system-subscription.factory.js +31 -0
  1277. data/engines/bastion/app/assets/bastion/systems/system-task.factory.js +45 -0
  1278. data/engines/bastion/app/assets/bastion/systems/system.factory.js +70 -0
  1279. data/engines/bastion/app/assets/bastion/systems/systems-helper.service.js +35 -0
  1280. data/engines/bastion/app/assets/bastion/systems/systems.controller.js +72 -0
  1281. data/engines/bastion/app/assets/bastion/systems/systems.module.js +214 -0
  1282. data/engines/bastion/app/assets/bastion/systems/views/register.html +35 -0
  1283. data/engines/bastion/app/assets/bastion/systems/views/systems-delete-bulk.html +4 -0
  1284. data/engines/bastion/app/assets/bastion/systems/views/systems-table-collapsed.html +20 -0
  1285. data/engines/bastion/app/assets/bastion/systems/views/systems-table-full.html +33 -0
  1286. data/engines/bastion/app/assets/bastion/systems/views/systems.html +19 -0
  1287. data/engines/bastion/app/assets/bastion/tasks/task.factory.js +52 -0
  1288. data/engines/bastion/app/assets/bastion/tasks/tasks.module.js +23 -0
  1289. data/engines/bastion/app/assets/bastion/users/user.factory.js +45 -0
  1290. data/engines/bastion/app/assets/bastion/users/users.module.js +21 -0
  1291. data/engines/bastion/app/assets/bastion/utils/form-utils.service.js +54 -0
  1292. data/engines/bastion/app/assets/bastion/utils/routes.factory.js +26 -0
  1293. data/engines/bastion/app/assets/bastion/utils/utils.module.js +21 -0
  1294. data/engines/bastion/app/assets/bastion/widgets/nutupane-table.directive.js +59 -0
  1295. data/engines/bastion/app/assets/bastion/widgets/nutupane.factory.js +304 -0
  1296. data/engines/bastion/app/assets/bastion/widgets/org-switcher.widget.js +104 -0
  1297. data/engines/bastion/app/assets/bastion/widgets/path-selector.directive.js +74 -0
  1298. data/engines/bastion/app/assets/bastion/widgets/views/org-switcher.html +41 -0
  1299. data/engines/bastion/app/assets/bastion/widgets/views/save-control.html +22 -0
  1300. data/engines/bastion/app/assets/bastion/widgets/widgets.module.js +21 -0
  1301. data/engines/bastion/app/assets/images/bastion/favicon.png +0 -0
  1302. data/engines/bastion/app/assets/images/bastion/headpin-logo.png +0 -0
  1303. data/engines/bastion/app/assets/images/bastion/katello-logo.png +0 -0
  1304. data/engines/bastion/app/views/bastion/layouts/application.html.haml +18 -0
  1305. data/engines/bastion/lib/bastion.rb +5 -0
  1306. data/engines/bastion/lib/bastion/engine.rb +37 -0
  1307. data/engines/bastion/lib/bastion/version.rb +3 -0
  1308. data/engines/bastion/vendor/assets/fonts/bastion/font-awesome/FontAwesome.otf +0 -0
  1309. data/engines/bastion/vendor/assets/fonts/bastion/font-awesome/fontawesome-webfont.eot +0 -0
  1310. data/engines/bastion/vendor/assets/fonts/bastion/font-awesome/fontawesome-webfont.svg +399 -0
  1311. data/engines/bastion/vendor/assets/fonts/bastion/font-awesome/fontawesome-webfont.ttf +0 -0
  1312. data/engines/bastion/vendor/assets/fonts/bastion/font-awesome/fontawesome-webfont.woff +0 -0
  1313. data/engines/bastion/vendor/assets/fonts/bastion/rcue/OpenSans-Bold-webfont.eot +0 -0
  1314. data/engines/bastion/vendor/assets/fonts/bastion/rcue/OpenSans-Bold-webfont.svg +146 -0
  1315. data/engines/bastion/vendor/assets/fonts/bastion/rcue/OpenSans-Bold-webfont.ttf +0 -0
  1316. data/engines/bastion/vendor/assets/fonts/bastion/rcue/OpenSans-Bold-webfont.woff +0 -0
  1317. data/engines/bastion/vendor/assets/fonts/bastion/rcue/OpenSans-BoldItalic-webfont.eot +0 -0
  1318. data/engines/bastion/vendor/assets/fonts/bastion/rcue/OpenSans-BoldItalic-webfont.svg +146 -0
  1319. data/engines/bastion/vendor/assets/fonts/bastion/rcue/OpenSans-BoldItalic-webfont.ttf +0 -0
  1320. data/engines/bastion/vendor/assets/fonts/bastion/rcue/OpenSans-BoldItalic-webfont.woff +0 -0
  1321. data/engines/bastion/vendor/assets/fonts/bastion/rcue/OpenSans-ExtraBold-webfont.eot +0 -0
  1322. data/engines/bastion/vendor/assets/fonts/bastion/rcue/OpenSans-ExtraBold-webfont.svg +146 -0
  1323. data/engines/bastion/vendor/assets/fonts/bastion/rcue/OpenSans-ExtraBold-webfont.ttf +0 -0
  1324. data/engines/bastion/vendor/assets/fonts/bastion/rcue/OpenSans-ExtraBold-webfont.woff +0 -0
  1325. data/engines/bastion/vendor/assets/fonts/bastion/rcue/OpenSans-ExtraBoldItalic-webfont.eot +0 -0
  1326. data/engines/bastion/vendor/assets/fonts/bastion/rcue/OpenSans-ExtraBoldItalic-webfont.svg +146 -0
  1327. data/engines/bastion/vendor/assets/fonts/bastion/rcue/OpenSans-ExtraBoldItalic-webfont.ttf +0 -0
  1328. data/engines/bastion/vendor/assets/fonts/bastion/rcue/OpenSans-ExtraBoldItalic-webfont.woff +0 -0
  1329. data/engines/bastion/vendor/assets/fonts/bastion/rcue/OpenSans-Italic-webfont.eot +0 -0
  1330. data/engines/bastion/vendor/assets/fonts/bastion/rcue/OpenSans-Italic-webfont.svg +146 -0
  1331. data/engines/bastion/vendor/assets/fonts/bastion/rcue/OpenSans-Italic-webfont.ttf +0 -0
  1332. data/engines/bastion/vendor/assets/fonts/bastion/rcue/OpenSans-Italic-webfont.woff +0 -0
  1333. data/engines/bastion/vendor/assets/fonts/bastion/rcue/OpenSans-Light-webfont.eot +0 -0
  1334. data/engines/bastion/vendor/assets/fonts/bastion/rcue/OpenSans-Light-webfont.svg +146 -0
  1335. data/engines/bastion/vendor/assets/fonts/bastion/rcue/OpenSans-Light-webfont.ttf +0 -0
  1336. data/engines/bastion/vendor/assets/fonts/bastion/rcue/OpenSans-Light-webfont.woff +0 -0
  1337. data/engines/bastion/vendor/assets/fonts/bastion/rcue/OpenSans-LightItalic-webfont.eot +0 -0
  1338. data/engines/bastion/vendor/assets/fonts/bastion/rcue/OpenSans-LightItalic-webfont.svg +146 -0
  1339. data/engines/bastion/vendor/assets/fonts/bastion/rcue/OpenSans-LightItalic-webfont.ttf +0 -0
  1340. data/engines/bastion/vendor/assets/fonts/bastion/rcue/OpenSans-LightItalic-webfont.woff +0 -0
  1341. data/engines/bastion/vendor/assets/fonts/bastion/rcue/OpenSans-Regular-webfont.eot +0 -0
  1342. data/engines/bastion/vendor/assets/fonts/bastion/rcue/OpenSans-Regular-webfont.svg +146 -0
  1343. data/engines/bastion/vendor/assets/fonts/bastion/rcue/OpenSans-Regular-webfont.ttf +0 -0
  1344. data/engines/bastion/vendor/assets/fonts/bastion/rcue/OpenSans-Regular-webfont.woff +0 -0
  1345. data/engines/bastion/vendor/assets/fonts/bastion/rcue/OpenSans-Semibold-webfont.eot +0 -0
  1346. data/engines/bastion/vendor/assets/fonts/bastion/rcue/OpenSans-Semibold-webfont.svg +146 -0
  1347. data/engines/bastion/vendor/assets/fonts/bastion/rcue/OpenSans-Semibold-webfont.ttf +0 -0
  1348. data/engines/bastion/vendor/assets/fonts/bastion/rcue/OpenSans-Semibold-webfont.woff +0 -0
  1349. data/engines/bastion/vendor/assets/fonts/bastion/rcue/OpenSans-SemiboldItalic-webfont.eot +0 -0
  1350. data/engines/bastion/vendor/assets/fonts/bastion/rcue/OpenSans-SemiboldItalic-webfont.svg +146 -0
  1351. data/engines/bastion/vendor/assets/fonts/bastion/rcue/OpenSans-SemiboldItalic-webfont.ttf +0 -0
  1352. data/engines/bastion/vendor/assets/fonts/bastion/rcue/OpenSans-SemiboldItalic-webfont.woff +0 -0
  1353. data/engines/bastion/vendor/assets/fonts/bastion/rcue/Overpass-Bold-webfont.eot +0 -0
  1354. data/engines/bastion/vendor/assets/fonts/bastion/rcue/Overpass-Bold-webfont.svg +454 -0
  1355. data/engines/bastion/vendor/assets/fonts/bastion/rcue/Overpass-Bold-webfont.ttf +0 -0
  1356. data/engines/bastion/vendor/assets/fonts/bastion/rcue/Overpass-Bold-webfont.woff +0 -0
  1357. data/engines/bastion/vendor/assets/fonts/bastion/rcue/Overpass-Regular-webfont.eot +0 -0
  1358. data/engines/bastion/vendor/assets/fonts/bastion/rcue/Overpass-Regular-webfont.svg +454 -0
  1359. data/engines/bastion/vendor/assets/fonts/bastion/rcue/Overpass-Regular-webfont.ttf +0 -0
  1360. data/engines/bastion/vendor/assets/fonts/bastion/rcue/Overpass-Regular-webfont.woff +0 -0
  1361. data/engines/bastion/vendor/assets/javascripts/bastion/alchemy/alchemy.js +20 -0
  1362. data/engines/bastion/vendor/assets/javascripts/bastion/angular-blocks/angular-blocks.js +79 -0
  1363. data/engines/bastion/vendor/assets/javascripts/bastion/angular-gettext/angular-gettext.js +200 -0
  1364. data/engines/bastion/vendor/assets/javascripts/bastion/angular-resource/angular-resource.js +578 -0
  1365. data/engines/bastion/vendor/assets/javascripts/bastion/angular-route/angular-route.js +880 -0
  1366. data/engines/bastion/vendor/assets/javascripts/bastion/angular-sanitize/angular-sanitize.js +577 -0
  1367. data/engines/bastion/vendor/assets/javascripts/bastion/angular-ui-bootstrap/alert.js +15 -0
  1368. data/engines/bastion/vendor/assets/javascripts/bastion/angular-ui-bootstrap/bindHtml.js +10 -0
  1369. data/engines/bastion/vendor/assets/javascripts/bastion/angular-ui-bootstrap/modal.js +315 -0
  1370. data/engines/bastion/vendor/assets/javascripts/bastion/angular-ui-bootstrap/position.js +79 -0
  1371. data/engines/bastion/vendor/assets/javascripts/bastion/angular-ui-bootstrap/tabs.js +316 -0
  1372. data/engines/bastion/vendor/assets/javascripts/bastion/angular-ui-bootstrap/tooltip.js +337 -0
  1373. data/engines/bastion/vendor/assets/javascripts/bastion/angular-ui-router/angular-ui-router.js +1478 -0
  1374. data/engines/bastion/vendor/assets/javascripts/bastion/angular/angular.js +20031 -0
  1375. data/engines/bastion/vendor/assets/javascripts/bastion/es5-shim/es5-shim.js +1216 -0
  1376. data/engines/bastion/vendor/assets/javascripts/bastion/jquery/jquery.js +9597 -0
  1377. data/engines/bastion/vendor/assets/javascripts/bastion/json3/json3.js +861 -0
  1378. data/engines/bastion/vendor/assets/javascripts/bastion/ngUpload/ng-upload.js +205 -0
  1379. data/engines/bastion/vendor/assets/javascripts/bastion/underscore/underscore.js +1276 -0
  1380. data/engines/bastion/vendor/assets/stylesheets/bastion/alchemy/_colors.scss +99 -0
  1381. data/engines/bastion/vendor/assets/stylesheets/bastion/alchemy/_media_object.scss +22 -0
  1382. data/engines/bastion/vendor/assets/stylesheets/bastion/alchemy/_mixins.scss +24 -0
  1383. data/engines/bastion/vendor/assets/stylesheets/bastion/alchemy/_normalize.scss +396 -0
  1384. data/engines/bastion/vendor/assets/stylesheets/bastion/alchemy/_vars.scss +31 -0
  1385. data/engines/bastion/vendor/assets/stylesheets/bastion/alchemy/alchemy.scss +8 -0
  1386. data/engines/bastion/vendor/assets/stylesheets/bastion/bootstrap/alerts.less +67 -0
  1387. data/engines/bastion/vendor/assets/stylesheets/bastion/bootstrap/badges.less +51 -0
  1388. data/engines/bastion/vendor/assets/stylesheets/bastion/bootstrap/bootstrap.less +49 -0
  1389. data/engines/bastion/vendor/assets/stylesheets/bastion/bootstrap/breadcrumbs.less +23 -0
  1390. data/engines/bastion/vendor/assets/stylesheets/bastion/bootstrap/button-groups.less +227 -0
  1391. data/engines/bastion/vendor/assets/stylesheets/bastion/bootstrap/buttons.less +155 -0
  1392. data/engines/bastion/vendor/assets/stylesheets/bastion/bootstrap/carousel.less +232 -0
  1393. data/engines/bastion/vendor/assets/stylesheets/bastion/bootstrap/close.less +33 -0
  1394. data/engines/bastion/vendor/assets/stylesheets/bastion/bootstrap/code.less +53 -0
  1395. data/engines/bastion/vendor/assets/stylesheets/bastion/bootstrap/component-animations.less +29 -0
  1396. data/engines/bastion/vendor/assets/stylesheets/bastion/bootstrap/dropdowns.less +187 -0
  1397. data/engines/bastion/vendor/assets/stylesheets/bastion/bootstrap/forms.less +375 -0
  1398. data/engines/bastion/vendor/assets/stylesheets/bastion/bootstrap/glyphicons.less +237 -0
  1399. data/engines/bastion/vendor/assets/stylesheets/bastion/bootstrap/grid.less +79 -0
  1400. data/engines/bastion/vendor/assets/stylesheets/bastion/bootstrap/input-groups.less +136 -0
  1401. data/engines/bastion/vendor/assets/stylesheets/bastion/bootstrap/jumbotron.less +46 -0
  1402. data/engines/bastion/vendor/assets/stylesheets/bastion/bootstrap/labels.less +64 -0
  1403. data/engines/bastion/vendor/assets/stylesheets/bastion/bootstrap/list-group.less +88 -0
  1404. data/engines/bastion/vendor/assets/stylesheets/bastion/bootstrap/media.less +56 -0
  1405. data/engines/bastion/vendor/assets/stylesheets/bastion/bootstrap/mixins.less +845 -0
  1406. data/engines/bastion/vendor/assets/stylesheets/bastion/bootstrap/modals.less +129 -0
  1407. data/engines/bastion/vendor/assets/stylesheets/bastion/bootstrap/navbar.less +612 -0
  1408. data/engines/bastion/vendor/assets/stylesheets/bastion/bootstrap/navs.less +242 -0
  1409. data/engines/bastion/vendor/assets/stylesheets/bastion/bootstrap/normalize.less +406 -0
  1410. data/engines/bastion/vendor/assets/stylesheets/bastion/bootstrap/pager.less +55 -0
  1411. data/engines/bastion/vendor/assets/stylesheets/bastion/bootstrap/pagination.less +85 -0
  1412. data/engines/bastion/vendor/assets/stylesheets/bastion/bootstrap/panels.less +182 -0
  1413. data/engines/bastion/vendor/assets/stylesheets/bastion/bootstrap/popovers.less +133 -0
  1414. data/engines/bastion/vendor/assets/stylesheets/bastion/bootstrap/print.less +105 -0
  1415. data/engines/bastion/vendor/assets/stylesheets/bastion/bootstrap/progress-bars.less +80 -0
  1416. data/engines/bastion/vendor/assets/stylesheets/bastion/bootstrap/responsive-utilities.less +209 -0
  1417. data/engines/bastion/vendor/assets/stylesheets/bastion/bootstrap/scaffolding.less +119 -0
  1418. data/engines/bastion/vendor/assets/stylesheets/bastion/bootstrap/tables.less +231 -0
  1419. data/engines/bastion/vendor/assets/stylesheets/bastion/bootstrap/theme.less +247 -0
  1420. data/engines/bastion/vendor/assets/stylesheets/bastion/bootstrap/thumbnails.less +36 -0
  1421. data/engines/bastion/vendor/assets/stylesheets/bastion/bootstrap/tooltip.less +95 -0
  1422. data/engines/bastion/vendor/assets/stylesheets/bastion/bootstrap/type.less +281 -0
  1423. data/engines/bastion/vendor/assets/stylesheets/bastion/bootstrap/utilities.less +56 -0
  1424. data/engines/bastion/vendor/assets/stylesheets/bastion/bootstrap/variables.less +642 -0
  1425. data/engines/bastion/vendor/assets/stylesheets/bastion/bootstrap/wells.less +29 -0
  1426. data/engines/bastion/vendor/assets/stylesheets/bastion/font-awesome/less/bootstrap.less +84 -0
  1427. data/engines/bastion/vendor/assets/stylesheets/bastion/font-awesome/less/core.less +129 -0
  1428. data/engines/bastion/vendor/assets/stylesheets/bastion/font-awesome/less/extras.less +93 -0
  1429. data/engines/bastion/vendor/assets/stylesheets/bastion/font-awesome/less/font-awesome-ie7.less +1953 -0
  1430. data/engines/bastion/vendor/assets/stylesheets/bastion/font-awesome/less/font-awesome.less +33 -0
  1431. data/engines/bastion/vendor/assets/stylesheets/bastion/font-awesome/less/icons.less +381 -0
  1432. data/engines/bastion/vendor/assets/stylesheets/bastion/font-awesome/less/mixins.less +48 -0
  1433. data/engines/bastion/vendor/assets/stylesheets/bastion/font-awesome/less/path.less +14 -0
  1434. data/engines/bastion/vendor/assets/stylesheets/bastion/font-awesome/less/variables.less +735 -0
  1435. data/engines/bastion/vendor/assets/stylesheets/bastion/font-awesome/scss/_bootstrap.scss +84 -0
  1436. data/engines/bastion/vendor/assets/stylesheets/bastion/font-awesome/scss/_core.scss +129 -0
  1437. data/engines/bastion/vendor/assets/stylesheets/bastion/font-awesome/scss/_extras.scss +93 -0
  1438. data/engines/bastion/vendor/assets/stylesheets/bastion/font-awesome/scss/_icons.scss +381 -0
  1439. data/engines/bastion/vendor/assets/stylesheets/bastion/font-awesome/scss/_mixins.scss +48 -0
  1440. data/engines/bastion/vendor/assets/stylesheets/bastion/font-awesome/scss/_path.scss +14 -0
  1441. data/engines/bastion/vendor/assets/stylesheets/bastion/font-awesome/scss/_variables.scss +734 -0
  1442. data/engines/bastion/vendor/assets/stylesheets/bastion/font-awesome/scss/font-awesome-ie7.scss +1953 -0
  1443. data/engines/bastion/vendor/assets/stylesheets/bastion/font-awesome/scss/font-awesome.scss +33 -0
  1444. data/engines/bastion/vendor/assets/stylesheets/bastion/rcue/buttons.less +44 -0
  1445. data/engines/bastion/vendor/assets/stylesheets/bastion/rcue/fonts.less +52 -0
  1446. data/engines/bastion/vendor/assets/stylesheets/bastion/rcue/forms.less +19 -0
  1447. data/engines/bastion/vendor/assets/stylesheets/bastion/rcue/mixins.less +50 -0
  1448. data/engines/bastion/vendor/assets/stylesheets/bastion/rcue/navbar.less +481 -0
  1449. data/engines/bastion/vendor/assets/stylesheets/bastion/rcue/rcue.less +15 -0
  1450. data/engines/bastion/vendor/assets/stylesheets/bastion/rcue/variables.less +47 -0
  1451. data/engines/fort/app/controllers/api/v1/node_capabilities_controller.rb +84 -0
  1452. data/engines/fort/app/controllers/api/v1/nodes_controller.rb +131 -0
  1453. data/engines/fort/app/controllers/api/v2/node_capabilities_controller.rb +17 -0
  1454. data/engines/fort/app/controllers/api/v2/nodes_controller.rb +41 -0
  1455. data/engines/fort/app/models/authorization/node.rb +26 -0
  1456. data/engines/fort/app/models/content_node_capability.rb +67 -0
  1457. data/engines/fort/app/models/fort/concerns/system.rb +29 -0
  1458. data/engines/fort/app/models/node.rb +61 -0
  1459. data/engines/fort/app/models/node_capability.rb +42 -0
  1460. data/engines/fort/app/views/api/v2/nodes/index.json.rabl +3 -0
  1461. data/engines/fort/app/views/api/v2/nodes/show.json.rabl +15 -0
  1462. data/engines/fort/config/routes.rb +37 -0
  1463. data/engines/fort/db/migrate/20130725180846_node.rb +15 -0
  1464. data/engines/fort/db/migrate/20130725185514_add_node_capability.rb +16 -0
  1465. data/engines/fort/db/migrate/20130726210956_create_node_environments.rb +16 -0
  1466. data/engines/fort/lib/fort.rb +16 -0
  1467. data/engines/fort/lib/fort/actions/changeset_promote.rb +43 -0
  1468. data/engines/fort/lib/fort/actions/content_view_publish.rb +35 -0
  1469. data/engines/fort/lib/fort/actions/content_view_refresh.rb +34 -0
  1470. data/engines/fort/lib/fort/actions/repository_create.rb +41 -0
  1471. data/engines/fort/lib/fort/engine.rb +29 -0
  1472. data/engines/fort/lib/fort/version.rb +3 -0
  1473. data/engines/fort/lib/tasks/fort_tasks.rake +4 -0
  1474. data/lib/README +1 -0
  1475. data/lib/headpin/actions/org_create.rb +28 -0
  1476. data/lib/headpin/actions/org_destroy.rb +28 -0
  1477. data/lib/headpin/actions/user_create.rb +33 -0
  1478. data/lib/headpin/actions/user_destroy.rb +28 -0
  1479. data/lib/headpin/headpin.rb +8 -0
  1480. data/lib/katello.rb +46 -0
  1481. data/lib/katello/actions/actions.rb +19 -0
  1482. data/lib/katello/actions/changeset_promote.rb +24 -0
  1483. data/lib/katello/actions/content_view_create.rb +23 -0
  1484. data/lib/katello/actions/content_view_demote.rb +21 -0
  1485. data/lib/katello/actions/content_view_promote.rb +35 -0
  1486. data/lib/katello/actions/content_view_publish.rb +32 -0
  1487. data/lib/katello/actions/content_view_refresh.rb +32 -0
  1488. data/lib/katello/actions/environment_create.rb +31 -0
  1489. data/lib/katello/actions/environment_destroy.rb +31 -0
  1490. data/lib/katello/actions/repository_create.rb +23 -0
  1491. data/lib/katello/actions/repository_destroy.rb +23 -0
  1492. data/lib/katello/actions/repository_sync.rb +25 -0
  1493. data/lib/katello/app_config.rb +22 -0
  1494. data/lib/katello/configuration.rb +71 -0
  1495. data/lib/katello/configuration/loader.rb +129 -0
  1496. data/lib/katello/configuration/node.rb +146 -0
  1497. data/lib/katello/configuration/validator.rb +86 -0
  1498. data/lib/katello/engine.rb +89 -0
  1499. data/lib/katello/load_configuration.rb +142 -0
  1500. data/lib/katello/logging.rb +245 -0
  1501. data/lib/katello/middleware/log_request_uuid.rb +28 -0
  1502. data/lib/katello/plugin.rb +158 -0
  1503. data/lib/katello/tasks/cdn_refresh.rake +12 -0
  1504. data/lib/katello/tasks/delete_orphaned_content.rake +7 -0
  1505. data/lib/katello/tasks/gettext.rake +5 -0
  1506. data/lib/katello/tasks/headpin_misc.rake +18 -0
  1507. data/lib/katello/tasks/jenkins.rake +14 -0
  1508. data/lib/katello/tasks/jshint.rake +51 -0
  1509. data/lib/katello/tasks/jsroutes.rake +5 -0
  1510. data/lib/katello/tasks/pretty_routes.rake +30 -0
  1511. data/lib/katello/tasks/regenerate_repo_metadata.rake +20 -0
  1512. data/lib/katello/tasks/reindex.rake +36 -0
  1513. data/lib/katello/tasks/rubocop.rake +18 -0
  1514. data/lib/katello/tasks/setup.rake +65 -0
  1515. data/lib/katello/tasks/simplecov.rake +7 -0
  1516. data/lib/katello/tasks/test.rake +72 -0
  1517. data/lib/katello/tasks/yard.rake +9 -0
  1518. data/lib/katello/url_constrained_cookie_store.rb +96 -0
  1519. data/lib/katello/version.rb +3 -0
  1520. data/lib/monkeys/foreign_keys_postgresql.rb +15 -0
  1521. data/lib/monkeys/multi_json_empty_fix.rb +14 -0
  1522. data/lib/monkeys/string_to_bool.rb +19 -0
  1523. data/lib/monkeys/yard_svg_fix.rb +27 -0
  1524. data/lib/util/password.rb +138 -0
  1525. data/lib/util/puppet.rb +55 -0
  1526. data/locale/Makefile +41 -0
  1527. data/locale/README +14 -0
  1528. data/locale/bn/katello.po +5440 -0
  1529. data/locale/cs/katello.po +5082 -0
  1530. data/locale/de/katello.po +5449 -0
  1531. data/locale/en/katello.po +4845 -0
  1532. data/locale/es/katello.po +5443 -0
  1533. data/locale/fr/katello.po +5443 -0
  1534. data/locale/gu/katello.po +5440 -0
  1535. data/locale/hi/katello.po +5440 -0
  1536. data/locale/it/katello.po +5443 -0
  1537. data/locale/ja/katello.po +5475 -0
  1538. data/locale/katello.pot +4846 -0
  1539. data/locale/kn/katello.po +5468 -0
  1540. data/locale/ko/katello.po +5443 -0
  1541. data/locale/mr/katello.po +5468 -0
  1542. data/locale/or/katello.po +5468 -0
  1543. data/locale/pa/katello.po +5440 -0
  1544. data/locale/pt/katello.po +4891 -0
  1545. data/locale/pt_BR/katello.po +5472 -0
  1546. data/locale/ru/katello.po +5449 -0
  1547. data/locale/ta/katello.po +5440 -0
  1548. data/locale/te/katello.po +5468 -0
  1549. data/locale/zanata.xml +27 -0
  1550. data/locale/zh_CN/katello.po +5443 -0
  1551. data/locale/zh_TW/katello.po +5471 -0
  1552. data/vendor/assets/images/katello/add2.png +0 -0
  1553. data/vendor/assets/images/katello/addhost.png +0 -0
  1554. data/vendor/assets/images/katello/addhost2.png +0 -0
  1555. data/vendor/assets/images/katello/bg_header.jpg +0 -0
  1556. data/vendor/assets/images/katello/bg_menu_big.jpg +0 -0
  1557. data/vendor/assets/images/katello/bg_toolbarheader.jpg +0 -0
  1558. data/vendor/assets/images/katello/close.png +0 -0
  1559. data/vendor/assets/images/katello/delete.png +0 -0
  1560. data/vendor/assets/images/katello/delete_white.gif +0 -0
  1561. data/vendor/assets/images/katello/file.gif +0 -0
  1562. data/vendor/assets/images/katello/folder-closed.gif +0 -0
  1563. data/vendor/assets/images/katello/folder.gif +0 -0
  1564. data/vendor/assets/images/katello/folderClosed.gif +0 -0
  1565. data/vendor/assets/images/katello/icon_add_hardwarePool.png +0 -0
  1566. data/vendor/assets/images/katello/icon_add_vmpool.png +0 -0
  1567. data/vendor/assets/images/katello/icon_addhost.gif +0 -0
  1568. data/vendor/assets/images/katello/icon_addstorage.gif +0 -0
  1569. data/vendor/assets/images/katello/icon_addstorage.png +0 -0
  1570. data/vendor/assets/images/katello/icon_dashboard.gif +0 -0
  1571. data/vendor/assets/images/katello/icon_delete.gif +0 -0
  1572. data/vendor/assets/images/katello/icon_hdwarepool.png +0 -0
  1573. data/vendor/assets/images/katello/icon_help.png +0 -0
  1574. data/vendor/assets/images/katello/icon_menu_arrow.gif +0 -0
  1575. data/vendor/assets/images/katello/icon_newgroup.gif +0 -0
  1576. data/vendor/assets/images/katello/icon_search.png +0 -0
  1577. data/vendor/assets/images/katello/icon_toolbar_arrow.gif +0 -0
  1578. data/vendor/assets/images/katello/icon_unassignedhost.gif +0 -0
  1579. data/vendor/assets/images/katello/icon_vmpool.png +0 -0
  1580. data/vendor/assets/images/katello/image_ovirt.png +0 -0
  1581. data/vendor/assets/images/katello/minus.gif +0 -0
  1582. data/vendor/assets/images/katello/move.png +0 -0
  1583. data/vendor/assets/images/katello/plus.gif +0 -0
  1584. data/vendor/assets/images/katello/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  1585. data/vendor/assets/images/katello/ui-bg_flat_75_ffffff_40x100.png +0 -0
  1586. data/vendor/assets/images/katello/ui-bg_highlight-hard_75_dadada_1x100.png +0 -0
  1587. data/vendor/assets/images/katello/ui-bg_highlight-hard_75_e6e6e6_1x100.png +0 -0
  1588. data/vendor/assets/images/katello/ui-bg_highlight-hard_95_ffffff_1x100.png +0 -0
  1589. data/vendor/assets/images/katello/ui-bg_highlight-soft_80_e0e0e0_1x100.png +0 -0
  1590. data/vendor/assets/images/katello/ui-bg_inset-hard_65_ffffff_1x100.png +0 -0
  1591. data/vendor/assets/images/katello/ui-bg_inset-soft_95_fef1ec_1x100.png +0 -0
  1592. data/vendor/assets/images/katello/ui-icons_8f8f8f_256x240.png +0 -0
  1593. data/vendor/assets/images/katello/ui-icons_97baed_256x240.png +0 -0
  1594. data/vendor/assets/images/katello/ui-icons_cd0a0a_256x240.png +0 -0
  1595. data/vendor/assets/javascripts/katello/jquery-1.7.2.js +9404 -0
  1596. data/vendor/assets/stylesheets/katello/facebox.css +101 -0
  1597. data/vendor/assets/stylesheets/katello/jquery-ui-1.8.11.custom.css +573 -0
  1598. data/vendor/assets/stylesheets/katello/jquery.jnotify.css +98 -0
  1599. data/vendor/assets/stylesheets/katello/jquery.jscrollpane.css +120 -0
  1600. data/vendor/assets/stylesheets/katello/jquery.loadmask.css +40 -0
  1601. data/vendor/assets/stylesheets/katello/jquery.multiselect.css +23 -0
  1602. data/vendor/assets/stylesheets/katello/jquery.multiselect.filter.css +3 -0
  1603. data/vendor/assets/stylesheets/katello/jquery.timepickr.css +40 -0
  1604. data/vendor/assets/stylesheets/katello/jquery.tipsy.css +25 -0
  1605. data/vendor/assets/stylesheets/katello/jquery.treeTable.css +43 -0
  1606. data/vendor/assets/stylesheets/katello/ui.spinner.css +3 -0
  1607. metadata +2281 -0
@@ -0,0 +1,337 @@
1
+ /**
2
+ * The following features are still outstanding: animation as a
3
+ * function, placement as a function, inside, support for more triggers than
4
+ * just mouse enter/leave, html tooltips, and selector delegation.
5
+ */
6
+ angular.module( 'ui.bootstrap.tooltip', [ 'ui.bootstrap.position', 'ui.bootstrap.bindHtml' ] )
7
+
8
+ /**
9
+ * The $tooltip service creates tooltip- and popover-like directives as well as
10
+ * houses global options for them.
11
+ */
12
+ .provider( '$tooltip', function () {
13
+ // The default options tooltip and popover.
14
+ var defaultOptions = {
15
+ placement: 'top',
16
+ animation: true,
17
+ popupDelay: 0
18
+ };
19
+
20
+ // Default hide triggers for each show trigger
21
+ var triggerMap = {
22
+ 'mouseenter': 'mouseleave',
23
+ 'click': 'click',
24
+ 'focus': 'blur'
25
+ };
26
+
27
+ // The options specified to the provider globally.
28
+ var globalOptions = {};
29
+
30
+ /**
31
+ * `options({})` allows global configuration of all tooltips in the
32
+ * application.
33
+ *
34
+ * var app = angular.module( 'App', ['ui.bootstrap.tooltip'], function( $tooltipProvider ) {
35
+ * // place tooltips left instead of top by default
36
+ * $tooltipProvider.options( { placement: 'left' } );
37
+ * });
38
+ */
39
+ this.options = function( value ) {
40
+ angular.extend( globalOptions, value );
41
+ };
42
+
43
+ /**
44
+ * This allows you to extend the set of trigger mappings available. E.g.:
45
+ *
46
+ * $tooltipProvider.setTriggers( 'openTrigger': 'closeTrigger' );
47
+ */
48
+ this.setTriggers = function setTriggers ( triggers ) {
49
+ angular.extend( triggerMap, triggers );
50
+ };
51
+
52
+ /**
53
+ * This is a helper function for translating camel-case to snake-case.
54
+ */
55
+ function snake_case(name){
56
+ var regexp = /[A-Z]/g;
57
+ var separator = '-';
58
+ return name.replace(regexp, function(letter, pos) {
59
+ return (pos ? separator : '') + letter.toLowerCase();
60
+ });
61
+ }
62
+
63
+ /**
64
+ * Returns the actual instance of the $tooltip service.
65
+ * TODO support multiple triggers
66
+ */
67
+ this.$get = [ '$window', '$compile', '$timeout', '$parse', '$document', '$position', '$interpolate', function ( $window, $compile, $timeout, $parse, $document, $position, $interpolate ) {
68
+ return function $tooltip ( type, prefix, defaultTriggerShow ) {
69
+ var options = angular.extend( {}, defaultOptions, globalOptions );
70
+
71
+ /**
72
+ * Returns an object of show and hide triggers.
73
+ *
74
+ * If a trigger is supplied,
75
+ * it is used to show the tooltip; otherwise, it will use the `trigger`
76
+ * option passed to the `$tooltipProvider.options` method; else it will
77
+ * default to the trigger supplied to this directive factory.
78
+ *
79
+ * The hide trigger is based on the show trigger. If the `trigger` option
80
+ * was passed to the `$tooltipProvider.options` method, it will use the
81
+ * mapped trigger from `triggerMap` or the passed trigger if the map is
82
+ * undefined; otherwise, it uses the `triggerMap` value of the show
83
+ * trigger; else it will just use the show trigger.
84
+ */
85
+ function getTriggers ( trigger ) {
86
+ var show = trigger || options.trigger || defaultTriggerShow;
87
+ var hide = triggerMap[show] || show;
88
+ return {
89
+ show: show,
90
+ hide: hide
91
+ };
92
+ }
93
+
94
+ var directiveName = snake_case( type );
95
+
96
+ var startSym = $interpolate.startSymbol();
97
+ var endSym = $interpolate.endSymbol();
98
+ var template =
99
+ '<'+ directiveName +'-popup '+
100
+ 'title="'+startSym+'tt_title'+endSym+'" '+
101
+ 'content="'+startSym+'tt_content'+endSym+'" '+
102
+ 'placement="'+startSym+'tt_placement'+endSym+'" '+
103
+ 'animation="tt_animation()" '+
104
+ 'is-open="tt_isOpen"'+
105
+ '>'+
106
+ '</'+ directiveName +'-popup>';
107
+
108
+ return {
109
+ restrict: 'EA',
110
+ scope: true,
111
+ link: function link ( scope, element, attrs ) {
112
+ var tooltip = $compile( template )( scope );
113
+ var transitionTimeout;
114
+ var popupTimeout;
115
+ var $body;
116
+ var appendToBody = angular.isDefined( options.appendToBody ) ? options.appendToBody : false;
117
+ var triggers = getTriggers( undefined );
118
+ var hasRegisteredTriggers = false;
119
+
120
+ // By default, the tooltip is not open.
121
+ // TODO add ability to start tooltip opened
122
+ scope.tt_isOpen = false;
123
+
124
+ function toggleTooltipBind () {
125
+ if ( ! scope.tt_isOpen ) {
126
+ showTooltipBind();
127
+ } else {
128
+ hideTooltipBind();
129
+ }
130
+ }
131
+
132
+ // Show the tooltip with delay if specified, otherwise show it immediately
133
+ function showTooltipBind() {
134
+ if ( scope.tt_popupDelay ) {
135
+ popupTimeout = $timeout( show, scope.tt_popupDelay );
136
+ } else {
137
+ scope.$apply( show );
138
+ }
139
+ }
140
+
141
+ function hideTooltipBind () {
142
+ scope.$apply(function () {
143
+ hide();
144
+ });
145
+ }
146
+
147
+ // Show the tooltip popup element.
148
+ function show() {
149
+ var position,
150
+ ttWidth,
151
+ ttHeight,
152
+ ttPosition;
153
+
154
+ // Don't show empty tooltips.
155
+ if ( ! scope.tt_content ) {
156
+ return;
157
+ }
158
+
159
+ // If there is a pending remove transition, we must cancel it, lest the
160
+ // tooltip be mysteriously removed.
161
+ if ( transitionTimeout ) {
162
+ $timeout.cancel( transitionTimeout );
163
+ }
164
+
165
+ // Set the initial positioning.
166
+ tooltip.css({ top: 0, left: 0, display: 'block' });
167
+
168
+ // Now we add it to the DOM because need some info about it. But it's not
169
+ // visible yet anyway.
170
+ if ( appendToBody ) {
171
+ $body = $body || $document.find( 'body' );
172
+ $body.append( tooltip );
173
+ } else {
174
+ element.after( tooltip );
175
+ }
176
+
177
+ // Get the position of the directive element.
178
+ position = appendToBody ? $position.offset( element ) : $position.position( element );
179
+
180
+ // Get the height and width of the tooltip so we can center it.
181
+ ttWidth = tooltip.prop( 'offsetWidth' );
182
+ ttHeight = tooltip.prop( 'offsetHeight' );
183
+
184
+ // Calculate the tooltip's top and left coordinates to center it with
185
+ // this directive.
186
+ switch ( scope.tt_placement ) {
187
+ case 'right':
188
+ ttPosition = {
189
+ top: position.top + position.height / 2 - ttHeight / 2,
190
+ left: position.left + position.width
191
+ };
192
+ break;
193
+ case 'bottom':
194
+ ttPosition = {
195
+ top: position.top + position.height,
196
+ left: position.left + position.width / 2 - ttWidth / 2
197
+ };
198
+ break;
199
+ case 'left':
200
+ ttPosition = {
201
+ top: position.top + position.height / 2 - ttHeight / 2,
202
+ left: position.left - ttWidth
203
+ };
204
+ break;
205
+ default:
206
+ ttPosition = {
207
+ top: position.top - ttHeight,
208
+ left: position.left + position.width / 2 - ttWidth / 2
209
+ };
210
+ break;
211
+ }
212
+
213
+ ttPosition.top += 'px';
214
+ ttPosition.left += 'px';
215
+
216
+ // Now set the calculated positioning.
217
+ tooltip.css( ttPosition );
218
+
219
+ // And show the tooltip.
220
+ scope.tt_isOpen = true;
221
+ }
222
+
223
+ // Hide the tooltip popup element.
224
+ function hide() {
225
+ // First things first: we don't show it anymore.
226
+ scope.tt_isOpen = false;
227
+
228
+ //if tooltip is going to be shown after delay, we must cancel this
229
+ $timeout.cancel( popupTimeout );
230
+
231
+ // And now we remove it from the DOM. However, if we have animation, we
232
+ // need to wait for it to expire beforehand.
233
+ // FIXME: this is a placeholder for a port of the transitions library.
234
+ if ( angular.isDefined( scope.tt_animation ) && scope.tt_animation() ) {
235
+ transitionTimeout = $timeout( function () { tooltip.remove(); }, 500 );
236
+ } else {
237
+ tooltip.remove();
238
+ }
239
+ }
240
+
241
+ /**
242
+ * Observe the relevant attributes.
243
+ */
244
+ attrs.$observe( type, function ( val ) {
245
+ scope.tt_content = val;
246
+ });
247
+
248
+ attrs.$observe( prefix+'Title', function ( val ) {
249
+ scope.tt_title = val;
250
+ });
251
+
252
+ attrs.$observe( prefix+'Placement', function ( val ) {
253
+ scope.tt_placement = angular.isDefined( val ) ? val : options.placement;
254
+ });
255
+
256
+ attrs.$observe( prefix+'Animation', function ( val ) {
257
+ scope.tt_animation = angular.isDefined( val ) ? $parse( val ) : function(){ return options.animation; };
258
+ });
259
+
260
+ attrs.$observe( prefix+'PopupDelay', function ( val ) {
261
+ var delay = parseInt( val, 10 );
262
+ scope.tt_popupDelay = ! isNaN(delay) ? delay : options.popupDelay;
263
+ });
264
+
265
+ attrs.$observe( prefix+'Trigger', function ( val ) {
266
+
267
+ if (hasRegisteredTriggers) {
268
+ element.unbind( triggers.show, showTooltipBind );
269
+ element.unbind( triggers.hide, hideTooltipBind );
270
+ }
271
+
272
+ triggers = getTriggers( val );
273
+
274
+ if ( triggers.show === triggers.hide ) {
275
+ element.bind( triggers.show, toggleTooltipBind );
276
+ } else {
277
+ element.bind( triggers.show, showTooltipBind );
278
+ element.bind( triggers.hide, hideTooltipBind );
279
+ }
280
+
281
+ hasRegisteredTriggers = true;
282
+ });
283
+
284
+ attrs.$observe( prefix+'AppendToBody', function ( val ) {
285
+ appendToBody = angular.isDefined( val ) ? $parse( val )( scope ) : appendToBody;
286
+ });
287
+
288
+ // if a tooltip is attached to <body> we need to remove it on
289
+ // location change as its parent scope will probably not be destroyed
290
+ // by the change.
291
+ if ( appendToBody ) {
292
+ scope.$on('$locationChangeSuccess', function closeTooltipOnLocationChangeSuccess () {
293
+ if ( scope.tt_isOpen ) {
294
+ hide();
295
+ }
296
+ });
297
+ }
298
+
299
+ // Make sure tooltip is destroyed and removed.
300
+ scope.$on('$destroy', function onDestroyTooltip() {
301
+ if ( scope.tt_isOpen ) {
302
+ hide();
303
+ } else {
304
+ tooltip.remove();
305
+ }
306
+ });
307
+ }
308
+ };
309
+ };
310
+ }];
311
+ })
312
+
313
+ .directive( 'tooltipPopup', function () {
314
+ return {
315
+ restrict: 'E',
316
+ replace: true,
317
+ scope: { content: '@', placement: '@', animation: '&', isOpen: '&' },
318
+ templateUrl: 'template/tooltip/tooltip-popup.html'
319
+ };
320
+ })
321
+
322
+ .directive( 'tooltip', [ '$tooltip', function ( $tooltip ) {
323
+ return $tooltip( 'tooltip', 'tooltip', 'mouseenter' );
324
+ }])
325
+
326
+ .directive( 'tooltipHtmlUnsafePopup', function () {
327
+ return {
328
+ restrict: 'E',
329
+ replace: true,
330
+ scope: { content: '@', placement: '@', animation: '&', isOpen: '&' },
331
+ templateUrl: 'template/tooltip/tooltip-html-unsafe-popup.html'
332
+ };
333
+ })
334
+
335
+ .directive( 'tooltipHtmlUnsafe', [ '$tooltip', function ( $tooltip ) {
336
+ return $tooltip( 'tooltipHtmlUnsafe', 'tooltip', 'mouseenter' );
337
+ }]);
@@ -0,0 +1,1478 @@
1
+ /**
2
+ * State-based routing for AngularJS
3
+ * @version v0.2.0
4
+ * @link http://angular-ui.github.com/
5
+ * @license MIT License, http://www.opensource.org/licenses/MIT
6
+ */
7
+ (function (window, angular, undefined) {
8
+ /*jshint globalstrict:true*/
9
+ /*global angular:false*/
10
+ 'use strict';
11
+
12
+ var isDefined = angular.isDefined,
13
+ isFunction = angular.isFunction,
14
+ isString = angular.isString,
15
+ isObject = angular.isObject,
16
+ isArray = angular.isArray,
17
+ forEach = angular.forEach,
18
+ extend = angular.extend,
19
+ copy = angular.copy;
20
+
21
+ function inherit(parent, extra) {
22
+ return extend(new (extend(function() {}, { prototype: parent }))(), extra);
23
+ }
24
+
25
+ function merge(dst) {
26
+ forEach(arguments, function(obj) {
27
+ if (obj !== dst) {
28
+ forEach(obj, function(value, key) {
29
+ if (!dst.hasOwnProperty(key)) dst[key] = value;
30
+ });
31
+ }
32
+ });
33
+ return dst;
34
+ }
35
+
36
+ /**
37
+ * Finds the common ancestor path between two states.
38
+ *
39
+ * @param {Object} first The first state.
40
+ * @param {Object} second The second state.
41
+ * @return {Array} Returns an array of state names in descending order, not including the root.
42
+ */
43
+ function ancestors(first, second) {
44
+ var path = [];
45
+
46
+ for (var n in first.path) {
47
+ if (first.path[n] === "") continue;
48
+ if (!second.path[n]) break;
49
+ path.push(first.path[n]);
50
+ }
51
+ return path;
52
+ }
53
+
54
+ /**
55
+ * Merges a set of parameters with all parameters inherited between the common parents of the
56
+ * current state and a given destination state.
57
+ *
58
+ * @param {Object} currentParams The value of the current state parameters ($stateParams).
59
+ * @param {Object} newParams The set of parameters which will be composited with inherited params.
60
+ * @param {Object} $current Internal definition of object representing the current state.
61
+ * @param {Object} $to Internal definition of object representing state to transition to.
62
+ */
63
+ function inheritParams(currentParams, newParams, $current, $to) {
64
+ var parents = ancestors($current, $to), parentParams, inherited = {}, inheritList = [];
65
+
66
+ for (var i in parents) {
67
+ if (!parents[i].params || !parents[i].params.length) continue;
68
+ parentParams = parents[i].params;
69
+
70
+ for (var j in parentParams) {
71
+ if (inheritList.indexOf(parentParams[j]) >= 0) continue;
72
+ inheritList.push(parentParams[j]);
73
+ inherited[parentParams[j]] = currentParams[parentParams[j]];
74
+ }
75
+ }
76
+ return extend({}, inherited, newParams);
77
+ }
78
+
79
+ angular.module('ui.router.util', ['ng']);
80
+ angular.module('ui.router.router', ['ui.router.util']);
81
+ angular.module('ui.router.state', ['ui.router.router', 'ui.router.util']);
82
+ angular.module('ui.router', ['ui.router.state']);
83
+ angular.module('ui.router.compat', ['ui.router']);
84
+
85
+
86
+ /**
87
+ * Service (`ui-util`). Manages resolution of (acyclic) graphs of promises.
88
+ * @module $resolve
89
+ * @requires $q
90
+ * @requires $injector
91
+ */
92
+ $Resolve.$inject = ['$q', '$injector'];
93
+ function $Resolve( $q, $injector) {
94
+
95
+ var VISIT_IN_PROGRESS = 1,
96
+ VISIT_DONE = 2,
97
+ NOTHING = {},
98
+ NO_DEPENDENCIES = [],
99
+ NO_LOCALS = NOTHING,
100
+ NO_PARENT = extend($q.when(NOTHING), { $$promises: NOTHING, $$values: NOTHING });
101
+
102
+
103
+ /**
104
+ * Studies a set of invocables that are likely to be used multiple times.
105
+ * $resolve.study(invocables)(locals, parent, self)
106
+ * is equivalent to
107
+ * $resolve.resolve(invocables, locals, parent, self)
108
+ * but the former is more efficient (in fact `resolve` just calls `study` internally).
109
+ * See {@link module:$resolve/resolve} for details.
110
+ * @function
111
+ * @param {Object} invocables
112
+ * @return {Function}
113
+ */
114
+ this.study = function (invocables) {
115
+ if (!isObject(invocables)) throw new Error("'invocables' must be an object");
116
+
117
+ // Perform a topological sort of invocables to build an ordered plan
118
+ var plan = [], cycle = [], visited = {};
119
+ function visit(value, key) {
120
+ if (visited[key] === VISIT_DONE) return;
121
+
122
+ cycle.push(key);
123
+ if (visited[key] === VISIT_IN_PROGRESS) {
124
+ cycle.splice(0, cycle.indexOf(key));
125
+ throw new Error("Cyclic dependency: " + cycle.join(" -> "));
126
+ }
127
+ visited[key] = VISIT_IN_PROGRESS;
128
+
129
+ if (isString(value)) {
130
+ plan.push(key, [ function() { return $injector.get(key); }], NO_DEPENDENCIES);
131
+ } else {
132
+ var params = $injector.annotate(value);
133
+ forEach(params, function (param) {
134
+ if (param !== key && invocables.hasOwnProperty(param)) visit(invocables[param], param);
135
+ });
136
+ plan.push(key, value, params);
137
+ }
138
+
139
+ cycle.pop();
140
+ visited[key] = VISIT_DONE;
141
+ }
142
+ forEach(invocables, visit);
143
+ invocables = cycle = visited = null; // plan is all that's required
144
+
145
+ function isResolve(value) {
146
+ return isObject(value) && value.then && value.$$promises;
147
+ }
148
+
149
+ return function (locals, parent, self) {
150
+ if (isResolve(locals) && self === undefined) {
151
+ self = parent; parent = locals; locals = null;
152
+ }
153
+ if (!locals) locals = NO_LOCALS;
154
+ else if (!isObject(locals)) {
155
+ throw new Error("'locals' must be an object");
156
+ }
157
+ if (!parent) parent = NO_PARENT;
158
+ else if (!isResolve(parent)) {
159
+ throw new Error("'parent' must be a promise returned by $resolve.resolve()");
160
+ }
161
+
162
+ // To complete the overall resolution, we have to wait for the parent
163
+ // promise and for the promise for each invokable in our plan.
164
+ var resolution = $q.defer(),
165
+ result = resolution.promise,
166
+ promises = result.$$promises = {},
167
+ values = extend({}, locals),
168
+ wait = 1 + plan.length/3,
169
+ merged = false;
170
+
171
+ function done() {
172
+ // Merge parent values we haven't got yet and publish our own $$values
173
+ if (!--wait) {
174
+ if (!merged) merge(values, parent.$$values);
175
+ result.$$values = values;
176
+ result.$$promises = true; // keep for isResolve()
177
+ resolution.resolve(values);
178
+ }
179
+ }
180
+
181
+ function fail(reason) {
182
+ result.$$failure = reason;
183
+ resolution.reject(reason);
184
+ }
185
+
186
+ // Short-circuit if parent has already failed
187
+ if (isDefined(parent.$$failure)) {
188
+ fail(parent.$$failure);
189
+ return result;
190
+ }
191
+
192
+ // Merge parent values if the parent has already resolved, or merge
193
+ // parent promises and wait if the parent resolve is still in progress.
194
+ if (parent.$$values) {
195
+ merged = merge(values, parent.$$values);
196
+ done();
197
+ } else {
198
+ extend(promises, parent.$$promises);
199
+ parent.then(done, fail);
200
+ }
201
+
202
+ // Process each invocable in the plan, but ignore any where a local of the same name exists.
203
+ for (var i=0, ii=plan.length; i<ii; i+=3) {
204
+ if (locals.hasOwnProperty(plan[i])) done();
205
+ else invoke(plan[i], plan[i+1], plan[i+2]);
206
+ }
207
+
208
+ function invoke(key, invocable, params) {
209
+ // Create a deferred for this invocation. Failures will propagate to the resolution as well.
210
+ var invocation = $q.defer(), waitParams = 0;
211
+ function onfailure(reason) {
212
+ invocation.reject(reason);
213
+ fail(reason);
214
+ }
215
+ // Wait for any parameter that we have a promise for (either from parent or from this
216
+ // resolve; in that case study() will have made sure it's ordered before us in the plan).
217
+ params.forEach(function (dep) {
218
+ if (promises.hasOwnProperty(dep) && !locals.hasOwnProperty(dep)) {
219
+ waitParams++;
220
+ promises[dep].then(function (result) {
221
+ values[dep] = result;
222
+ if (!(--waitParams)) proceed();
223
+ }, onfailure);
224
+ }
225
+ });
226
+ if (!waitParams) proceed();
227
+ function proceed() {
228
+ if (isDefined(result.$$failure)) return;
229
+ try {
230
+ invocation.resolve($injector.invoke(invocable, self, values));
231
+ invocation.promise.then(function (result) {
232
+ values[key] = result;
233
+ done();
234
+ }, onfailure);
235
+ } catch (e) {
236
+ onfailure(e);
237
+ }
238
+ }
239
+ // Publish promise synchronously; invocations further down in the plan may depend on it.
240
+ promises[key] = invocation.promise;
241
+ }
242
+
243
+ return result;
244
+ };
245
+ };
246
+
247
+ /**
248
+ * Resolves a set of invocables. An invocable is a function to be invoked via `$injector.invoke()`,
249
+ * and can have an arbitrary number of dependencies. An invocable can either return a value directly,
250
+ * or a `$q` promise. If a promise is returned it will be resolved and the resulting value will be
251
+ * used instead. Dependencies of invocables are resolved (in this order of precedence)
252
+ *
253
+ * - from the specified `locals`
254
+ * - from another invocable that is part of this `$resolve` call
255
+ * - from an invocable that is inherited from a `parent` call to `$resolve` (or recursively
256
+ * from any ancestor `$resolve` of that parent).
257
+ *
258
+ * The return value of `$resolve` is a promise for an object that contains (in this order of precedence)
259
+ *
260
+ * - any `locals` (if specified)
261
+ * - the resolved return values of all injectables
262
+ * - any values inherited from a `parent` call to `$resolve` (if specified)
263
+ *
264
+ * The promise will resolve after the `parent` promise (if any) and all promises returned by injectables
265
+ * have been resolved. If any invocable (or `$injector.invoke`) throws an exception, or if a promise
266
+ * returned by an invocable is rejected, the `$resolve` promise is immediately rejected with the same error.
267
+ * A rejection of a `parent` promise (if specified) will likewise be propagated immediately. Once the
268
+ * `$resolve` promise has been rejected, no further invocables will be called.
269
+ *
270
+ * Cyclic dependencies between invocables are not permitted and will caues `$resolve` to throw an
271
+ * error. As a special case, an injectable can depend on a parameter with the same name as the injectable,
272
+ * which will be fulfilled from the `parent` injectable of the same name. This allows inherited values
273
+ * to be decorated. Note that in this case any other injectable in the same `$resolve` with the same
274
+ * dependency would see the decorated value, not the inherited value.
275
+ *
276
+ * Note that missing dependencies -- unlike cyclic dependencies -- will cause an (asynchronous) rejection
277
+ * of the `$resolve` promise rather than a (synchronous) exception.
278
+ *
279
+ * Invocables are invoked eagerly as soon as all dependencies are available. This is true even for
280
+ * dependencies inherited from a `parent` call to `$resolve`.
281
+ *
282
+ * As a special case, an invocable can be a string, in which case it is taken to be a service name
283
+ * to be passed to `$injector.get()`. This is supported primarily for backwards-compatibility with the
284
+ * `resolve` property of `$routeProvider` routes.
285
+ *
286
+ * @function
287
+ * @param {Object.<string, Function|string>} invocables functions to invoke or `$injector` services to fetch.
288
+ * @param {Object.<string, *>} [locals] values to make available to the injectables
289
+ * @param {Promise.<Object>} [parent] a promise returned by another call to `$resolve`.
290
+ * @param {Object} [self] the `this` for the invoked methods
291
+ * @return {Promise.<Object>} Promise for an object that contains the resolved return value
292
+ * of all invocables, as well as any inherited and local values.
293
+ */
294
+ this.resolve = function (invocables, locals, parent, self) {
295
+ return this.study(invocables)(locals, parent, self);
296
+ };
297
+ }
298
+
299
+ angular.module('ui.router.util').service('$resolve', $Resolve);
300
+
301
+
302
+ /**
303
+ * Service. Manages loading of templates.
304
+ * @constructor
305
+ * @name $templateFactory
306
+ * @requires $http
307
+ * @requires $templateCache
308
+ * @requires $injector
309
+ */
310
+ $TemplateFactory.$inject = ['$http', '$templateCache', '$injector'];
311
+ function $TemplateFactory( $http, $templateCache, $injector) {
312
+
313
+ /**
314
+ * Creates a template from a configuration object.
315
+ * @function
316
+ * @name $templateFactory#fromConfig
317
+ * @methodOf $templateFactory
318
+ * @param {Object} config Configuration object for which to load a template. The following
319
+ * properties are search in the specified order, and the first one that is defined is
320
+ * used to create the template:
321
+ * @param {string|Function} config.template html string template or function to load via
322
+ * {@link $templateFactory#fromString fromString}.
323
+ * @param {string|Function} config.templateUrl url to load or a function returning the url
324
+ * to load via {@link $templateFactory#fromUrl fromUrl}.
325
+ * @param {Function} config.templateProvider function to invoke via
326
+ * {@link $templateFactory#fromProvider fromProvider}.
327
+ * @param {Object} params Parameters to pass to the template function.
328
+ * @param {Object} [locals] Locals to pass to `invoke` if the template is loaded via a
329
+ * `templateProvider`. Defaults to `{ params: params }`.
330
+ * @return {string|Promise.<string>} The template html as a string, or a promise for that string,
331
+ * or `null` if no template is configured.
332
+ */
333
+ this.fromConfig = function (config, params, locals) {
334
+ return (
335
+ isDefined(config.template) ? this.fromString(config.template, params) :
336
+ isDefined(config.templateUrl) ? this.fromUrl(config.templateUrl, params) :
337
+ isDefined(config.templateProvider) ? this.fromProvider(config.templateProvider, params, locals) :
338
+ null
339
+ );
340
+ };
341
+
342
+ /**
343
+ * Creates a template from a string or a function returning a string.
344
+ * @function
345
+ * @name $templateFactory#fromString
346
+ * @methodOf $templateFactory
347
+ * @param {string|Function} template html template as a string or function that returns an html
348
+ * template as a string.
349
+ * @param {Object} params Parameters to pass to the template function.
350
+ * @return {string|Promise.<string>} The template html as a string, or a promise for that string.
351
+ */
352
+ this.fromString = function (template, params) {
353
+ return isFunction(template) ? template(params) : template;
354
+ };
355
+
356
+ /**
357
+ * Loads a template from the a URL via `$http` and `$templateCache`.
358
+ * @function
359
+ * @name $templateFactory#fromUrl
360
+ * @methodOf $templateFactory
361
+ * @param {string|Function} url url of the template to load, or a function that returns a url.
362
+ * @param {Object} params Parameters to pass to the url function.
363
+ * @return {string|Promise.<string>} The template html as a string, or a promise for that string.
364
+ */
365
+ this.fromUrl = function (url, params) {
366
+ if (isFunction(url)) url = url(params);
367
+ if (url == null) return null;
368
+ else return $http
369
+ .get(url, { cache: $templateCache })
370
+ .then(function(response) { return response.data; });
371
+ };
372
+
373
+ /**
374
+ * Creates a template by invoking an injectable provider function.
375
+ * @function
376
+ * @name $templateFactory#fromUrl
377
+ * @methodOf $templateFactory
378
+ * @param {Function} provider Function to invoke via `$injector.invoke`
379
+ * @param {Object} params Parameters for the template.
380
+ * @param {Object} [locals] Locals to pass to `invoke`. Defaults to `{ params: params }`.
381
+ * @return {string|Promise.<string>} The template html as a string, or a promise for that string.
382
+ */
383
+ this.fromProvider = function (provider, params, locals) {
384
+ return $injector.invoke(provider, null, locals || { params: params });
385
+ };
386
+ }
387
+
388
+ angular.module('ui.router.util').service('$templateFactory', $TemplateFactory);
389
+
390
+ /**
391
+ * Matches URLs against patterns and extracts named parameters from the path or the search
392
+ * part of the URL. A URL pattern consists of a path pattern, optionally followed by '?' and a list
393
+ * of search parameters. Multiple search parameter names are separated by '&'. Search parameters
394
+ * do not influence whether or not a URL is matched, but their values are passed through into
395
+ * the matched parameters returned by {@link UrlMatcher#exec exec}.
396
+ *
397
+ * Path parameter placeholders can be specified using simple colon/catch-all syntax or curly brace
398
+ * syntax, which optionally allows a regular expression for the parameter to be specified:
399
+ *
400
+ * * ':' name - colon placeholder
401
+ * * '*' name - catch-all placeholder
402
+ * * '{' name '}' - curly placeholder
403
+ * * '{' name ':' regexp '}' - curly placeholder with regexp. Should the regexp itself contain
404
+ * curly braces, they must be in matched pairs or escaped with a backslash.
405
+ *
406
+ * Parameter names may contain only word characters (latin letters, digits, and underscore) and
407
+ * must be unique within the pattern (across both path and search parameters). For colon
408
+ * placeholders or curly placeholders without an explicit regexp, a path parameter matches any
409
+ * number of characters other than '/'. For catch-all placeholders the path parameter matches
410
+ * any number of characters.
411
+ *
412
+ * ### Examples
413
+ *
414
+ * * '/hello/' - Matches only if the path is exactly '/hello/'. There is no special treatment for
415
+ * trailing slashes, and patterns have to match the entire path, not just a prefix.
416
+ * * '/user/:id' - Matches '/user/bob' or '/user/1234!!!' or even '/user/' but not '/user' or
417
+ * '/user/bob/details'. The second path segment will be captured as the parameter 'id'.
418
+ * * '/user/{id}' - Same as the previous example, but using curly brace syntax.
419
+ * * '/user/{id:[^/]*}' - Same as the previous example.
420
+ * * '/user/{id:[0-9a-fA-F]{1,8}}' - Similar to the previous example, but only matches if the id
421
+ * parameter consists of 1 to 8 hex digits.
422
+ * * '/files/{path:.*}' - Matches any URL starting with '/files/' and captures the rest of the
423
+ * path into the parameter 'path'.
424
+ * * '/files/*path' - ditto.
425
+ *
426
+ * @constructor
427
+ * @param {string} pattern the pattern to compile into a matcher.
428
+ *
429
+ * @property {string} prefix A static prefix of this pattern. The matcher guarantees that any
430
+ * URL matching this matcher (i.e. any string for which {@link UrlMatcher#exec exec()} returns
431
+ * non-null) will start with this prefix.
432
+ */
433
+ function UrlMatcher(pattern) {
434
+
435
+ // Find all placeholders and create a compiled pattern, using either classic or curly syntax:
436
+ // '*' name
437
+ // ':' name
438
+ // '{' name '}'
439
+ // '{' name ':' regexp '}'
440
+ // The regular expression is somewhat complicated due to the need to allow curly braces
441
+ // inside the regular expression. The placeholder regexp breaks down as follows:
442
+ // ([:*])(\w+) classic placeholder ($1 / $2)
443
+ // \{(\w+)(?:\:( ... ))?\} curly brace placeholder ($3) with optional regexp ... ($4)
444
+ // (?: ... | ... | ... )+ the regexp consists of any number of atoms, an atom being either
445
+ // [^{}\\]+ - anything other than curly braces or backslash
446
+ // \\. - a backslash escape
447
+ // \{(?:[^{}\\]+|\\.)*\} - a matched set of curly braces containing other atoms
448
+ var placeholder = /([:*])(\w+)|\{(\w+)(?:\:((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g,
449
+ names = {}, compiled = '^', last = 0, m,
450
+ segments = this.segments = [],
451
+ params = this.params = [];
452
+
453
+ function addParameter(id) {
454
+ if (!/^\w+(-+\w+)*$/.test(id)) throw new Error("Invalid parameter name '" + id + "' in pattern '" + pattern + "'");
455
+ if (names[id]) throw new Error("Duplicate parameter name '" + id + "' in pattern '" + pattern + "'");
456
+ names[id] = true;
457
+ params.push(id);
458
+ }
459
+
460
+ function quoteRegExp(string) {
461
+ return string.replace(/[\\\[\]\^$*+?.()|{}]/g, "\\$&");
462
+ }
463
+
464
+ this.source = pattern;
465
+
466
+ // Split into static segments separated by path parameter placeholders.
467
+ // The number of segments is always 1 more than the number of parameters.
468
+ var id, regexp, segment;
469
+ while ((m = placeholder.exec(pattern))) {
470
+ id = m[2] || m[3]; // IE[78] returns '' for unmatched groups instead of null
471
+ regexp = m[4] || (m[1] == '*' ? '.*' : '[^/]*');
472
+ segment = pattern.substring(last, m.index);
473
+ if (segment.indexOf('?') >= 0) break; // we're into the search part
474
+ compiled += quoteRegExp(segment) + '(' + regexp + ')';
475
+ addParameter(id);
476
+ segments.push(segment);
477
+ last = placeholder.lastIndex;
478
+ }
479
+ segment = pattern.substring(last);
480
+
481
+ // Find any search parameter names and remove them from the last segment
482
+ var i = segment.indexOf('?');
483
+ if (i >= 0) {
484
+ var search = this.sourceSearch = segment.substring(i);
485
+ segment = segment.substring(0, i);
486
+ this.sourcePath = pattern.substring(0, last+i);
487
+
488
+ // Allow parameters to be separated by '?' as well as '&' to make concat() easier
489
+ forEach(search.substring(1).split(/[&?]/), addParameter);
490
+ } else {
491
+ this.sourcePath = pattern;
492
+ this.sourceSearch = '';
493
+ }
494
+
495
+ compiled += quoteRegExp(segment) + '$';
496
+ segments.push(segment);
497
+ this.regexp = new RegExp(compiled);
498
+ this.prefix = segments[0];
499
+ }
500
+
501
+ /**
502
+ * Returns a new matcher for a pattern constructed by appending the path part and adding the
503
+ * search parameters of the specified pattern to this pattern. The current pattern is not
504
+ * modified. This can be understood as creating a pattern for URLs that are relative to (or
505
+ * suffixes of) the current pattern.
506
+ *
507
+ * ### Example
508
+ * The following two matchers are equivalent:
509
+ * ```
510
+ * new UrlMatcher('/user/{id}?q').concat('/details?date');
511
+ * new UrlMatcher('/user/{id}/details?q&date');
512
+ * ```
513
+ *
514
+ * @param {string} pattern The pattern to append.
515
+ * @return {UrlMatcher} A matcher for the concatenated pattern.
516
+ */
517
+ UrlMatcher.prototype.concat = function (pattern) {
518
+ // Because order of search parameters is irrelevant, we can add our own search
519
+ // parameters to the end of the new pattern. Parse the new pattern by itself
520
+ // and then join the bits together, but it's much easier to do this on a string level.
521
+ return new UrlMatcher(this.sourcePath + pattern + this.sourceSearch);
522
+ };
523
+
524
+ UrlMatcher.prototype.toString = function () {
525
+ return this.source;
526
+ };
527
+
528
+ /**
529
+ * Tests the specified path against this matcher, and returns an object containing the captured
530
+ * parameter values, or null if the path does not match. The returned object contains the values
531
+ * of any search parameters that are mentioned in the pattern, but their value may be null if
532
+ * they are not present in `searchParams`. This means that search parameters are always treated
533
+ * as optional.
534
+ *
535
+ * ### Example
536
+ * ```
537
+ * new UrlMatcher('/user/{id}?q&r').exec('/user/bob', { x:'1', q:'hello' });
538
+ * // returns { id:'bob', q:'hello', r:null }
539
+ * ```
540
+ *
541
+ * @param {string} path The URL path to match, e.g. `$location.path()`.
542
+ * @param {Object} searchParams URL search parameters, e.g. `$location.search()`.
543
+ * @return {Object} The captured parameter values.
544
+ */
545
+ UrlMatcher.prototype.exec = function (path, searchParams) {
546
+ var m = this.regexp.exec(path);
547
+ if (!m) return null;
548
+
549
+ var params = this.params, nTotal = params.length,
550
+ nPath = this.segments.length-1,
551
+ values = {}, i;
552
+
553
+ if (nPath !== m.length - 1) throw new Error("Unbalanced capture group in route '" + this.source + "'");
554
+
555
+ for (i=0; i<nPath; i++) values[params[i]] = m[i+1];
556
+ for (/**/; i<nTotal; i++) values[params[i]] = searchParams[params[i]];
557
+
558
+ return values;
559
+ };
560
+
561
+ /**
562
+ * Returns the names of all path and search parameters of this pattern in an unspecified order.
563
+ * @return {Array.<string>} An array of parameter names. Must be treated as read-only. If the
564
+ * pattern has no parameters, an empty array is returned.
565
+ */
566
+ UrlMatcher.prototype.parameters = function () {
567
+ return this.params;
568
+ };
569
+
570
+ /**
571
+ * Creates a URL that matches this pattern by substituting the specified values
572
+ * for the path and search parameters. Null values for path parameters are
573
+ * treated as empty strings.
574
+ *
575
+ * ### Example
576
+ * ```
577
+ * new UrlMatcher('/user/{id}?q').format({ id:'bob', q:'yes' });
578
+ * // returns '/user/bob?q=yes'
579
+ * ```
580
+ *
581
+ * @param {Object} values the values to substitute for the parameters in this pattern.
582
+ * @return {string} the formatted URL (path and optionally search part).
583
+ */
584
+ UrlMatcher.prototype.format = function (values) {
585
+ var segments = this.segments, params = this.params;
586
+ if (!values) return segments.join('');
587
+
588
+ var nPath = segments.length-1, nTotal = params.length,
589
+ result = segments[0], i, search, value;
590
+
591
+ for (i=0; i<nPath; i++) {
592
+ value = values[params[i]];
593
+ // TODO: Maybe we should throw on null here? It's not really good style to use '' and null interchangeabley
594
+ if (value != null) result += encodeURIComponent(value);
595
+ result += segments[i+1];
596
+ }
597
+ for (/**/; i<nTotal; i++) {
598
+ value = values[params[i]];
599
+ if (value != null) {
600
+ result += (search ? '&' : '?') + params[i] + '=' + encodeURIComponent(value);
601
+ search = true;
602
+ }
603
+ }
604
+
605
+ return result;
606
+ };
607
+
608
+ /**
609
+ * Service. Factory for {@link UrlMatcher} instances. The factory is also available to providers
610
+ * under the name `$urlMatcherFactoryProvider`.
611
+ * @constructor
612
+ * @name $urlMatcherFactory
613
+ */
614
+ function $UrlMatcherFactory() {
615
+ /**
616
+ * Creates a {@link UrlMatcher} for the specified pattern.
617
+ * @function
618
+ * @name $urlMatcherFactory#compile
619
+ * @methodOf $urlMatcherFactory
620
+ * @param {string} pattern The URL pattern.
621
+ * @return {UrlMatcher} The UrlMatcher.
622
+ */
623
+ this.compile = function (pattern) {
624
+ return new UrlMatcher(pattern);
625
+ };
626
+
627
+ /**
628
+ * Returns true if the specified object is a UrlMatcher, or false otherwise.
629
+ * @function
630
+ * @name $urlMatcherFactory#isMatcher
631
+ * @methodOf $urlMatcherFactory
632
+ * @param {Object} o
633
+ * @return {boolean}
634
+ */
635
+ this.isMatcher = function (o) {
636
+ return isObject(o) && isFunction(o.exec) && isFunction(o.format) && isFunction(o.concat);
637
+ };
638
+
639
+ this.$get = function () {
640
+ return this;
641
+ };
642
+ }
643
+
644
+ // Register as a provider so it's available to other providers
645
+ angular.module('ui.router.util').provider('$urlMatcherFactory', $UrlMatcherFactory);
646
+
647
+
648
+ $UrlRouterProvider.$inject = ['$urlMatcherFactoryProvider'];
649
+ function $UrlRouterProvider( $urlMatcherFactory) {
650
+ var rules = [],
651
+ otherwise = null;
652
+
653
+ // Returns a string that is a prefix of all strings matching the RegExp
654
+ function regExpPrefix(re) {
655
+ var prefix = /^\^((?:\\[^a-zA-Z0-9]|[^\\\[\]\^$*+?.()|{}]+)*)/.exec(re.source);
656
+ return (prefix != null) ? prefix[1].replace(/\\(.)/g, "$1") : '';
657
+ }
658
+
659
+ // Interpolates matched values into a String.replace()-style pattern
660
+ function interpolate(pattern, match) {
661
+ return pattern.replace(/\$(\$|\d{1,2})/, function (m, what) {
662
+ return match[what === '$' ? 0 : Number(what)];
663
+ });
664
+ }
665
+
666
+ this.rule =
667
+ function (rule) {
668
+ if (!isFunction(rule)) throw new Error("'rule' must be a function");
669
+ rules.push(rule);
670
+ return this;
671
+ };
672
+
673
+ this.otherwise =
674
+ function (rule) {
675
+ if (isString(rule)) {
676
+ var redirect = rule;
677
+ rule = function () { return redirect; };
678
+ }
679
+ else if (!isFunction(rule)) throw new Error("'rule' must be a function");
680
+ otherwise = rule;
681
+ return this;
682
+ };
683
+
684
+
685
+ function handleIfMatch($injector, handler, match) {
686
+ if (!match) return false;
687
+ var result = $injector.invoke(handler, handler, { $match: match });
688
+ return isDefined(result) ? result : true;
689
+ }
690
+
691
+ this.when =
692
+ function (what, handler) {
693
+ var redirect, handlerIsString = isString(handler);
694
+ if (isString(what)) what = $urlMatcherFactory.compile(what);
695
+
696
+ if (!handlerIsString && !isFunction(handler) && !isArray(handler))
697
+ throw new Error("invalid 'handler' in when()");
698
+
699
+ var strategies = {
700
+ matcher: function (what, handler) {
701
+ if (handlerIsString) {
702
+ redirect = $urlMatcherFactory.compile(handler);
703
+ handler = ['$match', function ($match) { return redirect.format($match); }];
704
+ }
705
+ return extend(function ($injector, $location) {
706
+ return handleIfMatch($injector, handler, what.exec($location.path(), $location.search()));
707
+ }, {
708
+ prefix: isString(what.prefix) ? what.prefix : ''
709
+ });
710
+ },
711
+ regex: function (what, handler) {
712
+ if (what.global || what.sticky) throw new Error("when() RegExp must not be global or sticky");
713
+
714
+ if (handlerIsString) {
715
+ redirect = handler;
716
+ handler = ['$match', function ($match) { return interpolate(redirect, $match); }];
717
+ }
718
+ return extend(function ($injector, $location) {
719
+ return handleIfMatch($injector, handler, what.exec($location.path()));
720
+ }, {
721
+ prefix: regExpPrefix(what)
722
+ });
723
+ }
724
+ };
725
+
726
+ var check = { matcher: $urlMatcherFactory.isMatcher(what), regex: what instanceof RegExp };
727
+
728
+ for (var n in check) {
729
+ if (check[n]) {
730
+ return this.rule(strategies[n](what, handler));
731
+ }
732
+ }
733
+
734
+ throw new Error("invalid 'what' in when()");
735
+ };
736
+
737
+ this.$get =
738
+ [ '$location', '$rootScope', '$injector',
739
+ function ($location, $rootScope, $injector) {
740
+ // TODO: Optimize groups of rules with non-empty prefix into some sort of decision tree
741
+ function update() {
742
+ function check(rule) {
743
+ var handled = rule($injector, $location);
744
+ if (handled) {
745
+ if (isString(handled)) $location.replace().url(handled);
746
+ return true;
747
+ }
748
+ return false;
749
+ }
750
+ var n=rules.length, i;
751
+ for (i=0; i<n; i++) {
752
+ if (check(rules[i])) return;
753
+ }
754
+ // always check otherwise last to allow dynamic updates to the set of rules
755
+ if (otherwise) check(otherwise);
756
+ }
757
+
758
+ $rootScope.$on('$locationChangeSuccess', update);
759
+ return {};
760
+ }];
761
+ }
762
+
763
+ angular.module('ui.router.router').provider('$urlRouter', $UrlRouterProvider);
764
+
765
+ $StateProvider.$inject = ['$urlRouterProvider', '$urlMatcherFactoryProvider', '$locationProvider'];
766
+ function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $locationProvider) {
767
+
768
+ var root, states = {}, $state;
769
+
770
+ // Builds state properties from definition passed to registerState()
771
+ var stateBuilder = {
772
+
773
+ // Derive parent state from a hierarchical name only if 'parent' is not explicitly defined.
774
+ // state.children = [];
775
+ // if (parent) parent.children.push(state);
776
+ parent: function(state) {
777
+ if (isDefined(state.parent) && state.parent) return findState(state.parent);
778
+ // regex matches any valid composite state name
779
+ // would match "contact.list" but not "contacts"
780
+ var compositeName = /^(.+)\.[^.]+$/.exec(state.name);
781
+ return compositeName ? findState(compositeName[1]) : root;
782
+ },
783
+
784
+ // inherit 'data' from parent and override by own values (if any)
785
+ data: function(state) {
786
+ if (state.parent && state.parent.data) {
787
+ state.data = state.self.data = angular.extend({}, state.parent.data, state.data);
788
+ }
789
+ return state.data;
790
+ },
791
+
792
+ // Build a URLMatcher if necessary, either via a relative or absolute URL
793
+ url: function(state) {
794
+ var url = state.url;
795
+
796
+ if (isString(url)) {
797
+ if (url.charAt(0) == '^') {
798
+ return $urlMatcherFactory.compile(url.substring(1));
799
+ }
800
+ return (state.parent.navigable || root).url.concat(url);
801
+ }
802
+
803
+ if ($urlMatcherFactory.isMatcher(url) || url == null) {
804
+ return url;
805
+ }
806
+ throw new Error("Invalid url '" + url + "' in state '" + state + "'");
807
+ },
808
+
809
+ // Keep track of the closest ancestor state that has a URL (i.e. is navigable)
810
+ navigable: function(state) {
811
+ return state.url ? state : (state.parent ? state.parent.navigable : null);
812
+ },
813
+
814
+ // Derive parameters for this state and ensure they're a super-set of parent's parameters
815
+ params: function(state) {
816
+ if (!state.params) {
817
+ return state.url ? state.url.parameters() : state.parent.params;
818
+ }
819
+ if (!isArray(state.params)) throw new Error("Invalid params in state '" + state + "'");
820
+ if (state.url) throw new Error("Both params and url specicified in state '" + state + "'");
821
+ return state.params;
822
+ },
823
+
824
+ // If there is no explicit multi-view configuration, make one up so we don't have
825
+ // to handle both cases in the view directive later. Note that having an explicit
826
+ // 'views' property will mean the default unnamed view properties are ignored. This
827
+ // is also a good time to resolve view names to absolute names, so everything is a
828
+ // straight lookup at link time.
829
+ views: function(state) {
830
+ var views = {};
831
+
832
+ forEach(isDefined(state.views) ? state.views : { '': state }, function (view, name) {
833
+ if (name.indexOf('@') < 0) name += '@' + state.parent.name;
834
+ views[name] = view;
835
+ });
836
+ return views;
837
+ },
838
+
839
+ ownParams: function(state) {
840
+ if (!state.parent) {
841
+ return state.params;
842
+ }
843
+ var paramNames = {}; forEach(state.params, function (p) { paramNames[p] = true; });
844
+
845
+ forEach(state.parent.params, function (p) {
846
+ if (!paramNames[p]) {
847
+ throw new Error("Missing required parameter '" + p + "' in state '" + state.name + "'");
848
+ }
849
+ paramNames[p] = false;
850
+ });
851
+ var ownParams = [];
852
+
853
+ forEach(paramNames, function (own, p) {
854
+ if (own) ownParams.push(p);
855
+ });
856
+ return ownParams;
857
+ },
858
+
859
+ // Keep a full path from the root down to this state as this is needed for state activation.
860
+ path: function(state) {
861
+ return state.parent ? state.parent.path.concat(state) : []; // exclude root from path
862
+ },
863
+
864
+ // Speed up $state.contains() as it's used a lot
865
+ includes: function(state) {
866
+ var includes = state.parent ? extend({}, state.parent.includes) : {};
867
+ includes[state.name] = true;
868
+ return includes;
869
+ }
870
+ };
871
+
872
+
873
+ function findState(stateOrName, base) {
874
+ var isStr = isString(stateOrName),
875
+ name = isStr ? stateOrName : stateOrName.name,
876
+ path = name.indexOf(".") === 0 || name.indexOf("^") === 0;
877
+
878
+ if (path) {
879
+ if (!base) throw new Error("No reference point given for path '" + name + "'");
880
+ var rel = name.split("."), i = 0, pathLength = rel.length, current = base;
881
+
882
+ for (; i < pathLength; i++) {
883
+ if (rel[i] === "" && i === 0) {
884
+ current = base;
885
+ continue;
886
+ }
887
+ if (rel[i] === "^") {
888
+ if (!current.parent) throw new Error("Path '" + name + "' not valid for state '" + base.name + "'");
889
+ current = current.parent;
890
+ continue;
891
+ }
892
+ break;
893
+ }
894
+ rel = rel.slice(i).join(".");
895
+ name = current.name + (current.name && rel ? "." : "") + rel;
896
+ }
897
+ var state = states[name];
898
+
899
+ if (state && (isStr || (!isStr && (state === stateOrName || state.self === stateOrName)))) {
900
+ return state;
901
+ }
902
+ return undefined;
903
+ }
904
+
905
+
906
+ function registerState(state) {
907
+ // Wrap a new object around the state so we can store our private details easily.
908
+ state = inherit(state, {
909
+ self: state,
910
+ resolve: state.resolve || {},
911
+ toString: function() { return this.name; }
912
+ });
913
+
914
+ var name = state.name;
915
+ if (!isString(name) || name.indexOf('@') >= 0) throw new Error("State must have a valid name");
916
+ if (states[name]) throw new Error("State '" + name + "'' is already defined");
917
+
918
+ for (var key in stateBuilder) {
919
+ state[key] = stateBuilder[key](state);
920
+ }
921
+ states[name] = state;
922
+
923
+ // Register the state in the global state list and with $urlRouter if necessary.
924
+ if (!state['abstract'] && state.url) {
925
+ $urlRouterProvider.when(state.url, ['$match', '$stateParams', function ($match, $stateParams) {
926
+ if ($state.$current.navigable != state || !equalForKeys($match, $stateParams)) {
927
+ $state.transitionTo(state, $match, false);
928
+ }
929
+ }]);
930
+ }
931
+ return state;
932
+ }
933
+
934
+
935
+ // Implicit root state that is always active
936
+ root = registerState({
937
+ name: '',
938
+ url: '^',
939
+ views: null,
940
+ 'abstract': true
941
+ });
942
+ root.navigable = null;
943
+
944
+
945
+ // .state(state)
946
+ // .state(name, state)
947
+ this.state = state;
948
+ function state(name, definition) {
949
+ /*jshint validthis: true */
950
+ if (isObject(name)) definition = name;
951
+ else definition.name = name;
952
+ registerState(definition);
953
+ return this;
954
+ }
955
+
956
+ // $urlRouter is injected just to ensure it gets instantiated
957
+ this.$get = $get;
958
+ $get.$inject = ['$rootScope', '$q', '$view', '$injector', '$resolve', '$stateParams', '$location', '$urlRouter'];
959
+ function $get( $rootScope, $q, $view, $injector, $resolve, $stateParams, $location, $urlRouter) {
960
+
961
+ var TransitionSuperseded = $q.reject(new Error('transition superseded'));
962
+ var TransitionPrevented = $q.reject(new Error('transition prevented'));
963
+
964
+ root.locals = { resolve: null, globals: { $stateParams: {} } };
965
+ $state = {
966
+ params: {},
967
+ current: root.self,
968
+ $current: root,
969
+ transition: null
970
+ };
971
+
972
+ $state.go = function go(to, params, options) {
973
+ return this.transitionTo(to, params, extend({ inherit: true, relative: $state.$current }, options));
974
+ };
975
+
976
+ $state.transitionTo = function transitionTo(to, toParams, options) {
977
+ if (!isDefined(options)) options = (options === true || options === false) ? { location: options } : {};
978
+ toParams = toParams || {};
979
+ options = extend({ location: true, inherit: false, relative: null }, options);
980
+
981
+ var toState = findState(to, options.relative);
982
+ if (!isDefined(toState)) throw new Error("No such state " + toState);
983
+ if (toState['abstract']) throw new Error("Cannot transition to abstract state '" + to + "'");
984
+ if (options.inherit) toParams = inheritParams($stateParams, toParams || {}, $state.$current, toState);
985
+ to = toState;
986
+
987
+ var toPath = to.path,
988
+ from = $state.$current, fromParams = $state.params, fromPath = from.path;
989
+
990
+ // Starting from the root of the path, keep all levels that haven't changed
991
+ var keep, state, locals = root.locals, toLocals = [];
992
+ for (keep = 0, state = toPath[keep];
993
+ state && state === fromPath[keep] && equalForKeys(toParams, fromParams, state.ownParams);
994
+ keep++, state = toPath[keep]) {
995
+ locals = toLocals[keep] = state.locals;
996
+ }
997
+
998
+ // If we're going to the same state and all locals are kept, we've got nothing to do.
999
+ // But clear 'transition', as we still want to cancel any other pending transitions.
1000
+ // TODO: We may not want to bump 'transition' if we're called from a location change that we've initiated ourselves,
1001
+ // because we might accidentally abort a legitimate transition initiated from code?
1002
+ if (to === from && locals === from.locals) {
1003
+ $state.transition = null;
1004
+ return $q.when($state.current);
1005
+ }
1006
+
1007
+ // Normalize/filter parameters before we pass them to event handlers etc.
1008
+ toParams = normalize(to.params, toParams || {});
1009
+
1010
+ // Broadcast start event and cancel the transition if requested
1011
+ var evt = $rootScope.$broadcast('$stateChangeStart', to.self, toParams, from.self, fromParams);
1012
+ if (evt.defaultPrevented) return TransitionPrevented;
1013
+
1014
+ // Resolve locals for the remaining states, but don't update any global state just
1015
+ // yet -- if anything fails to resolve the current state needs to remain untouched.
1016
+ // We also set up an inheritance chain for the locals here. This allows the view directive
1017
+ // to quickly look up the correct definition for each view in the current state. Even
1018
+ // though we create the locals object itself outside resolveState(), it is initially
1019
+ // empty and gets filled asynchronously. We need to keep track of the promise for the
1020
+ // (fully resolved) current locals, and pass this down the chain.
1021
+ var resolved = $q.when(locals);
1022
+ for (var l=keep; l<toPath.length; l++, state=toPath[l]) {
1023
+ locals = toLocals[l] = inherit(locals);
1024
+ resolved = resolveState(state, toParams, state===to, resolved, locals);
1025
+ }
1026
+
1027
+ // Once everything is resolved, wer are ready to perform the actual transition
1028
+ // and return a promise for the new state. We also keep track of what the
1029
+ // current promise is, so that we can detect overlapping transitions and
1030
+ // keep only the outcome of the last transition.
1031
+ var transition = $state.transition = resolved.then(function () {
1032
+ var l, entering, exiting;
1033
+
1034
+ if ($state.transition !== transition) return TransitionSuperseded;
1035
+
1036
+ // Exit 'from' states not kept
1037
+ for (l=fromPath.length-1; l>=keep; l--) {
1038
+ exiting = fromPath[l];
1039
+ if (exiting.self.onExit) {
1040
+ $injector.invoke(exiting.self.onExit, exiting.self, exiting.locals.globals);
1041
+ }
1042
+ exiting.locals = null;
1043
+ }
1044
+
1045
+ // Enter 'to' states not kept
1046
+ for (l=keep; l<toPath.length; l++) {
1047
+ entering = toPath[l];
1048
+ entering.locals = toLocals[l];
1049
+ if (entering.self.onEnter) {
1050
+ $injector.invoke(entering.self.onEnter, entering.self, entering.locals.globals);
1051
+ }
1052
+ }
1053
+
1054
+ // Update globals in $state
1055
+ $state.$current = to;
1056
+ $state.current = to.self;
1057
+ $state.params = toParams;
1058
+ copy($state.params, $stateParams);
1059
+ $state.transition = null;
1060
+
1061
+ // Update $location
1062
+ var toNav = to.navigable;
1063
+ if (options.location && toNav) {
1064
+ $location.url(toNav.url.format(toNav.locals.globals.$stateParams));
1065
+ }
1066
+
1067
+ $rootScope.$broadcast('$stateChangeSuccess', to.self, toParams, from.self, fromParams);
1068
+
1069
+ return $state.current;
1070
+ }, function (error) {
1071
+ if ($state.transition !== transition) return TransitionSuperseded;
1072
+
1073
+ $state.transition = null;
1074
+ $rootScope.$broadcast('$stateChangeError', to.self, toParams, from.self, fromParams, error);
1075
+
1076
+ return $q.reject(error);
1077
+ });
1078
+
1079
+ return transition;
1080
+ };
1081
+
1082
+ $state.is = function is(stateOrName) {
1083
+ var state = findState(stateOrName);
1084
+ return (isDefined(state)) ? $state.$current === state : undefined;
1085
+ };
1086
+
1087
+ $state.includes = function includes(stateOrName) {
1088
+ var state = findState(stateOrName);
1089
+ return (isDefined(state)) ? isDefined($state.$current.includes[state.name]) : undefined;
1090
+ };
1091
+
1092
+ $state.href = function href(stateOrName, params, options) {
1093
+ options = extend({ lossy: true, inherit: false, relative: $state.$current }, options || {});
1094
+ var state = findState(stateOrName, options.relative);
1095
+ if (!isDefined(state)) return null;
1096
+
1097
+ params = inheritParams($stateParams, params || {}, $state.$current, state);
1098
+ var nav = (state && options.lossy) ? state.navigable : state;
1099
+ var url = (nav && nav.url) ? nav.url.format(normalize(state.params, params || {})) : null;
1100
+ return !$locationProvider.html5Mode() && url ? "#" + url : url;
1101
+ };
1102
+
1103
+ $state.get = function (stateOrName) {
1104
+ var state = findState(stateOrName);
1105
+ return (state && state.self) ? state.self : null;
1106
+ };
1107
+
1108
+ function resolveState(state, params, paramsAreFiltered, inherited, dst) {
1109
+ // Make a restricted $stateParams with only the parameters that apply to this state if
1110
+ // necessary. In addition to being available to the controller and onEnter/onExit callbacks,
1111
+ // we also need $stateParams to be available for any $injector calls we make during the
1112
+ // dependency resolution process.
1113
+ var $stateParams = (paramsAreFiltered) ? params : filterByKeys(state.params, params);
1114
+ var locals = { $stateParams: $stateParams };
1115
+
1116
+ // Resolve 'global' dependencies for the state, i.e. those not specific to a view.
1117
+ // We're also including $stateParams in this; that way the parameters are restricted
1118
+ // to the set that should be visible to the state, and are independent of when we update
1119
+ // the global $state and $stateParams values.
1120
+ dst.resolve = $resolve.resolve(state.resolve, locals, dst.resolve, state);
1121
+ var promises = [ dst.resolve.then(function (globals) {
1122
+ dst.globals = globals;
1123
+ }) ];
1124
+ if (inherited) promises.push(inherited);
1125
+
1126
+ // Resolve template and dependencies for all views.
1127
+ forEach(state.views, function (view, name) {
1128
+ var injectables = (view.resolve && view.resolve !== state.resolve ? view.resolve : {});
1129
+ injectables.$template = [ function () {
1130
+ return $view.load(name, { view: view, locals: locals, params: $stateParams, notify: false }) || '';
1131
+ }];
1132
+
1133
+ promises.push($resolve.resolve(injectables, locals, dst.resolve, state).then(function (result) {
1134
+ // References to the controller (only instantiated at link time)
1135
+ result.$$controller = view.controller;
1136
+ // Provide access to the state itself for internal use
1137
+ result.$$state = state;
1138
+ dst[name] = result;
1139
+ }));
1140
+ });
1141
+
1142
+ // Wait for all the promises and then return the activation object
1143
+ return $q.all(promises).then(function (values) {
1144
+ return dst;
1145
+ });
1146
+ }
1147
+
1148
+ return $state;
1149
+ }
1150
+
1151
+ function normalize(keys, values) {
1152
+ var normalized = {};
1153
+
1154
+ forEach(keys, function (name) {
1155
+ var value = values[name];
1156
+ normalized[name] = (value != null) ? String(value) : null;
1157
+ });
1158
+ return normalized;
1159
+ }
1160
+
1161
+ function equalForKeys(a, b, keys) {
1162
+ // If keys not provided, assume keys from object 'a'
1163
+ if (!keys) {
1164
+ keys = [];
1165
+ for (var n in a) keys.push(n); // Used instead of Object.keys() for IE8 compatibility
1166
+ }
1167
+
1168
+ for (var i=0; i<keys.length; i++) {
1169
+ var k = keys[i];
1170
+ if (a[k] != b[k]) return false; // Not '===', values aren't necessarily normalized
1171
+ }
1172
+ return true;
1173
+ }
1174
+
1175
+ function filterByKeys(keys, values) {
1176
+ var filtered = {};
1177
+
1178
+ forEach(keys, function (name) {
1179
+ filtered[name] = values[name];
1180
+ });
1181
+ return filtered;
1182
+ }
1183
+ }
1184
+
1185
+ angular.module('ui.router.state')
1186
+ .value('$stateParams', {})
1187
+ .provider('$state', $StateProvider);
1188
+
1189
+
1190
+ $ViewProvider.$inject = [];
1191
+ function $ViewProvider() {
1192
+
1193
+ this.$get = $get;
1194
+ $get.$inject = ['$rootScope', '$templateFactory'];
1195
+ function $get( $rootScope, $templateFactory) {
1196
+ return {
1197
+ // $view.load('full.viewName', { template: ..., controller: ..., resolve: ..., async: false, params: ... })
1198
+ load: function load(name, options) {
1199
+ var result, defaults = {
1200
+ template: null, controller: null, view: null, locals: null, notify: true, async: true, params: {}
1201
+ };
1202
+ options = extend(defaults, options);
1203
+
1204
+ if (options.view) {
1205
+ result = $templateFactory.fromConfig(options.view, options.params, options.locals);
1206
+ }
1207
+ if (result && options.notify) {
1208
+ $rootScope.$broadcast('$viewContentLoading', options);
1209
+ }
1210
+ return result;
1211
+ }
1212
+ };
1213
+ }
1214
+ }
1215
+
1216
+ angular.module('ui.router.state').provider('$view', $ViewProvider);
1217
+
1218
+
1219
+ $ViewDirective.$inject = ['$state', '$compile', '$controller', '$injector', '$anchorScroll'];
1220
+ function $ViewDirective( $state, $compile, $controller, $injector, $anchorScroll) {
1221
+ // TODO: Change to $injector.has() when we version bump to Angular 1.1.5.
1222
+ // See: https://github.com/angular/angular.js/blob/master/CHANGELOG.md#115-triangle-squarification-2013-05-22
1223
+ var $animator; try { $animator = $injector.get('$animator'); } catch (e) { /* do nothing */ }
1224
+ var viewIsUpdating = false;
1225
+
1226
+ var directive = {
1227
+ restrict: 'ECA',
1228
+ terminal: true,
1229
+ transclude: true,
1230
+ compile: function (element, attr, transclude) {
1231
+ return function(scope, element, attr) {
1232
+ var viewScope, viewLocals,
1233
+ name = attr[directive.name] || attr.name || '',
1234
+ onloadExp = attr.onload || '',
1235
+ animate = isDefined($animator) && $animator(scope, attr);
1236
+
1237
+ // Returns a set of DOM manipulation functions based on whether animation
1238
+ // should be performed
1239
+ var renderer = function(doAnimate) {
1240
+ return ({
1241
+ "true": {
1242
+ remove: function(element) { animate.leave(element.contents(), element); },
1243
+ restore: function(compiled, element) { animate.enter(compiled, element); },
1244
+ populate: function(template, element) {
1245
+ var contents = angular.element('<div></div>').html(template).contents();
1246
+ animate.enter(contents, element);
1247
+ return contents;
1248
+ }
1249
+ },
1250
+ "false": {
1251
+ remove: function(element) { element.html(''); },
1252
+ restore: function(compiled, element) { element.append(compiled); },
1253
+ populate: function(template, element) {
1254
+ element.html(template);
1255
+ return element.contents();
1256
+ }
1257
+ }
1258
+ })[doAnimate.toString()];
1259
+ };
1260
+
1261
+ // Put back the compiled initial view
1262
+ element.append(transclude(scope));
1263
+
1264
+ // Find the details of the parent view directive (if any) and use it
1265
+ // to derive our own qualified view name, then hang our own details
1266
+ // off the DOM so child directives can find it.
1267
+ var parent = element.parent().inheritedData('$uiView');
1268
+ if (name.indexOf('@') < 0) name = name + '@' + (parent ? parent.state.name : '');
1269
+ var view = { name: name, state: null };
1270
+ element.data('$uiView', view);
1271
+
1272
+ var eventHook = function() {
1273
+ if (viewIsUpdating) return;
1274
+ viewIsUpdating = true;
1275
+
1276
+ try { updateView(true); } catch (e) {
1277
+ viewIsUpdating = false;
1278
+ throw e;
1279
+ }
1280
+ viewIsUpdating = false;
1281
+ };
1282
+
1283
+ scope.$on('$stateChangeSuccess', eventHook);
1284
+ scope.$on('$viewContentLoading', eventHook);
1285
+ updateView(false);
1286
+
1287
+ function updateView(doAnimate) {
1288
+ var locals = $state.$current && $state.$current.locals[name];
1289
+ if (locals === viewLocals) return; // nothing to do
1290
+ var render = renderer(animate && doAnimate);
1291
+
1292
+ // Remove existing content
1293
+ render.remove(element);
1294
+
1295
+ // Destroy previous view scope
1296
+ if (viewScope) {
1297
+ viewScope.$destroy();
1298
+ viewScope = null;
1299
+ }
1300
+
1301
+ if (!locals) {
1302
+ viewLocals = null;
1303
+ view.state = null;
1304
+
1305
+ // Restore the initial view
1306
+ return render.restore(transclude(scope), element);
1307
+ }
1308
+
1309
+ viewLocals = locals;
1310
+ view.state = locals.$$state;
1311
+
1312
+ var link = $compile(render.populate(locals.$template, element));
1313
+ viewScope = scope.$new();
1314
+
1315
+ if (locals.$$controller) {
1316
+ locals.$scope = viewScope;
1317
+ var controller = $controller(locals.$$controller, locals);
1318
+ element.children().data('$ngControllerController', controller);
1319
+ }
1320
+ link(viewScope);
1321
+ viewScope.$emit('$viewContentLoaded');
1322
+ if (onloadExp) viewScope.$eval(onloadExp);
1323
+
1324
+ // TODO: This seems strange, shouldn't $anchorScroll listen for $viewContentLoaded if necessary?
1325
+ // $anchorScroll might listen on event...
1326
+ $anchorScroll();
1327
+ }
1328
+ };
1329
+ }
1330
+ };
1331
+ return directive;
1332
+ }
1333
+
1334
+ angular.module('ui.router.state').directive('uiView', $ViewDirective);
1335
+
1336
+ function parseStateRef(ref) {
1337
+ var parsed = ref.match(/^([^(]+?)\s*(\((.*)\))?$/);
1338
+ if (!parsed || parsed.length !== 4) throw new Error("Invalid state ref '" + ref + "'");
1339
+ return { state: parsed[1], paramExpr: parsed[3] || null };
1340
+ }
1341
+
1342
+ $StateRefDirective.$inject = ['$state'];
1343
+ function $StateRefDirective($state) {
1344
+ return {
1345
+ restrict: 'A',
1346
+ link: function(scope, element, attrs) {
1347
+ var ref = parseStateRef(attrs.uiSref);
1348
+ var params = null, url = null, base = $state.$current;
1349
+ var isForm = element[0].nodeName === "FORM";
1350
+ var attr = isForm ? "action" : "href", nav = true;
1351
+
1352
+ var stateData = element.parent().inheritedData('$uiView');
1353
+
1354
+ if (stateData && stateData.state && stateData.state.name) {
1355
+ base = stateData.state;
1356
+ }
1357
+
1358
+ var update = function(newVal) {
1359
+ if (newVal) params = newVal;
1360
+ if (!nav) return;
1361
+
1362
+ var newHref = $state.href(ref.state, params, { relative: base });
1363
+
1364
+ if (!newHref) {
1365
+ nav = false;
1366
+ return false;
1367
+ }
1368
+ element[0][attr] = newHref;
1369
+ };
1370
+
1371
+ if (ref.paramExpr) {
1372
+ scope.$watch(ref.paramExpr, function(newVal, oldVal) {
1373
+ if (newVal !== oldVal) update(newVal);
1374
+ }, true);
1375
+ params = scope.$eval(ref.paramExpr);
1376
+ }
1377
+ update();
1378
+
1379
+ if (isForm) return;
1380
+
1381
+ element.bind("click", function(e) {
1382
+ if ((e.which == 1) && !e.ctrlKey && !e.metaKey && !e.shiftKey) {
1383
+ $state.go(ref.state, params, { relative: base });
1384
+ scope.$apply();
1385
+ e.preventDefault();
1386
+ }
1387
+ });
1388
+ }
1389
+ };
1390
+ }
1391
+
1392
+ angular.module('ui.router.state').directive('uiSref', $StateRefDirective);
1393
+
1394
+ $RouteProvider.$inject = ['$stateProvider', '$urlRouterProvider'];
1395
+ function $RouteProvider( $stateProvider, $urlRouterProvider) {
1396
+
1397
+ var routes = [];
1398
+
1399
+ onEnterRoute.$inject = ['$$state'];
1400
+ function onEnterRoute( $$state) {
1401
+ /*jshint validthis: true */
1402
+ this.locals = $$state.locals.globals;
1403
+ this.params = this.locals.$stateParams;
1404
+ }
1405
+
1406
+ function onExitRoute() {
1407
+ /*jshint validthis: true */
1408
+ this.locals = null;
1409
+ this.params = null;
1410
+ }
1411
+
1412
+ this.when = when;
1413
+ function when(url, route) {
1414
+ /*jshint validthis: true */
1415
+ if (route.redirectTo != null) {
1416
+ // Redirect, configure directly on $urlRouterProvider
1417
+ var redirect = route.redirectTo, handler;
1418
+ if (isString(redirect)) {
1419
+ handler = redirect; // leave $urlRouterProvider to handle
1420
+ } else if (isFunction(redirect)) {
1421
+ // Adapt to $urlRouterProvider API
1422
+ handler = function (params, $location) {
1423
+ return redirect(params, $location.path(), $location.search());
1424
+ };
1425
+ } else {
1426
+ throw new Error("Invalid 'redirectTo' in when()");
1427
+ }
1428
+ $urlRouterProvider.when(url, handler);
1429
+ } else {
1430
+ // Regular route, configure as state
1431
+ $stateProvider.state(inherit(route, {
1432
+ parent: null,
1433
+ name: 'route:' + encodeURIComponent(url),
1434
+ url: url,
1435
+ onEnter: onEnterRoute,
1436
+ onExit: onExitRoute
1437
+ }));
1438
+ }
1439
+ routes.push(route);
1440
+ return this;
1441
+ }
1442
+
1443
+ this.$get = $get;
1444
+ $get.$inject = ['$state', '$rootScope', '$routeParams'];
1445
+ function $get( $state, $rootScope, $routeParams) {
1446
+
1447
+ var $route = {
1448
+ routes: routes,
1449
+ params: $routeParams,
1450
+ current: undefined
1451
+ };
1452
+
1453
+ function stateAsRoute(state) {
1454
+ return (state.name !== '') ? state : undefined;
1455
+ }
1456
+
1457
+ $rootScope.$on('$stateChangeStart', function (ev, to, toParams, from, fromParams) {
1458
+ $rootScope.$broadcast('$routeChangeStart', stateAsRoute(to), stateAsRoute(from));
1459
+ });
1460
+
1461
+ $rootScope.$on('$stateChangeSuccess', function (ev, to, toParams, from, fromParams) {
1462
+ $route.current = stateAsRoute(to);
1463
+ $rootScope.$broadcast('$routeChangeSuccess', stateAsRoute(to), stateAsRoute(from));
1464
+ copy(toParams, $route.params);
1465
+ });
1466
+
1467
+ $rootScope.$on('$stateChangeError', function (ev, to, toParams, from, fromParams, error) {
1468
+ $rootScope.$broadcast('$routeChangeError', stateAsRoute(to), stateAsRoute(from), error);
1469
+ });
1470
+
1471
+ return $route;
1472
+ }
1473
+ }
1474
+
1475
+ angular.module('ui.router.compat')
1476
+ .provider('$route', $RouteProvider)
1477
+ .directive('ngView', $ViewDirective);
1478
+ })(window, window.angular);