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
@@ -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
  });
@@ -28,7 +28,7 @@ export default Select;
28
28
 
29
29
  Select.propTypes = {
30
30
  onChange: PropTypes.func.isRequired,
31
- options: PropTypes.arrayOf(PropTypes.object).isRequired,
31
+ options: PropTypes.arrayOf(PropTypes.shape({})).isRequired,
32
32
  disabled: PropTypes.bool,
33
33
  placeholder: PropTypes.string.isRequired,
34
34
  value: PropTypes.string,
@@ -11,23 +11,23 @@ export default (state = initialState, action) => {
11
11
  const { payload } = action;
12
12
 
13
13
  switch (action.type) {
14
- case GET_ORGANIZATIONS_LIST_REQUEST:
15
- return state.set('loading', true);
14
+ case GET_ORGANIZATIONS_LIST_REQUEST:
15
+ return state.set('loading', true);
16
16
 
17
- case GET_ORGANIZATIONS_LIST_SUCCESS:
18
- return state
19
- .set('list', payload.results)
20
- .set('loading', false);
17
+ case GET_ORGANIZATIONS_LIST_SUCCESS:
18
+ return state
19
+ .set('list', payload.results)
20
+ .set('loading', false);
21
21
 
22
- case CHANGE_CURRENT_ORGANIZATION_SUCCESS:
23
- return state
24
- .set('currentId', payload)
25
- .set('loading', false);
22
+ case CHANGE_CURRENT_ORGANIZATION_SUCCESS:
23
+ return state
24
+ .set('currentId', payload)
25
+ .set('loading', false);
26
26
 
27
- case GET_ORGANIZATIONS_LIST_FAILURE:
28
- return state
29
- .set('error', payload);
30
- default:
31
- return state;
27
+ case GET_ORGANIZATIONS_LIST_FAILURE:
28
+ return state
29
+ .set('error', payload);
30
+ default:
31
+ return state;
32
32
  }
33
33
  };
@@ -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
  />
@@ -87,7 +87,7 @@ class SetOrganization extends Component {
87
87
 
88
88
 
89
89
  SetOrganization.propTypes = {
90
- list: PropTypes.arrayOf(PropTypes.object),
90
+ list: PropTypes.arrayOf(PropTypes.shape({})),
91
91
  loading: PropTypes.bool.isRequired,
92
92
  history: PropTypes.shape({
93
93
  push: PropTypes.func,
@@ -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>
@@ -1,5 +1,7 @@
1
1
  import { useState, useRef, useEffect, useCallback } from 'react';
2
2
  import { isEmpty } from 'lodash';
3
+ import { useLocation } from 'react-router-dom';
4
+ import { friendlySearchParam } from '../../utils/helpers';
3
5
 
4
6
  class ReactConnectedSet extends Set {
5
7
  constructor(initialValue, forceRender) {
@@ -68,6 +70,7 @@ export const useSelectionSet = ({
68
70
  const pageIds = results?.map(result => result[idColumn]) ?? [];
69
71
  const selectableResults = results?.filter(result => isSelectable(result)) ?? [];
70
72
  const selectableIds = new Set(selectableResults.map(result => result[idColumn]));
73
+ const selectedResults = useRef({}); // { id: result }
71
74
  const canSelect = id => selectableIds.has(id);
72
75
  const areAllRowsOnPageSelected = () =>
73
76
  Number(pageIds?.length) > 0 &&
@@ -76,13 +79,28 @@ export const useSelectionSet = ({
76
79
  const areAllRowsSelected = () =>
77
80
  Number(selectionSet.size) > 0 && selectionSet.size === Number(metadata.selectable);
78
81
 
79
- const selectPage = () => selectionSet.addAll(pageIds.filter(canSelect));
80
- const selectNone = () => selectionSet.clear();
81
- const selectOne = (isSelected, id) => {
82
+ const selectPage = () => {
83
+ const selectablePageIds = pageIds.filter(canSelect);
84
+ selectionSet.addAll(selectablePageIds);
85
+ // eslint-disable-next-line no-restricted-syntax
86
+ for (const result of selectableResults) {
87
+ selectedResults.current[result[idColumn]] = result;
88
+ }
89
+ };
90
+ const clearSelectedResults = () => {
91
+ selectedResults.current = {};
92
+ };
93
+ const selectNone = () => {
94
+ selectionSet.clear();
95
+ clearSelectedResults();
96
+ };
97
+ const selectOne = (isSelected, id, data) => {
82
98
  if (canSelect(id)) {
83
99
  if (isSelected) {
100
+ if (data) selectedResults.current[id] = data;
84
101
  selectionSet.add(id);
85
102
  } else {
103
+ delete selectedResults.current[id];
86
104
  selectionSet.delete(id);
87
105
  }
88
106
  }
@@ -102,6 +120,8 @@ export const useSelectionSet = ({
102
120
  isSelected,
103
121
  isSelectable: canSelect,
104
122
  selectionSet,
123
+ selectedResults: Object.values(selectedResults.current),
124
+ clearSelectedResults,
105
125
  };
106
126
  };
107
127
 
@@ -117,6 +137,7 @@ export const useBulkSelect = ({
117
137
  results,
118
138
  metadata,
119
139
  initialArry = [],
140
+ initialSearchQuery = '',
120
141
  idColumn = 'id',
121
142
  isSelectable,
122
143
  }) => {
@@ -125,7 +146,7 @@ export const useBulkSelect = ({
125
146
  results, metadata, initialArry, idColumn, isSelectable,
126
147
  });
127
148
  const exclusionSet = useSet([]);
128
- const [searchQuery, updateSearchQuery] = useState('');
149
+ const [searchQuery, updateSearchQuery] = useState(initialSearchQuery);
129
150
  const [selectAllMode, setSelectAllMode] = useState(false);
130
151
  const selectedCount = selectAllMode ?
131
152
  Number(metadata.selectable) - exclusionSet.size : selectOptions.selectedCount;
@@ -155,9 +176,10 @@ export const useBulkSelect = ({
155
176
  setSelectAllMode(false);
156
177
  exclusionSet.clear();
157
178
  inclusionSet.clear();
158
- }, [exclusionSet, inclusionSet]);
179
+ selectOptions.clearSelectedResults();
180
+ }, [exclusionSet, inclusionSet, selectOptions]);
159
181
 
160
- const selectOne = (isRowSelected, id) => {
182
+ const selectOne = (isRowSelected, id, data) => {
161
183
  if (selectAllMode) {
162
184
  if (isRowSelected) {
163
185
  exclusionSet.delete(id);
@@ -165,7 +187,7 @@ export const useBulkSelect = ({
165
187
  exclusionSet.add(id);
166
188
  }
167
189
  } else {
168
- selectOptions.selectOne(isRowSelected, id);
190
+ selectOptions.selectOne(isRowSelected, id, data);
169
191
  }
170
192
  };
171
193
 
@@ -209,6 +231,7 @@ export const useBulkSelect = ({
209
231
  selectPage,
210
232
  selectNone,
211
233
  selectAll,
234
+ selectAllMode,
212
235
  isSelected,
213
236
  selectedCount,
214
237
  fetchBulkParams,
@@ -219,3 +242,20 @@ export const useBulkSelect = ({
219
242
  areAllRowsSelected,
220
243
  };
221
244
  };
245
+
246
+ // takes a url query like ?type=security&search=name+~+foo
247
+ // and returns an object
248
+ // {
249
+ // type: 'security',
250
+ // searchParam: 'name ~ foo'
251
+ // }
252
+ export const useUrlParams = () => {
253
+ const location = useLocation();
254
+ const { search: urlSearchParam, ...urlParams }
255
+ = Object.fromEntries(new URLSearchParams(location.search).entries());
256
+ const searchParam = urlSearchParam ? friendlySearchParam(urlSearchParam) : '';
257
+ return {
258
+ searchParam,
259
+ ...urlParams,
260
+ };
261
+ };
@@ -26,15 +26,19 @@ const TableWrapper = ({
26
26
  foremanApiAutoComplete,
27
27
  searchQuery,
28
28
  updateSearchQuery,
29
+ searchPlaceholderText,
29
30
  additionalListeners,
30
31
  activeFilters,
31
32
  displaySelectAllCheckbox,
32
33
  selectAll,
34
+ selectAllMode,
33
35
  selectNone,
34
36
  selectPage,
35
37
  areAllRowsOnPageSelected,
36
38
  areAllRowsSelected,
37
39
  selectedCount,
40
+ selectedResults,
41
+ clearSelectedResults,
38
42
  emptySearchBody,
39
43
  disableSearch,
40
44
  nodesBelowSearch,
@@ -159,7 +163,7 @@ const TableWrapper = ({
159
163
 
160
164
  return (
161
165
  <>
162
- <Flex>
166
+ <Flex style={{ alignItems: 'center' }} className="margin-16-24">
163
167
  {displaySelectAllCheckbox &&
164
168
  <FlexItem alignSelf={{ default: 'alignSelfCenter' }}>
165
169
  <SelectAllCheckbox
@@ -182,19 +186,21 @@ const TableWrapper = ({
182
186
  <Search
183
187
  isDisabled={unresolvedStatusOrNoRows && !searchQuery}
184
188
  patternfly4
189
+ initialInputValue={searchQuery && searchQuery}
185
190
  onSearch={search => updateSearchQuery(search)}
186
191
  getAutoCompleteParams={getAutoCompleteParams}
187
192
  foremanApiAutoComplete={foremanApiAutoComplete}
188
193
  bookmarkController={bookmarkController}
194
+ placeholder={searchPlaceholderText}
189
195
  />
190
196
  </FlexItem>
191
197
  }
192
198
  {showToggleGroup &&
193
- <FlexItem style={{ marginLeft: '16px' }}>
199
+ <FlexItem>
194
200
  {toggleGroup}
195
201
  </FlexItem>}
196
202
  {showActionButtons &&
197
- <FlexItem style={{ marginLeft: '16px' }}>
203
+ <FlexItem>
198
204
  {actionButtons}
199
205
  </FlexItem>}
200
206
 
@@ -208,7 +214,11 @@ const TableWrapper = ({
208
214
  />
209
215
  }
210
216
  </Flex>
211
- {nodesBelowSearch}
217
+ {nodesBelowSearch &&
218
+ <Flex className="margin-16-24 gap-16" style={{ alignItems: 'center' }}>
219
+ {nodesBelowSearch}
220
+ </Flex>
221
+ }
212
222
  <MainTable
213
223
  searchIsActive={!!searchQuery}
214
224
  activeFilters={activeFilters}
@@ -256,6 +266,7 @@ TableWrapper.propTypes = {
256
266
  }),
257
267
  autocompleteEndpoint: PropTypes.string.isRequired,
258
268
  foremanApiAutoComplete: PropTypes.bool,
269
+ searchPlaceholderText: PropTypes.string,
259
270
  actionButtons: PropTypes.node,
260
271
  toggleGroup: PropTypes.node,
261
272
  children: PropTypes.node,
@@ -275,7 +286,10 @@ TableWrapper.propTypes = {
275
286
  ])),
276
287
  displaySelectAllCheckbox: PropTypes.bool,
277
288
  selectedCount: PropTypes.number,
289
+ selectedResults: PropTypes.arrayOf(PropTypes.shape({})),
290
+ clearSelectedResults: PropTypes.func,
278
291
  selectAll: PropTypes.func,
292
+ selectAllMode: PropTypes.bool,
279
293
  selectNone: PropTypes.func,
280
294
  selectPage: PropTypes.func,
281
295
  areAllRowsOnPageSelected: PropTypes.func,
@@ -293,13 +307,17 @@ TableWrapper.defaultProps = {
293
307
  activeFilters: [],
294
308
  defaultFilters: [],
295
309
  foremanApiAutoComplete: false,
310
+ searchPlaceholderText: undefined,
296
311
  actionButtons: null,
297
312
  toggleGroup: null,
298
313
  displaySelectAllCheckbox: false,
299
314
  selectedCount: 0,
300
- selectAll: noop,
301
- selectNone: noop,
302
- selectPage: noop,
315
+ selectedResults: [],
316
+ clearSelectedResults: noop,
317
+ selectAll: undefined,
318
+ selectAllMode: false,
319
+ selectNone: undefined,
320
+ selectPage: undefined,
303
321
  areAllRowsOnPageSelected: noop,
304
322
  areAllRowsSelected: noop,
305
323
  emptySearchBody: __('Try changing your search settings.'),
@@ -22,6 +22,7 @@ const TypeAhead = ({
22
22
  autoSearchEnabled,
23
23
  autoSearchDelay,
24
24
  bookmarkController,
25
+ placeholder,
25
26
  }) => {
26
27
  const [inputValue, setInputValue] = useState(initialInputValue);
27
28
 
@@ -79,6 +80,7 @@ const TypeAhead = ({
79
80
  onSearch,
80
81
  items,
81
82
  activeItems,
83
+ placeholder,
82
84
  shouldShowItems: isOpen && items.length > 0,
83
85
  };
84
86
 
@@ -86,7 +88,7 @@ const TypeAhead = ({
86
88
  <div>
87
89
  {patternfly4 ?
88
90
  <TypeAheadSearchPf4 autoSearchEnabled={autoSearchEnabled} {...typeAheadProps} /> :
89
- <TypeAheadSearch actionText={actionText} {...typeAheadProps} />}
91
+ <TypeAheadSearch actionText={actionText} {...typeAheadProps} placeholder={null} />}
90
92
  </div>
91
93
  );
92
94
  }}
@@ -112,6 +114,7 @@ TypeAhead.propTypes = {
112
114
  autoSearchEnabled: PropTypes.bool.isRequired,
113
115
  autoSearchDelay: PropTypes.number,
114
116
  bookmarkController: PropTypes.string,
117
+ placeholder: PropTypes.string,
115
118
  };
116
119
 
117
120
  TypeAhead.defaultProps = {
@@ -121,6 +124,7 @@ TypeAhead.defaultProps = {
121
124
  isDisabled: undefined,
122
125
  autoSearchDelay: 500,
123
126
  bookmarkController: undefined,
127
+ placeholder: undefined,
124
128
  };
125
129
 
126
130
  export default TypeAhead;
@@ -26,7 +26,7 @@ export const commonInputPropTypes = {
26
26
  };
27
27
 
28
28
  export const commonItemPropTypes = {
29
- items: PropTypes.arrayOf(PropTypes.object).isRequired,
29
+ items: PropTypes.arrayOf(PropTypes.shape({})).isRequired,
30
30
  activeItems: PropTypes.arrayOf(PropTypes.string).isRequired,
31
31
  highlightedIndex: PropTypes.number.isRequired,
32
32
  getItemProps: PropTypes.func.isRequired,
@@ -5,22 +5,22 @@ const keyPressHandler = (
5
5
  selectItem, userInputValue, onSearch,
6
6
  ) => {
7
7
  switch (e.keyCode) {
8
- case KEYCODES.TAB_KEY:
9
- if (isOpen && activeItems[highlightedIndex]) {
10
- selectItem(activeItems[highlightedIndex]);
11
- e.preventDefault();
12
- }
13
- break;
8
+ case KEYCODES.TAB_KEY:
9
+ if (isOpen && activeItems[highlightedIndex]) {
10
+ selectItem(activeItems[highlightedIndex]);
11
+ e.preventDefault();
12
+ }
13
+ break;
14
14
 
15
- case KEYCODES.ENTER:
16
- if (!isOpen || !activeItems[highlightedIndex]) {
17
- onSearch(userInputValue);
18
- e.preventDefault();
19
- }
20
- break;
15
+ case KEYCODES.ENTER:
16
+ if (!isOpen || !activeItems[highlightedIndex]) {
17
+ onSearch(userInputValue);
18
+ e.preventDefault();
19
+ }
20
+ break;
21
21
 
22
- default:
23
- break;
22
+ default:
23
+ break;
24
24
  }
25
25
  };
26
26
 
@@ -18,7 +18,7 @@ const TypeAheadSearch = ({
18
18
  onKeyPress={e => keyPressHandler(
19
19
  e, isOpen, activeItems, highlightedIndex,
20
20
  selectItem, userInputValue, onSearch,
21
- )}
21
+ )}
22
22
  onInputFocus={openMenu}
23
23
  passedProps={getInputProps()}
24
24
  />
@@ -8,7 +8,7 @@ import { commonInputPropTypes } from '../helpers/commonPropTypes';
8
8
  import './TypeAheadInput.scss';
9
9
 
10
10
  const TypeAheadInput = ({
11
- onKeyPress, onInputFocus, passedProps, isDisabled, autoSearchEnabled,
11
+ onKeyPress, onInputFocus, passedProps, isDisabled, autoSearchEnabled, placeholder,
12
12
  }) => {
13
13
  const inputRef = useRef(null);
14
14
  const {
@@ -33,6 +33,7 @@ const TypeAheadInput = ({
33
33
  onChange={onChangeWrapper}
34
34
  type="search"
35
35
  iconVariant={autoSearchEnabled && 'search'}
36
+ placeholder={placeholder}
36
37
  />
37
38
  {
38
39
  value && (
@@ -50,10 +51,12 @@ TypeAheadInput.propTypes = {
50
51
  isDisabled: PropTypes.bool,
51
52
  autoSearchEnabled: PropTypes.bool.isRequired,
52
53
  ...commonInputPropTypes,
54
+ placeholder: PropTypes.string,
53
55
  };
54
56
 
55
57
  TypeAheadInput.defaultProps = {
56
58
  isDisabled: undefined,
59
+ placeholder: '',
57
60
  };
58
61
 
59
62
  export default TypeAheadInput;
@@ -12,7 +12,7 @@ import Bookmark from './../../../components/Bookmark';
12
12
  const TypeAheadSearch = ({
13
13
  userInputValue, clearSearch, getInputProps, getItemProps, isOpen, highlightedIndex,
14
14
  selectedItem, selectItem, openMenu, onSearch, items, activeItems, shouldShowItems,
15
- autoSearchEnabled, isDisabled, bookmarkController, inputValue,
15
+ autoSearchEnabled, isDisabled, bookmarkController, inputValue, placeholder,
16
16
  }) => (
17
17
  <>
18
18
  <InputGroup>
@@ -34,6 +34,7 @@ const TypeAheadSearch = ({
34
34
  onInputFocus={openMenu}
35
35
  passedProps={{ ...getInputProps(), clearSearch }}
36
36
  autoSearchEnabled={autoSearchEnabled}
37
+ placeholder={placeholder}
37
38
  />
38
39
  <>
39
40
  {bookmarkController &&
@@ -1,3 +1,4 @@
1
+ /* eslint-disable react/jsx-indent */
1
2
  import React, { Component } from 'react';
2
3
  import PropTypes from 'prop-types';
3
4
  import { bindActionCreators } from 'redux';
@@ -46,14 +47,13 @@ function withOrganization(WrappedComponent) {
46
47
 
47
48
  if (newOrgSelected) {
48
49
  if (!organization.label && !organization.loading) { this.props.loadOrganization(); }
49
-
50
50
  return <WrappedComponent {...this.props} />;
51
51
  } else if (this.state.orgId === '') {
52
52
  return (
53
- <React.Fragment>
53
+ <>
54
54
  <Header title={__('Select Organization')} />
55
55
  <SetOrganization />
56
- </React.Fragment>);
56
+ </>);
57
57
  }
58
58
  return <WrappedComponent {...this.props} />;
59
59
  }
@@ -26,7 +26,7 @@ const HostContentViewDetails = ({
26
26
  }
27
27
 
28
28
  return (
29
- <GridItem rowSpan={2} md={6} lg={4}>
29
+ <GridItem rowSpan={1} md={6} lg={4} xl2={3} >
30
30
  <Card isHoverable>
31
31
  <CardHeader>
32
32
  <CardTitle>{__('Content view details')}</CardTitle>
@@ -0,0 +1,108 @@
1
+ import React from 'react';
2
+ import {
3
+ Card,
4
+ CardHeader,
5
+ CardTitle,
6
+ CardBody,
7
+ Flex,
8
+ FlexItem,
9
+ GridItem,
10
+ } from '@patternfly/react-core';
11
+ import { translate as __ } from 'foremanReact/common/I18n';
12
+ import { propsToCamelCase } from 'foremanReact/common/helpers';
13
+ import PropTypes from 'prop-types';
14
+ import { ChartPie } from '@patternfly/react-charts';
15
+ import { ErrataMapper } from '../../../../components/Errata';
16
+
17
+ function HostInstallableErrata({
18
+ id, errataCounts,
19
+ }) {
20
+ const errataTotal = errataCounts.total;
21
+ const errataSecurity = errataCounts.security;
22
+ const errataBug = errataCounts.bugfix;
23
+ const errataEnhance = errataCounts.enhancement;
24
+ const chartData = [{
25
+ w: 'security advisories', x: 'security', y: errataSecurity, z: errataTotal,
26
+ }, {
27
+ w: 'bug fixes', x: 'bugfix', y: errataBug, z: errataTotal,
28
+ }, {
29
+ w: 'enhancements', x: 'enhancement', y: errataEnhance, z: errataTotal,
30
+ }];
31
+ return (
32
+ <GridItem rowSpan={1} md={6} lg={4} xl2={3} >
33
+ <Card isHoverable>
34
+ <CardHeader>
35
+ <CardTitle>{__('Installable Errata')}</CardTitle>
36
+ </CardHeader>
37
+ <CardBody>
38
+ <Flex direction="column">
39
+ <FlexItem>
40
+ <a href="#/Content/errata">
41
+ {errataTotal} errata
42
+ </a>
43
+ </FlexItem>
44
+ <Flex flexWrap={{ xl: 'nowrap' }} direction="row" alignItems={{ default: 'alignItemsCenter' }}>
45
+ <div className="piechart-overflow" style={{ overflow: 'visible', minWidth: '140px', maxHeight: '155px' }}>
46
+ <div className="erratachart" style={{ minWidth: '300px', minHeight: '300px' }}>
47
+ <ChartPie
48
+ ariaDesc="errataChart"
49
+ data={chartData}
50
+ constrainToVisibleArea
51
+ labels={({ datum }) => `${datum.y} ${datum.w}`}
52
+ padding={{
53
+ bottom: 20,
54
+ left: 20,
55
+ right: 140,
56
+ top: 20,
57
+ }}
58
+ width={250}
59
+ height={130}
60
+ />
61
+ </div>
62
+ </div>
63
+ <div className="erratalegend" style={{ minWidth: '140px' }}>
64
+ <FlexItem>
65
+ <ErrataMapper data={chartData} id={id} />
66
+ </FlexItem>
67
+ </div>
68
+ </Flex>
69
+ </Flex>
70
+ </CardBody>
71
+ </Card>
72
+ </GridItem>
73
+ );
74
+ }
75
+
76
+ const ErrataOverviewCard = ({ hostDetails }) => {
77
+ if (hostDetails.content_facet_attributes) {
78
+ const { id: hostId } = hostDetails;
79
+ return (<HostInstallableErrata
80
+ {...propsToCamelCase(hostDetails.content_facet_attributes)}
81
+ id={hostId}
82
+ />);
83
+ }
84
+ return null;
85
+ };
86
+
87
+ HostInstallableErrata.propTypes = {
88
+ id: PropTypes.number.isRequired,
89
+ errataCounts: PropTypes.shape({
90
+ bugfix: PropTypes.number,
91
+ enhancement: PropTypes.number,
92
+ security: PropTypes.number,
93
+ total: PropTypes.number,
94
+ }).isRequired,
95
+ };
96
+
97
+ ErrataOverviewCard.propTypes = {
98
+ hostDetails: PropTypes.shape({
99
+ content_facet_attributes: PropTypes.shape({}),
100
+ id: PropTypes.number,
101
+ }),
102
+ };
103
+
104
+ ErrataOverviewCard.defaultProps = {
105
+ hostDetails: {},
106
+ };
107
+
108
+ export default ErrataOverviewCard;