katello 4.3.0 → 4.4.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 (337) 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 +3 -0
  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_controller.rb +17 -7
  11. data/app/controllers/katello/api/v2/repository_sets_controller.rb +7 -0
  12. data/app/controllers/katello/concerns/api/v2/repository_content_controller.rb +3 -0
  13. data/app/controllers/katello/concerns/hosts_controller_extensions.rb +32 -0
  14. data/app/controllers/katello/remote_execution_controller.rb +5 -4
  15. data/app/helpers/katello/content_source_helper.rb +43 -0
  16. data/app/helpers/katello/hosts_and_hostgroups_helper.rb +4 -0
  17. data/app/lib/actions/katello/cdn_configuration/update.rb +5 -7
  18. data/app/lib/actions/katello/content_view/publish.rb +5 -0
  19. data/app/lib/actions/katello/content_view_version/incremental_update.rb +17 -3
  20. data/app/lib/actions/katello/repository/discover.rb +1 -14
  21. data/app/lib/actions/katello/repository/filtered_index_content.rb +1 -1
  22. data/app/lib/actions/pulp3/content_view_version/import.rb +7 -0
  23. data/app/lib/actions/pulp3/orchestration/content_view_version/import.rb +7 -5
  24. data/app/lib/actions/pulp3/repository/copy_content.rb +1 -1
  25. data/app/lib/actions/pulp3/repository/save_artifact.rb +1 -0
  26. data/app/lib/katello/concerns/base_template_scope_extensions.rb +11 -0
  27. data/app/lib/katello/errors.rb +3 -3
  28. data/app/lib/katello/logging.rb +6 -1
  29. data/app/lib/katello/repo_discovery.rb +27 -19
  30. data/app/lib/katello/resources/cdn/katello_cdn.rb +41 -3
  31. data/app/lib/katello/resources/cdn.rb +4 -2
  32. data/app/lib/katello/util/deduplication_migrator.rb +105 -0
  33. data/app/models/katello/candlepin/repository_mapper.rb +1 -1
  34. data/app/models/katello/cdn_configuration.rb +38 -6
  35. data/app/models/katello/concerns/host_managed_extensions.rb +23 -1
  36. data/app/models/katello/concerns/organization_extensions.rb +5 -1
  37. data/app/models/katello/concerns/pulp_database_unit.rb +59 -173
  38. data/app/models/katello/concerns/remote_execution_proxy_selector_extensions.rb +11 -0
  39. data/app/models/katello/concerns/smart_proxy_extensions.rb +1 -1
  40. data/app/models/katello/content_view.rb +4 -4
  41. data/app/models/katello/content_view_filter.rb +1 -1
  42. data/app/models/katello/content_view_history.rb +1 -1
  43. data/app/models/katello/content_view_version.rb +6 -2
  44. data/app/models/katello/content_view_version_export_history.rb +1 -1
  45. data/app/models/katello/deb.rb +1 -3
  46. data/app/models/katello/docker_meta_tag.rb +1 -1
  47. data/app/models/katello/erratum.rb +0 -15
  48. data/app/models/katello/glue/pulp/repos.rb +1 -1
  49. data/app/models/katello/host/content_facet.rb +2 -27
  50. data/app/models/katello/host/info_provider.rb +9 -0
  51. data/app/models/katello/host/subscription_facet.rb +2 -2
  52. data/app/models/katello/hostgroup/content_facet.rb +2 -2
  53. data/app/models/katello/product.rb +1 -1
  54. data/app/models/katello/product_content.rb +2 -2
  55. data/app/models/katello/repository.rb +10 -9
  56. data/app/models/katello/root_repository.rb +24 -13
  57. data/app/models/katello/rpm.rb +8 -2
  58. data/app/models/setting/content.rb +6 -3
  59. data/app/services/cert/rhsm_client.rb +1 -5
  60. data/app/services/katello/content_unit_indexer.rb +166 -0
  61. data/app/services/katello/organization_creator.rb +12 -4
  62. data/app/services/katello/pulp/repository/docker.rb +1 -1
  63. data/app/services/katello/pulp/repository/yum.rb +0 -54
  64. data/app/services/katello/pulp/repository.rb +0 -6
  65. data/app/services/katello/pulp3/ansible_collection.rb +26 -10
  66. data/app/services/katello/pulp3/api/apt.rb +7 -0
  67. data/app/services/katello/pulp3/content_view_version/import.rb +11 -2
  68. data/app/services/katello/pulp3/deb.rb +10 -9
  69. data/app/services/katello/pulp3/docker_manifest.rb +6 -5
  70. data/app/services/katello/pulp3/docker_manifest_list.rb +23 -6
  71. data/app/services/katello/pulp3/docker_tag.rb +16 -7
  72. data/app/services/katello/pulp3/erratum.rb +51 -56
  73. data/app/services/katello/pulp3/file_unit.rb +9 -6
  74. data/app/services/katello/pulp3/generic_content_unit.rb +11 -12
  75. data/app/services/katello/pulp3/module_stream.rb +76 -30
  76. data/app/services/katello/pulp3/package_group.rb +5 -5
  77. data/app/services/katello/pulp3/pulp_content_unit.rb +19 -11
  78. data/app/services/katello/pulp3/repository/apt.rb +5 -3
  79. data/app/services/katello/pulp3/repository/docker.rb +14 -7
  80. data/app/services/katello/pulp3/repository/generic.rb +1 -1
  81. data/app/services/katello/pulp3/repository/yum.rb +10 -12
  82. data/app/services/katello/pulp3/repository.rb +26 -7
  83. data/app/services/katello/pulp3/repository_mirror.rb +18 -5
  84. data/app/services/katello/pulp3/rpm.rb +13 -13
  85. data/app/services/katello/pulp3/srpm.rb +10 -9
  86. data/app/services/katello/repository_type.rb +15 -4
  87. data/app/services/katello/repository_type_manager.rb +1 -1
  88. data/app/services/katello/ui_notifications/subscriptions/manifest_expired_warning.rb +1 -1
  89. data/app/services/katello/upstream_connection_checker.rb +2 -2
  90. data/app/views/foreman/job_templates/change_content_source.erb +1 -31
  91. data/app/views/foreman/job_templates/install_errata.erb +6 -9
  92. data/app/views/foreman/job_templates/install_errata_by_search_query.erb +26 -0
  93. data/app/views/foreman/job_templates/install_packages_by_search_query.erb +19 -0
  94. data/app/views/katello/api/v2/cdn_configurations/show.json.rabl +1 -1
  95. data/app/views/katello/api/v2/environments/show.json.rabl +9 -0
  96. data/app/views/katello/api/v2/repositories/show.json.rabl +2 -0
  97. data/app/views/katello/layouts/react.html.erb +0 -1
  98. data/app/views/katello/sync_management/_repo.html.erb +36 -25
  99. data/config/initializers/monkeys.rb +0 -1
  100. data/config/routes/api/v2.rb +1 -0
  101. data/config/routes/overrides.rb +3 -0
  102. data/config/routes.rb +2 -0
  103. data/db/migrate/20150930183738_migrate_content_hosts.rb +1 -1
  104. data/db/migrate/20180612164926_add_content_org_id.rb +2 -2
  105. data/db/migrate/20211201154845_add_unique_indexes.rb +20 -0
  106. data/db/migrate/20211208034230_add_content_view_and_lifecycle_environment.rb +6 -0
  107. data/db/migrate/20211220185935_clean_duplicate_content_units.rb +144 -0
  108. data/db/migrate/20220110223754_update_disconnected_settings.rb +20 -0
  109. data/db/migrate/20220120163252_fix_docker_download_policy.rb +11 -0
  110. data/db/migrate/20220124191056_add_type_to_cdn_configuration.rb +22 -0
  111. data/db/migrate/20220127120843_fix_debian_download_policy.rb +11 -0
  112. data/db/migrate/20220204171908_rename_docker_tags_whitelist_and_add_exclude_tags.rb +8 -0
  113. data/db/migrate/20220207140355_change_deb_attributes_size_limit.rb +7 -0
  114. data/db/seeds.d/111-upgrade_tasks.rb +2 -1
  115. data/engines/bastion/app/views/bastion/layouts/application.html.erb +0 -1
  116. data/engines/bastion/app/views/bastion/layouts/assets.html.erb +0 -1
  117. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/content-credentials.controller.js +1 -1
  118. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/details/content-credential-products.controller.js +1 -1
  119. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/details/content-credential-repositories.controller.js +1 -1
  120. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/bulk/views/content-hosts-bulk-traces-modal.html +1 -1
  121. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/details/views/environment.html +26 -1
  122. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +212 -152
  123. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/packages/packages.controller.js +1 -0
  124. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-info.controller.js +20 -8
  125. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-manage-content.controller.js +2 -3
  126. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details.controller.js +8 -3
  127. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-info.html +34 -30
  128. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/new-repository.controller.js +16 -2
  129. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/views/new-repository.html +35 -15
  130. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/discovery/discovery.controller.js +5 -4
  131. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/products.routes.js +4 -3
  132. data/lib/katello/engine.rb +4 -0
  133. data/lib/katello/permission_creator.rb +1 -1
  134. data/lib/katello/permissions/host_permissions.rb +3 -1
  135. data/lib/katello/plugin.rb +4 -1
  136. data/lib/katello/repository_types/deb.rb +0 -1
  137. data/lib/katello/repository_types/docker.rb +4 -4
  138. data/lib/katello/repository_types/file.rb +0 -1
  139. data/lib/katello/repository_types/ostree.rb +4 -0
  140. data/lib/katello/repository_types/python.rb +5 -1
  141. data/lib/katello/repository_types/yum.rb +2 -9
  142. data/lib/katello/tasks/content_view_import_only.rake +34 -0
  143. data/lib/katello/tasks/import_applicability.rake +1 -1
  144. data/lib/katello/tasks/jenkins.rake +0 -2
  145. data/lib/katello/tasks/repository.rake +4 -1
  146. data/lib/katello/tasks/upgrades/4.4/publish_import_cvvs.rake +17 -0
  147. data/lib/katello/version.rb +1 -1
  148. data/locale/action_names.rb +8 -7
  149. data/locale/bn/katello.po +1402 -650
  150. data/locale/cs/katello.po +1217 -96
  151. data/locale/de/katello.po +2359 -1347
  152. data/locale/en/katello.po +1216 -94
  153. data/locale/es/katello.po +2201 -1172
  154. data/locale/fr/katello.po +2601 -1615
  155. data/locale/gu/katello.po +1564 -814
  156. data/locale/hi/katello.po +1563 -810
  157. data/locale/it/katello.po +1311 -282
  158. data/locale/ja/katello.po +2534 -1518
  159. data/locale/katello.pot +3430 -1326
  160. data/locale/kn/katello.po +1564 -812
  161. data/locale/ko/katello.po +1441 -409
  162. data/locale/mr/katello.po +1564 -776
  163. data/locale/or/katello.po +1565 -813
  164. data/locale/pa/katello.po +1559 -792
  165. data/locale/pt/katello.po +1314 -277
  166. data/locale/pt_BR/katello.po +2226 -1181
  167. data/locale/ru/katello.po +1587 -563
  168. data/locale/ta/katello.po +1373 -619
  169. data/locale/te/katello.po +1564 -810
  170. data/locale/zh_CN/katello.po +2936 -1890
  171. data/locale/zh_TW/katello.po +1508 -606
  172. data/webpack/__mocks__/foremanReact/{redux/actions/toasts.js → components/ToastsList/index.js} +3 -2
  173. data/webpack/components/ActionableDetail.js +35 -21
  174. data/webpack/components/Content/Details/__tests__/ContentDetailInfo.test.js +0 -2
  175. data/webpack/components/Content/Details/__tests__/ContentDetailRepositories.test.js +0 -2
  176. data/webpack/components/Content/Details/__tests__/ContentDetails.test.js +0 -2
  177. data/webpack/components/Content/__tests__/ContentPage.test.js +0 -2
  178. data/webpack/components/Content/__tests__/ContentTable.test.js +0 -2
  179. data/webpack/components/EditableSwitch.js +8 -2
  180. data/webpack/components/EditableTextInput/EditableTextInput.js +44 -86
  181. data/webpack/components/EditableTextInput/__tests__/editableTextInput.test.js +3 -3
  182. data/webpack/components/Errata/index.js +19 -11
  183. data/webpack/components/Packages/index.js +1 -1
  184. data/webpack/components/Search/Search.js +5 -2
  185. data/webpack/components/Search/__tests__/search.test.js +2 -3
  186. data/webpack/components/SelectOrg/SetOrganization.js +1 -1
  187. data/webpack/components/Table/PageControls.js +3 -6
  188. data/webpack/components/Table/TableHooks.js +46 -7
  189. data/webpack/components/Table/TableWrapper.js +14 -3
  190. data/webpack/components/TypeAhead/TypeAhead.js +5 -1
  191. data/webpack/components/TypeAhead/pf4Search/TypeAheadInput.js +4 -1
  192. data/webpack/components/TypeAhead/pf4Search/TypeAheadSearch.js +2 -1
  193. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard.js +1 -1
  194. data/webpack/components/extensions/HostDetails/Cards/ErrataOverviewCard.js +3 -4
  195. data/webpack/components/extensions/HostDetails/HostDetailsActions.js +2 -0
  196. data/webpack/components/extensions/HostDetails/HostPackages/HostPackagesActions.js +18 -2
  197. data/webpack/components/extensions/HostDetails/HostPackages/HostPackagesConstants.js +12 -0
  198. data/webpack/components/extensions/HostDetails/Tabs/ContentTab/SecondaryTabsRoutes.js +1 -1
  199. data/webpack/components/extensions/HostDetails/Tabs/{ErrataTab.js → ErrataTab/ErrataTab.js} +30 -21
  200. data/webpack/components/extensions/HostDetails/Tabs/{ErrataTab.scss → ErrataTab/ErrataTab.scss} +0 -0
  201. data/webpack/components/extensions/HostDetails/Tabs/{ErratumExpansionContents.js → ErrataTab/ErratumExpansionContents.js} +0 -0
  202. data/webpack/components/extensions/HostDetails/Tabs/{ErratumExpansionDetail.js → ErrataTab/ErratumExpansionDetail.js} +0 -0
  203. data/webpack/components/extensions/HostDetails/{HostErrata → Tabs/ErrataTab}/HostErrataActions.js +3 -3
  204. data/webpack/components/extensions/HostDetails/{HostErrata → Tabs/ErrataTab}/HostErrataConstants.js +11 -0
  205. data/webpack/components/extensions/HostDetails/{HostErrata → Tabs/ErrataTab}/HostErrataSelectors.js +0 -0
  206. data/webpack/components/extensions/HostDetails/Tabs/PackageInstallModal.js +279 -0
  207. data/webpack/components/extensions/HostDetails/Tabs/PackageInstallModal.scss +3 -0
  208. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab.js +125 -8
  209. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionActions.js +27 -4
  210. data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionConstants.js +2 -1
  211. data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab.js +6 -3
  212. data/webpack/components/extensions/HostDetails/Tabs/{EnableTracerEmptyState.js → TracesTab/EnableTracerEmptyState.js} +0 -0
  213. data/webpack/components/extensions/HostDetails/Tabs/{EnableTracerModal.js → TracesTab/EnableTracerModal.js} +3 -2
  214. data/webpack/components/extensions/HostDetails/Tabs/{HostTracesActions.js → TracesTab/HostTracesActions.js} +2 -2
  215. data/webpack/components/extensions/HostDetails/Tabs/{HostTracesConstants.js → TracesTab/HostTracesConstants.js} +0 -0
  216. data/webpack/components/extensions/HostDetails/Tabs/{HostTracesSelectors.js → TracesTab/HostTracesSelectors.js} +0 -0
  217. data/webpack/components/extensions/HostDetails/Tabs/{TracesTab.js → TracesTab/TracesTab.js} +8 -5
  218. data/webpack/components/extensions/HostDetails/Tabs/{TracesTab.scss → TracesTab/TracesTab.scss} +0 -0
  219. data/webpack/components/extensions/HostDetails/Tabs/__tests__/errataTab.test.js +17 -18
  220. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packageInstallModal.test.js +385 -0
  221. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packages.fixtures.json +1 -1
  222. data/webpack/components/extensions/HostDetails/Tabs/__tests__/packagesTab.test.js +58 -7
  223. data/webpack/components/extensions/HostDetails/Tabs/__tests__/repositorySetsTab.test.js +2 -2
  224. data/webpack/components/extensions/HostDetails/Tabs/__tests__/tracesTab.test.js +4 -4
  225. data/webpack/components/extensions/HostDetails/Tabs/__tests__/yumInstallablePackages.fixtures.json +72 -0
  226. data/webpack/components/extensions/HostDetails/Tabs/customizedRexUrlHelpers.js +12 -5
  227. data/webpack/components/extensions/HostDetails/YumInstallablePackages/YumInstallablePackagesActions.js +18 -0
  228. data/webpack/components/extensions/HostDetails/YumInstallablePackages/YumInstallablePackagesConstants.js +3 -0
  229. data/webpack/components/extensions/HostDetails/YumInstallablePackages/YumInstallablePackagesSelectors.js +16 -0
  230. data/webpack/components/extensions/HostDetails/hostDetailsHelpers.js +19 -0
  231. data/webpack/components/pf3Table/components/Table.js +2 -3
  232. data/webpack/components/pf3Table/components/Table.test.js +0 -3
  233. data/webpack/components/pf3Table/components/__snapshots__/Table.test.js.snap +9 -8
  234. data/webpack/containers/Application/config.js +5 -0
  235. data/webpack/global_index.js +1 -1
  236. data/webpack/global_test_setup.js +1 -1
  237. data/webpack/index.js +7 -0
  238. data/webpack/scenes/AnsibleCollections/Details/__tests__/AnsibleCollectionDetails.test.js +0 -2
  239. data/webpack/scenes/AnsibleCollections/__tests__/AnsibleCollectionPage.test.js +0 -2
  240. data/webpack/scenes/AnsibleCollections/__tests__/AnsibleCollectionsTable.test.js +0 -2
  241. data/webpack/scenes/Content/ContentConfig.js +55 -5
  242. data/webpack/scenes/Content/ContentPage.js +1 -1
  243. data/webpack/scenes/Content/Details/ContentDetails.js +1 -1
  244. data/webpack/scenes/Content/Details/ContentInfo.js +1 -1
  245. data/webpack/scenes/Content/Details/ContentRepositories.js +1 -1
  246. data/webpack/scenes/Content/Details/__tests__/contentDetail.test.js +4 -4
  247. data/webpack/scenes/Content/Table/ContentTable.js +1 -1
  248. data/webpack/scenes/Content/__tests__/contentTable.test.js +3 -3
  249. data/webpack/scenes/ContentViews/ContentViewsConstants.js +2 -1
  250. data/webpack/scenes/ContentViews/Delete/__tests__/contentViewDelete.test.js +6 -6
  251. data/webpack/scenes/ContentViews/Details/ComponentContentViews/__tests__/contentViewComponents.test.js +2 -2
  252. data/webpack/scenes/ContentViews/Details/ContentViewDetailActions.js +21 -27
  253. data/webpack/scenes/ContentViews/Details/ContentViewDetailSelectors.js +5 -5
  254. data/webpack/scenes/ContentViews/Details/ContentViewInfo.js +8 -3
  255. data/webpack/scenes/ContentViews/Details/DetailsContainer.js +11 -16
  256. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilterDetails.js +2 -2
  257. data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilterDetailsHeader.js +14 -8
  258. data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/__tests__/CVRpmMatchContentModal.test.js +2 -2
  259. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVContainerImageFilterContent.test.js +2 -3
  260. data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVRpmFilterContent.test.js +2 -9
  261. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilterDetails.test.js +3 -5
  262. data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilters.test.js +2 -10
  263. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvErrataIDFilter.test.js +2 -3
  264. data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvModuleStreamFilter.test.js +2 -3
  265. data/webpack/scenes/ContentViews/Details/Histories/__tests__/contentViewHistory.test.js +2 -2
  266. data/webpack/scenes/ContentViews/Details/Repositories/ContentCounts.js +1 -1
  267. data/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js +23 -2
  268. data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewAddRemove.test.js +11 -5
  269. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersionContent.js +16 -17
  270. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersions.js +1 -1
  271. data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvVersionRemove.test.js +6 -6
  272. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailConfig.js +30 -34
  273. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetails.js +9 -8
  274. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsHeader.js +13 -15
  275. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionRepositoryCell.js +1 -1
  276. data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetails.test.js +4 -4
  277. data/webpack/scenes/ContentViews/Details/Versions/__tests__/contentViewVersions.test.js +3 -3
  278. data/webpack/scenes/ContentViews/Details/__tests__/contentViewDetail.test.js +5 -3
  279. data/webpack/scenes/ContentViews/__tests__/contentViewPage.test.js +2 -2
  280. data/webpack/scenes/Hosts/ChangeContentSource/actions.js +43 -0
  281. data/webpack/scenes/Hosts/ChangeContentSource/components/ContentSourceForm.js +87 -0
  282. data/webpack/scenes/Hosts/ChangeContentSource/components/ContentSourceTemplate.js +90 -0
  283. data/webpack/scenes/Hosts/ChangeContentSource/components/FormField.js +43 -0
  284. data/webpack/scenes/Hosts/ChangeContentSource/constants.js +3 -0
  285. data/webpack/scenes/Hosts/ChangeContentSource/helpers.js +27 -0
  286. data/webpack/scenes/Hosts/ChangeContentSource/index.js +126 -0
  287. data/webpack/scenes/Hosts/ChangeContentSource/selectors.js +42 -0
  288. data/webpack/scenes/Hosts/ChangeContentSource/styles.scss +11 -0
  289. data/webpack/scenes/ModuleStreams/Details/Profiles/__tests__/ModuleStreamDetailProfiles.test.js +0 -1
  290. data/webpack/scenes/ModuleStreams/Details/__tests__/ModuleStreamDetails.test.js +0 -2
  291. data/webpack/scenes/ModuleStreams/__tests__/ModuleStreamPage.test.js +0 -2
  292. data/webpack/scenes/ModuleStreams/__tests__/ModuleStreamsTable.test.js +0 -2
  293. data/webpack/scenes/Organizations/OrganizationActions.js +5 -1
  294. data/webpack/scenes/RedHatRepositories/RedHatRepositoriesPage.js +31 -1
  295. data/webpack/scenes/RedHatRepositories/__tests__/RedHatRepositoriesPage.test.js +16 -0
  296. data/webpack/scenes/RedHatRepositories/__tests__/__snapshots__/RedHatRepositoriesPage.test.js.snap +11 -2
  297. data/webpack/scenes/RedHatRepositories/helpers.js +5 -5
  298. data/webpack/scenes/RedHatRepositories/index.js +11 -3
  299. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/AirGappedTypeForm.js +81 -0
  300. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnConfigurationConstants.js +13 -0
  301. data/webpack/scenes/Subscriptions/Manifest/{CdnConfigurationForm.scss → CdnConfigurationTab/CdnConfigurationForm.scss} +0 -0
  302. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnTypeForm.js +106 -0
  303. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/UpstreamServerTypeForm.js +259 -0
  304. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/AirGappedTypeForm.test.js +44 -0
  305. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/CdnTypeForm.test.js +67 -0
  306. data/webpack/scenes/Subscriptions/Manifest/{__tests__/CdnConfigurationForm.test.js → CdnConfigurationTab/__tests__/UpstreamServerTypeForm.test.js} +46 -17
  307. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/index.js +97 -0
  308. data/webpack/scenes/Subscriptions/Manifest/ManageManifestModal.js +6 -1
  309. data/webpack/scenes/Subscriptions/UpstreamSubscriptions/__tests__/UpstreamSubscriptionsPage.test.js +0 -1
  310. data/webpack/scenes/Subscriptions/__tests__/SubscriptionsPage.test.js +0 -1
  311. data/webpack/scenes/Subscriptions/__tests__/__snapshots__/SubscriptionsActions.test.js.snap +3 -2
  312. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/__tests__/SubscriptionsTable.test.js +4 -0
  313. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/__tests__/__snapshots__/SubscriptionsTable.test.js.snap +9 -0
  314. data/webpack/scenes/Tasks/TaskActions.js +1 -1
  315. data/webpack/scenes/Tasks/__tests__/__snapshots__/TaskActions.test.js.snap +3 -2
  316. data/webpack/services/api/testHelpers.js +5 -3
  317. data/webpack/utils/helpers.js +6 -3
  318. metadata +81 -58
  319. data/app/services/katello/pulp/deb.rb +0 -55
  320. data/app/services/katello/pulp/distribution.rb +0 -7
  321. data/app/services/katello/pulp/docker_blob.rb +0 -7
  322. data/app/services/katello/pulp/docker_manifest.rb +0 -13
  323. data/app/services/katello/pulp/docker_manifest_list.rb +0 -14
  324. data/app/services/katello/pulp/docker_tag.rb +0 -14
  325. data/app/services/katello/pulp/erratum.rb +0 -129
  326. data/app/services/katello/pulp/file_unit.rb +0 -21
  327. data/app/services/katello/pulp/module_stream.rb +0 -39
  328. data/app/services/katello/pulp/package_category.rb +0 -7
  329. data/app/services/katello/pulp/package_group.rb +0 -20
  330. data/app/services/katello/pulp/pulp_content_unit.rb +0 -156
  331. data/app/services/katello/pulp/rpm.rb +0 -57
  332. data/app/services/katello/pulp/srpm.rb +0 -29
  333. data/app/services/katello/pulp/yum_metadata_file.rb +0 -30
  334. data/lib/monkeys/pulp3_13_checksumfix.rb +0 -17
  335. data/webpack/__mocks__/foremanReact/components/Pagination/PaginationHooks.js +0 -2
  336. data/webpack/__mocks__/foremanReact/components/Pagination/PaginationWrapper.js +0 -2
  337. data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationForm.js +0 -185
@@ -1,7 +1,8 @@
1
1
  export const addToast = toast => ({
2
- type: 'TOASTS_ADD',
2
+ type: 'toasts/addToast',
3
3
  payload: {
4
- message: toast,
4
+ key: 'addToast',
5
+ toast,
5
6
  },
6
7
  });
7
8
 
@@ -4,6 +4,7 @@ import {
4
4
  TextListItemVariants,
5
5
  Tooltip,
6
6
  TooltipPosition,
7
+ Spinner,
7
8
  } from '@patternfly/react-core';
8
9
  import { OutlinedQuestionCircleIcon } from '@patternfly/react-icons';
9
10
  import PropTypes from 'prop-types';
@@ -23,33 +24,43 @@ const ActionableDetail = ({
23
24
  currentAttribute,
24
25
  setCurrentAttribute,
25
26
  disabled,
27
+ loading,
28
+ ...rest
26
29
  }) => {
27
30
  const displayProps = {
28
- attribute, value, onEdit, disabled,
31
+ attribute, value, onEdit, disabled, currentAttribute, setCurrentAttribute, ...rest,
29
32
  };
30
33
 
31
34
  return (
32
35
  <React.Fragment key={label}>
33
- <TextListItem component={TextListItemVariants.dt}>
34
- {label}
35
- {tooltip &&
36
- <span className="foreman-spaced-icon">
37
- <Tooltip
38
- position={TooltipPosition.top}
39
- content={tooltip}
40
- >
41
- <OutlinedQuestionCircleIcon />
42
- </Tooltip>
43
- </span>
44
- }
45
- </TextListItem>
36
+ {label &&
37
+ <TextListItem component={TextListItemVariants.dt}>
38
+ {label}
39
+ {tooltip &&
40
+ <span className="foreman-spaced-icon">
41
+ <Tooltip
42
+ position={TooltipPosition.top}
43
+ content={tooltip}
44
+ >
45
+ <OutlinedQuestionCircleIcon />
46
+ </Tooltip>
47
+ </span>
48
+ }
49
+ </TextListItem>
50
+ }
46
51
  <TextListItem component={TextListItemVariants.dd} className="foreman-spaced-list">
47
- {boolean ?
48
- <EditableSwitch {...displayProps} /> :
49
- <EditableTextInput {...{
50
- ...displayProps, textArea, onEdit, currentAttribute, setCurrentAttribute,
51
- }}
52
- />}
52
+ {loading ?
53
+ <Spinner
54
+ key={label + currentAttribute}
55
+ size="lg"
56
+ /> :
57
+ <>{boolean ?
58
+ <EditableSwitch {...displayProps} /> :
59
+ <EditableTextInput {...{
60
+ ...displayProps, textArea,
61
+ }}
62
+ />}
63
+ </>}
53
64
  </TextListItem>
54
65
  </React.Fragment>
55
66
  );
@@ -57,7 +68,7 @@ const ActionableDetail = ({
57
68
 
58
69
  ActionableDetail.propTypes = {
59
70
  attribute: PropTypes.string.isRequired, // back-end name for API call
60
- label: PropTypes.string.isRequired, // displayed label
71
+ label: PropTypes.string,
61
72
  value: PropTypes.oneOfType([ // displayed value
62
73
  PropTypes.string,
63
74
  PropTypes.bool,
@@ -69,9 +80,11 @@ ActionableDetail.propTypes = {
69
80
  currentAttribute: PropTypes.string,
70
81
  setCurrentAttribute: PropTypes.func,
71
82
  disabled: PropTypes.bool,
83
+ loading: PropTypes.bool,
72
84
  };
73
85
 
74
86
  ActionableDetail.defaultProps = {
87
+ label: undefined,
75
88
  textArea: false,
76
89
  boolean: false,
77
90
  tooltip: null,
@@ -79,6 +92,7 @@ ActionableDetail.defaultProps = {
79
92
  currentAttribute: undefined,
80
93
  setCurrentAttribute: undefined,
81
94
  disabled: false,
95
+ loading: false,
82
96
  };
83
97
 
84
98
  export default ActionableDetail;
@@ -4,8 +4,6 @@ import toJson from 'enzyme-to-json';
4
4
  import { Table } from 'react-bootstrap';
5
5
  import ContentDetailInfo from '../ContentDetailInfo';
6
6
 
7
- jest.mock('foremanReact/components/Pagination/PaginationWrapper', () => (<div>Pagination Mock</div>));
8
-
9
7
  describe('Content Details Info', () => {
10
8
  it('should render and contain appropriate components', async () => {
11
9
  const displayMap = new Map([
@@ -1,8 +1,6 @@
1
1
  import { testComponentSnapshotsWithFixtures } from 'react-redux-test-utils';
2
2
  import ContentDetailRepositories from '../ContentDetailRepositories';
3
3
 
4
- jest.mock('foremanReact/components/Pagination/PaginationWrapper');
5
-
6
4
  const fixtures = {
7
5
  'renders with repositories': {
8
6
  repositories: [
@@ -6,8 +6,6 @@ import ContentDetailInfo from '../ContentDetailInfo';
6
6
  import ContentDetailRepositories from '../ContentDetailRepositories';
7
7
  import ContentDetails from '../ContentDetails';
8
8
 
9
- jest.mock('foremanReact/components/Pagination/PaginationWrapper', () => (<div>Pagination Mock</div>));
10
-
11
9
  describe('Content Details Info', () => {
12
10
  it('should render and contain appropriate components', async () => {
13
11
  const detail = {
@@ -5,8 +5,6 @@ import ContentPage from '../ContentPage';
5
5
  import ContentTable from '../ContentTable';
6
6
  import Search from '../../../components/Search/index';
7
7
 
8
- jest.mock('foremanReact/components/Pagination/PaginationWrapper', () => (<div>Pagination Mock</div>));
9
-
10
8
  describe('Content page', () => {
11
9
  it('should render and contain appropriate components', async () => {
12
10
  const contentHeader = 'Content Header';
@@ -5,8 +5,6 @@ import ContentTable from '../ContentTable';
5
5
  import { LoadingState } from '../../../components/LoadingState';
6
6
  import { Table } from '../../../components/pf3Table';
7
7
 
8
- jest.mock('foremanReact/components/Pagination/PaginationWrapper', () => (<div>Pagination Mock</div>));
9
-
10
8
  describe('Content Table', () => {
11
9
  it('should render and contain appropriate components', async () => {
12
10
  const content = {
@@ -4,16 +4,20 @@ import { noop } from 'foremanReact/common/helpers';
4
4
  import PropTypes from 'prop-types';
5
5
 
6
6
  const EditableSwitch = ({
7
- value, attribute, onEdit, disabled,
7
+ value, attribute, onEdit, disabled, setCurrentAttribute,
8
8
  }) => {
9
9
  const identifier = `${attribute} switch`;
10
+ const onSwitch = (val) => {
11
+ if (setCurrentAttribute) setCurrentAttribute(attribute);
12
+ onEdit(val, attribute);
13
+ };
10
14
 
11
15
  return (
12
16
  <Switch
13
17
  id={identifier}
14
18
  aria-label={identifier}
15
19
  isChecked={value}
16
- onChange={v => onEdit(v, attribute)}
20
+ onChange={onSwitch}
17
21
  disabled={disabled}
18
22
  />
19
23
  );
@@ -24,12 +28,14 @@ EditableSwitch.propTypes = {
24
28
  attribute: PropTypes.string,
25
29
  onEdit: PropTypes.func,
26
30
  disabled: PropTypes.bool,
31
+ setCurrentAttribute: PropTypes.func,
27
32
  };
28
33
 
29
34
  EditableSwitch.defaultProps = {
30
35
  attribute: '',
31
36
  onEdit: noop,
32
37
  disabled: false,
38
+ setCurrentAttribute: undefined,
33
39
  };
34
40
 
35
41
  export default EditableSwitch;
@@ -1,7 +1,6 @@
1
1
  import React, { useState, useEffect } from 'react';
2
2
  import {
3
- TextInput, TextArea, Text, Button, Split,
4
- SplitItem, Tooltip, TooltipPosition,
3
+ TextInput, TextArea, Text, Button, Split, SplitItem, Tooltip, TooltipPosition,
5
4
  } from '@patternfly/react-core';
6
5
  import {
7
6
  EyeIcon,
@@ -12,7 +11,6 @@ import {
12
11
  } from '@patternfly/react-icons';
13
12
  import { translate as __ } from 'foremanReact/common/I18n';
14
13
  import PropTypes from 'prop-types';
15
- import Loading from '../Loading';
16
14
  import './editableTextInput.scss';
17
15
 
18
16
  const PASSWORD_MASK = '••••••••';
@@ -21,10 +19,8 @@ const EditableTextInput = ({
21
19
  onEdit, value, textArea, attribute, placeholder, isPassword, hasPassword,
22
20
  component, currentAttribute, setCurrentAttribute, disabled,
23
21
  }) => {
24
- // Tracks input box state
25
22
  const [inputValue, setInputValue] = useState(value);
26
23
  const [editing, setEditing] = useState(false);
27
- const [submitting, setSubmitting] = useState(false);
28
24
  const [passwordPlaceholder, setPasswordPlaceholder] = useState(hasPassword
29
25
  ? PASSWORD_MASK : null);
30
26
  const [showPassword, setShowPassword] = useState(false);
@@ -39,63 +35,26 @@ const EditableTextInput = ({
39
35
 
40
36
  const onEditClick = () => {
41
37
  setEditing(true);
42
- if (setCurrentAttribute) setCurrentAttribute(attribute);
38
+ if (isPassword) setPasswordPlaceholder(null);
39
+ if (setCurrentAttribute && attribute !== currentAttribute) setCurrentAttribute(attribute);
40
+ };
43
41
 
42
+ const onSubmit = async () => {
43
+ setEditing(false);
44
44
  if (isPassword) {
45
- if (passwordPlaceholder) {
46
- setPasswordPlaceholder(null);
45
+ if (inputValue?.length > 0) {
46
+ setPasswordPlaceholder(PASSWORD_MASK);
47
47
  }
48
48
  }
49
+ await onEdit(inputValue, attribute);
49
50
  };
50
51
 
51
- // Setting didCancel to prevent actions from happening after component has been unmounted
52
- // see https://overreacted.io/a-complete-guide-to-useeffect/#speaking-of-race-conditions
53
- useEffect(() => {
54
- let didCancel = false;
55
-
56
- const onSubmit = async () => {
57
- if (submitting) { // no dependency array because this check takes care of it
58
- await onEdit(inputValue, attribute);
59
-
60
- if (!didCancel) {
61
- setSubmitting(false);
62
- setEditing(false);
63
-
64
- if (isPassword) {
65
- if (inputValue?.length > 0) {
66
- setPasswordPlaceholder(PASSWORD_MASK);
67
- }
68
- }
69
- }
70
- }
71
- };
72
- onSubmit();
73
-
74
- return () => {
75
- didCancel = true;
76
- };
77
- });
78
-
79
- // Listen for enter and trigger submit workflow on enter
80
- useEffect(() => {
81
- const listener = (event) => {
82
- if (event.code === 'Enter' || event.code === 'NumpadEnter') {
83
- if (editing) setSubmitting(true);
84
- }
85
- };
86
- document.addEventListener('keydown', listener);
87
- return () => {
88
- document.removeEventListener('keydown', listener);
89
- };
90
- }, [editing]);
91
-
92
52
  const onClear = () => {
93
53
  if (isPassword) {
94
54
  if (hasPassword || inputValue?.length > 0) {
95
55
  setPasswordPlaceholder(PASSWORD_MASK);
96
56
  }
97
57
  }
98
-
99
58
  setInputValue(value);
100
59
  setEditing(false);
101
60
  };
@@ -104,49 +63,48 @@ const EditableTextInput = ({
104
63
  setShowPassword(prevShowPassword => !prevShowPassword);
105
64
  };
106
65
 
66
+ const onKeyUp = ({ key, charCode }) => (key === 'Enter' || charCode === '13') && onSubmit();
67
+
107
68
  const inputProps = {
69
+ onKeyUp,
108
70
  component,
109
71
  value: inputValue || '',
110
- onChange: v => setInputValue(v),
72
+ onChange: setInputValue,
111
73
  };
112
74
 
113
- if (submitting) return <Loading size="sm" />;
114
- if (editing) {
115
- return (
116
- <Split>
117
- <SplitItem>
118
- {textArea ?
119
- (<TextArea {...inputProps} aria-label={`${attribute} text area`} />) :
120
- (<TextInput {...inputProps} type={(isPassword && !showPassword) ? 'password' : 'text'} aria-label={`${attribute} text input`} />)}
121
- </SplitItem>
122
- <SplitItem>
123
- <Button
124
- aria-label={`submit ${attribute}`}
125
- variant="plain"
126
- onClick={() => setSubmitting(true)}
127
- >
128
- <CheckIcon />
129
- </Button>
130
- </SplitItem>
75
+ return editing ? (
76
+ <Split>
77
+ <SplitItem>
78
+ {textArea ?
79
+ (<TextArea {...inputProps} aria-label={`${attribute} text area`} />) :
80
+ (<TextInput {...inputProps} type={(isPassword && !showPassword) ? 'password' : 'text'} aria-label={`${attribute} text input`} />)}
81
+ </SplitItem>
82
+ <SplitItem>
83
+ <Button
84
+ aria-label={`submit ${attribute}`}
85
+ variant="plain"
86
+ onClick={onSubmit}
87
+ >
88
+ <CheckIcon />
89
+ </Button>
90
+ </SplitItem>
91
+ <SplitItem>
92
+ <Button aria-label={`clear ${attribute}`} variant="plain" onClick={onClear}>
93
+ <TimesIcon />
94
+ </Button>
95
+ </SplitItem>
96
+ {isPassword ?
131
97
  <SplitItem>
132
- <Button aria-label={`clear ${attribute}`} variant="plain" onClick={onClear}>
133
- <TimesIcon />
98
+ <Button aria-label={`show-password ${attribute}`} variant="plain" isDisabled={!inputValue?.length} onClick={toggleShowPassword}>
99
+ {showPassword ?
100
+ (<EyeSlashIcon />) :
101
+ (<EyeIcon />)}
134
102
  </Button>
135
- </SplitItem>
136
- {isPassword ?
137
- <SplitItem>
138
- <Button aria-label={`show-password ${attribute}`} variant="plain" isDisabled={!inputValue?.length} onClick={toggleShowPassword}>
139
- {showPassword ?
140
- (<EyeSlashIcon />) :
141
- (<EyeIcon />)}
142
- </Button>
143
- </SplitItem> :
144
- null
145
- }
146
- </Split>
147
- );
148
- }
149
- return (
103
+ </SplitItem> :
104
+ null
105
+ }
106
+ </Split>
107
+ ) : (
150
108
  <Split>
151
109
  <SplitItem>
152
110
  {inputValue ?
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
2
  import { render, patientlyWaitFor, fireEvent } from 'react-testing-lib-wrapper';
3
+ import { head } from 'lodash';
3
4
  import EditableTextInput from '../EditableTextInput';
4
5
 
5
6
  const actualValue = 'burger';
@@ -17,7 +18,6 @@ test('Passed function is called after editing and clicking submit', async () =>
17
18
  getByLabelText(`edit ${attribute}`).click();
18
19
  fireEvent.change(getByLabelText(`${attribute} text input`), { target: { value: actualValue } });
19
20
  getByLabelText(`submit ${attribute}`).click();
20
-
21
21
  await patientlyWaitFor(() => expect(mockEdit.mock.calls).toHaveLength(1));
22
22
  expect(mockEdit.mock.calls[0][0]).toBe(actualValue); // first arg
23
23
  });
@@ -29,10 +29,10 @@ test('Passed function is called after editing and hitting enter', async () => {
29
29
  getByLabelText(`edit ${attribute}`).click();
30
30
  const textInputLabel = `${attribute} text input`;
31
31
  fireEvent.change(getByLabelText(textInputLabel), { target: { value: actualValue } });
32
- fireEvent.keyDown(getByLabelText(textInputLabel), { key: 'Enter', code: 'Enter' });
32
+ fireEvent.keyUp(getByLabelText(textInputLabel), { key: 'Enter', code: 'Enter' });
33
33
 
34
34
  await patientlyWaitFor(() => expect(mockEdit.mock.calls).toHaveLength(1));
35
- expect(mockEdit.mock.calls[0][0]).toBe(actualValue); // first arg
35
+ expect(head(mockEdit.mock.calls)).toContain(actualValue); // first arg
36
36
  });
37
37
 
38
38
  test('input is set back to original value after clearing', () => {
@@ -1,5 +1,11 @@
1
1
  import React from 'react';
2
2
  import { TableText } from '@patternfly/react-table';
3
+ import {
4
+ chart_color_black_500 as pfBlack,
5
+ chart_color_gold_400 as pfGold,
6
+ chart_color_orange_300 as pfOrange,
7
+ chart_color_red_200 as pfRed,
8
+ } from '@patternfly/react-tokens';
3
9
  import { translate as __ } from 'foremanReact/common/I18n';
4
10
  import {
5
11
  BugIcon,
@@ -8,11 +14,10 @@ import {
8
14
  SquareIcon,
9
15
  } from '@patternfly/react-icons';
10
16
  import PropTypes from 'prop-types';
11
- import { urlBuilder } from 'foremanReact/common/urlHelpers';
12
17
 
13
18
  export const ErrataMapper = ({ data, id }) => data.map(({ x: type, y: count }) => <ErrataSummary count={count} type={type} key={`${count} ${type}`} id={id} />);
14
19
 
15
- export const ErrataSummary = ({ type, count, id }) => {
20
+ export const ErrataSummary = ({ type, count }) => {
16
21
  let ErrataIcon;
17
22
  let label;
18
23
  let name;
@@ -24,7 +29,7 @@ export const ErrataSummary = ({ type, count, id }) => {
24
29
  ErrataIcon = SecurityIcon;
25
30
  name = 'security advisories';
26
31
  color = '#0066cc';
27
- url = <a href={urlBuilder(`content_hosts/${id}/errata`, '')}> {count} {name} </a>;
32
+ url = <a href="#/Content/errata?type=security"> {count} {name} </a>;
28
33
  break;
29
34
  case 'recommended':
30
35
  case 'bugfix':
@@ -32,7 +37,7 @@ export const ErrataSummary = ({ type, count, id }) => {
32
37
  ErrataIcon = BugIcon;
33
38
  name = 'bug fixes';
34
39
  color = '#8bc1f7';
35
- url = <a href={urlBuilder(`content_hosts/${id}/errata`, '')}> {count} {name} </a>;
40
+ url = <a href="#/Content/errata?type=bugfix"> {count} {name} </a>;
36
41
  break;
37
42
  case 'enhancement':
38
43
  case 'optional':
@@ -40,15 +45,15 @@ export const ErrataSummary = ({ type, count, id }) => {
40
45
  ErrataIcon = EnhancementIcon;
41
46
  name = 'enhancements';
42
47
  color = '#002f5d';
43
- url = <a href={urlBuilder(`content_hosts/${id}/errata`, '')}> {count} {name} </a>;
48
+ url = <a href="#/Content/errata?type=enhancement"> {count} {name} </a>;
44
49
  break;
45
50
  default:
46
51
  }
47
52
  if (!ErrataIcon) return null;
48
53
 
49
54
  return (
50
- <span style={{ whiteSpace: 'nowrap' }}>
51
- <TableText wrapModifier="nowrap">
55
+ <span style={{ whiteSpace: 'normal', fontSize: 'small' }}>
56
+ <TableText>
52
57
  <SquareIcon size="sm" color={color} />
53
58
  <span style={{ marginLeft: '8px' }}>
54
59
  <ErrataIcon title={label} />
@@ -62,7 +67,6 @@ export const ErrataSummary = ({ type, count, id }) => {
62
67
  ErrataSummary.propTypes = {
63
68
  type: PropTypes.string.isRequired,
64
69
  count: PropTypes.number.isRequired,
65
- id: PropTypes.number.isRequired,
66
70
  };
67
71
 
68
72
  export const ErrataType = ({ type }) => {
@@ -104,16 +108,20 @@ export const ErrataSeverity = ({ severity }) => {
104
108
  let label;
105
109
 
106
110
  switch (severity) {
111
+ case 'Low':
112
+ color = pfBlack.value;
113
+ label = __('Low');
114
+ break;
107
115
  case 'Moderate':
108
- color = 'yellow';
116
+ color = pfGold.value;
109
117
  label = __('Moderate');
110
118
  break;
111
119
  case 'Important':
112
- color = 'orange';
120
+ color = pfOrange.value;
113
121
  label = __('Important');
114
122
  break;
115
123
  case 'Critical':
116
- color = 'red';
124
+ color = pfRed.value;
117
125
  label = __('Critical');
118
126
  break;
119
127
  default:
@@ -45,7 +45,7 @@ export const PackagesLatestVersion = ({ name, upgradable_version: upgradableVers
45
45
 
46
46
  if (upgradableVersion == null) {
47
47
  label = '';
48
- color = 'green';
48
+ color = 'black';
49
49
  } else {
50
50
  label = upgradableVersion.replace(`${name}-`, '');
51
51
  }
@@ -16,13 +16,13 @@ const Search = ({
16
16
  onSearch,
17
17
  updateSearchQuery,
18
18
  isDisabled,
19
- settings: { autoSearchDelay },
19
+ settings: { autoSearchDelay, autoSearchEnabled = true },
20
20
  initialInputValue,
21
21
  patternfly4,
22
- settings: { autoSearchEnabled },
23
22
  getAutoCompleteParams,
24
23
  foremanApiAutoComplete,
25
24
  bookmarkController,
25
+ placeholder,
26
26
  }) => {
27
27
  const [items, setItems] = useState([]);
28
28
  const dispatch = useDispatch();
@@ -82,6 +82,7 @@ const Search = ({
82
82
  initialInputValue={initialInputValue}
83
83
  patternfly4={patternfly4}
84
84
  autoSearchEnabled={autoSearchEnabled}
85
+ placeholder={placeholder}
85
86
  />
86
87
  </div>
87
88
  );
@@ -100,6 +101,7 @@ Search.propTypes = {
100
101
  autoSearchDelay: PropTypes.number,
101
102
  }),
102
103
  bookmarkController: PropTypes.string,
104
+ placeholder: PropTypes.string,
103
105
  };
104
106
 
105
107
  Search.defaultProps = {
@@ -112,6 +114,7 @@ Search.defaultProps = {
112
114
  },
113
115
  isDisabled: undefined,
114
116
  bookmarkController: undefined,
117
+ placeholder: undefined,
115
118
  };
116
119
 
117
120
  export default Search;
@@ -19,7 +19,7 @@ const props = {
19
19
 
20
20
  let searchDelayScope;
21
21
  beforeEach(() => {
22
- searchDelayScope = mockSetting(nockInstance, AUTOSEARCH_DELAY, 500);
22
+ searchDelayScope = mockSetting(nockInstance, AUTOSEARCH_DELAY, 0);
23
23
  });
24
24
 
25
25
  afterEach(() => {
@@ -73,7 +73,7 @@ test('autosearch turned off does show patternfly 4 search button', async (done)
73
73
  });
74
74
 
75
75
  test('search function is called when search is typed into with autosearch', async (done) => {
76
- const autoSearchScope = mockSetting(nockInstance, AUTOSEARCH_WHILE_TYPING, true);
76
+ const autoSearchScope = mockSetting(nockInstance, AUTOSEARCH_WHILE_TYPING);
77
77
  const autocompleteScope = mockAutocomplete(nockInstance, endpoint, true, [], 2);
78
78
  const mockSearch = jest.fn();
79
79
 
@@ -100,7 +100,6 @@ test('search function is called by clicking search button without autosearch', a
100
100
  });
101
101
  searchButton.click();
102
102
  expect(mockSearch.mock.calls).toHaveLength(3);
103
-
104
103
  assertNockRequest(autoSearchScope);
105
104
  assertNockRequest(autocompleteScope, done);
106
105
  });
@@ -63,7 +63,7 @@ class SetOrganization extends Component {
63
63
  placeholder={__('Select an organization')}
64
64
  id="organization"
65
65
  name="organization"
66
- className="form-control"
66
+ className="form-control without_select2"
67
67
  options={list}
68
68
  onChange={this.onSelectItem}
69
69
  />
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
- import { Pagination, PaginationVariant, FlexItem } from '@patternfly/react-core';
4
- import { usePaginationOptions } from 'foremanReact/components/Pagination/PaginationHooks';
3
+ import { FlexItem } from '@patternfly/react-core';
4
+ import Pagination from 'foremanReact/components/Pagination';
5
5
 
6
6
  import { getPageStats } from './helpers';
7
7
 
@@ -18,10 +18,7 @@ const PageControls = ({
18
18
  itemsEnd={lastIndex}
19
19
  page={page}
20
20
  perPage={perPage}
21
- isCompact={variant === PaginationVariant.top}
22
- onSetPage={(_evt, updated) => onPaginationUpdate({ page: updated })}
23
- onPerPageSelect={(_evt, updated) => onPaginationUpdate({ per_page: updated })}
24
- perPageOptions={usePaginationOptions().map(p => ({ title: p.toString(), value: p }))}
21
+ onChange={onPaginationUpdate}
25
22
  variant={variant}
26
23
  />
27
24
  </FlexItem>