katello 4.10.0 → 4.11.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 (449) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/katello/locale/bn/katello.js +254 -215
  3. data/app/assets/javascripts/katello/locale/bn_IN/katello.js +254 -215
  4. data/app/assets/javascripts/katello/locale/ca/katello.js +254 -215
  5. data/app/assets/javascripts/katello/locale/cs/katello.js +254 -215
  6. data/app/assets/javascripts/katello/locale/cs_CZ/katello.js +254 -215
  7. data/app/assets/javascripts/katello/locale/de/katello.js +260 -245
  8. data/app/assets/javascripts/katello/locale/de_AT/katello.js +254 -215
  9. data/app/assets/javascripts/katello/locale/de_DE/katello.js +254 -215
  10. data/app/assets/javascripts/katello/locale/el/katello.js +254 -215
  11. data/app/assets/javascripts/katello/locale/en/katello.js +254 -215
  12. data/app/assets/javascripts/katello/locale/en_GB/katello.js +254 -215
  13. data/app/assets/javascripts/katello/locale/en_US/katello.js +254 -215
  14. data/app/assets/javascripts/katello/locale/es/katello.js +257 -233
  15. data/app/assets/javascripts/katello/locale/et_EE/katello.js +254 -215
  16. data/app/assets/javascripts/katello/locale/fr/katello.js +268 -268
  17. data/app/assets/javascripts/katello/locale/gl/katello.js +254 -215
  18. data/app/assets/javascripts/katello/locale/gu/katello.js +254 -215
  19. data/app/assets/javascripts/katello/locale/he_IL/katello.js +254 -215
  20. data/app/assets/javascripts/katello/locale/hi/katello.js +254 -215
  21. data/app/assets/javascripts/katello/locale/id/katello.js +254 -215
  22. data/app/assets/javascripts/katello/locale/it/katello.js +254 -221
  23. data/app/assets/javascripts/katello/locale/ja/katello.js +268 -268
  24. data/app/assets/javascripts/katello/locale/ka/katello.js +261 -231
  25. data/app/assets/javascripts/katello/locale/kn/katello.js +254 -215
  26. data/app/assets/javascripts/katello/locale/ko/katello.js +255 -222
  27. data/app/assets/javascripts/katello/locale/locale/katello.js +1049 -1012
  28. data/app/assets/javascripts/katello/locale/ml_IN/katello.js +254 -215
  29. data/app/assets/javascripts/katello/locale/mr/katello.js +254 -215
  30. data/app/assets/javascripts/katello/locale/nl_NL/katello.js +254 -215
  31. data/app/assets/javascripts/katello/locale/or/katello.js +254 -215
  32. data/app/assets/javascripts/katello/locale/pa/katello.js +254 -215
  33. data/app/assets/javascripts/katello/locale/pl/katello.js +254 -215
  34. data/app/assets/javascripts/katello/locale/pl_PL/katello.js +254 -215
  35. data/app/assets/javascripts/katello/locale/pt/katello.js +254 -215
  36. data/app/assets/javascripts/katello/locale/pt_BR/katello.js +257 -233
  37. data/app/assets/javascripts/katello/locale/ro/katello.js +254 -215
  38. data/app/assets/javascripts/katello/locale/ro_RO/katello.js +254 -215
  39. data/app/assets/javascripts/katello/locale/ru/katello.js +255 -222
  40. data/app/assets/javascripts/katello/locale/sl/katello.js +254 -215
  41. data/app/assets/javascripts/katello/locale/sv_SE/katello.js +254 -215
  42. data/app/assets/javascripts/katello/locale/ta/katello.js +254 -215
  43. data/app/assets/javascripts/katello/locale/ta_IN/katello.js +254 -215
  44. data/app/assets/javascripts/katello/locale/te/katello.js +254 -215
  45. data/app/assets/javascripts/katello/locale/tr/katello.js +254 -215
  46. data/app/assets/javascripts/katello/locale/vi/katello.js +254 -215
  47. data/app/assets/javascripts/katello/locale/vi_VN/katello.js +254 -215
  48. data/app/assets/javascripts/katello/locale/zh/katello.js +254 -215
  49. data/app/assets/javascripts/katello/locale/zh_CN/katello.js +268 -268
  50. data/app/assets/javascripts/katello/locale/zh_TW/katello.js +255 -222
  51. data/app/controllers/katello/api/registry/registry_proxies_controller.rb +15 -2
  52. data/app/controllers/katello/api/v2/capsule_content_controller.rb +21 -4
  53. data/app/controllers/katello/api/v2/capsules_controller.rb +11 -1
  54. data/app/controllers/katello/api/v2/content_view_versions_controller.rb +1 -1
  55. data/app/controllers/katello/api/v2/docker_tags_controller.rb +2 -0
  56. data/app/controllers/katello/api/v2/hosts_bulk_actions_controller.rb +2 -1
  57. data/app/controllers/katello/api/v2/organizations_controller.rb +2 -2
  58. data/app/controllers/katello/api/v2/repositories_controller.rb +1 -0
  59. data/app/controllers/katello/api/v2/simple_content_access_controller.rb +5 -5
  60. data/app/controllers/katello/api/v2/sync_plans_controller.rb +11 -3
  61. data/app/controllers/katello/concerns/api/api_controller.rb +6 -0
  62. data/app/controllers/katello/concerns/api/v2/hosts_bulk_actions_controller_extensions.rb +23 -0
  63. data/app/controllers/katello/concerns/filtered_auto_complete_search.rb +1 -1
  64. data/app/controllers/katello/concerns/organizations_controller_extensions.rb +2 -0
  65. data/app/controllers/katello/remote_execution_controller.rb +1 -1
  66. data/app/jobs/create_host_lifecycle_expire_soon_notifications.rb +11 -0
  67. data/app/lib/actions/katello/applicability/hosts/bulk_generate.rb +10 -0
  68. data/app/lib/actions/katello/capsule_content/refresh_repos.rb +8 -2
  69. data/app/lib/actions/katello/capsule_content/sync.rb +30 -10
  70. data/app/lib/actions/katello/capsule_content/sync_capsule.rb +13 -0
  71. data/app/lib/actions/katello/capsule_content/update_content_counts.rb +24 -0
  72. data/app/lib/actions/katello/content_view/promote.rb +9 -0
  73. data/app/lib/actions/katello/content_view/publish.rb +9 -0
  74. data/app/lib/actions/katello/orphan_cleanup/remove_orphans.rb +8 -0
  75. data/app/lib/actions/katello/repository/sync.rb +11 -0
  76. data/app/lib/actions/pulp3/capsule_content/reclaim_space.rb +5 -0
  77. data/app/lib/actions/pulp3/content_view_version/create_export_history.rb +6 -1
  78. data/app/lib/actions/pulp3/content_view_version/export.rb +8 -0
  79. data/app/lib/actions/pulp3/orchestration/content_view_version/export_repository.rb +1 -1
  80. data/app/lib/katello/concerns/base_template_scope_extensions.rb +14 -1
  81. data/app/lib/katello/errors.rb +1 -0
  82. data/app/lib/katello/repo_discovery.rb +2 -2
  83. data/app/lib/katello/validators/content_view_environment_coherent_default_validator.rb +22 -0
  84. data/app/lib/katello/validators/content_view_environment_validator.rb +1 -0
  85. data/app/mailers/katello/task_mailer.rb +54 -0
  86. data/app/models/katello/concerns/host_managed_extensions.rb +41 -1
  87. data/app/models/katello/concerns/organization_extensions.rb +1 -1
  88. data/app/models/katello/concerns/smart_proxy_extensions.rb +75 -3
  89. data/app/models/katello/concerns/subscription_facet_host_extensions.rb +6 -0
  90. data/app/models/katello/content_view.rb +21 -0
  91. data/app/models/katello/content_view_environment.rb +6 -1
  92. data/app/models/katello/docker_meta_tag.rb +1 -1
  93. data/app/models/katello/docker_tag.rb +1 -1
  94. data/app/models/katello/erratum.rb +1 -1
  95. data/app/models/katello/host/content_facet.rb +10 -7
  96. data/app/models/katello/product.rb +8 -0
  97. data/app/models/katello/repository.rb +31 -6
  98. data/app/models/katello/rhel_lifecycle_status.rb +214 -0
  99. data/app/models/katello/sync_plan.rb +19 -1
  100. data/app/models/katello/yum_metadata_file.rb +1 -1
  101. data/app/services/katello/applicability/applicable_content_helper.rb +1 -1
  102. data/app/services/katello/event_queue.rb +10 -2
  103. data/app/services/katello/host_status_manager.rb +1 -0
  104. data/app/services/katello/product_content_importer.rb +45 -3
  105. data/app/services/katello/pulp3/ansible_collection.rb +1 -0
  106. data/app/services/katello/pulp3/api/core.rb +1 -1
  107. data/app/services/katello/pulp3/deb.rb +1 -0
  108. data/app/services/katello/pulp3/docker_manifest.rb +1 -0
  109. data/app/services/katello/pulp3/docker_manifest_list.rb +9 -4
  110. data/app/services/katello/pulp3/docker_tag.rb +1 -0
  111. data/app/services/katello/pulp3/erratum.rb +1 -0
  112. data/app/services/katello/pulp3/file_unit.rb +1 -0
  113. data/app/services/katello/pulp3/module_stream.rb +1 -0
  114. data/app/services/katello/pulp3/package_group.rb +1 -0
  115. data/app/services/katello/pulp3/pulp_content_unit.rb +39 -0
  116. data/app/services/katello/pulp3/repository_mirror.rb +21 -2
  117. data/app/services/katello/pulp3/rpm.rb +1 -0
  118. data/app/services/katello/pulp3/smart_proxy_mirror_repository.rb +1 -1
  119. data/app/services/katello/pulp3/srpm.rb +3 -2
  120. data/app/services/katello/registration_manager.rb +6 -3
  121. data/app/services/katello/repository_type.rb +2 -1
  122. data/app/services/katello/ui_notifications/hosts/lifecycle_expire_soon.rb +58 -0
  123. data/app/views/foreman/job_templates/resolve_traces.erb +1 -1
  124. data/app/views/foreman/smart_proxies/_content_tab.html.erb +1 -3
  125. data/app/views/katello/api/v2/capsule_content/sync_status.json.rabl +39 -1
  126. data/app/views/katello/api/v2/content_facet/show.json.rabl +4 -0
  127. data/app/views/katello/api/v2/content_views/base.json.rabl +1 -1
  128. data/app/views/katello/api/v2/docker_tags/_base.json.rabl +28 -6
  129. data/app/views/katello/hosts/_errata_counts.html.erb +2 -2
  130. data/app/views/katello/task_mailer/cv_promote_failure.html.erb +31 -0
  131. data/app/views/katello/task_mailer/cv_promote_failure.text.erb +13 -0
  132. data/app/views/katello/task_mailer/cv_publish_failure.html.erb +31 -0
  133. data/app/views/katello/task_mailer/cv_publish_failure.text.erb +13 -0
  134. data/app/views/katello/task_mailer/proxy_sync_failure.html.erb +45 -0
  135. data/app/views/katello/task_mailer/proxy_sync_failure.text.erb +25 -0
  136. data/app/views/katello/task_mailer/repo_sync_failure.html.erb +35 -0
  137. data/app/views/katello/task_mailer/repo_sync_failure.text.erb +15 -0
  138. data/app/views/overrides/organizations/_edit_override.html.erb +4 -0
  139. data/config/routes/api/v2.rb +2 -0
  140. data/db/migrate/20230825180856_add_content_counts_to_smart_proxy.rb +7 -0
  141. data/db/migrate/20231020153017_create_indexes_for_nvra_and_epoch.rb +6 -0
  142. data/db/seeds.d/106-mail_notifications.rb +32 -0
  143. data/db/seeds.d/109-katello-notification-blueprints.rb +6 -0
  144. data/engines/bastion/app/assets/javascripts/bastion/components/views/bst-alert.html +1 -1
  145. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/activation-keys.controller.js +4 -0
  146. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/activation-key-add-host-collections.controller.js +3 -0
  147. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/activation-key-add-subscriptions.controller.js +3 -0
  148. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/activation-key-associations.controller.js +4 -0
  149. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/activation-key-copy.controller.js +7 -2
  150. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/activation-key-host-collections.controller.js +3 -0
  151. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/activation-key-repository-sets.controller.js +3 -0
  152. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/activation-key-subscriptions.controller.js +3 -0
  153. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/new/new-activation-key.controller.js +6 -2
  154. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/capsule-content/capsule-content.controller.js +16 -1
  155. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/common/views/rhel-lifecycle-notice.html +5 -0
  156. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/content-credentials.controller.js +7 -2
  157. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/details/content-credential-acs.controller.js +7 -2
  158. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/details/content-credential-products.controller.js +7 -2
  159. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/details/content-credential-repositories.controller.js +7 -2
  160. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/new/new-content-credential.controller.js +3 -0
  161. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/bulk/content-hosts-bulk-errata-modal.controller.js +5 -1
  162. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-debs-actions.controller.js +5 -1
  163. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-debs-applicable.controller.js +3 -0
  164. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-debs-installed.controller.js +3 -0
  165. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-errata.controller.js +4 -0
  166. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-module-streams.controller.js +3 -0
  167. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-packages-applicable.controller.js +3 -0
  168. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-packages-installed.controller.js +3 -0
  169. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-packages.controller.js +3 -0
  170. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-traces.controller.js +4 -0
  171. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-debs-actions.html +1 -1
  172. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-debs-applicable.html +1 -1
  173. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-debs-installed.html +1 -1
  174. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-errata.html +3 -3
  175. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-module-streams.html +1 -1
  176. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-packages-actions.html +1 -1
  177. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-packages-applicable.html +1 -1
  178. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-packages-installed.html +1 -1
  179. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-traces.html +3 -3
  180. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content-hosts.controller.js +5 -0
  181. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content-hosts.routes.js +1 -1
  182. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/content-host-add-host-collections.controller.js +4 -1
  183. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/content-host-add-subscriptions.controller.js +3 -0
  184. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/content-host-host-collections.controller.js +4 -1
  185. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/content-host-repository-sets.controller.js +3 -0
  186. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/content-host-subscriptions.controller.js +3 -0
  187. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/views/content-host-add-subscriptions.html +1 -1
  188. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/views/content-host-details.html +4 -3
  189. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/views/content-host-host-collections.html +1 -1
  190. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/views/content-host-info.html +3 -3
  191. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/views/content-host-provisioning-info.html +2 -2
  192. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/views/content-host-subscriptions-list.html +1 -1
  193. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/views/content-host-subscriptions.html +1 -1
  194. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/content-hosts.html +3 -3
  195. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/debs/debs.controller.js +7 -0
  196. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/debs/details/deb-content-views.controller.js +8 -1
  197. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/debs/details/deb-repositories.controller.js +10 -2
  198. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/docker-tags/details/docker-tag-environments.controller.js +5 -2
  199. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/docker-tags/details/docker-tag-repositories.controller.js +6 -2
  200. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/docker-tags/docker-tags.controller.js +6 -3
  201. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/details/environment-content.controller.js +13 -0
  202. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/details/environment.controller.js +6 -0
  203. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/new-environment.controller.js +8 -2
  204. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/errata/apply-errata.controller.js +4 -0
  205. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/errata/details/erratum-content-hosts.controller.js +7 -2
  206. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/errata/details/erratum-repositories.controller.js +7 -2
  207. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/errata/details/erratum.controller.js +6 -2
  208. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/errata/details/views/erratum-info.html +2 -2
  209. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/errata/errata.controller.js +5 -0
  210. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/errata/views/errata.html +1 -1
  211. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/files/details/file-content-views.controller.js +10 -2
  212. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/files/details/file-repositories.controller.js +8 -1
  213. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/files/files.controller.js +9 -2
  214. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/host-collections/details/host-collection-add-hosts.controller.js +3 -0
  215. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/host-collections/details/host-collection-copy.controller.js +7 -2
  216. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/host-collections/details/host-collection-hosts.controller.js +3 -0
  217. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/host-collections/host-collections.controller.js +4 -0
  218. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/host-collections/new/new-host-collection.controller.js +6 -2
  219. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/hosts/host.factory.js +4 -0
  220. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +166 -43
  221. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/fr.po +4 -0
  222. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/translations.js +1 -1
  223. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/packages/packages.controller.js +7 -0
  224. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/product-repositories.controller.js +5 -0
  225. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-advanced-sync.controller.js +6 -2
  226. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-manage-content.controller.js +11 -0
  227. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/new-repository.controller.js +3 -0
  228. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/views/product-repositories.html +2 -2
  229. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/discovery/discovery-create.controller.js +3 -0
  230. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/discovery/discovery.controller.js +3 -0
  231. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/new/product-form.controller.js +6 -2
  232. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/products.controller.js +4 -0
  233. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/subscriptions/views/content-access-mode-banner.html +1 -1
  234. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/sync-plans/details/sync-plan-add-products.controller.js +5 -1
  235. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/sync-plans/details/sync-plan-products.controller.js +4 -0
  236. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/sync-plans/new/new-sync-plan.controller.js +3 -0
  237. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/sync-plans/sync-plans.controller.js +4 -0
  238. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/tasks/task-details.controller.js +6 -2
  239. data/lib/katello/engine.rb +2 -3
  240. data/lib/katello/permission_creator.rb +2 -2
  241. data/lib/katello/plugin.rb +4 -0
  242. data/lib/katello/repository_types/ostree.rb +1 -0
  243. data/lib/katello/repository_types/python.rb +1 -0
  244. data/lib/katello/scheduled_jobs.rb +1 -1
  245. data/lib/katello/version.rb +1 -1
  246. data/locale/action_names.rb +1 -3
  247. data/locale/bn/LC_MESSAGES/katello.mo +0 -0
  248. data/locale/bn/katello.po +236 -197
  249. data/locale/bn_IN/LC_MESSAGES/katello.mo +0 -0
  250. data/locale/bn_IN/katello.po +236 -197
  251. data/locale/ca/LC_MESSAGES/katello.mo +0 -0
  252. data/locale/ca/katello.po +236 -197
  253. data/locale/cs/LC_MESSAGES/katello.mo +0 -0
  254. data/locale/cs/katello.po +236 -206
  255. data/locale/cs_CZ/LC_MESSAGES/katello.mo +0 -0
  256. data/locale/cs_CZ/katello.po +236 -197
  257. data/locale/de/LC_MESSAGES/katello.mo +0 -0
  258. data/locale/de/katello.po +241 -202
  259. data/locale/de_AT/LC_MESSAGES/katello.mo +0 -0
  260. data/locale/de_AT/katello.po +236 -197
  261. data/locale/de_DE/LC_MESSAGES/katello.mo +0 -0
  262. data/locale/de_DE/katello.po +236 -197
  263. data/locale/el/LC_MESSAGES/katello.mo +0 -0
  264. data/locale/el/katello.po +236 -197
  265. data/locale/en/LC_MESSAGES/katello.mo +0 -0
  266. data/locale/en/katello.po +236 -197
  267. data/locale/en_GB/LC_MESSAGES/katello.mo +0 -0
  268. data/locale/en_GB/katello.po +236 -197
  269. data/locale/en_US/LC_MESSAGES/katello.mo +0 -0
  270. data/locale/en_US/katello.po +236 -197
  271. data/locale/es/LC_MESSAGES/katello.mo +0 -0
  272. data/locale/es/katello.po +238 -199
  273. data/locale/et_EE/LC_MESSAGES/katello.mo +0 -0
  274. data/locale/et_EE/katello.po +236 -197
  275. data/locale/fr/LC_MESSAGES/katello.mo +0 -0
  276. data/locale/fr/katello.po +247 -208
  277. data/locale/gl/LC_MESSAGES/katello.mo +0 -0
  278. data/locale/gl/katello.po +236 -197
  279. data/locale/gu/LC_MESSAGES/katello.mo +0 -0
  280. data/locale/gu/katello.po +236 -197
  281. data/locale/he_IL/LC_MESSAGES/katello.mo +0 -0
  282. data/locale/he_IL/katello.po +236 -197
  283. data/locale/hi/LC_MESSAGES/katello.mo +0 -0
  284. data/locale/hi/katello.po +236 -197
  285. data/locale/id/LC_MESSAGES/katello.mo +0 -0
  286. data/locale/id/katello.po +236 -197
  287. data/locale/it/LC_MESSAGES/katello.mo +0 -0
  288. data/locale/it/katello.po +236 -197
  289. data/locale/ja/LC_MESSAGES/katello.mo +0 -0
  290. data/locale/ja/katello.po +247 -208
  291. data/locale/ka/LC_MESSAGES/katello.mo +0 -0
  292. data/locale/ka/katello.po +241 -202
  293. data/locale/katello.pot +1427 -1296
  294. data/locale/kn/LC_MESSAGES/katello.mo +0 -0
  295. data/locale/kn/katello.po +236 -197
  296. data/locale/ko/LC_MESSAGES/katello.mo +0 -0
  297. data/locale/ko/katello.po +236 -197
  298. data/locale/ml_IN/LC_MESSAGES/katello.mo +0 -0
  299. data/locale/ml_IN/katello.po +236 -197
  300. data/locale/mr/LC_MESSAGES/katello.mo +0 -0
  301. data/locale/mr/katello.po +236 -197
  302. data/locale/nl_NL/LC_MESSAGES/katello.mo +0 -0
  303. data/locale/nl_NL/katello.po +236 -197
  304. data/locale/or/LC_MESSAGES/katello.mo +0 -0
  305. data/locale/or/katello.po +236 -197
  306. data/locale/pa/LC_MESSAGES/katello.mo +0 -0
  307. data/locale/pa/katello.po +236 -197
  308. data/locale/pl/LC_MESSAGES/katello.mo +0 -0
  309. data/locale/pl/katello.po +236 -197
  310. data/locale/pl_PL/LC_MESSAGES/katello.mo +0 -0
  311. data/locale/pl_PL/katello.po +236 -197
  312. data/locale/pt/LC_MESSAGES/katello.mo +0 -0
  313. data/locale/pt/katello.po +236 -197
  314. data/locale/pt_BR/LC_MESSAGES/katello.mo +0 -0
  315. data/locale/pt_BR/katello.po +238 -199
  316. data/locale/ro/LC_MESSAGES/katello.mo +0 -0
  317. data/locale/ro/katello.po +236 -197
  318. data/locale/ro_RO/LC_MESSAGES/katello.mo +0 -0
  319. data/locale/ro_RO/katello.po +236 -197
  320. data/locale/ru/LC_MESSAGES/katello.mo +0 -0
  321. data/locale/ru/katello.po +236 -197
  322. data/locale/sl/LC_MESSAGES/katello.mo +0 -0
  323. data/locale/sl/katello.po +236 -197
  324. data/locale/sv_SE/LC_MESSAGES/katello.mo +0 -0
  325. data/locale/sv_SE/katello.po +236 -197
  326. data/locale/ta/LC_MESSAGES/katello.mo +0 -0
  327. data/locale/ta/katello.po +236 -197
  328. data/locale/ta_IN/LC_MESSAGES/katello.mo +0 -0
  329. data/locale/ta_IN/katello.po +236 -197
  330. data/locale/te/LC_MESSAGES/katello.mo +0 -0
  331. data/locale/te/katello.po +236 -197
  332. data/locale/tr/LC_MESSAGES/katello.mo +0 -0
  333. data/locale/tr/katello.po +236 -197
  334. data/locale/vi/LC_MESSAGES/katello.mo +0 -0
  335. data/locale/vi/katello.po +236 -197
  336. data/locale/vi_VN/LC_MESSAGES/katello.mo +0 -0
  337. data/locale/vi_VN/katello.po +236 -197
  338. data/locale/zh/LC_MESSAGES/katello.mo +0 -0
  339. data/locale/zh/katello.po +236 -197
  340. data/locale/zh_CN/LC_MESSAGES/katello.mo +0 -0
  341. data/locale/zh_CN/katello.po +247 -208
  342. data/locale/zh_TW/LC_MESSAGES/katello.mo +0 -0
  343. data/locale/zh_TW/katello.po +236 -197
  344. data/webpack/components/Table/EmptyStateMessage.js +7 -4
  345. data/webpack/components/Table/MainTable.scss +18 -17
  346. data/webpack/components/Table/TableWrapper.js +4 -1
  347. data/webpack/components/extensions/HostDetails/ActionsBar/index.js +45 -4
  348. data/webpack/components/extensions/HostDetails/Cards/ErrataOverviewCard.scss +9 -7
  349. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsCard.js +1 -1
  350. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsModal.js +1 -1
  351. data/webpack/components/extensions/HostDetails/Cards/SystemPurposeCard/SystemPurposeActions.js +29 -7
  352. data/webpack/components/extensions/HostDetails/Cards/SystemPurposeCard/SystemPurposeCard.js +106 -66
  353. data/webpack/components/extensions/HostDetails/Cards/SystemPurposeCard/SystemPurposeCard.scss +6 -0
  354. data/webpack/components/extensions/HostDetails/Cards/SystemPurposeCard/SystemPurposeConstants.js +2 -0
  355. data/webpack/components/extensions/HostDetails/Cards/SystemPurposeCard/SystemPurposeEditModal.js +53 -29
  356. data/webpack/components/extensions/HostDetails/Cards/SystemPurposeCard/SystemPurposeSelectors.js +7 -6
  357. data/webpack/components/extensions/HostDetails/Cards/SystemPurposeCard/__tests__/SystemPurposeCard.test.js +24 -5
  358. data/webpack/components/extensions/HostDetails/Cards/SystemPurposeCard/__tests__/SystemPurposeEditModal.test.js +137 -7
  359. data/webpack/components/extensions/HostDetails/DetailsTabCards/HwPropertiesCard.js +11 -10
  360. data/webpack/components/extensions/HostDetails/DetailsTabCards/RegistrationCard.js +8 -2
  361. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab/ErrataTab.js +27 -10
  362. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab/HostErrataActions.js +3 -22
  363. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab/HostErrataConstants.js +0 -1
  364. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsTab.js +3 -2
  365. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackageInstallModal.js +2 -2
  366. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackagesTab.js +48 -12
  367. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionActions.js +22 -10
  368. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionHooks.js +1 -1
  369. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab.js +2 -2
  370. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/EnableTracerModal.js +71 -5
  371. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/EnableTracerModal.scss +16 -0
  372. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/TracesEnabler.js +4 -1
  373. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/TracesTab.js +6 -2
  374. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packagesTab.test.js +2 -1
  375. data/webpack/components/extensions/HostDetails/Tabs/__tests__/tracesTab.test.js +25 -0
  376. data/webpack/components/extensions/Hosts/ActionsBar/index.js +36 -0
  377. data/webpack/components/extensions/Hosts/constants.js +2 -0
  378. data/webpack/components/extensions/RegistrationCommands/RegistrationCommandsPageHelpers.js +13 -7
  379. data/webpack/components/extensions/RegistrationCommands/__tests__/__snapshots__/ActivationKeys.test.js.snap +9 -1
  380. data/webpack/components/extensions/RegistrationCommands/fields/ActivationKeys.js +87 -22
  381. data/webpack/components/extensions/RegistrationCommands/index.js +17 -41
  382. data/webpack/global_index.js +11 -2
  383. data/webpack/redux/reducers/RedHatRepositories/enabled.fixtures.js +4 -0
  384. data/webpack/redux/reducers/RedHatRepositories/enabled.js +1 -0
  385. data/webpack/scenes/ActivationKeys/Details/ActivationKeyDetails.js +10 -1
  386. data/webpack/scenes/ActivationKeys/Details/ActivationKeyDetails.scss +33 -31
  387. data/webpack/scenes/AlternateContentSources/MainTable/ACSTable.js +3 -1
  388. data/webpack/scenes/Content/ContentConfig.js +3 -0
  389. data/webpack/scenes/ContentViews/Create/CreateContentViewForm.js +6 -4
  390. data/webpack/scenes/ContentViews/Create/CreateContentViewForm.scss +8 -6
  391. data/webpack/scenes/ContentViews/Delete/ContentViewDeleteWizard.js +1 -0
  392. data/webpack/scenes/ContentViews/Delete/Steps/CVEnvironmentSelectionForm.scss +4 -2
  393. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewAddModal.js +3 -4
  394. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewBulkAddModal.js +2 -2
  395. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ContentViewComponents.js +5 -5
  396. data/webpack/scenes/ContentViews/Details/ComponentContentViews/__tests__/compositeCVDetails.fixtures.json +393 -0
  397. data/webpack/scenes/ContentViews/Details/ComponentContentViews/__tests__/contentViewComponents.test.js +30 -4
  398. data/webpack/scenes/ContentViews/Details/Filters/CVErrataDateFilterContent.js +3 -1
  399. data/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js +3 -3
  400. data/webpack/scenes/ContentViews/Details/Repositories/RepoIcon.js +2 -1
  401. data/webpack/scenes/ContentViews/Details/Versions/Compare/CVVersionCompareTable.js +1 -1
  402. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersions.js +1 -1
  403. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveCVVersionWizard.js +1 -1
  404. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsTable.js +1 -1
  405. data/webpack/scenes/ContentViews/Publish/CVPublishForm.js +24 -1
  406. data/webpack/scenes/ContentViews/Publish/PublishContentViewWizard.js +1 -0
  407. data/webpack/scenes/ContentViews/Publish/__tests__/publishContentView.test.js +42 -0
  408. data/webpack/scenes/ContentViews/Publish/cvPublishForm.scss +13 -11
  409. data/webpack/scenes/ContentViews/Table/ContentViewsTable.js +2 -1
  410. data/webpack/scenes/ContentViews/__tests__/mockDetails.fixtures.json +2 -1
  411. data/webpack/scenes/Hosts/ChangeContentSource/index.js +4 -3
  412. data/webpack/scenes/ModuleStreams/Details/ModuleStreamDetails.js +1 -2
  413. data/webpack/scenes/ModuleStreams/Details/__tests__/__snapshots__/ModuleStreamDetails.test.js.snap +1 -1
  414. data/webpack/scenes/RedHatRepositories/RedHatRepositoriesPage.js +2 -1
  415. data/webpack/scenes/RedHatRepositories/__tests__/__snapshots__/RedHatRepositoriesPage.test.js.snap +6 -0
  416. data/webpack/scenes/RedHatRepositories/components/EnabledRepository/EnabledRepository.js +4 -1
  417. data/webpack/scenes/RedHatRepositories/components/EnabledRepository/EnabledRepositoryContent.js +13 -4
  418. data/webpack/scenes/RedHatRepositories/components/EnabledRepository/__tests__/EnabledRepositoryContent.test.js +1 -0
  419. data/webpack/scenes/RedHatRepositories/components/EnabledRepository/__tests__/__snapshots__/EnabledRepository.test.js.snap +1 -0
  420. data/webpack/scenes/RedHatRepositories/components/EnabledRepository/__tests__/__snapshots__/EnabledRepositoryContent.test.js.snap +3 -2
  421. data/webpack/scenes/SmartProxy/AdditionalCapsuleContent.js +93 -0
  422. data/webpack/scenes/SmartProxy/Content.js +12 -4
  423. data/webpack/scenes/SmartProxy/ExpandableCvDetails.js +107 -0
  424. data/webpack/scenes/SmartProxy/ExpandedSmartProxyRepositories.js +139 -0
  425. data/webpack/scenes/SmartProxy/SmartProxyContentActions.js +17 -4
  426. data/webpack/scenes/SmartProxy/SmartProxyContentConstants.js +1 -0
  427. data/webpack/scenes/SmartProxy/SmartProxyExpandableTable.js +150 -0
  428. data/webpack/scenes/SmartProxy/__tests__/SmartProxyContentTest.fixtures.json +799 -0
  429. data/webpack/scenes/SmartProxy/__tests__/SmartProxyContentTest.js +29 -17
  430. data/webpack/scenes/Subscriptions/Details/SubscriptionDetails.js +16 -19
  431. data/webpack/scenes/Subscriptions/Details/SubscriptionDetails.scss +12 -8
  432. data/webpack/scenes/Subscriptions/Details/__tests__/__snapshots__/SubscriptionDetails.test.js.snap +21 -18
  433. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnConfigurationForm.scss +4 -2
  434. data/webpack/scenes/Subscriptions/Manifest/ManageManifestModal.scss +38 -19
  435. data/webpack/scenes/Subscriptions/Manifest/index.js +0 -2
  436. data/webpack/scenes/Subscriptions/SubscriptionsPage.js +38 -12
  437. data/webpack/scenes/Subscriptions/SubscriptionsPage.scss +38 -36
  438. data/webpack/scenes/Subscriptions/__tests__/__snapshots__/SubscriptionsPage.test.js.snap +16 -13
  439. data/webpack/utils/helpers.js +0 -1
  440. metadata +99 -33
  441. data/app/controllers/katello/concerns/api/v2/bulk_hosts_extensions.rb +0 -47
  442. data/webpack/components/Table/TableHooks.js +0 -315
  443. data/webpack/components/Table/__test__/useBulkSelect.test.js +0 -99
  444. data/webpack/components/extensions/RegistrationCommands/__tests__/LifeCycleEnvironment.test.js +0 -11
  445. data/webpack/components/extensions/RegistrationCommands/__tests__/__snapshots__/LifeCycleEnvironment.test.js.snap +0 -29
  446. data/webpack/components/extensions/RegistrationCommands/fields/LifecycleEnvironment.js +0 -57
  447. data/webpack/scenes/SmartProxy/SmartProxyContentTable.js +0 -164
  448. data/webpack/scenes/SmartProxy/__tests__/SmartProxyContentResult.fixtures.json +0 -140
  449. data/webpack/scenes/Subscriptions/Manifest/Manifest.scss +0 -16
@@ -1,315 +0,0 @@
1
- import { useState, useRef, useEffect, useCallback, useMemo } from 'react';
2
- import { isEmpty } from 'lodash';
3
- import { useLocation } from 'react-router-dom';
4
- import { translate as __ } from 'foremanReact/common/I18n';
5
- import { friendlySearchParam } from '../../utils/helpers';
6
-
7
- class ReactConnectedSet extends Set {
8
- constructor(initialValue, forceRender) {
9
- super();
10
- this.forceRender = forceRender;
11
- // The constructor would normally call add() with the initial value, but since we
12
- // must call super() at the top, this.forceRender() isn't defined yet.
13
- // So, we call super() above with no argument, then call add() manually below
14
- // after forceRender is defined
15
- if (initialValue) {
16
- if (initialValue.constructor.name === 'Array') {
17
- initialValue.forEach(id => super.add(id));
18
- } else {
19
- super.add(initialValue);
20
- }
21
- }
22
- }
23
-
24
- add(value) {
25
- const result = super.add(value); // ensuring these methods have the same API as the superclass
26
- this.forceRender();
27
- return result;
28
- }
29
-
30
- clear() {
31
- const result = super.clear();
32
- this.forceRender();
33
- return result;
34
- }
35
-
36
- delete(value) {
37
- const result = super.delete(value);
38
- this.forceRender();
39
- return result;
40
- }
41
-
42
- onToggle(isOpen, id) {
43
- if (isOpen) {
44
- this.add(id);
45
- } else {
46
- this.delete(id);
47
- }
48
- }
49
-
50
- addAll(ids) {
51
- ids.forEach(id => super.add(id));
52
- this.forceRender();
53
- }
54
- }
55
-
56
- export const useSet = (initialArry) => {
57
- const [, setToggle] = useState(Date.now());
58
- // needed because mutating a Ref won't cause React to rerender
59
- const forceRender = () => setToggle(Date.now());
60
- const set = useRef(new ReactConnectedSet(initialArry, forceRender));
61
- return set.current;
62
- };
63
-
64
- export const useSelectionSet = ({
65
- results,
66
- metadata,
67
- initialArry = [],
68
- idColumn = 'id',
69
- isSelectable = () => true,
70
- }) => {
71
- const selectionSet = useSet(initialArry);
72
- const pageIds = results?.map(result => result[idColumn]) ?? [];
73
- const selectableResults = useMemo(() => results?.filter(result =>
74
- isSelectable(result)) ?? [], [results, isSelectable]);
75
- const selectedResults = useRef({}); // { id: result }
76
- const canSelect = useCallback((id) => {
77
- const selectableIds = new Set(selectableResults.map(result => result[idColumn]));
78
- return selectableIds.has(id);
79
- }, [idColumn, selectableResults]);
80
- const areAllRowsOnPageSelected = () =>
81
- Number(pageIds?.length) > 0 &&
82
- pageIds.every(result => selectionSet.has(result) || !canSelect(result));
83
-
84
- const areAllRowsSelected = () =>
85
- Number(selectionSet.size) > 0 && selectionSet.size === Number(metadata.selectable);
86
-
87
- const selectPage = () => {
88
- const selectablePageIds = pageIds.filter(canSelect);
89
- selectionSet.addAll(selectablePageIds);
90
- // eslint-disable-next-line no-restricted-syntax
91
- for (const result of selectableResults) {
92
- selectedResults.current[result[idColumn]] = result;
93
- }
94
- };
95
- const clearSelectedResults = () => {
96
- selectedResults.current = {};
97
- };
98
- const selectNone = () => {
99
- selectionSet.clear();
100
- clearSelectedResults();
101
- };
102
- const selectOne = (isSelected, id, data) => {
103
- if (canSelect(id)) {
104
- if (isSelected) {
105
- if (data) selectedResults.current[id] = data;
106
- selectionSet.add(id);
107
- } else {
108
- delete selectedResults.current[id];
109
- selectionSet.delete(id);
110
- }
111
- }
112
- };
113
-
114
- const selectedCount = selectionSet.size;
115
-
116
- const isSelected = useCallback(id =>
117
- canSelect(id) && selectionSet.has(id), [canSelect, selectionSet]);
118
-
119
- return {
120
- selectOne,
121
- selectedCount,
122
- areAllRowsOnPageSelected,
123
- areAllRowsSelected,
124
- selectPage,
125
- selectNone,
126
- isSelected,
127
- isSelectable: canSelect,
128
- selectionSet,
129
- selectedResults: Object.values(selectedResults.current),
130
- clearSelectedResults,
131
- };
132
- };
133
-
134
- const usePrevious = (value) => {
135
- const ref = useRef();
136
- useEffect(() => {
137
- ref.current = value;
138
- });
139
- return ref.current;
140
- };
141
-
142
- export const useBulkSelect = ({
143
- results,
144
- metadata,
145
- initialArry = [],
146
- initialSearchQuery = '',
147
- idColumn = 'id',
148
- filtersQuery = '',
149
- isSelectable,
150
- }) => {
151
- const { selectionSet: inclusionSet, ...selectOptions } =
152
- useSelectionSet({
153
- results, metadata, initialArry, idColumn, isSelectable,
154
- });
155
- const exclusionSet = useSet([]);
156
- const [searchQuery, updateSearchQuery] = useState(initialSearchQuery);
157
- const [selectAllMode, setSelectAllMode] = useState(false);
158
- const selectedCount = selectAllMode ?
159
- Number(metadata.selectable) - exclusionSet.size : selectOptions.selectedCount;
160
-
161
- const areAllRowsOnPageSelected = () => selectAllMode ||
162
- selectOptions.areAllRowsOnPageSelected();
163
-
164
- const areAllRowsSelected = () => (selectAllMode && exclusionSet.size === 0) ||
165
- selectOptions.areAllRowsSelected();
166
-
167
- const isSelected = useCallback((id) => {
168
- if (!selectOptions.isSelectable(id)) {
169
- return false;
170
- }
171
- if (selectAllMode) {
172
- return !exclusionSet.has(id);
173
- }
174
- return inclusionSet.has(id);
175
- }, [exclusionSet, inclusionSet, selectAllMode, selectOptions]);
176
-
177
- const selectPage = () => {
178
- setSelectAllMode(false);
179
- selectOptions.selectPage();
180
- };
181
-
182
- const selectNone = useCallback(() => {
183
- setSelectAllMode(false);
184
- exclusionSet.clear();
185
- inclusionSet.clear();
186
- selectOptions.clearSelectedResults();
187
- }, [exclusionSet, inclusionSet, selectOptions]);
188
-
189
- const selectOne = (isRowSelected, id, data) => {
190
- if (selectAllMode) {
191
- if (isRowSelected) {
192
- exclusionSet.delete(id);
193
- } else {
194
- exclusionSet.add(id);
195
- }
196
- } else {
197
- selectOptions.selectOne(isRowSelected, id, data);
198
- }
199
- };
200
-
201
- const selectAll = (checked) => {
202
- setSelectAllMode(checked);
203
- if (checked) {
204
- exclusionSet.clear();
205
- } else {
206
- inclusionSet.clear();
207
- }
208
- };
209
-
210
- const fetchBulkParams = (idColumnName = idColumn) => {
211
- const searchQueryWithExclusionSet = () => {
212
- const query = [searchQuery, filtersQuery,
213
- !isEmpty(exclusionSet) && `${idColumnName} !^ (${[...exclusionSet].join(',')})`];
214
- return query.filter(item => item).join(' and ');
215
- };
216
-
217
- const searchQueryWithInclusionSet = () => {
218
- if (isEmpty(inclusionSet)) throw new Error('Cannot build a search query with no items selected');
219
- return `${idColumnName} ^ (${[...inclusionSet].join(',')})`;
220
- };
221
-
222
- return selectAllMode ? searchQueryWithExclusionSet() : searchQueryWithInclusionSet();
223
- };
224
-
225
- const prevSearchRef = usePrevious({ searchQuery });
226
-
227
- useEffect(() => {
228
- // if search value changed and cleared from a string to empty value
229
- // And it was select all -> then reset selections
230
- if ((prevSearchRef && !isEmpty(prevSearchRef.searchQuery)) &&
231
- isEmpty(searchQuery) && selectAllMode) {
232
- selectNone();
233
- }
234
- }, [searchQuery, selectAllMode, prevSearchRef, selectNone]);
235
-
236
- return {
237
- ...selectOptions,
238
- selectPage,
239
- selectNone,
240
- selectAll,
241
- selectAllMode,
242
- isSelected,
243
- selectedCount,
244
- fetchBulkParams,
245
- searchQuery,
246
- updateSearchQuery,
247
- selectOne,
248
- areAllRowsOnPageSelected,
249
- areAllRowsSelected,
250
- };
251
- };
252
-
253
- // takes a url query like ?type=security&search=name+~+foo
254
- // and returns an object
255
- // {
256
- // type: 'security',
257
- // searchParam: 'name ~ foo'
258
- // }
259
- export const useUrlParams = () => {
260
- const location = useLocation();
261
- const { search: urlSearchParam, ...urlParams }
262
- = Object.fromEntries(new URLSearchParams(location.search).entries());
263
- const searchParam = urlSearchParam ? friendlySearchParam(urlSearchParam) : '';
264
- return {
265
- searchParam,
266
- ...urlParams,
267
- };
268
- };
269
-
270
- export const useTableSort = ({
271
- allColumns,
272
- columnsToSortParams,
273
- initialSortColumnName,
274
- }) => {
275
- const translatedInitialSortColumnName = initialSortColumnName
276
- ? __(initialSortColumnName)
277
- : allColumns[0];
278
- if (!Object.keys(columnsToSortParams).includes(translatedInitialSortColumnName)) {
279
- throw new Error(`translatedInitialSortColumnName '${translatedInitialSortColumnName}' must also be defined in columnsToSortParams`);
280
- }
281
- const [activeSortColumn, setActiveSortColumn] = useState(translatedInitialSortColumnName);
282
- const [activeSortDirection, setActiveSortDirection] = useState('asc');
283
-
284
- if (!allColumns.includes(activeSortColumn)) {
285
- setActiveSortColumn(translatedInitialSortColumnName);
286
- }
287
-
288
- // Patternfly sort function
289
- const onSort = (_event, index, direction) => {
290
- setActiveSortColumn(allColumns?.[index]);
291
- setActiveSortDirection(direction);
292
- };
293
-
294
- // Patternfly sort params to pass to the <Th> component.
295
- // (but you should probably just use <SortableColumnHeaders> instead)
296
- const pfSortParams = (columnName, newSortColIndex) => ({
297
- columnIndex: newSortColIndex ?? allColumns?.indexOf(columnName),
298
- sortBy: {
299
- defaultDirection: 'asc',
300
- direction: activeSortDirection,
301
- index: allColumns?.indexOf(activeSortColumn),
302
- },
303
- onSort,
304
- });
305
-
306
- return {
307
- pfSortParams,
308
- apiSortParams: { // scoped_search params to pass to the Katello API
309
- sort_by: columnsToSortParams[activeSortColumn],
310
- sort_order: activeSortDirection,
311
- },
312
- activeSortColumn, // state values to pass as additionalListeners
313
- activeSortDirection,
314
- };
315
- };
@@ -1,99 +0,0 @@
1
- import { act, renderHook } from '@testing-library/react-hooks';
2
- import { useBulkSelect } from '../TableHooks';
3
-
4
- const isSelectable = () => true;
5
- const idColumn = 'errata_id';
6
- const metadata = {
7
- error: null, selectable: 2, subtotal: 2, total: 2,
8
- };
9
- const results = [
10
- {
11
- errata_id: 'RHSA-2022:2031',
12
- id: 311,
13
- severity: 'Low',
14
- type: 'security',
15
- },
16
- {
17
- errata_id: 'RHSA-2022:2110',
18
- id: 17,
19
- severity: 'Low',
20
- type: 'security',
21
- },
22
- ];
23
-
24
- it('returns a scoped search string based on inclusionSet', () => {
25
- const { result } = renderHook(() => useBulkSelect({
26
- results,
27
- metadata,
28
- idColumn,
29
- isSelectable,
30
- }));
31
-
32
- act(() => {
33
- result.current.selectOne(true, 'RHSA-2022:2031');
34
- });
35
-
36
- expect(result.current.fetchBulkParams()).toBe('errata_id ^ (RHSA-2022:2031)');
37
- });
38
-
39
- it('returns a scoped search string based on exclusionSet', () => {
40
- const { result } = renderHook(() => useBulkSelect({
41
- results,
42
- metadata,
43
- idColumn,
44
- isSelectable,
45
- }));
46
-
47
- act(() => {
48
- result.current.selectAll(true);
49
- });
50
-
51
- act(() => {
52
- result.current.selectOne(false, 'RHSA-2022:2031');
53
- });
54
-
55
- expect(result.current.fetchBulkParams()).toBe('errata_id !^ (RHSA-2022:2031)');
56
- });
57
-
58
- it('adds search query to scoped search string based on exclusionSet', () => {
59
- const { result } = renderHook(() => useBulkSelect({
60
- results,
61
- metadata,
62
- idColumn,
63
- isSelectable,
64
- }));
65
-
66
- act(() => {
67
- result.current.updateSearchQuery('type=security');
68
- });
69
-
70
- act(() => {
71
- result.current.selectAll(true);
72
- });
73
-
74
- act(() => {
75
- result.current.selectOne(false, 'RHSA-2022:2031');
76
- });
77
-
78
- expect(result.current.fetchBulkParams()).toBe('type=security and errata_id !^ (RHSA-2022:2031)');
79
- });
80
-
81
- it('adds filter dropdown query to scoped search string', () => {
82
- const { result } = renderHook(() => useBulkSelect({
83
- results,
84
- metadata,
85
- idColumn,
86
- isSelectable,
87
- filtersQuery: 'severity=Low',
88
- }));
89
-
90
- act(() => {
91
- result.current.selectAll(true);
92
- });
93
-
94
- act(() => {
95
- result.current.selectOne(false, 'RHSA-2022:2031');
96
- });
97
-
98
- expect(result.current.fetchBulkParams()).toBe('severity=Low and errata_id !^ (RHSA-2022:2031)');
99
- });
@@ -1,11 +0,0 @@
1
- import { testComponentSnapshotsWithFixtures } from 'react-redux-test-utils';
2
- import LifecycleEnvironment from '../fields/LifecycleEnvironment';
3
-
4
- const fixtures = {
5
- renders: {
6
- pluginValues: {}, isLoading: false, onChange: () => {}, hostGroupEnvironment: '', lifecycleEnvironments: [],
7
- },
8
- };
9
-
10
- describe('LifecycleEnvironment', () =>
11
- testComponentSnapshotsWithFixtures(LifecycleEnvironment, fixtures));
@@ -1,29 +0,0 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
2
-
3
- exports[`LifecycleEnvironment renders 1`] = `
4
- <FormGroup
5
- fieldId="reg_katello_lce"
6
- helperText=""
7
- label="Lifecycle environment"
8
- >
9
- <FormSelect
10
- className="without_select2"
11
- id="reg_katello_lce"
12
- isDisabled={true}
13
- isIconSprite={false}
14
- isRequired={false}
15
- onBlur={[Function]}
16
- onChange={[Function]}
17
- onFocus={[Function]}
18
- ouiaId="reg-katello-lce"
19
- ouiaSafe={true}
20
- validated="default"
21
- value=""
22
- >
23
- <FormSelectOption
24
- label="No Lifecycle environment to select"
25
- value=""
26
- />
27
- </FormSelect>
28
- </FormGroup>
29
- `;
@@ -1,57 +0,0 @@
1
- import React from 'react';
2
- import PropTypes from 'prop-types';
3
-
4
- import {
5
- FormGroup,
6
- FormSelectOption, FormSelect,
7
- } from '@patternfly/react-core';
8
-
9
- import { sprintf, translate as __ } from 'foremanReact/common/I18n';
10
- import { noop } from 'foremanReact/common/helpers';
11
-
12
- const LifecycleEnvironment = ({
13
- pluginValues, onChange, isLoading,
14
- hostGroupEnvironment, lifecycleEnvironments,
15
- }) => (
16
- <FormGroup
17
- label={__('Lifecycle environment')}
18
- fieldId="reg_katello_lce"
19
- helperText={hostGroupEnvironment && sprintf('From host group: %s', hostGroupEnvironment)}
20
- >
21
- <FormSelect
22
- ouiaId="reg-katello-lce"
23
- value={pluginValues?.lifecycleEnvironmentId}
24
- onChange={v => onChange({ lifecycleEnvironmentId: v })}
25
- className="without_select2"
26
- id="reg_katello_lce"
27
- isDisabled={isLoading || lifecycleEnvironments.length === 0}
28
- >
29
- <FormSelectOption
30
- value=""
31
- label={lifecycleEnvironments.length === 0 ? __('No Lifecycle environment to select') : ''}
32
- />
33
- {lifecycleEnvironments.map(lce => (
34
- <FormSelectOption key={lce.id} value={lce.id} label={lce.name} />
35
- ))}
36
- </FormSelect>
37
- </FormGroup>
38
- );
39
-
40
- LifecycleEnvironment.propTypes = {
41
- pluginValues: PropTypes.object, // eslint-disable-line react/forbid-prop-types
42
- onChange: PropTypes.func,
43
- hostGroupEnvironment: PropTypes.string,
44
- lifecycleEnvironments: PropTypes.array, // eslint-disable-line react/forbid-prop-types
45
- isLoading: PropTypes.bool,
46
- };
47
-
48
- LifecycleEnvironment.defaultProps = {
49
- onChange: noop,
50
- isLoading: false,
51
- hostGroupEnvironment: '',
52
- lifecycleEnvironments: [],
53
- pluginValues: {},
54
-
55
- };
56
-
57
- export default LifecycleEnvironment;
@@ -1,164 +0,0 @@
1
- import React, { useState, useEffect } from 'react';
2
- import useDeepCompareEffect from 'use-deep-compare-effect';
3
- import PropTypes from 'prop-types';
4
- import { useSelector, useDispatch } from 'react-redux';
5
- import { wrappable } from '@patternfly/react-table';
6
- import { CheckCircleIcon, TimesCircleIcon } from '@patternfly/react-icons';
7
- import { STATUS } from 'foremanReact/constants';
8
- import { translate as __ } from 'foremanReact/common/I18n';
9
- import { urlBuilder } from 'foremanReact/common/urlHelpers';
10
- import LongDateTime from 'foremanReact/components/common/dates/LongDateTime';
11
- import MainTable from '../../components/Table/MainTable';
12
- import getSmartProxyContent from './SmartProxyContentActions';
13
- import ContentViewIcon from '../../scenes/ContentViews/components/ContentViewIcon';
14
- import {
15
- selectSmartProxyContent,
16
- selectSmartProxyContentStatus,
17
- selectSmartProxyContentError,
18
- } from './SmartProxyContentSelectors';
19
-
20
- const SmartProxyContentTable = ({ smartProxyId }) => {
21
- const dispatch = useDispatch();
22
- const [rows, setRows] = useState([]);
23
- const response = useSelector(state => selectSmartProxyContent(state));
24
- const status = useSelector(state => selectSmartProxyContentStatus(state));
25
- const error = useSelector(state => selectSmartProxyContentError(state));
26
- const columnHeaders = [
27
- {
28
- title: __('Environment'),
29
- transforms: [wrappable],
30
- },
31
- {
32
- title: __('Content view'),
33
- transforms: [wrappable],
34
- },
35
- {
36
- title: __('Type'),
37
- transforms: [wrappable],
38
- },
39
- {
40
- title: __('Last published'),
41
- transforms: [wrappable],
42
- },
43
- {
44
- title: __('Repositories'),
45
- transforms: [wrappable],
46
- },
47
- {
48
- title: __('Synced to smart proxy'),
49
- transforms: [wrappable],
50
- },
51
- ];
52
-
53
- const buildrows = (results) => {
54
- const newRows = [];
55
- let envCount = 0;
56
- results.forEach((env) => {
57
- const { name, content_views: contentViews } = env;
58
- const cellEnv = {
59
- isOpen: false,
60
- cells: [name, null, null, null, null, null],
61
- };
62
- newRows.push(cellEnv);
63
- contentViews.forEach((cv) => {
64
- const {
65
- id, name: cvName, composite, last_published: lastPublished, up_to_date: upToDate, counts,
66
- } = cv;
67
- const { repositories } = counts;
68
- const cvType = <ContentViewIcon composite={composite} />;
69
- const upToDateVal = upToDate ? <CheckCircleIcon /> : <TimesCircleIcon />;
70
- const cellCv =
71
- {
72
- parent: envCount,
73
- cells: [
74
- {
75
- title: null,
76
- props: {
77
- colSpan: 1,
78
- },
79
- },
80
- {
81
- title: <a href={cv.default ? urlBuilder('products', '') : urlBuilder('content_views', '', id)}>{cvName}</a>,
82
- props: {
83
- colSpan: 1,
84
- },
85
- },
86
- {
87
- title: cvType,
88
- props: {
89
- colSpan: 1,
90
- },
91
- },
92
- {
93
- title: <LongDateTime date={lastPublished} showRelativeTimeTooltip />,
94
- props: {
95
- colSpan: 1,
96
- },
97
- },
98
- {
99
- title: repositories,
100
- props: {
101
- colSpan: 1,
102
- },
103
- },
104
- {
105
- title: upToDateVal,
106
- props: {
107
- colSpan: 1,
108
- },
109
- },
110
- ],
111
- };
112
- newRows.push(cellCv);
113
- });
114
- envCount = newRows.length;
115
- });
116
- return newRows;
117
- };
118
-
119
- const onCollapse = (row, setRow) => (event, rowKey, isOpen) => {
120
- const newRows = [...row];
121
- newRows[rowKey].isOpen = isOpen;
122
- setRow(newRows);
123
- };
124
-
125
- useEffect(
126
- () => {
127
- dispatch(getSmartProxyContent({ smartProxyId }));
128
- }
129
- , [dispatch, smartProxyId],
130
- );
131
-
132
- useDeepCompareEffect(() => {
133
- if (status !== STATUS.PENDING && response) {
134
- const { lifecycle_environments: env } = response;
135
- setRows(buildrows(env));
136
- }
137
- }, [response, status, error]);
138
-
139
-
140
- return (
141
- <MainTable
142
- onCollapse={onCollapse(rows, setRows)}
143
- ouiaId="smart-proxy-content-table"
144
- status={status}
145
- cells={columnHeaders}
146
- rows={rows}
147
- error={error}
148
- emptyContentTitle="No content synced"
149
- emptyContentBody="No content synced to smart proxy"
150
- emptySearchTitle="Empty"
151
- emptySearchBody="Empty"
152
- />
153
- );
154
- };
155
-
156
- SmartProxyContentTable.propTypes = {
157
- smartProxyId: PropTypes.number,
158
- };
159
-
160
- SmartProxyContentTable.defaultProps = {
161
- smartProxyId: null,
162
- };
163
-
164
- export default SmartProxyContentTable;