katello 3.16.2 → 3.17.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 (381) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/stylesheets/katello/katello.scss +3 -7
  3. data/app/controllers/katello/api/rhsm/candlepin_proxies_controller.rb +1 -1
  4. data/app/controllers/katello/api/v2/activation_keys_controller.rb +8 -0
  5. data/app/controllers/katello/api/v2/host_subscriptions_controller.rb +10 -4
  6. data/app/controllers/katello/api/v2/host_tracer_controller.rb +33 -8
  7. data/app/controllers/katello/api/v2/hosts_bulk_actions_controller.rb +11 -11
  8. data/app/controllers/katello/api/v2/products_bulk_actions_controller.rb +0 -15
  9. data/app/controllers/katello/api/v2/repositories_controller.rb +5 -11
  10. data/app/controllers/katello/api/v2/upstream_subscriptions_controller.rb +16 -0
  11. data/app/controllers/katello/concerns/api/v2/bulk_hosts_extensions.rb +4 -4
  12. data/app/controllers/katello/concerns/api/v2/hostgroups_controller_extensions.rb +1 -1
  13. data/app/controllers/katello/concerns/hosts_controller_extensions.rb +5 -11
  14. data/app/helpers/katello/concerns/dashboard_helper_extensions.rb +10 -0
  15. data/app/helpers/katello/hosts_and_hostgroups_helper.rb +6 -7
  16. data/app/lib/actions/candlepin/product/content_add.rb +2 -1
  17. data/app/lib/actions/candlepin/product/content_update_enablement.rb +18 -0
  18. data/app/lib/actions/katello/applicability/hosts/bulk_generate.rb +2 -6
  19. data/app/lib/actions/katello/capsule_content/refresh_repos.rb +1 -1
  20. data/app/lib/actions/katello/capsule_content/sync.rb +1 -1
  21. data/app/lib/actions/katello/capsule_content/sync_capsule.rb +3 -17
  22. data/app/lib/actions/katello/content_view_version/incremental_update.rb +2 -3
  23. data/app/lib/actions/katello/organization/simple_content_access/disable.rb +17 -0
  24. data/app/lib/actions/katello/organization/simple_content_access/enable.rb +17 -0
  25. data/app/lib/actions/katello/organization/simple_content_access/toggle.rb +36 -0
  26. data/app/lib/actions/katello/orphan_cleanup/remove_orphans.rb +13 -0
  27. data/app/lib/actions/katello/product/content_create.rb +3 -3
  28. data/app/lib/actions/katello/product/destroy.rb +4 -25
  29. data/app/lib/actions/katello/repository/content_update.rb +41 -0
  30. data/app/lib/actions/katello/repository/destroy.rb +1 -5
  31. data/app/lib/actions/katello/repository/export.rb +1 -1
  32. data/app/lib/actions/katello/repository/multi_clone_contents.rb +15 -13
  33. data/app/lib/actions/katello/repository/sync.rb +25 -35
  34. data/app/lib/actions/katello/repository/update.rb +19 -30
  35. data/app/lib/actions/katello/repository/update_cv_repo_cert_guard.rb +17 -0
  36. data/app/lib/actions/pulp/orchestration/repository/smart_proxy_sync.rb +1 -0
  37. data/app/lib/actions/pulp/orchestration/repository/sync.rb +1 -2
  38. data/app/lib/actions/pulp/repository/sync.rb +1 -2
  39. data/app/lib/actions/pulp3/abstract_async_task.rb +0 -1
  40. data/app/lib/actions/pulp3/capsule_content/sync.rb +1 -3
  41. data/app/lib/actions/pulp3/content_view/delete_repository_references.rb +1 -1
  42. data/app/lib/actions/pulp3/orchestration/repository/copy_all_units.rb +2 -1
  43. data/app/lib/actions/pulp3/orchestration/repository/sync.rb +1 -3
  44. data/app/lib/actions/pulp3/repository/copy_content.rb +1 -0
  45. data/app/lib/actions/pulp3/repository/delete.rb +1 -1
  46. data/app/lib/actions/pulp3/repository/multi_copy_content.rb +1 -1
  47. data/app/lib/actions/pulp3/repository/save_version.rb +16 -20
  48. data/app/lib/actions/pulp3/repository/sync.rb +1 -1
  49. data/app/lib/actions/pulp3/repository/update_cv_repository_cert_guard.rb +2 -6
  50. data/app/lib/actions/pulp3/repository/upload_file.rb +1 -1
  51. data/app/lib/katello/resources/candlepin/product.rb +11 -0
  52. data/app/lib/katello/resources/cdn.rb +2 -3
  53. data/app/lib/katello/util/cdn_var_substitutor.rb +7 -9
  54. data/app/lib/katello/validators/hostgroup_kickstart_repository_validator.rb +11 -11
  55. data/app/models/katello/activation_key.rb +1 -1
  56. data/app/models/katello/concerns/content_facet_host_extensions.rb +7 -0
  57. data/app/models/katello/concerns/host_managed_extensions.rb +39 -0
  58. data/app/models/katello/concerns/hostgroup_extensions.rb +46 -24
  59. data/app/models/katello/concerns/smart_proxy_extensions.rb +5 -19
  60. data/app/models/katello/concerns/widget_extensions.rb +23 -0
  61. data/app/models/katello/content_view.rb +9 -1
  62. data/app/models/katello/content_view_package_filter.rb +1 -1
  63. data/app/models/katello/content_view_version.rb +7 -0
  64. data/app/models/katello/erratum.rb +13 -0
  65. data/app/models/katello/erratum_cve.rb +8 -0
  66. data/app/models/katello/glue/pulp/repo.rb +1 -1
  67. data/app/models/katello/host/content_facet.rb +18 -1
  68. data/app/models/katello/host_collection.rb +6 -0
  69. data/app/models/katello/hostgroup/content_facet.rb +18 -0
  70. data/app/models/katello/installed_package.rb +8 -0
  71. data/app/models/katello/kt_environment.rb +9 -1
  72. data/app/models/katello/model.rb +16 -0
  73. data/app/models/katello/pool.rb +17 -0
  74. data/app/models/katello/product.rb +6 -0
  75. data/app/models/katello/purpose_addons_status.rb +1 -0
  76. data/app/models/katello/purpose_role_status.rb +1 -0
  77. data/app/models/katello/purpose_sla_status.rb +1 -0
  78. data/app/models/katello/purpose_usage_status.rb +1 -0
  79. data/app/models/katello/repository.rb +3 -6
  80. data/app/models/katello/root_repository.rb +24 -16
  81. data/app/models/katello/subscription_status.rb +1 -1
  82. data/app/models/katello/trace_status.rb +1 -1
  83. data/app/models/setting/content.rb +6 -2
  84. data/app/services/cert/certs.rb +2 -10
  85. data/app/services/katello/event_daemon.rb +7 -8
  86. data/app/services/katello/host_status_manager.rb +13 -0
  87. data/app/services/katello/pulp3/migration.rb +1 -1
  88. data/app/services/katello/pulp3/repository/yum.rb +6 -72
  89. data/app/services/katello/pulp3/repository.rb +11 -10
  90. data/app/services/katello/pulp3/smart_proxy_mirror_repository.rb +1 -1
  91. data/app/services/katello/pulp3/task.rb +3 -3
  92. data/app/services/katello/pulp3/task_group.rb +0 -6
  93. data/app/services/katello/smart_proxy_helper.rb +16 -13
  94. data/app/views/foreman/smart_proxies/_content_sync.html.erb +1 -1
  95. data/app/views/katello/api/v2/repositories/base.json.rabl +1 -1
  96. data/config/routes/api/rhsm.rb +0 -1
  97. data/config/routes/api/v2.rb +8 -2
  98. data/config/routes/overrides.rb +0 -4
  99. data/db/migrate/20141222151001_add_host_content_view_environment.rb +1 -1
  100. data/db/migrate/20180904122343_create_hostgroup_content_facet.katello.rb +16 -0
  101. data/db/migrate/20200514092553_move_katello_fields_from_hostgroups.katello.rb +53 -0
  102. data/db/migrate/20200610112009_remove_audits_of_root_repo_with_content_id.rb +9 -0
  103. data/db/migrate/20200701150946_add_auto_enabled_to_root_repository.rb +5 -0
  104. data/db/seeds.d/75-job_templates.rb +2 -2
  105. data/engines/bastion/app/assets/javascripts/bastion/components/nutupane.factory.js +3 -1
  106. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/activation-key-associations.controller.js +5 -2
  107. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/activation-key-details.controller.js +4 -2
  108. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/views/activation-key-add-subscriptions.html +1 -1
  109. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/views/activation-key-associations-content-hosts.html +2 -2
  110. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/views/activation-key-details.html +1 -1
  111. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/bulk/content-hosts-bulk-errata-modal.controller.js +4 -1
  112. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/bulk/content-hosts-bulk-packages-modal.controller.js +4 -1
  113. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/bulk/content-hosts-bulk-subscriptions-modal.controller.js +1 -0
  114. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/bulk/content-hosts-bulk-traces-modal.controller.js +4 -3
  115. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/bulk/views/content-hosts-bulk-environment-modal.html +7 -1
  116. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/bulk/views/content-hosts-bulk-errata-modal.html +1 -0
  117. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/bulk/views/content-hosts-bulk-packages-modal.html +1 -0
  118. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content-hosts.controller.js +4 -2
  119. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content-hosts.routes.js +1 -1
  120. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/content-host-details-info.controller.js +7 -1
  121. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/content-host-details.controller.js +4 -2
  122. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/views/content-host-add-subscriptions.html +1 -1
  123. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/views/content-host-details.html +1 -0
  124. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/views/content-host-info.html +14 -6
  125. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/views/content-host-subscriptions-list.html +1 -1
  126. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/content-hosts.html +6 -6
  127. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/host-collections/details/host-collection-details.controller.js +5 -2
  128. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/host-collections/details/views/host-collection-info.html +1 -1
  129. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/hosts/host-bulk-action.factory.js +1 -2
  130. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/hosts/host-traces-resolve.factory.js +18 -0
  131. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +45 -4
  132. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/de.po +1 -1
  133. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/es.po +1 -1
  134. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/fr.po +1 -1
  135. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/it.po +1 -1
  136. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ja.po +1 -1
  137. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ko.po +1 -1
  138. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/pt_BR.po +1 -1
  139. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ru.po +1 -1
  140. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/zh_CN.po +1 -1
  141. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/zh_TW.po +1 -1
  142. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/bulk/product-bulk-action.factory.js +0 -1
  143. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details.controller.js +0 -6
  144. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-details.html +1 -7
  145. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-info.html +11 -1
  146. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/new-repository.controller.js +1 -1
  147. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/views/new-repository.html +16 -4
  148. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/repository.factory.js +0 -1
  149. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/products.controller.js +0 -15
  150. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/views/products.html +0 -6
  151. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/subscriptions/views/content-access-mode-banner.html +1 -1
  152. data/lib/katello/engine.rb +6 -5
  153. data/lib/katello/permission_creator.rb +3 -3
  154. data/lib/katello/permissions/host_permissions.rb +0 -1
  155. data/lib/katello/plugin.rb +20 -16
  156. data/lib/katello/tasks/pulp3_post_migration_check.rake +1 -2
  157. data/lib/katello/tasks/reimport.rake +1 -1
  158. data/lib/katello/tasks/reports.rake +0 -12
  159. data/lib/katello/tasks/test.rake +15 -0
  160. data/lib/katello/version.rb +1 -1
  161. data/locale/action_names.rb +48 -48
  162. data/locale/bn/katello.po +137 -14
  163. data/locale/cs/katello.po +137 -14
  164. data/locale/de/katello.po +138 -15
  165. data/locale/en/katello.po +137 -14
  166. data/locale/es/katello.po +138 -15
  167. data/locale/fr/katello.po +138 -15
  168. data/locale/gu/katello.po +137 -14
  169. data/locale/hi/katello.po +137 -14
  170. data/locale/it/katello.po +138 -15
  171. data/locale/ja/katello.po +138 -15
  172. data/locale/katello.pot +969 -769
  173. data/locale/kn/katello.po +137 -14
  174. data/locale/ko/katello.po +138 -15
  175. data/locale/mr/katello.po +137 -14
  176. data/locale/or/katello.po +137 -14
  177. data/locale/pa/katello.po +137 -14
  178. data/locale/pt/katello.po +137 -14
  179. data/locale/pt_BR/katello.po +138 -15
  180. data/locale/ru/katello.po +138 -15
  181. data/locale/ta/katello.po +137 -14
  182. data/locale/te/katello.po +137 -14
  183. data/locale/zh_CN/katello.po +138 -15
  184. data/locale/zh_TW/katello.po +138 -15
  185. data/package.json +8 -25
  186. data/webpack/__mocks__/foremanReact/Root/Context/ForemanContext.js +3 -0
  187. data/webpack/components/ActionableDetail.js +63 -0
  188. data/webpack/components/Content/ContentTable.js +2 -2
  189. data/webpack/components/Content/Details/ContentDetailRepositoryTableSchema.js +1 -1
  190. data/webpack/components/Content/Details/ContentDetails.js +1 -1
  191. data/webpack/components/Content/__tests__/ContentTable.test.js +2 -2
  192. data/webpack/components/Content/__tests__/__snapshots__/ContentPage.test.js.snap +1 -1
  193. data/webpack/components/EditableSwitch.js +30 -0
  194. data/webpack/components/EditableTextInput/EditableTextInput.js +120 -0
  195. data/webpack/components/EditableTextInput/__tests__/editableTextInput.test.js +52 -0
  196. data/webpack/components/EditableTextInput/editableTextInput.scss +14 -0
  197. data/webpack/components/EditableTextInput/index.js +3 -0
  198. data/webpack/{scenes/ContentViews/components → components}/Loading.js +8 -5
  199. data/webpack/{move_to_pf → components}/LoadingState/LoadingState.js +0 -0
  200. data/webpack/{move_to_pf → components}/LoadingState/LoadingState.scss +0 -0
  201. data/webpack/{move_to_pf → components}/LoadingState/LoadingState.test.js +0 -0
  202. data/webpack/{move_to_pf → components}/LoadingState/__snapshots__/LoadingState.test.js.snap +0 -0
  203. data/webpack/{move_to_pf → components}/LoadingState/index.js +0 -0
  204. data/webpack/components/MultiSelect/index.js +1 -1
  205. data/webpack/{move_to_pf → components}/OptionTooltip/OptionTooltip.scss +0 -0
  206. data/webpack/{move_to_pf → components}/OptionTooltip/__tests__/OptionTooltip.test.js +0 -0
  207. data/webpack/{move_to_pf → components}/OptionTooltip/__tests__/__snapshots__/OptionTooltip.test.js.snap +0 -0
  208. data/webpack/{move_to_pf → components}/OptionTooltip/index.js +0 -0
  209. data/webpack/components/Search/Search.js +124 -0
  210. data/webpack/components/Search/Search.test.js +2 -1
  211. data/webpack/components/Search/__snapshots__/Search.test.js.snap +2 -0
  212. data/webpack/components/Search/__tests__/search.test.js +124 -0
  213. data/webpack/components/Search/index.js +11 -87
  214. data/webpack/{move_to_pf → components}/Select/Select.js +0 -0
  215. data/webpack/components/SelectOrg/SetOrganization.js +2 -2
  216. data/webpack/components/TabWrapper/TabWrapper.js +26 -0
  217. data/webpack/components/TabWrapper/index.js +3 -0
  218. data/webpack/components/TabbedView/TabbedView.js +38 -0
  219. data/webpack/components/TabbedView/TabbedView.scss +3 -0
  220. data/webpack/components/TabbedView/index.js +3 -0
  221. data/webpack/components/Table/EmptyStateMessage.js +61 -0
  222. data/webpack/{scenes/ContentViews/Table/TableWrapper.js → components/Table/MainTable.js} +23 -12
  223. data/webpack/components/Table/TableWrapper.js +94 -0
  224. data/webpack/{move_to_pf → components}/TooltipButton/TooltipButton.js +0 -0
  225. data/webpack/{move_to_pf → components}/TooltipButton/TooltipButton.scss +0 -0
  226. data/webpack/{move_to_pf → components}/TooltipButton/TooltipButton.test.js +0 -0
  227. data/webpack/{move_to_pf → components}/TooltipButton/__snapshots__/TooltipButton.test.js.snap +0 -0
  228. data/webpack/{move_to_pf → components}/TooltipButton/index.js +0 -0
  229. data/webpack/components/TypeAhead/TypeAhead.js +109 -0
  230. data/webpack/{move_to_pf → components}/TypeAhead/TypeAhead.scss +0 -0
  231. data/webpack/components/TypeAhead/helpers/commonPropTypes.js +35 -0
  232. data/webpack/components/TypeAhead/helpers/helpers.js +32 -0
  233. data/webpack/components/TypeAhead/index.js +3 -0
  234. data/webpack/{move_to_pf/TypeAhead → components/TypeAhead/pf3Search}/TypeAheadInput.js +3 -6
  235. data/webpack/{move_to_pf/TypeAhead → components/TypeAhead/pf3Search}/TypeAheadItems.js +3 -7
  236. data/webpack/components/TypeAhead/pf3Search/TypeAheadSearch.js +52 -0
  237. data/webpack/components/TypeAhead/pf4Search/TypeAheadInput.js +44 -0
  238. data/webpack/components/TypeAhead/pf4Search/TypeAheadInput.scss +11 -0
  239. data/webpack/components/TypeAhead/pf4Search/TypeAheadItems.js +57 -0
  240. data/webpack/components/TypeAhead/pf4Search/TypeAheadSearch.js +66 -0
  241. data/webpack/components/TypeAhead/pf4Search/TypeAheadSearch.scss +5 -0
  242. data/webpack/components/extensions/about/__tests__/SystemStatuses.test.js +1 -1
  243. data/webpack/{move_to_foreman/components/common/table → components/pf3Table}/components/CollapseSubscriptionGroupButton.js +0 -0
  244. data/webpack/{move_to_foreman/components/common/table → components/pf3Table}/components/CollapseSubscriptionGroupButton.test.js +0 -0
  245. data/webpack/{move_to_foreman/components/common/table → components/pf3Table}/components/Table.js +0 -0
  246. data/webpack/{move_to_foreman/components/common/table → components/pf3Table}/components/Table.test.js +0 -0
  247. data/webpack/{move_to_foreman/components/common/table → components/pf3Table}/components/TableBody.js +0 -0
  248. data/webpack/{move_to_foreman/components/common/table → components/pf3Table}/components/TableBody.test.js +0 -0
  249. data/webpack/{move_to_foreman/components/common/table → components/pf3Table}/components/TableBodyMessage.js +0 -0
  250. data/webpack/{move_to_foreman/components/common/table → components/pf3Table}/components/TableBodyMessage.test.js +0 -0
  251. data/webpack/{move_to_foreman/components/common/table → components/pf3Table}/components/TableFixtures.js +0 -0
  252. data/webpack/{move_to_foreman/components/common/table → components/pf3Table}/components/TableSelectionCell.js +0 -0
  253. data/webpack/{move_to_foreman/components/common/table → components/pf3Table}/components/TableSelectionCell.test.js +0 -0
  254. data/webpack/{move_to_foreman/components/common/table → components/pf3Table}/components/TableSelectionHeaderCell.js +0 -0
  255. data/webpack/{move_to_foreman/components/common/table → components/pf3Table}/components/TableSelectionHeaderCell.test.js +0 -0
  256. data/webpack/{move_to_foreman/components/common/table → components/pf3Table}/components/__snapshots__/CollapseSubscriptionGroupButton.test.js.snap +0 -0
  257. data/webpack/{move_to_foreman/components/common/table → components/pf3Table}/components/__snapshots__/Table.test.js.snap +0 -0
  258. data/webpack/{move_to_foreman/components/common/table → components/pf3Table}/components/__snapshots__/TableBody.test.js.snap +0 -0
  259. data/webpack/{move_to_foreman/components/common/table → components/pf3Table}/components/__snapshots__/TableBodyMessage.test.js.snap +0 -0
  260. data/webpack/{move_to_foreman/components/common/table → components/pf3Table}/components/__snapshots__/TableSelectionCell.test.js.snap +0 -0
  261. data/webpack/{move_to_foreman/components/common/table → components/pf3Table}/components/__snapshots__/TableSelectionHeaderCell.test.js.snap +0 -0
  262. data/webpack/{move_to_foreman/components/common/table → components/pf3Table}/components/index.js +0 -0
  263. data/webpack/{move_to_foreman/components/common/table → components/pf3Table}/formatters/EntitlementsInlineEditFormatter.js +1 -1
  264. data/webpack/{move_to_foreman/components/common/table → components/pf3Table}/formatters/__tests__/EntitlementsInlineEditFormatter.test.js +0 -0
  265. data/webpack/{move_to_foreman/components/common/table → components/pf3Table}/formatters/__tests__/__snapshots__/EntitlementsInlineEditFormatter.test.js.snap +0 -0
  266. data/webpack/{move_to_foreman/components/common/table → components/pf3Table}/formatters/cellFormatter.js +0 -0
  267. data/webpack/{move_to_foreman/components/common/table → components/pf3Table}/formatters/collapseableAndSelectionCellFormatter.js +0 -0
  268. data/webpack/{move_to_foreman/components/common/table → components/pf3Table}/formatters/ellipsisCellFormatter.js +0 -0
  269. data/webpack/{move_to_foreman/components/common/table → components/pf3Table}/formatters/headerFormatter.js +0 -0
  270. data/webpack/{move_to_foreman/components/common/table → components/pf3Table}/formatters/index.js +0 -0
  271. data/webpack/{move_to_foreman/components/common/table → components/pf3Table}/formatters/selectionCellFormatter.js +0 -0
  272. data/webpack/{move_to_foreman/components/common/table → components/pf3Table}/formatters/selectionHeaderCellFormatter.js +0 -0
  273. data/webpack/{move_to_foreman/components/common/table → components/pf3Table}/index.js +0 -0
  274. data/webpack/{move_to_pf → components}/react-bootstrap-select/index.js +0 -0
  275. data/webpack/containers/Application/config.js +5 -0
  276. data/webpack/containers/Application/overrides.scss +5 -0
  277. data/webpack/global_test_setup.js +3 -1
  278. data/webpack/redux/OrganizationProducts/OrganizationProductsActions.js +1 -1
  279. data/webpack/redux/OrganizationProducts/__tests__/OrganizationProductsActions.test.js +2 -2
  280. data/webpack/redux/actions/RedHatRepositories/enabled.js +1 -1
  281. data/webpack/redux/actions/RedHatRepositories/helpers.js +1 -1
  282. data/webpack/redux/actions/RedHatRepositories/repositorySetRepositories.js +1 -1
  283. data/webpack/redux/reducers/index.js +2 -0
  284. data/webpack/scenes/AnsibleCollections/AnsibleCollectionsActions.js +1 -1
  285. data/webpack/scenes/AnsibleCollections/AnsibleCollectionsTableSchema.js +1 -1
  286. data/webpack/scenes/AnsibleCollections/Details/AnsibleCollectionDetailsActions.js +1 -1
  287. data/webpack/scenes/AnsibleCollections/Details/__tests__/AnsibleCollectionDetailsActions.test.js +2 -2
  288. data/webpack/scenes/AnsibleCollections/__tests__/AnsibleCollectionsTable.test.js +1 -1
  289. data/webpack/scenes/ContentViews/ContentViewSelectors.js +1 -2
  290. data/webpack/scenes/ContentViews/ContentViewsActions.js +4 -4
  291. data/webpack/scenes/ContentViews/ContentViewsConstants.js +4 -1
  292. data/webpack/scenes/ContentViews/ContentViewsPage.js +12 -6
  293. data/webpack/scenes/ContentViews/Details/ContentViewDetailActions.js +44 -0
  294. data/webpack/scenes/ContentViews/Details/ContentViewDetailReducer.js +23 -0
  295. data/webpack/scenes/ContentViews/{details → Details}/ContentViewDetailSelectors.js +3 -0
  296. data/webpack/scenes/ContentViews/Details/ContentViewDetails.js +70 -0
  297. data/webpack/scenes/ContentViews/Details/ContentViewInfo.js +116 -0
  298. data/webpack/scenes/ContentViews/{details → Details}/DetailsContainer.js +8 -4
  299. data/webpack/scenes/ContentViews/Details/__tests__/contentViewDetail.test.js +101 -0
  300. data/webpack/scenes/ContentViews/Details/__tests__/contentViewDetails.fixtures.json +106 -0
  301. data/webpack/scenes/ContentViews/Details/contentViewInfo.scss +8 -0
  302. data/webpack/scenes/ContentViews/Details/index.js +7 -0
  303. data/webpack/scenes/ContentViews/Table/ContentViewsTable.js +51 -36
  304. data/webpack/scenes/ContentViews/Table/tableDataGenerator.js +47 -44
  305. data/webpack/scenes/ContentViews/__tests__/basicContentViews.fixtures.js +31 -0
  306. data/webpack/scenes/ContentViews/__tests__/contentViewList.fixtures.json +2 -1
  307. data/webpack/scenes/ContentViews/__tests__/contentViewPage.test.js +173 -23
  308. data/webpack/scenes/ContentViews/components/ContentViewIcon.js +26 -0
  309. data/webpack/scenes/ContentViews/components/{contentViewName.scss → contentViewIcon.scss} +0 -0
  310. data/webpack/scenes/ModuleStreams/Details/ModuleStreamDetailsActions.js +1 -1
  311. data/webpack/scenes/ModuleStreams/Details/Profiles/TableSchema.js +1 -1
  312. data/webpack/scenes/ModuleStreams/Details/__tests__/ModuleStreamDetailsActions.test.js +2 -2
  313. data/webpack/scenes/ModuleStreams/ModuleStreamsActions.js +1 -1
  314. data/webpack/scenes/ModuleStreams/ModuleStreamsTableSchema.js +1 -1
  315. data/webpack/scenes/ModuleStreams/__tests__/ModuleStreamsTable.test.js +1 -1
  316. data/webpack/scenes/Organizations/OrganizationSelectors.js +14 -0
  317. data/webpack/scenes/Products/ProductActions.js +1 -1
  318. data/webpack/scenes/RedHatRepositories/RedHatRepositoriesPage.js +1 -1
  319. data/webpack/scenes/Settings/SettingsConstants.js +3 -0
  320. data/webpack/scenes/Settings/SettingsReducer.js +33 -0
  321. data/webpack/scenes/Settings/SettingsSelectors.js +4 -0
  322. data/webpack/scenes/Settings/index.js +2 -1
  323. data/webpack/scenes/Subscriptions/Details/SubscriptionDetailActions.js +1 -1
  324. data/webpack/scenes/Subscriptions/Details/SubscriptionDetails.js +1 -1
  325. data/webpack/scenes/Subscriptions/Manifest/ManageManifestModal.js +59 -73
  326. data/webpack/scenes/Subscriptions/Manifest/ManageManifestModal.scss +15 -0
  327. data/webpack/scenes/Subscriptions/Manifest/ManifestActions.js +43 -1
  328. data/webpack/scenes/Subscriptions/Manifest/ManifestConstants.js +8 -0
  329. data/webpack/scenes/Subscriptions/Manifest/ManifestHistoryTableSchema.js +1 -1
  330. data/webpack/scenes/Subscriptions/Manifest/SimpleContentAccess.js +78 -0
  331. data/webpack/scenes/Subscriptions/Manifest/__tests__/ManageManifestModal.test.js +2 -0
  332. data/webpack/scenes/Subscriptions/Manifest/__tests__/ManifestActions.test.js +56 -1
  333. data/webpack/scenes/Subscriptions/Manifest/__tests__/SimpleContentAccess.test.js +114 -0
  334. data/webpack/scenes/Subscriptions/Manifest/__tests__/__snapshots__/ManageManifestModal.test.js.snap +6 -6
  335. data/webpack/scenes/Subscriptions/Manifest/__tests__/manifest.fixtures.js +36 -0
  336. data/webpack/scenes/Subscriptions/Manifest/index.js +3 -1
  337. data/webpack/scenes/Subscriptions/SubscriptionActions.js +1 -1
  338. data/webpack/scenes/Subscriptions/SubscriptionConstants.js +4 -0
  339. data/webpack/scenes/Subscriptions/SubscriptionHelpers.js +0 -3
  340. data/webpack/scenes/Subscriptions/SubscriptionReducer.js +38 -11
  341. data/webpack/scenes/Subscriptions/SubscriptionsPage.js +30 -18
  342. data/webpack/scenes/Subscriptions/SubscriptionsSelectors.js +0 -3
  343. data/webpack/scenes/Subscriptions/UpstreamSubscriptions/UpstreamSubscriptionsActions.js +1 -1
  344. data/webpack/scenes/Subscriptions/UpstreamSubscriptions/UpstreamSubscriptionsPage.js +2 -2
  345. data/webpack/scenes/Subscriptions/UpstreamSubscriptions/UpstreamSubscriptionsTableSchema.js +1 -1
  346. data/webpack/scenes/Subscriptions/__tests__/SubscriptionHelpers.test.js +0 -11
  347. data/webpack/scenes/Subscriptions/__tests__/__snapshots__/SubscriptionsActions.test.js.snap +2 -2
  348. data/webpack/scenes/Subscriptions/__tests__/__snapshots__/SubscriptionsPage.test.js.snap +4 -4
  349. data/webpack/scenes/Subscriptions/__tests__/__snapshots__/SubscriptionsReducer.test.js.snap +26 -1
  350. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/SubscriptionTypeFormatter.js +2 -2
  351. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/SubscriptionsTable.js +27 -21
  352. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/SubscriptionsTableHelpers.js +6 -2
  353. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/SubscriptionsTableSchema.js +2 -2
  354. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/__tests__/__snapshots__/SubscriptionTypeFormatter.test.js.snap +3 -3
  355. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/components/Table.js +1 -1
  356. data/webpack/scenes/Subscriptions/components/SubscriptionsToolbar/SubscriptionsToolbar.js +28 -3
  357. data/webpack/scenes/Subscriptions/components/SubscriptionsToolbar/__snapshots__/SubscriptionsToolbar.test.js.snap +5 -10
  358. data/webpack/scenes/Subscriptions/index.js +6 -2
  359. data/webpack/test-utils/nockWrapper.js +39 -5
  360. data/webpack/test-utils/react-testing-lib-wrapper.js +35 -9
  361. data/webpack/{move_to_foreman/common → utils}/helpers.js +12 -8
  362. data/webpack/utils/useEventListener.js +37 -0
  363. metadata +143 -83
  364. data/app/lib/actions/katello/repository/verify_checksum.rb +0 -28
  365. data/app/lib/actions/pulp3/orchestration/repository/trigger_update_repo_cert_guard.rb +0 -22
  366. data/app/lib/actions/pulp3/repository/presenters/repair_presenter.rb +0 -85
  367. data/app/lib/actions/pulp3/repository/repair.rb +0 -29
  368. data/app/services/katello/host_trace_manager.rb +0 -38
  369. data/vendor/assets/stylesheets/katello/jquery.loadmask.css.scss +0 -40
  370. data/vendor/assets/stylesheets/katello/ui.spinner.css.scss +0 -3
  371. data/webpack/__mocks__/foremanReact/components/ForemanModal/ForemanModalActions.js +0 -2
  372. data/webpack/__mocks__/foremanReact/components/ForemanModal/ForemanModalSelectors.js +0 -2
  373. data/webpack/__mocks__/foremanReact/components/ForemanModal/index.js +0 -4
  374. data/webpack/__mocks__/foremanReact/components/Settings/SettingsActions.js +0 -4
  375. data/webpack/__mocks__/foremanReact/components/Settings/SettingsConstants.js +0 -2
  376. data/webpack/move_to_pf/TypeAhead/TypeAhead.js +0 -138
  377. data/webpack/move_to_pf/TypeAhead/helpers.js +0 -5
  378. data/webpack/scenes/ContentViews/components/ContentViewName.js +0 -33
  379. data/webpack/scenes/ContentViews/components/EmptyStateMessage.js +0 -43
  380. data/webpack/scenes/ContentViews/details/ContentViewDetailActions.js +0 -12
  381. data/webpack/scenes/ContentViews/expansions/RepositoriesExpansion.js +0 -12
@@ -1,4 +1,5 @@
1
1
  import { combineReducers } from 'redux';
2
2
  import tables from './Tables/TableReducer';
3
+ import settings from './SettingsReducer';
3
4
 
4
- export default combineReducers({ tables });
5
+ export default combineReducers({ tables, settings });
@@ -4,7 +4,7 @@ import {
4
4
  SUBSCRIPTION_DETAILS_SUCCESS,
5
5
  SUBSCRIPTION_DETAILS_FAILURE,
6
6
  } from './SubscriptionDetailConstants';
7
- import { apiError } from '../../../move_to_foreman/common/helpers.js';
7
+ import { apiError } from '../../../utils/helpers.js';
8
8
 
9
9
  export const loadSubscriptionDetails = subscriptionId => async (dispatch) => {
10
10
  dispatch({ type: SUBSCRIPTION_DETAILS_REQUEST });
@@ -7,7 +7,7 @@ import SubscriptionDetailInfo from './SubscriptionDetailInfo';
7
7
  import SubscriptionDetailAssociations from './SubscriptionDetailAssociations';
8
8
  import SubscriptionDetailProducts from './SubscriptionDetailProducts';
9
9
  import SubscriptionDetailProductContent from './SubscriptionDetailProductContent';
10
- import { LoadingState } from '../../../move_to_pf/LoadingState';
10
+ import { LoadingState } from '../../../components/LoadingState';
11
11
  import api, { orgId } from '../../../services/api';
12
12
 
13
13
  class SubscriptionDetails extends Component {
@@ -1,17 +1,17 @@
1
1
  import React, { Component } from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import { Grid, Col, Row, Tabs, Tab, Form, FormGroup, FormControl, ControlLabel } from 'react-bootstrap';
4
- import { Button, Spinner, OverlayTrigger, Tooltip, Icon } from 'patternfly-react';
4
+ import { Button, Spinner } from 'patternfly-react';
5
5
  import ForemanModal from 'foremanReact/components/ForemanModal';
6
- import { isEqual } from 'lodash';
7
6
  import { translate as __ } from 'foremanReact/common/I18n';
8
- import TooltipButton from '../../../move_to_pf/TooltipButton';
9
- import { LoadingState } from '../../../move_to_pf/LoadingState';
10
- import { Table } from '../../../move_to_foreman/components/common/table';
11
- import { manifestExists } from '../SubscriptionHelpers';
7
+ import TooltipButton from '../../../components/TooltipButton';
8
+ import { LoadingState } from '../../../components/LoadingState';
9
+ import { Table } from '../../../components/pf3Table';
10
+
12
11
  import { columns } from './ManifestHistoryTableSchema';
13
12
  import DeleteManifestModalText from './DeleteManifestModalText';
14
13
  import { MANAGE_MANIFEST_MODAL_ID, DELETE_MANIFEST_MODAL_ID } from './ManifestConstants';
14
+ import SimpleContentAccess from './SimpleContentAccess';
15
15
 
16
16
  import './ManageManifestModal.scss';
17
17
 
@@ -20,31 +20,21 @@ class ManageManifestModal extends Component {
20
20
  super(props);
21
21
 
22
22
  this.state = {
23
- actionInProgress: props.taskInProgress,
23
+ redhat_repository_url: null,
24
+ hideModalAfterAction: true,
24
25
  };
25
26
  }
26
27
 
27
- static getDerivedStateFromProps(newProps, prevState) {
28
- if (
29
- !isEqual(newProps.taskInProgress, prevState.actionInProgress)
30
- ) {
31
- return {
32
- actionInProgress: newProps.taskInProgress,
33
- };
28
+ componentWillMount() {
29
+ if (this.props.taskInProgress && this.state.hideModalAfterAction) {
30
+ this.hideModal();
31
+ this.setState({ hideModalAfterAction: false });
34
32
  }
35
- return null;
36
33
  }
37
34
 
38
35
  componentDidMount() {
39
36
  this.loadData();
40
- }
41
-
42
- componentDidUpdate(prevProp, prevState) {
43
- const { actionInProgress } = this.state;
44
-
45
- if (prevState.actionInProgress && !actionInProgress) {
46
- this.props.loadOrganization();
47
- }
37
+ this.props.loadOrganization();
48
38
  }
49
39
 
50
40
  loadData() {
@@ -72,21 +62,17 @@ class ManageManifestModal extends Component {
72
62
 
73
63
  uploadManifest = (fileList) => {
74
64
  this.hideModal();
75
- this.setState({ actionInProgress: true });
76
65
  if (fileList.length > 0) {
77
66
  this.props.upload(fileList[0]);
78
67
  }
79
68
  };
80
69
 
81
70
  refreshManifest = () => {
82
- this.hideModal();
83
- this.setState({ actionInProgress: true });
84
71
  this.props.refresh();
85
72
  };
86
73
 
87
74
  deleteManifest = () => {
88
75
  this.hideModal();
89
- this.setState({ actionInProgress: true });
90
76
  this.props.delete();
91
77
  };
92
78
 
@@ -105,15 +91,25 @@ class ManageManifestModal extends Component {
105
91
  disabledReason,
106
92
  canImportManifest,
107
93
  canDeleteManifest,
94
+ isManifestImported,
108
95
  canEditOrganizations,
109
96
  simpleContentAccess,
97
+ enableSimpleContentAccess,
98
+ disableSimpleContentAccess,
99
+ taskInProgress,
100
+ manifestActionInProgress,
110
101
  } = this.props;
111
102
 
103
+ const actionInProgress = (taskInProgress || manifestActionInProgress);
112
104
  const showRedHatProviderDetails = canEditOrganizations;
113
105
  const showSubscriptionManifest = (canImportManifest || canDeleteManifest);
114
106
  const showManifestTab = (showRedHatProviderDetails || showSubscriptionManifest);
115
-
116
- const { actionInProgress } = this.state;
107
+ const disableSCASwitch = (
108
+ disableManifestActions ||
109
+ !isManifestImported ||
110
+ actionInProgress ||
111
+ organization.loading
112
+ );
117
113
 
118
114
  const emptyStateData = () => ({
119
115
  header: __('There is no Manifest History to display.'),
@@ -157,17 +153,17 @@ class ManageManifestModal extends Component {
157
153
  <Form className="form-horizontal">
158
154
  {showRedHatProviderDetails &&
159
155
  <React.Fragment>
160
- <h5>{__('Red Hat Provider Details')}</h5>
156
+ <h3>{__('Red Hat Provider Details')}</h3>
161
157
  <hr />
162
158
  <FormGroup>
163
159
  <Grid>
164
160
  <Row>
165
- <Col sm={4}>
161
+ <Col sm={5}>
166
162
  <ControlLabel htmlFor="cdnUrl">
167
163
  {__('Red Hat CDN URL')}
168
164
  </ControlLabel>
169
165
  </Col>
170
- <Col sm={8}>
166
+ <Col sm={7}>
171
167
  <FormControl
172
168
  id="cdnUrl"
173
169
  type="text"
@@ -181,7 +177,7 @@ class ManageManifestModal extends Component {
181
177
  <FormGroup>
182
178
  <Grid>
183
179
  <Row>
184
- <Col smOffset={4} sm={4}>
180
+ <Col smOffset={5} sm={7}>
185
181
  <Button onClick={this.saveOrganization} disabled={organization.loading}>
186
182
  {organization.loading ? buttonLoading : __('Update')}
187
183
  </Button>
@@ -197,52 +193,36 @@ class ManageManifestModal extends Component {
197
193
 
198
194
  <FormGroup>
199
195
  <Grid>
200
- <h5>{__('Subscription Manifest')}</h5>
196
+ <h3>{__('Subscription Manifest')}</h3>
201
197
  <hr />
202
198
  <Row>
203
- <Col sm={4}>
204
- <ControlLabel
205
- className="control-label"
206
- htmlFor="usmaFile"
207
- style={{ paddingTop: '0' }}
208
- >
209
- <OverlayTrigger
210
- overlay={
211
- <Tooltip id="usma-tooltip">
212
- {__('Upstream Subscription Management Application')}
213
- </Tooltip>
214
- }
215
- placement="bottom"
216
- trigger={['hover', 'focus']}
217
- rootClose={false}
218
- >
219
- <div>{__('USMA')}</div>
220
- </OverlayTrigger>
221
- </ControlLabel>
199
+ <SimpleContentAccess
200
+ enableSimpleContentAccess={enableSimpleContentAccess}
201
+ disableSimpleContentAccess={disableSimpleContentAccess}
202
+ isSimpleContentAccessEnabled={simpleContentAccess}
203
+ canToggleSimpleContentAccess={!disableSCASwitch}
204
+ />
205
+ </Row>
206
+ <Row>
207
+ <Col sm={5}>
208
+ <strong>{__('Subscription Allocation')}</strong>
222
209
  </Col>
223
- <Col sm={8}>
210
+ <Col sm={7}>
224
211
  {getManifestName()}
225
212
  </Col>
226
213
  </Row>
227
214
  <Row>
228
- <Col sm={4}>
229
- <div>{__('Simple Content Access')}</div>
215
+ <Col sm={5}>
216
+ {canImportManifest &&
217
+ <ControlLabel
218
+ style={{ paddingTop: '10px' }}
219
+ >
220
+ <div>{__('Import New Manifest')}</div>
221
+ </ControlLabel>
222
+ }
230
223
  </Col>
231
- <Col sm={8} className="manifest-actions">
232
- <Spinner loading={actionInProgress} inline />
233
- {simpleContentAccess ? __('Yes') : __('No')}
234
- <OverlayTrigger
235
- overlay={
236
- <Tooltip id="sca-tooltip">
237
- {__('When Simple Content Access is enabled, hosts can consume from all repositories in their Content View regardless of subscription status.')}
238
- </Tooltip>
239
- }
240
- placement="bottom"
241
- trigger={['hover', 'focus']}
242
- rootClose={false}
243
- >
244
- <Icon type="pf" name="info" />
245
- </OverlayTrigger>
224
+ <Col sm={7} className="manifest-actions">
225
+ <Spinner loading={actionInProgress} />
246
226
  {canImportManifest &&
247
227
  <FormControl
248
228
  id="usmaFile"
@@ -260,7 +240,7 @@ class ManageManifestModal extends Component {
260
240
  tooltipText={disabledReason}
261
241
  tooltipPlacement="top"
262
242
  title={__('Refresh')}
263
- disabled={!manifestExists(organization) ||
243
+ disabled={!isManifestImported ||
264
244
  actionInProgress || disableManifestActions}
265
245
  />
266
246
  }
@@ -269,7 +249,7 @@ class ManageManifestModal extends Component {
269
249
  <TooltipButton
270
250
  renderedButton={(
271
251
  <Button
272
- disabled={!manifestExists(organization) || actionInProgress}
252
+ disabled={!isManifestImported || actionInProgress}
273
253
  bsStyle="danger"
274
254
  onClick={this.showDeleteManifestModal}
275
255
  >
@@ -329,6 +309,8 @@ ManageManifestModal.propTypes = {
329
309
  upload: PropTypes.func.isRequired,
330
310
  refresh: PropTypes.func.isRequired,
331
311
  delete: PropTypes.func.isRequired,
312
+ enableSimpleContentAccess: PropTypes.func.isRequired,
313
+ disableSimpleContentAccess: PropTypes.func.isRequired,
332
314
  loadManifestHistory: PropTypes.func.isRequired,
333
315
  organization: PropTypes.shape({
334
316
  loading: PropTypes.bool,
@@ -343,6 +325,7 @@ ManageManifestModal.propTypes = {
343
325
  }).isRequired,
344
326
  canImportManifest: PropTypes.bool,
345
327
  canDeleteManifest: PropTypes.bool,
328
+ isManifestImported: PropTypes.bool,
346
329
  canEditOrganizations: PropTypes.bool,
347
330
  disableManifestActions: PropTypes.bool,
348
331
  disabledReason: PropTypes.string,
@@ -359,6 +342,7 @@ ManageManifestModal.propTypes = {
359
342
  setModalClosed: PropTypes.func.isRequired,
360
343
  setModalOpen: PropTypes.func.isRequired,
361
344
  deleteManifestModalIsOpen: PropTypes.bool,
345
+ manifestActionInProgress: PropTypes.bool,
362
346
  };
363
347
 
364
348
  ManageManifestModal.defaultProps = {
@@ -366,9 +350,11 @@ ManageManifestModal.defaultProps = {
366
350
  disabledReason: '',
367
351
  canImportManifest: false,
368
352
  canDeleteManifest: false,
353
+ isManifestImported: false,
369
354
  canEditOrganizations: false,
370
355
  deleteManifestModalIsOpen: false,
371
356
  simpleContentAccess: false,
357
+ manifestActionInProgress: false,
372
358
  };
373
359
 
374
360
  export default ManageManifestModal;
@@ -10,3 +10,18 @@ form .row {
10
10
  span.pficon.pficon-info {
11
11
  margin: 0 5px 0 5px;
12
12
  }
13
+
14
+ #simple-content-access {
15
+ padding-bottom: 40px;
16
+
17
+ .sca-label {
18
+ float: left;
19
+ text-align: left;
20
+ }
21
+ }
22
+
23
+ .manifest-actions {
24
+ .spinner {
25
+ margin: 5px 15px 12px 5px;
26
+ }
27
+ }
@@ -1,7 +1,7 @@
1
1
  import { propsToSnakeCase } from 'foremanReact/common/helpers';
2
2
 
3
3
  import api, { orgId } from '../../../services/api';
4
- import { apiError } from '../../../move_to_foreman/common/helpers.js';
4
+ import { apiError } from '../../../utils/helpers.js';
5
5
 
6
6
  import {
7
7
  UPLOAD_MANIFEST_REQUEST,
@@ -16,6 +16,12 @@ import {
16
16
  MANIFEST_HISTORY_REQUEST,
17
17
  MANIFEST_HISTORY_SUCCESS,
18
18
  MANIFEST_HISTORY_FAILURE,
19
+ ENABLE_SIMPLE_CONTENT_ACCESS_REQUEST,
20
+ ENABLE_SIMPLE_CONTENT_ACCESS_SUCCESS,
21
+ ENABLE_SIMPLE_CONTENT_ACCESS_FAILURE,
22
+ DISABLE_SIMPLE_CONTENT_ACCESS_REQUEST,
23
+ DISABLE_SIMPLE_CONTENT_ACCESS_SUCCESS,
24
+ DISABLE_SIMPLE_CONTENT_ACCESS_FAILURE,
19
25
  } from './ManifestConstants';
20
26
 
21
27
  export const uploadManifest = file => async (dispatch) => {
@@ -75,6 +81,42 @@ export const deleteManifest = (extendedParams = {}) => async (dispatch) => {
75
81
  }
76
82
  };
77
83
 
84
+ export const enableSimpleContentAccess = (extendedParams = {}) => async (dispatch) => {
85
+ dispatch({ type: ENABLE_SIMPLE_CONTENT_ACCESS_REQUEST });
86
+
87
+ const params = {
88
+ ...propsToSnakeCase(extendedParams),
89
+ };
90
+
91
+ try {
92
+ const { data } = await api.put(`/organizations/${orgId()}/upstream_subscriptions/simple_content_access/enable`, {}, params);
93
+ return dispatch({
94
+ type: ENABLE_SIMPLE_CONTENT_ACCESS_SUCCESS,
95
+ response: data,
96
+ });
97
+ } catch (error) {
98
+ return dispatch(apiError(ENABLE_SIMPLE_CONTENT_ACCESS_FAILURE, error));
99
+ }
100
+ };
101
+
102
+ export const disableSimpleContentAccess = (extendedParams = {}) => async (dispatch) => {
103
+ dispatch({ type: DISABLE_SIMPLE_CONTENT_ACCESS_REQUEST });
104
+
105
+ const params = {
106
+ ...propsToSnakeCase(extendedParams),
107
+ };
108
+
109
+ try {
110
+ const { data } = await api.put(`/organizations/${orgId()}/upstream_subscriptions/simple_content_access/disable`, {}, params);
111
+ return dispatch({
112
+ type: DISABLE_SIMPLE_CONTENT_ACCESS_SUCCESS,
113
+ response: data,
114
+ });
115
+ } catch (error) {
116
+ return dispatch(apiError(DISABLE_SIMPLE_CONTENT_ACCESS_FAILURE, error));
117
+ }
118
+ };
119
+
78
120
  export const loadManifestHistory = (extendedParams = {}) => async (dispatch) => {
79
121
  dispatch({ type: MANIFEST_HISTORY_REQUEST });
80
122
 
@@ -14,6 +14,14 @@ export const MANIFEST_HISTORY_REQUEST = 'MANIFEST_HISTORY_REQUEST';
14
14
  export const MANIFEST_HISTORY_SUCCESS = 'MANIFEST_HISTORY_SUCCESS';
15
15
  export const MANIFEST_HISTORY_FAILURE = 'MANIFEST_HISTORY_FAILURE';
16
16
 
17
+ export const ENABLE_SIMPLE_CONTENT_ACCESS_REQUEST = 'ENABLE_SIMPLE_CONTENT_ACCESS_REQUEST';
18
+ export const ENABLE_SIMPLE_CONTENT_ACCESS_SUCCESS = 'ENABLE_SIMPLE_CONTENT_ACCESS_SUCCESS';
19
+ export const ENABLE_SIMPLE_CONTENT_ACCESS_FAILURE = 'ENABLE_SIMPLE_CONTENT_ACCESS_FAILURE';
20
+
21
+ export const DISABLE_SIMPLE_CONTENT_ACCESS_REQUEST = 'DISABLE_SIMPLE_CONTENT_ACCESS_REQUEST';
22
+ export const DISABLE_SIMPLE_CONTENT_ACCESS_SUCCESS = 'DISABLE_SIMPLE_CONTENT_ACCESS_SUCCESS';
23
+ export const DISABLE_SIMPLE_CONTENT_ACCESS_FAILURE = 'DISABLE_SIMPLE_CONTENT_ACCESS_FAILURE';
24
+
17
25
  // Modal IDs
18
26
  export const MANAGE_MANIFEST_MODAL_ID = 'manageManifestModal';
19
27
  export const DELETE_MANIFEST_MODAL_ID = 'deleteManifestModal';
@@ -1,5 +1,5 @@
1
1
  import { translate as __ } from 'foremanReact/common/I18n';
2
- import { headerFormatter, cellFormatter } from '../../../move_to_foreman/components/common/table';
2
+ import { headerFormatter, cellFormatter } from '../../../components/pf3Table';
3
3
 
4
4
  export const columns = [
5
5
  {
@@ -0,0 +1,78 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { Switch, Level, LevelItem } from '@patternfly/react-core';
4
+ import { OverlayTrigger, Tooltip, Icon } from 'patternfly-react';
5
+ import { translate as __ } from 'foremanReact/common/I18n';
6
+ import { Col, ControlLabel } from 'react-bootstrap';
7
+
8
+ const SimpleContentAccess = (props) => {
9
+ const {
10
+ canToggleSimpleContentAccess,
11
+ isSimpleContentAccessEnabled,
12
+ enableSimpleContentAccess,
13
+ disableSimpleContentAccess,
14
+ } = props;
15
+
16
+ const toggleSimpleContentAccess = () => {
17
+ if (isSimpleContentAccessEnabled) {
18
+ disableSimpleContentAccess();
19
+ } else {
20
+ enableSimpleContentAccess();
21
+ }
22
+ };
23
+
24
+ return (
25
+ <div id="simple-content-access">
26
+ <Col sm={5}>
27
+ <ControlLabel
28
+ className="control-label"
29
+ style={{ paddingTop: '0' }}
30
+ >
31
+ <Level>
32
+ <LevelItem>
33
+ <span className="sca-label">{__('Simple Content Access')}</span>
34
+ </LevelItem>
35
+ <LevelItem>
36
+ <OverlayTrigger
37
+ overlay={
38
+ <Tooltip id="sca-refresh-tooltip">
39
+ {__('When Simple Content Access is enabled, hosts can consume from all repositories in their Content View regardless of subscription status.')}
40
+ </Tooltip>
41
+ }
42
+ placement="bottom"
43
+ trigger={['hover', 'focus']}
44
+ rootClose={false}
45
+ >
46
+ <Icon type="pf" name="info" />
47
+ </OverlayTrigger>
48
+ </LevelItem>
49
+ </Level>
50
+ </ControlLabel>
51
+ </Col>
52
+ <Col sm={7}>
53
+ <div id="manifest-toggle-sca-switch">
54
+ <Switch
55
+ id="simple-switch"
56
+ isChecked={isSimpleContentAccessEnabled}
57
+ onChange={toggleSimpleContentAccess}
58
+ isDisabled={!canToggleSimpleContentAccess}
59
+ data-testid="switch"
60
+ label=" "
61
+ />
62
+ </div>
63
+ <div>
64
+ <i>{__('Toggling Simple Content Access will refresh your manifest.')}</i>
65
+ </div>
66
+ </Col>
67
+ </div>
68
+ );
69
+ };
70
+
71
+ SimpleContentAccess.propTypes = {
72
+ enableSimpleContentAccess: PropTypes.func.isRequired,
73
+ disableSimpleContentAccess: PropTypes.func.isRequired,
74
+ isSimpleContentAccessEnabled: PropTypes.bool.isRequired,
75
+ canToggleSimpleContentAccess: PropTypes.bool.isRequired,
76
+ };
77
+
78
+ export default SimpleContentAccess;
@@ -18,6 +18,8 @@ describe('manage manifest modal', () => {
18
18
  upload={noop}
19
19
  refresh={noop}
20
20
  delete={noop}
21
+ enableSimpleContentAccess={noop}
22
+ disableSimpleContentAccess={noop}
21
23
  loadManifestHistory={noop}
22
24
  organization={organization}
23
25
  loadOrganization={noop}
@@ -12,8 +12,19 @@ import {
12
12
  refreshManifestFailureActions,
13
13
  deleteManifestSuccessActions,
14
14
  deleteManifestFailureActions,
15
+ enableSimpleContentAccessSuccessActions,
16
+ enableSimpleContentAccessFailureActions,
17
+ disableSimpleContentAccessSuccessActions,
18
+ disableSimpleContentAccessFailureActions,
15
19
  } from './manifest.fixtures';
16
- import { loadManifestHistory, uploadManifest, refreshManifest, deleteManifest } from '../ManifestActions';
20
+ import {
21
+ loadManifestHistory,
22
+ uploadManifest,
23
+ refreshManifest,
24
+ deleteManifest,
25
+ enableSimpleContentAccess,
26
+ disableSimpleContentAccess,
27
+ } from '../ManifestActions';
17
28
  import { mock as mockApi, mockErrorRequest } from '../../../../mockRequest';
18
29
 
19
30
  const mockStore = configureMockStore([thunk]);
@@ -123,3 +134,47 @@ describe('manifest actions', () => {
123
134
  });
124
135
  });
125
136
  });
137
+
138
+ describe('creates ENABLE_SIMPLE_CONTENT_ACCESS_REQUEST', () => {
139
+ const url = '/katello/api/v2/organizations/1/upstream_subscriptions/simple_content_access/enable';
140
+
141
+ it('and then fails with 422', async () => {
142
+ mockErrorRequest({
143
+ url,
144
+ status: 422,
145
+ method: 'PUT',
146
+ });
147
+
148
+ await store.dispatch(enableSimpleContentAccess());
149
+ expect(store.getActions()).toEqual(enableSimpleContentAccessFailureActions);
150
+ });
151
+
152
+ it('and ends with success', async () => {
153
+ mockApi.onPut(url).reply(200, taskSuccessResponse);
154
+
155
+ await store.dispatch(enableSimpleContentAccess());
156
+ expect(store.getActions()).toEqual(enableSimpleContentAccessSuccessActions);
157
+ });
158
+ });
159
+
160
+ describe('creates DISABLE_SIMPLE_CONTENT_ACCESS_REQUEST', () => {
161
+ const url = '/katello/api/v2/organizations/1/upstream_subscriptions/simple_content_access/disable';
162
+
163
+ it('and then fails with 422', async () => {
164
+ mockErrorRequest({
165
+ url,
166
+ status: 422,
167
+ method: 'PUT',
168
+ });
169
+
170
+ await store.dispatch(disableSimpleContentAccess());
171
+ expect(store.getActions()).toEqual(disableSimpleContentAccessFailureActions);
172
+ });
173
+
174
+ it('and ends with success', async () => {
175
+ mockApi.onPut(url).reply(200, taskSuccessResponse);
176
+
177
+ await store.dispatch(disableSimpleContentAccess());
178
+ expect(store.getActions()).toEqual(disableSimpleContentAccessSuccessActions);
179
+ });
180
+ });
@@ -0,0 +1,114 @@
1
+ import React from 'react';
2
+ import { cleanup } from '@testing-library/react';
3
+ import { renderWithRedux, fireEvent, patientlyWaitFor } from 'react-testing-lib-wrapper';
4
+ import ManifestModal from '../../Manifest';
5
+ import { manifestHistorySuccessState, manifestHistorySuccessResponse } from './manifest.fixtures';
6
+ import { nockInstance, assertNockRequest } from '../../../../test-utils/nockWrapper';
7
+ import api from '../../../../services/api';
8
+
9
+ afterEach(cleanup);
10
+
11
+ const noop = jest.fn();
12
+ const organization = { id: 1, redhat_repository_url: 'https://redhat.com' };
13
+
14
+ const defaultProps = {
15
+ disableManifestActions: false,
16
+ disabledReason: '',
17
+ canImportManifest: true,
18
+ canDeleteManifest: true,
19
+ canEditOrganizations: true,
20
+ deleteManifestModalIsOpen: true,
21
+ upload: noop,
22
+ refresh: noop,
23
+ delete: noop,
24
+ enableSimpleContentAccess: noop,
25
+ disableSimpleContentAccess: noop,
26
+ loadManifestHistory: noop,
27
+ organization,
28
+ loadOrganization: noop,
29
+ saveOrganization: noop,
30
+ taskInProgress: false,
31
+ simpleContentAccess: true,
32
+ manifestHistory: manifestHistorySuccessState,
33
+ setModalClosed: noop,
34
+ setModalOpen: noop,
35
+ };
36
+
37
+ const initialState = {
38
+ katello: {
39
+ organization: {
40
+ simple_content_access: false,
41
+ ...organization,
42
+ },
43
+ },
44
+ foremanModals: {
45
+ manageManifestModal: {
46
+ isOpen: true,
47
+ },
48
+ },
49
+ };
50
+
51
+ const enableSimpleContetAccessPath = api.getApiUrl('/organizations/1/upstream_subscriptions/simple_content_access/enable');
52
+ const disableSimpleContetAccessPath = api.getApiUrl('/organizations/1/upstream_subscriptions/simple_content_access/disable');
53
+ const manifestHistoryPath = api.getApiUrl('/organizations/1/subscriptions/manifest_history');
54
+ const organizationPath = api.getApiUrl('/organizations/1');
55
+
56
+ test('Enable Simple Content Access after toggle switch value to true', async (done) => {
57
+ const { getByTestId } = renderWithRedux(<ManifestModal {...defaultProps} />, { initialState });
58
+
59
+ const updatescope = nockInstance
60
+ .put(enableSimpleContetAccessPath)
61
+ .reply(202, true);
62
+
63
+ const getscope = nockInstance
64
+ .get(manifestHistoryPath)
65
+ .query(true)
66
+ .reply(200, manifestHistorySuccessResponse);
67
+
68
+ const scope = nockInstance
69
+ .get(organizationPath)
70
+ .query(true)
71
+ .reply(200, 'Organization Success Response!');
72
+
73
+ const toggleButton = getByTestId('switch');
74
+
75
+ await patientlyWaitFor(() => { expect(toggleButton).toBeInTheDocument(); });
76
+ expect(toggleButton.checked).toEqual(false);
77
+
78
+ fireEvent.click(toggleButton);
79
+
80
+ assertNockRequest(scope);
81
+ assertNockRequest(getscope);
82
+ assertNockRequest(updatescope, done);
83
+ });
84
+
85
+ test('Disable Simple Content Access after toggle switch value to false', async (done) => {
86
+ initialState.katello.organization.simple_content_access = true;
87
+
88
+ const updatescope = nockInstance
89
+ .put(disableSimpleContetAccessPath)
90
+ .reply(202, true);
91
+
92
+ const getscope = nockInstance
93
+ .get(manifestHistoryPath)
94
+ .query(true)
95
+ .reply(200, manifestHistorySuccessResponse);
96
+
97
+ const scope = nockInstance
98
+ .get(organizationPath)
99
+ .query(true)
100
+ .reply(200, 'Organization Success Response!');
101
+
102
+ const { getByTestId } = renderWithRedux(<ManifestModal {...defaultProps} />, { initialState });
103
+
104
+ const toggleButton = getByTestId('switch');
105
+
106
+ await patientlyWaitFor(() => { expect(toggleButton).toBeInTheDocument(); });
107
+ expect(toggleButton.checked).toEqual(true);
108
+
109
+ fireEvent.click(toggleButton);
110
+
111
+ assertNockRequest(scope);
112
+ assertNockRequest(getscope);
113
+ assertNockRequest(updatescope, done);
114
+ });