katello 4.13.0 → 4.14.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 (341) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/katello/hosts/host_and_hostgroup_edit.js +12 -8
  3. data/app/assets/javascripts/katello/locale/bn/katello.js +274 -22
  4. data/app/assets/javascripts/katello/locale/bn_IN/katello.js +274 -22
  5. data/app/assets/javascripts/katello/locale/ca/katello.js +274 -22
  6. data/app/assets/javascripts/katello/locale/cs/katello.js +274 -22
  7. data/app/assets/javascripts/katello/locale/cs_CZ/katello.js +275 -23
  8. data/app/assets/javascripts/katello/locale/de/katello.js +280 -28
  9. data/app/assets/javascripts/katello/locale/de_AT/katello.js +274 -22
  10. data/app/assets/javascripts/katello/locale/de_DE/katello.js +274 -22
  11. data/app/assets/javascripts/katello/locale/el/katello.js +274 -22
  12. data/app/assets/javascripts/katello/locale/en/katello.js +274 -22
  13. data/app/assets/javascripts/katello/locale/en_GB/katello.js +274 -22
  14. data/app/assets/javascripts/katello/locale/en_US/katello.js +274 -22
  15. data/app/assets/javascripts/katello/locale/es/katello.js +276 -24
  16. data/app/assets/javascripts/katello/locale/et_EE/katello.js +274 -22
  17. data/app/assets/javascripts/katello/locale/fr/katello.js +283 -31
  18. data/app/assets/javascripts/katello/locale/gl/katello.js +274 -22
  19. data/app/assets/javascripts/katello/locale/gu/katello.js +274 -22
  20. data/app/assets/javascripts/katello/locale/he_IL/katello.js +274 -22
  21. data/app/assets/javascripts/katello/locale/hi/katello.js +274 -22
  22. data/app/assets/javascripts/katello/locale/id/katello.js +274 -22
  23. data/app/assets/javascripts/katello/locale/it/katello.js +274 -22
  24. data/app/assets/javascripts/katello/locale/ja/katello.js +283 -31
  25. data/app/assets/javascripts/katello/locale/ka/katello.js +280 -28
  26. data/app/assets/javascripts/katello/locale/kn/katello.js +274 -22
  27. data/app/assets/javascripts/katello/locale/ko/katello.js +274 -22
  28. data/app/assets/javascripts/katello/locale/ml_IN/katello.js +274 -22
  29. data/app/assets/javascripts/katello/locale/mr/katello.js +274 -22
  30. data/app/assets/javascripts/katello/locale/nl_NL/katello.js +274 -22
  31. data/app/assets/javascripts/katello/locale/or/katello.js +274 -22
  32. data/app/assets/javascripts/katello/locale/pa/katello.js +274 -22
  33. data/app/assets/javascripts/katello/locale/pl/katello.js +274 -22
  34. data/app/assets/javascripts/katello/locale/pl_PL/katello.js +274 -22
  35. data/app/assets/javascripts/katello/locale/pt/katello.js +274 -22
  36. data/app/assets/javascripts/katello/locale/pt_BR/katello.js +276 -24
  37. data/app/assets/javascripts/katello/locale/ro/katello.js +274 -22
  38. data/app/assets/javascripts/katello/locale/ro_RO/katello.js +274 -22
  39. data/app/assets/javascripts/katello/locale/ru/katello.js +274 -22
  40. data/app/assets/javascripts/katello/locale/sl/katello.js +274 -22
  41. data/app/assets/javascripts/katello/locale/sv_SE/katello.js +274 -22
  42. data/app/assets/javascripts/katello/locale/ta/katello.js +274 -22
  43. data/app/assets/javascripts/katello/locale/ta_IN/katello.js +274 -22
  44. data/app/assets/javascripts/katello/locale/te/katello.js +274 -22
  45. data/app/assets/javascripts/katello/locale/tr/katello.js +274 -22
  46. data/app/assets/javascripts/katello/locale/vi/katello.js +274 -22
  47. data/app/assets/javascripts/katello/locale/vi_VN/katello.js +274 -22
  48. data/app/assets/javascripts/katello/locale/zh/katello.js +274 -22
  49. data/app/assets/javascripts/katello/locale/zh_CN/katello.js +283 -31
  50. data/app/assets/javascripts/katello/locale/zh_TW/katello.js +274 -22
  51. data/app/controllers/katello/api/registry/registry_proxies_controller.rb +118 -74
  52. data/app/controllers/katello/api/rhsm/candlepin_proxies_controller.rb +15 -2
  53. data/app/controllers/katello/api/v2/activation_keys_controller.rb +1 -1
  54. data/app/controllers/katello/api/v2/api_controller.rb +7 -0
  55. data/app/controllers/katello/api/v2/content_view_versions_controller.rb +4 -4
  56. data/app/controllers/katello/api/v2/debs_controller.rb +3 -2
  57. data/app/controllers/katello/api/v2/environments_controller.rb +2 -4
  58. data/app/controllers/katello/api/v2/host_contents_controller.rb +8 -3
  59. data/app/controllers/katello/api/v2/host_errata_controller.rb +4 -4
  60. data/app/controllers/katello/api/v2/host_packages_controller.rb +2 -2
  61. data/app/controllers/katello/api/v2/organizations_controller.rb +1 -1
  62. data/app/controllers/katello/api/v2/packages_controller.rb +13 -3
  63. data/app/controllers/katello/api/v2/repositories_bulk_actions_controller.rb +6 -2
  64. data/app/controllers/katello/api/v2/repositories_controller.rb +3 -4
  65. data/app/controllers/katello/api/v2/repository_sets_controller.rb +13 -14
  66. data/app/controllers/katello/api/v2/subscriptions_controller.rb +15 -9
  67. data/app/controllers/katello/api/v2/sync_controller.rb +2 -2
  68. data/app/controllers/katello/application_controller.rb +1 -1
  69. data/app/controllers/katello/concerns/api/v2/authorization.rb +3 -2
  70. data/app/controllers/katello/concerns/api/v2/hosts_controller_extensions.rb +28 -0
  71. data/app/controllers/katello/concerns/api/v2/registration_commands_controller_extensions.rb +1 -1
  72. data/app/controllers/katello/concerns/api/v2/repository_content_controller.rb +4 -3
  73. data/app/controllers/katello/concerns/hosts_controller_extensions.rb +2 -4
  74. data/app/controllers/katello/remote_execution_controller.rb +53 -58
  75. data/app/helpers/katello/hosts_and_hostgroups_helper.rb +19 -2
  76. data/app/helpers/katello/katello_urls_helper.rb +1 -1
  77. data/app/lib/actions/katello/alternate_content_source/alternate_content_source_common.rb +1 -1
  78. data/app/lib/actions/katello/alternate_content_source/update.rb +2 -1
  79. data/app/lib/actions/katello/capsule_content/verify_checksum.rb +1 -2
  80. data/app/lib/actions/katello/content_view/publish.rb +1 -0
  81. data/app/lib/actions/katello/content_view_version/create_repos.rb +1 -0
  82. data/app/lib/actions/katello/content_view_version/incremental_update.rb +3 -2
  83. data/app/lib/actions/katello/environment/{publish_repositories.rb → publish_container_repositories.rb} +10 -8
  84. data/app/lib/actions/katello/foreman/content_update.rb +4 -6
  85. data/app/lib/actions/katello/host/hypervisors_update.rb +6 -4
  86. data/app/lib/actions/katello/repository/create.rb +4 -4
  87. data/app/lib/actions/katello/repository/discover.rb +11 -4
  88. data/app/lib/actions/katello/repository/import_upload.rb +4 -6
  89. data/app/lib/actions/katello/repository/metadata_generate.rb +1 -0
  90. data/app/lib/actions/katello/repository/update.rb +3 -3
  91. data/app/lib/actions/katello/repository_set/enable_repository.rb +5 -6
  92. data/app/lib/actions/middleware/backend_services_check.rb +3 -2
  93. data/app/lib/actions/pulp3/abstract_async_task.rb +2 -4
  94. data/app/lib/actions/pulp3/capsule_content/verify_checksum.rb +1 -2
  95. data/app/lib/actions/pulp3/orchestration/repository/copy_all_units.rb +5 -1
  96. data/app/lib/actions/pulp3/orchestration/repository/delete.rb +5 -2
  97. data/app/lib/actions/pulp3/repository/create_publication.rb +4 -0
  98. data/app/lib/actions/pulp3/repository/save_version.rb +3 -5
  99. data/app/lib/katello/concerns/base_template_scope_extensions.rb +5 -9
  100. data/app/lib/katello/errors.rb +1 -0
  101. data/app/lib/katello/http_resource.rb +1 -0
  102. data/app/lib/katello/lazy_accessor.rb +1 -1
  103. data/app/lib/katello/repo_discovery.rb +4 -190
  104. data/app/lib/katello/resources/candlepin/candlepin_ping.rb +0 -5
  105. data/app/lib/katello/resources/candlepin/owner.rb +1 -1
  106. data/app/lib/katello/resources/candlepin/pool.rb +1 -2
  107. data/app/lib/katello/resources/candlepin/upstream_job.rb +1 -1
  108. data/app/lib/katello/resources/cdn.rb +3 -2
  109. data/app/lib/katello/resources/discovery/container.rb +127 -0
  110. data/app/lib/katello/resources/discovery/yum.rb +95 -0
  111. data/app/lib/katello/util/cdn_var_substitutor.rb +5 -3
  112. data/app/lib/katello/util/data.rb +3 -2
  113. data/app/lib/katello/util/errata.rb +4 -3
  114. data/app/lib/katello/util/package.rb +3 -3
  115. data/app/lib/katello/util/path_with_substitutions.rb +1 -1
  116. data/app/lib/katello/util/report_table.rb +3 -2
  117. data/app/lib/katello/util/url_matcher.rb +1 -1
  118. data/app/lib/katello/validators/alternate_content_source_path_validator.rb +4 -3
  119. data/app/lib/katello/validators/alternate_content_source_products_validator.rb +5 -7
  120. data/app/lib/katello/validators/container_image_name_validator.rb +1 -1
  121. data/app/lib/katello/validators/katello_name_format_validator.rb +2 -2
  122. data/app/lib/katello/validators/no_trailing_space_validator.rb +2 -2
  123. data/app/lib/katello/validators/prior_validator.rb +2 -2
  124. data/app/lib/katello/validators/product_unique_attribute_validator.rb +2 -4
  125. data/app/models/katello/activation_key.rb +4 -6
  126. data/app/models/katello/alternate_content_source.rb +1 -1
  127. data/app/models/katello/authorization/host_tracer.rb +1 -2
  128. data/app/models/katello/candlepin/repository_mapper.rb +2 -2
  129. data/app/models/katello/concerns/host_managed_extensions.rb +41 -10
  130. data/app/models/katello/concerns/hostgroup_extensions.rb +2 -4
  131. data/app/models/katello/concerns/location_extensions.rb +2 -4
  132. data/app/models/katello/concerns/operatingsystem_extensions.rb +84 -16
  133. data/app/models/katello/concerns/smart_proxy_extensions.rb +4 -4
  134. data/app/models/katello/concerns/subscription_facet_host_extensions.rb +2 -0
  135. data/app/models/katello/content_view.rb +5 -1
  136. data/app/models/katello/content_view_environment.rb +19 -4
  137. data/app/models/katello/content_view_environment_content_facet.rb +11 -0
  138. data/app/models/katello/erratum.rb +1 -1
  139. data/app/models/katello/event.rb +1 -1
  140. data/app/models/katello/glue/provider.rb +1 -2
  141. data/app/models/katello/hash_util.rb +1 -1
  142. data/app/models/katello/host/content_facet.rb +16 -3
  143. data/app/models/katello/host/subscription_facet.rb +27 -4
  144. data/app/models/katello/host_collection.rb +12 -8
  145. data/app/models/katello/pool.rb +5 -1
  146. data/app/models/katello/product.rb +7 -4
  147. data/app/models/katello/provider.rb +1 -2
  148. data/app/models/katello/repository.rb +18 -4
  149. data/app/models/katello/root_repository.rb +29 -0
  150. data/app/models/katello/rpm.rb +2 -2
  151. data/app/models/katello/subscription_facet_pool.rb +1 -1
  152. data/app/models/katello/sync_plan.rb +5 -4
  153. data/app/models/katello/task_status.rb +18 -18
  154. data/app/presenters/katello/product_host_count_presenter.rb +10 -0
  155. data/app/services/katello/candlepin/consumer.rb +11 -11
  156. data/app/services/katello/candlepin/message_handler.rb +3 -2
  157. data/app/services/katello/content_unit_indexer.rb +6 -0
  158. data/app/services/katello/pulp3/alternate_content_source.rb +1 -3
  159. data/app/services/katello/pulp3/api/core.rb +1 -1
  160. data/app/services/katello/pulp3/api/docker.rb +10 -0
  161. data/app/services/katello/pulp3/content_view_version/export.rb +1 -0
  162. data/app/services/katello/pulp3/content_view_version/import.rb +6 -4
  163. data/app/services/katello/pulp3/content_view_version/importable_products.rb +1 -3
  164. data/app/services/katello/pulp3/repository/apt.rb +4 -16
  165. data/app/services/katello/pulp3/repository/yum.rb +9 -5
  166. data/app/services/katello/pulp3/repository.rb +2 -2
  167. data/app/services/katello/pulp3/repository_mirror.rb +2 -9
  168. data/app/services/katello/pulp3/task.rb +4 -2
  169. data/app/services/katello/registration_manager.rb +13 -3
  170. data/app/services/katello/repository_type.rb +1 -1
  171. data/app/services/katello/smart_proxy_helper.rb +1 -0
  172. data/app/views/dashboard/_host_collection_widget.html.erb +5 -4
  173. data/app/views/foreman/job_templates/install_errata.erb +2 -0
  174. data/app/views/foreman/job_templates/install_errata_-_katello_ansible_default.erb +2 -0
  175. data/app/views/foreman/job_templates/install_errata_by_search_query.erb +2 -0
  176. data/app/views/foreman/job_templates/install_errata_by_search_query_-_katello_ansible_default.erb +3 -1
  177. data/app/views/foreman/job_templates/install_packages_by_search_query_-_katello_ansible_default.erb +1 -1
  178. data/app/views/foreman/job_templates/remove_packages_by_search_query_-_katello_ansible_default.erb +2 -2
  179. data/app/views/foreman/job_templates/resolve_traces.erb +5 -1
  180. data/app/views/foreman/job_templates/update_packages_by_search_query_-_katello_ansible_default.erb +1 -1
  181. data/app/views/foreman/job_templates/upload_profile.erb +2 -0
  182. data/app/views/foreman/smart_proxies/_reclaim_space.html.erb +7 -5
  183. data/app/views/katello/api/v2/content_facet/base.json.rabl +18 -2
  184. data/app/views/katello/api/v2/packages/thindex.json.rabl +6 -0
  185. data/app/views/katello/api/v2/repositories/show.json.rabl +8 -8
  186. data/app/views/katello/api/v2/repository_sets/show.json.rabl +1 -1
  187. data/app/views/katello/api/v2/subscription_facet/base.json.rabl +1 -1
  188. data/app/views/katello/api/v2/subscriptions/index.json.rabl +1 -0
  189. data/app/views/katello/api/v2/subscriptions/show.json.rabl +1 -0
  190. data/app/views/overrides/activation_keys/_host_environment_select.html.erb +14 -11
  191. data/app/views/overrides/activation_keys/_host_synced_content_select.html.erb +4 -4
  192. data/config/initializers/monkeys.rb +0 -1
  193. data/config/routes/api/v2.rb +3 -1
  194. data/config/routes.rb +1 -3
  195. data/db/migrate/20160114200145_add_mirror_on_sync_to_repositories.rb +1 -0
  196. data/db/migrate/20160131182301_add_download_policy_to_katello_repositories.rb +1 -0
  197. data/db/migrate/20210119162528_delete_puppet_and_ostree_repos.rb +3 -0
  198. data/db/migrate/20240522165308_add_priority_to_content_view_environment_content_facet.rb +5 -0
  199. data/db/migrate/20240621121212_katello_repository_debs_id_bigint.rb +6 -0
  200. data/db/migrate/20240729192228_add_convert2rhel_to_host_facets.rb +9 -0
  201. data/db/seeds.d/102-organizations.rb +5 -7
  202. data/db/seeds.d/150-module_job_templates.rb +7 -9
  203. data/db/seeds.d/75-job_templates.rb +9 -16
  204. data/engines/bastion_katello/README.md +3 -0
  205. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-errata.controller.js +3 -3
  206. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/debs/details/views/deb-info.html +6 -6
  207. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/errata/details/views/erratum-content-hosts.html +2 -2
  208. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +4 -4
  209. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/packages/details/views/package-info.html +6 -6
  210. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-info.html +31 -27
  211. data/engines/bastion_katello/lib/bastion_katello/engine.rb +2 -2
  212. data/lib/katello/engine.rb +1 -8
  213. data/lib/katello/permission_creator.rb +3 -2
  214. data/lib/katello/plugin.rb +31 -27
  215. data/lib/katello/repository_types/docker.rb +1 -0
  216. data/lib/katello/repository_types/yum.rb +1 -0
  217. data/lib/katello/tasks/clean_old_file_repos.rake +2 -4
  218. data/lib/katello/tasks/reset.rake +3 -4
  219. data/lib/katello/version.rb +1 -1
  220. data/lib/katello.rb +0 -4
  221. data/lib/monkeys/ar_postgres_evr_t.rb +2 -0
  222. data/locale/action_names.rb +1 -1
  223. data/locale/bn/LC_MESSAGES/katello.mo +0 -0
  224. data/locale/bn/katello.po +274 -22
  225. data/locale/bn_IN/katello.po +274 -22
  226. data/locale/ca/katello.po +274 -22
  227. data/locale/cs/katello.po +274 -22
  228. data/locale/cs_CZ/LC_MESSAGES/katello.mo +0 -0
  229. data/locale/cs_CZ/katello.po +275 -23
  230. data/locale/de/LC_MESSAGES/katello.mo +0 -0
  231. data/locale/de/katello.po +280 -28
  232. data/locale/de_AT/katello.po +274 -22
  233. data/locale/de_DE/katello.po +274 -22
  234. data/locale/el/katello.po +274 -22
  235. data/locale/en/katello.po +274 -22
  236. data/locale/en_GB/katello.po +274 -22
  237. data/locale/en_US/katello.po +274 -22
  238. data/locale/es/LC_MESSAGES/katello.mo +0 -0
  239. data/locale/es/katello.po +276 -24
  240. data/locale/et_EE/katello.po +274 -22
  241. data/locale/fr/LC_MESSAGES/katello.mo +0 -0
  242. data/locale/fr/katello.po +283 -31
  243. data/locale/gl/katello.po +274 -22
  244. data/locale/gu/katello.po +274 -22
  245. data/locale/he_IL/katello.po +274 -22
  246. data/locale/hi/katello.po +274 -22
  247. data/locale/id/katello.po +274 -22
  248. data/locale/it/LC_MESSAGES/katello.mo +0 -0
  249. data/locale/it/katello.po +274 -22
  250. data/locale/ja/LC_MESSAGES/katello.mo +0 -0
  251. data/locale/ja/katello.po +283 -31
  252. data/locale/ka/LC_MESSAGES/katello.mo +0 -0
  253. data/locale/ka/katello.po +280 -28
  254. data/locale/katello.pot +1001 -527
  255. data/locale/kn/katello.po +274 -22
  256. data/locale/ko/LC_MESSAGES/katello.mo +0 -0
  257. data/locale/ko/katello.po +274 -22
  258. data/locale/ml_IN/katello.po +274 -22
  259. data/locale/mr/katello.po +274 -22
  260. data/locale/nl_NL/katello.po +274 -22
  261. data/locale/or/katello.po +274 -22
  262. data/locale/pa/katello.po +274 -22
  263. data/locale/pl/katello.po +274 -22
  264. data/locale/pl_PL/katello.po +274 -22
  265. data/locale/pt/katello.po +274 -22
  266. data/locale/pt_BR/LC_MESSAGES/katello.mo +0 -0
  267. data/locale/pt_BR/katello.po +276 -24
  268. data/locale/ro/katello.po +274 -22
  269. data/locale/ro_RO/katello.po +274 -22
  270. data/locale/ru/LC_MESSAGES/katello.mo +0 -0
  271. data/locale/ru/katello.po +274 -22
  272. data/locale/sl/katello.po +274 -22
  273. data/locale/sv_SE/katello.po +274 -22
  274. data/locale/ta/LC_MESSAGES/katello.mo +0 -0
  275. data/locale/ta/katello.po +274 -22
  276. data/locale/ta_IN/katello.po +274 -22
  277. data/locale/te/katello.po +274 -22
  278. data/locale/tr/katello.po +274 -22
  279. data/locale/vi/katello.po +274 -22
  280. data/locale/vi_VN/katello.po +274 -22
  281. data/locale/zh/katello.po +274 -22
  282. data/locale/zh_CN/LC_MESSAGES/katello.mo +0 -0
  283. data/locale/zh_CN/katello.po +283 -31
  284. data/locale/zh_TW/LC_MESSAGES/katello.mo +0 -0
  285. data/locale/zh_TW/katello.po +274 -22
  286. data/webpack/ForemanColumnExtensions/index.js +44 -1
  287. data/webpack/components/Table/TableWrapper.js +6 -0
  288. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/ChangeHostCVModal.js +24 -3
  289. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/ContentViewDetailsCard.js +124 -56
  290. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/HostContentViewActions.js +2 -3
  291. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/__tests__/contentViewDetailsCard.test.js +44 -10
  292. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionActions.js +75 -31
  293. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionConstants.js +1 -0
  294. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionHooks.js +1 -1
  295. data/webpack/components/extensions/HostDetails/Tabs/customizedRexUrlHelpers.js +22 -7
  296. data/webpack/components/extensions/Hosts/ActionsBar/ActionsBar.scss +14 -0
  297. data/webpack/components/extensions/Hosts/ActionsBar/index.js +82 -23
  298. data/webpack/components/extensions/Hosts/BulkActions/BulkChangeHostCVModal/index.js +5 -2
  299. data/webpack/components/extensions/Hosts/BulkActions/BulkErrataWizard/02_BulkErrataTable.js +171 -0
  300. data/webpack/components/extensions/Hosts/BulkActions/BulkErrataWizard/04_Review.js +160 -0
  301. data/webpack/components/extensions/Hosts/BulkActions/BulkErrataWizard/04_ReviewFooter.js +99 -0
  302. data/webpack/components/extensions/Hosts/BulkActions/BulkErrataWizard/BulkErrataWizard.js +157 -0
  303. data/webpack/components/extensions/Hosts/BulkActions/BulkErrataWizard/index.js +24 -0
  304. data/webpack/components/extensions/Hosts/BulkActions/BulkPackagesWizard/02_BulkPackagesTable.js +157 -0
  305. data/webpack/components/extensions/Hosts/BulkActions/BulkPackagesWizard/04_Review.js +168 -0
  306. data/webpack/components/extensions/Hosts/BulkActions/BulkPackagesWizard/04_ReviewFooter.js +141 -0
  307. data/webpack/components/extensions/Hosts/BulkActions/BulkPackagesWizard/BulkPackagesWizard.js +252 -0
  308. data/webpack/components/extensions/Hosts/BulkActions/BulkPackagesWizard/index.js +24 -0
  309. data/webpack/components/extensions/Hosts/BulkActions/HostReview.js +176 -0
  310. data/webpack/components/extensions/Hosts/TableRowActions/index.js +17 -0
  311. data/webpack/global_index.js +11 -3
  312. data/webpack/redux/actions/RedHatRepositories/repositorySetRepositories.js +5 -6
  313. data/webpack/redux/reducers/RedHatRepositories/__tests__/repositorySetRepositories.test.js +1 -1
  314. data/webpack/redux/reducers/RedHatRepositories/repositorySetRepositories.js +1 -1
  315. data/webpack/scenes/ContentViews/Copy/CopyContentViewModal.js +2 -1
  316. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewAddModal.js +2 -1
  317. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewBulkAddModal.js +2 -1
  318. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ContentViewComponents.js +2 -1
  319. data/webpack/scenes/ContentViews/Details/ContentViewDetails.js +2 -1
  320. data/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js +2 -2
  321. data/webpack/scenes/ContentViews/Publish/CVPublishForm.js +2 -1
  322. data/webpack/scenes/ContentViews/Publish/CVPublishReview.js +3 -2
  323. data/webpack/scenes/ContentViews/Publish/PublishContentViewWizard.js +2 -1
  324. data/webpack/scenes/ContentViews/Table/ContentViewsTable.js +2 -1
  325. data/webpack/scenes/ContentViews/components/CVBreadCrumb.js +2 -1
  326. data/webpack/scenes/ContentViews/components/ContentViewSelect/ContentViewSelectOption.js +2 -2
  327. data/webpack/scenes/Subscriptions/Details/SubscriptionAttributes.js +1 -0
  328. data/webpack/scenes/Subscriptions/Details/__tests__/__snapshots__/SubscriptionDetailInfo.test.js.snap +10 -0
  329. data/webpack/scenes/Subscriptions/SubscriptionConstants.js +6 -0
  330. data/webpack/scenes/Subscriptions/__tests__/__snapshots__/SubscriptionsPage.test.js.snap +2 -0
  331. data/webpack/scenes/Subscriptions/__tests__/subscriptions.fixtures.js +14 -0
  332. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/SubscriptionsTableHelpers.js +1 -0
  333. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/SubscriptionsTableSchema.js +10 -0
  334. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/__tests__/SubscriptionsTable.fixtures.js +1 -0
  335. data/webpack/scenes/Subscriptions/components/SubscriptionsToolbar/__snapshots__/SubscriptionsToolbar.test.js.snap +10 -0
  336. data/webpack/scenes/Tasks/helpers.js +1 -1
  337. metadata +49 -29
  338. data/app/assets/javascripts/katello/containers/container.js +0 -304
  339. data/db/migrate/20240531193030_remove_sha1_repository_checksum_type.rb +0 -10
  340. data/lib/monkeys/anemone.rb +0 -33
  341. data/webpack/utils/useKatelloDocUrl.js +0 -18
@@ -9,16 +9,20 @@ import { PACKAGE_SEARCH_QUERY } from './PackagesTab/YumInstallablePackagesConsta
9
9
  import { PACKAGES_SEARCH_QUERY, SELECTED_UPDATE_VERSIONS } from './PackagesTab/HostPackagesConstants';
10
10
 
11
11
  // PARAM BUILDING
12
- const baseParams = ({
13
- feature, hostname, descriptionFormat, inputs = {},
14
- }) => ({
15
- job_invocation: {
16
- feature,
17
- inputs,
18
- description_format: descriptionFormat,
19
- search_query: `name ^ (${hostname})`,
20
- },
21
- });
12
+ const baseParams = (options) => {
13
+ const {
14
+ feature, hostname, hostSearch, descriptionFormat, inputs = {},
15
+ } = options;
16
+ const search = hostSearch ?? `name ^ (${hostname})`;
17
+ return ({
18
+ job_invocation: {
19
+ feature,
20
+ inputs,
21
+ description_format: descriptionFormat,
22
+ search_query: search,
23
+ },
24
+ });
25
+ };
22
26
 
23
27
  const runCommandParams = ({ hostname, command }) =>
24
28
  baseParams({
@@ -27,6 +31,13 @@ const runCommandParams = ({ hostname, command }) =>
27
31
  feature: REX_FEATURES.RUN_COMMAND,
28
32
  });
29
33
 
34
+ const uploadProfileParams = ({ hostname }) =>
35
+ baseParams({
36
+ hostname,
37
+ inputs: {},
38
+ feature: REX_FEATURES.KATELLO_UPLOAD_PROFILE,
39
+ });
40
+
30
41
  // used when we know the package name
31
42
  const katelloPackageInstallParams = ({ hostname, packageName }) =>
32
43
  baseParams({
@@ -36,9 +47,12 @@ const katelloPackageInstallParams = ({ hostname, packageName }) =>
36
47
  });
37
48
 
38
49
  // used when we know package Id(s)
39
- const katelloPackageInstallBySearchParams = ({ hostname, search, descriptionFormat }) =>
50
+ const katelloPackageInstallBySearchParams = ({
51
+ hostname, hostSearch, search, descriptionFormat,
52
+ }) =>
40
53
  baseParams({
41
54
  hostname,
55
+ hostSearch,
42
56
  inputs: { [PACKAGE_SEARCH_QUERY]: search },
43
57
  feature: REX_FEATURES.KATELLO_PACKAGE_INSTALL_BY_SEARCH,
44
58
  descriptionFormat,
@@ -51,9 +65,12 @@ const katelloPackageRemoveParams = ({ hostname, packageName }) =>
51
65
  feature: REX_FEATURES.KATELLO_PACKAGE_REMOVE,
52
66
  });
53
67
 
54
- const katelloPackagesRemoveParams = ({ hostname, search, descriptionFormat }) =>
68
+ const katelloPackageRemoveBySearchParams = ({
69
+ hostname, hostSearch, search, descriptionFormat,
70
+ }) =>
55
71
  baseParams({
56
72
  hostname,
73
+ hostSearch,
57
74
  inputs: { [PACKAGES_SEARCH_QUERY]: search },
58
75
  feature: REX_FEATURES.KATELLO_PACKAGES_REMOVE_BY_SEARCH,
59
76
  descriptionFormat,
@@ -67,16 +84,21 @@ const katelloPackageUpdateParams = ({ hostname, packageName, descriptionFormat }
67
84
  descriptionFormat,
68
85
  });
69
86
 
70
- const katelloPackagesUpdateParams = ({
71
- hostname, search, versions, descriptionFormat,
72
- }) => ({ // this doesn't use baseParams so looks different from the others
73
- job_invocation: {
74
- feature: REX_FEATURES.KATELLO_PACKAGES_UPDATE_BY_SEARCH,
75
- inputs: { [PACKAGES_SEARCH_QUERY]: search, [SELECTED_UPDATE_VERSIONS]: versions },
76
- search_query: `name ^ (${hostname})`,
77
- description_format: descriptionFormat,
78
- },
79
- });
87
+ const katelloPackagesUpdateParams = (options) => {
88
+ // this doesn't use baseParams so looks different from the others
89
+ const {
90
+ hostname, search, hostSearch, versions, descriptionFormat,
91
+ } = options;
92
+ const searchQuery = hostSearch ?? `name ^ (${hostname})`;
93
+ return ({
94
+ job_invocation: {
95
+ feature: REX_FEATURES.KATELLO_PACKAGES_UPDATE_BY_SEARCH,
96
+ inputs: { [PACKAGES_SEARCH_QUERY]: search, [SELECTED_UPDATE_VERSIONS]: versions ?? [] },
97
+ search_query: searchQuery,
98
+ description_format: descriptionFormat,
99
+ },
100
+ });
101
+ };
80
102
 
81
103
  const katelloTracerResolveParams = ({ hostname, search }) =>
82
104
  baseParams({
@@ -86,11 +108,13 @@ const katelloTracerResolveParams = ({ hostname, search }) =>
86
108
  });
87
109
 
88
110
  const katelloHostErrataInstallParams = ({
89
- hostname, search,
111
+ hostname, hostSearch, search, descriptionFormat,
90
112
  }) => baseParams({
91
113
  hostname,
114
+ hostSearch,
92
115
  inputs: { [ERRATA_SEARCH_QUERY]: search },
93
116
  feature: REX_FEATURES.KATELLO_HOST_ERRATA_INSTALL_BY_SEARCH,
117
+ descriptionFormat,
94
118
  });
95
119
 
96
120
  const katelloModuleStreamActionsParams = ({ hostname, action, moduleSpec }) =>
@@ -131,6 +155,18 @@ export const runCommand = ({ hostname, command, handleSuccess }) => post({
131
155
  errorToast,
132
156
  });
133
157
 
158
+ export const uploadProfile = ({ hostname, handleSuccess }) => post({
159
+ type: API_OPERATIONS.POST,
160
+ key: REX_JOB_INVOCATIONS_KEY,
161
+ url: foremanApi.getApiUrl('/job_invocations'),
162
+ params: uploadProfileParams({ hostname }),
163
+ handleSuccess: (response) => {
164
+ showRexToast(response);
165
+ if (handleSuccess) handleSuccess(response);
166
+ },
167
+ errorToast,
168
+ });
169
+
134
170
  export const installPackage = ({ hostname, packageName, handleSuccess }) => post({
135
171
  type: API_OPERATIONS.POST,
136
172
  key: REX_JOB_INVOCATIONS_KEY,
@@ -143,11 +179,15 @@ export const installPackage = ({ hostname, packageName, handleSuccess }) => post
143
179
  errorToast,
144
180
  });
145
181
 
146
- export const installPackageBySearch = ({ hostname, search, descriptionFormat }) => post({
182
+ export const installPackageBySearch = ({
183
+ hostname, hostSearch, search, descriptionFormat,
184
+ }) => post({
147
185
  type: API_OPERATIONS.POST,
148
186
  key: REX_JOB_INVOCATIONS_KEY,
149
187
  url: foremanApi.getApiUrl('/job_invocations'),
150
- params: katelloPackageInstallBySearchParams({ hostname, search, descriptionFormat }),
188
+ params: katelloPackageInstallBySearchParams({
189
+ hostname, hostSearch, search, descriptionFormat,
190
+ }),
151
191
  handleSuccess: showRexToast,
152
192
  errorToast,
153
193
  });
@@ -161,11 +201,15 @@ export const removePackage = ({ hostname, packageName }) => post({
161
201
  errorToast,
162
202
  });
163
203
 
164
- export const removePackages = ({ hostname, search, descriptionFormat }) => post({
204
+ export const removePackagesBySearch = ({
205
+ hostname, hostSearch, search, descriptionFormat,
206
+ }) => post({
165
207
  type: API_OPERATIONS.POST,
166
208
  key: REX_JOB_INVOCATIONS_KEY,
167
209
  url: foremanApi.getApiUrl('/job_invocations'),
168
- params: katelloPackagesRemoveParams({ hostname, search, descriptionFormat }),
210
+ params: katelloPackageRemoveBySearchParams({
211
+ hostname, hostSearch, search, descriptionFormat,
212
+ }),
169
213
  handleSuccess: showRexToast,
170
214
  errorToast,
171
215
  });
@@ -180,13 +224,13 @@ export const updatePackage = ({ hostname, packageName }) => post({
180
224
  });
181
225
 
182
226
  export const updatePackages = ({
183
- hostname, search, versions, descriptionFormat,
227
+ hostname, hostSearch, search, versions, descriptionFormat,
184
228
  }) => post({
185
229
  type: API_OPERATIONS.POST,
186
230
  key: REX_JOB_INVOCATIONS_KEY,
187
231
  url: foremanApi.getApiUrl('/job_invocations'),
188
232
  params: katelloPackagesUpdateParams({
189
- hostname, search, versions, descriptionFormat,
233
+ hostname, search, hostSearch, versions, descriptionFormat,
190
234
  }),
191
235
  handleSuccess: showRexToast,
192
236
  errorToast,
@@ -202,13 +246,13 @@ export const resolveTraces = ({ hostname, search }) => post({
202
246
  });
203
247
 
204
248
  export const installErrata = ({
205
- hostname, search,
249
+ hostname, hostSearch, search, descriptionFormat,
206
250
  }) => post({
207
251
  type: API_OPERATIONS.POST,
208
252
  key: REX_JOB_INVOCATIONS_KEY,
209
253
  url: foremanApi.getApiUrl('/job_invocations'),
210
254
  params: katelloHostErrataInstallParams({
211
- hostname, search,
255
+ hostname, search, hostSearch, descriptionFormat,
212
256
  }),
213
257
  handleSuccess: showRexToast,
214
258
  errorToast,
@@ -10,4 +10,5 @@ export const REX_FEATURES = {
10
10
  KATELLO_HOST_ERRATA_INSTALL_BY_SEARCH: 'katello_errata_install_by_search',
11
11
  KATELLO_HOST_MODULE_STREAM_ACTION: 'katello_module_stream_action',
12
12
  RUN_COMMAND: 'run_script',
13
+ KATELLO_UPLOAD_PROFILE: 'katello_upload_profile',
13
14
  };
@@ -27,7 +27,7 @@ export const useRexJobPolling = (initialAction, successAction = null, failureAct
27
27
  }, [dispatch]);
28
28
 
29
29
  const tick = (resp) => {
30
- const { data } = resp;
30
+ const data = resp?.data?.data || resp?.data;
31
31
  const { statusLabel, id, description } = propsToCamelCase(data);
32
32
  if (!id) setRexJobId(id);
33
33
  if (statusLabel && statusLabel !== 'running') {
@@ -4,13 +4,16 @@ import { ERRATA_SEARCH_QUERY } from './ErrataTab/HostErrataConstants';
4
4
  import { PACKAGE_SEARCH_QUERY } from './PackagesTab/YumInstallablePackagesConstants';
5
5
  import { PACKAGES_SEARCH_QUERY, SELECTED_UPDATE_VERSIONS } from './PackagesTab/HostPackagesConstants';
6
6
 
7
- export const createJob = ({
8
- hostname, feature, inputs,
9
- }) => {
7
+ export const createJob = (options) => {
8
+ const {
9
+ hostname, hostSearch, feature, inputs,
10
+ } = options;
11
+ if (inputs[SELECTED_UPDATE_VERSIONS] === undefined) delete inputs[SELECTED_UPDATE_VERSIONS];
10
12
  const inputParams = Object.keys(inputs).map(key => `inputs[${key}]=${inputs[key]}`);
13
+ const search = hostSearch ?? `name ^ (${hostname})`;
11
14
  const params = [
12
15
  `feature=${feature}`,
13
- `search=name ^ (${hostname})`,
16
+ `search=${search}`,
14
17
  ...inputParams,
15
18
  ];
16
19
  const urlQuery = encodeURI(params.join('&'));
@@ -23,20 +26,31 @@ export const katelloPackageInstallUrl = ({ hostname, packages }) => createJob({
23
26
  inputs: { package: packages },
24
27
  });
25
28
 
26
- export const katelloPackageInstallBySearchUrl = ({ hostname, search }) => createJob({
29
+ export const katelloPackageInstallBySearchUrl = ({ hostname, hostSearch, search }) => createJob({
27
30
  hostname,
31
+ hostSearch,
28
32
  feature: REX_FEATURES.KATELLO_PACKAGE_INSTALL_BY_SEARCH,
29
33
  inputs: { [PACKAGE_SEARCH_QUERY]: search },
30
34
  });
31
35
 
36
+ export const katelloPackageRemoveBySearchUrl = ({ hostname, hostSearch, search }) => createJob({
37
+ hostname,
38
+ hostSearch,
39
+ feature: REX_FEATURES.KATELLO_PACKAGES_REMOVE_BY_SEARCH,
40
+ inputs: { [PACKAGES_SEARCH_QUERY]: search },
41
+ });
42
+
32
43
  export const katelloPackageUpdateUrl = ({ hostname, packageName }) => createJob({
33
44
  hostname,
34
45
  feature: REX_FEATURES.KATELLO_PACKAGE_UPDATE,
35
46
  inputs: { package: packageName },
36
47
  });
37
48
 
38
- export const packagesUpdateUrl = ({ hostname, search, versions }) => createJob({
49
+ export const packagesUpdateUrl = ({
50
+ hostname, hostSearch, search, versions,
51
+ }) => createJob({
39
52
  hostname,
53
+ hostSearch,
40
54
  feature: REX_FEATURES.KATELLO_PACKAGES_UPDATE_BY_SEARCH,
41
55
  inputs: { [PACKAGES_SEARCH_QUERY]: search, [SELECTED_UPDATE_VERSIONS]: versions },
42
56
  });
@@ -47,8 +61,9 @@ export const resolveTraceUrl = ({ hostname, search }) => createJob({
47
61
  inputs: { [TRACES_SEARCH_QUERY]: search },
48
62
  });
49
63
 
50
- export const errataInstallUrl = ({ hostname, search }) => createJob({
64
+ export const errataInstallUrl = ({ hostname, search, hostSearch }) => createJob({
51
65
  hostname,
66
+ hostSearch,
52
67
  feature: REX_FEATURES.KATELLO_HOST_ERRATA_INSTALL_BY_SEARCH,
53
68
  inputs: { [ERRATA_SEARCH_QUERY]: search },
54
69
  });
@@ -0,0 +1,14 @@
1
+ .disabled-menu-item-span {
2
+ width: 25em;
3
+ display: flex;
4
+ flex-direction: row;
5
+ }
6
+
7
+ .disabled-menu-item-p {
8
+ margin-left: 0.6em;
9
+ word-break: normal;
10
+ }
11
+
12
+ .disabled-menu-item-icon {
13
+ font-size: small;
14
+ }
@@ -1,26 +1,54 @@
1
1
  import React, { useContext, useEffect } from 'react';
2
+ import PropTypes from 'prop-types';
2
3
  import { useDispatch } from 'react-redux';
3
- import { DropdownItem } from '@patternfly/react-core';
4
+ import { Menu, MenuItem, MenuContent, MenuList } from '@patternfly/react-core';
5
+ import { BanIcon } from '@patternfly/react-icons';
4
6
  import { translate as __ } from 'foremanReact/common/I18n';
5
7
  import { foremanUrl } from 'foremanReact/common/helpers';
6
8
  import { ForemanHostsIndexActionsBarContext } from 'foremanReact/components/HostsIndex';
7
9
  import { useForemanModal } from 'foremanReact/components/ForemanModal/ForemanModalHooks';
8
10
  import { addModal } from 'foremanReact/components/ForemanModal/ForemanModalActions';
11
+ import { useForemanOrganization } from 'foremanReact/Root/Context/ForemanContext';
12
+ import './ActionsBar.scss';
13
+
14
+ const DisabledMenuItemDescription = ({ disabledReason }) => (
15
+ <span className="disabled-menu-item-span">
16
+ <span className="disabled-menu-item-icon">
17
+ <BanIcon />
18
+ </span>
19
+ <p className="disabled-menu-item-p">
20
+ {disabledReason}
21
+ </p>
22
+ </span>
23
+ );
24
+
25
+ DisabledMenuItemDescription.propTypes = {
26
+ disabledReason: PropTypes.string.isRequired,
27
+ };
9
28
 
10
29
  const HostActionsBar = () => {
11
30
  const {
12
31
  fetchBulkParams,
13
32
  selectedCount,
14
33
  selectAllMode,
34
+ setMenuOpen,
15
35
  } = useContext(ForemanHostsIndexActionsBarContext);
16
36
 
17
37
  const dispatch = useDispatch();
18
38
  useEffect(() => {
19
- dispatch(addModal({
20
- id: 'bulk-change-cv-modal',
21
- }));
39
+ [
40
+ 'bulk-change-cv-modal',
41
+ 'bulk-packages-wizard',
42
+ 'bulk-errata-wizard',
43
+ ].forEach((id) => {
44
+ dispatch(addModal({ id }));
45
+ });
22
46
  }, [dispatch]);
23
- const { setModalOpen } = useForemanModal({ id: 'bulk-change-cv-modal' });
47
+ const { setModalOpen: openBulkChangeCVModal } = useForemanModal({ id: 'bulk-change-cv-modal' });
48
+ const { setModalOpen: openBulkPackagesWizardModal } = useForemanModal({ id: 'bulk-packages-wizard' });
49
+ const { setModalOpen: openBulkErrataWizardModal } = useForemanModal({ id: 'bulk-errata-wizard' });
50
+
51
+ const orgId = useForemanOrganization()?.id;
24
52
 
25
53
  let href = '';
26
54
  if (selectAllMode) {
@@ -31,24 +59,55 @@ const HostActionsBar = () => {
31
59
  }
32
60
 
33
61
  return (
34
- <>
35
- <DropdownItem
36
- ouiaId="change-content-s-dropdown-item"
37
- key="change-content-source-dropdown-item"
38
- href={href}
39
- isDisabled={selectedCount === 0}
40
- >
41
- {__('Change content source')}
42
- </DropdownItem>
43
- <DropdownItem
44
- ouiaId="bulk-change-cv-dropdown-item"
45
- key="bulk-change-cv-dropdown-item"
46
- onClick={setModalOpen}
47
- isDisabled={selectedCount === 0}
48
- >
49
- {__('Change content view environments')}
50
- </DropdownItem>
51
- </>
62
+ <MenuItem
63
+ itemId="content-flyout-item"
64
+ key="content-flyout"
65
+ isDisabled={selectedCount === 0}
66
+ flyoutMenu={(
67
+ <Menu ouiaId="content-flyout-menu" onSelect={() => setMenuOpen(false)}>
68
+ <MenuContent>
69
+ <MenuList>
70
+ <MenuItem
71
+ itemId="bulk-packages-wizard-dropdown-item"
72
+ key="bulk-packages-wizard-dropdown-item"
73
+ onClick={openBulkPackagesWizardModal}
74
+ isDisabled={selectedCount === 0 || !orgId}
75
+ description={!orgId && <DisabledMenuItemDescription disabledReason={__('To manage host packages, a specific organization must be selected from the organization context.')} />}
76
+ >
77
+ {__('Packages')}
78
+ </MenuItem>
79
+ <MenuItem
80
+ itemId="bulk-errata-wizard-dropdown-item"
81
+ key="bulk-errata-wizard-dropdown-item"
82
+ onClick={openBulkErrataWizardModal}
83
+ isDisabled={selectedCount === 0}
84
+ >
85
+ {__('Errata')}
86
+ </MenuItem>
87
+ <MenuItem
88
+ itemId="change-content-s-dropdown-item"
89
+ key="change-content-source-dropdown-item"
90
+ to={href}
91
+ isDisabled={selectedCount === 0}
92
+ >
93
+ {__('Content source')}
94
+ </MenuItem>
95
+ <MenuItem
96
+ itemId="bulk-change-cv-dropdown-item"
97
+ key="bulk-change-cv-dropdown-item"
98
+ onClick={openBulkChangeCVModal}
99
+ isDisabled={selectedCount === 0 || !orgId}
100
+ description={!orgId && <DisabledMenuItemDescription disabledReason={__('To change content view environments, a specific organization must be selected from the organization context.')} />}
101
+ >
102
+ {__('Content view environments')}
103
+ </MenuItem>
104
+ </MenuList>
105
+ </MenuContent>
106
+ </Menu>
107
+ )}
108
+ >
109
+ {__('Manage content')}
110
+ </MenuItem>
52
111
  );
53
112
  };
54
113
 
@@ -5,10 +5,13 @@ import { useForemanModal } from 'foremanReact/components/ForemanModal/ForemanMod
5
5
  import BulkChangeHostCVModal from './BulkChangeHostCVModal';
6
6
 
7
7
  const BulkChangeHostCVModalScene = () => {
8
- const org = useForemanOrganization();
8
+ const orgId = useForemanOrganization()?.id;
9
9
  const { selectedCount, fetchBulkParams } = useContext(ForemanActionsBarContext);
10
10
  const { modalOpen, setModalClosed } = useForemanModal({ id: 'bulk-change-cv-modal' });
11
11
 
12
+ if (!orgId) return null;
13
+
14
+
12
15
  return (
13
16
  <BulkChangeHostCVModal
14
17
  key="bulk-change-cv-modal"
@@ -16,7 +19,7 @@ const BulkChangeHostCVModalScene = () => {
16
19
  fetchBulkParams={fetchBulkParams}
17
20
  isOpen={modalOpen}
18
21
  closeModal={setModalClosed}
19
- orgId={org?.id}
22
+ orgId={orgId}
20
23
  />
21
24
 
22
25
  );
@@ -0,0 +1,171 @@
1
+ import React, { useEffect, useContext } from 'react';
2
+ import {
3
+ Alert,
4
+ ToolbarItem,
5
+ Text,
6
+ TextContent,
7
+ TextVariants,
8
+ } from '@patternfly/react-core';
9
+ import { TableText } from '@patternfly/react-table';
10
+ import TableIndexPage from 'foremanReact/components/PF4/TableIndexPage/TableIndexPage';
11
+ import { translate as __ } from 'foremanReact/common/I18n';
12
+ import SelectAllCheckbox from 'foremanReact/components/PF4/TableIndexPage/Table/SelectAllCheckbox';
13
+ import { STATUS, getControllerSearchProps } from 'foremanReact/constants';
14
+ import { RowSelectTd } from 'foremanReact/components/HostsIndex/RowSelectTd';
15
+ import { getPageStats } from 'foremanReact/components/PF4/TableIndexPage/Table/helpers';
16
+ import { BulkErrataWizardContext, ERRATA_URL } from './BulkErrataWizard';
17
+ import { ErrataType, ErrataSeverity } from '../../../../../components/Errata';
18
+ import katelloApi from '../../../../../services/api';
19
+
20
+ const BulkErrataTable = () => {
21
+ const {
22
+ setShouldValidateStep2,
23
+ errataBulkSelect,
24
+ errataResults: results,
25
+ errataMetadata: {
26
+ total, per_page: perPage, page, subtotal,
27
+ },
28
+ errataResponse: response,
29
+ } = useContext(BulkErrataWizardContext);
30
+ const apiOptions = { key: 'BULK_HOST_ERRATA' };
31
+ const {
32
+ status: errataStatus,
33
+ } = response;
34
+
35
+
36
+ const origSearchProps = getControllerSearchProps('errata', 'searchBar-errata');
37
+ const customSearchProps = {
38
+ ...origSearchProps,
39
+ autocomplete: {
40
+ ...origSearchProps.autocomplete,
41
+ url: katelloApi.getApiUrl('/errata/auto_complete_search'),
42
+ },
43
+ };
44
+
45
+ const {
46
+ selectAll,
47
+ selectPage,
48
+ selectNone,
49
+ selectOne,
50
+ isSelected,
51
+ selectedCount,
52
+ areAllRowsSelected,
53
+ areAllRowsOnPageSelected,
54
+ updateSearchQuery,
55
+ hasInteracted,
56
+ } = errataBulkSelect;
57
+
58
+ useEffect(() => {
59
+ if (results?.length && hasInteracted) {
60
+ setShouldValidateStep2(true);
61
+ }
62
+ }, [setShouldValidateStep2, results, hasInteracted]);
63
+
64
+ const pageStats = getPageStats({ total: subtotal, page, perPage });
65
+ const selectionToolbar = (
66
+ <ToolbarItem key="selectAll">
67
+ <SelectAllCheckbox
68
+ {...{
69
+ selectNone,
70
+ selectPage,
71
+ selectedCount,
72
+ pageRowCount: pageStats.pageRowCount,
73
+ areAllRowsSelected,
74
+ areAllRowsOnPageSelected,
75
+ }}
76
+ selectAll={selectAll}
77
+ totalCount={total}
78
+ areAllRowsOnPageSelected={areAllRowsOnPageSelected()}
79
+ areAllRowsSelected={areAllRowsSelected()}
80
+ />
81
+ </ToolbarItem>
82
+ );
83
+
84
+ const columns = {
85
+ id: {
86
+ title: __('Erratum'),
87
+ wrapper: ({ id, errata_id: errataId }) => (
88
+ <a target="_blank" href={`/errata/${id}`} rel="noreferrer">{errataId}</a>
89
+ ),
90
+ isSorted: true,
91
+ weight: 10,
92
+ },
93
+ title: {
94
+ title: __('Title'),
95
+ wrapper: ({ title }) => <TableText wrapModifier="truncate">{title}</TableText>,
96
+ isSorted: true,
97
+ weight: 20,
98
+ },
99
+ type: {
100
+ title: __('Type'),
101
+ wrapper: erratum => <ErrataType {...erratum} />,
102
+ weight: 30,
103
+ isSorted: true,
104
+ },
105
+ severity: {
106
+ title: __('Severity'),
107
+ wrapper: erratum => <ErrataSeverity {...erratum} />,
108
+ weight: 40,
109
+ isSorted: true,
110
+ },
111
+ affectedHosts: {
112
+ title: __('Affected hosts'),
113
+ wrapper: ({ affected_hosts_count: affectedHostsCount }) => affectedHostsCount,
114
+ weight: 50,
115
+ },
116
+ };
117
+
118
+ return (
119
+ <>
120
+ <TextContent>
121
+ <Text ouiaId="mew-step-3-header" component={TextVariants.h3}>
122
+ {__('Apply errata')}
123
+ </Text>
124
+ <Text ouiaId="mew-step-3-content" component={TextVariants.p}>
125
+ {__('Select errata to apply on the selected hosts. Some errata may already be applied on some hosts.')}
126
+ </Text>
127
+ </TextContent>
128
+ {selectedCount === 0 && hasInteracted && (
129
+ <Alert
130
+ ouiaId="no-errata-alert"
131
+ variant="info"
132
+ isInline
133
+ title={__('Select at least one erratum.')}
134
+ style={{ marginBottom: '1rem' }}
135
+ />
136
+ )}
137
+ { errataStatus === STATUS.RESOLVED && !results?.length && (
138
+ <Alert
139
+ ouiaId="no-errata-found-alert"
140
+ variant="info"
141
+ isInline
142
+ title={__('No errata found.')}
143
+ style={{ marginBottom: '1rem' }}
144
+ />
145
+ )}
146
+ <TableIndexPage
147
+ columns={columns}
148
+ showCheckboxes
149
+ apiUrl={ERRATA_URL}
150
+ apiOptions={apiOptions}
151
+ headerText={__('Errata')}
152
+ header={null}
153
+ controller="errata"
154
+ customSearchProps={customSearchProps}
155
+ creatable={false}
156
+ replacementResponse={response}
157
+ selectionToolbar={selectionToolbar}
158
+ updateSearchQuery={updateSearchQuery}
159
+ rowSelectTd={RowSelectTd}
160
+ selectOne={selectOne}
161
+ isSelected={isSelected}
162
+ idColumn="errata_id"
163
+ updateParamsByUrl={false}
164
+ bookmarksPosition="right"
165
+ />
166
+ </>
167
+ );
168
+ };
169
+
170
+
171
+ export default BulkErrataTable;