katello 3.18.0.rc1 → 4.0.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of katello might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/app/controllers/katello/api/rhsm/candlepin_dynflow_proxy_controller.rb +0 -19
- data/app/controllers/katello/api/rhsm/candlepin_proxies_controller.rb +1 -3
- data/app/controllers/katello/api/v2/api_controller.rb +1 -2
- data/app/controllers/katello/api/v2/capsule_content_controller.rb +2 -2
- data/app/controllers/katello/api/v2/content_credentials_controller.rb +24 -24
- data/app/controllers/katello/api/v2/content_export_incrementals_controller.rb +98 -0
- data/app/controllers/katello/api/v2/content_exports_controller.rb +88 -0
- data/app/controllers/katello/api/v2/content_imports_controller.rb +59 -0
- data/app/controllers/katello/api/v2/content_view_filters_controller.rb +16 -7
- data/app/controllers/katello/api/v2/content_view_versions_controller.rb +57 -92
- data/app/controllers/katello/api/v2/content_views_controller.rb +12 -3
- data/app/controllers/katello/api/v2/host_debs_controller.rb +1 -0
- data/app/controllers/katello/api/v2/host_errata_controller.rb +2 -2
- data/app/controllers/katello/api/v2/host_subscriptions_controller.rb +2 -3
- data/app/controllers/katello/api/v2/hosts_bulk_actions_controller.rb +20 -7
- data/app/controllers/katello/api/v2/products_bulk_actions_controller.rb +1 -1
- data/app/controllers/katello/api/v2/products_controller.rb +9 -9
- data/app/controllers/katello/api/v2/repositories_controller.rb +5 -19
- data/app/controllers/katello/api/v2/repository_sets_controller.rb +24 -14
- data/app/controllers/katello/api/v2/simple_content_access_controller.rb +34 -0
- data/app/controllers/katello/api/v2/subscriptions_controller.rb +1 -1
- data/app/controllers/katello/api/v2/upstream_subscriptions_controller.rb +8 -4
- data/app/controllers/katello/concerns/api/v2/authorization.rb +10 -0
- data/app/controllers/katello/concerns/api/v2/bulk_hosts_extensions.rb +22 -18
- data/app/controllers/katello/concerns/authorization/api/v2/content_views_controller.rb +1 -1
- data/app/controllers/katello/concerns/registration_controller_extensions.rb +16 -0
- data/app/helpers/katello/sync_management_helper.rb +0 -2
- data/app/lib/actions/candlepin/environment/create.rb +1 -1
- data/app/lib/actions/candlepin/environment/set_content.rb +1 -1
- data/app/lib/actions/helpers/smart_proxy_sync_history_helper.rb +24 -0
- data/app/lib/actions/katello/activation_key/create.rb +9 -11
- data/app/lib/actions/katello/applicability/hosts/bulk_generate.rb +6 -2
- data/app/lib/actions/katello/capsule_content/sync.rb +8 -8
- data/app/lib/actions/katello/capsule_content/sync_capsule.rb +31 -8
- data/app/lib/actions/katello/check_matching_content.rb +17 -0
- data/app/lib/actions/katello/content_view/environment_create.rb +6 -8
- data/app/lib/actions/katello/content_view/promote_to_environment.rb +1 -1
- data/app/lib/actions/katello/content_view/publish.rb +6 -5
- data/app/lib/actions/katello/content_view_version/import.rb +5 -11
- data/app/lib/actions/katello/content_view_version/import_library.rb +17 -0
- data/app/lib/actions/katello/content_view_version/incremental_update.rb +30 -10
- data/app/lib/actions/katello/host/hypervisors_update.rb +4 -4
- data/app/lib/actions/katello/host/update_system_purpose.rb +1 -1
- data/app/lib/actions/katello/host/upload_package_profile.rb +3 -1
- data/app/lib/actions/katello/host/upload_profiles.rb +8 -6
- data/app/lib/actions/katello/organization/create.rb +3 -5
- data/app/lib/actions/katello/organization/destroy.rb +1 -1
- data/app/lib/actions/katello/organization/manifest_delete.rb +3 -5
- data/app/lib/actions/katello/organization/manifest_import.rb +1 -1
- data/app/lib/actions/katello/organization/manifest_refresh.rb +1 -1
- data/app/lib/actions/katello/repository/check_matching_content.rb +3 -1
- data/app/lib/actions/katello/repository/clone_contents.rb +8 -11
- data/app/lib/actions/katello/repository/create.rb +0 -8
- data/app/lib/actions/katello/repository/filtered_index_content.rb +3 -0
- data/app/lib/actions/katello/repository/import_upload.rb +2 -0
- data/app/lib/actions/katello/repository/index_content.rb +1 -0
- data/app/lib/actions/katello/repository/multi_clone_contents.rb +9 -12
- data/app/lib/actions/katello/repository/remove_content.rb +1 -1
- data/app/lib/actions/katello/repository/sync.rb +3 -1
- data/app/lib/actions/katello/repository/update.rb +1 -8
- data/app/lib/actions/katello/repository/upload_files.rb +1 -0
- data/app/lib/actions/middleware/execute_if_contents_changed.rb +4 -1
- data/app/lib/actions/middleware/record_smart_proxy_sync_history.rb +35 -0
- data/app/lib/actions/pulp/consumer/sync_capsule.rb +4 -2
- data/app/lib/actions/pulp/orchestration/repository/refresh_repos.rb +0 -6
- data/app/lib/actions/pulp/repository/distributor_publish.rb +1 -1
- data/app/lib/actions/pulp3/abstract_async_task.rb +1 -0
- data/app/lib/actions/pulp3/capsule_content/refresh_distribution.rb +3 -3
- data/app/lib/actions/pulp3/capsule_content/sync.rb +1 -0
- data/app/lib/actions/pulp3/content_migration.rb +10 -0
- data/app/lib/actions/pulp3/content_migration_presenter.rb +59 -0
- data/app/lib/actions/pulp3/content_view/delete_repository_references.rb +1 -1
- data/app/lib/actions/pulp3/content_view_version/export.rb +6 -1
- data/app/lib/actions/pulp3/import_migration.rb +6 -1
- data/app/lib/actions/pulp3/orchestration/content_view_version/copy_version_units_to_library.rb +2 -1
- data/app/lib/actions/pulp3/orchestration/content_view_version/export.rb +30 -9
- data/app/lib/actions/pulp3/orchestration/content_view_version/export_library.rb +60 -0
- data/app/lib/actions/pulp3/orchestration/content_view_version/import.rb +0 -4
- data/app/lib/actions/pulp3/orchestration/repository/generate_metadata.rb +4 -1
- data/app/lib/actions/pulp3/orchestration/repository/import_upload.rb +16 -3
- data/app/lib/actions/pulp3/orchestration/repository/refresh_repos.rb +1 -6
- data/app/lib/actions/pulp3/repository/copy_content.rb +1 -1
- data/app/lib/actions/pulp3/repository/delete.rb +1 -1
- data/app/lib/actions/pulp3/repository/save_version.rb +1 -1
- data/app/lib/actions/pulp3/repository/upload_tag.rb +18 -0
- data/app/lib/katello/concerns/base_template_scope_extensions.rb +8 -0
- data/app/lib/katello/event_daemon/monitor.rb +53 -0
- data/app/lib/katello/event_daemon/runner.rb +99 -0
- data/app/lib/katello/logging.rb +32 -0
- data/app/lib/katello/messaging/connection.rb +1 -7
- data/app/lib/katello/validators/content_view_puppet_module_validator.rb +1 -1
- data/app/models/katello/activation_key.rb +2 -2
- data/app/models/katello/authorization/content_view_filter.rb +15 -0
- data/app/models/katello/authorization/content_view_version.rb +25 -2
- data/app/models/katello/authorization/content_view_version_export_history.rb +1 -1
- data/app/models/katello/authorization/organization.rb +8 -0
- data/app/models/katello/candlepin/repository_mapper.rb +1 -1
- data/app/models/katello/concerns/operatingsystem_extensions.rb +2 -0
- data/app/models/katello/concerns/organization_extensions.rb +2 -2
- data/app/models/katello/concerns/pulp_database_unit.rb +7 -0
- data/app/models/katello/concerns/redhat_extensions.rb +2 -2
- data/app/models/katello/concerns/smart_proxy_extensions.rb +33 -5
- data/app/models/katello/content_migration_progress.rb +4 -0
- data/app/models/katello/content_view.rb +35 -5
- data/app/models/katello/content_view_environment.rb +2 -2
- data/app/models/katello/content_view_filter.rb +5 -0
- data/app/models/katello/content_view_history.rb +2 -1
- data/app/models/katello/content_view_package_filter.rb +1 -1
- data/app/models/katello/content_view_puppet_environment.rb +2 -2
- data/app/models/katello/content_view_puppet_module.rb +8 -0
- data/app/models/katello/content_view_repository.rb +13 -1
- data/app/models/katello/content_view_version.rb +2 -1
- data/app/models/katello/content_view_version_export_history.rb +26 -1
- data/app/models/katello/erratum.rb +3 -1
- data/app/models/katello/glue/candlepin/pool.rb +2 -0
- data/app/models/katello/glue/pulp/repo.rb +0 -6
- data/app/models/katello/glue/pulp/repos.rb +1 -22
- data/app/models/katello/host/subscription_facet.rb +4 -0
- data/app/models/katello/ping.rb +11 -6
- data/app/models/katello/pool.rb +5 -0
- data/app/models/katello/product.rb +3 -3
- data/app/models/katello/repository.rb +36 -3
- data/app/models/katello/smart_proxy_sync_history.rb +8 -0
- data/app/models/katello/subscription_status.rb +3 -2
- data/app/presenters/katello/host_subscription_presenter.rb +3 -4
- data/app/presenters/katello/host_subscriptions_presenter.rb +24 -0
- data/app/services/katello/applicability/applicable_content_helper.rb +44 -15
- data/app/services/katello/candlepin_event_listener.rb +11 -19
- data/app/services/katello/event_monitor/poller_thread.rb +2 -11
- data/app/services/katello/pulp/smart_proxy_repository.rb +0 -15
- data/app/services/katello/pulp3/api/docker.rb +4 -0
- data/app/services/katello/pulp3/content_view_version/export.rb +122 -6
- data/app/services/katello/pulp3/content_view_version/import.rb +37 -22
- data/app/services/katello/pulp3/content_view_version/import_export_common.rb +6 -16
- data/app/services/katello/pulp3/content_view_version/import_validator.rb +84 -0
- data/app/services/katello/pulp3/docker_manifest.rb +1 -0
- data/app/services/katello/pulp3/docker_tag.rb +1 -0
- data/app/services/katello/pulp3/migration.rb +51 -10
- data/app/services/katello/pulp3/repository.rb +13 -4
- data/app/services/katello/pulp3/repository/docker.rb +5 -0
- data/app/services/katello/pulp3/repository/yum.rb +15 -10
- data/app/services/katello/pulp3/task.rb +7 -3
- data/app/services/katello/pulp3/task_group.rb +10 -0
- data/app/services/katello/repository_type.rb +3 -2
- data/app/services/katello/smart_proxy_helper.rb +9 -0
- data/app/views/foreman/hosts/_registration.html.erb +12 -0
- data/app/views/foreman/smart_proxies/_content_tab.html.erb +4 -47
- data/app/views/foreman/smart_proxies/show.html.erb +1 -1
- data/app/views/katello/api/v2/capsule_content/sync_status.json.rabl +22 -25
- data/app/views/katello/api/v2/content_view_version_export_histories/show.json.rabl +1 -0
- data/app/views/katello/api/v2/content_views/base.json.rabl +1 -0
- data/app/views/katello/api/v2/content_views/show.json.rabl +6 -0
- data/app/views/katello/api/v2/organizations/show.json.rabl +7 -9
- data/app/views/katello/layouts/react.html.erb +3 -2
- data/app/views/overrides/activation_keys/_host_tab_pane.html.erb +1 -5
- data/app/views/overrides/organizations/_edit_override.html.erb +1 -4
- data/app/views/overrides/smart_proxies/_environment_tab.html.erb +1 -1
- data/app/views/overrides/smart_proxies/_environment_tab_pane.html.erb +1 -1
- data/config/katello.yaml.example +0 -3
- data/config/routes/api/v2.rb +31 -13
- data/db/migrate/20150930183738_migrate_content_hosts.rb +1 -1
- data/db/migrate/20191204214919_add_content_view_version_counts.rb +0 -1
- data/db/migrate/20200514092553_move_katello_fields_from_hostgroups.katello.rb +5 -2
- data/db/migrate/20200929200357_create_katello_smart_proxy_sync_history.rb +13 -0
- data/db/migrate/20201021150008_add_import_only_to_katello_content_view.rb +5 -0
- data/db/migrate/20201119211133_pulp3_migration_progress.rb +9 -0
- data/db/migrate/20210119162528_delete_puppet_and_ostree_repos.rb +56 -0
- data/db/migrate/20210128231228_add_type_and_from_cvv_to_cvv_export_history.rb +14 -0
- data/db/migrate/20210201163238_migrate_background_download_policy_to_migrate.rb +7 -0
- data/db/seeds.d/104-proxy.rb +1 -1
- data/db/seeds.d/111-upgrade_tasks.rb +2 -1
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/capsule-content/capsule-content.controller.js +1 -1
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/common/views/katello-agent-notice.html +1 -1
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/bulk/views/content-hosts-bulk-system-purpose-modal.html +35 -40
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content-host-register-os-client.directive.js +17 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/views/content-host-info.html +2 -2
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/content-hosts.html +2 -2
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/register-client.html +12 -5
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/register-deb-client.html +38 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/register-oracle-client.html +5 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/register-sles-client.html +28 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/views/register.html +14 -11
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/content-views.controller.js +6 -2
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/deletion/content-view-version-deletion-activation-keys.controller.js +8 -3
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/deletion/content-view-version-deletion-content-hosts.controller.js +9 -3
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/content-view-details.controller.js +12 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/filters/views/package-filter-details.html +2 -2
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/views/content-view-details.html +7 -7
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/views/content-view-info.html +7 -1
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/views/content-view-publish.html +4 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/new/content-view-new.controller.js +17 -3
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/new/views/content-view-new.html +16 -2
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/views/content-views.html +5 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +78 -7
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/de.po +17 -20
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/es.po +17 -24
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/fr.po +1292 -1170
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/it.po +17 -20
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ja.po +858 -807
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ko.po +18 -19
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/pt_BR.po +17 -24
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/ru.po +17 -18
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/zh_CN.po +986 -971
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/locale/zh_TW.po +19 -20
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/translations.js +9 -9
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-info.controller.js +2 -2
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-info.html +1 -1
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/download-policy.service.js +0 -1
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/views/new-repository.html +1 -1
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/repository-types.service.js +8 -1
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/products.controller.js +2 -2
- data/lib/katello/engine.rb +6 -6
- data/lib/katello/middleware/event_daemon.rb +1 -1
- data/lib/katello/permission_creator.rb +35 -14
- data/lib/katello/plugin.rb +8 -3
- data/lib/katello/tasks/delete_orphaned_content.rake +1 -3
- data/lib/katello/tasks/jenkins.rake +1 -1
- data/lib/katello/tasks/pulp3_content_switchover.rake +1 -1
- data/lib/katello/tasks/pulp3_migration.rake +18 -6
- data/lib/katello/tasks/pulp3_migration_abort.rake +22 -0
- data/lib/katello/tasks/pulp3_migration_stats.rake +28 -8
- data/lib/katello/tasks/pulp3_post_migration_check.rake +1 -3
- data/lib/katello/tasks/receptor/extract_orgs.rake +1 -1
- data/lib/katello/tasks/reimport.rake +1 -1
- data/lib/katello/tasks/repository.rake +3 -5
- data/lib/katello/tasks/upgrades/4.0/remove_ostree_puppet_content.rake +16 -0
- data/lib/katello/version.rb +1 -1
- data/lib/proxy_api/container_gateway.rb +21 -0
- data/locale/action_names.rb +51 -51
- data/locale/bn/katello.edit.po +0 -0
- data/locale/bn/katello.po +136 -51
- data/locale/cs/katello.edit.po +0 -0
- data/locale/cs/katello.po +136 -49
- data/locale/de/katello.edit.po +0 -0
- data/locale/de/katello.po +136 -48
- data/locale/en/katello.edit.po +0 -0
- data/locale/en/katello.po +136 -48
- data/locale/es/katello.edit.po +0 -0
- data/locale/es/katello.po +136 -48
- data/locale/fr/katello.edit.po +0 -0
- data/locale/fr/katello.po +136 -48
- data/locale/gu/katello.edit.po +0 -0
- data/locale/gu/katello.po +136 -51
- data/locale/hi/katello.edit.po +0 -0
- data/locale/hi/katello.po +136 -51
- data/locale/it/katello.edit.po +0 -0
- data/locale/it/katello.po +136 -48
- data/locale/ja/katello.edit.po +0 -0
- data/locale/ja/katello.po +136 -48
- data/locale/katello.pot +941 -767
- data/locale/kn/katello.edit.po +0 -0
- data/locale/kn/katello.po +136 -51
- data/locale/ko/katello.edit.po +0 -0
- data/locale/ko/katello.po +136 -48
- data/locale/mr/katello.edit.po +0 -0
- data/locale/mr/katello.po +136 -51
- data/locale/or/katello.edit.po +0 -0
- data/locale/or/katello.po +136 -51
- data/locale/pa/katello.edit.po +0 -0
- data/locale/pa/katello.po +136 -51
- data/locale/pt/katello.edit.po +0 -0
- data/locale/pt/katello.po +136 -51
- data/locale/pt_BR/katello.edit.po +0 -0
- data/locale/pt_BR/katello.po +136 -48
- data/locale/ru/katello.edit.po +0 -0
- data/locale/ru/katello.po +136 -48
- data/locale/ta/katello.edit.po +0 -0
- data/locale/ta/katello.po +136 -51
- data/locale/te/katello.edit.po +0 -0
- data/locale/te/katello.po +136 -51
- data/locale/zh_CN/katello.edit.po +0 -0
- data/locale/zh_CN/katello.po +136 -48
- data/locale/zh_TW/katello.edit.po +0 -0
- data/locale/zh_TW/katello.po +136 -48
- data/package.json +1 -1
- data/webpack/__mocks__/foremanReact/Root/Context/ForemanContext.js +0 -1
- data/webpack/__mocks__/foremanReact/components/Pagination/PaginationHooks.js +2 -0
- data/webpack/__mocks__/foremanReact/components/common/dates/LongDateTime.js +5 -0
- data/webpack/{scenes/ContentViews/Details/Repositories → components/SelectableDropdown}/SelectableDropdown.js +20 -3
- data/webpack/components/SelectableDropdown/__tests__/SelectableDropdown.test.js +45 -0
- data/webpack/components/SelectableDropdown/index.js +3 -0
- data/webpack/components/Table/TableWrapper.js +2 -1
- data/webpack/components/Table/helpers.js +14 -0
- data/webpack/components/TypeAhead/TypeAhead.js +2 -1
- data/webpack/components/TypeAhead/pf3Search/TypeAheadSearch.js +2 -1
- data/webpack/components/TypeAhead/pf4Search/TypeAheadSearch.js +0 -1
- data/webpack/containers/Application/overrides.scss +6 -0
- data/webpack/index.js +6 -0
- data/webpack/redux/actions/RedHatRepositories/helpers.js +5 -5
- data/webpack/scenes/ContentViews/ContentViewsActions.js +31 -2
- data/webpack/scenes/ContentViews/ContentViewsConstants.js +5 -1
- data/webpack/scenes/ContentViews/Copy/ContentViewCopySelectors.js +16 -0
- data/webpack/scenes/ContentViews/Copy/CopyContentViewForm.js +77 -0
- data/webpack/scenes/ContentViews/Copy/CopyContentViewModal.js +44 -0
- data/webpack/scenes/ContentViews/Copy/__tests__/contentViewCopyResult.fixtures.json +42 -0
- data/webpack/scenes/ContentViews/Copy/__tests__/copyContentView.test.js +39 -0
- data/webpack/scenes/ContentViews/Copy/index.js +4 -0
- data/webpack/scenes/ContentViews/Create/ContentViewCreateSelectors.js +16 -0
- data/webpack/scenes/ContentViews/Create/ContentViewFormComponents.js +58 -0
- data/webpack/scenes/ContentViews/Create/CreateContentViewForm.js +175 -0
- data/webpack/scenes/ContentViews/Create/CreateContentViewModal.js +27 -0
- data/webpack/scenes/ContentViews/Create/__tests__/contentViewCreateResult.fixtures.json +42 -0
- data/webpack/scenes/ContentViews/Create/__tests__/createContentView.test.js +92 -0
- data/webpack/scenes/ContentViews/Create/index.js +4 -0
- data/webpack/scenes/ContentViews/Details/ContentViewDetailActions.js +16 -0
- data/webpack/scenes/ContentViews/Details/ContentViewDetailSelectors.js +20 -1
- data/webpack/scenes/ContentViews/Details/ContentViewDetails.js +17 -7
- data/webpack/scenes/ContentViews/Details/ContentViewInfo.js +19 -13
- data/webpack/scenes/ContentViews/Details/Filters/ContentType.js +40 -0
- data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilters.js +124 -0
- data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilters.fixtures.json +134 -0
- data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilters.test.js +92 -0
- data/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js +44 -25
- data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewDetailRepos.test.js +17 -7
- data/webpack/scenes/ContentViews/Details/__tests__/contentViewDetail.test.js +24 -0
- data/webpack/scenes/ContentViews/Table/ContentViewsTable.js +53 -3
- data/webpack/scenes/ContentViews/Table/tableDataGenerator.js +4 -3
- data/webpack/scenes/ContentViews/__tests__/contentViewPage.test.js +41 -0
- data/webpack/scenes/ContentViews/helpers.js +13 -0
- data/webpack/scenes/SmartProxy/Content.js +17 -0
- data/webpack/scenes/SmartProxy/SmartProxyContentActions.js +11 -0
- data/webpack/scenes/SmartProxy/SmartProxyContentConstants.js +3 -0
- data/webpack/scenes/SmartProxy/SmartProxyContentSelectors.js +16 -0
- data/webpack/scenes/SmartProxy/SmartProxyContentTable.js +152 -0
- data/webpack/scenes/SmartProxy/__tests__/SmartProxyContentResult.fixtures.json +140 -0
- data/webpack/scenes/SmartProxy/__tests__/SmartProxyContentTest.js +38 -0
- data/webpack/scenes/SmartProxy/index.js +4 -0
- data/webpack/scenes/Subscriptions/Manifest/ManageManifestModal.js +13 -11
- data/webpack/scenes/Subscriptions/Manifest/ManifestActions.js +3 -3
- data/webpack/scenes/Subscriptions/Manifest/__tests__/ManifestActions.test.js +2 -2
- data/webpack/scenes/Subscriptions/Manifest/__tests__/SimpleContentAccess.test.js +2 -2
- data/webpack/test-utils/react-testing-lib-wrapper.js +8 -2
- data/webpack/utils/helpers.js +3 -0
- metadata +110 -31
- data/app/controllers/katello/api/v2/gpg_keys_controller.rb +0 -114
- data/app/overrides/disable_turbolinks_on_proxies_index.rb +0 -5
- data/app/services/katello/event_daemon.rb +0 -135
- data/app/services/katello/pulp/content_counts_calculator.rb +0 -60
- data/lib/katello/tasks/common.rake +0 -7
- data/lib/katello/tasks/reports.rake +0 -4
- data/lib/katello/tasks/upgrades/3.10/update_gpg_key_urls.rake +0 -32
- data/webpack/__mocks__/foremanReact/components/common/Fill/GlobalFill.js +0 -3
- data/webpack/components/TypeAhead/pf4Search/TypeAheadSearch.scss +0 -5
- data/webpack/scenes/ContentViews/Table/actionResolver.js +0 -28
@@ -0,0 +1,92 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import { renderWithRedux, patientlyWaitFor, fireEvent } from 'react-testing-lib-wrapper';
|
3
|
+
|
4
|
+
import api from '../../../../../services/api';
|
5
|
+
import nock, { nockInstance, assertNockRequest, mockAutocomplete, mockSetting } from '../../../../../test-utils/nockWrapper';
|
6
|
+
import ContentViewFilters from '../ContentViewFilters';
|
7
|
+
import CONTENT_VIEWS_KEY from '../../../ContentViewsConstants';
|
8
|
+
|
9
|
+
const cvFilterFixtures = require('./contentViewFilters.fixtures.json');
|
10
|
+
|
11
|
+
const cvFilters = api.getApiUrl('/content_view_filters');
|
12
|
+
const autocompleteUrl = '/content_view_filters/auto_complete_search';
|
13
|
+
const renderOptions = { apiNamespace: `${CONTENT_VIEWS_KEY}_1` };
|
14
|
+
|
15
|
+
let firstFilter;
|
16
|
+
let lastFilter;
|
17
|
+
let searchDelayScope;
|
18
|
+
let autoSearchScope;
|
19
|
+
beforeEach(() => {
|
20
|
+
const { results } = cvFilterFixtures;
|
21
|
+
[firstFilter] = results;
|
22
|
+
[lastFilter] = results.slice(-1);
|
23
|
+
searchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 500);
|
24
|
+
// Autosearch can cause some asynchronous issues with the typing timeout, using basic search
|
25
|
+
autoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing', false);
|
26
|
+
});
|
27
|
+
|
28
|
+
afterEach(() => {
|
29
|
+
assertNockRequest(searchDelayScope);
|
30
|
+
assertNockRequest(autoSearchScope);
|
31
|
+
nock.cleanAll();
|
32
|
+
});
|
33
|
+
|
34
|
+
test('Can call API and show filters on page load', async (done) => {
|
35
|
+
const { name, description } = firstFilter;
|
36
|
+
const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl);
|
37
|
+
|
38
|
+
const scope = nockInstance
|
39
|
+
.get(cvFilters)
|
40
|
+
.query(true)
|
41
|
+
.reply(200, cvFilterFixtures);
|
42
|
+
|
43
|
+
const { getByText, queryByText } =
|
44
|
+
renderWithRedux(<ContentViewFilters cvId={1} />, renderOptions);
|
45
|
+
|
46
|
+
// Nothing will show at first, page is loading
|
47
|
+
expect(queryByText(name)).toBeNull();
|
48
|
+
await patientlyWaitFor(() => {
|
49
|
+
expect(getByText(name)).toBeInTheDocument();
|
50
|
+
expect(getByText(description)).toBeInTheDocument();
|
51
|
+
expect(getByText(lastFilter.name)).toBeInTheDocument();
|
52
|
+
});
|
53
|
+
|
54
|
+
assertNockRequest(autocompleteScope);
|
55
|
+
assertNockRequest(scope, done);
|
56
|
+
});
|
57
|
+
|
58
|
+
test('Can search for filter', async (done) => {
|
59
|
+
const { name, description } = firstFilter;
|
60
|
+
const searchQueryMatcher = actualParams => actualParams?.search?.includes(name);
|
61
|
+
const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl);
|
62
|
+
const withSearchScope = mockAutocomplete(nockInstance, autocompleteUrl, searchQueryMatcher);
|
63
|
+
const initialScope = nockInstance
|
64
|
+
.get(cvFilters)
|
65
|
+
.query(true)
|
66
|
+
.reply(200, cvFilterFixtures);
|
67
|
+
const searchResultScope = nockInstance
|
68
|
+
.get(cvFilters)
|
69
|
+
.query(searchQueryMatcher)
|
70
|
+
.reply(200, { results: [firstFilter] });
|
71
|
+
|
72
|
+
const { queryByText, getByLabelText, getByText } = renderWithRedux(
|
73
|
+
<ContentViewFilters cvId={1} />,
|
74
|
+
renderOptions,
|
75
|
+
);
|
76
|
+
|
77
|
+
// Looking for description because the name is in the search bar and could match
|
78
|
+
await patientlyWaitFor(() => expect(getByText(description)).toBeInTheDocument());
|
79
|
+
// Search for a filter by name
|
80
|
+
fireEvent.change(getByLabelText(/text input for search/i), { target: { value: name } });
|
81
|
+
getByLabelText(/search button/i).click();
|
82
|
+
// Only the first filter should be showing, not the last one
|
83
|
+
await patientlyWaitFor(() => {
|
84
|
+
expect(getByText(description)).toBeInTheDocument();
|
85
|
+
expect(queryByText(lastFilter.name)).not.toBeInTheDocument();
|
86
|
+
});
|
87
|
+
|
88
|
+
assertNockRequest(autocompleteScope);
|
89
|
+
assertNockRequest(withSearchScope);
|
90
|
+
assertNockRequest(initialScope);
|
91
|
+
assertNockRequest(searchResultScope, done);
|
92
|
+
});
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import React, { useState, useEffect } from 'react';
|
2
|
-
import { useSelector, shallowEqual } from 'react-redux';
|
2
|
+
import { useSelector, shallowEqual, useDispatch } from 'react-redux';
|
3
3
|
import { Bullseye, Split, SplitItem } from '@patternfly/react-core';
|
4
4
|
import { TableVariant, fitContent } from '@patternfly/react-table';
|
5
5
|
import { STATUS } from 'foremanReact/constants';
|
@@ -8,37 +8,47 @@ import { urlBuilder } from 'foremanReact/common/urlHelpers';
|
|
8
8
|
import PropTypes from 'prop-types';
|
9
9
|
|
10
10
|
import TableWrapper from '../../../../components/Table/TableWrapper';
|
11
|
-
import
|
12
|
-
import {
|
11
|
+
import onSelect from '../../../../components/Table/helpers';
|
12
|
+
import { getContentViewRepositories, getRepositoryTypes } from '../ContentViewDetailActions';
|
13
|
+
import {
|
14
|
+
selectCVRepos,
|
15
|
+
selectCVReposStatus,
|
16
|
+
selectCVReposError,
|
17
|
+
selectRepoTypes,
|
18
|
+
selectRepoTypesStatus,
|
19
|
+
} from '../ContentViewDetailSelectors';
|
13
20
|
import { ADDED, NOT_ADDED, ALL_STATUSES } from '../../ContentViewsConstants';
|
14
21
|
import ContentCounts from './ContentCounts';
|
15
22
|
import LastSync from './LastSync';
|
16
23
|
import RepoAddedStatus from './RepoAddedStatus';
|
17
24
|
import RepoIcon from './RepoIcon';
|
18
|
-
import SelectableDropdown from '
|
25
|
+
import SelectableDropdown from '../../../../components/SelectableDropdown';
|
26
|
+
import { capitalize } from '../../../../utils/helpers';
|
19
27
|
|
20
28
|
const allRepositories = 'All repositories';
|
21
29
|
|
22
|
-
//
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
'Container repositories': 'docker',
|
28
|
-
'OSTree repositories': 'ostree', // ostree is deprecated?
|
30
|
+
// Add any exceptions to the display names here
|
31
|
+
// [API_value]: displayed_value
|
32
|
+
const repoTypeNames = {
|
33
|
+
docker: 'Container',
|
34
|
+
ostree: 'OSTree',
|
29
35
|
};
|
30
36
|
|
31
37
|
const ContentViewRepositories = ({ cvId }) => {
|
38
|
+
const dispatch = useDispatch();
|
32
39
|
const response = useSelector(state => selectCVRepos(state, cvId), shallowEqual);
|
33
40
|
const status = useSelector(state => selectCVReposStatus(state, cvId), shallowEqual);
|
34
41
|
const error = useSelector(state => selectCVReposError(state, cvId), shallowEqual);
|
42
|
+
const repoTypesResponse = useSelector(state => selectRepoTypes(state), shallowEqual);
|
43
|
+
const repoTypesStatus = useSelector(state => selectRepoTypesStatus(state), shallowEqual);
|
35
44
|
|
36
45
|
const [rows, setRows] = useState([]);
|
37
46
|
const [metadata, setMetadata] = useState({});
|
38
47
|
const [searchQuery, updateSearchQuery] = useState('');
|
39
48
|
const [typeSelected, setTypeSelected] = useState(allRepositories);
|
40
49
|
const [statusSelected, setStatusSelected] = useState(ALL_STATUSES);
|
41
|
-
|
50
|
+
// repoTypes object format: [displayed_value]: API_value
|
51
|
+
const [repoTypes, setRepoTypes] = useState({});
|
42
52
|
|
43
53
|
const columnHeaders = [
|
44
54
|
{ title: __('Type'), transforms: [fitContent] },
|
@@ -80,18 +90,6 @@ const ContentViewRepositories = ({ cvId }) => {
|
|
80
90
|
return newRows;
|
81
91
|
};
|
82
92
|
|
83
|
-
const onSelect = (_event, isSelected, rowId) => {
|
84
|
-
let newRows;
|
85
|
-
if (rowId === -1) {
|
86
|
-
newRows = rows.map(row => ({ ...row, selected: isSelected }));
|
87
|
-
} else {
|
88
|
-
newRows = [...rows];
|
89
|
-
newRows[rowId].selected = isSelected;
|
90
|
-
}
|
91
|
-
|
92
|
-
setRows(newRows);
|
93
|
-
};
|
94
|
-
|
95
93
|
const getCVReposWithOptions = (params = {}) => {
|
96
94
|
const allParams = { ...params };
|
97
95
|
if (typeSelected !== 'All repositories') allParams.content_type = repoTypes[typeSelected];
|
@@ -109,6 +107,25 @@ const ContentViewRepositories = ({ cvId }) => {
|
|
109
107
|
}
|
110
108
|
}, [JSON.stringify(response)]);
|
111
109
|
|
110
|
+
useEffect(() => {
|
111
|
+
dispatch(getRepositoryTypes());
|
112
|
+
}, []);
|
113
|
+
|
114
|
+
// Get repo type filter selections dynamically from the API
|
115
|
+
useEffect(() => {
|
116
|
+
if (repoTypesStatus === STATUS.RESOLVED && repoTypesResponse) {
|
117
|
+
const allRepoTypes = {};
|
118
|
+
allRepoTypes[allRepositories] = 'all';
|
119
|
+
repoTypesResponse.forEach((type) => {
|
120
|
+
const { name } = type;
|
121
|
+
const typeFullName = Object.prototype.hasOwnProperty.call(repoTypeNames, name) ?
|
122
|
+
repoTypeNames[name] : capitalize(name);
|
123
|
+
allRepoTypes[`${typeFullName} Repositories`] = name;
|
124
|
+
});
|
125
|
+
setRepoTypes(allRepoTypes);
|
126
|
+
}
|
127
|
+
}, [JSON.stringify(repoTypesResponse), repoTypesStatus]);
|
128
|
+
|
112
129
|
const emptyContentTitle = __("You currently don't have any repositories to add to this content view.");
|
113
130
|
const emptyContentBody = __('Please add some repositories.'); // needs link
|
114
131
|
const emptySearchTitle = __('No matching repositories found');
|
@@ -121,7 +138,6 @@ const ContentViewRepositories = ({ cvId }) => {
|
|
121
138
|
{...{
|
122
139
|
rows,
|
123
140
|
metadata,
|
124
|
-
onSelect,
|
125
141
|
emptyContentTitle,
|
126
142
|
emptyContentBody,
|
127
143
|
emptySearchTitle,
|
@@ -132,6 +148,7 @@ const ContentViewRepositories = ({ cvId }) => {
|
|
132
148
|
status,
|
133
149
|
activeFilters,
|
134
150
|
}}
|
151
|
+
onSelect={onSelect(rows, setRows)}
|
135
152
|
cells={columnHeaders}
|
136
153
|
variant={TableVariant.compact}
|
137
154
|
autocompleteEndpoint="/repositories/auto_complete_search"
|
@@ -146,6 +163,8 @@ const ContentViewRepositories = ({ cvId }) => {
|
|
146
163
|
selected={typeSelected}
|
147
164
|
setSelected={setTypeSelected}
|
148
165
|
placeholderText="Type"
|
166
|
+
loading={repoTypesStatus === STATUS.PENDING}
|
167
|
+
error={repoTypesStatus === STATUS.ERROR}
|
149
168
|
/>
|
150
169
|
</SplitItem>
|
151
170
|
<SplitItem>
|
data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewDetailRepos.test.js
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
import React from 'react';
|
2
|
-
import { renderWithRedux, patientlyWaitFor, fireEvent } from 'react-testing-lib-wrapper';
|
2
|
+
import { renderWithRedux, patientlyWaitFor, patientlyWaitForRemoval, fireEvent } from 'react-testing-lib-wrapper';
|
3
3
|
|
4
4
|
import nock, { nockInstance, assertNockRequest, mockAutocomplete, mockSetting } from '../../../../../test-utils/nockWrapper';
|
5
5
|
import api from '../../../../../services/api';
|
@@ -12,15 +12,22 @@ const autocompleteUrl = '/repositories/auto_complete_search';
|
|
12
12
|
const renderOptions = { apiNamespace: `${CONTENT_VIEWS_KEY}_1` };
|
13
13
|
const cvAllRepos = api.getApiUrl('/content_views/1/repositories/show_all');
|
14
14
|
const cvRepos = api.getApiUrl('/content_views/1/repositories');
|
15
|
+
const repoTypesResponse = [{ name: 'deb' }, { name: 'docker' }, { name: 'file' }, { name: 'ostree' }, { name: 'puppet' }, { name: 'yum' }];
|
15
16
|
|
16
17
|
let firstRepo;
|
17
18
|
let searchDelayScope;
|
18
19
|
let autoSearchScope;
|
20
|
+
|
19
21
|
beforeEach(() => {
|
20
22
|
const { results } = repoData;
|
21
23
|
[firstRepo] = results;
|
22
24
|
searchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 500);
|
23
25
|
autoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing', true);
|
26
|
+
nockInstance
|
27
|
+
.persist() // match any query to this endpoint, gets cleaned up by `nock.cleanAll()`
|
28
|
+
.get(api.getApiUrl('/repositories/repository_types'))
|
29
|
+
.query(true)
|
30
|
+
.reply(200, repoTypesResponse);
|
24
31
|
});
|
25
32
|
|
26
33
|
afterEach(() => {
|
@@ -47,7 +54,6 @@ test('Can call API and show repositories on page load', async (done) => {
|
|
47
54
|
// Assert that the repo name is now showing on the screen, but wait for it to appear.
|
48
55
|
await patientlyWaitFor(() => expect(getByText(firstRepo.name)).toBeTruthy());
|
49
56
|
|
50
|
-
|
51
57
|
assertNockRequest(autocompleteScope);
|
52
58
|
assertNockRequest(scope, done);
|
53
59
|
});
|
@@ -57,23 +63,27 @@ test('Can filter by repository type', async (done) => {
|
|
57
63
|
|
58
64
|
const allTypesScope = nockInstance
|
59
65
|
.get(cvAllRepos)
|
60
|
-
.query(
|
66
|
+
.query(queryObj => !queryObj.content_type) // no content_type param to match all repos
|
61
67
|
.reply(200, repoData);
|
62
68
|
|
63
|
-
// With the yum checkbox unchecked, we can expect the query params to not include 'yum'
|
64
69
|
const noYumScope = nockInstance
|
65
70
|
.get(cvAllRepos)
|
66
71
|
.query(queryObj => queryObj.content_type === 'yum')
|
67
72
|
.reply(200, repoData);
|
68
73
|
|
69
|
-
const { getByLabelText } =
|
74
|
+
const { getByLabelText, getByText } =
|
75
|
+
renderWithRedux(<ContentViewRepositories cvId={1} />, renderOptions);
|
70
76
|
|
77
|
+
await patientlyWaitForRemoval(() => getByLabelText('Type spinner'));
|
71
78
|
// Patternfly's Select component makes it hard to attach a label, the existing options aren't
|
72
|
-
// working as expected, so querying by container label and getting
|
79
|
+
// working as expected, so querying by container label and getting the button
|
73
80
|
const toggleContainer = getByLabelText('select Type container');
|
74
81
|
const toggleButton = toggleContainer.querySelector('button');
|
75
82
|
fireEvent.click(toggleButton); // Open type dropdown
|
76
|
-
|
83
|
+
const selectYum = getByLabelText('select Yum Repositories');
|
84
|
+
fireEvent.click(selectYum); // select yum repos
|
85
|
+
await patientlyWaitForRemoval(() => getByText('Loading'));
|
86
|
+
await patientlyWaitFor(() => expect(getByText(firstRepo.name)).toBeTruthy());
|
77
87
|
|
78
88
|
assertNockRequest(autocompleteScope);
|
79
89
|
assertNockRequest(allTypesScope);
|
@@ -13,6 +13,7 @@ const cvDetailsPath = api.getApiUrl('/content_views/1');
|
|
13
13
|
|
14
14
|
// The Repositories tab will load in the background, prevent this by mocking
|
15
15
|
jest.mock('../Repositories/ContentViewRepositories.js', () => () => 'mocked!');
|
16
|
+
jest.mock('../Filters/ContentViewFilters.js', () => () => 'mocked!');
|
16
17
|
|
17
18
|
test('Can call API and show details on page load', async (done) => {
|
18
19
|
const { label, name, description } = cvDetailData;
|
@@ -98,7 +99,30 @@ test('Can edit boolean details such as solve dependencies', async (done) => {
|
|
98
99
|
fireEvent.click(getByLabelText(checkboxLabel));
|
99
100
|
await patientlyWaitFor(() => expect(getByLabelText(checkboxLabel).checked).toBeTruthy());
|
100
101
|
|
102
|
+
const disabledImportLabel = /import_only_switch/;
|
103
|
+
expect(getByLabelText(disabledImportLabel)).toBeInTheDocument();
|
104
|
+
expect(getByLabelText(disabledImportLabel)).toHaveAttribute('disabled');
|
105
|
+
|
101
106
|
assertNockRequest(getscope);
|
102
107
|
assertNockRequest(updatescope);
|
103
108
|
assertNockRequest(afterUpdateScope, done);
|
104
109
|
});
|
110
|
+
|
111
|
+
test('Can link to view tasks', async () => {
|
112
|
+
const scope = nockInstance
|
113
|
+
.get(cvDetailsPath)
|
114
|
+
.query(true)
|
115
|
+
.reply(200, cvDetailData);
|
116
|
+
|
117
|
+
const { getByText } = renderWithRedux(
|
118
|
+
<ContentViewDetails match={{ params: { id: 1 } }} />,
|
119
|
+
renderOptions,
|
120
|
+
);
|
121
|
+
|
122
|
+
await patientlyWaitFor(() => {
|
123
|
+
expect(getByText(/view tasks/i).closest('a'))
|
124
|
+
.toHaveAttribute('href', '/foreman_tasks/tasks?search=resource_type%3D+Katello%3A%3AContentView+resource_id%3D1');
|
125
|
+
});
|
126
|
+
|
127
|
+
assertNockRequest(scope);
|
128
|
+
});
|
@@ -2,11 +2,12 @@ import React, { useState, useEffect } from 'react';
|
|
2
2
|
import PropTypes from 'prop-types';
|
3
3
|
import { translate as __ } from 'foremanReact/common/I18n';
|
4
4
|
import { STATUS } from 'foremanReact/constants';
|
5
|
-
|
5
|
+
import { Button } from '@patternfly/react-core';
|
6
6
|
import TableWrapper from '../../../components/Table/TableWrapper';
|
7
7
|
import tableDataGenerator from './tableDataGenerator';
|
8
|
-
import actionResolver from './actionResolver';
|
9
8
|
import getContentViews from '../ContentViewsActions';
|
9
|
+
import CreateContentViewModal from '../Create/CreateContentViewModal';
|
10
|
+
import CopyContentViewModal from '../Copy/CopyContentViewModal';
|
10
11
|
|
11
12
|
const ContentViewTable = ({ response, status, error }) => {
|
12
13
|
const [table, setTable] = useState({ rows: [], columns: [] });
|
@@ -14,6 +15,13 @@ const ContentViewTable = ({ response, status, error }) => {
|
|
14
15
|
const [searchQuery, updateSearchQuery] = useState('');
|
15
16
|
const { results, ...metadata } = response;
|
16
17
|
const loadingResponse = status === STATUS.PENDING;
|
18
|
+
const [isModalOpen, setIsModalOpen] = useState(false);
|
19
|
+
const [copy, setCopy] = useState(false);
|
20
|
+
const [actionableCvId, setActionableCvId] = useState('');
|
21
|
+
const [actionableCvName, setActionableCvName] = useState('');
|
22
|
+
function openForm() {
|
23
|
+
setIsModalOpen(true);
|
24
|
+
}
|
17
25
|
|
18
26
|
useEffect(
|
19
27
|
() => {
|
@@ -59,6 +67,38 @@ const ContentViewTable = ({ response, status, error }) => {
|
|
59
67
|
setTable(prevTable => ({ ...prevTable, rows }));
|
60
68
|
};
|
61
69
|
|
70
|
+
const actionResolver = (rowData, { _rowIndex }) => {
|
71
|
+
// don't show actions for the expanded parts
|
72
|
+
if (rowData.parent || rowData.compoundParent || rowData.noactions) return null;
|
73
|
+
|
74
|
+
// printing to the console for now until these are hooked up
|
75
|
+
/* eslint-disable no-console */
|
76
|
+
return [
|
77
|
+
{
|
78
|
+
title: 'Publish and Promote',
|
79
|
+
onClick: (_event, rowId, rowInfo) => {
|
80
|
+
console.log(`clicked on row ${JSON.stringify(rowInfo)}`);
|
81
|
+
},
|
82
|
+
},
|
83
|
+
{
|
84
|
+
title: 'Promote',
|
85
|
+
onClick: (_event, rowId, rowInfo) => console.log(`clicked on row ${rowInfo.cvName}`),
|
86
|
+
},
|
87
|
+
{
|
88
|
+
title: 'Copy',
|
89
|
+
onClick: (_event, rowId, rowInfo) => {
|
90
|
+
setCopy(true);
|
91
|
+
setActionableCvId(rowInfo.cvId.toString());
|
92
|
+
setActionableCvName(rowInfo.cvName);
|
93
|
+
},
|
94
|
+
},
|
95
|
+
{
|
96
|
+
title: 'Delete',
|
97
|
+
onClick: (_event, rowId, _rowInfo) => console.log(`clicked on row ${rowId}`),
|
98
|
+
},
|
99
|
+
];
|
100
|
+
/* eslint-enable no-console */
|
101
|
+
};
|
62
102
|
// Prevents flash of "No Content" before rows are loaded
|
63
103
|
const tableStatus = () => {
|
64
104
|
if (typeof results === 'undefined') return status; // will handle errored state
|
@@ -99,7 +139,17 @@ const ContentViewTable = ({ response, status, error }) => {
|
|
99
139
|
canSelectAll={false}
|
100
140
|
cells={columns}
|
101
141
|
autocompleteEndpoint="/content_views/auto_complete_search"
|
102
|
-
|
142
|
+
>
|
143
|
+
<React.Fragment>
|
144
|
+
<Button onClick={openForm} variant="primary" aria-label="create_content_view">
|
145
|
+
Create content view
|
146
|
+
</Button>
|
147
|
+
<CreateContentViewModal show={isModalOpen} setIsOpen={setIsModalOpen} aria-label="create_content_view_modal" />
|
148
|
+
</React.Fragment>
|
149
|
+
<React.Fragment>
|
150
|
+
<CopyContentViewModal cvId={actionableCvId} cvName={actionableCvName} show={copy} setIsOpen={setCopy} aria-label="copy_content_view_modal" />
|
151
|
+
</React.Fragment>
|
152
|
+
</TableWrapper>
|
103
153
|
);
|
104
154
|
};
|
105
155
|
|
@@ -41,7 +41,6 @@ const buildRow = (contentView, openColumn) => {
|
|
41
41
|
},
|
42
42
|
];
|
43
43
|
if (openColumn) row[openColumn].props.isOpen = true;
|
44
|
-
|
45
44
|
return row;
|
46
45
|
};
|
47
46
|
|
@@ -100,7 +99,7 @@ const buildRowsAndMapping = (contentViews, newRowMapping) => {
|
|
100
99
|
const rows = [];
|
101
100
|
|
102
101
|
contentViews.forEach((contentView) => {
|
103
|
-
const { id } = contentView;
|
102
|
+
const { id, name } = contentView;
|
104
103
|
const rowIndex = rows.length;
|
105
104
|
const needsUpdate = !Object.keys(updatedRowMap).find(i => updatedRowMap[i].id === id) ||
|
106
105
|
!Object.keys(updatedRowMap[rowIndex] || {}).includes('expandedColumn');
|
@@ -109,7 +108,9 @@ const buildRowsAndMapping = (contentViews, newRowMapping) => {
|
|
109
108
|
const cells = buildRow(contentView, openColumn);
|
110
109
|
const isOpen = !!openColumn;
|
111
110
|
|
112
|
-
rows.push({
|
111
|
+
rows.push({
|
112
|
+
cvId: id, cvName: name, isOpen, cells,
|
113
|
+
});
|
113
114
|
rows.push(...buildDetailDropdowns(id, rowIndex, openColumn));
|
114
115
|
});
|
115
116
|
|