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
@@ -1,42 +1,43 @@
1
+ import { STATUS } from 'foremanReact/constants';
1
2
  import {
2
- selectAPIStatus,
3
3
  selectAPIError,
4
4
  selectAPIResponse,
5
+ selectAPIStatus,
5
6
  } from 'foremanReact/redux/API/APISelectors';
6
- import { STATUS } from 'foremanReact/constants';
7
+ import { pollTaskKey } from '../../Tasks/helpers';
7
8
  import {
9
+ ACTIVATION_KEY_KEY,
10
+ ADD_CONTENT_VIEW_FILTER_RULE,
11
+ bulkRemoveVersionKey,
12
+ CREATE_CONTENT_VIEW_FILTER_KEY,
13
+ cvAddComponentKey,
14
+ cvDetailsComponentKey,
15
+ cvDetailsFiltersKey,
16
+ cvDetailsHistoryKey,
8
17
  cvDetailsKey,
9
18
  cvDetailsRepoKey,
10
- cvDetailsFiltersKey,
19
+ cvDetailsVersionKey,
11
20
  cvFilterDetailsKey,
12
- cvFilterPackageGroupsKey,
13
- cvFilterModuleStreamKey,
14
21
  cvFilterErratumIDKey,
15
- cvDetailsHistoryKey,
22
+ cvFilterModuleStreamKey,
23
+ cvFilterPackageGroupsKey,
24
+ cvFilterRepoKey,
16
25
  cvFilterRulesKey,
17
- cvDetailsVersionKey,
18
- REPOSITORY_TYPES,
19
- cvDetailsComponentKey,
20
- cvAddComponentKey,
21
26
  cvRemoveComponentKey,
22
- CREATE_CONTENT_VIEW_FILTER_KEY,
23
- ADD_CONTENT_VIEW_FILTER_RULE,
24
- ACTIVATION_KEY_KEY,
25
- HOSTS_KEY,
26
- cvFilterRepoKey,
27
- cvVersionDetailsKey,
28
27
  cvRemoveVersionKey,
29
- RPM_PACKAGES_CONTENT,
30
- RPM_PACKAGE_GROUPS_CONTENT,
31
- REPOSITORY_CONTENT,
32
- FILE_CONTENT,
33
- ERRATA_CONTENT,
34
- MODULE_STREAMS_CONTENT,
28
+ cvVersionDetailsKey,
35
29
  DEB_PACKAGES_CONTENT,
36
30
  DOCKER_TAGS_CONTENT,
31
+ ERRATA_CONTENT,
32
+ FILE_CONTENT,
37
33
  generatedContentKey,
34
+ HOSTS_KEY,
35
+ MODULE_STREAMS_CONTENT,
36
+ REPOSITORY_CONTENT,
37
+ REPOSITORY_TYPES,
38
+ RPM_PACKAGE_GROUPS_CONTENT,
39
+ RPM_PACKAGES_CONTENT,
38
40
  } from '../ContentViewsConstants';
39
- import { pollTaskKey } from '../../Tasks/helpers';
40
41
 
41
42
  export const selectCVDetails = (state, cvId) =>
42
43
  selectAPIResponse(state, cvDetailsKey(cvId)) || {};
@@ -212,12 +213,6 @@ export const selectCVVersionDetailsStatus = (state, versionId, cvId) =>
212
213
  export const selectCVVersionDetailsError = (state, versionId, cvId) =>
213
214
  selectAPIError(state, cvVersionDetailsKey(versionId, cvId));
214
215
 
215
- export const selectPublishTaskPoll = (state, cvVersionPublishKey) =>
216
- selectAPIResponse(state, pollTaskKey(cvVersionPublishKey)) || {};
217
-
218
- export const selectPublishTaskPollStatus = (state, cvVersionPublishKey) =>
219
- selectAPIStatus(state, pollTaskKey(cvVersionPublishKey)) || STATUS.PENDING;
220
-
221
216
  export const selectTaskPoll = (state, key) =>
222
217
  selectAPIResponse(state, pollTaskKey(key)) || {};
223
218
 
@@ -275,6 +270,15 @@ export const selectCVHosts = state =>
275
270
  export const selectCVHostsStatus = state =>
276
271
  selectAPIStatus(state, HOSTS_KEY) || STATUS.PENDING;
277
272
 
273
+ export const selectBulkRemoveCVVersionResponse = (state, cvId) =>
274
+ selectAPIResponse(state, bulkRemoveVersionKey(cvId)) || {};
275
+
276
+ export const selectBulkRemoveCVVersionStatus = (state, cvId) =>
277
+ selectAPIStatus(state, bulkRemoveVersionKey(cvId)) || STATUS.PENDING;
278
+
279
+ export const selectBulkRemoveCVVersionError = (state, cvId) =>
280
+ selectAPIError(state, bulkRemoveVersionKey(cvId));
281
+
278
282
  export const selectRemoveCVVersionResponse = (state, versionId, versionEnvironments) =>
279
283
  selectAPIResponse(state, cvRemoveVersionKey(versionId, versionEnvironments)) || {};
280
284
 
@@ -1,5 +1,5 @@
1
- import React, { useState } from 'react';
2
- import { useSelector, shallowEqual } from 'react-redux';
1
+ import React, { useState, useEffect } from 'react';
2
+ import { useSelector, shallowEqual, useDispatch } from 'react-redux';
3
3
  import { useParams } from 'react-router-dom';
4
4
  import {
5
5
  Grid,
@@ -15,17 +15,20 @@ import {
15
15
  KebabToggle,
16
16
  DropdownPosition,
17
17
  } from '@patternfly/react-core';
18
+ import { STATUS } from 'foremanReact/constants';
18
19
  import { ExternalLinkAltIcon } from '@patternfly/react-icons';
19
20
  import { translate as __ } from 'foremanReact/common/I18n';
20
21
 
21
- import DetailsContainer from './DetailsContainer';
22
+ import { selectIsPollingTask, selectIsPollingTaskComplete } from '../../Tasks/TaskSelectors';
23
+ import getContentViewDetails from './ContentViewDetailActions';
24
+ import Loading from '../../../components/Loading';
22
25
  import ContentViewInfo from './ContentViewInfo';
23
26
  import ContentViewVersionsRoutes from './Versions';
24
27
  import ContentViewFilterRoutes from './Filters';
25
28
  import ContentViewRepositories from './Repositories/ContentViewRepositories';
26
29
  import ContentViewComponents from './ComponentContentViews/ContentViewComponents';
27
30
  import ContentViewHistories from './Histories/ContentViewHistories';
28
- import { selectCVDetails } from './ContentViewDetailSelectors';
31
+ import { selectCVDetails, selectCVDetailStatus, selectCVDetailError } from './ContentViewDetailSelectors';
29
32
  import RoutedTabs from '../../../components/RoutedTabs';
30
33
  import ContentViewIcon from '../components/ContentViewIcon';
31
34
  import CVBreadCrumb from '../components/CVBreadCrumb';
@@ -33,16 +36,49 @@ import PublishContentViewWizard from '../Publish/PublishContentViewWizard';
33
36
  import { hasPermission } from '../helpers';
34
37
  import CopyContentViewModal from '../Copy/CopyContentViewModal';
35
38
  import ContentViewDeleteWizard from '../Delete/ContentViewDeleteWizard';
39
+ import EmptyStateMessage from '../../../components/Table/EmptyStateMessage';
40
+ import { cvVersionTaskPollingKey } from '../ContentViewsConstants';
41
+ import { clearPollTaskData, stopPollingTask } from '../../Tasks/TaskActions';
36
42
 
37
43
  export default () => {
38
44
  const { id } = useParams();
39
45
  const cvId = Number(id);
46
+ const contentViewVersionTaskKey = cvVersionTaskPollingKey(cvId);
40
47
  const details = useSelector(state => selectCVDetails(state, cvId), shallowEqual);
41
48
  const [isPublishModalOpen, setIsPublishModalOpen] = useState(false);
42
- const [currentStep, setCurrentStep] = useState(1);
43
49
  const [dropDownOpen, setDropdownOpen] = useState(false);
44
50
  const [copying, setCopying] = useState(false);
45
51
  const [deleting, setDeleting] = useState(false);
52
+ const dispatch = useDispatch();
53
+ const status = useSelector(state => selectCVDetailStatus(state, cvId), shallowEqual);
54
+ const error = useSelector(state => selectCVDetailError(state, cvId), shallowEqual);
55
+ const taskNeedsToBeStopped = useSelector(state =>
56
+ selectIsPollingTaskComplete(state, contentViewVersionTaskKey));
57
+ const isTaskRunning = useSelector(state =>
58
+ selectIsPollingTask(state, contentViewVersionTaskKey));
59
+
60
+ useEffect(() => {
61
+ if (taskNeedsToBeStopped) {
62
+ dispatch(stopPollingTask(contentViewVersionTaskKey));
63
+ dispatch(clearPollTaskData(contentViewVersionTaskKey));
64
+ }
65
+ return () => {
66
+ // This stops the polling task if you leave contentView/XXX route.
67
+ if (isTaskRunning && !taskNeedsToBeStopped) {
68
+ dispatch(stopPollingTask(contentViewVersionTaskKey));
69
+ dispatch(clearPollTaskData(contentViewVersionTaskKey));
70
+ }
71
+ };
72
+ }, [contentViewVersionTaskKey, dispatch, isTaskRunning, taskNeedsToBeStopped]);
73
+
74
+ useEffect(() => {
75
+ dispatch(getContentViewDetails(cvId));
76
+ }, [cvId, dispatch]);
77
+
78
+
79
+ if (status === STATUS.PENDING) return (<Loading />);
80
+ if (status === STATUS.ERROR) return (<EmptyStateMessage error={error} />);
81
+
46
82
  const dropDownItems = [
47
83
  <DropdownItem
48
84
  key="copy"
@@ -64,7 +100,9 @@ export default () => {
64
100
 
65
101
  const {
66
102
  name, composite, permissions, environments, versions,
103
+ generated_for: generatedFor, import_only: importOnly,
67
104
  } = details;
105
+ const generatedContentView = generatedFor !== 'none';
68
106
  const tabs = [
69
107
  {
70
108
  key: 'details',
@@ -85,6 +123,7 @@ export default () => {
85
123
  title: __('Repositories'),
86
124
  content: <ContentViewRepositories {...{ cvId, details }} />,
87
125
  },
126
+ !(importOnly || generatedContentView) &&
88
127
  {
89
128
  key: 'filters',
90
129
  title: __('Filters'),
@@ -97,90 +136,102 @@ export default () => {
97
136
  },
98
137
  ];
99
138
 
139
+
100
140
  return (
101
141
  <>
102
- <DetailsContainer cvId={cvId}>
103
- <Grid>
104
- <Grid className="margin-16-24">
105
- <CVBreadCrumb />
106
- <GridItem md={8} sm={12}>
107
- <Flex alignItems={{
108
- default: 'alignItemsCenter',
109
- }}
110
- >
111
- <FlexItem>
112
- <TextContent>
113
- <Text component={TextVariants.h1}>
114
- <ContentViewIcon count={name} composite={composite} />
115
- </Text>
116
- </TextContent>
117
- </FlexItem>
118
- </Flex>
119
- </GridItem>
120
- <GridItem md={4} sm={12} style={{ minWidth: '380px' }}>
121
- <Flex justifyContent={{ lg: 'justifyContentFlexEnd', sm: 'justifyContentFlexStart' }}>
122
- {hasPermission(permissions, 'publish_content_views') &&
123
- <FlexItem>
124
- <Button onClick={() => { setIsPublishModalOpen(true); }} variant="primary" aria-label="publish_content_view">
125
- {__('Publish new version')}
126
- </Button>
127
- {isPublishModalOpen && <PublishContentViewWizard
128
- details={details}
129
- show={isPublishModalOpen}
130
- setIsOpen={setIsPublishModalOpen}
131
- currentStep={currentStep}
132
- setCurrentStep={setCurrentStep}
133
- aria-label="publish_content_view_modal"
134
- />}
135
- </FlexItem>
136
- }
142
+ <Grid>
143
+ <Grid className="margin-16-24">
144
+ <CVBreadCrumb />
145
+ <GridItem md={8} sm={12}>
146
+ <Flex alignItems={{
147
+ default: 'alignItemsCenter',
148
+ }}
149
+ >
150
+ <FlexItem>
151
+ <TextContent>
152
+ <Text component={TextVariants.h1}>
153
+ <ContentViewIcon count={name} composite={composite} />
154
+ </Text>
155
+ </TextContent>
156
+ </FlexItem>
157
+ </Flex>
158
+ </GridItem>
159
+ <GridItem md={4} sm={12} style={{ minWidth: '380px' }}>
160
+ <Flex justifyContent={{ lg: 'justifyContentFlexEnd', sm: 'justifyContentFlexStart' }}>
161
+ {hasPermission(permissions, 'publish_content_views') &&
137
162
  <FlexItem>
138
163
  <Button
139
- component="a"
140
- aria-label="view tasks button"
141
- href={`/foreman_tasks/tasks?search=resource_type%3D+Katello%3A%3AContentView+resource_id%3D${cvId}`}
142
- target="_blank"
164
+ ouiaId="cv-details-publish-button"
165
+ isDisabled={importOnly || generatedContentView}
166
+ onClick={() => setIsPublishModalOpen(true)}
143
167
  variant="secondary"
168
+ aria-label="publish_content_view"
144
169
  >
145
- {'View tasks '}
146
- <ExternalLinkAltIcon />
170
+ {__('Publish new version')}
147
171
  </Button>
172
+ {isPublishModalOpen &&
173
+ <PublishContentViewWizard
174
+ details={details}
175
+ show={isPublishModalOpen}
176
+ onClose={(step3) => {
177
+ if (step3) dispatch(getContentViewDetails(cvId));
178
+ setIsPublishModalOpen(false);
179
+ }}
180
+ aria-label="publish_content_view_modal"
181
+ />}
148
182
  </FlexItem>
149
- <FlexItem>
150
- <Dropdown
151
- position={DropdownPosition.right}
152
- style={{ marginLeft: 'auto' }}
153
- toggle={<KebabToggle onToggle={setDropdownOpen} id="toggle-dropdown" />}
154
- isOpen={dropDownOpen}
155
- isPlain
156
- dropdownItems={dropDownItems}
157
- />
158
- </FlexItem>
159
- </Flex>
160
- </GridItem>
161
- </Grid>
162
- <GridItem span={12}>
163
- <RoutedTabs tabs={tabs} defaultTabIndex={1} />
183
+ }
184
+ <FlexItem>
185
+ <Button
186
+ ouiaId="cv-details-view-tasks-button"
187
+ component="a"
188
+ aria-label="view tasks button"
189
+ href={`/foreman_tasks/tasks?search=resource_type%3D+Katello%3A%3AContentView+resource_id%3D${cvId}`}
190
+ target="_blank"
191
+ variant="secondary"
192
+ >
193
+ {__('View tasks ')}
194
+ <ExternalLinkAltIcon />
195
+ </Button>
196
+ </FlexItem>
197
+ <FlexItem>
198
+ <Dropdown
199
+ position={DropdownPosition.right}
200
+ style={{ marginLeft: 'auto' }}
201
+ toggle={<KebabToggle onToggle={setDropdownOpen} id="toggle-dropdown" />}
202
+ isOpen={dropDownOpen}
203
+ isPlain
204
+ dropdownItems={dropDownItems}
205
+ />
206
+ </FlexItem>
207
+ </Flex>
164
208
  </GridItem>
165
209
  </Grid>
166
- </DetailsContainer>
167
- {copying && <CopyContentViewModal
168
- cvId={cvId}
169
- cvName={name}
170
- show={copying}
171
- setIsOpen={setCopying}
172
- aria-label="copy_content_view_modal"
173
- />}
174
- {deleting && <ContentViewDeleteWizard
175
- cvId={cvId && Number(cvId)}
176
- cvEnvironments={environments}
177
- cvVersions={versions}
178
- show={deleting}
179
- setIsOpen={setDeleting}
180
- currentStep={currentStep}
181
- setCurrentStep={setCurrentStep}
182
- aria-label="delete_content_view_modal"
183
- />}
210
+ <GridItem span={12}>
211
+ <RoutedTabs tabs={tabs} defaultTabIndex={1} />
212
+ </GridItem>
213
+ </Grid>
214
+ {
215
+ copying &&
216
+ <CopyContentViewModal
217
+ cvId={cvId}
218
+ cvName={name}
219
+ show={copying}
220
+ setIsOpen={setCopying}
221
+ aria-label="copy_content_view_modal"
222
+ />
223
+ }
224
+ {
225
+ deleting &&
226
+ <ContentViewDeleteWizard
227
+ cvId={cvId && Number(cvId)}
228
+ cvEnvironments={environments}
229
+ cvVersions={versions}
230
+ show={deleting}
231
+ setIsOpen={setDeleting}
232
+ aria-label="delete_content_view_modal"
233
+ />
234
+ }
184
235
  </>
185
236
  );
186
237
  };
@@ -19,7 +19,7 @@ import ContentViewIcon from '../components/ContentViewIcon';
19
19
  import ActionableDetail from '../../../components/ActionableDetail';
20
20
  import './contentViewInfo.scss';
21
21
  import { dependenciesHelpText, autoPublishHelpText, hasPermission } from '../helpers';
22
- import { LabelImportOnly } from '../Create/ContentViewFormComponents';
22
+ import { LabelImportOnly, LabelGenerated } from '../Create/ContentViewFormComponents';
23
23
 
24
24
  const ContentViewInfo = ({ cvId, details }) => {
25
25
  const dispatch = useDispatch();
@@ -33,9 +33,10 @@ const ContentViewInfo = ({ cvId, details }) => {
33
33
  solve_dependencies: solveDependencies,
34
34
  auto_publish: autoPublish,
35
35
  import_only: importOnly,
36
+ generated_for: generatedFor,
36
37
  permissions,
37
38
  } = details;
38
-
39
+ const generatedContentView = generatedFor !== 'none';
39
40
  const onEdit = (val, attribute) => {
40
41
  if (val === details[attribute]) return;
41
42
  dispatch(updateContentView(cvId, { [attribute]: val }));
@@ -70,7 +71,7 @@ const ContentViewInfo = ({ cvId, details }) => {
70
71
  <TextListItem component={TextListItemVariants.dd} className="foreman-spaced-list">
71
72
  <Flex>
72
73
  <FlexItem spacer={{ default: 'spacerXs' }}>
73
- <ContentViewIcon composite={composite} description={composite ? __('Composite') : __('Content view')} />
74
+ <ContentViewIcon composite={composite} description={composite ? __('Composite') : __('Component')} />
74
75
  </FlexItem>
75
76
  </Flex>
76
77
  </TextListItem>
@@ -122,6 +123,18 @@ const ContentViewInfo = ({ cvId, details }) => {
122
123
  disabled
123
124
  />
124
125
  </TextListItem>
126
+ <TextListItem component={TextListItemVariants.dt}>
127
+ {LabelGenerated()}
128
+ </TextListItem>
129
+ <TextListItem component={TextListItemVariants.dd} className="foreman-spaced-list">
130
+ <Switch
131
+ id="generated_by_export_switch"
132
+ aria-label="generated_by_export_switch"
133
+ isChecked={generatedContentView}
134
+ className="foreman-spaced-list"
135
+ disabled
136
+ />
137
+ </TextListItem>
125
138
  </TextList>
126
139
  </TextContent>
127
140
  );
@@ -137,6 +150,7 @@ ContentViewInfo.propTypes = {
137
150
  solve_dependencies: PropTypes.bool,
138
151
  auto_publish: PropTypes.bool,
139
152
  import_only: PropTypes.bool,
153
+ generated_for: PropTypes.string,
140
154
  permissions: PropTypes.shape({}),
141
155
  }).isRequired,
142
156
  };
@@ -161,6 +161,7 @@ const CVFilterAddModal = ({ cvId, onClose }) => {
161
161
  </FormGroup>
162
162
  <ActionGroup>
163
163
  <Button
164
+ ouiaId="create-filter-form-submit-button"
164
165
  aria-label="create_filter"
165
166
  variant="primary"
166
167
  isDisabled={saving || name.length === 0}
@@ -168,7 +169,7 @@ const CVFilterAddModal = ({ cvId, onClose }) => {
168
169
  >
169
170
  {__('Create filter')}
170
171
  </Button>
171
- <Button variant="link" onClick={onClose}>
172
+ <Button ouiaId="create-filter-form-cancel-button" variant="link" onClick={onClose}>
172
173
  {__('Cancel')}
173
174
  </Button>
174
175
  </ActionGroup>
@@ -200,6 +200,7 @@ const AffectedRepositoryTable = ({
200
200
  error,
201
201
  status,
202
202
  }}
203
+ ouiaId="content-view-filter-affected-repository-table"
203
204
  onSelect={hasPermission(permissions, 'edit_content_views') ? onSelect(rows, setRows) : null}
204
205
  cells={columnHeaders}
205
206
  variant={TableVariant.compact}
@@ -222,7 +223,7 @@ const AffectedRepositoryTable = ({
222
223
  <SplitItem>
223
224
  <ActionList>
224
225
  <ActionListItem>
225
- <Button onClick={addBulk} isDisabled={!hasNotAddedSelected} variant="primary" aria-label="add_repositories">
226
+ <Button ouiaId="add-repositories" onClick={addBulk} isDisabled={!hasNotAddedSelected} variant="primary" aria-label="add_repositories">
226
227
  {__('Add repositories')}
227
228
  </Button>
228
229
  </ActionListItem>
@@ -65,6 +65,8 @@ const CVContainerImageFilterContent = ({
65
65
  __('Tag name'),
66
66
  ];
67
67
 
68
+ const repositoryIds = details.repository_ids;
69
+
68
70
  const bulkRemove = () => {
69
71
  setBulkActionOpen(false);
70
72
  const tagFilterIds =
@@ -129,6 +131,7 @@ const CVContainerImageFilterContent = ({
129
131
  updateSearchQuery,
130
132
  status,
131
133
  }}
134
+ ouiaId="content-view-container-image-filter"
132
135
  actionResolver={hasPermission(permissions, 'edit_content_views') ? actionResolver : null}
133
136
  onSelect={hasPermission(permissions, 'edit_content_views') ? onSelect(rows, setRows) : null}
134
137
  cells={columnHeaders}
@@ -140,6 +143,7 @@ const CVContainerImageFilterContent = ({
140
143
  <Split hasGutter>
141
144
  <SplitItem>
142
145
  <Button
146
+ ouiaId="add-content-view-container-image-filter-button"
143
147
  onClick={() => setModalOpen(true)}
144
148
  variant="primary"
145
149
  aria-label="add_filter_rule"
@@ -163,7 +167,7 @@ const CVContainerImageFilterContent = ({
163
167
  {modalOpen &&
164
168
  <AddEditContainerTagRuleModal
165
169
  {...{
166
- filterId, selectedFilterRuleData, onClose,
170
+ filterId, selectedFilterRuleData, onClose, repositoryIds,
167
171
  }}
168
172
  />
169
173
  }
@@ -189,6 +193,7 @@ CVContainerImageFilterContent.propTypes = {
189
193
  showAffectedRepos: PropTypes.bool,
190
194
  setShowAffectedRepos: PropTypes.func,
191
195
  details: PropTypes.shape({
196
+ repository_ids: PropTypes.arrayOf(PropTypes.number),
192
197
  permissions: PropTypes.shape({}),
193
198
  }).isRequired,
194
199
  };
@@ -7,6 +7,7 @@ import {
7
7
  Tooltip, Form, ActionGroup, Flex, FlexItem, Select,
8
8
  SelectOption, SelectVariant, ChipGroup, Chip,
9
9
  Tabs, Tab, TabTitleText, Button, DatePicker, Bullseye,
10
+ Divider, Text,
10
11
  } from '@patternfly/react-core';
11
12
  import { OutlinedQuestionCircleIcon } from '@patternfly/react-icons';
12
13
  import { translate as __ } from 'foremanReact/common/I18n';
@@ -53,6 +54,8 @@ const CVErrataDateFilterContent = ({
53
54
  const [selectedTypes, setSelectedTypes] = useState(types);
54
55
  const dispatch = useDispatch();
55
56
  const [activeTabKey, setActiveTabKey] = useState(0);
57
+ const [startEntry, setStartEntry] = useState(false);
58
+ const [endEntry, setEndEntry] = useState(false);
56
59
 
57
60
  const onSave = () => {
58
61
  dispatch(editCVFilterRule(
@@ -103,6 +106,7 @@ const CVErrataDateFilterContent = ({
103
106
  }, [showAffectedRepos, repositories.length]);
104
107
 
105
108
  const tabTitle = inclusion ? __('Included errata') : __('Excluded errata');
109
+ const invalidDateFormat = __('Enter a valid date: MM/DD/YYYY');
106
110
 
107
111
  return (
108
112
  <Tabs className="margin-0-24" activeKey={activeTabKey} onSelect={(_event, eventKey) => setActiveTabKey(eventKey)}>
@@ -153,7 +157,7 @@ const CVErrataDateFilterContent = ({
153
157
  </SelectOption>
154
158
  </Select>
155
159
  </FlexItem>
156
- <FlexItem span={1} spacer={{ default: 'spacerMd' }}>
160
+ <FlexItem span={1} spacer={{ default: 'spacerNone' }}>
157
161
  {(selectedTypes.length === 1) &&
158
162
  <Tooltip
159
163
  position="top"
@@ -165,7 +169,8 @@ const CVErrataDateFilterContent = ({
165
169
  </Tooltip>
166
170
  }
167
171
  </FlexItem>
168
- <FlexItem span={2} spacer={{ default: 'spacerMd' }}>
172
+ <Divider isVertical />
173
+ <FlexItem span={2} spacer={{ default: 'spacerNone' }}>
169
174
  <Select
170
175
  selections={dateType}
171
176
  onSelect={(_event, selection) => {
@@ -179,49 +184,51 @@ const CVErrataDateFilterContent = ({
179
184
  aria-label="date_type_selector"
180
185
  isDisabled={!hasPermission(permissions, 'edit_content_views')}
181
186
  >
182
- <SelectOption key="issued" value="issued">{__('Issued')}</SelectOption>
183
- <SelectOption key="updated" value="updated">{__('Updated')}</SelectOption>
187
+ <SelectOption key="issued" value="issued">{__('Issued from')}</SelectOption>
188
+ <SelectOption key="updated" value="updated">{__('Updated from')}</SelectOption>
184
189
  </Select>
185
190
  </FlexItem>
186
- <FlexItem span={2} spacer={{ default: 'spacerXs' }}>
187
- <Bullseye>
191
+ <FlexItem span={2} spacer={{ default: 'spacerNone' }}>
192
+ <Bullseye
193
+ onFocus={() => setStartEntry(true)}
194
+ onBlur={() => setStartEntry(false)}
195
+ >
188
196
  <DatePicker
189
197
  aria-label="start_date_input"
190
198
  value={startDate}
199
+ invalidFormatText={invalidDateFormat}
191
200
  dateFormat={dateFormat}
192
201
  onChange={setStartDate}
193
202
  dateParse={dateParse}
194
- placeholder="MM/DD/YYYY"
203
+ placeholder={startEntry ? 'MM/DD/YYYY' : __('Start date')}
195
204
  isDisabled={!hasPermission(permissions, 'edit_content_views')}
196
205
  />
197
206
  </Bullseye>
198
207
  </FlexItem>
208
+ <FlexItem spacer={{ default: 'spacerNone' }}>
209
+ <Bullseye style={{ padding: '0 5px' }}>
210
+ <Text>{__('to')}</Text>
211
+ </Bullseye>
212
+ </FlexItem>
199
213
  <FlexItem span={2}>
200
- <Bullseye>
214
+ <Bullseye
215
+ onFocus={() => setEndEntry(true)}
216
+ onBlur={() => setEndEntry(false)}
217
+ >
201
218
  <DatePicker
202
219
  aria-label="end_date_input"
203
220
  value={endDate}
221
+ invalidFormatText={invalidDateFormat}
204
222
  dateFormat={dateFormat}
205
223
  onChange={setEndDate}
206
224
  dateParse={dateParse}
207
- placeholder="MM/DD/YYYY"
225
+ placeholder={endEntry ? 'MM/DD/YYYY' : __('End date')}
208
226
  isDisabled={!hasPermission(permissions, 'edit_content_views')}
209
227
  />
210
228
  </Bullseye>
211
229
  </FlexItem>
212
230
  </Flex>
213
231
  <Flex>
214
- <FlexItem>
215
- <ChipGroup categoryName={dateType === 'issued' ? __('Issued') : __('Updated')}>
216
- <Chip key="startDate" onClick={() => setStartDate('')} isReadOnly={!startDate || !hasPermission(permissions, 'edit_content_views')}>
217
- {startDate || __('ANY')}
218
- </Chip>
219
- -
220
- <Chip key="endDate" onClick={() => setEndDate('')} isReadOnly={!endDate || !hasPermission(permissions, 'edit_content_views')}>
221
- {endDate || __('ANY')}
222
- </Chip>
223
- </ChipGroup>
224
- </FlexItem>
225
232
  <FlexItem>
226
233
  <ChipGroup categoryName={__('Type')}>
227
234
  {selectedTypes.map(type => (
@@ -235,9 +242,21 @@ const CVErrataDateFilterContent = ({
235
242
  ))}
236
243
  </ChipGroup>
237
244
  </FlexItem>
245
+ <FlexItem>
246
+ <ChipGroup categoryName={dateType === 'issued' ? __('Issued from') : __('Updated from')}>
247
+ <Chip key="startDate" onClick={() => setStartDate('')} isReadOnly={!startDate || !hasPermission(permissions, 'edit_content_views')}>
248
+ {startDate || __('ANY')}
249
+ </Chip>
250
+ {__('to')}
251
+ <Chip key="endDate" onClick={() => setEndDate('')} isReadOnly={!endDate || !hasPermission(permissions, 'edit_content_views')}>
252
+ {endDate || __('ANY')}
253
+ </Chip>
254
+ </ChipGroup>
255
+ </FlexItem>
238
256
  {hasPermission(permissions, 'edit_content_views') &&
239
257
  <FlexItem>
240
258
  <Button
259
+ ouiaId="errata-date-reset-filters-button"
241
260
  isDisabled={saveDisabled}
242
261
  variant="link"
243
262
  onClick={resetFilters}
@@ -251,6 +270,7 @@ const CVErrataDateFilterContent = ({
251
270
  {hasPermission(permissions, 'edit_content_views') &&
252
271
  <ActionGroup>
253
272
  <Button
273
+ ouiaId="save-filter-rule-button"
254
274
  aria-label="save_filter_rule"
255
275
  variant="primary"
256
276
  isDisabled={saveDisabled}
@@ -259,7 +279,7 @@ const CVErrataDateFilterContent = ({
259
279
  {__('Edit rule')}
260
280
  </Button>
261
281
  <Link to={`/content_views/${cvId}#/filters`}>
262
- <Button variant="link">
282
+ <Button ouiaId="cancel-save-filter-rule-button" variant="link">
263
283
  {__('Cancel')}
264
284
  </Button>
265
285
  </Link>