katello 4.3.0.rc4 → 4.4.0.rc2
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/assets/javascripts/katello/common/vendor.js +0 -1
- data/app/controllers/katello/api/v2/api_controller.rb +13 -4
- data/app/controllers/katello/api/v2/content_view_versions_controller.rb +4 -1
- data/app/controllers/katello/api/v2/content_views_controller.rb +46 -0
- data/app/controllers/katello/api/v2/host_packages_controller.rb +21 -1
- data/app/controllers/katello/api/v2/hosts_bulk_actions_controller.rb +30 -1
- data/app/controllers/katello/api/v2/organizations_controller.rb +10 -6
- data/app/controllers/katello/api/v2/packages_controller.rb +4 -0
- data/app/controllers/katello/api/v2/repositories_bulk_actions_controller.rb +10 -1
- data/app/controllers/katello/api/v2/repositories_controller.rb +42 -14
- data/app/controllers/katello/api/v2/repository_sets_controller.rb +7 -0
- data/app/controllers/katello/concerns/api/v2/repository_content_controller.rb +3 -0
- data/app/controllers/katello/concerns/hosts_controller_extensions.rb +32 -0
- data/app/controllers/katello/remote_execution_controller.rb +5 -4
- data/app/graphql/types/host_collection.rb +18 -0
- data/app/helpers/katello/content_source_helper.rb +43 -0
- data/app/helpers/katello/hosts_and_hostgroups_helper.rb +4 -0
- data/app/lib/actions/katello/cdn_configuration/update.rb +5 -7
- data/app/lib/actions/katello/content_view/publish.rb +5 -0
- data/app/lib/actions/katello/content_view_version/incremental_update.rb +17 -3
- data/app/lib/actions/katello/repository/discover.rb +1 -14
- data/app/lib/actions/katello/repository/errata_mail.rb +4 -5
- data/app/lib/actions/katello/repository/filtered_index_content.rb +1 -1
- data/app/lib/actions/katello/repository/sync.rb +2 -2
- data/app/lib/actions/pulp3/abstract.rb +1 -1
- data/app/lib/actions/pulp3/abstract_async_task.rb +1 -1
- data/app/lib/actions/pulp3/content_view/delete_repository_references.rb +14 -4
- data/app/lib/actions/pulp3/content_view_version/create_import_history.rb +1 -2
- data/app/lib/actions/pulp3/content_view_version/import.rb +7 -0
- data/app/lib/actions/pulp3/orchestration/content_view_version/import.rb +7 -5
- data/app/lib/actions/pulp3/repository/copy_content.rb +1 -1
- data/app/lib/actions/pulp3/repository/reclaim_space.rb +3 -10
- data/app/lib/actions/pulp3/repository/save_artifact.rb +1 -0
- data/app/lib/katello/concerns/base_template_scope_extensions.rb +11 -0
- data/app/lib/katello/errors.rb +3 -3
- data/app/lib/katello/logging.rb +6 -1
- data/app/lib/katello/repo_discovery.rb +27 -19
- data/app/lib/katello/resources/cdn/katello_cdn.rb +41 -3
- data/app/lib/katello/resources/cdn.rb +4 -2
- data/app/lib/katello/util/deduplication_migrator.rb +105 -0
- data/app/lib/katello/util/pulpcore_content_filters.rb +2 -1
- data/app/models/katello/candlepin/repository_mapper.rb +3 -2
- data/app/models/katello/cdn_configuration.rb +38 -6
- data/app/models/katello/concerns/audit_comment_extensions.rb +17 -0
- data/app/models/katello/concerns/host_managed_extensions.rb +34 -2
- data/app/models/katello/concerns/organization_extensions.rb +5 -1
- data/app/models/katello/concerns/pulp_database_unit.rb +59 -173
- data/app/models/katello/concerns/remote_execution_proxy_selector_extensions.rb +11 -0
- data/app/models/katello/concerns/smart_proxy_extensions.rb +2 -1
- data/app/models/katello/content_view.rb +4 -4
- data/app/models/katello/content_view_filter.rb +1 -1
- data/app/models/katello/content_view_history.rb +1 -1
- data/app/models/katello/content_view_version.rb +6 -2
- data/app/models/katello/content_view_version_export_history.rb +3 -2
- data/app/models/katello/content_view_version_import_history.rb +4 -4
- data/app/models/katello/deb.rb +1 -3
- data/app/models/katello/docker_meta_tag.rb +1 -1
- data/app/models/katello/erratum.rb +0 -15
- data/app/models/katello/glue/provider.rb +1 -1
- data/app/models/katello/glue/pulp/repos.rb +3 -1
- data/app/models/katello/host/content_facet.rb +2 -27
- data/app/models/katello/host/info_provider.rb +9 -0
- data/app/models/katello/host/subscription_facet.rb +2 -2
- data/app/models/katello/host_available_module_stream.rb +10 -0
- data/app/models/katello/hostgroup/content_facet.rb +2 -2
- data/app/models/katello/installed_package.rb +1 -0
- data/app/models/katello/product.rb +1 -1
- data/app/models/katello/product_content.rb +2 -2
- data/app/models/katello/repository.rb +13 -12
- data/app/models/katello/root_repository.rb +65 -16
- data/app/models/katello/rpm.rb +8 -2
- data/app/models/setting/content.rb +15 -5
- data/app/services/cert/rhsm_client.rb +1 -5
- data/app/services/katello/component_view_presenter.rb +1 -1
- data/app/services/katello/content_unit_indexer.rb +166 -0
- data/app/services/katello/organization_creator.rb +23 -8
- data/app/services/katello/pulp/repository/docker.rb +1 -1
- data/app/services/katello/pulp/repository/yum.rb +0 -54
- data/app/services/katello/pulp/repository.rb +0 -6
- data/app/services/katello/pulp3/ansible_collection.rb +26 -10
- data/app/services/katello/pulp3/api/apt.rb +7 -0
- data/app/services/katello/pulp3/api/yum.rb +4 -0
- data/app/services/katello/pulp3/content_view_version/import.rb +11 -2
- data/app/services/katello/pulp3/content_view_version/metadata_generator.rb +1 -1
- data/app/services/katello/pulp3/deb.rb +10 -9
- data/app/services/katello/pulp3/docker_manifest.rb +6 -5
- data/app/services/katello/pulp3/docker_manifest_list.rb +23 -6
- data/app/services/katello/pulp3/docker_tag.rb +16 -7
- data/app/services/katello/pulp3/erratum.rb +51 -56
- data/app/services/katello/pulp3/file_unit.rb +9 -6
- data/app/services/katello/pulp3/generic_content_unit.rb +11 -12
- data/app/services/katello/pulp3/module_stream.rb +76 -30
- data/app/services/katello/pulp3/package_group.rb +5 -5
- data/app/services/katello/pulp3/pulp_content_unit.rb +19 -11
- data/app/services/katello/pulp3/repository/apt.rb +5 -3
- data/app/services/katello/pulp3/repository/docker.rb +14 -7
- data/app/services/katello/pulp3/repository/generic.rb +1 -1
- data/app/services/katello/pulp3/repository/yum.rb +23 -16
- data/app/services/katello/pulp3/repository.rb +31 -10
- data/app/services/katello/pulp3/repository_mirror.rb +18 -4
- data/app/services/katello/pulp3/rpm.rb +13 -13
- data/app/services/katello/pulp3/srpm.rb +10 -9
- data/app/services/katello/registration_manager.rb +1 -1
- data/app/services/katello/repository_type.rb +15 -4
- data/app/services/katello/repository_type_manager.rb +1 -1
- data/app/services/katello/ui_notifications/subscriptions/manifest_expired_warning.rb +1 -1
- data/app/services/katello/upstream_connection_checker.rb +2 -2
- data/app/views/foreman/job_templates/change_content_source.erb +1 -31
- data/app/views/foreman/job_templates/install_errata.erb +6 -9
- data/app/views/foreman/job_templates/install_errata_by_search_query.erb +26 -0
- data/app/views/foreman/job_templates/install_packages_by_search_query.erb +19 -0
- data/app/views/foreman/job_templates/remove_packages_by_search_query.erb +19 -0
- data/app/views/foreman/job_templates/update_packages_by_search_query.erb +19 -0
- data/app/views/katello/api/v2/cdn_configurations/show.json.rabl +1 -1
- data/app/views/katello/api/v2/content_views/base.json.rabl +8 -4
- data/app/views/katello/api/v2/environments/show.json.rabl +9 -0
- data/app/views/katello/api/v2/host_module_streams/base.json.rabl +1 -0
- data/app/views/katello/api/v2/repositories/base.json.rabl +1 -0
- data/app/views/katello/api/v2/repositories/show.json.rabl +3 -1
- data/app/views/katello/layouts/react.html.erb +0 -1
- data/app/views/katello/sync_management/_repo.html.erb +36 -25
- data/config/initializers/monkeys.rb +0 -1
- data/config/routes/api/v2.rb +1 -0
- data/config/routes/overrides.rb +3 -0
- data/config/routes.rb +2 -0
- data/db/migrate/20150930183738_migrate_content_hosts.rb +1 -1
- data/db/migrate/20180612164926_add_content_org_id.rb +2 -2
- data/db/migrate/20210119162528_delete_puppet_and_ostree_repos.rb +2 -0
- data/db/migrate/20211019192121_create_cdn_configuration.katello.rb +11 -2
- data/db/migrate/20211201154845_add_unique_indexes.rb +20 -0
- data/db/migrate/20211202172358_add_repository_mirroring_policy.rb +26 -0
- data/db/migrate/20211208034230_add_content_view_and_lifecycle_environment.rb +6 -0
- data/db/migrate/20211220185935_clean_duplicate_content_units.rb +144 -0
- data/db/migrate/20220110223754_update_disconnected_settings.rb +20 -0
- data/db/migrate/20220120163252_fix_docker_download_policy.rb +11 -0
- data/db/migrate/20220124191056_add_type_to_cdn_configuration.rb +22 -0
- data/db/migrate/20220127120843_fix_debian_download_policy.rb +11 -0
- data/db/migrate/20220204171908_rename_docker_tags_whitelist_and_add_exclude_tags.rb +8 -0
- data/db/migrate/20220207140355_change_deb_attributes_size_limit.rb +7 -0
- data/db/migrate/20220209205137_expand_sync_timeout_settings.rb +23 -0
- data/db/seeds.d/111-upgrade_tasks.rb +2 -1
- data/engines/bastion/app/views/bastion/layouts/application.html.erb +0 -1
- data/engines/bastion/app/views/bastion/layouts/assets.html.erb +0 -1
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/content-credentials.controller.js +1 -1
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/details/content-credential-products.controller.js +1 -1
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-credentials/details/content-credential-repositories.controller.js +1 -1
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/bulk/views/content-hosts-bulk-traces-modal.html +1 -1
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/environments/details/views/environment.html +26 -1
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/errata/apply-errata.controller.js +10 -3
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/i18n/bastion_katello.pot +212 -152
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/packages/packages.controller.js +1 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-info.controller.js +29 -10
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-manage-content.controller.js +2 -3
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details.controller.js +8 -3
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-info.html +49 -35
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/mirroring-policy.service.js +30 -0
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/new-repository.controller.js +29 -6
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/views/new-repository.html +48 -23
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/discovery/discovery.controller.js +5 -4
- data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/products.routes.js +4 -3
- data/lib/katello/engine.rb +4 -0
- data/lib/katello/permission_creator.rb +1 -1
- data/lib/katello/permissions/host_permissions.rb +3 -1
- data/lib/katello/plugin.rb +9 -1
- data/lib/katello/repository_types/deb.rb +0 -1
- data/lib/katello/repository_types/docker.rb +4 -4
- data/lib/katello/repository_types/file.rb +0 -1
- data/lib/katello/repository_types/ostree.rb +4 -6
- data/lib/katello/repository_types/python.rb +5 -1
- data/lib/katello/repository_types/yum.rb +2 -9
- data/lib/katello/tasks/content_view_import_only.rake +34 -0
- data/lib/katello/tasks/import_applicability.rake +1 -1
- data/lib/katello/tasks/jenkins.rake +0 -2
- data/lib/katello/tasks/repository.rake +4 -1
- data/lib/katello/tasks/upgrades/4.4/publish_import_cvvs.rake +17 -0
- data/lib/katello/version.rb +1 -1
- data/locale/action_names.rb +8 -7
- data/locale/bn/katello.po +1402 -650
- data/locale/cs/katello.po +1217 -96
- data/locale/de/katello.po +2359 -1347
- data/locale/en/katello.po +1216 -94
- data/locale/es/katello.po +2201 -1172
- data/locale/fr/katello.po +2601 -1615
- data/locale/gu/katello.po +1564 -814
- data/locale/hi/katello.po +1563 -810
- data/locale/it/katello.po +1311 -282
- data/locale/ja/katello.po +2534 -1518
- data/locale/katello.pot +3430 -1326
- data/locale/kn/katello.po +1564 -812
- data/locale/ko/katello.po +1441 -409
- data/locale/mr/katello.po +1564 -776
- data/locale/or/katello.po +1565 -813
- data/locale/pa/katello.po +1559 -792
- data/locale/pt/katello.po +1314 -277
- data/locale/pt_BR/katello.po +2226 -1181
- data/locale/ru/katello.po +1587 -563
- data/locale/ta/katello.po +1373 -619
- data/locale/te/katello.po +1564 -810
- data/locale/zh_CN/katello.po +2936 -1890
- data/locale/zh_TW/katello.po +1508 -606
- data/webpack/__mocks__/foremanReact/{redux/actions/toasts.js → components/ToastsList/index.js} +3 -2
- data/webpack/components/ActionableDetail.js +35 -21
- data/webpack/components/Content/Details/ContentDetails.js +1 -1
- data/webpack/components/Content/Details/__tests__/ContentDetailInfo.test.js +0 -2
- data/webpack/components/Content/Details/__tests__/ContentDetailRepositories.test.js +0 -2
- data/webpack/components/Content/Details/__tests__/ContentDetails.test.js +0 -2
- data/webpack/components/Content/Details/__tests__/__snapshots__/ContentDetails.test.js.snap +1 -1
- data/webpack/components/Content/__tests__/ContentPage.test.js +0 -2
- data/webpack/components/Content/__tests__/ContentTable.test.js +0 -2
- data/webpack/components/EditableSwitch.js +8 -2
- data/webpack/components/EditableTextInput/EditableTextInput.js +44 -86
- data/webpack/components/EditableTextInput/__tests__/editableTextInput.test.js +3 -3
- data/webpack/components/Errata/index.js +95 -29
- data/webpack/components/ErratumTypeLabel.js +16 -16
- data/webpack/components/MultiSelect/index.js +2 -2
- data/webpack/components/Packages/index.js +1 -1
- data/webpack/components/RoutedTabs/index.js +2 -1
- data/webpack/components/Search/Search.js +5 -2
- data/webpack/components/Search/__tests__/search.test.js +2 -3
- data/webpack/components/Select/Select.js +1 -1
- data/webpack/components/SelectOrg/SelectOrgReducer.js +15 -15
- data/webpack/components/SelectOrg/SetOrganization.js +2 -2
- data/webpack/components/Table/PageControls.js +3 -6
- data/webpack/components/Table/TableHooks.js +47 -7
- data/webpack/components/Table/TableWrapper.js +25 -7
- data/webpack/components/TypeAhead/TypeAhead.js +5 -1
- data/webpack/components/TypeAhead/helpers/commonPropTypes.js +1 -1
- data/webpack/components/TypeAhead/helpers/helpers.js +14 -14
- data/webpack/components/TypeAhead/pf3Search/TypeAheadSearch.js +1 -1
- data/webpack/components/TypeAhead/pf4Search/TypeAheadInput.js +4 -1
- data/webpack/components/TypeAhead/pf4Search/TypeAheadSearch.js +2 -1
- data/webpack/components/WithOrganization/withOrganization.js +3 -3
- data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard.js +1 -1
- data/webpack/components/extensions/HostDetails/Cards/ErrataOverviewCard.js +108 -0
- data/webpack/components/extensions/HostDetails/Cards/__tests__/errataOverviewCard.test.js +56 -0
- data/webpack/components/extensions/HostDetails/HostDetailsActions.js +2 -0
- data/webpack/components/extensions/HostDetails/HostPackages/HostPackagesActions.js +49 -2
- data/webpack/components/extensions/HostDetails/HostPackages/HostPackagesConstants.js +14 -1
- data/webpack/components/extensions/HostDetails/Tabs/ContentTab/SecondaryTabsRoutes.js +6 -4
- data/webpack/components/extensions/HostDetails/Tabs/ContentTab/constants.js +1 -0
- data/webpack/components/extensions/HostDetails/Tabs/ContentTab/index.js +1 -0
- data/webpack/components/extensions/HostDetails/Tabs/{ErrataTab.js → ErrataTab/ErrataTab.js} +86 -75
- data/webpack/components/extensions/HostDetails/Tabs/ErrataTab/ErrataTab.scss +11 -0
- data/webpack/components/extensions/HostDetails/Tabs/{ErratumExpansionContents.js → ErrataTab/ErratumExpansionContents.js} +3 -3
- data/webpack/components/extensions/HostDetails/Tabs/{ErratumExpansionDetail.js → ErrataTab/ErratumExpansionDetail.js} +0 -0
- data/webpack/components/extensions/HostDetails/{HostErrata → Tabs/ErrataTab}/HostErrataActions.js +3 -3
- data/webpack/components/extensions/HostDetails/{HostErrata → Tabs/ErrataTab}/HostErrataConstants.js +11 -0
- data/webpack/components/extensions/HostDetails/{HostErrata → Tabs/ErrataTab}/HostErrataSelectors.js +0 -0
- data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsActions.js +16 -0
- data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsConstants.js +3 -0
- data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsSelectors.js +19 -0
- data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/ModuleStreamsTab.js +241 -0
- data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/__tests__/moduleStreamsTab.test.js +108 -0
- data/webpack/components/extensions/HostDetails/Tabs/ModuleStreamsTab/__tests__/modules.fixtures.json +34 -0
- data/webpack/components/extensions/HostDetails/Tabs/PackageInstallModal.js +279 -0
- data/webpack/components/extensions/HostDetails/Tabs/PackageInstallModal.scss +3 -0
- data/webpack/components/extensions/HostDetails/Tabs/PackagesTab.js +357 -64
- data/webpack/components/extensions/HostDetails/Tabs/PackagesTab.scss +3 -7
- data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionActions.js +103 -4
- data/webpack/components/extensions/HostDetails/Tabs/RemoteExecutionConstants.js +6 -1
- data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab.js +45 -42
- data/webpack/components/extensions/HostDetails/Tabs/RepositorySetsTab/RepositorySetsTab.scss +3 -3
- data/webpack/components/extensions/HostDetails/Tabs/{EnableTracerEmptyState.js → TracesTab/EnableTracerEmptyState.js} +0 -0
- data/webpack/components/extensions/HostDetails/Tabs/{EnableTracerModal.js → TracesTab/EnableTracerModal.js} +3 -2
- data/webpack/components/extensions/HostDetails/Tabs/{HostTracesActions.js → TracesTab/HostTracesActions.js} +2 -2
- data/webpack/components/extensions/HostDetails/Tabs/{HostTracesConstants.js → TracesTab/HostTracesConstants.js} +0 -0
- data/webpack/components/extensions/HostDetails/Tabs/{HostTracesSelectors.js → TracesTab/HostTracesSelectors.js} +0 -0
- data/webpack/components/extensions/HostDetails/Tabs/{TracesTab.js → TracesTab/TracesTab.js} +66 -61
- data/webpack/components/extensions/HostDetails/Tabs/TracesTab/TracesTab.scss +11 -0
- data/webpack/components/extensions/HostDetails/Tabs/__tests__/errataTab.test.js +17 -18
- data/webpack/components/extensions/HostDetails/Tabs/__tests__/packageInstallModal.test.js +385 -0
- data/webpack/components/extensions/HostDetails/Tabs/__tests__/packages.fixtures.json +1 -1
- data/webpack/components/extensions/HostDetails/Tabs/__tests__/packagesTab.test.js +312 -11
- data/webpack/components/extensions/HostDetails/Tabs/__tests__/repositorySetsTab.test.js +2 -2
- data/webpack/components/extensions/HostDetails/Tabs/__tests__/tracesTab.test.js +26 -30
- data/webpack/components/extensions/HostDetails/Tabs/__tests__/yumInstallablePackages.fixtures.json +72 -0
- data/webpack/components/extensions/HostDetails/Tabs/customizedRexUrlHelpers.js +25 -5
- data/webpack/components/extensions/HostDetails/YumInstallablePackages/YumInstallablePackagesActions.js +18 -0
- data/webpack/components/extensions/HostDetails/YumInstallablePackages/YumInstallablePackagesConstants.js +3 -0
- data/webpack/components/extensions/HostDetails/YumInstallablePackages/YumInstallablePackagesSelectors.js +16 -0
- data/webpack/components/extensions/HostDetails/hostDetailsHelpers.js +19 -0
- data/webpack/components/extensions/RegistrationCommands/__tests__/__snapshots__/ActivationKeys.test.js.snap +4 -0
- data/webpack/components/extensions/RegistrationCommands/fields/ActivationKeys.js +1 -1
- data/webpack/components/extensions/RegistrationCommands/fields/LifecycleEnvironment.js +1 -1
- data/webpack/components/extensions/about/SystemStatuses.js +1 -1
- data/webpack/components/extensions/about/SystemStatusesReducer.js +10 -10
- data/webpack/components/pf3Table/components/Table.js +4 -5
- data/webpack/components/pf3Table/components/Table.test.js +0 -3
- data/webpack/components/pf3Table/components/TableBody.js +2 -2
- data/webpack/components/pf3Table/components/__snapshots__/Table.test.js.snap +9 -8
- data/webpack/containers/Application/config.js +6 -1
- data/webpack/containers/Application/overrides.scss +56 -7
- data/webpack/global_index.js +4 -1
- data/webpack/global_test_setup.js +1 -1
- data/webpack/index.js +7 -0
- data/webpack/redux/OrganizationProducts/OrganizationProductsReducer.js +15 -15
- data/webpack/redux/reducers/RedHatRepositories/enabled.js +43 -43
- data/webpack/redux/reducers/RedHatRepositories/repositorySetRepositories.js +43 -43
- data/webpack/redux/reducers/RedHatRepositories/sets.js +31 -31
- data/webpack/scenes/AnsibleCollections/AnsibleCollectionsReducer.js +26 -26
- data/webpack/scenes/AnsibleCollections/Details/AnsibleCollectionDetailsReducer.js +19 -19
- data/webpack/scenes/AnsibleCollections/Details/__tests__/AnsibleCollectionDetails.test.js +0 -2
- data/webpack/scenes/AnsibleCollections/__tests__/AnsibleCollectionPage.test.js +0 -2
- data/webpack/scenes/AnsibleCollections/__tests__/AnsibleCollectionsTable.test.js +0 -2
- data/webpack/scenes/Content/ContentConfig.js +55 -5
- data/webpack/scenes/Content/ContentPage.js +5 -5
- data/webpack/scenes/Content/Details/ContentDetails.js +23 -21
- data/webpack/scenes/Content/Details/ContentInfo.js +2 -2
- data/webpack/scenes/Content/Details/ContentRepositories.js +1 -1
- data/webpack/scenes/Content/Details/__tests__/contentDetail.test.js +4 -4
- data/webpack/scenes/Content/Table/ContentTable.js +2 -2
- data/webpack/scenes/Content/__tests__/contentTable.test.js +3 -3
- data/webpack/scenes/ContentViews/ContentViewsConstants.js +5 -4
- data/webpack/scenes/ContentViews/ContentViewsPage.js +17 -13
- data/webpack/scenes/ContentViews/Copy/CopyContentViewForm.js +1 -1
- data/webpack/scenes/ContentViews/Create/CreateContentViewForm.js +3 -2
- data/webpack/scenes/ContentViews/Delete/Steps/CVDeletionReassignHostsForm.js +2 -2
- data/webpack/scenes/ContentViews/Delete/__tests__/contentViewDelete.test.js +6 -6
- data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewAddModal.js +22 -11
- data/webpack/scenes/ContentViews/Details/ComponentContentViews/ComponentContentViewBulkAddModal.js +31 -18
- data/webpack/scenes/ContentViews/Details/ComponentContentViews/ContentViewComponents.js +1 -1
- data/webpack/scenes/ContentViews/Details/ComponentContentViews/__tests__/contentViewComponents.test.js +2 -2
- data/webpack/scenes/ContentViews/Details/ContentViewDetailActions.js +22 -28
- data/webpack/scenes/ContentViews/Details/ContentViewDetailReducer.js +8 -8
- data/webpack/scenes/ContentViews/Details/ContentViewDetailSelectors.js +5 -5
- data/webpack/scenes/ContentViews/Details/ContentViewDetails.js +32 -30
- data/webpack/scenes/ContentViews/Details/ContentViewInfo.js +9 -4
- data/webpack/scenes/ContentViews/Details/DetailsContainer.js +14 -17
- data/webpack/scenes/ContentViews/Details/Filters/Add/CVFilterAddModal.js +3 -0
- data/webpack/scenes/ContentViews/Details/Filters/AffectedRepositories/AffectedRepositoryTable.js +1 -1
- data/webpack/scenes/ContentViews/Details/Filters/ArtifactsWithNoErrata.js +8 -8
- data/webpack/scenes/ContentViews/Details/Filters/CVContainerImageFilterContent.js +4 -4
- data/webpack/scenes/ContentViews/Details/Filters/CVErrataDateFilterContent.js +6 -6
- data/webpack/scenes/ContentViews/Details/Filters/CVErrataIDFilterContent.js +16 -9
- data/webpack/scenes/ContentViews/Details/Filters/CVFilterDetailType.js +46 -46
- data/webpack/scenes/ContentViews/Details/Filters/CVModuleStreamFilterContent.js +17 -17
- data/webpack/scenes/ContentViews/Details/Filters/CVPackageGroupFilterContent.js +17 -17
- data/webpack/scenes/ContentViews/Details/Filters/CVRpmFilterContent.js +4 -4
- data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilterDetails.js +2 -2
- data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilterDetailsHeader.js +17 -11
- data/webpack/scenes/ContentViews/Details/Filters/ContentViewFilters.js +1 -1
- data/webpack/scenes/ContentViews/Details/Filters/MatchContentModal/__tests__/CVRpmMatchContentModal.test.js +2 -2
- data/webpack/scenes/ContentViews/Details/Filters/Rules/Package/AddEditPackageRuleModal.js +17 -17
- data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVContainerImageFilterContent.test.js +2 -3
- data/webpack/scenes/ContentViews/Details/Filters/__tests__/CVRpmFilterContent.test.js +2 -9
- data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilterDetails.test.js +3 -5
- data/webpack/scenes/ContentViews/Details/Filters/__tests__/contentViewFilters.test.js +2 -10
- data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvErrataIDFilter.test.js +2 -3
- data/webpack/scenes/ContentViews/Details/Filters/__tests__/cvModuleStreamFilter.test.js +2 -3
- data/webpack/scenes/ContentViews/Details/Histories/__tests__/contentViewHistory.test.js +2 -2
- data/webpack/scenes/ContentViews/Details/Repositories/ContentCounts.js +1 -1
- data/webpack/scenes/ContentViews/Details/Repositories/ContentViewRepositories.js +24 -3
- data/webpack/scenes/ContentViews/Details/Repositories/__tests__/contentViewAddRemove.test.js +11 -5
- data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersionContent.js +28 -28
- data/webpack/scenes/ContentViews/Details/Versions/ContentViewVersions.js +1 -1
- data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVEnvironmentSelectionForm.js +18 -18
- data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVReassignActivationKeysForm.js +3 -3
- data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVReassignHostsForm.js +3 -3
- data/webpack/scenes/ContentViews/Details/Versions/Delete/__tests__/cvVersionRemove.test.js +6 -6
- data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedActivationKeys.js +1 -1
- data/webpack/scenes/ContentViews/Details/Versions/Delete/affectedHosts.js +1 -1
- data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailConfig.js +31 -35
- data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetails.js +9 -8
- data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetails.scss +5 -2
- data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsHeader.js +39 -40
- data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionDetailsTable.js +46 -34
- data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/ContentViewVersionRepositoryCell.js +66 -49
- data/webpack/scenes/ContentViews/Details/Versions/VersionDetails/__tests__/ContentViewVersionDetails.test.js +5 -5
- data/webpack/scenes/ContentViews/Details/Versions/__tests__/contentViewVersions.test.js +3 -3
- data/webpack/scenes/ContentViews/Details/__tests__/contentViewDetail.test.js +5 -3
- data/webpack/scenes/ContentViews/Publish/CVPublishFinish.js +2 -2
- data/webpack/scenes/ContentViews/Table/ContentViewsTable.js +5 -5
- data/webpack/scenes/ContentViews/__tests__/contentViewPage.test.js +3 -3
- data/webpack/scenes/ContentViews/components/CVBreadCrumb.js +1 -1
- data/webpack/scenes/ContentViews/components/ContentViewsCounter.js +1 -1
- data/webpack/scenes/ContentViews/components/EnvironmentLabels.js +18 -18
- data/webpack/scenes/ContentViews/components/EnvironmentPaths/EnvironmentPaths.js +10 -10
- data/webpack/scenes/ContentViews/expansions/DetailsExpansion.js +2 -2
- data/webpack/scenes/ContentViews/expansions/RelatedContentViewComponentsModal.js +8 -8
- data/webpack/scenes/Hosts/ChangeContentSource/actions.js +43 -0
- data/webpack/scenes/Hosts/ChangeContentSource/components/ContentSourceForm.js +87 -0
- data/webpack/scenes/Hosts/ChangeContentSource/components/ContentSourceTemplate.js +90 -0
- data/webpack/scenes/Hosts/ChangeContentSource/components/FormField.js +43 -0
- data/webpack/scenes/Hosts/ChangeContentSource/constants.js +3 -0
- data/webpack/scenes/Hosts/ChangeContentSource/helpers.js +27 -0
- data/webpack/scenes/Hosts/ChangeContentSource/index.js +126 -0
- data/webpack/scenes/Hosts/ChangeContentSource/selectors.js +42 -0
- data/webpack/scenes/Hosts/ChangeContentSource/styles.scss +11 -0
- data/webpack/scenes/ModuleStreams/Details/ModuleStreamDetailsReducer.js +18 -18
- data/webpack/scenes/ModuleStreams/Details/Profiles/__tests__/ModuleStreamDetailProfiles.test.js +0 -1
- data/webpack/scenes/ModuleStreams/Details/__tests__/ModuleStreamDetails.test.js +0 -2
- data/webpack/scenes/ModuleStreams/ModuleStreamsReducer.js +26 -26
- data/webpack/scenes/ModuleStreams/__tests__/ModuleStreamPage.test.js +0 -2
- data/webpack/scenes/ModuleStreams/__tests__/ModuleStreamsTable.test.js +0 -2
- data/webpack/scenes/Organizations/OrganizationActions.js +5 -1
- data/webpack/scenes/Organizations/OrganizationReducer.js +8 -8
- data/webpack/scenes/RedHatRepositories/RedHatRepositoriesPage.js +31 -1
- data/webpack/scenes/RedHatRepositories/__tests__/RedHatRepositoriesPage.test.js +16 -0
- data/webpack/scenes/RedHatRepositories/__tests__/__snapshots__/RedHatRepositoriesPage.test.js.snap +11 -2
- data/webpack/scenes/RedHatRepositories/components/EnabledRepository/EnabledRepositoryContent.js +4 -4
- data/webpack/scenes/RedHatRepositories/components/RepositorySetRepositories.js +1 -1
- data/webpack/scenes/RedHatRepositories/helpers.js +5 -5
- data/webpack/scenes/RedHatRepositories/index.js +11 -3
- data/webpack/scenes/Settings/SettingsReducer.js +14 -14
- data/webpack/scenes/Settings/Tables/TableReducer.js +23 -23
- data/webpack/scenes/Subscriptions/Details/SubscriptionDetailInfo.js +2 -2
- data/webpack/scenes/Subscriptions/Details/SubscriptionDetailProductContent.js +15 -15
- data/webpack/scenes/Subscriptions/Details/SubscriptionDetailProducts.js +1 -1
- data/webpack/scenes/Subscriptions/Details/SubscriptionDetailReducer.js +34 -34
- data/webpack/scenes/Subscriptions/Details/SubscriptionDetails.js +13 -13
- data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/AirGappedTypeForm.js +81 -0
- data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnConfigurationConstants.js +13 -0
- data/webpack/scenes/Subscriptions/Manifest/{CdnConfigurationForm.scss → CdnConfigurationTab/CdnConfigurationForm.scss} +0 -0
- data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/CdnTypeForm.js +106 -0
- data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/UpstreamServerTypeForm.js +259 -0
- data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/AirGappedTypeForm.test.js +44 -0
- data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/__tests__/CdnTypeForm.test.js +67 -0
- data/webpack/scenes/Subscriptions/Manifest/{__tests__/CdnConfigurationForm.test.js → CdnConfigurationTab/__tests__/UpstreamServerTypeForm.test.js} +46 -17
- data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationTab/index.js +97 -0
- data/webpack/scenes/Subscriptions/Manifest/ManageManifestModal.js +11 -6
- data/webpack/scenes/Subscriptions/Manifest/ManifestHistoryReducer.js +16 -16
- data/webpack/scenes/Subscriptions/SubscriptionReducer.js +149 -149
- data/webpack/scenes/Subscriptions/UpstreamSubscriptions/UpstreamSubscriptionsReducer.js +41 -41
- data/webpack/scenes/Subscriptions/UpstreamSubscriptions/__tests__/UpstreamSubscriptionsPage.test.js +0 -1
- data/webpack/scenes/Subscriptions/__tests__/SubscriptionsPage.test.js +0 -1
- data/webpack/scenes/Subscriptions/__tests__/__snapshots__/SubscriptionsActions.test.js.snap +3 -2
- data/webpack/scenes/Subscriptions/components/SubscriptionsTable/__tests__/SubscriptionsTable.test.js +4 -0
- data/webpack/scenes/Subscriptions/components/SubscriptionsTable/__tests__/__snapshots__/SubscriptionsTable.test.js.snap +9 -0
- data/webpack/scenes/Subscriptions/components/SubscriptionsTable/components/Dialogs/DeleteDialog.js +6 -6
- data/webpack/scenes/Subscriptions/components/SubscriptionsTable/components/Table.js +12 -12
- data/webpack/scenes/Tasks/TaskActions.js +1 -1
- data/webpack/scenes/Tasks/__tests__/__snapshots__/TaskActions.test.js.snap +3 -2
- data/webpack/services/api/testHelpers.js +5 -3
- data/webpack/services/index.js +36 -36
- data/webpack/utils/helpers.js +11 -8
- metadata +98 -60
- data/app/services/katello/pulp/deb.rb +0 -55
- data/app/services/katello/pulp/distribution.rb +0 -7
- data/app/services/katello/pulp/docker_blob.rb +0 -7
- data/app/services/katello/pulp/docker_manifest.rb +0 -13
- data/app/services/katello/pulp/docker_manifest_list.rb +0 -14
- data/app/services/katello/pulp/docker_tag.rb +0 -14
- data/app/services/katello/pulp/erratum.rb +0 -129
- data/app/services/katello/pulp/file_unit.rb +0 -21
- data/app/services/katello/pulp/module_stream.rb +0 -39
- data/app/services/katello/pulp/package_category.rb +0 -7
- data/app/services/katello/pulp/package_group.rb +0 -20
- data/app/services/katello/pulp/pulp_content_unit.rb +0 -156
- data/app/services/katello/pulp/rpm.rb +0 -57
- data/app/services/katello/pulp/srpm.rb +0 -29
- data/app/services/katello/pulp/yum_metadata_file.rb +0 -30
- data/lib/monkeys/pulp3_13_checksumfix.rb +0 -17
- data/webpack/__mocks__/foremanReact/components/Pagination/PaginationHooks.js +0 -2
- data/webpack/__mocks__/foremanReact/components/Pagination/PaginationWrapper.js +0 -2
- data/webpack/components/extensions/HostDetails/Tabs/ErrataTab.scss +0 -16
- data/webpack/components/extensions/HostDetails/Tabs/TracesTab.scss +0 -12
- data/webpack/scenes/Subscriptions/Manifest/CdnConfigurationForm.js +0 -185
@@ -16,13 +16,13 @@ const Search = ({
|
|
16
16
|
onSearch,
|
17
17
|
updateSearchQuery,
|
18
18
|
isDisabled,
|
19
|
-
settings: { autoSearchDelay },
|
19
|
+
settings: { autoSearchDelay, autoSearchEnabled = true },
|
20
20
|
initialInputValue,
|
21
21
|
patternfly4,
|
22
|
-
settings: { autoSearchEnabled },
|
23
22
|
getAutoCompleteParams,
|
24
23
|
foremanApiAutoComplete,
|
25
24
|
bookmarkController,
|
25
|
+
placeholder,
|
26
26
|
}) => {
|
27
27
|
const [items, setItems] = useState([]);
|
28
28
|
const dispatch = useDispatch();
|
@@ -82,6 +82,7 @@ const Search = ({
|
|
82
82
|
initialInputValue={initialInputValue}
|
83
83
|
patternfly4={patternfly4}
|
84
84
|
autoSearchEnabled={autoSearchEnabled}
|
85
|
+
placeholder={placeholder}
|
85
86
|
/>
|
86
87
|
</div>
|
87
88
|
);
|
@@ -100,6 +101,7 @@ Search.propTypes = {
|
|
100
101
|
autoSearchDelay: PropTypes.number,
|
101
102
|
}),
|
102
103
|
bookmarkController: PropTypes.string,
|
104
|
+
placeholder: PropTypes.string,
|
103
105
|
};
|
104
106
|
|
105
107
|
Search.defaultProps = {
|
@@ -112,6 +114,7 @@ Search.defaultProps = {
|
|
112
114
|
},
|
113
115
|
isDisabled: undefined,
|
114
116
|
bookmarkController: undefined,
|
117
|
+
placeholder: undefined,
|
115
118
|
};
|
116
119
|
|
117
120
|
export default Search;
|
@@ -19,7 +19,7 @@ const props = {
|
|
19
19
|
|
20
20
|
let searchDelayScope;
|
21
21
|
beforeEach(() => {
|
22
|
-
searchDelayScope = mockSetting(nockInstance, AUTOSEARCH_DELAY,
|
22
|
+
searchDelayScope = mockSetting(nockInstance, AUTOSEARCH_DELAY, 0);
|
23
23
|
});
|
24
24
|
|
25
25
|
afterEach(() => {
|
@@ -73,7 +73,7 @@ test('autosearch turned off does show patternfly 4 search button', async (done)
|
|
73
73
|
});
|
74
74
|
|
75
75
|
test('search function is called when search is typed into with autosearch', async (done) => {
|
76
|
-
const autoSearchScope = mockSetting(nockInstance, AUTOSEARCH_WHILE_TYPING
|
76
|
+
const autoSearchScope = mockSetting(nockInstance, AUTOSEARCH_WHILE_TYPING);
|
77
77
|
const autocompleteScope = mockAutocomplete(nockInstance, endpoint, true, [], 2);
|
78
78
|
const mockSearch = jest.fn();
|
79
79
|
|
@@ -100,7 +100,6 @@ test('search function is called by clicking search button without autosearch', a
|
|
100
100
|
});
|
101
101
|
searchButton.click();
|
102
102
|
expect(mockSearch.mock.calls).toHaveLength(3);
|
103
|
-
|
104
103
|
assertNockRequest(autoSearchScope);
|
105
104
|
assertNockRequest(autocompleteScope, done);
|
106
105
|
});
|
@@ -28,7 +28,7 @@ export default Select;
|
|
28
28
|
|
29
29
|
Select.propTypes = {
|
30
30
|
onChange: PropTypes.func.isRequired,
|
31
|
-
options: PropTypes.arrayOf(PropTypes.
|
31
|
+
options: PropTypes.arrayOf(PropTypes.shape({})).isRequired,
|
32
32
|
disabled: PropTypes.bool,
|
33
33
|
placeholder: PropTypes.string.isRequired,
|
34
34
|
value: PropTypes.string,
|
@@ -11,23 +11,23 @@ export default (state = initialState, action) => {
|
|
11
11
|
const { payload } = action;
|
12
12
|
|
13
13
|
switch (action.type) {
|
14
|
-
|
15
|
-
|
14
|
+
case GET_ORGANIZATIONS_LIST_REQUEST:
|
15
|
+
return state.set('loading', true);
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
17
|
+
case GET_ORGANIZATIONS_LIST_SUCCESS:
|
18
|
+
return state
|
19
|
+
.set('list', payload.results)
|
20
|
+
.set('loading', false);
|
21
21
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
22
|
+
case CHANGE_CURRENT_ORGANIZATION_SUCCESS:
|
23
|
+
return state
|
24
|
+
.set('currentId', payload)
|
25
|
+
.set('loading', false);
|
26
26
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
27
|
+
case GET_ORGANIZATIONS_LIST_FAILURE:
|
28
|
+
return state
|
29
|
+
.set('error', payload);
|
30
|
+
default:
|
31
|
+
return state;
|
32
32
|
}
|
33
33
|
};
|
@@ -63,7 +63,7 @@ class SetOrganization extends Component {
|
|
63
63
|
placeholder={__('Select an organization')}
|
64
64
|
id="organization"
|
65
65
|
name="organization"
|
66
|
-
className="form-control"
|
66
|
+
className="form-control without_select2"
|
67
67
|
options={list}
|
68
68
|
onChange={this.onSelectItem}
|
69
69
|
/>
|
@@ -87,7 +87,7 @@ class SetOrganization extends Component {
|
|
87
87
|
|
88
88
|
|
89
89
|
SetOrganization.propTypes = {
|
90
|
-
list: PropTypes.arrayOf(PropTypes.
|
90
|
+
list: PropTypes.arrayOf(PropTypes.shape({})),
|
91
91
|
loading: PropTypes.bool.isRequired,
|
92
92
|
history: PropTypes.shape({
|
93
93
|
push: PropTypes.func,
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import React from 'react';
|
2
2
|
import PropTypes from 'prop-types';
|
3
|
-
import {
|
4
|
-
import
|
3
|
+
import { FlexItem } from '@patternfly/react-core';
|
4
|
+
import Pagination from 'foremanReact/components/Pagination';
|
5
5
|
|
6
6
|
import { getPageStats } from './helpers';
|
7
7
|
|
@@ -18,10 +18,7 @@ const PageControls = ({
|
|
18
18
|
itemsEnd={lastIndex}
|
19
19
|
page={page}
|
20
20
|
perPage={perPage}
|
21
|
-
|
22
|
-
onSetPage={(_evt, updated) => onPaginationUpdate({ page: updated })}
|
23
|
-
onPerPageSelect={(_evt, updated) => onPaginationUpdate({ per_page: updated })}
|
24
|
-
perPageOptions={usePaginationOptions().map(p => ({ title: p.toString(), value: p }))}
|
21
|
+
onChange={onPaginationUpdate}
|
25
22
|
variant={variant}
|
26
23
|
/>
|
27
24
|
</FlexItem>
|
@@ -1,5 +1,7 @@
|
|
1
1
|
import { useState, useRef, useEffect, useCallback } from 'react';
|
2
2
|
import { isEmpty } from 'lodash';
|
3
|
+
import { useLocation } from 'react-router-dom';
|
4
|
+
import { friendlySearchParam } from '../../utils/helpers';
|
3
5
|
|
4
6
|
class ReactConnectedSet extends Set {
|
5
7
|
constructor(initialValue, forceRender) {
|
@@ -68,6 +70,7 @@ export const useSelectionSet = ({
|
|
68
70
|
const pageIds = results?.map(result => result[idColumn]) ?? [];
|
69
71
|
const selectableResults = results?.filter(result => isSelectable(result)) ?? [];
|
70
72
|
const selectableIds = new Set(selectableResults.map(result => result[idColumn]));
|
73
|
+
const selectedResults = useRef({}); // { id: result }
|
71
74
|
const canSelect = id => selectableIds.has(id);
|
72
75
|
const areAllRowsOnPageSelected = () =>
|
73
76
|
Number(pageIds?.length) > 0 &&
|
@@ -76,13 +79,28 @@ export const useSelectionSet = ({
|
|
76
79
|
const areAllRowsSelected = () =>
|
77
80
|
Number(selectionSet.size) > 0 && selectionSet.size === Number(metadata.selectable);
|
78
81
|
|
79
|
-
const selectPage = () =>
|
80
|
-
|
81
|
-
|
82
|
+
const selectPage = () => {
|
83
|
+
const selectablePageIds = pageIds.filter(canSelect);
|
84
|
+
selectionSet.addAll(selectablePageIds);
|
85
|
+
// eslint-disable-next-line no-restricted-syntax
|
86
|
+
for (const result of selectableResults) {
|
87
|
+
selectedResults.current[result[idColumn]] = result;
|
88
|
+
}
|
89
|
+
};
|
90
|
+
const clearSelectedResults = () => {
|
91
|
+
selectedResults.current = {};
|
92
|
+
};
|
93
|
+
const selectNone = () => {
|
94
|
+
selectionSet.clear();
|
95
|
+
clearSelectedResults();
|
96
|
+
};
|
97
|
+
const selectOne = (isSelected, id, data) => {
|
82
98
|
if (canSelect(id)) {
|
83
99
|
if (isSelected) {
|
100
|
+
if (data) selectedResults.current[id] = data;
|
84
101
|
selectionSet.add(id);
|
85
102
|
} else {
|
103
|
+
delete selectedResults.current[id];
|
86
104
|
selectionSet.delete(id);
|
87
105
|
}
|
88
106
|
}
|
@@ -102,6 +120,8 @@ export const useSelectionSet = ({
|
|
102
120
|
isSelected,
|
103
121
|
isSelectable: canSelect,
|
104
122
|
selectionSet,
|
123
|
+
selectedResults: Object.values(selectedResults.current),
|
124
|
+
clearSelectedResults,
|
105
125
|
};
|
106
126
|
};
|
107
127
|
|
@@ -117,6 +137,7 @@ export const useBulkSelect = ({
|
|
117
137
|
results,
|
118
138
|
metadata,
|
119
139
|
initialArry = [],
|
140
|
+
initialSearchQuery = '',
|
120
141
|
idColumn = 'id',
|
121
142
|
isSelectable,
|
122
143
|
}) => {
|
@@ -125,7 +146,7 @@ export const useBulkSelect = ({
|
|
125
146
|
results, metadata, initialArry, idColumn, isSelectable,
|
126
147
|
});
|
127
148
|
const exclusionSet = useSet([]);
|
128
|
-
const [searchQuery, updateSearchQuery] = useState(
|
149
|
+
const [searchQuery, updateSearchQuery] = useState(initialSearchQuery);
|
129
150
|
const [selectAllMode, setSelectAllMode] = useState(false);
|
130
151
|
const selectedCount = selectAllMode ?
|
131
152
|
Number(metadata.selectable) - exclusionSet.size : selectOptions.selectedCount;
|
@@ -155,9 +176,10 @@ export const useBulkSelect = ({
|
|
155
176
|
setSelectAllMode(false);
|
156
177
|
exclusionSet.clear();
|
157
178
|
inclusionSet.clear();
|
158
|
-
|
179
|
+
selectOptions.clearSelectedResults();
|
180
|
+
}, [exclusionSet, inclusionSet, selectOptions]);
|
159
181
|
|
160
|
-
const selectOne = (isRowSelected, id) => {
|
182
|
+
const selectOne = (isRowSelected, id, data) => {
|
161
183
|
if (selectAllMode) {
|
162
184
|
if (isRowSelected) {
|
163
185
|
exclusionSet.delete(id);
|
@@ -165,7 +187,7 @@ export const useBulkSelect = ({
|
|
165
187
|
exclusionSet.add(id);
|
166
188
|
}
|
167
189
|
} else {
|
168
|
-
selectOptions.selectOne(isRowSelected, id);
|
190
|
+
selectOptions.selectOne(isRowSelected, id, data);
|
169
191
|
}
|
170
192
|
};
|
171
193
|
|
@@ -209,6 +231,7 @@ export const useBulkSelect = ({
|
|
209
231
|
selectPage,
|
210
232
|
selectNone,
|
211
233
|
selectAll,
|
234
|
+
selectAllMode,
|
212
235
|
isSelected,
|
213
236
|
selectedCount,
|
214
237
|
fetchBulkParams,
|
@@ -219,3 +242,20 @@ export const useBulkSelect = ({
|
|
219
242
|
areAllRowsSelected,
|
220
243
|
};
|
221
244
|
};
|
245
|
+
|
246
|
+
// takes a url query like ?type=security&search=name+~+foo
|
247
|
+
// and returns an object
|
248
|
+
// {
|
249
|
+
// type: 'security',
|
250
|
+
// searchParam: 'name ~ foo'
|
251
|
+
// }
|
252
|
+
export const useUrlParams = () => {
|
253
|
+
const location = useLocation();
|
254
|
+
const { search: urlSearchParam, ...urlParams }
|
255
|
+
= Object.fromEntries(new URLSearchParams(location.search).entries());
|
256
|
+
const searchParam = urlSearchParam ? friendlySearchParam(urlSearchParam) : '';
|
257
|
+
return {
|
258
|
+
searchParam,
|
259
|
+
...urlParams,
|
260
|
+
};
|
261
|
+
};
|
@@ -26,15 +26,19 @@ const TableWrapper = ({
|
|
26
26
|
foremanApiAutoComplete,
|
27
27
|
searchQuery,
|
28
28
|
updateSearchQuery,
|
29
|
+
searchPlaceholderText,
|
29
30
|
additionalListeners,
|
30
31
|
activeFilters,
|
31
32
|
displaySelectAllCheckbox,
|
32
33
|
selectAll,
|
34
|
+
selectAllMode,
|
33
35
|
selectNone,
|
34
36
|
selectPage,
|
35
37
|
areAllRowsOnPageSelected,
|
36
38
|
areAllRowsSelected,
|
37
39
|
selectedCount,
|
40
|
+
selectedResults,
|
41
|
+
clearSelectedResults,
|
38
42
|
emptySearchBody,
|
39
43
|
disableSearch,
|
40
44
|
nodesBelowSearch,
|
@@ -159,7 +163,7 @@ const TableWrapper = ({
|
|
159
163
|
|
160
164
|
return (
|
161
165
|
<>
|
162
|
-
<Flex>
|
166
|
+
<Flex style={{ alignItems: 'center' }} className="margin-16-24">
|
163
167
|
{displaySelectAllCheckbox &&
|
164
168
|
<FlexItem alignSelf={{ default: 'alignSelfCenter' }}>
|
165
169
|
<SelectAllCheckbox
|
@@ -182,19 +186,21 @@ const TableWrapper = ({
|
|
182
186
|
<Search
|
183
187
|
isDisabled={unresolvedStatusOrNoRows && !searchQuery}
|
184
188
|
patternfly4
|
189
|
+
initialInputValue={searchQuery && searchQuery}
|
185
190
|
onSearch={search => updateSearchQuery(search)}
|
186
191
|
getAutoCompleteParams={getAutoCompleteParams}
|
187
192
|
foremanApiAutoComplete={foremanApiAutoComplete}
|
188
193
|
bookmarkController={bookmarkController}
|
194
|
+
placeholder={searchPlaceholderText}
|
189
195
|
/>
|
190
196
|
</FlexItem>
|
191
197
|
}
|
192
198
|
{showToggleGroup &&
|
193
|
-
<FlexItem
|
199
|
+
<FlexItem>
|
194
200
|
{toggleGroup}
|
195
201
|
</FlexItem>}
|
196
202
|
{showActionButtons &&
|
197
|
-
<FlexItem
|
203
|
+
<FlexItem>
|
198
204
|
{actionButtons}
|
199
205
|
</FlexItem>}
|
200
206
|
|
@@ -208,7 +214,11 @@ const TableWrapper = ({
|
|
208
214
|
/>
|
209
215
|
}
|
210
216
|
</Flex>
|
211
|
-
{nodesBelowSearch
|
217
|
+
{nodesBelowSearch &&
|
218
|
+
<Flex className="margin-16-24 gap-16" style={{ alignItems: 'center' }}>
|
219
|
+
{nodesBelowSearch}
|
220
|
+
</Flex>
|
221
|
+
}
|
212
222
|
<MainTable
|
213
223
|
searchIsActive={!!searchQuery}
|
214
224
|
activeFilters={activeFilters}
|
@@ -256,6 +266,7 @@ TableWrapper.propTypes = {
|
|
256
266
|
}),
|
257
267
|
autocompleteEndpoint: PropTypes.string.isRequired,
|
258
268
|
foremanApiAutoComplete: PropTypes.bool,
|
269
|
+
searchPlaceholderText: PropTypes.string,
|
259
270
|
actionButtons: PropTypes.node,
|
260
271
|
toggleGroup: PropTypes.node,
|
261
272
|
children: PropTypes.node,
|
@@ -275,7 +286,10 @@ TableWrapper.propTypes = {
|
|
275
286
|
])),
|
276
287
|
displaySelectAllCheckbox: PropTypes.bool,
|
277
288
|
selectedCount: PropTypes.number,
|
289
|
+
selectedResults: PropTypes.arrayOf(PropTypes.shape({})),
|
290
|
+
clearSelectedResults: PropTypes.func,
|
278
291
|
selectAll: PropTypes.func,
|
292
|
+
selectAllMode: PropTypes.bool,
|
279
293
|
selectNone: PropTypes.func,
|
280
294
|
selectPage: PropTypes.func,
|
281
295
|
areAllRowsOnPageSelected: PropTypes.func,
|
@@ -293,13 +307,17 @@ TableWrapper.defaultProps = {
|
|
293
307
|
activeFilters: [],
|
294
308
|
defaultFilters: [],
|
295
309
|
foremanApiAutoComplete: false,
|
310
|
+
searchPlaceholderText: undefined,
|
296
311
|
actionButtons: null,
|
297
312
|
toggleGroup: null,
|
298
313
|
displaySelectAllCheckbox: false,
|
299
314
|
selectedCount: 0,
|
300
|
-
|
301
|
-
|
302
|
-
|
315
|
+
selectedResults: [],
|
316
|
+
clearSelectedResults: noop,
|
317
|
+
selectAll: undefined,
|
318
|
+
selectAllMode: false,
|
319
|
+
selectNone: undefined,
|
320
|
+
selectPage: undefined,
|
303
321
|
areAllRowsOnPageSelected: noop,
|
304
322
|
areAllRowsSelected: noop,
|
305
323
|
emptySearchBody: __('Try changing your search settings.'),
|
@@ -22,6 +22,7 @@ const TypeAhead = ({
|
|
22
22
|
autoSearchEnabled,
|
23
23
|
autoSearchDelay,
|
24
24
|
bookmarkController,
|
25
|
+
placeholder,
|
25
26
|
}) => {
|
26
27
|
const [inputValue, setInputValue] = useState(initialInputValue);
|
27
28
|
|
@@ -79,6 +80,7 @@ const TypeAhead = ({
|
|
79
80
|
onSearch,
|
80
81
|
items,
|
81
82
|
activeItems,
|
83
|
+
placeholder,
|
82
84
|
shouldShowItems: isOpen && items.length > 0,
|
83
85
|
};
|
84
86
|
|
@@ -86,7 +88,7 @@ const TypeAhead = ({
|
|
86
88
|
<div>
|
87
89
|
{patternfly4 ?
|
88
90
|
<TypeAheadSearchPf4 autoSearchEnabled={autoSearchEnabled} {...typeAheadProps} /> :
|
89
|
-
<TypeAheadSearch actionText={actionText} {...typeAheadProps} />}
|
91
|
+
<TypeAheadSearch actionText={actionText} {...typeAheadProps} placeholder={null} />}
|
90
92
|
</div>
|
91
93
|
);
|
92
94
|
}}
|
@@ -112,6 +114,7 @@ TypeAhead.propTypes = {
|
|
112
114
|
autoSearchEnabled: PropTypes.bool.isRequired,
|
113
115
|
autoSearchDelay: PropTypes.number,
|
114
116
|
bookmarkController: PropTypes.string,
|
117
|
+
placeholder: PropTypes.string,
|
115
118
|
};
|
116
119
|
|
117
120
|
TypeAhead.defaultProps = {
|
@@ -121,6 +124,7 @@ TypeAhead.defaultProps = {
|
|
121
124
|
isDisabled: undefined,
|
122
125
|
autoSearchDelay: 500,
|
123
126
|
bookmarkController: undefined,
|
127
|
+
placeholder: undefined,
|
124
128
|
};
|
125
129
|
|
126
130
|
export default TypeAhead;
|
@@ -26,7 +26,7 @@ export const commonInputPropTypes = {
|
|
26
26
|
};
|
27
27
|
|
28
28
|
export const commonItemPropTypes = {
|
29
|
-
items: PropTypes.arrayOf(PropTypes.
|
29
|
+
items: PropTypes.arrayOf(PropTypes.shape({})).isRequired,
|
30
30
|
activeItems: PropTypes.arrayOf(PropTypes.string).isRequired,
|
31
31
|
highlightedIndex: PropTypes.number.isRequired,
|
32
32
|
getItemProps: PropTypes.func.isRequired,
|
@@ -5,22 +5,22 @@ const keyPressHandler = (
|
|
5
5
|
selectItem, userInputValue, onSearch,
|
6
6
|
) => {
|
7
7
|
switch (e.keyCode) {
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
8
|
+
case KEYCODES.TAB_KEY:
|
9
|
+
if (isOpen && activeItems[highlightedIndex]) {
|
10
|
+
selectItem(activeItems[highlightedIndex]);
|
11
|
+
e.preventDefault();
|
12
|
+
}
|
13
|
+
break;
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
15
|
+
case KEYCODES.ENTER:
|
16
|
+
if (!isOpen || !activeItems[highlightedIndex]) {
|
17
|
+
onSearch(userInputValue);
|
18
|
+
e.preventDefault();
|
19
|
+
}
|
20
|
+
break;
|
21
21
|
|
22
|
-
|
23
|
-
|
22
|
+
default:
|
23
|
+
break;
|
24
24
|
}
|
25
25
|
};
|
26
26
|
|
@@ -8,7 +8,7 @@ import { commonInputPropTypes } from '../helpers/commonPropTypes';
|
|
8
8
|
import './TypeAheadInput.scss';
|
9
9
|
|
10
10
|
const TypeAheadInput = ({
|
11
|
-
onKeyPress, onInputFocus, passedProps, isDisabled, autoSearchEnabled,
|
11
|
+
onKeyPress, onInputFocus, passedProps, isDisabled, autoSearchEnabled, placeholder,
|
12
12
|
}) => {
|
13
13
|
const inputRef = useRef(null);
|
14
14
|
const {
|
@@ -33,6 +33,7 @@ const TypeAheadInput = ({
|
|
33
33
|
onChange={onChangeWrapper}
|
34
34
|
type="search"
|
35
35
|
iconVariant={autoSearchEnabled && 'search'}
|
36
|
+
placeholder={placeholder}
|
36
37
|
/>
|
37
38
|
{
|
38
39
|
value && (
|
@@ -50,10 +51,12 @@ TypeAheadInput.propTypes = {
|
|
50
51
|
isDisabled: PropTypes.bool,
|
51
52
|
autoSearchEnabled: PropTypes.bool.isRequired,
|
52
53
|
...commonInputPropTypes,
|
54
|
+
placeholder: PropTypes.string,
|
53
55
|
};
|
54
56
|
|
55
57
|
TypeAheadInput.defaultProps = {
|
56
58
|
isDisabled: undefined,
|
59
|
+
placeholder: '',
|
57
60
|
};
|
58
61
|
|
59
62
|
export default TypeAheadInput;
|
@@ -12,7 +12,7 @@ import Bookmark from './../../../components/Bookmark';
|
|
12
12
|
const TypeAheadSearch = ({
|
13
13
|
userInputValue, clearSearch, getInputProps, getItemProps, isOpen, highlightedIndex,
|
14
14
|
selectedItem, selectItem, openMenu, onSearch, items, activeItems, shouldShowItems,
|
15
|
-
autoSearchEnabled, isDisabled, bookmarkController, inputValue,
|
15
|
+
autoSearchEnabled, isDisabled, bookmarkController, inputValue, placeholder,
|
16
16
|
}) => (
|
17
17
|
<>
|
18
18
|
<InputGroup>
|
@@ -34,6 +34,7 @@ const TypeAheadSearch = ({
|
|
34
34
|
onInputFocus={openMenu}
|
35
35
|
passedProps={{ ...getInputProps(), clearSearch }}
|
36
36
|
autoSearchEnabled={autoSearchEnabled}
|
37
|
+
placeholder={placeholder}
|
37
38
|
/>
|
38
39
|
<>
|
39
40
|
{bookmarkController &&
|
@@ -1,3 +1,4 @@
|
|
1
|
+
/* eslint-disable react/jsx-indent */
|
1
2
|
import React, { Component } from 'react';
|
2
3
|
import PropTypes from 'prop-types';
|
3
4
|
import { bindActionCreators } from 'redux';
|
@@ -46,14 +47,13 @@ function withOrganization(WrappedComponent) {
|
|
46
47
|
|
47
48
|
if (newOrgSelected) {
|
48
49
|
if (!organization.label && !organization.loading) { this.props.loadOrganization(); }
|
49
|
-
|
50
50
|
return <WrappedComponent {...this.props} />;
|
51
51
|
} else if (this.state.orgId === '') {
|
52
52
|
return (
|
53
|
-
|
53
|
+
<>
|
54
54
|
<Header title={__('Select Organization')} />
|
55
55
|
<SetOrganization />
|
56
|
-
|
56
|
+
</>);
|
57
57
|
}
|
58
58
|
return <WrappedComponent {...this.props} />;
|
59
59
|
}
|
@@ -0,0 +1,108 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import {
|
3
|
+
Card,
|
4
|
+
CardHeader,
|
5
|
+
CardTitle,
|
6
|
+
CardBody,
|
7
|
+
Flex,
|
8
|
+
FlexItem,
|
9
|
+
GridItem,
|
10
|
+
} from '@patternfly/react-core';
|
11
|
+
import { translate as __ } from 'foremanReact/common/I18n';
|
12
|
+
import { propsToCamelCase } from 'foremanReact/common/helpers';
|
13
|
+
import PropTypes from 'prop-types';
|
14
|
+
import { ChartPie } from '@patternfly/react-charts';
|
15
|
+
import { ErrataMapper } from '../../../../components/Errata';
|
16
|
+
|
17
|
+
function HostInstallableErrata({
|
18
|
+
id, errataCounts,
|
19
|
+
}) {
|
20
|
+
const errataTotal = errataCounts.total;
|
21
|
+
const errataSecurity = errataCounts.security;
|
22
|
+
const errataBug = errataCounts.bugfix;
|
23
|
+
const errataEnhance = errataCounts.enhancement;
|
24
|
+
const chartData = [{
|
25
|
+
w: 'security advisories', x: 'security', y: errataSecurity, z: errataTotal,
|
26
|
+
}, {
|
27
|
+
w: 'bug fixes', x: 'bugfix', y: errataBug, z: errataTotal,
|
28
|
+
}, {
|
29
|
+
w: 'enhancements', x: 'enhancement', y: errataEnhance, z: errataTotal,
|
30
|
+
}];
|
31
|
+
return (
|
32
|
+
<GridItem rowSpan={1} md={6} lg={4} xl2={3} >
|
33
|
+
<Card isHoverable>
|
34
|
+
<CardHeader>
|
35
|
+
<CardTitle>{__('Installable Errata')}</CardTitle>
|
36
|
+
</CardHeader>
|
37
|
+
<CardBody>
|
38
|
+
<Flex direction="column">
|
39
|
+
<FlexItem>
|
40
|
+
<a href="#/Content/errata">
|
41
|
+
{errataTotal} errata
|
42
|
+
</a>
|
43
|
+
</FlexItem>
|
44
|
+
<Flex flexWrap={{ xl: 'nowrap' }} direction="row" alignItems={{ default: 'alignItemsCenter' }}>
|
45
|
+
<div className="piechart-overflow" style={{ overflow: 'visible', minWidth: '140px', maxHeight: '155px' }}>
|
46
|
+
<div className="erratachart" style={{ minWidth: '300px', minHeight: '300px' }}>
|
47
|
+
<ChartPie
|
48
|
+
ariaDesc="errataChart"
|
49
|
+
data={chartData}
|
50
|
+
constrainToVisibleArea
|
51
|
+
labels={({ datum }) => `${datum.y} ${datum.w}`}
|
52
|
+
padding={{
|
53
|
+
bottom: 20,
|
54
|
+
left: 20,
|
55
|
+
right: 140,
|
56
|
+
top: 20,
|
57
|
+
}}
|
58
|
+
width={250}
|
59
|
+
height={130}
|
60
|
+
/>
|
61
|
+
</div>
|
62
|
+
</div>
|
63
|
+
<div className="erratalegend" style={{ minWidth: '140px' }}>
|
64
|
+
<FlexItem>
|
65
|
+
<ErrataMapper data={chartData} id={id} />
|
66
|
+
</FlexItem>
|
67
|
+
</div>
|
68
|
+
</Flex>
|
69
|
+
</Flex>
|
70
|
+
</CardBody>
|
71
|
+
</Card>
|
72
|
+
</GridItem>
|
73
|
+
);
|
74
|
+
}
|
75
|
+
|
76
|
+
const ErrataOverviewCard = ({ hostDetails }) => {
|
77
|
+
if (hostDetails.content_facet_attributes) {
|
78
|
+
const { id: hostId } = hostDetails;
|
79
|
+
return (<HostInstallableErrata
|
80
|
+
{...propsToCamelCase(hostDetails.content_facet_attributes)}
|
81
|
+
id={hostId}
|
82
|
+
/>);
|
83
|
+
}
|
84
|
+
return null;
|
85
|
+
};
|
86
|
+
|
87
|
+
HostInstallableErrata.propTypes = {
|
88
|
+
id: PropTypes.number.isRequired,
|
89
|
+
errataCounts: PropTypes.shape({
|
90
|
+
bugfix: PropTypes.number,
|
91
|
+
enhancement: PropTypes.number,
|
92
|
+
security: PropTypes.number,
|
93
|
+
total: PropTypes.number,
|
94
|
+
}).isRequired,
|
95
|
+
};
|
96
|
+
|
97
|
+
ErrataOverviewCard.propTypes = {
|
98
|
+
hostDetails: PropTypes.shape({
|
99
|
+
content_facet_attributes: PropTypes.shape({}),
|
100
|
+
id: PropTypes.number,
|
101
|
+
}),
|
102
|
+
};
|
103
|
+
|
104
|
+
ErrataOverviewCard.defaultProps = {
|
105
|
+
hostDetails: {},
|
106
|
+
};
|
107
|
+
|
108
|
+
export default ErrataOverviewCard;
|