katello 4.4.2.2 → 4.5.0.rc1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of katello might be problematic. Click here for more details.

Files changed (444) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/katello/api/rhsm/candlepin_proxies_controller.rb +5 -1
  3. data/app/controllers/katello/api/v2/alternate_content_sources_controller.rb +98 -0
  4. data/app/controllers/katello/api/v2/content_export_incrementals_controller.rb +39 -3
  5. data/app/controllers/katello/api/v2/content_exports_controller.rb +19 -0
  6. data/app/controllers/katello/api/v2/content_imports_controller.rb +13 -16
  7. data/app/controllers/katello/api/v2/content_view_versions_controller.rb +0 -12
  8. data/app/controllers/katello/api/v2/content_views_controller.rb +13 -0
  9. data/app/controllers/katello/api/v2/environments_controller.rb +1 -1
  10. data/app/controllers/katello/api/v2/host_module_streams_controller.rb +8 -2
  11. data/app/controllers/katello/api/v2/host_subscriptions_controller.rb +25 -3
  12. data/app/controllers/katello/api/v2/organizations_controller.rb +4 -2
  13. data/app/controllers/katello/api/v2/repositories_bulk_actions_controller.rb +1 -1
  14. data/app/controllers/katello/api/v2/repositories_controller.rb +9 -3
  15. data/app/controllers/katello/api/v2/repository_sets_controller.rb +40 -7
  16. data/app/controllers/katello/api/v2/subscriptions_controller.rb +2 -2
  17. data/app/controllers/katello/concerns/api/v2/hosts_controller_extensions.rb +1 -1
  18. data/app/helpers/katello/concerns/smart_proxy_helper_extensions.rb +4 -0
  19. data/app/helpers/katello/hosts_and_hostgroups_helper.rb +21 -3
  20. data/app/lib/actions/katello/alternate_content_source/create.rb +24 -0
  21. data/app/lib/actions/katello/alternate_content_source/destroy.rb +27 -0
  22. data/app/lib/actions/katello/alternate_content_source/update.rb +41 -0
  23. data/app/lib/actions/katello/cdn_configuration/update.rb +2 -2
  24. data/app/lib/actions/katello/content_view/destroy.rb +2 -1
  25. data/app/lib/actions/katello/content_view/incremental_updates.rb +7 -3
  26. data/app/lib/actions/katello/content_view/publish.rb +7 -9
  27. data/app/lib/actions/katello/content_view_version/auto_create_products.rb +4 -4
  28. data/app/lib/actions/katello/content_view_version/auto_create_redhat_repositories.rb +6 -4
  29. data/app/lib/actions/katello/content_view_version/auto_create_repositories.rb +6 -4
  30. data/app/lib/actions/katello/content_view_version/import.rb +25 -22
  31. data/app/lib/actions/katello/content_view_version/import_library.rb +0 -1
  32. data/app/lib/actions/katello/content_view_version/import_repository.rb +21 -0
  33. data/app/lib/actions/katello/content_view_version/incremental_update.rb +85 -93
  34. data/app/lib/actions/katello/content_view_version/reset_content_view_repositories_from_metadata.rb +2 -2
  35. data/app/lib/actions/katello/product/content_create.rb +10 -8
  36. data/app/lib/actions/katello/repository/destroy.rb +36 -12
  37. data/app/lib/actions/katello/repository_set/disable_repository.rb +8 -3
  38. data/app/lib/actions/pulp3/alternate_content_source/create.rb +20 -0
  39. data/app/lib/actions/pulp3/alternate_content_source/create_remote.rb +20 -0
  40. data/app/lib/actions/pulp3/alternate_content_source/delete.rb +16 -0
  41. data/app/lib/actions/pulp3/alternate_content_source/delete_remote.rb +16 -0
  42. data/app/lib/actions/pulp3/alternate_content_source/update.rb +16 -0
  43. data/app/lib/actions/pulp3/alternate_content_source/update_remote.rb +17 -0
  44. data/app/lib/actions/pulp3/content_view_version/{import.rb → create_import.rb} +5 -5
  45. data/app/lib/actions/pulp3/content_view_version/create_importer.rb +4 -3
  46. data/app/lib/actions/pulp3/content_view_version/destroy_importer.rb +12 -1
  47. data/app/lib/actions/pulp3/orchestration/alternate_content_source/create.rb +18 -0
  48. data/app/lib/actions/pulp3/orchestration/alternate_content_source/delete.rb +23 -0
  49. data/app/lib/actions/pulp3/orchestration/alternate_content_source/update.rb +18 -0
  50. data/app/lib/actions/pulp3/orchestration/content_view_version/copy_version_units_to_library.rb +1 -1
  51. data/app/lib/actions/pulp3/orchestration/content_view_version/export_repository.rb +51 -0
  52. data/app/lib/actions/pulp3/orchestration/content_view_version/import.rb +5 -2
  53. data/app/lib/actions/pulp3/repository/refresh_distribution.rb +4 -1
  54. data/app/lib/actions/pulp3/repository/save_distribution_references.rb +2 -0
  55. data/app/lib/katello/api/v2/error_handling.rb +1 -0
  56. data/app/lib/katello/resources/cdn/katello_cdn.rb +3 -1
  57. data/app/lib/katello/util/errata.rb +2 -3
  58. data/app/lib/katello/validators/alternate_content_source_path_validator.rb +29 -0
  59. data/app/lib/katello/validators/content_default_http_proxy_setting_validator.rb +12 -0
  60. data/app/lib/katello/validators/content_view_environment_validator.rb +10 -5
  61. data/app/models/katello/alternate_content_source.rb +66 -0
  62. data/app/models/katello/authorization/alternate_content_source.rb +33 -0
  63. data/app/models/katello/authorization/repository.rb +3 -3
  64. data/app/models/katello/candlepin/repository_mapper.rb +13 -6
  65. data/app/models/katello/cdn_configuration.rb +15 -15
  66. data/app/models/katello/concerns/content_facet_host_extensions.rb +25 -0
  67. data/app/models/katello/concerns/host_managed_extensions.rb +7 -5
  68. data/app/models/katello/concerns/http_proxy_extensions.rb +14 -0
  69. data/app/models/katello/concerns/organization_extensions.rb +4 -2
  70. data/app/models/katello/concerns/setting_extensions.rb +14 -0
  71. data/app/models/katello/concerns/smart_proxy_extensions.rb +2 -1
  72. data/app/models/katello/content.rb +1 -0
  73. data/app/models/katello/content_credential.rb +6 -0
  74. data/app/models/katello/content_override.rb +7 -3
  75. data/app/models/katello/content_view.rb +33 -2
  76. data/app/models/katello/content_view_erratum_filter.rb +26 -12
  77. data/app/models/katello/content_view_filter.rb +4 -0
  78. data/app/models/katello/content_view_version.rb +12 -0
  79. data/app/models/katello/content_view_version_export_history.rb +3 -1
  80. data/app/models/katello/erratum.rb +9 -5
  81. data/app/models/katello/events/delete_latest_content_view_version.rb +40 -0
  82. data/app/models/katello/host/content_facet.rb +14 -0
  83. data/app/models/katello/host_available_module_stream.rb +12 -0
  84. data/app/models/katello/product_content.rb +1 -0
  85. data/app/models/katello/purpose_sla_status.rb +1 -1
  86. data/app/models/katello/purpose_status.rb +2 -2
  87. data/app/models/katello/repository.rb +7 -4
  88. data/app/models/katello/root_repository.rb +1 -1
  89. data/app/models/katello/smart_proxy_alternate_content_source.rb +8 -0
  90. data/app/models/katello/sync_plan.rb +1 -1
  91. data/app/presenters/katello/product_content_presenter.rb +15 -0
  92. data/app/services/katello/applicable_host_queue.rb +1 -1
  93. data/app/services/katello/content_unit_indexer.rb +2 -1
  94. data/app/services/katello/product_content_finder.rb +12 -2
  95. data/app/services/katello/pulp3/alternate_content_source.rb +117 -0
  96. data/app/services/katello/pulp3/api/file.rb +8 -0
  97. data/app/services/katello/pulp3/api/yum.rb +8 -0
  98. data/app/services/katello/pulp3/content_view_version/export.rb +27 -5
  99. data/app/services/katello/pulp3/content_view_version/import.rb +97 -71
  100. data/app/services/katello/pulp3/content_view_version/import_export_common.rb +4 -4
  101. data/app/services/katello/pulp3/content_view_version/import_gpg_keys.rb +13 -11
  102. data/app/services/katello/pulp3/content_view_version/import_validator.rb +67 -72
  103. data/app/services/katello/pulp3/content_view_version/importable_products.rb +40 -24
  104. data/app/services/katello/pulp3/content_view_version/importable_repositories.rb +88 -39
  105. data/app/services/katello/pulp3/content_view_version/metadata_generator.rb +2 -2
  106. data/app/services/katello/pulp3/content_view_version/metadata_map.rb +117 -0
  107. data/app/services/katello/pulp3/pulp_content_unit.rb +6 -1
  108. data/app/services/katello/pulp3/repository/yum.rb +70 -12
  109. data/app/services/katello/pulp3/repository.rb +7 -91
  110. data/app/services/katello/pulp3/service_common.rb +66 -0
  111. data/app/services/katello/pulp3/smart_proxy_mirror_repository.rb +4 -1
  112. data/app/services/katello/ui_notifications/content_view/delete_latest_version_failure.rb +22 -0
  113. data/app/views/foreman/job_templates/change_content_source.erb +1 -1
  114. data/app/views/foreman/job_templates/install_errata.erb +5 -5
  115. data/app/views/foreman/job_templates/install_errata_by_search_query.erb +7 -6
  116. data/app/views/foreman/job_templates/install_group.erb +4 -4
  117. data/app/views/foreman/job_templates/install_package.erb +4 -4
  118. data/app/views/foreman/job_templates/install_packages_by_search_query.erb +3 -3
  119. data/app/views/foreman/job_templates/remove_group.erb +4 -4
  120. data/app/views/foreman/job_templates/remove_package.erb +4 -4
  121. data/app/views/foreman/job_templates/remove_packages_by_search_query.erb +3 -3
  122. data/app/views/foreman/job_templates/resolve_traces.erb +2 -2
  123. data/app/views/foreman/job_templates/restart_services.erb +3 -3
  124. data/app/views/foreman/job_templates/update_group.erb +4 -4
  125. data/app/views/foreman/job_templates/update_package.erb +4 -4
  126. data/app/views/foreman/job_templates/update_packages_by_search_query.erb +3 -3
  127. data/app/views/katello/api/v2/alternate_content_sources/base.json.rabl +15 -0
  128. data/app/views/katello/api/v2/alternate_content_sources/index.json.rabl +7 -0
  129. data/app/views/katello/api/v2/alternate_content_sources/show.json.rabl +3 -0
  130. data/app/views/katello/api/v2/capsule_content/sync_status.json.rabl +1 -1
  131. data/app/views/katello/api/v2/content_view_version_export_histories/show.json.rabl +2 -3
  132. data/app/views/katello/api/v2/content_view_versions/base.json.rabl +1 -1
  133. data/app/views/katello/api/v2/content_views/base.json.rabl +1 -0
  134. data/app/views/katello/api/v2/environments/show.json.rabl +2 -0
  135. data/app/views/katello/api/v2/errata/_counts.json.rabl +2 -2
  136. data/app/views/katello/api/v2/host_module_streams/base.json.rabl +2 -2
  137. data/app/views/katello/api/v2/hosts/host_collections.json.rabl +1 -1
  138. data/app/views/katello/api/v2/organizations/show.json.rabl +7 -1
  139. data/app/views/katello/api/v2/repositories/show.json.rabl +2 -1
  140. data/app/views/katello/sync_management/_repo.html.erb +8 -29
  141. data/config/routes/api/v2.rb +7 -0
  142. data/db/migrate/20150930183738_migrate_content_hosts.rb +0 -399
  143. data/db/migrate/20171025163149_remove_use_pulp_oauth_setting.rb +1 -1
  144. data/db/migrate/20171114150937_cleanup_installed_packages.rb +1 -1
  145. data/db/migrate/20180402160223_clean_up_force_post_sync_action_setting.rb +1 -1
  146. data/db/migrate/20211129200124_remove_dependency_solving_algorithm_setting.rb +1 -1
  147. data/db/migrate/20211220185935_clean_duplicate_content_units.rb +10 -12
  148. data/db/migrate/20220110223754_update_disconnected_settings.rb +5 -5
  149. data/db/migrate/20220117151612_add_alternate_content_sources.rb +48 -0
  150. data/db/migrate/20220124191056_add_type_to_cdn_configuration.rb +9 -4
  151. data/db/migrate/20220209203251_add_generated_for_to_content_views.rb +13 -0
  152. data/db/migrate/20220209205137_expand_sync_timeout_settings.rb +7 -7
  153. data/db/migrate/20220228173251_remove_drpm_from_ignorable_content.rb +12 -0
  154. data/db/migrate/20220404190836_delete_old_setting_data.rb +9 -0
  155. data/db/migrate/20220405220616_update_cdn_configuration_type.rb +11 -0
  156. data/db/migrate/20220419193414_content_settings_to_dsl_category.rb +5 -0
  157. data/db/seeds.d/110-content-view-autopublish.rb +13 -0
  158. data/db/seeds.d/150-module_job_templates.rb +1 -1
  159. data/engines/bastion/README.md +1 -0
  160. data/engines/bastion/app/assets/javascripts/bastion/components/bst-modal.directive.js +1 -0
  161. data/engines/bastion/app/views/bastion/layouts/assets.html.erb +1 -0
  162. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/activation-key-details.controller.js +4 -2
  163. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/capsule-content/capsule-content.controller.js +10 -5
  164. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-module-streams.controller.js +1 -0
  165. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-packages-installed.controller.js +1 -0
  166. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/content-host-traces.controller.js +1 -0
  167. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-packages-actions.html +1 -1
  168. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-packages-applicable.html +1 -1
  169. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content-hosts.controller.js +8 -0
  170. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/content-host-details.controller.js +4 -2
  171. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/content-hosts.html +2 -2
  172. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/content.service.js +10 -0
  173. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/details/views/environment-deb-repositories.html +26 -0
  174. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/details/views/environment-debs.html +27 -0
  175. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/environments.controller.js +1 -0
  176. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/environments.routes.js +22 -0
  177. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/views/environments.html +13 -7
  178. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +63 -17
  179. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-info.controller.js +7 -8
  180. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details.controller.js +10 -1
  181. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-details.html +21 -3
  182. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-info.html +8 -9
  183. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/new-repository.controller.js +7 -5
  184. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/views/new-repository.html +2 -1
  185. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/discovery/discovery-create.controller.js +1 -1
  186. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/discovery/views/discovery-create.html +1 -1
  187. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/products.routes.js +1 -0
  188. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/subscriptions/views/content-access-mode-banner.html +6 -1
  189. data/lib/katello/engine.rb +1 -5
  190. data/lib/katello/permission_creator.rb +32 -4
  191. data/lib/katello/plugin.rb +378 -4
  192. data/lib/katello/tasks/reset.rake.bak +67 -0
  193. data/lib/katello/tasks/update_content_default_http_proxy.rake +2 -3
  194. data/lib/katello/version.rb +1 -1
  195. data/locale/action_names.rb +47 -41
  196. data/locale/bn/LC_MESSAGES/katello.mo +0 -0
  197. data/locale/bn/katello.po +820 -106
  198. data/locale/bn/katello.po.time_stamp +0 -0
  199. data/locale/cs/LC_MESSAGES/katello.mo +0 -0
  200. data/locale/cs/katello.po +818 -104
  201. data/locale/cs/katello.po.time_stamp +0 -0
  202. data/locale/de/LC_MESSAGES/katello.mo +0 -0
  203. data/locale/de/katello.po +893 -179
  204. data/locale/de/katello.po.time_stamp +0 -0
  205. data/locale/en/LC_MESSAGES/katello.mo +0 -0
  206. data/locale/en/katello.po +817 -103
  207. data/locale/en/katello.po.time_stamp +0 -0
  208. data/locale/es/LC_MESSAGES/katello.mo +0 -0
  209. data/locale/es/katello.po +882 -168
  210. data/locale/es/katello.po.time_stamp +0 -0
  211. data/locale/fr/LC_MESSAGES/katello.mo +0 -0
  212. data/locale/fr/katello.po +1219 -505
  213. data/locale/fr/katello.po.time_stamp +0 -0
  214. data/locale/gu/LC_MESSAGES/katello.mo +0 -0
  215. data/locale/gu/katello.po +826 -112
  216. data/locale/gu/katello.po.time_stamp +0 -0
  217. data/locale/hi/LC_MESSAGES/katello.mo +0 -0
  218. data/locale/hi/katello.po +826 -112
  219. data/locale/hi/katello.po.time_stamp +0 -0
  220. data/locale/it/LC_MESSAGES/katello.mo +0 -0
  221. data/locale/it/katello.po +863 -148
  222. data/locale/it/katello.po.time_stamp +0 -0
  223. data/locale/ja/LC_MESSAGES/katello.mo +0 -0
  224. data/locale/ja/katello.po +1216 -499
  225. data/locale/ja/katello.po.time_stamp +0 -0
  226. data/locale/katello.pot +3847 -2507
  227. data/locale/kn/LC_MESSAGES/katello.mo +0 -0
  228. data/locale/kn/katello.po +826 -112
  229. data/locale/kn/katello.po.time_stamp +0 -0
  230. data/locale/ko/LC_MESSAGES/katello.mo +0 -0
  231. data/locale/ko/katello.po +912 -198
  232. data/locale/ko/katello.po.time_stamp +0 -0
  233. data/locale/mr/LC_MESSAGES/katello.mo +0 -0
  234. data/locale/mr/katello.po +826 -112
  235. data/locale/mr/katello.po.time_stamp +0 -0
  236. data/locale/or/LC_MESSAGES/katello.mo +0 -0
  237. data/locale/or/katello.po +826 -112
  238. data/locale/or/katello.po.time_stamp +0 -0
  239. data/locale/pa/LC_MESSAGES/katello.mo +0 -0
  240. data/locale/pa/katello.po +826 -112
  241. data/locale/pa/katello.po.time_stamp +0 -0
  242. data/locale/pt/LC_MESSAGES/katello.mo +0 -0
  243. data/locale/pt/katello.po +817 -103
  244. data/locale/pt/katello.po.time_stamp +0 -0
  245. data/locale/pt_BR/LC_MESSAGES/katello.mo +0 -0
  246. data/locale/pt_BR/katello.po +879 -165
  247. data/locale/pt_BR/katello.po.time_stamp +0 -0
  248. data/locale/ru/LC_MESSAGES/katello.mo +0 -0
  249. data/locale/ru/katello.po +927 -213
  250. data/locale/ru/katello.po.time_stamp +0 -0
  251. data/locale/ta/LC_MESSAGES/katello.mo +0 -0
  252. data/locale/ta/katello.po +820 -106
  253. data/locale/ta/katello.po.time_stamp +0 -0
  254. data/locale/te/LC_MESSAGES/katello.mo +0 -0
  255. data/locale/te/katello.po +826 -112
  256. data/locale/te/katello.po.time_stamp +0 -0
  257. data/locale/zh_CN/LC_MESSAGES/katello.mo +0 -0
  258. data/locale/zh_CN/katello.po +1202 -486
  259. data/locale/zh_CN/katello.po.time_stamp +0 -0
  260. data/locale/zh_TW/LC_MESSAGES/katello.mo +0 -0
  261. data/locale/zh_TW/katello.po +856 -142
  262. data/locale/zh_TW/katello.po.time_stamp +0 -0
  263. data/webpack/components/EditableTextInput/EditableTextInput.js +20 -5
  264. data/webpack/components/Errata/index.js +38 -8
  265. data/webpack/components/Packages/index.js +1 -4
  266. data/webpack/components/Search/Search.js +18 -3
  267. data/webpack/components/SelectAllCheckbox/index.js +1 -0
  268. data/webpack/components/SelectableDropdown/SelectableDropdown.js +4 -2
  269. data/webpack/components/Table/EmptyStateMessage.js +21 -7
  270. data/webpack/components/Table/MainTable.js +29 -4
  271. data/webpack/components/Table/TableHooks.js +63 -19
  272. data/webpack/components/Table/TableWrapper.js +4 -2
  273. data/webpack/components/Table/components/SortableColumnHeaders.js +19 -0
  274. data/webpack/components/Table/components/TranslatedPlural.js +57 -0
  275. data/webpack/components/TypeAhead/TypeAhead.js +8 -0
  276. data/webpack/components/TypeAhead/pf4Search/TypeAheadInput.js +13 -11
  277. data/webpack/components/TypeAhead/pf4Search/TypeAheadSearch.js +5 -2
  278. data/webpack/components/extensions/HostDetails/ActionsBar/index.js +27 -0
  279. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/ChangeHostCVModal.js +256 -0
  280. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/ContentViewDetailsCard.js +202 -0
  281. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/HostContentViewActions.js +19 -0
  282. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/HostContentViewConstants.js +2 -0
  283. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/__tests__/changeHostCVModal.test.js +131 -0
  284. data/webpack/components/extensions/HostDetails/Cards/{__tests__ → ContentViewDetailsCard/__tests__}/contentViewDetailsCard.test.js +22 -0
  285. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/__tests__/contentViews.fixtures.json +443 -0
  286. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/__tests__/envPaths.fixtures.json +320 -0
  287. data/webpack/components/extensions/HostDetails/Cards/ErrataOverviewCard.js +57 -33
  288. data/webpack/components/extensions/HostDetails/Cards/ErrataOverviewCard.scss +3 -0
  289. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsActions.js +30 -0
  290. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsCard.js +187 -0
  291. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsConstants.js +7 -0
  292. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsModal.js +227 -0
  293. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsSelectors.js +18 -0
  294. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/availableHostCollections.fixtures.json +106 -0
  295. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/hostCollectionsCard.test.js +110 -0
  296. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/hostCollectionsModal.test.js +235 -0
  297. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/removableHostCollections.fixtures.json +45 -0
  298. data/webpack/components/extensions/HostDetails/Cards/__tests__/errataOverviewCard.test.js +33 -8
  299. data/webpack/components/extensions/HostDetails/DetailsTabCards/InstalledProductsCard.js +44 -0
  300. data/webpack/components/extensions/HostDetails/DetailsTabCards/RegistrationCard.js +107 -0
  301. data/webpack/components/extensions/HostDetails/DetailsTabCards/SystemPropertiesCardExtensions.js +38 -0
  302. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab/ErrataTab.js +62 -39
  303. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab/HostErrataActions.js +1 -7
  304. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsActions.js +1 -3
  305. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsConstants.js +28 -0
  306. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsTab.js +486 -116
  307. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/__tests__/moduleStreamsTab.test.js +147 -1
  308. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/__tests__/modules.fixtures.json +6 -3
  309. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/HostPackagesActions.js +1 -7
  310. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackageInstallModal.js +2 -1
  311. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackagesTab.js +48 -19
  312. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionActions.js +35 -47
  313. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionConstants.js +1 -0
  314. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsActions.js +33 -54
  315. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsConstants.js +20 -0
  316. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab.js +269 -132
  317. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/TracesTab.js +47 -11
  318. data/webpack/components/extensions/HostDetails/Tabs/__tests__/errataTab.test.js +30 -42
  319. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packagesTab.test.js +36 -1
  320. data/webpack/components/extensions/HostDetails/Tabs/__tests__/repositorySetsTab.test.js +94 -46
  321. data/webpack/components/extensions/HostDetails/Tabs/__tests__/tracesTab.test.js +18 -2
  322. data/webpack/components/extensions/HostDetails/Tabs/customizedRexUrlHelpers.js +6 -0
  323. data/webpack/containers/Application/config.js +5 -0
  324. data/webpack/global_index.js +30 -7
  325. data/webpack/global_test_setup.js +13 -0
  326. data/webpack/redux/actions/RedHatRepositories/enabled.js +2 -1
  327. data/webpack/redux/actions/RedHatRepositories/helpers.js +9 -8
  328. data/webpack/scenes/AlternateContentSources/ACSActions.js +53 -0
  329. data/webpack/scenes/AlternateContentSources/ACSConstants.js +4 -0
  330. data/webpack/scenes/AlternateContentSources/ACSIndexPage.js +23 -0
  331. data/webpack/scenes/AlternateContentSources/ACSSelectors.js +15 -0
  332. data/webpack/scenes/AlternateContentSources/MainTable/ACSTable.js +152 -0
  333. data/webpack/scenes/AlternateContentSources/MainTable/__tests__/acsIndex.fixtures.json +91 -0
  334. data/webpack/scenes/AlternateContentSources/MainTable/__tests__/acsTable.test.js +67 -0
  335. data/webpack/scenes/AlternateContentSources/index.js +4 -0
  336. data/webpack/scenes/Content/Details/ContentRepositories.js +1 -0
  337. data/webpack/scenes/Content/Table/ContentTable.js +1 -0
  338. data/webpack/scenes/ContentViews/ContentViewsActions.js +6 -2
  339. data/webpack/scenes/ContentViews/ContentViewsConstants.js +11 -3
  340. data/webpack/scenes/ContentViews/Copy/CopyContentViewForm.js +2 -1
  341. data/webpack/scenes/ContentViews/Create/ContentViewFormComponents.js +10 -1
  342. data/webpack/scenes/ContentViews/Create/CreateContentViewForm.js +4 -3
  343. data/webpack/scenes/ContentViews/Create/__tests__/createContentView.test.js +1 -1
  344. data/webpack/scenes/ContentViews/Delete/ContentViewDeleteWizard.js +7 -5
  345. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionFinish.js +29 -21
  346. data/webpack/scenes/ContentViews/Delete/__tests__/contentViewDelete.test.js +15 -8
  347. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewAddModal.js +3 -3
  348. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewBulkAddModal.js +4 -4
  349. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ContentViewComponents.js +3 -1
  350. data/webpack/scenes/ContentViews/Details/ComponentContentViews/__tests__/contentViewComponents.test.js +4 -4
  351. data/webpack/scenes/ContentViews/Details/ContentViewDetailActions.js +34 -8
  352. data/webpack/scenes/ContentViews/Details/ContentViewDetailSelectors.js +33 -29
  353. data/webpack/scenes/ContentViews/Details/ContentViewDetails.js +130 -79
  354. data/webpack/scenes/ContentViews/Details/ContentViewInfo.js +17 -3
  355. data/webpack/scenes/ContentViews/Details/Filters/Add/CVFilterAddModal.js +2 -1
  356. data/webpack/scenes/ContentViews/Details/Filters/AffectedRepositories/AffectedRepositoryTable.js +2 -1
  357. data/webpack/scenes/ContentViews/Details/Filters/CVContainerImageFilterContent.js +6 -1
  358. data/webpack/scenes/ContentViews/Details/Filters/CVErrataDateFilterContent.js +41 -21
  359. data/webpack/scenes/ContentViews/Details/Filters/CVErrataIDFilterContent.js +38 -20
  360. data/webpack/scenes/ContentViews/Details/Filters/CVModuleStreamFilterContent.js +2 -0
  361. data/webpack/scenes/ContentViews/Details/Filters/CVPackageGroupFilterContent.js +8 -1
  362. data/webpack/scenes/ContentViews/Details/Filters/CVRpmFilterContent.js +9 -1
  363. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilters.js +2 -1
  364. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/CVRpmMatchContentModal.js +1 -0
  365. data/webpack/scenes/ContentViews/Details/Filters/Rules/ContainerTag/AddEditContainerTagRuleModal.js +27 -12
  366. data/webpack/scenes/ContentViews/Details/Filters/Rules/Package/AddEditPackageRuleModal.js +39 -17
  367. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVContainerImageFilterContent.test.js +27 -10
  368. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVRpmFilterContent.test.js +46 -23
  369. data/webpack/scenes/ContentViews/Details/Histories/ContentViewHistories.js +3 -2
  370. data/webpack/scenes/ContentViews/Details/Promote/ContentViewVersionPromote.js +5 -2
  371. data/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js +161 -108
  372. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewAddRemove.test.js +7 -7
  373. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewRepoAdd.fixture.json +1 -0
  374. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/ActionSummary.js +58 -0
  375. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/BulkDeleteContextWrapper.js +45 -0
  376. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/BulkDeleteHelpers.js +30 -0
  377. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/BulkDeleteModal.js +56 -0
  378. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ConfirmBulkDelete.js +126 -0
  379. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/FinishBulkDelete.js +61 -0
  380. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ReassignActivationKeys.js +196 -0
  381. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ReassignHosts.js +220 -0
  382. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ReviewEnvironments.js +104 -0
  383. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/BulkDeleteModal.test.js +122 -0
  384. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/BulkDeleteVersions.fixtures.json +600 -0
  385. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/contentView.fixtures.json +1504 -0
  386. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/contentViewVersion.fixtures.json +936 -0
  387. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/environmentPaths.fixtures.json +261 -0
  388. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/hosts.fixtures.json +163 -0
  389. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/bulkDeleteSteps.js +79 -0
  390. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersions.js +192 -167
  391. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveCVVersionWizard.js +2 -5
  392. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVVersionDeleteFinish.js +38 -53
  393. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVVersionRemoveReview.js +1 -1
  394. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvVersionRemove.test.js +6 -12
  395. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedActivationKeys.js +1 -0
  396. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedHosts.js +1 -0
  397. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailConfig.js +1 -0
  398. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetails.js +8 -20
  399. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsHeader.js +23 -13
  400. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsTable.js +3 -0
  401. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetails.fixtures.json +4 -4
  402. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetails.test.js +0 -3
  403. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetailsEmpty.test.js +4 -4
  404. data/webpack/scenes/ContentViews/Details/Versions/__tests__/contentViewVersions.test.js +12 -14
  405. data/webpack/scenes/ContentViews/Details/__tests__/contentViewDetails.fixtures.json +1 -0
  406. data/webpack/scenes/ContentViews/Publish/CVPublishFinish.js +96 -117
  407. data/webpack/scenes/ContentViews/Publish/PublishContentViewWizard.js +13 -19
  408. data/webpack/scenes/ContentViews/Publish/__tests__/publishContentView.test.js +9 -20
  409. data/webpack/scenes/ContentViews/Table/ContentViewsTable.js +165 -148
  410. data/webpack/scenes/ContentViews/Table/tableDataGenerator.js +2 -0
  411. data/webpack/scenes/ContentViews/__tests__/contentViewPage.test.js +4 -4
  412. data/webpack/scenes/ContentViews/components/ContentViewIcon.js +14 -3
  413. data/webpack/scenes/ContentViews/components/ContentViewsCounter.js +1 -1
  414. data/webpack/scenes/ContentViews/components/EnvironmentLabels.js +4 -3
  415. data/webpack/scenes/ContentViews/components/EnvironmentPaths/EnvironmentPaths.js +9 -5
  416. data/webpack/scenes/ContentViews/components/EnvironmentPaths/EnvironmentPaths.scss +6 -1
  417. data/webpack/scenes/ContentViews/components/TaskPresenter/TaskPresenter.js +40 -35
  418. data/webpack/scenes/ContentViews/expansions/DetailsExpansion.js +2 -2
  419. data/webpack/scenes/ContentViews/expansions/RelatedCompositeContentViewsModal.js +1 -1
  420. data/webpack/scenes/ContentViews/expansions/RelatedContentViewComponentsModal.js +4 -4
  421. data/webpack/scenes/ContentViews/expansions/__tests__/contentViewComponentsModal.test.js +1 -1
  422. data/webpack/scenes/ContentViews/helpers.js +3 -0
  423. data/webpack/scenes/Hosts/ChangeContentSource/helpers.js +5 -0
  424. data/webpack/scenes/RedHatRepositories/RedHatRepositoriesPage.js +3 -3
  425. data/webpack/scenes/RedHatRepositories/components/EnabledRepository/EnabledRepository.js +2 -1
  426. data/webpack/scenes/RedHatRepositories/components/EnabledRepository/__tests__/EnabledRepository.test.js +2 -0
  427. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnConfigurationConstants.js +3 -3
  428. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnTypeForm.js +2 -0
  429. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/{AirGappedTypeForm.js → ExportSyncForm.js} +7 -6
  430. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/{UpstreamServerTypeForm.js → NetworkSyncForm.js} +15 -7
  431. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/{AirGappedTypeForm.test.js → ExportSyncForm.test.js} +4 -4
  432. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/{UpstreamServerTypeForm.test.js → NetworkSyncForm.test.js} +8 -8
  433. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/index.js +11 -11
  434. data/webpack/scenes/Subscriptions/SubscriptionConstants.js +1 -0
  435. data/webpack/scenes/Subscriptions/SubscriptionsPage.js +8 -7
  436. data/webpack/scenes/Tasks/TaskActions.js +6 -0
  437. data/webpack/scenes/Tasks/TaskSelectors.js +11 -0
  438. data/webpack/scenes/Tasks/helpers.js +33 -5
  439. data/webpack/utils/helpers.js +2 -0
  440. metadata +158 -40
  441. data/app/models/setting/content.rb +0 -201
  442. data/webpack/components/Table/__test__/useBulkSelect.test.js +0 -99
  443. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard.js +0 -96
  444. data/webpack/scenes/ContentViews/Details/DetailsContainer.js +0 -36
@@ -7,7 +7,7 @@ import { TableVariant } from '@patternfly/react-table';
7
7
  import {
8
8
  Tabs, Tab, TabTitleText, Split, SplitItem, Select, SelectVariant,
9
9
  SelectOption, Button, Dropdown, DropdownItem, KebabToggle, Flex, FlexItem,
10
- Bullseye, DatePicker, ChipGroup, Chip,
10
+ Bullseye, DatePicker, ChipGroup, Chip, Text,
11
11
  } from '@patternfly/react-core';
12
12
  import { STATUS } from 'foremanReact/constants';
13
13
  import { translate as __ } from 'foremanReact/common/I18n';
@@ -70,6 +70,9 @@ const CVErrataIDFilterContent = ({
70
70
  const [apiEndDate, setApiEndDate] = useState('');
71
71
  const [dateType, setDateType] = useState('issued');
72
72
  const [dateTypeSelectOpen, setDateTypeSelectOpen] = useState(false);
73
+ const [startEntry, setStartEntry] = useState(false);
74
+ const [endEntry, setEndEntry] = useState(false);
75
+
73
76
  const metadata = omit(response, ['results']);
74
77
  const { permissions } = details;
75
78
  const columnHeaders = [
@@ -241,6 +244,7 @@ const CVErrataIDFilterContent = ({
241
244
  const emptySearchTitle = __('No matching filter rules found.');
242
245
  const emptySearchBody = __('Try changing your search settings.');
243
246
 
247
+ const invalidDateFormat = __('Enter a valid date: MM/DD/YYYY');
244
248
 
245
249
  return (
246
250
  <Tabs className="margin-0-24" activeKey={activeTabKey} onSelect={(_event, eventKey) => setActiveTabKey(eventKey)}>
@@ -261,6 +265,7 @@ const CVErrataIDFilterContent = ({
261
265
  activeFilters,
262
266
  defaultFilters,
263
267
  }}
268
+ ouiaId="content-view-errata-by-id-filter-table"
264
269
  actionResolver={hasPermission(permissions, 'edit_content_views') ? actionResolver : null}
265
270
  onSelect={hasPermission(permissions, 'edit_content_views') ? onSelect(rows, setRows) : null}
266
271
  cells={columnHeaders}
@@ -312,7 +317,7 @@ const CVErrataIDFilterContent = ({
312
317
  </SplitItem>
313
318
  {hasPermission(permissions, 'edit_content_views') &&
314
319
  <SplitItem>
315
- <Button isDisabled={!hasNotAddedSelected} onClick={bulkAdd} variant="primary" aria-label="add_filter_rule">
320
+ <Button ouiaId="add-errata-id-button" isDisabled={!hasNotAddedSelected} onClick={bulkAdd} variant="primary" aria-label="add_filter_rule">
316
321
  {__('Add errata')}
317
322
  </Button>
318
323
  </SplitItem>
@@ -336,7 +341,7 @@ const CVErrataIDFilterContent = ({
336
341
  nodesBelowSearch={
337
342
  <>
338
343
  <Flex>
339
- <FlexItem span={2}>
344
+ <FlexItem span={2} spacer={{ default: 'spacerNone' }}>
340
345
  <Select
341
346
  selections={dateType}
342
347
  onSelect={(_event, selection) => {
@@ -349,54 +354,67 @@ const CVErrataIDFilterContent = ({
349
354
  name="date_type_selector"
350
355
  aria-label="date_type_selector"
351
356
  >
352
- <SelectOption key="issued" value="issued">{__('Issued')}</SelectOption>
353
- <SelectOption key="updated" value="updated">{__('Updated')}</SelectOption>
357
+ <SelectOption key="issued" value="issued">{__('Issued from')}</SelectOption>
358
+ <SelectOption key="updated" value="updated">{__('Updated from')}</SelectOption>
354
359
  </Select>
355
360
  </FlexItem>
356
- <FlexItem span={2} spacer={{ default: 'spacerXs' }}>
357
- <Bullseye>
361
+ <FlexItem span={2} spacer={{ default: 'spacerNone' }}>
362
+ <Bullseye
363
+ onFocus={() => setStartEntry(true)}
364
+ onBlur={() => setStartEntry(false)}
365
+ >
358
366
  <DatePicker
359
367
  aria-label="start_date_input"
368
+ invalidFormatText={invalidDateFormat}
360
369
  value={startDate}
361
370
  dateFormat={dateFormat}
362
371
  onChange={setValidStartDate}
363
372
  dateParse={dateParse}
364
- placeholder="MM/DD/YYYY"
373
+ placeholder={startEntry ? 'MM/DD/YYYY' : __('Start date')}
365
374
  />
366
375
  </Bullseye>
367
376
  </FlexItem>
377
+ <FlexItem spacer={{ default: 'spacerNone' }}>
378
+ <Bullseye style={{ padding: '0 5px' }}>
379
+ <Text>{__('to')}</Text>
380
+ </Bullseye>
381
+ </FlexItem>
368
382
  <FlexItem span={2}>
369
- <Bullseye>
383
+ <Bullseye
384
+ onFocus={() => setEndEntry(true)}
385
+ onBlur={() => setEndEntry(false)}
386
+ >
370
387
  <DatePicker
371
388
  aria-label="end_date_input"
372
389
  value={endDate}
390
+ invalidFormatText={invalidDateFormat}
373
391
  dateFormat={dateFormat}
374
392
  onChange={setValidEndDate}
375
393
  dateParse={dateParse}
376
- placeholder="MM/DD/YYYY"
394
+ placeholder={endEntry ? 'MM/DD/YYYY' : __('End date')}
377
395
  />
378
396
  </Bullseye>
379
397
  </FlexItem>
380
398
  </Flex>
381
399
  <Flex>
382
400
  <FlexItem>
383
- <ChipGroup categoryName={dateType === 'issued' ? __('Issued') : __('Updated')}>
401
+ <ChipGroup categoryName={__('Status')}>
402
+ <Chip key="status" onClick={() => setStatusSelected(ALL_STATUSES)} isReadOnly={statusSelected === ALL_STATUSES}>
403
+ {statusSelected}
404
+ </Chip>
405
+ </ChipGroup>
406
+ </FlexItem>
407
+ <FlexItem>
408
+ <ChipGroup categoryName={dateType === 'issued' ? __('Issued from') : __('Updated from')}>
384
409
  <Chip key="startDate" onClick={() => setValidStartDate('')} isReadOnly={startDate === ''}>
385
410
  {startDate || __('ANY')}
386
411
  </Chip>
387
- -
412
+ {__('to')}
388
413
  <Chip key="endDate" onClick={() => setValidEndDate('')} isReadOnly={endDate === ''}>
389
414
  {endDate || __('ANY')}
390
415
  </Chip>
391
416
  </ChipGroup>
392
417
  </FlexItem>
393
- <FlexItem>
394
- <ChipGroup categoryName={__('Status')}>
395
- <Chip key="status" onClick={() => setStatusSelected(ALL_STATUSES)} isReadOnly={statusSelected === ALL_STATUSES}>
396
- {statusSelected}
397
- </Chip>
398
- </ChipGroup>
399
- </FlexItem>
400
418
  <FlexItem>
401
419
  <ChipGroup categoryName={__('Type')}>
402
420
  {selectedTypes.map(type => (
@@ -411,7 +429,7 @@ const CVErrataIDFilterContent = ({
411
429
  </ChipGroup>
412
430
  </FlexItem>
413
431
  <FlexItem>
414
- <Button isDisabled={resetFiltersDisabled} variant="link" onClick={resetFilters} isInline>
432
+ <Button ouiaId="errata-reset-filters-button" isDisabled={resetFiltersDisabled} variant="link" onClick={resetFilters} isInline>
415
433
  {__('Reset filters')}
416
434
  </Button>
417
435
  </FlexItem>
@@ -216,6 +216,7 @@ const CVModuleStreamFilterContent = ({
216
216
  error,
217
217
  status,
218
218
  }}
219
+ ouiaId="content-view-module-stream-filter-table"
219
220
  additionalListeners={[selectedIndex]}
220
221
  activeFilters={[selectedAdded]}
221
222
  defaultFilters={[allAddedNotAdded[0]]}
@@ -245,6 +246,7 @@ const CVModuleStreamFilterContent = ({
245
246
  </SplitItem>
246
247
  <SplitItem>
247
248
  <Button
249
+ ouiaId="add-module-stream-rule-button"
248
250
  isDisabled={!hasNotAddedSelected}
249
251
  onClick={bulkAdd}
250
252
  variant="primary"
@@ -206,6 +206,7 @@ const CVPackageGroupFilterContent = ({
206
206
  error,
207
207
  status,
208
208
  }}
209
+ ouiaId="content-view-package-group-filter-table"
209
210
  additionalListeners={[selectedIndex]}
210
211
  activeFilters={[selectedAdded]}
211
212
  defaultFilters={[allAddedNotAdded[0]]}
@@ -234,7 +235,13 @@ const CVPackageGroupFilterContent = ({
234
235
  </Select>
235
236
  </SplitItem>
236
237
  <SplitItem>
237
- <Button isDisabled={!hasNotAddedSelected} onClick={bulkAdd} variant="primary" aria-label="add_filter_rule">
238
+ <Button
239
+ ouiaId="add-package-group-filter-rule-button"
240
+ isDisabled={!hasNotAddedSelected}
241
+ onClick={bulkAdd}
242
+ variant="primary"
243
+ aria-label="add_filter_rule"
244
+ >
238
245
  {__('Add filter rule')}
239
246
  </Button>
240
247
  </SplitItem>
@@ -161,6 +161,7 @@ const CVRpmFilterContent = ({
161
161
  updateSearchQuery,
162
162
  status,
163
163
  }}
164
+ ouiaId="content-view-rpm-filter-table"
164
165
  actionResolver={hasPermission(permissions, 'edit_content_views') ? actionResolver : null}
165
166
  onSelect={hasPermission(permissions, 'edit_content_views') ? onSelect(rows, setRows) : null}
166
167
  cells={columnHeaders}
@@ -179,7 +180,12 @@ const CVRpmFilterContent = ({
179
180
  {hasPermission(permissions, 'edit_content_views') &&
180
181
  <Split hasGutter>
181
182
  <SplitItem>
182
- <Button onClick={() => setModalOpen(true)} variant="primary" aria-label="add_rpm_rule">
183
+ <Button
184
+ ouiaId="add-rpm-rule-button"
185
+ onClick={() => setModalOpen(true)}
186
+ variant="primary"
187
+ aria-label="add_rpm_rule"
188
+ >
183
189
  {__('Add RPM rule')}
184
190
  </Button>
185
191
  </SplitItem>
@@ -207,6 +213,7 @@ const CVRpmFilterContent = ({
207
213
  filterId={filterId}
208
214
  onClose={onClose}
209
215
  selectedFilterRuleData={selectedFilterRuleData}
216
+ repositoryIds={details.repository_ids}
210
217
  />}
211
218
  </>}
212
219
  />
@@ -230,6 +237,7 @@ CVRpmFilterContent.propTypes = {
230
237
  setShowAffectedRepos: PropTypes.func.isRequired,
231
238
  details: PropTypes.shape({
232
239
  permissions: PropTypes.shape({}),
240
+ repository_ids: PropTypes.arrayOf(PropTypes.number),
233
241
  }).isRequired,
234
242
  };
235
243
 
@@ -126,6 +126,7 @@ const ContentViewFilters = ({ cvId, details }) => {
126
126
  error,
127
127
  status,
128
128
  }}
129
+ ouiaId="content-view-filters-table"
129
130
  actionResolver={hasPermission(permissions, 'edit_content_views') ? actionResolver : null}
130
131
  onSelect={hasPermission(permissions, 'edit_content_views') ? onSelect(rows, setRows) : null}
131
132
  cells={columnHeaders}
@@ -136,7 +137,7 @@ const ContentViewFilters = ({ cvId, details }) => {
136
137
  <>
137
138
  <Split hasGutter>
138
139
  <SplitItem>
139
- <Button onClick={openAddModal} variant="primary" aria-label="create_filter">
140
+ <Button ouiaId="create-filter-button" onClick={openAddModal} variant="primary" aria-label="create_filter">
140
141
  {__('Create filter')}
141
142
  </Button>
142
143
  </SplitItem>
@@ -53,6 +53,7 @@ const CVRpmMatchContentModal = ({ filterId, onClose, filterRuleId }) => {
53
53
  fetchItems,
54
54
  status,
55
55
  }}
56
+ ouiaId="content-view-rpm-match-content-table"
56
57
  autocompleteEndpoint="/packages/auto_complete_search"
57
58
  variant={TableVariant.compact}
58
59
  >
@@ -2,11 +2,13 @@ import React, { useState } from 'react';
2
2
  import { useDispatch } from 'react-redux';
3
3
  import PropTypes from 'prop-types';
4
4
  import { translate as __ } from 'foremanReact/common/I18n';
5
- import { Modal, ModalVariant, Form, FormGroup, TextInput, ActionGroup, Button } from '@patternfly/react-core';
5
+ import { Modal, ModalVariant, Form, FormGroup, ActionGroup, Button } from '@patternfly/react-core';
6
6
  import { addCVFilterRule, editCVFilterRule, getCVFilterRules } from '../../../ContentViewDetailActions';
7
+ import { orgId } from '../../../../../../services/api';
8
+ import Search from '../../../../../../components/Search/Search';
7
9
 
8
10
  const AddEditContainerTagRuleModal = ({
9
- onClose, filterId, selectedFilterRuleData,
11
+ onClose, filterId, selectedFilterRuleData, repositoryIds,
10
12
  }) => {
11
13
  const { name, id } = selectedFilterRuleData;
12
14
  const dispatch = useDispatch();
@@ -14,6 +16,8 @@ const AddEditContainerTagRuleModal = ({
14
16
  const [saving, setSaving] = useState(false);
15
17
  const isEditing = name && id;
16
18
 
19
+ const autoCompleteEndpoint = '/docker_tags/auto_complete_name';
20
+
17
21
  const onSubmit = () => {
18
22
  setSaving(true);
19
23
  if (isEditing) {
@@ -32,6 +36,15 @@ const AddEditContainerTagRuleModal = ({
32
36
  onClose();
33
37
  };
34
38
 
39
+ const getAutoCompleteParams = term => ({
40
+ endpoint: autoCompleteEndpoint,
41
+ params: {
42
+ organization_id: orgId(),
43
+ term,
44
+ repoids: repositoryIds,
45
+ },
46
+ });
47
+
35
48
  return (
36
49
  <Modal
37
50
  title={isEditing ? __('Edit filter rule') : __('Add filter rule')}
@@ -46,19 +59,19 @@ const AddEditContainerTagRuleModal = ({
46
59
  }}
47
60
  >
48
61
  <FormGroup label={__('Tag name')} isRequired fieldId="tag_name">
49
- <TextInput
50
- autoFocus
51
- isRequired
52
- type="text"
53
- id="tag_name"
54
- aria-label="input_tag"
55
- name="tagName"
56
- value={tagName}
57
- onChange={value => setTagName(value)}
62
+ <Search
63
+ patternfly4
64
+ initialInputValue={tagName}
65
+ onSearch={() => {}}
66
+ getAutoCompleteParams={getAutoCompleteParams}
67
+ foremanApiAutoComplete={false}
68
+ isTextInput
69
+ setTextInputValue={setTagName}
58
70
  />
59
71
  </FormGroup>
60
72
  <ActionGroup>
61
73
  <Button
74
+ ouiaId="add-edit-container-tag-filter-rule-submit"
62
75
  aria-label="add_edit_filter_rule"
63
76
  variant="primary"
64
77
  isDisabled={saving || tagName.length === 0}
@@ -66,7 +79,7 @@ const AddEditContainerTagRuleModal = ({
66
79
  >
67
80
  {isEditing ? __('Edit rule') : __('Add rule')}
68
81
  </Button>
69
- <Button variant="link" onClick={onClose}>
82
+ <Button ouiaId="add-edit-container-tag-filter-rule-cancel" variant="link" onClick={onClose}>
70
83
  {__('Cancel')}
71
84
  </Button>
72
85
  </ActionGroup>
@@ -82,10 +95,12 @@ AddEditContainerTagRuleModal.propTypes = {
82
95
  name: PropTypes.string,
83
96
  id: PropTypes.number,
84
97
  }),
98
+ repositoryIds: PropTypes.arrayOf(PropTypes.number),
85
99
  };
86
100
 
87
101
  AddEditContainerTagRuleModal.defaultProps = {
88
102
  selectedFilterRuleData: { name: '', id: undefined },
103
+ repositoryIds: [],
89
104
  };
90
105
 
91
106
  export default AddEditContainerTagRuleModal;
@@ -12,8 +12,12 @@ import { addCVFilterRule, editCVFilterRule, getCVFilterRules } from '../../../Co
12
12
  import {
13
13
  selectCreateFilterRuleStatus,
14
14
  } from '../../../ContentViewDetailSelectors';
15
+ import { orgId } from '../../../../../../services/api';
16
+ import Search from '../../../../../../components/Search/Search';
15
17
 
16
- const AddEditPackageRuleModal = ({ filterId, onClose, selectedFilterRuleData }) => {
18
+ const AddEditPackageRuleModal = ({
19
+ filterId, onClose, selectedFilterRuleData, repositoryIds,
20
+ }) => {
17
21
  const {
18
22
  id: editingId,
19
23
  name: editingName,
@@ -23,6 +27,9 @@ const AddEditPackageRuleModal = ({ filterId, onClose, selectedFilterRuleData })
23
27
  max_version: editingMaxVersion,
24
28
  } = selectedFilterRuleData || {};
25
29
 
30
+ const architectureAutoCompleteEndpoint = '/packages/auto_complete_arch';
31
+ const nameAutoCompleteEndpoint = '/packages/auto_complete_name';
32
+
26
33
  const isEditing = !!selectedFilterRuleData;
27
34
 
28
35
  const VersionModifiers = {
@@ -111,6 +118,16 @@ const AddEditPackageRuleModal = ({ filterId, onClose, selectedFilterRuleData })
111
118
  }
112
119
  }, [status, setSaving]);
113
120
 
121
+ const getAutoCompleteParams = (term, autoCompleteEndpoint) => ({
122
+ endpoint: autoCompleteEndpoint,
123
+ params: {
124
+ organization_id: orgId(),
125
+ term,
126
+ repoids: repositoryIds,
127
+ non_modular: true,
128
+ },
129
+ });
130
+
114
131
  return (
115
132
  <Modal
116
133
  title={selectedFilterRuleData ? __('Edit RPM rule') : __('Add RPM rule')}
@@ -125,24 +142,26 @@ const AddEditPackageRuleModal = ({ filterId, onClose, selectedFilterRuleData })
125
142
  }}
126
143
  >
127
144
  <FormGroup label={__('RPM name')} isRequired fieldId="name">
128
- <TextInput
129
- isRequired
130
- type="text"
131
- id="name"
132
- aria-label="input_name"
133
- name="name"
134
- value={name}
135
- onChange={value => setName(value)}
145
+ <Search
146
+ patternfly4
147
+ initialInputValue={name}
148
+ onSearch={() => {}}
149
+ getAutoCompleteParams={term => getAutoCompleteParams(term, nameAutoCompleteEndpoint)}
150
+ foremanApiAutoComplete={false}
151
+ isTextInput
152
+ setTextInputValue={setName}
136
153
  />
137
154
  </FormGroup>
138
155
  <FormGroup label={__('Architecture')} fieldId="architecture">
139
- <TextInput
140
- type="text"
141
- id="architecture"
142
- aria-label="input_architecture"
143
- name="architecture"
144
- value={architecture}
145
- onChange={value => setArchitecture(value)}
156
+ <Search
157
+ patternfly4
158
+ initialInputValue={architecture}
159
+ onSearch={() => {}}
160
+ getAutoCompleteParams={term =>
161
+ getAutoCompleteParams(term, architectureAutoCompleteEndpoint)}
162
+ foremanApiAutoComplete={false}
163
+ isTextInput
164
+ setTextInputValue={setArchitecture}
146
165
  />
147
166
  </FormGroup>
148
167
  <FormGroup label={__('Version')} fieldId="version_comparator">
@@ -194,6 +213,7 @@ const AddEditPackageRuleModal = ({ filterId, onClose, selectedFilterRuleData })
194
213
  </FormGroup>}
195
214
  <ActionGroup>
196
215
  <Button
216
+ ouiaId="add-edit-package-modal-submit"
197
217
  aria-label="add_package_filter_rule"
198
218
  variant="primary"
199
219
  isDisabled={saving || submitDisabled}
@@ -201,7 +221,7 @@ const AddEditPackageRuleModal = ({ filterId, onClose, selectedFilterRuleData })
201
221
  >
202
222
  {selectedFilterRuleData ? __('Edit rule') : __('Add rule')}
203
223
  </Button>
204
- <Button variant="link" onClick={onClose}>
224
+ <Button ouiaId="add-edit-package-modal-cancel" variant="link" onClick={onClose}>
205
225
  {__('Cancel')}
206
226
  </Button>
207
227
  </ActionGroup>
@@ -221,11 +241,13 @@ AddEditPackageRuleModal.propTypes = {
221
241
  min_version: PropTypes.string,
222
242
  max_version: PropTypes.string,
223
243
  }),
244
+ repositoryIds: PropTypes.arrayOf(PropTypes.number),
224
245
  };
225
246
 
226
247
  AddEditPackageRuleModal.defaultProps = {
227
248
  onClose: null,
228
249
  selectedFilterRuleData: undefined,
250
+ repositoryIds: [],
229
251
  };
230
252
 
231
253
  export default AddEditPackageRuleModal;
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { renderWithRedux, patientlyWaitFor, fireEvent } from 'react-testing-lib-wrapper';
2
+ import { renderWithRedux, patientlyWaitFor, fireEvent, act } from 'react-testing-lib-wrapper';
3
3
  import { Route } from 'react-router-dom';
4
4
 
5
5
  import { cvFilterDetailsKey } from '../../../ContentViewsConstants';
@@ -20,6 +20,7 @@ const { name: firstResultName } = cvFilterFixtures.results[0];
20
20
  const { name: secondResultName } = cvFilterFixtures.results[1];
21
21
  const cvFiltersUpdateDeletePath = api.getApiUrl('/content_view_filters/195/rules/35');
22
22
  const cvFilterRulesPath = api.getApiUrl('/content_view_filters/195/rules');
23
+ const autocompleteNameUrl = '/docker_tags/auto_complete_name';
23
24
 
24
25
  const addedRule = {
25
26
  content_view_filter_id: 195,
@@ -140,10 +141,14 @@ test('Can remove filter rules', async (done) => {
140
141
 
141
142
  // Add
142
143
  test('Can add filter rules', async (done) => {
143
- const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl);
144
+ const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl, true, [], 2);
145
+ const autocompleteNameScope = mockAutocomplete(nockInstance, autocompleteNameUrl, true, [], 2);
146
+ const inputSearchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 0, 2);
147
+ const inputAutoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing', undefined, 2);
144
148
 
145
149
  const cvFiltersScope = nockInstance
146
150
  .get(cvFilterRulesPath)
151
+ .times(2)
147
152
  .query(true)
148
153
  .reply(200, cvFilterFixtures);
149
154
 
@@ -156,7 +161,7 @@ test('Can add filter rules', async (done) => {
156
161
  .query(true)
157
162
  .reply(200, { ...cvFilterFixtures, results: [...cvFilterFixtures.results, addedRule] });
158
163
 
159
- const { queryByText, getByLabelText } =
164
+ const { queryByText, getByLabelText, getAllByLabelText } =
160
165
  renderWithRedux(
161
166
  withCVRoute(<CVContainerImageFilterContent filterId={195} details={details} />),
162
167
  renderOptions,
@@ -172,17 +177,17 @@ test('Can add filter rules', async (done) => {
172
177
 
173
178
 
174
179
  await patientlyWaitFor(() => {
175
- expect(getByLabelText('input_tag')).toBeInTheDocument();
180
+ expect(getAllByLabelText('text input for search')[0]).toBeInTheDocument();
176
181
  });
177
182
 
178
- fireEvent.change(getByLabelText('input_tag'), { target: { value: addedRule.name } });
183
+ fireEvent.change(getAllByLabelText('text input for search')[0], { target: { value: addedRule.name } });
179
184
 
180
185
  await patientlyWaitFor(() => {
181
186
  expect(getByLabelText('add_edit_filter_rule')).toBeInTheDocument();
182
- expect(getByLabelText('add_edit_filter_rule')).toHaveAttribute('aria-disabled', 'false');
187
+ expect(getByLabelText('add_edit_filter_rule')).toHaveAttribute('aria-disabled', 'true');
183
188
  });
184
189
 
185
- fireEvent.submit(getByLabelText('input_tag'));
190
+ fireEvent.submit(getAllByLabelText('text input for search')[1]);
186
191
 
187
192
  await patientlyWaitFor(() => {
188
193
  expect(queryByText(addedRule.name)).toBeInTheDocument();
@@ -191,16 +196,24 @@ test('Can add filter rules', async (done) => {
191
196
  assertNockRequest(autocompleteScope);
192
197
  assertNockRequest(cvFiltersScope);
193
198
  assertNockRequest(cvFilterAddScope);
199
+ assertNockRequest(inputSearchDelayScope);
200
+ assertNockRequest(inputAutoSearchScope);
201
+ assertNockRequest(autocompleteNameScope);
194
202
  assertNockRequest(cvFiltersCallbackScope, done);
203
+ act(done);
195
204
  });
196
205
 
197
206
 
198
207
  // Edit
199
208
  test('Can edit filter rules', async (done) => {
200
- const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl);
209
+ const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl, true, [], 2);
210
+ const autocompleteNameScope = mockAutocomplete(nockInstance, autocompleteNameUrl, true, [], 2);
211
+ const inputSearchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 0, 2);
212
+ const inputAutoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing', undefined, 2);
201
213
 
202
214
  const cvFiltersScope = nockInstance
203
215
  .get(cvFilterRulesPath)
216
+ .times(2)
204
217
  .query(true)
205
218
  .reply(200, cvFilterFixtures);
206
219
 
@@ -243,14 +256,14 @@ test('Can edit filter rules', async (done) => {
243
256
  fireEvent.click(queryByText('Edit'));
244
257
  });
245
258
 
246
- fireEvent.change(getByLabelText('input_tag'), { target: { value: addedRule.name } });
259
+ fireEvent.change(getAllByLabelText('text input for search')[0], { target: { value: addedRule.name } });
247
260
 
248
261
  await patientlyWaitFor(() => {
249
262
  expect(getByLabelText('add_edit_filter_rule')).toBeInTheDocument();
250
263
  expect(getByLabelText('add_edit_filter_rule')).toHaveAttribute('aria-disabled', 'false');
251
264
  });
252
265
 
253
- fireEvent.submit(getByLabelText('input_tag'));
266
+ fireEvent.submit(getAllByLabelText('text input for search')[1]);
254
267
 
255
268
  await patientlyWaitFor(() => {
256
269
  expect(queryByText(firstResultName)).not.toBeInTheDocument();
@@ -260,5 +273,9 @@ test('Can edit filter rules', async (done) => {
260
273
  assertNockRequest(autocompleteScope);
261
274
  assertNockRequest(cvFiltersScope);
262
275
  assertNockRequest(cvFilterAddScope);
276
+ assertNockRequest(inputSearchDelayScope);
277
+ assertNockRequest(inputAutoSearchScope);
278
+ assertNockRequest(autocompleteNameScope);
263
279
  assertNockRequest(cvFiltersCallbackScope, done);
280
+ act(done);
264
281
  });