katello 4.4.2.2 → 4.5.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 (444) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/katello/api/rhsm/candlepin_proxies_controller.rb +5 -1
  3. data/app/controllers/katello/api/v2/alternate_content_sources_controller.rb +98 -0
  4. data/app/controllers/katello/api/v2/content_export_incrementals_controller.rb +39 -3
  5. data/app/controllers/katello/api/v2/content_exports_controller.rb +19 -0
  6. data/app/controllers/katello/api/v2/content_imports_controller.rb +13 -16
  7. data/app/controllers/katello/api/v2/content_view_versions_controller.rb +0 -12
  8. data/app/controllers/katello/api/v2/content_views_controller.rb +13 -0
  9. data/app/controllers/katello/api/v2/environments_controller.rb +1 -1
  10. data/app/controllers/katello/api/v2/host_module_streams_controller.rb +8 -2
  11. data/app/controllers/katello/api/v2/host_subscriptions_controller.rb +25 -3
  12. data/app/controllers/katello/api/v2/organizations_controller.rb +4 -2
  13. data/app/controllers/katello/api/v2/repositories_bulk_actions_controller.rb +1 -1
  14. data/app/controllers/katello/api/v2/repositories_controller.rb +9 -3
  15. data/app/controllers/katello/api/v2/repository_sets_controller.rb +40 -7
  16. data/app/controllers/katello/api/v2/subscriptions_controller.rb +2 -2
  17. data/app/controllers/katello/concerns/api/v2/hosts_controller_extensions.rb +1 -1
  18. data/app/helpers/katello/concerns/smart_proxy_helper_extensions.rb +4 -0
  19. data/app/helpers/katello/hosts_and_hostgroups_helper.rb +21 -3
  20. data/app/lib/actions/katello/alternate_content_source/create.rb +24 -0
  21. data/app/lib/actions/katello/alternate_content_source/destroy.rb +27 -0
  22. data/app/lib/actions/katello/alternate_content_source/update.rb +41 -0
  23. data/app/lib/actions/katello/cdn_configuration/update.rb +2 -2
  24. data/app/lib/actions/katello/content_view/destroy.rb +2 -1
  25. data/app/lib/actions/katello/content_view/incremental_updates.rb +7 -3
  26. data/app/lib/actions/katello/content_view/publish.rb +7 -9
  27. data/app/lib/actions/katello/content_view_version/auto_create_products.rb +4 -4
  28. data/app/lib/actions/katello/content_view_version/auto_create_redhat_repositories.rb +6 -4
  29. data/app/lib/actions/katello/content_view_version/auto_create_repositories.rb +6 -4
  30. data/app/lib/actions/katello/content_view_version/import.rb +25 -22
  31. data/app/lib/actions/katello/content_view_version/import_library.rb +0 -1
  32. data/app/lib/actions/katello/content_view_version/import_repository.rb +21 -0
  33. data/app/lib/actions/katello/content_view_version/incremental_update.rb +85 -93
  34. data/app/lib/actions/katello/content_view_version/reset_content_view_repositories_from_metadata.rb +2 -2
  35. data/app/lib/actions/katello/product/content_create.rb +10 -8
  36. data/app/lib/actions/katello/repository/destroy.rb +36 -12
  37. data/app/lib/actions/katello/repository_set/disable_repository.rb +8 -3
  38. data/app/lib/actions/pulp3/alternate_content_source/create.rb +20 -0
  39. data/app/lib/actions/pulp3/alternate_content_source/create_remote.rb +20 -0
  40. data/app/lib/actions/pulp3/alternate_content_source/delete.rb +16 -0
  41. data/app/lib/actions/pulp3/alternate_content_source/delete_remote.rb +16 -0
  42. data/app/lib/actions/pulp3/alternate_content_source/update.rb +16 -0
  43. data/app/lib/actions/pulp3/alternate_content_source/update_remote.rb +17 -0
  44. data/app/lib/actions/pulp3/content_view_version/{import.rb → create_import.rb} +5 -5
  45. data/app/lib/actions/pulp3/content_view_version/create_importer.rb +4 -3
  46. data/app/lib/actions/pulp3/content_view_version/destroy_importer.rb +12 -1
  47. data/app/lib/actions/pulp3/orchestration/alternate_content_source/create.rb +18 -0
  48. data/app/lib/actions/pulp3/orchestration/alternate_content_source/delete.rb +23 -0
  49. data/app/lib/actions/pulp3/orchestration/alternate_content_source/update.rb +18 -0
  50. data/app/lib/actions/pulp3/orchestration/content_view_version/copy_version_units_to_library.rb +1 -1
  51. data/app/lib/actions/pulp3/orchestration/content_view_version/export_repository.rb +51 -0
  52. data/app/lib/actions/pulp3/orchestration/content_view_version/import.rb +5 -2
  53. data/app/lib/actions/pulp3/repository/refresh_distribution.rb +4 -1
  54. data/app/lib/actions/pulp3/repository/save_distribution_references.rb +2 -0
  55. data/app/lib/katello/api/v2/error_handling.rb +1 -0
  56. data/app/lib/katello/resources/cdn/katello_cdn.rb +3 -1
  57. data/app/lib/katello/util/errata.rb +2 -3
  58. data/app/lib/katello/validators/alternate_content_source_path_validator.rb +29 -0
  59. data/app/lib/katello/validators/content_default_http_proxy_setting_validator.rb +12 -0
  60. data/app/lib/katello/validators/content_view_environment_validator.rb +10 -5
  61. data/app/models/katello/alternate_content_source.rb +66 -0
  62. data/app/models/katello/authorization/alternate_content_source.rb +33 -0
  63. data/app/models/katello/authorization/repository.rb +3 -3
  64. data/app/models/katello/candlepin/repository_mapper.rb +13 -6
  65. data/app/models/katello/cdn_configuration.rb +15 -15
  66. data/app/models/katello/concerns/content_facet_host_extensions.rb +25 -0
  67. data/app/models/katello/concerns/host_managed_extensions.rb +7 -5
  68. data/app/models/katello/concerns/http_proxy_extensions.rb +14 -0
  69. data/app/models/katello/concerns/organization_extensions.rb +4 -2
  70. data/app/models/katello/concerns/setting_extensions.rb +14 -0
  71. data/app/models/katello/concerns/smart_proxy_extensions.rb +2 -1
  72. data/app/models/katello/content.rb +1 -0
  73. data/app/models/katello/content_credential.rb +6 -0
  74. data/app/models/katello/content_override.rb +7 -3
  75. data/app/models/katello/content_view.rb +33 -2
  76. data/app/models/katello/content_view_erratum_filter.rb +26 -12
  77. data/app/models/katello/content_view_filter.rb +4 -0
  78. data/app/models/katello/content_view_version.rb +12 -0
  79. data/app/models/katello/content_view_version_export_history.rb +3 -1
  80. data/app/models/katello/erratum.rb +9 -5
  81. data/app/models/katello/events/delete_latest_content_view_version.rb +40 -0
  82. data/app/models/katello/host/content_facet.rb +14 -0
  83. data/app/models/katello/host_available_module_stream.rb +12 -0
  84. data/app/models/katello/product_content.rb +1 -0
  85. data/app/models/katello/purpose_sla_status.rb +1 -1
  86. data/app/models/katello/purpose_status.rb +2 -2
  87. data/app/models/katello/repository.rb +7 -4
  88. data/app/models/katello/root_repository.rb +1 -1
  89. data/app/models/katello/smart_proxy_alternate_content_source.rb +8 -0
  90. data/app/models/katello/sync_plan.rb +1 -1
  91. data/app/presenters/katello/product_content_presenter.rb +15 -0
  92. data/app/services/katello/applicable_host_queue.rb +1 -1
  93. data/app/services/katello/content_unit_indexer.rb +2 -1
  94. data/app/services/katello/product_content_finder.rb +12 -2
  95. data/app/services/katello/pulp3/alternate_content_source.rb +117 -0
  96. data/app/services/katello/pulp3/api/file.rb +8 -0
  97. data/app/services/katello/pulp3/api/yum.rb +8 -0
  98. data/app/services/katello/pulp3/content_view_version/export.rb +27 -5
  99. data/app/services/katello/pulp3/content_view_version/import.rb +97 -71
  100. data/app/services/katello/pulp3/content_view_version/import_export_common.rb +4 -4
  101. data/app/services/katello/pulp3/content_view_version/import_gpg_keys.rb +13 -11
  102. data/app/services/katello/pulp3/content_view_version/import_validator.rb +67 -72
  103. data/app/services/katello/pulp3/content_view_version/importable_products.rb +40 -24
  104. data/app/services/katello/pulp3/content_view_version/importable_repositories.rb +88 -39
  105. data/app/services/katello/pulp3/content_view_version/metadata_generator.rb +2 -2
  106. data/app/services/katello/pulp3/content_view_version/metadata_map.rb +117 -0
  107. data/app/services/katello/pulp3/pulp_content_unit.rb +6 -1
  108. data/app/services/katello/pulp3/repository/yum.rb +70 -12
  109. data/app/services/katello/pulp3/repository.rb +7 -91
  110. data/app/services/katello/pulp3/service_common.rb +66 -0
  111. data/app/services/katello/pulp3/smart_proxy_mirror_repository.rb +4 -1
  112. data/app/services/katello/ui_notifications/content_view/delete_latest_version_failure.rb +22 -0
  113. data/app/views/foreman/job_templates/change_content_source.erb +1 -1
  114. data/app/views/foreman/job_templates/install_errata.erb +5 -5
  115. data/app/views/foreman/job_templates/install_errata_by_search_query.erb +7 -6
  116. data/app/views/foreman/job_templates/install_group.erb +4 -4
  117. data/app/views/foreman/job_templates/install_package.erb +4 -4
  118. data/app/views/foreman/job_templates/install_packages_by_search_query.erb +3 -3
  119. data/app/views/foreman/job_templates/remove_group.erb +4 -4
  120. data/app/views/foreman/job_templates/remove_package.erb +4 -4
  121. data/app/views/foreman/job_templates/remove_packages_by_search_query.erb +3 -3
  122. data/app/views/foreman/job_templates/resolve_traces.erb +2 -2
  123. data/app/views/foreman/job_templates/restart_services.erb +3 -3
  124. data/app/views/foreman/job_templates/update_group.erb +4 -4
  125. data/app/views/foreman/job_templates/update_package.erb +4 -4
  126. data/app/views/foreman/job_templates/update_packages_by_search_query.erb +3 -3
  127. data/app/views/katello/api/v2/alternate_content_sources/base.json.rabl +15 -0
  128. data/app/views/katello/api/v2/alternate_content_sources/index.json.rabl +7 -0
  129. data/app/views/katello/api/v2/alternate_content_sources/show.json.rabl +3 -0
  130. data/app/views/katello/api/v2/capsule_content/sync_status.json.rabl +1 -1
  131. data/app/views/katello/api/v2/content_view_version_export_histories/show.json.rabl +2 -3
  132. data/app/views/katello/api/v2/content_view_versions/base.json.rabl +1 -1
  133. data/app/views/katello/api/v2/content_views/base.json.rabl +1 -0
  134. data/app/views/katello/api/v2/environments/show.json.rabl +2 -0
  135. data/app/views/katello/api/v2/errata/_counts.json.rabl +2 -2
  136. data/app/views/katello/api/v2/host_module_streams/base.json.rabl +2 -2
  137. data/app/views/katello/api/v2/hosts/host_collections.json.rabl +1 -1
  138. data/app/views/katello/api/v2/organizations/show.json.rabl +7 -1
  139. data/app/views/katello/api/v2/repositories/show.json.rabl +2 -1
  140. data/app/views/katello/sync_management/_repo.html.erb +8 -29
  141. data/config/routes/api/v2.rb +7 -0
  142. data/db/migrate/20150930183738_migrate_content_hosts.rb +0 -399
  143. data/db/migrate/20171025163149_remove_use_pulp_oauth_setting.rb +1 -1
  144. data/db/migrate/20171114150937_cleanup_installed_packages.rb +1 -1
  145. data/db/migrate/20180402160223_clean_up_force_post_sync_action_setting.rb +1 -1
  146. data/db/migrate/20211129200124_remove_dependency_solving_algorithm_setting.rb +1 -1
  147. data/db/migrate/20211220185935_clean_duplicate_content_units.rb +10 -12
  148. data/db/migrate/20220110223754_update_disconnected_settings.rb +5 -5
  149. data/db/migrate/20220117151612_add_alternate_content_sources.rb +48 -0
  150. data/db/migrate/20220124191056_add_type_to_cdn_configuration.rb +9 -4
  151. data/db/migrate/20220209203251_add_generated_for_to_content_views.rb +13 -0
  152. data/db/migrate/20220209205137_expand_sync_timeout_settings.rb +7 -7
  153. data/db/migrate/20220228173251_remove_drpm_from_ignorable_content.rb +12 -0
  154. data/db/migrate/20220404190836_delete_old_setting_data.rb +9 -0
  155. data/db/migrate/20220405220616_update_cdn_configuration_type.rb +11 -0
  156. data/db/migrate/20220419193414_content_settings_to_dsl_category.rb +5 -0
  157. data/db/seeds.d/110-content-view-autopublish.rb +13 -0
  158. data/db/seeds.d/150-module_job_templates.rb +1 -1
  159. data/engines/bastion/README.md +1 -0
  160. data/engines/bastion/app/assets/javascripts/bastion/components/bst-modal.directive.js +1 -0
  161. data/engines/bastion/app/views/bastion/layouts/assets.html.erb +1 -0
  162. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/activation-key-details.controller.js +4 -2
  163. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/capsule-content/capsule-content.controller.js +10 -5
  164. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-module-streams.controller.js +1 -0
  165. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-packages-installed.controller.js +1 -0
  166. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-traces.controller.js +1 -0
  167. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-packages-actions.html +1 -1
  168. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-packages-applicable.html +1 -1
  169. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content-hosts.controller.js +8 -0
  170. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/content-host-details.controller.js +4 -2
  171. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/content-hosts.html +2 -2
  172. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/content.service.js +10 -0
  173. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/details/views/environment-deb-repositories.html +26 -0
  174. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/details/views/environment-debs.html +27 -0
  175. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/environments.controller.js +1 -0
  176. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/environments.routes.js +22 -0
  177. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/views/environments.html +13 -7
  178. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +63 -17
  179. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-info.controller.js +7 -8
  180. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details.controller.js +10 -1
  181. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-details.html +21 -3
  182. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-info.html +8 -9
  183. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/new-repository.controller.js +7 -5
  184. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/views/new-repository.html +2 -1
  185. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/discovery/discovery-create.controller.js +1 -1
  186. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/discovery/views/discovery-create.html +1 -1
  187. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/products.routes.js +1 -0
  188. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/subscriptions/views/content-access-mode-banner.html +6 -1
  189. data/lib/katello/engine.rb +1 -5
  190. data/lib/katello/permission_creator.rb +32 -4
  191. data/lib/katello/plugin.rb +378 -4
  192. data/lib/katello/tasks/reset.rake.bak +67 -0
  193. data/lib/katello/tasks/update_content_default_http_proxy.rake +2 -3
  194. data/lib/katello/version.rb +1 -1
  195. data/locale/action_names.rb +47 -41
  196. data/locale/bn/LC_MESSAGES/katello.mo +0 -0
  197. data/locale/bn/katello.po +820 -106
  198. data/locale/bn/katello.po.time_stamp +0 -0
  199. data/locale/cs/LC_MESSAGES/katello.mo +0 -0
  200. data/locale/cs/katello.po +818 -104
  201. data/locale/cs/katello.po.time_stamp +0 -0
  202. data/locale/de/LC_MESSAGES/katello.mo +0 -0
  203. data/locale/de/katello.po +893 -179
  204. data/locale/de/katello.po.time_stamp +0 -0
  205. data/locale/en/LC_MESSAGES/katello.mo +0 -0
  206. data/locale/en/katello.po +817 -103
  207. data/locale/en/katello.po.time_stamp +0 -0
  208. data/locale/es/LC_MESSAGES/katello.mo +0 -0
  209. data/locale/es/katello.po +882 -168
  210. data/locale/es/katello.po.time_stamp +0 -0
  211. data/locale/fr/LC_MESSAGES/katello.mo +0 -0
  212. data/locale/fr/katello.po +1219 -505
  213. data/locale/fr/katello.po.time_stamp +0 -0
  214. data/locale/gu/LC_MESSAGES/katello.mo +0 -0
  215. data/locale/gu/katello.po +826 -112
  216. data/locale/gu/katello.po.time_stamp +0 -0
  217. data/locale/hi/LC_MESSAGES/katello.mo +0 -0
  218. data/locale/hi/katello.po +826 -112
  219. data/locale/hi/katello.po.time_stamp +0 -0
  220. data/locale/it/LC_MESSAGES/katello.mo +0 -0
  221. data/locale/it/katello.po +863 -148
  222. data/locale/it/katello.po.time_stamp +0 -0
  223. data/locale/ja/LC_MESSAGES/katello.mo +0 -0
  224. data/locale/ja/katello.po +1216 -499
  225. data/locale/ja/katello.po.time_stamp +0 -0
  226. data/locale/katello.pot +3847 -2507
  227. data/locale/kn/LC_MESSAGES/katello.mo +0 -0
  228. data/locale/kn/katello.po +826 -112
  229. data/locale/kn/katello.po.time_stamp +0 -0
  230. data/locale/ko/LC_MESSAGES/katello.mo +0 -0
  231. data/locale/ko/katello.po +912 -198
  232. data/locale/ko/katello.po.time_stamp +0 -0
  233. data/locale/mr/LC_MESSAGES/katello.mo +0 -0
  234. data/locale/mr/katello.po +826 -112
  235. data/locale/mr/katello.po.time_stamp +0 -0
  236. data/locale/or/LC_MESSAGES/katello.mo +0 -0
  237. data/locale/or/katello.po +826 -112
  238. data/locale/or/katello.po.time_stamp +0 -0
  239. data/locale/pa/LC_MESSAGES/katello.mo +0 -0
  240. data/locale/pa/katello.po +826 -112
  241. data/locale/pa/katello.po.time_stamp +0 -0
  242. data/locale/pt/LC_MESSAGES/katello.mo +0 -0
  243. data/locale/pt/katello.po +817 -103
  244. data/locale/pt/katello.po.time_stamp +0 -0
  245. data/locale/pt_BR/LC_MESSAGES/katello.mo +0 -0
  246. data/locale/pt_BR/katello.po +879 -165
  247. data/locale/pt_BR/katello.po.time_stamp +0 -0
  248. data/locale/ru/LC_MESSAGES/katello.mo +0 -0
  249. data/locale/ru/katello.po +927 -213
  250. data/locale/ru/katello.po.time_stamp +0 -0
  251. data/locale/ta/LC_MESSAGES/katello.mo +0 -0
  252. data/locale/ta/katello.po +820 -106
  253. data/locale/ta/katello.po.time_stamp +0 -0
  254. data/locale/te/LC_MESSAGES/katello.mo +0 -0
  255. data/locale/te/katello.po +826 -112
  256. data/locale/te/katello.po.time_stamp +0 -0
  257. data/locale/zh_CN/LC_MESSAGES/katello.mo +0 -0
  258. data/locale/zh_CN/katello.po +1202 -486
  259. data/locale/zh_CN/katello.po.time_stamp +0 -0
  260. data/locale/zh_TW/LC_MESSAGES/katello.mo +0 -0
  261. data/locale/zh_TW/katello.po +856 -142
  262. data/locale/zh_TW/katello.po.time_stamp +0 -0
  263. data/webpack/components/EditableTextInput/EditableTextInput.js +20 -5
  264. data/webpack/components/Errata/index.js +38 -8
  265. data/webpack/components/Packages/index.js +1 -4
  266. data/webpack/components/Search/Search.js +18 -3
  267. data/webpack/components/SelectAllCheckbox/index.js +1 -0
  268. data/webpack/components/SelectableDropdown/SelectableDropdown.js +4 -2
  269. data/webpack/components/Table/EmptyStateMessage.js +21 -7
  270. data/webpack/components/Table/MainTable.js +29 -4
  271. data/webpack/components/Table/TableHooks.js +63 -19
  272. data/webpack/components/Table/TableWrapper.js +4 -2
  273. data/webpack/components/Table/components/SortableColumnHeaders.js +19 -0
  274. data/webpack/components/Table/components/TranslatedPlural.js +57 -0
  275. data/webpack/components/TypeAhead/TypeAhead.js +8 -0
  276. data/webpack/components/TypeAhead/pf4Search/TypeAheadInput.js +13 -11
  277. data/webpack/components/TypeAhead/pf4Search/TypeAheadSearch.js +5 -2
  278. data/webpack/components/extensions/HostDetails/ActionsBar/index.js +27 -0
  279. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/ChangeHostCVModal.js +256 -0
  280. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/ContentViewDetailsCard.js +202 -0
  281. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/HostContentViewActions.js +19 -0
  282. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/HostContentViewConstants.js +2 -0
  283. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/__tests__/changeHostCVModal.test.js +131 -0
  284. data/webpack/components/extensions/HostDetails/Cards/{__tests__ → ContentViewDetailsCard/__tests__}/contentViewDetailsCard.test.js +22 -0
  285. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/__tests__/contentViews.fixtures.json +443 -0
  286. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/__tests__/envPaths.fixtures.json +320 -0
  287. data/webpack/components/extensions/HostDetails/Cards/ErrataOverviewCard.js +57 -33
  288. data/webpack/components/extensions/HostDetails/Cards/ErrataOverviewCard.scss +3 -0
  289. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsActions.js +30 -0
  290. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsCard.js +187 -0
  291. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsConstants.js +7 -0
  292. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsModal.js +227 -0
  293. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsSelectors.js +18 -0
  294. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/availableHostCollections.fixtures.json +106 -0
  295. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/hostCollectionsCard.test.js +110 -0
  296. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/hostCollectionsModal.test.js +235 -0
  297. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/removableHostCollections.fixtures.json +45 -0
  298. data/webpack/components/extensions/HostDetails/Cards/__tests__/errataOverviewCard.test.js +33 -8
  299. data/webpack/components/extensions/HostDetails/DetailsTabCards/InstalledProductsCard.js +44 -0
  300. data/webpack/components/extensions/HostDetails/DetailsTabCards/RegistrationCard.js +107 -0
  301. data/webpack/components/extensions/HostDetails/DetailsTabCards/SystemPropertiesCardExtensions.js +38 -0
  302. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab/ErrataTab.js +62 -39
  303. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab/HostErrataActions.js +1 -7
  304. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsActions.js +1 -3
  305. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsConstants.js +28 -0
  306. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsTab.js +486 -116
  307. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/__tests__/moduleStreamsTab.test.js +147 -1
  308. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/__tests__/modules.fixtures.json +6 -3
  309. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/HostPackagesActions.js +1 -7
  310. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackageInstallModal.js +2 -1
  311. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackagesTab.js +48 -19
  312. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionActions.js +35 -47
  313. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionConstants.js +1 -0
  314. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsActions.js +33 -54
  315. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsConstants.js +20 -0
  316. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab.js +269 -132
  317. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/TracesTab.js +47 -11
  318. data/webpack/components/extensions/HostDetails/Tabs/__tests__/errataTab.test.js +30 -42
  319. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packagesTab.test.js +36 -1
  320. data/webpack/components/extensions/HostDetails/Tabs/__tests__/repositorySetsTab.test.js +94 -46
  321. data/webpack/components/extensions/HostDetails/Tabs/__tests__/tracesTab.test.js +18 -2
  322. data/webpack/components/extensions/HostDetails/Tabs/customizedRexUrlHelpers.js +6 -0
  323. data/webpack/containers/Application/config.js +5 -0
  324. data/webpack/global_index.js +30 -7
  325. data/webpack/global_test_setup.js +13 -0
  326. data/webpack/redux/actions/RedHatRepositories/enabled.js +2 -1
  327. data/webpack/redux/actions/RedHatRepositories/helpers.js +9 -8
  328. data/webpack/scenes/AlternateContentSources/ACSActions.js +53 -0
  329. data/webpack/scenes/AlternateContentSources/ACSConstants.js +4 -0
  330. data/webpack/scenes/AlternateContentSources/ACSIndexPage.js +23 -0
  331. data/webpack/scenes/AlternateContentSources/ACSSelectors.js +15 -0
  332. data/webpack/scenes/AlternateContentSources/MainTable/ACSTable.js +152 -0
  333. data/webpack/scenes/AlternateContentSources/MainTable/__tests__/acsIndex.fixtures.json +91 -0
  334. data/webpack/scenes/AlternateContentSources/MainTable/__tests__/acsTable.test.js +67 -0
  335. data/webpack/scenes/AlternateContentSources/index.js +4 -0
  336. data/webpack/scenes/Content/Details/ContentRepositories.js +1 -0
  337. data/webpack/scenes/Content/Table/ContentTable.js +1 -0
  338. data/webpack/scenes/ContentViews/ContentViewsActions.js +6 -2
  339. data/webpack/scenes/ContentViews/ContentViewsConstants.js +11 -3
  340. data/webpack/scenes/ContentViews/Copy/CopyContentViewForm.js +2 -1
  341. data/webpack/scenes/ContentViews/Create/ContentViewFormComponents.js +10 -1
  342. data/webpack/scenes/ContentViews/Create/CreateContentViewForm.js +4 -3
  343. data/webpack/scenes/ContentViews/Create/__tests__/createContentView.test.js +1 -1
  344. data/webpack/scenes/ContentViews/Delete/ContentViewDeleteWizard.js +7 -5
  345. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionFinish.js +29 -21
  346. data/webpack/scenes/ContentViews/Delete/__tests__/contentViewDelete.test.js +15 -8
  347. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewAddModal.js +3 -3
  348. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewBulkAddModal.js +4 -4
  349. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ContentViewComponents.js +3 -1
  350. data/webpack/scenes/ContentViews/Details/ComponentContentViews/__tests__/contentViewComponents.test.js +4 -4
  351. data/webpack/scenes/ContentViews/Details/ContentViewDetailActions.js +34 -8
  352. data/webpack/scenes/ContentViews/Details/ContentViewDetailSelectors.js +33 -29
  353. data/webpack/scenes/ContentViews/Details/ContentViewDetails.js +130 -79
  354. data/webpack/scenes/ContentViews/Details/ContentViewInfo.js +17 -3
  355. data/webpack/scenes/ContentViews/Details/Filters/Add/CVFilterAddModal.js +2 -1
  356. data/webpack/scenes/ContentViews/Details/Filters/AffectedRepositories/AffectedRepositoryTable.js +2 -1
  357. data/webpack/scenes/ContentViews/Details/Filters/CVContainerImageFilterContent.js +6 -1
  358. data/webpack/scenes/ContentViews/Details/Filters/CVErrataDateFilterContent.js +41 -21
  359. data/webpack/scenes/ContentViews/Details/Filters/CVErrataIDFilterContent.js +38 -20
  360. data/webpack/scenes/ContentViews/Details/Filters/CVModuleStreamFilterContent.js +2 -0
  361. data/webpack/scenes/ContentViews/Details/Filters/CVPackageGroupFilterContent.js +8 -1
  362. data/webpack/scenes/ContentViews/Details/Filters/CVRpmFilterContent.js +9 -1
  363. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilters.js +2 -1
  364. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/CVRpmMatchContentModal.js +1 -0
  365. data/webpack/scenes/ContentViews/Details/Filters/Rules/ContainerTag/AddEditContainerTagRuleModal.js +27 -12
  366. data/webpack/scenes/ContentViews/Details/Filters/Rules/Package/AddEditPackageRuleModal.js +39 -17
  367. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVContainerImageFilterContent.test.js +27 -10
  368. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVRpmFilterContent.test.js +46 -23
  369. data/webpack/scenes/ContentViews/Details/Histories/ContentViewHistories.js +3 -2
  370. data/webpack/scenes/ContentViews/Details/Promote/ContentViewVersionPromote.js +5 -2
  371. data/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js +161 -108
  372. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewAddRemove.test.js +7 -7
  373. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewRepoAdd.fixture.json +1 -0
  374. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/ActionSummary.js +58 -0
  375. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/BulkDeleteContextWrapper.js +45 -0
  376. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/BulkDeleteHelpers.js +30 -0
  377. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/BulkDeleteModal.js +56 -0
  378. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ConfirmBulkDelete.js +126 -0
  379. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/FinishBulkDelete.js +61 -0
  380. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ReassignActivationKeys.js +196 -0
  381. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ReassignHosts.js +220 -0
  382. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ReviewEnvironments.js +104 -0
  383. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/BulkDeleteModal.test.js +122 -0
  384. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/BulkDeleteVersions.fixtures.json +600 -0
  385. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/contentView.fixtures.json +1504 -0
  386. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/contentViewVersion.fixtures.json +936 -0
  387. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/environmentPaths.fixtures.json +261 -0
  388. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/hosts.fixtures.json +163 -0
  389. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/bulkDeleteSteps.js +79 -0
  390. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersions.js +192 -167
  391. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveCVVersionWizard.js +2 -5
  392. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVVersionDeleteFinish.js +38 -53
  393. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVVersionRemoveReview.js +1 -1
  394. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvVersionRemove.test.js +6 -12
  395. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedActivationKeys.js +1 -0
  396. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedHosts.js +1 -0
  397. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailConfig.js +1 -0
  398. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetails.js +8 -20
  399. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsHeader.js +23 -13
  400. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsTable.js +3 -0
  401. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetails.fixtures.json +4 -4
  402. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetails.test.js +0 -3
  403. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetailsEmpty.test.js +4 -4
  404. data/webpack/scenes/ContentViews/Details/Versions/__tests__/contentViewVersions.test.js +12 -14
  405. data/webpack/scenes/ContentViews/Details/__tests__/contentViewDetails.fixtures.json +1 -0
  406. data/webpack/scenes/ContentViews/Publish/CVPublishFinish.js +96 -117
  407. data/webpack/scenes/ContentViews/Publish/PublishContentViewWizard.js +13 -19
  408. data/webpack/scenes/ContentViews/Publish/__tests__/publishContentView.test.js +9 -20
  409. data/webpack/scenes/ContentViews/Table/ContentViewsTable.js +165 -148
  410. data/webpack/scenes/ContentViews/Table/tableDataGenerator.js +2 -0
  411. data/webpack/scenes/ContentViews/__tests__/contentViewPage.test.js +4 -4
  412. data/webpack/scenes/ContentViews/components/ContentViewIcon.js +14 -3
  413. data/webpack/scenes/ContentViews/components/ContentViewsCounter.js +1 -1
  414. data/webpack/scenes/ContentViews/components/EnvironmentLabels.js +4 -3
  415. data/webpack/scenes/ContentViews/components/EnvironmentPaths/EnvironmentPaths.js +9 -5
  416. data/webpack/scenes/ContentViews/components/EnvironmentPaths/EnvironmentPaths.scss +6 -1
  417. data/webpack/scenes/ContentViews/components/TaskPresenter/TaskPresenter.js +40 -35
  418. data/webpack/scenes/ContentViews/expansions/DetailsExpansion.js +2 -2
  419. data/webpack/scenes/ContentViews/expansions/RelatedCompositeContentViewsModal.js +1 -1
  420. data/webpack/scenes/ContentViews/expansions/RelatedContentViewComponentsModal.js +4 -4
  421. data/webpack/scenes/ContentViews/expansions/__tests__/contentViewComponentsModal.test.js +1 -1
  422. data/webpack/scenes/ContentViews/helpers.js +3 -0
  423. data/webpack/scenes/Hosts/ChangeContentSource/helpers.js +5 -0
  424. data/webpack/scenes/RedHatRepositories/RedHatRepositoriesPage.js +3 -3
  425. data/webpack/scenes/RedHatRepositories/components/EnabledRepository/EnabledRepository.js +2 -1
  426. data/webpack/scenes/RedHatRepositories/components/EnabledRepository/__tests__/EnabledRepository.test.js +2 -0
  427. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnConfigurationConstants.js +3 -3
  428. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnTypeForm.js +2 -0
  429. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/{AirGappedTypeForm.js → ExportSyncForm.js} +7 -6
  430. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/{UpstreamServerTypeForm.js → NetworkSyncForm.js} +15 -7
  431. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/{AirGappedTypeForm.test.js → ExportSyncForm.test.js} +4 -4
  432. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/{UpstreamServerTypeForm.test.js → NetworkSyncForm.test.js} +8 -8
  433. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/index.js +11 -11
  434. data/webpack/scenes/Subscriptions/SubscriptionConstants.js +1 -0
  435. data/webpack/scenes/Subscriptions/SubscriptionsPage.js +8 -7
  436. data/webpack/scenes/Tasks/TaskActions.js +6 -0
  437. data/webpack/scenes/Tasks/TaskSelectors.js +11 -0
  438. data/webpack/scenes/Tasks/helpers.js +33 -5
  439. data/webpack/utils/helpers.js +2 -0
  440. metadata +158 -40
  441. data/app/models/setting/content.rb +0 -201
  442. data/webpack/components/Table/__test__/useBulkSelect.test.js +0 -99
  443. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard.js +0 -96
  444. data/webpack/scenes/ContentViews/Details/DetailsContainer.js +0 -36
@@ -75,7 +75,6 @@ test('Can open Remove wizard and remove version from simple environment', async
75
75
  const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl);
76
76
  const scope = nockInstance
77
77
  .get(cvVersions)
78
- .times(2)
79
78
  .query(true)
80
79
  .reply(200, cvVersionsData);
81
80
 
@@ -115,7 +114,7 @@ test('Can open Remove wizard and remove version from simple environment', async
115
114
  fireEvent.click(getByLabelText('Select row 1'));
116
115
  fireEvent.click(getByText('Next'));
117
116
  await patientlyWaitFor(() => {
118
- expect(getByText('Review Details')).toBeInTheDocument();
117
+ expect(getByText('Review details')).toBeInTheDocument();
119
118
  });
120
119
  expect(getAllByText('qa1')[0].closest('a'))
121
120
  .toHaveAttribute('href', '/lifecycle_environments/4');
@@ -123,8 +122,7 @@ test('Can open Remove wizard and remove version from simple environment', async
123
122
  assertNockRequest(scope);
124
123
  assertNockRequest(autocompleteScope);
125
124
  assertNockRequest(envPathRemovalScope);
126
- assertNockRequest(versionRemovalScope);
127
- assertNockRequest(scope, done);
125
+ assertNockRequest(versionRemovalScope, done);
128
126
  });
129
127
 
130
128
  test('Can open Remove wizard and remove version from environment with hosts', async (done) => {
@@ -136,7 +134,6 @@ test('Can open Remove wizard and remove version from environment with hosts', as
136
134
 
137
135
  const scope = nockInstance
138
136
  .get(cvVersions)
139
- .times(2)
140
137
  .query(true)
141
138
  .reply(200, cvVersionsData);
142
139
 
@@ -203,7 +200,7 @@ test('Can open Remove wizard and remove version from environment with hosts', as
203
200
  fireEvent.click(getByText('cv2'));
204
201
  fireEvent.click(getByText('Next'));
205
202
  await patientlyWaitFor(() => {
206
- expect(getByText('Review Details')).toBeInTheDocument();
203
+ expect(getByText('Review details')).toBeInTheDocument();
207
204
  expect(getByText('1 host will be moved to content view cv2 in')).toBeInTheDocument();
208
205
  });
209
206
  fireEvent.click(getAllByText('Remove')[0]);
@@ -215,8 +212,7 @@ test('Can open Remove wizard and remove version from environment with hosts', as
215
212
  assertNockRequest(hostScope);
216
213
  assertNockRequest(cVDropDownOptionsScope);
217
214
  assertNockRequest(envPathRemovalScope);
218
- assertNockRequest(versionRemovalScope);
219
- assertNockRequest(scope, done);
215
+ assertNockRequest(versionRemovalScope, done);
220
216
  });
221
217
 
222
218
  test('Can open Remove wizard and remove version from environment with activation keys', async (done) => {
@@ -228,7 +224,6 @@ test('Can open Remove wizard and remove version from environment with activation
228
224
 
229
225
  const scope = nockInstance
230
226
  .get(cvVersions)
231
- .times(2)
232
227
  .query(true)
233
228
  .reply(200, cvVersionsData);
234
229
 
@@ -295,7 +290,7 @@ test('Can open Remove wizard and remove version from environment with activation
295
290
  fireEvent.click(getByText('cv2'));
296
291
  fireEvent.click(getByText('Next'));
297
292
  await patientlyWaitFor(() => {
298
- expect(getByText('Review Details')).toBeInTheDocument();
293
+ expect(getByText('Review details')).toBeInTheDocument();
299
294
  expect(getByText('1 activation key will be moved to content view cv2 in')).toBeInTheDocument();
300
295
  });
301
296
  fireEvent.click(getAllByText('Remove')[0]);
@@ -308,6 +303,5 @@ test('Can open Remove wizard and remove version from environment with activation
308
303
  assertNockRequest(activationKeysScope);
309
304
  assertNockRequest(cVDropDownOptionsScope);
310
305
  assertNockRequest(envPathRemovalScope);
311
- assertNockRequest(versionRemovalScope);
312
- assertNockRequest(scope, done);
306
+ assertNockRequest(versionRemovalScope, done);
313
307
  });
@@ -54,6 +54,7 @@ const AffectedActivationKeys = ({
54
54
  fetchItems,
55
55
  status,
56
56
  }}
57
+ ouiaId="content-view-delete-modal-affected-activation-keys"
57
58
  autocompleteEndpoint="/activation_keys/auto_complete_search"
58
59
  variant={TableVariant.compact}
59
60
  >
@@ -49,6 +49,7 @@ const AffectedHosts = ({
49
49
  fetchItems,
50
50
  status,
51
51
  }}
52
+ ouiaId="content-view-delete-modal-affected-hosts-table"
52
53
  autocompleteEndpoint="/hosts/auto_complete_search"
53
54
  foremanApiAutoComplete
54
55
  variant={TableVariant.compact}
@@ -149,6 +149,7 @@ export default ({ cvId, versionId }) => [
149
149
  { title: __('Version'), getProperty: item => item?.version },
150
150
  { title: __('Release'), getProperty: item => item?.release },
151
151
  { title: __('Arch'), getProperty: item => item?.arch },
152
+ { title: __('Epoch'), getProperty: item => item?.epoch },
152
153
  ],
153
154
  },
154
155
  {
@@ -1,9 +1,8 @@
1
- import React, { useEffect, useState } from 'react';
2
- import useDeepCompareEffect from 'use-deep-compare-effect';
1
+ import React, { useEffect } from 'react';
3
2
  import { useParams, Route, useHistory, useLocation, Redirect, Switch } from 'react-router-dom';
4
3
  import { useDispatch, useSelector, shallowEqual } from 'react-redux';
5
4
  import { STATUS } from 'foremanReact/constants';
6
- import { isEmpty, first } from 'lodash';
5
+ import { first } from 'lodash';
7
6
  import { Grid, Tabs, Tab, TabTitleText, Label } from '@patternfly/react-core';
8
7
  import { number, shape } from 'prop-types';
9
8
  import './ContentViewVersionDetails.scss';
@@ -20,8 +19,6 @@ const ContentViewVersionDetails = ({ cvId, details }) => {
20
19
  const { pathname } = useLocation();
21
20
  const { push } = useHistory();
22
21
  const dispatch = useDispatch();
23
- const [versionDetails, setVersionDetails] = useState({});
24
- const [mounted, setMounted] = useState(true);
25
22
  // Example urls expected:/versions/:id or /versions/:id/repositories.
26
23
  const tab = pathname.split('/')[3];
27
24
  const response = useSelector(state =>
@@ -32,20 +29,11 @@ const ContentViewVersionDetails = ({ cvId, details }) => {
32
29
  const tableConfigs = getCVVersionTableConfigs({ cvId, versionId });
33
30
 
34
31
  useEffect(() => {
35
- if (mounted || (isEmpty(response) && status === STATUS.PENDING)) {
36
- dispatch(getContentViewVersionDetails(versionId, cvId));
37
- }
38
- return () => { setMounted(false); };
39
- }, [dispatch, mounted, setMounted, versionId, cvId, response, status]);
40
-
41
- useDeepCompareEffect(() => {
42
- if (loaded) {
43
- setVersionDetails(response);
44
- }
45
- }, [response, loaded, tableConfigs]);
32
+ dispatch(getContentViewVersionDetails(versionId, cvId));
33
+ }, [dispatch, versionId, cvId]);
46
34
 
47
35
  const editDiscription = (val, attribute) => {
48
- const { description } = versionDetails;
36
+ const { description } = response;
49
37
  if (val !== description) {
50
38
  dispatch(editContentViewVersionDetails(
51
39
  versionId,
@@ -64,16 +52,16 @@ const ContentViewVersionDetails = ({ cvId, details }) => {
64
52
  };
65
53
 
66
54
  // Checking versionDetails is done to prevent two renders of the table.
67
- if (!loaded && isEmpty(versionDetails)) return <Loading />;
55
+ if (!loaded) return <Loading />;
68
56
  const filteredTableConfigs = tableConfigs.filter(({ getCountKey }) => !!getCountKey(response));
69
- const { repositories } = versionDetails;
57
+ const { repositories } = response;
70
58
  const showTabs = filteredTableConfigs.length > 0 && repositories;
71
59
  const getCurrentActiveKey = tab ?? first(filteredTableConfigs)?.route;
72
60
 
73
61
  return (
74
62
  <Grid>
75
63
  <ContentViewVersionDetailsHeader
76
- versionDetails={versionDetails}
64
+ versionDetails={response}
77
65
  onEdit={editDiscription}
78
66
  loading={status === STATUS.PENDING}
79
67
  details={details}
@@ -16,21 +16,25 @@ import {
16
16
  KebabToggle,
17
17
  DropdownPosition,
18
18
  } from '@patternfly/react-core';
19
+ import { useHistory } from 'react-router-dom';
19
20
  import { translate as __ } from 'foremanReact/common/I18n';
20
21
  import { hasPermission } from '../../../helpers';
21
22
  import ContentViewVersionPromote from '../../Promote/ContentViewVersionPromote';
22
23
  import getEnvironmentPaths from '../../../components/EnvironmentPaths/EnvironmentPathActions';
23
24
  import RemoveCVVersionWizard from '../Delete/RemoveCVVersionWizard';
24
25
  import ActionableDetail from '../../../../../components/ActionableDetail';
26
+ import BulkDeleteModal from '../BulkDelete/BulkDeleteModal';
25
27
 
26
28
  const ContentViewVersionDetailsHeader = ({
27
- versionDetails: {
28
- version, description, environments, content_view_id: cvId, id,
29
- },
29
+ versionDetails,
30
30
  onEdit,
31
31
  details: { permissions },
32
32
  loading,
33
33
  }) => {
34
+ const history = useHistory();
35
+ const {
36
+ version, description, environments, content_view_id: cvId, id,
37
+ } = versionDetails;
34
38
  const dispatch = useDispatch();
35
39
  useEffect(
36
40
  () => {
@@ -42,7 +46,7 @@ const ContentViewVersionDetailsHeader = ({
42
46
  const [promoting, setPromoting] = useState(false);
43
47
  const [removingFromEnv, setRemovingFromEnv] = useState(false);
44
48
  const [currentStep, setCurrentStep] = useState(1);
45
- const [deleteVersion, setDeleteVersion] = useState(false);
49
+ const [bulkDeleteOpen, setBulkDeleteOpen] = useState(false);
46
50
  const dropDownItems = [
47
51
  <DropdownItem
48
52
  key="remove"
@@ -54,14 +58,12 @@ const ContentViewVersionDetailsHeader = ({
54
58
  </DropdownItem>,
55
59
  <DropdownItem
56
60
  key="delete"
57
- onClick={() => {
58
- setCurrentStep(1);
59
- setDeleteVersion(true);
60
- setRemovingFromEnv(true);
61
- }}
61
+ onClick={() =>
62
+ setBulkDeleteOpen(true)
63
+ }
62
64
  >
63
65
  {__('Delete')}
64
- </DropdownItem>,
66
+ </DropdownItem >,
65
67
  ];
66
68
 
67
69
  return (
@@ -73,10 +75,11 @@ const ContentViewVersionDetailsHeader = ({
73
75
  </GridItem>
74
76
  <GridItem sm={6} style={{ display: 'flex' }}>
75
77
  <Button
78
+ ouiaId="cv-details-promote-button"
76
79
  style={{ marginLeft: 'auto' }}
77
80
  onClick={() => setPromoting(true)}
78
81
  variant="primary"
79
- aria-label="publish_content_view"
82
+ aria-label="promote_content_view"
80
83
  >
81
84
  {__('Promote')}
82
85
  </Button>
@@ -120,6 +123,15 @@ const ContentViewVersionDetailsHeader = ({
120
123
  aria-label="promote_content_view_modal"
121
124
  />
122
125
  }
126
+ {bulkDeleteOpen &&
127
+ <BulkDeleteModal
128
+ versions={[versionDetails]}
129
+ onClose={(redirect) => {
130
+ setBulkDeleteOpen(false);
131
+ if (redirect) history.push(`/content_views/${cvId}#/versions`);
132
+ }}
133
+ />
134
+ }
123
135
  {removingFromEnv &&
124
136
  <RemoveCVVersionWizard
125
137
  cvId={cvId}
@@ -130,8 +142,6 @@ const ContentViewVersionDetailsHeader = ({
130
142
  setIsOpen={setRemovingFromEnv}
131
143
  currentStep={currentStep}
132
144
  setCurrentStep={setCurrentStep}
133
- deleteWizard={deleteVersion}
134
- detailsPage
135
145
  aria-label="remove_content_view_version_modal"
136
146
  />
137
147
  }
@@ -2,6 +2,7 @@
2
2
  import React, { useState } from 'react';
3
3
  import { translate as __ } from 'foremanReact/common/I18n';
4
4
  import PropTypes from 'prop-types';
5
+ import { kebabCase } from 'lodash';
5
6
  import {
6
7
  shallowEqual,
7
8
  useSelector,
@@ -34,6 +35,7 @@ const ContentViewVersionDetailsTable = ({
34
35
  fetchItems,
35
36
  columnHeaders,
36
37
  disableSearch,
38
+ route,
37
39
  }, repositories,
38
40
  }) => {
39
41
  const ALL_REPOSITORIES = __('All Repositories');
@@ -77,6 +79,7 @@ const ContentViewVersionDetailsTable = ({
77
79
  autocompleteEndpoint,
78
80
  disableSearch,
79
81
  }}
82
+ ouiaId={`content-view-version-details-${kebabCase(route)}-table`}
80
83
  additionalListeners={[selected]}
81
84
  fetchItems={fetchItemsWithRepositoryId}
82
85
  emptySearchTitle={__('Your search returned no matching ') + name}
@@ -146,12 +146,12 @@
146
146
  "yum_repository_count": 0,
147
147
  "repositories": [],
148
148
  "errata_counts": {
149
- "security": 2,
149
+ "security": 0,
150
150
  "bugfix": 0,
151
- "enhancement": 5,
152
- "total": 9
151
+ "enhancement": 0,
152
+ "total": 0
153
153
  },
154
154
  "permissions": {
155
155
  "deletable": true
156
156
  }
157
- }
157
+ }
@@ -58,7 +58,6 @@ test('Can show versions details - Components Tab', async (done) => {
58
58
  const { version } = ContentViewVersionDetailsData;
59
59
  const scope = nockInstance
60
60
  .get(cvVersions)
61
- .times(2)
62
61
  .query(true)
63
62
  .reply(200, getTabSpecificData('component_view_count'));
64
63
 
@@ -204,7 +203,6 @@ testConfig.forEach(({
204
203
 
205
204
  const scope = nockInstance
206
205
  .get(cvVersions)
207
- .times(2)
208
206
  .query(true)
209
207
  .reply(200, getTabSpecificData(countKey));
210
208
 
@@ -257,7 +255,6 @@ test('Can change repository selector', async (done) => {
257
255
  const scope = nockInstance
258
256
  .get(cvVersions)
259
257
  .query(true)
260
- .times(2)
261
258
  .reply(200, {
262
259
  ...getTabSpecificData(countKey),
263
260
  repositories: ContentViewVersionDetailsCounts.repositories,
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { renderWithRedux, patientlyWaitFor } from 'react-testing-lib-wrapper';
2
+ import { renderWithRedux, patientlyWaitFor, act } from 'react-testing-lib-wrapper';
3
3
  import { Route } from 'react-router-dom';
4
4
 
5
5
  import nock, { nockInstance, assertNockRequest } from '../../../../../../test-utils/nockWrapper';
@@ -55,11 +55,11 @@ test('Can show versions detail header', async (done) => {
55
55
  );
56
56
 
57
57
  // Nothing will show at first, page is loading
58
- expect(queryByText(`Version ${version}`)).toBeNull();
58
+ expect(queryByText(`Version ${version}`)).not.toBeInTheDocument();
59
59
  // Assert that the CV version is now showing on the screen, but wait for it to appear.
60
60
  await patientlyWaitFor(() => {
61
- expect(getByText(`Version ${version}`)).toBeTruthy();
61
+ expect(getByText(`Version ${version}`)).toBeInTheDocument();
62
62
  });
63
-
64
63
  assertNockRequest(scope, done);
64
+ act(done);// Need to tell the test to stahp!
65
65
  });
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { renderWithRedux, patientlyWaitFor, fireEvent } from 'react-testing-lib-wrapper';
2
+ import { act, renderWithRedux, patientlyWaitFor, fireEvent } from 'react-testing-lib-wrapper';
3
3
  import { Route } from 'react-router-dom';
4
4
  import nock, { nockInstance, assertNockRequest, mockAutocomplete, mockSetting } from '../../../../../test-utils/nockWrapper';
5
5
  import api from '../../../../../services/api';
@@ -122,7 +122,7 @@ test('Can show package and erratas and link to list page', async () => {
122
122
 
123
123
  await patientlyWaitFor(() => {
124
124
  expect(getAllByText(8)[0].closest('a'))
125
- .toHaveAttribute('href', '/content_views/5#/versions/11/rpmPackages/');
125
+ .toHaveAttribute('href', '/content_views/5#/versions/11/packages/');
126
126
  expect(getAllByText(15)[0].closest('a'))
127
127
  .toHaveAttribute('href', '/content_views/5#/versions/11/errata/');
128
128
  expect(getByText(5)).toBeInTheDocument();
@@ -146,7 +146,6 @@ test('Can show additional content and link to list page', async () => {
146
146
  renderOptions,
147
147
  );
148
148
 
149
-
150
149
  await patientlyWaitFor(() => {
151
150
  expect(getByText('3 Files').closest('a'))
152
151
  .toHaveAttribute('href', '/content_views/5#/versions/11/files/');
@@ -183,6 +182,7 @@ test('Can call API and show versions with tasks on page load', async (done) => {
183
182
  const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl);
184
183
  const { results: withTaskResults } = cvVersionsTasksData;
185
184
  [firstVersion] = withTaskResults;
185
+
186
186
  const scope = nockInstance
187
187
  .get(cvVersions)
188
188
  .query(true)
@@ -190,6 +190,7 @@ test('Can call API and show versions with tasks on page load', async (done) => {
190
190
 
191
191
  const taskInProgressScope = nockInstance
192
192
  .get(taskPollingUrl)
193
+ .times(4)
193
194
  .reply(200, contentViewTaskInProgressResponseData);
194
195
 
195
196
  const {
@@ -207,9 +208,11 @@ test('Can call API and show versions with tasks on page load', async (done) => {
207
208
  expect(getByLabelText('task_presenter')).toBeInTheDocument();
208
209
  expect(getByLabelText('task_presenter')).toHaveAttribute('aria-valuenow', '50');
209
210
  });
211
+
210
212
  assertNockRequest(autocompleteScope);
211
213
  assertNockRequest(scope);
212
214
  assertNockRequest(taskInProgressScope, done);
215
+ act(done);// Force the test to stop listening for tasks
213
216
  });
214
217
 
215
218
  test('Can reload versions upon task completion', async (done) => {
@@ -223,6 +226,7 @@ test('Can reload versions upon task completion', async (done) => {
223
226
 
224
227
  const taskSuccessScope = nockInstance
225
228
  .get(taskPollingUrl)
229
+ .times(6)
226
230
  .reply(200, contentViewTaskResponseData);
227
231
 
228
232
  const reloadScope = nockInstance
@@ -230,9 +234,8 @@ test('Can reload versions upon task completion', async (done) => {
230
234
  .query(true)
231
235
  .reply(200, cvVersionsData);
232
236
 
233
-
234
237
  const {
235
- getByText, queryByLabelText, getByLabelText, queryByText,
238
+ queryByLabelText, queryByText,
236
239
  } = renderWithRedux(
237
240
  withCVRoute(<ContentViewVersions cvId={5} details={cvDetailData} />),
238
241
  renderOptions,
@@ -240,33 +243,27 @@ test('Can reload versions upon task completion', async (done) => {
240
243
 
241
244
  // Nothing will show at first, page is loading
242
245
  expect(queryByText(`Version ${firstVersion.version}`)).toBeNull();
243
- // Assert that the CV version and active task is now showing on the screen.
244
- await patientlyWaitFor(() => {
245
- expect(queryByText(`Version ${firstVersion.version}`)).toBeInTheDocument();
246
- expect(getByLabelText('task_presenter')).toBeInTheDocument();
247
- });
248
- const { results } = cvVersionsData;
249
- [firstVersion] = results;
250
246
 
251
247
  // Assert that the CV version is shown and active task is not rendered anymore on the screen.
252
248
  await patientlyWaitFor(() => {
253
- expect(getByText(`Version ${firstVersion.version}`)).toBeInTheDocument();
254
249
  expect(queryByLabelText('task_presenter')).not.toBeInTheDocument();
255
250
  });
251
+
256
252
  assertNockRequest(autocompleteScope);
257
253
  assertNockRequest(scope);
258
254
  assertNockRequest(taskSuccessScope);
259
255
  // Assert CV Versions API is called upon task completion
260
256
  assertNockRequest(reloadScope, done);
257
+ act(done);
261
258
  });
262
259
 
263
260
  test('Can open Promote Modal', async (done) => {
264
261
  const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl);
265
262
  const scope = nockInstance
266
263
  .get(cvVersions)
267
- .times(2)
268
264
  .query(true)
269
265
  .reply(200, cvVersionsData);
266
+
270
267
  const cvPromoteParams = {
271
268
  id: 10, versionEnvironments: [], description: '', environment_ids: [5], force: true,
272
269
  };
@@ -307,4 +304,5 @@ test('Can open Promote Modal', async (done) => {
307
304
  assertNockRequest(promoteScope);
308
305
  // Page is refreshed
309
306
  assertNockRequest(scope, done);
307
+ act(done);
310
308
  });
@@ -7,6 +7,7 @@
7
7
  "latest_version": "5.0",
8
8
  "auto_publish": false,
9
9
  "solve_dependencies": false,
10
+ "generated_for": "none",
10
11
  "repository_ids": [
11
12
  58,
12
13
  62,