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.
- checksums.yaml +4 -4
- data/app/assets/javascripts/katello/locale/bn/katello.js +148 -4
- data/app/assets/javascripts/katello/locale/bn_IN/katello.js +148 -4
- data/app/assets/javascripts/katello/locale/ca/katello.js +148 -4
- data/app/assets/javascripts/katello/locale/cs/katello.js +148 -4
- data/app/assets/javascripts/katello/locale/cs_CZ/katello.js +148 -4
- data/app/assets/javascripts/katello/locale/de/katello.js +147 -3
- data/app/assets/javascripts/katello/locale/de_AT/katello.js +148 -4
- data/app/assets/javascripts/katello/locale/de_DE/katello.js +148 -4
- data/app/assets/javascripts/katello/locale/el/katello.js +148 -4
- data/app/assets/javascripts/katello/locale/en/katello.js +148 -4
- data/app/assets/javascripts/katello/locale/en_GB/katello.js +148 -4
- data/app/assets/javascripts/katello/locale/en_US/katello.js +148 -4
- data/app/assets/javascripts/katello/locale/es/katello.js +147 -3
- data/app/assets/javascripts/katello/locale/et_EE/katello.js +148 -4
- data/app/assets/javascripts/katello/locale/fr/katello.js +147 -3
- data/app/assets/javascripts/katello/locale/gl/katello.js +148 -4
- data/app/assets/javascripts/katello/locale/gu/katello.js +148 -4
- data/app/assets/javascripts/katello/locale/he_IL/katello.js +148 -4
- data/app/assets/javascripts/katello/locale/hi/katello.js +148 -4
- data/app/assets/javascripts/katello/locale/id/katello.js +148 -4
- data/app/assets/javascripts/katello/locale/it/katello.js +148 -4
- data/app/assets/javascripts/katello/locale/ja/katello.js +147 -3
- data/app/assets/javascripts/katello/locale/ka/katello.js +147 -3
- data/app/assets/javascripts/katello/locale/kn/katello.js +148 -4
- data/app/assets/javascripts/katello/locale/ko/katello.js +147 -3
- data/app/assets/javascripts/katello/locale/ml_IN/katello.js +148 -4
- data/app/assets/javascripts/katello/locale/mr/katello.js +148 -4
- data/app/assets/javascripts/katello/locale/nl_NL/katello.js +148 -4
- data/app/assets/javascripts/katello/locale/or/katello.js +148 -4
- data/app/assets/javascripts/katello/locale/pa/katello.js +148 -4
- data/app/assets/javascripts/katello/locale/pl/katello.js +148 -4
- data/app/assets/javascripts/katello/locale/pl_PL/katello.js +148 -4
- data/app/assets/javascripts/katello/locale/pt/katello.js +148 -4
- data/app/assets/javascripts/katello/locale/pt_BR/katello.js +147 -3
- data/app/assets/javascripts/katello/locale/ro/katello.js +148 -4
- data/app/assets/javascripts/katello/locale/ro_RO/katello.js +148 -4
- data/app/assets/javascripts/katello/locale/ru/katello.js +148 -4
- data/app/assets/javascripts/katello/locale/sl/katello.js +148 -4
- data/app/assets/javascripts/katello/locale/sv_SE/katello.js +148 -4
- data/app/assets/javascripts/katello/locale/ta/katello.js +148 -4
- data/app/assets/javascripts/katello/locale/ta_IN/katello.js +148 -4
- data/app/assets/javascripts/katello/locale/te/katello.js +148 -4
- data/app/assets/javascripts/katello/locale/tr/katello.js +148 -4
- data/app/assets/javascripts/katello/locale/vi/katello.js +148 -4
- data/app/assets/javascripts/katello/locale/vi_VN/katello.js +148 -4
- data/app/assets/javascripts/katello/locale/zh/katello.js +148 -4
- data/app/assets/javascripts/katello/locale/zh_CN/katello.js +147 -3
- data/app/assets/javascripts/katello/locale/zh_TW/katello.js +148 -4
- data/app/controllers/katello/api/registry/registry_proxies_controller.rb +12 -14
- data/app/controllers/katello/api/v2/content_uploads_controller.rb +2 -1
- data/app/controllers/katello/api/v2/errata_controller.rb +16 -0
- data/app/controllers/katello/api/v2/flatpak_remote_repositories_controller.rb +20 -3
- data/app/controllers/katello/api/v2/flatpak_remotes_controller.rb +7 -3
- data/app/controllers/katello/api/v2/generic_content_units_controller.rb +1 -2
- data/app/controllers/katello/api/v2/products_controller.rb +18 -0
- data/app/controllers/katello/api/v2/repositories_controller.rb +5 -3
- data/app/controllers/katello/concerns/api/v2/hosts_bulk_actions_controller_extensions.rb +10 -0
- data/app/controllers/katello/concerns/api/v2/registration_commands_controller_extensions.rb +1 -0
- data/app/controllers/katello/concerns/filtered_auto_complete_search.rb +17 -0
- data/app/lib/actions/helpers/smart_proxy_sync_helper.rb +12 -0
- data/app/lib/actions/katello/content_view/add_rolling_repo_clone.rb +4 -4
- data/app/lib/actions/katello/content_view/capsule_sync.rb +8 -3
- data/app/lib/actions/katello/content_view/publish.rb +39 -12
- data/app/lib/actions/katello/flatpak/mirror_remote_repository.rb +2 -1
- data/app/lib/actions/katello/repository/capsule_sync.rb +11 -1
- data/app/lib/actions/katello/repository/import_upload.rb +2 -3
- data/app/lib/actions/katello/repository/sync.rb +2 -1
- data/app/lib/actions/katello/repository/upload_files.rb +2 -1
- data/app/lib/katello/concerns/bookmark_controller_validator_extensions.rb +1 -1
- data/app/lib/katello/resources/cdn.rb +1 -1
- data/app/models/katello/concerns/host_managed_extensions.rb +5 -1
- data/app/models/katello/concerns/smart_proxy_extensions.rb +46 -8
- data/app/models/katello/content_view_environment.rb +1 -1
- data/app/models/katello/erratum.rb +26 -1
- data/app/models/katello/flatpak_remote.rb +0 -1
- data/app/models/katello/flatpak_remote_repository.rb +24 -0
- data/app/models/katello/glue/pulp/repos.rb +1 -1
- data/app/models/katello/root_repository.rb +1 -0
- data/app/presenters/katello/flatpak_remote_mirror_status_presenter.rb +41 -0
- data/app/services/katello/repository_type_manager.rb +2 -0
- data/app/views/foreman/job_templates/flatpak_install.erb +17 -2
- data/app/views/foreman/job_templates/flatpak_login_action.erb +17 -3
- data/app/views/foreman/job_templates/install_errata_by_search_query.erb +1 -1
- data/app/views/foreman/job_templates/install_errata_by_search_query_-_katello_ansible_default.erb +1 -1
- data/app/views/katello/api/v2/flatpak_remote_repositories/base.json.rabl +3 -1
- data/app/views/katello/api/v2/flatpak_remotes/base.json.rabl +5 -0
- data/app/views/katello/api/v2/flatpak_remotes/permissions.json.rabl +1 -0
- data/config/routes/api/v2.rb +1 -1
- data/config/routes.rb +3 -0
- data/db/migrate/20250613210050_use_big_int_for_erratum_packages_id.rb +11 -0
- data/db/seeds.d/108-subcription-bookmarks.rb +2 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/content-hosts.html +1 -1
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/errata/views/errata.html +5 -1
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +4 -5
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/bn.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/bn_IN.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ca.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/cs_CZ.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/de.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/de_AT.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/de_DE.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/el.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/en_GB.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/en_US.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/es.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/et_EE.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/fr.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/gl.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/gu.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/he_IL.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/hi.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/id.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/it.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ja.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ka.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/kn.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ko.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ml_IN.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/mr.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/nl_NL.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/or.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/pa.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/pl.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/pl_PL.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/pt.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/pt_BR.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ro.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ro_RO.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ru.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/sl.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/sv_SE.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ta.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ta_IN.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/te.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/tr.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/vi.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/vi_VN.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/zh.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/zh_CN.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/zh_TW.po +6 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/new-repository.controller.js +13 -3
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/discovery/views/discovery.html +3 -0
- data/engines/bastion_katello/lib/bastion_katello/engine.rb +2 -0
- data/lib/katello/engine.rb +0 -1
- data/lib/katello/permission_creator.rb +1 -1
- data/lib/katello/plugin.rb +26 -2
- data/lib/katello/version.rb +1 -1
- data/lib/katello.rb +0 -1
- data/lib/proxy_api/container_gateway.rb +24 -0
- data/locale/action_names.rb +186 -0
- data/locale/bn/LC_MESSAGES/katello.mo +0 -0
- data/locale/bn/katello.po +148 -4
- data/locale/bn/katello.po.time_stamp +0 -0
- data/locale/bn_IN/LC_MESSAGES/katello.mo +0 -0
- data/locale/bn_IN/katello.po +148 -4
- data/locale/bn_IN/katello.po.time_stamp +0 -0
- data/locale/ca/LC_MESSAGES/katello.mo +0 -0
- data/locale/ca/katello.po +148 -4
- data/locale/ca/katello.po.time_stamp +0 -0
- data/locale/cs/LC_MESSAGES/katello.mo +0 -0
- data/locale/cs/katello.po +148 -4
- data/locale/cs/katello.po.time_stamp +0 -0
- data/locale/cs_CZ/LC_MESSAGES/katello.mo +0 -0
- data/locale/cs_CZ/katello.po +148 -4
- data/locale/cs_CZ/katello.po.time_stamp +0 -0
- data/locale/de/katello.po +147 -3
- data/locale/de/katello.po.time_stamp +0 -0
- data/locale/de_AT/LC_MESSAGES/katello.mo +0 -0
- data/locale/de_AT/katello.po +148 -4
- data/locale/de_AT/katello.po.time_stamp +0 -0
- data/locale/de_DE/LC_MESSAGES/katello.mo +0 -0
- data/locale/de_DE/katello.po +148 -4
- data/locale/de_DE/katello.po.time_stamp +0 -0
- data/locale/el/LC_MESSAGES/katello.mo +0 -0
- data/locale/el/katello.po +148 -4
- data/locale/el/katello.po.time_stamp +0 -0
- data/locale/en/LC_MESSAGES/katello.mo +0 -0
- data/locale/en/katello.po +148 -4
- data/locale/en/katello.po.time_stamp +0 -0
- data/locale/en_GB/LC_MESSAGES/katello.mo +0 -0
- data/locale/en_GB/katello.po +148 -4
- data/locale/en_GB/katello.po.time_stamp +0 -0
- data/locale/en_US/LC_MESSAGES/katello.mo +0 -0
- data/locale/en_US/katello.po +148 -4
- data/locale/en_US/katello.po.time_stamp +0 -0
- data/locale/es/katello.po +147 -3
- data/locale/es/katello.po.time_stamp +0 -0
- data/locale/et_EE/LC_MESSAGES/katello.mo +0 -0
- data/locale/et_EE/katello.po +148 -4
- data/locale/et_EE/katello.po.time_stamp +0 -0
- data/locale/fr/katello.po +147 -3
- data/locale/fr/katello.po.time_stamp +0 -0
- data/locale/gl/LC_MESSAGES/katello.mo +0 -0
- data/locale/gl/katello.po +148 -4
- data/locale/gl/katello.po.time_stamp +0 -0
- data/locale/gu/LC_MESSAGES/katello.mo +0 -0
- data/locale/gu/katello.po +148 -4
- data/locale/gu/katello.po.time_stamp +0 -0
- data/locale/he_IL/LC_MESSAGES/katello.mo +0 -0
- data/locale/he_IL/katello.po +148 -4
- data/locale/he_IL/katello.po.time_stamp +0 -0
- data/locale/hi/LC_MESSAGES/katello.mo +0 -0
- data/locale/hi/katello.po +148 -4
- data/locale/hi/katello.po.time_stamp +0 -0
- data/locale/id/LC_MESSAGES/katello.mo +0 -0
- data/locale/id/katello.po +148 -4
- data/locale/id/katello.po.time_stamp +0 -0
- data/locale/it/LC_MESSAGES/katello.mo +0 -0
- data/locale/it/katello.po +148 -4
- data/locale/it/katello.po.time_stamp +0 -0
- data/locale/ja/katello.po +147 -3
- data/locale/ja/katello.po.time_stamp +0 -0
- data/locale/ka/katello.po +147 -3
- data/locale/ka/katello.po.time_stamp +0 -0
- data/locale/katello.pot +703 -428
- data/locale/kn/LC_MESSAGES/katello.mo +0 -0
- data/locale/kn/katello.po +148 -4
- data/locale/kn/katello.po.time_stamp +0 -0
- data/locale/ko/katello.po +147 -3
- data/locale/ko/katello.po.time_stamp +0 -0
- data/locale/ml_IN/LC_MESSAGES/katello.mo +0 -0
- data/locale/ml_IN/katello.po +148 -4
- data/locale/ml_IN/katello.po.time_stamp +0 -0
- data/locale/mr/LC_MESSAGES/katello.mo +0 -0
- data/locale/mr/katello.po +148 -4
- data/locale/mr/katello.po.time_stamp +0 -0
- data/locale/nl_NL/LC_MESSAGES/katello.mo +0 -0
- data/locale/nl_NL/katello.po +148 -4
- data/locale/nl_NL/katello.po.time_stamp +0 -0
- data/locale/or/LC_MESSAGES/katello.mo +0 -0
- data/locale/or/katello.po +148 -4
- data/locale/or/katello.po.time_stamp +0 -0
- data/locale/pa/LC_MESSAGES/katello.mo +0 -0
- data/locale/pa/katello.po +148 -4
- data/locale/pa/katello.po.time_stamp +0 -0
- data/locale/pl/LC_MESSAGES/katello.mo +0 -0
- data/locale/pl/katello.po +148 -4
- data/locale/pl/katello.po.time_stamp +0 -0
- data/locale/pl_PL/LC_MESSAGES/katello.mo +0 -0
- data/locale/pl_PL/katello.po +148 -4
- data/locale/pl_PL/katello.po.time_stamp +0 -0
- data/locale/pt/LC_MESSAGES/katello.mo +0 -0
- data/locale/pt/katello.po +148 -4
- data/locale/pt/katello.po.time_stamp +0 -0
- data/locale/pt_BR/katello.po +147 -3
- data/locale/pt_BR/katello.po.time_stamp +0 -0
- data/locale/ro/LC_MESSAGES/katello.mo +0 -0
- data/locale/ro/katello.po +148 -4
- data/locale/ro/katello.po.time_stamp +0 -0
- data/locale/ro_RO/LC_MESSAGES/katello.mo +0 -0
- data/locale/ro_RO/katello.po +148 -4
- data/locale/ro_RO/katello.po.time_stamp +0 -0
- data/locale/ru/LC_MESSAGES/katello.mo +0 -0
- data/locale/ru/katello.po +148 -4
- data/locale/ru/katello.po.time_stamp +0 -0
- data/locale/sl/LC_MESSAGES/katello.mo +0 -0
- data/locale/sl/katello.po +148 -4
- data/locale/sl/katello.po.time_stamp +0 -0
- data/locale/sv_SE/LC_MESSAGES/katello.mo +0 -0
- data/locale/sv_SE/katello.po +148 -4
- data/locale/sv_SE/katello.po.time_stamp +0 -0
- data/locale/ta/LC_MESSAGES/katello.mo +0 -0
- data/locale/ta/katello.po +148 -4
- data/locale/ta/katello.po.time_stamp +0 -0
- data/locale/ta_IN/LC_MESSAGES/katello.mo +0 -0
- data/locale/ta_IN/katello.po +148 -4
- data/locale/ta_IN/katello.po.time_stamp +0 -0
- data/locale/te/LC_MESSAGES/katello.mo +0 -0
- data/locale/te/katello.po +148 -4
- data/locale/te/katello.po.time_stamp +0 -0
- data/locale/tr/LC_MESSAGES/katello.mo +0 -0
- data/locale/tr/katello.po +148 -4
- data/locale/tr/katello.po.time_stamp +0 -0
- data/locale/vi/LC_MESSAGES/katello.mo +0 -0
- data/locale/vi/katello.po +148 -4
- data/locale/vi/katello.po.time_stamp +0 -0
- data/locale/vi_VN/LC_MESSAGES/katello.mo +0 -0
- data/locale/vi_VN/katello.po +148 -4
- data/locale/vi_VN/katello.po.time_stamp +0 -0
- data/locale/zh/LC_MESSAGES/katello.mo +0 -0
- data/locale/zh/katello.po +148 -4
- data/locale/zh/katello.po.time_stamp +0 -0
- data/locale/zh_CN/katello.po +147 -3
- data/locale/zh_CN/katello.po.time_stamp +0 -0
- data/locale/zh_TW/LC_MESSAGES/katello.mo +0 -0
- data/locale/zh_TW/katello.po +148 -4
- data/locale/zh_TW/katello.po.time_stamp +0 -0
- data/package.json +0 -1
- data/webpack/components/Content/Details/__tests__/__snapshots__/ContentDetails.test.js.snap +2 -2
- data/webpack/components/OptionTooltip/OptionTooltip.scss +1 -1
- data/webpack/components/extensions/HostDetails/ActionsBar/index.js +5 -5
- data/webpack/components/extensions/HostDetails/Tabs/PackagesTab/PackagesTab.js +6 -1
- data/webpack/components/extensions/Hosts/ActionsBar/index.js +11 -0
- data/webpack/components/extensions/Hosts/BulkActions/BulkChangeHostCVModal/BulkChangeHostCVModal.js +1 -1
- data/webpack/components/extensions/Hosts/BulkActions/BulkChangeHostCVModal/actions.js +1 -2
- data/webpack/components/extensions/Hosts/BulkActions/BulkErrataWizard/04_ReviewFooter.js +1 -1
- data/webpack/components/extensions/Hosts/BulkActions/BulkPackagesWizard/04_ReviewFooter.js +1 -1
- data/webpack/components/extensions/Hosts/BulkActions/BulkRepositorySetsWizard/01_BulkRepositorySetsTable.js +371 -0
- data/webpack/components/extensions/Hosts/BulkActions/BulkRepositorySetsWizard/03_Review.js +79 -0
- data/webpack/components/extensions/Hosts/BulkActions/BulkRepositorySetsWizard/03_ReviewFooter.js +73 -0
- data/webpack/components/extensions/Hosts/BulkActions/BulkRepositorySetsWizard/BulkRepositorySetsWizard.js +170 -0
- data/webpack/components/extensions/Hosts/BulkActions/BulkRepositorySetsWizard/actions.js +23 -0
- data/webpack/components/extensions/Hosts/BulkActions/BulkRepositorySetsWizard/helpers.js +28 -0
- data/webpack/components/extensions/Hosts/BulkActions/BulkRepositorySetsWizard/index.js +23 -0
- data/webpack/components/extensions/RegistrationCommands/fields/SetupContainerRegistryCerts.js +39 -0
- data/webpack/components/extensions/RegistrationCommands/index.js +7 -0
- data/webpack/components/pf3Table/formatters/ellipsisCellFormatter.js +3 -2
- data/webpack/containers/Application/config.js +11 -0
- data/webpack/global_index.js +3 -1
- data/webpack/scenes/ContentViews/Details/Filters/Rules/Package/AddEditPackageRuleModal.js +2 -0
- data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersions.js +9 -6
- data/webpack/scenes/ContentViews/Table/ContentViewsTable.js +4 -0
- data/webpack/scenes/FlatpakRemotes/CreateEdit/CreateFlatpakRemoteModal.js +30 -0
- data/webpack/scenes/FlatpakRemotes/CreateEdit/EditFlatpakRemotesModal.js +38 -0
- data/webpack/scenes/FlatpakRemotes/CreateEdit/FlatpakRemoteform.js +218 -0
- data/webpack/scenes/FlatpakRemotes/CreateEdit/__tests__/flatpakRemoteform.test.js +117 -0
- data/webpack/scenes/FlatpakRemotes/Delete/DeleteFlatpakModal.js +59 -0
- data/webpack/scenes/FlatpakRemotes/Details/FlatpakRemoteDetailActions.js +87 -0
- data/webpack/scenes/FlatpakRemotes/Details/FlatpakRemoteDetailReducers.js +23 -0
- data/webpack/scenes/FlatpakRemotes/Details/FlatpakRemoteDetailSelectors.js +16 -0
- data/webpack/scenes/FlatpakRemotes/Details/FlatpakRemoteDetails.js +167 -0
- data/webpack/scenes/FlatpakRemotes/Details/Mirror/MirrorRepositoryModal.js +135 -0
- data/webpack/scenes/FlatpakRemotes/Details/Mirror/__tests__/mirrorRepositoryModal.test.js +167 -0
- data/webpack/scenes/FlatpakRemotes/Details/RemoteRepositories/RemoteRepositoriesTable.js +171 -0
- data/webpack/scenes/FlatpakRemotes/Details/__tests__/flatpakRemoteDetails.fixtures.json +58 -0
- data/webpack/scenes/FlatpakRemotes/Details/__tests__/flatpakRemoteDetails.test.js +90 -0
- data/webpack/scenes/FlatpakRemotes/Details/index.js +4 -0
- data/webpack/scenes/FlatpakRemotes/FlatpakRemotesActions.js +26 -0
- data/webpack/scenes/FlatpakRemotes/FlatpakRemotesConstants.js +15 -0
- data/webpack/scenes/FlatpakRemotes/FlatpakRemotesPage.js +202 -0
- data/webpack/scenes/FlatpakRemotes/FlatpakRemotesSelectors.js +24 -0
- data/webpack/scenes/FlatpakRemotes/__tests__/flatpakRemotesList.fixtures.json +55 -0
- data/webpack/scenes/FlatpakRemotes/__tests__/flatpakRemotesPage.test.js +74 -0
- data/webpack/scenes/FlatpakRemotes/index.js +4 -0
- data/webpack/scenes/Hosts/ChangeContentSource/components/Hosts.js +2 -2
- data/webpack/scenes/RedHatRepositories/components/RecommendedRepositorySetsToggler.scss +1 -1
- data/webpack/scenes/RedHatRepositories/index.scss +1 -1
- data/webpack/scenes/Settings/SettingsSelectors.js +3 -3
- data/webpack/scenes/Settings/index.js +1 -3
- data/webpack/scenes/Subscriptions/Details/__tests__/__snapshots__/SubscriptionDetails.test.js.snap +2 -2
- data/webpack/scenes/Subscriptions/SubscriptionsPage.scss +1 -1
- data/webpack/scenes/Subscriptions/__tests__/SubscriptionsReducer.test.js +0 -21
- data/webpack/scenes/Subscriptions/__tests__/__snapshots__/SubscriptionsReducer.test.js.snap +0 -44
- data/webpack/scenes/Subscriptions/index.js +1 -3
- metadata +87 -21
- data/webpack/scenes/Settings/SettingsConstants.js +0 -2
- 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,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;
|