katello 4.5.1 → 4.6.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 (440) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/katello/api/rhsm/candlepin_dynflow_proxy_controller.rb +10 -0
  3. data/app/controllers/katello/api/v2/activation_keys_controller.rb +7 -0
  4. data/app/controllers/katello/api/v2/alternate_content_sources_controller.rb +52 -22
  5. data/app/controllers/katello/api/v2/content_uploads_controller.rb +2 -0
  6. data/app/controllers/katello/api/v2/content_view_filter_rules_controller.rb +1 -1
  7. data/app/controllers/katello/api/v2/content_view_filters_controller.rb +1 -1
  8. data/app/controllers/katello/api/v2/debs_controller.rb +42 -10
  9. data/app/controllers/katello/api/v2/host_collections_controller.rb +5 -1
  10. data/app/controllers/katello/api/v2/host_errata_controller.rb +1 -0
  11. data/app/controllers/katello/api/v2/host_module_streams_controller.rb +9 -1
  12. data/app/controllers/katello/api/v2/host_subscriptions_controller.rb +8 -1
  13. data/app/controllers/katello/api/v2/organizations_controller.rb +3 -1
  14. data/app/controllers/katello/api/v2/simple_content_access_controller.rb +8 -0
  15. data/app/controllers/katello/concerns/api/v2/repository_content_controller.rb +34 -11
  16. data/app/controllers/katello/concerns/organizations_controller_extensions.rb +7 -16
  17. data/app/lib/actions/katello/alternate_content_source/alternate_content_source_common.rb +16 -0
  18. data/app/lib/actions/katello/alternate_content_source/create.rb +11 -5
  19. data/app/lib/actions/katello/alternate_content_source/destroy.rb +3 -4
  20. data/app/lib/actions/katello/alternate_content_source/refresh.rb +3 -5
  21. data/app/lib/actions/katello/alternate_content_source/update.rb +57 -13
  22. data/app/lib/actions/katello/applicability/hosts/bulk_generate.rb +2 -2
  23. data/app/lib/actions/katello/organization/manifest_refresh.rb +8 -4
  24. data/app/lib/actions/katello/organization/simple_content_access/toggle.rb +1 -9
  25. data/app/lib/actions/katello/repository/create.rb +9 -0
  26. data/app/lib/actions/katello/repository/destroy.rb +21 -0
  27. data/app/lib/actions/katello/repository/errata_mail.rb +3 -3
  28. data/app/lib/actions/katello/repository/refresh_repository.rb +3 -0
  29. data/app/lib/actions/katello/repository/update.rb +33 -0
  30. data/app/lib/actions/katello/repository/update_redhat_repository.rb +1 -1
  31. data/app/lib/actions/pulp3/alternate_content_source/create.rb +5 -4
  32. data/app/lib/actions/pulp3/alternate_content_source/create_remote.rb +5 -4
  33. data/app/lib/actions/pulp3/alternate_content_source/delete.rb +4 -4
  34. data/app/lib/actions/pulp3/alternate_content_source/delete_remote.rb +4 -4
  35. data/app/lib/actions/pulp3/alternate_content_source/refresh.rb +4 -4
  36. data/app/lib/actions/pulp3/alternate_content_source/update.rb +4 -4
  37. data/app/lib/actions/pulp3/alternate_content_source/update_remote.rb +5 -5
  38. data/app/lib/actions/pulp3/capsule_content/reclaim_space.rb +1 -0
  39. data/app/lib/actions/pulp3/orchestration/alternate_content_source/create.rb +3 -3
  40. data/app/lib/actions/pulp3/orchestration/alternate_content_source/delete.rb +6 -7
  41. data/app/lib/actions/pulp3/orchestration/alternate_content_source/refresh.rb +2 -2
  42. data/app/lib/actions/pulp3/orchestration/alternate_content_source/refresh_remote.rb +18 -0
  43. data/app/lib/actions/pulp3/orchestration/alternate_content_source/update.rb +3 -3
  44. data/app/lib/actions/pulp3/orchestration/repository/generate_metadata.rb +1 -1
  45. data/app/lib/katello/concerns/base_template_scope_extensions.rb +1 -1
  46. data/app/lib/katello/errors.rb +1 -1
  47. data/app/lib/katello/resources/candlepin/owner.rb +9 -2
  48. data/app/lib/katello/validators/alternate_content_source_products_validator.rb +17 -0
  49. data/app/models/katello/alternate_content_source.rb +39 -8
  50. data/app/models/katello/alternate_content_source_product.rb +13 -0
  51. data/app/models/katello/concerns/host_managed_extensions.rb +12 -2
  52. data/app/models/katello/concerns/pulp_database_unit.rb +2 -2
  53. data/app/models/katello/concerns/smart_proxy_extensions.rb +5 -6
  54. data/app/models/katello/content_view.rb +4 -0
  55. data/app/models/katello/content_view_deb_filter.rb +51 -0
  56. data/app/models/katello/content_view_deb_filter_rule.rb +24 -0
  57. data/app/models/katello/content_view_filter.rb +10 -3
  58. data/app/models/katello/glue/candlepin/owner.rb +0 -1
  59. data/app/models/katello/installed_package.rb +1 -0
  60. data/app/models/katello/product.rb +3 -0
  61. data/app/models/katello/repository.rb +2 -0
  62. data/app/models/katello/smart_proxy_alternate_content_source.rb +6 -0
  63. data/app/services/cert/certs.rb +8 -16
  64. data/app/services/katello/content_unit_indexer.rb +2 -1
  65. data/app/services/katello/organization_creator.rb +4 -4
  66. data/app/services/katello/pulp/server.rb +2 -2
  67. data/app/services/katello/pulp3/alternate_content_source.rb +22 -4
  68. data/app/services/katello/pulp3/api/apt.rb +12 -0
  69. data/app/services/katello/pulp3/erratum.rb +1 -4
  70. data/app/services/katello/pulp3/repository/apt.rb +186 -2
  71. data/app/services/katello/pulp3/repository.rb +4 -3
  72. data/app/services/katello/pulp3/service_common.rb +1 -1
  73. data/app/services/katello/pulp3/smart_proxy_mirror_repository.rb +1 -1
  74. data/app/views/foreman/smart_proxies/show.html.erb +3 -3
  75. data/app/views/katello/api/v2/alternate_content_sources/base.json.rabl +18 -3
  76. data/app/views/katello/api/v2/alternate_content_sources/show.json.rabl +20 -0
  77. data/app/views/katello/api/v2/ansible_collections/compare.json.rabl +10 -0
  78. data/app/views/katello/api/v2/content_view_filters/base.json.rabl +5 -0
  79. data/app/views/katello/api/v2/module_streams/compare.json.rabl +10 -0
  80. data/app/views/katello/api/v2/repository_sets/show.json.rabl +4 -0
  81. data/app/views/katello/layouts/foreman_with_bastion.html.erb +1 -1
  82. data/app/views/katello/layouts/react.html.erb +1 -1
  83. data/app/views/overrides/organizations/_edit_override.html.erb +5 -8
  84. data/app/views/overrides/organizations/_index_row_override.html.erb +1 -1
  85. data/app/views/overrides/organizations/_step_1_override.html.erb +5 -0
  86. data/ca/redhat-uep.pem +18 -23
  87. data/config/katello.yaml.example +0 -2
  88. data/config/routes/api/v2.rb +2 -0
  89. data/config/routes/overrides.rb +1 -0
  90. data/db/migrate/20201116161820_create_content_view_deb_filter_rules.rb +17 -0
  91. data/db/migrate/20220524132259_remove_last_refreshed_from_katello_alternate_content_sources.rb +5 -0
  92. data/db/migrate/20220601163911_add_vendor_to_katello_installed_packages.rb +5 -0
  93. data/db/migrate/20220610165621_add_repositories_and_products_to_acs.rb +23 -0
  94. data/db/seeds.d/102-organizations.rb +1 -1
  95. data/engines/bastion/app/views/bastion/layouts/application.html.erb +1 -1
  96. data/engines/bastion/app/views/bastion/layouts/application_ie.html.erb +1 -1
  97. data/engines/bastion/app/views/bastion/layouts/assets.html.erb +1 -1
  98. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/details/environment-content.controller.js +2 -0
  99. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/details/environment.controller.js +2 -0
  100. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/details/views/environment-content-views.html +1 -1
  101. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/environments.controller.js +1 -0
  102. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/views/environments.html +3 -3
  103. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +4 -5
  104. data/engines/bastion_katello/lib/bastion_katello/engine.rb +0 -1
  105. data/lib/katello/engine.rb +1 -2
  106. data/lib/katello/permission_creator.rb +2 -2
  107. data/lib/katello/permissions/host_permissions.rb +1 -0
  108. data/lib/katello/plugin.rb +6 -12
  109. data/lib/katello/version.rb +1 -1
  110. data/locale/action_names.rb +49 -46
  111. data/locale/bn/katello.po +361 -53
  112. data/{webpack/scenes/AnsibleCollections/AnsibleCollectionsTables.scss → locale/bn/katello.po.time_stamp} +0 -0
  113. data/locale/cs/katello.po +361 -53
  114. data/locale/cs/katello.po.time_stamp +0 -0
  115. data/locale/de/katello.po +366 -58
  116. data/locale/de/katello.po.time_stamp +0 -0
  117. data/locale/en/katello.po +361 -53
  118. data/locale/en/katello.po.time_stamp +0 -0
  119. data/locale/es/katello.po +364 -56
  120. data/locale/es/katello.po.time_stamp +0 -0
  121. data/locale/fr/katello.po +376 -68
  122. data/locale/fr/katello.po.time_stamp +0 -0
  123. data/locale/gu/katello.po +361 -53
  124. data/locale/gu/katello.po.time_stamp +0 -0
  125. data/locale/hi/katello.po +361 -53
  126. data/locale/hi/katello.po.time_stamp +0 -0
  127. data/locale/it/katello.po +361 -53
  128. data/locale/it/katello.po.time_stamp +0 -0
  129. data/locale/ja/katello.po +374 -66
  130. data/locale/ja/katello.po.time_stamp +0 -0
  131. data/locale/katello.pot +1626 -1079
  132. data/locale/kn/katello.po +361 -53
  133. data/locale/kn/katello.po.time_stamp +0 -0
  134. data/locale/ko/katello.po +361 -53
  135. data/locale/ko/katello.po.time_stamp +0 -0
  136. data/locale/mr/katello.po +361 -53
  137. data/locale/mr/katello.po.time_stamp +0 -0
  138. data/locale/or/katello.po +361 -53
  139. data/locale/or/katello.po.time_stamp +0 -0
  140. data/locale/pa/katello.po +361 -53
  141. data/locale/pa/katello.po.time_stamp +0 -0
  142. data/locale/pt/katello.po +361 -53
  143. data/locale/pt/katello.po.time_stamp +0 -0
  144. data/locale/pt_BR/katello.po +364 -56
  145. data/locale/pt_BR/katello.po.time_stamp +0 -0
  146. data/locale/ru/katello.po +361 -53
  147. data/locale/ru/katello.po.time_stamp +0 -0
  148. data/locale/ta/katello.po +361 -53
  149. data/locale/ta/katello.po.time_stamp +0 -0
  150. data/locale/te/katello.po +361 -53
  151. data/locale/te/katello.po.time_stamp +0 -0
  152. data/locale/zh_CN/katello.po +374 -66
  153. data/locale/zh_CN/katello.po.time_stamp +0 -0
  154. data/locale/zh_TW/katello.po +361 -53
  155. data/locale/zh_TW/katello.po.time_stamp +0 -0
  156. data/package.json +0 -3
  157. data/webpack/components/EditableTextInput/EditableTextInput.js +3 -16
  158. data/webpack/components/EditableTextInput/PencilEditButton.js +33 -0
  159. data/webpack/components/Errata/index.js +18 -3
  160. data/webpack/components/Loading.js +1 -1
  161. data/webpack/components/RoutedTabs/index.js +1 -17
  162. data/webpack/components/Search/Search.js +0 -1
  163. data/webpack/components/Search/__tests__/search.test.js +1 -2
  164. data/webpack/components/SelectAllCheckbox/index.js +7 -4
  165. data/webpack/components/SelectableDropdown/SelectableDropdown.js +1 -0
  166. data/webpack/components/Table/EmptyStateMessage.js +77 -2
  167. data/webpack/components/Table/MainTable.js +46 -4
  168. data/webpack/components/Table/TableHooks.js +9 -6
  169. data/webpack/components/Table/TableWrapper.js +14 -8
  170. data/webpack/components/TypeAhead/TypeAhead.js +26 -11
  171. data/webpack/components/TypeAhead/pf3Search/TypeAheadItems.js +1 -1
  172. data/webpack/components/TypeAhead/pf4Search/TypeAheadInput.js +1 -0
  173. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/ChangeHostCVModal.js +2 -1
  174. data/webpack/components/extensions/HostDetails/Cards/HostCollectionsCard/HostCollectionsModal.js +9 -4
  175. data/webpack/components/extensions/HostDetails/Cards/SystemPurposeCard/SystemPurposeActions.js +37 -0
  176. data/webpack/components/extensions/HostDetails/Cards/SystemPurposeCard/SystemPurposeCard.js +173 -0
  177. data/webpack/components/extensions/HostDetails/Cards/SystemPurposeCard/SystemPurposeCard.scss +6 -0
  178. data/webpack/components/extensions/HostDetails/Cards/SystemPurposeCard/SystemPurposeConstants.js +6 -0
  179. data/webpack/components/extensions/HostDetails/Cards/SystemPurposeCard/SystemPurposeEditModal.js +301 -0
  180. data/webpack/components/extensions/HostDetails/Cards/SystemPurposeCard/SystemPurposeSelectors.js +25 -0
  181. data/webpack/components/extensions/HostDetails/Cards/SystemPurposeCard/__tests__/SystemPurposeCard.test.js +108 -0
  182. data/webpack/components/extensions/HostDetails/Cards/SystemPurposeCard/__tests__/SystemPurposeEditModal.test.js +161 -0
  183. data/webpack/components/extensions/HostDetails/Cards/__tests__/errataOverviewCard.test.js +12 -12
  184. data/webpack/components/extensions/HostDetails/DetailsTabCards/HwPropertiesCard.js +100 -0
  185. data/webpack/components/extensions/HostDetails/DetailsTabCards/SystemPropertiesCardExtensions.js +26 -4
  186. data/webpack/components/extensions/HostDetails/HostDetailsConstants.js +3 -1
  187. data/webpack/components/extensions/HostDetails/HostDetailsReducer.js +14 -0
  188. data/webpack/components/extensions/HostDetails/HostDetailsSelectors.js +8 -2
  189. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab/ErrataTab.js +8 -12
  190. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsTab.js +23 -2
  191. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackagesTab.js +5 -0
  192. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab.js +57 -7
  193. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/TracesTab.js +2 -0
  194. data/webpack/components/extensions/HostDetails/Tabs/__tests__/repositorySets.fixtures.json +3 -0
  195. data/webpack/components/extensions/HostDetails/Tabs/__tests__/repositorySetsTab.test.js +4 -1
  196. data/webpack/components/extensions/HostDetails/Tabs/__tests__/tracesTab.test.js +1 -10
  197. data/webpack/components/extensions/HostDetails/hostDetailsHelpers.js +1 -1
  198. data/webpack/components/extensions/RegistrationCommands/index.js +49 -17
  199. data/webpack/containers/Application/config.js +5 -10
  200. data/webpack/global_index.js +19 -7
  201. data/webpack/global_test_setup.js +14 -2
  202. data/webpack/ouia_id_check.js +95 -0
  203. data/webpack/redux/actions/RedHatRepositories/helpers.js +2 -0
  204. data/webpack/redux/reducers/index.js +2 -4
  205. data/webpack/scenes/AlternateContentSources/ACSActions.js +36 -3
  206. data/webpack/scenes/AlternateContentSources/ACSConstants.js +3 -0
  207. data/webpack/scenes/AlternateContentSources/ACSSelectors.js +15 -6
  208. data/webpack/scenes/AlternateContentSources/Create/ACSCreateWizard.js +73 -42
  209. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSCreateFinish.js +26 -10
  210. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSProducts.js +44 -0
  211. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSReview.js +59 -45
  212. data/webpack/scenes/AlternateContentSources/Create/Steps/ACSSmartProxies.js +2 -1
  213. data/webpack/scenes/AlternateContentSources/Create/Steps/AcsUrlPaths.js +0 -1
  214. data/webpack/scenes/AlternateContentSources/Create/Steps/SelectSource.js +35 -19
  215. data/webpack/scenes/AlternateContentSources/Create/__tests__/acsCreate.test.js +120 -13
  216. data/webpack/scenes/AlternateContentSources/Create/__tests__/products.fixtures.json +92 -0
  217. data/webpack/scenes/AlternateContentSources/Details/ACSExpandableDetails.js +459 -0
  218. data/webpack/scenes/AlternateContentSources/Details/EditModals/ACSEditCredentials.js +354 -0
  219. data/webpack/scenes/AlternateContentSources/Details/EditModals/ACSEditDetails.js +104 -0
  220. data/webpack/scenes/AlternateContentSources/Details/EditModals/ACSEditProducts.js +120 -0
  221. data/webpack/scenes/AlternateContentSources/Details/EditModals/ACSEditSmartProxies.js +118 -0
  222. data/webpack/scenes/AlternateContentSources/Details/EditModals/ACSEditURLPaths.js +118 -0
  223. data/webpack/scenes/AlternateContentSources/Details/__tests__/ACSEdits.test.js +242 -0
  224. data/webpack/scenes/AlternateContentSources/Details/__tests__/ACSExpandableDetails.test.js +106 -0
  225. data/webpack/scenes/AlternateContentSources/Details/__tests__/acsDetails.fixtures.json +49 -0
  226. data/webpack/scenes/AlternateContentSources/Details/__tests__/acsProducts.fixtures.json +95 -0
  227. data/webpack/scenes/AlternateContentSources/Details/__tests__/simplifiedAcsDetails.fixtures.json +39 -0
  228. data/webpack/scenes/AlternateContentSources/MainTable/ACSTable.js +215 -87
  229. data/webpack/scenes/AlternateContentSources/MainTable/ACSTable.scss +3 -0
  230. data/webpack/scenes/AlternateContentSources/MainTable/__tests__/acsTable.test.js +1 -2
  231. data/webpack/scenes/Content/__tests__/contentTable.test.js +1 -2
  232. data/webpack/scenes/ContentViews/ContentViewsConstants.js +15 -4
  233. data/webpack/scenes/ContentViews/Delete/__tests__/contentViewDelete.test.js +1 -2
  234. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ContentViewComponents.js +2 -0
  235. data/webpack/scenes/ContentViews/Details/ComponentContentViews/__tests__/contentViewComponents.test.js +1 -2
  236. data/webpack/scenes/ContentViews/Details/ContentViewDetailActions.js +113 -0
  237. data/webpack/scenes/ContentViews/Details/ContentViewDetailSelectors.js +89 -0
  238. data/webpack/scenes/ContentViews/Details/Filters/Add/CVFilterAddModal.js +32 -9
  239. data/webpack/scenes/ContentViews/Details/Filters/Add/__tests__/cvFilterAdd.test.js +13 -3
  240. data/webpack/scenes/ContentViews/Details/Filters/CVContainerImageFilterContent.js +39 -27
  241. data/webpack/scenes/ContentViews/Details/Filters/CVDebFilterContent.js +236 -0
  242. data/webpack/scenes/ContentViews/Details/Filters/CVErrataIDFilterContent.js +1 -0
  243. data/webpack/scenes/ContentViews/Details/Filters/CVFilterDetailType.js +10 -0
  244. data/webpack/scenes/ContentViews/Details/Filters/CVModuleStreamFilterContent.js +3 -0
  245. data/webpack/scenes/ContentViews/Details/Filters/CVPackageGroupFilterContent.js +3 -1
  246. data/webpack/scenes/ContentViews/Details/Filters/CVRpmFilterContent.js +17 -4
  247. data/webpack/scenes/ContentViews/Details/Filters/ContentType.js +1 -0
  248. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilters.js +34 -22
  249. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/CVDebMatchContentModal.js +97 -0
  250. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/__tests__/CVRpmMatchContentModal.test.js +1 -2
  251. data/webpack/scenes/ContentViews/Details/Filters/Rules/DebPackage/AddEditDebPackageRuleModal.js +128 -0
  252. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVContainerImageFilterContent.test.js +56 -3
  253. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVRpmFilterContent.test.js +62 -8
  254. data/webpack/scenes/ContentViews/Details/Filters/__tests__/ContentViewPackageGroupFilter.test.js +1 -5
  255. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilterDetails.test.js +1 -2
  256. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilters.test.js +32 -2
  257. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvErrataIDFilter.test.js +1 -2
  258. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvModuleStreamFilter.test.js +1 -2
  259. data/webpack/scenes/ContentViews/Details/Filters/__tests__/emptyCVContainerImageFilterContent.fixtures.json +13 -0
  260. data/webpack/scenes/ContentViews/Details/Filters/__tests__/emptyCVPackageFilterRules.fixtures.json +13 -0
  261. data/webpack/scenes/ContentViews/Details/Filters/__tests__/emptyContentViewFilters.fixtures.json +13 -0
  262. data/webpack/scenes/ContentViews/Details/Histories/__tests__/contentViewHistory.test.js +1 -2
  263. data/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js +5 -1
  264. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewAddRemove.test.js +1 -2
  265. data/webpack/scenes/ContentViews/Details/Versions/BulkDelete/__tests__/BulkDeleteModal.test.js +3 -0
  266. data/webpack/scenes/ContentViews/Details/Versions/Compare/CVVersionCompare.js +143 -0
  267. data/webpack/scenes/ContentViews/Details/Versions/Compare/CVVersionCompare.scss +51 -0
  268. data/webpack/scenes/ContentViews/Details/Versions/Compare/CVVersionCompareConfig.js +314 -0
  269. data/webpack/scenes/ContentViews/Details/Versions/Compare/CVVersionCompareHeader.js +186 -0
  270. data/webpack/scenes/ContentViews/Details/Versions/Compare/CVVersionCompareTable.js +74 -0
  271. data/webpack/scenes/ContentViews/Details/Versions/Compare/__tests__/AnsibleCollectionsCompareAllContentData.fixtures.json +63 -0
  272. data/webpack/scenes/ContentViews/Details/Versions/Compare/__tests__/CVVersionCompare.test.js +657 -0
  273. data/webpack/scenes/ContentViews/Details/Versions/Compare/__tests__/CVVersionEmptyContentCompareData.fixtures.json +14 -0
  274. data/webpack/scenes/ContentViews/Details/Versions/Compare/__tests__/ContainerTagsCompareAllContentData.fixtures.json +95 -0
  275. data/webpack/scenes/ContentViews/Details/Versions/Compare/__tests__/DebPackagesCompareAllContentData.fixtures.json +87 -0
  276. data/webpack/scenes/ContentViews/Details/Versions/Compare/__tests__/ErrataCompareAllContentData.fixtures.json +319 -0
  277. data/webpack/scenes/ContentViews/Details/Versions/Compare/__tests__/ErrataCompareThreeContentTypesData.fixtures.json +131 -0
  278. data/webpack/scenes/ContentViews/Details/Versions/Compare/__tests__/FilesCompareAllContentData.fixtures.json +51 -0
  279. data/webpack/scenes/ContentViews/Details/Versions/Compare/__tests__/FilesCompareThreeContentTypesData.fixtures.json +48 -0
  280. data/webpack/scenes/ContentViews/Details/Versions/Compare/__tests__/ModuleStreamsCompareAllContentData.fixtures.json +239 -0
  281. data/webpack/scenes/ContentViews/Details/Versions/Compare/__tests__/PackageGroupsCompareAllContentData.fixtures.json +51 -0
  282. data/webpack/scenes/ContentViews/Details/Versions/Compare/__tests__/PythonPackagesCompareAllContentData.fixtures.json +315 -0
  283. data/webpack/scenes/ContentViews/Details/Versions/Compare/__tests__/RPMPackagesCompareAllContentData.fixtures.json +470 -0
  284. data/webpack/scenes/ContentViews/Details/Versions/Compare/__tests__/RPMPackagesCompareThreeContentTypesData.fixtures.json +475 -0
  285. data/webpack/scenes/ContentViews/Details/Versions/Compare/__tests__/contentViewDetails.fixtures.json +160 -0
  286. data/webpack/scenes/ContentViews/Details/Versions/Compare/__tests__/contentViewVersionOneDetials.fixtures.json +161 -0
  287. data/webpack/scenes/ContentViews/Details/Versions/Compare/__tests__/contentViewVersionThreeDetails.fixtures.json +154 -0
  288. data/webpack/scenes/ContentViews/Details/Versions/Compare/__tests__/contentViewVersionTwoDetails.fixtures.json +211 -0
  289. data/webpack/scenes/ContentViews/Details/Versions/Compare/__tests__/contentViewVersions.fixtures.json +1013 -0
  290. data/webpack/scenes/ContentViews/Details/Versions/Compare/__tests__/emptyStateCVVersionOneDetails.fixtures.json +145 -0
  291. data/webpack/scenes/ContentViews/Details/Versions/Compare/__tests__/emptyStateCVVersionTwoDetails.fixtures.json +145 -0
  292. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersions.js +102 -36
  293. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvVersionRemove.test.js +1 -2
  294. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailConfig.js +4 -2
  295. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetails.test.js +1 -2
  296. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetailsEmpty.test.js +1 -2
  297. data/webpack/scenes/ContentViews/Details/Versions/__tests__/contentViewVersions.test.js +113 -40
  298. data/webpack/scenes/ContentViews/Table/ContentViewsTable.js +96 -81
  299. data/webpack/scenes/ContentViews/__tests__/contentViewPage.test.js +1 -2
  300. data/webpack/scenes/ContentViews/__tests__/mockDetails.fixtures.json +7 -2
  301. data/webpack/scenes/SmartProxy/SmartProxyContentActions.js +1 -1
  302. data/webpack/scenes/Subscriptions/Manifest/ManageManifestModal.js +0 -30
  303. data/webpack/test-utils/nockWrapper.js +7 -0
  304. metadata +100 -145
  305. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/content-views.controller.js +0 -34
  306. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/content-views.routes.js +0 -751
  307. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/deletion/content-view-deletion.controller.js +0 -42
  308. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/deletion/content-view-version-deletion-activation-keys.controller.js +0 -81
  309. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/deletion/content-view-version-deletion-confirm.controller.js +0 -65
  310. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/deletion/content-view-version-deletion-content-hosts.controller.js +0 -82
  311. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/deletion/content-view-version-deletion-environments.controller.js +0 -76
  312. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/deletion/content-view-version-deletion.controller.js +0 -160
  313. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/deletion/views/content-view-deletion.html +0 -58
  314. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/deletion/views/version-deletion-activation-keys.html +0 -94
  315. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/deletion/views/version-deletion-confirm.html +0 -76
  316. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/deletion/views/version-deletion-content-hosts.html +0 -88
  317. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/deletion/views/version-deletion-environments.html +0 -73
  318. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/components/content-view-component.factory.js +0 -32
  319. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/components/content-view-composite-available-content-views.controller.js +0 -75
  320. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/components/content-view-composite-content-views-list.controller.js +0 -68
  321. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/components/views/content-view-composite-available-content-views.html +0 -81
  322. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/components/views/content-view-composite-content-views-list.html +0 -81
  323. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/components/views/content-view-composite.html +0 -24
  324. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/content-view-available-deb-repositories.controller.js +0 -50
  325. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/content-view-available-docker-repositories.controller.js +0 -42
  326. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/content-view-available-file-repositories.controller.js +0 -50
  327. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/content-view-available-ostree-repositories.controller.js +0 -42
  328. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/content-view-available-repositories.controller.js +0 -45
  329. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/content-view-deb-repositories-list.controller.js +0 -48
  330. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/content-view-details.controller.js +0 -100
  331. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/content-view-docker-repositories-list.controller.js +0 -49
  332. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/content-view-file-repositories-list.controller.js +0 -48
  333. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/content-view-ostree-repositories-list.controller.js +0 -49
  334. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/content-view-promotion.controller.js +0 -129
  335. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/content-view-publish.controller.js +0 -46
  336. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/content-view-repositories-list.controller.js +0 -42
  337. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/content-view-repositories.service.js +0 -91
  338. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/content-view-versions.controller.js +0 -240
  339. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/available-errata-filter.controller.js +0 -115
  340. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/available-module-stream-filter.controller.js +0 -68
  341. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/available-package-group-filter.controller.js +0 -66
  342. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/date-type-errata-filter.controller.js +0 -77
  343. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/docker-tag-filter.controller.js +0 -137
  344. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/edit-filter.controller.js +0 -36
  345. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/errata-filter-list.controller.js +0 -78
  346. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/errata-filter.controller.js +0 -74
  347. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/filter-content-type.filter.js +0 -21
  348. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/filter-details.controller.js +0 -34
  349. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/filter-helper.service.js +0 -30
  350. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/filter-repositories.controller.js +0 -86
  351. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/filter-rule-matching-package-modal.controller.js +0 -37
  352. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/filter-type.filter.js +0 -21
  353. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/filter.factory.js +0 -66
  354. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/filters.controller.js +0 -85
  355. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/module-stream-list-filter.controller.js +0 -73
  356. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/new-filter.controller.js +0 -100
  357. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/package-filter.controller.js +0 -179
  358. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/package-group-list-filter.controller.js +0 -75
  359. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/rule.factory.js +0 -21
  360. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/views/date-type-errata-filter.html +0 -9
  361. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/views/date-type-errata.html +0 -75
  362. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/views/docker-filter.html +0 -28
  363. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/views/docker-tag-filter-details.html +0 -65
  364. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/views/edit-filter.html +0 -19
  365. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/views/errata-filter-details.html +0 -63
  366. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/views/errata-filter.html +0 -50
  367. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/views/filter-details.html +0 -9
  368. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/views/filter-repositories.html +0 -121
  369. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/views/filter-rule-matching-package-modal.html +0 -43
  370. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/views/filters.html +0 -85
  371. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/views/module-stream-filter-details.html +0 -58
  372. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/views/module-stream-filter.html +0 -43
  373. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/views/new-filter.html +0 -62
  374. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/views/package-filter-details.html +0 -182
  375. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/views/package-filter.html +0 -28
  376. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/views/package-group-filter-details.html +0 -42
  377. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/views/package-group-filter.html +0 -43
  378. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/views/partials/filter-repositories-count.html +0 -2
  379. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/histories/content-view-history.controller.js +0 -47
  380. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/histories/content-view-history.factory.js +0 -22
  381. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/histories/views/content-view-history.html +0 -36
  382. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/views/content-view-copy.html +0 -20
  383. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/views/content-view-deb-repositories.html +0 -87
  384. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/views/content-view-details-tasks.html +0 -4
  385. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/views/content-view-details.html +0 -144
  386. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/views/content-view-docker-repositories.html +0 -114
  387. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/views/content-view-file-repositories.html +0 -87
  388. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/views/content-view-info.html +0 -63
  389. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/views/content-view-ostree-repositories.html +0 -87
  390. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/views/content-view-promotion.html +0 -59
  391. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/views/content-view-publish.html +0 -58
  392. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/views/content-view-repositories.html +0 -116
  393. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/views/content-view-versions.html +0 -126
  394. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/new/content-view-new.controller.js +0 -78
  395. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/new/views/content-view-new.html +0 -127
  396. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/versions/content-view-version-content.controller.js +0 -138
  397. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/versions/content-view-version.controller.js +0 -59
  398. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/versions/views/content-view-version-apt.html +0 -25
  399. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/versions/views/content-view-version-components.html +0 -19
  400. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/versions/views/content-view-version-deb.html +0 -19
  401. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/versions/views/content-view-version-details.html +0 -15
  402. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/versions/views/content-view-version-docker.html +0 -23
  403. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/versions/views/content-view-version-errata.html +0 -48
  404. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/versions/views/content-view-version-file.html +0 -21
  405. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/versions/views/content-view-version-module-streams.html +0 -8
  406. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/versions/views/content-view-version-package-groups.html +0 -21
  407. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/versions/views/content-view-version-packages.html +0 -27
  408. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/versions/views/content-view-version-yum.html +0 -42
  409. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/versions/views/content-view-version.html +0 -83
  410. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/views/content-views.html +0 -74
  411. data/webpack/components/Table/__test__/useBulkSelect.test.js +0 -99
  412. data/webpack/scenes/AnsibleCollections/AnsibleCollectionsActions.js +0 -30
  413. data/webpack/scenes/AnsibleCollections/AnsibleCollectionsConstants.js +0 -3
  414. data/webpack/scenes/AnsibleCollections/AnsibleCollectionsPage.js +0 -80
  415. data/webpack/scenes/AnsibleCollections/AnsibleCollectionsReducer.js +0 -39
  416. data/webpack/scenes/AnsibleCollections/AnsibleCollectionsTableSchema.js +0 -60
  417. data/webpack/scenes/AnsibleCollections/Details/AnsibleCollectionDetails.js +0 -94
  418. data/webpack/scenes/AnsibleCollections/Details/AnsibleCollectionDetailsActions.js +0 -23
  419. data/webpack/scenes/AnsibleCollections/Details/AnsibleCollectionDetailsConstants.js +0 -3
  420. data/webpack/scenes/AnsibleCollections/Details/AnsibleCollectionDetailsReducer.js +0 -30
  421. data/webpack/scenes/AnsibleCollections/Details/AnsibleCollectionsSchema.js +0 -35
  422. data/webpack/scenes/AnsibleCollections/Details/__tests__/AnsibleCollectionDetailInfo.test.js +0 -16
  423. data/webpack/scenes/AnsibleCollections/Details/__tests__/AnsibleCollectionDetails.fixtures.js +0 -25
  424. data/webpack/scenes/AnsibleCollections/Details/__tests__/AnsibleCollectionDetails.test.js +0 -27
  425. data/webpack/scenes/AnsibleCollections/Details/__tests__/AnsibleCollectionDetailsActions.test.js +0 -41
  426. data/webpack/scenes/AnsibleCollections/Details/__tests__/AnsibleCollectionDetailsReducer.test.js +0 -33
  427. data/webpack/scenes/AnsibleCollections/Details/__tests__/__snapshots__/AnsibleCollectionDetailInfo.test.js.snap +0 -83
  428. data/webpack/scenes/AnsibleCollections/Details/__tests__/__snapshots__/AnsibleCollectionDetails.test.js.snap +0 -190
  429. data/webpack/scenes/AnsibleCollections/Details/__tests__/__snapshots__/AnsibleCollectionDetailsActions.test.js.snap +0 -58
  430. data/webpack/scenes/AnsibleCollections/Details/__tests__/__snapshots__/AnsibleCollectionDetailsReducer.test.js.snap +0 -50
  431. data/webpack/scenes/AnsibleCollections/Details/index.js +0 -17
  432. data/webpack/scenes/AnsibleCollections/__tests__/AnsibleCollectionPage.test.js +0 -23
  433. data/webpack/scenes/AnsibleCollections/__tests__/AnsibleCollections.fixtures.js +0 -52
  434. data/webpack/scenes/AnsibleCollections/__tests__/AnsibleCollectionsActions.test.js +0 -48
  435. data/webpack/scenes/AnsibleCollections/__tests__/AnsibleCollectionsReducer.test.js +0 -46
  436. data/webpack/scenes/AnsibleCollections/__tests__/AnsibleCollectionsTable.test.js +0 -25
  437. data/webpack/scenes/AnsibleCollections/__tests__/__snapshots__/AnsibleCollectionPage.test.js.snap +0 -73
  438. data/webpack/scenes/AnsibleCollections/__tests__/__snapshots__/AnsibleCollectionsTable.test.js.snap +0 -81
  439. data/webpack/scenes/AnsibleCollections/index.js +0 -17
  440. data/webpack/scenes/Subscriptions/Manifest/__tests__/ManageManifestModal.test.js +0 -123
@@ -3,7 +3,7 @@ import useDeepCompareEffect from 'use-deep-compare-effect';
3
3
  import PropTypes from 'prop-types';
4
4
  import { shallowEqual, useSelector, useDispatch } from 'react-redux';
5
5
  import { TableVariant } from '@patternfly/react-table';
6
- import { Tabs, Tab, TabTitleText, Split, SplitItem, Button, Dropdown, DropdownItem, KebabToggle } from '@patternfly/react-core';
6
+ import { Tabs, Tab, TabTitleText, Split, SplitItem, Dropdown, DropdownItem, KebabToggle, Button } from '@patternfly/react-core';
7
7
  import { STATUS } from 'foremanReact/constants';
8
8
  import { translate as __ } from 'foremanReact/common/I18n';
9
9
  import { ArtifactsWithNoErrataRenderer } from './ArtifactsWithNoErrata';
@@ -106,7 +106,7 @@ const CVRpmFilterContent = ({
106
106
  }, [showAffectedRepos, repositories.length]);
107
107
 
108
108
  const emptyContentTitle = __('No rules have been added to this filter.');
109
- const emptyContentBody = __("Add to this filter using the 'Add RPM rule' button.");
109
+ const emptyContentBody = __('Items will appear here when a filter rule is added.');
110
110
  const emptySearchTitle = __('No matching rules found.');
111
111
  const emptySearchBody = __('Try changing your search settings.');
112
112
  const tabTitle = (inclusion ? __('Included') : __('Excluded')) + __(' RPMs');
@@ -145,6 +145,17 @@ const CVRpmFilterContent = ({
145
145
  deselectAll();
146
146
  };
147
147
 
148
+ const showPrimaryAction = true;
149
+ const primaryActionButton =
150
+ (
151
+ <Button
152
+ ouiaId="add-rpm-rule-button"
153
+ onClick={() => setModalOpen(true)}
154
+ variant="primary"
155
+ aria-label="add_rpm_rule_empty_state"
156
+ > {__('Add RPM rule')}
157
+ </Button>);
158
+
148
159
  return (
149
160
  <Tabs className="margin-0-24" activeKey={activeTabKey} onSelect={(_event, eventKey) => setActiveTabKey(eventKey)}>
150
161
  <Tab eventKey={0} title={<TabTitleText>{tabTitle}</TabTitleText>}>
@@ -160,6 +171,8 @@ const CVRpmFilterContent = ({
160
171
  searchQuery,
161
172
  updateSearchQuery,
162
173
  status,
174
+ showPrimaryAction,
175
+ primaryActionButton,
163
176
  }}
164
177
  ouiaId="content-view-rpm-filter-table"
165
178
  actionResolver={hasPermission(permissions, 'edit_content_views') ? actionResolver : null}
@@ -178,6 +191,7 @@ const CVRpmFilterContent = ({
178
191
  onClose={onClose}
179
192
  />}
180
193
  {hasPermission(permissions, 'edit_content_views') &&
194
+ status === STATUS.RESOLVED && rows.length !== 0 &&
181
195
  <Split hasGutter>
182
196
  <SplitItem>
183
197
  <Button
@@ -206,8 +220,7 @@ const CVRpmFilterContent = ({
206
220
  filterDetails={filterDetails}
207
221
  />
208
222
  </SplitItem>
209
- </Split>
210
- }
223
+ </Split>}
211
224
  {modalOpen &&
212
225
  <AddEditPackageRuleModal
213
226
  filterId={filterId}
@@ -14,6 +14,7 @@ export const typeName = (type, errataByDate) => {
14
14
  erratum: __('Errata'),
15
15
  erratum_date: __('Errata - by date range'),
16
16
  erratum_id: __('Errata'),
17
+ deb: __('Deb'),
17
18
  };
18
19
 
19
20
  if (type in nameMap) return nameMap[type];
@@ -1,7 +1,7 @@
1
1
  import React, { useState, useEffect, useCallback } from 'react';
2
2
  import useDeepCompareEffect from 'use-deep-compare-effect';
3
3
  import { shallowEqual, useSelector, useDispatch } from 'react-redux';
4
- import { Label, Split, SplitItem, Button, Dropdown, DropdownItem, KebabToggle } from '@patternfly/react-core';
4
+ import { Label, Split, SplitItem, Dropdown, DropdownItem, KebabToggle, Button } from '@patternfly/react-core';
5
5
  import { TableVariant } from '@patternfly/react-table';
6
6
  import { STATUS } from 'foremanReact/constants';
7
7
  import LongDateTime from 'foremanReact/components/common/dates/LongDateTime';
@@ -47,7 +47,6 @@ const ContentViewFilters = ({ cvId, details }) => {
47
47
  __('Content type'),
48
48
  __('Inclusion type'),
49
49
  ];
50
-
51
50
  const buildRows = useCallback(() => {
52
51
  const newRows = [];
53
52
  results.forEach((filter) => {
@@ -109,9 +108,19 @@ const ContentViewFilters = ({ cvId, details }) => {
109
108
  ];
110
109
 
111
110
  const emptyContentTitle = __("You currently don't have any filters for this content view.");
112
- const emptyContentBody = __("Add filters using the 'Add filter' button above."); // needs link
111
+ const emptyContentBody = __('Filters will appear here when the filter is created.'); // needs link
113
112
  const emptySearchTitle = __('No matching filters found');
114
113
  const emptySearchBody = __('Try changing your search settings.');
114
+ const showPrimaryAction = true;
115
+ const primaryActionButton =
116
+ (
117
+ <Button
118
+ ouiaId="create-filter-button"
119
+ onClick={() => openAddModal()}
120
+ variant="primary"
121
+ aria-label="create_filter_empty_state"
122
+ > {__('Create filter')}
123
+ </Button>);
115
124
  return (
116
125
  <TableWrapper
117
126
  {...{
@@ -125,6 +134,8 @@ const ContentViewFilters = ({ cvId, details }) => {
125
134
  updateSearchQuery,
126
135
  error,
127
136
  status,
137
+ showPrimaryAction,
138
+ primaryActionButton,
128
139
  }}
129
140
  ouiaId="content-view-filters-table"
130
141
  actionResolver={hasPermission(permissions, 'edit_content_views') ? actionResolver : null}
@@ -135,25 +146,26 @@ const ContentViewFilters = ({ cvId, details }) => {
135
146
  fetchItems={useCallback(params => getContentViewFilters(cvId, params), [cvId])}
136
147
  actionButtons={hasPermission(permissions, 'edit_content_views') &&
137
148
  <>
138
- <Split hasGutter>
139
- <SplitItem>
140
- <Button ouiaId="create-filter-button" onClick={openAddModal} variant="primary" aria-label="create_filter">
141
- {__('Create filter')}
142
- </Button>
143
- </SplitItem>
144
- <SplitItem>
145
- <Dropdown
146
- toggle={<KebabToggle aria-label="bulk_actions" onToggle={toggleBulkAction} />}
147
- isOpen={bulkActionOpen}
148
- isPlain
149
- dropdownItems={[
150
- <DropdownItem aria-label="bulk_remove" key="bulk_remove" isDisabled={!bulkActionEnabled} component="button" onClick={bulkRemove}>
151
- {__('Remove')}
152
- </DropdownItem>]
153
- }
154
- />
155
- </SplitItem>
156
- </Split>
149
+ {status === STATUS.RESOLVED && rows.length !== 0 &&
150
+ <Split hasGutter>
151
+ <SplitItem>
152
+ <Button ouiaId="create-filter-button" onClick={openAddModal} variant="primary" aria-label="create_filter">
153
+ {__('Create filter')}
154
+ </Button>
155
+ </SplitItem>
156
+ <SplitItem>
157
+ <Dropdown
158
+ toggle={<KebabToggle aria-label="bulk_actions" onToggle={toggleBulkAction} />}
159
+ isOpen={bulkActionOpen}
160
+ isPlain
161
+ dropdownItems={[
162
+ <DropdownItem aria-label="bulk_remove" key="bulk_remove" isDisabled={!bulkActionEnabled} component="button" onClick={bulkRemove}>
163
+ {__('Remove')}
164
+ </DropdownItem>]
165
+ }
166
+ />
167
+ </SplitItem>
168
+ </Split>}
157
169
  {addModalOpen &&
158
170
  <CVFilterAddModal
159
171
  cvId={cvId}
@@ -0,0 +1,97 @@
1
+ import React, { useState, useCallback } from 'react';
2
+ import { useSelector, shallowEqual } from 'react-redux';
3
+ import PropTypes from 'prop-types';
4
+ import { translate as __ } from 'foremanReact/common/I18n';
5
+ import {
6
+ Modal, ModalVariant,
7
+ } from '@patternfly/react-core';
8
+ import { TableVariant, Thead, Tbody, Tr, Th, Td } from '@patternfly/react-table';
9
+ import { urlBuilder } from 'foremanReact/common/urlHelpers';
10
+ import TableWrapper from '../../../../../components/Table/TableWrapper';
11
+ import { getDebPackages } from '../../ContentViewDetailActions';
12
+ import { selectDebPackages, selectDebPackagesStatus } from '../../ContentViewDetailSelectors';
13
+
14
+
15
+ const columnHeaders = [
16
+ __('DEB name'),
17
+ __('Summary'),
18
+ ];
19
+
20
+ const emptyContentTitle = __('No matching DEB found.');
21
+ const emptyContentBody = __("Given criteria doesn't match any DEBs. Try changing your rule.");
22
+ const emptySearchTitle = __('Your search returned no matching DEBs.');
23
+ const emptySearchBody = __('Try changing your search criteria.');
24
+
25
+ const CVDebMatchContentModal = ({ filterId, onClose, filterRuleId }) => {
26
+ const [searchQuery, updateSearchQuery] = useState('');
27
+ const response = useSelector(state => selectDebPackages(state), shallowEqual);
28
+ const status = useSelector(state => selectDebPackagesStatus(state), shallowEqual);
29
+
30
+ const fetchItems = useCallback(params => getDebPackages({
31
+ content_view_filter_rule_id: filterRuleId, filterId, ...params,
32
+ }), [filterRuleId, filterId]);
33
+
34
+ const { results, ...metadata } = response;
35
+
36
+ return (
37
+ <Modal
38
+ title={__('Matching content')}
39
+ variant={ModalVariant.medium}
40
+ isOpen
41
+ onClose={onClose}
42
+ appendTo={document.body}
43
+ >
44
+ <TableWrapper
45
+ {...{
46
+ metadata,
47
+ emptyContentTitle,
48
+ emptyContentBody,
49
+ emptySearchTitle,
50
+ emptySearchBody,
51
+ searchQuery,
52
+ updateSearchQuery,
53
+ fetchItems,
54
+ status,
55
+ }}
56
+ ouiaId="content-view-deb-match-content-table"
57
+ autocompleteEndpoint="/debs/auto_complete_search"
58
+ variant={TableVariant.compact}
59
+ >
60
+ <Thead>
61
+ <Tr>
62
+ {columnHeaders.map(col =>
63
+ <Th key={col}>{col}</Th>)}
64
+ </Tr>
65
+ </Thead>
66
+ <Tbody>
67
+ {results?.map((result) => {
68
+ const {
69
+ nva, description = '-', id,
70
+ } = result;
71
+ return (
72
+ <Tr key={`${nva}_${description}_${id}`}>
73
+ <Td>
74
+ <a rel="noreferrer" target="_blank" href={urlBuilder(`debs/${id}`, '')}>{nva}</a>
75
+ </Td>
76
+ <Td>{description}</Td>
77
+ </Tr>
78
+ );
79
+ })
80
+ }
81
+ </Tbody>
82
+ </TableWrapper>
83
+ </Modal>
84
+ );
85
+ };
86
+
87
+ CVDebMatchContentModal.propTypes = {
88
+ filterRuleId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,
89
+ filterId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,
90
+ onClose: PropTypes.func,
91
+ };
92
+
93
+ CVDebMatchContentModal.defaultProps = {
94
+ onClose: undefined,
95
+ };
96
+
97
+ export default CVDebMatchContentModal;
@@ -4,7 +4,7 @@ import { renderWithRedux, patientlyWaitFor, fireEvent } from 'react-testing-lib-
4
4
 
5
5
  import api from '../../../../../../services/api';
6
6
  import CVRpmMatchContentModal from '../CVRpmMatchContentModal';
7
- import nock, { nockInstance, assertNockRequest, mockSetting, mockAutocomplete } from '../../../../../../test-utils/nockWrapper';
7
+ import { nockInstance, assertNockRequest, mockSetting, mockAutocomplete } from '../../../../../../test-utils/nockWrapper';
8
8
 
9
9
  import CVMatchedContent from './CVRpmMatchContent.fixtures.json';
10
10
  import CVMatchContentSearch from './CVRpmMatchContentSearch.fixtures.json';
@@ -27,7 +27,6 @@ beforeEach(() => {
27
27
  });
28
28
 
29
29
  afterEach(() => {
30
- nock.cleanAll();
31
30
  assertNockRequest(searchDelayScope);
32
31
  assertNockRequest(autoSearchScope);
33
32
  });
@@ -0,0 +1,128 @@
1
+ import React, { useState } from 'react';
2
+ import useDeepCompareEffect from 'use-deep-compare-effect';
3
+ import { useDispatch, useSelector } from 'react-redux';
4
+ import { STATUS } from 'foremanReact/constants';
5
+ import PropTypes from 'prop-types';
6
+ import { translate as __ } from 'foremanReact/common/I18n';
7
+ import { Modal, ModalVariant, Form, FormGroup, TextInput, ActionGroup, Button } from '@patternfly/react-core';
8
+ import { addCVFilterRule, editCVFilterRule, getCVFilterRules } from '../../../ContentViewDetailActions';
9
+ import {
10
+ selectCreateFilterRuleStatus,
11
+ } from '../../../ContentViewDetailSelectors';
12
+
13
+ const AddEditDebPackageRuleModal = ({ filterId, onClose, selectedFilterRuleData }) => {
14
+ const {
15
+ id: editingId,
16
+ name: editingName,
17
+ arch: editingArchitecture,
18
+ } = selectedFilterRuleData || {};
19
+
20
+ const isEditing = !!selectedFilterRuleData;
21
+
22
+
23
+ const [name, setName] = useState(editingName || '');
24
+ const [architecture, setArchitecture] = useState(editingArchitecture || '');
25
+ const [saving, setSaving] = useState(false);
26
+ const dispatch = useDispatch();
27
+ const status = useSelector(state => selectCreateFilterRuleStatus(state));
28
+
29
+ const submitDisabled = !name || name.length === 0;
30
+
31
+ const onSubmit = () => {
32
+ setSaving(true);
33
+ dispatch(isEditing ?
34
+ editCVFilterRule(
35
+ filterId,
36
+ {
37
+ id: editingId,
38
+ name,
39
+ architecture,
40
+ },
41
+ () => {
42
+ dispatch(getCVFilterRules(filterId));
43
+ onClose();
44
+ },
45
+ ) :
46
+ addCVFilterRule(
47
+ filterId,
48
+ { name, architecture }, () => {
49
+ dispatch(getCVFilterRules(filterId));
50
+ onClose();
51
+ },
52
+ ));
53
+ };
54
+
55
+ useDeepCompareEffect(() => {
56
+ if (status === STATUS.ERROR) {
57
+ setSaving(false);
58
+ }
59
+ }, [status, setSaving]);
60
+
61
+ return (
62
+ <Modal
63
+ title={selectedFilterRuleData ? __('Edit package filter rule') : __('Create package filter rule')}
64
+ variant={ModalVariant.small}
65
+ isOpen
66
+ onClose={onClose}
67
+ appendTo={document.body}
68
+ >
69
+ <Form onSubmit={(e) => {
70
+ e.preventDefault();
71
+ onSubmit();
72
+ }}
73
+ >
74
+ <FormGroup label={__('DEB name')} isRequired fieldId="name">
75
+ <TextInput
76
+ isRequired
77
+ type="text"
78
+ id="name"
79
+ aria-label="input_name"
80
+ name="name"
81
+ value={name}
82
+ onChange={value => setName(value)}
83
+ />
84
+ </FormGroup>
85
+ <FormGroup label={__('Architecture')} fieldId="architecture">
86
+ <TextInput
87
+ type="text"
88
+ id="architecture"
89
+ aria-label="input_architecture"
90
+ name="architecture"
91
+ value={architecture}
92
+ onChange={value => setArchitecture(value)}
93
+ />
94
+ </FormGroup>
95
+ <ActionGroup>
96
+ <Button
97
+ aria-label="create_deb_package_filter_rule"
98
+ variant="primary"
99
+ isDisabled={saving || submitDisabled}
100
+ type="submit"
101
+ >
102
+ {selectedFilterRuleData ? __('Edit rule') : __('Create rule')}
103
+ </Button>
104
+ <Button variant="link" onClick={onClose}>
105
+ {__('Cancel')}
106
+ </Button>
107
+ </ActionGroup>
108
+ </Form>
109
+ </Modal>
110
+ );
111
+ };
112
+
113
+ AddEditDebPackageRuleModal.propTypes = {
114
+ filterId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,
115
+ onClose: PropTypes.func,
116
+ selectedFilterRuleData: PropTypes.shape({
117
+ id: PropTypes.number,
118
+ name: PropTypes.string,
119
+ arch: PropTypes.string,
120
+ }),
121
+ };
122
+
123
+ AddEditDebPackageRuleModal.defaultProps = {
124
+ onClose: null,
125
+ selectedFilterRuleData: undefined,
126
+ };
127
+
128
+ export default AddEditDebPackageRuleModal;
@@ -3,7 +3,7 @@ import { renderWithRedux, patientlyWaitFor, fireEvent, act } from 'react-testing
3
3
  import { Route } from 'react-router-dom';
4
4
 
5
5
  import { cvFilterDetailsKey } from '../../../ContentViewsConstants';
6
- import nock, {
6
+ import {
7
7
  nockInstance,
8
8
  assertNockRequest,
9
9
  mockAutocomplete,
@@ -13,6 +13,7 @@ import api from '../../../../../services/api';
13
13
  import CVContainerImageFilterContent from '../CVContainerImageFilterContent';
14
14
  import cvFilterFixtures from './CVContainerImageFilterContent.fixtures.json';
15
15
  import details from '../../../../ContentViews/__tests__/mockDetails.fixtures.json';
16
+ import emptyCVContainerImageData from './emptyCVContainerImageFilterContent.fixtures.json';
16
17
 
17
18
  const afterDeleteFilterResultsArray = [...cvFilterFixtures.results];
18
19
  afterDeleteFilterResultsArray.shift();
@@ -51,7 +52,6 @@ beforeEach(() => {
51
52
  afterEach(() => {
52
53
  assertNockRequest(searchDelayScope);
53
54
  assertNockRequest(autoSearchScope);
54
- nock.cleanAll();
55
55
  });
56
56
 
57
57
  test('Can view container image filter rules', async (done) => {
@@ -138,7 +138,6 @@ test('Can remove filter rules', async (done) => {
138
138
  assertNockRequest(cvFiltersCallbackScope, done);
139
139
  });
140
140
 
141
-
142
141
  // Add
143
142
  test('Can add filter rules', async (done) => {
144
143
  const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl, true, [], 2);
@@ -279,3 +278,57 @@ test('Can edit filter rules', async (done) => {
279
278
  assertNockRequest(cvFiltersCallbackScope, done);
280
279
  act(done);
281
280
  });
281
+
282
+ test('Shows call-to-action when there are no filter rules', async (done) => {
283
+ const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl, true, [], 2);
284
+ const autocompleteNameScope = mockAutocomplete(nockInstance, autocompleteNameUrl, true, [], 2);
285
+ const inputSearchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 0, 2);
286
+ const inputAutoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing', undefined, 2);
287
+ const cvFiltersScope = nockInstance
288
+ .get(cvFilterRulesPath)
289
+ .query(true)
290
+ .reply(200, emptyCVContainerImageData);
291
+
292
+ const { queryByLabelText, getAllByLabelText } =
293
+ renderWithRedux(
294
+ withCVRoute(<CVContainerImageFilterContent filterId={195} details={details} />),
295
+ renderOptions,
296
+ );
297
+
298
+ expect(queryByLabelText('add_filter_rule_empty_state')).toBeNull();
299
+ await patientlyWaitFor(() => expect(queryByLabelText('add_filter_rule_empty_state')).toBeInTheDocument());
300
+ fireEvent.click(queryByLabelText('add_filter_rule_empty_state'));
301
+ await patientlyWaitFor(() => {
302
+ expect(getAllByLabelText('text input for search')[0]).toBeInTheDocument();
303
+ });
304
+
305
+ assertNockRequest(autocompleteScope);
306
+ assertNockRequest(inputSearchDelayScope);
307
+ assertNockRequest(inputAutoSearchScope);
308
+ assertNockRequest(autocompleteNameScope);
309
+ assertNockRequest(cvFiltersScope, done);
310
+ act(done);
311
+ });
312
+
313
+ test('Hides bulk_remove dropdownItem when there are no filter rules', async (done) => {
314
+ const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl);
315
+ const cvFiltersScope = nockInstance
316
+ .get(cvFilterRulesPath)
317
+ .query(true)
318
+ .reply(200, emptyCVContainerImageData);
319
+
320
+ const { queryByText, getByText, queryByLabelText } =
321
+ renderWithRedux(
322
+ withCVRoute(<CVContainerImageFilterContent filterId={195} details={details} />),
323
+ renderOptions,
324
+ );
325
+ expect(queryByText('Add filter rule')).toBeNull();
326
+ await patientlyWaitFor(() => {
327
+ expect(getByText('Add filter rule')).toBeInTheDocument();
328
+ expect(queryByLabelText('bulk_actions')).not.toBeInTheDocument();
329
+ });
330
+
331
+ assertNockRequest(autocompleteScope);
332
+ assertNockRequest(cvFiltersScope, done);
333
+ act(done);
334
+ });
@@ -15,6 +15,8 @@ import cvFilterDetails from './cvPackageFilterDetail.fixtures.json';
15
15
  import cvPackageFilterRules from './cvPackageFilterRules.fixtures.json';
16
16
  import cvFilterFixtures from './contentViewFilters.fixtures.json';
17
17
  import details from '../../../__tests__/mockDetails.fixtures.json';
18
+ // import emptyContentViewFiltersData from './emptyContentViewFilters.fixtures.json';
19
+ import emptyCVPackageFilterRules from './emptyCVPackageFilterRules.fixtures.json';
18
20
 
19
21
  const cvFiltersPath = api.getApiUrl('/content_view_filters');
20
22
  const cvFilterDetailsPath = api.getApiUrl('/content_view_filters/2');
@@ -69,7 +71,7 @@ test('Can show filter details and package groups on page load', async (done) =>
69
71
  assertNockRequest(autoSearchScope);
70
72
  assertNockRequest(cvFilterScope);
71
73
  assertNockRequest(cvFiltersScope);
72
- assertNockRequest(cvPackageFilterRulesScope, done);
74
+ assertNockRequest(cvPackageFilterRulesScope);
73
75
  act(done);
74
76
  });
75
77
 
@@ -128,7 +130,8 @@ test('Can search for package rules in package filter details', async (done) => {
128
130
  assertNockRequest(cvFiltersScope);
129
131
  assertNockRequest(cvPackageFilterRulesScope);
130
132
  assertNockRequest(withSearchScope);
131
- assertNockRequest(packageRuleSearchScope, done);
133
+ assertNockRequest(packageRuleSearchScope);
134
+ act(done);
132
135
  });
133
136
 
134
137
  test('Can add package rules to filter in a self-closing modal', async (done) => {
@@ -207,7 +210,8 @@ test('Can add package rules to filter in a self-closing modal', async (done) =>
207
210
  assertNockRequest(cvFilterDetailsScope);
208
211
  assertNockRequest(cvPackageFilterRulesScope);
209
212
  assertNockRequest(createscope);
210
- assertNockRequest(cvPackageFilterRulesScope, done);
213
+ assertNockRequest(cvPackageFilterRulesScope);
214
+ act(done);
211
215
  });
212
216
 
213
217
  test('Remove rpm filter rule in a self-closing modal', async (done) => {
@@ -263,7 +267,8 @@ test('Remove rpm filter rule in a self-closing modal', async (done) => {
263
267
  assertNockRequest(cvFilterDetailsScope);
264
268
  assertNockRequest(cvPackageFilterRulesScope);
265
269
  assertNockRequest(removeScope);
266
- assertNockRequest(cvPackageFilterRulesScope, done);
270
+ assertNockRequest(cvPackageFilterRulesScope);
271
+ act(done);
267
272
  });
268
273
 
269
274
  test('Edit rpm filter rule in a self-closing modal', async (done) => {
@@ -284,8 +289,8 @@ test('Edit rpm filter rule in a self-closing modal', async (done) => {
284
289
  .query(true)
285
290
  .reply(200, cvFilterDetails);
286
291
  const cvPackageFilterRulesScope = nockInstance
292
+ .persist()
287
293
  .get(cvPackageFilterRulesPath)
288
- .times(2) // One on initial page load and one after rule create
289
294
  .query(true)
290
295
  .reply(200, cvPackageFilterRules);
291
296
 
@@ -319,10 +324,10 @@ test('Edit rpm filter rule in a self-closing modal', async (done) => {
319
324
 
320
325
  await patientlyWaitFor(() => {
321
326
  expect(getByText('Edit RPM rule')).toBeInTheDocument();
322
- fireEvent.submit(getByLabelText('add_package_filter_rule'));
323
327
  });
324
-
328
+ fireEvent.submit(getByLabelText('add_package_filter_rule'));
325
329
  await patientlyWaitFor(() => {
330
+ expect(queryByText('Edit RPM rule')).not.toBeInTheDocument();
326
331
  expect(getByText(cvFilterName)).toBeInTheDocument();
327
332
  });
328
333
 
@@ -334,6 +339,55 @@ test('Edit rpm filter rule in a self-closing modal', async (done) => {
334
339
  assertNockRequest(cvFiltersScope);
335
340
  assertNockRequest(cvFilterDetailsScope);
336
341
  assertNockRequest(cvPackageFilterRulesScope);
337
- assertNockRequest(editScope, done);
342
+ assertNockRequest(editScope);
343
+ act(done);
344
+ });
345
+
346
+ test('Shows call-to-action when there are no RPM filters', async (done) => {
347
+ const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl);
348
+ const autocompleteNameScope = mockAutocomplete(nockInstance, autocompleteNameUrl);
349
+ const autocompleteArchScope = mockAutocomplete(nockInstance, autocompleteArchUrl);
350
+ const searchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 0, 3);
351
+ const autoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing', undefined, 3);
352
+ const cvFilterDetailScope = nockInstance
353
+ .get(cvFilterDetailsPath)
354
+ .query(true)
355
+ .reply(200, cvFilterDetails);
356
+ const cvFiltersScope = nockInstance
357
+ .get(cvFiltersPath)
358
+ .query(true)
359
+ .reply(200, cvFilterFixtures);
360
+ const cvPackageFilterRulesScope = nockInstance
361
+ .get(cvPackageFilterRulesPath)
362
+ .times(1)
363
+ .query(true)
364
+ .reply(200, emptyCVPackageFilterRules);
365
+ const {
366
+ queryByLabelText, getAllByLabelText, queryByText,
367
+ } =
368
+ renderWithRedux(withCVRoute(<ContentViewFilterDetails
369
+ cvId={1}
370
+ details={details}
371
+ />), renderOptions);
372
+ expect(queryByLabelText('add_rpm_rule_empty_state')).not.toBeInTheDocument();
373
+ await patientlyWaitFor(() => expect(queryByLabelText('add_rpm_rule_empty_state')).toBeInTheDocument());
374
+ fireEvent.click(queryByLabelText('add_rpm_rule_empty_state'));
375
+
376
+ await patientlyWaitFor(() => {
377
+ expect(getAllByLabelText('text input for search')[0]).toBeInTheDocument();
378
+ expect(queryByText('Cancel')).toBeInTheDocument();
379
+ });
380
+ fireEvent.click(queryByText('Cancel'));
381
+ await patientlyWaitFor(() => {
382
+ expect(queryByLabelText('add-edit-package-modal-cancel')).not.toBeInTheDocument();
383
+ });
384
+ assertNockRequest(autocompleteNameScope);
385
+ assertNockRequest(autocompleteArchScope);
386
+ assertNockRequest(autocompleteScope);
387
+ assertNockRequest(searchDelayScope);
388
+ assertNockRequest(autoSearchScope);
389
+ assertNockRequest(cvFiltersScope);
390
+ assertNockRequest(cvFilterDetailScope);
391
+ assertNockRequest(cvPackageFilterRulesScope);
338
392
  act(done);
339
393
  });
@@ -4,7 +4,7 @@ import { Route } from 'react-router-dom';
4
4
 
5
5
  import ContentViewFilterDetails from '../ContentViewFilterDetails';
6
6
  import { ADDED, cvFilterDetailsKey, NOT_ADDED } from '../../../ContentViewsConstants';
7
- import nock, {
7
+ import {
8
8
  nockInstance,
9
9
  assertNockRequest,
10
10
  } from '../../../../../test-utils/nockWrapper';
@@ -38,10 +38,6 @@ const renderOptions = {
38
38
 
39
39
  const withCVRoute = component => <Route path="/content_views/:id([0-9]+)#/filters/:filterId([0-9]+)">{component}</Route>;
40
40
 
41
- afterEach(() => {
42
- nock.cleanAll();
43
- });
44
-
45
41
  jest.mock('../../../../../components/Search', () => () => 'mocked!');
46
42
 
47
43
  test('Can enable and disable add filter button', async (done) => {
@@ -4,7 +4,7 @@ import { Route } from 'react-router-dom';
4
4
 
5
5
  import ContentViewFilterDetails from '../ContentViewFilterDetails';
6
6
  import { cvFilterDetailsKey } from '../../../ContentViewsConstants';
7
- import nock, {
7
+ import {
8
8
  nockInstance,
9
9
  assertNockRequest,
10
10
  mockAutocomplete,
@@ -40,7 +40,6 @@ beforeEach(() => {
40
40
  afterEach(() => {
41
41
  assertNockRequest(searchDelayScope);
42
42
  assertNockRequest(autoSearchScope);
43
- nock.cleanAll();
44
43
  });
45
44
 
46
45
  test('Can show filter details and package groups on page load', async (done) => {