katello 4.2.1 → 4.3.0.rc1

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 (498) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/katello/common/katello.common.js +0 -67
  3. data/app/assets/javascripts/katello/common/katello.js +0 -27
  4. data/app/assets/javascripts/katello/common/vendor.js +0 -1
  5. data/app/assets/stylesheets/katello/katello.scss +0 -1
  6. data/app/controllers/katello/api/rhsm/candlepin_proxies_controller.rb +10 -2
  7. data/app/controllers/katello/api/v2/api_controller.rb +35 -9
  8. data/app/controllers/katello/api/v2/capsule_content_controller.rb +16 -2
  9. data/app/controllers/katello/api/v2/content_view_components_controller.rb +22 -1
  10. data/app/controllers/katello/api/v2/content_view_filters_controller.rb +65 -1
  11. data/app/controllers/katello/api/v2/content_view_versions_controller.rb +5 -1
  12. data/app/controllers/katello/api/v2/content_views_controller.rb +13 -6
  13. data/app/controllers/katello/api/v2/debs_controller.rb +74 -1
  14. data/app/controllers/katello/api/v2/errata_controller.rb +13 -10
  15. data/app/controllers/katello/api/v2/file_units_controller.rb +1 -0
  16. data/app/controllers/katello/api/v2/generic_content_units_controller.rb +1 -1
  17. data/app/controllers/katello/api/v2/host_errata_controller.rb +46 -5
  18. data/app/controllers/katello/api/v2/host_tracer_controller.rb +2 -1
  19. data/app/controllers/katello/api/v2/module_streams_controller.rb +4 -0
  20. data/app/controllers/katello/api/v2/organizations_controller.rb +22 -7
  21. data/app/controllers/katello/api/v2/products_bulk_actions_controller.rb +1 -1
  22. data/app/controllers/katello/api/v2/repositories_controller.rb +36 -19
  23. data/app/controllers/katello/api/v2/subscriptions_controller.rb +0 -8
  24. data/app/controllers/katello/api/v2/upstream_subscriptions_controller.rb +5 -1
  25. data/app/controllers/katello/concerns/api/v2/bulk_extensions.rb +40 -0
  26. data/app/controllers/katello/concerns/api/v2/host_errata_extensions.rb +4 -31
  27. data/app/controllers/katello/concerns/api/v2/registration_controller_extensions.rb +1 -1
  28. data/app/controllers/katello/concerns/api/v2/repository_content_controller.rb +1 -1
  29. data/app/helpers/katello/concerns/smart_proxy_helper_extensions.rb +2 -6
  30. data/app/helpers/katello/katello_url_helper.rb +1 -1
  31. data/app/lib/actions/candlepin/abstract_async_task.rb +6 -3
  32. data/app/lib/actions/candlepin/async_hypervisors.rb +12 -8
  33. data/app/lib/actions/katello/applicability/hosts/bulk_generate.rb +10 -1
  34. data/app/lib/actions/katello/capsule_content/sync_capsule.rb +3 -3
  35. data/app/lib/actions/katello/cdn_configuration/update.rb +38 -0
  36. data/app/lib/actions/katello/content_view/remove.rb +18 -7
  37. data/app/lib/actions/katello/content_view_version/destroy.rb +2 -2
  38. data/app/lib/actions/katello/content_view_version/republish_repositories.rb +1 -1
  39. data/app/lib/actions/katello/repository/clone_contents.rb +1 -2
  40. data/app/lib/actions/katello/repository/destroy.rb +21 -5
  41. data/app/lib/actions/katello/repository/fetch_pxe_files.rb +1 -1
  42. data/app/lib/actions/katello/repository/finish_upload.rb +1 -1
  43. data/app/lib/actions/katello/repository/import_upload.rb +1 -1
  44. data/app/lib/actions/katello/repository/index_content.rb +19 -6
  45. data/app/lib/actions/katello/repository/metadata_generate.rb +2 -0
  46. data/app/lib/actions/katello/repository/multi_clone_contents.rb +1 -1
  47. data/app/lib/actions/katello/repository/remove_content.rb +1 -1
  48. data/app/lib/actions/katello/repository/sync.rb +3 -7
  49. data/app/lib/actions/katello/repository_set/scan_cdn.rb +0 -4
  50. data/app/lib/actions/middleware/record_smart_proxy_sync_history.rb +1 -1
  51. data/app/lib/actions/pulp/orphan_cleanup/remove_unneeded_repos.rb +1 -1
  52. data/app/lib/actions/pulp/repository/clear.rb +1 -1
  53. data/app/lib/actions/pulp3/abstract_async_task.rb +10 -1
  54. data/app/lib/actions/pulp3/capsule_content/generate_metadata.rb +13 -18
  55. data/app/lib/actions/pulp3/capsule_content/refresh_distribution.rb +1 -11
  56. data/app/lib/actions/pulp3/content_view_version/create_export_history.rb +1 -1
  57. data/app/lib/actions/pulp3/orchestration/repository/generate_metadata.rb +3 -1
  58. data/app/lib/actions/pulp3/orchestration/repository/import_upload.rb +25 -42
  59. data/app/lib/actions/pulp3/orchestration/repository/sync.rb +8 -1
  60. data/app/lib/actions/pulp3/orchestration/repository/upload_content.rb +3 -3
  61. data/app/lib/actions/pulp3/repository/commit_upload.rb +1 -1
  62. data/app/lib/actions/pulp3/repository/import_upload.rb +8 -4
  63. data/app/lib/actions/pulp3/repository/multi_copy_content.rb +1 -1
  64. data/app/lib/actions/pulp3/repository/multi_copy_units.rb +1 -1
  65. data/app/lib/actions/pulp3/repository/presenters/abstract_sync_presenter.rb +18 -0
  66. data/app/lib/actions/pulp3/repository/presenters/content_unit_presenter.rb +7 -2
  67. data/app/lib/actions/pulp3/repository/presenters/repair_presenter.rb +6 -1
  68. data/app/lib/actions/pulp3/repository/save_artifact.rb +14 -4
  69. data/app/lib/katello/errors.rb +2 -0
  70. data/app/lib/katello/resources/candlepin/consumer.rb +0 -20
  71. data/app/lib/katello/resources/candlepin/proxy.rb +8 -2
  72. data/app/lib/katello/resources/candlepin/upstream_consumer.rb +2 -0
  73. data/app/lib/katello/resources/cdn/katello_cdn.rb +68 -0
  74. data/app/lib/katello/resources/cdn.rb +61 -29
  75. data/app/lib/katello/util/cdn_var_substitutor.rb +15 -9
  76. data/app/lib/katello/util/package.rb +22 -0
  77. data/app/lib/katello/util/path_with_substitutions.rb +12 -14
  78. data/app/models/katello/activation_key.rb +10 -0
  79. data/app/models/katello/ansible_collection.rb +1 -1
  80. data/app/models/katello/authorization/repository.rb +4 -4
  81. data/app/models/katello/candlepin/repository_mapper.rb +5 -1
  82. data/app/models/katello/cdn_configuration.rb +32 -0
  83. data/app/models/katello/concerns/content_facet_host_extensions.rb +40 -0
  84. data/app/models/katello/concerns/host_managed_extensions.rb +28 -2
  85. data/app/models/katello/concerns/hostgroup_extensions.rb +1 -1
  86. data/app/models/katello/concerns/organization_extensions.rb +3 -1
  87. data/app/models/katello/concerns/pulp_database_unit.rb +15 -5
  88. data/app/models/katello/concerns/remote_execution_provider_extensions.rb +9 -0
  89. data/app/models/katello/concerns/setting_extensions.rb +1 -1
  90. data/app/models/katello/concerns/smart_proxy_extensions.rb +4 -3
  91. data/app/models/katello/content_credential.rb +4 -0
  92. data/app/models/katello/content_facet_applicable_deb.rb +7 -0
  93. data/app/models/katello/content_view.rb +24 -1
  94. data/app/models/katello/content_view_component.rb +4 -0
  95. data/app/models/katello/content_view_erratum_filter.rb +2 -0
  96. data/app/models/katello/content_view_filter.rb +1 -1
  97. data/app/models/katello/content_view_package_filter_rule.rb +2 -1
  98. data/app/models/katello/content_view_version.rb +30 -1
  99. data/app/models/katello/deb.rb +71 -0
  100. data/app/models/katello/erratum.rb +13 -1
  101. data/app/models/katello/generic_content_unit.rb +3 -1
  102. data/app/models/katello/glue/pulp/repos.rb +2 -2
  103. data/app/models/katello/host/content_facet.rb +23 -2
  104. data/app/models/katello/host/subscription_facet.rb +1 -1
  105. data/app/models/katello/host_tracer.rb +21 -2
  106. data/app/models/katello/installed_deb.rb +1 -1
  107. data/app/models/katello/module_stream.rb +4 -0
  108. data/app/models/katello/ping.rb +20 -4
  109. data/app/models/katello/product.rb +7 -5
  110. data/app/models/katello/provider.rb +1 -24
  111. data/app/models/katello/repository.rb +37 -10
  112. data/app/models/katello/root_repository.rb +28 -14
  113. data/app/models/setting/content.rb +8 -13
  114. data/app/services/katello/applicability/applicable_content_helper.rb +20 -0
  115. data/app/services/katello/organization_creator.rb +8 -0
  116. data/app/services/katello/pulp3/api/ansible_collection.rb +0 -40
  117. data/app/services/katello/pulp3/api/apt.rb +0 -47
  118. data/app/services/katello/pulp3/api/content_guard.rb +1 -1
  119. data/app/services/katello/pulp3/api/core.rb +28 -23
  120. data/app/services/katello/pulp3/api/docker.rb +0 -50
  121. data/app/services/katello/pulp3/api/file.rb +0 -48
  122. data/app/services/katello/pulp3/api/generic.rb +1 -44
  123. data/app/services/katello/pulp3/api/yum.rb +4 -44
  124. data/app/services/katello/pulp3/generic_content_unit.rb +8 -4
  125. data/app/services/katello/pulp3/repository/ansible_collection.rb +4 -0
  126. data/app/services/katello/pulp3/repository/apt.rb +3 -3
  127. data/app/services/katello/pulp3/repository/generic.rb +10 -65
  128. data/app/services/katello/pulp3/repository/yum.rb +10 -0
  129. data/app/services/katello/pulp3/repository.rb +47 -21
  130. data/app/services/katello/pulp3/repository_mirror.rb +30 -11
  131. data/app/services/katello/pulp3/rpm.rb +2 -32
  132. data/app/services/katello/pulp3/smart_proxy_mirror_repository.rb +7 -8
  133. data/app/services/katello/pulp3/smart_proxy_repository.rb +1 -1
  134. data/app/services/katello/registration_manager.rb +2 -0
  135. data/app/services/katello/repository_type.rb +103 -15
  136. data/app/services/katello/repository_type_manager.rb +14 -8
  137. data/app/services/katello/ui_notifications/subscriptions/manifest_expired_warning.rb +1 -1
  138. data/app/services/katello/upstream_connection_checker.rb +1 -0
  139. data/app/views/foreman/job_templates/resolve_traces.erb +25 -0
  140. data/app/views/foreman/job_templates/resolve_traces_-_katello_ansible_default.erb +28 -0
  141. data/app/views/katello/api/v2/capsule_content/sync_status.json.rabl +1 -1
  142. data/app/views/katello/api/v2/common/_metadata.json.rabl +1 -0
  143. data/app/views/katello/api/v2/content_facet/base.json.rabl +3 -1
  144. data/app/views/katello/api/v2/content_facet/show.json.rabl +2 -1
  145. data/app/views/katello/api/v2/content_view_components/show.json.rabl +4 -0
  146. data/app/views/katello/api/v2/content_view_versions/base.json.rabl +7 -0
  147. data/app/views/katello/api/v2/content_views/base.json.rabl +12 -8
  148. data/app/views/katello/api/v2/content_views/index.json.rabl +1 -0
  149. data/app/views/katello/api/v2/content_views/permissions.rabl +8 -0
  150. data/app/views/katello/api/v2/debs/base.json.rabl +5 -0
  151. data/app/views/katello/api/v2/errata/index.json.rabl +4 -0
  152. data/app/views/katello/api/v2/generic_content_units/base.json.rabl +2 -0
  153. data/app/views/katello/api/v2/generic_content_units/show.json.rabl +7 -0
  154. data/app/views/katello/api/v2/host_tracer/base.json.rabl +1 -0
  155. data/app/views/katello/api/v2/module_streams/index.json.rabl +4 -0
  156. data/app/views/katello/api/v2/organizations/cdn_configuration.rabl +1 -0
  157. data/app/views/katello/api/v2/organizations/show.json.rabl +7 -0
  158. data/app/views/katello/api/v2/repositories/base.json.rabl +10 -17
  159. data/app/views/overrides/activation_keys/_host_synced_content_select.html.erb +2 -6
  160. data/config/routes/api/v2.rb +13 -0
  161. data/config/routes/overrides.rb +2 -0
  162. data/config/routes.rb +14 -2
  163. data/db/migrate/20140110000001_update_environments_add_katello_id.rb +1 -3
  164. data/db/migrate/20140610154745_content_view_puppet_environment_id.rb +0 -35
  165. data/db/migrate/20190802112101_add_applicable_debs.rb +16 -0
  166. data/db/migrate/20210201163238_migrate_background_download_policy_to_migrate.rb +2 -2
  167. data/db/migrate/20210909140337_add_last_indexed_to_repos.rb +5 -0
  168. data/db/migrate/20210910190324_move_background_settings_to_immediate.rb +25 -0
  169. data/db/migrate/20211006161617_add_filename_to_katello_generic_content_units.rb +5 -0
  170. data/db/migrate/20211019192121_create_cdn_configuration.katello.rb +30 -0
  171. data/db/migrate/20211025181315_add_additional_metadata_to_katello_generic_content_units.rb +5 -0
  172. data/engines/bastion/README.md +15 -0
  173. data/engines/bastion/app/assets/javascripts/bastion/components/nutupane.factory.js +2 -2
  174. data/engines/bastion/config/routes.rb +2 -0
  175. data/engines/bastion/vendor/assets/javascripts/bastion/angular/angular.js +3 -3
  176. data/engines/bastion/vendor/assets/javascripts/bastion/angular-sanitize/angular-sanitize.js +1 -1
  177. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/bastion_katello.js +3 -0
  178. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/common/views/registration.html +1 -1
  179. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-debs-applicable.controller.js +44 -0
  180. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-debs.controller.js +1 -1
  181. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-debs-applicable.html +70 -0
  182. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-debs.html +1 -1
  183. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content-hosts.routes.js +10 -0
  184. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/views/content-host-details.html +5 -0
  185. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/content-hosts.html +25 -9
  186. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/content-views.routes.js +2 -2
  187. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/views/content-view-versions.html +0 -9
  188. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/debs/debs.controller.js +22 -2
  189. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/debs/debs.routes.js +1 -1
  190. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/debs/details/deb.controller.js +22 -2
  191. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/debs/details/views/deb-content-views.html +1 -1
  192. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/debs/details/views/deb-info.html +36 -4
  193. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/debs/details/views/deb-repositories.html +1 -1
  194. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/debs/details/views/deb.html +4 -4
  195. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/debs/views/debs.html +31 -4
  196. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/generic-content/generic-content.factory.js +21 -0
  197. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/generic-content/generic-content.module.js +17 -0
  198. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/packages/details/package.controller.js +4 -0
  199. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/packages/details/views/package-info.html +3 -3
  200. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/product-repositories.controller.js +6 -2
  201. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-info.controller.js +30 -2
  202. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-info.filter.js +1 -13
  203. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-manage-content.controller.js +32 -9
  204. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details.controller.js +15 -4
  205. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-details.html +32 -19
  206. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-info.html +28 -28
  207. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-manage-generic-content.html +57 -0
  208. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/new-repository.controller.js +46 -4
  209. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/views/new-repository.html +57 -27
  210. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/repositories.module.js +1 -0
  211. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/repositories.routes.js +16 -7
  212. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/repository-types.service.js +30 -4
  213. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/repository.factory.js +2 -1
  214. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/views/product-repositories.html +8 -0
  215. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/sync-plans/details/sync-plan-details-info.controller.js +6 -2
  216. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/sync-plans/details/views/sync-plan-info.html +1 -1
  217. data/engines/bastion_katello/lib/bastion_katello/engine.rb +1 -1
  218. data/lib/katello/engine.rb +0 -1
  219. data/lib/katello/permission_creator.rb +4 -3
  220. data/lib/katello/permissions/host_permissions.rb +1 -0
  221. data/lib/katello/permissions/organization_permissions.rb +2 -1
  222. data/lib/katello/plugin.rb +15 -11
  223. data/lib/katello/repository_types/ansible_collection.rb +13 -1
  224. data/lib/katello/repository_types/deb.rb +13 -0
  225. data/lib/katello/repository_types/docker.rb +13 -1
  226. data/lib/katello/repository_types/file.rb +13 -0
  227. data/lib/katello/repository_types/ostree.rb +48 -4
  228. data/lib/katello/repository_types/python.rb +26 -12
  229. data/lib/katello/repository_types/yum.rb +16 -1
  230. data/lib/katello/tasks/repository.rake +3 -12
  231. data/lib/katello/tasks/reset.rake +4 -5
  232. data/lib/katello/version.rb +1 -1
  233. data/package.json +3 -2
  234. data/webpack/__mocks__/react-intl/index.js +4 -0
  235. data/webpack/components/ActionableDetail.js +23 -3
  236. data/webpack/components/AddedStatusLabel.js +1 -1
  237. data/webpack/components/Bookmark/AddBookmarkModal.js +96 -0
  238. data/webpack/components/Bookmark/Bookmark.scss +28 -0
  239. data/webpack/components/Bookmark/BookmarkActions.js +24 -0
  240. data/webpack/components/Bookmark/BookmarkConstants.js +3 -0
  241. data/webpack/components/Bookmark/BookmarkSelectors.js +15 -0
  242. data/webpack/components/Bookmark/index.js +94 -0
  243. data/webpack/components/EditableSwitch.js +6 -1
  244. data/webpack/components/EditableTextInput/EditableTextInput.js +41 -13
  245. data/webpack/components/Errata/index.js +69 -0
  246. data/webpack/components/ErratumTypeLabel.js +31 -0
  247. data/webpack/components/Loading.js +5 -2
  248. data/webpack/components/RoutedTabs/__tests__/RoutedTabs.test.js +5 -11
  249. data/webpack/components/RoutedTabs/index.js +77 -2
  250. data/webpack/components/Search/Search.js +67 -80
  251. data/webpack/components/Search/__tests__/search.test.js +8 -26
  252. data/webpack/components/SelectAllCheckbox/SelectAllCheckbox.scss +3 -0
  253. data/webpack/components/SelectAllCheckbox/index.js +126 -0
  254. data/webpack/components/SelectableDropdown/SelectableDropdown.js +7 -2
  255. data/webpack/components/Table/EmptyStateMessage.js +38 -17
  256. data/webpack/components/Table/MainTable.js +49 -10
  257. data/webpack/components/Table/MainTable.scss +11 -0
  258. data/webpack/components/Table/PageControls.js +45 -0
  259. data/webpack/components/Table/TableHooks.js +230 -0
  260. data/webpack/components/Table/TableWrapper.js +221 -50
  261. data/webpack/components/Table/helpers.js +17 -0
  262. data/webpack/components/TypeAhead/TypeAhead.js +74 -58
  263. data/webpack/components/TypeAhead/pf4Search/TypeAheadInput.js +25 -10
  264. data/webpack/components/TypeAhead/pf4Search/TypeAheadInput.scss +9 -8
  265. data/webpack/components/TypeAhead/pf4Search/TypeAheadItems.js +2 -2
  266. data/webpack/components/TypeAhead/pf4Search/TypeAheadSearch.js +32 -22
  267. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard.js +101 -0
  268. data/webpack/components/extensions/HostDetails/Cards/__tests__/contentViewDetailsCard.test.js +53 -0
  269. data/webpack/components/extensions/HostDetails/HostErrata/HostErrataActions.js +47 -0
  270. data/webpack/components/extensions/HostDetails/HostErrata/HostErrataConstants.js +32 -0
  271. data/webpack/components/extensions/HostDetails/HostErrata/HostErrataSelectors.js +16 -0
  272. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/EmptyPage.js +19 -0
  273. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/SecondaryTabsRoutes.js +17 -0
  274. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/constants.js +7 -0
  275. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/helpers.js +3 -0
  276. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/index.js +40 -0
  277. data/webpack/components/extensions/HostDetails/Tabs/EnableTracerEmptyState.js +42 -0
  278. data/webpack/components/extensions/HostDetails/Tabs/EnableTracerModal.js +118 -0
  279. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab.js +347 -0
  280. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab.scss +16 -0
  281. data/webpack/components/extensions/HostDetails/Tabs/ErratumExpansionContents.js +60 -0
  282. data/webpack/components/extensions/HostDetails/Tabs/ErratumExpansionDetail.js +69 -0
  283. data/webpack/components/extensions/HostDetails/Tabs/HostTracesActions.js +19 -0
  284. data/webpack/components/extensions/HostDetails/Tabs/HostTracesConstants.js +2 -0
  285. data/webpack/components/extensions/HostDetails/Tabs/HostTracesSelectors.js +19 -0
  286. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionActions.js +56 -0
  287. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionConstants.js +5 -0
  288. data/webpack/components/extensions/HostDetails/Tabs/TracesTab.js +188 -0
  289. data/webpack/components/extensions/HostDetails/Tabs/TracesTab.scss +12 -0
  290. data/webpack/components/extensions/HostDetails/Tabs/__tests__/errata.fixtures.json +67 -0
  291. data/webpack/components/extensions/HostDetails/Tabs/__tests__/errataTab.test.js +785 -0
  292. data/webpack/components/extensions/HostDetails/Tabs/__tests__/resolveTraces.fixtures.json +35 -0
  293. data/webpack/components/extensions/HostDetails/Tabs/__tests__/tracerEmptyTraceResults.fixtures.json +7 -0
  294. data/webpack/components/extensions/HostDetails/Tabs/__tests__/tracerEnableJobInvocation.fixtures.json +35 -0
  295. data/webpack/components/extensions/HostDetails/Tabs/__tests__/traces.fixtures.json +44 -0
  296. data/webpack/components/extensions/HostDetails/Tabs/__tests__/tracesTab.test.js +386 -0
  297. data/webpack/components/extensions/HostDetails/Tabs/customizedRexUrlHelpers.js +20 -0
  298. data/webpack/components/extensions/RegistrationCommands/fields/ActivationKeys.js +1 -1
  299. data/webpack/components/extensions/RegistrationCommands/index.js +1 -1
  300. data/webpack/components/pf3Table/components/Table.js +1 -1
  301. data/webpack/components/pf3Table/components/__snapshots__/Table.test.js.snap +3 -3
  302. data/webpack/containers/Application/Routes.js +3 -3
  303. data/webpack/containers/Application/config.js +21 -6
  304. data/webpack/containers/Application/overrides.scss +34 -3
  305. data/webpack/{fills_index.js → global_index.js} +11 -2
  306. data/webpack/global_test_setup.js +6 -1
  307. data/webpack/redux/actions/RedHatRepositories/helpers.js +4 -4
  308. data/webpack/scenes/AnsibleCollections/AnsibleCollectionsTableSchema.js +1 -1
  309. data/webpack/scenes/Content/ContentActions.js +31 -0
  310. data/webpack/scenes/Content/ContentConfig.js +138 -0
  311. data/webpack/scenes/Content/ContentConstants.js +7 -0
  312. data/webpack/scenes/Content/ContentPage.js +89 -0
  313. data/webpack/scenes/Content/ContentSelectors.js +43 -0
  314. data/webpack/scenes/Content/Details/ContentCounts.js +42 -0
  315. data/webpack/scenes/Content/Details/ContentDetails.js +66 -0
  316. data/webpack/scenes/Content/Details/ContentInfo.js +60 -0
  317. data/webpack/scenes/Content/Details/ContentRepositories.js +78 -0
  318. data/webpack/scenes/Content/Details/__tests__/ansibleCollectionDetails.fixtures.json +20 -0
  319. data/webpack/scenes/Content/Details/__tests__/ansibleCollectionRepositoryDetails.fixtures.json +71 -0
  320. data/webpack/scenes/Content/Details/__tests__/contentDetail.test.js +152 -0
  321. data/webpack/scenes/Content/Details/__tests__/pythonPackageDetails.fixtures.json +20 -0
  322. data/webpack/scenes/Content/Details/__tests__/pythonPackageRepositoryDetails.fixtures.json +71 -0
  323. data/webpack/scenes/Content/Details/index.js +4 -0
  324. data/webpack/scenes/Content/Table/ContentTable.js +90 -0
  325. data/webpack/scenes/Content/Table/index.js +3 -0
  326. data/webpack/scenes/Content/__tests__/ansibleCollections.fixtures.json +50 -0
  327. data/webpack/scenes/Content/__tests__/contentTable.test.js +89 -0
  328. data/webpack/scenes/Content/__tests__/contentTypes.fixtures.json +66 -0
  329. data/webpack/scenes/Content/__tests__/pythonPackages.fixtures.json +30 -0
  330. data/webpack/scenes/Content/index.js +4 -0
  331. data/webpack/scenes/ContentViews/ContentViewSelectors.js +5 -6
  332. data/webpack/scenes/ContentViews/ContentViewsActions.js +13 -8
  333. data/webpack/scenes/ContentViews/ContentViewsConstants.js +31 -4
  334. data/webpack/scenes/ContentViews/ContentViewsPage.js +4 -0
  335. data/webpack/scenes/ContentViews/Copy/CopyContentViewForm.js +19 -7
  336. data/webpack/scenes/ContentViews/Copy/CopyContentViewModal.js +7 -5
  337. data/webpack/scenes/ContentViews/Copy/__tests__/copyContentView.test.js +1 -1
  338. data/webpack/scenes/ContentViews/Create/CreateContentViewForm.js +7 -3
  339. data/webpack/scenes/ContentViews/Create/__tests__/createContentView.test.js +1 -2
  340. data/webpack/scenes/ContentViews/Delete/CVDeleteContext.js +4 -0
  341. data/webpack/scenes/ContentViews/Delete/ContentViewDeleteWizard.js +170 -0
  342. data/webpack/scenes/ContentViews/Delete/Steps/CVDeleteEnvironmentsSelection.js +108 -0
  343. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionFinish.js +69 -0
  344. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionReassignActivationKeysForm.js +121 -0
  345. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionReassignHostsForm.js +120 -0
  346. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionReview.js +62 -0
  347. data/webpack/scenes/ContentViews/Delete/Steps/CVEnvironmentSelectionForm.scss +4 -0
  348. data/webpack/scenes/ContentViews/Delete/__tests__/CvData.fixtures.json +259 -0
  349. data/webpack/scenes/ContentViews/Delete/__tests__/affectedHosts.fixtures.json +155 -0
  350. data/webpack/scenes/ContentViews/Delete/__tests__/contentViewDelete.test.js +241 -0
  351. data/webpack/scenes/ContentViews/Delete/__tests__/cvDetails.fixtures.json +248 -0
  352. data/webpack/scenes/ContentViews/Delete/__tests__/cvVersionsData.fixtures.json +865 -0
  353. data/webpack/scenes/ContentViews/Delete/__tests__/envPathData.fixtures.json +424 -0
  354. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewAddModal.js +15 -7
  355. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewBulkAddModal.js +123 -0
  356. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentEnvironments.js +1 -1
  357. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentVersion.js +8 -5
  358. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ContentViewComponents.js +109 -51
  359. data/webpack/scenes/ContentViews/Details/ComponentContentViews/__tests__/contentViewComponents.fixtures.json +21 -6
  360. data/webpack/scenes/ContentViews/Details/ComponentContentViews/__tests__/contentViewComponents.test.js +80 -16
  361. data/webpack/scenes/ContentViews/Details/ContentViewDetailActions.js +248 -3
  362. data/webpack/scenes/ContentViews/Details/ContentViewDetailSelectors.js +141 -0
  363. data/webpack/scenes/ContentViews/Details/ContentViewDetails.js +36 -54
  364. data/webpack/scenes/ContentViews/Details/ContentViewInfo.js +20 -4
  365. data/webpack/scenes/ContentViews/Details/Filters/Add/CVFilterAddModal.js +63 -38
  366. data/webpack/scenes/ContentViews/Details/Filters/Add/__tests__/cvFilterAdd.test.js +3 -4
  367. data/webpack/scenes/ContentViews/Details/Filters/AffectedRepositories/AffectedRepositorySelection.js +65 -0
  368. data/webpack/scenes/ContentViews/Details/Filters/AffectedRepositories/AffectedRepositoryTable.js +260 -0
  369. data/webpack/scenes/ContentViews/Details/Filters/ArtifactsWithNoErrata.js +54 -0
  370. data/webpack/scenes/ContentViews/Details/Filters/CVContainerImageFilterContent.js +202 -0
  371. data/webpack/scenes/ContentViews/Details/Filters/CVErrataDateFilterContent.js +291 -0
  372. data/webpack/scenes/ContentViews/Details/Filters/CVErrataIDFilterContent.js +441 -0
  373. data/webpack/scenes/ContentViews/Details/Filters/CVFilterDetailType.js +62 -3
  374. data/webpack/scenes/ContentViews/Details/Filters/CVModuleStreamFilterContent.js +302 -0
  375. data/webpack/scenes/ContentViews/Details/Filters/CVPackageGroupFilterContent.js +186 -23
  376. data/webpack/scenes/ContentViews/Details/Filters/CVRpmFilterContent.js +144 -19
  377. data/webpack/scenes/ContentViews/Details/Filters/ContentType.js +2 -0
  378. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilterDetails.js +44 -13
  379. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilterDetailsHeader.js +81 -17
  380. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilters.js +43 -43
  381. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/CVRpmMatchContentModal.js +96 -0
  382. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/__tests__/CVRpmMatchContent.fixtures.json +166 -0
  383. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/__tests__/CVRpmMatchContentModal.test.js +90 -0
  384. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/__tests__/CVRpmMatchContentSearch.fixtures.json +33 -0
  385. data/webpack/scenes/ContentViews/Details/Filters/Rules/ContainerTag/AddEditContainerTagRuleModal.js +91 -0
  386. data/webpack/scenes/ContentViews/Details/Filters/Rules/Package/AddEditPackageRuleModal.js +237 -0
  387. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVContainerImageFilterContent.fixtures.json +42 -0
  388. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVContainerImageFilterContent.test.js +265 -0
  389. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVRpmFilterContent.test.js +218 -11
  390. data/webpack/scenes/ContentViews/Details/Filters/__tests__/ContentViewPackageGroupFilter.test.js +517 -0
  391. data/webpack/scenes/ContentViews/Details/Filters/__tests__/allFilterErrata.fixtures.json +122 -0
  392. data/webpack/scenes/ContentViews/Details/Filters/__tests__/allFilterModulesStreams.fixtures.json +60 -0
  393. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewErrataByDateDetails.fixtures.json +359 -0
  394. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilterDetail.fixtures.json +88 -102
  395. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilterDetails.test.js +34 -9
  396. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilters.fixtures.json +148 -132
  397. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilters.test.js +25 -7
  398. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvAllRepos.fixtures.json +150 -0
  399. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvErrataDateFilterContent.test.js +74 -0
  400. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvErrataIDFilter.test.js +404 -0
  401. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvErratumFilterDetails.fixtures.json +89 -0
  402. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvFilterDetailModuleAffectedRepos.fixtures.json +383 -0
  403. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvFilterDetailWithAffectedRepos.fixtures.json +375 -0
  404. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvFilterFixutre.fixture.json +282 -0
  405. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvModuleStreamFilter.test.js +392 -0
  406. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvModuleStreamFilterDetails.fixtures.json +97 -0
  407. data/webpack/scenes/ContentViews/Details/Filters/index.js +26 -0
  408. data/webpack/scenes/ContentViews/Details/Histories/ContentViewHistories.js +68 -79
  409. data/webpack/scenes/ContentViews/Details/Histories/__tests__/contentViewHistory.test.js +1 -2
  410. data/webpack/scenes/ContentViews/Details/Promote/ContentViewVersionPromote.js +163 -0
  411. data/webpack/scenes/ContentViews/Details/Promote/ContentViewVersionPromoteSelectors.js +16 -0
  412. data/webpack/scenes/ContentViews/Details/Repositories/ContentCounts.js +9 -1
  413. data/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js +88 -74
  414. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewAddRemove.test.js +8 -9
  415. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewDetailRepos.fixtures.json +3 -3
  416. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersionContent.js +30 -9
  417. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersionEnvironments.js +1 -1
  418. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersionErrata.js +9 -5
  419. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersionErrata.scss +2 -2
  420. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersions.js +132 -14
  421. data/webpack/scenes/ContentViews/Details/Versions/Delete/DeleteContext.js +4 -0
  422. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveCVVersionWizard.js +176 -0
  423. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVEnvironmentSelectionForm.js +127 -0
  424. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVReassignActivationKeysForm.js +131 -0
  425. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVReassignHostsForm.js +128 -0
  426. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVVersionDeleteFinish.js +94 -0
  427. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVVersionRemoveReview.js +67 -0
  428. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvAffectedActivationKeys.fixture.json +53 -0
  429. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvAffectedHosts.fixture.json +153 -0
  430. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvDropDownOptionsResponse.fixture.json +192 -0
  431. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvVersionRemove.test.js +313 -0
  432. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvVersionRemoveResponse.fixture.json +74 -0
  433. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/versionRemoveEnvPaths.fixtures.json +352 -0
  434. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/versionsResponseData.fixtures.json +583 -0
  435. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedActivationKeys.js +96 -0
  436. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedHosts.js +97 -0
  437. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailConfig.js +332 -0
  438. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetails.js +128 -0
  439. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetails.scss +44 -0
  440. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsHeader.js +66 -0
  441. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsTable.js +125 -0
  442. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionRepositoryCell.js +115 -0
  443. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionAnsibleCollections.fixtures.json +449 -0
  444. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionComponent.fixtures.json +753 -0
  445. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDebPackages.fixtures.json +58 -0
  446. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetails.fixtures.json +158 -0
  447. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetails.test.js +289 -0
  448. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetailsCounts.fixtures.json +73 -0
  449. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetailsEmpty.test.js +44 -0
  450. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDockerTags.fixtures.json +3024 -0
  451. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionErrata.fixtures.json +201 -0
  452. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionFiles.fixtures.json +22 -0
  453. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionModuleStreams.fixtures.json +196 -0
  454. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionRepositories.fixtures.json +1000 -0
  455. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionRpmPackageGroups.fixtures.json +44 -0
  456. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionRpmPackages.fixtures.json +394 -0
  457. data/webpack/scenes/ContentViews/Details/Versions/__tests__/contentViewVersions.fixtures.json +4 -4
  458. data/webpack/scenes/ContentViews/Details/Versions/__tests__/contentViewVersions.test.js +95 -26
  459. data/webpack/scenes/ContentViews/Details/Versions/__tests__/contentViewVersionsWithTask.fixtures.json +2 -2
  460. data/webpack/scenes/ContentViews/Details/Versions/index.js +25 -0
  461. data/webpack/scenes/ContentViews/Details/__tests__/contentViewDetail.test.js +20 -16
  462. data/webpack/scenes/ContentViews/Publish/__tests__/publishContentView.test.js +3 -5
  463. data/webpack/scenes/ContentViews/Table/ContentViewsTable.js +106 -64
  464. data/webpack/scenes/ContentViews/Table/tableDataGenerator.js +25 -4
  465. data/webpack/scenes/ContentViews/__tests__/basicContentViews.fixtures.js +1 -1
  466. data/webpack/scenes/ContentViews/__tests__/contentViewList.fixtures.json +4 -1
  467. data/webpack/scenes/ContentViews/__tests__/contentViewPage.test.js +29 -36
  468. data/webpack/scenes/ContentViews/__tests__/mockDetails.fixtures.json +10 -0
  469. data/webpack/scenes/ContentViews/components/CVBreadCrumb.js +117 -0
  470. data/webpack/scenes/ContentViews/components/ContentViewsCounter.js +59 -0
  471. data/webpack/scenes/ContentViews/components/EnvironmentLabels.js +4 -3
  472. data/webpack/scenes/ContentViews/components/EnvironmentPaths/EnvironmentPaths.js +30 -11
  473. data/webpack/scenes/ContentViews/components/TaskPresenter/TaskPresenter.js +1 -1
  474. data/webpack/scenes/ContentViews/expansions/DetailsExpansion.js +38 -1
  475. data/webpack/scenes/ContentViews/expansions/RelatedCompositeContentViewsModal.js +79 -0
  476. data/webpack/scenes/ContentViews/expansions/RelatedContentViewComponentsModal.js +107 -0
  477. data/webpack/scenes/ContentViews/expansions/__tests__/contentViewComponentsModal.test.js +59 -0
  478. data/webpack/scenes/ContentViews/expansions/__tests__/contentViewComponentsResponse.fixtures.json +116 -0
  479. data/webpack/scenes/ContentViews/expansions/__tests__/relatedCompositeCvs.fixtures.json +4 -0
  480. data/webpack/scenes/ContentViews/helpers.js +1 -0
  481. data/webpack/scenes/RedHatRepositories/components/RepositorySetRepository/RepositorySetRepository.js +1 -1
  482. data/webpack/scenes/RedHatRepositories/components/SearchBar.js +4 -3
  483. data/webpack/scenes/SmartProxy/SmartProxyContentTable.js +1 -1
  484. data/webpack/scenes/Subscriptions/SubscriptionsPage.js +17 -9
  485. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/__tests__/__snapshots__/SubscriptionsTable.test.js.snap +3 -3
  486. data/webpack/test-utils/nockWrapper.js +20 -3
  487. data/webpack/utils/helpers.js +16 -2
  488. data/webpack/utils/useDebounce.js +20 -0
  489. metadata +232 -54
  490. data/app/assets/javascripts/katello/widgets/tabs.js +0 -13
  491. data/app/assets/stylesheets/katello/widgets/tabs.scss +0 -69
  492. data/app/lib/actions/katello/provider/update.rb +0 -38
  493. data/webpack/components/RoutedTabs/RoutedTabs.js +0 -90
  494. data/webpack/components/Search/Search.test.js +0 -23
  495. data/webpack/components/Search/__snapshots__/Search.test.js.snap +0 -21
  496. data/webpack/components/extensions/HostDetails/Tabs/ContentTab.js +0 -42
  497. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewDetailRepos.test.js +0 -145
  498. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersionPackages.js +0 -0
@@ -2,20 +2,32 @@ import { API_OPERATIONS, APIActions, get, put, post } from 'foremanReact/redux/A
2
2
  import { addToast } from 'foremanReact/redux/actions/toasts';
3
3
  import { translate as __ } from 'foremanReact/common/I18n';
4
4
  import {
5
+ RPM_PACKAGES_CONTENT,
6
+ RPM_PACKAGE_GROUPS_CONTENT,
5
7
  UPDATE_CONTENT_VIEW,
6
8
  UPDATE_CONTENT_VIEW_FAILURE,
7
9
  UPDATE_CONTENT_VIEW_SUCCESS,
8
10
  CREATE_CONTENT_VIEW_FILTER_KEY,
9
11
  DELETE_CONTENT_VIEW_FILTER_KEY,
10
12
  DELETE_CONTENT_VIEW_FILTERS_KEY,
13
+ EDIT_CONTENT_VIEW_FILTER,
14
+ ADD_CONTENT_VIEW_FILTER_RULE,
15
+ EDIT_CONTENT_VIEW_FILTER_RULE,
16
+ REMOVE_CONTENT_VIEW_FILTER_RULE,
17
+ DELETE_CONTENT_VIEW_FILTER_RULES_KEY,
18
+ ADD_CONTENT_VIEW_FILTER_RULES_KEY,
11
19
  NOT_ADDED,
12
20
  ALL_STATUSES,
13
21
  REPOSITORY_TYPES,
22
+ ACTIVATION_KEY_KEY,
23
+ HOSTS_KEY,
14
24
  cvDetailsKey,
15
25
  cvDetailsRepoKey,
16
26
  cvDetailsFiltersKey,
17
27
  cvFilterDetailsKey,
18
28
  cvFilterPackageGroupsKey,
29
+ cvFilterModuleStreamKey,
30
+ cvFilterErratumIDKey,
19
31
  cvDetailsHistoryKey,
20
32
  cvFilterRulesKey,
21
33
  cvDetailsComponentKey,
@@ -24,13 +36,27 @@ import {
24
36
  cvRemoveComponentKey,
25
37
  addComponentSuccessMessage,
26
38
  removeComponentSuccessMessage,
39
+ cvVersionPromoteKey,
40
+ cvFilterRepoKey,
41
+ cvVersionDetailsKey,
42
+ cvRemoveVersionKey,
43
+ REPOSITORY_CONTENT,
44
+ FILE_CONTENT,
45
+ ERRATA_CONTENT,
46
+ MODULE_STREAMS_CONTENT,
47
+ DEB_PACKAGES_CONTENT,
48
+ ANSIBLE_COLLECTIONS_CONTENT,
49
+ DOCKER_TAGS_CONTENT,
27
50
  } from '../ContentViewsConstants';
28
- import api from '../../../services/api';
51
+ import api, { foremanApi, orgId } from '../../../services/api';
29
52
  import { getResponseErrorMsgs, apiError } from '../../../utils/helpers';
53
+ import { renderTaskStartedToast } from '../../Tasks/helpers';
54
+ import { cvErrorToast } from '../ContentViewsActions';
30
55
 
31
- const getContentViewDetails = cvId => get({
56
+ const getContentViewDetails = (cvId, extraParams = {}) => get({
32
57
  type: API_OPERATIONS.GET,
33
58
  key: cvDetailsKey(cvId),
59
+ params: { organization_id: orgId(), include_permissions: true, ...extraParams },
34
60
  url: api.getApiUrl(`/content_views/${cvId}`),
35
61
  });
36
62
 
@@ -44,6 +70,22 @@ const cvUpdateSuccess = (response, dispatch) => {
44
70
  }));
45
71
  };
46
72
 
73
+ export const getRPMPackages = params => get({
74
+ type: API_OPERATIONS.GET,
75
+ key: RPM_PACKAGES_CONTENT,
76
+ url: api.getApiUrl('/packages'),
77
+ params,
78
+ errorToast: error => __(`Something went wrong while fetching rpm packages! ${getResponseErrorMsgs(error.response)}`),
79
+ });
80
+
81
+ export const getFiles = params => get({
82
+ type: API_OPERATIONS.GET,
83
+ key: FILE_CONTENT,
84
+ url: api.getApiUrl('/files'),
85
+ params,
86
+ errorToast: error => __(`Something went wrong while fetching files! ${getResponseErrorMsgs(error.response)}`),
87
+ });
88
+
47
89
  export const updateContentView = (cvId, params) => dispatch => dispatch(put({
48
90
  type: API_OPERATIONS.PUT,
49
91
  key: cvDetailsKey(cvId),
@@ -85,6 +127,54 @@ export const createContentViewFilter = (cvId, params) => post({
85
127
  errorToast: error => __(`Something went wrong while creating the filter! ${getResponseErrorMsgs(error.response)}`),
86
128
  });
87
129
 
130
+ export const getDockerTags = params => get({
131
+ type: API_OPERATIONS.GET,
132
+ key: DOCKER_TAGS_CONTENT,
133
+ url: api.getApiUrl('/docker_tags'),
134
+ params,
135
+ errorToast: error => __(`Something went wrong while getting docker tags! ${getResponseErrorMsgs(error.response)}`),
136
+ });
137
+
138
+ export const getAnsibleCollections = params => get({
139
+ type: API_OPERATIONS.GET,
140
+ key: ANSIBLE_COLLECTIONS_CONTENT,
141
+ url: api.getApiUrl('/ansible_collections'),
142
+ params,
143
+ errorToast: error => __(`Something went wrong while getting ansible collections! ${getResponseErrorMsgs(error.response)}`),
144
+ });
145
+
146
+ export const getErrata = params => get({
147
+ type: API_OPERATIONS.GET,
148
+ key: ERRATA_CONTENT,
149
+ url: api.getApiUrl('/errata'),
150
+ params,
151
+ errorToast: error => __(`Something went wrong while getting errata! ${getResponseErrorMsgs(error.response)}`),
152
+ });
153
+
154
+ export const getDebPackages = params => get({
155
+ type: API_OPERATIONS.GET,
156
+ key: DEB_PACKAGES_CONTENT,
157
+ url: api.getApiUrl('/debs'),
158
+ params,
159
+ errorToast: error => __(`Something went wrong while getting deb packages! ${getResponseErrorMsgs(error.response)}`),
160
+ });
161
+
162
+ export const getModuleStreams = params => get({
163
+ type: API_OPERATIONS.GET,
164
+ key: MODULE_STREAMS_CONTENT,
165
+ url: api.getApiUrl('/module_streams'),
166
+ params,
167
+ errorToast: error => __(`Something went wrong while getting module streams! ${getResponseErrorMsgs(error.response)}`),
168
+ });
169
+
170
+ export const getRepositories = params => get({
171
+ type: API_OPERATIONS.GET,
172
+ key: REPOSITORY_CONTENT,
173
+ url: api.getApiUrl('/repositories'),
174
+ params,
175
+ errorToast: error => __(`Something went wrong while getting repositories! ${getResponseErrorMsgs(error.response)}`),
176
+ });
177
+
88
178
  export const getContentViewRepositories = (cvId, params, status) => {
89
179
  const apiParams = { ...params };
90
180
  let apiUrl = `/content_views/${cvId}/repositories`;
@@ -103,6 +193,28 @@ export const getContentViewRepositories = (cvId, params, status) => {
103
193
  });
104
194
  };
105
195
 
196
+ export const getFilterRepositories = (cvId, filterId, params) => {
197
+ const apiParams = { ...params };
198
+ const apiUrl = `/content_views/${cvId}/repositories`;
199
+
200
+ return get({
201
+ type: API_OPERATIONS.GET,
202
+ key: cvFilterRepoKey(filterId),
203
+ url: api.getApiUrl(apiUrl),
204
+ params: apiParams,
205
+ });
206
+ };
207
+
208
+ export const editCVFilter = (filterId, params, handleSuccess) => put({
209
+ type: API_OPERATIONS.PUT,
210
+ key: EDIT_CONTENT_VIEW_FILTER,
211
+ url: api.getApiUrl(`/content_view_filters/${filterId}`),
212
+ params,
213
+ handleSuccess,
214
+ successToast: () => __('Filter edited successfully'),
215
+ errorToast: error => __(`Something went wrong while editing the filter! ${getResponseErrorMsgs(error.response)}`),
216
+ });
217
+
106
218
  export const getRepositoryTypes = () => get({
107
219
  type: API_OPERATIONS.GET,
108
220
  key: REPOSITORY_TYPES,
@@ -117,6 +229,20 @@ export const getContentViewFilters = (cvId, params) => get({
117
229
  url: api.getApiUrl('/content_view_filters'),
118
230
  });
119
231
 
232
+ export const getActivationKeys = params => get({
233
+ key: ACTIVATION_KEY_KEY,
234
+ params: { organization_id: orgId(), ...params },
235
+ errorToast: error => __(`Something went wrong while retrieving the activation keys! ${getResponseErrorMsgs(error.response)}`),
236
+ url: api.getApiUrl('/activation_keys'),
237
+ });
238
+
239
+ export const getHosts = params => get({
240
+ key: HOSTS_KEY,
241
+ params: { organization_id: orgId(), ...params },
242
+ errorToast: error => __(`Something went wrong while retrieving the hosts! ${getResponseErrorMsgs(error.response)}`),
243
+ url: foremanApi.getApiUrl('/hosts'),
244
+ });
245
+
120
246
  export const deleteContentViewFilters = (cvId, ids, handleSuccess) => put({
121
247
  type: API_OPERATIONS.PUT,
122
248
  key: DELETE_CONTENT_VIEW_FILTERS_KEY,
@@ -127,6 +253,26 @@ export const deleteContentViewFilters = (cvId, ids, handleSuccess) => put({
127
253
  errorToast: error => __(`Something went wrong while deleting filters! ${getResponseErrorMsgs(error.response)}`),
128
254
  });
129
255
 
256
+ export const deleteContentViewFilterRules = (filterId, ids, handleSuccess) => put({
257
+ type: API_OPERATIONS.PUT,
258
+ key: DELETE_CONTENT_VIEW_FILTER_RULES_KEY,
259
+ url: api.getApiUrl(`/content_view_filters/${filterId}/remove_filter_rules`),
260
+ params: { rule_ids: ids },
261
+ handleSuccess,
262
+ successToast: () => __('Filter rules successfully deleted'),
263
+ errorToast: error => __(`Something went wrong while deleting filter rules! ${getResponseErrorMsgs(error.response)}`),
264
+ });
265
+
266
+ export const addContentViewFilterRules = (filterId, rulesParams, handleSuccess) => put({
267
+ type: API_OPERATIONS.PUT,
268
+ key: ADD_CONTENT_VIEW_FILTER_RULES_KEY,
269
+ url: api.getApiUrl(`/content_view_filters/${filterId}/add_filter_rules`),
270
+ params: { rules_params: rulesParams },
271
+ handleSuccess,
272
+ successToast: () => __('Filter rules successfully added'),
273
+ errorToast: error => __(`Something went wrong while adding filter rules! ${getResponseErrorMsgs(error.response)}`),
274
+ });
275
+
130
276
  export const deleteContentViewFilter = (filterId, handleSuccess) => APIActions.delete({
131
277
  type: API_OPERATIONS.DELETE,
132
278
  key: DELETE_CONTENT_VIEW_FILTER_KEY,
@@ -143,6 +289,13 @@ export const getCVFilterDetails = (cvId, filterId, params) => get({
143
289
  url: api.getApiUrl(`/content_view_filters/${filterId}`),
144
290
  });
145
291
 
292
+ export const getPackageGroups = params => get({
293
+ key: RPM_PACKAGE_GROUPS_CONTENT,
294
+ url: api.getApiUrl('/package_groups'),
295
+ params,
296
+ errorToast: error => __(`Something went wrong while retrieving package groups! ${getResponseErrorMsgs(error.response)}`),
297
+ });
298
+
146
299
  export const getCVFilterPackageGroups = (cvId, filterId, params) => get({
147
300
  key: cvFilterPackageGroupsKey(cvId, filterId),
148
301
  params: {
@@ -152,6 +305,61 @@ export const getCVFilterPackageGroups = (cvId, filterId, params) => get({
152
305
  url: api.getApiUrl('/package_groups'),
153
306
  });
154
307
 
308
+ export const getCVFilterModuleStreams = (cvId, filterId, params) => get({
309
+ key: cvFilterModuleStreamKey(cvId, filterId),
310
+ params: {
311
+ filter_id: filterId, show_all_for: 'content_view_filter', include_filter_ids: true, ...params,
312
+ },
313
+ errorToast: error => __(`Something went wrong while retrieving the content view filter! ${getResponseErrorMsgs(error.response)}`),
314
+ url: api.getApiUrl('/module_streams'),
315
+ });
316
+
317
+ export const getCVFilterErrata = (cvId, filterId, params = {}, statusSelected = ALL_STATUSES) => {
318
+ let apiParams = { filter_id: filterId, include_filter_ids: true, ...params };
319
+ if (statusSelected === ALL_STATUSES) {
320
+ apiParams = { show_all_for: 'content_view_filter', ...apiParams };
321
+ } else if (statusSelected === NOT_ADDED) {
322
+ apiParams = { available_for: 'content_view_filter', ...apiParams };
323
+ }
324
+
325
+ return get({
326
+ key: cvFilterErratumIDKey(cvId, filterId),
327
+ params: apiParams,
328
+ errorToast: error => __(`Something went wrong while retrieving the content view filter! ${getResponseErrorMsgs(error.response)}`),
329
+ url: api.getApiUrl('/errata'),
330
+ });
331
+ };
332
+
333
+ export const editCVFilterRule = (filterId, params, handleSuccess) => put({
334
+ type: API_OPERATIONS.PUT,
335
+ key: EDIT_CONTENT_VIEW_FILTER_RULE,
336
+ url: api.getApiUrl(`/content_view_filters/${filterId}/rules/${params.id}`),
337
+ params,
338
+ handleSuccess,
339
+ successToast: () => __('Filter rule edited successfully'),
340
+ errorToast: error => __(`Something went wrong while editing a filter rule! ${getResponseErrorMsgs(error.response)}`),
341
+ });
342
+
343
+ export const addCVFilterRule = (filterId, params, handleSuccess) => post({
344
+ type: API_OPERATIONS.POST,
345
+ key: ADD_CONTENT_VIEW_FILTER_RULE,
346
+ url: api.getApiUrl(`/content_view_filters/${filterId}/rules`),
347
+ params,
348
+ handleSuccess,
349
+ successToast: () => __('Filter rule added successfully'),
350
+ errorToast: error => __(`Something went wrong while adding a filter rule! ${getResponseErrorMsgs(error.response)}`),
351
+ });
352
+
353
+ export const removeCVFilterRule = (filterId, packageGroupFilterId, handleSuccess) =>
354
+ APIActions.delete({
355
+ type: API_OPERATIONS.DELETE,
356
+ key: REMOVE_CONTENT_VIEW_FILTER_RULE,
357
+ url: api.getApiUrl(`/content_view_filters/${filterId}/rules/${packageGroupFilterId}`),
358
+ handleSuccess,
359
+ successToast: () => __('Filter rule removed successfully'),
360
+ errorToast: error => __(`Something went wrong while removing a filter rule! ${getResponseErrorMsgs(error.response)}`),
361
+ });
362
+
155
363
  export const getContentViewHistories = (cvId, params) => {
156
364
  const apiParams = { ...params };
157
365
  const apiUrl = `/content_views/${cvId}/history`;
@@ -183,7 +391,7 @@ export const getContentViewComponents = (cvId, params, statusSelected) => {
183
391
 
184
392
  export const getContentViewVersions = (cvId, params) => {
185
393
  const apiParams = { content_view_id: cvId, ...params };
186
- const apiUrl = '/content_view_versions/';
394
+ const apiUrl = '/content_view_versions';
187
395
  return get({
188
396
  key: cvDetailsVersionKey(cvId),
189
397
  params: apiParams,
@@ -192,4 +400,41 @@ export const getContentViewVersions = (cvId, params) => {
192
400
  });
193
401
  };
194
402
 
403
+ export const getContentViewVersionDetails = (versionId, cvId, handleSuccess) =>
404
+ APIActions.get({
405
+ type: API_OPERATIONS.GET,
406
+ key: cvVersionDetailsKey(versionId, cvId),
407
+ url: api.getApiUrl(`/content_view_versions/${versionId}`),
408
+ handleSuccess,
409
+ errorToast: error => __(`Something went wrong while getting version details. ${getResponseErrorMsgs(error.response)}`),
410
+ });
411
+
412
+ export const editContentViewVersionDetails = (versionId, cvId, params, handleSuccess) =>
413
+ APIActions.put({
414
+ type: API_OPERATIONS.PUT,
415
+ key: cvVersionDetailsKey(versionId, cvId),
416
+ url: api.getApiUrl(`/content_view_versions/${versionId}`),
417
+ params,
418
+ handleSuccess,
419
+ errorToast: error => __(`Something went wrong while editing version details. ${getResponseErrorMsgs(error.response)}`),
420
+ });
421
+
422
+ export const removeContentViewVersion = (cvId, versionId, versionEnvironments, params) => put({
423
+ type: API_OPERATIONS.PUT,
424
+ key: cvRemoveVersionKey(versionId, versionEnvironments),
425
+ url: api.getApiUrl(`/content_views/${cvId}/remove`),
426
+ params,
427
+ handleSuccess: response => renderTaskStartedToast(response.data),
428
+ errorToast: error => cvErrorToast(error),
429
+ });
430
+
431
+ export const promoteContentViewVersion = params => post({
432
+ type: API_OPERATIONS.POST,
433
+ key: cvVersionPromoteKey(params.id, params.versionEnvironments),
434
+ url: api.getApiUrl(`/content_view_versions/${params.id}/promote`),
435
+ params,
436
+ handleSuccess: response => renderTaskStartedToast(response.data),
437
+ errorToast: error => cvErrorToast(error),
438
+ });
439
+
195
440
  export default getContentViewDetails;
@@ -10,6 +10,8 @@ import {
10
10
  cvDetailsFiltersKey,
11
11
  cvFilterDetailsKey,
12
12
  cvFilterPackageGroupsKey,
13
+ cvFilterModuleStreamKey,
14
+ cvFilterErratumIDKey,
13
15
  cvDetailsHistoryKey,
14
16
  cvFilterRulesKey,
15
17
  cvDetailsVersionKey,
@@ -18,6 +20,21 @@ import {
18
20
  cvAddComponentKey,
19
21
  cvRemoveComponentKey,
20
22
  CREATE_CONTENT_VIEW_FILTER_KEY,
23
+ ADD_CONTENT_VIEW_FILTER_RULE,
24
+ ACTIVATION_KEY_KEY,
25
+ HOSTS_KEY,
26
+ cvFilterRepoKey,
27
+ cvVersionDetailsKey,
28
+ cvRemoveVersionKey,
29
+ RPM_PACKAGES_CONTENT,
30
+ RPM_PACKAGE_GROUPS_CONTENT,
31
+ REPOSITORY_CONTENT,
32
+ FILE_CONTENT,
33
+ ERRATA_CONTENT,
34
+ MODULE_STREAMS_CONTENT,
35
+ DEB_PACKAGES_CONTENT,
36
+ ANSIBLE_COLLECTIONS_CONTENT,
37
+ DOCKER_TAGS_CONTENT,
21
38
  } from '../ContentViewsConstants';
22
39
  import { pollTaskKey } from '../../Tasks/helpers';
23
40
 
@@ -63,6 +80,15 @@ export const selectCVFilterDetailStatus = (state, cvId, filterId) =>
63
80
  export const selectCVFilterDetailError = (state, cvId, filterId) =>
64
81
  selectAPIError(state, cvFilterDetailsKey(cvId, filterId));
65
82
 
83
+ export const selectCVFilterRepos = (state, filterId) =>
84
+ selectAPIResponse(state, cvFilterRepoKey(filterId)) || {};
85
+
86
+ export const selectCVFilterReposStatus = (state, filterId) =>
87
+ selectAPIStatus(state, cvFilterRepoKey(filterId)) || STATUS.PENDING;
88
+
89
+ export const selectCVFilterReposError = (state, filterId) =>
90
+ selectAPIError(state, cvFilterRepoKey(filterId));
91
+
66
92
  export const selectCVFilterPackageGroups = (state, cvId, filterId) =>
67
93
  selectAPIResponse(state, cvFilterPackageGroupsKey(cvId, filterId));
68
94
 
@@ -72,6 +98,24 @@ export const selectCVFilterPackageGroupStatus = (state, cvId, filterId) =>
72
98
  export const selectCVFilterPackageGroupError = (state, cvId, filterId) =>
73
99
  selectAPIError(state, cvFilterPackageGroupsKey(cvId, filterId));
74
100
 
101
+ export const selectCVFilterModuleStream = (state, cvId, filterId) =>
102
+ selectAPIResponse(state, cvFilterModuleStreamKey(cvId, filterId));
103
+
104
+ export const selectCVFilterModuleStreamStatus = (state, cvId, filterId) =>
105
+ selectAPIStatus(state, cvFilterModuleStreamKey(cvId, filterId)) || STATUS.PENDING;
106
+
107
+ export const selectCVFilterModuleStreamError = (state, cvId, filterId) =>
108
+ selectAPIError(state, cvFilterModuleStreamKey(cvId, filterId));
109
+
110
+ export const selectCVFilterErratumID = (state, cvId, filterId) =>
111
+ selectAPIResponse(state, cvFilterErratumIDKey(cvId, filterId));
112
+
113
+ export const selectCVFilterErratumIDStatus = (state, cvId, filterId) =>
114
+ selectAPIStatus(state, cvFilterErratumIDKey(cvId, filterId)) || STATUS.PENDING;
115
+
116
+ export const selectCVFilterErratumIDError = (state, cvId, filterId) =>
117
+ selectAPIError(state, cvFilterErratumIDKey(cvId, filterId));
118
+
75
119
  export const selectCVHistories = (state, cvId) =>
76
120
  selectAPIResponse(state, cvDetailsHistoryKey(cvId)) || {};
77
121
 
@@ -87,6 +131,60 @@ export const selectCVFilterRules = (state, filterId) =>
87
131
  export const selectCVFilterRulesStatus = (state, filterId) =>
88
132
  selectAPIStatus(state, cvFilterRulesKey(filterId)) || STATUS.PENDING;
89
133
 
134
+ export const selectAnsibleCollections = state =>
135
+ selectAPIResponse(state, ANSIBLE_COLLECTIONS_CONTENT);
136
+
137
+ export const selectAnsibleCollectionsStatus = state =>
138
+ selectAPIStatus(state, ANSIBLE_COLLECTIONS_CONTENT) || STATUS.PENDING;
139
+
140
+ export const selectDockerTags = state =>
141
+ selectAPIResponse(state, DOCKER_TAGS_CONTENT);
142
+
143
+ export const selectDockerTagsStatus = state =>
144
+ selectAPIStatus(state, DOCKER_TAGS_CONTENT) || STATUS.PENDING;
145
+
146
+ export const selectRepositories = state =>
147
+ selectAPIResponse(state, REPOSITORY_CONTENT);
148
+
149
+ export const selectRepositoriesStatus = state =>
150
+ selectAPIStatus(state, REPOSITORY_CONTENT) || STATUS.PENDING;
151
+
152
+ export const selectDebPackages = state =>
153
+ selectAPIResponse(state, DEB_PACKAGES_CONTENT);
154
+
155
+ export const selectDebPackagesStatus = state =>
156
+ selectAPIStatus(state, DEB_PACKAGES_CONTENT) || STATUS.PENDING;
157
+
158
+ export const selectModuleStreams = state =>
159
+ selectAPIResponse(state, MODULE_STREAMS_CONTENT);
160
+
161
+ export const selectModuleStreamsStatus = state =>
162
+ selectAPIStatus(state, MODULE_STREAMS_CONTENT) || STATUS.PENDING;
163
+
164
+ export const selectRPMPackageGroups = state =>
165
+ selectAPIResponse(state, RPM_PACKAGE_GROUPS_CONTENT);
166
+
167
+ export const selectRPMPackageGroupsStatus = state =>
168
+ selectAPIStatus(state, RPM_PACKAGE_GROUPS_CONTENT) || STATUS.PENDING;
169
+
170
+ export const selectRPMPackages = state =>
171
+ selectAPIResponse(state, RPM_PACKAGES_CONTENT);
172
+
173
+ export const selectRPMPackagesStatus = state =>
174
+ selectAPIStatus(state, RPM_PACKAGES_CONTENT) || STATUS.PENDING;
175
+
176
+ export const selectFiles = state =>
177
+ selectAPIResponse(state, FILE_CONTENT);
178
+
179
+ export const selectFilesStatus = state =>
180
+ selectAPIStatus(state, FILE_CONTENT) || STATUS.PENDING;
181
+
182
+ export const selectErrata = state =>
183
+ selectAPIResponse(state, ERRATA_CONTENT);
184
+
185
+ export const selectErrataStatus = state =>
186
+ selectAPIStatus(state, ERRATA_CONTENT) || STATUS.PENDING;
187
+
90
188
  export const selectCVComponents = (state, cvId) =>
91
189
  selectAPIResponse(state, cvDetailsComponentKey(cvId)) || {};
92
190
 
@@ -105,6 +203,15 @@ export const selectCVVersionsStatus = (state, cvId) =>
105
203
  export const selectCVVersionsError = (state, cvId) =>
106
204
  selectAPIError(state, cvDetailsVersionKey(cvId));
107
205
 
206
+ export const selectCVVersionDetails = (state, versionId, cvId) =>
207
+ selectAPIResponse(state, cvVersionDetailsKey(versionId, cvId)) || {};
208
+
209
+ export const selectCVVersionDetailsStatus = (state, versionId, cvId) =>
210
+ selectAPIStatus(state, cvVersionDetailsKey(versionId, cvId)) || STATUS.PENDING;
211
+
212
+ export const selectCVVersionDetailsError = (state, versionId, cvId) =>
213
+ selectAPIError(state, cvVersionDetailsKey(versionId, cvId));
214
+
108
215
  export const selectPublishTaskPoll = (state, cvVersionPublishKey) =>
109
216
  selectAPIResponse(state, pollTaskKey(cvVersionPublishKey)) || {};
110
217
 
@@ -144,4 +251,38 @@ export const selectCreateContentViewFilterStatus = state =>
144
251
  export const selectCreateContentViewFilterError = state =>
145
252
  selectAPIError(state, CREATE_CONTENT_VIEW_FILTER_KEY);
146
253
 
254
+ export const selectCreateFilterRule = state =>
255
+ selectAPIResponse(state, ADD_CONTENT_VIEW_FILTER_RULE) || {};
256
+
257
+ export const selectCreateFilterRuleStatus = state =>
258
+ selectAPIStatus(state, ADD_CONTENT_VIEW_FILTER_RULE) || STATUS.PENDING;
259
+
260
+ export const selectCreateFilterRuleError = state =>
261
+ selectAPIError(state, ADD_CONTENT_VIEW_FILTER_RULE);
262
+
263
+ export const selectCVActivationKeys = state =>
264
+ selectAPIResponse(state, ACTIVATION_KEY_KEY) || {};
265
+
266
+ export const selectCVActivationKeysStatus = state =>
267
+ selectAPIStatus(state, ACTIVATION_KEY_KEY) || STATUS.PENDING;
268
+
269
+ export const selectCVActivationKeysError = state =>
270
+ selectAPIError(state, ACTIVATION_KEY_KEY);
271
+
272
+ export const selectCVHosts = state =>
273
+ selectAPIResponse(state, HOSTS_KEY) || {};
274
+
275
+ export const selectCVHostsStatus = state =>
276
+ selectAPIStatus(state, HOSTS_KEY) || STATUS.PENDING;
277
+
278
+ export const selectRemoveCVVersionResponse = (state, versionId, versionEnvironments) =>
279
+ selectAPIResponse(state, cvRemoveVersionKey(versionId, versionEnvironments)) || {};
280
+
281
+ export const selectRemoveCVVersionStatus = (state, versionId, versionEnvironments) =>
282
+ selectAPIStatus(state, cvRemoveVersionKey(versionId, versionEnvironments)) || STATUS.PENDING;
283
+
284
+ export const selectRemoveCVVersionError = (state, versionId, versionEnvironments) =>
285
+ selectAPIError(state, cvRemoveVersionKey(versionId, versionEnvironments));
286
+
287
+
147
288
  export const selectIsCVUpdating = state => state.katello?.contentViewDetails?.updating;
@@ -1,32 +1,32 @@
1
1
  import React, { useState } from 'react';
2
2
  import { useSelector, shallowEqual } from 'react-redux';
3
- import { Link } from 'react-router-dom';
4
- import { Grid, GridItem, TextContent, Text, TextVariants, Button, Flex, FlexItem, Breadcrumb, BreadcrumbItem } from '@patternfly/react-core';
5
- import Skeleton from 'react-loading-skeleton';
3
+ import { useParams } from 'react-router-dom';
4
+ import { Grid, GridItem, TextContent, Text, TextVariants, Button, Flex, FlexItem } from '@patternfly/react-core';
6
5
  import { ExternalLinkAltIcon } from '@patternfly/react-icons';
7
6
  import { translate as __ } from 'foremanReact/common/I18n';
8
- import PropTypes from 'prop-types';
9
7
 
10
8
  import DetailsContainer from './DetailsContainer';
11
9
  import ContentViewInfo from './ContentViewInfo';
12
- import ContentViewVersions from './Versions/ContentViewVersions';
10
+ import ContentViewVersionsRoutes from './Versions';
11
+ import ContentViewFilterRoutes from './Filters';
13
12
  import ContentViewRepositories from './Repositories/ContentViewRepositories';
14
13
  import ContentViewComponents from './ComponentContentViews/ContentViewComponents';
15
14
  import ContentViewHistories from './Histories/ContentViewHistories';
16
- import ContentViewFilters from './Filters/ContentViewFilters';
17
- import ContentViewFilterDetails from './Filters/ContentViewFilterDetails';
18
15
  import { selectCVDetails } from './ContentViewDetailSelectors';
19
16
  import RoutedTabs from '../../../components/RoutedTabs';
20
17
  import ContentViewIcon from '../components/ContentViewIcon';
18
+ import CVBreadCrumb from '../components/CVBreadCrumb';
21
19
  import PublishContentViewWizard from '../Publish/PublishContentViewWizard';
20
+ import { hasPermission } from '../helpers';
22
21
 
23
- const ContentViewDetails = ({ match }) => {
24
- const cvId = parseInt(match.params.id, 10);
22
+ export default () => {
23
+ const { id } = useParams();
24
+ const cvId = Number(id);
25
25
  const details = useSelector(state => selectCVDetails(state, cvId), shallowEqual);
26
26
  const [isPublishModalOpen, setIsPublishModalOpen] = useState(false);
27
27
  const [currentStep, setCurrentStep] = useState(1);
28
28
 
29
- const { name, composite } = details;
29
+ const { name, composite, permissions } = details;
30
30
  const tabs = [
31
31
  {
32
32
  key: 'details',
@@ -36,24 +36,22 @@ const ContentViewDetails = ({ match }) => {
36
36
  {
37
37
  key: 'versions',
38
38
  title: __('Versions'),
39
- content: <ContentViewVersions cvId={cvId} />,
39
+ content: <ContentViewVersionsRoutes {...{ cvId, details }} />,
40
40
  },
41
- (composite ? {
41
+ ...composite ? [{
42
42
  key: 'contentviews',
43
43
  title: __('Content Views'),
44
44
  content: <ContentViewComponents {...{ cvId, details }} />,
45
- } : {
45
+ }] : [{
46
46
  key: 'repositories',
47
47
  title: __('Repositories'),
48
48
  content: <ContentViewRepositories {...{ cvId, details }} />,
49
- }
50
- ),
49
+ },
51
50
  {
52
51
  key: 'filters',
53
52
  title: __('Filters'),
54
- content: <ContentViewFilters cvId={cvId} />,
55
- detailContent: <ContentViewFilterDetails />,
56
- },
53
+ content: <ContentViewFilterRoutes {...{ cvId, details }} />,
54
+ }],
57
55
  {
58
56
  key: 'history',
59
57
  title: __('History'),
@@ -65,16 +63,8 @@ const ContentViewDetails = ({ match }) => {
65
63
  <Grid className="grid-with-margin">
66
64
  <DetailsContainer cvId={cvId}>
67
65
  <React.Fragment>
68
- <Breadcrumb style={{ marginTop: '15px' }}>
69
- <BreadcrumbItem
70
- aria-label="cv_breadcrumb"
71
- render={() => (<Link to="/labs/content_views" >{__('Content Views')}</Link>)}
72
- />
73
- <BreadcrumbItem aria-label="cv_breadcrumb_cv" isActive>
74
- {name || <Skeleton />}
75
- </BreadcrumbItem>
76
- </Breadcrumb>
77
- <GridItem span={8}>
66
+ <CVBreadCrumb />
67
+ <GridItem xl={8} lg={7} sm={12} >
78
68
  <Flex>
79
69
  <FlexItem>
80
70
  <TextContent>
@@ -86,21 +76,23 @@ const ContentViewDetails = ({ match }) => {
86
76
  </FlexItem>
87
77
  </Flex>
88
78
  </GridItem>
89
- <GridItem span={4}>
90
- <Flex>
91
- <FlexItem>
92
- <Button onClick={() => { setIsPublishModalOpen(true); }} variant="primary" aria-label="publish_content_view">
93
- Publish new version
94
- </Button>
95
- {isPublishModalOpen && <PublishContentViewWizard
96
- details={details}
97
- show={isPublishModalOpen}
98
- setIsOpen={setIsPublishModalOpen}
99
- currentStep={currentStep}
100
- setCurrentStep={setCurrentStep}
101
- aria-label="publish_content_view_modal"
102
- />}
103
- </FlexItem>
79
+ <GridItem xl={4} lg={5} sm={12} >
80
+ <Flex justifyContent={{ lg: 'justifyContentFlexEnd', sm: 'justifyContentFlexStart' }}>
81
+ {hasPermission(permissions, 'publish_content_views') &&
82
+ <FlexItem>
83
+ <Button onClick={() => { setIsPublishModalOpen(true); }} variant="primary" aria-label="publish_content_view">
84
+ {__('Publish new version')}
85
+ </Button>
86
+ {isPublishModalOpen && <PublishContentViewWizard
87
+ details={details}
88
+ show={isPublishModalOpen}
89
+ setIsOpen={setIsPublishModalOpen}
90
+ currentStep={currentStep}
91
+ setCurrentStep={setCurrentStep}
92
+ aria-label="publish_content_view_modal"
93
+ />}
94
+ </FlexItem>
95
+ }
104
96
  <FlexItem>
105
97
  <Button
106
98
  component="a"
@@ -116,20 +108,10 @@ const ContentViewDetails = ({ match }) => {
116
108
  </Flex>
117
109
  </GridItem>
118
110
  <GridItem span={12}>
119
- <RoutedTabs tabs={tabs} baseUrl={`/labs/content_views/${cvId}`} defaultTabIndex={1} />
111
+ <RoutedTabs tabs={tabs} defaultTabIndex={1} />
120
112
  </GridItem>
121
113
  </React.Fragment>
122
114
  </DetailsContainer>
123
115
  </Grid>
124
116
  );
125
117
  };
126
-
127
- ContentViewDetails.propTypes = {
128
- match: PropTypes.shape({
129
- params: PropTypes.shape({
130
- id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
131
- }),
132
- }).isRequired,
133
- };
134
-
135
- export default ContentViewDetails;