katello 4.6.2.1 → 4.7.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 (333) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/katello/common/vendor.js +0 -1
  3. data/app/controllers/katello/api/v2/activation_keys_controller.rb +1 -0
  4. data/app/controllers/katello/api/v2/alternate_content_sources_controller.rb +4 -4
  5. data/app/controllers/katello/api/v2/capsule_content_controller.rb +5 -0
  6. data/app/controllers/katello/api/v2/content_imports_controller.rb +1 -0
  7. data/app/controllers/katello/api/v2/content_view_components_controller.rb +1 -1
  8. data/app/controllers/katello/api/v2/host_subscriptions_controller.rb +2 -1
  9. data/app/controllers/katello/api/v2/hosts_bulk_actions_controller.rb +1 -1
  10. data/app/controllers/katello/api/v2/organizations_controller.rb +1 -0
  11. data/app/controllers/katello/api/v2/repositories_controller.rb +78 -12
  12. data/app/controllers/katello/api/v2/upstream_subscriptions_controller.rb +1 -1
  13. data/app/controllers/katello/concerns/api/v2/registration_controller_extensions.rb +7 -1
  14. data/app/controllers/katello/concerns/api/v2/smart_proxies_controller_extensions.rb +1 -0
  15. data/app/controllers/katello/concerns/hosts_controller_extensions.rb +11 -9
  16. data/app/helpers/katello/content_source_helper.rb +9 -0
  17. data/app/helpers/katello/hosts_and_hostgroups_helper.rb +31 -0
  18. data/app/lib/actions/katello/activation_key/destroy.rb +1 -0
  19. data/app/lib/actions/katello/agent_action.rb +1 -0
  20. data/app/lib/actions/katello/alternate_content_source/create.rb +1 -1
  21. data/app/lib/actions/katello/alternate_content_source/update.rb +2 -2
  22. data/app/lib/actions/katello/capsule_content/sync.rb +10 -2
  23. data/app/lib/actions/katello/cdn_configuration/update.rb +1 -1
  24. data/app/lib/actions/katello/content_view/promote.rb +1 -0
  25. data/app/lib/actions/katello/content_view/publish.rb +5 -2
  26. data/app/lib/actions/katello/content_view_version/auto_create_redhat_repositories.rb +7 -3
  27. data/app/lib/actions/katello/content_view_version/auto_create_repositories.rb +4 -2
  28. data/app/lib/actions/katello/content_view_version/import.rb +22 -10
  29. data/app/lib/actions/katello/product/destroy.rb +1 -1
  30. data/app/lib/actions/katello/repository/destroy.rb +3 -3
  31. data/app/lib/actions/katello/repository/errata_mail.rb +9 -6
  32. data/app/lib/actions/katello/repository/refresh_repository.rb +1 -1
  33. data/app/lib/actions/katello/repository/sync.rb +13 -6
  34. data/app/lib/actions/katello/repository_set/enable_repository.rb +6 -2
  35. data/app/lib/actions/pulp3/alternate_content_source/refresh_remote.rb +16 -0
  36. data/app/lib/actions/pulp3/orchestration/alternate_content_source/refresh.rb +1 -0
  37. data/app/lib/actions/pulp3/orchestration/content_view_version/export_library.rb +1 -1
  38. data/app/lib/actions/pulp3/orchestration/content_view_version/export_repository.rb +10 -2
  39. data/app/lib/katello/concerns/renderer_extensions.rb +2 -1
  40. data/app/lib/katello/errors.rb +2 -2
  41. data/app/lib/katello/resources/candlepin.rb +7 -1
  42. data/app/lib/katello/resources/cdn/katello_cdn.rb +3 -13
  43. data/app/lib/katello/resources/cdn.rb +14 -9
  44. data/app/lib/katello/util/candlepin_repository_checker.rb +73 -0
  45. data/app/models/katello/activation_key.rb +12 -1
  46. data/app/models/katello/alternate_content_source.rb +15 -4
  47. data/app/models/katello/alternate_content_source_product.rb +1 -1
  48. data/app/models/katello/authorization/repository.rb +2 -2
  49. data/app/models/katello/cdn_configuration.rb +12 -3
  50. data/app/models/katello/concerns/host_managed_extensions.rb +15 -2
  51. data/app/models/katello/concerns/http_proxy_extensions.rb +5 -10
  52. data/app/models/katello/concerns/smart_proxy_extensions.rb +30 -15
  53. data/app/models/katello/content.rb +15 -0
  54. data/app/models/katello/content_credential.rb +8 -9
  55. data/app/models/katello/content_view.rb +7 -3
  56. data/app/models/katello/content_view_component.rb +4 -0
  57. data/app/models/katello/content_view_version.rb +1 -1
  58. data/app/models/katello/erratum.rb +6 -2
  59. data/app/models/katello/host/content_facet.rb +13 -3
  60. data/app/models/katello/repository.rb +15 -1
  61. data/app/models/katello/root_repository.rb +0 -2
  62. data/app/overrides/add_smart_proxy_form.rb +5 -0
  63. data/app/presenters/katello/content_view_version_compare_presenter.rb +5 -0
  64. data/app/presenters/katello/host_package_presenter.rb +4 -4
  65. data/app/services/katello/pulp3/alternate_content_source.rb +23 -15
  66. data/app/services/katello/pulp3/ansible_collection.rb +7 -10
  67. data/app/services/katello/pulp3/content_view_version/export.rb +19 -6
  68. data/app/services/katello/pulp3/content_view_version/import.rb +2 -0
  69. data/app/services/katello/pulp3/content_view_version/import_validator.rb +21 -5
  70. data/app/services/katello/pulp3/content_view_version/importable_products.rb +11 -1
  71. data/app/services/katello/pulp3/content_view_version/importable_repositories.rb +38 -9
  72. data/app/services/katello/pulp3/content_view_version/metadata_generator.rb +12 -5
  73. data/app/services/katello/pulp3/content_view_version/metadata_map.rb +13 -2
  74. data/app/services/katello/pulp3/content_view_version/syncable_format_export.rb +5 -1
  75. data/app/services/katello/pulp3/pulp_content_unit.rb +3 -0
  76. data/app/services/katello/pulp3/repository.rb +18 -6
  77. data/app/services/katello/pulp3/repository_mirror.rb +0 -1
  78. data/app/services/katello/pulp3/smart_proxy_mirror_repository.rb +2 -2
  79. data/app/services/katello/pulp3/task_group.rb +18 -1
  80. data/app/services/katello/repository_type.rb +5 -2
  81. data/app/services/katello/repository_type_manager.rb +4 -3
  82. data/app/views/dashboard/_content_views_widget.html.erb +1 -1
  83. data/app/views/foreman/job_templates/change_content_source.erb +6 -0
  84. data/app/views/foreman/job_templates/update_packages_by_search_query.erb +7 -1
  85. data/app/views/katello/api/v2/alternate_content_sources/base.json.rabl +4 -4
  86. data/app/views/katello/api/v2/alternate_content_sources/index.json.rabl +1 -0
  87. data/app/views/katello/api/v2/alternate_content_sources/permissions.rabl +11 -0
  88. data/app/views/katello/api/v2/content_credentials/show.json.rabl +12 -0
  89. data/app/views/katello/api/v2/content_views/permissions.rabl +1 -0
  90. data/app/views/katello/api/v2/host_packages/base.json.rabl +1 -1
  91. data/app/views/katello/api/v2/module_streams/show.json.rabl +7 -0
  92. data/app/views/katello/api/v2/repositories/compare.json.rabl +10 -0
  93. data/app/views/katello/api/v2/smart_proxies/pulp_info.json.rabl +1 -0
  94. data/app/views/katello/hosts/_errata_counts.html.erb +46 -0
  95. data/app/views/overrides/activation_keys/_host_synced_content_select.html.erb +1 -0
  96. data/app/views/overrides/smart_proxies/_acs_http_proxy.html.erb +6 -0
  97. data/config/initializers/monkeys.rb +1 -0
  98. data/config/routes/api/v2.rb +2 -0
  99. data/config/routes.rb +3 -0
  100. data/db/migrate/20220730033504_update_custom_cdn.rb +13 -0
  101. data/db/migrate/20220920173656_add_http_proxy_to_smart_proxy.rb +7 -0
  102. data/db/migrate/20220920180858_remove_http_proxy_from_katello_alternate_content_sources.rb +6 -0
  103. data/engines/bastion/app/assets/javascripts/bastion/components/notification.service.js +1 -1
  104. data/engines/bastion/app/views/bastion/layouts/assets.html.erb +5 -5
  105. data/engines/bastion/vendor/assets/javascripts/bastion/angular/angular.js +1 -1
  106. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/content-credential.factory.js +17 -0
  107. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/content-credentials.routes.js +10 -0
  108. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/details/content-credential-acs.controller.js +36 -0
  109. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/details/content-credential-details.controller.js +7 -1
  110. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/details/views/content-credential-acs.html +38 -0
  111. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/details/views/content-credential-details.html +3 -0
  112. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/views/content-credentials.html +7 -2
  113. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content-hosts.controller.js +4 -2
  114. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/views/content-host-info.html +1 -1
  115. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/content-hosts.html +4 -3
  116. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +14 -1392
  117. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/katello-features.run.js +1 -0
  118. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details.controller.js +7 -0
  119. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-details.html +1 -1
  120. data/lib/katello/permission_creator.rb +1 -0
  121. data/lib/katello/plugin.rb +34 -11
  122. data/lib/katello/repository_types/deb.rb +1 -1
  123. data/lib/katello/repository_types/docker.rb +1 -1
  124. data/lib/katello/repository_types/python.rb +3 -3
  125. data/lib/katello/tasks/check_candlepin_content.rake +16 -0
  126. data/lib/katello/tasks/reset.rake +1 -1
  127. data/lib/katello/version.rb +1 -1
  128. data/lib/monkeys/try_pulp_container_path.rb +35 -0
  129. data/locale/action_names.rb +7 -7
  130. data/locale/bn/katello.po +395 -63
  131. data/locale/cs/katello.po +396 -64
  132. data/locale/de/katello.po +399 -67
  133. data/locale/en/katello.po +395 -63
  134. data/locale/es/katello.po +399 -67
  135. data/locale/fr/katello.po +400 -68
  136. data/locale/gu/katello.po +395 -63
  137. data/locale/hi/katello.po +395 -63
  138. data/locale/it/katello.po +396 -64
  139. data/locale/ja/katello.po +400 -68
  140. data/locale/katello.pot +1916 -1213
  141. data/locale/kn/katello.po +395 -63
  142. data/locale/ko/katello.po +396 -64
  143. data/locale/mr/katello.po +395 -63
  144. data/locale/or/katello.po +395 -63
  145. data/locale/pa/katello.po +395 -63
  146. data/locale/pt/katello.po +395 -63
  147. data/locale/pt_BR/katello.po +399 -67
  148. data/locale/ru/katello.po +396 -64
  149. data/locale/ta/katello.po +395 -63
  150. data/locale/te/katello.po +395 -63
  151. data/locale/zh_CN/katello.po +400 -68
  152. data/locale/zh_TW/katello.po +396 -64
  153. data/webpack/components/Bookmark/index.js +5 -1
  154. data/webpack/components/Content/Details/ContentDetails.js +1 -1
  155. data/webpack/components/Content/Details/__tests__/__snapshots__/ContentDetails.test.js.snap +6 -0
  156. data/webpack/components/EditableSwitch.js +1 -0
  157. data/webpack/components/EditableTextInput/EditableTextInput.js +3 -3
  158. data/webpack/components/Errata/errataHelpers.js +33 -0
  159. data/webpack/components/Errata/index.js +45 -12
  160. data/webpack/components/Loading.js +18 -8
  161. data/webpack/components/Packages/index.js +8 -24
  162. data/webpack/components/RoutedTabs/index.js +1 -0
  163. data/webpack/components/Search/Search.js +20 -2
  164. data/webpack/components/Search/__tests__/search.test.js +3 -3
  165. data/webpack/components/Table/EmptyStateMessage.js +1 -1
  166. data/webpack/components/Table/PageControls.js +1 -0
  167. data/webpack/components/Table/TableHooks.js +4 -0
  168. data/webpack/components/Table/TableWrapper.js +7 -7
  169. data/webpack/components/TypeAhead/pf4Search/TypeAheadInput.js +1 -0
  170. data/webpack/components/TypeAhead/pf4Search/TypeAheadItems.js +2 -0
  171. data/webpack/components/TypeAhead/pf4Search/TypeAheadSearch.js +1 -1
  172. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/ChangeHostCVModal.js +3 -1
  173. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/ContentViewDetailsCard.js +2 -1
  174. data/webpack/components/extensions/HostDetails/Cards/ErrataOverviewCard.js +124 -68
  175. data/webpack/components/extensions/HostDetails/Cards/ErrataOverviewCard.scss +5 -0
  176. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsCard.js +30 -4
  177. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsCard.scss +23 -0
  178. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsModal.js +5 -4
  179. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/__tests__/hostCollectionsCard.test.js +25 -10
  180. data/webpack/components/extensions/HostDetails/Cards/SystemPurposeCard/SystemPurposeCard.js +3 -3
  181. data/webpack/components/extensions/HostDetails/Cards/SystemPurposeCard/SystemPurposeEditModal.js +6 -0
  182. data/webpack/components/extensions/HostDetails/Cards/__tests__/errataOverviewCard.test.js +145 -32
  183. data/webpack/components/extensions/HostDetails/DetailsTabCards/RegistrationCard.js +3 -1
  184. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/constants.js +2 -1
  185. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/index.js +1 -0
  186. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab/ErrataTab.js +78 -26
  187. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsTab.js +23 -10
  188. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/HostPackagesConstants.js +1 -0
  189. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackageInstallModal.js +9 -4
  190. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackagesTab.js +141 -23
  191. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackagesTab.scss +6 -1
  192. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionActions.js +9 -8
  193. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab.js +24 -3
  194. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/EnableTracerModal.js +7 -2
  195. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/TracesEnabler.js +2 -1
  196. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/TracesTab.js +20 -4
  197. data/webpack/components/extensions/HostDetails/Tabs/__tests__/errataTab.test.js +56 -38
  198. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packages.fixtures.json +3 -3
  199. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packagesTab.test.js +5 -4
  200. data/webpack/components/extensions/HostDetails/Tabs/customizedRexUrlHelpers.js +3 -3
  201. data/webpack/containers/Application/config.js +2 -2
  202. data/webpack/containers/Application/overrides.scss +12 -0
  203. data/webpack/global_test_setup.js +19 -1
  204. data/webpack/ouia_id_check.js +0 -2
  205. data/webpack/redux/actions/RedHatRepositories/helpers.js +4 -8
  206. data/webpack/scenes/AlternateContentSources/ACSActions.js +37 -6
  207. data/webpack/scenes/AlternateContentSources/ACSConstants.js +2 -0
  208. data/webpack/scenes/AlternateContentSources/ACSIndexPage.js +1 -1
  209. data/webpack/scenes/AlternateContentSources/ACSSelectors.js +6 -6
  210. data/webpack/scenes/AlternateContentSources/Acs.scss +3 -0
  211. data/webpack/scenes/AlternateContentSources/Create/ACSCreateWizard.js +24 -3
  212. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSCreateFinish.js +10 -8
  213. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSCredentials.js +25 -4
  214. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSReview.js +22 -11
  215. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSSmartProxies.js +27 -2
  216. data/webpack/scenes/AlternateContentSources/Create/Steps/AcsUrlPaths.js +49 -17
  217. data/webpack/scenes/AlternateContentSources/Create/Steps/SelectSource.js +76 -23
  218. data/webpack/scenes/AlternateContentSources/Create/__tests__/acsCreate.test.js +159 -11
  219. data/webpack/scenes/AlternateContentSources/Details/ACSExpandableDetails.js +83 -29
  220. data/webpack/scenes/AlternateContentSources/Details/EditModals/ACSEditCredentials.js +9 -8
  221. data/webpack/scenes/AlternateContentSources/Details/EditModals/ACSEditDetails.js +2 -2
  222. data/webpack/scenes/AlternateContentSources/Details/EditModals/ACSEditProducts.js +2 -2
  223. data/webpack/scenes/AlternateContentSources/Details/EditModals/ACSEditSmartProxies.js +39 -7
  224. data/webpack/scenes/AlternateContentSources/Details/EditModals/ACSEditURLPaths.js +27 -11
  225. data/webpack/scenes/AlternateContentSources/Details/__tests__/ACSEdits.test.js +58 -55
  226. data/webpack/scenes/AlternateContentSources/Details/__tests__/ACSExpandableDetails.test.js +35 -32
  227. data/webpack/scenes/AlternateContentSources/MainTable/ACSTable.js +323 -150
  228. data/webpack/scenes/AlternateContentSources/MainTable/__tests__/acsIndex.fixtures.json +5 -1
  229. data/webpack/scenes/AlternateContentSources/MainTable/__tests__/acsTable.test.js +10 -11
  230. data/webpack/scenes/AlternateContentSources/helpers.js +26 -0
  231. data/webpack/scenes/ContentViews/ContentViewsConstants.js +1 -0
  232. data/webpack/scenes/ContentViews/ContentViewsPage.js +1 -1
  233. data/webpack/scenes/ContentViews/Copy/CopyContentViewForm.js +1 -0
  234. data/webpack/scenes/ContentViews/Copy/CopyContentViewModal.js +1 -0
  235. data/webpack/scenes/ContentViews/Create/ContentViewFormComponents.js +10 -5
  236. data/webpack/scenes/ContentViews/Create/CreateContentViewForm.js +30 -7
  237. data/webpack/scenes/ContentViews/Create/CreateContentViewModal.js +1 -0
  238. data/webpack/scenes/ContentViews/Create/__tests__/createContentView.test.js +21 -6
  239. data/webpack/scenes/ContentViews/Delete/Steps/CVDeleteEnvironmentsSelection.js +3 -3
  240. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionReassignActivationKeysForm.js +1 -0
  241. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionReassignHostsForm.js +1 -0
  242. data/webpack/scenes/ContentViews/Delete/__tests__/CvData.fixtures.json +2 -0
  243. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewAddModal.js +3 -0
  244. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewBulkAddModal.js +4 -1
  245. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentVersion.js +1 -1
  246. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ContentViewComponents.js +2 -1
  247. data/webpack/scenes/ContentViews/Details/ContentViewDetailActions.js +14 -0
  248. data/webpack/scenes/ContentViews/Details/ContentViewDetailSelectors.js +11 -1
  249. data/webpack/scenes/ContentViews/Details/ContentViewDetails.js +1 -1
  250. data/webpack/scenes/ContentViews/Details/ContentViewInfo.js +2 -0
  251. data/webpack/scenes/ContentViews/Details/Filters/Add/CVFilterAddModal.js +5 -0
  252. data/webpack/scenes/ContentViews/Details/Filters/AffectedRepositories/AffectedRepositorySelection.js +1 -0
  253. data/webpack/scenes/ContentViews/Details/Filters/ArtifactsWithNoErrata.js +1 -0
  254. data/webpack/scenes/ContentViews/Details/Filters/CVContainerImageFilterContent.js +8 -2
  255. data/webpack/scenes/ContentViews/Details/Filters/CVDebFilterContent.js +5 -1
  256. data/webpack/scenes/ContentViews/Details/Filters/CVErrataDateFilterContent.js +22 -6
  257. data/webpack/scenes/ContentViews/Details/Filters/CVErrataIDFilterContent.js +19 -9
  258. data/webpack/scenes/ContentViews/Details/Filters/CVModuleStreamFilterContent.js +9 -2
  259. data/webpack/scenes/ContentViews/Details/Filters/CVPackageGroupFilterContent.js +9 -2
  260. data/webpack/scenes/ContentViews/Details/Filters/CVRpmFilterContent.js +8 -2
  261. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilterDetailsHeader.js +1 -1
  262. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilters.js +2 -1
  263. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/CVRpmMatchContentModal.js +3 -2
  264. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/__tests__/CVRpmMatchContentModal.test.js +1 -1
  265. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVContainerImageFilterContent.test.js +2 -2
  266. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVRpmFilterContent.test.js +1 -1
  267. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilterDetails.test.js +1 -1
  268. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilters.test.js +1 -1
  269. data/webpack/scenes/ContentViews/Details/Histories/ContentViewHistories.js +2 -2
  270. data/webpack/scenes/ContentViews/Details/Promote/ContentViewVersionPromote.js +2 -0
  271. data/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js +2 -1
  272. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/Steps/ReviewEnvironments.js +3 -3
  273. data/webpack/scenes/ContentViews/Details/Versions/Compare/CVVersionCompare.js +9 -1
  274. data/webpack/scenes/ContentViews/Details/Versions/Compare/CVVersionCompareConfig.js +83 -0
  275. data/webpack/scenes/ContentViews/Details/Versions/Compare/CVVersionCompareTable.js +32 -8
  276. data/webpack/scenes/ContentViews/Details/Versions/Compare/__tests__/CVVersionCompare.test.js +56 -3
  277. data/webpack/scenes/ContentViews/Details/Versions/Compare/__tests__/cvCompareRepositories.fixtures.json +175 -0
  278. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersions.js +6 -2
  279. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVEnvironmentSelectionForm.js +3 -3
  280. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVReassignActivationKeysForm.js +1 -0
  281. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVReassignHostsForm.js +1 -0
  282. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedActivationKeys.js +2 -2
  283. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedHosts.js +2 -2
  284. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailConfig.js +2 -2
  285. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetails.js +1 -0
  286. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsHeader.js +4 -1
  287. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsTable.js +5 -4
  288. data/webpack/scenes/ContentViews/Publish/CVPublishForm.js +5 -1
  289. data/webpack/scenes/ContentViews/Publish/CVPublishReview.js +3 -3
  290. data/webpack/scenes/ContentViews/Table/ContentViewsTable.js +10 -5
  291. data/webpack/scenes/ContentViews/__tests__/basicContentViews.fixtures.js +2 -0
  292. data/webpack/scenes/ContentViews/__tests__/contentViewList.fixtures.json +1 -0
  293. data/webpack/scenes/ContentViews/__tests__/contentViewPage.test.js +81 -19
  294. data/webpack/scenes/ContentViews/components/CVBreadCrumb.js +1 -1
  295. data/webpack/scenes/ContentViews/components/EnvironmentPaths/EnvironmentPaths.js +1 -0
  296. data/webpack/scenes/ContentViews/components/InactiveText.js +9 -1
  297. data/webpack/scenes/ContentViews/expansions/RelatedCompositeContentViewsModal.js +4 -2
  298. data/webpack/scenes/ContentViews/expansions/RelatedContentViewComponentsModal.js +3 -2
  299. data/webpack/scenes/Hosts/ChangeContentSource/actions.js +18 -11
  300. data/webpack/scenes/Hosts/ChangeContentSource/components/ContentSourceForm.js +15 -8
  301. data/webpack/scenes/Hosts/ChangeContentSource/components/FormField.js +3 -4
  302. data/webpack/scenes/Hosts/ChangeContentSource/components/Hosts.js +55 -0
  303. data/webpack/scenes/Hosts/ChangeContentSource/components/HostsModal.js +59 -0
  304. data/webpack/scenes/Hosts/ChangeContentSource/constants.js +1 -0
  305. data/webpack/scenes/Hosts/ChangeContentSource/helpers.js +2 -5
  306. data/webpack/scenes/Hosts/ChangeContentSource/index.js +46 -41
  307. data/webpack/scenes/Hosts/ChangeContentSource/selectors.js +5 -5
  308. data/webpack/scenes/ModuleStreams/Details/ModuleDetailsSchema.js +10 -1
  309. data/webpack/scenes/ModuleStreams/Details/ModuleStreamDetails.js +1 -1
  310. data/webpack/scenes/ModuleStreams/Details/__tests__/__snapshots__/ModuleStreamDetails.test.js.snap +97 -2
  311. data/webpack/scenes/Organizations/OrganizationSelectors.js +1 -0
  312. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnConfigurationConstants.js +2 -1
  313. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnTypeForm.js +10 -25
  314. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CustomCdnTypeForm.js +154 -0
  315. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/ExportSyncForm.js +4 -4
  316. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/NetworkSyncForm.js +59 -44
  317. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/CdnTypeForm.test.js +3 -28
  318. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/CustomCdnTypeForm.test.js +97 -0
  319. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/ExportSyncForm.test.js +1 -1
  320. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/NetworkSyncForm.test.js +4 -4
  321. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/index.js +23 -10
  322. data/webpack/scenes/Subscriptions/Manifest/ManageManifestModal.js +1 -1
  323. data/webpack/scenes/Subscriptions/SubscriptionConstants.js +2 -1
  324. data/webpack/scenes/Subscriptions/SubscriptionsPage.js +5 -5
  325. data/webpack/scenes/Subscriptions/UpstreamSubscriptions/UpstreamSubscriptionsPage.js +3 -3
  326. data/webpack/scenes/Subscriptions/UpstreamSubscriptions/__tests__/__snapshots__/UpstreamSubscriptionsPage.test.js.snap +2 -2
  327. data/webpack/scenes/Subscriptions/__tests__/__snapshots__/SubscriptionsPage.test.js.snap +3 -3
  328. data/webpack/scenes/Subscriptions/components/SubscriptionsToolbar/SubscriptionsToolbar.js +3 -3
  329. data/webpack/scenes/Tasks/helpers.js +14 -7
  330. metadata +54 -35
  331. data/app/lib/actions/pulp3/orchestration/alternate_content_source/refresh_remote.rb +0 -18
  332. data/db/migrate/20221206170122_update_ignore_srpm_to_false_for_mirror_complete.rb +0 -5
  333. data/vendor/assets/javascripts/katello/jquery.trunk8.js +0 -203
@@ -109,7 +109,12 @@ const CVErrataDateFilterContent = ({
109
109
  const invalidDateFormat = __('Enter a valid date: MM/DD/YYYY');
110
110
 
111
111
  return (
112
- <Tabs className="margin-0-24" activeKey={activeTabKey} onSelect={(_event, eventKey) => setActiveTabKey(eventKey)}>
112
+ <Tabs
113
+ className="margin-0-24"
114
+ ouiaId="errata-date-filter-tabs"
115
+ activeKey={activeTabKey}
116
+ onSelect={(_event, eventKey) => setActiveTabKey(eventKey)}
117
+ >
113
118
  <Tab eventKey={0} title={<TabTitleText>{tabTitle}</TabTitleText>}>
114
119
  <div className="margin-24">
115
120
  <Form onSubmit={(e) => {
@@ -125,6 +130,7 @@ const CVErrataDateFilterContent = ({
125
130
  onSelect={(_event, selection) => onTypeSelect(selection)}
126
131
  selections={selectedTypes}
127
132
  isOpen={typeSelectOpen}
133
+ ouiaId="errata-type-selector"
128
134
  placeholderText={__('Errata type')}
129
135
  isCheckboxSelectionBadgeHidden
130
136
  >
@@ -180,6 +186,7 @@ const CVErrataDateFilterContent = ({
180
186
  isOpen={dateTypeSelectOpen}
181
187
  onToggle={setDateTypeSelectOpen}
182
188
  id="date_type_selector"
189
+ ouiaId="date_type_selector"
183
190
  name="date_type_selector"
184
191
  aria-label="date_type_selector"
185
192
  isDisabled={!hasPermission(permissions, 'edit_content_views')}
@@ -207,7 +214,7 @@ const CVErrataDateFilterContent = ({
207
214
  </FlexItem>
208
215
  <FlexItem spacer={{ default: 'spacerNone' }}>
209
216
  <Bullseye style={{ padding: '0 5px' }}>
210
- <Text>{__('to')}</Text>
217
+ <Text ouiaId="to-text">{__('to')}</Text>
211
218
  </Bullseye>
212
219
  </FlexItem>
213
220
  <FlexItem span={2}>
@@ -230,9 +237,10 @@ const CVErrataDateFilterContent = ({
230
237
  </Flex>
231
238
  <Flex>
232
239
  <FlexItem>
233
- <ChipGroup categoryName={__('Type')}>
240
+ <ChipGroup ouiaId="chipgroup-type" categoryName={__('Type')}>
234
241
  {selectedTypes.map(type => (
235
242
  <Chip
243
+ ouiaId={type}
236
244
  key={type}
237
245
  onClick={() => onTypeSelect(type)}
238
246
  isReadOnly={singleSelection(type) || !hasPermission(permissions, 'edit_content_views')}
@@ -243,12 +251,20 @@ const CVErrataDateFilterContent = ({
243
251
  </ChipGroup>
244
252
  </FlexItem>
245
253
  <FlexItem>
246
- <ChipGroup categoryName={dateType === 'issued' ? __('Issued from') : __('Updated from')}>
247
- <Chip key="startDate" onClick={() => setStartDate('')} isReadOnly={!startDate || !hasPermission(permissions, 'edit_content_views')}>
254
+ <ChipGroup
255
+ ouiaId="chip-issued"
256
+ categoryName={dateType === 'issued' ? __('Issued from') : __('Updated from')}
257
+ >
258
+ <Chip
259
+ ouiaId="startDate"
260
+ key="startDate"
261
+ onClick={() => setStartDate('')}
262
+ isReadOnly={!startDate || !hasPermission(permissions, 'edit_content_views')}
263
+ >
248
264
  {startDate || __('ANY')}
249
265
  </Chip>
250
266
  {__('to')}
251
- <Chip key="endDate" onClick={() => setEndDate('')} isReadOnly={!endDate || !hasPermission(permissions, 'edit_content_views')}>
267
+ <Chip ouiaId="startDate" key="endDate" onClick={() => setEndDate('')} isReadOnly={!endDate || !hasPermission(permissions, 'edit_content_views')}>
252
268
  {endDate || __('ANY')}
253
269
  </Chip>
254
270
  </ChipGroup>
@@ -247,7 +247,12 @@ const CVErrataIDFilterContent = ({
247
247
  const invalidDateFormat = __('Enter a valid date: MM/DD/YYYY');
248
248
 
249
249
  return (
250
- <Tabs className="margin-0-24" activeKey={activeTabKey} onSelect={(_event, eventKey) => setActiveTabKey(eventKey)}>
250
+ <Tabs
251
+ className="margin-0-24"
252
+ ouiaId="errata-filter-tabs"
253
+ activeKey={activeTabKey}
254
+ onSelect={(_event, eventKey) => setActiveTabKey(eventKey)}
255
+ >
251
256
  <Tab eventKey={0} title={<TabTitleText>{__('Errata')}</TabTitleText>}>
252
257
  <div className="margin-24-0">
253
258
  <TableWrapper
@@ -286,11 +291,13 @@ const CVErrataIDFilterContent = ({
286
291
  setSelected={setStatusSelected}
287
292
  placeholderText={__('Status')}
288
293
  aria-label="status_selector"
294
+ ouiaId="status-selector"
289
295
  />
290
296
  </SplitItem>
291
297
  <SplitItem>
292
298
  <Select
293
299
  aria-label="errata_type_selector"
300
+ ouiaId="errata_type_selector"
294
301
  variant={SelectVariant.checkbox}
295
302
  onToggle={setTypeSelectOpen}
296
303
  onSelect={(_event, selection) => onTypeSelect(selection)}
@@ -328,9 +335,10 @@ const CVErrataIDFilterContent = ({
328
335
  <Dropdown
329
336
  toggle={<KebabToggle aria-label="bulk_actions" onToggle={toggleBulkAction} />}
330
337
  isOpen={bulkActionOpen}
338
+ ouiaId="cv-errata-id-bulk-action-dropdown"
331
339
  isPlain
332
340
  dropdownItems={[
333
- <DropdownItem aria-label="bulk_remove" key="bulk_remove" isDisabled={!hasAddedSelected} component="button" onClick={bulkRemove}>
341
+ <DropdownItem ouiaId="bulk-remove" aria-label="bulk_remove" key="bulk_remove" isDisabled={!hasAddedSelected} component="button" onClick={bulkRemove}>
334
342
  {__('Remove')}
335
343
  </DropdownItem>]
336
344
  }
@@ -353,6 +361,7 @@ const CVErrataIDFilterContent = ({
353
361
  onToggle={setDateTypeSelectOpen}
354
362
  id="date_type_selector"
355
363
  name="date_type_selector"
364
+ ouiaId="date_type_selector"
356
365
  aria-label="date_type_selector"
357
366
  >
358
367
  <SelectOption key="issued" value="issued">{__('Issued from')}</SelectOption>
@@ -377,7 +386,7 @@ const CVErrataIDFilterContent = ({
377
386
  </FlexItem>
378
387
  <FlexItem spacer={{ default: 'spacerNone' }}>
379
388
  <Bullseye style={{ padding: '0 5px' }}>
380
- <Text>{__('to')}</Text>
389
+ <Text ouiaId="to-text">{__('to')}</Text>
381
390
  </Bullseye>
382
391
  </FlexItem>
383
392
  <FlexItem span={2}>
@@ -399,27 +408,28 @@ const CVErrataIDFilterContent = ({
399
408
  </Flex>
400
409
  <Flex>
401
410
  <FlexItem>
402
- <ChipGroup categoryName={__('Status')}>
403
- <Chip key="status" onClick={() => setStatusSelected(ALL_STATUSES)} isReadOnly={statusSelected === ALL_STATUSES}>
411
+ <ChipGroup ouiaId="status-chipgroup" categoryName={__('Status')}>
412
+ <Chip ouiaId="status" key="status" onClick={() => setStatusSelected(ALL_STATUSES)} isReadOnly={statusSelected === ALL_STATUSES}>
404
413
  {statusSelected}
405
414
  </Chip>
406
415
  </ChipGroup>
407
416
  </FlexItem>
408
417
  <FlexItem>
409
- <ChipGroup categoryName={dateType === 'issued' ? __('Issued from') : __('Updated from')}>
410
- <Chip key="startDate" onClick={() => setValidStartDate('')} isReadOnly={startDate === ''}>
418
+ <ChipGroup ouiaId="issued-chipgroup" categoryName={dateType === 'issued' ? __('Issued from') : __('Updated from')}>
419
+ <Chip ouiaId="startDate" key="startDate" onClick={() => setValidStartDate('')} isReadOnly={startDate === ''}>
411
420
  {startDate || __('ANY')}
412
421
  </Chip>
413
422
  {__('to')}
414
- <Chip key="endDate" onClick={() => setValidEndDate('')} isReadOnly={endDate === ''}>
423
+ <Chip ouiaId="endDate" key="endDate" onClick={() => setValidEndDate('')} isReadOnly={endDate === ''}>
415
424
  {endDate || __('ANY')}
416
425
  </Chip>
417
426
  </ChipGroup>
418
427
  </FlexItem>
419
428
  <FlexItem>
420
- <ChipGroup categoryName={__('Type')}>
429
+ <ChipGroup ouiaId="type-chipgroup" categoryName={__('Type')}>
421
430
  {selectedTypes.map(type => (
422
431
  <Chip
432
+ ouiaId={`chip-${type}`}
423
433
  key={type}
424
434
  onClick={() => onTypeSelect(type)}
425
435
  isReadOnly={singleSelection(type)}
@@ -202,7 +202,12 @@ const CVModuleStreamFilterContent = ({
202
202
 
203
203
 
204
204
  return (
205
- <Tabs className="margin-0-24" activeKey={activeTabKey} onSelect={(_event, eventKey) => setActiveTabKey(eventKey)}>
205
+ <Tabs
206
+ className="margin-0-24"
207
+ ouiaId="module-stream-filter-content-tabs"
208
+ activeKey={activeTabKey}
209
+ onSelect={(_event, eventKey) => setActiveTabKey(eventKey)}
210
+ >
206
211
  <Tab eventKey={0} title={<TabTitleText>{__('Module Streams')}</TabTitleText>}>
207
212
  <div className="margin-24-0">
208
213
  <TableWrapper
@@ -235,6 +240,7 @@ const CVModuleStreamFilterContent = ({
235
240
  <Select
236
241
  variant={SelectVariant.single}
237
242
  onToggle={setSelectOpen}
243
+ ouiaId="added-notAdded-selector"
238
244
  onSelect={(_event, selection) => {
239
245
  setSelectedIndex(allAddedNotAdded.indexOf(selection));
240
246
  setSelectOpen(false);
@@ -262,9 +268,10 @@ const CVModuleStreamFilterContent = ({
262
268
  <Dropdown
263
269
  toggle={<KebabToggle aria-label="bulk_actions" onToggle={toggleBulkAction} />}
264
270
  isOpen={bulkActionOpen}
271
+ ouiaId="bulk-actions-dropdown"
265
272
  isPlain
266
273
  dropdownItems={[
267
- <DropdownItem aria-label="bulk_remove" key="bulk_remove" isDisabled={!hasAddedSelected} component="button" onClick={bulkRemove}>
274
+ <DropdownItem ouiaId="bulk-remove" aria-label="bulk_remove" key="bulk_remove" isDisabled={!hasAddedSelected} component="button" onClick={bulkRemove}>
268
275
  {__('Remove')}
269
276
  </DropdownItem>]
270
277
  }
@@ -191,7 +191,12 @@ const CVPackageGroupFilterContent = ({
191
191
  const resetFilters = () => setSelectedIndex(0);
192
192
 
193
193
  return (
194
- <Tabs className="margin-0-24" activeKey={activeTabKey} onSelect={(_event, eventKey) => setActiveTabKey(eventKey)}>
194
+ <Tabs
195
+ ouiaId="cv-package-group-filter-content"
196
+ className="margin-0-24"
197
+ activeKey={activeTabKey}
198
+ onSelect={(_event, eventKey) => setActiveTabKey(eventKey)}
199
+ >
195
200
  <Tab eventKey={0} title={<TabTitleText>{__('Package groups')}</TabTitleText>}>
196
201
  <div className="margin-24-0">
197
202
  <TableWrapper
@@ -224,6 +229,7 @@ const CVPackageGroupFilterContent = ({
224
229
  <Select
225
230
  variant={SelectVariant.single}
226
231
  onToggle={setSelectOpen}
232
+ ouiaId="allAddedNotAdded"
227
233
  onSelect={(_event, selection) => {
228
234
  setSelectedIndex(allAddedNotAdded.indexOf(selection));
229
235
  setSelectOpen(false);
@@ -251,9 +257,10 @@ const CVPackageGroupFilterContent = ({
251
257
  <Dropdown
252
258
  toggle={<KebabToggle aria-label="bulk_actions" onToggle={toggleBulkAction} />}
253
259
  isOpen={bulkActionOpen}
260
+ ouiaId="cv-package-group-filter-bulk-actions-dropdown"
254
261
  isPlain
255
262
  dropdownItems={[
256
- <DropdownItem aria-label="bulk_remove" key="bulk_remove" isDisabled={!hasAddedSelected} component="button" onClick={bulkRemove}>
263
+ <DropdownItem ouiaId="bulk_remove" aria-label="bulk_remove" key="bulk_remove" isDisabled={!hasAddedSelected} component="button" onClick={bulkRemove}>
257
264
  {__('Remove')}
258
265
  </DropdownItem>]
259
266
  }
@@ -157,7 +157,12 @@ const CVRpmFilterContent = ({
157
157
  </Button>);
158
158
 
159
159
  return (
160
- <Tabs className="margin-0-24" activeKey={activeTabKey} onSelect={(_event, eventKey) => setActiveTabKey(eventKey)}>
160
+ <Tabs
161
+ className="margin-0-24"
162
+ ouiaId="cv-rpm-filter-content-tabs"
163
+ activeKey={activeTabKey}
164
+ onSelect={(_event, eventKey) => setActiveTabKey(eventKey)}
165
+ >
161
166
  <Tab eventKey={0} title={<TabTitleText>{tabTitle}</TabTitleText>}>
162
167
  <div className="margin-24-0">
163
168
  <TableWrapper
@@ -205,11 +210,12 @@ const CVRpmFilterContent = ({
205
210
  </SplitItem>
206
211
  <SplitItem>
207
212
  <Dropdown
213
+ ouiaId="rpm-filter-content-bulk-actions"
208
214
  toggle={<KebabToggle aria-label="bulk_actions" onToggle={toggleBulkAction} />}
209
215
  isOpen={bulkActionOpen}
210
216
  isPlain
211
217
  dropdownItems={[
212
- <DropdownItem aria-label="bulk_remove" key="bulk_remove" isDisabled={!hasSelected} component="button" onClick={bulkRemove}>
218
+ <DropdownItem ouiaId="bulk-remove" aria-label="bulk_remove" key="bulk_remove" isDisabled={!hasSelected} component="button" onClick={bulkRemove}>
213
219
  {__('Remove')}
214
220
  </DropdownItem>]
215
221
  }
@@ -90,7 +90,7 @@ const ContentViewFilterDetailsHeader = ({
90
90
  <RepoIcon type={repositoryType} />
91
91
  </SplitItem>
92
92
  <SplitItem>
93
- <Text component={TextVariants.p}>
93
+ <Text ouiaId={`text-${displayedType()}`} component={TextVariants.p}>
94
94
  {displayedType()}
95
95
  </Text>
96
96
  </SplitItem>
@@ -157,9 +157,10 @@ const ContentViewFilters = ({ cvId, details }) => {
157
157
  <Dropdown
158
158
  toggle={<KebabToggle aria-label="bulk_actions" onToggle={toggleBulkAction} />}
159
159
  isOpen={bulkActionOpen}
160
+ ouiaId="cv-filters-bulk-action"
160
161
  isPlain
161
162
  dropdownItems={[
162
- <DropdownItem aria-label="bulk_remove" key="bulk_remove" isDisabled={!bulkActionEnabled} component="button" onClick={bulkRemove}>
163
+ <DropdownItem ouiaId="bulk-remove" aria-label="bulk_remove" key="bulk_remove" isDisabled={!bulkActionEnabled} component="button" onClick={bulkRemove}>
163
164
  {__('Remove')}
164
165
  </DropdownItem>]
165
166
  }
@@ -36,6 +36,7 @@ const CVRpmMatchContentModal = ({ filterId, onClose, filterRuleId }) => {
36
36
  return (
37
37
  <Modal
38
38
  title={__('Matching content')}
39
+ ouiaId="rpm-matching-content"
39
40
  variant={ModalVariant.medium}
40
41
  isOpen
41
42
  onClose={onClose}
@@ -58,7 +59,7 @@ const CVRpmMatchContentModal = ({ filterId, onClose, filterRuleId }) => {
58
59
  variant={TableVariant.compact}
59
60
  >
60
61
  <Thead>
61
- <Tr>
62
+ <Tr ouiaId="column-headers">
62
63
  {columnHeaders.map(col =>
63
64
  <Th key={col}>{col}</Th>)}
64
65
  </Tr>
@@ -69,7 +70,7 @@ const CVRpmMatchContentModal = ({ filterId, onClose, filterRuleId }) => {
69
70
  nvra, summary = '-', id,
70
71
  } = result;
71
72
  return (
72
- <Tr key={`${nvra}_${summary}_${id}`}>
73
+ <Tr key={`${nvra}_${summary}_${id}`} ouiaId={`${nvra}_${summary}_${id}`}>
73
74
  <Td>
74
75
  <a rel="noreferrer" target="_blank" href={urlBuilder(`packages/${id}`, '')}>{nvra}</a>
75
76
  </Td>
@@ -73,7 +73,7 @@ test('Can search with filter', async (done) => {
73
73
  expect(queryByText(secondMatchContentName)).toBeInTheDocument();
74
74
  });
75
75
 
76
- fireEvent.change(getByLabelText(/text input for search/i), { target: { value: firstMatchContent.nvra } });
76
+ fireEvent.change(getByLabelText(/text input for search/i), { target: { value: `nvra = ${firstMatchContent.nvra}` } });
77
77
 
78
78
  await patientlyWaitFor(() => {
79
79
  expect(queryByText('Matching content')).toBeInTheDocument();
@@ -179,7 +179,7 @@ test('Can add filter rules', async (done) => {
179
179
  expect(getAllByLabelText('text input for search')[0]).toBeInTheDocument();
180
180
  });
181
181
 
182
- fireEvent.change(getAllByLabelText('text input for search')[0], { target: { value: addedRule.name } });
182
+ fireEvent.change(getAllByLabelText('text input for search')[0], { target: { value: `name = ${addedRule.name}` } });
183
183
 
184
184
  await patientlyWaitFor(() => {
185
185
  expect(getByLabelText('add_edit_filter_rule')).toBeInTheDocument();
@@ -255,7 +255,7 @@ test('Can edit filter rules', async (done) => {
255
255
  fireEvent.click(queryByText('Edit'));
256
256
  });
257
257
 
258
- fireEvent.change(getAllByLabelText('text input for search')[0], { target: { value: addedRule.name } });
258
+ fireEvent.change(getAllByLabelText('text input for search')[0], { target: { value: `name = ${addedRule.name}` } });
259
259
 
260
260
  await patientlyWaitFor(() => {
261
261
  expect(getByLabelText('add_edit_filter_rule')).toBeInTheDocument();
@@ -117,7 +117,7 @@ test('Can search for package rules in package filter details', async (done) => {
117
117
  });
118
118
 
119
119
  // Search and only searched result shows
120
- fireEvent.change(getByLabelText(/text input for search/i), { target: { value: lastPackageRuleName } });
120
+ fireEvent.change(getByLabelText(/text input for search/i), { target: { value: `name = ${lastPackageRuleName}` } });
121
121
  await patientlyWaitFor(() => {
122
122
  expect(getByText(lastPackageRuleName)).toBeInTheDocument();
123
123
  expect(queryByText(firstPackageRuleName)).not.toBeInTheDocument();
@@ -118,7 +118,7 @@ test('Can search for package groups in package group filter', async (done) => {
118
118
  });
119
119
 
120
120
  // Search and only searched result shows
121
- fireEvent.change(getByLabelText(/text input for search/i), { target: { value: lastPackageGroupName } });
121
+ fireEvent.change(getByLabelText(/text input for search/i), { target: { value: `name = ${lastPackageGroupName}` } });
122
122
  await patientlyWaitFor(() => {
123
123
  expect(getByText(lastPackageGroupName)).toBeInTheDocument();
124
124
  expect(queryByText(firstPackageGroupName)).not.toBeInTheDocument();
@@ -88,7 +88,7 @@ test('Can search for filter', async (done) => {
88
88
  // Looking for description because the name is in the search bar and could match
89
89
  await patientlyWaitFor(() => expect(getByText(description)).toBeInTheDocument());
90
90
  // Search for a filter by name
91
- fireEvent.change(getByLabelText(/text input for search/i), { target: { value: name } });
91
+ fireEvent.change(getByLabelText(/text input for search/i), { target: { value: `name = ${name}` } });
92
92
  // Only the first filter should be showing, not the last one
93
93
  await patientlyWaitFor(() => {
94
94
  expect(getByText(description)).toBeInTheDocument();
@@ -87,7 +87,7 @@ const ContentViewHistories = ({ cvId }) => {
87
87
  fetchItems={useCallback(params => getContentViewHistories(cvId, params), [cvId])}
88
88
  >
89
89
  <Thead>
90
- <Tr>
90
+ <Tr ouiaId="column-headers">
91
91
  {columnHeaders.map(col =>
92
92
  <Th key={col}>{col}</Th>)}
93
93
  </Tr>
@@ -103,7 +103,7 @@ const ContentViewHistories = ({ cvId }) => {
103
103
  user,
104
104
  } = history;
105
105
  return (
106
- <Tr key={index}>
106
+ <Tr key={index} ouiaId={`history-row-${index}`}>
107
107
  <Td><LongDateTime date={createdAt} showRelativeTimeTooltip /></Td>
108
108
  <Td>
109
109
  <Link to={`/versions/${versionId}`}>{`Version ${version}`}</Link>
@@ -111,6 +111,7 @@ const ContentViewVersionPromote = ({
111
111
  <Modal
112
112
  title={__(`Promote version ${versionNameToPromote}`)}
113
113
  isOpen
114
+ ouiaId="promote-version"
114
115
  variant={ModalVariant.large}
115
116
  onClose={() => {
116
117
  setIsOpen(false);
@@ -137,6 +138,7 @@ const ContentViewVersionPromote = ({
137
138
  </FormGroup>
138
139
  {!alertDismissed && forcePromote.length > 0 && (
139
140
  <Alert
141
+ ouiaId="force-promotion-alert"
140
142
  variant="info"
141
143
  isInline
142
144
  title={__('Force promotion')}
@@ -301,7 +301,7 @@ const ContentViewRepositories = ({ cvId, details }) => {
301
301
  }
302
302
  >
303
303
  <Thead>
304
- <Tr key="version-header">
304
+ <Tr key="version-header" ouiaId="version-header">
305
305
  {hasPermission(permissions, 'edit_content_views') && <Th key="select-all" />}
306
306
  {columnHeaders.map((title, index) => {
307
307
  if (index === 0) {
@@ -329,6 +329,7 @@ const ContentViewRepositories = ({ cvId, details }) => {
329
329
  <Td>
330
330
  <Checkbox
331
331
  id={id}
332
+ ouiaId={`repository-checkbox-${id}`}
332
333
  isChecked={isSelected(id)}
333
334
  onChange={selected =>
334
335
  selectOne(selected, id, repo)
@@ -64,9 +64,9 @@ export default () => {
64
64
  __('{versionOrVersions} {versionList} will be removed from the listed environment and will no longer be available for promotion.')}
65
65
  />}
66
66
  />
67
- <TableComposable variant={TableVariant.compact}>
67
+ <TableComposable ouiaId="bulk-delete-env-table" variant={TableVariant.compact}>
68
68
  <Thead>
69
- <Tr>
69
+ <Tr ouiaId="bulk-delete-env-header">
70
70
  {columnHeaders.map(col =>
71
71
  <Th key={col}>{col}</Th>)}
72
72
  </Tr>
@@ -80,7 +80,7 @@ export default () => {
80
80
  activation_key_count: akCount,
81
81
  host_count: hostCount,
82
82
  }) => (
83
- <Tr key={`${name}_${id}`}>
83
+ <Tr ouiaId={`${name}_${id}`} key={`${name}_${id}`}>
84
84
  <Td>
85
85
  <Label
86
86
  /* TODO: Add "isCompact" to this on update of patternfly */
@@ -11,6 +11,7 @@ import CVVersionCompareTable from './CVVersionCompareTable';
11
11
  import getContentViewDetails, { getContentViewVersionDetails } from '../../ContentViewDetailActions';
12
12
  import Loading from '../../../../../components/Loading';
13
13
  import './CVVersionCompare.scss';
14
+ import EmptyStateMessage from '../../../../../components/Table/EmptyStateMessage';
14
15
 
15
16
  const CVVersionCompare = ({
16
17
  cvId,
@@ -51,7 +52,7 @@ const CVVersionCompare = ({
51
52
  selectCVVersionDetailsStatus(state, String(getIdFromVersion(versionTwo)
52
53
  ?? initialVersionTwoId), cvId));
53
54
 
54
- const [currentActiveTab, setCurrentActiveTab] = useState(__('RPM packages'));
55
+ const [currentActiveTab, setCurrentActiveTab] = useState(__('Repositories'));
55
56
  const onSelect = (_e, eventKey) => {
56
57
  // This prevents needless pushing on repeated clicks of a tab
57
58
  if (currentActiveTab !== eventKey) {
@@ -126,6 +127,13 @@ const CVVersionCompare = ({
126
127
  </div>
127
128
  </div >) || <Loading />)
128
129
  }
130
+ {!showTabs &&
131
+ <EmptyStateMessage
132
+ title={__('Empty content view versions')}
133
+ body={__('No content in selected versions.')}
134
+ search
135
+ />
136
+ }
129
137
  </>
130
138
  );
131
139
  };
@@ -23,6 +23,8 @@ import {
23
23
  selectDockerTagsComparisonStatus,
24
24
  selectGenericContentComparison,
25
25
  selectGenericContentComparisonStatus,
26
+ selectRepositoriesComparison,
27
+ selectRepositoriesComparisonStatus,
26
28
  } from '../../ContentViewDetailSelectors';
27
29
  import {
28
30
  getPackageGroupsComparison,
@@ -33,9 +35,11 @@ import {
33
35
  getDebPackagesComparison,
34
36
  getDockerTagsComparison,
35
37
  getGenericContentComparison,
38
+ getRepositoriesComparison,
36
39
  } from '../../ContentViewDetailActions';
37
40
 
38
41
  import ContentConfig from '../../../../Content/ContentConfig';
42
+ import RepoIcon from '../../Repositories/RepoIcon';
39
43
 
40
44
  export const TableType = PropTypes.shape({
41
45
  name: PropTypes.string,
@@ -77,6 +81,50 @@ export default ({
77
81
  };
78
82
 
79
83
  return ([
84
+ {
85
+ name: __('Repositories'),
86
+ route: 'repositories',
87
+ getCountKey: (itemVersionOne, itemVersionTwo) =>
88
+ itemVersionOne?.repositories?.length || itemVersionTwo?.repositories?.length,
89
+ responseSelector: state =>
90
+ selectRepositoriesComparison(state, versionOneId, versionTwoId, viewBy),
91
+ statusSelector: state =>
92
+ selectRepositoriesComparisonStatus(state, versionOneId, versionTwoId, viewBy),
93
+ autocompleteEndpoint: '/repositories/auto_complete_search?archived=true',
94
+ fetchItems: params => getRepositoriesComparison(
95
+ versionOneId,
96
+ versionTwoId,
97
+ viewBy,
98
+ params,
99
+ ),
100
+ columnHeaders: [
101
+ {
102
+ title: __('Name'),
103
+ getProperty: item => (
104
+ <a href={urlBuilder(`products/${item?.product?.id}/repositories/${item?.id}`, '')}>
105
+ {item?.name}
106
+ </a>),
107
+ },
108
+ {
109
+ title: __('Type'),
110
+ modifier: 'fitContent',
111
+ getProperty: item => (<RepoIcon type={item?.content_type} />),
112
+ },
113
+ {
114
+ title: __('Product'),
115
+ getProperty: item => (
116
+ <a href={urlBuilder(`products/${item?.product?.id}`, '')}>
117
+ {item?.product?.name}
118
+ </a>),
119
+ },
120
+ { title: __(`Version ${versionOne}`), getProperty: item => compareContent(item, versionOneId) },
121
+ { title: __(`Version ${versionTwo}`), getProperty: item => compareContent(item, versionTwoId) },
122
+ ],
123
+ sortConfig: {
124
+ [__('Name')]: 'name',
125
+ [__('Type')]: 'content_type',
126
+ },
127
+ },
80
128
  {
81
129
  name: __('RPM packages'),
82
130
  getCountKey: (itemVersionOne, itemVersionTwo) =>
@@ -107,6 +155,12 @@ export default ({
107
155
  { title: __(`Version ${versionOne}`), getProperty: item => compareContent(item, versionOneId) },
108
156
  { title: __(`Version ${versionTwo}`), getProperty: item => compareContent(item, versionTwoId) },
109
157
  ],
158
+ sortConfig: {
159
+ [__('Name')]: 'nvra',
160
+ [__('Version')]: 'version',
161
+ [__('Release')]: 'release',
162
+ [__('Arch')]: 'arch',
163
+ },
110
164
  },
111
165
  {
112
166
  name: __('RPM package groups'),
@@ -124,6 +178,9 @@ export default ({
124
178
  { title: __(`Version ${versionOne}`), getProperty: item => compareContent(item, versionOneId) },
125
179
  { title: __(`Version ${versionTwo}`), getProperty: item => compareContent(item, versionTwoId) },
126
180
  ],
181
+ sortConfig: {
182
+ [__('Name')]: 'name',
183
+ },
127
184
  },
128
185
  {
129
186
  name: __('Files'),
@@ -146,6 +203,9 @@ export default ({
146
203
  { title: __(`Version ${versionOne}`), getProperty: item => compareContent(item, versionOneId) },
147
204
  { title: __(`Version ${versionTwo}`), getProperty: item => compareContent(item, versionTwoId) },
148
205
  ],
206
+ sortConfig: {
207
+ [__('Name')]: 'name',
208
+ },
149
209
  },
150
210
  {
151
211
  name: __('Errata'),
@@ -203,6 +263,11 @@ export default ({
203
263
  { title: __(`Version ${versionOne}`), getProperty: item => compareContent(item, versionOneId) },
204
264
  { title: __(`Version ${versionTwo}`), getProperty: item => compareContent(item, versionTwoId) },
205
265
  ],
266
+ sortConfig: {
267
+ [__('Errata ID')]: 'errata_id',
268
+ [__('Title')]: 'title',
269
+ [__('Type')]: 'type',
270
+ },
206
271
  },
207
272
  {
208
273
  name: __('Module streams'),
@@ -229,6 +294,13 @@ export default ({
229
294
  { title: __(`Version ${versionOne}`), getProperty: item => compareContent(item, versionOneId) },
230
295
  { title: __(`Version ${versionTwo}`), getProperty: item => compareContent(item, versionTwoId) },
231
296
  ],
297
+ sortConfig: {
298
+ [__('Name')]: 'name',
299
+ [__('Stream')]: 'stream',
300
+ [__('Version')]: 'version',
301
+ [__('Context')]: 'context',
302
+ [__('Arch')]: 'arch',
303
+ },
232
304
  },
233
305
  {
234
306
  name: __('Deb packages'),
@@ -253,6 +325,11 @@ export default ({
253
325
  { title: __(`Version ${versionOne}`), getProperty: item => compareContent(item, versionOneId) },
254
326
  { title: __(`Version ${versionTwo}`), getProperty: item => compareContent(item, versionTwoId) },
255
327
  ],
328
+ sortConfig: {
329
+ [__('Name')]: 'name',
330
+ [__('Version')]: 'version',
331
+ [__('Architecture')]: 'architecture',
332
+ },
256
333
  },
257
334
  {
258
335
  name: __('Container tags'),
@@ -283,6 +360,9 @@ export default ({
283
360
  { title: __(`Version ${versionOne}`), getProperty: item => compareContent(item, versionOneId) },
284
361
  { title: __(`Version ${versionTwo}`), getProperty: item => compareContent(item, versionTwoId) },
285
362
  ],
363
+ sortConfig: {
364
+ [__('Name')]: 'name',
365
+ },
286
366
  },
287
367
  ...ContentConfig.filter(config => !(config.names.pluralLabel === 'ostree_refs')).map(({
288
368
  names: { pluralLowercase, pluralLabel, singularLabel },
@@ -309,6 +389,9 @@ export default ({
309
389
  { title: __(`Version ${versionOne}`), getProperty: item => compareContent(item, versionOneId) },
310
390
  { title: __(`Version ${versionTwo}`), getProperty: item => compareContent(item, versionTwoId) },
311
391
  ],
392
+ sortConfig: {
393
+ [__('Name')]: 'name',
394
+ },
312
395
  })),
313
396
  ]);
314
397
  };