katello 4.17.1 → 4.18.0.rc2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of katello might be problematic. Click here for more details.

Files changed (348) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/katello/locale/bn/katello.js +148 -4
  3. data/app/assets/javascripts/katello/locale/bn_IN/katello.js +148 -4
  4. data/app/assets/javascripts/katello/locale/ca/katello.js +148 -4
  5. data/app/assets/javascripts/katello/locale/cs/katello.js +148 -4
  6. data/app/assets/javascripts/katello/locale/cs_CZ/katello.js +148 -4
  7. data/app/assets/javascripts/katello/locale/de/katello.js +147 -3
  8. data/app/assets/javascripts/katello/locale/de_AT/katello.js +148 -4
  9. data/app/assets/javascripts/katello/locale/de_DE/katello.js +148 -4
  10. data/app/assets/javascripts/katello/locale/el/katello.js +148 -4
  11. data/app/assets/javascripts/katello/locale/en/katello.js +148 -4
  12. data/app/assets/javascripts/katello/locale/en_GB/katello.js +148 -4
  13. data/app/assets/javascripts/katello/locale/en_US/katello.js +148 -4
  14. data/app/assets/javascripts/katello/locale/es/katello.js +147 -3
  15. data/app/assets/javascripts/katello/locale/et_EE/katello.js +148 -4
  16. data/app/assets/javascripts/katello/locale/fr/katello.js +147 -3
  17. data/app/assets/javascripts/katello/locale/gl/katello.js +148 -4
  18. data/app/assets/javascripts/katello/locale/gu/katello.js +148 -4
  19. data/app/assets/javascripts/katello/locale/he_IL/katello.js +148 -4
  20. data/app/assets/javascripts/katello/locale/hi/katello.js +148 -4
  21. data/app/assets/javascripts/katello/locale/id/katello.js +148 -4
  22. data/app/assets/javascripts/katello/locale/it/katello.js +148 -4
  23. data/app/assets/javascripts/katello/locale/ja/katello.js +147 -3
  24. data/app/assets/javascripts/katello/locale/ka/katello.js +147 -3
  25. data/app/assets/javascripts/katello/locale/kn/katello.js +148 -4
  26. data/app/assets/javascripts/katello/locale/ko/katello.js +147 -3
  27. data/app/assets/javascripts/katello/locale/ml_IN/katello.js +148 -4
  28. data/app/assets/javascripts/katello/locale/mr/katello.js +148 -4
  29. data/app/assets/javascripts/katello/locale/nl_NL/katello.js +148 -4
  30. data/app/assets/javascripts/katello/locale/or/katello.js +148 -4
  31. data/app/assets/javascripts/katello/locale/pa/katello.js +148 -4
  32. data/app/assets/javascripts/katello/locale/pl/katello.js +148 -4
  33. data/app/assets/javascripts/katello/locale/pl_PL/katello.js +148 -4
  34. data/app/assets/javascripts/katello/locale/pt/katello.js +148 -4
  35. data/app/assets/javascripts/katello/locale/pt_BR/katello.js +147 -3
  36. data/app/assets/javascripts/katello/locale/ro/katello.js +148 -4
  37. data/app/assets/javascripts/katello/locale/ro_RO/katello.js +148 -4
  38. data/app/assets/javascripts/katello/locale/ru/katello.js +148 -4
  39. data/app/assets/javascripts/katello/locale/sl/katello.js +148 -4
  40. data/app/assets/javascripts/katello/locale/sv_SE/katello.js +148 -4
  41. data/app/assets/javascripts/katello/locale/ta/katello.js +148 -4
  42. data/app/assets/javascripts/katello/locale/ta_IN/katello.js +148 -4
  43. data/app/assets/javascripts/katello/locale/te/katello.js +148 -4
  44. data/app/assets/javascripts/katello/locale/tr/katello.js +148 -4
  45. data/app/assets/javascripts/katello/locale/vi/katello.js +148 -4
  46. data/app/assets/javascripts/katello/locale/vi_VN/katello.js +148 -4
  47. data/app/assets/javascripts/katello/locale/zh/katello.js +148 -4
  48. data/app/assets/javascripts/katello/locale/zh_CN/katello.js +147 -3
  49. data/app/assets/javascripts/katello/locale/zh_TW/katello.js +148 -4
  50. data/app/controllers/katello/api/registry/registry_proxies_controller.rb +12 -14
  51. data/app/controllers/katello/api/v2/content_uploads_controller.rb +2 -1
  52. data/app/controllers/katello/api/v2/errata_controller.rb +16 -0
  53. data/app/controllers/katello/api/v2/flatpak_remote_repositories_controller.rb +20 -3
  54. data/app/controllers/katello/api/v2/flatpak_remotes_controller.rb +7 -3
  55. data/app/controllers/katello/api/v2/generic_content_units_controller.rb +1 -2
  56. data/app/controllers/katello/api/v2/products_controller.rb +18 -0
  57. data/app/controllers/katello/api/v2/repositories_controller.rb +5 -3
  58. data/app/controllers/katello/concerns/api/v2/hosts_bulk_actions_controller_extensions.rb +10 -0
  59. data/app/controllers/katello/concerns/api/v2/registration_commands_controller_extensions.rb +1 -0
  60. data/app/controllers/katello/concerns/filtered_auto_complete_search.rb +17 -0
  61. data/app/lib/actions/helpers/smart_proxy_sync_helper.rb +12 -0
  62. data/app/lib/actions/katello/content_view/add_rolling_repo_clone.rb +4 -4
  63. data/app/lib/actions/katello/content_view/capsule_sync.rb +8 -3
  64. data/app/lib/actions/katello/content_view/publish.rb +39 -12
  65. data/app/lib/actions/katello/flatpak/mirror_remote_repository.rb +2 -1
  66. data/app/lib/actions/katello/repository/capsule_sync.rb +11 -1
  67. data/app/lib/actions/katello/repository/import_upload.rb +2 -3
  68. data/app/lib/actions/katello/repository/sync.rb +2 -1
  69. data/app/lib/actions/katello/repository/upload_files.rb +2 -1
  70. data/app/lib/katello/concerns/bookmark_controller_validator_extensions.rb +1 -1
  71. data/app/lib/katello/resources/cdn.rb +1 -1
  72. data/app/models/katello/concerns/host_managed_extensions.rb +5 -1
  73. data/app/models/katello/concerns/smart_proxy_extensions.rb +46 -8
  74. data/app/models/katello/content_view_environment.rb +1 -1
  75. data/app/models/katello/erratum.rb +26 -1
  76. data/app/models/katello/flatpak_remote.rb +0 -1
  77. data/app/models/katello/flatpak_remote_repository.rb +24 -0
  78. data/app/models/katello/glue/pulp/repos.rb +1 -1
  79. data/app/models/katello/root_repository.rb +1 -0
  80. data/app/presenters/katello/flatpak_remote_mirror_status_presenter.rb +41 -0
  81. data/app/services/katello/repository_type_manager.rb +2 -0
  82. data/app/views/foreman/job_templates/flatpak_install.erb +17 -2
  83. data/app/views/foreman/job_templates/flatpak_login_action.erb +17 -3
  84. data/app/views/foreman/job_templates/install_errata_by_search_query.erb +1 -1
  85. data/app/views/foreman/job_templates/install_errata_by_search_query_-_katello_ansible_default.erb +1 -1
  86. data/app/views/katello/api/v2/flatpak_remote_repositories/base.json.rabl +3 -1
  87. data/app/views/katello/api/v2/flatpak_remotes/base.json.rabl +5 -0
  88. data/app/views/katello/api/v2/flatpak_remotes/permissions.json.rabl +1 -0
  89. data/config/routes/api/v2.rb +1 -1
  90. data/config/routes.rb +3 -0
  91. data/db/migrate/20250613210050_use_big_int_for_erratum_packages_id.rb +11 -0
  92. data/db/seeds.d/108-subcription-bookmarks.rb +2 -0
  93. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/content-hosts.html +1 -1
  94. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/errata/views/errata.html +5 -1
  95. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +4 -5
  96. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/bn.po +6 -0
  97. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/bn_IN.po +6 -0
  98. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ca.po +6 -0
  99. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/cs_CZ.po +6 -0
  100. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/de.po +6 -0
  101. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/de_AT.po +6 -0
  102. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/de_DE.po +6 -0
  103. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/el.po +6 -0
  104. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/en_GB.po +6 -0
  105. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/en_US.po +6 -0
  106. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/es.po +6 -0
  107. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/et_EE.po +6 -0
  108. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/fr.po +6 -0
  109. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/gl.po +6 -0
  110. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/gu.po +6 -0
  111. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/he_IL.po +6 -0
  112. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/hi.po +6 -0
  113. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/id.po +6 -0
  114. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/it.po +6 -0
  115. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ja.po +6 -0
  116. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ka.po +6 -0
  117. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/kn.po +6 -0
  118. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ko.po +6 -0
  119. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ml_IN.po +6 -0
  120. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/mr.po +6 -0
  121. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/nl_NL.po +6 -0
  122. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/or.po +6 -0
  123. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/pa.po +6 -0
  124. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/pl.po +6 -0
  125. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/pl_PL.po +6 -0
  126. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/pt.po +6 -0
  127. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/pt_BR.po +6 -0
  128. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ro.po +6 -0
  129. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ro_RO.po +6 -0
  130. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ru.po +6 -0
  131. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/sl.po +6 -0
  132. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/sv_SE.po +6 -0
  133. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ta.po +6 -0
  134. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ta_IN.po +6 -0
  135. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/te.po +6 -0
  136. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/tr.po +6 -0
  137. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/vi.po +6 -0
  138. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/vi_VN.po +6 -0
  139. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/zh.po +6 -0
  140. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/zh_CN.po +6 -0
  141. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/zh_TW.po +6 -0
  142. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/new-repository.controller.js +13 -3
  143. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/discovery/views/discovery.html +3 -0
  144. data/engines/bastion_katello/lib/bastion_katello/engine.rb +2 -0
  145. data/lib/katello/engine.rb +0 -1
  146. data/lib/katello/permission_creator.rb +1 -1
  147. data/lib/katello/plugin.rb +26 -2
  148. data/lib/katello/version.rb +1 -1
  149. data/lib/katello.rb +0 -1
  150. data/lib/proxy_api/container_gateway.rb +24 -0
  151. data/locale/action_names.rb +186 -0
  152. data/locale/bn/LC_MESSAGES/katello.mo +0 -0
  153. data/locale/bn/katello.po +148 -4
  154. data/locale/bn/katello.po.time_stamp +0 -0
  155. data/locale/bn_IN/LC_MESSAGES/katello.mo +0 -0
  156. data/locale/bn_IN/katello.po +148 -4
  157. data/locale/bn_IN/katello.po.time_stamp +0 -0
  158. data/locale/ca/LC_MESSAGES/katello.mo +0 -0
  159. data/locale/ca/katello.po +148 -4
  160. data/locale/ca/katello.po.time_stamp +0 -0
  161. data/locale/cs/LC_MESSAGES/katello.mo +0 -0
  162. data/locale/cs/katello.po +148 -4
  163. data/locale/cs/katello.po.time_stamp +0 -0
  164. data/locale/cs_CZ/LC_MESSAGES/katello.mo +0 -0
  165. data/locale/cs_CZ/katello.po +148 -4
  166. data/locale/cs_CZ/katello.po.time_stamp +0 -0
  167. data/locale/de/katello.po +147 -3
  168. data/locale/de/katello.po.time_stamp +0 -0
  169. data/locale/de_AT/LC_MESSAGES/katello.mo +0 -0
  170. data/locale/de_AT/katello.po +148 -4
  171. data/locale/de_AT/katello.po.time_stamp +0 -0
  172. data/locale/de_DE/LC_MESSAGES/katello.mo +0 -0
  173. data/locale/de_DE/katello.po +148 -4
  174. data/locale/de_DE/katello.po.time_stamp +0 -0
  175. data/locale/el/LC_MESSAGES/katello.mo +0 -0
  176. data/locale/el/katello.po +148 -4
  177. data/locale/el/katello.po.time_stamp +0 -0
  178. data/locale/en/LC_MESSAGES/katello.mo +0 -0
  179. data/locale/en/katello.po +148 -4
  180. data/locale/en/katello.po.time_stamp +0 -0
  181. data/locale/en_GB/LC_MESSAGES/katello.mo +0 -0
  182. data/locale/en_GB/katello.po +148 -4
  183. data/locale/en_GB/katello.po.time_stamp +0 -0
  184. data/locale/en_US/LC_MESSAGES/katello.mo +0 -0
  185. data/locale/en_US/katello.po +148 -4
  186. data/locale/en_US/katello.po.time_stamp +0 -0
  187. data/locale/es/katello.po +147 -3
  188. data/locale/es/katello.po.time_stamp +0 -0
  189. data/locale/et_EE/LC_MESSAGES/katello.mo +0 -0
  190. data/locale/et_EE/katello.po +148 -4
  191. data/locale/et_EE/katello.po.time_stamp +0 -0
  192. data/locale/fr/katello.po +147 -3
  193. data/locale/fr/katello.po.time_stamp +0 -0
  194. data/locale/gl/LC_MESSAGES/katello.mo +0 -0
  195. data/locale/gl/katello.po +148 -4
  196. data/locale/gl/katello.po.time_stamp +0 -0
  197. data/locale/gu/LC_MESSAGES/katello.mo +0 -0
  198. data/locale/gu/katello.po +148 -4
  199. data/locale/gu/katello.po.time_stamp +0 -0
  200. data/locale/he_IL/LC_MESSAGES/katello.mo +0 -0
  201. data/locale/he_IL/katello.po +148 -4
  202. data/locale/he_IL/katello.po.time_stamp +0 -0
  203. data/locale/hi/LC_MESSAGES/katello.mo +0 -0
  204. data/locale/hi/katello.po +148 -4
  205. data/locale/hi/katello.po.time_stamp +0 -0
  206. data/locale/id/LC_MESSAGES/katello.mo +0 -0
  207. data/locale/id/katello.po +148 -4
  208. data/locale/id/katello.po.time_stamp +0 -0
  209. data/locale/it/LC_MESSAGES/katello.mo +0 -0
  210. data/locale/it/katello.po +148 -4
  211. data/locale/it/katello.po.time_stamp +0 -0
  212. data/locale/ja/katello.po +147 -3
  213. data/locale/ja/katello.po.time_stamp +0 -0
  214. data/locale/ka/katello.po +147 -3
  215. data/locale/ka/katello.po.time_stamp +0 -0
  216. data/locale/katello.pot +703 -428
  217. data/locale/kn/LC_MESSAGES/katello.mo +0 -0
  218. data/locale/kn/katello.po +148 -4
  219. data/locale/kn/katello.po.time_stamp +0 -0
  220. data/locale/ko/katello.po +147 -3
  221. data/locale/ko/katello.po.time_stamp +0 -0
  222. data/locale/ml_IN/LC_MESSAGES/katello.mo +0 -0
  223. data/locale/ml_IN/katello.po +148 -4
  224. data/locale/ml_IN/katello.po.time_stamp +0 -0
  225. data/locale/mr/LC_MESSAGES/katello.mo +0 -0
  226. data/locale/mr/katello.po +148 -4
  227. data/locale/mr/katello.po.time_stamp +0 -0
  228. data/locale/nl_NL/LC_MESSAGES/katello.mo +0 -0
  229. data/locale/nl_NL/katello.po +148 -4
  230. data/locale/nl_NL/katello.po.time_stamp +0 -0
  231. data/locale/or/LC_MESSAGES/katello.mo +0 -0
  232. data/locale/or/katello.po +148 -4
  233. data/locale/or/katello.po.time_stamp +0 -0
  234. data/locale/pa/LC_MESSAGES/katello.mo +0 -0
  235. data/locale/pa/katello.po +148 -4
  236. data/locale/pa/katello.po.time_stamp +0 -0
  237. data/locale/pl/LC_MESSAGES/katello.mo +0 -0
  238. data/locale/pl/katello.po +148 -4
  239. data/locale/pl/katello.po.time_stamp +0 -0
  240. data/locale/pl_PL/LC_MESSAGES/katello.mo +0 -0
  241. data/locale/pl_PL/katello.po +148 -4
  242. data/locale/pl_PL/katello.po.time_stamp +0 -0
  243. data/locale/pt/LC_MESSAGES/katello.mo +0 -0
  244. data/locale/pt/katello.po +148 -4
  245. data/locale/pt/katello.po.time_stamp +0 -0
  246. data/locale/pt_BR/katello.po +147 -3
  247. data/locale/pt_BR/katello.po.time_stamp +0 -0
  248. data/locale/ro/LC_MESSAGES/katello.mo +0 -0
  249. data/locale/ro/katello.po +148 -4
  250. data/locale/ro/katello.po.time_stamp +0 -0
  251. data/locale/ro_RO/LC_MESSAGES/katello.mo +0 -0
  252. data/locale/ro_RO/katello.po +148 -4
  253. data/locale/ro_RO/katello.po.time_stamp +0 -0
  254. data/locale/ru/LC_MESSAGES/katello.mo +0 -0
  255. data/locale/ru/katello.po +148 -4
  256. data/locale/ru/katello.po.time_stamp +0 -0
  257. data/locale/sl/LC_MESSAGES/katello.mo +0 -0
  258. data/locale/sl/katello.po +148 -4
  259. data/locale/sl/katello.po.time_stamp +0 -0
  260. data/locale/sv_SE/LC_MESSAGES/katello.mo +0 -0
  261. data/locale/sv_SE/katello.po +148 -4
  262. data/locale/sv_SE/katello.po.time_stamp +0 -0
  263. data/locale/ta/LC_MESSAGES/katello.mo +0 -0
  264. data/locale/ta/katello.po +148 -4
  265. data/locale/ta/katello.po.time_stamp +0 -0
  266. data/locale/ta_IN/LC_MESSAGES/katello.mo +0 -0
  267. data/locale/ta_IN/katello.po +148 -4
  268. data/locale/ta_IN/katello.po.time_stamp +0 -0
  269. data/locale/te/LC_MESSAGES/katello.mo +0 -0
  270. data/locale/te/katello.po +148 -4
  271. data/locale/te/katello.po.time_stamp +0 -0
  272. data/locale/tr/LC_MESSAGES/katello.mo +0 -0
  273. data/locale/tr/katello.po +148 -4
  274. data/locale/tr/katello.po.time_stamp +0 -0
  275. data/locale/vi/LC_MESSAGES/katello.mo +0 -0
  276. data/locale/vi/katello.po +148 -4
  277. data/locale/vi/katello.po.time_stamp +0 -0
  278. data/locale/vi_VN/LC_MESSAGES/katello.mo +0 -0
  279. data/locale/vi_VN/katello.po +148 -4
  280. data/locale/vi_VN/katello.po.time_stamp +0 -0
  281. data/locale/zh/LC_MESSAGES/katello.mo +0 -0
  282. data/locale/zh/katello.po +148 -4
  283. data/locale/zh/katello.po.time_stamp +0 -0
  284. data/locale/zh_CN/katello.po +147 -3
  285. data/locale/zh_CN/katello.po.time_stamp +0 -0
  286. data/locale/zh_TW/LC_MESSAGES/katello.mo +0 -0
  287. data/locale/zh_TW/katello.po +148 -4
  288. data/locale/zh_TW/katello.po.time_stamp +0 -0
  289. data/package.json +0 -1
  290. data/webpack/components/Content/Details/__tests__/__snapshots__/ContentDetails.test.js.snap +2 -2
  291. data/webpack/components/OptionTooltip/OptionTooltip.scss +1 -1
  292. data/webpack/components/extensions/HostDetails/ActionsBar/index.js +5 -5
  293. data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackagesTab.js +6 -1
  294. data/webpack/components/extensions/Hosts/ActionsBar/index.js +11 -0
  295. data/webpack/components/extensions/Hosts/BulkActions/BulkChangeHostCVModal/BulkChangeHostCVModal.js +1 -1
  296. data/webpack/components/extensions/Hosts/BulkActions/BulkChangeHostCVModal/actions.js +1 -2
  297. data/webpack/components/extensions/Hosts/BulkActions/BulkErrataWizard/04_ReviewFooter.js +1 -1
  298. data/webpack/components/extensions/Hosts/BulkActions/BulkPackagesWizard/04_ReviewFooter.js +1 -1
  299. data/webpack/components/extensions/Hosts/BulkActions/BulkRepositorySetsWizard/01_BulkRepositorySetsTable.js +371 -0
  300. data/webpack/components/extensions/Hosts/BulkActions/BulkRepositorySetsWizard/03_Review.js +79 -0
  301. data/webpack/components/extensions/Hosts/BulkActions/BulkRepositorySetsWizard/03_ReviewFooter.js +73 -0
  302. data/webpack/components/extensions/Hosts/BulkActions/BulkRepositorySetsWizard/BulkRepositorySetsWizard.js +170 -0
  303. data/webpack/components/extensions/Hosts/BulkActions/BulkRepositorySetsWizard/actions.js +23 -0
  304. data/webpack/components/extensions/Hosts/BulkActions/BulkRepositorySetsWizard/helpers.js +28 -0
  305. data/webpack/components/extensions/Hosts/BulkActions/BulkRepositorySetsWizard/index.js +23 -0
  306. data/webpack/components/extensions/RegistrationCommands/fields/SetupContainerRegistryCerts.js +39 -0
  307. data/webpack/components/extensions/RegistrationCommands/index.js +7 -0
  308. data/webpack/components/pf3Table/formatters/ellipsisCellFormatter.js +3 -2
  309. data/webpack/containers/Application/config.js +11 -0
  310. data/webpack/global_index.js +3 -1
  311. data/webpack/scenes/ContentViews/Details/Filters/Rules/Package/AddEditPackageRuleModal.js +2 -0
  312. data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersions.js +9 -6
  313. data/webpack/scenes/ContentViews/Table/ContentViewsTable.js +4 -0
  314. data/webpack/scenes/FlatpakRemotes/CreateEdit/CreateFlatpakRemoteModal.js +30 -0
  315. data/webpack/scenes/FlatpakRemotes/CreateEdit/EditFlatpakRemotesModal.js +38 -0
  316. data/webpack/scenes/FlatpakRemotes/CreateEdit/FlatpakRemoteform.js +218 -0
  317. data/webpack/scenes/FlatpakRemotes/CreateEdit/__tests__/flatpakRemoteform.test.js +117 -0
  318. data/webpack/scenes/FlatpakRemotes/Delete/DeleteFlatpakModal.js +59 -0
  319. data/webpack/scenes/FlatpakRemotes/Details/FlatpakRemoteDetailActions.js +87 -0
  320. data/webpack/scenes/FlatpakRemotes/Details/FlatpakRemoteDetailReducers.js +23 -0
  321. data/webpack/scenes/FlatpakRemotes/Details/FlatpakRemoteDetailSelectors.js +16 -0
  322. data/webpack/scenes/FlatpakRemotes/Details/FlatpakRemoteDetails.js +167 -0
  323. data/webpack/scenes/FlatpakRemotes/Details/Mirror/MirrorRepositoryModal.js +135 -0
  324. data/webpack/scenes/FlatpakRemotes/Details/Mirror/__tests__/mirrorRepositoryModal.test.js +167 -0
  325. data/webpack/scenes/FlatpakRemotes/Details/RemoteRepositories/RemoteRepositoriesTable.js +171 -0
  326. data/webpack/scenes/FlatpakRemotes/Details/__tests__/flatpakRemoteDetails.fixtures.json +58 -0
  327. data/webpack/scenes/FlatpakRemotes/Details/__tests__/flatpakRemoteDetails.test.js +90 -0
  328. data/webpack/scenes/FlatpakRemotes/Details/index.js +4 -0
  329. data/webpack/scenes/FlatpakRemotes/FlatpakRemotesActions.js +26 -0
  330. data/webpack/scenes/FlatpakRemotes/FlatpakRemotesConstants.js +15 -0
  331. data/webpack/scenes/FlatpakRemotes/FlatpakRemotesPage.js +202 -0
  332. data/webpack/scenes/FlatpakRemotes/FlatpakRemotesSelectors.js +24 -0
  333. data/webpack/scenes/FlatpakRemotes/__tests__/flatpakRemotesList.fixtures.json +55 -0
  334. data/webpack/scenes/FlatpakRemotes/__tests__/flatpakRemotesPage.test.js +74 -0
  335. data/webpack/scenes/FlatpakRemotes/index.js +4 -0
  336. data/webpack/scenes/Hosts/ChangeContentSource/components/Hosts.js +2 -2
  337. data/webpack/scenes/RedHatRepositories/components/RecommendedRepositorySetsToggler.scss +1 -1
  338. data/webpack/scenes/RedHatRepositories/index.scss +1 -1
  339. data/webpack/scenes/Settings/SettingsSelectors.js +3 -3
  340. data/webpack/scenes/Settings/index.js +1 -3
  341. data/webpack/scenes/Subscriptions/Details/__tests__/__snapshots__/SubscriptionDetails.test.js.snap +2 -2
  342. data/webpack/scenes/Subscriptions/SubscriptionsPage.scss +1 -1
  343. data/webpack/scenes/Subscriptions/__tests__/SubscriptionsReducer.test.js +0 -21
  344. data/webpack/scenes/Subscriptions/__tests__/__snapshots__/SubscriptionsReducer.test.js.snap +0 -44
  345. data/webpack/scenes/Subscriptions/index.js +1 -3
  346. metadata +87 -21
  347. data/webpack/scenes/Settings/SettingsConstants.js +0 -2
  348. data/webpack/scenes/Settings/SettingsReducer.js +0 -19
@@ -0,0 +1,167 @@
1
+ import React from 'react';
2
+ import { Route } from 'react-router-dom';
3
+ import { renderWithRedux, patientlyWaitFor } from 'react-testing-lib-wrapper';
4
+ import { fireEvent } from '@testing-library/react';
5
+ import { nockInstance, assertNockRequest } from '../../../../../test-utils/nockWrapper';
6
+ import api from '../../../../../services/api';
7
+ import FlatpakRemoteDetails from '../../FlatpakRemoteDetails';
8
+ import FLATPAK_REMOTES_KEY from '../../../FlatpakRemotesConstants';
9
+ import frDetailData from '../../__tests__/flatpakRemoteDetails.fixtures.json';
10
+
11
+ jest.mock('react-intl', () => ({ addLocaleData: () => { }, FormattedDate: () => 'mocked' }));
12
+
13
+ const withFRRoute = component => <Route path="/flatpak_remotes/:id([0-9]+)">{component}</Route>;
14
+
15
+ const renderOptions = {
16
+ apiNamespace: `${FLATPAK_REMOTES_KEY}_1`,
17
+ routerParams: {
18
+ initialEntries: [{ pathname: '/flatpak_remotes/1' }],
19
+ initialIndex: 1,
20
+ },
21
+ };
22
+
23
+ const frDetailsPath = api.getApiUrl('/flatpak_remotes/1');
24
+ const repoApiUrl = api.getApiUrl('/flatpak_remotes/1/flatpak_remote_repositories');
25
+
26
+ test('Can open mirror repository modal', async () => {
27
+ const frDetailsScope = nockInstance
28
+ .get(frDetailsPath)
29
+ .query(true)
30
+ .reply(200, frDetailData);
31
+
32
+ const scopeRepos = nockInstance
33
+ .get(repoApiUrl)
34
+ .query(true)
35
+ .times(2)
36
+ .reply(200, {
37
+ results: frDetailData.repositories,
38
+ subtotal: frDetailData.repositories.length,
39
+ page: 1,
40
+ per_page: 20,
41
+ });
42
+
43
+ const productAutocompleteScope = nockInstance
44
+ .get(api.getApiUrl('/products/auto_complete_name'))
45
+ .query(true)
46
+ .reply(200, ['Product1', 'Product2', 'Product3']);
47
+
48
+ const flatpakRepoAutocompleteScope = nockInstance
49
+ .get(api.getApiUrl('/flatpak_remote_repositories/auto_complete_search'))
50
+ .query(true)
51
+ .reply(200, []);
52
+
53
+ const { getByText, getByRole } = renderWithRedux(
54
+ withFRRoute(<FlatpakRemoteDetails />),
55
+ renderOptions,
56
+ );
57
+
58
+ await patientlyWaitFor(() => {
59
+ expect(getByText(frDetailData.repositories[0].name)).toBeInTheDocument();
60
+ });
61
+
62
+ await patientlyWaitFor(() => {
63
+ expect(getByText('Mirror', {
64
+ selector: '[data-ouia-component-id="mirror-button-1"]',
65
+ })).toBeInTheDocument();
66
+ });
67
+
68
+ getByText('Mirror', {
69
+ selector: '[data-ouia-component-id="mirror-button-1"]',
70
+ }).click();
71
+
72
+ await patientlyWaitFor(() => {
73
+ expect(getByRole('textbox')).toBeInTheDocument();
74
+ expect(getByText('Mirror', {
75
+ selector: '[data-ouia-component-id="confirm-mirror-btn"]',
76
+ })).toBeInTheDocument();
77
+ });
78
+
79
+ assertNockRequest(frDetailsScope);
80
+ assertNockRequest(scopeRepos);
81
+ assertNockRequest(productAutocompleteScope);
82
+ assertNockRequest(flatpakRepoAutocompleteScope);
83
+ });
84
+
85
+ test('Can successfully mirror a repository', async () => {
86
+ const selectedRepo = frDetailData.repositories[0];
87
+ const productName = 'Product1';
88
+
89
+ const frDetailsScope = nockInstance
90
+ .get(frDetailsPath)
91
+ .query(true)
92
+ .reply(200, frDetailData);
93
+
94
+ const scopeRepos = nockInstance
95
+ .get(repoApiUrl)
96
+ .query(true)
97
+ .times(3)
98
+ .reply(200, {
99
+ results: frDetailData.repositories,
100
+ subtotal: frDetailData.repositories.length,
101
+ page: 1,
102
+ per_page: 20,
103
+ });
104
+
105
+ const productAutocompleteScope = nockInstance
106
+ .get(api.getApiUrl('/products/auto_complete_name'))
107
+ .query(true)
108
+ .reply(200, ['Product1', 'Product2', 'Product3']);
109
+
110
+ const flatpakRepoAutocompleteScope = nockInstance
111
+ .get(api.getApiUrl('/flatpak_remote_repositories/auto_complete_search'))
112
+ .query(true)
113
+ .reply(200, []);
114
+
115
+ const mirrorScope = nockInstance
116
+ .post(api.getApiUrl(`/flatpak_remote_repositories/${selectedRepo.id}/mirror`), {
117
+ product_name: productName,
118
+ organization_id: 1,
119
+ })
120
+ .reply(200, { task_id: 'mirror-task-123' });
121
+
122
+ const { getByText, getByRole } = renderWithRedux(
123
+ withFRRoute(<FlatpakRemoteDetails />),
124
+ renderOptions,
125
+ );
126
+
127
+ await patientlyWaitFor(() => {
128
+ expect(getByText(selectedRepo.name)).toBeInTheDocument();
129
+ });
130
+
131
+ await patientlyWaitFor(() => {
132
+ expect(getByText('Mirror', {
133
+ selector: '[data-ouia-component-id="mirror-button-1"]',
134
+ })).toBeInTheDocument();
135
+ });
136
+
137
+
138
+ getByText('Mirror', {
139
+ selector: '[data-ouia-component-id="mirror-button-1"]',
140
+ }).click();
141
+
142
+ await patientlyWaitFor(() => {
143
+ expect(getByText('Mirror Repository')).toBeInTheDocument();
144
+ });
145
+
146
+ const productInput = getByRole('textbox');
147
+ fireEvent.change(productInput, { target: { value: productName } });
148
+
149
+ await patientlyWaitFor(() => {
150
+ expect(getByText('Mirror', {
151
+ selector: '[data-ouia-component-id="confirm-mirror-btn"]',
152
+ })).toBeInTheDocument();
153
+ });
154
+
155
+ getByText('Mirror', {
156
+ selector: '[data-ouia-component-id="confirm-mirror-btn"]',
157
+ }).click();
158
+
159
+ await patientlyWaitFor(() => {
160
+ assertNockRequest(mirrorScope);
161
+ });
162
+
163
+ assertNockRequest(frDetailsScope);
164
+ assertNockRequest(scopeRepos);
165
+ assertNockRequest(productAutocompleteScope);
166
+ assertNockRequest(flatpakRepoAutocompleteScope);
167
+ });
@@ -0,0 +1,171 @@
1
+ import React, { useState } from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { Table, Thead, Th, Tbody, Tr, Td } from '@patternfly/react-table';
4
+ import { Button } from '@patternfly/react-core';
5
+ import TableIndexPage from 'foremanReact/components/PF4/TableIndexPage/TableIndexPage';
6
+ import Pagination from 'foremanReact/components/Pagination';
7
+ import EmptyPage from 'foremanReact/routes/common/EmptyPage';
8
+ import { translate as __ } from 'foremanReact/common/I18n';
9
+ import { STATUS } from 'foremanReact/constants';
10
+ import { useTableSort } from 'foremanReact/components/PF4/Helpers/useTableSort';
11
+ import {
12
+ useSetParamsAndApiAndSearch,
13
+ useTableIndexAPIResponse,
14
+ } from 'foremanReact/components/PF4/TableIndexPage/Table/TableIndexHooks';
15
+ import LastSync from '../../../ContentViews/Details/Repositories/LastSync';
16
+ import { flatpakRemoteRepositoriesKey } from '../../FlatpakRemotesConstants';
17
+ import MirrorRepositoryModal from '../Mirror/MirrorRepositoryModal';
18
+
19
+ const RemoteRepositoriesTable = ({ frId, canMirror }) => {
20
+ const [selectedRepo, setSelectedRepo] = useState(null);
21
+
22
+ const columnHeaders = [__('Name'), __('ID'), __('Application name'), __('Last mirrored'), __('Mirror')];
23
+
24
+ const COLUMNS_TO_SORT_PARAMS = {
25
+ [columnHeaders[0]]: 'name',
26
+ [columnHeaders[1]]: 'id',
27
+ };
28
+
29
+ const apiUrl = `/katello/api/v2/flatpak_remotes/${frId}/flatpak_remote_repositories`;
30
+ const apiOptions = { key: flatpakRemoteRepositoriesKey(frId) };
31
+
32
+ const defaultParams = { page: 1, per_page: 20 };
33
+
34
+ const {
35
+ response: {
36
+ results = [],
37
+ subtotal,
38
+ page,
39
+ per_page: perPage,
40
+ message: error,
41
+ } = {},
42
+ status,
43
+ setAPIOptions,
44
+ } = useTableIndexAPIResponse({ apiUrl, apiOptions, defaultParams });
45
+
46
+ const { setParamsAndAPI, params } = useSetParamsAndApiAndSearch({
47
+ defaultParams,
48
+ apiOptions,
49
+ setAPIOptions,
50
+ });
51
+
52
+ const onSort = (_event, index, direction) => {
53
+ const sortBy = Object.values(COLUMNS_TO_SORT_PARAMS)[index];
54
+ setParamsAndAPI({
55
+ ...params,
56
+ order: `${sortBy} ${direction}`,
57
+ });
58
+ };
59
+
60
+ const { pfSortParams } = useTableSort({
61
+ allColumns: columnHeaders,
62
+ columnsToSortParams: COLUMNS_TO_SORT_PARAMS,
63
+ onSort,
64
+ });
65
+
66
+ const onPaginationChange = (newPagination) => {
67
+ setParamsAndAPI({ ...params, ...newPagination });
68
+ };
69
+
70
+ const openMirrorModal = (repo) => {
71
+ setSelectedRepo(repo);
72
+ };
73
+
74
+ const closeMirrorModal = () => {
75
+ setSelectedRepo(null);
76
+ };
77
+
78
+ return (
79
+ <TableIndexPage
80
+ apiUrl={apiUrl}
81
+ apiOptions={apiOptions}
82
+ creatable={false}
83
+ controller="/katello/api/v2/flatpak_remote_repositories"
84
+ >
85
+ <>
86
+ {results.length === 0 && !error && status === STATUS.PENDING && (
87
+ <EmptyPage message={{ type: 'loading', text: __('Loading...') }} />
88
+ )}
89
+ {results.length === 0 && !error && status === STATUS.RESOLVED && (
90
+ <EmptyPage message={{ type: 'empty' }} />
91
+ )}
92
+ {error && <EmptyPage message={{ type: 'error', text: error }} />}
93
+
94
+ {results.length > 0 && (
95
+ <Table variant="compact" ouiaId="remote-repos-table" isStriped>
96
+ <Thead>
97
+ <Tr ouiaId="remoteReposTableHeaderRow">
98
+ {columnHeaders.map(col => (
99
+ <Th
100
+ key={col}
101
+ {...(COLUMNS_TO_SORT_PARAMS[col] ? { sort: pfSortParams(col) } : {})}
102
+ >
103
+ {col}
104
+ </Th>
105
+ ))}
106
+ </Tr>
107
+ </Thead>
108
+ <Tbody>
109
+ {results.map(repo => (
110
+ <Tr key={repo.id} ouiaId={`remote-repo-row-${repo.id}`}>
111
+ <Td>{repo.name}</Td>
112
+ <Td>{repo.id}</Td>
113
+ <Td>{repo.application_name}</Td>
114
+ <Td>
115
+ <LastSync
116
+ lastSyncWords={repo.last_mirrored?.last_mirror_words}
117
+ lastSync={{
118
+ id: repo.last_mirrored?.mirror_id,
119
+ result: repo.last_mirrored?.result,
120
+ }}
121
+ startedAt={repo.last_mirrored?.started_at}
122
+ emptyMessage={__('Never')}
123
+ />
124
+ </Td>
125
+ {canMirror &&
126
+ <Td>
127
+ <Button
128
+ variant="link"
129
+ isInline
130
+ ouiaId={`mirror-button-${repo.id}`}
131
+ onClick={() => openMirrorModal(repo)}
132
+ >
133
+ {__('Mirror')}
134
+ </Button>
135
+ </Td>
136
+ }
137
+ </Tr>
138
+ ))}
139
+ </Tbody>
140
+ </Table>
141
+ )}
142
+
143
+ {results.length > 0 && (
144
+ <Pagination
145
+ key="remote-repos-pagination"
146
+ page={page}
147
+ perPage={perPage}
148
+ itemCount={subtotal}
149
+ onChange={onPaginationChange}
150
+ updateParamsByUrl
151
+ />
152
+ )}
153
+
154
+ {selectedRepo && (
155
+ <MirrorRepositoryModal
156
+ frId={frId}
157
+ repo={selectedRepo}
158
+ closeModal={closeMirrorModal}
159
+ />
160
+ )}
161
+ </>
162
+ </TableIndexPage>
163
+ );
164
+ };
165
+
166
+ RemoteRepositoriesTable.propTypes = {
167
+ frId: PropTypes.number.isRequired,
168
+ canMirror: PropTypes.bool.isRequired,
169
+ };
170
+
171
+ export default RemoteRepositoriesTable;
@@ -0,0 +1,58 @@
1
+ {
2
+ "id": 1,
3
+ "name": "Test Flatpak Remote",
4
+ "url": "https://registry.example.com/flatpak",
5
+ "organization_id": 8,
6
+ "organization": {
7
+ "name": "Enterprise",
8
+ "label": "Enterprise",
9
+ "id": 8
10
+ },
11
+ "can_view": true,
12
+ "can_edit": true,
13
+ "can_mirror": true,
14
+ "repositories": [
15
+ {
16
+ "id": 1,
17
+ "name": "libreoffice-flatpak",
18
+ "label": "rhel9_libreoffice-flatpak",
19
+ "flatpak_remote_id": 1,
20
+ "manifest_count": 4,
21
+ "tag_count": 1,
22
+ "last_mirrored": {
23
+ "mirror_id": "4e7b7c81-9100-4ca0-a5b2-915ca97b7652",
24
+ "result": "success",
25
+ "started_at": "2025-06-18 15:10:05 -0400",
26
+ "last_mirror_words": "2 days"
27
+ }
28
+ },
29
+ {
30
+ "id": 2,
31
+ "name": "firefox-flatpak",
32
+ "label": "rhel9_firefox-flatpak",
33
+ "flatpak_remote_id": 1,
34
+ "manifest_count": 3,
35
+ "tag_count": 1,
36
+ "last_mirrored": {
37
+ "mirror_id": "2f3c7a91-5ab2-4db0-967a-1a2bbcdfb123",
38
+ "result": "success",
39
+ "started_at": "2025-06-19 12:34:56 -0400",
40
+ "last_mirror_words": "1 day"
41
+ }
42
+ },
43
+ {
44
+ "id": 3,
45
+ "name": "gimp-flatpak",
46
+ "label": "rhel9_gimp-flatpak",
47
+ "flatpak_remote_id": 1,
48
+ "manifest_count": 2,
49
+ "tag_count": 1,
50
+ "last_mirrored": {
51
+ "mirror_id": "d9b8c61f-77b4-4abc-bb20-cdef98765432",
52
+ "result": "success",
53
+ "started_at": "2025-06-20 08:00:00 -0400",
54
+ "last_mirror_words": "3 hours"
55
+ }
56
+ }
57
+ ]
58
+ }
@@ -0,0 +1,90 @@
1
+ import React from 'react';
2
+ import { Route } from 'react-router-dom';
3
+ import { renderWithRedux, patientlyWaitFor } from 'react-testing-lib-wrapper';
4
+ import { nockInstance, assertNockRequest } from '../../../../test-utils/nockWrapper';
5
+ import api from '../../../../services/api';
6
+ import FlatpakRemoteDetails from '../FlatpakRemoteDetails';
7
+ import FLATPAK_REMOTES_KEY from '../../FlatpakRemotesConstants';
8
+ import frDetailData from './flatpakRemoteDetails.fixtures.json';
9
+
10
+ jest.mock('react-intl', () => ({ addLocaleData: () => { }, FormattedDate: () => 'mocked' }));
11
+
12
+ const withFRRoute = component => <Route path="/flatpak_remotes/:id([0-9]+)">{component}</Route>;
13
+
14
+ const renderOptions = {
15
+ apiNamespace: `${FLATPAK_REMOTES_KEY}_1`,
16
+ routerParams: {
17
+ initialEntries: [{ pathname: '/flatpak_remotes/1' }],
18
+ initialIndex: 1,
19
+ },
20
+ };
21
+
22
+ const frDetailsPath = api.getApiUrl('/flatpak_remotes/1');
23
+ const repoApiUrl = api.getApiUrl('/flatpak_remotes/1/flatpak_remote_repositories');
24
+ const autocompleteApiUrl = api.getApiUrl('/flatpak_remote_repositories/auto_complete_search');
25
+
26
+ const mockAutocomplete = () =>
27
+ nockInstance
28
+ .get(autocompleteApiUrl)
29
+ .query({ search: '' })
30
+ .reply(200, []);
31
+
32
+ test('Can call API and display details on load', async () => {
33
+ const scopeDetails = nockInstance
34
+ .get(frDetailsPath)
35
+ .query(true)
36
+ .reply(200, frDetailData);
37
+
38
+ const scopeRepos = nockInstance
39
+ .get(repoApiUrl)
40
+ .query(true)
41
+ .times(2)
42
+ .reply(200, {
43
+ results: frDetailData.repositories,
44
+ subtotal: frDetailData.repositories.length,
45
+ page: 1,
46
+ per_page: 20,
47
+ });
48
+
49
+ const scopeAutocomplete = mockAutocomplete();
50
+
51
+ const { getByText } = renderWithRedux(
52
+ withFRRoute(<FlatpakRemoteDetails />),
53
+ renderOptions,
54
+ );
55
+
56
+ await patientlyWaitFor(() => {
57
+ expect(getByText(frDetailData.url)).toBeInTheDocument();
58
+ });
59
+
60
+ assertNockRequest(scopeDetails);
61
+ assertNockRequest(scopeRepos);
62
+ assertNockRequest(scopeAutocomplete);
63
+ });
64
+
65
+ test('Displays empty state when repository list is empty', async () => {
66
+ nockInstance
67
+ .get(frDetailsPath)
68
+ .query(true)
69
+ .reply(200, frDetailData);
70
+
71
+ nockInstance
72
+ .get(repoApiUrl)
73
+ .query(true)
74
+ .times(2)
75
+ .reply(200, {
76
+ results: [],
77
+ subtotal: 0,
78
+ page: 1,
79
+ per_page: 20,
80
+ });
81
+
82
+ mockAutocomplete();
83
+
84
+ const { findByText } = renderWithRedux(
85
+ withFRRoute(<FlatpakRemoteDetails />),
86
+ renderOptions,
87
+ );
88
+
89
+ expect(await findByText(/no results/i)).toBeInTheDocument();
90
+ });
@@ -0,0 +1,4 @@
1
+ import { withRouter } from 'react-router-dom';
2
+ import FlatpakRemoteDetails from './FlatpakRemoteDetails';
3
+
4
+ export default withRouter(FlatpakRemoteDetails);
@@ -0,0 +1,26 @@
1
+ import { translate as __ } from 'foremanReact/common/I18n';
2
+ import { API_OPERATIONS, post } from 'foremanReact/redux/API';
3
+ import api, { orgId } from '../../services/api';
4
+ import { CREATE_FLATPAK_REMOTES_KEY }
5
+ from './FlatpakRemotesConstants';
6
+ import { getResponseErrorMsgs } from '../../utils/helpers';
7
+
8
+ export const createParamsWithOrg = params => ({
9
+ organization_id: orgId(),
10
+ ...params,
11
+ });
12
+ const flatpakCreateSuccessToast = (response) => {
13
+ const { data: { name } } = response;
14
+ return __(`Flatpak Remote ${name} created`);
15
+ };
16
+
17
+ export const flatpakCreateErrorToast = error => getResponseErrorMsgs(error.response);
18
+
19
+ export const createFlatpakRemote = params => post({
20
+ type: API_OPERATIONS.POST,
21
+ key: CREATE_FLATPAK_REMOTES_KEY,
22
+ url: api.getApiUrl('/flatpak_remotes'),
23
+ params: createParamsWithOrg(params),
24
+ successToast: response => flatpakCreateSuccessToast(response),
25
+ errorToast: error => flatpakCreateErrorToast(error),
26
+ });
@@ -0,0 +1,15 @@
1
+ const FLATPAK_REMOTES_KEY = 'FLATPAK_REMOTES';
2
+ export const CREATE_FLATPAK_REMOTES_KEY = 'CREATE_FLATPAK_REMOTES_KEY';
3
+ export const DELETE_FLATPAK_REMOTE_KEY = 'DELETE_FLATPAK_REMOTE_KEY';
4
+ export const FLATPAK_CREATE_MODAL_ID = 'FLATPAK_CREATE_MODAL_ID';
5
+
6
+ export const UPDATE_FLATPAK_REMOTE = 'UPDATE_FLATPAK_REMOTE';
7
+ export const UPDATE_FLATPAK_REMOTE_SUCCESS = 'UPDATE_FLATPAK_REMOTE_SUCCESS';
8
+ export const UPDATE_FLATPAK_REMOTE_FAILURE = 'UPDATE_FLATPAK_REMOTE_FAILURE';
9
+
10
+ export const SCAN_FLATPAK_REMOTE_KEY = 'SCAN_FLATPAK_REMOTE_KEY';
11
+
12
+ export const flatpakRemoteDetailsKey = id => `${FLATPAK_REMOTES_KEY}/DETAILS/${id}`;
13
+ export const flatpakRemoteRepositoriesKey = id => `${FLATPAK_REMOTES_KEY}/REPOSITORIES/${id}`;
14
+
15
+ export default FLATPAK_REMOTES_KEY;