katello 4.3.0.rc4 → 4.4.0.rc2

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 (458) 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/api_controller.rb +13 -4
  4. data/app/controllers/katello/api/v2/content_view_versions_controller.rb +4 -1
  5. data/app/controllers/katello/api/v2/content_views_controller.rb +46 -0
  6. data/app/controllers/katello/api/v2/host_packages_controller.rb +21 -1
  7. data/app/controllers/katello/api/v2/hosts_bulk_actions_controller.rb +30 -1
  8. data/app/controllers/katello/api/v2/organizations_controller.rb +10 -6
  9. data/app/controllers/katello/api/v2/packages_controller.rb +4 -0
  10. data/app/controllers/katello/api/v2/repositories_bulk_actions_controller.rb +10 -1
  11. data/app/controllers/katello/api/v2/repositories_controller.rb +42 -14
  12. data/app/controllers/katello/api/v2/repository_sets_controller.rb +7 -0
  13. data/app/controllers/katello/concerns/api/v2/repository_content_controller.rb +3 -0
  14. data/app/controllers/katello/concerns/hosts_controller_extensions.rb +32 -0
  15. data/app/controllers/katello/remote_execution_controller.rb +5 -4
  16. data/app/graphql/types/host_collection.rb +18 -0
  17. data/app/helpers/katello/content_source_helper.rb +43 -0
  18. data/app/helpers/katello/hosts_and_hostgroups_helper.rb +4 -0
  19. data/app/lib/actions/katello/cdn_configuration/update.rb +5 -7
  20. data/app/lib/actions/katello/content_view/publish.rb +5 -0
  21. data/app/lib/actions/katello/content_view_version/incremental_update.rb +17 -3
  22. data/app/lib/actions/katello/repository/discover.rb +1 -14
  23. data/app/lib/actions/katello/repository/errata_mail.rb +4 -5
  24. data/app/lib/actions/katello/repository/filtered_index_content.rb +1 -1
  25. data/app/lib/actions/katello/repository/sync.rb +2 -2
  26. data/app/lib/actions/pulp3/abstract.rb +1 -1
  27. data/app/lib/actions/pulp3/abstract_async_task.rb +1 -1
  28. data/app/lib/actions/pulp3/content_view/delete_repository_references.rb +14 -4
  29. data/app/lib/actions/pulp3/content_view_version/create_import_history.rb +1 -2
  30. data/app/lib/actions/pulp3/content_view_version/import.rb +7 -0
  31. data/app/lib/actions/pulp3/orchestration/content_view_version/import.rb +7 -5
  32. data/app/lib/actions/pulp3/repository/copy_content.rb +1 -1
  33. data/app/lib/actions/pulp3/repository/reclaim_space.rb +3 -10
  34. data/app/lib/actions/pulp3/repository/save_artifact.rb +1 -0
  35. data/app/lib/katello/concerns/base_template_scope_extensions.rb +11 -0
  36. data/app/lib/katello/errors.rb +3 -3
  37. data/app/lib/katello/logging.rb +6 -1
  38. data/app/lib/katello/repo_discovery.rb +27 -19
  39. data/app/lib/katello/resources/cdn/katello_cdn.rb +41 -3
  40. data/app/lib/katello/resources/cdn.rb +4 -2
  41. data/app/lib/katello/util/deduplication_migrator.rb +105 -0
  42. data/app/lib/katello/util/pulpcore_content_filters.rb +2 -1
  43. data/app/models/katello/candlepin/repository_mapper.rb +3 -2
  44. data/app/models/katello/cdn_configuration.rb +38 -6
  45. data/app/models/katello/concerns/audit_comment_extensions.rb +17 -0
  46. data/app/models/katello/concerns/host_managed_extensions.rb +34 -2
  47. data/app/models/katello/concerns/organization_extensions.rb +5 -1
  48. data/app/models/katello/concerns/pulp_database_unit.rb +59 -173
  49. data/app/models/katello/concerns/remote_execution_proxy_selector_extensions.rb +11 -0
  50. data/app/models/katello/concerns/smart_proxy_extensions.rb +2 -1
  51. data/app/models/katello/content_view.rb +4 -4
  52. data/app/models/katello/content_view_filter.rb +1 -1
  53. data/app/models/katello/content_view_history.rb +1 -1
  54. data/app/models/katello/content_view_version.rb +6 -2
  55. data/app/models/katello/content_view_version_export_history.rb +3 -2
  56. data/app/models/katello/content_view_version_import_history.rb +4 -4
  57. data/app/models/katello/deb.rb +1 -3
  58. data/app/models/katello/docker_meta_tag.rb +1 -1
  59. data/app/models/katello/erratum.rb +0 -15
  60. data/app/models/katello/glue/provider.rb +1 -1
  61. data/app/models/katello/glue/pulp/repos.rb +3 -1
  62. data/app/models/katello/host/content_facet.rb +2 -27
  63. data/app/models/katello/host/info_provider.rb +9 -0
  64. data/app/models/katello/host/subscription_facet.rb +2 -2
  65. data/app/models/katello/host_available_module_stream.rb +10 -0
  66. data/app/models/katello/hostgroup/content_facet.rb +2 -2
  67. data/app/models/katello/installed_package.rb +1 -0
  68. data/app/models/katello/product.rb +1 -1
  69. data/app/models/katello/product_content.rb +2 -2
  70. data/app/models/katello/repository.rb +13 -12
  71. data/app/models/katello/root_repository.rb +65 -16
  72. data/app/models/katello/rpm.rb +8 -2
  73. data/app/models/setting/content.rb +15 -5
  74. data/app/services/cert/rhsm_client.rb +1 -5
  75. data/app/services/katello/component_view_presenter.rb +1 -1
  76. data/app/services/katello/content_unit_indexer.rb +166 -0
  77. data/app/services/katello/organization_creator.rb +23 -8
  78. data/app/services/katello/pulp/repository/docker.rb +1 -1
  79. data/app/services/katello/pulp/repository/yum.rb +0 -54
  80. data/app/services/katello/pulp/repository.rb +0 -6
  81. data/app/services/katello/pulp3/ansible_collection.rb +26 -10
  82. data/app/services/katello/pulp3/api/apt.rb +7 -0
  83. data/app/services/katello/pulp3/api/yum.rb +4 -0
  84. data/app/services/katello/pulp3/content_view_version/import.rb +11 -2
  85. data/app/services/katello/pulp3/content_view_version/metadata_generator.rb +1 -1
  86. data/app/services/katello/pulp3/deb.rb +10 -9
  87. data/app/services/katello/pulp3/docker_manifest.rb +6 -5
  88. data/app/services/katello/pulp3/docker_manifest_list.rb +23 -6
  89. data/app/services/katello/pulp3/docker_tag.rb +16 -7
  90. data/app/services/katello/pulp3/erratum.rb +51 -56
  91. data/app/services/katello/pulp3/file_unit.rb +9 -6
  92. data/app/services/katello/pulp3/generic_content_unit.rb +11 -12
  93. data/app/services/katello/pulp3/module_stream.rb +76 -30
  94. data/app/services/katello/pulp3/package_group.rb +5 -5
  95. data/app/services/katello/pulp3/pulp_content_unit.rb +19 -11
  96. data/app/services/katello/pulp3/repository/apt.rb +5 -3
  97. data/app/services/katello/pulp3/repository/docker.rb +14 -7
  98. data/app/services/katello/pulp3/repository/generic.rb +1 -1
  99. data/app/services/katello/pulp3/repository/yum.rb +23 -16
  100. data/app/services/katello/pulp3/repository.rb +31 -10
  101. data/app/services/katello/pulp3/repository_mirror.rb +18 -4
  102. data/app/services/katello/pulp3/rpm.rb +13 -13
  103. data/app/services/katello/pulp3/srpm.rb +10 -9
  104. data/app/services/katello/registration_manager.rb +1 -1
  105. data/app/services/katello/repository_type.rb +15 -4
  106. data/app/services/katello/repository_type_manager.rb +1 -1
  107. data/app/services/katello/ui_notifications/subscriptions/manifest_expired_warning.rb +1 -1
  108. data/app/services/katello/upstream_connection_checker.rb +2 -2
  109. data/app/views/foreman/job_templates/change_content_source.erb +1 -31
  110. data/app/views/foreman/job_templates/install_errata.erb +6 -9
  111. data/app/views/foreman/job_templates/install_errata_by_search_query.erb +26 -0
  112. data/app/views/foreman/job_templates/install_packages_by_search_query.erb +19 -0
  113. data/app/views/foreman/job_templates/remove_packages_by_search_query.erb +19 -0
  114. data/app/views/foreman/job_templates/update_packages_by_search_query.erb +19 -0
  115. data/app/views/katello/api/v2/cdn_configurations/show.json.rabl +1 -1
  116. data/app/views/katello/api/v2/content_views/base.json.rabl +8 -4
  117. data/app/views/katello/api/v2/environments/show.json.rabl +9 -0
  118. data/app/views/katello/api/v2/host_module_streams/base.json.rabl +1 -0
  119. data/app/views/katello/api/v2/repositories/base.json.rabl +1 -0
  120. data/app/views/katello/api/v2/repositories/show.json.rabl +3 -1
  121. data/app/views/katello/layouts/react.html.erb +0 -1
  122. data/app/views/katello/sync_management/_repo.html.erb +36 -25
  123. data/config/initializers/monkeys.rb +0 -1
  124. data/config/routes/api/v2.rb +1 -0
  125. data/config/routes/overrides.rb +3 -0
  126. data/config/routes.rb +2 -0
  127. data/db/migrate/20150930183738_migrate_content_hosts.rb +1 -1
  128. data/db/migrate/20180612164926_add_content_org_id.rb +2 -2
  129. data/db/migrate/20210119162528_delete_puppet_and_ostree_repos.rb +2 -0
  130. data/db/migrate/20211019192121_create_cdn_configuration.katello.rb +11 -2
  131. data/db/migrate/20211201154845_add_unique_indexes.rb +20 -0
  132. data/db/migrate/20211202172358_add_repository_mirroring_policy.rb +26 -0
  133. data/db/migrate/20211208034230_add_content_view_and_lifecycle_environment.rb +6 -0
  134. data/db/migrate/20211220185935_clean_duplicate_content_units.rb +144 -0
  135. data/db/migrate/20220110223754_update_disconnected_settings.rb +20 -0
  136. data/db/migrate/20220120163252_fix_docker_download_policy.rb +11 -0
  137. data/db/migrate/20220124191056_add_type_to_cdn_configuration.rb +22 -0
  138. data/db/migrate/20220127120843_fix_debian_download_policy.rb +11 -0
  139. data/db/migrate/20220204171908_rename_docker_tags_whitelist_and_add_exclude_tags.rb +8 -0
  140. data/db/migrate/20220207140355_change_deb_attributes_size_limit.rb +7 -0
  141. data/db/migrate/20220209205137_expand_sync_timeout_settings.rb +23 -0
  142. data/db/seeds.d/111-upgrade_tasks.rb +2 -1
  143. data/engines/bastion/app/views/bastion/layouts/application.html.erb +0 -1
  144. data/engines/bastion/app/views/bastion/layouts/assets.html.erb +0 -1
  145. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/content-credentials.controller.js +1 -1
  146. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/details/content-credential-products.controller.js +1 -1
  147. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/details/content-credential-repositories.controller.js +1 -1
  148. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/bulk/views/content-hosts-bulk-traces-modal.html +1 -1
  149. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/details/views/environment.html +26 -1
  150. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/errata/apply-errata.controller.js +10 -3
  151. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +212 -152
  152. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/packages/packages.controller.js +1 -0
  153. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-info.controller.js +29 -10
  154. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-manage-content.controller.js +2 -3
  155. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details.controller.js +8 -3
  156. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-info.html +49 -35
  157. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/mirroring-policy.service.js +30 -0
  158. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/new-repository.controller.js +29 -6
  159. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/views/new-repository.html +48 -23
  160. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/discovery/discovery.controller.js +5 -4
  161. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/products.routes.js +4 -3
  162. data/lib/katello/engine.rb +4 -0
  163. data/lib/katello/permission_creator.rb +1 -1
  164. data/lib/katello/permissions/host_permissions.rb +3 -1
  165. data/lib/katello/plugin.rb +9 -1
  166. data/lib/katello/repository_types/deb.rb +0 -1
  167. data/lib/katello/repository_types/docker.rb +4 -4
  168. data/lib/katello/repository_types/file.rb +0 -1
  169. data/lib/katello/repository_types/ostree.rb +4 -6
  170. data/lib/katello/repository_types/python.rb +5 -1
  171. data/lib/katello/repository_types/yum.rb +2 -9
  172. data/lib/katello/tasks/content_view_import_only.rake +34 -0
  173. data/lib/katello/tasks/import_applicability.rake +1 -1
  174. data/lib/katello/tasks/jenkins.rake +0 -2
  175. data/lib/katello/tasks/repository.rake +4 -1
  176. data/lib/katello/tasks/upgrades/4.4/publish_import_cvvs.rake +17 -0
  177. data/lib/katello/version.rb +1 -1
  178. data/locale/action_names.rb +8 -7
  179. data/locale/bn/katello.po +1402 -650
  180. data/locale/cs/katello.po +1217 -96
  181. data/locale/de/katello.po +2359 -1347
  182. data/locale/en/katello.po +1216 -94
  183. data/locale/es/katello.po +2201 -1172
  184. data/locale/fr/katello.po +2601 -1615
  185. data/locale/gu/katello.po +1564 -814
  186. data/locale/hi/katello.po +1563 -810
  187. data/locale/it/katello.po +1311 -282
  188. data/locale/ja/katello.po +2534 -1518
  189. data/locale/katello.pot +3430 -1326
  190. data/locale/kn/katello.po +1564 -812
  191. data/locale/ko/katello.po +1441 -409
  192. data/locale/mr/katello.po +1564 -776
  193. data/locale/or/katello.po +1565 -813
  194. data/locale/pa/katello.po +1559 -792
  195. data/locale/pt/katello.po +1314 -277
  196. data/locale/pt_BR/katello.po +2226 -1181
  197. data/locale/ru/katello.po +1587 -563
  198. data/locale/ta/katello.po +1373 -619
  199. data/locale/te/katello.po +1564 -810
  200. data/locale/zh_CN/katello.po +2936 -1890
  201. data/locale/zh_TW/katello.po +1508 -606
  202. data/webpack/__mocks__/foremanReact/{redux/actions/toasts.js → components/ToastsList/index.js} +3 -2
  203. data/webpack/components/ActionableDetail.js +35 -21
  204. data/webpack/components/Content/Details/ContentDetails.js +1 -1
  205. data/webpack/components/Content/Details/__tests__/ContentDetailInfo.test.js +0 -2
  206. data/webpack/components/Content/Details/__tests__/ContentDetailRepositories.test.js +0 -2
  207. data/webpack/components/Content/Details/__tests__/ContentDetails.test.js +0 -2
  208. data/webpack/components/Content/Details/__tests__/__snapshots__/ContentDetails.test.js.snap +1 -1
  209. data/webpack/components/Content/__tests__/ContentPage.test.js +0 -2
  210. data/webpack/components/Content/__tests__/ContentTable.test.js +0 -2
  211. data/webpack/components/EditableSwitch.js +8 -2
  212. data/webpack/components/EditableTextInput/EditableTextInput.js +44 -86
  213. data/webpack/components/EditableTextInput/__tests__/editableTextInput.test.js +3 -3
  214. data/webpack/components/Errata/index.js +95 -29
  215. data/webpack/components/ErratumTypeLabel.js +16 -16
  216. data/webpack/components/MultiSelect/index.js +2 -2
  217. data/webpack/components/Packages/index.js +1 -1
  218. data/webpack/components/RoutedTabs/index.js +2 -1
  219. data/webpack/components/Search/Search.js +5 -2
  220. data/webpack/components/Search/__tests__/search.test.js +2 -3
  221. data/webpack/components/Select/Select.js +1 -1
  222. data/webpack/components/SelectOrg/SelectOrgReducer.js +15 -15
  223. data/webpack/components/SelectOrg/SetOrganization.js +2 -2
  224. data/webpack/components/Table/PageControls.js +3 -6
  225. data/webpack/components/Table/TableHooks.js +47 -7
  226. data/webpack/components/Table/TableWrapper.js +25 -7
  227. data/webpack/components/TypeAhead/TypeAhead.js +5 -1
  228. data/webpack/components/TypeAhead/helpers/commonPropTypes.js +1 -1
  229. data/webpack/components/TypeAhead/helpers/helpers.js +14 -14
  230. data/webpack/components/TypeAhead/pf3Search/TypeAheadSearch.js +1 -1
  231. data/webpack/components/TypeAhead/pf4Search/TypeAheadInput.js +4 -1
  232. data/webpack/components/TypeAhead/pf4Search/TypeAheadSearch.js +2 -1
  233. data/webpack/components/WithOrganization/withOrganization.js +3 -3
  234. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard.js +1 -1
  235. data/webpack/components/extensions/HostDetails/Cards/ErrataOverviewCard.js +108 -0
  236. data/webpack/components/extensions/HostDetails/Cards/__tests__/errataOverviewCard.test.js +56 -0
  237. data/webpack/components/extensions/HostDetails/HostDetailsActions.js +2 -0
  238. data/webpack/components/extensions/HostDetails/HostPackages/HostPackagesActions.js +49 -2
  239. data/webpack/components/extensions/HostDetails/HostPackages/HostPackagesConstants.js +14 -1
  240. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/SecondaryTabsRoutes.js +6 -4
  241. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/constants.js +1 -0
  242. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/index.js +1 -0
  243. data/webpack/components/extensions/HostDetails/Tabs/{ErrataTab.js → ErrataTab/ErrataTab.js} +86 -75
  244. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab/ErrataTab.scss +11 -0
  245. data/webpack/components/extensions/HostDetails/Tabs/{ErratumExpansionContents.js → ErrataTab/ErratumExpansionContents.js} +3 -3
  246. data/webpack/components/extensions/HostDetails/Tabs/{ErratumExpansionDetail.js → ErrataTab/ErratumExpansionDetail.js} +0 -0
  247. data/webpack/components/extensions/HostDetails/{HostErrata → Tabs/ErrataTab}/HostErrataActions.js +3 -3
  248. data/webpack/components/extensions/HostDetails/{HostErrata → Tabs/ErrataTab}/HostErrataConstants.js +11 -0
  249. data/webpack/components/extensions/HostDetails/{HostErrata → Tabs/ErrataTab}/HostErrataSelectors.js +0 -0
  250. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsActions.js +16 -0
  251. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsConstants.js +3 -0
  252. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsSelectors.js +19 -0
  253. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsTab.js +241 -0
  254. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/__tests__/moduleStreamsTab.test.js +108 -0
  255. data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/__tests__/modules.fixtures.json +34 -0
  256. data/webpack/components/extensions/HostDetails/Tabs/PackageInstallModal.js +279 -0
  257. data/webpack/components/extensions/HostDetails/Tabs/PackageInstallModal.scss +3 -0
  258. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab.js +357 -64
  259. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab.scss +3 -7
  260. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionActions.js +103 -4
  261. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionConstants.js +6 -1
  262. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab.js +45 -42
  263. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab.scss +3 -3
  264. data/webpack/components/extensions/HostDetails/Tabs/{EnableTracerEmptyState.js → TracesTab/EnableTracerEmptyState.js} +0 -0
  265. data/webpack/components/extensions/HostDetails/Tabs/{EnableTracerModal.js → TracesTab/EnableTracerModal.js} +3 -2
  266. data/webpack/components/extensions/HostDetails/Tabs/{HostTracesActions.js → TracesTab/HostTracesActions.js} +2 -2
  267. data/webpack/components/extensions/HostDetails/Tabs/{HostTracesConstants.js → TracesTab/HostTracesConstants.js} +0 -0
  268. data/webpack/components/extensions/HostDetails/Tabs/{HostTracesSelectors.js → TracesTab/HostTracesSelectors.js} +0 -0
  269. data/webpack/components/extensions/HostDetails/Tabs/{TracesTab.js → TracesTab/TracesTab.js} +66 -61
  270. data/webpack/components/extensions/HostDetails/Tabs/TracesTab/TracesTab.scss +11 -0
  271. data/webpack/components/extensions/HostDetails/Tabs/__tests__/errataTab.test.js +17 -18
  272. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packageInstallModal.test.js +385 -0
  273. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packages.fixtures.json +1 -1
  274. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packagesTab.test.js +312 -11
  275. data/webpack/components/extensions/HostDetails/Tabs/__tests__/repositorySetsTab.test.js +2 -2
  276. data/webpack/components/extensions/HostDetails/Tabs/__tests__/tracesTab.test.js +26 -30
  277. data/webpack/components/extensions/HostDetails/Tabs/__tests__/yumInstallablePackages.fixtures.json +72 -0
  278. data/webpack/components/extensions/HostDetails/Tabs/customizedRexUrlHelpers.js +25 -5
  279. data/webpack/components/extensions/HostDetails/YumInstallablePackages/YumInstallablePackagesActions.js +18 -0
  280. data/webpack/components/extensions/HostDetails/YumInstallablePackages/YumInstallablePackagesConstants.js +3 -0
  281. data/webpack/components/extensions/HostDetails/YumInstallablePackages/YumInstallablePackagesSelectors.js +16 -0
  282. data/webpack/components/extensions/HostDetails/hostDetailsHelpers.js +19 -0
  283. data/webpack/components/extensions/RegistrationCommands/__tests__/__snapshots__/ActivationKeys.test.js.snap +4 -0
  284. data/webpack/components/extensions/RegistrationCommands/fields/ActivationKeys.js +1 -1
  285. data/webpack/components/extensions/RegistrationCommands/fields/LifecycleEnvironment.js +1 -1
  286. data/webpack/components/extensions/about/SystemStatuses.js +1 -1
  287. data/webpack/components/extensions/about/SystemStatusesReducer.js +10 -10
  288. data/webpack/components/pf3Table/components/Table.js +4 -5
  289. data/webpack/components/pf3Table/components/Table.test.js +0 -3
  290. data/webpack/components/pf3Table/components/TableBody.js +2 -2
  291. data/webpack/components/pf3Table/components/__snapshots__/Table.test.js.snap +9 -8
  292. data/webpack/containers/Application/config.js +6 -1
  293. data/webpack/containers/Application/overrides.scss +56 -7
  294. data/webpack/global_index.js +4 -1
  295. data/webpack/global_test_setup.js +1 -1
  296. data/webpack/index.js +7 -0
  297. data/webpack/redux/OrganizationProducts/OrganizationProductsReducer.js +15 -15
  298. data/webpack/redux/reducers/RedHatRepositories/enabled.js +43 -43
  299. data/webpack/redux/reducers/RedHatRepositories/repositorySetRepositories.js +43 -43
  300. data/webpack/redux/reducers/RedHatRepositories/sets.js +31 -31
  301. data/webpack/scenes/AnsibleCollections/AnsibleCollectionsReducer.js +26 -26
  302. data/webpack/scenes/AnsibleCollections/Details/AnsibleCollectionDetailsReducer.js +19 -19
  303. data/webpack/scenes/AnsibleCollections/Details/__tests__/AnsibleCollectionDetails.test.js +0 -2
  304. data/webpack/scenes/AnsibleCollections/__tests__/AnsibleCollectionPage.test.js +0 -2
  305. data/webpack/scenes/AnsibleCollections/__tests__/AnsibleCollectionsTable.test.js +0 -2
  306. data/webpack/scenes/Content/ContentConfig.js +55 -5
  307. data/webpack/scenes/Content/ContentPage.js +5 -5
  308. data/webpack/scenes/Content/Details/ContentDetails.js +23 -21
  309. data/webpack/scenes/Content/Details/ContentInfo.js +2 -2
  310. data/webpack/scenes/Content/Details/ContentRepositories.js +1 -1
  311. data/webpack/scenes/Content/Details/__tests__/contentDetail.test.js +4 -4
  312. data/webpack/scenes/Content/Table/ContentTable.js +2 -2
  313. data/webpack/scenes/Content/__tests__/contentTable.test.js +3 -3
  314. data/webpack/scenes/ContentViews/ContentViewsConstants.js +5 -4
  315. data/webpack/scenes/ContentViews/ContentViewsPage.js +17 -13
  316. data/webpack/scenes/ContentViews/Copy/CopyContentViewForm.js +1 -1
  317. data/webpack/scenes/ContentViews/Create/CreateContentViewForm.js +3 -2
  318. data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionReassignHostsForm.js +2 -2
  319. data/webpack/scenes/ContentViews/Delete/__tests__/contentViewDelete.test.js +6 -6
  320. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewAddModal.js +22 -11
  321. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewBulkAddModal.js +31 -18
  322. data/webpack/scenes/ContentViews/Details/ComponentContentViews/ContentViewComponents.js +1 -1
  323. data/webpack/scenes/ContentViews/Details/ComponentContentViews/__tests__/contentViewComponents.test.js +2 -2
  324. data/webpack/scenes/ContentViews/Details/ContentViewDetailActions.js +22 -28
  325. data/webpack/scenes/ContentViews/Details/ContentViewDetailReducer.js +8 -8
  326. data/webpack/scenes/ContentViews/Details/ContentViewDetailSelectors.js +5 -5
  327. data/webpack/scenes/ContentViews/Details/ContentViewDetails.js +32 -30
  328. data/webpack/scenes/ContentViews/Details/ContentViewInfo.js +9 -4
  329. data/webpack/scenes/ContentViews/Details/DetailsContainer.js +14 -17
  330. data/webpack/scenes/ContentViews/Details/Filters/Add/CVFilterAddModal.js +3 -0
  331. data/webpack/scenes/ContentViews/Details/Filters/AffectedRepositories/AffectedRepositoryTable.js +1 -1
  332. data/webpack/scenes/ContentViews/Details/Filters/ArtifactsWithNoErrata.js +8 -8
  333. data/webpack/scenes/ContentViews/Details/Filters/CVContainerImageFilterContent.js +4 -4
  334. data/webpack/scenes/ContentViews/Details/Filters/CVErrataDateFilterContent.js +6 -6
  335. data/webpack/scenes/ContentViews/Details/Filters/CVErrataIDFilterContent.js +16 -9
  336. data/webpack/scenes/ContentViews/Details/Filters/CVFilterDetailType.js +46 -46
  337. data/webpack/scenes/ContentViews/Details/Filters/CVModuleStreamFilterContent.js +17 -17
  338. data/webpack/scenes/ContentViews/Details/Filters/CVPackageGroupFilterContent.js +17 -17
  339. data/webpack/scenes/ContentViews/Details/Filters/CVRpmFilterContent.js +4 -4
  340. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilterDetails.js +2 -2
  341. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilterDetailsHeader.js +17 -11
  342. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilters.js +1 -1
  343. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/__tests__/CVRpmMatchContentModal.test.js +2 -2
  344. data/webpack/scenes/ContentViews/Details/Filters/Rules/Package/AddEditPackageRuleModal.js +17 -17
  345. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVContainerImageFilterContent.test.js +2 -3
  346. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVRpmFilterContent.test.js +2 -9
  347. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilterDetails.test.js +3 -5
  348. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilters.test.js +2 -10
  349. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvErrataIDFilter.test.js +2 -3
  350. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvModuleStreamFilter.test.js +2 -3
  351. data/webpack/scenes/ContentViews/Details/Histories/__tests__/contentViewHistory.test.js +2 -2
  352. data/webpack/scenes/ContentViews/Details/Repositories/ContentCounts.js +1 -1
  353. data/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js +24 -3
  354. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewAddRemove.test.js +11 -5
  355. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersionContent.js +28 -28
  356. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersions.js +1 -1
  357. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVEnvironmentSelectionForm.js +18 -18
  358. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVReassignActivationKeysForm.js +3 -3
  359. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVReassignHostsForm.js +3 -3
  360. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvVersionRemove.test.js +6 -6
  361. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedActivationKeys.js +1 -1
  362. data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedHosts.js +1 -1
  363. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailConfig.js +31 -35
  364. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetails.js +9 -8
  365. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetails.scss +5 -2
  366. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsHeader.js +39 -40
  367. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsTable.js +46 -34
  368. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionRepositoryCell.js +66 -49
  369. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetails.test.js +5 -5
  370. data/webpack/scenes/ContentViews/Details/Versions/__tests__/contentViewVersions.test.js +3 -3
  371. data/webpack/scenes/ContentViews/Details/__tests__/contentViewDetail.test.js +5 -3
  372. data/webpack/scenes/ContentViews/Publish/CVPublishFinish.js +2 -2
  373. data/webpack/scenes/ContentViews/Table/ContentViewsTable.js +5 -5
  374. data/webpack/scenes/ContentViews/__tests__/contentViewPage.test.js +3 -3
  375. data/webpack/scenes/ContentViews/components/CVBreadCrumb.js +1 -1
  376. data/webpack/scenes/ContentViews/components/ContentViewsCounter.js +1 -1
  377. data/webpack/scenes/ContentViews/components/EnvironmentLabels.js +18 -18
  378. data/webpack/scenes/ContentViews/components/EnvironmentPaths/EnvironmentPaths.js +10 -10
  379. data/webpack/scenes/ContentViews/expansions/DetailsExpansion.js +2 -2
  380. data/webpack/scenes/ContentViews/expansions/RelatedContentViewComponentsModal.js +8 -8
  381. data/webpack/scenes/Hosts/ChangeContentSource/actions.js +43 -0
  382. data/webpack/scenes/Hosts/ChangeContentSource/components/ContentSourceForm.js +87 -0
  383. data/webpack/scenes/Hosts/ChangeContentSource/components/ContentSourceTemplate.js +90 -0
  384. data/webpack/scenes/Hosts/ChangeContentSource/components/FormField.js +43 -0
  385. data/webpack/scenes/Hosts/ChangeContentSource/constants.js +3 -0
  386. data/webpack/scenes/Hosts/ChangeContentSource/helpers.js +27 -0
  387. data/webpack/scenes/Hosts/ChangeContentSource/index.js +126 -0
  388. data/webpack/scenes/Hosts/ChangeContentSource/selectors.js +42 -0
  389. data/webpack/scenes/Hosts/ChangeContentSource/styles.scss +11 -0
  390. data/webpack/scenes/ModuleStreams/Details/ModuleStreamDetailsReducer.js +18 -18
  391. data/webpack/scenes/ModuleStreams/Details/Profiles/__tests__/ModuleStreamDetailProfiles.test.js +0 -1
  392. data/webpack/scenes/ModuleStreams/Details/__tests__/ModuleStreamDetails.test.js +0 -2
  393. data/webpack/scenes/ModuleStreams/ModuleStreamsReducer.js +26 -26
  394. data/webpack/scenes/ModuleStreams/__tests__/ModuleStreamPage.test.js +0 -2
  395. data/webpack/scenes/ModuleStreams/__tests__/ModuleStreamsTable.test.js +0 -2
  396. data/webpack/scenes/Organizations/OrganizationActions.js +5 -1
  397. data/webpack/scenes/Organizations/OrganizationReducer.js +8 -8
  398. data/webpack/scenes/RedHatRepositories/RedHatRepositoriesPage.js +31 -1
  399. data/webpack/scenes/RedHatRepositories/__tests__/RedHatRepositoriesPage.test.js +16 -0
  400. data/webpack/scenes/RedHatRepositories/__tests__/__snapshots__/RedHatRepositoriesPage.test.js.snap +11 -2
  401. data/webpack/scenes/RedHatRepositories/components/EnabledRepository/EnabledRepositoryContent.js +4 -4
  402. data/webpack/scenes/RedHatRepositories/components/RepositorySetRepositories.js +1 -1
  403. data/webpack/scenes/RedHatRepositories/helpers.js +5 -5
  404. data/webpack/scenes/RedHatRepositories/index.js +11 -3
  405. data/webpack/scenes/Settings/SettingsReducer.js +14 -14
  406. data/webpack/scenes/Settings/Tables/TableReducer.js +23 -23
  407. data/webpack/scenes/Subscriptions/Details/SubscriptionDetailInfo.js +2 -2
  408. data/webpack/scenes/Subscriptions/Details/SubscriptionDetailProductContent.js +15 -15
  409. data/webpack/scenes/Subscriptions/Details/SubscriptionDetailProducts.js +1 -1
  410. data/webpack/scenes/Subscriptions/Details/SubscriptionDetailReducer.js +34 -34
  411. data/webpack/scenes/Subscriptions/Details/SubscriptionDetails.js +13 -13
  412. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/AirGappedTypeForm.js +81 -0
  413. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnConfigurationConstants.js +13 -0
  414. data/webpack/scenes/Subscriptions/Manifest/{CdnConfigurationForm.scss → CdnConfigurationTab/CdnConfigurationForm.scss} +0 -0
  415. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnTypeForm.js +106 -0
  416. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/UpstreamServerTypeForm.js +259 -0
  417. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/AirGappedTypeForm.test.js +44 -0
  418. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/CdnTypeForm.test.js +67 -0
  419. data/webpack/scenes/Subscriptions/Manifest/{__tests__/CdnConfigurationForm.test.js → CdnConfigurationTab/__tests__/UpstreamServerTypeForm.test.js} +46 -17
  420. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/index.js +97 -0
  421. data/webpack/scenes/Subscriptions/Manifest/ManageManifestModal.js +11 -6
  422. data/webpack/scenes/Subscriptions/Manifest/ManifestHistoryReducer.js +16 -16
  423. data/webpack/scenes/Subscriptions/SubscriptionReducer.js +149 -149
  424. data/webpack/scenes/Subscriptions/UpstreamSubscriptions/UpstreamSubscriptionsReducer.js +41 -41
  425. data/webpack/scenes/Subscriptions/UpstreamSubscriptions/__tests__/UpstreamSubscriptionsPage.test.js +0 -1
  426. data/webpack/scenes/Subscriptions/__tests__/SubscriptionsPage.test.js +0 -1
  427. data/webpack/scenes/Subscriptions/__tests__/__snapshots__/SubscriptionsActions.test.js.snap +3 -2
  428. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/__tests__/SubscriptionsTable.test.js +4 -0
  429. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/__tests__/__snapshots__/SubscriptionsTable.test.js.snap +9 -0
  430. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/components/Dialogs/DeleteDialog.js +6 -6
  431. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/components/Table.js +12 -12
  432. data/webpack/scenes/Tasks/TaskActions.js +1 -1
  433. data/webpack/scenes/Tasks/__tests__/__snapshots__/TaskActions.test.js.snap +3 -2
  434. data/webpack/services/api/testHelpers.js +5 -3
  435. data/webpack/services/index.js +36 -36
  436. data/webpack/utils/helpers.js +11 -8
  437. metadata +98 -60
  438. data/app/services/katello/pulp/deb.rb +0 -55
  439. data/app/services/katello/pulp/distribution.rb +0 -7
  440. data/app/services/katello/pulp/docker_blob.rb +0 -7
  441. data/app/services/katello/pulp/docker_manifest.rb +0 -13
  442. data/app/services/katello/pulp/docker_manifest_list.rb +0 -14
  443. data/app/services/katello/pulp/docker_tag.rb +0 -14
  444. data/app/services/katello/pulp/erratum.rb +0 -129
  445. data/app/services/katello/pulp/file_unit.rb +0 -21
  446. data/app/services/katello/pulp/module_stream.rb +0 -39
  447. data/app/services/katello/pulp/package_category.rb +0 -7
  448. data/app/services/katello/pulp/package_group.rb +0 -20
  449. data/app/services/katello/pulp/pulp_content_unit.rb +0 -156
  450. data/app/services/katello/pulp/rpm.rb +0 -57
  451. data/app/services/katello/pulp/srpm.rb +0 -29
  452. data/app/services/katello/pulp/yum_metadata_file.rb +0 -30
  453. data/lib/monkeys/pulp3_13_checksumfix.rb +0 -17
  454. data/webpack/__mocks__/foremanReact/components/Pagination/PaginationHooks.js +0 -2
  455. data/webpack/__mocks__/foremanReact/components/Pagination/PaginationWrapper.js +0 -2
  456. data/webpack/components/extensions/HostDetails/Tabs/ErrataTab.scss +0 -16
  457. data/webpack/components/extensions/HostDetails/Tabs/TracesTab.scss +0 -12
  458. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationForm.js +0 -185
@@ -9,31 +9,31 @@ const initialState = initialApiState;
9
9
 
10
10
  export default (state = initialState, action) => {
11
11
  switch (action.type) {
12
- case ANSIBLE_COLLECTIONS_REQUEST: {
13
- return state.set('loading', true);
14
- }
15
- case ANSIBLE_COLLECTIONS_SUCCESS: {
16
- const {
17
- results, page, per_page, subtotal, // eslint-disable-line camelcase
18
- } = action.response;
19
- return state.merge({
20
- results,
21
- loading: false,
22
- pagination: {
23
- page: Number(page),
24
- perPage: Number(per_page || state.pagination.perPage), // eslint-disable-line camelcase
25
- },
26
- itemCount: Number(subtotal),
27
- });
28
- }
29
- case ANSIBLE_COLLECTIONS_ERROR: {
30
- return state.merge({
31
- error: action.error,
32
- loading: false,
33
- });
34
- }
35
- default: {
36
- return state;
37
- }
12
+ case ANSIBLE_COLLECTIONS_REQUEST: {
13
+ return state.set('loading', true);
14
+ }
15
+ case ANSIBLE_COLLECTIONS_SUCCESS: {
16
+ const {
17
+ results, page, per_page, subtotal, // eslint-disable-line camelcase
18
+ } = action.response;
19
+ return state.merge({
20
+ results,
21
+ loading: false,
22
+ pagination: {
23
+ page: Number(page),
24
+ perPage: Number(per_page || state.pagination.perPage), // eslint-disable-line camelcase
25
+ },
26
+ itemCount: Number(subtotal),
27
+ });
28
+ }
29
+ case ANSIBLE_COLLECTIONS_ERROR: {
30
+ return state.merge({
31
+ error: action.error,
32
+ loading: false,
33
+ });
34
+ }
35
+ default: {
36
+ return state;
37
+ }
38
38
  }
39
39
  };
@@ -7,24 +7,24 @@ import {
7
7
 
8
8
  export default (state = initialApiState, action) => {
9
9
  switch (action.type) {
10
- case ANSIBLE_COLLECTION_DETAILS_REQUEST: {
11
- return state.set('loading', true);
12
- }
13
- case ANSIBLE_COLLECTION_DETAILS_SUCCESS: {
14
- const ansibleCollectionDetails = action.response;
15
- return state.merge({
16
- ...ansibleCollectionDetails,
17
- loading: false,
18
- });
19
- }
20
- case ANSIBLE_COLLECTION_DETAILS_ERROR: {
21
- return state.merge({
22
- error: action.payload.message,
23
- loading: false,
24
- });
25
- }
26
- default: {
27
- return state;
28
- }
10
+ case ANSIBLE_COLLECTION_DETAILS_REQUEST: {
11
+ return state.set('loading', true);
12
+ }
13
+ case ANSIBLE_COLLECTION_DETAILS_SUCCESS: {
14
+ const ansibleCollectionDetails = action.response;
15
+ return state.merge({
16
+ ...ansibleCollectionDetails,
17
+ loading: false,
18
+ });
19
+ }
20
+ case ANSIBLE_COLLECTION_DETAILS_ERROR: {
21
+ return state.merge({
22
+ error: action.payload.message,
23
+ loading: false,
24
+ });
25
+ }
26
+ default: {
27
+ return state;
28
+ }
29
29
  }
30
30
  };
@@ -2,8 +2,6 @@ import { testComponentSnapshotsWithFixtures } from 'react-redux-test-utils';
2
2
  import AnsibleCollectionDetails from '../AnsibleCollectionDetails';
3
3
  import { details, loadingState } from './AnsibleCollectionDetails.fixtures';
4
4
 
5
- jest.mock('foremanReact/components/Pagination/PaginationWrapper');
6
-
7
5
  const mockFunc = jest.fn();
8
6
 
9
7
  const baseProps = {
@@ -4,8 +4,6 @@ import toJson from 'enzyme-to-json';
4
4
  import AnsibleCollectionsPage from '../AnsibleCollectionsPage';
5
5
  import ContentPage from '../../../components/Content/ContentPage';
6
6
 
7
- jest.mock('foremanReact/components/Pagination/PaginationWrapper', () => (<div>Pagination Mock</div>));
8
-
9
7
  describe('Ansible Collections page', () => {
10
8
  it('should render and contain appropiate components', async () => {
11
9
  const ansibleCollections = {};
@@ -5,8 +5,6 @@ import ContentTable from '../../../components/Content/ContentTable';
5
5
  import TableSchema from '../../AnsibleCollections/AnsibleCollectionsTableSchema';
6
6
  import { Table } from '../../../components/pf3Table';
7
7
 
8
- jest.mock('foremanReact/components/Pagination/PaginationWrapper', () => (<div>Pagination Mock</div>));
9
-
10
8
  describe('Ansible Collections table', () => {
11
9
  it('should render and contain appropiate components', async () => {
12
10
  const ansibleCollections = {
@@ -1,5 +1,4 @@
1
1
  import React from 'react';
2
- import { Link } from 'react-router-dom';
3
2
  import { urlBuilder } from 'foremanReact/common/urlHelpers';
4
3
  import { translate as __ } from 'foremanReact/common/I18n';
5
4
  import ContentInfo from './Details/ContentInfo';
@@ -7,7 +6,8 @@ import LastSync from '../ContentViews/Details/Repositories/LastSync';
7
6
  import ContentRepositories from './Details/ContentRepositories';
8
7
  import ContentCounts from '../ContentViews/Details/Repositories/ContentCounts';
9
8
 
10
- export default () => [
9
+ // Keep in mind when editing this file that the ContentViewVersionDetailConfig consumes this array.
10
+ export default [
11
11
  {
12
12
  names: {
13
13
  pluralTitle: __('Python Packages'),
@@ -18,7 +18,7 @@ export default () => [
18
18
  singularLabel: 'python_package',
19
19
  },
20
20
  columnHeaders: [
21
- { title: __('Name'), getProperty: unit => (<Link to={urlBuilder(`content/python_packages/${unit?.id}`, '')}>{unit?.name}</Link>) },
21
+ { title: __('Name'), getProperty: unit => (<a href={urlBuilder(`content/python_packages/${unit?.id}`, '')}>{unit?.name}</a>) },
22
22
  { title: __('Version'), getProperty: unit => unit?.version },
23
23
  { title: __('Filename'), getProperty: unit => unit?.filename },
24
24
  ],
@@ -82,6 +82,57 @@ export default () => [
82
82
  pluralLabel: 'ostree_refs',
83
83
  singularLabel: 'ostree_ref',
84
84
  },
85
+ columnHeaders: [
86
+ { title: __('Name'), getProperty: unit => (<a href={urlBuilder(`content/ostree_refs/${unit?.id}`, '')}>{unit?.name}</a>) },
87
+ { title: __('Version'), getProperty: unit => unit?.version },
88
+ ],
89
+ tabs: [
90
+ {
91
+ tabKey: 'details',
92
+ title: __('Details'),
93
+ getContent: (contentType, id, tabKey) => <ContentInfo {...{ contentType, id, tabKey }} />,
94
+ columnHeaders: [
95
+ { title: __('Name'), getProperty: unit => unit?.name },
96
+ { title: __('Version'), getProperty: unit => unit?.version },
97
+ ],
98
+ },
99
+ {
100
+ tabKey: 'repositories',
101
+ title: __('Repositories'),
102
+ getContent: (contentType, id, tabKey) =>
103
+ <ContentRepositories {...{ contentType, id, tabKey }} />,
104
+ columnHeaders: [
105
+ {
106
+ title: __('Name'),
107
+ getProperty: unit =>
108
+ <a href={urlBuilder(`products/${unit?.product.id}/repositories/${unit?.id}`, '')}>{unit?.name}</a>,
109
+ },
110
+ {
111
+ title: __('Product'),
112
+ getProperty: unit =>
113
+ <a href={urlBuilder(`products/${unit?.product.id}`, '')}>{unit?.product.name}</a>,
114
+ },
115
+ {
116
+ title: __('Sync Status'),
117
+ getProperty: unit =>
118
+ (<LastSync
119
+ startedAt={unit?.started_at}
120
+ lastSyncWords={unit?.last_sync_words}
121
+ lastSync={unit?.last_sync}
122
+ />),
123
+ },
124
+ {
125
+ title: __('Content Count'),
126
+ getProperty: unit =>
127
+ (<ContentCounts
128
+ productId={unit.product.id}
129
+ repoId={unit.id}
130
+ counts={unit.content_counts}
131
+ />),
132
+ },
133
+ ],
134
+ },
135
+ ],
85
136
  },
86
137
  {
87
138
  names: {
@@ -93,11 +144,10 @@ export default () => [
93
144
  singularLabel: 'ansible_collection',
94
145
  },
95
146
  columnHeaders: [
96
- { title: __('Name'), getProperty: unit => (<Link to={urlBuilder(`content/ansible_collections/${unit?.id}`, '')}>{unit?.name}</Link>) },
147
+ { title: __('Name'), getProperty: unit => (<a href={urlBuilder(`content/ansible_collections/${unit?.id}`, '')}>{unit?.name}</a>) },
97
148
  { title: __('Author'), getProperty: unit => unit?.namespace },
98
149
  { title: __('Version'), getProperty: unit => unit?.version },
99
150
  { title: __('Checksum'), getProperty: unit => unit?.checksum },
100
-
101
151
  ],
102
152
  tabs: [
103
153
  {
@@ -27,7 +27,7 @@ const ContentPage = () => {
27
27
  const types = {};
28
28
  contentTypesResponse.forEach((type) => {
29
29
  if (type.generic_browser) {
30
- const typeConfig = ContentConfig().find(config =>
30
+ const typeConfig = ContentConfig.find(config =>
31
31
  config.names.singularLabel === type.label);
32
32
  if (typeConfig) {
33
33
  const { names } = typeConfig;
@@ -70,16 +70,16 @@ const ContentPage = () => {
70
70
  }
71
71
 
72
72
  return (
73
- <Grid className="grid-with-margin">
74
- <GridItem span={12}>
73
+ <Grid>
74
+ <GridItem span={12} className="margin-24">
75
75
  <TextContent>
76
76
  <Text component={TextVariants.h1}>{__(`${selectedContentType}`)}</Text>
77
77
  </TextContent>
78
78
  </GridItem>
79
79
  <GridItem span={12}>
80
80
  <ContentTable {...{
81
- selectedContentType, setSelectedContentType, contentTypes, showContentTypeSelector,
82
- }}
81
+ selectedContentType, setSelectedContentType, contentTypes, showContentTypeSelector,
82
+ }}
83
83
  />
84
84
  </GridItem>
85
85
  </Grid>
@@ -16,7 +16,7 @@ const ContentDetails = () => {
16
16
 
17
17
  const { id, content_type: contentType } = useParams();
18
18
  const contentId = Number(id);
19
- const config = ContentConfig().find(type =>
19
+ const config = ContentConfig.find(type =>
20
20
  type.names.pluralLabel === contentType);
21
21
  const { pluralTitle, pluralLabel } = config.names;
22
22
 
@@ -38,29 +38,31 @@ const ContentDetails = () => {
38
38
  }
39
39
 
40
40
  return (
41
- <Grid className="grid-with-margin">
42
- <Breadcrumb style={{ marginTop: '15px', marginBottom: '15px' }}>
43
- <BreadcrumbItem
44
- aria-label="content_breadcrumb"
45
- render={() => (<Link to={`/content/${pluralLabel}`}>{pluralTitle}</Link>)}
46
- />
47
- <BreadcrumbItem
48
- aria-label="content_breadcrumb_content"
49
- isActive
50
- > {contentDetailsResponse.name}
51
- </BreadcrumbItem>
52
- </Breadcrumb>
53
- <GridItem span={12} >
54
- <Flex>
55
- <TextContent>
56
- <Text component={TextVariants.h1}> {contentDetailsResponse.name} </Text>
57
- </TextContent>
58
- </Flex>
59
- </GridItem>
41
+ <Grid>
42
+ <Grid className="margin-16-24">
43
+ <Breadcrumb>
44
+ <BreadcrumbItem
45
+ aria-label="content_breadcrumb"
46
+ render={() => (<Link to={`/content/${pluralLabel}`}>{pluralTitle}</Link>)}
47
+ />
48
+ <BreadcrumbItem
49
+ aria-label="content_breadcrumb_content"
50
+ isActive
51
+ > {contentDetailsResponse.name}
52
+ </BreadcrumbItem>
53
+ </Breadcrumb>
54
+ <GridItem span={12} className="margin-top-24">
55
+ <Flex>
56
+ <TextContent>
57
+ <Text component={TextVariants.h1}> {contentDetailsResponse.name} </Text>
58
+ </TextContent>
59
+ </Flex>
60
+ </GridItem>
61
+ </Grid>
60
62
  <GridItem span={12}>
61
63
  <RoutedTabs tabs={tabs} baseUrl={`/${contentType}/${contentId}`} defaultTabIndex={0} />
62
64
  </GridItem>
63
- </Grid>
65
+ </Grid >
64
66
  );
65
67
  };
66
68
  export default ContentDetails;
@@ -19,7 +19,7 @@ const ContentInfo = ({ contentType, id, tabKey }) => {
19
19
  const detailsResponse = useSelector(selectContentDetails);
20
20
  const detailsStatus = useSelector(selectContentDetailsStatus);
21
21
 
22
- const config = contentConfig().find(type => type.names.pluralLabel === contentType);
22
+ const config = contentConfig.find(type => type.names.pluralLabel === contentType);
23
23
  const { columnHeaders } = config.tabs.find(header => header.tabKey === tabKey);
24
24
 
25
25
  useEffect(() => {
@@ -33,7 +33,7 @@ const ContentInfo = ({ contentType, id, tabKey }) => {
33
33
  }
34
34
 
35
35
  return (
36
- <TextContent>
36
+ <TextContent className="margin-0-24">
37
37
  <TextList component={TextListVariants.dl}>
38
38
  {columnHeaders.map((col, index) => [
39
39
  <TextListItem
@@ -20,7 +20,7 @@ const ContentRepositories = ({ contentType, id, tabKey }) => {
20
20
  const [searchQuery, updateSearchQuery] = useState('');
21
21
  const { results, ...metadata } = response;
22
22
 
23
- const config = contentConfig().find(type => type.names.pluralLabel === contentType);
23
+ const config = contentConfig.find(type => type.names.pluralLabel === contentType);
24
24
  const typeSingularLabel = config.names.singularLabel;
25
25
  const { columnHeaders } = config.tabs.find(header => header.tabKey === tabKey);
26
26
 
@@ -59,8 +59,8 @@ test('Can call API for Python package details and show details tab on page load'
59
59
  test('Can call API for Python package repository details and show repositories tab', async (done) => {
60
60
  const autocompleteUrl = '/repositories/auto_complete_search';
61
61
  const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl);
62
- searchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 500);
63
- autoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing', true);
62
+ searchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 0);
63
+ autoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing');
64
64
 
65
65
  const results = pythonPackageRepositoryDetailsResponse.results[0];
66
66
  const repoName = results.name;
@@ -122,8 +122,8 @@ test('Can call API for Ansible collection details and show details tab on page l
122
122
  test('Can call API for Ansible collection repository details and show repositories tab', async (done) => {
123
123
  const autocompleteUrl = '/repositories/auto_complete_search';
124
124
  const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl);
125
- searchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 500);
126
- autoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing', true);
125
+ searchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 0);
126
+ autoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing');
127
127
 
128
128
  const results = ansibleCollectionRepositoryDetailsResponse.results[0];
129
129
  const repoName = results.name;
@@ -18,7 +18,7 @@ const ContentTable = ({
18
18
  const [searchQuery, updateSearchQuery] = useState('');
19
19
  const { results, ...metadata } = response;
20
20
 
21
- const { columnHeaders } = contentConfig().find(type =>
21
+ const { columnHeaders } = contentConfig.find(type =>
22
22
  type.names.singularLabel === contentTypes[selectedContentType][0]);
23
23
 
24
24
  return (
@@ -78,7 +78,7 @@ const ContentTable = ({
78
78
  ContentTable.propTypes = {
79
79
  selectedContentType: PropTypes.string.isRequired,
80
80
  setSelectedContentType: PropTypes.func.isRequired,
81
- contentTypes: PropTypes.objectOf(PropTypes.array).isRequired,
81
+ contentTypes: PropTypes.shape({}).isRequired,
82
82
  showContentTypeSelector: PropTypes.bool,
83
83
  };
84
84
 
@@ -16,8 +16,8 @@ let searchDelayScope;
16
16
  let autoSearchScope;
17
17
 
18
18
  beforeEach(() => {
19
- searchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 500);
20
- autoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing', true);
19
+ searchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 0);
20
+ autoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing');
21
21
  });
22
22
 
23
23
  afterEach(() => {
@@ -74,7 +74,7 @@ test('Can call API for Ansible collections and show table on page load', async (
74
74
  renderWithRedux(<ContentTable
75
75
  contentTypes={mockContentTypes}
76
76
  selectedContentType="Ansible Collections"
77
- setSelectedContentType={() => {}}
77
+ setSelectedContentType={() => { }}
78
78
  showContentTypeSelector={false}
79
79
  />);
80
80
 
@@ -1,4 +1,5 @@
1
1
  import { translate as __ } from 'foremanReact/common/I18n';
2
+ import { toUpper } from 'lodash';
2
3
 
3
4
  const CONTENT_VIEWS_KEY = 'CONTENT_VIEWS';
4
5
  export const CREATE_CONTENT_VIEW_KEY = 'CONTENT_VIEW_CREATE';
@@ -22,11 +23,11 @@ export const RPM_PACKAGE_GROUPS_CONTENT = 'RPM_PACKAGE_GROUPS_CONTENT';
22
23
  export const REPOSITORY_CONTENT = 'REPOSITORY_CONTENT';
23
24
  export const ERRATA_CONTENT = 'ERRATA_CONTENT';
24
25
  export const DOCKER_TAGS_CONTENT = 'DOCKER_TAGS_CONTENT';
25
- export const ANSIBLE_COLLECTIONS_CONTENT = 'ANSIBLE_COLLECTIONS_CONTENT';
26
26
  export const MODULE_STREAMS_CONTENT = 'MODULE_STREAMS_CONTENT';
27
27
  export const DEB_PACKAGES_CONTENT = 'DEB_PACKAGES_CONTENT';
28
28
  export const RPM_PACKAGES_CONTENT = 'RPM_PACKAGES_CONTENT';
29
29
  export const FILE_CONTENT = 'FILE_CONTENT';
30
+ export const generatedContentKey = pluralLabel => `${toUpper(pluralLabel)}_CONTENT`;
30
31
  export const cvDetailsKey = cvId => `${CONTENT_VIEWS_KEY}_${cvId}`;
31
32
  export const cvDetailsRepoKey = cvId => `${CONTENT_VIEWS_KEY}_REPOSITORIES_${cvId}`;
32
33
  export const cvFilterRepoKey = filterId => `CV_FILTER_REPOSITORIES_${filterId}`;
@@ -55,9 +56,9 @@ export const addComponentSuccessMessage = component => (component ? __('Updated
55
56
 
56
57
 
57
58
  // Repo added to content view status display and key
58
- export const ADDED = __('Added');
59
- export const NOT_ADDED = __('Not added');
60
- export const ALL_STATUSES = __('All');
59
+ export const ADDED = 'Added';
60
+ export const NOT_ADDED = 'Not added';
61
+ export const ALL_STATUSES = 'All';
61
62
 
62
63
  export const REPOSITORY_TYPES = 'REPOSITORY_TYPES';
63
64
  export const FILTER_TYPES = ['rpm', 'package_group', 'erratum_date', 'erratum_id', 'docker', 'modulemd'];
@@ -5,19 +5,23 @@ import ContentViewsTable from './Table/ContentViewsTable';
5
5
  import ContentViewsCounter from './components/ContentViewsCounter';
6
6
 
7
7
  const ContentViewsPage = () => (
8
- <Grid className="grid-with-margin">
9
- <GridItem span={12}>
10
- <TextContent>
11
- <Text component={TextVariants.h1}>{__('Content Views')}</Text>
12
- </TextContent>
13
- </GridItem>
14
- <GridItem span={12}>
15
- <ContentViewsCounter />
16
- </GridItem>
17
- <GridItem span={12}>
18
- <ContentViewsTable />
19
- </GridItem>
20
- </Grid>
8
+ <>
9
+ <Grid className="margin-24">
10
+ <GridItem span={12}>
11
+ <TextContent>
12
+ <Text component={TextVariants.h1}>{__('Content views')}</Text>
13
+ </TextContent>
14
+ </GridItem>
15
+ <GridItem span={12} className="margin-top-8">
16
+ <ContentViewsCounter />
17
+ </GridItem>
18
+ </Grid>
19
+ <Grid>
20
+ <GridItem span={12}>
21
+ <ContentViewsTable />
22
+ </GridItem>
23
+ </Grid>
24
+ </>
21
25
  );
22
26
 
23
27
  export default ContentViewsPage;
@@ -61,7 +61,7 @@ const CopyContentViewForm = ({ cvId, setModalOpen }) => {
61
61
  <Button
62
62
  aria-label="copy_content_view"
63
63
  variant="primary"
64
- isDisabled={name.length <= 2 || saving}
64
+ isDisabled={!name?.length || saving}
65
65
  type="submit"
66
66
  >
67
67
  {__('Copy content view')}
@@ -61,10 +61,11 @@ const CreateContentViewForm = ({ setModalOpen }) => {
61
61
 
62
62
  if (redirect) {
63
63
  const { id } = response;
64
- return (<Redirect to={`/content_views/${id}`} />);
64
+ if (composite) { return (<Redirect to={`/content_views/${id}#/contentviews`} />); }
65
+ return (<Redirect to={`/content_views/${id}#/repositories`} />);
65
66
  }
66
67
 
67
- const submitDisabled = name.length <= 2 || label.length <= 2 || saving;
68
+ const submitDisabled = !name?.length || !label?.length || saving;
68
69
 
69
70
  return (
70
71
  <Form onSubmit={(e) => {
@@ -107,8 +107,8 @@ const CVDeletionReassignHostsForm = () => {
107
107
  >
108
108
  <AffectedHosts
109
109
  {...{
110
- cvId,
111
- }}
110
+ cvId,
111
+ }}
112
112
  versionEnvironments={cvEnvironments}
113
113
  deleteCV
114
114
  />
@@ -44,8 +44,8 @@ beforeEach(() => {
44
44
  .get('/api/v2/bookmarks')
45
45
  .query(true)
46
46
  .reply(200, {});
47
- searchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 500);
48
- autoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing', true);
47
+ searchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 0);
48
+ autoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing');
49
49
  });
50
50
 
51
51
  afterEach(() => {
@@ -99,12 +99,12 @@ test('Can call API for CVs and show Delete Wizard for the row', async (done) =>
99
99
  test('Can open Delete wizard and delete CV with all steps', async (done) => {
100
100
  const hostAutocompleteUrl = '/hosts/auto_complete_search';
101
101
  const hostAutocompleteScope = mockForemanAutocomplete(nockInstance, hostAutocompleteUrl);
102
- const hostSearchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 500);
103
- const hostAutoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing', true);
102
+ const hostSearchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 0);
103
+ const hostAutoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing');
104
104
  const akAutocompleteUrl = '/activation_keys/auto_complete_search';
105
105
  const akAutocompleteScope = mockAutocomplete(nockInstance, akAutocompleteUrl);
106
- const akSearchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 500);
107
- const akAutoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing', true);
106
+ const akSearchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 0);
107
+ const akAutoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing');
108
108
 
109
109
  const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl);
110
110
 
@@ -1,10 +1,11 @@
1
1
  import React, { useState, useEffect } from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import {
4
- Modal, ModalVariant, FormSelect,
4
+ Flex, Modal, ModalVariant, FormSelect,
5
5
  FormSelectOption, Checkbox, Form, FormGroup,
6
- ActionGroup, Button,
6
+ ActionGroup, Button, Tooltip,
7
7
  } from '@patternfly/react-core';
8
+ import { OutlinedQuestionCircleIcon } from '@patternfly/react-icons';
8
9
  import { useDispatch, useSelector, shallowEqual } from 'react-redux';
9
10
  import { translate as __ } from 'foremanReact/common/I18n';
10
11
  import { STATUS } from 'foremanReact/constants';
@@ -116,21 +117,31 @@ const ComponentContentViewAddModal = ({
116
117
  </FormSelect>
117
118
  </FormGroup>
118
119
  <FormGroup fieldId="latest">
119
- <Checkbox
120
- style={{ marginTop: 0 }}
121
- id="latest"
122
- name="latest"
123
- label={__('Always update to latest version')}
124
- isChecked={formLatest}
125
- onChange={checked => updateLatest(checked)}
126
- />
120
+ <Flex style={{ display: 'inline-flex' }}>
121
+ <Checkbox
122
+ style={{ marginTop: 0 }}
123
+ id="latest"
124
+ name="latest"
125
+ label={__('Always update to latest version')}
126
+ isChecked={formLatest}
127
+ onChange={checked => updateLatest(checked)}
128
+ />
129
+ <Tooltip
130
+ position="top"
131
+ content={
132
+ __('This content view will be automatically updated to the latest version.')
133
+ }
134
+ >
135
+ <OutlinedQuestionCircleIcon />
136
+ </Tooltip>
137
+ </Flex>
127
138
  </FormGroup>
128
139
  <ActionGroup>
129
140
  <Button aria-label="add_component" variant="primary" type="submit">{__('Submit')}</Button>
130
141
  <Button variant="link" onClick={() => setIsOpen(false)}>{__('Cancel')}</Button>
131
142
  </ActionGroup>
132
143
  </Form>
133
- </Modal>);
144
+ </Modal >);
134
145
  };
135
146
 
136
147
  ComponentContentViewAddModal.propTypes = {