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,23 @@
1
+ import { translate as __ } from 'foremanReact/common/I18n';
2
+ import { API_OPERATIONS, put } from 'foremanReact/redux/API';
3
+ import { errorToast, renderTaskStartedToast } from '../../../../../scenes/Tasks/helpers';
4
+ import { foremanApi } from '../../../../../services/api';
5
+
6
+ const BULK_HOST_CONTENT_OVERRIDES_KEY = 'BULK_HOST_CONTENT_OVERRIDES';
7
+
8
+ export const bulkUpdateHostContentOverrides =
9
+ (params, handleSuccess, handleError) => put({
10
+ type: API_OPERATIONS.PUT,
11
+ key: BULK_HOST_CONTENT_OVERRIDES_KEY,
12
+ url: foremanApi.getApiUrl('/hosts/bulk/content_overrides'),
13
+ successToast: () => __('Content overrides updating.'),
14
+ handleSuccess: (response) => {
15
+ if (handleSuccess) handleSuccess(response);
16
+ return renderTaskStartedToast(response.data);
17
+ },
18
+ handleError,
19
+ errorToast,
20
+ params,
21
+ });
22
+
23
+ export default bulkUpdateHostContentOverrides;
@@ -0,0 +1,28 @@
1
+ export const pendingOverrideToApiParamItem = ({ repoLabel, value }) => {
2
+ switch (Number(value)) {
3
+ case 0: // No change
4
+ return null;
5
+ case 1: // Override to enabled
6
+ return {
7
+ content_label: repoLabel,
8
+ name: 'enabled',
9
+ value: true,
10
+ };
11
+ case 2: // Override to disabled
12
+ return {
13
+ content_label: repoLabel,
14
+ name: 'enabled',
15
+ value: false,
16
+ };
17
+ case 3: // Reset to default
18
+ return {
19
+ content_label: repoLabel,
20
+ name: 'enabled',
21
+ remove: true,
22
+ };
23
+ default:
24
+ return null;
25
+ }
26
+ };
27
+
28
+ export default pendingOverrideToApiParamItem;
@@ -0,0 +1,23 @@
1
+ import React from 'react';
2
+ import { Modal, ModalVariant } from '@patternfly/react-core';
3
+ import { useForemanModal } from 'foremanReact/components/ForemanModal/ForemanModalHooks';
4
+ import BulkRepositorySetsWizard from './BulkRepositorySetsWizard';
5
+
6
+ const BulkRepositorySetsWizardModal = () => {
7
+ const { modalOpen: isOpen } = useForemanModal({ id: 'bulk-repo-sets-wizard' });
8
+
9
+ return (
10
+ <Modal
11
+ ouiaId="bulk-repo-sets-wizard-modal"
12
+ isOpen={isOpen}
13
+ showClose={false}
14
+ aria-label="Wizard modal"
15
+ hasNoBodyWrapper
16
+ variant={ModalVariant.large}
17
+ >
18
+ <BulkRepositorySetsWizard />
19
+ </Modal>
20
+ );
21
+ };
22
+
23
+ export default BulkRepositorySetsWizardModal;
@@ -0,0 +1,39 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { noop } from 'foremanReact/common/helpers';
4
+
5
+ import { FormGroup, Checkbox } from '@patternfly/react-core';
6
+ import LabelIcon from 'foremanReact/components/common/LabelIcon';
7
+ import { translate as __ } from 'foremanReact/common/I18n';
8
+
9
+ const SetupContainerRegistryCerts = ({ value, onChange, isLoading }) => (
10
+ <FormGroup fieldId="reg_container_certs">
11
+ <Checkbox
12
+ ouiaId="reg-container-certs"
13
+ label={
14
+ <span>
15
+ {__('Set up container registry certs')}{' '}
16
+ <LabelIcon text={__('Place symlinks to entitlement certificates on the host, enabling container/flatpak registry access without a username or password.')} />
17
+ </span>
18
+ }
19
+ id="reg_container_certs"
20
+ onChange={() => onChange({ setupContainerRegistryCerts: !value })}
21
+ isDisabled={isLoading}
22
+ isChecked={value}
23
+ />
24
+ </FormGroup>
25
+ );
26
+
27
+ SetupContainerRegistryCerts.propTypes = {
28
+ value: PropTypes.bool,
29
+ onChange: PropTypes.func,
30
+ isLoading: PropTypes.bool,
31
+ };
32
+
33
+ SetupContainerRegistryCerts.defaultProps = {
34
+ value: false,
35
+ onChange: noop,
36
+ isLoading: false,
37
+ };
38
+
39
+ export default SetupContainerRegistryCerts;
@@ -7,6 +7,7 @@ import { determineInitialAKSelection } from './helpers';
7
7
  import ActivationKeys from './fields/ActivationKeys';
8
8
  import IgnoreSubmanErrors from './fields/IgnoreSubmanErrors';
9
9
  import Force from './fields/Force';
10
+ import SetupContainerRegistryCerts from './fields/SetupContainerRegistryCerts';
10
11
 
11
12
  export const RegistrationCommands = ({
12
13
  pluginValues,
@@ -26,6 +27,12 @@ export const RegistrationCommands = ({
26
27
  onChange={onChange}
27
28
  isLoading={isLoading}
28
29
  />
30
+ <SetupContainerRegistryCerts
31
+ value={pluginValues?.setupContainerRegistryCerts}
32
+ pluginValues={pluginValues}
33
+ onChange={onChange}
34
+ isLoading={isLoading}
35
+ />
29
36
  </>
30
37
  );
31
38
 
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
- import EllipsisWithTooltip from 'react-ellipsis-with-tooltip';
2
+ import { Truncate } from '@patternfly/react-core';
3
+
3
4
  import cellFormatter from './cellFormatter';
4
5
 
5
- export default value => cellFormatter(<EllipsisWithTooltip>{value}</EllipsisWithTooltip>);
6
+ export default value => cellFormatter(<Truncate content={value} />);
@@ -16,6 +16,8 @@ import withHeader from './withHeaders';
16
16
  import ChangeContentSource from '../../scenes/Hosts/ChangeContentSource';
17
17
  import AlternateContentSource from '../../scenes/AlternateContentSources';
18
18
  import BootedContainerImages from '../../scenes/BootedContainerImages';
19
+ import FlatpakRemotes from '../../scenes/FlatpakRemotes';
20
+ import FlatpakRemoteDetails from '../../scenes/FlatpakRemotes/Details';
19
21
 
20
22
  // eslint-disable-next-line import/prefer-default-export
21
23
  export const links = [
@@ -90,4 +92,13 @@ export const links = [
90
92
  path: 'booted_container_images',
91
93
  component: WithOrganization(withHeader(BootedContainerImages, { title: __('Booted container images') })),
92
94
  },
95
+ {
96
+ path: 'flatpak_remotes',
97
+ component: WithOrganization(withHeader(FlatpakRemotes, { title: __('Flatpak Remotes') })),
98
+ },
99
+ {
100
+ path: 'flatpak_remotes/:id([0-9]+)',
101
+ component: WithOrganization(withHeader(FlatpakRemoteDetails, { title: __('Flatpak Remote Details') })),
102
+ exact: false,
103
+ },
93
104
  ];
@@ -38,6 +38,7 @@ import SystemPurposeCard from './components/extensions/HostDetails/Cards/SystemP
38
38
  import BulkChangeHostCVModal from './components/extensions/Hosts/BulkActions/BulkChangeHostCVModal/index.js';
39
39
  import BulkPackagesWizardModal from './components/extensions/Hosts/BulkActions/BulkPackagesWizard/index.js';
40
40
  import BulkErrataWizardModal from './components/extensions/Hosts/BulkActions/BulkErrataWizard/index.js';
41
+ import BulkRepositorySetsWizardModal from './components/extensions/Hosts/BulkActions/BulkRepositorySetsWizard/index.js';
41
42
  import ActivationKeysSearch from './components/ActivationKeysSearch';
42
43
  import { CVEDetailsCard } from './scenes/ActivationKeys/Details/components/CVEDetailsCard.js';
43
44
 
@@ -96,7 +97,8 @@ addGlobalFill(
96
97
  // Hosts Index page extensions
97
98
  addGlobalFill('_all-hosts-modals', 'BulkChangeHostCVModal', <BulkChangeHostCVModal key="bulk-change-host-cv-modal" />, 100);
98
99
  addGlobalFill('_all-hosts-modals', 'BulkPackagesWizardModal', <BulkPackagesWizardModal key="bulk-packages-wizard-modal" />, 200);
99
- addGlobalFill('_all-hosts-modals', 'BulkErrataWizardModal', <BulkErrataWizardModal key="bulk-errata-wizard-modal" />, 200);
100
+ addGlobalFill('_all-hosts-modals', 'BulkErrataWizardModal', <BulkErrataWizardModal key="bulk-errata-wizard-modal" />, 300);
101
+ addGlobalFill('_all-hosts-modals', 'BulkRepositorySetsWizardModal', <BulkRepositorySetsWizardModal key="bulk-repo-sets-wizard-modal" />, 400);
100
102
 
101
103
  registerColumns(hostsIndexColumnExtensions);
102
104
  registerGetActions({
@@ -164,6 +164,7 @@ const AddEditPackageRuleModal = ({
164
164
  },
165
165
  }}
166
166
  onSearchChange={setName}
167
+ initialQuery={name}
167
168
  />
168
169
  </FormGroup>
169
170
  <FormGroup label={__('Architecture')} fieldId="architecture">
@@ -175,6 +176,7 @@ const AddEditPackageRuleModal = ({
175
176
  },
176
177
  }}
177
178
  onSearchChange={setArchitecture}
179
+ initialQuery={architecture}
178
180
  />
179
181
  </FormGroup>
180
182
  <FormGroup label={__('Version')} fieldId="version_comparator">
@@ -127,7 +127,7 @@ const ContentViewVersions = ({ cvId, details }) => {
127
127
  [dispatch],
128
128
  );
129
129
 
130
- const buildCells = (cvVersion) => {
130
+ const buildCells = (cvVersion, rowIndex) => {
131
131
  const {
132
132
  version,
133
133
  description,
@@ -157,7 +157,7 @@ const ContentViewVersions = ({ cvId, details }) => {
157
157
 
158
158
  return [
159
159
  <Checkbox
160
- ouiaId={`select-version-${versionId}`}
160
+ ouiaId={`select-version-row-${rowIndex}`}
161
161
  id={versionId}
162
162
  aria-label={`Select version ${versionId}`}
163
163
  isChecked={isSelected(versionId)}
@@ -208,10 +208,11 @@ const ContentViewVersions = ({ cvId, details }) => {
208
208
  version,
209
209
  id: versionId,
210
210
  environments,
211
- }) =>
211
+ }, rowIndex) =>
212
212
  [
213
213
  {
214
214
  title: __('Promote'),
215
+ ouiaId: `promote-version-row-${rowIndex}`,
215
216
  onClick: () => {
216
217
  onPromote({
217
218
  cvVersionId: versionId,
@@ -222,6 +223,7 @@ const ContentViewVersions = ({ cvId, details }) => {
222
223
  },
223
224
  {
224
225
  title: __('Remove from environments'),
226
+ ouiaId: `remove-version-row-${rowIndex}`,
225
227
  onClick: () => {
226
228
  onRemoveFromEnv({
227
229
  cvVersionId: versionId,
@@ -233,6 +235,7 @@ const ContentViewVersions = ({ cvId, details }) => {
233
235
  },
234
236
  {
235
237
  title: __('Delete'),
238
+ ouiaId: `delete-version-row-${rowIndex}`,
236
239
  onClick: () => {
237
240
  selectionSet.clear();
238
241
  selectOne(true, versionId);
@@ -381,9 +384,9 @@ const ContentViewVersions = ({ cvId, details }) => {
381
384
  </Tr>
382
385
  </Thead>
383
386
  <Tbody>
384
- {results?.map((cvVersion) => {
387
+ {results?.map((cvVersion, rowIndex) => {
385
388
  const hasHistory = !!cvVersion?.active_history?.length;
386
- const cells = buildCells(cvVersion);
389
+ const cells = buildCells(cvVersion, rowIndex);
387
390
  return (
388
391
  <Tr key={`row-${cvVersion.id}`} ouiaId={`row-${cvVersion.id}`}>
389
392
  {cells.map((cell, index) => {
@@ -399,7 +402,7 @@ const ContentViewVersions = ({ cvId, details }) => {
399
402
  {(!hasHistory && hasActionPermissions) &&
400
403
  <Td
401
404
  actions={{
402
- items: rowDropdownItems(cvVersion),
405
+ items: rowDropdownItems(cvVersion, rowIndex),
403
406
  }}
404
407
  />}
405
408
  </Tr>);
@@ -90,18 +90,21 @@ const ContentViewTable = () => {
90
90
 
91
91
  const publishAction = {
92
92
  title: __('Publish'),
93
+ ouiaId: 'publish-action',
93
94
  isDisabled: generatedFor !== 'none',
94
95
  onClick: () => openPublishModal(cvInfo),
95
96
  };
96
97
 
97
98
  const promoteAction = {
98
99
  title: __('Promote'),
100
+ ouiaId: 'promote-action',
99
101
  isDisabled: !cvVersionCount,
100
102
  onClick: () => openPromoteModal(cvInfo),
101
103
  };
102
104
 
103
105
  const copyAction = {
104
106
  title: __('Copy'),
107
+ ouiaId: 'copy-action',
105
108
  onClick: () => {
106
109
  setCopy(true);
107
110
  setActionableCvId(cvInfo.id.toString());
@@ -111,6 +114,7 @@ const ContentViewTable = () => {
111
114
 
112
115
  const deleteAction = {
113
116
  title: __('Delete'),
117
+ ouiaId: 'delete-action',
114
118
  onClick: () => openDeleteModal(cvInfo),
115
119
  };
116
120
 
@@ -0,0 +1,30 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { translate as __ } from 'foremanReact/common/I18n';
4
+ import { Modal, ModalVariant } from '@patternfly/react-core';
5
+ import FlatpakRemotesForm from './FlatpakRemoteform';
6
+
7
+ const CreateFlatpakModal = ({ show, setIsOpen }) => (
8
+ <Modal
9
+ ouiaId="create-flatpak-modal"
10
+ title={__('Create Flatpak Remote')}
11
+ variant={ModalVariant.small}
12
+ isOpen={show}
13
+ onClose={() => { setIsOpen(false); }}
14
+ appendTo={document.body}
15
+ >
16
+ <FlatpakRemotesForm setModalOpen={setIsOpen} />
17
+ </Modal>
18
+ );
19
+
20
+ CreateFlatpakModal.propTypes = {
21
+ show: PropTypes.bool,
22
+ setIsOpen: PropTypes.func,
23
+ };
24
+
25
+ CreateFlatpakModal.defaultProps = {
26
+ show: false,
27
+ setIsOpen: null,
28
+ };
29
+
30
+ export default CreateFlatpakModal;
@@ -0,0 +1,38 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { translate as __ } from 'foremanReact/common/I18n';
4
+ import { Modal, ModalVariant } from '@patternfly/react-core';
5
+ import FlatpakRemotesForm from './FlatpakRemoteform';
6
+
7
+ const EditFlatpakModal = ({ show, setIsOpen, remoteData }) => (
8
+ <Modal
9
+ ouiaId="edit-flatpak-modal"
10
+ title={__('Edit Flatpak Remote')}
11
+ variant={ModalVariant.small}
12
+ isOpen={show}
13
+ onClose={() => { setIsOpen(false); }}
14
+ appendTo={document.body}
15
+ >
16
+ <FlatpakRemotesForm setModalOpen={setIsOpen} remoteData={remoteData} />
17
+ </Modal>
18
+ );
19
+
20
+ EditFlatpakModal.propTypes = {
21
+ show: PropTypes.bool,
22
+ setIsOpen: PropTypes.func,
23
+ remoteData: PropTypes.shape({
24
+ id: PropTypes.number,
25
+ name: PropTypes.string,
26
+ url: PropTypes.string,
27
+ username: PropTypes.string,
28
+ password: PropTypes.string,
29
+ }),
30
+ };
31
+
32
+ EditFlatpakModal.defaultProps = {
33
+ show: false,
34
+ setIsOpen: null,
35
+ remoteData: null,
36
+ };
37
+
38
+ export default EditFlatpakModal;
@@ -0,0 +1,218 @@
1
+ import React, { useState } from 'react';
2
+ import useDeepCompareEffect from 'use-deep-compare-effect';
3
+ import { STATUS } from 'foremanReact/constants';
4
+ import { translate as __ } from 'foremanReact/common/I18n';
5
+ import PropTypes from 'prop-types';
6
+ import { useDispatch, useSelector } from 'react-redux';
7
+ import {
8
+ Form,
9
+ FormGroup,
10
+ TextInput,
11
+ ActionGroup,
12
+ Button,
13
+ FormHelperText,
14
+ HelperText,
15
+ HelperTextItem,
16
+
17
+ } from '@patternfly/react-core';
18
+ import { createFlatpakRemote } from '../FlatpakRemotesActions';
19
+ import {
20
+ selectCreateFlatpakRemotes,
21
+ selectCreateFlatpakRemotesStatus,
22
+ selectCreateFlatpakRemotesError,
23
+ } from '../FlatpakRemotesSelectors';
24
+ import { updateFlatpakRemote } from '../Details/FlatpakRemoteDetailActions';
25
+
26
+ // eslint-disable-next-line react/prop-types
27
+ const FlatpakRemotesForm = ({ setModalOpen, remoteData }) => {
28
+ const {
29
+ id: editingId,
30
+ name: editingName,
31
+ url: editingUrl,
32
+ username: editingUsername,
33
+ upstream_password_exists: passwordExists,
34
+ } = remoteData || {};
35
+
36
+ const isEditing = !!editingName;
37
+ const dispatch = useDispatch();
38
+ const [name, setName] = useState(editingName || '');
39
+ const [url, setUrl] = useState(editingUrl || '');
40
+ const [username, setUsername] = useState(editingUsername || '');
41
+ const [password, setPassword] = useState(passwordExists ? '*****' : '');
42
+ const [redirect, setRedirect] = useState(false);
43
+ const [saving, setSaving] = useState(false);
44
+
45
+ const [urlValidated, setUrlValidated] = useState('default');
46
+ const handleUrlChange = (newurl, _event) => {
47
+ setUrl(newurl);
48
+ if (newurl === '') {
49
+ setUrlValidated('default');
50
+ } else if (/^(http(s)?:\/\/)[-a-zA-Z0-9@:%._~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_.~#?&//=]*)$/g.test(newurl)) {
51
+ setUrlValidated('success');
52
+ } else {
53
+ setUrlValidated('error');
54
+ }
55
+ };
56
+
57
+ const response = useSelector(selectCreateFlatpakRemotes);
58
+ const status = useSelector(selectCreateFlatpakRemotesStatus);
59
+ const error = useSelector(selectCreateFlatpakRemotesError);
60
+
61
+ useDeepCompareEffect(() => {
62
+ const { id } = response;
63
+ if (id && status === STATUS.RESOLVED && saving) {
64
+ setSaving(false);
65
+ setRedirect(true);
66
+ } else if (status === STATUS.ERROR) {
67
+ setSaving(false);
68
+ }
69
+ }, [response, status, error, saving]);
70
+
71
+ const onSave = () => {
72
+ setSaving(true);
73
+ let editingParams = {};
74
+ if (isEditing && password === '*****') {
75
+ editingParams = {
76
+ name,
77
+ url,
78
+ username,
79
+ };
80
+ } else {
81
+ editingParams = {
82
+ name,
83
+ url,
84
+ username,
85
+ token: password,
86
+ };
87
+ }
88
+ dispatch(isEditing ?
89
+ updateFlatpakRemote(
90
+ editingId, editingParams, () => window.location.assign(`/flatpak_remotes/${editingId}`),
91
+ () => setModalOpen(false),
92
+ ) :
93
+ createFlatpakRemote({
94
+ name,
95
+ url,
96
+ username,
97
+ token: password,
98
+ }));
99
+ };
100
+
101
+ if (redirect) {
102
+ const { id } = response;
103
+ window.location.assign(`/flatpak_remotes/${id}`);
104
+ }
105
+
106
+ const submitDisabled =
107
+ !name?.length || !url?.length || saving || redirect || urlValidated === 'error';
108
+
109
+ return (
110
+ <Form
111
+ onSubmit={(e) => {
112
+ e.preventDefault();
113
+ onSave();
114
+ }}
115
+ id="create-flatpak-form"
116
+ >
117
+ <FormGroup
118
+ label={__('Name')}
119
+ isRequired
120
+ fieldId="name"
121
+ >
122
+ <TextInput
123
+ isRequired
124
+ type="text"
125
+ id="name"
126
+ aria-label="input_name"
127
+ ouiaId="input_name"
128
+ name="name"
129
+ value={name}
130
+ onChange={(_event, value) => setName(value)}
131
+ />
132
+ </FormGroup>
133
+ <FormGroup
134
+ label={__('URL')}
135
+ isRequired
136
+ fieldId="url"
137
+ >
138
+ <TextInput
139
+ isRequired
140
+ type="url"
141
+ id="url"
142
+ aria-label="input_url"
143
+ ouiaId="input_url"
144
+ name="url"
145
+ value={url}
146
+ validated={urlValidated}
147
+ onChange={(_event, newurl) => handleUrlChange(newurl, _event)}
148
+ />
149
+ {urlValidated === 'error' && (
150
+ <FormHelperText>
151
+ <HelperText>
152
+ <HelperTextItem variant="error">
153
+ {__('Must be a vaild URL')}
154
+ </HelperTextItem>
155
+ </HelperText>
156
+ </FormHelperText>
157
+ )}
158
+ </FormGroup>
159
+ <FormGroup label={__('Username')} fieldId="username">
160
+ <TextInput
161
+ type="text"
162
+ id="username"
163
+ ouiaId="input_username"
164
+ name="username"
165
+ aria-label="input_username"
166
+ value={username}
167
+ onChange={(_event, value) => setUsername(value)}
168
+ />
169
+ <FormHelperText>
170
+ <HelperText>
171
+ <HelperTextItem>Authentication for registry</HelperTextItem>
172
+ </HelperText>
173
+ </FormHelperText>
174
+ </FormGroup>
175
+ <FormGroup label={__('Password')} fieldId="password">
176
+ <TextInput
177
+ type="password"
178
+ id="password"
179
+ ouiaId="input_password"
180
+ name="password"
181
+ aria-label="input_password"
182
+ value={password}
183
+ onChange={(_event, value) => setPassword(value)}
184
+ />
185
+ </FormGroup>
186
+
187
+ <ActionGroup>
188
+ <Button
189
+ ouiaId="create-flatpak-form-submit"
190
+ aria-label="create_flatpak"
191
+ variant="primary"
192
+ isDisabled={submitDisabled}
193
+ isLoading={saving || redirect}
194
+ type="submit"
195
+ >
196
+ {isEditing ? __('Update') : __('Create')}
197
+ </Button>
198
+ <Button
199
+ ouiaId="create-flatpakcancel"
200
+ variant="link"
201
+ onClick={() => setModalOpen(false)}
202
+ >
203
+ {__('Cancel')}
204
+ </Button>
205
+ </ActionGroup>
206
+ </Form>
207
+ );
208
+ };
209
+
210
+ FlatpakRemotesForm.propTypes = {
211
+ setModalOpen: PropTypes.func,
212
+ };
213
+
214
+ FlatpakRemotesForm.defaultProps = {
215
+ setModalOpen: null,
216
+ };
217
+
218
+ export default FlatpakRemotesForm;